# 填好的手动闭环示例(虚构的 notes-web 项目)。历史轮次没有自动 launcher receipt; # 因此使用 manual 模式。可用 scripts/validate_tasks.py 校验通过。 version: 1 updatedAt: "2026-07-06T09:40:00+08:00" source: "Coordinator (PM) Agent" ackVersion: "0.12.0" project: name: "notes-web" repoPath: "/home/dev/notes-web" baseUrl: "http://localhost:5173" devWorktree: "/home/dev/notes-web-wt/fix-preview" overlayFile: "docs/ack/project.md" knowledgeFile: "docs/ack/knowledge.yaml" deliveryFile: "docs/ack/delivery.yaml" orchestration: profileVersion: 1 mode: "manual" allowedWorktrees: - "/home/dev/notes-web-wt/fix-preview" modelAllowlist: codex: developer: standard: ["gpt-5.6-terra"] strong: ["gpt-5.6-sol"] test: standard: ["gpt-5.6-luna"] cursor-agent: developer: standard: ["auto"] test: standard: ["auto"] profiles: codex-dev-standard: role: "developer" cli: "codex" tier: "standard" model: "gpt-5.6-terra" reasoningEffort: "medium" permissionMode: "workspace-write" codex-test-standard: role: "test" cli: "codex" tier: "standard" model: "gpt-5.6-luna" reasoningEffort: "low" permissionMode: "workspace-write" codex-dev-strong: role: "developer" cli: "codex" tier: "strong" model: "gpt-5.6-sol" reasoningEffort: "high" permissionMode: "workspace-write" cursor-dev-standard: role: "developer" cli: "cursor-agent" tier: "standard" model: "auto" reasoningEffort: null permissionMode: "workspace-write" cursor-test-standard: role: "test" cli: "cursor-agent" tier: "standard" model: "auto" reasoningEffort: null permissionMode: "workspace-write" defaults: developer: "codex-dev-standard" test: "codex-test-standard" developerUpgraded: "codex-dev-strong" workerReceipts: [] deliveryRuns: [] summary: verified: ["BUG-002"] open: [] failedRetest: [] leftovers: ["BUG-003"] tasks: - id: "BUG-002" type: "bug" title: "预览变更点击后不显示 diff 行" priority: "P0" status: "verified" assignee: "developer" component: "web/app/fix/page.tsx" specRefs: - "docs/spec/fix-preview.md#preview" testRefs: - "tests/browser/cases/01-preview.md" knowledgeRefs: - "K-001@1" knowledgeApplied: - ref: "K-001@1" result: "applied" evidence: "重启服务并核对 commit 后再交给 Test" knowledgeCandidates: [] knowledgeChecks: - ref: "K-001@1" result: "passed" evidence: "服务实例、worktree 与 commit 9f8e7d6 一致" checkedBy: "test-worker-1" checkedAt: "2026-07-06T09:36:00+08:00" # 飞书导入时使用不透明 digest;不要在 source.ref 中放 profile、Base、table 或 record ID。 source: kind: "feishu-base" ref: "feishu-base:sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" recordId: "recExample" updatedAt: "2026-07-06T09:00:00Z" description: > 用户在 /fix 页点击“预览变更”后,确认区不渲染 API 返回的 diff。 stepsToReproduce: - "打开 /fix?fileId=1" - "搜索并选择候选项" - "点击“预览变更”" expected: > 确认区出现 title、修改前值、修改后值、coverChanged 提示四行。 actual: > API 返回 code=0,但页面确认区为空。 evidence: browser: "确认区 DOM 为空,无 diff 行" api: "POST /api/fix/preview -> code=0, 含 diff 字段" logs: "无报错" verification: commands: - "npm run build" - "curl -s -X POST localhost:5173/api/fix/preview -d @fixtures/preview.json" browser: page: "/fix?fileId=1" checks: - "预览后出现 4 行 diff:title/before/after/coverChanged" dispatch: developer: profileId: "codex-dev-standard" receiptId: null attemptId: null taskId: null dispatchId: null test: profileId: "codex-test-standard" receiptId: null attemptId: null taskId: null dispatchId: null rounds: - round: 1 attemptId: "BUG-002-A1" result: failed evidence: "只渲染了 title,缺少 before/after/coverChanged" - round: 2 attemptId: "BUG-002-A2" result: passed evidence: "复测 4 行 diff 全部出现,取消不触发写入" resolution: fixedBy: "dev-worker-1" verifiedBy: "test-worker-1" verifiedAt: "2026-07-06T09:38:00+08:00" leftoverReason: null - id: "BUG-003" type: "bug" title: "并发保存偶发覆盖他人修改" priority: "P1" status: "leftover" assignee: "developer" component: "server/store/notes.go" specRefs: - "docs/spec/concurrency.md" testRefs: [] knowledgeRefs: [] knowledgeApplied: [] knowledgeCandidates: - kind: "pitfall" title: "乐观锁检查必须覆盖批量导入路径" claim: "只在 API 写入路径检查版本号会漏掉批量导入" scope: components: ["server-store"] paths: ["server/store/**"] tags: ["concurrency"] appliesWhen: "修改 note 的并发写入或批量导入逻辑" directive: "同时验证 API 与批量导入的版本冲突处理" rationale: "第二轮修复只覆盖 API,批量导入仍可静默覆盖" evidenceRefs: - "tasks.yaml#BUG-003-round-2" proposedBy: "test-worker-1" proposedAt: "2026-07-06T09:32:00+08:00" knowledgeChecks: [] description: > 两个会话同时保存同一条 note 时,后写覆盖先写,无冲突提示。 stepsToReproduce: - "会话 A、B 同时打开 note 42" - "A 保存,B 保存" expected: > B 保存时应检测到版本变化并提示冲突,而非静默覆盖。 actual: > B 直接覆盖 A 的修改,无提示。 evidence: api: "两次 PUT /api/notes/42 均返回 200,无版本校验" verification: commands: - "go test ./server/store/..." browser: page: "/notes/42" checks: - "并发保存时后写方收到冲突提示" dispatch: developer: profileId: "codex-dev-standard" receiptId: null attemptId: null taskId: null dispatchId: null test: profileId: "codex-test-standard" receiptId: null attemptId: null taskId: null dispatchId: null rounds: - round: 1 attemptId: "BUG-003-A1" result: failed evidence: "加了版本号但未在写入路径校验" - round: 2 attemptId: "BUG-003-A2" result: failed evidence: "校验只覆盖 API,未覆盖批量导入路径" - round: 3 attemptId: "BUG-003-A3" result: failed evidence: "乐观锁与前端重试逻辑冲突,需重新设计" resolution: fixedBy: null verifiedBy: null verifiedAt: null leftoverReason: "failed after 3 supervised developer rounds; 需重新设计并发模型"