Files
Agent-System/.doc/archive/ops/2026-09-13-document-revision-runtime.md
T
weichenandCursor 9345109dca docs(ops): archive completed document-revision session files
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>
2026-09-14 00:27:18 +00:00

10 KiB
Raw Blame History

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/docrevision PG hydrate/persist + bootstrap + MaterializeAgentOutput
  • internal/server 授权、PATCH 顺序、orphan 不静默建账
  • internal/bizdev 小队成功走 Materialize(禁止仅 OpenTemplate)
  • cmd/document-revision-backfill gofmt
  • web 保存链路与 overlay 三模式
  • 工程测试 + 扩展 UI 验收计划(分栏)

非目标

  • 不占 CURRENT 集成槽、不 env-service rebuild、不 push、不 merge dev
  • 不伪造 PI 叙事 change report;不把 fallback 说成完整 PI 分析
  • 不把 stub 输出写入最终用户验收报告

步骤

  1. 审计 / 整改 / 本任务 + CURRENT 认领
  2. 分支 fix/document-revision-runtime
  3. PG store + bootstrap + backfill
  4. Handler / agent / 前端
  5. 首轮报告 Materialize + PATCH 顺序 + 单测
  6. gofmt + UI checklist 扩展 + 文档证据
  7. 分层 commit,输出哈希与剩余 blocker(不 merge/push)

验收标准

相关链接

证据 / 备注

工程门禁(非 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 可复用但用 PendingProposal vs PendingAgentCandidateID 区分 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-upload orphan;成功使用 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-flight useRef 锁 + 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/runs 2xx 为硬门禁(409/连接异常 FAIL)。证据:message_scope_test.go、TestCreateTaskRun_PreActivationAcceptedNot409、document-revision-runtime.spec.ts UI-02
  • S:UI-03 客户端同步 + 任务幂等(本分支):templateMatch intake 标记优先;任务终态后 postTaskDeliverableSync merge doc_proj*;goose 00030 放行 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 test 232+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);本轮追加见会话结束提交号