Move done DOCREV short-terms, checklists, and handoffs into archive/ops and retarget relative links after Round20 close-out. Co-authored-by: Cursor <cursoragent@cursor.com>
10 KiB
title, status, created, updated, owner, branch, worktree, mutex
| title | status | created | updated | owner | branch | worktree | mutex |
|---|---|---|---|---|---|---|---|
| 文档版本账本运行时整改 | done | 2026-09-13 | 2026-09-14 | Cursor-Auto | fix/document-revision-runtime-ui03 | - | docgov |
文档版本账本运行时整改
目标
消除 revision-state 404、重启丢账本、人工保存无效、overlay 无效;接通首轮/二轮可见确定性 change report;PATCH 权限→账本→投影顺序正确;停在 fix 分支待集成。
范围
internal/docrevisionPG hydrate/persist + bootstrap +MaterializeAgentOutputinternal/server授权、PATCH 顺序、orphan 不静默建账internal/bizdev小队成功走 Materialize(禁止仅 OpenTemplate)cmd/document-revision-backfillgofmtweb保存链路与 overlay 三模式- 工程测试 + 扩展 UI 验收计划(分栏)
非目标
- 不占 CURRENT 集成槽、不
env-service rebuild、不 push、不 mergedev - 不伪造 PI 叙事 change report;不把 fallback 说成完整 PI 分析
- 不把 stub 输出写入最终用户验收报告
步骤
- 审计 / 整改 / 本任务 + CURRENT 认领
- 分支
fix/document-revision-runtime - PG store + bootstrap + backfill
- Handler / agent / 前端
- 首轮报告 Materialize + PATCH 顺序 + 单测
- gofmt + UI checklist 扩展 + 文档证据
- 分层 commit,输出哈希与剩余 blocker(不 merge/push)
验收标准
- 工程门禁与 UI 实战计划分栏
- Round20 真实 UI PASS(见 ../../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md)
- 剩余开放:PI 叙事仍为 fallback;orphan 禁止假 V1(UI-16 验证已注册路径);不可用假数据掩盖
相关链接
- Audit: ../../audit/2026-09-13-document-revision-runtime-404.md
- Remediation: ../../remediation/2026-09-13-document-revision-runtime-remediation.md
- Checklist/UI: ../checklists/2026-09-13-document-revision-runtime-ui-acceptance.md
证据 / 备注
工程门禁(非 UI 验收)
gofmt -l cmd/document-revision-backfill/main.go internal/docrevision/risk.go
go vet ./...
go test -short ./...
cd web && npm test && npm run build
本轮门禁(2026-09-13 10:11 UTC 独立复跑):go vet ./... PASS;go test -short ./... -count=1 PASS(含 Materialize 首/二轮 change_report_id、PATCH 顺序、Materialize 失败透出、Assert 先职责后租约、SaveDocumentContent 审计、pending 事实源不越权、同步/异步待确认文案、完成活动仅 committed、pending 活动标明待确认、MarkProposalApplied 失败显式可重试);web npm test 199+27 PASS;npm run build PASS。使用 dev PostgreSQL(schema 28)执行 TestPGPersistSurvivesNewServiceInstance PASS,证明新 Service 实例可恢复账本。上述均为工程门禁,不能替代 UI 验收。
UI-01 目录同步补丁门禁(2026-09-13):node --test adminUserDirectorySync.test.ts 3 PASS;web npm test 219+27 PASS;npm run build PASS;go vet ./... + go test -short ./... PASS。未提交 web/e2e/* 与 test-reports/assets/。
UI-01/02 访问与成员落库门禁(2026-09-13):go test ./internal/projectinstance -short PASS;TEST_DATABASE_URL=… go test ./internal/projectinstance -run TestPG_GoverningAccess PASS;TEST_DATABASE_URL=… go test ./internal/server -run TestChatProjectAccess PASS;go vet ./... + go test -short ./...;web npm test + npm run build。未提交 e2e/assets。
复核补强(同日):
- A:
MaterializeAgentOutput错误写入TaskRunResult.Success=false+ErrorReason,不再空白忽略 - B:cand 非空且 report invalid/unassessed 时禁止自动提交(候选标 needs_confirmation)
- C:
AssertHumanCanEdit先职责/生命周期再租约;受控投影改SaveDocumentContent保留 author_last_edited/审计;失败DOCUMENT_PROJECTION_FAILED可幂等重试 - D:ChangeReportPanel 完整展示风险条目/项目影响/文档影响建议/开放问题;加载失败显式错误
- E:revision-state 暴露
pending_candidate_id/pending_change_report_id/pending_risk_level+can_decide_pending;工具条「待确认报告」确认/拒绝调 decision API(不绕过确认) - F:高风险事实源门禁:Materialize 后仅 committed 才 MarkDocumentContentUpdated / MarkProposalApplied;
needs_confirmation立即ProjectOutputMarkdown恢复 ledger head,候选仅留 immutable blob;decision=commit 投影后再 Mark;decision=reject 保持旧 head;投影失败显式错误 - G:对话可见状态:
TaskRunResult带pending_agent_candidate_id/ report / risk;RequiresAuthorApproval可复用但用PendingProposalvsPendingAgentCandidateID区分 DocGov 提案;terminal=pending_author_confirmation;同步 coordinator 与异步CompletionSummary显示「文档候选已生成,待编制人确认」+ artifact 元数据;确认并投影后才「已完成」 - H:活动与提案收口:
RecordActivity(完成交付物)仅在 committed 投影成功后;pending 记「候选待编制人确认」;落盘/投影失败不记完成。MarkProposalApplied失败返回显式错误(bizdev /DOCUMENT_GOVERNANCE_FAILED)可重试 - I:阶段链防传播:
ExecuteStage遇PendingAgentCandidateID立即停阶段(Success=false + 待确认文案),SubArtifacts 保留候选,不吸收 ExtractedData / PriorDoc;确认后由用户重新发起阶段 - J:前端历史映射:
pending_author_confirmation显式映射为气泡状态(不再默认 completed);刷新窗口显示「待编制人确认」标签 - K:决策幂等收口:
CommitAgentVersion已 committed 且 expected hashes 一致时返回当前 state(可继续投影/MarkProposalApplied);已 committed 禁止 reject。MarkProposalApplied先写 DB 再改内存;已 applied 幂等(包内 Propose+Decide 验证)。decision 失败 hint 指向同决策重试;不暴露内存补种 helper(避免内存/DB 分叉) - L:Playwright 骨架:
web增加@playwright/test+playwright.config.ts+e2e/document-revision-runtime.spec.ts(RUN_UI_ACCEPTANCE=1才跑;无 mock/route/API/DB fixture) - M:上传注册事实源:发送前
await registerUploadAttachments→POST /api/v1/freeform-documents(client_key幂等);失败 UI 显式错误且不发消息、不生成本地doc-uploadorphan;成功使用doc-free-*写入 deliverable/fileStore 并挂 toolbar - N:Auth 契约映射(UI-00 实战):Go
UserAccount为 snake_case;前端在 API 边界mapUserAccount/mapLoginResult/mapMeResult统一转 camelCase(login/me/admin users/create/role/status);BootstrapAdminFromConfig的UpdateUserRole错误不再静默。详见 ../../audit/2026-09-13-auth-useraccount-snake-case-mapping.md - O:全局用户目录同步(UI-01 实战):管理员创建/角色/状态成功后必须经
syncAdminUserDirectories调用父级onRefreshUsers(禁止死 prop / 静默 catch);同浏览器立项候选可立即看到新账号。跨设备/清缓存缺口见 audit 残留风险,不下放 admin users API。详见 ../../audit/2026-09-13-admin-user-directory-sync-ui01.md - P:无 live 访问 + chat 项目门禁 + 立项成员落库(UI-01/02):
GetGoverningInstanceForAccess区分从未激活 vs completed/terminated;chat/chatStream 先RequireProjectAccess再 stage(SSE 拒绝不得先 200);createProject后持久化非创建者成员。详见 ../../audit/2026-09-13-workflow-access-chat-members-ui01-02.md - Q:立项确认双击竞态:
handleCreateProjectConfirm加同步 in-flightuseRef锁 +createProjectBootstrapIdRef(取代 state);createProjectSubmitting/submitPhase驱动 Modal「立项中/同步成员中」、禁用确认与关闭;失败可串行幂等重试,成功清 bootstrap。证据:createProjectSubmitGuard.test.ts - R:UI-02 任务作用域契约:
ResolveMessageScopeForTask三态(preactivation / live stage / closed→Err);handler 无 live 创建 202 非 409;E2E UI-02 以POST /api/v1/tasks/runs2xx 为硬门禁(409/连接异常 FAIL)。证据:message_scope_test.go、TestCreateTaskRun_PreActivationAcceptedNot409、document-revision-runtime.spec.tsUI-02 - S:UI-03 客户端同步 + 任务幂等(本分支):
templateMatchintake 标记优先;任务终态后postTaskDeliverableSyncmergedoc_proj*;goose00030放行pending_author_confirmation+idempotency_key部分唯一;ClaimRun先占键再写 chat;FE reconnect 同 run 订阅。审计:../../audit/2026-09-13-controlled-doc-client-sync-ui03.md。门禁:go test -short ./internal/taskrun ./internal/server;web npm test232+27;npm run build。schema30 真实现卷迁移合入前独立验证;真实 UI-03 待占槽重跑。
用户 UI 实战验收
Round20 PASS。见 checklist 与 test-report。项目 6159;UI-03 V2/r0;终态 V3/r2;post-restart 恢复最终正文 A1-win-mu0gwiez。
Blockers
- DOCREV-RT-PI-NARRATIVE(仍开放):真实 PI 业务叙事摘要/风险解释未替代确定性 fallback;Round20 已可见 fallback 字段,不得宣称为完整 PI
- DOCREV-RT-UPLOAD-ORPHAN(约束仍在,UI-16 PASS):仅 IndexedDB、无服务端正文 → 禁止假 V1
- DOCREV-RT-UI-E2E:PASS(Round20)
- DOCREV-RT-SCHEMA30-VOLUME:goose 00030 对既有重复卷的迁移仍属合入前独立验证残留
- DOCREV-RT-USER-DIR-CROSS-DEVICE:跨设备/新浏览器可能仍缺成员候选(本轮同浏览器未暴露)
Commits(历史)
7ea686e…ec8a45a(见 git log);本轮追加见会话结束提交号