一个任务入口
所有需求由项目 Codex 收口并创建 TaskID,不允许 Agent 自行编造编号。
Technical Architecture
所有需求从同一个入口创建 TaskID,再按风险和复杂度选择 Mini Lane A、Standard Lane A 或 Lane C。治理强度与模型路由分离;Agent 只提交结构化事件与证据,Dispatcher 作为唯一状态写入者生成 state.json。复核从确定性检查开始,最终以独立审查、人工授权和部署后事实闭环。
不复制 Loop Engineering 的完整多 Lane 控制面。只保留一个任务入口和一套事实模型,再用三档执行强度控制成本与风险。
所有需求由项目 Codex 收口并创建 TaskID,不允许 Agent 自行编造编号。
Mini A 控制成本,Standard A 保证质量,Lane C 保护高风险边界。
对话、分支、handoff、review、状态和部署都引用同一编号。
Agent 可以实现和验证,但合并、密钥、迁移、生产部署必须经过 Gate。
AI 原生不是增加更多模型,而是让任务可由不同 Agent 无损接棒、让机器先验证机器能验证的事实,并让人只处理真正需要判断和授权的部分。
任务契约、状态和证据不依附某个聊天。当前由 agy / Gemini 3.1 Pro 实现;未来备用执行者可用同一 TaskID 在独立分支接手。
Agent 不直接竞争写 state.json,只提交带 eventId 的结果事件,由 Dispatcher 校验并生成当前状态。
schema、diff scope、类型、测试、DOM 和 console 先由工具检查;模型判断只覆盖语义与视觉盲区。
handoff、测试、截图和 review 都绑定 headCommit;代码变化后旧证据自动失效,禁止沿用。
分级只决定需要多少任务契约、证据和审查,不改变 TaskID、状态文件和事实诚实原则。项目 Codex 在创建任务时选档;实现 Agent 不得自行降级。
适用:文案、间距、单文件样式、小范围确定性 Bug、已有测试覆盖下的机械修改。
交接:生成 compact handoff.json,只包含 commit、改动路径、测试结果、范围检查和下一责任人。
适用:UI 功能、CRUD、业务规则、有限跨模块改动、需要新增测试的 Bug 修复。
handoff.json Agent 交接包。证据:state.json、handoff.json、review.md、验证原始输出全部必需。
适用:OAuth、授权、密钥、数据库 schema/迁移、支付、不可逆操作、CI/CD 和生产部署。
证据:Standard A 全套证据,加风险清单、回滚方案、授权记录和生产事实。
模型路由不新增流程车道。任务记录 planner、executor、fallback、specialist verifier、reviewer 与升级阈值;换模型仍沿用同一 TaskID、独立分支、state.json 和 handoff.json,不重建任务上下文。
Mini A 和普通 Standard A 默认由 agy / Gemini 实现;Luna 只处理高复杂度或失败升级。当前不接入 Grok,不做无信号的双模型重复实现。
同一 TaskID 同一时刻只能有一个 executor owner。agy 升级到 Luna 时先停止并交接,再由调度者重新派发到独立分支/worktree;禁止两者同时编辑或拼接两边未审查的改动。
三档共用这条主干,但 Mini A 使用 compact handoff 并可跳过独立审查;Lane C 会在范围、敏感操作、合并和部署位置增加人工 Gate。审查不通过时返回同一 TaskID 和分支。
项目 Codex 澄清目标、范围、禁区和可验证结果。
调度台生成任务目录、task.md 与初始 state.json。
agy 默认在独立分支/worktree 实现;未来升级到备用执行者时使用另一独立工作区。
运行约定检查;UI/多模态任务再由 agy 执行浏览器验收并保存证据。
执行者写入结构化 Agent 交接包:改动、证据、风险、阻塞和下一动作。
Terra/Codex 只读任务契约、diff、handoff 和测试证据。
审查通过不等于合并。只有 Jay 授权后 Codex 才可合并。
记录 merge commit;状态只能由 Git 事实更新,不能靠 Agent 口述。
独立决定是否部署,并记录环境、URL、生产 SHA 和时间。
每一步只有一个当前责任人。Agent 只能提交状态迁移事件,不能直接写 state.json;Dispatcher 是唯一状态写入者。状态表示流程阶段,owner 表示下一位必须行动的人。
draft、ready、dispatched。implementing、handoff_ready、blocked。reviewing、changes_requested、approved。approved。merge_authorized、deploy_authorized。unknown。CSV 继续作为全局任务索引;每个 TaskID 使用独立目录保存可审计事实。Agent 追加事件与证据,Dispatcher 单独生成状态快照,避免多个 Agent 竞争写同一个 JSON。
.agent-lane/
tasks/
fit20260806-001/
task.md
events.jsonl
state.json
handoff.json
review.md
verify-output.txt
browser-evidence.json
screenshots/
agent-dispatch.csv # 全局索引,不保存完整证据
AGENTS.md # 跨任务协作规则
分支:
luna/fit20260806-001-short-name
grok/fit20260806-001-short-name
任务契约。范围变更必须递增 revision,并由项目 Codex确认。
追加式事件账本。每条事件带 eventId、actor、taskRevision 和 commit;它是状态变化的耐久事实。
由 Dispatcher 从事件账本生成的当前投影,便于 Agent 快速读取;不允许 Agent 直接修改。
执行 Agent 给审查 Agent 的结构化上下文包。字段稳定、内容紧凑,不为人类阅读优化。
审查结论、发现与逐项验收结果。approved 仍不代表 merged。
agy 输出的机器可读浏览器/多模态验收事实,并引用截图,不包含最终 approve 结论。
events.jsonl 保存状态变化事实,state.json 只回答“任务现在在哪一步、谁行动、证据在哪里”。摘要和讨论留在 Markdown,命令原始输出留在文本文件。
reviewing → changes_requested → implementing 是开发期正常回路。任意活动状态可以进入 blocked;生产验证失败可进入 rollback_requested。只有项目 Codex 或 Jay 可以解除阻塞、取消任务或授权回滚。{
"schemaVersion": 1,
"stateVersion": 7,
"lastEventId": "evt_fit20260806_001_007",
"taskId": "fit20260806-001",
"project": "jays-fitness",
"lane": "A",
"profile": "standard-a",
"riskLevel": "normal",
"taskRevision": 1,
"status": "handoff_ready",
"owner": "reviewer",
"title": "Add editable custom exercise groups",
"branch": "luna/fit20260806-001-custom-groups",
"worktree": null,
"scope": {
"allowedPaths": [
"app/components/training/",
"tests/unit/ui/"
],
"forbiddenPaths": [
"worker/",
"drizzle/",
".github/"
]
},
"acceptanceCriteria": [
"Custom actions are grouped deterministically",
"Existing planned actions are unchanged"
],
"verification": {
"required": [
"npm.cmd run typecheck",
"npm.cmd run test:unit"
],
"result": "passed",
"outputPath": "verify-output.txt"
},
"specialistVerification": {
"required": true,
"type": "browser",
"status": "pending",
"evidencePath": "browser-evidence.json"
},
"handoff": {
"attempt": 1,
"path": "handoff.json",
"createdAt": "2026-08-06T10:30:00+08:00"
},
"review": {
"verdict": "pending",
"path": "review.md",
"reviewedAt": null
},
"git": {
"headCommit": "abc1234",
"prUrl": null,
"mergeCommit": null
},
"deployment": {
"decision": "not_requested",
"environment": null,
"url": null,
"productionCommit": null,
"deployedAt": null,
"verificationStatus": "not_started",
"verifiedAt": null
},
"blocked": null,
"createdAt": "2026-08-06T09:00:00+08:00",
"updatedAt": "2026-08-06T10:30:00+08:00"
}
| 规则 | 要求 |
|---|---|
| 单一写入者 | Agent 只提交事件;只有 Dispatcher 能追加事件账本并替换 state.json。 |
| 追加与幂等 | 事件不可覆写;相同 eventId 重放不得产生第二次状态变化。 |
| 原子投影 | 先生成临时 state、校验 JSON,再替换正式文件,避免中断留下半截 JSON。 |
| 合法迁移 | Dispatcher 根据状态表校验,不允许从 implementing 直接跳到 deployed。 |
| 角色限制 | 执行者不能写 approved,审查者不能写 merge_authorized。 |
| 版本绑定 | handoff、测试、浏览器证据和审查结论必须绑定 taskRevision 与 headCommit;代码变化后旧证据自动失效。 |
| 证据指针 | JSON 保存文件路径和 verdict,不复制完整 handoff、review 或日志。 |
| 失败诚实 | 无法查询 Git、CI 或生产环境时填写 unknown,不得猜测。 |
| 时间标准 | 使用 ISO 8601,并保留时区,例如 +08:00。 |
handoff.json 不面向人类写作,而是执行 Agent 给下一个 Agent 的确定性输入。它不复述完整任务,不保存聊天过程;只传递完成审查或继续实现所需的最小上下文。Mini A 使用 compact 版本,Standard A 与 Lane C 使用完整版本。
{
"schemaVersion": 1,
"kind": "implementation_handoff",
"taskId": "fit20260806-001",
"taskRevision": 1,
"profile": "standard-a",
"attempt": 1,
"producer": {
"agent": "luna-max",
"role": "executor"
},
"consumer": {
"role": "reviewer",
"preferredAgent": "terra"
},
"repository": {
"branch": "luna/fit20260806-001-custom-groups",
"headCommit": "abc1234",
"baseCommit": "def5678"
},
"result": "ready_for_review",
"changes": [
{
"path": "app/components/training/CustomExerciseGroups.tsx",
"changeType": "modified",
"reasonCode": "acceptance_criterion_ac1"
},
{
"path": "tests/unit/ui/custom-exercise-groups.test.ts",
"changeType": "added",
"reasonCode": "verification_for_ac1"
}
],
"acceptanceEvidence": [
{
"criterionId": "AC1",
"status": "satisfied",
"evidenceRefs": ["TEST:custom-groups:grouping-thresholds"]
},
{
"criterionId": "AC2",
"status": "satisfied",
"evidenceRefs": ["TEST:training-plan:existing-order"]
}
],
"verification": [
{
"command": "npm.cmd run typecheck",
"status": "passed",
"exitCode": 0,
"outputRef": "verify-output.txt#typecheck"
},
{
"command": "npm.cmd run test:unit",
"status": "passed",
"exitCode": 0,
"outputRef": "verify-output.txt#unit"
}
],
"scopeCheck": {
"allowedPathsOnly": true,
"forbiddenPathsTouched": [],
"unexpectedPaths": []
},
"risks": [],
"skippedChecks": [
{
"check": "browser_smoke",
"reasonCode": "not_required_by_task_contract"
}
],
"reviewFocus": [
"grouping_thresholds_2_4_5_6",
"existing_action_order_stability"
],
"requestedSpecialistChecks": [
{
"type": "browser",
"scenarioId": "UI1",
"viewports": ["412x915", "1440x900"],
"evidenceOutput": "browser-evidence.json"
}
],
"nextAction": "independent_review",
"createdAt": "2026-08-06T10:30:00+08:00"
}
.env 内容。agy 不返回泛化评价,而是为每个验收场景输出可定位、可复查的结构化结果。截图只是 evidenceRef,不能单独代表通过。
{
"schemaVersion": 1,
"kind": "browser_evidence",
"taskId": "fit20260806-001",
"taskRevision": 1,
"producer": {
"agent": "agy",
"role": "specialist_verifier"
},
"target": {
"url": "http://localhost:3000",
"buildCommit": "abc1234"
},
"environment": {
"browser": "chromium",
"locale": "zh-CN",
"timezone": "Asia/Singapore"
},
"scenarios": [
{
"scenarioId": "UI1",
"viewport": "412x915",
"status": "passed",
"stepsCompleted": 5,
"assertions": [
{
"assertionId": "UI1-A1",
"status": "passed",
"evidenceRefs": ["screenshots/UI1-mobile-result.png"]
}
],
"consoleErrors": [],
"networkFailures": [],
"notes": []
}
],
"visualChecks": {
"overlapDetected": false,
"overflowDetected": false,
"unreadableTextDetected": false,
"blankPrimarySurface": false
},
"result": "passed",
"blockers": [],
"nextAction": "terra_review",
"createdAt": "2026-08-06T11:00:00+08:00"
}
合理复核不是再让一个模型从头做一遍,而是先用便宜、确定性的检查排除机械错误,再把剩余判断交给独立上下文中的审查者。每份证据都绑定 taskRevision 与 headCommit;代码一变,相关结论就过期。
校验 TaskID、revision、允许路径、禁止路径、依赖和 head commit。越界立即停止,不消耗模型审查。
依次运行 typecheck、lint、单元测试、构建和范围检查。记录命令、退出码、输出引用与 commit。
仅在任务契约要求时调用 agy。先做 Playwright、DOM、控制台与网络断言,再做截图和多模态视觉判断。
Terra 在新的审查上下文中只读取任务契约、diff 和证据,不读取规划推理;逐条判定验收标准与回归风险。
Jay 决定是否合并、部署或接受残余风险。技术 approved 不自动触发外部写入。
部署后核对 production commit、健康检查和关键 smoke。只有生产事实通过,发布任务才进入 verified。
| 任务档位 | 必须复核 | 按需复核 | 不默认做 |
|---|---|---|---|
| Mini Lane A | L0 + 最小 L1 + 快速 diff 审查 | 有明确视觉标准时才调用 agy | 第二实现模型、全仓扫描、完整架构复盘 |
| Standard Lane A | L0 + L1 + 新上下文 Terra 审查 | UI 流程用 agy;高回归面抽查重跑关键命令 | 无失败信号时额外启动第二执行模型 |
| Lane C | L0-L5、回滚方案、人工 Gate | 安全或迁移风险高时增加异质模型/人工专家复核 | 执行者自批、凭聊天推断部署成功 |
Lane C 使用和 Lane A 相同的 TaskID、状态机与证据目录,但由 Codex 主导,并在敏感操作、合并和部署位置强制人工授权。执行者不得用“默认同意”跨越。
需要修改 forbidden path、增加依赖、改变共享契约或扩大用户行为时,回到项目 Codex 更新 task revision。
OAuth、密钥、权限、数据库 schema、数据迁移、删除和不可逆操作需要 Jay 明确授权。
创建任务分支可自动;commit、push、PR、merge、rebase、reset 和 clean 按现有权限策略处理。
执行者和 agy 验收者都不能自我批准。要求的浏览器/多模态证据缺失时,Terra 不得写 approved。
approved 仅表示技术验收通过;Jay 授权后才进入 merge_authorized。
merged 不等于 deployed。生产 URL 和 production commit 必须由实际托管状态确认。
deployed 也不等于完成。健康检查、关键 smoke 与 production commit 一致后才进入 verified;失败时阻塞或请求回滚。
目标不是让 Agent 少思考,而是让每个 Agent 只消费完成自身职责所需的上下文。
| 角色 | 默认读取 | 默认不读取 | 升级条件 |
|---|---|---|---|
| Terra Medium | 用户需求、相关代码、AGENTS.md、最近事实 | 无关历史 handoff.json、全部测试源码 | 跨模块契约、架构或安全边界不明确 |
| agy / Gemini 3.1 Pro | task.md、允许路径、相关测试、必要接口 | 整个仓库、所有历史对话、全局审查记录 | 任务契约指向的接口无法理解或测试失败 |
| Terra Reviewer | task.md、state.json、git diff、handoff.json、commit 绑定验证输出 | 规划推理、实现过程聊天、无关业务模块 | diff 触及共享行为、证据矛盾或风险扩散 |
| agy Verifier | TaskID、目标 URL、场景、viewport、预期结果 | 完整仓库、架构历史、无关业务规则 | 页面失败且必须定位源码原因时,由 Terra 决定是否补充上下文 |
| 全局任务中心 | TaskID、project、status、owner、updatedAt | 源码、完整 handoff.json 和日志正文 | 用户按 TaskID 打开任务详情 |
先建立最小闭环,再自动化。不要先写复杂 Hook 或状态服务。
task.md、events.jsonl、state.json、handoff.json 模板。本节是给本地 Agent Dispatch 项目的实现 Agent 与审查 Agent 使用的正式任务依据。目标是在现有静态调度台内增加 Lane 可见性和自动分类入口,不创建第二套调度台,不更换 CSV 事实源,也不要求浏览器直接执行本机命令。
index.html、app.js、styles.css。agent-dispatch.csv 是唯一任务数据库。tools/classify-task.ps1 已通过 Codex CLI 生成 schema 约束的 Lane 决策。tools/lane-decision.schema.json 已定义 planner、executor、fallback、specialist verifier、reviewer 与升级阈值。tools/create-task.js 已能保存 Lane、分类来源和完整模型路由。任务卡显示 Lane 徽标和 riskLevel。未分类的历史任务显示“未分类”,不得伪装成 Standard A。
显示 lane、classifier、classificationPath、风险级别、建议模型和是否处于人工 Gate;路径允许复制。
增加项目与需求输入,生成并复制安全转义的 classify-task.ps1 命令。界面必须明确说明“已复制”,不能假装命令已执行。
任何导入或历史数据只要 lane 为 lane-c,派发按钮必须禁用并显示“等待 Codex / 人工授权”。
index.htmlapp.jsstyles.cssREADME.md| ID | 必须满足 | 证据 |
|---|---|---|
| AD-LANE-01 | 旧 CSV 可正常读取;无 lane 的任务显示“未分类”。 | 旧数据加载截图或浏览器记录。 |
| AD-LANE-02 | Mini、Standard、Lane C 使用不同且可读的徽标;任务卡布局不跳动。 | 桌面与窄视口截图。 |
| AD-LANE-03 | 任务详情准确显示分类来源、结果路径、风险和模型。 | 至少一个已分类任务的详情记录。 |
| AD-LANE-04 | 需求入口生成可在 PowerShell 使用的命令,正确处理空格、引号和中文。 | 三组输入的复制结果。 |
| AD-LANE-05 | Lane C 无法从网页进入 agy 派发路径;Mini/Standard 的既有派发不回归。 | 按钮状态与行为验证。 |
| AD-LANE-06 | 页面仍可双击 index.html 使用,无控制台错误、横向溢出或文本遮挡。 | 浏览器 smoke 和 console 检查。 |
node --check app.js
浏览器验证:
1. 使用旧 CSV 加载并确认“未分类”兼容行为。
2. 使用包含 mini-a、standard-a、lane-c 的数据检查卡片与详情。
3. 在 412x915 与 1440x900 视口检查布局和文本。
4. 检查复制命令中的中文、空格、双引号与单引号。
5. 确认 Lane C 派发被阻止,Mini/Standard 原流程仍可用。
6. 记录控制台错误检查结果。
交接必须包含:修改文件、逐项验收结果、验证输出、截图路径、残余风险和跳过项。