派生关系
四个文档逐一
<!-- PM Agent 维护,每次人类反馈追加 section --> <article data-doc="prd" data-rev="3"> <h1>Auto Auth System</h1> <section data-rev="1"> <h3>登录</h3> <p>用户名密码登录,会话 7 天有效。</p> </section> <section data-rev="3" data-origin="yibo@2026-05-13"> <h3>OAuth 登录</h3> <p>支持 GitHub OAuth。Token 刷新 ≤ 5s。</p> </section> <footer data-changelog> <p>rev 1 · init · 邮箱密码登录</p> <p>rev 2 · yibo · 加个人主页</p> <p>rev 3 · yibo · GitHub OAuth</p> </footer> </article>
<!-- Architect 生成;嵌入可机读 unit 元数据 --> <article data-doc="sdd" data-derived-from="prd@rev3"> <section data-unit-id="auth-be" data-type="be" data-depends=""> <h3>Unit · auth-be</h3> <p>提供登录 / 注册 / token 校验端点</p> <pre data-contract="openapi"> POST /api/auth/login request: { email, password } response: 200 { token } | 401 { error:"invalid_credentials" } </pre> <ul data-acceptance> <li>有效凭据 → 200 + JWT</li> <li>user 不存在 → 401 invalid_credentials</li> </ul> </section> <!-- 更多 section ... --> </article>
{ "project_id": "p-001", "prd_rev": "3", "sdd_rev": "5", "units": [ { "id": "auth-be", "type": "be", "status": "passed", "depends_on": [], "retries": 1, "retry_budget": 5, "contract_hash": "sha256:7f3a...", "last_run": "run-20260513-0731" }, { "id": "auth-fe", "type": "fe", "status": "testing", "depends_on": ["auth-be"], "retries": 0, "retry_budget": 5, "contract_hash": "sha256:9c1d..." } ], "l2_rounds": 0, "l2_budget": 3 }
{ "run_id": "run-20260513-0731", "loop": "L1", "unit_id": "auth-be", "agent": "tester", "attempt": 2, "summary": { "total": 8, "passed": 7, "failed": 1 }, "ok": false, "failures": [ { "test": "login.invalid-pwd", "expected": 401, "got": 500, "stack": "TypeError: ...", "hint": "先查 user 再 bcrypt 比对" } ], "next_action": "retry_coder", "retry_budget_left": 3, "duration_ms": 1245 }
谁能写谁
| 文档 | 写入者 | 读取者 |
|---|---|---|
prd.html | PM (通过 DocStore) | Architect · Dashboard |
sdd.html | Architect (通过 DocStore) | Coder · Tester · Integrator · Triager · Dashboard |
units.json | Architect (字段) + UnitRegistry (status) | 所有 |
integration/spec.json | Architect | Integrator |
units/{id}/code/** | Coder | Tester · Integrator · Triager (只读) |
units/{id}/contract.json | Coder | Tester · 其他 Unit Coder · Triager |
units/{id}/tests/** | Tester | Integrator |
runs/{id}/result.json | Tester (L1) / Integrator (L2) | LoopController · Triager · Dashboard |
triage.json | BugTriager | LoopController · Architect |
history/** | DocStore.archive() | Dashboard diff 视图 |
agent-state/{agent}.json | LoopController + Agent 工具 | Dashboard · recoverOnBoot |
agent-state/{agent}-todo.json | Agent (write_todolist · update_todo_item 工具) | Dashboard · getProgress |
agent-state/snapshots/* | LoopController | retry 时回放 · recover |
timeline.ndjson | TimelineLogger (所有 source append) | Dashboard 时间线 · audit |
memory/devloop/{agent}/*.md | Agent (record_memory 工具) | Agent 启动时注入 prompt |
归档策略
每次 prd / sdd / units.json 被写时,旧版本自动移到 history/,命名规则:
history/prd-rev-{N}.htmlhistory/sdd-rev-{N}.htmlhistory/units-rev-{N}.json
Dashboard 的 PRD diff 视图直接读 history 做 section diff。无需 git。