284 lines
8.9 KiB
YAML
284 lines
8.9 KiB
YAML
# 填好的手动闭环示例(虚构的 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.18.0"
|
||
project:
|
||
name: "notes-web"
|
||
baseUrl: "http://localhost:5173"
|
||
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"]
|
||
grok:
|
||
developer:
|
||
standard: ["grok-4.5"]
|
||
strong: ["grok-4.6"]
|
||
test:
|
||
standard: ["grok-4.5"]
|
||
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"
|
||
grok-dev-standard:
|
||
role: "developer"
|
||
cli: "grok"
|
||
tier: "standard"
|
||
model: "grok-4.5"
|
||
reasoningEffort: "medium"
|
||
permissionMode: "workspace-write"
|
||
grok-test-standard:
|
||
role: "test"
|
||
cli: "grok"
|
||
tier: "standard"
|
||
model: "grok-4.5"
|
||
reasoningEffort: "low"
|
||
permissionMode: "workspace-write"
|
||
grok-dev-strong:
|
||
role: "developer"
|
||
cli: "grok"
|
||
tier: "strong"
|
||
model: "grok-4.6"
|
||
reasoningEffort: "high"
|
||
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。
|
||
fixLogic: >
|
||
修正确认区对预览响应的字段映射,完整渲染四类 diff,同时保持取消操作不触发写入。
|
||
acceptanceCriteria:
|
||
- "预览后确认区显示 title、修改前值、修改后值和 coverChanged"
|
||
- "取消预览不会产生保存请求"
|
||
- "原先确认区为空的问题不再出现"
|
||
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 全部出现,取消不触发写入"
|
||
environmentIncidents:
|
||
- id: "BUG-002-ENV-1"
|
||
attemptId: "BUG-002-A2"
|
||
role: test
|
||
phase: service
|
||
status: resolved
|
||
summary: "第一次复测连接到旧构建"
|
||
evidence: "服务进程的 worktree 与当前任务不一致"
|
||
impact: "该次执行没有形成产品通过或失败结论,不计复验轮次"
|
||
recoveryAction: "重启当前 worktree 的最新服务后重新复验"
|
||
userAction: "无需操作;Coordinator 已完成服务对齐"
|
||
reportedAt: "2026-07-06T09:30:00+08:00"
|
||
resolvedAt: "2026-07-06T09:32:00+08:00"
|
||
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; 需重新设计并发模型"
|