# 四类文档 > PRD / SDD / units.json / runs/result.json — 它们之间是**派生关系**,构成系统的唯一真源。本页给出完整 schema 与示例。 ## 派生关系 ## 四个文档逐一 ```js

Auto Auth System

### 登录 用户名密码登录,会话 7 天有效。 ### OAuth 登录 支持 GitHub OAuth。Token 刷新 ≤ 5s。 rev 1 · init · 邮箱密码登录 rev 2 · yibo · 加个人主页 rev 3 · yibo · GitHub OAuth ``` ```js ### Unit · auth-be 提供登录 / 注册 / token 校验端点 ``` POST /api/auth/login request: { email, password } response: 200 { token } | 401 { error:"invalid_credentials" } ``` - 有效凭据 → 200 + JWT - user 不存在 → 401 invalid_credentials ``` ```js { "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 } ``` ```js { "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}.html` - `history/sdd-rev-{N}.html` - `history/units-rev-{N}.json` Dashboard 的 PRD diff 视图直接读 history 做 section diff。无需 git。