codex-arm

Chạy một lượt Codex trên artifact đã xong, để một vendor khác đọc diff trước khi merge.

Cánh Tay Chéo Vendor A sequence diagram generated by Archify. commit range <base>..HEAD adversarial-review --wait --base <ref> Chữ focus mang ý định của chủ ticket blocking / non-blocking Chỉ file output đáng tin, không bao giờ tin exit code arm(ticket): receipt Finding gộp theo class trước; commit rỗng, parent là cây mà gate đã đọc branch, SHA, marker Bắn cánh tay Phán quyết Receipt + handback Builder · worktree riêng · Sequence participant Builder worktree riêng Codex · review đối kháng · Sequence participant Codex review đối kháng Ticket Branch · HEAD · Sequence participant Ticket Branch HEAD Thomas · router thường trực · Sequence participant Thomas router thường trực Legend request return async trace default message

Vuốt ngang để xem hết sơ đồ

Xem sơ đồ đầy đủ ↗mở tab mới

Nó làm gì

codex-arm là phần cơ chế gọi của cánh tay cross-vendor: lượt review bằng Codex mà Thomas, hoặc ở phạm vi ticket là chính Builder, chạy trên một artifact đã hoàn thành trước khi nó được merge. Nó bao gồm lệnh gọi (codex-companion.mjs, runtime plugin của Codex), các bẫy về argv và quoting, và chỗ ghi lại phán quyết. Nó không quyết định khi nào chạy. Nhịp đó, cùng với trần hai lượt, thuộc về thomas.md và builder.md. Skill này sở hữu phần cách làm, không phải phần thời điểm.

Lý do nó tồn tại: reviewer cùng vendor và reviewer khác vendor bắt được hai lớp lỗi khác nhau, vì người viết đọc theo ticket còn cánh tay đọc theo repository. Điều này đã được đo trực tiếp.

Lượt arm theo ticket đầu tiên bắt được một cú reset có tính phá huỷ đang tự cấp quyền ra ngoài write transaction của nó, thứ mà chính lượt mutation-testing của tác giả đã bỏ sót. Ngay lượt kế tiếp, chạy trên bản vá cho phát hiện đó, lại bắt được một vòng deadlock thật do chính bản vá ấy tạo ra. Bỏ qua nó là đã ship một lỗi 500 lên production, đúng trên con đường gỡ kẹt duy nhất mà sản phẩm có.

Khi nào Thomas gọi nó

Tình huống trước mặt bạn Gọi cái nào
Diff của một ticket đã commit, root là Claude hoặc Builder đang tự chạy arm cho ticket của nó codex-arm
Một spec vừa xong, sắp cắt thành ticket codex-arm ở arm: spec, do Thomas chạy từ base checkout
Một slice đang khép lại codex-arm ở arm: slice, tương tự như trên
Cần chạy chính gate của Rin Không phải skill này. Rin không tự chạy cánh tay từ bên trong lượt review của chính nó

Cần sẵn gì

  • Artifact đang được review đã commit. Cánh tay đọc một cây git, không phải working directory.
  • Ở phạm vi ticket, Builder chạy nó từ worktree của chính nó, nơi HEAD đã trỏ đúng các commit đang được review. Ở phạm vi spec hoặc slice, Thomas tự resolve head từ một detached checkout tại SHA đó, vì riêng --base không nói được companion đang so với head nào.
  • Phần chữ focus phải tránh mọi ký tự đặc biệt của shell hay glob, không phải tránh theo một danh sách cố định. Nó được truyền không quote, tách theo từ, nên một cụm viết tự nhiên như option (a) không bao giờ tới được tiến trình; glob expansion của zsh giết lệnh ngay lúc parse.
  • codex exec review không mang được cả dải lẫn focus cùng lúc. Đo trên codex-cli 0.155.1: codex exec review --base main "<focus>" từ chối với lỗi đối số --base <BRANCH> không dùng chung được với [PROMPT] (exit 2); --commit <sha> từ chối y hệt, và - — ký hiệu đọc từ stdin — chính là positional đó, nên cũng bị từ chối. Cách sửa nghe hợp lý lại tệ hơn: pipe focus vào mà không kèm - thì được chấp nhận và âm thầm bị bỏ qua — lượt chạy review dải đó dưới một prompt chung chung rồi thoát mã 0 với một review đầy đủ, chứng minh bằng cách pipe một chuỗi đánh dấu và nhận lại một review bình thường, không thấy chuỗi đó xuất hiện lần nào. Nên trên root không phải Claude, cánh tay dùng codex exec trần, viết cả dải lẫn ý định thành text prompt bình thường, và -o/--output-last-message để lấy message cuối ra file riêng của nó. Trên root Claude, đường plugin là chính vì một lý do cụ thể chứ không phải sở thích: adversarial-review nhận focus như một positional bình thường bên cạnh --base, đúng thứ mà codex exec review từ chối.
  • Một lượt treo giờ là một job, không phải một phán quyết (plugin ≥ 1.0.6). --background trả về một job id; status --all --json liệt kê những gì đang chạy; result <job-id> --json trả về output cuối cùng đã lưu của lượt review như một artifact riêng; cancel <job-id> --json huỷ một lượt treo thay vì bỏ mặc nó. Các phát hiện có hình dạng khai báo sẵn trong schemas/review-output.schema.json của plugin — verdict, summary, findings[] gồm severity / title / body / file / line_start / line_end / confidence / recommendation — nên gộp theo field chứ không phải parse từ văn xuôi.

Nó để lại gì

Kết quả Nơi nó nằm lại
Phán quyết Vệt quyết định merge: ngày, phán quyết, cách xử lý từng phát hiện, vendor nào đã chạy
Test có chạy hay không Một dòng Tests:: RAN hoặc NOT RUN — <lý do>
Dải mà cánh tay đọc Dòng đầu của output: số commit và số file, để một dải 0 commit không lọt qua như một lượt sạch
Codex không dùng được cross-vendor arm: NOT RUN — <lý do>, và chỉ chủ project mới được chấp nhận nó
Tài nguyên của một gate worktree Giải phóng bằng release-worktree-resources.sh trước khi gỡ, không bao giờ sau

Lỗi đã biết

Lấy từ harness/.agents/memory/recurring-failure-modes.md. Mọi mục dưới đây đều ở trạng thái promoted: đã sửa và đã nằm trong hợp đồng mà trang này mô tả.

  • Base lệch checkout, review tự so với chính mình. Companion resolve HEAD từ chính checkout nó đang chạy. Chỗ nào cái đó lệch với --base thì lượt chạy đem base branch so với chính nó và trả về sạch. Bị bắt hai lần, bởi người vận hành chứ không phải bởi gate. Đã sửa: in dải commit và file thành dòng output đầu tiên, dừng khi dải có 0 commit.
  • Thoát mã 0 khi cấu hình lỗi. Companion thoát mã 0 khi lỗi cấu hình, và cache state khoá theo workspace root. Đã sửa: không bao giờ rẽ nhánh theo exit code, chỉ theo nội dung file output; không bao giờ dùng lại một đường dẫn gate worktree.
  • Broker mồ côi tích lại qua các lượt review. Mỗi lần gọi codex-companion.mjs lại sinh một tiến trình broker chạy lâu hơn cả lượt review, đo được 92 tiến trình mồ côi (~405 MB) trên hai project. Đã sửa: giết broker theo cwd thật trước khi gỡ gate worktree.
  • Teardown cấp project giết luôn hạ tầng dùng chung. Một target teardown ở cấp project bị dùng làm bước release đã dừng luôn container test-database dùng chung mà mọi Builder đang chạy đều phụ thuộc vào đó. Đã sửa: giới hạn release trong đúng worktree này, hoặc không release gì cả.
  • Reviewer chỉ đọc vẫn dời được HEAD người khác. Một reviewer chỉ đọc nhưng có shell vẫn dịch được HEAD của agent khác bằng git switch. Đã sửa: reviewer là một agent đầy đủ, nên cả cánh tay ở phạm vi ticket cũng có detached worktree riêng.

Đang chạy đúng nếu

  • Dòng đầu của mọi lượt arm nêu rõ số commit và số file của dải đang được review.
  • Có mặt một dòng Tests:, ghi RAN hoặc nêu tên lý do không chạy.
  • Vendor được ghi trong vệt merge khớp với vendor thật sự đã chạy, và không bao giờ tính một lượt cùng vendor thành lượt cross-vendor.
  • Không gate worktree nào tồn tại lâu hơn lượt review của nó. Tài nguyên được giải phóng trước khi gỡ, trên mọi nhánh đường.
  • Một phát hiện blocking ở lượt 1 phải có lượt 2 chạy trên bản vá, không phải một phán đoán cảm tính rằng có thể bỏ qua.

Nó nằm ở đâu trong chuỗi

Vòng khép kín của một Builder chạy implement → review → simplify → codex-arm (phạm vi ticket) → receipt arm(ticket): → handback, và bước cleanup của /skills/dispatch-ticket kiểm receipt đó trước khi gỡ worktree. Ở phạm vi spec và slice, Thomas chạy nó từ base checkout trước khi thả một shaper đang tạm dừng hoặc trước khi khép một slice. Nó không thay được /skills/review-with-rin, vì đó mới là gate, còn đây là lượt chạy nuôi gate đó.

Về danh mục skill →