Un-forked Adversarial Review: Kỹ Thuật Độc Lập Ngữ Cảnh Chống Sycophancy Trong AI Council

Một trong những căn bệnh nguy hiểm nhất của các hệ thống Multi-Agent hiện nay là hiện tượng Sycophancy (Tự duyệt xuôi chiều / Con dấu bù nhìn). Khi một Subagent được giao nhiệm vụ review code nhưng lại kế thừa toàn bộ lịch sử hội thoại của Coder (thông qua cơ chế Fork), nó có xu hướng đồng ý với mọi lập luận và giả định sai lầm của Coder, phê duyệt cả những đoạn code chứa lỗ hổng bảo mật chết người.

Trong kiến trúc akiflow, quy trình Un-forked Adversarial Review (được định nghĩa trong mô hình agent.B5) giải quyết triệt để rủi ro này bằng cách ép buộc độc lập ngữ cảnh tuyệt đối (Context Isolation) và giới hạn quyền hạn chỉ đọc (Read-Only Tools Only).


1. Bản Chất Rủi Ro: Bẫy Ngữ Cảnh Của Forked Reviewer

Sơ đồ dưới đây so sánh hai con đường review code trong hệ thống Multi-Agent:

flowchart TD
    subgraph SycophancyTrap [❌ Thảm Họa Forked Reviewer]
        A1[Coder Agent: Viết Code + Biện Hộ Lỗi] -->|Fork Session / Kế Thừa KV Cache| B1[Forked Reviewer]
        B1 -->|Kế thừa Giả Định Sai| C1[Rubber-Stamp Approval: DUYỆT LỖI]
    end

    subgraph AdversarialRigor [✓ Quy Trình Un-forked Review akiflow]
        A2[Coder Agent: Viết Code] -->|Gửi Code Diff Duy Nhất| L[Lead Agent]
        L -->|Khởi tạo Plain Subagent Sạch| B2[Un-forked Reviewer - agent.B5]
        B2 -->|Chỉ Đọc Git Diff + Criteria| C2{Kiểm Tra Độc Lập}
        C2 -->|Phát Hiện Bug| D2[RE-OPENED: Trả về Coder]
        C2 -->|Đạt Chuẩn| E2[CLOSED: Phê Duyệt]
    end

Tại sao Forked Reviewer luôn thất bại?

  1. Confirmation Bias (Thiên kiến xác nhận): Reviewer nhận được toàn bộ chuỗi suy luận nội bộ của Coder, bao gồm các giả định ngây thơ như "API này luôn trả về 200 OK".
  2. Shared KV Cache Trap: Do dùng chung Prefix Cache, mô hình ngôn ngữ tối ưu hóa vector phản hồi theo hướng đồng thuận với ngữ cảnh phía trước thay vì tự phản biện từ đầu.
  3. Mất Sàn Tư Duy (Thinking Floor): Prompt bị ô nhiễm bởi hàng ngàn token hội thoại thừa từ Phase A.

2. Kiến Trúc Phân Quyền Tool: Read-Only Privilege Isolation

Để đảm bảo tính khách quan và ngăn chặn Reviewer tự ý sửa code để "lấp liếm" lỗi, akiflow áp dụng ma trận phân quyền công cụ (Tool Permission Matrix) nghiêm ngặt:

classDiagram
    class BaseAgent {
        +String conversationId
        +String model
        +send_message()
    }

    class FullAccessCoder {
        +write_to_file()
        +replace_file_content()
        +multi_replace_file_content()
        +run_command()
        +view_file()
        +grep_search()
        +list_dir()
    }

    class ReadOnlyAdversarialReviewer {
        <<agent.B5 Logic>>
        +view_file()
        +grep_search()
        +read_url_content()
        +list_dir()
        -CANNOT write_to_file()
        -CANNOT replace_file_content()
        -CANNOT run_command()
    }

    BaseAgent <|-- FullAccessCoder
    BaseAgent <|-- ReadOnlyAdversarialReviewer

Cấu tạo Payload Khởi Tạo Un-forked Reviewer:

{
  "Subagents": [
    {
      "TypeName": "adversarial_reviewer",
      "Role": "Un-forked Code Reviewer",
      "Model": "pro",
      "Workspace": "inherit",
      "Prompt": "Bạn là Adversarial Reviewer độc lập (agent.B5). Nhiệm vụ: Đánh giá Git Diff sau đây đối chiếu với tiêu chí Closes When. Dữ liệu duy nhất bạn nhận được là Diff và Tiêu chí. KHÔNG TIN VÀO BẤT KỲ LỜI HỨA NÀO CỦA CODER.\n\n[GIT_DIFF]\n+ export function validateToken(token: string) {\n+   if (!token) return true // BUG: Pass empty token!\n+   return jwt.verify(token, SECRET)\n+ }\n\n[CLOSES_WHEN_CRITERIA]\n1. Token rỗng phải trả về 401 Unauthorized.\n2. Mọi ngoại lệ JWT phải được catch và log sạch."
    }
  ]
}

3. Luồng Trình Tự Kiểm Thử & Loop-Back (Sequence Diagram)

Quy trình phản biện diễn ra theo mô hình giao tiếp 3 bên không qua trung gian suy luận:

sequenceDiagram
    autonumber
    actor Lead as Lead Agent
    participant Coder as Coder (Phase B Exec)
    participant Reviewer as agent.B5 (Un-forked Reviewer)
    participant Checklist as checklist.md (SSoT)

    Note over Coder: Hoàn thành Work Item 2
    Coder->>Lead: Gửi bản Git Diff & Yêu cầu Review
    
    Note over Lead, Reviewer: Khởi tạo Plain Subagent (Không Fork)
    Lead->>Reviewer: invoke_subagent(Model: pro, Prompt: Diff + Criteria)
    
    Reviewer->>Reviewer: Đọc file native (view_file) & Phân tích Diff
    
    alt Review Thất Bại (Phát hiện Bug / Lỗ hổng)
        Reviewer-->>Lead: send_message(Status: REJECTED, Reason: "Pass empty token")
        Lead->>Checklist: Cập nhật Work Item 2 -> RE-OPENED
        Lead->>Coder: Gửi phản hồi lỗi & Yêu cầu sửa lại
    else Review Thành Công (Đạt 100% Criteria)
        Reviewer-->>Lead: send_message(Status: APPROVED)
        Lead->>Checklist: Cập nhật Work Item 2 -> CLOSED
    end

4. Vòng Đời Work Item Khi Đi Qua Adversarial Review (State Diagram)

Mọi Work Item trong checklist.md phải trải qua các trạng thái bất biến bên dưới. Tuyệt đối không có trạng thái "Self-Approved" (Tự duyệt).

stateDiagram-v2
    [*] --> OPEN: Khởi tạo ở Phase A
    OPEN --> IN_PROGRESS: Coder nhận task ở Phase B
    IN_PROGRESS --> REVIEW_PENDING: Coder nộp Git Diff
    
    state REVIEW_PENDING {
        [*] --> SpawningUnforkedReviewer
        SpawningUnforkedReviewer --> EvaluatingDiff: Plain Subagent Pro
        EvaluatingDiff --> OutputDecision
    }

    REVIEW_PENDING --> RE_OPENED: Reviewer REJECT (Phát hiện lỗi)
    RE_OPENED --> IN_PROGRESS: Coder sửa lại code

    REVIEW_PENDING --> CLOSED: Reviewer APPROVE (Đạt tiêu chí)
    CLOSED --> [*]: Work Item Hoàn Tất

5. Quy Tắc Kỷ Luật Kỹ Thuật (Engineering Rules for agent.B5)

!IMPORTANT3 Điểm Bắt Bắt Buộc Của Quy Trình Un-forked Review trong akiflow:

  1. Strict Data Payload Boundary: Lead Agent CHỈ ĐƯỢC PHÉP truyền đúng 2 khối dữ liệu vào prompt của Reviewer:
    • Khối 1: Raw Git Diff (được trích xuất từ commit/stash mới nhất).
    • Khối 2: Câu phát biểu Closes When tương ứng từ checklist.md.
  2. No Memory Sharing: Reviewer không bao giờ được phép đọc file chat.md hoặc các bản ghi thảo luận trước đó của Coder để tránh bị lây nhiễm thiên kiến.
  3. Loop-back Discipline: Khi Reviewer từ chối (REJECT), Lead Agent không được tự ý "sửa hộ" code hay ép Reviewer duyệt lại. Lead Agent bắt buộc phải chuyển trạng thái Work Item về RE-OPENED và chuyển phản hồi cho Coder thực hiện lại.

6. Kết Luận

Kỹ thuật Un-forked Adversarial Review cùng logic agent.B5 là chiếc "phanh an toàn" quan trọng nhất trong kiến trúc akiflow. Bằng cách tách biệt triệt để ngữ cảnh giữa người làm (Coder) và người kiểm (Reviewer), hệ thống triệt hạ hoàn toàn căn bệnh tự duyệt xuôi chiều, mang lại sự đảm bảo chắc chắn cho chất lượng mã nguồn trong các dự án phần mềm quan trọng.