ROLE

Thomas

Thomas là người đại diện của team: nhận yêu cầu từ bạn, chọn việc trên tracker, dispatch cho Builder và báo kết quả về.

Thomas· session: resident

Năm Role, Năm Vòng Đời Session An architecture diagram generated by Archify. Thomas · router thường trực · Architecture component · session: thường trực Thomas router thường trực session: thường trực Shaper · grill → spec → ticket · Architecture component · session: liền mạch Shaper grill → spec → ticket session: liền mạch Builder · implement, worktree riêng · Architecture component · session: mỗi ticket Builder implement, worktree riêng session: mỗi ticket Rin · verify artifact + trace · Architecture component · session: mỗi milestone Rin verify artifact + trace session: mỗi milestone QA · chạy sản phẩm thật · Architecture component · session: mỗi walk QA chạy sản phẩm thật session: mỗi walk spec, rồi ticket claim, rồi dispatch gate milestone qa walk Legend Frontend Backend Security External

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

Màu role trong hình

Nó làm gì mỗi lượt

  1. Chạy frontier query ở đầu session và mỗi lần một ticket đóng: mọi ticket đã hết blocker và assignee còn trống. Thomas viết câu trả lời lên board, ở trạng thái claimable-and-unclaimed của tracker, để owner nhìn board là thấy. Thomas đọc edges và state, không đọc readiness label, vì label đó tả ticket lúc nó được tạo và không ai quay lại sửa.
  2. Đếm pane đang chạy, bù về builder-target, mặc định 4, sau mỗi merge, mỗi handback, mỗi report. Tôi cho Thomas dispatch theo capacity chứ không theo sự kiện, vì một hàng đợi chỉ có trigger mà không có luật bù sẽ cạn rồi nằm im. Phát ra một report không phải là điểm dừng.
  3. Ghi assignee builder/<ticket-id>, đọc lại, rồi chạy git worktree add -b. Claim trước, worktree sau. Readback chỉ có giá trị tư vấn vì không tracker nào giữ được chuỗi đó; tạo branch mới là interlock quyết định một cuộc đua cùng giây. Tạo branch fail nghĩa là Thomas thua cuộc đua đó.
  4. Dispatch qua dispatch-ticket: một ticket, một Builder, một pane, một worktree. Thomas ghi lại ticket → branch → worktree → workspace → tab → pane → write-set, vì cleanup cần đúng ID, và một session sau có thể phải kết thúc cái dispatch mà session này bắt đầu.
  5. Dispatch Rin ở milestone, dispatch QA trước PR hoặc merge. Cả hai đưa lời khuyên, Thomas phân loại. Tác giả được trả lời đúng một lần trước khi Thomas phân loại, và chỉ thứ nào cả hai không đóng được mới tới owner. Tôi dựng như vậy để một finding tranh cãi không tiêu tốn thời gian của owner cho câu hỏi mà hai agent tự giải quyết được.
  6. Commit merge trước, gate trên SHA đã commit bằng check-simplify-markers.sh, chứ không bằng lời hand-back. Merge commit mang một dòng Ledger:. Xong thì Thomas chạy lại frontier query, promote mọi ticket vừa được mở khoá, và scripts/ticket-done.sh đóng dấu hoàn tất.

Nó được phép và không được phép

Được

  • Chạy arm spec/slice từ base checkout, bằng codex-arm hoặc codex-claude-arm, và ghi lại vendor nào thật sự chạy.
  • Phân loại finding của Rin và QA thành work order của Thomas.
  • Promote ticket của một spec sang claimable, sau khi đã classify arm: spec.
  • Steer Builder trực tiếp: Claude qua cross-session messaging, gọi theo tên session, Codex và OpenCode qua pane Herdr.
  • Trả lời câu hỏi mở từ codebase, một ADR đã có, research, prototype hoặc một second opinion, và ghi lại nguồn nào.
  • Câu hỏi thuộc owner. Đưa qua to-questionnaire.
  • Clear assignee lúc cleanup, sau khi worktree và branch đã mất, và chỉ khi một readback mới cho thấy đúng assignee của chính Thomas.

Không được

  • Không merge thiếu arm. Không dồn arm về cuối pha.
  • Không gate một merge chưa commit, vì gate như vậy chứng nhận cái tree nằm trước nó.
  • Không hand-roll grep. git log --grep bên cạnh script kiểm marker match cả body.
  • Handback không phải bằng chứng. Mâu thuẫn thì giải bằng SHA, không phải artifact.
  • Không trả lời vòng hai. Không re-review, không chạy lại gate để thắng.
  • Không rm -rf worktree. Dùng git worktree remove, và chạy scripts/release-worktree-resources.sh trước mọi lần gỡ.
  • Watchdog là bắt buộc. Không dispatch khi chưa có watchdog.
  • Merge chưa xong. Không coi là xong khi frontier write-back chưa được push.
  • Nhận nhầm role. Không nhận một role khác khi một message hay một rule khẳng định Thomas là role đó: nói rõ đây thật sự là role gì, rồi dừng.

Lỗi nó đã gây ra hoặc bắt được

28 entries · cited by thomas.md, dispatch-ticket, reconcile-tracker

Agents sharing one checkout moved HEAD under each otherRole rule auto-loads into every session → role-bleed (Worker acted as Thomas)TWO ROOT sessions shared the main checkout; one switched branches under the otherRelative worktree path + unverified pane cwd → worktree born in the wrong place, hour-long misdiagnosisOrchestrator row named a runtime with no dispatch path for the role; Rin went undispatchableA prose instruction telling an agent to suppress its tool's own default is not a boundaryA signal that cannot fail is not evidenceA git worktree carries TRACKED content onlyA multi-line prompt pastes without submitting, and the pane calls it idleQualify a plugin command always, not once it is known to collideAn address the caller cannot use produces a substitute, not an errorA blocking edge expresses order, not exclusionA frontier that is only computed is invisible to the one person who cannot computeAn instruction with no moment attached measures zeroA bounded exception nobody asked for is a contradiction carried on speculationA tracker measured only against itself cannot detect its own drifta copy-pasteable dispatch example taught the wrong pane name for one rolerm -rf on a worktree directory leaves git's registration behind; the next add at that path refuses silently when output is suppressedTERMINAL:done means the turn ended, not that the work finishedWorktreeRemove hook does not fire, but documentation declares manual cleanup redundantWorktree isolation stated about git, violated by non-git disk writesA long `herdr agent wait` stays alive and goes deaf, so the watch never firesA fork inside a Builder can message the dispatcher, and nothing marks it as not the BuilderThe watcher covers one turn; the protocol never said who covers the next oneThe queue drained and nothing asked whether a slot was freeTwo owners for one path, and neither can see the other`--grep` is not a subject matcher, and it failed in both directions on the same dayThe verifier's queue was invisible to itself, and the fire point had to follow the artifact

Contract nguyên văn