```python
def judge_lancer(board: list, side: str, origin: list, dest: list) -> str:
    if len(board) != 7 or any(len(row) != 7 for row in board):
        raise ValueError("Board must be a 7x7 grid.")
    if side not in ("W", "B"):
        raise ValueError("Side must be 'W' or 'B'.")
    if not (isinstance(origin, list) and len(origin) == 2 and all(isinstance(x, int) for x in origin)):
        raise ValueError("Origin must be a pair of integers.")
    if not (isinstance(dest, list) and len(dest) == 2 and all(isinstance(x, int) for x in dest)):
        raise ValueError("Destination must be a pair of integers.")

    row_o, col_o = origin
    row_d, col_d = dest

    if not (0 <= row_o < 7 and 0 <= col_o < 7):
        return "off_board"
    if not (0 <= row_d < 7 and 0 <= col_d < 7):
        return "off_board"

    if board[row_o][col_o] != side:
        return "no_piece"

    dr, dc = row_d - row_o, col_d - col_o
    if abs(dr) + abs(dc) != 3 or (dr == 0 and dc == 0):
        return "bad_line"

    steps = max(abs(dr), abs(dc))
    for i in range(1, steps):
        r, c = row_o + dr * i // steps, col_o + dc * i // steps
        if board[r][c] != ".":
            return "blocked"

    if board[row_d][col_d] == side:
        return "own_piece"
    if abs(dr) == 1 and abs(dc) == 1:
        return "too_close"

    return "ok"
```