Compare commits

..
Author SHA1 Message Date
weichen e4d014fab1 Bump the development-manager pin for the endpoint migration
governance / governance (pull_request) Successful in 20s
Why: governance checks validate candidate .gitmodules URLs against the
pinned development-manager scaffold, which now carries the new Gitea
endpoint base after its own migration.

Evidence: host-verified; see Dev PR #706

Impact: pin update only, part of the coordinated endpoint migration.

Refs: Agent-System-Dev PR #706
2026-10-22 14:25:52 +00:00
weichen 75a3aa5193 Update Gitea endpoints after server migration
governance / governance (pull_request) Failing after 25s
Why: the Gitea server moved to https://gitea.naitangbaobao.cn with SSH
on port 52222; endpoint references must follow or superproject CI
checkout refuses the old URLs.

Evidence: host-verified API reach and SSH auth (Dev task card
fix/gitea-endpoint-migration)

Impact: configuration only; no runtime behavior change.

Refs: Dev PR #706
2026-10-22 14:17:02 +00:00
weichen 75e43e1adf Merge pull request 'Record the 2026-10-21 GenUI prod acceptance rerun' (#120) from fix/genui-prod-upgrade-followups into main
governance / governance (push) Successful in 15s
2026-10-21 13:37:23 +00:00
agent-exec-transportandCursor f5417fb721 Record the 2026-10-21 GenUI prod acceptance rerun
governance / governance (pull_request) Successful in 14s
Replace the NOT_RUN note in the deployment acceptance bullet with the
rerun result on dev@5360884: the 10-12 API checklist passes (11 items,
no model calls), run through a temporary genui-accept role and account
that were disabled afterwards. Also record that project.create now comes
only from roles, so admin cannot create projects until a role is assigned.

Why: the upgrade record still listed the GenUI acceptance as NOT_RUN.
Evidence: agent-exec unit documents-genui-prod-acceptance-20261021 (cursor, attempt 1, terminal=success); prod API replay VERDICT PASS on 2026-10-21.
Impact: documentation only.
Refs: Dev task fix/genui-prod-upgrade-followups.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-21 13:33:58 +00:00
weichen 2e9c3bc1d8 Merge pull request 'Record the GenUI prod upgrade to dev@5360884 under svc' (#119) from feature/genui-prod-upgrade-docsync into main
governance / governance (push) Successful in 17s
2026-10-21 12:48:22 +00:00
agent-exec-transportandCursor 518e381e4d Record the GenUI prod upgrade to dev@5360884 under svc
governance / governance (pull_request) Successful in 15s
Why: prod was upgraded on 2026-10-21 (schema v25 to v51) and both prod and
pg1 are now managed by scripts/svc.sh; the closure doc still described the
manual prodctl.sh layout.
Evidence: agent-exec unit documents-genui-prod-upgrade-docsync (cursor,
attempt 1, terminal=success); one bullet changed.
Impact: Documentation only.
Refs: Dev task feature/genui-prod-upgrade-docsync

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-21 12:47:24 +00:00
weichen fcea46602b Merge pull request 'Sync GenUI prod deploy entry with current runtime layout' (#118) from feature/genui-prod-ops-docsync into main
governance / governance (push) Successful in 14s
2026-10-21 10:29:07 +00:00
agent-exec-transportandCursor 244477e0be Sync GenUI prod deploy entry with current runtime layout
governance / governance (pull_request) Successful in 14s
Why: The closure doc still said prod is managed by `scripts/svc.sh prod`
from dev@c76f2bb; prod actually runs dev@b4649d7 from a preserved runtime
directory with manual prodctl.sh lifecycle, and pg1 moved under svc.
Evidence: Implemented by agent-exec unit documents-genui-prod-ops-docsync
(cursor, attempt 1, terminal=success); diff touches one bullet only.
Impact: Documentation only; no code or runtime change.
Refs: Dev task feature/genui-prod-ops-docsync

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-21 10:28:13 +00:00
weichen f361071034 Merge pull request 'Document IAM U1-U7 implementation completion (L1 plan revision 3 merged)' (#117) from feature/iam-u1-u7-implementation-record into main
governance / governance (push) Successful in 25s
2026-10-20 07:21:59 +00:00
weichen 2fcf03a424 Record IAM U1-U7 implementation completion with binary migration verification
governance / governance (pull_request) Successful in 19s
Why: document L1 implementation completion with 14 successful implementation units, 8 PRs merged across 4 component repos, real binary migration verification of U1 + U3A features.

Refs: /tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md revision 3; PR #643 Dev L1; PR #219/#222 Backend; PR #450/#452/#453 RDM; PR #115/#118 Frontend; Agent-System-Dev main ac594c9.
2026-10-20 07:20:20 +00:00
weichen f201a2b488 Merge pull request 'Document U3 r0.6 route-scoped terminal evidence' (#95) from feature/fast-slow-u2-u3-plan into main
governance / governance (push) Successful in 14s
2026-10-19 09:26:55 +00:00
agent-exec-transport 82b4619574 agent-exec transport 9b946b2fd2cc2b15dd20ae6bf42011f1/89c133b02bb1
governance / governance (pull_request) Successful in 13s
2026-10-19 09:24:07 +00:00
weichen c3226ea02c Merge feature/fast-slow-u2-u3-plan history after syncing main
governance / governance (pull_request) Successful in 13s
2026-10-19 09:22:59 +00:00
agent-exec-transport c3dccd8958 agent-exec transport 8afaa676b3083ab14275c2938e4d96d7/65123966f52b 2026-10-19 09:21:54 +00:00
agent-exec-transport 951ef9724e agent-exec transport ecb0d9a6f1f4410036311d8118d8fbc0/da6f4c6a7190
governance / governance (pull_request) Successful in 14s
2026-10-19 08:58:31 +00:00
weichen 79c6989d52 Merge pull request 'Record the two-trees partial close and renderer records' (#116) from feature/rdm-two-trees-latest-templates into main
governance / governance (push) Successful in 18s
2026-10-19 07:51:30 +00:00
agent-exec-transport 6973a996ae agent-exec transport 752f3e19faafb2b308190e151e010848/ed21b87e9f3d
governance / governance (pull_request) Successful in 18s
2026-10-19 07:35:12 +00:00
weichen 131252b746 Merge the two-trees branch history into the main sync
governance / governance (pull_request) Successful in 15s
2026-10-19 05:42:36 +00:00
agent-exec-transport 3fff1a7fb5 agent-exec transport 087ab9cc3ecff422a5578c946e7979c2/78fa76f9490d 2026-10-19 05:42:26 +00:00
agent-exec-transport bf12f2d8b0 agent-exec transport c294ab64ca428215973b93cb7150a72b/1b9395b7eb4c
governance / governance (pull_request) Successful in 16s
2026-10-19 05:36:25 +00:00
weichen 6e2112283e Merge Agent-System-Documents main into the fast-slow branch
governance / governance (pull_request) Successful in 14s
2026-10-19 03:05:45 +00:00
weichen 933fe263da Merge pull request 'Merge the approved IAM U3 account contract documents' (#115) from feature/iam-u3-account-contract into main
governance / governance (push) Successful in 15s
2026-10-19 02:17:28 +00:00
weichenandCursor 4a2cb19fde Link the U3 contract task card to its PR
governance / governance (pull_request) Successful in 20s
Why: the card and PR description are one record.

Evidence: PR #115 created via the Gitea API.

Impact: task card only.

Refs: Documents PR #115
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-19 02:16:36 +00:00
weichenandCursor c6c411a6db Record the U3 contract merge task card
governance / governance (pull_request) Successful in 22s
Why: track preservation and merge of the approved U3 contract documents.

Evidence: SELF blob identity, diff check and ancestry checks recorded in the card.

Impact: task card only.

Refs: Dev PR #626; Documents c236d30, fb3a821, 5783940
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-19 02:16:29 +00:00
weichen 01ba910685 Merge the approved U3 contract branch history 2026-10-19 02:16:20 +00:00
agent-exec-transport 43f2fd4da3 agent-exec transport 034eee93d71eef0305c1c11de1f45beb/02503b0e5621 2026-10-19 02:16:13 +00:00
agent-exec-transport 08b86183c2 agent-exec transport cc01d2ecc8ef6f68d6ff1de4eca0812c/20c64e14676b 2026-10-19 02:15:19 +00:00
weichen 1e036e981e Merge pull request 'Document the IAM U4 role policy authority design' (#114) from feature/iam-u4-role-authority into main
governance / governance (push) Successful in 19s
2026-10-18 14:20:29 +00:00
weichen 0b16daf14a Merge Documents main into IAM U4 role authority
governance / governance (pull_request) Successful in 17s
Why: U4 must sync main before stage 7 acceptance; main carries 21 newer commits (renderer, regulations and two-trees documents). Evidence: git merge-tree reported no conflicts; no content resolved by hand. Impact: U4 documents now sit on main 5bb4877. Refs: Dev card feature-iam-u4-role-authority
2026-10-18 14:03:41 +00:00
weichen 5bb487795c Merge the EXT-20 shared regulations extension point proposal
governance / governance (push) Successful in 14s
Why: Register the U9 public contract proposal.
Evidence: CI success on 3a3904fe (governance).
Impact: Documentation only.
Refs: .task/feature-regulations-kb-ext20-proposal.md
2026-10-18 10:04:17 +00:00
weichenandCursor 3a3904fea6 Close the EXT-20 proposal task card before merge
governance / governance (pull_request) Successful in 15s
Why: Card closes in the same PR per delivery rules.
Evidence: Card only.
Impact: None.
Refs: https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/113
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-18 10:03:29 +00:00
agent-exec-transport 52d77f6834 agent-exec transport 236440f7dd8706d5e75570537e655d7a/1584524c456c
governance / governance (pull_request) Successful in 14s
2026-10-18 09:57:34 +00:00
weichenandCursor e4aa3c6d99 Open the EXT-20 proposal task card
Why: Register the U9 public contract proposal through the governed path.
Evidence: Card only.
Impact: None.
Refs: Agent-System-Dev feature/regulations-kb
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-18 09:52:14 +00:00
weichen e2f5729e8f Merge pull request 'Record the layered delivery and spec slimming proposal' (#112) from feature/delivery-model-v3-record into main
governance / governance (push) Successful in 13s
Record the layered delivery and spec slimming proposal (#112)
2026-10-17 19:56:44 +00:00
agent-exec-transport c1b0b35352 agent-exec transport c40e652385634327f58e6f1946d49604/5001e4ce8764
governance / governance (pull_request) Successful in 14s
2026-10-17 19:55:36 +00:00
weichen 6c04eb24f4 Merge pull request 'Adopt the shared governance kit (development-governance-v2)' (#110) from feature/governance-adoption into main
governance / governance (push) Successful in 23s
2026-10-17 09:25:26 +00:00
weichen acaaaa67e0 Close and archive the governance adoption card
governance / governance (pull_request) Successful in 20s
Why: the adoption PR is reviewed and its candidate HEAD passed CI; the card closure is folded into the PR so no separate close PR is needed.
Evidence: CI GATE on 9d4582a47f4f4c887afd2fafb3ad507f20716f8d; independent Review REPLAY (cursor-agent-stable --mode ask 全新只读会话(fresh_session=true,session id not-observable)闭合重审 VERDICT: APPROVE(对象 9d4582a,与 HEAD 仅 .task/ 不同)).
Impact: task card only (moved to .task/archive/).
Refs: https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/110
2026-10-17 09:22:10 +00:00
weichen 9d4582a47f docs(task): complete the card for review (sync, CI, results)
governance / governance (pull_request) Successful in 23s
2026-10-17 08:47:52 +00:00
weichen 6a1308c251 docs(task): record review repair run and evidence
governance / governance (pull_request) Successful in 17s
Why: independent Review blocked the adoption; the repair unit ran through the shared executor and was integrated with agent-exec apply.
Evidence: .task/evidence/governance-adoption/ (SELF): governance check and agent-exec validate on the repaired head.
Impact: task card and evidence logs only.
Refs: .task/feature-governance-adoption.md
2026-10-17 08:41:29 +00:00
agent-exec-transport 31daf7f764 agent-exec transport cddbee3518698a94ceaaac4d563e14d9/c95307af4fb6 2026-10-17 08:39:06 +00:00
weichen c51ae06b4d Record the adoption unit run and positive/negative evidence
governance / governance (pull_request) Successful in 18s
Why: Phase 6 requires one positive executor run and the negative cases (missing config, bad receipt, out-of-scope path, unknown side effect) before adoption becomes active.
Evidence: .task/evidence/governance-adoption/ (SELF): governance check, agent-exec validate and adoption cases; this commit passed the generated pre-commit hook (admit).
Impact: task card and evidence logs only.
Refs: .task/feature-governance-adoption.md
2026-10-17 07:40:47 +00:00
agent-exec-transport fd13a26677 agent-exec transport 8348cbe4ac5d7604985d8d0f38187573/1df0d292eafb 2026-10-17 07:40:26 +00:00
weichen cf44b1ed04 Record the failed first attempt and its reconciliation
Why: the r1 attempt ended failed-unknown (invalid terminal record); fail-stop requires reconciliation before a fresh attempt.
Evidence: receipt /tmp/gov-receipt-Agent-System-Documents-r1.json; worktree clean, no transport ref (SELF).
Impact: task card only.
Refs: .task/feature-governance-adoption.md
2026-10-17 07:37:54 +00:00
weichen d259242849 Bootstrap AGENT-EXECUTION.md and the governance adoption card
Why: development-governance-v2 Phase 6 adopts the shared governance kit in every formal repository; the executor needs a valid AGENT-EXECUTION.md before any implementation unit can run.
Evidence: generated by dm-server governance init at Development-Manager bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c; dm-server agent-exec validate passes.
Impact: configuration and task card only; no code or CI change yet.
Refs: Agent-System-Dev docs/superpowers/plans/2026-10-16-development-governance-v2-master.md
2026-10-17 07:16:27 +00:00
weichenandCursor a3ee239f22 Record renderer Tasks 11-12 and publication review
Why: close the sixth renderer batch with fixed SHAs, owner decisions and review trail.
Evidence: independent fresh-session reviews listed in the record (SELF/REPLAY; GATE NOT_RUN).
Impact: documentation only.
Refs: docs/records/2026-10-15-unified-document-renderer/09-implementation-plan.md Tasks 7, 8, 11, 12.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-16 05:36:49 +00:00
weichenandCursor cba4b67a1a Record renderer Task 10 implementation review
Why: Task 10 closed four independent review rounds and needs a durable record.
Evidence: Backend a2f4978 SELF suite plus host REPLAY of tools/docgen tests and Dev build.
Impact: Documentation only; no product behavior change.
Refs: docs/records/2026-10-15-unified-document-renderer/09-implementation-plan.md Task 10
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-15 23:17:28 +00:00
weichen c313639208 Merge commit '73bbb4cea686eb84826d5066bb4c44bf883c9365' into feature/rdm-two-trees-latest-templates 2026-10-15 17:46:34 +00:00
weichen 6b3031acbd Record CLI renderer Task 9 implementation
Why: Task 9 now has a reproducible Renderer dependency, CLI implementation, independent review, one corrective pass and exact local/isolated-PostgreSQL evidence that require human assessment.

Evidence: The report fixes RDM 019d60d4 and Renderer 732e7e7, records all review findings and repairs, focused race, vet, make test/build and disposable PostgreSQL verification.

Impact: Documents the local RDM rendering transaction candidate without publishing profiles, migrating a real database, starting Task 10, pushing, merging or deploying.

Refs: Unified document renderer Task 9
2026-10-15 17:43:01 +00:00
weichen bd1d6b86f0 Record CLI renderer Task 8 remediation
Why: The three blocked Word bases now have safe derivative candidates implemented by CLI, independently reviewed, corrected, and verified without publishing profiles or changing source assets.

Evidence: RDM 48120ed and Renderer 732e7e7 bind a clean 44/44 compatibility receipt; the report records the review findings, one corrective pass, 20 safety tests, generator checks, and full build.

Impact: Replaces the prior 41-pass/3-blocked implementation snapshot with 44 safe-preflight draft bindings while retaining human visual and publication gates.

Refs: Unified document renderer Tasks 7-8
2026-10-15 14:35:03 +00:00
weichen da4d016ee1 Merge pull request 'Record the layered Python environment proposal'
Reviewed against the layered environment plan. Required CI on the current head passed where this repository runs CI.
2026-10-15 14:24:47 +00:00
weichen 73bbb4cea6 Merge remote-tracking branch 'origin/main' into feature/layered-python-env 2026-10-15 14:01:27 +00:00
weichen bbae238e9d Clarify batch three evidence objects
Why: PostgreSQL and authenticated product-matrix runs must remain tied to the exact RDM commit on which they executed.

Evidence: The report now distinguishes final-head SQLite and full-suite replay from the earlier 3f60265 PostgreSQL and 44/44 product runs.

Impact: Documentation-only evidence correction; no implementation or publication state changes.

Refs: Unified document renderer Tasks 7-8
2026-10-15 13:30:22 +00:00
weichenandCursor 945db355fc Record the layered Python environment proposal
Why: 8788 could not render docx because the sandbox hides host site-packages and there is no request path for extra packages. The proposal fixes the design before the implementation lands.
Evidence: SELF — proposal written from the cnv_7936c0a799ff transcript and the existing exec-deps-dir code path.
Impact: Documents only. Index lists the proposal as pending review, not approved.
Refs: docs/proposals/2026-10-15-layered-python-env.md
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-15 13:29:49 +00:00
weichen 870aa17462 Record unified renderer batch three implementation
Why: Tasks 7-8 need a reviewable record that separates draft profile generation, legacy RDM product-chain evidence, and actual renderer publication readiness.

Evidence: The report fixes Renderer 732e7e7 and RDM ec24a42, records the independent review and repair, and distinguishes 44/44 compilation from the 41-pass/3-blocked base-package safety preflight.

Impact: Human reviewers can decide corporate visual values and the three unsafe base-package derivatives without treating local SELF checks as publication, migration, or deployment.

Refs: Unified document renderer Tasks 7-8
2026-10-15 13:28:49 +00:00
weichen 6f782991cf Record unified renderer batch two implementation
Why: Fix Task 4-6 behavior, independent review findings, evidence, limits, and the next human review boundary in one durable record.

Evidence: SELF report content binds renderer 0efa07f8ce5cb4e1ff93886cf6769d111cba9872 and its full, race, vet, and diff verification.

Impact: Adds an implementation review record only; no runtime integration, migration, deployment, or publication.

Refs: unified-document-renderer Tasks 4-6
2026-10-15 11:32:48 +00:00
weichen f4143e58bf Record the concrete profile request contract
Why: Update the batch review after replacing the temporary profile interface with the immutable snapshot produced by Task 3.

Evidence: SELF contract test observed RED then GREEN; renderer full, race, vet, and diff checks pass at a08ae7ac81d4c648b350d890da97c91e64950769.

Impact: Updates the implementation review record only.

Refs: unified-document-renderer Tasks 2-3
2026-10-15 10:14:54 +00:00
weichen fb18726132 Record unified renderer batch one implementation
Why: Give the first implementation batch a fixed human-review object with exact outputs, risks, review findings, fixes, evidence, and remaining boundaries.

Evidence: SELF relative-link and diff checks pass; the record cites exact RDM and renderer candidate SHAs and their fresh verification commands.

Impact: Adds an implementation review record only; no runtime, migration, deployment, or publication behavior changes.

Refs: unified-document-renderer Tasks 1-3
2026-10-15 10:10:52 +00:00
weichen 647da98577 Document unified renderer architecture and delivery plan
Why: Define the approved direction for one rule-driven Word renderer, all-template onboarding, human-readable traceability, and review-aware delivery before implementation starts.

Evidence: SELF documentation checks passed for relative links, balanced code fences, JSON parsing, manifest SHA256 coverage, and git diff whitespace.

Impact: Adds a 12-document review set and immutable review manifest; no runtime code, migration, deployment, or published rule changes.

Refs: feature/rdm-two-trees-latest-templates
2026-10-15 09:23:44 +00:00
weichen f01aefa4eb Merge pull request 'Record the document duty matrix rework' (#108) from feature/rdm-duty-matrix into main 2026-10-15 09:15:11 +00:00
weichen 5f411499c5 Merge remote-tracking branch 'origin/main' into feature/rdm-duty-matrix 2026-10-15 09:14:32 +00:00
weichenandCursor 034faa4021 Record the document duty matrix rework
Why: the duty page needs one record for the four domain rulings, and the earlier settings plan must show which duty-page sections it no longer owns.
Evidence: SELF review of the proposal text against the approved implementation plan.
Impact: r1 section 4 and the duty-page parts of P5 and P7 point at r2. Settings, members, and the permission matrix stay in r1.
Refs: docs/proposals/2026-10-15-rdm-duty-matrix-rework.md
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-15 07:20:46 +00:00
weichen c0611814aa Merge remote-tracking branch 'origin/main' into feature/iam-u4-role-authority 2026-10-15 06:03:14 +00:00
weichenandCursor af5093dbd7 Record the local W4b implementation progress
Why: The living proposal still said the human confirmation write path was blocked after the local chain had been implemented.

Evidence: Backend a4d6404, RDM 528dd0c, and Dev SELF receipt edb81a90 are cited in the new progress record.

Impact: The status now separates implemented, verified, merged, and deployed. Nothing is merged or deployed.

Refs: W4b human confirmation design r1
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-15 04:00:40 +00:00
weichen d668a3e0ac Merge pull request 'Record the svc plugin compose proposal' (#107) from feature/svc-plugin-compose-design into main
Why: keep the compose proposal in the document set while it remains under review.
Evidence: this repository has no workflow; head 2a8deac89d contains origin/main. Backend CI is already green and merged.
Impact: proposal status stays pending review. Inclusion is not approval.
Refs: #107
2026-10-15 03:58:32 +00:00
weichen bcdb30cc55 Plan IAM U4 acceptance and protected delivery
Why: The approved role and permission implementation needs a focused, reviewable path through browser acceptance, component delivery, and guarded closure.

Evidence: Structural audit confirms DR1-DR21, U1-U9, and KTD1-KTD6; git diff --check passes; six-lens document review findings are incorporated.

Impact: Adds the stage 7-10 plan, records the focused specification approval, and indexes the plan without authorizing production migration or deployment.

Refs: feature/iam-u4-role-authority
2026-10-15 03:53:10 +00:00
weichen e251c4bd62 Merge authoritative main before stage 7 planning
Why: base the IAM delivery plan on the current Documents main.

Evidence: fetched origin/main=87b88018b9236434b97ff6781655d625901d4090.

Impact: integrates documentation-only upstream changes before adding the U4 delivery plan.

Refs: feature/iam-u4-role-authority
2026-10-15 03:26:15 +00:00
weichenandCursor 2a8deac89d Add the svc plugin compose deploy proposal
Why: deploy needs a reviewed design for compiling selected plugins into the base binary before that behavior is treated as approved.
Evidence: the proposal records the throwaway compose build; implementation status stays unreviewed.
Impact: adds a pending proposal and an index link. Inclusion does not approve the design.
Refs: Dev .task/feature-svc-plugin-compose.md
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-15 02:03:03 +00:00
weichen 87b88018b9 Merge pull request 'Record U1-U6 completion and owner-blocked exit in the DHF plan' (#106) from feature/dhf-u5u6-progress into main 2026-10-14 18:12:19 +00:00
weichen 136534ce0d Record U1-U6 completion and owner-blocked exit in the DHF plan
Why: the plan's progress annex still described the pre-adjudication
state (44 needs-review, U2-U6 pending); the authoritative record must
reflect the 2026-10-14 landing: batch adjudication, publication flip
(44/44 published), U5 product-loop wiring with pilot pass, U6
per-identity matrix (41 PASS + 2 EXPECTED_BLOCKED + 1 EXPECTED_LIMITED),
and the owner-side exit items (deployment pilot, independent REPLAY,
U4 originals) now blocked on the owner per the handoff checklist.

Evidence: docs-only change in the Documents repo; all referenced RDM
PRs (#377/#381/#383/#385/#387/#389/#391) carry green CI and merged
state; pilot and matrix outputs are recorded in the RDM task cards and
docs/records/dhf/.

Impact: plan annex only; no code or asset change.

Refs: RDM docs/records/dhf/package-review-decision-2026-10-14.md;
RDM docs/records/dhf/u6-acceptance.md; u6-replay-handoff.md
2026-10-14 18:10:20 +00:00
weichen e9ce9a539e Plan the focused role and permission implementation
Why: The approved scope spans Backend authority, RDM project enforcement, and Frontend configuration and needs exact contracts and verification boundaries.

Evidence: The plan was checked against every specification section, fixed interface names, failure cases, and placeholder rules.

Impact: Implementation is limited to one effective role, system and project authorization, and the requested configuration views.

Refs: Focused role and permission system spec
2026-10-14 16:42:24 +00:00
weichen d77c6425bc Define the focused role and permission system
Why: The implementation scope must match the requested single-role position model and three permission layers without carrying unrelated IAM work.

Evidence: The spec was checked for placeholders, internal contradictions, and whitespace errors.

Impact: Backend becomes the role authority while RDM retains project permissions and document duties.

Refs: IAM role and permission system
2026-10-14 16:37:01 +00:00
weichen da1d185d9b Record pending W4b confirmation design review
Why: The proposal main record must reflect that trusted human confirmation lacks a public Backend proof and remains blocked pending review.

Evidence: Candidate design bbcff18 and exact file SHA256 are linked; W3 RED and Backend source gap remain separate from phase acceptance.

Impact: Updates status only, preserving the previously approved stage-four and stage-five objects.

Refs: Stage6 W4b design adjustment candidate r1; TT-D02/D03
2026-10-14 16:16:32 +00:00
weichen bbcff180e0 Draft W4b human-confirmation contract adjustment
Why: The pinned Backend extension exposes no trusted one-time HITL proof for RDM structure confirmation.

Evidence: Fixed RDM/Backend source identities, W3 RED receipt, and Dev READY precheck are cited; no W4b confirmation write was run.

Impact: Adds a review-only X3 verifier and RDM atomic-consumption design with permission, recovery, audit and replay checks.

Refs: Stage4 design r1 section 5.2; Stage5 W4; TT-D02/D03/T04
2026-10-14 16:10:19 +00:00
weichen 10508d1a00 Record approval of work observation implementation plan
Why: The user approved the fixed TT-N03 and TT-R01 stage-five amendment for local stage-six implementation.

Evidence: User approval call_497a8a4c28bd4231a2cfd63d84375f2a for plan SHA256 10b91e3489ac8145eafec73759a019cb6d3b73fd50e7c74563bbbb6d18e5462c.

Impact: Update the current approval record without changing the approved plan bytes or permitting live migration, tag publication, or deployment.

Refs: TT-N03, TT-R01; Dev task card
2026-10-14 15:19:27 +00:00
weichen 6f0d71a1c3 Plan trusted work observation and risk verification
Why: The approved stage-four design needs reviewable ownership, sequencing, and tests before new X3 product code can start.

Evidence: TT-N03 and TT-R01 stage-three approval; stage-four approval call_a6853c4232f34285a6cbae19dfbeeec5; document checker SELF receipt f4a4cdde2d3ad9b250742da764455a1304e1e26f07270da4f0d37ad6ed8b6c7e.

Impact: Record the stage-five amendment for human review; keep the original 28-item plan and approved implementation active.

Refs: TT-N03, TT-R01; work observation and risk stage-five amendment r1
2026-10-14 15:13:43 +00:00
weichen f999d9b292 Merge current Documents main into the two-tree delivery records
Why: The authoritative target added DHF and manual merge queue records while this task saved approved two-tree amendments.

Evidence: origin/main=19aa34efe6482b78d779bab573b5397e6d2088b2 includes the Dev incoming gitlink 46506aec34.

Impact: Keep both documentation histories; approved two-tree object bytes remain intact.

Refs: Dev task-sync and stage 4 X3 design
2026-10-14 15:02:59 +00:00
weichen 934ee4d803 Design trusted work observations and risk clarification
Why: The approved work-source requirements need a governed path from real messages, retrieved material, and analysis into project evidence and timely clarification.

Evidence: Stage-three amendment SHA256 552a9fdea996bb547c185949b5072a51efafdce1339a9eaafd49537dfedd91b4 and user approval call_b517d0f07af54aa188a01ddb100485b9; independent Backend and RDM scoped design reviews closed the identified privacy, timing, and atomicity gaps; document hashes and links checked.

Impact: Save an unapproved stage-four design only; no new public interface, migration, model run, or product behavior.

Refs: TT-N03, TT-R01; work observation and risk design r1
2026-10-14 14:50:37 +00:00
weichen 19aa34efe6 Merge pull request 'Record approved manual merge queue expansion plan' (#105) from feature/merge-queue-manual-phase2-plan into main 2026-10-14 14:32:01 +00:00
weichen a665c2d0b9 Record approval of manual expansion plan
Why: Preserve the owner’s Stage 5 decision and implementation method on the reviewed plan object.

Evidence: Owner approved plan 28c4ceb in the task conversation; git diff --check and relative links passed (SELF).

Impact: Documentation status only; Dev implementation remains subject to Stage 6 and 7 review.

Refs: Agent-System-Documents #105; Agent-System-Dev #518
2026-10-14 14:31:48 +00:00
weichen 28c4ceb173 Plan controlled manual merge queue expansion
Why: The approved Stage 4 design needs a reviewable Stage 5 implementation and test sequence.

Evidence: git diff --check, relative-link validation, M2-1 through M2-6 coverage, and placeholder scan passed (SELF).

Impact: Documentation only; no Dev queue activation or task takeover.

Refs: Agent-System-Documents #104; Agent-System-Dev #518
2026-10-14 14:29:48 +00:00
weichen 8e3b5b0d28 Merge pull request 'Record approved manual merge queue expansion design' (#104) from feature/merge-queue-manual-phase2-design into main 2026-10-14 14:27:46 +00:00
weichen 77c8cc2548 Record approval of manual merge queue expansion design
Why: Preserve the owner’s Stage 4 conclusion against the reviewed design object.

Evidence: Owner approved Documents PR #104 design aa4d372 in the task conversation; git diff --check passed.

Impact: Design only; Stage 5 implementation and test plan remains unapproved.

Refs: Agent-System-Documents #104; Agent-System-Dev #518
2026-10-14 14:26:28 +00:00
weichen aa4d372f01 Describe controlled manual merge queue expansion
Why: The first trial reduced final CI churn, while later Dev merges exposed gaps in shared window records that must be addressed before broadening manual coordination.

Evidence: SELF Gitea API snapshot for PR #539–#548, current #518 comments, protection and open PR states; fixed first-trial report and current project rules reviewed.

Impact: Add a stage-4 design and evidence snapshot only; no queue activation, platform protection change, production task takeover, or workflow edit.

Refs: Dev issue #518; Documents 2026-10-14 merge queue trial report
2026-10-14 14:20:34 +00:00
weichen 906627b953 Define work-source and proactive risk acceptance criteria
Why: The user approved adding source processing and timely ambiguity clarification to the goal.

Evidence: Stage-two amendment SHA256 2627342f7d6e94137d5e7418d995ce57218093f6512f67fb7b221f01067da04d and chat approval call_aea78d4156fe4ca89f4b9b6883b2b23f; document hashes and 158 local links checked.

Impact: Add two unapproved stage-three requirement IDs without changing the original 28 or authorizing the public observation implementation.

Refs: TT-N03 and TT-R01; stage 3 amendment r1
2026-10-14 14:20:16 +00:00
weichen 2cf9edf16e Evaluate work observations and proactive risk clarification
Why: The expanded user requirement needs explicit normal-work source intake and timely clarification criteria.

Evidence: Original .tmp data-flow and dialog sources were matched by SHA; fixed Backend public surfaces and current requirements were checked; local links and approved document hashes passed.

Impact: Add an unapproved stage-two scope evaluation and two candidate requirement IDs; prior approvals and product code remain untouched.

Refs: TT-N01, TT-G03, proposed TT-N03 and TT-R01; stage 2 amendment r1
2026-10-14 14:13:36 +00:00
weichen a1a50e0e6f Plan U3 r0.6 transport evidence implementation
Why: Turn the approved evidence-first design into bounded zero-paid tasks without relaxing tool completion.

Evidence: User approved Documents 54d39ef for planning; plan link, placeholder, spec coverage, and diff checks passed.

Impact: Documentation only; product code, provider calls, A01, merge, and deployment remain unauthorized.

Refs: Agent-System-Dev feature/fast-slow-u2-u3-plan; Documents PR #95
2026-10-14 13:33:32 +00:00
weichen 54d39ef130 Document U3 r0.6 transport evidence design
Why: The authorized small tool stream again lacked an observed DONE marker, leaving transport and provider causes unresolved.

Evidence: U3 r0.5 terminal receipt 6b013965 and independent assessment f35d1c17; local links and diff checks passed.

Impact: Design only; the missing-DONE tool gate, runtime behavior, and paid resource boundary remain unchanged.

Refs: Agent-System-Dev feature/fast-slow-u2-u3-plan; Documents PR #95
2026-10-14 13:00:18 +00:00
weichen 04f5046f95 Record U3 r0.5 terminal probe outcome
Why: Preserve the authorized one-shot diagnostic and its limits in the durable validation record.

Evidence: Dev run 3136; SELF terminal receipt 6b013965; independent result assessment f35d1c17.

Impact: Documentation only; tool execution gate and A01 quality status stay unchanged.

Refs: Agent-System-Dev task feature/fast-slow-u2-u3-plan
2026-10-14 11:24:28 +00:00
weichen 39e4faf8ed Merge remote-tracking branch 'origin/main' into feature/fast-slow-u2-u3-plan 2026-10-14 10:16:32 +00:00
weichen 5909cb37cf Merge pull request 'Record merged state of the first U1 increment in the DHF plan note' (#103) from feature/dhf-plan-progress-note into main 2026-10-14 09:53:20 +00:00
weichen 46506aec34 Record merged state of the first U1 increment in the DHF plan note
Why: the progress note still listed Documents #102, RDM #365 and Dev
#540 as WIP and said the stage-8 review was under rectification, but all
three PRs merged on 2026-10-14 and the Dev task card is archived; the
note must state the terminal state instead of stale WIP/GATE caveats.

Evidence: merge SHAs 9062445 (Documents), 57d2214 (RDM), 11aa76a (Dev)
per the archived card .task/archive/feature-dhf-template-pipeline-plan.md
(Dev #542); this change is documentation-only and does not touch the
frozen r0.1 body or its recorded SHA256.

Impact: readers of the plan see the merged terminal state and the
remaining U1/U2-U6 exits; no requirement or scope change.

Refs: Dev task feature/dhf-plan-progress-note
2026-10-14 09:17:45 +00:00
weichen ca560ed068 Record closure of r0.5 review findings
Why: The review found a provider-label leak and incomplete browser evidence for the candidate.

Evidence: Sentinel RED/GREEN, twelve exact-pin browser cases, and isolated PG/Redis receipts.

Impact: Distinguishes the reviewed old object from the fixed zero-paid candidate; model quality stays NOT_RUN.

Refs: U3 r0.5 independent review
2026-10-14 09:16:08 +00:00
weichen 8010f9fab6 Align U3 review status after Documents main merge
Why: The merged index predates the approved r0.5 implementation and standalone CI applicability check.

Evidence: Dev task card and isolated component/combination receipts; Documents origin/main merged at 9062445.

Impact: Corrects review status and marks absent Frontend/Documents workflows N/A.

Refs: U3 r0.5 implementation plan Task 5
2026-10-14 08:55:49 +00:00
weichen 233737e2a3 Merge remote-tracking branch 'origin/main' into feature/fast-slow-u2-u3-plan 2026-10-14 08:55:07 +00:00
weichen 3080be5de9 Record r0.5 zero-paid validation boundary
Why: The task needs an auditable distinction between the new mechanism checks and the failed r0.4 model sample.

Evidence: Dev task receipts for component tests, browser replay, isolated PostgreSQL, and composed build.

Impact: Documents the candidate and leaves r0.5 model quality as NOT_RUN.

Refs: U3 r0.5 implementation plan Task 5
2026-10-14 08:49:59 +00:00
weichen 86fd91723a Preserve independent project read isolation review
Why: Keep the verified RDM candidate and independent replay available beyond temporary reviewer files.

Evidence: Report, original receipt, and replay script were copied byte for byte; the archive and exact pins were validated before focused race replay.

Impact: Documents only; the review covers P2, while time repair and performance acceptance remain separate gates.

Refs: RDM 57a8d7caedf72d9be4bdca179ae2a93e456ba009; stage 6 W4a
2026-10-14 08:38:04 +00:00
weichen 3481253c54 Merge remote-tracking branch 'origin/main' into feature/iam-u3-account-contract 2026-10-14 08:37:10 +00:00
weichen f9cf63ad49 Record merged DHF content contract dependency
Why: RDM PR 365 is now merged and the unique U1 content contract is available for W3.

Evidence: Fresh remote main and API metadata agree on 57d2214feb0ac4a534fa58623fff7d02f93a860a; 44 assets remain needs-review in the unchanged catalog.

Impact: Clear the U1 merge prerequisite while retaining read-isolation, time repair, and template publication gates.

Refs: stage 6 W1, W3, W4a; dependency receipt dc68957a
2026-10-14 08:23:34 +00:00
weichen 4caee938fd Merge current Documents main into the two-tree plan
Why: Preserve the merged DHF plan and governance records before refreshing the Dev combination.

Evidence: origin/main was fetched as 9062445db8082976a124e54a0000007b6391d6cf; approved two-tree records retain their hashes.

Impact: Integrate upstream documents without replacing this task or its approvals.

Refs: stage 6 dependency coordination
2026-10-14 08:11:39 +00:00
weichen cd818a4942 Record approval of persistent domain time contract
Why: The user approved the fixed stage 6 amendment for durable domain times and honest legacy gaps.

Evidence: Chat call_6ce04b5a3ca3496487ab2714ed208965 item 0 approves document SHA256 d78849440e6346482fc09925d402790a7ad257ef76c85275610046a845a45f37; original bytes retained.

Impact: Permit isolated implementation and tests after read isolation; real database migration and deployment remain outside this approval.

Refs: TT-D03, TT-A02, TT-A04; stage 6 time-contract amendment r1
2026-10-14 08:08:36 +00:00
weichen 9062445db8 Merge pull request 'Record the approved DHF plan and asset inventory' (#102) from feature/dhf-template-pipeline-plan into main 2026-10-14 08:03:33 +00:00
weichen 748f923b77 Define persistent domain time and legacy evidence boundaries
Why: Fixed replay RED and source review show omitted domain timestamps and clock rollback can change recovered project state.

Evidence: RDM 8f80e55 contains three deterministic time RED cases; document hashes and links were checked through Dev evidence.

Impact: Save an unapproved schema and time-contract amendment plus current component and DHF dependency status; production time semantics remain unchanged.

Refs: TT-D03, TT-A02, TT-A04; stage 6 W4a and approved read-isolation revision
2026-10-14 07:53:37 +00:00
weichen 5783940e4c Define U3 delegated projection actor fence
Why: Delegated RDM renames currently lose the real operator before the Backend project write, leaving an account-disable race in the Backend database.

Evidence: Read-only source review identified both HTTP lifecycle and command rename paths; the proposed contract and validation plan are pending human stage 4-5 review.

Impact: Adds a narrow request-bound projection capability proposal and two-account final transaction plan. No product code, production state, or approval status changes.

Refs: Approved U3 r1 and A1-A4 amendment; Dev feature/iam-u3-account-directory-recovery task card.
2026-10-14 07:33:19 +00:00
weichen 6619835a65 Record approved DHF implementation status in the main plan
Why: The approved plan remained an earlier review snapshot and contradicted the index and task card after U1 implementation began.

Evidence: The pre-decision r0.1 file hash is f99e1424; the additive dated note preserves that text and records owner stage 6/7 decisions, four package reviews and remaining gates.

Impact: Documentation status only; no asset or product behavior change.

Refs: docs/proposals/2026-10-14-dhf-template-generation-plan.md
2026-10-14 07:33:07 +00:00
weichen 7a21845ff6 Record approved project read isolation boundary
Why: Shared project read pointers can modify cached state without an event or transaction.

Evidence: User approved the immutable r1 design and its alias, publication-order, and performance verification scope.

Impact: Allows isolated W4a state-copy and sealed-log implementation; historical time semantics remain a separate issue.

Refs: feature/rdm-two-trees-latest-templates W4a
2026-10-14 07:29:48 +00:00
weichen 28bdb45581 Record read isolation review and Backend combination evidence
Why: Shared read pointers still violate project snapshot isolation, while context and audit candidates now have a tested local combination.

Evidence: Fixed RDM RED, source-reviewed read-isolation options, and clean Backend combination SELF receipts are linked with precise limits.

Impact: Preserves a pending W4a design and local probe report without claiming stage-six acceptance or component release.

Refs: feature/rdm-two-trees-latest-templates W4a W6 W9
2026-10-14 07:26:34 +00:00
weichen 25a561b047 Plan U3 r0.5 safe terminal and fast feedback work
Why: The approved r0.5 design needs an auditable zero-paid execution sequence after the failed r0.4 model sample.

Evidence: The approved design object is Documents 0d473fe; current source seams, file ownership, relative links, and whitespace were checked before drafting this plan.

Impact: Add five test-first work units and explicit stage, budget, privacy, and stop gates. This commit contains no product implementation or model call.

Refs: U3 r0.5 design; Dev task feature-fast-slow-u2-u3-plan
2026-10-14 07:19:46 +00:00
weichen fdca353097 Merge remote-tracking branch 'origin/main' into feature/dhf-template-pipeline-plan 2026-10-14 06:36:43 +00:00
weichen 0d473fe866 Document U3 r0.5 safe terminal and fast feedback design
Why: The authorized r0.4 A01 exposed an unobserved stream terminator and an unsupported numeric relationship in the immediate reply.

Evidence: Independent A01 assessment and fixed-head Backend/Dev CI are linked from the design and task record; relative Markdown links and git diff --check pass.

Impact: Propose content-free terminal diagnostics and a source-safe host acknowledgement while retaining strict tool rejection and the original A01 quality gate. This document grants no implementation or model budget.

Refs: U3 r0.4 validation; Dev task feature-fast-slow-u2-u3-plan
2026-10-14 06:31:02 +00:00
weichen 3af3d73d85 Record approved audit write-order guard and failing replay
Why: Explicit low audit IDs can bypass the old default function and disappear across fixed-cutoff pages.

Evidence: User approved the immutable r1 correction; the exact isolated PostgreSQL RED receipt is preserved byte-for-byte.

Impact: Authorizes only isolated all-writer guard and offline-copy testing; live migration remains outside scope.

Refs: feature/rdm-two-trees-latest-templates W9
2026-10-14 06:05:27 +00:00
weichen 12e20c6701 Record pending audit write-order correction
Why: An isolated PostgreSQL test demonstrates that explicit low IDs bypass the current committed-prefix guard and disappear across pages.

Evidence: The test-only RED and reviewed database/migration tradeoffs are bound to the documented candidate and exact SHA256.

Impact: Adds a human-review design for all online audit writes and exclusive offline copy; no runtime change or migration.

Refs: feature/rdm-two-trees-latest-templates W9
2026-10-14 06:02:15 +00:00
weichen fb3a8214df Specify U3 stage-six review repairs
Why: independent review found in-flight write, API-key admission, lock-order, and cross-instance cursor gaps in the U3 candidate.

Evidence: SELF source review of Backend 4053c4d against approved U3 r1; proposal records triggers, scope, and replay plan.

Impact: request stage-four and stage-five re-review before further affected implementation; no production action.

Refs: IAM U3 r1; Dev policy/delivery.md
2026-10-14 05:51:37 +00:00
weichen e4536afda6 Merge authoritative main into the U3 contract branch
Why: prepare the U3 review amendment against the current documentation baseline.

Evidence: origin/main=2d35cd49c203820d24d7c38acead06d37793c1f1.

Impact: integrate upstream documentation without changing the approved U3 r1 text.

Refs: IAM U3 r1
2026-10-14 05:50:32 +00:00
weichen c53662a6d8 Record failed U3 r0.4 A01 assessment
Why: The single authorized real-model trial produced no persisted checkpoint or final result and exposed an unsupported fast-channel inference.

Evidence: Independent read-only assessment SHA 2ac373ed66d47aaa9cdb699d3bf77eb8a515d46956ee0321b70cc0230d79b667; restricted 20-file source-verified archive manifest SHA 881991dcab17ad2539f8b24332f962e3505ab2f248662f58283fe08daa179077.

Impact: Preserve the FAIL decision, returned-versus-persisted Usage discrepancy, resource stop, and next design gate without rewriting the sample.

Refs: U3 r0.4 plan; Dev task feature-fast-slow-u2-u3-plan
2026-10-14 05:47:32 +00:00
weichen b61b8433a3 Record approved project source recheck boundary
Why: A validated sensitive-text persistence defect requires a reviewed X1 source reauthorization contract.

Evidence: User approved the immutable r1 design at its recorded SHA256; the Backend RED remains preserved.

Impact: Allows isolated W6 implementation while retaining separate migration, tag and acceptance gates.

Refs: feature/rdm-two-trees-latest-templates W6
2026-10-14 05:20:25 +00:00
weichen 7f49f0668d Record pending project source recheck design
Why: Persisting goal-sensitive model prompts in long-lived context receipts violates the approved content-minimization boundary.

Evidence: A fixed Backend HEAD RED reproduces stored workflow output; source and migration constraints were reviewed against current code.

Impact: Adds a reviewable X1 interface and data correction proposal; implementation stays paused until human approval.

Refs: feature/rdm-two-trees-latest-templates W6
2026-10-14 05:19:34 +00:00
weichen def31f5d4b Record approved implementation and audit sequence changes
Why: W2 transaction consistency and PostgreSQL audit pagination need their reviewed dependency and data-order boundaries preserved.

Evidence: User approved the two immutable r1 objects at their recorded SHA256 values; local link and whitespace checks passed.

Impact: Main record now authorizes isolated W4a and W9 work while retaining separate live migration gates.

Refs: feature/rdm-two-trees-latest-templates stage 6
2026-10-14 05:07:53 +00:00
weichen 2d35cd49c2 Merge pull request 'Record the controlled merge queue trial' (#101) from feature/merge-queue-trial-report into main 2026-10-14 04:51:47 +00:00
weichen 582e7c0f06 Record pending audit cutoff design review
Why: PostgreSQL sequence IDs can become visible out of order and undermine fixed audit pagination.

Evidence: Isolated PostgreSQL late-commit reproduction and sequence cache behavior were checked against official documentation.

Impact: Adds a reviewable proposal with lock, sequence, migration, rollback, and throughput boundaries; no runtime code changes.

Refs: feature/rdm-two-trees-latest-templates W9
2026-10-14 04:48:43 +00:00
weichen 3e0cdae1bf Record the controlled merge queue trial
Why: The approved U6 plan requires a reviewable account of three real serial deliveries, CI costs, recovery paths, and manual adoption limits.

Evidence: Dev #489/#488/#486 fixed-head Actions runs 3038/3050/3067 and main runs 3040/3053/3068; component PRs and Issue #518 preserve raw SELF and independent REPLAY.

Impact: Document observed behavior and untested automatic coordination boundaries without changing product code or declaring rollout authority.

Refs: Dev issue #518; merge queue implementation plan U6
2026-10-14 04:48:22 +00:00
weichen bc1d1aa43b Record approved two-trees requirements and stage-six findings
Why: Preserve the reviewed 44-template scope, design, implementation plan, and exact stage decisions in the shared project record.

Evidence: Approved stage hashes and local links verified; W0 inventory has 44 records and current implementation limits are explicit.

Impact: Adds traceable planning, source receipts, audit-link approval, and a pending W2/W4 sequence adjustment without changing published assets.

Refs: feature/rdm-two-trees-latest-templates
2026-10-14 04:42:08 +00:00
weichen 8e66127a76 Merge current Documents main into U3 plan
Why: Preserve approved proposal status updates while retaining the U3 r0.4 design and implementation plan.

Evidence: The two lines of work touch disjoint document paths; merge status is clean and the parent Dev composition will be revalidated.

Impact: Documentation only; no model or runtime behavior change.

Refs: Dev U3 r0.4 Task 6 synchronization
2026-10-14 03:40:27 +00:00
weichen c256558ca8 Record approved DHF implementation progress
Why: Keep the planning index aligned with the approved scope and actual U1 results.

Evidence: The RDM branch saved the 44-asset catalog and E1 receipts; exact candidate fidelity remains under human review.

Impact: Documentation status only; no template is published and no runtime behavior changes here.

Refs: DHF plan r0.1; RDM feature/dhf-template-assets@6af4497
2026-10-14 03:21:21 +00:00
weichen 8e9587ca1d Preserve the approved DHF integration plan
Why: Keep the owner-reviewed scope and asset evidence available for implementation.

Evidence: Plan review and SELF document/source receipts are recorded in the Dev task card.

Impact: Documentation and asset inventory only; no product behavior changes.

Refs: DHF plan r0.1; owner approval to begin implementation
2026-10-14 01:52:56 +00:00
weichen 276f885e73 Plan U3 r0.4 first-checkpoint recovery
Why: turn the approved recovery design into reviewable cross-component implementation and validation steps.

Evidence: six tasks and thirty steps mapped to the spec; review-focus tests, local links and diff checks pass.

Impact: plan and validation status only; code and paid model execution remain NOT_RUN.

Refs: docs/proposals/2026-10-14-fast-slow-u3-r04-reliable-first-checkpoint-implementation-plan.md; docs/reports/2026-10-13-fast-slow-u2-u3-validation.md
2026-10-14 01:52:10 +00:00
weichen c236d3099d Define the U3 account directory and owner recovery contract
Why: refine the approved IAM scope into enforceable account, directory and recovery boundaries.

Evidence: SELF document checks and independent document reviews; business tests and CI are NOT_RUN.

Impact: proposed contract and implementation plan only; preserve the approved global plan and all runtime data.

Refs: Dev feature/iam-u3-account-directory-recovery; IAM r1 U3 and IAM-D/IAM-C
2026-10-14 01:48:47 +00:00
weichen 7b21e6d495 Document U3 r0.4 first-checkpoint recovery design
Why: the approved r0.3 A01 sample failed before any useful background checkpoint.

Evidence: preserved A01 receipt, SQLite and provider records; offline SSE and retrieval replay; local links and diff checks pass.

Impact: design and validation record only; no behavior, budget, or model route changes.

Refs: docs/proposals/2026-10-14-fast-slow-u3-r04-reliable-first-checkpoint-design.md; docs/reports/2026-10-13-fast-slow-u2-u3-validation.md
2026-10-14 01:34:53 +00:00
weichen 7bd4e17827 Merge pull request 'Record the approved U8, U7, and export status' (#89) from feature/u8-u7-rdm-export-status into main 2026-10-14 01:15:10 +00:00
weichen 10b442169c Distinguish historical proposal limits from current authorization
Why: old r2 and r3 draft-stage paragraphs contradicted the retained approval records and current user takeover authorization.
Evidence: independent Documents review identified the ambiguity; targeted diff and link checks are captured outside the candidate.
Impact: label historical planning limits without changing genuine NOT_RUN results, deployment boundaries, or the newer login recovery implementation record.
Refs: Documents PR #89; Dev PR #489; independent review /tmp/mq-trial489-docs-independent-review-20261014.json
2026-10-14 01:08:51 +00:00
weichen b096191a84 Integrate approved proposal status with current documentation
Why: retain the approved recovery and account additions while preserving the newer login recovery record and all current documentation.
Evidence: diff checks and affected links are captured by the evidence tool; historical CI remains scoped to its original object and is not current admission.
Impact: merge the current document target into the existing status task, preserve r3 records, and apply the user mandate that agents execute merges.
Refs: Documents PR #89; Dev PR #489; merge queue Issue #518; user continuation authorization on 2026-10-14
2026-10-14 00:59:08 +00:00
weichen c7cb2d8d89 Record U3 r0.3 combination and trial entry boundary
Why: Reviewers need the exact successful combination and a clear distinction between prepared evaluation code and paid authorization.

Evidence: Dev 6f91ca9 make test/build SELF receipt; Backend 5f83454 label regression RED→GREEN.

Impact: Documentation only; real-model quality remains NOT_RUN and six PRs stay drafts.

Refs: Dev task feature/fast-slow-u2-u3-plan; Documents PR #95
2026-10-13 18:00:26 +00:00
weichen b776fe1e4d Record accepted U3 code mechanism and remaining model gate
Why: Repeated independent semantic review required a conservative final source and analysis boundary.

Evidence: Backend 5f53f80 independent replay found no remaining Critical/Important; task-owned PostgreSQL and HTTP browser receipts identify separate fixed SHAs.

Impact: Code mechanism review is PASS, while real-model quality, exact Dev combination and platform gates remain pending.

Refs: Dev task feature/fast-slow-u2-u3-plan; Documents PR #95
2026-10-13 17:51:02 +00:00
weichen 53b1abdec8 Record independent U3 semantic findings and retests
Why: The first r0.3 code review found three unsafe inference paths despite green mechanism tests.

Evidence: Reviewer's read-only replay, Backend RED→GREEN counterexamples, isolated PostgreSQL and task-owned HTTP browser receipts are identified separately.

Impact: Keep the old review failure and new fix candidate traceable; real-model quality stays NOT_RUN.

Refs: Dev task feature/fast-slow-u2-u3-plan; Documents PR #95
2026-10-13 17:24:00 +00:00
weichen 21fbc9de34 Record U3 r0.3 zero-paid validation results
Why: The new evidence-bound checkpoint candidate needs a reviewable account of what the local and browser gates prove.

Evidence: Tool-imported Dev combination, isolated PostgreSQL and real HTTP fake-stream browser receipts; previous knip failure retained.

Impact: Documentation only; r0.2 model quality remains FAIL and r0.3 paid A01 remains NOT_RUN.

Refs: Dev task feature/fast-slow-u2-u3-plan; Documents PR #95
2026-10-13 17:05:00 +00:00
weichen f64fe11c55 Merge remote-tracking branch 'origin/main' into feature/fast-slow-u2-u3-plan 2026-10-13 16:29:25 +00:00
weichen a7ff466d9a Merge pull request 'Define the approved project rename projection boundary' (#99) from feature/iam-i1-projection-contract into main 2026-10-13 16:24:57 +00:00
weichen 1f3bd54cfb Define the approved single-project rename projection boundary
Why: Preserve delegated project settings while keeping physical Host mutations owner-scoped.

Evidence: User explicitly approved the independently reviewed amendment and repair plan; original amendment digest recorded in the contract.

Impact: Clarify actual-actor authorization and audit, single-target owner projection, durable recovery and masked metadata; no provider implementation or deployment claim.

Refs: IAM I1 host projection amendment r1; Documents PR 98; Dev policy/delivery.md affected stages 4-5.
2026-10-13 16:04:31 +00:00
weichen 36ec4c1867 Record approval of the U3 r0.3 implementation plan
Why: The user approved zero-paid execution of the written plan.

Evidence: Approval response on 2026-10-13; git diff --cached --check passed.

Impact: Document status only; new paid A01 remains separately gated.

Refs: Documents PR #95; Dev task feature/fast-slow-u2-u3-plan
2026-10-13 15:57:32 +00:00
weichen 374ec45b72 Merge remote-tracking branch 'origin/main' into feature/fast-slow-u2-u3-plan 2026-10-13 15:49:25 +00:00
weichen 3cf263962b Merge pull request 'Freeze IAM role and permission boundaries with accepted I1 validation' (#98) from feature/iam-i1-permission-contract into main 2026-10-13 15:39:54 +00:00
weichen ba9d76426d Identify the provider snapshot used by the IAM contract
Why: Avoid presenting an earlier extension surface as the current provider after main advances.

Evidence: Independent documentation review identified a non-blocking version attribution issue.

Impact: Attribute the existing-capability table to Backend 0f192a48; preserve contract semantics and approved plan digest.

Refs: IAM I1 stage 8 document review.
2026-10-13 15:37:31 +00:00
weichen 30bceb748f Align IAM contract navigation with accepted delivery stage
Why: Remove stale local-review and pending-acceptance statements after user confirmation.

Evidence: Independent stage 8 documentation review identified the status mismatch.

Impact: Update delivery status only; preserve permission semantics and the approved plan digest.

Refs: 2026-10-13 IAM I1 acceptance record; Dev policy/delivery.md.
2026-10-13 15:34:16 +00:00
weichen b4a2573742 Record user acceptance of IAM I1 validation
Why: Preserve the explicit stage 7 decision before formal review and integration.

Evidence: User confirmation in this session; document consistency receipt 17a3542f8e69fc899a05a152d258b721a8aaab4cd0a3629f8f5cbb7364d77d84 (SELF).

Impact: Record acceptance of the fixed I1 candidate and its stated limitations; leave the approved plan unchanged.

Refs: Dev policy/delivery.md stages 7-9; IAM I1 permission contract.
2026-10-13 15:30:37 +00:00
weichen 1f83bb7ffe Merge remote-tracking branch 'origin/main' into feature/iam-i1-permission-contract 2026-10-13 15:27:22 +00:00
weichen f608ae5b5b Document the U3 r0.3 evidence implementation plan
Why: The approved r0.3 design needs a reviewable implementation and validation path.

Evidence: Design approval recorded in the task conversation; plan self-reviewed against the spec and current Core/Backend interfaces; git diff --cached --check passed.

Impact: Documentation only; semantic code and paid model trials remain unapproved.

Refs: Dev task feature/fast-slow-u2-u3-plan; Documents PR #95
2026-10-13 15:19:38 +00:00
weichen 61bb93e813 Design evidence-backed U3 stage judgments
Why: The approved r0.2 A01 produced an unsupported set-membership claim despite an explicit prompt warning.

Evidence: Independent read-only replay of the fixed A01 result, source text, persisted checkpoints and final card; spec self-review and link checks.

Impact: Defines a conservative no-extra-model-call proposal for review, without authorizing semantic implementation or another paid sample.

Refs: U3 r0.2 A01 quality FAIL, user-approved r0.3 design direction
2026-10-13 15:04:15 +00:00
weichen 4971d0d13d Record durable A01 evidence archive
Why: The failed model sample must remain reviewable beyond the task-owned temporary directory.

Evidence: Eighteen copied files rehashed and checked at restrictive modes; protected route key was not copied.

Impact: The report points to a durable, access-restricted archive without upgrading the failed quality verdict.

Refs: U3 r0.2 A01 independent replay
2026-10-13 14:54:22 +00:00
weichen 064d4b5f68 Present the bounded I1 acceptance candidate and evidence gaps
Why: Stage 6 is approved and formal command/API results need a version-bound human acceptance decision.

Evidence: Complete SELF receipts and independent replays are linked to fixed Dev/RDM subjects; the original implementation approval is retained.

Impact: Record test coverage, predicate corrections, immutable product digests and explicitly untested later scopes. Do not mark user acceptance or shipping complete.

Refs: IAM I1 U1-U2; phase 7 acceptance
2026-10-13 14:52:43 +00:00
weichen 6d90860a83 Record the failed r0.2 A01 model acceptance
Why: The one authorized trial produced useful stages and a final answer but also an unsupported phase-membership claim.

Evidence: Fixed SQLite, provider and result hashes; tool-imported SELF receipts; independent read-only source-by-source replay.

Impact: Keep U3 quality FAIL, six PRs draft and the new diagnostic fix separate from the paid sample.

Refs: U3 quality implementation plan r0.2, Task 6
2026-10-13 14:45:56 +00:00
weichen 2d5398e988 Record user approval of the I1 implementation
Why: The user approved the previously delivered local implementation and compatibility effects.

Evidence: This chat reply says approval; its objects remain c023551 Documents, b93908e RDM and 72ed8b4 Dev. Execution receipts are separate from this human decision.

Impact: Stage 6 passes and planned stage 7 begins; acceptance, shipping, later increments and production operations are not approved by substitution.

Refs: I1 implementation review on 2026-10-13
2026-10-13 14:31:56 +00:00
weichen 129cc3579d Merge pull request 'Record the merge queue implementation and validation plan' (#96) from feature/merge-queue-plan into main 2026-10-13 14:30:38 +00:00
weichen 8375057829 Merge commit '047d362c72ec2c095ec14e1d2f2d152f94471faf' into feature/iam-i1-permission-contract 2026-10-13 14:21:43 +00:00
weichen 32d6c8487a Merge the authoritative document baseline before delivery
Why: The process-document main branch advanced with project membership and privacy records after this implementation plan was reviewed.

Evidence: origin/main was freshly fetched; the reviewed plan remains the same and the final combined document checks will be replayed on the resulting head.

Impact: Preserve the other task's proposal and index entries alongside the approved merge queue plan, without changing its scope or execution authorization.

Refs: Documents PR #96; origin/main 047d362; independent review docs_delivery_review
2026-10-13 14:20:31 +00:00
weichen 047d362c72 Merge pull request 'Define project membership and private collaboration boundaries' (#97) from feature/project-member-access into main 2026-10-13 11:52:28 +00:00
weichen 6c096b9360 Record project event privacy and duty replay refinements
Why: Legacy upload events and synced duty flows need the same private-data and current-state guarantees as new member work.

Evidence: Real legacy SSE leakage and independent duty replay findings; correction evidence remains in the canonical task record.

Impact: Describe trusted per-event sharing and durable duty versions without new mandatory downstream interfaces or runtime changes.

Refs: system-project-membership r1.1; Dev feature/project-member-access
2026-10-13 11:06:42 +00:00
weichen 1a1c888229 Record independent U3 review fixes and replay
Why: The final zero-paid candidate incorporates three review findings and fresh browser/PostgreSQL evidence.

Evidence: Backend RED-to-GREEN regressions; task-card SELF receipts for HTTP/browser and isolated PostgreSQL reruns.

Impact: Real-model quality remains NOT_RUN and still blocks merge.

Refs: U3 quality revision r0.2
2026-10-13 10:53:58 +00:00
weichen c023551f2a Record verified I1 local checks and pending human review
Why: Separate observed local implementation and test results from formal acceptance, CI and deployment.

Evidence: Complete SELF outputs and fixed subjects are in the owning Dev and RDM task cards; independent preliminary review passed on dfb9c407.

Impact: Update review progress and explicit follow-up boundaries only; preserve approved plan and permission contract.

Refs: IAM I1 U1-U2
2026-10-13 10:46:39 +00:00
weichen b8fcf01062 Record the I1 local implementation candidate and review boundaries
Why: The approved plan needs traceable local progress and explicit capability limitations before human implementation review.

Evidence: The owning task cards retain full local SELF startup, sync, red and green outputs; final combination checks and independent review are pending in this checkpoint.

Impact: Preserve the original approved plan and identify I1 behavior, deferred capabilities and the next separately authorized unit.

Refs: IAM plan r1; I1 U1-U2
2026-10-13 10:39:21 +00:00
weichen 4a70ba8d57 Record full U3 composition and isolated PostgreSQL evidence
Why: The merged candidate now has complete local combination and task-owned PostgreSQL results.

Evidence: Imported SELF receipts for make test && make build and Backend runmgr/cardsvc/store on isolated PostgreSQL.

Impact: The report keeps final exact-head and model acceptance gates pending for the next candidate SHA.

Refs: U3 quality revision r0.2
2026-10-13 10:38:26 +00:00
weichen 2fdda63406 Record the merged U3 browser mechanism replay
Why: The resolved cross-component candidate now has actual HTTP/browser evidence and one diagnosed fixture failure.

Evidence: Task-card SELF sync and browser receipts, including manifest verification and two passing Playwright cases.

Impact: The report keeps model quality NOT_RUN for r0.2 and the older paid failure unchanged.

Refs: U3 quality revision r0.2
2026-10-13 10:31:38 +00:00
weichen f1a44fdac6 Clarify the implementation plan observations as their authoring baseline
Why: Historical observations in the approved plan used current-tense wording after implementation advanced, making the progress pointer harder to interpret.

Evidence: Independent documentation review identified the wording; the diff changes only baseline time and references current task/PR evidence. Document replay follows on the new candidate.

Impact: No change to approved units, interfaces, authorization or acceptance criteria; actual progress remains in the task and fixed-candidate records.

Refs: Documentation review Minor finding; approved plan ba4044d; U1-U6
2026-10-13 10:30:39 +00:00
weichen b91e298c15 Clarify fail-closed I1 host capability boundaries
Why: Existing public host contracts cannot prove source ownership, scoped revocation or private artifact filtering.

Evidence: The I1 documentation consistency checker preserves the approved plan digest and fixed RDM core rules; behavior verification is recorded in the owning task.

Impact: Record conservative I1 defaults and explicit follow-up provider requirements without adding public implementations.

Refs: IAM plan r1, I1 U1-U2
2026-10-13 10:27:09 +00:00
weichen 72e11c5eb8 Record approved U3 revision and zero-paid evidence
Why: The design and implementation plan were approved while the previous report still described them as pending.

Evidence: git diff --check; Backend, UI and affected Frontend tests recorded as SELF with their component SHAs.

Impact: The report distinguishes the new mechanism candidate from the failed paid v7 sample and keeps model QA NOT_RUN.

Refs: U3 quality revision r0.2
2026-10-13 10:17:03 +00:00
weichen 61e0aef39c Specify system project membership and shared knowledge boundaries
Why: Joined members must see one globally named project and keep private conversations and source documents.\n\nEvidence: Proposal links the fixed implementation plan, explicit authorization and task evidence without claiming deployment or CI success.\n\nImpact: Define optional lifecycle extension, identity recovery, private reads and published knowledge for U2/U3/U5.\n\nRefs: Dev feature/project-member-access
2026-10-13 09:56:06 +00:00
weichen 76651f6798 Keep the mechanism fixture aligned with source-once input
Why: The existing browser fixture parses the trailing source index that the approved source-once layout removes.

Evidence: A zero-paid parser probe matched the old format and rejected the planned inline format; the plan now owns a failing fixture test and adaptation.

Impact: Preserve real HTTP browser coverage without changing product contracts or model acceptance.

Refs: Agent-System-Documents#95; Agent-System-Dev#512
2026-10-13 09:33:43 +00:00
weichen 2cc00da9e0 Define the I1 permission and public extension contract
Why: separate protected system actions from project authority and freeze the approved identity and resource boundaries.

Evidence: SELF document check recorded by Dev evidence; approved plan digest retained and fixed-base core rules preserved.

Impact: contract and navigation only; provider implementations, multi-role migration and deployment remain later increments.

Refs: IAM plan r1 U1; Agent-System-Dev feature/iam-i1-permission-boundaries
2026-10-13 09:30:34 +00:00
weichen 0827b81026 Align final-reserve accounting with provider usage
Why: A provider may report prompt and completion tokens while leaving totalTokens zero; the reserve must not treat that usage as free.

Evidence: Existing budgetedStream falls back to prompt plus completion, while subRun usage accounting currently does not; the plan adds a focused regression.

Impact: Clarify the reviewed implementation scope without changing product code or authorizing a model sample.

Refs: Agent-System-Documents#95; Agent-System-Dev#512
2026-10-13 09:27:59 +00:00
weichen 3bb02a119b Guard final-only continuation in the U3 plan
Why: Hiding a tool declaration alone does not prevent a model from calling a tool already in the runtime registry.

Evidence: The agent-native loop continues after tool errors; the plan now requires a local stop latch before any later provider call.

Impact: Clarify the zero-paid test and implementation boundary without changing the approved design or authorizing model usage.

Refs: Agent-System-Documents#95; Agent-System-Dev#512
2026-10-13 09:21:29 +00:00
weichen dfe99d530e Plan the U3 quality revision implementation
Why: The approved written design needs testable work items before changing model behavior or spending another sample.

Evidence: The plan maps all three design duties to existing code seams, RED-to-GREEN checks, a fixed combination gate and a separately authorized real-model exit.

Impact: Record stage-five review material without modifying product code, using paid models, or opening merge gates.

Refs: Agent-System-Documents#95; Agent-System-Dev#512
2026-10-13 09:17:49 +00:00
weichen a088809dc8 Preserve the approved identity and permission plan
Why: provide the approved contract for the I1 implementation without altering its accepted content.

Evidence: SELF source artifact SHA-256 39b8e9a6e078dc509bd80118c1807ce6ed23e4466e5902b51f4bfa255d55c0a1; user approved the plan and authorized U1-U2.

Impact: documentation checkpoint only; no production code or runtime changes.

Refs: Agent-System-Dev feature/iam-i1-permission-boundaries
2026-10-13 09:08:51 +00:00
weichen 407e49d2ba Remove trailing blank lines from merge queue candidate documents
Why: Validation of the complete candidate against origin/main detected added blank lines at the end of the authored documents.

Evidence: git diff --check origin/main validates the final candidate format; unchanged semantic content remains covered by the approved specification and implementation plan.

Impact: Document whitespace only; no version obligations, execution mode or authorization change.

Refs: Merge queue implementation plan U4; formal document validation
2026-10-13 08:59:34 +00:00
weichen 67e924041e Draft the U3 quality revision design
Why: The approved model samples showed unsupported approval claims, repeated source input and no final answer before the run budget stopped.

Evidence: The design cites the preserved A01 provider usage, persisted findings and independent sample audit without claiming new model validation.

Impact: Define a reviewable source, claim and final-reserve revision while keeping code, paid trials and merge gated.

Refs: Agent-System-Documents#95; Agent-System-Dev#512
2026-10-13 08:51:35 +00:00
weichen 652be93a60 Record plan approval and link implementation evidence
Why: preserve the approved plan and point readers to the actual task objects instead of treating historical planning state as current delivery status.

Evidence: user approval of plan r1 and Dev task-card receipts; actual platform activation and real trial remain NOT_RUN.

Impact: plan metadata, test-file organization and navigation only; task state remains authoritative in Dev.

Refs: docs/proposals/2026-10-13-merge-queue-implementation-plan.md; Dev .task/feature-merge-queue-policy-draft.md
2026-10-13 08:22:35 +00:00
weichen 9cdb14010c Disclose the A01 stop-rule deviation
Why: The controlled trial made one more paid provider request after rejecting a nonliteral quote.

Evidence: Independent transcript audit found a 14231-token continuation within the same child run; original receipts and failed quality verdict remain intact.

Impact: Make the authorization deviation explicit and reference a zero-paid prevention guard; no additional model run is authorized.

Refs: Agent-System-Documents#95; Agent-System-Backend#193; Agent-System-Dev#512
2026-10-13 08:02:43 +00:00
weichen f7a68e5882 Record the failed bounded A01 follow-up
Why: The approved v7 sample saved two checkpoints but still missed semantic and final-result acceptance.

Evidence: Independent DB replay, provider usage reconciliation, source checks and the original failed evaluation receipt.

Impact: Preserve the exhausted one-shot boundary and keep all draft PRs unmerged.

Refs: Agent-System-Documents#95; Agent-System-Dev#512
2026-10-13 07:42:45 +00:00
weichen fb06fccfa2 Prepare a bounded review proposal after failed checkpoint delivery
Why: The approved extra sample ended with no valid saved findings and exhausted its per-run token threshold.

Evidence: Provider responses, strict-source rejections, Usage and independent analysis are retained; v7 has only local checks.

Impact: Define a separately approvable two-run 30000-token-per-run experiment without altering original acceptance rules or claiming model success.

Refs: Approved U2/U3 plan r0.1; independent extra A01 assessment
2026-10-13 06:50:16 +00:00
weichen ba4044d57e Plan serial delivery windows and compatible task recovery
Why: turn the confirmed scheduling specification into sequenced work with explicit interfaces, evidence handling and admission validation.

Evidence: SELF plan checks verified fixed source commits, 83 relative links, six units and four Python example blocks; implementation and runtime checks remain NOT_RUN.

Impact: reviewable implementation plan and navigation only; no task scripts, workflow, platform settings or business behavior are implemented.

Refs: docs/proposals/2026-10-13-merge-queue-implementation-plan.md; Dev policy/merge-queue.md r1; Development-Guidelines draft.11
2026-10-13 06:40:14 +00:00
weichen 4b20983ccd Update plan entry points and archive current verification
Why: The project and proposal indexes still said no U2/U3 implementation or experiment existed.

Evidence: Current combination, full PG backend, two HTTP browser cases and independent code review are linked with their actual statuses.

Impact: Documentation only; real-model acceptance is explicitly failed and no release is claimed.

Refs: Approved U2/U3 task card and validation report
2026-10-13 06:34:34 +00:00
weichen dd3b9da619 Archive current verification and the failed extra A01 assessment
Why: Keep the latest merged candidate reviewable without turning failed model findings into a release claim.

Evidence: Exact d06792c composition, two current browser cases and independent model review are linked and source-labeled.

Impact: Documentation only; model quality gate and merge remain closed.

Refs: Approved U2/U3 task card
2026-10-13 06:23:53 +00:00
weichen 1b296a1773 Record the failed approved A01 replay and next acceptance conditions
Why: The model produced no admissible findings, so release and further paid work remain gated.

Evidence: Original provider calls, 42203 tokens, independent SQLite replay and strict source rejection are linked from the validation report.

Impact: Correct planning status and recommend a bounded lower-complexity test design for separate approval.

Refs: Approved U2/U3 plan r0.1; extra A01 user approval 2026-10-13
2026-10-13 06:13:39 +00:00
weichen 7fe00e052f Merge current planning records before U2/U3 review
Why: Preserve other approved planning records and index updates.

Evidence: Exact current main fetched; no overlapping source behavior.

Impact: Retain both planning histories.

Refs: Agent-System-Dev U2/U3 delivery
2026-10-13 05:28:02 +00:00
weichen 0e9c6710e4 Archive the final code review and fixed combination evidence
Why: Make the current corrected candidate reviewable while preserving the failed model acceptance boundary.

Evidence: Native SELF receipt for exact source composition 7fd5288 is green; independent reviewer verifies Backend 6a2d85c and all fixed regressions.

Impact: Documentation only; the six failed or limited model samples remain unchanged and no merge or deployment is claimed.

Refs: Approved U2/U3 plan; pending explicit extra A01 test authorization
2026-10-13 04:45:51 +00:00
weichen 53a7d37e6c Record implemented work checkpoints and the pending model acceptance gate
Why: Planning-only status no longer matches the candidate, while failed model samples must remain explicit.

Evidence: Native SELF receipts and independent REPLAY reports distinguish code checks, six model cases and the failed quality/fidelity boundaries; relative links verified.

Impact: Update only this approved U2/U3 planning record and validation report; CI, merge, deployment and an extra sample remain pending.

Refs: User confirmation 2026-10-13; Dev feature-fast-slow-u2-u3-plan
2026-10-13 04:31:50 +00:00
weichen 5a06acf7cd Merge pull request 'Record the login recovery implementation as proposal r3' (#94) from feature/login-recovery-r3 into main 2026-10-13 04:30:16 +00:00
weichen 0b290b7461 Record the login recovery implementation as proposal r3
Why: The 2026-10-13 login recovery flow was approved and merged
(Backend #187, Frontend #76, Dev #504); the master proposal must carry
the three adjudications, implementation record, and evidence pointers
per the repo's lineage conventions.

Evidence: Dev #504 HEAD CI (test/test-pg/svc-realcombo) success; browser
acceptance receipts be7ae9a2/b3a9e691 bound to Dev HEAD 268ef29 (SELF).

Impact: r3 is an implementation record only; R/KTD/U numbering semantics
unchanged; U7 explicitly NOT marked complete (atomic bootstrap and CLI
credential delivery remain). INDEX.md status line updated.

Refs: Dev docs/svc-deploy/2026-10-13-login-recovery-contract.md
2026-10-13 04:30:04 +00:00
weichen 267327671d Merge pull request 'Add RDM settings, members, duties and permissions increment plan r1' (#93) from feature/rdm-increment-settings-duties into main 2026-10-13 04:18:57 +00:00
weichen a73c84b5be Add RDM settings, members, duties and permissions increment plan r1
Why: 固化 2026-10-13 评审通过的 RDM 完善增量方案(承接总案 U3/U4/U6,衔接 U5),含三处技术评审补充与顺序裁定。
Evidence: 方案核查记录见提案文末;源码锚点 Backend settings.go / RDM perms.go, plugin.go / Frontend adminRdmSections.tsx。
Impact: 仅新增提案文档与索引条目,无代码变更。
Refs: 2026-10-12-rdm-function-implementation-plan.md
2026-10-13 03:22:46 +00:00
weichen 59db26eb9c Merge commit '05c13a42b14d70f878cc8a51c543e018a7f7a663' into feature/fast-slow-u2-u3-plan 2026-10-13 02:44:19 +00:00
weichen 05c13a42b1 Merge pull request 'Record the K4 artifact retest in the collaboration plan' (#92) from fix/u7-k4-artifact-upload into main
Why: the retest changed the K4 SELF result, and the plan has to record that without opening write traffic.
Evidence: SELF drill backup-20261013-013354, K1-K7 true. Documents has no CI workflow.
Impact: proposal r2.3. Second-instance writes stay closed.
Refs: #92
2026-10-13 01:53:03 +00:00
weichenandCursor 53354996f2 Record the K4 artifact retest in the collaboration plan
Why: the 2026-10-12 drill left artifact recovery failed, and the retest changed that SELF result without changing the write-traffic gate.
Evidence: backup-20261013-013354 on Dev a83588dd and backend 46073d30; K1-K7 true, RPO 65s, RTO 3s, five artifacts matched and cross-user access returned 404. SELF.
Impact: proposal moves to r2.3. Second-instance writes stay closed until REPLAY or CI and the second host exist.
Refs: docs/records/2026-10-12-u7-ops-drill-report.md docs/proposals/2026-10-11-collaboration-storage-and-distribution.md
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 01:44:03 +00:00
weichen c2b17f620b Prepare the U2 and U3 work projection implementation plan
Why: make persistent activity and grounded findings reviewable before business changes.

Evidence: fixed source audit and scoped plan self-review; business and live checks remain NOT_RUN.

Impact: proposed contracts, implementation sequence, compatibility and bounded verification only.

Refs: fast-slow design r1.1, Dev feature/fast-slow-u2-u3-plan
2026-10-12 23:44:37 +00:00
weichen cf74a200e8 Record the corrected workbench candidate and single delivery record
Why: Keep planning progress aligned with actual implemented corrections without duplicating CI and merge state.

Evidence: Reference UI155, Frontend210 and 19 local browser cases via Dev native receipts; final GATE remains separately tracked.

Impact: Planning metadata only; no deployment or model-routing claim.

Refs: work-companion-ui r0.2/r1, UI01-UI13
2026-10-12 19:07:32 +00:00
weichen f7ae1ecce6 Record workbench implementation evidence and remaining delivery gates
Why: Keep the approved design and implementation plan consistent with the current candidate.

Evidence: Reference actual SELF verification and pending independent Review and GATE, without copying command output.

Impact: Planning progress only; inherited live-model capabilities and deployment remain separate.

Refs: UI01-UI13, work-companion-ui U5
2026-10-12 16:59:30 +00:00
weichen b184bfb109 Merge current Documents main into the workbench design branch
Why: preserve concurrent planning records before the Dev combination sync.

Evidence: fetched authoritative Documents main f76cce9e32.

Impact: planning record integration without rewriting history.

Refs: work-companion-ui U5.
2026-10-12 16:32:44 +00:00
weichen f76cce9e32 Merge pull request 'Record the U7 ops drill and advance the storage plan to r2.2' (#90) from feature/u7-ops-drills into main
Merge pull request 'Record the U7 ops drill and advance the storage plan to r2.2' (#90) from feature/u7-ops-drills into main
2026-10-12 15:52:51 +00:00
weichenandCursor 95c2ec260c Record the U7 ops drill and advance the storage plan to r2.2
Why: B6, C4, and C5 now have same-host results, and the plan still said the ops drills were not done and that replay was the next step.
Evidence: Dev results pgbench-20261012-131948, fault-20261012-142734, and backup-20261012-153441 (SELF). The user declined a capacity replay on 2026-10-12.
Impact: Second-instance writes stay closed. K4 remains a product defect. Replay and C3 are not started.
Refs: feature/u7-ops-drills
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 15:49:44 +00:00
weichenandCursor b8df6f3c2a Record the approved U8, U7, and export status
Why: the 2026-10-12 approval covers the recovery U8 and account U7 additions, and the RDM U5 note still treated the lifecycle pull request as the whole export.
Evidence: Backend 183 and 185 plus Dev 486 were already green; Dev 482, RDM 301, Frontend 73, and Dev 488 remain open and are not marked merged.
Impact: proposal status only. No implementation or deployment claim changes.
Refs: docs/proposals/2026-10-12-service-restart-data-recovery.md, docs/proposals/2026-10-12-svc-unified-deploy-and-login-key.md, docs/proposals/2026-10-11-rdm-two-trees-trace-audit-integration.md
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 15:40:45 +00:00
weichen 733f32c671 Merge pull request 'Record D1-D3 deploy remediation' (#88) from feature/recovery-d1-d3 into main
Why: the recovery plan needs the D1-D3 remediation record before the Dev pin moves.
Evidence: repository has no .gitea workflow; combined status has zero checks. Diff is one recovery-plan section.
Impact: documents only.
Refs: #88
2026-10-12 15:07:07 +00:00
weichen 8d8600024d Record the approved progressive workbench design and implementation plan
Why: implement a simple workbench for nontechnical users under continuous authorization.

Evidence: current source audit and the reviewed r0.1 prototype; runtime verification remains pending.

Impact: design and plan only; task execution state stays in the Dev task card.

Refs: UI01-UI13 and the existing fast-slow display design r1.1.
2026-10-12 15:03:27 +00:00
weichenandCursor cb7e25439a Record D1-D3 deploy remediation on the recovery plan
Why: the 2026-10-12 batch-update failure still had identity, rollback, and real-combo gaps after Dev #474, Backend #180, and RDM #276. The recovery plan is the single record for that work, and the rdmcand data-ownership check needed a written result before any restore.
Evidence: read-only queries on runtime-backups/{dev,rdm1,rdmcand}/20261012T133921Z and the matching domain backups. No business rows were moved.
Impact: adds r3.1 sections D1/D2/D3 and the ownership finding that dev conversations predate rdmcand's use of dev/data, so no cross-instance restore is indicated. r3's earlier unapproved text stays unapproved.
Refs: Dev feature/svc-d1-identity-flow; Backend feature/d1-identity-open
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 13:47:46 +00:00
weichen 3cc6438030 Merge pull request 'Revise svc account durability and recovery plans (r2/r3)' (#87) from feature/svc-account-durability-plan into main
Reviewed-on: https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/87
2026-10-12 12:18:24 +00:00
weichen 0952b50aef Merge pull request 'Add fast-slow channel display design r1.1 and U1 plan' (#84) from feature/fast-slow-display-design into main
Reviewed-on: https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/84
2026-10-12 12:16:07 +00:00
weichen 9c31d3c308 Merge Documents main into account durability plan branch
Why: keep r2/r3 proposal updates rebase-friendly before PR.
Evidence: origin/main at fetch time.
Impact: Documents feature tip includes latest main.
Refs: feature/svc-account-durability-plan
2026-10-12 12:11:40 +00:00
weichen b8319d24f2 Merge pull request 'Record U7 capacity window SELF report and plan r2.1' (#86) from feature/u7-capacity-window-report into main 2026-10-12 12:07:26 +00:00
weichenandCursor dbdec82466 Record U7 capacity window SELF report and plan r2.1
Why: Capacity ladder/60m/2h dual-instance windows finished; planning
progress must reflect SELF-pass vs remaining GATE/REPLAY/C3 gaps.
Evidence: SELF load results summarized in the new capacity report.
Impact: Preferred next becomes independent REPLAY or C3/C4/C5.
Refs: Dev feature/u7-capacity-wrap-measure; release-multi-instance.md

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 12:07:12 +00:00
weichen ebf655c4d7 Merge Documents main into fast-slow display design branch
Why: Dev #451 cannot pin modules/documents while feature tip and main diverge.
Evidence: merge-tree reports submodule conflict 1048e7c vs 9e4ee27.
Impact: Documents #84 tip includes main@1048e7c plus r1.1/U1 plan.
Refs: Dev PR #451; Documents PR #84
2026-10-12 12:07:02 +00:00
weichen fe8d08be21 Record the final baseline and isolated candidate data
Why: distinguish timed observations from current service ownership.

Evidence: SELF task-sync and read-only observations at 18:14 Beijing time.

Impact: planning metadata only; runtime and component deployment unchanged by this task.

Refs: account r2; recovery r3
2026-10-12 10:16:32 +00:00
weichen dca4265e37 Plan stable accounts and durable service recovery
Why: account help, dev credential writes and crash recovery need a current, reviewable contract.

Evidence: SELF source and sanitized runtime observations; seven document review lenses; business and fault validation NOT_RUN.

Impact: revise two planning documents only; preserve prior approvals and mark additions pending review.

Refs: Dev feature/svc-account-durability-plan; account r2; recovery r3
2026-10-12 10:09:49 +00:00
weichen 1048e7c6af Merge pull request 'Propose RDM function implementation plan r1' (#85) from feature/rdm-function-plan-r1 into main 2026-10-12 09:29:03 +00:00
weichen a183e663de Propose RDM function implementation plan r1
Why: 2026-10-12 全系统核对产出的功能/实现矩阵与 U1-U9 整改方案需入仓评审;独立文件已过期于共享门禁解除。
Evidence: 报告含冻结源码/运行时快照与逐条需求索引;发布补记记录冻结后部署时序与 U2 已合入切片(RDM PR #251/#254/#256/#258)。
Impact: 仅新增 docs/proposals 一份方案与 README 入口;不改代码与既有文档。
Refs: RDM docs/requirements V2.2、Documents 2026-10-11-rdm-final-target-completion.md
2026-10-12 09:28:44 +00:00
weichen 9e4ee27c7e Mark fast-slow U1 plan approved for implementation
Why: User authorized stage-5 start; record plan status for executors.
Evidence: Chat authorization "开始"; no runtime tests.
Impact: Documents proposal status only.
Refs: 2026-10-12-fast-slow-channel-display-u1-plan.md
2026-10-12 07:39:03 +00:00
weichen 5b71525818 Merge Documents main into fast-slow display design branch 2026-10-12 07:33:22 +00:00
weichenandCursor f9d96dfc59 Add fast-slow display design r1.1 and U1 plan
Why: Record approved stage-4 design with R03 splits and U1 exit
whitelist, plus stage-5 U1 implementation plan for review.
Evidence: Document edits only; no runtime verification.
Impact: Documents proposals INDEX; no business code.
Refs: feature/fast-slow-display-design

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 07:31:46 +00:00
weichen 8d0810bd35 Merge pull request 'Update collab storage plan progress to r2 after U1-U7' (#83) from feature/u7-capacity-wrap-progress into main
Merge pull request 'Update collab storage plan progress to r2 after U1-U7' (#83) from feature/u7-capacity-wrap-progress into main
2026-10-12 06:39:52 +00:00
weichenandCursor 2cec59016a Update collab storage plan progress to r2 after U1-U7
Why: Delivery requires writing planning progress back after U7
landed; the proposal still claimed U1+U2 start / NOT_RUN.
Evidence: SELF doc edit against archived U7 cards and release
checklist A1-A7/B1 facts.
Impact: Readers see code-done vs capacity-window-pending; adds
HTTP multi-instance vs Manager-test lesson.
Refs: Dev feature/u7-capacity-wrap-measure; release-multi-instance.md

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 06:39:26 +00:00
weichen 52bf525ef8 Merge pull request 'Add svc unified deploy and one-time login key proposal r1' (#79) from feature/svc-unified-deploy-login-key into main
Reviewed-on: https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/79
2026-10-12 05:27:00 +00:00
weichen 9d9b1523c8 Merge Documents main into svc unified-deploy proposal branch
Why: Dev #422 conflicted on modules/documents gitlink after main advanced past the proposal pin.
2026-10-12 05:26:12 +00:00
weichen bd5fb18519 Merge pull request 'Record GenUI prod-acceptance action fixes on the usage guide' (#82) from feature/genui-fix-action-params into main 2026-10-12 04:17:15 +00:00
weichen e39d327850 Record GenUI prod-acceptance action fixes on the usage guide
Why: Capture nil-card panic and intent data-flatten field fixes found
during local prod acceptance without revising the final closure verdict.
Evidence: Backend#173 #174; prod action checklist
Impact: Field-fix log lists the two hotfixes and their PRs.
Refs: GenUI prod deploy; fix track
2026-10-12 04:17:07 +00:00
weichen 262d467362 Merge pull request 'Note Generative UI prod instance acceptance on the usage guide' (#81) from feature/genui-prod-deploy-note into main 2026-10-12 04:09:06 +00:00
weichen 66ddd37870 Note Generative UI prod instance acceptance on the usage guide
Why: Record that the known-boundary production deploy/acceptance ran
on the local prod svc instance with auth and PG.
Evidence: scripts/svc.sh prod list; acceptance API checklist
Impact: Usage guide boundary list no longer says deploy is pending.
Refs: GenUI prod deploy task
2026-10-12 04:08:58 +00:00
weichen 1fe5b73491 Merge pull request 'Approve Generative UI auto-trigger opt-in design' (#80) from feature/genui-auto-trigger-optin into main 2026-10-12 03:46:28 +00:00
weichenandCursor 16cafca00c Approve Generative UI auto-trigger opt-in design
Why: Capture the fixed opt-in/budget/anti-self-trigger decisions and
update the usage guide boundary list.
Evidence: proposal r1 status approved
Impact: Authority for backend auto-present implementation.
Refs: plan GenUI boundaries T2/T3

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 03:46:26 +00:00
weichenandCursor 7df7d786d0 Record r1 approval for svc unified deploy proposal
Why: user approved the proposal and U1/U4 specs and authorized push/PRs
plus U1/U4 implementation start.
Evidence: SELF conversation approval 2026-10-12; implementation still NOT_RUN.
Impact: planning status only.
Refs: docs/proposals/2026-10-12-svc-unified-deploy-and-login-key.md

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 03:32:55 +00:00
weichen 3e68448f11 Merge pull request 'Record the admin-zone partition delivery in the two-trees plan (WP3-I3)' (#78) from feature/adminzone-plan-progress into main 2026-10-12 03:28:53 +00:00
weichenandCursor 923537e9a1 Add svc unified deploy and one-time login key proposal r1
Why: capture the reviewed design for binary/source install, env prep,
and passwordless activation via one-time restricted sessions.
Evidence: SELF source review against Dev af9c2de; implementation NOT_RUN.
Impact: Documents planning index only; no runtime change.
Refs: docs/proposals/2026-10-12-svc-unified-deploy-and-login-key.md

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 03:28:37 +00:00
weichen 0b314e2029 Record the admin-zone partition delivery in the two-trees plan progress
Why: policy requires updating applicable plan progress on task
completion; WP3-I3 landed the admin-zone entrance via the generic
declaration mechanism.
Evidence: Dev PR #414 and live verification comment (R5, SELF).
Impact: progress line of 2026-10-11-rdm-two-trees-trace-audit-integration.md only.
Refs: WP3-I3/KTD4.
2026-10-12 03:24:50 +00:00
weichen 62da617648 Merge pull request 'Approve B-class allowlist for help and intent actions' (#77) from feature/genui-bclass-help-intent into main 2026-10-12 03:23:27 +00:00
weichenandCursor 7fbfad1851 Approve B-class allowlist for help and intent actions
Why: Record the independent U5-style review for the first two B-class
surface actions and update the usage guide allowlist note.
Evidence: proposal r1 status approved; usage doc API table updated.
Impact: Documents authority for backend whitelist implementation.
Refs: U5 action-scope r2; plan GenUI boundaries 2026-10-12

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 03:19:03 +00:00
weichen b680142586 Merge pull request 'Add the Generative UI usage guide and U1-U6 evaluation record (final)' (#76) from feature/generative-ui-u7 into main 2026-10-12 02:47:50 +00:00
weichen 877d0683cd Add the Generative UI usage guide and U1-U6 evaluation record (final)
Why: The direction closes at U7 - the master record needs its
companion usage guide (enable/generate/revise/act/disable for owners)
and the combined evaluation record covering every landed increment
with its evidence chain and known boundaries.

Evidence: Live E2E on dev@b634a27 (real MiniMax-M3): progress page
presented autonomously, conversation surfaces=2, project aggregation
returns cross-conversation pages under the owner scope; receipts in
Dev task feature/generative-ui-u7-acceptance.

Impact: Documents-only (new guide + index closeout).

Refs: r2 master record; U5 scope r2; Dev task
feature/generative-ui-u7-acceptance
2026-10-12 02:47:27 +00:00
weichen b5dceb5e47 Merge pull request 'Add the service restart and recovery proposal r2 with two review rounds' (#75) from feature/service-restart-recovery-plan into main
Reviewed-on: https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/75
2026-10-12 02:02:12 +00:00
weichen da59ccff04 Track the merged svc-autorecover outcome in the review record and index
Why: between the review round and the approval decision another session completed and merged svc-autorecover (PR #396/#400/#401/#402), so the (a)-decision tracking must reflect the landed slice and the remaining U2 delta.

Evidence: SELF - merged main history c622372 and archived card .task/archive/feature-svc-autorecover.md (10/10 tests, 146/146 governance, CI green on e0b49d1).

Impact: review record, INDEX; proposal r2 body unchanged.

Refs: PR #396 #401
2026-10-12 01:29:31 +00:00
weichen 5a807933c2 Record the r2 approval and the svc-autorecover vehicle decision
Why: the human gate resolved on 2026-10-12 - r2 approved (five stages at once) and option (a) adopted; the review record, proposal index and status navigation must reflect it.

Evidence: SELF - user decision relayed in conversation; stage-review details in the Dev task card; proposal r2 body unchanged (SHA256 9cfda252...).

Impact: review record, INDEX entry; no plan content change.

Refs: Dev task card .task/feature-service-restart-recovery-plan.md
2026-10-12 01:26:50 +00:00
weichen 71cd9d1db2 Record the post-sync drift check and svc-autorecover in-flight findings in the review record
Why: the reviewer record must reflect that all r2 gap claims hold at the post-sync backend pin 25fbea85, and that the svc-autorecover ownership decision now has 373 lines of unregistered, partially failing in-flight work to weigh.

Evidence: SELF - drift-check receipt in the Dev task card (exit 0, all cited gaps hold); svc-autorecover suite observed 5 of 10 tests failing on 2026-10-11.

Impact: review record addendum only; proposal r2 (SHA256 9cfda252...) unchanged.

Refs: Dev task card .task/feature-service-restart-recovery-plan.md
2026-10-11 16:51:54 +00:00
weichen cbc64eb8ab Revise the recovery proposal to r2 with external review findings
Why: absorb the external source-review round - pin the shutdown budget change, close the U1 acceptance gap for program/cwd changes, gate U4 public states on a mapping table, and make the svc-autorecover coordination an explicit human decision.

Evidence: SELF - external review round 2 in the review record; r2 SHA256 9cfda2520b913e6966c68fb3f66fb7bc8382a8f7a2b69cb364122216dcdb72cd; all reviewed claims re-verified against the pinned baselines.

Impact: documents only; four targeted amendments (U1/U3/U4/section 9) plus version bump and INDEX update; requirements and metrics unchanged.

Refs: Dev task card .task/feature-service-restart-recovery-plan.md
2026-10-11 16:45:09 +00:00
weichen 54fc24e4d5 Add the service restart and recovery proposal r1 with review record
Why: pin the reviewed candidate as a fixed git object before human review (external review P1.1); untracked drafts made check-evidence report unverified.

Evidence: SELF - proposal SHA256 cfc9b768a4596a268810e20101cddc2a6040e24a640e6e34dbda17b838cd45ed matches the review record; source baseline Dev 5e57029b, Backend eb12f102, Core 89f3906c, Frontend aaced879, Documents 23e2276.

Impact: documents repo only; adds proposal r1, six-lens review record and INDEX entry; no implementation, NOT_RUN statuses preserved.

Refs: Dev task card .task/feature-service-restart-recovery-plan.md
2026-10-11 16:42:23 +00:00
weichen 23e2276905 Merge pull request 'Mark U1-U5 implementation complete in the two-trees master plan' (#74) from feature/rdm-u5-closeout into main 2026-10-11 15:57:15 +00:00
weichen 2085447701 Record U5 progress and mark U1-U5 implementation complete in the master plan
Why: U5 landed via RDM PR #213 (merge 1dce69d); all five implementation units now complete.

Evidence: RDM PR #213 merged=True.

Impact: plan status + U5 progress + INDEX.

Refs: RDM PR #213
2026-10-11 15:57:13 +00:00
weichen 63d5986819 Merge pull request 'Record U4 progress in the two-trees master plan and index' (#73) from feature/rdm-u4-closeout into main 2026-10-11 15:07:57 +00:00
weichen 895a7204b9 Record U4 progress in the two-trees master plan and index
Why: U4 landed via Dev PR #368 (merge 7aa8fd9).

Evidence: Dev PR #368 merged; CI green.

Impact: status line + U4 progress + INDEX only.

Refs: Dev PR #368
2026-10-11 15:07:53 +00:00
weichen 2e1b39ea68 Merge pull request 'Record the user ruling to gate U6 on owner experience' (#72) from feature/generative-ui-u6-gate into main 2026-10-11 15:01:22 +00:00
weichen b6b6059222 Record the user ruling to gate U6 on owner experience
Why: The U6 precondition (benefit evidence from U4/U5) resolves to the
owner actually using the landed U1-U5 capability - the human usability
comparison marked NOT_RUN since U1 finds its execution path here; the
user ruled 2026-10-11 to evaluate first and decide U6 after.

Evidence: Ruling collected via the session question panel on
2026-10-11; U1-U5 all merged (Dev #329/#336/#345/#351/#367).

Impact: Documents-only (master record U6 gate note + index status).

Refs: r2 U6 clause; Dev task feature/generative-ui-u6-gate-record
EOF
)
2026-10-11 15:01:08 +00:00
weichen 75ddd65c69 Merge pull request 'Record the user approval of the U5 action scope' (#71) from feature/generative-ui-u5 into main 2026-10-11 14:09:47 +00:00
weichen aba1d6a3d6 Record the user approval of the U5 action scope
Why: The user ruled on the three questions (categories and ranges
approved as proposed; C-class limited to plugin KV plus task ledger;
confirm UX reuses the inline card); the proposal becomes the approved
scope and unblocks the U5 implementation task.

Evidence: Ruling collected via the session question panel on
2026-10-11; implementation task feature/generative-ui-u5 starts under
policy/delivery.md.

Impact: Documents-only (proposal r2 + index status).

Refs: r2 master record U5; Dev task feature/generative-ui-u5
EOF
)
2026-10-11 14:09:20 +00:00
weichen 72a098a783 Merge pull request 'Propose the U5 action scope for user review' (#70) from feature/generative-ui-u5-scope into main 2026-10-11 13:50:14 +00:00
weichen c7c5f94b64 Propose the U5 action scope for user review
Why: The r2 U5 clause requires a human review of the action scope
before implementation; this draft grounds the decision in the current
command inventory and existing safety machinery.

Evidence: Source facts cited inline (builtin command list with risk
levels, DangerHigh inline-confirm flow with pendingStore, audit
envelope) verified against backend main on 2026-10-11.

Impact: Documents-only (new proposal + index entry); no code changes.

Refs: 2026-10-10-generative-ui-plugin.md (r2 U5); Dev task
feature/generative-ui-u5-scope
2026-10-11 13:50:10 +00:00
weichen 74e41637e7 Merge pull request 'Record U3 progress in the two-trees master plan and index' (#69) from feature/rdm-u3-closeout into main 2026-10-11 13:40:15 +00:00
weichen a8f1096e78 Record U3 progress in the two-trees master plan and index
Why: U3 landed via RDM PR #201 (merge dbc41b6); the master record must reflect actual progress.

Evidence: SELF U3 closeout doc check exit 0 (receipt in Dev closeout task card).

Impact: proposal status line, U3 progress paragraph, INDEX row only.

Refs: RDM PR #201; Dev feature/rdm-u3-closeout
2026-10-11 13:40:12 +00:00
weichen eb36571653 Merge pull request 'Merge the template/final-target planning branch into the Documents main lineage' (#68) from feature/documents-reconcile-u2 into main 2026-10-11 13:10:50 +00:00
weichen 9cb09b967c Merge the template/final-target planning branch into main lineage
Why: Dev PR #340 pinned this Documents branch tip while it was never merged into Documents main (cross-repo pin discipline); this reconciliation unifies both planning lineages.

Evidence: merge-base 2a5f658; INDEX conflict resolved as union (U1+U2 progress row + two new plan entries).

Impact: docs only.

Refs: Dev #340
2026-10-11 13:10:38 +00:00
weichen 559af219d9 Merge pull request 'Record U2 progress in the two-trees master plan and index' (#67) from feature/rdm-u2-closeout into main 2026-10-11 11:23:07 +00:00
weichen 1673f3cea6 Record U2 progress in the two-trees master plan and index
Why: U2 landed via RDM PR #197 (merge fe8a75b); delivery policy requires the master record to reflect actual progress at task completion.

Evidence: SELF U2 closeout doc check exit 0 (receipt in the Dev closeout task card); RDM PR #197 merged=True via API.

Impact: proposal status line, U2 progress paragraph, and INDEX row only.

Refs: RDM PR #197; Dev feature/rdm-u2-closeout
2026-10-11 11:22:59 +00:00
weichen 10b0dbe908 Merge the current Documents baseline and preserve both planning entries
Why: retain the newly merged RDM U1 progress alongside the final-target plan.

Evidence: resolved the single index conflict by keeping the updated U1 entry and both new plan links; diff check passed.

Impact: documentation merge only; business validation NOT_RUN.

Refs: docs/proposals/INDEX.md
2026-10-11 08:54:39 +00:00
weichen 6183e99cdb Plan full RDM delivery around shared projects and controlled documents
Why: reconcile the confirmed project, privacy and duty rules with all approved product requirements.

Evidence: current RDM d8d7e743 source review, recorded source receipt, and exact 34 UR/68 SR/10 F matrix checks; business validation NOT_RUN.

Impact: reviewed planning documents only, covering all 69 template types and the existing XLSX asset; no runtime changes.

Refs: docs/proposals/2026-10-11-rdm-final-target-completion.md
2026-10-11 08:54:07 +00:00
weichen 2a5f658d25 Merge pull request 'Record U1 progress in the two-trees master plan and index' (#66) from feature/rdm-u1-closeout into main 2026-10-11 08:44:37 +00:00
weichen 6efdd7dbc7 Record U1 progress in the two-trees master plan and index
Why: U1 landed via RDM PR #195 (merge 05b7d1a); delivery policy requires the master record to reflect actual progress at task completion.

Evidence: SELF closeout doc check exit 0 (receipt in the Dev closeout task card); RDM PR #195 merged=True via API.

Impact: proposal status line, U1 progress paragraph, and INDEX row only; no scope or requirement change.

Refs: RDM PR #195; Dev feature/rdm-u1-closeout
2026-10-11 08:44:18 +00:00
weichen 90f73ba4e8 Record the confirmed pilot documents and full-catalog direction
Why: preserve the user decision from the previous planning turn before expanding scope.

Evidence: r1.1 records the explicit user response; prior documentation-check receipt is in the Dev task card.

Impact: planning metadata only; no business changes.

Refs: docs/proposals/2026-10-11-rdm-template-dialog-generation.md
2026-10-11 08:39:47 +00:00
weichen 99a54ed340 Merge pull request 'Document the storage-migrate tool and the switch/drill runbook (U4)' (#65) from feature/collab-storage-u4-migrator into main 2026-10-11 08:30:00 +00:00
weichen ca9b128f18 Document the storage-migrate tool and the switch/drill runbook (U4)
Why: U4 ships the managed migration entry; the runbook is the operator-facing contract for inventory/backup/migrate, migration identity and resume rules, verification semantics, and the authorized-window switch sequence.

Evidence: backend branch feature/collab-storage-u4-migrator - integration tests green against real PostgreSQL (idempotent rerun, resume, foreign-data refusal, wrong-snapshot refusal, unknown-owner block).

Impact: docs only.

Refs: proposals/2026-10-11-collaboration-storage-and-distribution.md U4 and section 6.
2026-10-11 08:29:38 +00:00
weichen db6daafde4 Plan template-driven document generation through project conversations
Why: connect the existing RDM assets and two-trees model to a reviewable document workflow.

Evidence: source inventory at RDM 0081628a; document structure and local link checks recorded as SELF in the Dev task card; business validation NOT_RUN.

Impact: planning and inventory documents only; no implementation or deployment.

Refs: docs/proposals/2026-10-11-rdm-template-dialog-generation.md
2026-10-11 08:23:53 +00:00
weichen 5ac58dcd7e Merge pull request 'Document the execution budget settings and the KTD13 action-authz compat plan' (#64) from feature/collab-storage-u3-budget-authz into main 2026-10-11 05:16:45 +00:00
weichen 0be6c2d3ee Document the execution budget settings and the KTD13 action-authz compat plan
Why: U3 slice 2 ships admission budgets (runtime.* keys, lease semantics, yield/reacquire) and the host-side action matrix; the runbook is the single source for operators and records the versioned public-contract plan KTD13 requires.

Evidence: backend branch feature/collab-storage-u3-budget-authz (admission.go, action matrix in server.go) with admission/matrix tests green.

Impact: docs only.

Refs: proposals/2026-10-11-collaboration-storage-and-distribution.md KTD13/R8, section 5 U3.
2026-10-11 05:15:49 +00:00
weichen d3e40c783d Merge pull request 'Publish the approved two-trees traceability plan r1 with user rulings' (#63) from feature/rdm-two-trees-audit-plan into main 2026-10-11 04:43:31 +00:00
weichen 76f49b2bc7 Merge authoritative main into the task branch
Why: branch protection requires the head to contain the current base before merge.

Evidence: fetched origin/main=336a90f0ade0ffe049879ca5159a61f0a3948708.

Impact: integrate upstream changes without rewriting task history.

Refs: Documents PR #63
2026-10-11 04:43:23 +00:00
weichen 336a90f0ad Merge pull request 'Revise the Generative UI proposal to r2 with the U1 trial results' (#62) from feature/generative-ui-u1 into main 2026-10-11 04:42:48 +00:00
weichen b857595025 Publish the approved two-trees traceability plan r1 with user rulings
Why: the user reviewed and approved the plan (2026-10-11, five stages bundled) and chose a two-tier admin model for KTD4 instead of strict ledger separation.

Evidence: SELF user session rulings recorded in the Dev task card; document-check receipt follows in the task card evidence section.

Impact: proposal r1 and INDEX now record approval and the two-tier admin ruling; no code or deployment change.

Refs: Dev feature/rdm-two-trees-audit-plan
2026-10-11 04:41:29 +00:00
weichen b3171b3d51 Plan RDM project traceability and audit integration
Why: assess existing two-tree and trace-network capabilities and define project-scoped inspection.

Evidence: SELF source receipt and document checks; business and runtime verification were not run.

Impact: pending-review proposal and index only; no product implementation or deployment.

Refs: Dev feature/rdm-two-trees-audit-plan
2026-10-11 04:02:38 +00:00
164 changed files with 21332 additions and 95 deletions
+150
View File
@@ -0,0 +1,150 @@
name: governance
on:
pull_request:
push:
branches: [main]
jobs:
governance:
runs-on: ubuntu-latest
env:
GOPROXY: https://goproxy.cn,direct
steps:
- name: Checkout
env:
TOKEN: ${{ secrets.GITHUB_TOKEN }}
SUBMODULE_TOKEN: ${{ secrets.SUBMODULE_TOKEN }}
run: |
set -euo pipefail
# 只物化两个治理 gitlink(Guidelines 与 deps/development-manager),非递归;
# 其它 gitlink 不物化、不取回。凭据只以 URL 限定的 extraheader 存在于本进程树内。
python3 - <<'PY_CHECKOUT'
import os
from pathlib import Path
import re
import subprocess
import sys
from urllib.parse import urlsplit
# 服务端基址取运行器注入的 GITHUB_SERVER_URL(平台控制、候选 PR 不可影响)。
SERVER = os.environ.get("GITHUB_SERVER_URL", "").rstrip("/")
parsed_server = urlsplit(SERVER)
if parsed_server.scheme not in {"http", "https"} or not parsed_server.netloc:
sys.exit("Checkout server must be the platform-injected http(s) URL")
SSH = "ssh://git@gitea.naitangbaobao.cn:52222/weichen/"
# 审查过的白名单,独立于候选 .gitmodules:仅列出两个治理 gitlink。
REPOSITORIES = {
"deps/development-guidelines": "Development-Guidelines",
"deps/development-manager": "Development-Manager",
}
TARGET = "weichen/Agent-System-Documents"
root_token = os.environ.pop("TOKEN", "")
component_token = os.environ.pop("SUBMODULE_TOKEN", "")
if not root_token or not component_token:
sys.exit("Checkout requires TOKEN and SUBMODULE_TOKEN")
if os.environ.get("GITHUB_REPOSITORY") != TARGET:
sys.exit("Checkout repository is outside the reviewed allowlist")
sha = os.environ.get("GITHUB_SHA", "")
if not re.fullmatch(r"[0-9a-fA-F]{40}", sha):
sys.exit("Checkout requires a fixed commit SHA")
# 丢弃继承的 Git 追踪/配置/SSH 钩子;凭据只存在于单个 Git 进程树的精确 URL 头中。
clean_env = {k: v for k, v in os.environ.items() if not k.startswith("GIT_")}
clean_env.update(GIT_CONFIG_NOSYSTEM="1", GIT_CONFIG_SYSTEM="/dev/null",
GIT_CONFIG_GLOBAL="/dev/null", GIT_TERMINAL_PROMPT="0")
config = {
"core.hooksPath": "/dev/null", "core.fsmonitor": "false",
"init.templateDir": "", "credential.helper": "",
"fetch.recurseSubmodules": "false", "submodule.recurse": "false",
"http.followRedirects": "false", "protocol.allow": "never",
"protocol." + urlsplit(SERVER).scheme + ".allow": "always",
}
def git(repo, *args, extra=None):
values = config | (extra or {})
env = clean_env | {"GIT_CONFIG_COUNT": str(len(values))}
for index, (key, value) in enumerate(values.items()):
env[f"GIT_CONFIG_KEY_{index}"] = key
env[f"GIT_CONFIG_VALUE_{index}"] = value
return subprocess.run(["git", "-C", str(repo), *args], env=env,
check=True, stdout=subprocess.PIPE).stdout
def materialize_governance(root):
# -r 列出任意深度的 gitlink,但不进入 submodule 内部;其它 gitlink 只记录、从不取回。
links = {}
for entry in git(root, "ls-tree", "-rz", "HEAD").split(b"\0"):
if not entry:
continue
metadata, path = entry.split(b"\t", 1)
mode, kind, commit = metadata.decode().split()
if mode == "160000":
links[path.decode()] = commit
for name in REPOSITORIES:
if name not in links:
raise ValueError("Governance gitlink is missing from the fixed commit")
raw = git(root, "config", "--no-includes", "--blob", "HEAD:.gitmodules", "--null", "--list")
entries = {}
for item in raw.split(b"\0"):
if not item:
continue
key, value = item.decode().split("\n", 1)
match = re.fullmatch(r"submodule\.(.+)\.(path|url)", key)
if not match:
continue
name, field = match.groups()
if name not in REPOSITORIES:
continue
if field in entries.setdefault(name, {}):
raise ValueError("Duplicate candidate .gitmodules setting")
entries[name][field] = value
# 先整体校验两个治理条目,再进行任何带凭据的取回。
for name, repository in REPOSITORIES.items():
fields = entries.get(name, {})
if fields.get("path") != name:
raise ValueError("Governance submodule path is outside the reviewed allowlist")
trusted_url = f"{SERVER}/weichen/{repository}.git"
if fields.get("url") not in {SSH + repository + ".git", trusted_url}:
raise ValueError("Governance submodule URL is outside the reviewed allowlist")
for name, repository in REPOSITORIES.items():
url = f"{SERVER}/weichen/{repository}.git"
# 仅持久化审查过的公开 URL,使 Git 在进程级配置消失后仍识别该 submodule。
git(root, "config", f"submodule.{name}.url", url)
git(root, "submodule", "update", "--init", "--checkout", "--", name,
extra={f"submodule.{name}.url": url,
f"submodule.{name}.update": "checkout",
f"http.{url}.extraheader": "AUTHORIZATION: token " + component_token})
child = root / name
if git(child, "rev-parse", "HEAD").decode().strip() != links[name]:
raise ValueError("Materialized governance gitlink does not match the fixed SHA")
try:
root = Path.cwd()
# 必须是干净的临时工作区;不复用既有 Git 状态。
if (root / ".git").exists():
raise ValueError("Checkout requires a fresh workspace")
git(root, "init", "-q")
url = f"{SERVER}/{TARGET}.git"
git(root, "remote", "add", "origin", url)
git(root, "fetch", "--depth=1", "origin", sha,
extra={f"http.{url}.extraheader": "AUTHORIZATION: token " + root_token})
git(root, "checkout", "-q", "--detach", "FETCH_HEAD")
materialize_governance(root)
except (ValueError, OSError, subprocess.CalledProcessError) as error:
sys.exit(f"Checkout refused: {error}")
print("Checkout complete; credentials were not persisted in Git configuration")
PY_CHECKOUT
unset TOKEN SUBMODULE_TOKEN
- name: Install Go 1.27.1
run: |
set -euo pipefail
curl -fsSL -o "$RUNNER_TEMP/go.tgz" https://mirrors.aliyun.com/golang/go1.27.1.linux-amd64.tar.gz
tar -C /usr/local -xzf "$RUNNER_TEMP/go.tgz"
ln -sfn /usr/local/go/bin/go /usr/local/bin/go
ln -sfn /usr/local/go/bin/gofmt /usr/local/bin/gofmt
- name: Validate agent execution configuration
run: scripts/agent-exec validate --repo .
- name: Governance check
run: scripts/dm governance check --repo .
+6
View File
@@ -0,0 +1,6 @@
[submodule "deps/development-guidelines"]
path = deps/development-guidelines
url = ssh://git@gitea.naitangbaobao.cn:52222/weichen/Development-Guidelines.git
[submodule "deps/development-manager"]
path = deps/development-manager
url = ssh://git@gitea.naitangbaobao.cn:52222/weichen/Development-Manager.git
@@ -0,0 +1,57 @@
# Agent-System-Documents 采纳 development-governance-v2 治理套件 任务卡
任务主记录:[Agent-System-Documents PR #110](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/110)(本文件随 PR 描述维护)。
状态:已完成(闭合随本 PR 合入;合入以平台记录为准);owner:weichen。
## 基线与授权
- 权威仓:weichen/Agent-System-Documents;root_target:main;immediate_target:main
- branch_kind:initiative;initiative_id:governance-adoption-Agent-System-Documents
- R0(initial_main_sha):da4d016ee1dee6a418411ed0f8b45911fe9aab02;工作区:/home/weichen/projects/Agent-System-Documents-wt-feature-governance-adoption(worktree);分支:feature/governance-adoption
- 父任务信息(仅子任务填写):无
- accepting_requirements:false(单仓采纳 initiative,范围固定为下列十步,不接收新需求)
- 需求分流:verdict=NEW;selected_initiative=无;候选=无;理由=development-governance-v2 Phase 6 每个正式仓库独立 initiative;triage 收据=无(本仓采纳前尚无 triage 入口)
- 授权与交付终点:owner 已授权 development-governance-v2 全部实施(Agent-System-Dev 主记录 docs/superpowers/plans/2026-10-16-development-governance-v2-master.md);终点为本 PR 合入 main 且采纳状态 active。分支保护与 tag 由用户执行。
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md;外部 Agent 一单元一新进程/会话/工作区)
## 目标与非目标
目标(Phase 6 十步):固定 Guidelines SHA(deps/development-guidelines @ 2688fd2be6a52c0bf110e7e6366b6f291ab5e4eb);增加 AGENT-EXECUTION.md;增加共享执行器薄入口(deps/development-manager @ bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c + scripts/dm、scripts/agent-exec、scripts/task);四条路由(implementation/repair/test/review);任务卡模板与分支元数据;CI 中启用 schema 校验(.gitea/workflows/governance.yml:agent-exec validate + governance check);一次正例运行;负例(缺配置、坏收据、越界路径、未知副作用);独立 Review + CI;采纳状态 active。
非目标:不改业务代码与既有测试;不改分支保护(由用户执行);不发布 tag。
引导说明:AGENT-EXECUTION.md 由 host 以固定版本治理套件(dm-server governance init @ bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c)生成并作为引导配置提交(执行器运行前必须存在有效配置;沿用 DM 采纳先例);其余文件由实施单元生成。
## Agent 实施收据
| 单元 ID | 预期范围 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|---|---|---|---|---|---|---|---|---|---|
| governance-adoption-Agent-System-Documents-r1 | 13 个允许路径(治理文件 + 两个 gitlink) | | implementation | cursor→antigravity→pi | run 3a6bdcf3(dm-server pinned,attempts=1) | cursor / not-observable | failed-unknown | 无(apply 快进) | 否 | /tmp/gov-receipt-Agent-System-Documents-r1.json |
| 对账(r1) | 规范 worktree 仍为 d259242 且干净;无 transport ref。worker 自报外部副作用:并行 worker 共用固定文件 /tmp/gov-scratch-path.txt 记录 scratch 路径,该文件被覆盖后误删非本单元创建的仓外临时目录 /tmp/tmp.2FlZqPmOJM(不可恢复;各单元私有工作区不在该路径,已完成单元收据均为 success) | — | — | — | — | — | failed-unknown 对账完成;单元包追加禁止固定共享 /tmp 路径约束后全新运行 r2 | — | — | — |
| governance-adoption-Agent-System-Documents-r2 | 13 个允许路径(治理文件 + 两个 gitlink) | cf44b1ed | implementation | cursor→antigravity→pi | run 8348cbe4(dm-server pinned,attempts=1) | cursor / not-observable | success | fd13a266777b(apply 快进) | 否 | /tmp/gov-receipt-Agent-System-Documents-r2.json |
| governance-adoption-Agent-System-Documents-repair-r1 | PROJECT.md、policy/guidelines-adoption.md | repair | cursor→antigravity→pi | run cddbee35(attempts=1) | cursor / not-observable | success | 31daf7f76493(apply 快进) | 否 | /tmp/gov-receipt-Agent-System-Documents-repair-r1.json |
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at | 结果 |
|---|---|---|---|---|
| 启动 | da4d016ee1dee6a418411ed0f8b45911fe9aab02 | da4d016ee1dee6a418411ed0f8b45911fe9aab02 | 2026-10-17T07:16:27Z | 一致 |
| 请求审核 | da4d016ee1dee6a418411ed0f8b45911fe9aab02 | 6a1308c2510e | 2026-10-17T08:47:50Z | 已含 origin/main |
## 结果与验证(完成后填写)
- 结果:治理套件已采纳——Guidelines 与 Development-Manager gitlink 固定、AGENT-EXECUTION.md 四条路由、共享执行器薄入口、pre-commit admit、governance CI;采纳状态 active 随本 PR 合入生效。
- 验证:见下表(命令输出由 /tmp/gov-neg/ev.sh 写入 .task/evidence/governance-adoption/,SELF 除非另注)。
- 复现:正负例脚本冻结副本 Agent-System-Dev `docs/superpowers/plans/evidence/governance-adopt-cases.py`(sha256 3aa1bf6ea1cd48f3f59c0a307620e4112389a93fe21a113006f54e62eb8f0d06),用法 `python3 governance-adopt-cases.py <仓库根>`;它经本仓 `scripts/agent-exec` 运行假 CLI,不访问网络。
- 影响与剩余项:不改业务代码;本地启用钩子需由人执行 `git config core.hooksPath scripts/hooks`;将 governance 检查设为分支保护必需项属用户双钥匙事项(命令见 Agent-System-Dev 治理主记录)。
| 时间(UTC) | 命令 | 被测 HEAD | exit | 来源 | 摘要/位置 |
|---|---|---|---|---|---|
| 20261017T074046Z | `scripts/dm governance check --repo .` | fd13a266777b | 0 | SELF | ok fixtures;[输出](../evidence/governance-adoption/00-20261017T074046Z.log) sha256:0ff0ec3150c5162e |
| 20261017T074046Z | `scripts/agent-exec validate --repo .` | fd13a266777b | 0 | SELF | validate: ok;[输出](../evidence/governance-adoption/01-20261017T074046Z.log) sha256:7ba43b8b1d0ee152 |
| 20261017T074046Z | `python3 /tmp/gov-neg/adopt_cases.py .` | fd13a266777b | 0 | SELF | [verdict] ALL PASS cases=5;[输出](../evidence/governance-adoption/02-20261017T074046Z.log) sha256:b63c5ee476cd94f5 |
| 20261017T084129Z | `scripts/dm governance check --repo .` | 31daf7f76493 | 0 | SELF | ok fixtures;[输出](../evidence/governance-adoption/03-20261017T084129Z.log) sha256:809536ab8a8d1caa |
| 20261017T084129Z | `scripts/agent-exec validate --repo .` | 31daf7f76493 | 0 | SELF | validate: ok;[输出](../evidence/governance-adoption/04-20261017T084129Z.log) sha256:3d3cf541ce4c6560 |
| 2026-10-17T08:47:50Z | CI `governance / governance (pull_request)` | 6a1308c2510e | 0 | GATE | success;[运行](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/actions/runs/3593/jobs/5686) |
| — | 候选 HEAD CI | 9d4582a47f4f | 0 | GATE | success governance / governance (pull_request)=success(/weichen/Agent-System-Documents/actions/runs/3611/jobs/5709) |
| — | 独立 Review | 9d4582a47f4f | 0 | REPLAY | cursor-agent-stable --mode ask 全新只读会话(fresh_session=true,session id not-observable)闭合重审 VERDICT: APPROVE(对象 9d4582a,与 HEAD 仅 .task/ 不同) |
@@ -0,0 +1,19 @@
command: scripts/dm governance check --repo .
cwd: /home/weichen/projects/Agent-System-Documents-wt-feature-governance-adoption
head: fd13a266777b4c794acb879190c49ee980db38af
exit: 0
utc: 20261017T074046Z
---
ok gitlink deps/development-guidelines
ok gitlink deps/development-manager
ok agent-execution
ok file AGENTS.md
ok file PROJECT.md
ok file policy/guidelines-adoption.md
ok file .task/templates/task-card.md
ok executable scripts/agent-exec
ok executable scripts/hooks/pre-commit
ok executable scripts/dm
ok executable scripts/task
ok adoption status
ok fixtures
@@ -0,0 +1,7 @@
command: scripts/agent-exec validate --repo .
cwd: /home/weichen/projects/Agent-System-Documents-wt-feature-governance-adoption
head: fd13a266777b4c794acb879190c49ee980db38af
exit: 0
utc: 20261017T074046Z
---
validate: ok
@@ -0,0 +1,13 @@
command: python3 /tmp/gov-neg/adopt_cases.py .
cwd: /home/weichen/projects/Agent-System-Documents-wt-feature-governance-adoption
head: fd13a266777b4c794acb879190c49ee980db38af
exit: 0
utc: 20261017T074046Z
---
[object] Agent-System-Documents-wt-feature-governance-adoption HEAD=fd13a266777b4c794acb879190c49ee980db38af
PASS positive-run-apply: run exit=0 terminal=success apply exit=0 head=876e934a0187
PASS missing-config: run exit=2 terminal=invalid-config validate exit=2
PASS bad-receipt: apply exit=4 head_unchanged=True msg=apply: no local integrity record: changed paths do not match the transport diff
PASS out-of-scope-path: run exit=5 terminal=scope-expansion transport=False
PASS unknown-side-effect: run exit=4 terminal=failed-unknown transport=False
[verdict] ALL PASS cases=5
@@ -0,0 +1,19 @@
command: scripts/dm governance check --repo .
cwd: /home/weichen/projects/Agent-System-Documents-wt-feature-governance-adoption
head: 31daf7f7649334ddcc385ce4ba46aaca88f2f3b5
exit: 0
utc: 20261017T084129Z
---
ok gitlink deps/development-guidelines
ok gitlink deps/development-manager
ok agent-execution
ok file AGENTS.md
ok file PROJECT.md
ok file policy/guidelines-adoption.md
ok file .task/templates/task-card.md
ok executable scripts/agent-exec
ok executable scripts/hooks/pre-commit
ok executable scripts/dm
ok executable scripts/task
ok adoption status
ok fixtures
@@ -0,0 +1,7 @@
command: scripts/agent-exec validate --repo .
cwd: /home/weichen/projects/Agent-System-Documents-wt-feature-governance-adoption
head: 31daf7f7649334ddcc385ce4ba46aaca88f2f3b5
exit: 0
utc: 20261017T084129Z
---
validate: ok
+31
View File
@@ -0,0 +1,31 @@
# feature/iam-u3-account-contract 任务卡
任务主记录:本文件随 PR 描述维护。
状态:已完成(合入前闭合);owner:weichen。PR:https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/115
## 基线与授权
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Documents.git;root_target:main;immediate_target:main
- branch_kind:standalone;accepting_requirements:false;跨仓总任务:Agent-System-Dev `feature/iam-u3-account-directory-recovery`([Dev PR #626](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/626) 已合入 `7716b28`)
- R0(initial_main_sha):1e036e9;工作区:/home/weichen/projects/Agent-System-Documents-wt-iam-u3-contract-merge;分支:feature/iam-u3-account-contract
- 授权与交付终点:用户 2026-10-18 授权按计划完成并清理 IAM 各线 worktree,U3 采用 merge_then_accept。回收 Dev U3 worktree 时发现 U3 已批准合同(Documents `c236d30` r1、`fb3a821` A1–A4 修订、`5783940` 委托投影真实操作者修订)只存在于该 worktree 的子模块元数据中,从未推送,也未进入 Documents main;本任务先把原分支推送到远端保全,再经 PR 合入 main。
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)。原分支缺 `AGENT-EXECUTION.md`,因此从 main 新建分支,由 worker 应用 `git merge-tree` 三方合并补丁并解决 `INDEX.md` 冲突;随后以 `merge -s ours` 并入原分支头 `3481253`(树不变),使已批准 SHA 可从 main 到达。
## 目标与非目标
- 目标:三份已批准合同正文按原文进入 `docs/proposals/`,`docs/proposals/INDEX.md` 收录 U3 条目并写明当前事实状态。
- 非目标:修改已批准正文;推进 Dev 的 Documents gitlink;部署或业务验收。
## Agent 实施收据
| 单元 ID | 预期范围 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|---|---|---|---|---|---|---|---|---|---|
| iam-u3-documents-contract-onto-main | docs/proposals/INDEX.md 与三份 2026-10-14-iam-u3-*.md | implementation | cursor, antigravity, pi | 1 | cursor-agent / auto(session not-observable,新进程) | success | apply 快进 1e036e9..08b8618 | 否 | /tmp/cleanup-20261018/render/u3-doc-contract-receipt.json |
| iam-u3-documents-contract-index-date-repair | docs/proposals/INDEX.md | repair | cursor, antigravity, pi | 1 | cursor-agent / auto(session not-observable,新进程) | success | apply 快进 08b8618..43f2fd4 | 否 | /tmp/cleanup-20261018/render/u3-doc-contract-repair-receipt.json |
## 结果与验证(完成后填写)
- 结果:三份合同正文与 INDEX 条目;修复单元把 Backend PR #198 的合入日期更正为 2026-10-14(Gitea API `merged_at` 核对)。
- 验证(SELF,host):三份正文的 blob 与 `origin/feature/iam-u3-account-contract` 逐一相同;`git diff --check` 通过;`merge -s ours` 前后树相同;`c236d30`、`fb3a821`、`5783940` 均为分支头祖先;Backend `v0.5.0` 经 `git ls-remote` 核对指向 `2716b9e`。
- Review:host 主模型对照原分支与 Gitea PR 元数据逐项核对 INDEX 事实,无阻塞项。
- 影响与剩余项:仅文档。Dev 的 Documents gitlink 未推进(非目标)。
@@ -0,0 +1,30 @@
# feature/regulations-kb-ext20-proposal 任务卡
任务主记录:本文件随 PR 描述维护。
状态:已完成(合入前闭合);owner:weichen。PR:https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/113
## 基线与授权
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Documents.git;root_target:main;immediate_target:main
- branch_kind:standalone;跨仓总任务:Agent-System-Dev `feature/regulations-kb`([Dev PR #614](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/614))
- R0(initial_main_sha):e2f5729;工作区:/home/weichen/projects/Agent-System-Documents-wt-feature-regulations-kb-u9;分支:feature/regulations-kb-ext20-proposal
- 授权与交付终点:用户 2026-10-18 /goal 指示按法规知识库计划实现全部内容;本任务登记 U9 的 EXT-20 扩展点提案(与 Backend `feature/regulations-kb-ext20` 实现一致),经 PR 合入 main。
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)。此前分支 `feature/regulations-kb-u9-contract` 上的提案由 host 直接撰写且未经准入钩子,作废不合入,收口时删除该远端分支。
## 目标与非目标
- 目标:`docs/proposals/2026-10-18-ext-20-regulations-provider.md` 与 `docs/proposals/INDEX.md` 收录条目;内容与 Backend 实现的公开符号逐一一致。
- 非目标:实现代码(Backend/KB/RDM 各自任务)。
## Agent 实施收据
| 单元 ID | 预期范围 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|---|---|---|---|---|---|---|---|---|---|
| documents-ext20-proposal | docs/proposals/2026-10-18-ext-20-regulations-provider.md、docs/proposals/INDEX.md | implementation | cursor, antigravity, pi | 1 | cursor-agent-stable / auto(session not-observable,新进程) | success | apply 快进 e4aa3c6..52d77f6 | 否 | /tmp/regkb-u9doc-receipt.json |
## 结果与验证(完成后填写)
- 结果:EXT-20 提案(场景、现有扩展点不可组合理由、全部公开符号与 DTO 字段、基座强制行为、兼容、验收映射、分工)与 INDEX 收录条目。
- 验证(SELF,host 于 52d77f6):`git diff --check` 通过;`scripts/dm governance check --repo .` ok。
- Review:host 主模型对照 Backend `pkg/extension/regulations.go`、`internal/app/regulations.go`(PR #212 合入 56a7f9f)逐项核对,无阻塞项。
- 影响与剩余项:仅文档。
+66
View File
@@ -0,0 +1,66 @@
# <任务标题> 任务卡
任务主记录:<Issue/PR 链接,或注明"本文件随 PR 描述维护">。
状态:<进行中 / 待审核 / 已合入 / 已放弃>;owner:<填写>。
## 基线与授权
- 权威仓:<仓 URL 或逻辑 ID>;root_target:main;immediate_target:<main 或 feature/initiative>
- branch_kind:<initiative | child | standalone>;initiative_id:<稳定 ID,普通任务为空>
- R0(initial_main_sha):<完整 SHA>;工作区:<路径>(worktree / clone);分支:<feature|fix|hotfix/...>
- 父任务信息(仅子任务填写):parent_branch=<父分支>;parent_head_sha=<SHA>;parent_pr=<父 PR>
- accepting_requirements:<true | false>(仅 initiative 可为 true;冻结后为 false)
- 需求分流:verdict=<JOIN | NEW>;selected_initiative=<分支或无>;候选=<分支@HEAD 列表或无>;理由=<不适配/适配依据>;triage 收据=<源码外路径与摘要>
- 授权与交付终点:<本次允许的动作与终点;未授权事项写明>
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md;外部 Agent 一单元一新进程/会话/工作区)
## 目标与非目标
<预期结果、受影响入口/模块/契约;明确不做什么。>
## Agent 实施收据
按根目录 AGENT-EXECUTION.md 路由;外部 Agent 一单元一新进程/会话/隔离工作区。实施、修复与测试必须通过登记的候选执行;未配置或候选安全耗尽停在 unavailable/blocked,禁止 host 隐式代写。
| 单元 ID | 预期范围 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|---|---|---|---|---|---|---|---|---|---|
| 待定义 | — | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | — |
## 复用材料(task-start 自动检索结果摘录)
- 相关近期提交:<git log -- <paths> 命中;无则写无>。
- 相关经验条目:<检索命中;无则写无>。
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at | 结果 |
|---|---|---|---|---|
| 启动 | <R0> | <HEAD> | <日期时间> | <一致/已同步> |
| 验收前 | <填写> | <填写> | <填写> | <填写> |
字段没有发生的写"无",不省略。本卡与 PR 描述同源:开 PR 时将"目标与非目标、结果与验证、影响与剩余项"复制进 PR 描述,不另写第二份。
## 交付调度(有多个就绪任务时)
- 调度记录 / entry_id / 当前 attempt_id:<平台或调度服务链接及标识;未入队写无>。
- 入队源 HEAD / owner / 依赖:<完整 SHA、身份、依赖或无>。
- 固定候选引用:<调度尝试中的 base/head、组件与配置;未固定写无>。
- 窗口、最终 CI、Review 与真实合入结果:<引用调度记录及原始证据,不复制全队列>。
定义见 [合入调度与 CI 分配](../standards/merge-queue.md)。本段在候选固定前整理;固定后先使用源码之外的记录保存运行结果,再按项目闭合流程回填。
## 结果与验证(完成后填写)
- 结果:<交付了什么;未发生写无>。
- 验证:<结论性摘要:PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据见下表,来源标注与写入规则见 [按影响选择验证与证据](../standards/verification.md)>。
- 影响与剩余项:<影响面、遗留风险、后续任务>。
| 时间(UTC) | 命令 | 被测 HEAD | exit | 来源 | 摘要/位置 |
|---|---|---|---|---|---|
| <时间> | <命令;由项目 evidence 工具写入,无工具时附命令+对象 SHA+输出 digest 并标 SELF> | <HEAD> | <exit> | GATE/REPLAY/SELF | <摘要/位置> |
## 回收(task-finish)
- 合入核对:<分支已包含于目标分支的核对输出>。
- 未跟踪/ignored 文件处置:<归档/可再生/存疑 逐项;无则写无>。
- 回收动作:<worktree remove、分支删除、prune;放弃路径注明原因>。
+67
View File
@@ -0,0 +1,67 @@
# Project Agent Execution Configuration
# 项目工程 Agent 执行路由配置
适用范围:定义本项目中由 AI / Agent 主导的代码实施、修复、测试与审阅所调用的 Agent CLI 路由。
解析器识别正文中唯一一个 ```agent-execution 代码块。正文外的说明文字可根据项目需要调整。
通用硬规则见 Development-Guidelines 的 [Agent 执行与协作契约](deps/development-guidelines/standards/agent-execution.md)。
本配置为项目本地路由权威,声明具体的候选 profile、尝试次数上限、超时、集成入口与豁免路径;
代码块须通过 `deps/development-guidelines/templates/schemas/agent-execution.schema.json` 校验后才能登记为 active。
`fallback_to_host` 只能为 `never`;旧值 `all-unavailable` 仅供迁移工具读取,不能通过准入。
下例的 CLI 名称、命令与路径均为占位,按项目实际执行器替换。
```agent-execution
schema: agent-execution/v1
execution:
fresh_process_per_unit: true
permission: run-everything
fallback_to_host: never
max_parallel: 3
timeout_seconds: 7200
idle_timeout_seconds: 600
summary_bytes: 16384
raw_output_bytes: 10485760
max_attempts_per_profile: 3
emergency_profile: codex
roles:
implementation: [cursor, antigravity, pi]
repair: [cursor, antigravity, pi]
test: [pi, antigravity, cursor]
review: [pi, antigravity, cursor, codex]
profiles:
cursor:
adapter: cursor
executable: "cursor-agent-stable"
model: auto
enabled: true
antigravity:
adapter: antigravity
executable: agy
model: auto
enabled: true
pi:
adapter: pi
executable: pi
model: auto
enabled: true
codex:
adapter: codex
executable: codex
model: auto
enabled: true
integration:
exempt_paths: [".task/**", "docs/superpowers/specs/**", "docs/superpowers/plans/**"]
transport:
command: "scripts/agent-exec apply"
admission:
command: "scripts/agent-exec admit"
cleanup:
command: "scripts/agent-exec cleanup"
```
+23 -3
View File
@@ -23,9 +23,9 @@
历史文档与旧链接里的 `git-panel.u1680832.nyat.app:30319` 已失效(TLS 握手失败),
见到一律按过期处理,不要再试。当前权威通道:
- **Web / API(HTTPS)**:`https://git-home.u1680832.nyat.app:30319`(Gitea 1.27.3,
- **Web / API(HTTPS)**:`https://gitea.naitangbaobao.cn`(Gitea 1.27.3,
API 前缀 `/api/v1`;偶发 broken pipe / 超时,重试即可)。
- **Git over SSH**:`ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/<Repo>.git`
- **Git over SSH**:`ssh://git@gitea.naitangbaobao.cn:52222/weichen/<Repo>.git`
(各仓 origin 与 gitlink 均为此格式)。
- **API token**:`~/.secrets/gitea`,两行键值 `URL_PREFIX=…` 与
`ACCESS_TOKEN=<40 位 hex>`;取值 `grep ACCESS_TOKEN ~/.secrets/gitea | cut -d= -f2-`,
@@ -33,4 +33,24 @@
(baseline 硬边界 2:只记录来源、字段与可用状态)。
- **SSH key**:`~/.ssh/home_gitea`(ED25519,公钥指纹
`SHA256:GYXaOXIMeloQ1fKSfdJ/ndgPQzs/Ix7Hk62ekfkfQ20`,Gitea 侧密钥名 GMKtec);
`~/.ssh/config` 已有 `git-ssh.u1680832.nyat.app` 主机条目,克隆/推送直接可用。
`~/.ssh/config` 已有 `gitea.naitangbaobao.cn(端口 52222)` 主机条目,克隆/推送直接可用。
## Agent 执行与新项目准入(强制)
### 新项目准入(强制)
1. 缺 Guidelines 固定版本(`deps/development-guidelines` gitlink 未就绪或 HEAD 不符)时,Agent 只能只读分析,不得实施。
2. 缺有效 `AGENT-EXECUTION.md`(`scripts/dm governance check` 未通过)时禁止 AI 实施。
3. 缺共享执行器(`scripts/agent-exec` 或 `deps/development-manager` 不可用)时,状态为 `blocked/unavailable`,不得改由 host 替代。
4. 不允许 host 代写实施单元;实施、修复与测试必须经 `AGENT-EXECUTION.md` 登记的候选执行。
5. 人类直接开发按其自身授权与项目规则进行,不受本条款约束。
6. 分支保护与规范 tag 由用户负责设置与维护,Agent 不得代为设置。
入口:
- 需求分流:`scripts/task triage discover|decide|verify`
- 任务启动:`scripts/task start …`
- PR 检查:`scripts/task pr-check …`
- Agent 执行:`scripts/agent-exec run|apply|admit|validate`
AI 实施单元仅通过 `scripts/agent-exec run` 按 AGENT-EXECUTION.md 运行,并经 `scripts/agent-exec apply` 集成。
+5
View File
@@ -17,3 +17,8 @@
本仓没有可编译程序或独立业务测试套件。跨仓固定组合在 Dev 仓运行 `make test`;
过程记录中的命令和环境须按当次任务核实,不能机械重放旧运维命令。
治理检查(CI `.gitea/workflows/governance.yml` 同步执行):
- `scripts/agent-exec validate --repo .`:校验 AGENT-EXECUTION.md 的唯一 `agent-execution` 配置块,须输出 `validate: ok`。
- `scripts/dm governance check --repo .`:只读核验治理文件与 gitlink,须只输出 ok 行。
+2
View File
@@ -21,3 +21,5 @@ docs/
[实施记录](docs/records/2026-09-29-implementation.md) · [设计方案](docs/proposals/2026-09-29-system-skeleton-design-and-plan.md)
规范基线:Development-Guidelines(Dev 仓 `deps/development-guidelines`)。
相关方案:[RDM 功能、实现与计划矩阵及整改方案 r1(2026-10-12)](docs/proposals/2026-10-12-rdm-function-implementation-plan.md)——RDM 全系统缺口矩阵与 U1–U9 工作包。
Vendored Submodule
+1
+78
View File
@@ -118,3 +118,81 @@ make test-backend-pg
- 迁移仍随启动执行(已原子 + 锁化);完全独立的 migrator 入口留待 U4 工具。
- 多实例安全**未**因此声明(R4/U5);本档只交付单实例 team 档与真库门禁。
- pgvector 扩展已安装 ≠ 启用;向量检索仍是应用内扫描(U6)。
## 9. 执行预算与动作授权(U3 切片 2 已实施)
### 执行许可(admission,R8)
- 设置键:`runtime.execBudgetGlobal`(全局并发执行上限,含子代理;0=不限,
默认)、`runtime.execBudgetPerUser`(每租户上限;0=不限)、
`runtime.execQueueMax`(待执行队列上限,默认 200)。数值为容量合同初值,
U7 压测后调整。
- 语义:会话回合与子代理同池计数;账本在数据库(`admission_leases`,PG 咨询
锁下原子清点),多实例天然共享;队列满时 API 在落库前 429(不写数据);
父 run 同步等待子代理或等待 HITL 时让出执行许可、保留会话所有权,恢复
执行重新获取——额度占尽时父子不互等。
- 接纳与执行分别计数:队列深度(接纳)与活跃租约(执行)是两个量,
诊断分别看 `Manager.QueueDepth()` 与 `store.ActiveExecutionSlots()`。
### KTD13 动作授权矩阵与公开契约兼容计划
矩阵(宿主侧 `server.ProjectAction`):
| 动作 | 语义 | 未注册 action-aware 时 |
|---|---|---|
| read | 读取项目资源(会话/消息/检索/下载) | 回落旧 EXT-8 只读适配器(兼容现网) |
| edit | 写入与修改 | **默认拒绝** |
| approve | 审批(HITL/命令确认) | **默认拒绝** |
| execute | 触发执行 | **默认拒绝** |
| admin | 管理 | **默认拒绝** |
规则:action-aware 适配器(组合根注入 `SetProjectActionAuthorizer`)注册后
对全部动作权威、出错 fail-closed;旧只读适配器不得自动获得写入能力。
**公开契约兼容计划**(后续版本落地):以版本化扩展把动作级判定并入
EXT-8 的 `ProjectAuthz` 公开契约(新增 action 参数的变体接口 + 契约版本号),
下游适配器按动作逐一声明能力;未声明动作保持默认拒绝,与宿主侧矩阵同语义。
旧 bool 契约在该版本内继续可用(映射为仅 read);Core/Host 与下游适配器
(RDM 的 ProjectAuthz 实现)一起验收,不另建成员权威。
## 10. SQLite → PostgreSQL 切换与恢复演练(U4 已实施)
工具:`make build` 产出 `bin/storage-migrate`(受管迁移入口;只处理 Backend 库,
不执行 SQLite dump 作为 PG SQL)。三个子命令:
```bash
# 1) 只读盘点:schema 版本、完整性、逐表计数、工件清单与哈希(§6.1)
storage-migrate inventory --source runtime/dev/data/agent-system.db \
--artifacts runtime/dev/data/artifacts --out inv.json
# 2) 一致性快照:VACUUM INTO(在线安全含 WAL)+ 可打开校验 + 逐表计数对账(§6.2)
storage-migrate backup --source runtime/dev/data/agent-system.db --out snap.db
# 3) 受管迁移:目标建 schema/扩展后按行复制;身份登记 + 逐表校验和 + 终验(§6.3)
storage-migrate migrate --source snap.db --target "$DSN" \
--migration-id <名> --artifacts runtime/dev/data/artifacts --out report.json
```
迁移身份与续传:`migration_id + source_snapshot_id(快照 SHA-256)+
source_schema_version` 登记在目标 `migration_control`;**仅同一冻结快照可续传**
(换快照/换身份均拒绝);目标业务表已有数据而身份为空即拒绝(不覆盖)。
校验与报告:逐表源/目标计数与主键序哈希链校验和(布尔列按目标 schema 对称
归一);复制后推进 SERIAL 序列;未知 owner(users 之外,''/'local' 单租户默认
除外)阻塞迁移;报告只含计数/校验和/清单哈希——无 DSN、密钥与行正文(KTD14)。
类型映射以目标 schema 为准(SQLite 0/1→BOOLEAN、BLOB→BYTEA、生成列不迁、
FTS5 影子表不迁——PG 侧生成列与索引自动重建);`admission_leases` 为运行态
不随迁。
### 切换顺序(正式窗口须另行授权;当前仅隔离演练已验证)
1. 固定源制品与路径,`inventory` 盘点;指定迁移 owner、窗口、回退判据。
2. `backup` 冻结快照(活跃 WAL 库不得只拷 `.db` 文件)。
3. 预演:独立测试目标 PG 上 `migrate`,核对报告全绿;预演库不作为正式目标。
4. 正式窗口:停新写 → 等待/收口在途 run(未知副作用记 recovery hold)→
停旧写者 → 终快照 → 空正式目标 `migrate` → 报告全绿。
5. 单入口切 team 档冒烟(登录/项目/会话/审批/检索/下载);fail-closed 不回 SQLite。
6. **PG 接受新写入前**可撤回;**之后**禁直切回旧 SQLite(向前修复或专项回迁)。
备份基线(正式目标启用后):pg_dump 逻辑备份 + pg_basebackup 物理基础备份与
WAL 归档/PITR;pg_dump 不能作 WAL 回放基础。每次演练恢复到新目标并核对。
@@ -9,6 +9,8 @@
---
> 2026-10-11 补齐候选:[最终目标核对与完整交付方案](2026-10-11-rdm-final-target-completion.md)按本轮用户确认及 RDM d8d7e743 重新映射项目/隐私/三权、全部模板与 34 UR/68 SR/10 F。该方案待评审;本页历史快照和原始证据保留,不能据其旧完成声明推断最终验收。
## 1. 大方向与大目标
### 1.1 一句话目标
@@ -417,6 +417,11 @@ AG-UI 仅在需要跨 Agent 框架互通时评估事件适配;MCP Apps 仅在
### U6. 自适应任务与项目工作区
> **2026-10-11 用户裁定**:U1–U5 已全部落地合入;U6 启动前置(「U4/U5 的收益
> 与可靠性证据」)改为 **owner 实际体验评估**——在真实使用中启用 generative-ui
> 插件、体验页面生成/修订/表单提交(人类可用性对照自 U1 起 NOT_RUN,本裁定即
> 其执行方式)。体验结论(继续/调整/停止)由用户给出后再开 U6。
- 关联 R8,依赖 U4/U5 的收益与可靠性证据。
- 文件范围:Frontend workspace/任务页容器、插件上下文选择与触发策略、Backend 授权聚合适配、相关测试。
- 方法:先当前任务,后项目;任务阶段触发有限更新;固定布局/恢复原视图;自动模式单独 opt-in。
@@ -8,10 +8,10 @@ product_contract_source: ce-plan-bootstrap
# 多人协作存储与分布式演进方案 - Plan
修订:r1;确认状态:**已批准(2026-10-11 用户指示「按方案开始改造」)**;推进状态:方案获批发布,实施自首选增量 U1+U2 启动;业务实施/迁移/压测/部署仍为 NOT_RUN,逐项以实施任务卡为准。
修订:r2.3;确认状态:**已批准(2026-10-11 用户指示「按方案开始改造」)**;推进状态:U1–U7 **代码与测试已合入**(Backend [#164](https://gitea.naitangbaobao.cn/weichen/Agent-System-Backend/pulls/164);Dev [#410](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/410)/[#439](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/439)/[#442](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/442);闭卡 [#424](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/424) 等)。正确性 A1–A7 与 B1 已绿(CI/SELF)。容量合同 B2/B3/B5 contract 与双实例 C2 **本机 SELF 窗口已跑通**(见[容量报告](../records/2026-10-12-u7-capacity-window-report.md))。2026-10-12 用户决定不做容量重放;同日 B6 pgbench、C4 断连、C5 库恢复已有本机 SELF(见[运维演练报告](../records/2026-10-12-u7-ops-drill-report.md))。2026-10-13 未配置对象存储时的上传 panic 已修,C5 工件恢复 K4 重测为 SELF 通过。**SELF≠GATE/REPLAY**,双主机 C3 未做——**仍不放行第二实例承接写请求**。
需求来源:2026-10-11 用户要求完善 SQLite、PostgreSQL/pgvector、Redis 分工;随后确认“10–100 人,多人多项目多会话并行,未来支持多服务分布式”。
需求负责人:weichen;方案编制:Codex;实施及运维负责人:待指定。更新时间:2026-10-11(Asia/Shanghai)。
关联任务:Dev `.task/feature-collaboration-storage-plan.md`(方案任务,已发布);后续 U1+U2 实施由独立任务承接。
需求负责人:weichen;方案编制:Codex;实施及运维负责人:待指定。更新时间:2026-10-13(Asia/Shanghai)。
关联任务:方案与 U1–U7 实施卡已归档;容量收尾见 Dev `.task/feature-u7-capacity-wrap-measure.md`。放行检查单:Dev `docs/release-multi-instance.md`。
正文中的源码路径以 Agent-System-Dev 为根;工作包中的 `internal/` 简写指 `modules/backend/internal/`;文内相对链接以本文为根。
## 1. 推荐结论与边界
@@ -45,7 +45,7 @@ product_contract_source: ce-plan-bootstrap
| 独立 Squad | 独立 CLI 使用 `adapters/sqlite/runstore.go` 的 `orchestration.db`;这不是 Backend 实际接线 | 不把迁移该 SQLite 文件当作 Backend 分布式改造完成 |
| 验证 | PG/Redis 集成由 `AGENT_PG_TEST_DSN`/`AGENT_REDIS_TEST_ADDR` 控制;当前 CI YAML 没有显式准备这两种服务 | 缺变量会跳过关键测试;CI 通过不能自动证明真 PG/Redis 或双进程链路通过 |
已有规划衔接:Q1 已记录 Store 收敛但仍留 platform→squad 队列桥接等余项;N3 原案与归档卡的 JournalOnly 落地不同,应以当前接线确定权威。共享权限沿用 EXT-8 授权适配器与 RDM 的成员/角色职责,不新建第二套成员模型。历史报告用于定位,不能替代当前验收。远端调查发现 Backend [#135](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Backend/pulls/135) 正在增加 S0 工作区 overlay/frozen base/CAS apply;U5 必须复用并核对其契约,不能另造冲突的工作区实现。该 PR 尚未作为本案已合入依赖。其他被查仓当时未返回 open PR,详见收据;实施启动时重新核对。
已有规划衔接:Q1 已记录 Store 收敛但仍留 platform→squad 队列桥接等余项;N3 原案与归档卡的 JournalOnly 落地不同,应以当前接线确定权威。共享权限沿用 EXT-8 授权适配器与 RDM 的成员/角色职责,不新建第二套成员模型。历史报告用于定位,不能替代当前验收。远端调查发现 Backend [#135](https://gitea.naitangbaobao.cn/weichen/Agent-System-Backend/pulls/135) 正在增加 S0 工作区 overlay/frozen base/CAS apply;U5 必须复用并核对其契约,不能另造冲突的工作区实现。该 PR 尚未作为本案已合入依赖。其他被查仓当时未返回 open PR,详见收据;实施启动时重新核对。
## 3. 需求与可判定结果
@@ -246,8 +246,8 @@ SQLite 本身支持可靠事务与多人经同一应用访问;WAL 提升读写
必需观测:API P95/P99与预期/非预期错误,DB pool wait/连接数/慢查询/锁等待,队列长度/最老年龄,run 租约/过期写拒绝/未知副作用,SSE cursor lag/补查次数,Redis 错误与降级,检索耗时/召回抽样,备份时间与恢复结果。日志只记录 request/run/owner 的安全标识,不记录 DSN、密钥或文档正文。
当前交付仅为 r1 方案与 SELF 调查记录。需求人数已确认;容量阈值、正式数据/部署目标、迁移窗口、灾难恢复等级和实施阶段尚待人工评审。没有业务测试 PASS、独立 REPLAY、CI GATE 或已部署声明。
r1 为方案与 SELF 调查记录。r2 起:U1–U7 代码与测试已合入且正确性 CI 绿。r2.1:本机双实例 contract 容量窗口(ladder / 60m / 2h)SELF 全过,见[容量报告](../records/2026-10-12-u7-capacity-window-report.md)。r2.2:用户于 2026-10-12 明确不做容量重放;同日完成 B6 pgbench、C4 PG/Redis 断连、C5 物理备份与 pg_dump 恢复的本机 SELF,见[运维演练报告](../records/2026-10-12-u7-ops-drill-report.md)。C4 通过。C5 的库恢复通过(RPO 64 秒,RTO 4 秒),工件上传在未配置对象存储时 panic,K4 失败,产品代码未改。r2.3:2026-10-13 在 store 边界把带类型的空对象存储当作未配置并回落本地目录;同日 C5 重测 K1–K7 均为 SELF 通过(RPO 65 秒,RTO 3 秒,K4 五个工件 sha256 一致且跨用户拒绝)。本地 SELF 不能冒充 GATE/REPLAY 放行;双主机仍缺。部署与第二实例写流量仍未授权。
方案静态审阅及修订处置见[审阅记录](../records/2026-10-11-collaboration-storage-plan-review.md)。Agent 审阅不替代人工批准或实现验收。
方案静态审阅及修订处置见[审阅记录](../records/2026-10-11-collaboration-storage-plan-review.md)。进程级黑盒相对库级 Manager 测试的漏检教训见[经验条目](../records/2026-10-12-lesson-http-multi-instance-vs-manager-tests.md)。Agent 审阅不替代人工批准或实现验收。
首选下一增量是 **U1 + U2 的详细实施与测试合同**:固定目标实例与 PG 测试环境,解决团队档、迁移原子性和真实数据库测试门禁。U6 的事件正确性修复可在单独授权后并行;不要先增加应用副本。各实现任务启动前复核在途 PR 与依赖 SHA,再按 Dev 的 evidence/task-sync/组合验证流程交付。
首选下一增量不要自动开工。剩余放行门槛是:独立 REPLAY,或把 C4/C5 快速档接入 CI 形成 GATE(需平台准入);以及 C3 双主机(需第二台机器)。2026-10-13 的上传修复与 K4 SELF 重测不替代这两项。GATE/REPLAY 与 C3 未齐前,不要开放第二实例写。各实现任务启动前复核在途 PR 与依赖 SHA,再按 Dev 的 evidence/task-sync/组合验证流程交付。
@@ -0,0 +1,95 @@
---
title: Generative UI U5 action-scope proposal
date: 2026-10-11
type: feat
revision: r2
status: approved
product_contract_source: generative-ui-r2-U5-clause
---
# Generative UI U5 动作范围提案(待用户评审)
依据:主记录 r2《Generative UI 调研与插件方案》U5 条款「**必须先评审本阶段动作范围**」。
本文是该评审的提案稿:给出动作分类与开放范围、审批挂接要求、明确排除项与验收条件。
用户裁定前不实施;实施另行开任务(U5 实现)。
负责人:裁定 weichen(用户);起草 Agent;更新时间 2026-10-11。
## 一、动作分类与本增量开放范围
| 类 | 定义 | U5 开放范围 | 通道 |
|---|---|---|---|
| **A 客户端本地** | 零副作用:页签切换、折叠展开、排序筛选、复制、doc-ref 打开工件预览 | **全部开放**(U4 已具雏形) | 纯前端,不经命令总线、不审计(无副作用可审);模型不能把 A 类标成"已执行" |
| **B 白名单命令绑定** | 把**既有命令目录**中的命令绑定为页面动作按钮 | **机制全量建设,第一版白名单为空**(见下) | cmdbus 四入口同源分发:审计信封、参数 Schema 校验、DangerHigh 确认卡 |
| **C 插件自身低危写** | generative-ui 表单提交落**插件自有**存储(Host.KVPut / 后台任务台账),不触发任何业务系统变更 | **开放**(场景 3「方案选择和需求表单」的实现面) | 新插件命令 `generative-ui.submit`,经同一分发/审计/幂等 |
| **D 业务写与高危** | 业务系统写(任务/项目/工件/知识库变更、对外发布、外发消息)、DangerHigh 命令直执、跨 owner/跨项目资源、代码执行 | **全部不开放** | U6+ 逐类单独评审后按 B 类机制逐条加白 |
**B 类第一版白名单为空的依据**(2026-10-11 源码事实):当前内置命令为
builtin.help / system.intent / conversation.create / runtime.mock / models.set /
conversation.profile——除 help/intent 外均为中危**写**命令,不存在可安全首开的内置只读命令。
结论:U5 交付「绑定-审计-幂等-确认」管道与测试,白名单从空起步,此后每加一条都走
独立评审(增量为零的机制 + 可验证的拒绝路径,先把地基打牢)。
## 二、审批挂接要求(映射 r2 KTD6 与现有机制,全部为既有能力复用)
1. **生成的按钮不是批准**:页面动作提交 → 宿主校验(启停/epoch/revision/权限/参数)→
`cmdbus.Dispatch`(Entrance=button,归一入审计信封)。模型只能引用允许的 action 名称,
不能伪造执行结果。
2. **DangerHigh 自动挂既有确认卡**:命中 `spec.Danger == high` 且未 Confirmed 时走现有
内联确认卡 + pendingStore 持久化 + Confirm 回道二次分发——**用户点卡确认是唯一批准来源**;
Confirmed 标志只能由卡回道置位,模型路径无法携带(红测断言)。
3. **幂等**:requestId 由客户端生成;服务端绑定 `(owner, surfaceId, revision, actionId,
requestId, 参数哈希)`。重复 requestId 同参数 → 返回已有回执;同 requestId 异参数 → 拒绝
(对齐 KTD6)。
4. **旧修订受控**:动作提交带 revision;revision ≠ 当前 latest → 拒绝并提示刷新
(旧按钮不重放)。
5. **禁用语义**:activation 关闭后新动作 403;在途按 U2 KTD7 表(已提交业务操作按命令台账
收尾,不承诺撤销)。
6. **表单草稿不进模型**:草稿由前端按 surfaceId/nodeId 管理,未提交不上传、不进
ctxasm(KTD4/KTD8;测试断言上下文不含未提交字段值)。
7. **参数校验**:动作参数按命令 ParamsSchema 服务端校验(validateParams 既有),拒绝
越权资源引用(owner 作用域)。
## 三、交付范围(实施任务的文件面,供参考)
- Backend:`POST /api/surfaces/{id}/actions`(提交动作,走 surfacesvc 守卫 + cmdbus);
幂等台账迁移(新表,纯增量);genui 目录文档补 action 绑定语法与「仅允许引用宿主下发的
action 清单」纪律。
- UI:UIRenderer `actions` 分支已有渲染,补 onAction 桥到宿主提交(SurfaceView 转发)。
- Frontend:SurfaceView onAction → 动作端点;确认卡复用现有 HITL 卡 UI;
表单草稿本地态(提交前不外发)。
- Core:优先零变更(action 绑定用服务端表,不扩 UINode 契约)。
## 四、明确排除(本增量不做)
业务实体写路径、跨会话/跨项目动作、自动触发的动作(只响应用户点击)、
动作结果自动改写页面(回执展示后由用户或 Agent 显式重组织)、
MCP/外部 HTTP 直连、任意命令即时全开。
## 五、验收条件(R7 映射,实施任务的判定线)
1. 场景 3 表单可提交、校验失败可修改重试;提交落插件台账可回读。
2. 旧 revision / 越权 action / 重复 requestId 异参数 → 拒绝(红测矩阵)。
3. DangerHigh 路径必须经确认卡;模型伪造 Confirmed 被拒(红测)。
4. 用户未提交的表单字段不出现在下一轮模型上下文(测试断言)。
5. 禁用后动作 403;A 类本地行为不受影响。
6. 幂等重放返回相同回执(并发双击一次生效)。
## 六、裁定记录(2026-10-11,用户已裁定)
三点均经用户裁定**同意**(推荐项全取):
1. **分类与范围**:A 全开 / B 机制先行白名单空起步 / C 限插件自有写 / D 全关——同意。
2. **C 类边界**:限定 KV + 后台任务台账,不建新业务事实表——同意。
3. **确认卡 UX**:复用现有内联确认卡,不新建审批 UI——同意。
本文升级为已批准范围;U5 实施按 policy/delivery.md 开任务(feature/generative-ui-u5),
验收线以第五节为准。
### 七、原裁定请求(历史留档)
1. **分类与范围**:A 全开、B 机制先行白名单空起步、C 限插件自有写、D 全关——是否同意?
2. **C 类边界**:插件自身写是否限定为 KV + 后台任务台账(不建新的业务事实表)?
3. **确认卡 UX**:复用现有内联确认卡(不新建审批 UI)——是否同意?
裁定后:U5 实施按 `policy/delivery.md` 另行开任务;本文升级为已批准范围并回填裁定记录。
@@ -0,0 +1,507 @@
---
title: RDM 最终目标核对、系统差距与完整交付方案
date: 2026-10-11
type: feat
execution: code
artifact_contract: ce-unified-plan/v1
product_contract_source: legacy-requirements
---
# RDM 最终目标核对、系统差距与完整交付方案
修订 r1;负责人 weichen;编制 Codex;更新时间 2026-10-11(Asia/Shanghai)。
用户已明确最终实现范围:全部文档模板、文档三权、系统级项目及独立两树一网协作;本轮进一步要求先核对目标和差距、形成详细完整方案。
本总体方案待人工评审;业务实现、迁移、真实模型评测、浏览器验收、上线均 NOT_RUN。
本文件承担本次最终目标补齐的统筹记录;不替代 RDM 已批准需求正文。实施负责人按各工作包立项指定,不预设已有人承接。
下文 `RDM:` 为 Agent-System-RDM,`Dev:` 为 Agent-System-Dev,`Legacy:` 为旧 Agent-System 的仓内路径。
## Goal Capsule
让不同用户在同一个系统级项目内,用各自私有的对话和资料工作,通过有权限的项目知识协作,按模板完成全部体系文档的编制、审核、批准,并能追溯来源、版本、决策和验证结果。
采用 RDM 领域实现与基座通用能力组合:先接通项目、权限、资料和持久运行,再完成全部文档及三权、需求和合规链、项目生命周期与交付。
项目建议书、竞品分析仍作为第一条真实验证路径;**最终交付包含全部 69 类现有文档模板与现有报价 XLSX 资产的接入,不以两份试点或目录登记完成作为终点**。
每个项目可按自身适用性选择文档,但平台模板覆盖不能以“不适用”替代未实施。新增模板也必须沿同一发布、生成和验收契约接入。
本次三项关键口径已由用户明确,不再列为待决:系统内同名项目唯一;创建者在平台管理员上限内覆盖管理;个人聊天/原件/草稿私有,受控文档按三权及明确授权读取。
后续遇到模块职责、权限范围、外部集成或交付顺序重大改变时按 `Dev:policy/delivery.md` 回到受影响阶段评审。后移目标逐项保留,不能无记录地消失。
---
## Product Contract
### Authority and Confirmed Decisions
权威顺序:本轮用户明确指示和澄清 → 已批准 U0 D1–D9、V2.2 Q1–Q8/D10 裁定及权威正文 → 未被取代的既有定稿条款 → 原始会议材料 → 派生摘要/旧审计快照。
原始 ASR 与用户补充可用于查清意图;不能用旧会议草案反向覆盖较新的明确裁定。`.tmp` 原件保持不改,正式需求修订仍进入 RDM `docs/requirements/`。
`RDM:docs/requirements/README.md:15–21` 明确 01/02/03/04/08/09 已于 2026-10-09 合入定稿 V2.2;05/06/07/10 未重发,但解读服从新裁定。U0 页首 proposed、部分 V2.2 正文“待评审”等是残留状态文字,不能据此宣称需求未批准。
前一份模板生成方案对这些残留文字的判断在本次纠正;其具体实现建议依然是待评审方案。
| 编号 | 用户重申与最终口径 | 与最终设计的关系及依据 |
|---|---|---|
| D1 | 系统可有多个不同项目;同一名称只对应一个权威项目身份,用户加入后访问同一个项目 | 符合 UR-22、SR-G10;01:312、517;用户补充 S:50 |
| D2 | 创建者默认项目负责人,在平台管理员设置的范围和上限内管理成员、覆盖权限、分配每文档三权 | 符合 SR-G8/G9、U0 D2;用户设计意见 D:76;本轮再次确认 |
| D3 | 每项目有独立笔记树、文档树、追溯网;成员及其智能体通过授权后的项目知识协作 | 符合 SR-G11、SR-N4、08 数据模型;S:60–61 |
| D4 | 个人聊天、上传原件、个人草稿默认私有,受控文档只向三权人员与明确授权者开放,不自动全员共享 | 用户本轮明确确认;与 U0 D3 私域边界及 SR-C7 三权相容;SR-G12 的主动只读分享仍须明确授权 |
| D5 | 管理权不自动包含读取私人资料、发起代编、代审、代批 | 已批准 U0 D2、V2.2 A4;S:65–72;创建者也受职责分离约束 |
| D6 | 先项目建议书/竞品分析验证,最终扩展所有文档 | 上轮用户选择与本轮“所有文档加入并实现”;阶段顺序不缩减最终范围 |
S=`Dev:.tmp/Discussion-Meetings/2026-10-08_12-24/.tmp/user-supplement.txt`;D=同目录 `user-design-ideas.txt`。原文 S:35–36 提出上限内覆盖,D:75–76 的直接用户意见收敛该选择;S:40–73 同时定义项目、私聊、共享知识和三权。
晚会原始 ASR(2026-10-08_19-36,00:37:00–00:37:21,正文段落 P329–P338)确认共同项目根,不能单独拿它证明私有权限;该部分依据以前述用户补充及本轮确认为准。
### Problem Frame
目前存在“基座界面里的用户项目”和“RDM 领域项目”两条没有完整贯通的路径。RDM 已实现项目表、部分权限计算和章节审签,但用户还无法通过统一界面完成研发项目管理及全部文档工作。
多份历史任务卡把局部领域方法、测试桩或直接处理器调用概括成阶段完成,掩盖了真实入口、授权、持久恢复、资料来源和部署组合的差距。
因此需要围绕最终用户路径重新映射证据、补齐已有实现,而不是从零重建或只补一页项目设置。
### Current State
本轮证据等级为 SELF:当前源码、测试资产、原始会议材料、只读进程构建元数据。未读业务数据库、未操作业务数据、未执行模型/业务测试。
调查基线:Dev `80a518628c526fd6ddece4abeb707ab4bb0b5618`;Backend `c8d66ca3cd21b055a8605e9eb4d8e525037618a6`;Frontend `3ed10e122042a64180fb24a42d9cc6438cd2d2d6`;RDM 初查 `0081628a10ec48a36537c6eced11a57439c986fa`,本轮期间项目授权改动合入后已增量复核至 **`d8d7e7436ca501e3ae03bbea9cc60405c74b9afc`**;RDM Backend pin `421fee81c314c05530bc809e224b5d0818ec3472`,Frontend pin `84b73ab32848e623d0a0ab7ade552784dca8cf3c`。
原始命令、固定对象和输出见 [调查收据](../records/2026-10-11-rdm-final-target-source-receipt.json)。源码基线不等于部署组合。
只读观察到 Dev `runtime/dev/bin/agent-system` 正运行 Backend c8d66ca 基座入口;另有较早、位于临时或已删除工作区的 RDM 进程。用户当前访问的 URL/实例尚未核对,不能据此直接判定其浏览器所见部署了哪个产品。正式验收须固定实例、端口、二进制摘要、组件 pins 和数据根;本轮不停止或清理这些进程。
| 差距 | 当前已有 | 尚未完成及影响 | 源码定位 |
|---|---|---|---|
| G1 项目入口 | Dev 有新建/切换/通用设置;RDM 有项目/成员命令 | Dev 创建走 owner 项目,无同名全局约束;未接研发成员/职责管理 | Dev frontend store.ts:286、ProjectSettingsModal.tsx:23;Backend store/projects.go:15 |
| G2 唯一身份 | RDM name UNIQUE、TrimSpace、创建者字段;新增一对一 HostBinding 与映射读取 | 绑定尚缺宿主项目存在性/绑定权限核验;成员不在 ListProjectsFor 目录中,页面仍首项/默认选择;新建与负责人写入非原子 | projects/projects.go:69、89;rdmapp/projects_api.go:23–87;web/app.js:98 起 |
| G3 权限覆盖 | 已有 cap∩override/default、12 动作;新增命令守卫,删除建项目自动引导管理员,改部署引导+单行约束 | cap 管理仍认 RDM 台账,平台管理员可信接入未完成;专业角色/资源策略不足;doc.write 不等于编制职责;超管槽未接 | perms/perms.go:18–60、112、172、302;perms_api.go 的 AuthorizeCmd;runtime.go:172 起 |
| G4 私域与协作 | 私有会话 owner 边界;RDM 禁止上传预索引/会话卡镜像 | EXT-8 项目布尔授权会放大到整项目工件,无法区分原件/发布快照;Host 仍 owner-only;成员上传、发布、检索不一致 | plugin.go:31;runtime.go:136;Dev server.go:1134、1199;RDM pin hostcaps.go:219 |
| G5 两树项目分片 | WorldFor、项目事件重放;主要命令新增非空项目/动作守卫,图走审计权限,上传台账按项目过滤 | rdm.init 仍可进入全量自举写路径;仍需全入口与对象归属验证;业务读/导出与审计读须分开,原件不能仅按项目过滤 | runtime.go:81–117;plugin.go:850、879;init.go:39、52;upload.go 的 UploadsList |
| G6 文档三权 | 章节角色异人、锁定、全员审核、正式链;生成已有通用动作权限检查 | 非文档级;指派对象未核有效账号/成员;通用 doc.write 未收紧到指定编制人;审签 schema 与可信 actor 处理仍矛盾 | domain/review.go:31、69;plugin.go 的 review 规格、rdmDraftCompose/Apply |
| G7 模板覆盖 | 69 种 docType;旧 69 Markdown+1 XLSX;当前 4 模板 | 仅覆盖 3 类;首项模板误选、模板可静默缺失;结构/格式/版本未统一 | 模板盘点与生成子方案 G1–G10 |
| G8 对话生成 | Compose 实际调用模型;Draft/Apply 存在;UI 新增领域项目注入与绑定尝试 | intent 类型键错误、未投影工具;缺持久提案/整文版本;旧依据可能丢失;独立页面普通文本 cmd=null 后 startsWith 仍在 | compose.go、draft.go、plugin.go 的编写 intent/compose 规格;web/app.js:410–448 |
| G9 解析与锚点 | 原件保留、md/txt/docx、部分表格/标题锚点 | 未接 ParseDocument;PDF/表格/演示文稿/图片未完整消费;慢切片改 slow:batch 丢原定位 | parse.go:33、346;slow.go:267 |
| G10 统一摄取 | 上传相关性三态、纯文本公共入库终点、发布方法 | 普通 ingest 可绕过相关性;发布未带 ProjectID,失败无持久补偿;上传非空摘要占位跳过真实摘要;聊天自动沉淀未接 | ingest.go:89、122;upload.go:406–409;llm_summary.go:20 |
| G11 结论与冲突 | 结论提议/确认、词面冲突检测、supersedes;拒绝提议已校验所属项目 | 确认提议仍按 id 查询未限定项目;固定阈值且已有结论后不再触发;无完整候选组/两层裁决;Resolve 可误关其他争议 | conclusions.go:125–135、264、310;domain/fc/collide.go:35、125 |
| G12 需求与合规 | UR/SR 台账;15 节点/11 边、四视图、八规则、矩阵/导出 | 六维/父子分解不足;受控节点和边写方法无生产调用;只有读命令,缺真实业务生产者 | requirements.go:21;compliance.go:155;plugin cgraph commands |
| G13 法规双通道 | 知识检索与法规声明记录 | “网络通道”用 Complete 生成 URL JSON,无实际搜索/抓取;不能作为独立网络核验 | regcheck.go:35、58–72 |
| G14 阶段与完整性 | 部分素材数/待确认文字检查 | 项目无阶段状态;缺推进/结项用户路径;审核提交未接内容/合规缺口门禁 | projects/projects.go:17;baseline.go:82;review.go |
| G15 长任务 | 内存队列、慢任务台账、重启标 failed | 不保存恢复所需项目/owner/原输入;不能续跑;通用快慢任务与取消恢复未闭合 | slowledger.go:31–43、74–77;slow.go |
| G16 看板与影响 | 职责/编制状态/正文变化投影 | 来源变了而正文未变时看板无法反映;缺影响对象、责任人、解决状态的闭环 | kanban.go:26、67;todo.go |
| G17 版本导出 | DOCX/XLSX 代码和测试 | 未按模板渲染格式、未绑定整文批准快照;合规导出正文为当前图却展示最新快照 hash | docx.go:155、298;cgraph_export.go:114 |
| G18 团队部署与执行 | 基座 PG/Redis、预算与动作矩阵;RDM 执行硬关闭 | RDM 领域仍 SQLite;动作矩阵公开接线不足;隔离执行尚未替代禁用;缺真实 RDM 双实例与备份恢复 | RDM domain/store/store.go:21、main.go:188;Dev server.go:90 |
| G19 完成证据 | 单测、桩 E2E、历史任务卡与 smoke | 真实三用户/两项目/模型/浏览器/安装包验收缺项;历史广义完成声明不能覆盖实际缺口 | v01_e2e_test.go:28、61、99、120;selfhost.go:130 |
“部分已有”表示可复用,绝不表示运行通过;“未接通”也不应改写为“所有组件都没有”。
RDM 数据库名唯一仅证明该源码对单数据库的精确字符串约束,尚未核实部署旧库索引;多数据库、多实例及名称规范化另需验收。
本轮新增实现来自 RDM 项目授权 #195/#196 的提交;上传来源项目解析、批次授权及结论拒绝的项目约束也已补入。未受此次改动影响的解析、模板、语义检索、任务恢复和合规生产缺口继续有效。U2/U3 必须复用这些新能力并补闭环,不能重复建设。
当前最高优先级之一是宿主绑定的双向权限:仅证明“我是 RDM 项目创建者”不足以绑定一个任意宿主项目。绑定前必须在宿主核验真实项目身份及调用者管理/绑定资格,并在服务端绑定可信上下文;否则已有共享读回调会扩大到不属于该主体的宿主资料。
绑定管理不能复用只读 AuthorizeAudit(当前 canManageBinding 的回落会在未来超管接线后扩大写权)。同理,合法三权人员查看/导出自己的文档不应要求其具备整个项目审计权限;当前 doc.export 的审计守卫需要按业务资源重新分类。
### Requirements and Acceptance
完整逐条索引见 [34 UR/68 SR/10 F 对照矩阵](../records/2026-10-11-rdm-final-target-requirements-matrix.md)。下表以 R-ID 固定本次设计不变量,保留原 UR/SR 作为正式需求身份。
| ID | 必须成立的最终行为 | 可判定验收 |
|---|---|---|
| R1 | 同系统项目名称与身份全局唯一 | 不同用户并发创建同名只有一个成功;加入成员看到同一 projectId;不存在按用户复制 |
| R2 | 上限内覆盖权限,并在执行端生效 | 撤销上限后旧 override 立即不生效;页面/API/命令/工具/任务恢复均拒绝越界 |
| R3 | 创建者可管理项目成员与每文档职责 | 项目负责人完成分配;平台全局权限不因建项目增加;职责对象必须有效且是成员 |
| R4 | 私聊/原件/草稿私有,受控文档按职责或明确授权读取 | 同项目其他成员无法通过正文、计数、搜索、摘要、预览、下载、追溯、模型输出读取未授权内容 |
| R5 | 每项目两树一网独立且内部按权限协作 | A 项目成员/智能体可使用 A 的发布知识,不能读取 B 项目或 A 的私有原文 |
| R6 | 全部现有文档类型可用,模板发布后结构/格式固定 | 69 类逐份有发布模板和真实生成验收;报价 XLSX 独立验收;项目不适用不减少平台覆盖 |
| R7 | 原件、解析、锚点、标签、知识发布可解释且可恢复 | 多格式能力分档声明;失败原件可取回;慢处理不丢页表锚点;存疑/拒绝不进共享检索 |
| R8 | 结论、冲突、依据选择受控 | 新资料可触发结论更新;文档层选择不改变项目全局结论;裁决只关闭指定争议 |
| R9 | 对话生成整文可修改可恢复,采纳才生效 | 模板与输入版本固定;无依据不编造;旧引用不丢;重复提交不重复写;部分采纳后整文仍一致 |
| R10 | 文档三权完整执行 | 编制一人、批准一人、审核至少一人且互异;审核/批准不可改正文;提交锁定,全员审核后才能批准 |
| R11 | 文档/需求/验证/风险/合规链真实生产和历史可重建 | 业务操作产生版本节点与候选边,人确认生效;导出内容/哈希/批准快照一致;无伪造验证结论 |
| R12 | 项目有阶段、准入准出和结项 | 仅在提交审核/申请推进时执行正式缺项门禁;不合格不能推进;按固定快照决策并可追溯 |
| R13 | 对话、卡片、工作区为同一对象的入口 | 右栏收起仍能完成任务;刷新/重启不丢;过期卡片不生效;不以假数据替代真实产物 |
| R14 | 团队运行具备当前授权、事务一致、恢复和隔离执行 | 两项目多人并行、撤权、故障注入、备份恢复通过;禁执行仅为过渡,最终隔离后按策略开放 |
| R15 | 全部已批准目标有去向和真实证据 | 34 UR/68 SR/10 F 无漏项;实现、测试、部署分别登记,只有显式裁决可取消目标 |
### Scope and Completion Levels
核心完整交付 C1:U1–U14 加 U16,覆盖项目/权限、私域与协同、全部模板、三权、资料、知识、需求合规、生命周期及团队可用性。
最终扩展交付 C2:U15 的 F-01…F-10 各项完成或经用户明确裁定取消/替代;外部系统接入受凭据、平台授权与独立交付条件约束。
**C1 通过不能写成所有最终目标完成。** C2 未完成的目标保留在同一矩阵,不将“后移”改成永久非目标。F-09 已有较新两树一网展示方案,应并入 U11/U14,而不继续沿用早期延期状态。
完整方案不意味在一个大 PR 同时改完;按依赖交付,每阶段保留可回退、可独立验收的增量。
---
## Planning Contract
### KTD1. One Project Identity
推荐继续由 RDM 保存研发项目、成员、职责权威;基座提供共享项目上下文及私有会话/工件能力。用户看到的是**一个系统级项目**,宿主内部 ID 只作一对一技术映射,不能再产生每用户一个同名研发项目。
对照备选:把研发项目权威搬入基座需重新划分领域职责,成本更大;为每位成员复制基座项目会破坏唯一身份与追溯,不采用。
统一入口的创建/改名/归档均调用项目应用服务。RDM 产品界面不再暴露绕过该服务的独立“个人研发项目”创建路径;通用基座个人项目保留为基座模式能力,不混入 RDM 项目目录。
复用新合入的 HostBinding 表与命令,补宿主端存在性、绑定资格和实例域校验;不能仅凭 RDM 创建者权限接受任意 hostProjectId。项目目录分为成员工作目录与受限审计目录:普通成员必须看到加入的项目,但不因看见项目获得审计权。
项目对象包含稳定 ID、名称与规范化键、创建者、生命周期、权限策略版本、文档目录版本及宿主绑定。建议名称规则为去首尾空白、Unicode 规范化、拉丁字符大小写归一;展示原名,规范化键由数据库唯一约束保护。规则在迁移前用现有名称干跑确认,冲突由人裁定,禁止静默合并。
归档保留名称与身份;删除采用受控归档/软删除,不让新项目复用同名后被误认成旧项目。名称变更的历史同样留存。
成员可见同一项目不等于全系统用户可列出所有项目;未加入者的同名创建返回名称不可用,不泄漏成员、内容或审计。
RDM 项目+创建者成员角色+名称保留在同库事务建立;跨库宿主绑定采用幂等 provisioning→ready/failed 与可恢复补偿。绑定未完成显示初始化状态,禁止继续向默认项目写入。
业务只接受服务端从当前会话/对象解析的项目;客户端 projectId 是定位符,跨项目参数或不一致绑定拒绝。外部旧命令的空项目全量回退关闭;未归属历史仅受信迁移工具可访问。
### KTD2. Policy and Duties
普通业务动作的允许条件为:有效账号与项目成员身份 ∧ 平台上限 ∧ 项目 override(未设置则角色默认)∧ 资源可见范围 ∧ 适用阶段/状态 ∧ 操作所需文档职责。
“显式拒绝”优先;平台上限收紧不需逐一改旧 override 才生效。多角色合并仍受同一上限,冲突按显式拒绝收敛,不依靠前端按钮控制。
平台管理员维护角色、默认权限、可覆盖上限及受管配置;项目创建者/负责人只调整项目内范围。支持专业角色目录,但编制/审核/批准是**文档职责**,不等同于“工程师角色”或广义 doc.write。
项目创建不得触发管理员引导;管理员初始化与移交走受信管理入口和事务唯一约束。既有“双层管理员”裁定用于审计可见性,不自动扩大成私人内容阅读或三权签字豁免。
CreatedBy 固定记录创建事实;负责人变更另有显式委任/接替记录,不重写创建事实。任何接替均不能跨过管理员上限。
权限、成员与职责变更写入审计并递增 policy/duty 版本;长任务开始、敏感读取、恢复、结果投递、提交、下载都重验。前端撤按钮不足以撤权。
### KTD3. Private Data and Shared Knowledge
| 资源 | 默认读者 | 共享/派生规则 |
|---|---|---|
| 个人会话、Agent 中间过程 | 本人 | 不自动镜像项目流;他人模型也不能间接读取 |
| 上传原件、个人草稿 | 本人 | 文件分享只产生明确的只读授权;不因 projectId 相同开放 |
| 项目发布知识快照 | 被授权项目成员 | 原件作者明确将选定内容发布为项目知识;可检索内容与原件权限分离,保留来源/发布版本 |
| 受控文档正文与修订 | 指定三权人员及明确获授权者 | 角色授权随职责/状态校验;全员只读必须明确授予,不默认开放 |
| 文档树目录、状态、待办 | 按所需最小范围 | 不通过标题、摘要、计数或引用暴露无权文档;负责人可管理职责元数据不代表可读全文 |
| 项目审计中心 | 按已有创建者/管理员审计方案 | 私人原文、秘密和隐藏推理仍不直接出现在审计 DTO/导出 |
两树一网在项目内共享其业务知识和组织结构,**不等于每个节点的所有载荷对所有成员可见**。文档树仍保存要求+正文版本(Q8),正文节点继承文档 ACL;追溯遍历使用受限投影,不直接返回内部 payload。
明确“提交为项目资料”只发布选定知识内容;保留的原文件仍可私人。普通上传不自动发布全文,混合/存疑材料先确认。资料作者可发布脱敏摘要/摘录并保留批准的发布快照,使其他成员能使用该快照而无需读取私人原件。
审核所需依据应提供职责范围内的证据包:可读发布快照、明确原件授权或经确认的脱敏材料;仅有无权访问的私人引用时不能宣称证据已可核验。文档存储了私人资料的事实也属于披露,提交前必须处理发布授权。
撤销原件分享立即停止新访问与上下文注入;已经明确发布的知识快照按其独立发布生命周期处理,不把撤销文件链接误当成回收所有已批准知识。撤回发布知识时停止新使用,标记依赖文档 stale;历史受控快照的保留与可读性分别受记录保全及当前授权控制。
所有 HTTP、Host、索引/检索、卡片/SSE、预览下载、导出、图查询采用同一资源级决策;授权参数包含主体、项目、动作、资源类型/ID/版本、policyVersion。只读布尔项目授权无法表达这些边界,不因补齐项目 ID 就直接开放全项目工件。
### KTD4. Transaction and History Foundation
复用现有两树一网方案的原子事件、幂等、历史重建和 outbox,不再另造第二套事件中心。
在领域事务内完成预期版本校验、写台账、事件批次及幂等结果;提交后更新投影。跨宿主存储操作通过幂等步骤与 outbox,提交未知时先查结果再重试。
历史对象为 ID@version,切片原文与历史版本不可变;结构删改用软删除/取代/新事件。普通哈希用于一致性检查,不宣称具备外部防篡改或电子签名保证。
部分更新、角色调整、关系变化、合规 stale 标记与重放对等;同一历史水位必须还原同一文档/图/职责/审批事实,未知事件版本不得静默忽略。
旧数据先盘点归属及 ACL。旧 Agent-System 业务数据仍按 O9 不迁移;旧模板内容属于可复用资产,当前 RDM 数据必须保全,二者不得混淆。
### KTD5. Source-to-Knowledge Pipeline
统一上传、明确发布的对话内容、会议和外部研究的摄取契约:来源对象→私域留档→解析状态→相关性/发布决策→带锚点切片/标签→知识快照/索引→冲突与结论候选。
接入基座公开 ParseDocument,按原件保全、文本、表格、OCR、图像描述、页表锚点逐档标能力;不支持时留原件并明确说明,不把“收到了文件”当作“完整理解了内容”。
锚点使用 sourceId@version+页/表/段/偏移;快慢处理沿同一解析块精化,不把锚点替换成不可回跳的 slow:batch。chunk 与 slice 是显式多对多映射。
共享标签字典版本化,记忆侧描述标签与文档章节需求条件同源;已确认强制材料/旧有效依据不能被 topK 静默挤掉。自动分类及摘要用独立人工金标验证,不以同源样本给自己评分。
知识发布失败留下可重试任务,不静默计零后报全部入库成功。待裁定、拒绝、撤回的资料不进入共享检索;原件取回与上传台账同样鉴权。
### KTD6. Conclusions, Conflicts and Impact
结论必须绑定依据和材料水位,允许随着新内容提出新结论;模型决定是否足够形成有价值总结,冷却只控制通知频率,不能让“已有结论”永久阻止更新。
会议纪要结构化抽取结论/待办/待确认,各条带原发言或资料锚点。模型提炼不等于已批准项目事实;采纳由人完成,结果回两树一网。
冲突对象使用明确 conflictId/groupId 和候选版本。相似度只提供检测线索,不能充当语义矛盾的证据;保留双方陈述、出处、影响与建议。
文档层裁决选择本文档的依据;项目层裁决改变项目有效结论,由负责人或明确指定知识责任人完成。只关闭该争议,不把两个节点参与的其他争议一起关闭。
来源、需求、测试结果或规则变化产生影响清单,指向受影响文档和负责人;正文未改变也要显示“依据有更新/验证过期”。看板与收件箱被动汇聚,对话按任务节点集中处理,不频繁插话。
### KTD7. All Templates and Controlled Documents
复用 [模板对话生成子方案](2026-10-11-rdm-template-dialog-generation.md) 的模板元数据、结构、检索条件、格式和发布清单,以及 Run/ContextManifest/Proposal/DocumentRevision 设计。
完整模板台账覆盖 [69 类旧资产](../records/2026-10-11-rdm-template-inventory.md) 与报价 XLSX。逐份保留来源 SHA,拆分内容要求、格式约束和管理记录;去除旧“任务键=模板文件名”绑定。
模板按用途区分正文、纪要、汇报,绑定明确默认;缺模板或版本失效时拒绝“按模板生成”路径,不静默用自由文本代替。v10/v2 使用正式版本语义,不按字典序。
首批两模板先验证闭环,随后按资产台账完整迁入。每份上线模板均需有材料的成功样本及空缺/冲突反例;不能仅通过注册表计数宣称 69 类可用。
模板目录是组织资产,项目实例按适用性选择,但全部类型保持可配置可用。标准模板由用户后续提供(F-10),导入需差异评审及版本迁移;用户没有提供的标准模板不伪称已经替换。
三权面向每份文档:编制唯一、批准唯一、审核可多人且至少一人;三者互异。所有审核人通过后才可批准;审核/批准只能批注和通过/驳回,不改正文、不发起生成。
新文档无职责时任务停在可见“等待分配”,负责人可通过对话或管理页分配;其他成员可转交最小编制请求,不能转发其私人聊天全文。负责人可在上限内给自己分配其中一种职责,但不能同时兼任冲突职责。
提交冻结整文版本、模板、依据、职责与策略版本。职责变更、成员撤销或正文变动使受影响的待审决定失效;不能先让本人编制,再改职责给本人审核/批准同一提交版本。历史职责/操作身份参与分离校验,角色改名不洗掉已执行事实。
生成、人工修改、导入、旧命令、直接状态迁移必须经过同一编制与版本服务,不能从旧入口绕过。
旧章节职责和签署作为历史保留,不能拼成“整文已批准”;启用文档级流程前明确职责并处理旧活动审签,首个整文正式版本重新审签。驳回只增加内部修订,终批才产生新正式版并建立取代关系。
实际采纳的新旧章节组合须重新验依赖、术语、指标一致性;确认绑定该组合 hash,事务前重验版本。版本+引用/追溯+提案状态+领域事件全成或全败。
### KTD8. Requirements and Compliance Producers
复用已有 15 类受控节点、11 类边、四链视图、八完整性规则、快照、矩阵和导出器;补真实业务生产者及写入/确认入口。
需求台账支持批准基线要求的 UR/PR/SWR/HWR 等类型、父子分解及六维分类;保留原 UR/SR 编号兼容映射。用户需求先确认后分解,法规反推产生候选,不直接替人定需求。
设计、风险、风险控制、测试计划/执行结果、验证、确认、设计转换、SOUP 等对象通过各自业务动作产生版本节点;字符串 LinkedSections/LinkedTests 迁为受控版本边,映射歧义保留待处理。
模型只推荐合规关系,授权人确认转正;目标升版标 stale,不自动转移旧签名/旧验证结论。验证结果必须关联实际被测版本、执行者与证据文件;没有实际结果时仅可生成计划、空表或 NOT_RUN 草稿。
法规双通道必须是受控知识库+真实联网搜索/抓取的独立证据,保存 URL、取得时间、文档版本、片段锚点与可复核快照。模型生成 URL 不算网络核验;失败清楚标单通道/未核实。
本方案使用项目已批准的合规数据模型,不作具体标准符合性认定。专家校准负责规则、链视图与交付格式,保留意见来源及版本;不以数据结构存在代替合规验收。
### KTD9. Lifecycle, UI and Agent Execution
项目阶段配置、文档适用目录与准入准出规则版本化;当前字典为既有种子基线,关于进一步阶段合并的旧未裁定意见不擅自生效。
提交审核和申请推进时执行模板内容要求、缺项、职责、冲突、合规完整性门禁;有材料不等于满足要求,所有候选边也不等于冲突。可接受的不适用必须说明理由并由有权者确认。
阶段推进/回退/结项记录固定对象集合、规则和决策;外部完整变更引擎在 F-02 交付前,当前保留撤回重审、冲突和影响提示,不能直接改批准基线。
沿三栏工作台:左侧统一项目及私有会话;项目管理承载成员/权限/文档职责/阶段;工作区承载树、文档、追溯与看板;右侧工作/文件用于待办和唯一预览。对话与这些入口访问同一服务。
所有业务操作均可经自然语言准备并在必要节点显式确认。查询/总结不触发写入;模糊“继续”只作用于已展示且未过期的请求。工具说明渐进注入,RDM 编制/审阅配方作为产品资产,内核保持通用。
执行自由度遵 Q7/D10:检索、解析、归纳、候选生成可自主;三权、基线、正文生效和合规边确认受确定性门禁约束。模型不能自签或借工具权限继承管理员能力。
### KTD10. Durable Jobs, Storage and Deployment
Run/Step 保存发起主体、项目、输入引用、模板/提示词版本、检查点、水位、幂等键和恢复状态;模型调用不持数据库长事务。取消、审批与恢复针对同一持久对象,权限变化后拒绝续跑或投递。
重启仅标 failed 是可观察失败,不是任务恢复。最终必须能安全续跑,或对未知副作用停在需人工确认的恢复状态;禁止无条件重放。
复用多人存储方案已有工作:团队 PostgreSQL 为权威、Redis 可丢失、预算可配置、单实例先行。RDM 领域库、原件、知识发布、任务与检查点必须显式纳入迁移/备份,不能只设置 Backend PG DSN。
多实例验收包括领域唯一性、事务、数据库发号、运行 owner/epoch、队列领取、事件追赶和共享工件;两个 dataDir 的宿主 smoke 不证明 RDM 多实例写入一致。
多人隔离前继续硬禁高风险代码执行;最终交付隔离执行后端、目录/网络/资源约束和受控开放,符合 SR-G16,不以永久禁用替代能力。
发布包必须包含 RDM 插件接线、模板/字典/提示词资产和明确组件清单;离开源码目录仍可启动。部署另设固定环境与授权,安装、升级、备份、恢复、回滚均有可执行操作说明与演练证据。
### High-Level Technical Design
```mermaid
flowchart TB
P[平台账号与角色上限] --> A[统一动作与资源授权]
C[系统级项目目录和成员] --> A
U[各用户私有会话 原件 草稿] --> A
A --> K[明确发布的项目知识快照]
K --> N[项目笔记树]
T[已发布模板及文档职责] --> D[项目文档树 要求和版本]
N --> G[项目追溯网 依据 决策 影响]
D --> G
A --> R[持久任务与提案]
N --> R
D --> R
G --> R
R --> H[编制确认 审核 批准]
H --> V[固定整文及合规快照]
V --> X[DOCX XLSX 可审计导出]
```
```mermaid
sequenceDiagram
participant U as 编制人
participant S as 领域应用服务
participant J as 持久任务
participant D as 领域存储
participant R as 审核和批准人员
U->>S: 项目内编制请求
S->>S: 当前权限 职责 资源检查
S->>J: 固定模板 输入和目标版本
J-->>U: 进度 持久提案 差异
U->>S: 采纳固定提案
S->>D: 事务提交版本 依据 追溯
U->>S: 提交审核
S->>D: 完整性门禁并冻结整文
R->>S: 当前身份审签固定快照
S->>D: 正式版及批准记录
S-->>U: 可预览下载的固定版本
```
```mermaid
stateDiagram-v2
[*] --> Provisioning
Provisioning --> Active: 项目和绑定均就绪
Provisioning --> Recovery: 初始化失败
Recovery --> Provisioning: 幂等恢复
Active --> StageReview: 申请推进
StageReview --> Active: 通过并进入下一阶段
StageReview --> Active: 驳回维持原阶段
Active --> Closing: 申请结项
Closing --> Archived: 准出与确认通过
```
文档状态独立为编制中→审核中→待批准→已批准;驳回回编制中,新版本获批才取代旧正式版。任务运行、文档审批与项目阶段不能合并成一个“完成”标记。
### Public Contracts and Existing Plans
| 契约组 | 场景与公开面候选 | 现有缺口及兼容方式 |
|---|---|---|
| X1 项目绑定和生命周期 | RDM 项目服务与 Host 项目上下文创建/解析/成员目录 | 现有个人项目 CRUD 无统一约束;新增可选插件适配,RDM 启用时所有入口走同一服务;通用基座模式不被偷换 |
| X2 资源动作授权 | 身份+项目+action+resourceRef+version;HTTP/Host/检索/下载同判定 | EXT-8 只读 bool 太粗;动作矩阵尚非完整公开生产接线;版本化扩展、默认拒绝,旧读取适配器不获得写权 |
| X3 资料发布与解析 | 原件保全、ParseDocument、知识发布/撤销、chunk 映射 | 部分能力已在基座;RDM 逐项采纳并组合验证,缺失能力才申请新面 |
| X4 持久任务和恢复 | 受限 Host 工厂、Run/Step、取消/确认/状态事件 | 复用现有能力及团队存储路线,RDM 不保存旧 Host 凭据,不创建第二套账号 |
| X5 工件和外部证据 | 固定文档/图快照导出、artifact 绑定、真实 web search/fetch | 输出引用不等于实际文件/网络证据;受控任务产物与可核验抓取结果走公开面 |
每个缺失扩展按 RDM AGENTS 的场景、期望符号/路径、现有组合不足原因、兼容方式四要素申请;不导入 Backend internal,不修改 RDM pins 内实现。
与 [两树一网方案](2026-10-11-rdm-two-trees-trace-audit-integration.md) 共用项目绑定/授权、事务历史和审计展示;与 [多人存储方案](2026-10-11-collaboration-storage-and-distribution.md) 共用 PG、运行所有权、预算、恢复和隔离;模板子方案为 U7/U8 的详细设计输入。
在途核对:本轮远端查询 Dev #337 为存储迁移工具/恢复操作说明组合,#336 为 Generative UI U2,#317 为启动检查;不能把它们的未合入能力计入当前基线,也不重复立项。RDM 新增 `docs/proposals/2026-10-11-u1-base-extension-requests.md` 已提出平台身份能力与可信当前项目两项扩展,X1/X2 应承接该申请而不是再写第二份。正式立项时再次刷新在途状态。
原 [RDM 阶段总案](2026-10-07-rdm-phase-plan.md) 的历史进度保留,新补齐顺序批准后回填该案及 RDM requirements/10,不制造多份互相覆盖的“最终状态”。旧广义完成声明只保留为历史记录,另做需求→证据重新映射,不改写其原始收据。
---
## Implementation Units
优先级 P0 为核心安全/正确性与用户路径,P1 为完整核心交付,P2 为外部扩展;P1/P2 不表示可永久省略。责任为仓/模块,具体 owner 在立项时明确。
依赖顺序:U1→U2→U3;U4 与 U7 可在各自契约固定后并行;U9→U5→U6,同时 U5→U12 真实法规双通道;U7 的首批模板和 U12 就绪→U8 首批闭环→U16 全文档族推广;U8/U11 汇合到 U10(经 U8 已包含 U12);U13 与业务开发并行收敛,最后 U14;U15 按子目标独立立项。
| 单元 | 交付主题 | 主要范围 | 前置 |
|---|---|---|---|
| U1 | 需求、证据和组合契约 | Documents/RDM requirements 与 pins 清单 | 无 |
| U2 | 系统级项目与管理入口 | RDM projects/members、基座项目适配、Frontend | U1 |
| U3 | 权限上限、私域与资源授权 | RDM perms、基座资源/Host/检索边界 | U2 |
| U4 | 原子事件、历史和旧数据归属 | RDM domain/store/eventlog/replay | U1、U2 契约 |
| U5 | 完整资料摄取与检索 | upload/parse/ingest/fbhost | U3、U4、U9 |
| U6 | 结论、冲突、两层裁决与影响 | conclusions/fc/kanban | U5 |
| U7 | 全资产台账与首批模板契约 | templates/structure、资产 bundle | U1 |
| U8 | 整文生成、三权和版本导出 | compose/draft/review/docx | U3、U4、U5、U6、U7、U9、U12 |
| U16 | 全部文档族迁移和真实验收 | 69 模板及 XLSX、契约与样本 | U8 |
| U9 | 持久快慢任务与对话入口 | RDM jobs/plugin、基座运行/卡片、UI | U3、U4 |
| U10 | 项目阶段、缺项门禁与结项 | projects/baseline/review | U8、U11 |
| U11 | 需求/风险/验证/合规生产闭环 | requirements/compliance/chainviews/exports | U3、U4、U6 |
| U12 | 真实外部研究与法规双通道 | regcheck、公开检索/抓取能力 | U3、U5、U9 |
| U13 | 团队存储、隔离执行和运行恢复 | RDM store、Backend/Squad/Native、发布包 | U1、U4、U9 |
| U14 | 全量验收、自举和用户上线 | 测试、CI、部署/恢复资料 | U1–U13、U16 |
| U15 | 最终后续目标逐项实现 | F-01…F-10 责任模块 | 各子项按下表 |
### U1. Baseline and Evidence Reconciliation
覆盖 R15。统一 34 UR、68 SR、10 F 的解释,明确本轮 D1–D6;修正文档状态漂移及历史测试覆盖映射,固定实际 RDM/Backend/Frontend/UI/Native/Squad 组合。
文件:RDM requirements/README、01/03/04/08/09/10、U0/V2.2 主记录;Dev proposals/INDEX 与扩展申请;新增需求证据矩阵(本轮候选已给出)。
方法:先评审来源和范围,再按最小契约申请/采纳 X1–X5;已有能力只补接线,不重新立项重写。U1 保留在途 PR 及 owner、版本和接受条件。
验收:全部原编号各有最终行为/工作包/测试入口;没有历史 PASS 自动变成当前 PASS;被覆盖的旧表述有指向当前解释的入口。
### U2. System Project and Management
覆盖 R1/R3/R5。交付创建/改名/归档、授权目录、成员加入/移除、创建者管理、宿主绑定及用户可用项目管理页面/对话路径。
文件:RDM internal/projects/projects.go、internal/members/members.go、rdmapp/projects_api.go、runtime.go、plugins/rdm/plugin.go;Backend store/projects.go/server 项目入口/公开适配;Frontend TaskSidebar/ProjectSettings 与 RDM 工作区。
测试:扩展 projects_test.go、成员测试及新合入 u1_auth/u1_surface 用例;新增项目绑定和浏览器流程用例。两用户同名并发、规范化碰撞、改名碰撞、归档、创建者角色写失败、宿主绑定失败重试、绑定他人宿主项目拒绝、成员加入后同 ID 可见、非成员目录及默认项目回退拒绝。
出口:真实用户可用统一研发项目管理;测试不能直接向数据库播种一个“已经绑定”的项目绕过创建路径。
### U3. Policy, Resource Access and Privacy
覆盖 R2/R3/R4/R5/R10。完成专业角色默认/上限/覆盖、文档职责分配授权、资源级读写策略与即时撤权;交付 X2 公开契约和全部生产入口接线。
文件:RDM perms、perms_api.go、sharing.go(实际路径在实施时核对)、upload 台账/确认、plugin 守卫;Backend extension、server、hostcaps、retriever、cardsvc;新增 resource_authz_test.go、隐私浏览器用例。
测试:上限拒绝覆盖、撤上限后旧许可失效、无效/停用/非成员职责指派拒绝;同项目私聊/原件/草稿、关键词/计数/摘要/导出不泄漏;职责读取与明确分享允许;普通三权人员可合法导出本文档而无全项目审计权;审计读取许可不能变绑定写权;撤权后 SSE/模型结果/下载立即拒绝;建项目不成为管理员。
出口:原件私有且项目发布知识可被其他成员合法检索;HTTP 与 Host 行为一致,不出现“页面可读但模型不可读”或反向泄漏。
### U4. Atomic Domain and History
覆盖 R5/R8/R9/R10/R11/R14。将多事件操作、台账、幂等和 outbox 收入单一领域事务,修复投影先写、重放不对等与历史快照不完整。
文件:RDM domain/eventlog.go、replay.go、payloads.go、store、doctree.go、tracenet.go、compliance.go;新增 transaction_fault_test.go/history_replay_test.go、迁移映射清单。
测试:在版本、建边、职责记录、快照阶段注入失败;提交全成/全败,重试唯一;跨项目边拒绝;同水位重启前后对象/签署/stale 相同;未知事件拒绝;遗留空项目只读隔离且不自动归属。
出口:真实持久库故障证明一致性;授权不明历史留待裁定,不以清空数据修复测试。
### U5. Ingestion, Parsing and Retrieval
覆盖 R4/R5/R7。统一原件、上传对象、相关性、发布、解析锚点、标签、知识索引与补偿;消费公开 ParseDocument。
文件:RDM upload.go、parse.go、ingest.go、relevance.go、llm_summary.go、fbhost/adapter.go;公开能力差距经 Backend 扩展;测试 upload/parse/publish_consumption,新增 anchor_roundtrip_test.go。
测试:PDF/Word/Excel/PPT/图片与文本各能力档、重名重传、损坏/大文件/解析中断、表格宽列、部分成功、私有和待裁定不发布、确认重试不重入、慢处理保留页表位置、发布失败重试、跨项目检索负例。
出口:真实素材的原文→切片→检索→引用可回跳;性能按已批准 SR-N1 的样本规模协议测量,不用空文件证明时限。
### U6. Knowledge, Decisions and Notifications
覆盖 R5/R8/R11/R13。结论水位更新、会议三类抽取、冲突组、两层裁决、依据变化影响清单与低打扰通知。
文件:RDM conclusions.go、domain/fc、pending/todo、kanban.go;新增 conflict_scope_test.go、conclusion_update_test.go、impact_notification_test.go。
测试:已存在结论后新增资料仍可提出更新;相似但不冲突的反例;同一切片参与多个争议只关闭指定争议;编制人只改本文档选择,负责人裁定共享结论;正文未变但依据更新仍提醒;受限来源不在通知泄漏。
出口:知识更新和文档写入是独立受控动作,用户能知道“谁改变了哪条依据、影响谁”。
### U7. Template Contract and Pilot Assets
覆盖 R6/R9。登记全部 69 类及 XLSX 资产;按模板子方案 U1/U2 建立公共章节结构、内容/格式约束、发布版本、默认用途、稳定 sectionKey 和 bundle,先结构化项目建议书、竞品分析两模板。
文件:RDM docs/templates、templates.go、structure.go、domain/doctree.go;69 类台账及 XLSX 资产;template_contract_test.go/template_instance_test.go 与每模板验收样本。
测试:台账无遗漏,首批用途匹配、v2/v10、多版本保留、模板升级迁移提案、无源代码运行和格式契约;两模板能正确实例化,不用静态检查冒充真实生成。
出口:公共模板契约和首批两模板可供 U8 使用;其余模板标记待迁移/验收,全部完成由 U16 承接,避免 U7 与生成能力互相等待。
### U8. Document Generation and Three Duties
覆盖 R6/R9/R10/R11/R13。复用模板子方案 U3–U5,交付文档级职责、持久提案、完整来源、差异采纳、锁定审签、正式版本和批准快照导出。
首批竞品分析模板含法规要点,完整验收以前置 U12 的真实双通道就绪为条件,不能用模型生成 URL 或单通道占位降低模板要求。
文件:RDM compose.go、draft.go、domain/fb/writegate.go、domain/review.go、docx.go、plugin、编制 skill;新增 document_revision_test.go/document_duties_test.go,真实三人浏览器编制案例。
测试:无职责等待/分配/接续;非编制人所有写入口拒绝;审核人不能改正文;审签走真实总线不传伪造身份;多审核人缺一不能批准;更换职责不能让原作者自审;旧卡/旧版本拒绝;部分采纳重验整文;撤权/并发/故障原子性;真实 DOCX 打开和引用可达。
出口:两份试点从真实资料经真实模型和三人账号完整通过,随后 U16 全量文档族推广;有实际结果才能生成验证报告通过结论。
### U16. All Document Families
覆盖 R6/R9/R10/R11,依赖 U8 首批真实闭环。按原 69 类台账逐族迁移、发布和验证,现有报价 XLSX 独立交付;需求、设计、风险、测试/验证、评审等文档族全部有结果。
文件:RDM docs/templates/registry 与全部模板、XLSX 资产/renderer、各模板结构/格式/样本测试;原件哈希与迁移差异写入台账。
测试:每份至少一个有材料的真实生成与审签导出正例、一个空缺/冲突反例;特有表格、章节、引用、公式、格式与职责均检查。编制共同契约复用 U8,不为每份模板新写一套业务流程。
出口:69 类均有已发布可用正文模板及对应运行证据,XLSX 实际打开检查通过。公司新标准模板另列 F-10;平台全量覆盖不得用项目内“不适用”豁免。
### U9. Durable Task and Conversation Infrastructure
覆盖 R7/R9/R13/R14。建立持久快慢任务、输入与检查点、取消/恢复/幂等、对话内卡与工作区同源;修正 RDM 普通文本入口和插件工具投影。
文件:RDM slow.go/slowledger.go/plugin/web;Backend 公共任务/HostFactory/事件面;现 slow_persist_test.go 加真实恢复语义,新增 task_recovery_test.go 与对话路由用例。
测试:跨刷新/重启/断网恢复;任务接纳后权限撤回;重复取消/确认;模型超时与外部结果未知先查询;seq 乱序丢弃;普通自然语言不触发空值异常,查询不落写任务;持久记录与页面计数同一状态。
出口:任务失败、部分完成、待确认、恢复中均可见,后台工作不会在进程重启后仅静默丢失。
### U10. Stage Gates and Project Closure
覆盖 R10/R11/R12/R13。阶段配置、推进/回退/结项、文档提交门禁、条件性不适用和决策快照;与内容/合规规则共用判断结果。
文件:RDM projects、baseline.go、review 服务、plugin;新增 stage_transition_test.go/document_submit_gate_test.go 与生命周期浏览器路径。
测试:有资料但未满足内容要求不能提交;无关候选边不误阻断;必需验证缺失/过期阻断;合法不适用可经有权者确认;上传不催缺项;陈旧推进卡和并发阶段变更拒绝;结项后只读与受控恢复。
出口:用户从立项到结项均可通过对话完成,不靠管理者手改状态。
### U11. Requirements and Compliance End to End
覆盖 R8/R11/R12/R15。实现需求分解/六维分类、风险/验证/确认/SOUP 业务录入和版本生产,合规边建议/确认、完整性规则、四链视图、审计展示与精确快照导出。
文件:RDM requirements.go、compliance.go、cderived.go、chainviews.go、cgraph_export.go、plugin/web;新增 producer_to_graph_test.go/compliance_replay_test.go;复用既有合规测试而不只域层播种。
测试:真实命令新增/升版需求到图、分解来源可追、候选边不能自动生效、风险控制缺验证、验证版本不一致、SOUP 标记、旧快照查询/导出相同、受限端点不泄漏、规则版本变化导致缺口重新评估。
出口:已有读模型真正有生产数据;专家校准意见、规则版本与证据映射齐备。全图视图保持渐进,不强迫用户操作大图。
### U12. Real External Evidence
覆盖 R7/R11/R15 与 UR-13/14。真实法规知识库与网络双通道,外部资料入树,冲突和降级明确;模型答案与取得的网页原文分开。
文件:RDM regcheck.go/domain/regcheck;Backend 公共搜索/抓取接入(有则复用);regcheck_test.go 扩展真实受控来源回放及失败样本。
测试:模型编造 URL、链接不可达、标准版本不一致、两通道冲突、仅单通道、来源权限撤回、摘录与正文不符;均不能显示双通道已核验。
出口:每条外部结论有实际检索/获取记录、原文快照和支持关系;外网不可用时仍可工作但不伪称核验。
### U13. Team Runtime and Isolated Execution
覆盖 R14 与 SR-G16/SR-N1/N4/N5。复用团队存储计划,把 RDM 领域数据纳入 PG/事务/任务恢复;实现隔离执行档、资产发布包、备份恢复/迁移回滚和运行可观察性。
文件:RDM domain/store、projects/members/perms、原件/慢任务存储;Backend/Squad/Native 对应公开边界;migrations、安装/升级清单;新增 rdm_pg_test.go/rdm_multi_instance_test.go 与隔离执行黑盒用例。
测试:SQLite→PG 干跑/核对/失败回滚、旧库名称冲突、原件与 DB 一致恢复;双实例同名/同文档竞写、epoch 过期写入拒绝、重连追赶;执行不能越目录/越项目/读秘密/超资源;取消后子进程停止或进入明确恢复状态。
出口:先单实例团队版通过,再开放双实例;使用脱敏固定数据集,记录容量阈值而非仅声称支持 100 人。
### U14. Full Acceptance and Operational Delivery
覆盖 R1–R15。逐条重放需求矩阵、全部文档、真实三用户/两项目、真实模型、真实浏览器、自举与安装包;接上固定 HEAD CI 和独立重放。
文件:RDM docs/requirements/09、业务 E2E/fixtures、CI、release manifest、安装/回滚/恢复说明;Dev 组合记录;新增最终验收台账,不篡改历史原始收据。
测试:上述正常/拒绝/故障全部场景;真实自举材料不能由测试临时编造“支撑资料”;全部上线模板实际打开产物;项目/私域/职责隔离、性能、重启恢复和安装包离线资产校验。
出口:每条声明绑定命令、精确对象、输出和来源;业务完成、合入、部署、用户验收分别签收。用户当前实例在部署阶段明确选定,先备份再切换,不擅自清理旧进程。
### U15. Remaining Final Goals
| 原目标 | 完整路线与本轮去向 | 前置/责任与完成判据 |
|---|---|---|
| F-01 飞书全套 | 渠道、身份绑定、权限映射、虚拟人、文件/版本链接 | 核心授权和固定文档快照先完成;独立连接器任务固定外部租户/权限/凭据;外部回调不能绕过同一三权和资源权限 |
| F-02 完整变更流程 | 按公司流程选择系统内流程或外部集成,七步闭环逐项有对象和状态 | 先评审业务权威及外部 owner;实施追溯的申请、影响、评审、批准、执行、验证、关闭;当前影响提示不冒充闭环 |
| F-03 精细分享 | 保留显式授权与撤销;会话/部分会话分享仅在用户再次明确启用后开放 | 本轮私聊私有为硬默认,不能以最终扩展名义自动共享;范围、接收者、版本及撤销语义需独立批准 |
| F-04 时间权重 | 内容新旧、版本、来源质量可配置排序,冲突仍由人裁决 | U5/U6 后,固定检索评估集及配置版本;效果对照和公平覆盖达标,不靠“越新必正确” |
| F-05 代码工具 | GitLab 等只读代码、版本、缺陷与需求关联 | 外部仓库授权与读取契约、可验证 commit 绑定;不包含擅自写代码/推送权限 |
| F-06 交互收敛 | 纳入 U9/U14:看板、卡片、领域工作区同源 | 单一状态所有者、刷新/事件/撤权一致、右栏关闭无能力缺失 |
| F-07 遗留决策 | 重建 Q/O 决策台账,逐项定论或保留具体阻塞 | 不能把问题组当已确定功能;阶段划分、专家规则、对抗验证形态等按来源和裁定处理 |
| F-08 难度与人机边界 | 评估表、任务分工建议、人工为主的降级、独立质量检查 | U7/U9 后,明确谁评估、输入和证据;高难任务不伪装全自动完成,人工意见留痕 |
| F-09 追溯可视化 | 按 10 月 11 日已批准展示方案纳入 U11/U14 | 项目树/一跳关联/审计时间线/四链与矩阵可用且鉴权;不是继续无限延期 |
| F-10 公司标准模板 | 用户提供后按 U7 模板发布/映射/差异迁移机制替换 | 需实际模板文件及评审责任人;旧文档版本保留,标准模板逐份真实生成验收 |
这些目标没有被删除。F-01/02/03/05/07/08/10 所需外部授权、组织裁定或输入未齐时,分别记阻塞对象与责任人;核心已有能力可继续交付,但最终全范围不得提前关闭。
---
## Verification Contract
本轮仅调查与文档验证;业务 PASS 一律不得由本方案文字推断。
| 验证层 | 范围与工具入口 | 证据与退出条件 |
|---|---|---|
| 资产和静态 | 需求矩阵、模板契约、安装包资产 | 34 UR/68 SR/10 F/69 模板全部有去向;链接、schema、版本和文件均可核 |
| 领域单元 | RDM `make test`、针对变更新增拒绝/边界/故障用例 | 事务/职责/版本/门禁明确正确;mock 只证明机制 |
| 总线/公开契约 | 注册 schema→可信身份→handler→领域服务;实际工具投影目录 | 不绕过 schema、登录与权限;旧命令和 UI/API 同一行为 |
| 持久集成 | 真实 SQLite/PG、原件/索引/任务、进程故障重放 | 无已确认数据丢失/静默重复生效/跨项目泄漏;迁移和恢复可复核 |
| 用户全链路 | 真实三权账号及普通成员、两个项目,真实浏览器 | 立项、分配、私有上传、发布知识、生成、审签、导出、阶段推进;刷新/重启/撤权一致 |
| 模型任务级 | 固定素材与版本,前后对照并保留真实调用 | 正确模板/来源、冲突与空缺诚实、权限不越界;人工盲审语义支持,不只看引用 ID 存在 |
| 交付文件 | 实际 DOCX/XLSX 与 Office/LibreOffice 打开 | 内容、表格、格式、来源、签署和快照一致;报告不能编造真实测试结果 |
| 运维与容量 | 固定环境,10→30→100 用户阶梯与故障演练 | 以已批准存储方案量化合同及 SR-N1 为准;预算和数据规模公开记录,跳过的 PG/Redis 项目不算通过 |
| 正式准入 | RDM 与 Dev 固定组件 SHA、CI 链接/身份、独立重放 | SELF/GATE/REPLAY 分开;本地通过不能代替人工评审、平台准入或线上验收 |
关键用户验收样例:
1. A 创建项目,B 同名创建被拒;A 加入 B/C/D 后大家看到同一个项目,彼此会话仍不可见。
2. 平台允许成员管理但禁止某动作,A 的项目 override 不能放大;管理员撤销上限后旧任务和旧卡片也失效。
3. B 上传私有原件并发布一段经确认知识;C 可使用该知识而不能打开 B 的原件,D 的搜索、计数、摘要不泄漏它。
4. A 指派 B 编制、C 审核、D 批准;B 生成,C 只能批注;D 等全部审核通过后批准,A 不能凭负责人身份代批。
5. B 在审核中改正文、切换成审核人后自审、旧卡批准新版本、跨项目伪造 sectionId 均被服务端拒绝。
6. 资料升级但文档未变,看板仍显示依据更新;编制人选本文档依据不自动改变共享结论。
7. 断网/重启后恢复同一任务与提案;重复采纳只有一次内容版本;版本写入或建边失败不出现半条追溯。
8. 已批准旧快照与当前修改并存,导出旧正式版仍得到旧内容/旧依据/旧签署;合规报告使用同一水位图和 hash。
9. 69 类模板及报价 XLSX 分批全部真实验收;没有资料的报告不生成不存在的实验/测试结果。
## Definition of Done
当前方案阶段:用户关键口径准确落盘,所有原需求与后续目标有追溯映射,源码差距与运行未知分开,工作包含依赖、责任模块、文件、验收与停止条件。
核心产品 C1:U1–U14 及 U16 对应矩阵证据全部齐备,真实项目管理、隐私协同、全部文档三权与导出运行可用;没有把历史桩测试当真实验收。
最终目标 C2:U15 每项实现验证,或用户明确取消/替代并更新权威需求。只“已备案”或“后移”不能关闭最终目标。
正式上线:固定目标实例和制品、完成迁移/备份/恢复/回滚验证、取得对应部署授权并通过用户运行验收;上线与代码合入分别记录。
优先下一步为 U1:固化本次总体范围、修正基线/证据口径,并细化 U2/U3 的项目与资源授权公开契约。其直接解决当前用户无法管理同一项目、创建者无法完整配置三权、私域与共享层可能混用的问题。
本轮“所有文档都加入并实现”和“三权要实现”已作为明确交付要求记录;由于同时要求先完成全系统目标核对和完整方案,本轮停在可评审总体方案,不把尚未评审的新跨仓/权限设计直接实施。
### Decisions Still Required
用户已确认的 D1–D6 不重复请求。仍需评审的是本总体方案的技术路线、U1–U16 分工和交付边界;实施前固定目标运行实例、团队部署档及具体负责人。
进一步阶段合并、外部完整变更流程归属、外部系统租户/凭据、公司标准模板和专家校准结果有明确后续依赖,不阻塞当前项目/权限/模板地基工作;未齐备时不伪造完成。
各阶段沿 `Dev:policy/delivery.md` 人工评审;若后续要求连续实施,应明确覆盖的阶段和终点,发布、保护规则变更等双钥匙边界继续保留。
## Appendix
原始来源:S:35–76 与 D:75–88;RDM requirements/README、00、01/03/04/08/09/10;U0、V2.2 已批准裁定。矩阵中给出每条需求的原文位置。
设计依赖:两树一网展示方案 r1、多人存储方案 r1、模板对话生成方案及 69 类资产盘点。涉及 API 的名称均为候选设计,正式符号由公开契约申请确定。
本轮没有联网核验法律或标准条款,也没有声称系统已符合任何特定法规;本方案讨论项目既定需求、数据追溯与实现验收。
## 2026-10-13 项目成员闭环增量
用户复现宿主项目成员保存成功、成员登录不见项目且不能建对话,已批准针对 U2/U3/U5 的方向与阶段 1–9 连续推进。具体实施主记录为 [系统项目、成员工作入口与私域协作闭环 r1.1](2026-10-13-system-project-membership.md),验证/组件/PR/CI 结果在关联 Dev 任务卡维护。当前实现候选已覆盖统一项目、全局名称、成员个人会话、领域分片、私域与发布知识,以及旧项目显式修复;组合验收与正式 tag 消费仍推进中,不据此声明全部 U2/U3/U5 或总目标完成。部署、8788 数据修复与清理仍未授权。
@@ -0,0 +1,399 @@
---
title: RDM 基于模板与两树一网的对话文档生成方案
type: feat
date: 2026-10-11
execution: code
artifact_contract: ce-unified-plan/v1
product_contract_source: legacy-requirements
---
# RDM 基于模板与两树一网的对话文档生成方案
修订:r1.1,首批顺序已确认,其余方案待用户评审。需求负责人:weichen;方案编制:Codex;实施负责人:待立项指定。
本轮授权终点是调查和方案;业务实施、模板迁移、模型试验、部署与运行验收均为 NOT_RUN。
本文件为模板生成子方案正文;总体范围、最新现状及优先级以[最终目标完整交付方案](2026-10-11-rdm-final-target-completion.md)为准。任务记录:Dev `.task/feature-rdm-template-dialog-plan.md`。
本案资产/代码表固定于 RDM 0081628a;本轮期间 d8d7e743 已新增项目绑定、部分命令授权和管理员引导修复,增量差距见总体方案,不再把旧表当作最新全系统状态。
路径前缀约定:`RDM:` 指 Agent-System-RDM;`Legacy:` 指旧 Agent-System;`Dev:` 指 Agent-System-Dev。
## Goal Capsule
用户在项目对话中说出需要编制或更新的文档,系统选用明确版本的模板,从该项目有权使用的知识与文档中组织依据,生成可审阅、可追溯、可继续修改的草稿;编制人确认后形成内部版本,再经三权流程产生可导出的正式文档。
推荐在已有 RDM 插件内补齐生成闭环,复用基座的模型、任务、卡片和工件能力。模板决定文档结构与格式;笔记树提供知识;文档树承载文档及章节版本;追溯网记录依据、派生与影响关系。
本方案涵盖 69 类历史文档资产的接入路线,首批用项目建议书和竞品分析验证完整链路,再扩展全部文档。此顺序已由用户于 2026-10-11 明确确认:“先打通项目建议书、竞品分析,再扩展全部文档”;需求、设计、验证和其他文档族的后续批次仍待细化。
实施前先评审本方案及与既有两树一网方案的任务分工;任何设计批准不自动包含迁移、发布、合入或部署授权。
---
## Product Contract
### Problem Frame
系统确实有大量历史模板,但当前 RDM 的文档类型目录、模板注册表、章节树、对话命令和导出器尚未形成一致的产品路径。
需要解决的是“用户能在对话中可靠地编制整份体系文档”,不能以模板文件存在、命令注册或模型返回一段正文作为完成标准。
### Current State
调查为 SELF·源码与资产检查,未查询业务数据库、未登录应用、未做真实模型或浏览器验收。
命令原始输出和对象 SHA 经 `make evidence` 记录于任务卡;静态控制流推导与运行结果分开。
| 对象 | 本次调查基线 |
|---|---|
| Dev | `95992d751f0a6ea8e345109dbb6b9367d9055e92` |
| Dev Backend | `3def5259023806a49ab84f885b7d220333cccde6` |
| RDM | `0081628a10ec48a36537c6eced11a57439c986fa` |
| 旧 Agent-System | `ed4e17c81974c6d2b126fedb1ca4ed1e2c6c207f` |
| RDM Backend pin | `421fee81c314c05530bc809e224b5d0818ec3472` |
Dev 与 RDM 实际依赖组合不同;不能以 Dev 最新扩展已存在推断下游已接通。
| 资产/能力 | 盘点结果 | 含义 |
|---|---|---|
| 旧 Markdown 业务模板 | 69 份:bd 7、rd 60、pm 1、tm 1 | 是可复用的历史内容资产 |
| 旧报价 XLSX | 1 份 `templates/xlsx/cdo_quote.xlsx` | 单独登记,不并入 69 个 Markdown 文档类型 |
| RDM 文档类型字典 | 69 个,与旧模板文件名集合一致 | 目录已迁入,不等于模板已迁入 |
| RDM 注册模板 | 4 个,均为 v1 | 项目建议书、竞品分析、周报、评审纪要 |
| 已绑定文档类型 | 3 个:`rd_proposal`、`bd_research`、`rd_design_plan` | 其余 66 种未绑定注册模板 |
| RDM 自举文档树 | 10 份文档、22 个章节 | 是一个自举项目结构,不是 69 类的通用实例化 |
| 章节生成 | `Compose` 调用 `Host.Complete` | 已有真实模型调用路径,运行质量未验证 |
| 写入/审签/导出 | 有 apply、版本、三权域模型和 DOCX 代码 | 需补端到端契约与运行验收 |
资产依据:`Legacy:templates/docs/`、`RDM:internal/domain/data/labels_seed.json:68`、`RDM:docs/templates/registry.yaml:4`、`RDM:docs/structure/rdm-self.yaml:1`。
| 模板 | 绑定类型 | 当前用途与问题 |
|---|---|---|
| `review-minutes@v1` | bd_research、rd_design_plan | 评审纪要,不应默认替代调研/计划正文 |
| `weekly-report@v1` | rd_proposal | 周报,不应默认替代项目建议书 |
| `project-proposal@v1` | rd_proposal | 业务正文模板,含内容要求与排版说明 |
| `competitive-analysis@v1` | bd_research | 业务正文模板,含内容要求与排版说明 |
当前关键缺口:
| ID | 源码事实或静态推导 | 对本方案的影响 |
|---|---|---|
| G1 | 两条编写 intent 只调用 templates.for,且传 project-proposal-v1/competitive-analysis-v1;该接口要求字典 docType(plugin.go:212–230,templates.go:127–138) | 自然语言入口参数不一致,尚不是完整编制入口 |
| G2 | RDM 命令未声明 exposeAsTool;实际 pin 的 EXT-14 仅投影显式声明命令(pins/.../internal/cmdbus/cmdbus.go:47) | 注册命令不等于模型可调用;须核对实际工具目录与 schema |
| G3 | Compose 模板开关可缺省;按第一个适用 key 选模板,读取失败静默返回空串(compose.go:17、63–85、150) | 可能选周报/纪要,或者无模板继续起草 |
| G4 | 单章提示词注入整份模板;章节结构另存 YAML,文档/版本无 templateKey/version/hash(compose.go:35–47,doctree.go:29–65) | 模板、章节和历史无法一致固定 |
| G5 | Compose 返回即时内容;apply 重新检索,固定 topK=8;skip 旧依据参与起草却不能进入 accepted,Basis 直接取 accepted(draft.go:93–108,writegate.go:158–186) | 候选漂移、旧依据丢失、无法固定确认对象 |
| G6 | 写版本后逐条建 supports 边(writegate.go:186 起) | 中途失败可导致正文与追溯不一致;复用既有原子事件工作项 |
| G7 | draft/compose/apply 仍可空项目回退,处理器缺少对应编制人检查(runtime.go:106,plugins/rdm/plugin.go:1645 起) | 上下文、生成和提交均须领域授权;只靠宿主 owner 不够 |
| G8 | approve/reject/final schema 必填 reviewer/actor/approver,处理器却拒绝这些参数(plugin.go:295–320、945–1001) | 总线契约矛盾;必须从真实分发入口验证审签 |
| G9 | 模板从工作目录或编译时源码路径读取;构建仅生成二进制(templates.go:45,prompts.go:42–52,Makefile:40) | 需验证安装包脱离源码仍能加载模板 |
| G10 | DOCX renderer 接收标题与章节,未消费模板排版规格;导出取章节当前版本(docx.go:155、298–306) | 排版要求未兑现,正式版需绑定整文批准快照 |
这些是实施前应验证和修复的具体断点,不声明现网已经复现。
### Requirements
| ID | 用户可见要求 | 来源 | 验收判据 |
|---|---|---|---|
| R1 | 对话中查询、选择并预览模板 | SR-C2、SR-E6 | 显示用途、版本、适用类型和可用状态;不混淆类型数量与模板数量 |
| R2 | 一句话编制整文或指定章节 | UR-11、F4、SR-E4 | 确定当前项目、目标文档、操作范围及模板后进入生成任务;歧义时澄清 |
| R3 | 文档结构来自固定模板 | SR-C1/C2、M5 | 文档绑定已发布模板版本;每章有稳定标识、内容要求、检索条件及顺序 |
| R4 | 只使用当前有权使用的依据 | SR-G2、U0 R09/R21 | 跨项目、私人未发布、待裁定、撤销资料不能进入共享生成正文 |
| R5 | 每段事实可回到实际来源 | UR-11、SR-D1/D6、08 R1–R5 | 引用能定位切片/结论/已有文档的准确版本与锚点,历史可复核 |
| R6 | 缺证据明确标出,冲突由有权者裁决 | F4、SR-B8/B9、U0 D4 | 不编造内容;文档层选择不改变项目共享结论;未裁决冲突不混入有效事实 |
| R7 | 草稿提案经确认才改正文 | F-B、SR-C4/C6 | 展示新增/更新/冲突与差异;确认对象固定;未接受内容不写入 |
| R8 | 保留已有正文与依据,支持增量更新 | UR-05、SR-C6 | 只修改用户选择范围;保留、增加、删除的依据与最终正文一致 |
| R9 | 编制、审核、批准职责与版本固定 | SR-C7/C8、U0 D2/D5 | 非编制人不能生成/改正文;提交锁定;审签绑定完整文档版本 |
| R10 | 长任务可查看、取消、恢复 | SR-F4、SR-B10、U0 R21 | 刷新/重启后看到同一任务;重复点击不重复生效;失败章节不冒充整文完成 |
| R11 | 输出可打开、下载、追溯的 DOCX | U0 R14、10 号定稿决议 | 内容、格式、引用及版本与选定草稿/正式快照一致;下载再次鉴权 |
| R12 | 旧模板逐份纳入可管理的目录 | 03 §7、SR-C2 | 69 份都有资产处置记录;已发布/待整理/不适用分别显示,不能批量冒充可用 |
| R13 | 对话、卡片、工作区使用同一状态 | SR-E6、U0 D7、DESIGN.md | 收起右栏仍可完成编制;陈旧卡片不能批准新内容;按 seq 丢弃旧事件 |
R1–R13 为方案候选范围,人工评审均未完成。R12 的登记全覆盖与各模板运行验收是两个阶段。
### User Flow
示例:“用已有资料生成这个项目的设计开发任务书。”
1. 从可信会话解析项目,辨认是新建、更新、只改某章还是查询;“总结一下任务书”不能触发写入。
2. 查现有文档与职责。已有同类文档时确认更新对象,缺模板或有多个正文模板时给出可选项,不随意选第一项。新文档无职责时保留请求为“等待职责分配”;有权负责人可在对话中指定异人的编制/审核/批准角色,其他成员可提出分配请求,由负责人处理。若当前用户不是编制人,则显示当前职责并允许转交编制请求,不把原私聊全文传给他人。职责就绪后由指定编制人接续同一目标、重验权限并确认启动,负责人不自动获得编制权。
3. 展示一张编制卡:文档名称、模板版本、章节范围、使用的资料范围、将创建草稿的效果。确认后启动任务;已明确提供的信息不重复询问。
4. 按章准备依据,必要时集中呈现冲突双方、来源、建议及理由,由相应角色裁决。
5. 后台逐章起草与校验;对话即时显示计划和阶段,允许继续讨论或取消。无材料章节注明待确认。
6. 完成后提供正文预览、逐章差异、来源和未决项;编制人可要求“只重写第二章”“采用这个依据”“保留现有市场分析”。
7. 编制人采纳所选提案后产生内部版本;提交审核时执行完整性检查并锁定完整文档版本。
8. 审核人和批准人分别以真实身份确认。完成后可导出 DOCX,继续通过对话查看来源或发起受控修订。
编制卡、冲突卡、差异采纳卡和审签卡是不同决策,不合并成一次模糊的“确认全部”。同一决策可以在对话与工作区投影,使用同一服务端对象。
编制过程中说明空缺不等于强制补齐所有字段;沿 SR-C5,资料上传阶段不推送缺项清单,正式完整性门禁只在提交审核/申请推进阶段执行。
### Scope Boundaries
本期设计复用现有模板,先完成内容与格式结构化、生成和受控落盘,再分批扩大覆盖。
标准模板替换沿 F-10,待系统测试后由用户提供;不擅自下载其他“官方模板”替代旧资产。
不把合规边有来源等同于满足具体法规;法规结论继续走既有双通道及人工复核,本方案不作标准符合性判定。
飞书对接、变更流程引擎、跨项目自动取材、无人审批、所有文档自动重写不纳入本次实施建议。
最新两树一网可视化方案已单列,生成能力不等待全局大图;文档引用浏览与项目审计中心沿各自权限开放。
---
## Planning Contract
### Alternatives
| 路线 | 收益 | 代价及结论 |
|---|---|---|
| 复用 RDM,补齐模板/候选/整文契约 | 保留已有知识、版本、审签与追溯,职责清楚 | 推荐;先修跨层契约,再扩模板 |
| 将旧生成系统整体搬回新系统 | 可快速得到旧模板和流程 | 会带回任务键绑定、多份目录及旧状态治理,不采用 |
| 把整份模板和检索结果直接交模型输出文件 | 演示快 | 难保证固定依据、增量更新、三权和恢复,只能用于隔离试验 |
### KTD1. Template Contract
将“文档类型”“模板资产”“项目文档实例”分开管理。
文档类型保留兼容键;模板使用 `templateId + version + hash`;文档实例使用项目内稳定 docId。
注册表是模板权威入口,避免再增一套手写目录;缓存和索引只能由它生成。
| 模板层 | 核心内容 | 执行方式 |
|---|---|---|
| 资产元数据 | 名称、用途(正文/纪要/汇报)、别名、适用类型、版本、生命周期、来源 SHA | 可查询、受控发布;禁止字典序判断版本新旧 |
| 内容结构 | 稳定 sectionKey、标题层级、内容要求、表格列、条件适用、允许缺省 | 编译为文档树实例与内容校验规则 |
| 依据规则 | 共享标签条件、资料类型、强制输入、可用结论/文档类型 | 编译检索计划;保留人工选择与审阅 |
| 格式规格 | 页型/页边距、字体、标题编号、页眉页脚、表格、引用呈现 | 由确定性 DOCX renderer 消费,不靠模型猜排版 |
| 发布清单 | schema 版本、资产哈希、依赖字典、审批记录、兼容范围 | 安装包自包含;运行时清楚报告缺失或不兼容 |
模板生命周期建议为 draft→published→retired。模板先评审再发布,再实例化文档树;同一已发布版本不可原地改写。
首期内置共享模板及默认绑定只由获批的仓库发布流程变更,模板发布权不继承文档编制权。普通编制人只能选择已发布版本。后续用户上传模板只形成待评审候选;运行时发布/退役/改默认的责任主体与项目或共享作用域须另行评审后开放,不能借上传模板修改其他项目规则。
普通编制人只选已发布版本,不因生成一次文档重复审批模板。退役不删除历史快照。
默认绑定使用“docType+purpose+显式 default”;候选多于一个且无明确默认则询问;用户指定模板优先,但须校验适用性。
用户指定“按模板生成”时,模板缺失/失效须停止该路径并解释,不能静默按自由文本起草。
更新模板不自动改已有文档;迁移章节映射、内容影响和格式变化以单独提案确认。旧文档保持原 templateRef。
### KTD2. Template Migration
建立 69 份历史模板的逐项台账:原路径与 SHA、对应类型、目标 key、用途、章节数、内容差异、格式要求、处置结果、发布与验收状态。
先保全原件与哈希,再拆出正文要求、管理信息、格式约束。追溯表、签署记录、缺项登记、已有材料摘要等管理信息进入相应台账或附属视图,不直接复制成正文章节。
模板提取可以由模型提出候选,但发布结构与章节映射须人工审核;不因 Markdown 有二级标题就认定它是合格模板。
10 份自举文档逐份做语义映射,避免仅凭原 docType 将“实施推进方案”套成“项目建议书”。已有内容只生成映射候选,不覆盖。
建议发布包内置受控资产 bundle;后续用户模板使用同一校验/发布协议,从受管目录或存储载入,禁止依赖编译机器的源码路径。
### KTD3. Three Structures and Context
每项目独立解析两树一网;共享模板通过固定版本引用,不建立跨项目业务边。
笔记树切片及结论提供内容;文档树章节提供输出目标、既有内容及版本;追溯网提供已有依据、取代关系、冲突和受影响对象。
检索先判权限和资料发布状态,再检索和排序,不能先读全库再让模型筛项目。
章节强制依赖、现版有效依据、已选结论及其原始 basis 应完整保留;其余素材用标签、语义、图关系合并、去重和有界排序。
语义路须传确定项目;知识 chunk 到领域切片建立稳定映射,不能同一原件只取第一个 slice。
超出上下文预算时分章节、分资料批次处理并保留覆盖账本;不得以 topK 截断后声称“已查全部资料”。检索降级向编制人可见。
新内容优先是排序线索,不自动推翻已生效结论;已废止、待裁定资料只能用于有权限的冲突说明,不能作为已生效事实。
私人对话原文不因关联项目就共享。模型从对话提炼的资料须沿既有发布/相关性边界进入共享知识;私有资料确需用于共享文档时,先获得明确发布授权。
模板、上传原文和引用资料是任务数据,不得提升为系统指令或扩大工具权限。
### KTD4. Durable Generation Objects
建议增加四类持久对象,字段名为设计候选,不是已发布 API:
| 对象 | 固定什么 | 主要作用 |
|---|---|---|
| GenerationRun | 项目、文档、编制人、会话、范围、templateRef、章节基线、知识水位、模型/提示词与检索版本 | 任务进度、恢复、成本与产出可追溯 |
| ContextManifest | 选中来源 ID/版本/hash/锚点、授权/发布依据、保留与排除集合、冲突裁决 | 解释实际给模型的材料,不保存隐藏推理 |
| SectionProposal | sectionKey、baseVersion、结构化正文、段落引用、差异、空缺、校验结果、状态 | 供人修改/比较/采纳;不改变生效正文 |
| DocumentRevision | 全部章节版本集合、模板与布局版本、内容/hash、依据集合、审批快照 | 固定整文审签和导出,防止“各章最新”拼装 |
段落引用持久化为稳定对象引用,短编号仅用于显示,必须保留编号映射。来源包括 slice、结论及依据、受控文档版本、模板版本、明确授权的外部材料。
引用存在性、项目归属、版本和采纳范围由服务端校验;引用能打开不证明语义支持,另用模型检查加人工抽验判断事实是否被证据支撑。
保留旧依据、增加新依据、移除依据分别记录,最终 Basis 从实际成文引用聚合并校验。用户取消某素材后,相关事实必须删除、重写或改为未证实,不能只删脚注。
人工修改提案后重新计算 hash 并校验;内容、选材或目标版本变化使旧确认失效。
### KTD5. Generation and Human Decisions
起草遵循“检索并固定输入→模型组织正文→结构/引用/冲突检查→持久提案→人工采纳”,允许模型自主拆任务和选择可用工具,受控写入口保持确定性。
现有 Compose 和 Gate 应重构复用,修正“仅有 skip 旧依据时被视作无素材”、旧依据不能保留等路径,不另起第二条正文写入链。
模板内容要求决定章节任务;不能把整份模板重复塞入每一章。独立章节可并行,共享术语/数据依赖按章节依赖顺序生成,最终做全篇一致性检查。
无法证实的数据不得补成事实。临时草稿允许“待确认”标记;正式版不能含未处理的必需项,处理方式是补证、明确不适用及有权确认,不能改规则绕过。
冲突分两层:编制人决定本文档引用哪条依据;改变项目共享结论由项目负责人或指定知识责任人裁决。后台模型不自动做这两个决策。
### KTD6. Authorized Atomic Apply
从可信请求身份解析 actor,不接受前端 actor/reviewer/approver 自报。所有生成、读取、确认、导出及旧命令统一经过领域授权。
生成开始、关键读取、恢复、结果投递和最终采纳时重验项目与职责;管理员/负责人不因角色高就自动拥有文档编制权。
apply 接收固定 proposalId、预期章节/文档版本、采纳范围和幂等键,不再重跑检索重建“当时的候选”。
事务内验证权限、版本和引用,原子提交版本、依据/追溯边、提案状态和领域事件;提交后更新投影。跨库宿主审计通过可靠 outbox 投递。
多章节整文采纳默认同一业务事务;用户主动选择部分采纳时,生成包含未改章节原版本的新 DocumentRevision,清楚标记剩余未采纳章节。
部分采纳先构造实际将保存的新旧章节组合,重新校验章节依赖、共享术语及关键指标一致性;后继章节依赖未采纳的前置改动时暂停采纳,列出必须一同处理的章节供编制人选择。校验绑定该组合的 hash 与版本;事务提交前再核对版本,不能沿用整份候选曾经通过的检查。
模型调用不占持久写锁;候选失效返回具体变化,保留提案供比较,禁止覆盖新版本或静默再生成。
断连/超时先按幂等键查询提交结果,再决定是否重试。跨库工件生成与领域提交不冒充一个事务,以导出任务和可恢复映射协调。
### KTD7. Conversation Tools and UI
RDM 提供模板查询/预览、文档实例化、生成准备/启动/状态/取消、提案查看/修改/采纳、提交审核、审签与导出能力;名称和 schema 在实施契约中固定。
先统一 docType/templateId/version 含义及 schema 与处理器身份约定,再将需要模型访问的命令显式投影到工具目录;保留确定性命令入口用于卡片与测试。
RDM 编制 skill 提供渐进说明与编制规则,业务权限与确认不靠提示词约束。skill 的新增/变更纳入真实模型任务级对照。
审签决策由指定人通过认证确认产生,Agent 只准备与呈递,不因用户一句模糊“继续”批准未展示的新版本。
基座负责通用模型路由、运行/卡片、工件字节、资源授权执行;RDM 负责模板、领域项目、资料发布、两树一网、提案、三权与版本。
公开面不足时按 RDM AGENTS 四要素提扩展申请;禁止下游导入 Backend internal 或修改 pins。
界面沿 `Dev:DESIGN.md`:对话为完整主入口,右栏“工作”看任务/待办,“文件”看文档;同一工件只有一个预览落位。
对话展示模板名/版本、章节进度、需处理事项、最终文件和来源入口,不直接倾倒 slice ID、事件 JSON 或内部工程术语。
一个服务端对象拥有异步状态,对话与工作区只作投影;按 seq 处理事件,刷新从服务端恢复,陈旧卡片显示已过期及原因。
UI 使用令牌、MotionKit、Collapsible 和安全 HTML 原语;无额外第四栏或新的平行预览器。
### KTD8. Review and Export
现有审签主要按章节实现;推荐面向用户升级为文档级职责与审签,章节审签仅作为可选内部协作步骤,不要求用户为每章重复三权操作。
文档提交时冻结 DocumentRevision:章节版本、模板、内容要求、依据及当时职责。后续撤权或职责变化使待处理授权失效或要求重新提交,不能接续旧签名批准新版本。
审核期间所有正文入口拒写;驳回回编制态产生新内部修订,不提前增加正式版号;原正式版在新正式版批准前仍可查看。
旧章节职责、审签和正式版作为原始历史保留,不自动合并为文档级授权或“已批准整文”。同一旧文档的章节可能由不同人编制/批准:转入新流程前由有权负责人明确文档职责;迁移清单列出旧活动审签,经有权人确认撤回后重提,未完成该处置的文档保持旧态只读查询并暂不启用新整文流程。首个文档正式版须重新完成整文审签;历史导出明确标识为旧章节版本集合,不冒充整文批准。
草稿导出清楚标记草稿。正式版导出只读取批准快照,不读取当前各章最新;正文、引用附录、签署元数据与格式使用同一快照。
DOCX 由结构化内容和布局规格确定性渲染,保存 artifact 与文档版本的关联。导出生成、预览、下载分别鉴权;权限撤销后已有任务不得继续泄露结果。
允许异步重试导出,不因文件生成失败回滚已获批准的文档状态,也不把导出文件反向作为领域内容权威。
### High-Level Technical Design
```mermaid
flowchart TB
U[项目对话或工作区] --> A[可信项目与角色解析]
A --> T[固定模板与文档目标]
T --> C[按章准备依据快照]
N[笔记树与有效结论] --> C
D[文档树及原版本] --> C
G[追溯网与冲突] --> C
C --> M[模型起草与确定性校验]
M --> P[持久提案和差异]
P --> H[编制人确认]
H --> W[原子写版本与追溯]
W --> R[冻结整文审核与批准]
R --> E[按快照生成 DOCX]
```
```mermaid
stateDiagram-v2
[*] --> Preparing
Preparing --> AwaitingDecision: 目标或冲突待确认
AwaitingDecision --> Preparing: 有权人决定
Preparing --> Generating: 输入固定
Generating --> Validating
Validating --> Proposed: 校验通过
Validating --> NeedsRevision: 检查发现问题
NeedsRevision --> Generating: 修订受影响章节
Proposed --> Applied: 编制人采纳及事务成功
Proposed --> Stale: 依据权限或目标版本失效
Generating --> Failed
Generating --> Cancelled
Failed --> Preparing: 重验后恢复
```
生成运行状态与文档审批状态分开。Applied 仅表示形成内部内容版本;随后仍需“编制中→审核中→待批准→已批准”,驳回回编制中,批准绑定固定整文快照。
取消只停止未完成任务,不撤销已经确认提交的版本;状态未知时先查事务结果。恢复重新取得受限 Host 与权限,不能序列化旧凭据或长期复用旧 Host。
### Dependencies and Assumptions
与 [两树一网集成方案 r1](2026-10-11-rdm-two-trees-trace-audit-integration.md) 复用项目绑定/授权、原子事件、历史重放和可读引用能力,不建立第二套项目或审计服务。
该方案文档记录已批准,不能据此声称实现已经完成;本生成方案把相关能力作为实施前置条件,是否复用已合入实现以启动时源码和证据为准。
与 [多人协作存储方案](2026-10-11-collaboration-storage-and-distribution.md) 复用持久任务、事务与团队存储方向。RDM 仍需自己的事件/领域存储适配,不因基座使用 PG 就宣称 RDM 已支持多实例。
近期建议单实例完成两项目隔离和三人职责验收;团队多实例单独通过并发、恢复与迁移验证后开放。
基线更正:RDM requirements/README 已确认相关 V2.2 正文于 2026-10-09 合入定稿;正文残留“待评审”不推翻该裁定。本案新增实现契约仍待用户评审。
---
## Implementation Units
以下为待批准的分期,U-ID 只在本方案内有效;责任模块已明确,人员在立项时确定。每阶段均按 `policy/delivery.md` 人工评审,允许阶段内根据证据迭代。
### U1. Contracts and Asset Ledger
目标:形成完整资产清单与可运行入口的修复设计。覆盖 R1/R2/R9/R12。
范围:RDM templates.go、plugins/rdm/plugin.go、labels_seed.json;新增资产迁移台账、总线契约测试,复用 templates_test.go/templates_v01_test.go。
措施:记录 69+1 旧资产;统一类型/模板键、默认用途和真实身份字段;声明工具投影;确认现有项目/权限前置工作由哪项任务交付。
验证:两条中文编写请求匹配合法文档类型;同类型周报不抢正文模板;审签经总线可达且伪造身份拒绝;查询/总结不得生成;69 类处置无遗漏。
出口:资产及契约评审完成;未把全部模板标为可用。无需先搬迁所有正文。
### U2. Published Template and Document Instantiation
目标:模板成为结构与排版的唯一版本依据。依赖 U1;覆盖 R1/R3/R12。
范围:RDM docs/templates、rdmapp/templates.go、structure.go、domain/doctree.go、payloads.go/replay.go;新增 template_contract_test.go、template_instance_test.go、发布包资产检查。
措施:发布生命周期、稳定章节键、固定 templateRef、显式默认、版本比较、资产 bundle;两个已有业务模板先结构化,旧自举树做映射而非覆盖。
验证:v2/v10 顺序正确;缺模板明确失败;不同用途不误选;模板新版本不改历史文档;同名章节、可选章节、模板退役、无源码安装包启动均覆盖;普通编制人不能发布共享模板或修改其他项目默认。
出口:从两个已发布模板产生正确文档树,内容要求与导出规格可供后续步骤读取。
### U3. Context Snapshot and Durable Proposal
目标:固定依据并可恢复地起草整文。依赖 U2 及项目授权/读取边界;覆盖 R2/R4/R5/R6/R10。
范围:RDM draft.go、compose.go、fbhost/adapter.go、domain/fb/writegate.go;新增 generation.go、proposal_store.go 及相应测试,具体命名实施时固定。
措施:持久 Run/ContextManifest/Proposal;精确来源映射;章级计划与预算;固定模型/提示词版本;空缺与冲突单列;持续进度与取消/恢复。
验证:无素材、只有旧依据、只有冲突、多切片同原件、跨项目/私有资料、超长上下文、模型失败、检索降级、取消、重启、撤权,均有真实可观察结果。
出口:两份文档可形成整文候选,逐段回到稳定来源,刷新和重启不丢;尚未自动写生效正文。
### U4. Confirmed Atomic Document Revision
目标:采纳提案后内容、版本和追溯保持一致。依赖 U3 及两树一网原子事件能力;覆盖 R5/R7/R8/R9。
范围:RDM draft.go、domain/fb/writegate.go、doctree.go、eventlog.go、replay.go、review.go;新增 proposal_apply_test.go、document_revision_test.go、故障重放测试。
措施:固定 proposalId、CAS、幂等、保留/新增/删除依据;整文版本清单;统一编制权限;修正文档级审签;旧入口适配同一服务。
验证:两个标签页竞写、确认前版本变化、撤回依据、取消引用却残留事实、重复点击、写版本后建边失败、提交审核后旧卡片执行、部分采纳与整文导出一致性;只采纳后继章节而保留旧前置章节须被依赖校验拦下;迁移中同文档不同章节职责/正式版、审核中记录不得自动转成整文授权与批准。
出口:事务全成或全败;重放还原同一版本和引用;旧候选不会覆盖新内容。
### U5. Chat Workflow and DOCX Delivery
目标:用户仅凭对话完成首批真实编制闭环。依赖 U4;覆盖 R2/R9/R10/R11/R13。
范围:RDM plugins/rdm/plugin.go、编制 skill、web/app.js、docx.go;必要基座公开契约申请;新增总线全链路、浏览器与 DOCX 文件验证用例。
措施:准备/冲突/采纳/审签卡同源状态;固定模板与章节的编制配方;文档级审批快照;草稿与正式 DOCX;文件卡复用基座预览下载。
验证:三名真实用户分别编制/审核/批准,两项目隔离;无职责的新文档经负责人在对话分配后由指定编制人接续,非编制人只可转交;收起右栏完成全程;刷新/重启、陈旧卡片、下载撤权;实际 DOCX 标题、表格、分页、页眉页脚、引用可见且版本一致。
真实模型对照:固定同一批素材与任务,记录改造前后正确模板选择、必需内容覆盖、引用支持、编造事实、人工修订量、耗时与失败恢复;单测/mock 不替代此项。
出口:项目建议书和竞品分析经真实 UI 与模型完成,产物持久可见可下载;评审人独立重放。
### U6. Document Families and Legacy Migration
目标:按业务文档族逐批覆盖其余历史资产。依赖 U5,且每批模板先评审发布;覆盖 R3/R11/R12。
范围:RDM 模板资产/注册表/迁移台账及模板契约回归集;参考 Legacy:templates/docs,不再依赖旧工作流实现。
推荐顺序:用户需求与系统/软件需求→设计任务与计划→设计方案与记录→验证/确认与测试→评审/风险/其他体系文档;精确文档名和批次以 U1 台账与用户优先级确认。
验证:每个上线模板至少一个有材料的完整生成例和一个空缺/冲突例;每类特有表格、引用及 DOCX 规则有针对性验收,不能只跑注册表计数。
出口:69 类均有明确结果,所有声明已支持的类型通过对应验收;不适用由人裁定,未交付保留可见状态。报价 XLSX 单列,不偷换为 DOCX。
---
## Verification Contract
测试在后续获批实施阶段执行,本轮结果全部 NOT_RUN。源码检查只能证明路径存在与静态矛盾,不能证明真实编制体验。
| 层级 | 对象与方法 | 必须证明 |
|---|---|---|
| 资产 | 69 类迁移台账、模板契约校验、安装包 smoke | 类型/模板/默认/结构/格式一致;没有源目录依赖 |
| 单元与领域 | RDM `make test` 的 Go 测试;模板、检索、版本、权限、状态机测试 | 正常、拒绝、边界、依据保留与失败事务行为 |
| 总线与工具 | 真实注册表→schema→认证主体→处理器→领域服务;实际模型工具清单 | 文本入口与 UI 共用真实可达能力;审签身份无自相矛盾 |
| 持久集成 | 实际领域存储、原子事件、重启重放、幂等与并发故障注入 | 内容/引用/审批不出现半完成;未知结果可查 |
| 浏览器 | 真实三用户、两项目、对话+卡片+预览+下载;现 `make test-web` 只作局部辅助 | 刷新、断连、重启、权限变化后结果仍正确,右栏关闭不丢操作路径 |
| 模型行为 | 固定素材和模板的任务级前后对照、人工盲审结果 | 模板选对、事实有支持、缺项诚实、未授权内容不出现 |
| 交付物 | 解包检查 DOCX OOXML+实际 Office/LibreOffice 打开检查 | 正确内容、格式、表格、引用和批准快照;不能只检查扩展名 |
| 跨仓 | 固定 RDM pins 与 Dev 公开契约 SHA,相关 CI 及独立重放 | 下游实际组合可运行,禁止用另一组组件证据替代 |
首批硬判据:所选模板/version 必须正确;持久引用全部存在且在授权范围内;负向越权与静默基线覆盖为零;已声明完成的章节无未标注的证据缺口;相同幂等请求只生效一次。
“引用存在”与“语义支撑”分别评分。测试/验证报告不得虚构执行记录、测量值或通过结论;无实际执行证据只能生成计划、空表或标注未执行的报告草稿。
耗时、费用、引用支持率和人工修订量先建立基线,再由用户确认可接受阈值;上传首轮 60 秒指标不套用为整文生成时限。
项目审计中心权限沿既有两树一网方案;编制人可查看完成本职责所需且有权访问的引用,不能借生成工具读取整个项目审计或他人私聊。
证据分 SELF/GATE/REPLAY;正式验收固定对象与环境,按仓库要求经 evidence 记录,不把模型自评作为独立通过。
## Definition of Done
本轮方案交付:资产盘点、关键源码断点、需求与方案、分期和验收可追溯,待决事项与未执行内容明确;本地方案尚未获得人工批准。
业务完成:U1–U5 首批真实闭环有完整证据;后续 U6 每批独立验收和发布,不把首批成功写成 69 模板全部可用。
上线声明另需固定安装包、目标实例、迁移/恢复记录及运行验收;当前没有上线声明。
建议下一任务是 U1 的契约核对与模板台账,而不是直接批量生成 69 份文档。先复核远端在途任务,和两树一网授权/事务工作项分工;本建议不启动实施。
### Review Decisions
请评审以下具体选择:
1. 采用“RDM 内补齐闭环+69 类资产分批接入”的路线,复用现有模板内容。
2. 首批项目建议书、竞品分析,随后扩展全部文档——已确认(session-settled: user-approved,2026-10-11,用户对首批优先级问题的回复)。后续各文档族之间的顺序尚未确认。
3. 以文档级版本快照进行三权审签,章节作为生成、差异与增量采纳单位。
4. 固定模板和依据后生成持久提案,编制人确认才写入;标准模板替换仍待用户后续提供。
第 2 项首批及扩展方向已确认;第 1、3、4 项及完整实施/测试计划仍待评审。本次优先级确认不构成业务实施、迁移或部署授权。计划中确定性契约与测试细节可在评审意见内迭代,改变权限/模块职责/范围时重新评审。
## Appendix
主要依据:
- RDM:docs/requirements/01-用户需求与系统需求.md:UR-11、SR-C1–C8、SR-D1/D6、SR-E4/E6、SR-F1/F4/F5、F-10。
- RDM:docs/requirements/03-产品设计方案.md:M5/M6/M9/M10、F4/F6、§7 旧版 69 模板处置。
- RDM:docs/requirements/08-核心数据模型-两树一网.md:两树职责、共用标签、F-B、R1–R5、模板来源维度。
- RDM:docs/proposals/2026-10-08-U0-baseline-and-shared-contracts.md:项目共享、三权、两层冲突裁决、固定版本和对话同源约束;其中旧源码缺口已重新核对,不原样当作当前事实。
- Dev:DESIGN.md:对话优先、工作/文件双入口、一个状态所有者、一个预览落位。
- 本目录 2026-10-11-rdm-two-trees-trace-audit-integration.md 与 2026-10-11-collaboration-storage-and-distribution.md:本方案的授权/事件/存储依赖;不复制作另一条实施主线。
完整资产目录见 [模板资产盘点](../records/2026-10-11-rdm-template-inventory.md)。目录仅报告源码资产状态,不包含线上项目的实际文档数量。
@@ -0,0 +1,402 @@
---
title: RDM 两树一网集成、完善与追溯审计展示方案
type: feat
date: 2026-10-11
execution: code
artifact_contract: ce-unified-plan/v1
product_contract_source: ce-plan-bootstrap
---
# RDM 两树一网集成、完善与追溯审计展示方案
修订:r1(2026-10-11 并入用户裁定);确认状态:用户评审通过(2026-10-11,需求拆解至实施计划五阶段一并,含 KTD4 双层管理员裁定);推进状态:U1–U4 已合入。U5 的 #213 只交付了导出工件生命周期,水位重放、报告三段、草稿门和页面入口仍在进行(RDM #301、Frontend #73、Dev #488,2026-10-12,未合入)。管理区「项目追溯与审计」入口经通用声明机制补齐(扩展面 2.9.0 Registry.AddAdminZone;Backend #165、Frontend #63/#64、RDM #240、Dev #414,2026-10-12;rdm.audit 分区随 rdm 插件声明,区内能力仍由 rdm.inspect.* fail-closed);管理页插件清单另合并编译插件条目(Dev #404,2026-10-12)。U6(团队存储)独立后续;运行验收属部署环境。
需求负责人:weichen;方案编制:Codex;实施负责人:待实施立项时指定。
来源:2026-10-11 用户要求检查两树一网现状,并设计简单直观的项目追溯、审计展示;同轮明确选择“完善 RDM,并补齐必要的基座能力”。
目标仓:Agent-System-RDM;下文 `RDM:` 路径相对于该仓,`Dev:` 路径相对于 Agent-System-Dev;所有建议接口名均为候选契约。
关联任务:Dev `.task/feature-rdm-two-trees-audit-plan.md`;本文件是本次方案唯一正文。
## Goal Capsule
推荐按**每项目一套笔记树、文档树和追溯网**管理,在现有 RDM 实现上补齐隔离、历史完整性和产品入口。
项目创建者查看自己创建项目的追溯审计;RDM 域管理员与基座超管(基座 isAdmin)查看全部项目。
管理员使用跨项目目录和筛选器进入各项目,默认不展示混合的全局关系大图。
本轮只交付现状、方案和实施验收计划;方案已于 2026-10-11 获用户评审通过,业务实施与数据迁移仍须另行立项授权。
项目独立是数据归属、授权、版本和查询范围独立,不要求每项目部署一套服务或建立一个数据库。
先用一个项目跑通业务闭环,同时用第二项目验证隔离;管理员全项目目录与历史导出随后接入,本批默认范围为 U1–U5。
---
## Product Contract
### Current State
**结论:已经实现相当一部分,适合做集成与完善;尚不能认定为满足本次要求的完整产品。**
调查基线(SELF·源码检查):
| 对象 | 固定提交 |
|---|---|
| Dev 集成仓 | `5771d4f1e5b692bce95eb64cc30dc9931079ad12` |
| Dev Backend | `ea4651b1f870d84ab9b72cfa79363b3432d113b3` |
| Dev Frontend | `3ed10e122042a64180fb24a42d9cc6438cd2d2d6` |
| RDM | `0081628a10ec48a36537c6eced11a57439c986fa` |
| RDM 实际 Backend pin | `421fee81c314c05530bc809e224b5d0818ec3472` |
| RDM 实际 Frontend pin | `84b73ab32848e623d0a0ab7ade552784dca8cf3c` |
Dev 当前源码与 RDM 实际依赖不是同一组合,升级前须分别核验公开契约。
本次没有运行业务测试、登录服务、读取业务数据库或进行浏览器验收;下列“已有”指源码存在,不能转换为“已部署/已验收”。
命令、对象 SHA、原始输出和远端在途查询由工具保存于[调查收据](../records/2026-10-11-rdm-two-trees-source-receipt.json);收据为 SELF,不是 GATE 或独立 REPLAY。
| 对象 | 源码现状 | 本次需要补齐 |
|---|---|---|
| 笔记树 | `RDM:internal/domain/notetree.go` 已有骨架、切片、锚点、标签、多点挂载、软删除;树是浏览骨架,切片可多挂载 | 独立浏览和详情读取接口;完整树导航;层级与挂载一致性 |
| 文档树 | `RDM:internal/domain/doctree.go` 已有文档、章节、正文版本与依据、状态;已有基线和审签能力 | 树式浏览、真实版本元数据、来源与变更联动 |
| 一般追溯网 | `tracenet.go`、`rdmapp/trace.go` 已有关系生命周期、邻域、多跳和图查询 | 端点完整性、同项目约束、版本定位及统一读模型 |
| 受控合规图 | `compliance.go`、`chainviews.go`、`cgraph_export.go` 已有受控节点、版本边、链视图、矩阵及导出 | 与一般关系网整合展示;补重放一致性和历史快照 |
| 项目分片 | `events.project`、`WorldFor`、按项目重放已经存在 | 清除外部入口的空项目全量回退;贯通基座项目与 RDM 项目;端到端鉴权 |
| 结构历史 | `eventlog.go`、`replay.go` 已有 seq、操作者、时间、来源、payload 和重放 | 原子批次、幂等、完整状态还原、对用户可读的时间线 |
| 现有界面 | `RDM:web/app.js` 有基线表、章节弹层、SVG 追溯图和多跳高亮 | 缺独立笔记树、统一审计页、完整项目上下文;合规图与导出尚未接入 Web |
| 基座审计 | `Host.Audit`、`audit_events`、`command_audit` 已有通用记录 | 缺显式项目作用域、结构事件关联、跨项目管理员查询及稳定分页 |
旧 `RDM:docs/design/data-model.md` 中“当前单 World、需求无产生路径”等结论已被后续代码改变,不作为当前缺口依据。
旧追溯网和受控合规图目前是分别维护的边集合;共用事件日志不等于已有一张覆盖所有对象的完整网。
### Material Gaps
以下为源码事实及控制流推导,失败/越权场景尚未动态重放。
| 编号 | 问题与依据 | 影响与处理 |
|---|---|---|
| G1 | `runtime.go:108` 空项目返回全库重放的 `rt.World`;`plugin.go:737` 的 trace/graph/hops 未检查 actor;实际 pinned Backend 的 `compiled.go:31` 和 `cmdbus.go:228` 没有领域项目授权 | 只隐藏页面入口无法隔离;旧命令、工具、图、计数、详情、导出均须使用同一服务端策略 |
| G2 | `web/app.js:69,170` 使用基座项目,命令不自动注入领域项目;`projects_api.go:43` 列出全部 RDM 项目 | 必须先建立项目身份绑定及授权后的目录,不能依赖前端选择器过滤 |
| G3 | `projects.go:18` 的 CreatedBy 与 `members.go` 的 owner 角色分离;`rdm_admins` 与基座 isAdmin 分离 | 按创建者事实授权;不能用“负责人”“成员”替代创建者;审计可见性按 KTD4 双层口径(基座超管+RDM 台账域管理员)执行,域管理员不因此获得平台管理权 |
| G4 | `notetree.go:77` 的入库/挂载逐事件提交;`tracenet.go:67` 的 candidate/confirm 分开提交;`Retag` 等先改内存再写日志 | 中途失败可能遗留部分事件或内存/数据库不一致;先补事务批次和提交后投影 |
| G5 | `compliance.go:170` 升版标 stale,但 `replay.go:230` 未对等重建;快照事件仅保存计数/hash;`replay.go:379` 正式版审签重建缺少时间/操作者 | 重启和历史回看可能与提交时不同;不得在修复前展示“历史已完整还原” |
| G6 | `conclusions.go:264` 取提案只有 id 没有 project 条件;`tracenet.go:59` 未校验关系端点归属 | 全部节点、版本、提案和关系必须在同一项目作用域解析;跨项目对象拒绝 |
| G7 | 成员/权限主要保存当前态;部分 `h.Audit` 错误被忽略;`review.go:95` 职责事件 Actor 使用受托编制人 | 补真实操作者与被操作主体分离、变更历史及可靠审计投递 |
| G8 | `Dev:modules/backend/internal/store/platform.go:187` 审计无 project 字段;命令审计按 owner/会话读取 | 不能按 target 字符串猜项目,也不能把创建者自己的动作记录冒充整个项目审计 |
### Requirements
用户明确的范围与权限优先于旧方案:RDM 负责领域,基座只补通用能力(session-settled: user-directed — chosen over 所有基座项目内建两树一网:用户选择完善 RDM)。
| ID | 需求 | 可判定验收条件 |
|---|---|---|
| R1 | 每项目独立两树一网 | A 项目查询、遍历、计数、详情、历史、导出均不出现 B 项目对象;跨项目建边被拒绝 |
| R2 | 仅项目创建者和系统管理员查看追溯审计 | 创建者可读所建项目;RDM 域管理员与基座超管可读全部;非创建者负责人、成员、非成员均不能访问审计能力;域管理员不因此获得平台管理权 |
| R3 | 展示来源与影响 | 任一支持的对象能查看来源、去向、版本与待确认关系,并打开有权限的证据 |
| R4 | 操作记录直观可读 | 能回答谁、何时、改了什么、为什么、结果如何;未知信息明确标缺失 |
| R5 | 历史真实且可重建 | 同一项目同一 seq 下,重启前后节点/关系/版本/审签/缺口一致;不可重建时明确报错 |
| R6 | 提交与记录一致 | 单命令多事件全部提交或全部不生效;重试不重复生效;并发覆盖返回明确冲突 |
| R7 | 简单、渐进展示 | 默认显示摘要、树和所选对象的一跳关系;不强制用户理解节点类型、内部事件码或原始 JSON |
| R8 | 可导出可复核结果 | 导出绑定项目、截止 seq、对象版本、规则版本、身份与生成时间;文件下载再次鉴权 |
| R9 | 复用现有能力和开发边界 | 保留 RDM 模型/计算/导出器,基座扩展经公开契约交付;无下游导入基座 internal |
| R10 | 历史数据及私人资料有清楚边界 | 未归属记录不自动塞入默认项目;项目审计不绕过私人原文访问控制 |
R2 约束项目审计中心及能返回等价审计数据的接口;普通文档阅读、协作、合法的引用展示继续遵守既有业务权限,不能顺手全部收紧为创建者专属。
模型工具同样受调用者权限约束,不通过智能体转述绕过审计读取限制。
---
## Planning Contract
### Key Technical Decisions
以下为待评审的推荐技术决策;只有显式 session-settled 标注的用户选择已在本轮确认。
- KTD1. **项目为隔离根,逻辑分区共享存储。** 查询及复合键携带实例域与 projectId;项目内对象采用稳定 ID,受控对象另带不可变版本。关系两端在同项目内解析,项目归属创建后不随意改动。共享模板/法规以固定版本引用或项目内快照进入,保留来源;第一版不建立项目 A 到项目 B 的业务边。
- KTD2. **复用两套图,通过读适配器形成统一项目视图。** 一般事实关系与受控合规关系保留不同确认及版本规则,避免一次重写两套存储。统一对象引用包含项目、类型、ID、版本、图层,防止 ID 碰撞或把不同版本误并为一个节点。`candidate` 显示“待确认”、active 显示“已确认/已生效”、retired 显示“已废止”;stale 显示“依据版本已变更”。不将模型候选画成已生效事实。
- KTD3. **一个服务端授权入口。** RDM 审计能力判定为“可信认证主体是 RDM 域管理员或基座超管(isAdmin),或等于项目 CreatedBy”。CreatedBy 固定;负责人调整不转移此权利。另设审计 read/export/history 能力映射,普通成员不能被项目负责人额外授予这些能力。权限异常拒绝读取,授权后的项目范围再进入存储,禁止先读全量后前端过滤。
- KTD4. **双层管理员:基座超管保底+RDM 台账域管理员。**(session-settled: user-directed — chosen over 两套真值完全分离与基座 isAdmin 单层直通:用户 2026-10-11 评审裁定)基座提供认证身份;基座 isAdmin 作为超管始终可查看全部项目审计,是跨项目审计的保底入口。RDM 现有唯一管理员台账继续判定域审计管理员:域管理员可读全部项目,但不因此获得平台用户/插件等管理权。基座管理区承载的 RDM 审计分区对两类管理员开放;capability 仍由服务端下发,前端只消费、不自行合并角色。历史身份不一致需显式核对,不自动提升为域管理员。普通 project.create 不自动引导域管理员;首个域管理员经受信部署引导产生,初始化唯一性由事务及数据库约束保证。台账为空、多管理员或来源不明时,域管理员路径关闭等待授权核对,超管保底路径不受影响。超管的审计访问同样落入动作审计并标记身份层级。
- KTD5. **基座项目与 RDM 项目显式一对一绑定。** 新增受约束的 hostProjectId 映射并带实例域;查询会话/工件所属基座项目后解析到 RDM 项目。不得用项目名称或默认第一个项目推断。两库创建无法单事务时用可恢复的 provisioning→ready/failed 流程和幂等标识,绑定未就绪不开放审计。EXT-8 共享资源检查使用映射后的领域项目,但不扩大成审计授权。
- KTD6. **项目命令原子写,事件为结构历史依据。** 在 RDM 存储事务内验证预期版本、端点归属与幂等键,一次提交整批事件、必要台账和 outbox;提交后更新内存投影。缓存失效或更新失败时重建,不暴露半新状态。关键事件落库失败则命令失败;跨库基座审计通过可靠 outbox 补送,不能用两次独立写入冒充事务。
- KTD7. **历史按项目+截止 seq 固定。** 可见水位只取已提交操作批次的结束 seq,时间按批次提交时间解析;显式 seq 落入批次内部时拒绝并提示可选的完整水位,不展示半次操作。保留当前全局 seq 的顺序语义,项目过滤后允许 seq 有间隙,不把它当作丢事件。快照保存完整节点/版本/边/审签/规则版本及哈希,含事件 schemaVersion;只有计数的旧快照不可作为恢复依据。未知事件版本须停止还原并说明缺口,不能静默跳过。
- KTD8. **先沿用单实例,再与团队 PG 方案衔接。** RDM 当前领域库仍是 SQLite,基座配置 PG 不会迁移它。先修事务和项目串行写入;团队档上线前将 RDM 权威事件/台账纳入有唯一写入 owner 的 PG 存储适配。多实例需数据库发号/并发控制及缓存刷新验证,不因基座支持 PG 就宣称 RDM 支持多实例。
- KTD9. **当前项目公开事实与私人过程分开。** 项目创建者能看项目审计,不因此得到成员私人会话/原件全文。内部重放载荷与对外审计 DTO 分离,原始 payload 不直接返回。摘要、正文、差异、历史快照和导出中的复制内容统一进行披露检查:当前来源 ACL 允许,或存在可核验的项目发布快照,方可输出。旧数据无来源/发布依据时默认遮蔽并标“来源受限/归属待核实”,不泄漏标题、摘要或路径。管理员看全部项目审计,仍不把凭证、模型隐藏推理或无关私聊放进审计输出。
### Architecture
```mermaid
flowchart TB
U[创建者:自己项目 / 域管理员与基座超管:全部项目] --> A[认证身份 + 审计能力校验]
A --> P[解析当前项目绑定]
P --> Q[RDM统一审计读服务]
Q --> N[笔记树与文档树投影]
Q --> G[一般追溯与受控合规图适配]
Q --> H[事件历史与完整快照]
Q --> B[基座动作审计:经授权关联查询]
Q --> V[同一追溯审计工作区]
```
两树说明“资料怎样整理、文档怎样组织”;关系说明“依据来自哪里、影响到哪里”;审计说明“谁在什么时候作出了什么变更”。
它们共用项目和对象身份,各回答一个问题,不要求用户先学习图数据库概念。
### Data and Event Contract
领域事件补足项目、operationId/requestId、真实 actor、actorType、被操作主体、对象版本、发生时间、提交 seq、原因、事件 schemaVersion,以及必要的前后差异。
一个 operationId 关联多个结构事件和基座动作审计;前端按一次操作归组,技术明细按需展开。
纠正错误通过新事件完成,保留更正者和原因;关系失效、软删除和权限变更不覆盖原历史。
权限变更审计保留当时的政策版本/决策摘要,便于解释过去为何允许;**现在能否查看**仍按当前权限判断。
前端自报审计只能标为客户端报告,不得伪装成服务端核实的批准或业务成功。
普通 hash 用于校验导出/快照一致性,不宣称具备防数据库管理员篡改或电子签名保证。
```mermaid
sequenceDiagram
participant C as 调用者
participant A as RDM命令应用层
participant D as RDM存储
participant B as 基座审计
C->>A: 项目、操作、预期版本、幂等键
A->>A: 当前授权与同项目端点检查
A->>D: 原子提交事件批次、幂等结果、outbox
D-->>A: 已提交seq及结果
A-->>C: 业务结果与可追溯操作编号
A->>A: 刷新或重建项目投影
D->>B: outbox可靠补送关联审计
```
基座暂不可用时,已提交结构事实继续保存,动作审计显示“同步中”;恢复后幂等补送。
关键业务规则需要同一库的证据记录才能放行时,在业务事务内保存;不将异步投递当作批准的前提已满足。
导出需先固定截止水位、检查完整性;审计关联仍缺失时明确标为不完整,正式完整报告应阻止导出或要求用户选择带缺口的草稿。
### Read Interfaces
优先通过现有命令总线及页面 SDK 提供 RDM 查询,所有入口落到同一应用服务;不另建绕过权限的调试 API。
| 候选读契约 | 返回内容与限制 |
|---|---|
| inspect.capabilities / inspect.projects | 可见项目、当前项目是否可审计、是否可跨项目;管理员全项目目录独立分页 |
| inspect.summary | 两树规模、待确认关系、缺口、最新动作、数据截止水位;不把缺失当作零 |
| inspect.tree / inspect.object | 树子节点分页;所选对象版本、出处、状态;只展开需要的分支 |
| inspect.relations | 方向、图层、关系状态、版本、深度;默认一跳,后续点选扩展;有数量上限和截断提示 |
| inspect.events | 按项目、对象、时间、操作者、动作、结果过滤,游标分页;可展开一次操作的差异 |
| inspect.history | 固定 seq/基线下的对象、关系和当时规则;缺少重放材料返回明确不可还原状态 |
| inspect.export | 导出同一筛选条件和截止水位;生成、取状态、下载都重新校验主体及项目权限 |
分页游标绑定项目/筛选条件/排序/权限版本,不能拿 A 项目游标读 B。
缓存、导出缓存及订阅键包含主体能力范围、项目和截止水位,撤权后不可复用旧授权结果。
异步数据只有一个状态所有者:项目切换取消旧请求并递增 generation,过期响应丢弃;事件按 seq 去重、有序应用。
### Base Extension Requests
先验证现有注册点能否组合;不足部分按 RDM 的四要素扩展申请办理,保持公开面可选、向后兼容。
| 场景 | 希望的通用能力 | 现有能力不足 | 兼容方式 |
|---|---|---|---|
| 创建者看项目内所有人的动作 | 审计 envelope 的 projectId、operationId、对象版本及按项目查询 | Host.Audit 只有 owner/action/target/evidence;按 owner 会遗漏其他成员动作 | 增加可选的结构化审计能力/接口,不直接强改所有 Host 实现;旧记录标项目未知 |
| 宿主页面展示 RDM 审计入口 | 插件提供当前主体的审计能力和可见项目,宿主提供可信身份与项目上下文 | EXT-8 只有资源共享读取布尔判断;基座 AdminZone 仅看 isAdmin | 新增可选的动作级 capability/provider;不改变旧资源授权器含义 |
| 私人来源与项目发布证据联动 | 已授权工件/版本链接与受限占位,导出后下载再校验 | 不能让全项目审计器任意扩大 owner-scoped Host | 复用现有工件访问契约,仅按实测缺口增加窄接口;禁止任意 owner impersonation |
两树对象、边规则、合规矩阵和领域重放保留在 RDM,基座不内置这些领域表。
---
## Display Design
### Entrances and Layout
项目创建者从当前项目菜单进入“追溯与审计”;RDM 域管理员与基座超管从管理区“项目追溯与审计”进入项目目录,选定项目后复用同一页面。
管理员选择项目后,审计工作区的项目上下文必须更新为实际被审计项目,所有请求与标题保持一致。宿主支持审计项目切换时,项目身份集中显示在宿主项目位置;宿主不能切至该项目时,审计页必须显示明确项目标题和“返回项目目录”,并避免让宿主旧项目标题被误认为审计范围。管理员目录显示项目名、创建者、最近活动、待关注数量。
第一版为只读审计工作区,审批、确认关系和编辑仍跳回原受控业务流程,不在审计页面创造第二套写入口。
页面保留四个入口:**概览、资料与文档、关联追溯、操作记录**。
左侧按需显示笔记树/文档树导航;主区显示当前选择;对象详情在页面内展开,原件仍进入宿主唯一文件预览区。
不叠加弹窗,不默认铺满全部节点。
| 入口 | 默认看到什么 | 深入查看 |
|---|---|---|
| 概览 | 已收集资料、已形成文档、需要确认的关系、需要补齐的证据;最近几次重要变更 | 点击数字进入带筛选的列表;明确“统计截至…”和“不完整”状态 |
| 资料与文档 | 笔记树:阶段→事项→主题→资料切片;文档树:阶段→文档→章节 | 同一资料多个挂载不重复计数;缺主题可显示未分类,不伪造层级 |
| 关联追溯 | 所选对象居中,左右分别为“来源依据”和“影响对象” | 列表优先;切换为局部关系图;合规链/矩阵在此页按需切换 |
| 操作记录 | 自然语言时间线,按一次业务操作归组 | 展开前后差异、批准依据、对象版本与技术记录 |
### Human-readable Trace
关系展示示意,实际节点与连线必须来自已保存数据:
```mermaid
flowchart LR
A[会议纪要中的原文] -->|支持| B[用户需求]
B -->|落实到| C[方案章节 v3]
C -->|由此验证| D[验证记录]
```
点选“方案章节 v3”后首先看到:这是什么、当前版本、依据哪几条材料、影响哪几项需求/验证、最近谁改过。
缺少验证记录时显示“验证依据待补齐”,不画虚构的完整链;候选边使用虚线和文字“待确认”,不能仅靠颜色区分。
“没有已知关联”与“尚未完成关系索引/本次查询被截断”分开呈现。
关系被废止后可在历史模式中看到;跨版本关系明确标注版本,不让 v4 的证据替代 v3 的事实。
### Audit Timeline
时间线示意:
- 10:32 张三将《需求说明》从 v2 更新为 v3;修改了“使用环境”章节,依据为评审纪要第 4 条。
- 10:41 李四确认该章节与 UR-012 的关联;确认理由为“已覆盖用户场景”。
- 11:05 王五批准 v3;点击可查看批准时的版本和证据。
每条默认仅显示时间、操作者、动作、对象、结果;“查看变更”再展开前后差异与理由。
后台归档、重试等技术事件默认归组收起,失败、拒绝、未知结果有文字说明;原始 JSON 不作为主界面。
Actor 为真实执行者,Subject 为被分配职责或被变更权限的人,界面不混写两者。
默认显示北京时间并注明时区,底层保留 UTC;历史模式顶部醒目标注“查看截至某时间/某基线的记录”。
### Interaction Boundaries
提供“当前/历史”切换,历史可选择时间或基线;从批准记录可直接打开批准时的版本。两树、关系与记录共用一个截止水位,“返回当前”恢复对象当前版本;对象已删除则显示删除说明,不切到同名对象。
对象名称支持搜索;树节点懒加载;记录使用“加载更多”;关系默认一跳,上限和截断状态由服务端返回。
加载、空项目、无权限、部分数据、同步中、历史不可还原、请求失败分别展示,不都渲染成“暂无数据”。
首屏不显示 SQL、事件 opcode、内部 UUID、hash;复制技术编号放在详情中。
推荐验收任务:创建者在三次主要点击内找到某章节的原始依据和最近修改原因;管理员能清楚确认当前查看哪个项目。
实现遵循 `Dev:DESIGN.md`:颜色/圆角/字号消费 `@ui` 令牌;折叠用 Collapsible;动效只用 `mk-*`;键盘可导航,状态同时有文字与形状。
优先在当前宿主工作区体系内以 RDM 插件页面提供,避免长期维护第二套静态工作台。
旧 `web/app.js` 保留过渡兼容范围,但图与审计能力接同一授权服务;最终页面交付形式在 U4 固定,不能假设在途 Generative UI 已能直接承载。
---
## Implementation Units
本批默认顺序:U1→U2→U3→U4→U5,按 `policy/delivery.md` 分增量评审。U6 是独立后续衔接项,不纳入本批完成条件。
U1 是首选下一任务;这份方案不构成启动它的授权。
### U1. 项目身份与读取授权闭环
目标/需求:R1、R2、R9、R10;依赖:方案已批准(2026-10-11)、KTD4 已按双层口径裁定;剩余既有项目映射盘点在立项时完成。
范围:`RDM:internal/projects`、`members`、`perms`、`rdmapp/runtime.go`、`projects_api.go`、`perms_api.go`、`plugins/rdm/plugin.go`、`web/app.js` 的旧客户端项目上下文;测试 `rdmapp/perms_test.go`、`sharding_test.go`、`plugins/rdm/plugin_test.go`;必要基座 capability 扩展单独申请。
建立显式项目绑定;增加审计读取策略和管理员受信引导门禁;统一包裹旧/新 trace、cgraph、项目列表、历史和导出入口。
U1 同批接通旧客户端的项目选择和命令封装,并解析可信会话/工件上下文到显式绑定;随后启用对外 projectId 必填门禁。无映射时显示“项目待绑定”,不回退全量世界。仅管理员专用迁移/调查路径能够处理未归属域,并单独留痕。
检查结论提案、引用、关系两端和版本归属,不接受来自别的项目的 ID。
普通文档协作仍使用原业务权限,避免用审计策略误封工作流程。
验证:创建者、非创建者负责人、成员、非成员、RDM 域管理员、仅基座超管六类主体(后两类均为跨项目审计正例,域管理员访问平台管理分区须为负例);空项目、伪造项目、跨项目对象、旧命令/模型工具绕过、撤权后的新请求与下载均有正负例。
增加首次启动、恢复后空台账、并发初始化、普通建项目不提权的验证。
完成条件:至少两个项目、多用户、真实认证入口下全部读取边界可复核;不依赖隐藏按钮。
进展(2026-10-11,RDM PR #195 merge 05b7d1a):U1 已实施合入——审计判定统一入口(创建者∨域管理员∨超管槽,`AuthorizeAudit`/`AuthorizeCmd`,命令面全接线,空 projectId 显式拒绝);KTD4 双层管理员落地(`rdm_admins` 单行台账+`-bootstrap-admin` 受信引导,`project.create` 不再自动引导);KTD5 宿主显式绑定(`rdm_host_project_map`+`rdm.project.bind/unbind`+EXT-8 映射解析+上传可信上下文解析);项目列表按主体过滤;旧客户端 `web/app.js` 统一注入 projectId。两项基座扩展申请已随该 PR 落盘(`RDM:docs/proposals/2026-10-11-u1-base-extension-requests.md`):超管槽在基座能力发版前保持 fail-closed,「仅基座超管」负例†待接线翻正;真实认证入口运行验收随 U4/U5 复核。
### U2. 原子事件与历史还原
目标/需求:R5、R6、R10;依赖:U1 的项目合同。
范围:`RDM:internal/domain/{eventlog,notetree,doctree,tracenet,compliance,replay,persist,review}.go`、`domain/store/store.go`、`rdmapp/conclusions.go`、`upload.go` 及上传状态台账,对应 `persist_test.go`、`integrity_test.go`、`compliance_test.go`、`conclusions_test.go`、`upload_test.go`。
补事件批次事务、项目内写入串行/预期版本和操作幂等;内存变更置于提交之后。
上传原件先不可变留存,再由同一 RDM 数据库事务发布引用、状态、项目归属、切片关联、pending 关闭和幂等结果;meta.json 降为可重建镜像。上传确认/拒绝中断后按操作结果恢复,不重复入库;此项在 SQLite 首期完成,不等待 U6。
修复升版 stale、正式版审签元数据和完整快照重放;记录成员/权限/职责变化及真实 actor。
建立结构事件到基座审计的 outbox,显示投递状态;旧缺失事实明确为不可恢复,不能补造批准人或时间。
验证:第二条/最后一条事件失败、提交后进程退出、投影刷新失败、相同请求重试、并发同版本更新;重启前后对节点/版本/边/审签/缺口深比较;旧快照与未知 schemaVersion 明确拒绝冒充完整;历史/导出截止落在批次中间时拒绝,上传发布/确认中断后状态与切片不重复、不矛盾。
进展(2026-10-11,RDM PR #197 merge fe8a75b):U2 已实施合入——`Runtime.TxProject` 事务批次(项目写锁+tx 绑定写穿+失败回滚并从库重建,零部分提交);入库拆事务内核/提交后宿主侧;结论确认/拒绝与上传五步同事务(`rdm_uploads` 表为事实源,meta.json 降为镜像);Retag 事件先行;重放保真(正式版 At/Actor 入载荷、CNode 升版重放重算 stale、cSnap 全量载荷+旧计数快照标 CountOnly、events schema_version 未知版本停止还原);`rdm_op_log` 幂等(结论/上传确认 opId);`rdm_audit_outbox` 同事务入箱+尽力投递+`rdm.audit.status`。写串行覆盖=事务面+已转换命令(用户裁定口径);进程级 kill 注入与运行验收随 U4/U5 复核。
完成条件:命令结果、持久记录、重建投影一致,故障不造成不可解释的部分成功。
### U3. 统一项目审计读服务
目标/需求:R3、R4、R5、R8;依赖:U1、U2。
范围:`RDM:internal/rdmapp/trace.go`、`baseline.go`、`cgraph_export.go`、拟增 inspection 读投影;`plugins/rdm/plugin.go`;测试 `trace_test.go`、`chainviews_test.go` 及新增 inspection 集成测试。
把两树、一般关系、受控关系、结构事件和基座动作记录适配到统一对象详情及分页查询。
为查询绑定项目、当前授权、截止水位及版本;返回覆盖状态和截断状态。
补公开面需要的 project/operation 审计查询与能力 provider;不从字符串解析项目归属。
验证:旧网和合规网的同名 ID 不冲突,历史 v3 与当前 v4 不串用;未知/受限来源在旧 payload、差异、快照及导出副本中也不泄漏;游标换项目拒绝,分页期间新增事件不重不漏;动作审计同步延迟可见。
完成条件:无需读数据库即可通过受控接口回答来源、影响、变更与历史问题。
进展(2026-10-11,RDM PR #201 merge dbc41b6):U3 已实施合入——`inspection.go` 七面读服务(Capabilities/Summary/Tree/Object/Relations/Events/History)+统一响应壳(键集分页+截断+coverage 诚实标注);游标 base64 绑定项目(跨项目/过滤不一致拒绝);水位=已提交 max(seq);双网合流(layer 标注/kind 路由不串/ver 标注);schema v6 events.operation_id 列+TxProject BeginOperation 归组注入;披露标记(legacy-unattributed/model-candidate);`rdm.inspect.*` 七命令+审计面授权。基座侧动作审计待基座扩展(申请一/二)。
### U4. 项目追溯审计工作区
目标/需求:R2、R3、R4、R7;依赖:U3;页面载体在本增量设计评审时固定为宿主支持的 RDM 插件工作区。
范围:RDM 页面资源及宿主注册声明;必要时 `Dev:modules/frontend/src/components/{Workspaces,AdminZone,adminSections}.tsx`、`store.ts`、`api.ts`;交互测试沿用 frontend test/e2e 体系,旧 Web 的兼容测试留在 `RDM:web/workbench_test.mjs`。
实现四入口、两树导航、对象详情、一跳关系和自然语言记录;普通用户无入口且接口拒绝。
管理员目录按授权后的项目查询,选项目复用页面;RDM 管理 capability 不解锁其他平台管理分区。
沿用宿主文件预览、令牌和折叠;删除/替换旧重复图入口需另列兼容清单。
验证:真实浏览器完成来源查询、选择历史时间/基线并返回当前、管理员从宿主 A 打开审计 B 后标题和请求一致;模拟慢请求后快速切项目无串页;键盘、窄屏、长标题、千级节点懒加载、空/失败/受限/不可还原状态可理解。
完成条件:用户按三次主要点击任务完成取证,并人工评审界面是否直观;业务可用与视觉通过分别记录。
进展(2026-10-11,Dev PR #368 merge 7aa8fd9):U4 已实施合入——`RdmAuditWorkspace.tsx` 四入口(概览/资料文档/关联追溯/操作记录)Dev 前端 builtin 工作区,消费 U3 `rdm.inspect.*` 七命令面;`rdmCommand` 封装(receipt 解包+confirm-card 提示);DESIGN.md 令牌严格合规(0 裸色值/0 行内 fontSize/0 details/0 新增 keyframes)。附带修复 U5 遗留的 PreviewPane TS 类型错误(单参/双参签名匹配)。
### U5. 历史导出与正式集成验收
目标/需求:R5、R8、R9、R10;依赖:U2、U3、U4。
范围:`RDM:internal/rdmapp/{cgraph_export,docx,xlsx}.go`、页面导出入口、导出临时工件及下载授权;测试 `domain/export_test.go`、`plugins/rdm/xlsx_export_test.go` 和浏览器下载场景。
复用 docx/xlsx 导出器,固定项目/版本/规则/截止 seq,补证据来源清单和完整性说明。
导出按请求身份和范围生成,撤权后下载失败;历史受限来源不随导出泄漏。
固定基座发布版本、RDM pins 与页面资源组合后,重放真实端到端流程。
验证:导出中途有新写入不改变已固定内容;历史来源软删除仍可按授权追溯;未归属/缺失事件可见;跨项目下载、过期下载、权限撤销均拒绝。
完成条件:同一版本在 UI 与报告中结论一致,并有正式 GATE/REPLAY 证据。
进展(2026-10-11,RDM PR #213 merge 1dce69d):#213 只交付了导出工件生命周期——`rdm_export_artifacts`、三条 `rdm.inspect.export.*` 命令、截止水位被记录、文件名带 `wm<seq>`。导出内容当时仍读实时世界,报告没有三段,页面没有导出入口。
进展(2026-10-12,未合入):RDM #301 补水位重放、三段、草稿门和遮蔽;Frontend #73 与 Dev #488 补概览导出区。这些 PR 的 CI 结论以各自 HEAD 的作业为准,本文不把本地测试写成 GATE。
---
## Deferred Integration
### U6. 团队部署存储衔接(独立后续任务)
本项不纳入 U1–U5 的默认实施与验收范围,另经团队存储方案授权后立项。
目标/需求:R1、R5、R6、R9;依赖:U2,以及[多人协作存储方案](2026-10-11-collaboration-storage-and-distribution.md)适用增量。
范围:RDM 领域 store/迁移、项目/成员/权限/结论/慢通道台账、上传原件与导出清单;基座只补通用连接/生命周期公开契约。
明确 RDM SQLite 与团队 PG 的适配和备份清单,避免一半事实在 PG、一半未受保护地留在本机文件。
先验证单实例团队档;多实例的发号、执行所有权、缓存失效与故障恢复在独立验收前保持关闭。
本次不复制基座在途 PG 档位和迁移能力,也不把基座 PR 完成当作 RDM 迁移完成。
验证:真实 PG 的隔离/事务/重放、迁移前后对象与事件数及哈希对账、备份恢复含原件;PG 不可用不静默退回空 SQLite。
完成条件:团队部署具备明确权威存储与恢复证据;若本批仅交付单实例 SQLite,验收报告必须声明该限制。
---
## Migration and Delivery
历史归属先做只读盘点:未归属事件、缺少项目绑定、对象依赖闭包、旧快照和私人来源。
现有 seq 区间迁移接口不能作为任意截取的安全保证;归属以完整对象及依赖闭包为单位校验,并保留批准映射和原因。
不把存量自动分给首个项目,不根据当前 owner 猜历史创建者。
迁移前保存备份和对账清单,在隔离副本上验证,再取得共享环境迁移授权。
采用新增字段/投影、保留原事件、按项目启用;观察期内可关闭新页面和新读取投影,但不能恢复越权的全量读取入口。
停止条件:发现跨项目泄漏、重放不一致、无法确定历史归属、投影滞后超出可解释范围或恢复失败;保留现场和失败证据。
跨仓顺序为基座扩展申请→基座实现/测试/发布→RDM 升级固定版本→RDM 集成验证→Dev 文档与组合记录更新。
必要令牌调整按 DESIGN.md 成对关联 UI 与 Dev 组合;仅消费令牌时不制造无关令牌 PR。
在途核对(本次 Gitea API 只读,SELF;实施前须刷新):Dev #325 为团队 PG 档与迁移组合,#317 为服务启动 DSN;RDM #194 为已合入 xlsx 工作的任务卡闭合,不能重复安排 xlsx 从零实现;Backend、Documents 查询未返回开放 PR。
关联规划为 RDM 阶段总案 P3/MS3、U0 项目共享合同、V2.2 合规图方案和上述团队存储方案;本案补充集成/授权/显示,不声称这些里程碑已验收。
---
## Verification Contract
以下为实施时的验收计划,本轮结果均 NOT_RUN;文档自检另以任务收据记录。
| 组 | 覆盖需求 | 最小可复核场景 |
|---|---|---|
| 授权/隔离 | R1、R2、R10 | 六类角色×两个项目;列表、统计、详情、关系、历史、工具、导出、下载、订阅均验证;普通文档协作无误封 |
| 数据完整性 | R3、R5、R6 | 跨项目提案和边拒绝;多事件中途失败;重试/并发;重启及指定 seq 深比较;完整快照哈希 |
| 真实业务闭环 | R3–R6 | 项目创建→纪要入库→切片→需求→章节 v1→依据变化→v2→审签→历史回看→报告;缺失链节明确显示 |
| 可用性 | R4、R7 | 创建者找依据/变更原因,管理员选项目,键盘/窄屏/长文本,加载/失败/受限状态,过期响应丢弃 |
| 导出 | R8、R10 | 同一 cutoff UI/报告一致;创建与下载分别鉴权;撤权/受限来源/不完整记录不泄漏或冒充完整 |
| 组合与运行 | R9 | 固定 Backend/Core/Frontend/UI/RDM SHA;RDM 测试与构建、Dev 适用组合检查;部署后二进制身份和真实浏览器路径 |
| 团队档(U6另行立项时) | R1、R5、R6 | 真 PG、迁移与恢复;单实例和多实例证据分别记录,无变量或无环境即 NOT_RUN/SKIP |
性能建议作为待批准目标:单项目 1 万对象/5 万关系、100 万事件的样本;首屏仅取分页摘要与当前树分支;普通分页查询 P95≤1s,首屏可操作≤2s。
记录实际硬件、数据分布、过滤条件和组件版本,不能以空库或缓存命中替代容量结论。
正式审核先重放最小集再读作者证据;来源标记遵循 GATE/REPLAY/SELF,用户界面演示与正式验收分开。
---
## Definition of Done
本方案阶段完成条件:现状依据可定位、原有能力不重复建设、项目和角色边界明确、展示可理解、工作项与验收对应;r1 已于 2026-10-11 经用户评审通过(五阶段一并,含 KTD4 双层管理员裁定)。
实现阶段完成条件:R1–R10 对应证据齐备,固定组合通过正式测试和独立审核,部署与浏览器验收有独立记录;源码存在不等于完成。
已裁定决策:KTD4 采用双层管理员——基座 isAdmin 超管保底+RDM 台账域管理员(session-settled: user-directed,2026-10-11)。剩余待定决策:RDM 宿主工作区入口的具体交付契约(U4 设计评审时固定);U6 如需提前并入本批,应另行批准范围及目标环境,默认不包含。
推荐先批准 U1 的细化设计与测试范围;U2–U5 按依赖逐阶段评审,U6 单独立项,不把本轮范围确认当作连续实施授权。
后续再考虑跨项目引用审批、全局关系图、电子签名/外部防篡改存证及复杂图分析;这些不属于首个可用闭环。
@@ -0,0 +1,252 @@
---
title: 快慢通道展示 U1 实施计划
date: 2026-10-12
revision: r1
status: approved
owner: weichen
execution: implementation
parent: 2026-10-12-fast-slow-channel-display.md@r1.1
---
# 快慢通道展示 U1 实施计划 r1
> **For agentic workers:** 按本计划逐工作项实施;每项先写失败测试再改实现。规格依据主方案 [r1.1](2026-10-12-fast-slow-channel-display.md)。阶段 5 已于 2026-10-12 经用户「开始」批准;批准不等于推送/合入授权。
**Goal:** 统一后台任务真实状态语义,用 L1 精炼骨架替换「原始指令占主视图」,使失败不再显示为完成,并为后续 U2 快照契约留下兼容字段草图。
**Architecture:** 服务端在建卡/终态时写入精炼 Body 与正确 `CardStatus`;UI 按状态灯/状态词渲染;旧 `done+danger` 客户端兼容映射为失败。不引入持久 `TaskSnapshot`、不按任务路由 `agent.progress`、不发布阶段 findings(属 U2/U3)。
**Tech Stack:** Go(Core/Backend)、React+TypeScript(UI/Frontend)、既有 ActivityCard / UINode / cardsvc 事件流。
**Spec:** [快慢通道展示与动态工作摘要方案 r1.1](2026-10-12-fast-slow-channel-display.md) §4 R03-a、§7.1、§10.1、§14 U1 出口白名单。
## Global Constraints
- 首批仅 U1;禁止顺手实现 U2/U3 范围(材料内容 hash、持久快照、检查点摘要、HITL 双入口完备)。
- 颜色/圆角/字号只消费 `@ui/tokens.css`;动效只用 `mk-*`;折叠用 Collapsible。
- 证据经 `CMD=… make evidence` 写入任务卡;声明通过须标 SELF/GATE。
- 跨仓顺序:Core(若有契约)→ Backend → UI → Frontend → Dev gitlink 组合 `make test`。
- 现有「停止」按钮语义不在本增量改名为「仅停前台」;不暴露暂停/独立取消/续跑。
## Review Focus
1. 失败卡若仍为 `done`,用户会当成成功收纳——须 `CardFailed` 或等价失败灯。
2. 建卡若仍塞入 task 原文,用户会把指令当进度——须 L1 骨架。
3. 材料去重若仍只认 `CardDone`,改为 `CardFailed` 后可能卡死重试门禁——须同步测试。
4. 快通道在登记前说「已启动」——须与真实登记/开跑事件对齐。
5. `CurrentTaskCard`(plan/todos)与后台 progress 卡同目标叠卡——U1 须定义合并或降噪规则,避免双标题。
---
## 0. 范围与非目标
### 纳入(映射需求)
| 需求 | U1 验收子集 |
|---|---|
| R01 | 简单问答无空进度卡;复杂任务短答可含已确认范围与后台真实状态 |
| R02 | 已登记任务有稳定卡对象;未登记不显示「已启动」 |
| R03-a | L1 骨架 + 诚实无发现占位;不验收运行中真实发现 |
| R08 | 失败 ≠ 成功灯;状态词「执行失败」 |
| R10 | 完成卡骨架(结论/要点/缺项/入口);完备来源与版本定位可留 U3 |
| R13 | 守护测试通过;状态不只靠颜色(沿用 StatusLamp 形状) |
### 排除
见主方案 §14「明确排除」。另:不改 `CancelRun` 父句柄行为;不改 Surface 抢占策略(属 U2/U4)。
### 与 CurrentTaskCard 的合并规则(U1)
- 后台 `CardKindProgress` 卡是慢通道权威对象。
- 若同一会话同时存在前台 `plan`/`todos` 的 `CurrentTaskCard` 与后台 progress 卡:**右栏「工作」优先列出 progress 卡**;`CurrentTaskCard` 仅在无后台 progress 卡且 plan/todos 非空时展示。
- 不在 U1 把 plan steps 写入后台卡 Body。
---
## 1. 工作项与文件
### W1 — Core:精炼摘要契约草图与旧卡映射说明
**Files:**
- Modify: `modules/core/activity.go`(若增加可选字段)或新增 `modules/core/task_summary.go`
- Test: `modules/core/activity_test.go` 或同目录新测
**内容(最小):**
```go
// TaskSummaryView 是 U1 写入 ActivityCard.Body 的权威语义草图;
// 完整 TaskSnapshot(findings/revision/streamScope)留待 U2。
type TaskSummaryView struct {
Title string // 业务动宾短标题
Focus string // 正在做什么,≤2 行
FindingsNote string // U1:无成果时固定诚实文案;有结构化 findings 属 U3
Remaining string
NextStep string
OutcomeLine string // 完成后的结论一行;运行中可空
}
```
可选:在 `ActivityCard` 增加 `Summary *TaskSummaryView \`json:"summary,omitempty"\``;**Body 仍为旧客户端回退投影**,新客户端优先读 Summary。若为降低跨仓面,U1 可仅约定 Body 的 Markdown/KV 形状而不加字段——但须在 Core 注释或本计划冻结 Body 键名:
| KV 键 | 含义 |
|---|---|
| 状态 | 排队中 / 进行中 / 已完成 / 执行失败 |
| 正在做 | Focus |
| 当前发现 | FindingsNote(U1 占位或完成后要点摘要) |
| 剩余 | Remaining |
| 下一步 | NextStep |
- [ ] 冻结 Body 键名或 `Summary` 字段二选一,写入 Core 并单测序列化往返
- [ ] 文档注释标明 findings[] 属 U2/U3
- [ ] Commit:`docs(core): freeze U1 task summary body contract`
### W2 — Backend:建卡/终态状态与精炼 Body
**Files:**
- Modify: `modules/backend/internal/runmgr/runmgr.go`(`createBackgroundCard` ~1942、`promoteQueuedCard` ~1970、`finishBackgroundCard` ~1992)
- Modify: `modules/backend/internal/runmgr/material_test.go`(及同类依赖 `CardDone+danger` 的测试)
- Test: 新增 `modules/backend/internal/runmgr/background_card_test.go`
**当前问题(源码):**
```go
// create:Body 首节点 = truncate(task, 400)
// finish:SetStatus(..., CardDone, tone) 且失败 tone=danger、状态行仍写「已完成」
```
**目标行为:**
```go
func backgroundRunningBody(focus string, kv [][2]string, statusLabel string) []core.UINode {
return []core.UINode{
{Type: core.UIMarkdown, Markdown: "尚无阶段结论,正在读取材料"},
{Type: core.UIKV, KV: append(append([][2]string(nil), kv...),
[2]string{"状态", statusLabel},
[2]string{"正在做", focus},
[2]string{"当前发现", "尚无阶段结论"},
[2]string{"剩余", "待任务进展后更新"},
[2]string{"下一步", "继续处理已登记工作"},
)},
}
}
// finish 成功:CardDone + tone ok;状态「已完成」;Markdown = 结论骨架
// finish 失败:CardFailed + tone danger;状态「执行失败」;保留已有可读摘要
```
- [ ] 失败测试:`finishBackgroundCard` 在 `err != nil` 时 `Status==CardFailed` 且 Body 状态键 ≠「已完成」
- [ ] 失败测试:`createBackgroundCard` Body Markdown 不含原始 task 长指令(可用固定长 task 断言不出现)
- [ ] 实现最小改动;`promoteQueuedCard` 只更新状态键为「进行中…」
- [ ] 更新 `material_test`:成功路径仍等 `CardDone`;失败/重试路径认 `CardFailed` 或释放 `materialActive`
- [ ] 快通道诚实:spawn/登记路径日志与用户可见文案——仅在 `Create` 成功后可称「已登记」;仅在子 run 启动后可称「进行中」(检查 `spawnBackground*` / material 入口提示,必要时改 system 提示片段;**不做**阶段发现生成)
- [ ] Commit:`fix(backend): map background card fail to CardFailed and use L1 body`
### W3 — UI:状态灯与旧卡兼容
**Files:**
- Modify: `modules/ui/src/ActivityCardView.tsx`(`StatusLamp`)
- Test: 既有 UI 测试或新增 `ActivityCardView` 测例;跑 `design-guard.test.ts`
**目标:**
```tsx
// done → 完成灯;failed → 失败灯(已有)
// 兼容:status===done && tone==='danger' → 按失败灯展示,title「执行失败(兼容)」
```
- [ ] 失败测试:`done+danger` 渲染失败形状灯,不渲染 `lamp-ok`
- [ ] 实现兼容映射;不新增裸色值
- [ ] `pnpm test` / 仓内 UI 测试目标通过
- [ ] Commit:`fix(ui): treat done+danger progress cards as failed`
### W4 — Frontend:工作区排序与空卡
**Files:**
- Modify: `modules/frontend/src/components/Workbench.tsx`(`CurrentTaskCard` 展示条件)
- Modify: 若 Inbox 过滤依赖 status,核对 `store.ts` 对 `failed` 的分区(完成区 vs 进行中)
- Test: 前端既有测试或最小组件测
**目标:**
- 存在 `kind===progress && status===active`(或排队文案)时隐藏与同会话抢注意力的空 `CurrentTaskCard`(按 §0 合并规则)
- `failed` 卡进入可收纳/结果区逻辑与 `done` 区分(失败可收纳但不显示成功语义)
- 简单问答路径不因误触发材料整理产生空卡——若属既有路由,仅加回归断言「无附件无后台登记时 progress 卡数为 0」
- [ ] 实现合并规则
- [ ] 回归:无后台任务时 plan 仍可显示
- [ ] Commit:`fix(frontend): prefer progress cards over duplicate CurrentTaskCard`
### W5 — Dev 组合与文档收口
**Files:**
- Modify: Dev gitlink(Core/Backend/UI/Frontend 精确 SHA)
- Modify: 实施任务卡证据段;主方案进展指针(若本增量合入时)
- Test: 工作区根 `make test`、`make build`
- [ ] 各组件 PR 顺序合入或同批组合验证
- [ ] Dev `make test` + `make build`;evidence 写入
- [ ] 更新主方案「规划进展」:U1 实施状态(仅在真实合入后)
---
## 2. 测试与环境
| 层 | 命令/方法 | 证明什么 |
|---|---|---|
| 单元 | Backend `go test ./internal/runmgr/…`;Core 序列化;UI StatusLamp | 状态映射、Body 骨架、兼容灯 |
| 守护 | UI/Frontend `design-guard.test.ts` | 无新增裸色值/私有 keyframes/行内字号 |
| 组合 | Dev `make test`、`make build` | gitlink 组合可编译可测 |
| 手工冒烟(SELF) | 本地起服务:发材料看建卡;制造子任务失败看灯;简单问答无空卡 | U1 白名单场景 |
| 真实模型阶段成果 | **NOT_RUN / 不在 U1** | — |
| 浏览器窄屏全矩阵 | **NOT_RUN / 属 U4** | — |
被测对象:各仓 PR HEAD;组合声明须含精确 SHA。
---
## 3. 完成条件
1. U1 出口白名单全部可判定项有 SELF 或 GATE 证据。
2. R03-a 有测例;无人用「五问完整」拒绝 U1。
3. 材料整理去重/重试在 `CardFailed` 下仍可再次登记(或文档说明与测例固定行为)。
4. 无 U2/U3 范围代码混入同一变更集(审 Diff)。
---
## 4. 停止与回退条件
- 失败状态与存储不一致(卡显示失败但去重门禁认为仍在跑,或相反)→ 停止合入,修 W2/材料门禁。
- 新旧客户端之一崩溃或空白卡 → 回退 Summary 字段改动,保留 Body 回退投影。
- 发现实现滑入持久快照/检查点摘要 → 拆出变更,不进本 PR。
- DESIGN 守护失败 → 先改令牌消费再继续。
回退策略:回退受影响展示映射与 Body 生成;不删除已保存 run 结果。
---
## 5. 依赖顺序与责任
```text
W1 Core 契约(可选字段或 Body 键冻结)
→ W2 Backend 建卡/终态
→ W3 UI 灯兼容
→ W4 Frontend 工作区
→ W5 Dev gitlink + 组合测试
```
责任人:实施阶段指定;需求/评审:weichen。
预估:单增量跨 4 仓,以状态映射 + Body 重排为主,不含模型评测费用。
---
## 6. 计划评审状态
| 项 | 状态 |
|---|---|
| 关联方案 | r1.1 设计已批准;首批仅 U1 |
| 本实施计划 | **已批准**(2026-10-12,用户「开始」) |
| 业务代码 | 实施中:`feature/fast-slow-display-u1` |
| 推送/PR/合入 | 未授权(完成自检后另请) |
首选动作已执行:`make task-start NAME=feature/fast-slow-display-u1`,按 W1→W5 推进;设计任务卡可在文档 PR 合入后 `task-close`。
@@ -0,0 +1,525 @@
---
title: 快慢通道展示与动态工作摘要方案
date: 2026-10-12
revision: r1.1
status: design-approved
owner: weichen
execution: design-only
---
# 快慢通道展示与动态工作摘要方案 r1.1
状态:**方案设计已批准(阶段 4)**。需求依据:用户要求改善快慢通道的内容、排版与直观性,让慢通道执行期间持续呈现精准、精炼且有工作价值的状态、发现、摘要和总结。
批准依据:2026-10-12 用户确认评审结论计划并指示按该计划落地文档修订与 U1 实施计划;批准范围覆盖四层阅读、任务卡骨架、动态回投规则、U1→U2→U3→U4 顺序及**首批仅 U1**。本修订相对 r1 增加 R03 增量切分与 U1 出口白名单。业务代码实施仍须另批阶段 5 实施计划后启动。更新日期:2026-10-12(北京时间)。需求与评审负责人:weichen;实施负责人在实施阶段指定。
## 1. 推荐方向与成功标准
采用**对话推进工作、任务卡持续更新、结果按需展开**的方案。快通道负责即时理解、当前可回答的结论和必要确认;慢通道负责持续处理材料、研究、分析、生成及检查,并把当前工作成果逐步汇总给用户。两者共享任务与事实,不形成两份独立聊天记录。
用户应当可以在一个视野里回答五个问题:
1. 这项工作现在处于什么状态?
2. 已经完成什么、目前知道什么?
3. 这些发现对我的任务有什么影响?
4. 还缺什么、下一步准备做什么?
5. 是否需要我做决定或补充材料?
默认阅读只需一行状态和一张紧凑任务卡。深入查看时可看到阶段成果、依据和执行记录。正式交付后直接给出结论、关键要点、限制与文件入口。
设计的初始验收目标:代表性用户看到默认视图后,10 秒内可正确回答状态、主要发现、是否需处理三个问题;这个目标是**待验证的可用性指标**,不是当前体验已经达标的声明。
## 2. 当前实现依据及差距
本次依据本地固定源码核对,来源为 SELF。启动基线为 Dev `4bf6e4a0cf8b509320d54de2a6a41c5abb2f5bba`;任务同步后读取的 Dev HEAD 为 `3496d1af37827dc536559ed5bbfe23c381c329cd`,其包含同步基线 `dec25692c247c8923b0f9396c8f674aefec47521`。
组件:Backend `dcc180dcad2489a170edca154e39e335220854f1`、Core `89f3906c390027512ef47b5333088c3d3a019e84`、Frontend `d01a3ebd819da29bf7e7dd06e74c92ef34231774`、UI `bfecf8b51f9a0fdbd9a13590cddf8fc06b7ae700`。Documents 写作分支从单独获取的 `origin/main=52bf525ef8750999e5e7dbff0b2decac5b1155f7` 建立,未改变受测业务组件。源码审阅原始记录见 Dev 任务卡 `.task/feature-fast-slow-display-design.md` 的 source-audit 收据。本轮未开展真实模型、浏览器或部署验证;以下“已有”只表示源码中存在相应机制。
| 已有源码机制 | 位置 | 与本需求相关的差距 |
|---|---|---|
| 快通道是当前对话回合,慢通道是后台子任务;同会话后台槽位上限 3 | Backend `internal/runmgr/runmgr.go` 的 `spawnBackgroundOpts`、`startBackgroundSlot` | 缺少统一面向用户的任务概览;通道不是用户可切换的速度档位 |
| 带附件可自动启动材料整理;无文字/大材料可预启动,小材料有结束兜底;支持排队 | Backend `internal/runmgr/material.go` | 已有入口应复用;当前材料键仅由文件名与解析字数生成,同名等长更新可能复用旧结果。启动信息不等于材料已经读完 |
| 进度卡创建时放入最多约 400 字任务正文和“执行中”状态 | Backend `internal/runmgr/runmgr.go:1942` | 用户主要看到任务说明和指令,不能据此理解实际进度 |
| 完成时替换卡身;成功/失败统一置 `done`,用 tone 区分 | 同文件 `finishBackgroundCard`;UI `src/ActivityCardView.tsx:23` | 执行期间缺少成果投影;失败卡可能带“完成”灯,业务结果与卡收纳状态混在一起 |
| `agent.progress` 发布子任务文本前约 80 字及“调用工具”消息 | Backend `internal/runtime/sub_loop.go:208` | 原始文本片段不具备稳定摘要语义,也没有结构化来源和成果完整性 |
| `agent.progress` 写进单个 `live.agentNotes`;`touchLive` 维护单个 LiveState | Frontend `src/store.ts:514`、`:986` | 需避免后台进展串入当前对话回合;缺少按任务持久维护的独立展示投影 |
| 会话/项目事件流、卡片更新事件及断线重放契约已有;客户端读取 seq | Core `events.go`;Frontend `src/api.ts:192` | 客户端 `Math.max` 推进游标本身不等于拒绝旧帧;新投影必须显式处理去重、顺序和恢复 |
| 三栏“上下文 / 对话 / 工作与文件”、HITL、工件预览、Surface 已有 | Frontend `Workbench.tsx`、`Conversation.tsx`、`store.ts`;Core `activity.go` | 需要在现有落位整合,不增加第四栏;Surface 更新当前有自动打开预览行为,后台更新应控制抢占 |
| 后台完成结果在会话空闲时启动汇报回合 | Backend `deliverNotices` | 结果就绪与汇报已送达需要分开;用户不应因前台忙而误以为任务尚未完成 |
| 取消子 run 的现有路径还会尝试取消父句柄 | Backend `CancelRun` | 不直接提供承诺独立取消、暂停或重试的按钮 |
由源码推导的主要原因:运行事件、任务卡和最终回复之间缺少一层稳定的**用户工作摘要**。只调整卡片样式不能补齐这些信息。
## 3. 方案选择与边界
| 方案 | 收益 | 代价与限制 | 结论 |
|---|---|---|---|
| 直接把慢通道日志流到卡片 | 改动较少、容易看到活动 | 原始指令与工具输出增多;难提炼发现;并发时噪声更大 | 作为执行记录层,不作为默认视图 |
| 快慢通道各有一份完整对话流 | 两条执行线直观 | 重复回复、重复确认、用户需要拼接上下文;占用阅读空间 | 不采用 |
| 统一任务摘要 + 同一卡片更新 + 对话关键回投 | 结论可读、状态可见、细节可追溯 | 需要结构化成果与持久投影 | **推荐** |
范围包括信息架构、快通道内容、慢通道摘要、状态语义、更新策略、来源与恢复、UI 组件适配。通用基座提供任务、发现、来源与动作能力;文档审签、业务风险等级等由下游提供适配,不写进基座。
本轮不执行业务代码修改、模型实验、迁移、重启或部署。候选设计中的新契约、持久化和操作能力均为待批准内容。本方案不依赖 Generative UI 插件启用才能工作;结构化任务卡提供基础体验,Surface 可用于适合的成果展示。
## 4. 需求与可判定验收
以下为已批准方案范围内的需求表。P0 是核心闭环,P1 是增强项。首批实施仅覆盖 U1 出口白名单中的子集;“纳入候选”不等于该子集已获实施授权。
| ID | 需求 | 优先级 | 可判定验收条件 | 依赖/处理 |
|---|---|---|---|---|
| R01 | 快通道首先给用户可用的即时答复 | P0 | 简单问答无空任务卡;复杂任务短答能说明已确认范围、当前可回答内容及后台工作 | 既有对话;U1 纳入 |
| R02 | 所有已登记后台任务都有稳定可见对象 | P0 | 排队、运行、结束都定位到同一任务;未登记时不显示“已启动” | 任务登记;U1 纳入 |
| R03 | 默认卡呈现当前工作、发现与剩余项 | P0 | 见下方 R03 增量切分;完整五问仅在 U3 验收 | R02;按增量切分 |
| R04 | 阶段成果动态更新且不重复刷屏 | P0 | 有可用阶段成果时及时更新同一卡;选定长任务验收至少两个真实成果检查点;短任务可直接完成,普通更新不新增对话消息 | 事件投影;U2/U3 |
| R05 | 事实、分析判断和待确认内容可区分 | P0 | 关键发现可定位依据;尚未核实的推断带限定;不得以模型自报覆盖工具实际结果 | 来源契约;U2/U3 |
| R06 | 并行任务不会互相污染状态或正文 | P0 | 3 个后台任务与前台回合同时活动,各任务标题、发现和终态归属正确 | 按任务路由;U2 |
| R07 | 等待用户的动作明确且双入口一致 | P0 | 对话/右栏提交任一入口后另一个同步更新;重复点击只执行一次 | 既有 HITL/动作;U3 |
| R08 | 成功、部分结果、失败、中断明确区分 | P0 | 失败不显示成功灯;部分结果标明缺项;未保存的结果不显示“已交付” | 结果契约;U1 纳入 |
| R09 | 断线/刷新不丢失成果,也不伪造状态 | P0 | 重连可恢复阶段摘要;重复/乱序事件不回退;连接异常不改写业务终态 | 持久快照;U2 |
| R10 | 完成回投精炼且可取回产物 | P0 | 显示结论、最多 3 个默认要点、缺项、文件入口;定位真实文件且版本明确 | 工件/通知;U1 骨架,U3 完备 |
| R11 | 右栏关闭与窄屏时主要能力完整 | P0 | 不打开右栏即可读摘要、看依据、处理确认、打开文件 | 对话内展开;U4 |
| R12 | 更新尊重正在阅读的内容 | P0 | 不自动切文件、不夺取焦点、不把用户滚回底部;展开与阅读位置保留 | 更新策略;U2/U4 |
| R13 | 视觉与可访问性符合 DESIGN.md | P0 | 令牌、Collapsible、MotionKit 守护通过;键盘可达;状态不只靠颜色 | UI/Frontend;U1 纳入 |
| R14 | 摘要成本受控,摘要失败不影响任务 | P0 | 不按 token 调用摘要模型;预算耗尽仍有真实阶段状态与既有发现 | 发布策略;U3 |
| R15 | 修改任务要求可解释地衔接 | P1 | 新要求明确“尚未生效/已用于后续任务”;不假称已改变在跑任务 | 新任务/输入确认;U4 |
| R16 | 合适成果可以切换对比、清单或报告 | P1 | 比较任务给差异表;审查给问题清单;插件关闭仍能读取核心摘要 | 可选 Surface;U4 |
| R17 | 每次尝试与结果采用状态可追溯 | P0 | 新尝试不覆盖旧失败;生成、用户认可、正式发布三者独立显示 | task/attempt/result;U2 |
| R18 | 跨任务发现有总览且不重复计数 | P1 | 同一来源同一发现合并引用;冲突并列呈现,关联到各自任务 | 稳定发现 ID;U4 |
### R03 增量切分(定稿)
完整 R03「运行卡无需展开即可回答第 1 节五问」不得用单一增量字面验收。切分为:
| 子集 | 归属 | 可判定出口 |
|---|---|---|
| R03-a | U1 | 默认卡采用固定 L1 骨架(标题+状态、正在做什么、当前发现区、剩余/下一步);无阶段成果时诚实显示「尚无阶段结论…」;不把原始任务指令当作进度正文;**不**要求运行中出现真实业务发现 |
| R03-b | U2 | 活动行与覆盖/剩余可随确定性事件持续更新;刷新/重连后骨架与活动状态仍可读 |
| R03-c | U3 | 带来源的 1–3 条阶段发现;运行中即可回答五问中的「知道什么 / 影响 / 还缺什么」 |
项目符合度:R01–R18 与对话优先、服务端权威、通用基座定位相符;其中 R02–R09、R14、R17 需要契约及实现调整,R15/R16/R18 的完整能力需进一步设计。运行可行性尚未验证。
## 5. 信息架构与阅读层级
维持三栏。左侧提供项目、会话、材料上下文;中间负责对话、关键进展和决定;右侧“工作”集中当前任务与待处理事项,“文件”负责既有唯一预览入口。
| 层级 | 默认展示 | 用户目的 | 展开方式 |
|---|---|---|---|
| L0 一行概览 | 前台状态、后台任务数量、待处理数量 | 一眼判断是否忙、是否需要行动 | 点击对应任务或待处理项 |
| L1 工作摘要 | 目标、状态、正在做什么、1–3 条重要发现、剩余项、必要动作 | 快速理解并继续工作 | 当前任务卡;对话内同对象锚点 |
| L2 阶段与依据 | 阶段成果、发现列表、覆盖范围、未决事项、来源 | 检查判断、准备评审 | 在原位置用 Collapsible 展开 |
| L3 执行记录 | 工具调用、可授权查看的参数/输出、事件、错误详情 | 排障和审计 | “执行记录”,默认折叠、按阶段分组 |
默认先提供 L0/L1;不同时展开所有任务。正在查看文件时,工作更新只改变概览及未读提示。右栏收起时,中栏任务锚点可展开 L1/L2/L3,关键功能不依赖右栏。两处共享同一 taskId 和服务端快照,不分别生成摘要。
右栏顺序:**需要你处理 → 当前正在查看的任务 → 其他进行中/排队 → 新结果 → 已收纳历史**。置顶任务保留位置;普通更新不因时间变化反复重新排序。排序规则只负责注意力,不改变执行优先级。已有“当前任务卡”的计划/待办融入同一概览,避免再叠一张同目标卡。
### 5.1 桌面示意
下列内容均为设计示例,不是真实运行结果。
```text
上下文 对话 工作 | 文件
项目 / 会话 收到 3 份材料,已登记材料整理任务 需要你处理 0
材料与历史 我会先核对事实和差异,再给摘要 材料整理 · 进行中
[材料整理 · 已有 2 条阶段发现] 正在核对:需求与会议结论
当前发现
你:先重点看验收要求 • 3 项需求缺少验收条件
助手:补充尚未作用于在跑整理 • 上线日期存在两种表述
[以此重点创建后续分析任务] 剩余:核查评审意见
下一步:整理待确认事项
… [查看依据] [阶段与记录]
后台 1 项 · 无需你处理
[输入消息 ]
```
中栏进展锚点只给一条高价值提示,不复制右栏全文。新目标通过新任务或已有受支持的输入动作落实,不默认承诺能动态改写在跑任务。
## 6. 快通道内容规范
### 6.1 不同场景怎样回复
| 场景 | 默认回复 | 后台信息 |
|---|---|---|
| 简单问答、短文本修改 | 先给答案,必要时给短依据或结果 | 无实际后台任务则不显示通道卡 |
| 发送材料、任务尚未登记 | “收到 3 份材料,正在准备整理”及已确认的接收/解析信息 | 不提前声称“已启动” |
| 材料任务已登记 | “已登记材料整理,完成后给出事实、差异与待确认事项” | 显示排队或运行真实状态 |
| 有明确分析/生成目标 | 一句话复述目标 + 当前能回答的内容 + 本次处理范围 | 实际启动后显示相应任务 |
| 用户追问后台知道了什么 | 基于最新快照给 2–3 条已发布发现,标出仍在核查的部分 | 不重复启动同一工作 |
| 发现阻塞/需要决定 | 直接说问题、对结果的影响及所需输入 | 复用同一个确认对象 |
| 后台结束 | 结论 → 关键要点 → 限制/缺项 → 产物或下一动作 | 回投当前结果版本 |
“每份材料一句概览”只在已有解析或阶段成果能够支持时给出。快通道尚未读到材料正文时,给文件清单和整理范围即可,不由文件名推断业务结论。
### 6.2 精炼但有用的内容骨架
短答默认 2–5 行;复杂结论默认一段总括、最多 3 个要点和一个主要动作。字数是初始排版预算,不硬截关键风险、金额、日期、否定条件或来源。
示例:
> 已收到需求说明、会议纪要和评审意见,材料整理任务已进入队列。整理会先核对关键事实、冲突与待办。你可以继续补充希望重点关注的问题。
有阶段成果后的示例:
> 目前发现 3 项需求缺少验收条件;两份材料中的上线日期不一致。评审意见仍在核查,完整结论尚未形成。你现在可以先确认上线日期的权威来源。
避免空泛重复“我正在深入分析”“请耐心等待”。工具名、系统提示词、模型自我描述不进入默认业务回复。无需用户决定时,不为了显得主动而硬加问题或三个无依据建议。
## 7. 慢通道任务卡与阶段摘要
### 7.1 运行中固定骨架
1. **标题与状态**:业务动宾短标题,如“核对三份材料”“生成需求说明”;状态词独立显示。
2. **正在做什么**:一句业务阶段说明,最多两行。如“核对需求条目与评审结论”。
3. **当前发现**:默认 1–3 条,按对目标的影响排序;每条表达“发现 + 意义”,有来源入口。
4. **剩余与下一步**:一句说明尚未覆盖部分及接下来处理内容。
5. **操作与时间**:只有真实可用的主动作;注明最近成果更新时间,耗时为次要信息。
任务刚开始时,“当前发现”显示“尚无阶段结论,正在读取材料”,不制造空白占位成果。无需用户操作的任务明确“无需你处理”,而非放一个不可执行的“继续”按钮。
```text
核对三份材料 进行中
正在核对需求与会议决定
当前发现
• 3 项需求缺少验收条件,暂无法判定是否可验收 [来源]
• 上线日期存在两种表述,需要确定权威版本 [来源]
已覆盖:需求说明、会议纪要的目标章节
剩余:评审意见中的变更记录
下一步:整理冲突与待确认事项
最近成果更新 14:32 [查看阶段与依据]
```
“已覆盖”必须来自已确认处理的章节、工具返回或有效检查点。解析完成与分析完成分开显示;“读过一份文件”不能自动计为该文件已全部分析。数量与统计只能来自可数、可去重的对象。
### 7.2 有工作价值的阶段成果
每次阶段发布应至少带来一个用户能利用的变化:确认事实、揭示差异、形成可用初稿、发现缺项、完成检查、给出必要决定。普通“调用工具”只更新活动状态和执行记录,不算业务成果。
| 工作类型 | 推荐业务阶段,按实际任务选用 | 默认最有价值的内容 | 最终呈现 |
|---|---|---|---|
| 材料整理 | 接收/解析 → 提取事实 → 核对差异 → 汇总 | 核心事实、共同结论、冲突、待办 | 短摘要 + 重要发现 + 来源 |
| 研究检索 | 明确问题 → 查找来源 → 对照证据 → 形成判断 | 已找到的依据、尚缺的证据、判断如何变化 | 结论 + 对比/依据 |
| 方案/需求分析 | 提取约束 → 检查覆盖 → 比较取舍 → 整理建议 | 缺项、约束、关键取舍及影响 | 建议 + 清单/对比 |
| 文档生成 | 确认范围 → 编排结构 → 生成草稿 → 校验保存 | 结构已定、待补材料、草稿状态、检查结果 | 精炼结论 + 正式工件入口 |
| 审查验证 | 确定对象 → 执行检查 → 归纳问题 → 汇总结果 | 会阻塞交付的问题、证据、未覆盖项 | 问题清单 + 实际检查结果 |
阶段不固定为所有任务必经的四步。检索/检查可能迭代回到前一阶段;通过阶段 ID 与版本记录,不以动画线性前进。没有领域阶段数据时降级为“读取材料 / 使用工具 / 整理结果”等确定性活动描述,不凭计时自动切阶段。
### 7.3 成果不是思维链
发布公开工作摘要、工具确认的事实、可交付的阶段产物和待确认问题,不把隐藏推理、系统提示词、原始任务提示或未完成 token 片段包装成发现。执行记录仅展示真实已有且当前用户有权限查看的记录;“展开”不意味着获得额外权限。
## 8. 精炼、来源与结论修订
### 8.1 发现的表达与排序
发现由一句结论和一句影响组成,通常合为一行:“指标定义不同,两个方案的达成率不能直接比较”。排序优先级为:需要用户决定的事项、会改变当前建议的风险、与用户目标直接相关的事实、其他背景信息。
去重按稳定 findingId 及来源版本处理;同一事实由两个任务发现时,展示一次并保留两条依据。差异表、审查清单按内容结构选择,不把所有成果强塞进统一长 Markdown。
### 8.2 用户可理解的结论标签
| 内容类型 | 展示文案 | 发布要求 |
|---|---|---|
| 材料直接记载的内容 | “材料记载” | 指向文件版本与位置;不等于事实已被外部验证 |
| 工具检查直接确认的结果 | “已核对” | 指向具体检查对象和真实结果;本地/独立/受信来源保留对应证据等级 |
| 基于若干来源推导的建议 | “分析判断” | 提供依据,说明影响结论的假设 |
| 尚有关键缺口的判断 | “初步判断” | 显示缺口、覆盖范围;不得写成最终结论 |
| 需要人决定的口径/事实 | “待确认” | 给明确问题和影响,并关联确认入口 |
这些标签描述内容性质,不提升 SELF/REPLAY/GATE 信任等级。不显示没有校准依据的“可信度 95%”。重要来源失效时保留历史结论,当前摘要标“依据已更新,需重新核查”。
### 8.3 来源定位与修订
来源至少包含项目/会话归属、文件或工件 ID、版本或内容摘要、可用定位信息及发布事件。优先页码、章节、段落;现有解析器没有页码时显示章节/片段,不编造定位。权限失效显示“当前无法访问该来源”,摘要权限同步重新检查,不以历史缓存继续泄漏内容。
输入复用身份必须包含实际内容摘要:优先原始文件内容 hash 与解析版本,缺少原始 hash 时至少包含实际解析文本 hash、解析版本与相关处理配置,不能仅用文件名和字数当版本。保留既有附件路由,但不同内容不得复用旧任务成果。当前材料键校正作为 U2 来源修订的前置依赖,可用关联修复增量交付;旧卡无法证明内容一致时仅作历史结果,不自动认定本次输入已经整理。材料键等兼容凭据应保留在受控元数据与旧客户端回退投影中,用户默认卡身不展示内部键。
发现具有稳定 ID、有效状态与版本:当前有效 / 已修正 / 已撤回 / 已被替代。后续推翻早先发现时,摘要替换当前有效项,阶段历史留一条“此前判断已修正”并给原因、影响和新依据。若曾需要用户据此行动,必须发一次有意义的更正提醒。
### 8.4 任务结束后的内容
```text
材料整理已完成
结论:当前材料可用于需求草稿,仍有 2 项关键口径需确认
• 核对出 3 项缺少验收条件的需求
• 上线日期冲突,需要项目负责人确认
• 评审意见的 2 条调整尚未反映到需求说明
范围:已覆盖三份材料的可解析文本;图片附件未纳入
[查看完整摘要] [查看来源] [确认交付物]
```
生成文件不代表用户已认可或文档已审签。另显示交付状态:草稿已保存 / 等待评审 / 已认可 / 已发布;正式状态只采用业务宿主确认结果。检查未执行时写“未检查”,不以“已生成”代替“已验证”。示例中的完成与发现仍为设计数据。
## 9. 动态更新、通知与阅读稳定性
### 9.1 更新来源与频率
采用两条信息路径:**确定性活动状态**来自任务登记、工具开始/结束、等待用户、存储结果等事件;**业务摘要**来自显式阶段成果或对已完成结果的受控压缩。模型只提交摘要候选,服务端校验来源、覆盖范围、版本与终态后发布。
| 变化 | 更新位置 | 初始调度策略 |
|---|---|---|
| 入队、执行开始、等待用户、失败/结束 | L0 + 原任务卡 | 持久化成功后立即发布;在线端到端目标 p95 ≤2 秒,待测 |
| 工具开始/结束、活动描述变化 | 原卡的活动行 + L3 | 同任务合并高频变化,普通视觉更新最多每秒一次 |
| 新阶段成果、建议发生实质变化 | 原卡 L1/L2 | 检查点发布;连续普通成果可在 8–15 秒窗口合并,首条有效成果不必等待窗口 |
| 必须用户决定、关键风险、更正重要结论 | 对话提示 + 原任务卡 | 绕过普通摘要窗口;同一事件幂等提示一次 |
| 没有新业务成果 | 活动行/连接提示 | 保留已有摘要;不自动追加“仍在分析”消息 |
| 多任务相继完成 | 各卡 + 合并完成汇报 | 原卡先显示结果;父会话空闲再合并汇报,不阻塞结果可读 |
时间参数是初始设计值,实施后通过可用性与性能验证调整,不是实时性已经达标的结论。执行日志收集不按视觉节流丢弃;合并的是显示更新和重复语义通知。
### 9.2 控制摘要成本
优先由当前执行器在自然检查点提交简短成果;必要时才另行压缩已完成的工具结果或阶段文本。不按每个 token、每个工具调用或每个定时 tick 运行新模型。
候选边界:单任务最多 6 次额外摘要模型调用;普通额外摘要最小间隔 15 秒;最终主任务的结果汇总属于执行预算,仍受已有整体预算控制。费用上限在实施评审时与模型、材料范围一起批准。预算耗尽或摘要生成失败时,保留已发布发现并继续显示真实活动;不阻塞主任务,不伪造阶段成果。
阶段成果发布应由运行时检查点驱动,不能只依赖模型自觉调用工具。没有可安全提取成果的长单次模型调用期间,只展示已确认活动与最近成果时间。若任务需要持续提供发现,可在不改变业务结论前提下拆成有产出的处理批次;这些提示词/行为改动需真实模型前后对照。
### 9.3 不打断阅读
用户阅读历史消息时不自动滚动;输入中不夺取焦点;正在看文件时不自动切“工作”或打开另一文件。出现新结果显示“1 项结果已更新”,由用户点击查看。用户主动等待的首次前台产物可沿用既有打开策略,但后台卡更新与 Surface 更新默认不抢占预览。
同一卡片稳定 DOM 与区块 ID;不逐字重打整段摘要。更新相应段落并可轻标“新”,保留展开、选择、滚动和置顶。屏幕阅读器只播报阶段结束、关键发现和需要处理;不播报每个日志增量。减少动态效果时不播放状态动效。
### 9.4 用户继续对话与调整要求
后台任务运行时,对话依然可用;前台忙时沿用现有输入排队语义,并明确“消息待发送”。追问“现在发现了什么”读取已发布快照,无需新派任务。
当前不假定在跑任务可动态接收新要求。补充内容应说明它将用于后续回合/新任务;如用户希望据此重新分析,创建关联的新尝试并保留原结果。未来可支持安全的任务输入修订,但必须有服务端确认“已接收并生效”后才显示生效。
### 9.5 确认双入口的提交反馈
对话与右栏按同一 confirmationRef 维护提交状态。点击后两处同步显示“提交中”并暂时禁用,收到服务端成功确认后才显示“已处理”。明确拒绝或提交失败时保留原问题、选项和错误原因;服务端返回已处理/版本过期时刷新共同对象,不能继续提交旧选项。
请求超时或连接中断不能证明动作未执行,先显示“确认结果待核实”并查询既有动作记录,不盲目重复执行。重试使用同一幂等请求标识和相同参数;参数已改变则按新动作重新检查。前端不得以一个入口关闭为另一个入口业务完成的依据。
## 10. 状态、异常与操作能力
把三个维度分开:执行状态、成果完整性、连接状态。卡片的收纳/已读状态属于第四个展示维度,不驱动业务终态。
### 10.1 执行状态
| 状态 | 用户文案 | 说明与动作 |
|---|---|---|
| preparing | 准备中 | 只确认接收范围;持久登记后进入 queued/running |
| queued | 排队中 | 队列已确认;只有服务器提供可信位置时显示序号,不给虚构等待时间 |
| running | 进行中 | 显示真实阶段及最新有效发现 |
| waiting_input | 需要你确认/补充 | 显示问题、影响、选项;无超时契约则不暗示自动继续 |
| succeeded | 已完成 | 执行及必要结果保存均成功;是否满足全部用户要求由成果维度说明 |
| failed | 执行失败 | 原因、影响、已保留内容和真实可用的恢复方式 |
| cancel_requested / cancelled | 正在停止 / 已停止 | 仅在支持相应控制契约时暴露操作;请求送达不等于停止确认 |
| interrupted | 执行中断 | 显示最后已保存检查点;恢复动作通过既有服务端支持判断 |
这些是候选展示语义,不宣称 Core 已具备全部同名枚举。`waiting_input` 映射现有 waiting_hitl 等明确状态;旧后台卡 `done + danger` 要由 run 终态与 tone 映射为失败。没有可靠 run 对应时使用保守文案“任务已结束,结果状态待核对”,不解析任意正文来推断成功。
成果完整性采用 complete / partial / none,并列出已覆盖和未覆盖范围。生成内容已经保存但汇报尚未送达时,显示“结果可查看,稍后在对话汇报”。交付保存失败时不能标“已交付”;可保留可读摘要并显示保存失败。
### 10.2 连接与恢复
在线 / 重连中 / 当前状态未核实只影响连接提示。60 秒没有新**成果**不等于执行失活;可显示“最近成果更新于…”,不能仅凭此声明失败。若要展示执行存活,须来自运行时心跳/执行所有权确认,另记录 lastActivityAt;现有源码没有已核实的通用任务存活契约,本方案将其作为新增设计。
断线期间保留最后已确认结果,停止“实时”声明。重连先取得带流游标的快照,再重放游标之后事件;历史保留不足时重新获取完整快照。服务重启导致 run interrupted 时,依据真实终态显示中断;是否可恢复、恢复是否可能重放副作用由既有恢复能力决定,UI 不自动重试。
### 10.3 按能力显示操作
基础动作:查看摘要、查看来源、查看阶段/执行记录、处理既有确认、打开已保存文件、收纳结果。动作带服务端能力和禁用原因;UI 不根据模型写出的按钮名自行分发。
暂停、独立取消、续跑、自动重试、改变在跑任务优先级不作为首期承诺。后台运行卡隐藏“关闭”式歧义动作,只提供折叠;收纳只影响历史呈现,不停止执行。现有输入区“停止”仍绑定现有前台能力;若其真实影响范围包含其他运行,必须如实说明,不能在本方案中改名为“仅停前台”而不修复契约。
失败提示采用“问题 + 影响 + 已保留内容 + 下一动作”。例如:“评审意见未能解析,本轮只完成其余两份材料;已保存两份摘要。请补充可解析版本后重新核对。”有保存凭据才声明已保存。
## 11. 多任务协作与领域展示
一个用户目标下的任务组只给一份整体概览,各后台任务保持独立摘要。后台上限沿用当前 3 个槽位,队列与入场等待按运行时确认展示,不另造默认无限并发。
总览优先突出阻塞与结论:“材料核对、竞品检索已完成;方案整理等待你确认预算”。只有明确可数的工作项才显示“2/3 项已完成”;这个比例不代表剩余时长或模型完成度。不能用工具次数、token 数或耗时估算百分比。
并行发现经规则合并引用,冲突同时展示:“来源 A 写 6 月上线;来源 B 写 7 月,尚未确认权威口径”。完成任务先稳定保存成果再通知;父会话忙时新结果可读,业务汇报待空闲,多个结果可合并为一条简短汇报。去重键包括任务、尝试和结果版本,防止通知回合再派发原工作。
领域可通过通用内容种类输出事实、差异、缺项、待办、建议和结果引用。RDM 类场景可由下游提供“受影响文档、验收条件缺项、审签状态”等内容与动作;基座不把材料整理“完成”解释为业务文档“已批准”。领域内容缺失时降级到通用摘要,不构造业务状态。
## 12. 视觉与排版规范
严格消费根 DESIGN.md,保持冷静、紧凑、内容优先的工作台。沿用用户此前选择的浅色克制方向,同时适配已有深色/墨绿主题。主题、字号与布局属于既有能力,实施不另造皮肤体系。
| 元素 | 排版建议 | 规则 |
|---|---|---|
| 任务标题 | 基准字号、中等字重,状态靠右 | 优先业务名称,完整标题可换行;不挤满任务 ID |
| 当前工作行 | 基准字号,主文本或次级文本 | 动宾语句;不重复标题或“慢通道”标签 |
| 发现 | 基准字号;每条一至两行,3 条以内默认可见 | 保留影响与关键限定;来源紧邻对应发现 |
| 范围、下一步、更新时间 | caption/sm 标尺;使用可读次级文字色 | 关键状态不能用 faint |
| 进度 | 有数据时用步骤清单与真实数量 | 无百分比/ETA 表盘;活动用既有 mk-sweep/mk-breathe |
| 动作 | 每张卡最多一个主动作,查看类为 ghost/链接 | 无需处理时不硬凑按钮 |
| 长表/完整报告 | 详情/文件阅读档 | 默认卡只留摘要;宽表按需横向阅读 |
卡内用 8/12/16 的重复间距;通过标题、段落和表面层级组织,避免一层卡套一层卡。圆角只用既有令牌,折叠统一 `@ui` Collapsible,状态动画只用 `mk-*`。所有图形状态同时有状态词与可访问名称。颜色不能替代状态语义。
桌面沿用可拖三栏,右栏工作宽 280–560、文件阅读宽 420–1100 的现有规范。窄屏优先保留对话与 L0,任务摘要内联展开;文件仍通过同一预览对象打开。长文件名、中文长标题、18px 用户字号、320px 宽度都不得丢失必要动作。不得靠把全卡文字缩到 11px 解决拥挤。
运行卡与完成卡沿用相同结构:结束后移除活动动效,当前工作区变为最终结论,保留来源与缺项。不要整张卡消失后另造结果卡造成位置跳变。最终文件卡的显示遵守 DESIGN.md:执行期仅说明草稿/保存状态,正式可打开交付物在结束并确认保存后出现;中途检查点文字可读,但不伪装成最终交付物。
## 13. 技术设计:确定性状态 + 可验证摘要
### 13.1 职责
| 层 | 职责 | 不承担的职责 |
|---|---|---|
| Core | 定义任务摘要、发现、来源、动作能力的共享契约 | 不生成领域结论 |
| Runtime | 提供真实执行阶段、工具结果、检查点和摘要候选 | 不自行宣告权限/存储/最终成功 |
| Backend | 服务端权威投影、校验、持久化、事件发布与通知 | 不把模型叙述当执行证据 |
| Frontend store | 按 task/run 与事件作用域更新同一快照 | 不由计时编造进度,不分别生成两套摘要 |
| UI | 纯展示,稳定折叠/排版/动作事件 | 不直连模型,不拥有业务异步状态 |
| Documents | 本方案、内容规范、验收与关联记录 | 不承担运行状态 |
| 下游/插件 | 提供领域成果与受控丰富视图 | 不替代基座任务状态与权限 |
优先在既有 runmgr/card/store 链路补齐投影,不另建进度微服务或独立状态仓。后台与前台按 runId 路由,前台消息仍用现有 live;后台进度使用按任务键控的结构化快照,防止共用单个 live 正文。
### 13.2 候选数据形状
以下是契约草图,字段名在 Core 设计评审时固定,不是可直接执行的 API。
```text
TaskSnapshot
taskId, projectId, conversationId, sourceMessageId
parentTaskId?, attemptId, runId? # 排队时可以尚无 runId
revision, streamScope, sourceSeq
title, goal, inputRevision
executionState, outcomeCompleteness
phase { id, label, observedAt }
focus, coverage, remaining, nextStep
findings[] { id, text, impact, kind, status, sources[], revision }
actions[] { id, capability, enabled, reason?, confirmationRef? }
resultRefs[] { artifactId?, surfaceId?, version, availability }
lastActivityAt?, lastMeaningfulUpdateAt
deliveryState, error?
ClientViewState # 展示偏好,不改业务状态
taskId, collapsedSections, pinned, readRevision, scrollAnchor
connectionState
```
taskId 在排队前持久登记并关联同一张卡;runId 表示一次实际执行,attemptId 区分新尝试。旧失败和新尝试不互相覆盖。readRevision 与 dismissed/收纳分离,用户读过不意味着执行已完成。
为兼容旧客户端,ActivityCard 可添加可选结构化摘要字段并保留 Body 的精炼回退投影;旧客户端看 Body,新客户端用结构化内容。核心信息的唯一权威仍是服务端快照;不得用独立 JSON、Markdown 和 Surface 各维护一份互不核对的业务状态。Body 与 Surface 是从同一快照派生的展示。
### 13.3 发布与恢复流程
```text
真实运行事件/阶段成果
→ 运行时语义映射与摘要候选
→ 服务端校验:归属/执行对象/来源/权限/版本/长度
→ 原子保存快照 revision 与对应投影事件
→ 既有 card.updated 会话流发布
→ 前端按作用域 seq、taskId 和 revision 更新
→ L0/L1/L2 同步呈现
→ 关键变化进入幂等通知;L3 保留执行记录
```
持久化与事件写入须原子一致;优先使用既有事务/持久事件机制,若当前 cards API 不能支持原子更新,先补齐内部事务入口。终态正文、状态、tone 应作为同一快照发布,避免先出现失败正文后仍亮成功灯。不能只靠客户端临时合并掩盖持久状态不一致。
消费顺序按**会话流或项目流各自游标**;不同流的 seq 不可比较。重复事件不二次通知,旧 revision 不覆盖新快照;出现游标间隙先对账/重放,不仅执行 `max(seq)` 后跳过未知事件。会话切换隔离响应,迟到事件按归属放回缓存或丢弃,不能写到新会话。
快照读取返回与其一致的重放水位;获取期间继续到来的事件需缓冲并在快照后顺序应用。排队、启动、最终保存、通知待发送均可刷新恢复;不得只把动态发现放在内存 `agentNotes`。恢复与副作用规则与既有服务恢复方案衔接,本次不建立第二套恢复执行器。
**重启对账不能把展示快照当作执行队列。** 当前等待后台槽位的 bgQueue 仅在内存,无 runId 的排队卡不在既有 run 恢复扫描范围。U2 启动对账须区分“可读历史快照”与“已确认重新拥有执行者”:没有可信持久入队凭据或执行所有者的 queued 任务转为 interrupted,并同步旧卡回退状态与材料去重状态,显示“排队任务未恢复,未开始执行”,不自动重派。只有既有执行系统确认队列恢复后,才可继续显示排队并允许晋升;首次增量不承诺队列自动续跑。
### 13.4 生成式成果与普通任务卡
已有 Surface 可用于对比表、报告页、审查清单;基础状态、风险提示、确认与失败始终由确定性组件呈现。后台 Surface 更新只提示“结果页已更新”,不自动切预览;需要在现有 Surface 投影策略中区分前台主动呈现与后台更新。
插件禁用或页面渲染失败时,任务摘要仍可读,来源和基本动作仍可用。Surface 的动作继续走现有受控命令能力,不从摘要文本或外部材料解析可执行命令。
## 14. 落地顺序与 U1 出口白名单
下表是已批准的分期顺序。**首批锁定仅 U1**;U1 业务代码须另批 [U1 实施计划](2026-10-12-fast-slow-channel-display-u1-plan.md) 后方可启动。各增量的具体文件、迁移、运行材料与费用以对应实施计划为准。
| 增量 | 关联需求 | 范围与依赖 | 出口 |
|---|---|---|---|
| U1 统一状态与精炼内容 | R01/R02/R03-a/R08/R10(骨架)/R13 | Core/UI/Frontend/Backend;旧卡兼容及状态映射;L1 骨架重排;去除原始提示词默认展示 | 见下方 U1 出口白名单 |
| U2 持久动态任务投影 | R04(活动投影)/R05(结构)/R06/R09/R12/R17/R03-b | 依赖 U1;材料内容版本身份校正前置;Core 契约 → Backend 快照/事务/事件及无 runId 排队重启对账 → Frontend 按任务路由 → UI 动态渲染;运行时确定性阶段 | 并发、刷新、重连、乱序和终态一致;阶段活动持续更新;无执行凭据的排队任务不得永久显示排队 |
| U3 有价值的阶段成果 | R03-c/R04/R05/R07/R10(完备)/R14 | 依赖 U2;Runtime 检查点、来源、候选摘要、通知去重;优先材料整理,再研究/生成/审查 | 选定长任务至少两个真实成果检查点;短任务可直接完成;事实、判断、缺项可分;必要动作闭环 |
| U4 场景与可用性完善 | R11/R12/R13/R15/R16/R18 | 依赖 U3;多任务总览、修订提醒、窄屏、可选 Surface、领域适配;未支持控制能力仍不暴露 | 典型场景完成真实浏览器及用户评审;精炼度与可用性目标有实际记录 |
跨仓以 Core 类型权威优先;Backend vendored Core、Frontend/UI 消费固定提交;Dev 推进精确 gitlink,组合测试后评审。视觉规则变动需要与 DESIGN.md 配套;只消费既有令牌时不为本任务无故新增色板。
### U1 出口白名单(定稿)
**须交付并可判定**
- 排队 / 进行中 / 已完成 / 执行失败 状态词与状态灯一致;失败使用失败语义(不得再以「完成」灯表示失败)
- 建卡默认 Body 为 L1 骨架,不以原始任务指令(≤400 字截断)作为主视图
- 无阶段成果时显示诚实占位:「尚无阶段结论,正在读取材料」或等价文案
- 完成卡骨架:结论 → 最多 3 要点 → 范围/缺项 → 产物入口(有则显示)→ 必要下一动作
- 简单问答不产生空进度卡;仅登记成功才说「已登记」,仅实际开跑才显示「进行中」
- 旧卡兼容:历史 `done + danger` 在新客户端映射为失败展示,不崩溃
- DESIGN.md / 令牌 / Collapsible / `mk-*` 相关守护通过
**明确排除(不得用 U1 验收)**
- 运行中真实业务发现、来源定位、检查点驱动摘要(R03-c / U3)
- 按 `taskId` 持久 `TaskSnapshot`、revision/seq 对账、材料内容 hash 身份(U2)
- 无 runId 排队任务重启 → interrupted 对账(U2)
- HITL 双入口提交中 / 超时未知 / 幂等闭环完备(U3)
- 窄屏完整能力、多任务总览、Surface 增强、修订提醒(U4)
- 暂停 / 独立取消 / 续跑等未支持控制能力
合并 U1+U2 为基础投影批须**另行明确批准**;即便合并,阶段发现仍属 U3。
## 15. 验收、证据与失败判据
所有下面的运行场景为**计划验收,NOT_RUN**。示例数据只用于评审排版,不当作真实链路通过证据。
| 用例 | 关联需求 | 关键观察 |
|---|---|---|
| A01 三个附件、无文字直接发送 | R01–R05/R10 | 已确认接收 → 同卡排队/运行 → 有成果则发布 → 完成摘要与选择;选定长材料验证两个真实成果检查点,短材料可直接完成;不重复派发 |
| A02 小材料加明确分析要求 | R01/R02/R04 | 即时答复与现有兜底路由一致;不声称尚未登记的任务已运行 |
| A03 三个后台任务 + 前台对话 + 第四任务排队 | R02/R06/R09 | 各任务归属正确;排队晋升复用 ID/卡;前台正文不串后台 token |
| A04 部分解析失败/无可解析文本/材料超预算 | R03/R05/R08 | 显示已覆盖、缺项与影响;解析与分析完成不混同;无法分析则不生成假摘要 |
| A05 用户追问与补充重点 | R01/R07/R15 | 读取当前快照;新要求生效范围明确,未实现动态输入时不假承诺 |
| A06 早期发现被推翻、来源文件更新 | R05/R17/R18 | 当前结论修正、历史可追溯;重要更正通知一次;同名等长内容更新不得命中旧材料结果;过期版本不覆盖最新 |
| A07 断网、刷新、换会话、重复/乱序事件 | R06/R09/R12 | 保留最后快照;恢复水位一致;状态不回退;旧会话数据不写入新会话 |
| A08 模型失败、预算耗尽、摘要不可用、服务中断 | R08/R09/R14 | 正确显示失败/中断;包含无 runId 的排队任务重启后对账及材料去重释放;基础状态与既有成果仍可读;无自动副作用重试 |
| A09 前台忙时后台完成、通知重投 | R04/R10/R17 | 结果卡先可读;汇报待空闲;重投不重复通知或派任务 |
| A10 同确认双入口与重复点击 | R07/R11 | 提交中、成功、拒绝、超时未知、过期/已处理响应都一致;重复点击只执行一次;右栏关闭也可处理 |
| A11 文件正被阅读、Surface 后台更新/插件关闭 | R11/R12/R16 | 不抢焦点、不切文件;插件关闭核心任务卡不缺失 |
| A12 未授权跨项目/用户来源、读权限撤销 | R05/R09 | 新摘要、来源与历史缓存无越权;只显示许可范围内内容 |
| A13 文件保存失败、文件已更新/已移除 | R08/R10/R17 | 不出现虚假可打开工件;版本与保存状态准确;有可读摘要不等于已保存文件 |
| A14 320/390/736/1024/1440 宽度与用户字号档 | R11/R13 | 无页面级横向溢出,必要动作可达,键盘/屏幕阅读/减少动效符合规范 |
验证分三层:契约与投影测试确认状态/顺序/并发;真实模型任务前后对照确认阶段成果质量;真实浏览器与用户任务确认排版和工作价值。不能用 mock 进度验证真实模型发布了有用摘要。
行为改动按 policy/delivery.md 真实模型要求执行:固定候选组合、同材料同任务前后对照、记录模型/参数/费用/失败及来源。正式检查使用 `make evidence` 写入 precheck、task-sync 和相关测试原始输出;Dev CI 在 PR HEAD 上的 `make test`、`make build` 作为 GATE,作者本地记录仍为 SELF。设计文档检查不代替这些运行验证。
可用性记录至少覆盖三类任务:材料整理、分析审查、文档生成。请代表性用户完成第 1 节三问并定位一条来源、处理一次确认、找到一份结果;记录完成时间与错误。精炼度以“是否漏掉关键限定/风险、是否能支持下一步工作”评判,不能只统计字数变短。
实施停止/回退条件:发现状态串任务或越权内容;终态与存储不一致;修订导致当前有效结论丢失;摘要循环显著超预算;关键确认被折叠藏起;真实模型阶段成果持续无依据。先回退受影响展示/摘要增量,保留原执行与已保存结果,按实际影响重审。
## 16. 评审与当前进展
以下为本设计r1.1交付时的记录;后续实施进展见§16.1。
| 项目 | 当前状态 |
|---|---|
| 当前源码核对 | SELF;固定对象与输出在任务卡;不等于运行验收 |
| 需求拆解 / 需求评估 / 需求表 / 方案设计(阶段 1–4) | **已通过**(2026-10-12,对象版本 r1.1;评审人 weichen;依据:用户确认评审结论计划并指示落地) |
| 实施计划(阶段 5) | U1 计划见 [u1-plan](2026-10-12-fast-slow-channel-display-u1-plan.md);**待用户批准该计划后**方可启动业务代码 |
| 辅助设计审阅 | 七个视角 SELF 辅助分析已纳入 r1;不提升为 REPLAY/GATE |
| 业务实施、真实模型实验、运行与浏览器验收 | NOT_RUN |
| 推送、PR、合入、部署 | 本方案任务未执行;文档推送/PR 须另获授权 |
本次推进的是快慢通道用户展示设计,不改变现有附件路由和生成式 UI 规划的批准状态。与既有恢复/团队存储方案的重叠仅为消费其执行终态、权限与恢复能力;新增持久字段和事务入口须评审后协调,不自行修改其他任务的主记录。
辅助审阅覆盖一致性、范围、可行性、设计、产品、对抗与安全七个视角(其中一致性/范围、设计/产品/对抗/安全分别由同一子代理分析,并非七名独立审阅者)。采纳并自行核对后修订五类问题:两次成果检查点只用于代表性长任务;新增要求的生效文案不误导;确认双入口补提交与未知结果状态;材料版本复用需实际内容身份;无 runId 排队任务重启时不能假装仍有执行者。
r1.1 相对 r1 的定稿修订:R03 切分为 a/b/c;U1 出口白名单与排除项写入 §14;首批锁定仅 U1。摘要次数/窗口与性能数字仍为候选参数。**设计批准不等于实施授权**;批准 U1 实施计划后另开实施任务,本设计任务不自动启动写代码。
### 16.1 U2/U3候选进展(2026-10-13)
用户已批准[U2/U3具体实施计划r0.1](2026-10-13-fast-slow-u2-u3-plan.md)并要求连续推进。当前已实施TaskSnapshot/内容身份/原子事件、队列与重启对账、渐进任务/来源预览以及检查点和预算守卫,保留既有三栏、默认简洁及来源/执行详情展开。已有局部、组合、实际HTTP/browser及独立代码重放;具体固定对象和原始证据见[核验报告](../reports/2026-10-13-fast-slow-u2-u3-validation.md)。
U3真实模型质量验收尚未通过:原六样本包含只有一次阶段发布、预算语义误读和预算耗尽无最终结果。已据此收紧原文记录与终态摘要、修复评测上限代表性;原失败不改写。追加一次A01已获授权并执行,仍因来源引用格式与运行额度失败;当前尚未合入、未部署。优先完成该出口及后续精确HEAD CI/合入,U4与既有实例部署保持未启动,10秒用户指标仍未验证。
@@ -0,0 +1,48 @@
---
title: Generative UI auto-trigger opt-in design
date: 2026-10-12
type: feat
revision: r1
status: approved
product_contract_source: generative-ui-r2-U6-U7-boundary
---
# Generative UI 自动触发 opt-in 设计(r1)
依据:主记录 r2(语义事件 / 预算 / 防自激);收口稿已知边界;用户 2026-10-12
计划确认「边界三项全部做」并将本表定案作为实施基线。
负责人:裁定 weichen(用户,经执行计划确认);起草 Agent;更新时间 2026-10-12。
## 定案表
| 项 | 定案 |
|---|---|
| 开关 | owner 级 settings:`plugins.generative-ui.autoPresent`,默认 `false`;**不**写入 `plugin_activation`(避免 bump epoch) |
| 前提 | `plugin_activation(generative-ui).enabled` 为真;否则 auto 无效 |
| 事件 | 仅:任务阶段跃迁(plan/todo 状态变化)、材料/工件完成(material notice、document artifact) |
| 禁止事件 | per-token / 每条 SSE、`surface.updated`、动作回执、present 成功路径 |
| 动作 | 注入 system-reminder,**只**建议调用一次 `generative-ui.present`;不自动点 actions;不改写任务事实 |
| 预算 | 每任务(conversation)每小时 ≤3 次;耗尽写审计 `genui.auto_present_exhausted` |
| 冷却 | 同会话自动触发间隔 ≥60s |
| UX | 复用 U6 pin/follow;固定后新页不抢占 |
| 门槛 | 扩大范围仍以人类效率约 +20% 为后续条件;本增量只落地最小 opt-in |
## 实施面
- Backend:settings schema/defaults;`genui.Auto` 闸门;runmgr 语义钩子;审计。
- Frontend:SettingsModal 经 schema 出开关(无需专用页)。
- Documents:本提案 + 使用说明边界条目更新。
## 验收线
1. 默认关:无 reminder / 无额外 present 建议。
2. 仅 activation∧opt-in 时,材料完成 / 阶段跃迁 / document 工件可触发。
3. surface/action/present 路径不重入。
4. 第 4 次/小时审计耗尽并停止。
5. 冷却内跳过。
## 裁定记录
用户经「Implement the plan」确认本定案表;本文 `status: approved`,实施任务
`feature/genui-auto-trigger-optin` 按本表交付。
@@ -0,0 +1,59 @@
---
title: Generative UI B-class whitelist — builtin.help and system.intent
date: 2026-10-12
type: feat
revision: r1
status: approved
product_contract_source: generative-ui-u5-action-scope-r2
---
# Generative UI B 类加白提案:builtin.help / system.intent
依据:[U5 动作范围 r2](./2026-10-11-generative-ui-u5-action-scope.md)「每加一条走独立评审」。
本提案对两条命令分别裁定;实施与本提案同批合入。
负责人:裁定 weichen(用户);起草 Agent;更新时间 2026-10-12。
## 授权
用户 2026-10-12 计划确认:边界三项全部推进;B 类首批加白 `builtin.help` 与
`system.intent`。交付模式:authorized-continuous(本增量实施至 Dev 合入)。
## 一、builtin.help(独立裁定)
| 项 | 内容 |
|---|---|
| 命令 id / action id | `builtin.help` |
| 类 | B(白名单命令绑定) |
| 危险级 | 低(只读说明,无写副作用) |
| 参数 | 无必填 |
| 通道 | `POST /api/surfaces/{id}/actions` → cmdbus Entrance=`button` |
| 用途 | 页面按钮展示可用命令/入口说明 |
| 排除项对照 | 非业务写、非跨会话、非自动触发动作、非 MCP |
**裁定**:同意加白。
## 二、system.intent(独立裁定)
| 项 | 内容 |
|---|---|
| 命令 id / action id | `system.intent` |
| 类 | B(白名单命令绑定) |
| 危险级 | 入口本身低;**命中后嵌套分发可触达写命令**(既有 chat 行为) |
| 参数 | `text`(string,必填) |
| 通道 | 同上 Entrance=`button` |
| 硬化(加白前提) | **button 入口只返回 match / candidates,禁止嵌套 `Dispatch` 目标命令**;chat/slash/api 等既有入口行为不变 |
| 用途 | 页面上做意图探测/候选展示,不经按钮偷渡 D 类写 |
| 排除项对照 | 嵌套业务写在 button 路径关闭;仍禁止自动触发动作、MCP、任意命令全开 |
**裁定**:同意加白,前提硬化生效并有红测。
## 三、实施面
- Backend:`surfacesvc.AllowedActions`;`genui.ValidateActionIDs` / Catalog;`handleSystemIntent` button 只读。
- Documents:本提案 + 使用说明 API/动作表白名单更新。
- 红测:白名单外拒绝;help 可分发;intent button 命中写意图零副作用;chat 仍可嵌套。
## 四、明确不做
D 类业务写直执、扩大白名单至其他内置写命令、自动触发动作、动作结果自动改写页面。
@@ -0,0 +1,119 @@
---
title: Generative UI usage guide and U1-U6 evaluation record
date: 2026-10-12
type: feat
revision: r1
status: final
product_contract_source: generative-ui-r2
---
# Generative UI 使用说明与 U1–U6 评测记录
本文是主记录 r2(2026-10-10-generative-ui-plugin.md)的配套文档:面向使用者的启用/使用/
禁用说明,以及 U1–U6 各增量落地后的组合评测结论。状态:**final**(方向收口稿)。
## 一、使用说明(dev 实例实测口径,2026-10-12)
### 启用与禁用(owner 级)
```bash
# 启用(需 API key;服务以 --auth on 运行)
curl -X POST http://<host>/api/plugins/generative-ui/activation \
-H "Authorization: Bearer <key>" -H "Content-Type: application/json" \
-d '{"enabled":true}'
# 禁用(新页面/新动作/迟到提交全部拒绝;历史页面保留只读)
curl -X POST ... -d '{"enabled":false}'
```
- 启用后 `generative-ui.present` 工具对模型可见(禁用时工具不注入)。
- 禁用即时生效:进行中的提交按 epoch 失配被拒,已保存页面按权限保留。
### 生成与修订页面(对话内)
对话中说「把 X 整理成一页对比 / 报告页 / 时间线」——模型调用 present 提交声明式页面:
- 页面自动在**文件预览区**打开;修订时说「改为按 Y 组织」,模型带 surfaceId+baseRevision 重提。
- 表单页可直接填写并点「提交」按钮(数据落插件台账,走命令总线审计)。
### 任务工作区(U6)
- **工作**入口的当前任务卡下方出现「任务页面」紧凑区:默认显示最新一页;📌 固定后
新页面不抢占;↗ 跳转文件预览全屏。
- 项目级跨会话聚合:`GET /api/projects/{id}/surfaces`(owner 作用域)。
### API 速查
| 端点 | 说明 |
|---|---|
| POST /api/plugins/{id}/activation | 启禁(epoch 递增) |
| POST /api/surfaces | 提交页面(直接 API,与插件同咽喉) |
| GET /api/surfaces/{id} | 读取整页快照(禁用后仍可读) |
| GET /api/conversations/{id}/surfaces | 会话内页面列表 |
| GET /api/projects/{id}/surfaces | 项目级跨会话聚合(U6) |
| POST /api/surfaces/{id}/actions | 页面动作(白名单:generative-ui.submit、builtin.help、system.intent;后者 button 只读匹配) |
## 二、U1–U6 落地与评测结论
| 增量 | 交付 | 关键证据 | 结论 |
|---|---|---|---|
| U1 受控试验 | Documents #62(r2) | R1 分化 6/6;文本通道下界 60%/83%;工具通道探针消除语法类失败;M3 ¥0.067/页;highspeed 否决为生成档 | 方向成立,生成走工具参数通道 |
| U2 契约/启禁/持久化 | Core #25/#26、Backend #143/#146、Dev #336 | 修订 1→2 冲突守卫、epoch 语义、事件恢复、SQLite/PG 双档 | 宿主地基就位 |
| U3 插件与上下文闭环 | Backend #149、Dev #345 | 真实模型回放 PASS(≈¥0.08);禁用不注入工具;语义投影回灌 | 模型可提交、可修订 |
| U4 只读渲染与恢复 | Core #27/#28、UI #42–#45、Frontend #53、Dev #351 | 刷新恢复、revision 守卫、SurfaceView | 页面用户可见 |
| U5 动作闭环 | Backend #155、UI #46/#47、Frontend #56、Dev #367 | 幂等同参回放/异参拒绝、DangerHigh 经确认卡不可伪造、草稿只在动作载荷 | 表单可提交且受控 |
| U6 工作区与项目聚合 | Backend #163、Frontend #62、Dev #408 | owner 隔离/跨 owner 零可见/禁用保留;pin 固定不抢占 | 页面进工作视图 |
### 现场体验驱动的修复(2026-10-11–12)
用户实测反馈「页面未出现 + 同名工件 ×3」→ 三个根因逐一修复(Backend #156/#160、
Frontend #58/#59,Dev #381/#382/#387/#388):工具描述缺「何时用」引导、事件分支缺
右栏切换、children 对象形状偏差、面板同名并列。修复后 E2E:真实模型 present 成功
(rev 1),surfaces 表落库,前后对照成立。
### U7 组合验收(2026-10-12,dev@b634a27,真实 MiniMax-M3)
- 会话内:新指令「实施进度页」→ 模型自主 present(steps 步骤条、三阶段、状态正确),
会话 surfaces = 2(对比页 rev1 + 进度页 rev1),修订链完整。
- 项目聚合:GET /api/projects/{id}/surfaces 返回跨会话页面(owner 作用域验证)。
- 工作区:前端「任务页面」容器显示最新页(pin/follow 测试覆盖)。
- 收据:Dev 任务卡 feature/generative-ui-u7-acceptance(SELF;CI GATE 随发布 PR)。
### 现场体验驱动的修复记录
| 日期 | 症状 | 修复 | PR |
|---|---|---|---|
| 2026-10-12 | `POST /api/surfaces/{id}/actions` 对无确认卡的 committed 动作 panic(nil Card) | dispatcher 空指针守卫 | Backend#173 |
| 2026-10-12 | `system.intent` button 动作恒报 missing text | action data 键上浮到命令 params | Backend#174 |
## 已知边界与后续项
- 自动触发 opt-in:settings `plugins.generative-ui.autoPresent`(默认关;须同时
Surface activation);语义事件 + 预算≤3/时 + 冷却≥60s;设计见
`2026-10-12-generative-ui-auto-trigger.md`。
- B 类命令:已加白 `builtin.help` / `system.intent`(button 入口 intent 只读匹配、
不嵌套分发;提案 `2026-10-12-generative-ui-bclass-help-intent.md`);其余仍逐条评审。
- 人类可用性对照以 owner 实际使用替代(2026-10-11 用户裁定),本轮体感「初步不错」,
小问题另行修复。
- 部署与运行验收:2026-10-12 本机 `prod`(127.0.0.1:8787,`--auth on`,PG `pg1/prod`)
两刀部署至 `dev@b4649d7`(含 Backend#173/#174);验收覆盖启禁、present、B/C 类动作、
项目聚合、未登录 401。2026-10-21 经用户授权升级至 `dev@5360884`,库 schema v25→v51
(升级前已备份 PG 与运行目录,并在库副本上完整演练);`prod` 与 `pg1` 均由 Dev 主检出
`scripts/svc.sh` 管理(`runtime/prod`、`runtime/pg1`),DSN 只经环境变量
`AGENT_SYSTEM_DSN` 交付、不进命令行。开启认证需超级管理员:账户 `superadmin`,凭据文件
`runtime/prod/super-admin.env`(0600),`deploy/start/restart` 时以 `AGENT_SYSTEM_ENV_FILE`
指向该文件(svc 不持久化该凭据,缺失时服务拒绝启动);原 `admin` 账户保留。升级后验证
healthz/readyz/UI 200、superadmin 登录、未登录 401。2026-10-21 在 `dev@5360884` 上按
10-12 清单重放 GenUI API 验收,结果 PASS(11 项:登录、未登录 401、`autoPresent` 默认关、
建项目与会话、present 201、`builtin.help`/`system.intent`/`generative-ui.submit` 动作 200、
未知动作 400、项目聚合 200、禁用后 403);不调用模型、无费用。执行方式:用 `superadmin`
建临时角色 `genui-accept`(仅 `project.create`)与同名临时账户执行,验收后账户与角色均已
停用,验收产生的项目/会话/页面留在该账户名下。发现:新版本 `project.create` 只来自角色
(管理员标记与系统授权都不授予),prod 升级后没有可用的业务角色,`admin` 目前不能新建
项目,需按使用需要在管理区建角色并分配。
经验:schema v27 之前的旧库经 svc 部署前,须先以候选二进制执行 `agent-system migrate`
(svc 身份门禁的 identity ensure 不做迁移)。
## 三、结论
Generative UI 方向按主记录 r2 的 U1–U7 全部增量落地:调研→契约→生成插件→只读渲染→
动作闭环→工作区→组合验收,每个增量独立走组件 PR + Dev 组合 CI + 任务闭环,真实模型
证据贯穿(试验、回放、现场 E2E)。方案收口为 final;后续按「已知边界」清单演进。
@@ -0,0 +1,539 @@
---
title: RDM 功能、实现与计划矩阵及追溯审计和权限闭环整改方案
date: 2026-10-12
type: fix
execution: code
artifact_contract: ce-unified-plan/v1
product_contract_source: legacy-requirements
---
# RDM 功能、实现与计划矩阵及整改方案 r1
负责人:weichen;编制:Codex;核对日期:2026-10-12(北京时间)。
本稿供人工评审,尚未批准实施。此次仅研究、读取运行元数据与保存报告;未实施业务代码、操作业务数据库、执行测试、部署或重启。
保存说明:Dev 首次启动检查因 Backend 的 `index.lock` 返回 `SHARED_WORKSPACE_BUSY`。按 `AGENTS.md` 任务启动门禁,不创建项目 worktree、不写共享检出;报告暂存为独立交付文件。入仓时由项目 owner 排除共享写入冲突后,在登记任务 worktree 保存到 Documents proposals,并更新 INDEX/PROJECT 的入口。此次没有修改这些入口。
### 发布补记(2026-10-12 入仓时)
本稿冻结观察之后的运行时变化(独立于上文,不回改冻结记录):
- dev 槽位部署时序(北京时间):14:54 `rdm@310c3fe` → 15:50 回滚普通基座 `dev@4bf6e4a`(根页此时已 200 服务 React 资产)→ 16:37 刷新为 `dev@0d224ff`(权威 main 组合,backend=5e8ada7 / frontend=cc233fe,plugins 目录无 RDM 插件)。「根页 404 与缺少嵌入产物一致」的判断已被 main 组合现状超越;RDM 组合产物与门控验收仍开放(U1/PR #450 线)。
- 本稿 U2 执行端问题表第 1-5 行与第 7 行前半已按本方案在 Agent-System-RDM 合入(PR #251/#254/#256/#258,红测先行,CI 绿);第 6 行归 U4、第 7 行后半归 U5、第 8 行待私域语义设计。行号引用基于冻结源码 1ee2b300,合入后有所漂移。
## Goal Capsule
使创建者能在实际使用的 dev 服务中管理项目成员与文档职责,使管理员能创建专业角色并配置权限,使编制、审核、批准人员完成同一份文档的审签,并能从实际页面追溯来源、操作与历史。
复用现有 RDM 项目、成员、权限、两树一网与审签组件,先修组合产物及执行端缺口,再接现有项目设置、系统管理与文档工作区,最后按真实账号验收。完整目标仍覆盖全部 34 UR、68 SR、10 F,不以本次五个问题修好替代全系统交付。
本稿终点为可评审矩阵和方案。实施、真实账号测试、数据迁移、部署及正式验收各在对应授权后进行。当前用户请求未授权这些动作。
## Product Contract
### 来源与权威
1. 本轮用户报错及补充:访问 `localhost:8788`,58880 是 FRP 映射,实例为 dev;要求核对全系统,重点追溯审计、三权、项目成员、系统角色、权限矩阵。
2. RDM `docs/requirements/README.md:15-32` 规定的 V2.2 正文与 U0/Q 裁定;重点 `01-用户需求与系统需求.md`、`03-产品设计方案.md`、`08-核心数据模型-两树一网.md`、`10-实施推进方案-基座与下游二次开发.md`。
3. RDM 原始用户补充 `docs/materials/meeting-sources/user-supplement.txt` 和 `user-design-ideas.txt`;原始内容用于解释需求,不反向覆盖较新裁定。
4. Documents `docs/proposals/2026-10-11-rdm-final-target-completion.md`、模板子方案、两树一网追溯展示方案;主计划与任务卡存在历史批准记录,页首残留“待评审”不能单独否定批准。本次整改路线仍需评审。
5. RDM `docs/records/2026-10-11-requirements-evidence-matrix.md` 是逐条维护入口;Documents 副本是旧附件。`2026-10-12-final-acceptance-ledger.md:39-53` 全量运行验收仍为 NOT_RUN。
UR-21(系统角色权限)、UR-22(项目和成员)、UR-24(文档三权)均为本期 P0 已定需求,不能再解释为尚未决定是否做。管理权不赋予代编、代审、代批权;文档编制唯一、批准唯一、审核至少一人,三种职责互异。项目创建者在平台上限内覆盖项目权限。私聊、原件和个人草稿私有,受控文档按职责或显式授权读取。
### 核对对象及证据边界
| 对象 | 固定版本 / 观察 |
|---|---|
| Dev | `8c1edbebece8212ec8c0cd9e646b4b0592b1503d`;研究初始为 `72f6a679`,期间由其他任务更新 |
| Backend / Frontend | `5e8ada727c358438f8ff9f94eabb697e99fe28dc` / `cc233fec908d0f8c12193042942b94ad68508091` |
| Documents / UI | `9d9b1523c87dc4ba178d143a8b966a77be9b320b` / `bfecf8b51f9a0fdbd9a13590cddf8fc06b7ae700` |
| RDM 本地源码 | `1ee2b300a9c898ef5b9e2febafa6b0f2eb871c15` |
| dev 当前 RDM 部署来源 | `310c3fe42fec2416b8b1e1e72e00ad2e53b58130`;相对 1ee2b300 仅四个 pins 与任务卡变化,本文 RDM 业务行号仍适用 |
| dev 当前进程文件摘要 | `420654002eb0cdc28ce9d90a8d258f215192dee78ff74195db2b2657b3fe3fff`;2026-10-12 15:04:37 核对 |
| 服务访问 | user 确认 58880→8788;本轮直接 GET 8788 根路径为 404,未登录 GET `/api/commands` 为 401 |
| 对照实例 | 9015 的命令清单有 enabled 的 inspect 命令;这是另一实例,不能作为 dev 通过依据 |
15:24:29收尾刷新:Dev主检出由其他任务推进至 `0d224ffcab82cab7def2c0b0cc36d2e6d02ce3dd`,Documents至 `8d0810bd35f4934e0ad37fb96d7bab6d7a732473`;RDM业务源码、Backend、Frontend、dev部署来源及进程摘要均与上表一致。8788根页仍404,未登录命令清单仍401。新收据 `runtime-refresh-receipt.json` 保留该时间点,不覆盖15:04的调查收据;本文RDM需求与业务判断仍以固定1ee2b300为对象。
源码阅读、运行登记、HTTP GET 与本稿审阅均为 SELF;没有复核 GATE/独立 REPLAY,不作业务 PASS 判定。完整命令输出由 `make evidence` 保存为随附收据,未手工重构。测试文件存在只表示已有测试资产。
### 追溯审计故障结论
2026-10-12 **14:50:06.701 北京时间** 的 `unknown or disabled command` 是命令总线 `Resolve` 阶段失败(Dev Backend `internal/cmdbus/cmdbus.go:252-254`),服务将 rejected 映射为 HTTP 400(`internal/server/server.go:1012-1014`)。该阶段尚未进入 RDM 的项目/审计权限判断;放宽权限不能注册一个不存在的命令。
同一 dev 的部署历史显示:13:38:38 启动 `dev@4bf6e4a` 普通基座,14:50:48 停止,14:54:49 启动 `rdm@310c3fe`。用户确认访问这台服务。基座入口仅 import 基座 app;RDM `main.go:18-23` 才 import `plugins/rdm`,后者 `plugin.go:17-21,173-179` 注册命令。因此,故障时**正式前端暴露了研发审计入口,而同实例运行普通基座、没有 RDM 命令**,有部署历史和组合根源码支撑。
此后其他任务已切换部署,不意味着审计运行验收完成:当前 8788 根页 404,命令清单需有效登录才能核对。本轮未借用账号、创建凭证或发送会写审计回执的业务 POST,未重现当前登录态下 capabilities 调用;历史故障定位与当前修复验收分开记录。
现有 Frontend 已增加七命令门控及人话错误,见 `src/workspaces.ts:22-36`、`src/store.ts:794-801`、`src/rdmErrors.ts:16-24`。仍有三项接线缺口:
- RDM `Makefile:39-40` 只 Go build;Dev `scripts/svc.sh:1446-1464,1594-1600` 对 RDM 也只构建 Go 并复制独立 `web/`。更新 frontend pin 没有构建及嵌入 React dist;Backend `web/embed.go` 要求构建前具备 dist。当前根页 404 与缺少嵌入产物一致。
- `AdminZone.tsx:37,67-71` 的声明管理分区没有消费七命令门控;插件注册失败允许保留部分能力(Backend `internal/app/compiled.go:198-202`),所以“插件列表有 rdm”仍不足以证明审计页可用。
- 错误分类把 403 和 401 都解释成登录失效;实际已登录但无权限时应展示权限拒绝。原始 receipt.reason 要保留。
密码字段未处于 form 的浏览器提示是独立问题,不会造成命令注册失败。React 主动改密、登录及强制改密已有 form 修复;RDM 独立 web 的令牌 password 仍位于普通 div。修复有源码记录,当前浏览器验证 NOT_RUN。
### Requirements:本次整改验收要求
| ID | 用户可见行为 | 原需求映射 | 判据 |
|---|---|---|---|
| R1 | 同一正式入口加载匹配的研发前端与 RDM 后端 | UR-08/25,SR-D1/D6/G3/G5 | 登录后七命令齐备并可查询有数据项目;无 RDM 时不出现可进入后即 400 的页面 |
| R2 | 创建者在项目设置添加、移除、调整成员 | UR-22,SR-G9/G10 | 选择有效系统账号,加入后同 projectId 可见;最后负责人保护;撤权立即影响现有访问 |
| R3 | 管理员创建/停用专业角色、分配账号并设默认和上限 | UR-21,SR-G6/G7/G8 | 自定义角色持久化;重启保留;项目设置不得扩大系统上限 |
| R4 | 系统和项目矩阵解释实际允许/拒绝 | UR-17/21,SR-G2/G6/G7/G8 | 同一动作矩阵结果与 API/命令/工具/后台执行一致,能显示默认、上限、覆盖与原因 |
| R5 | 创建者按文档分配编制、审核、批准 | UR-24,SR-C7/G9 | 有效项目成员、三种职责互异;资格不足明确说明;无职责任务保持可见等待 |
| R6 | 三个人完成固定整文版本审签 | UR-24/25,SR-C3/C7/C8/D6/G3/G5 | 非编制不可改正文;审核可批注/驳回;所有审核完成才批准;旧票不能签新正文 |
| R7 | 图、历史、导出及文档读取符合当前授权 | UR-08/23/25/33,SR-D/G/N4 | 合法职责人员能读自己的文档;跨项目/私域不可见;审批与导出是同一固定快照 |
| R8 | 界面、对话、工具、卡片访问同一对象与执行服务 | UR-10/16/27/28,SR-E/F,F-06 | 右栏关闭仍可完成支持的动作;模型不能伪造身份或自动签字;撤权及迟到结果不旁路 |
### 功能、实现、缺口与计划矩阵
“已有”仅描述固定源码中的能力;“UI 缺口”指正式用户路径未闭合。除特别列出的只读观察,全表运行验收 NOT_RUN。U 编号均带方案名称,避免“追溯展示 U3”和“完整目标 U3”混用。
| 功能域及需求 | 当前已有实现 | UI/对话与执行缺口 | 后续工作与现有计划归属 |
|---|---|---|---|
| 项目身份/成员:UR-22;G9/G10 | 全局研发项目、生命周期、成员持久表、成员可见同项目目录;局部 #203 | 项目设置无成员页;有效账号目录及可信宿主映射未闭合;新旧成员守卫不同;建项与owner写入非原子 | 本稿 U3/U6;完整目标 U2 |
| 角色/权限:UR-21/17;G2/G6-G8 | 12 动作、全局 cap、项目成员 override;cap∩默认/覆盖 | 角色固定 admin/owner/member;没有专业角色CRUD或完整矩阵;多个业务入口绕过 cap | 本稿 U2/U4/U6;完整目标 U3 |
| 三权/版本:UR-24/25;C3/C6-C8 | 文档职责默认及章节覆盖 #205;章节审签;持久提案、整文内容快照 #217 | 没有分配页;schema 与可信身份互斥;审签仍按章节;非编制写入、审核驳回、整文批准快照未闭合 | 本稿 U2/U5/U6/U7;完整目标 U3/U8,模板子案 U3-U5 |
| 资料接收/解析:UR-01-04/18;A1-A5/B1-B7 | 原件、三态相关性、MD/TXT/DOCX、快慢处理;台账私域 #209;锚点 #211 | PDF/表格/PPT/图片未完整接线;三个附件无文字实测、60秒反馈及10分钟级管道没有实际签收 | 完整目标 U5/U9/U14;在本稿 U8 衔接 |
| 结论/冲突:UR-07/26/34;B8/B9/B11/B12 | 提议确认、词面冲突、指定冲突对关闭与水位修复 #215 | 完整候选组、文档依据/项目结论两层裁决、来源变更影响与通知闭环未充分完成 | 完整目标 U6;本稿 U8 衔接 |
| 模板/全文档:UR-05/15;C1/C2 | 69 类型 catalog #207;正文 registry 仍4模板、3文档类型 | 目录登记不是全部模板;结构/格式/发布版及XLSX、全量生成审签导出未验收 | 完整目标 U7→U8→U16;本稿 U8 衔接 |
| 对话生成:UR-10/11/12/16;E1-E6/F1-F5 | 模型 compose、持久提案、原子采纳、整文内容快照 #217/#219 | 全动作自然语言及工具投影缺失;依据完整性、差异采纳与真实模型/用户链待验证 | 本稿 U7;完整目标 U8/U9 |
| 私域/项目协作:UR-23;G11-G13/N4 | 基座owner会话隔离;上传及确认资源约束 #209 | 同项目草稿/原件/受控文档全读面、Host检索、明确只读分享与撤权需贯通 | 本稿 U2/U4/U5;完整目标 U3/U5/U9 |
| 追溯/审计/历史:UR-08/25;D1/D5/D6/G3/G5 | 两树、一般网/合规网、原子事件、inspect和导出;追溯展示 #195/#197/#201/#213 | 用户dev曾未组合RDM;新产物无React根页;Host审计覆盖仍缺;四链/完整矩阵实际展示未全部接线 | 本稿 U1/U7/U8;完整目标 U4/U11/U14、F-09 |
| 需求/风险/合规:UR-09/33;D2/D7-D11 | 控制节点/候选边/确认 #231、req→graph #233、UR→SR及需求快照 #235 | 真实风险→措施→验证及SOUP、六维分解、四链业务录入、专家校准及真实交付尚待验证 | 完整目标 U11/U14;本稿 U8 衔接 |
| 法规双通道:UR-13/14;F3 | #236已实际HTTP抓取候选、摘录核对、快照;“只模型URL”旧结论过期 | 真实权威素材、失败/冲突/版本场景及首批模板法规闭环仍未签收 | 完整目标 U12;本稿 U8 衔接 |
| 快慢任务/卡片:UR-27/28/29/30;B10/E/F | 卡片/小队;slow保存原文且可重新入队 #219 | slow台账未保存project/owner,恢复入队传空项目;取消/恢复/重新授权、同源卡片与模型结果需闭合 | 本稿 U7/U8;完整目标 U9/U13 |
| 阶段/结项:UR-06/17;C5/G2 | 阶段序列、三级门禁、close/只读 #226 | 主要检查章节无版本/正文“待确认”;阶段适用文档、批准快照、验证过期、N/A和旧确认缺失 | 完整目标 U10;本稿 U8 衔接 |
| 团队存储/执行/运维:G16/N1-N5 | PG方言 #224、迁移 #242、sandbox #244、备份发布/长驻工具 #248;Dev存储组合#446于收尾已合入 | dev实际使用档位未核;RDM多实例租约/恢复、容量、故障/回滚验收未签收;复用Dev已交付存储能力 | 完整目标 U13/U14;衔接存储/恢复总案 |
| 自举/完整交付:UR-19;G4 | U14台账骨架 #246 | R1-R15与九层验证仍NOT_RUN,不能由局部merge宣称“系统完成” | 本稿 U8;完整目标 U14 |
| 飞书/变更/遗留扩展:UR-20/31/32;G1/G14/G15/D4/F-01-F-10 | 目标和依赖有记录 | 飞书、完整变更引擎、细粒度分享、权重、代码集成、遗留决策、难度机制仍后续;后移不等于取消 | 完整目标 U15;F-06→U9/U14,F-09→U11/U14,F-10待用户标准模板 |
覆盖口径:SR 分组 A5/B12/C8/D11/E6/F5/G16/N5,共68;UR34、F10的逐条定位见附录。项目能力、实际UI、工具路径、部署与验收应各列证据,避免一个“完成”字段盖住五种状态。
### 已静态确认的执行端问题
| 问题 | 固定源码定位 | 必要修正 |
|---|---|---|
| 审签接口无可成功参数组合 | RDM `plugin.go:500-501,509-510,518-519` 强制 reviewer/actor/approver;`:1461-1462,1488-1489,1515-1516` 拒绝这些字段;Backend `cmdbus.go:384-402` 检查required | schema删除身份输入,只认认证actor,项目/固定提交对象必需;补真实总线和HTTP测试 |
| 新旧成员命令绕过不同约束 | RDM `projects_api.go:317-380` 新路径不查member.manage上限;`plugin.go:2212-2245` 旧路径直接Remove;`members.go:54-59` UPSERT可降级最后owner | 所有入口共用服务,原子保持最后owner、归档状态、账号有效性与上限 |
| 配置的建项权限未作用于创建 | RDM `plugin.go:2041-2054` 仅检Actor非空,ActProjectCreate没有接入 | 按专业角色有效权限判建项,不能一律管理员限定或一律认证即可 |
| doc.write不等于编制职责 | RDM `plugin.go:2510-2536,2581-2588` 仅通用写动作;`doctree.go:152-168` 仅状态守卫 | 所有生成/编辑/采纳/改来源写入口再查本文档编制职责 |
| 阶段只读约束未接业务读面 | RDM `perms_api.go:80-100` AuthorizeDocRead生产路径未消费 | 列表、详情、搜索、导出、Host及恢复统一资源授权 |
| 角色/上限模型维度不足 | RDM `perms.go:42-55,70-94,310-324` 固定默认,cap主键仅action | 持久专业role的默认/上限,解释有效权限,不只在UI加checkbox |
| 审核人不能驳回,职责可换人继承旧审核 | RDM `review.go:243-245,276-279` 读当前职责,ReviewCard未冻完整职责;`:111-119,141-149` 可覆盖职责 | 冻结整文提交的职责/策略版本;改职责使受影响审核失效;审核人可驳回,编制撤回独立 |
| 草稿列表未按个人/文档资格过滤 | RDM `draftproposal.go:135-150` 无actor;`plugin.go:2567-2578` 仅doc.read | 私人提案按owner;受控文档按职责/明确授权;分页/计数同样过滤 |
上述为源码确定或静态路径推导,没有在真实账号下重跑。现有 `plugins/rdm/three_sig_test.go:18-25,73-75` 构造Actor并直接调handler,未走登录和总线。函数名“RealAccounts”不能提升为真实账号验收。
## Planning Contract
### KTD1. 组合产物与正式入口
推荐 RDM 产品用固定 pins 的 React 前端与 RDM Go 组合二进制形成正式产物,复用 Backend embed 的公开构建机制。RDM构建必须构建frontend→装入backend/web/dist→Go编译;不能只升级gitlink。构建在独立物化目录完成:从固定pins复制/物化基座组件,以Frontend既有frontend/ui邻接布局构建,将dist写入该目录中的Backend,再由隔离构建映射消费;RDM仓的pins检出保持只读,不把产物或源码修补写进pins。发布清单记录 RDM/backend/frontend/ui SHA、dist摘要、二进制摘要和能力契约版本。构建/安装阶段拒绝声明“完整Web产品”但缺index/bundle的产物。
独立 `RDM:web/` 留作历史诊断入口,退出正式产品唯一流程,迁移前明确旧链接兼容和私有访问策略。若用户选择独立静态React+API部署,则同样固定双产物清单、同源反代与认证;这是部署形态备选,不能复用旧斜杠工作台宣称正式管理界面已完成。
### KTD2. 一套执行端授权及项目身份
账号、认证、平台管理员和通用资源执行边界由基座维护;研发项目/成员、专业角色、领域动作、职责与文档状态由 RDM 维护。公开扩展不足时沿 RDM 的四要素扩展申请,禁止导入基座internal或修改pins源码。
新旧命令、UI、工具、后台恢复都调用同一 RDM 应用服务。平台账号目录只提供授权管理所需的最小公开身份/有效状态与分页,不提供私聊/原件;`AdminProvider.IsAdmin` 已有,不能再当缺失能力重建。创建者、当前owner、RDM域管理员、平台管理员各保留来源,审计能力不自动升级成绑定/成员写权。RDM项目创建与初始负责人必须同事务;Host映射检查双方资格并可恢复重试,不能以复制个人项目解决共享身份。
现有公开EXT-8仅接主体和projectId,HTTP自有工件命中不咨询回调,共享列表按整项目放行;因此本稿U9先提供通用资源级公开授权契约及消费接线。可信资源类型/ID、资源属主、项目和动作由执行端解析,RDM只作领域判定;注册新策略后,域内自有/共享读取、列表、检索、Host及下载均执行同一判定,不能仅在RDM命令handler加守卫。未注册的普通基座保持既有行为;RDM受控产品若缺必要契约,禁止启用扩大共享读取的旧回退。衔接已有协作存储KTD13动作授权,复用当前内部项目动作槽,补资源维度及公开注册,而非再造平行授权器。
读路径不修复业务数据。授权检查覆盖每个请求与资源,未知身份/关键能力默认拒绝;这与现有规范及 [OWASP Authorization Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html) 一致。本文更细的项目和职责规则来自已批准需求。
### KTD3. 专业角色与矩阵
区分四个对象:平台管理身份、项目管理关系、专业角色、文档职责。用户界面的 ADMIN/USER、成员表的owner/member以及文档三权不是专业角色CRUD。
专业角色在系统范围建定义,保存稳定roleId、名称、停用状态、版本、动作默认、动作上限及账号关联。owner/member继续表示项目关系,roleId不写入members.role字段。管理员设置每角色上限;负责人只在许可的成员/项目范围覆盖。首版每账号一个生效专业角色,避免未经确认采用多角色叠加;未来多角色规则另行评审。
有效权限在服务端计算:平台硬禁止 ∩ 角色上限 ∩(项目显式覆盖或角色默认)∩ 资源关系/阶段/状态/职责。文档签字资格还要求当前有效成员、已分配职责、互异历史、固定提交轮次;指派职责本身不解除上限。矩阵显示最终结果和第一拒绝原因,UI不重新计算。
旧cap转换为同等限制,固定默认映射到兼容内置角色,旧override不被扩大。变更前干跑列出有效权限差异;同级迁移不得扩大有效权限。新角色或权限新授予由有权管理员明确执行。新增schema迁移需向前迁移及恢复方案,不能把旧二进制直接启动在不兼容新库上。
### KTD4. 整文三权与历史保全
一份受控文档对应一组编制/审核/批准。项目设置提供文档清单与批量分配入口;项目默认职责规则如需提供,须单独定义生效/覆盖语义,不能悄悄把成员的通用角色当所有文档职责。章节可分配贡献工作,正式整文签字不采用章节覆盖改变整文责任。
整文提交冻结:文档ID、有序章节集合及版本、整文内容、模板版本、依据快照、编制/全体审核/批准人、职责版本、策略版本、提交轮次和完整内容摘要。现有整文内容快照可复用,需补这些治理字段并绑定审批、历史和导出。未知事件版本或不可还原必须报错。
签字取可信actor,HTTP不能传reviewer/approver替代主体。智能体可以准备正文、修改提案、批注建议和待提交操作;人的审核/批准须由该人的认证会话确认,模型无自动签字权。审核人可批注/通过/驳回但不改正文;编制撤回单列。职责变更、撤成员、改正文/依据/模板使受影响待审结果失效,不能换职责让原作者自审同一提交。已批准历史保留,下一正式版本重新审签。
旧章节审签作为历史证据保全,不聚合成“整文已批准”;迁移时对活动轮次作显式处理,首个整文版本重新签署。没有明确规则时暂停有关旧轮次,不静默迁移票据。
### KTD5. 现有界面与对话接线
沿三栏:左侧项目/会话,中间对话,右侧工作/文件。系统管理新增“角色”“权限”;现有项目设置新增“成员”“项目权限”“文档职责”;文档预览/工作卡提供“编制、审核、批准”状态及动作。审计仍用四入口并补受控链/矩阵;不新增独立控制台或第二预览。
项目设置读取 `canManageMembers/canConfigurePermissions/canAssignDuties` 等实际能力,普通成员可读自身资格但不可管理。系统角色、账号全局专业角色关联和全局上限由平台有权管理员配置;项目成员页显示该关联并管理项目成员关系,不授予创建者修改账号全局专业角色的权限。RDM域管理员的业务管理范围保留,是否可改平台上限不从审计兜底权限推断。矩阵分“角色×动作”和“项目成员×动作”,职责清单则“文档×编制/审核/批准”,避免一个表混淆三种对象。
所有页面共享单一能力状态所有者;七命令门控同时约束工作区、声明管理分区和已挂载页面。退出登录、切项目、能力撤销应作废旧结果。请求generation/seq处理快速对象切换与历史查询;计数缺失显示“未提供”,失败不显示空数据。401/403、能力缺失、参数/状态冲突、服务失败分别呈现并保留原receipt。
对话和工具投影使用原子领域动作、真实project上下文及typed CommandResult;高危命令带conversationId和确认卡上下文。自然语言解析出的用户/项目名称仅作查找候选,最终使用稳定ID并校验。不把手写斜杠或登记handler当自然语言能力已就位。
### High-Level Technical Design
```mermaid
flowchart LR
UI[系统管理 / 项目设置 / 文档工作区] --> C[同源命令与确认回道]
Chat[对话 / 工具 / 工作卡] --> C
C --> I[基座可信身份与当前项目]
I --> A[RDM统一动作与资源授权]
A --> P[项目 / 成员 / 专业角色策略]
A --> D[文档职责 / 整文提交 / 审签]
D --> E[原子事件 / 正式快照]
P --> E
E --> R[审计 / 历史 / 合规 / 导出读面]
R --> A
```
```mermaid
stateDiagram-v2
[*] --> 等待分配
等待分配 --> 编制中: 指派有效三权
编制中 --> 审核中: 编制人提交整文快照
审核中 --> 待批准: 所有审核人通过
审核中 --> 编制中: 驳回 / 撤回 / 快照失效
待批准 --> 编制中: 驳回 / 撤回 / 快照失效
待批准 --> 已批准: 指定批准人确认
已批准 --> 编制中: 新内部修订
```
```mermaid
sequenceDiagram
actor Creator as 创建者
actor Writer as 编制人
actor Reviewer as 审核人
actor Approver as 批准人
participant Service as 统一文档服务
Creator->>Service: 分配有效成员及职责
Writer->>Service: 提交固定整文 / 版本 / 职责 / 策略
Reviewer->>Service: 认证身份审核同一提交轮次
Service->>Service: 校验全部审核及当前授权
Approver->>Service: 认证身份批准该提交
Service-->>Writer: 正式版本与固定快照导出
```
## Implementation Units
本稿U1-U9为整改任务包,按依赖安排;不同于既有方案U号。U9为审阅补入的公开契约前置,编号不重排。责任角色为后续立项时指定的Dev组合owner、RDM实施者、Frontend实施者和独立审阅者。本轮不代指具体执行人。工作量是待排期的估计区间,不是工期承诺,项目数据量/迁移规模核定后更新。
| 本稿工作包 | 依赖 | 优先级 | 交付内容 | 粗估工作量 | 对应完整目标总案 |
|---|---|---|---|---|---|
| U1 | 无 | P0 | 正式产物/根页/审计入口与实例证据 | 2-4人日 | U4/U11/U14及追溯展示补闭环 |
| U9 | 无;与U1并行 | P0 | 公开资源/账号/宿主资格契约及基座消费接线 | 4-7人日 | X1/X2、U2/U3及存储KTD13 |
| U2 | U9发版与RDM升pins;schema局部修正可提前 | P0 | schema、统一执行端与私域安全收口 | 3-5人日 | U2/U3/U8 |
| U3 | U2;账号目录扩展 | P0 | 项目成员/唯一身份/有效账号闭环 | 3-5人日 | U2 |
| U4 | U2/U3 | P0 | 专业角色与解释矩阵 | 4-7人日 | U3 |
| U5 | U2/U3/U4 | P0 | 整文三权与批准快照 | 6-10人日 | U3/U8 |
| U6 | U3/U4;职责页依赖U5 | P0 | 系统/项目管理页面 | 4-6人日,可与服务契约后并行 | U2/U3/U8 |
| U7 | U5/U6 | P0 | 对话/卡片、审计完善、真实用户闭环 | 4-7人日 | U8/U9/U11/U14 |
| U8 | 对应已有基础及U7 | P1并保持既定需求优先级 | 全系统余量、模板/法规/阶段/团队验收 | 各子任务另估 | U5-U16 |
### U1. 固定产品组合并恢复审计正式入口
**Requirements:** R1/R7;**责任:** Dev组合owner+RDM构建owner。**Files:** RDM `Makefile`、`scripts/pack-release.sh`;Dev `scripts/svc.sh`、`modules/backend/web/embed.go`(复用机制)、Frontend `src/store.ts`、`src/workspaces.ts`、`src/components/AdminZone.tsx`、`src/components/RdmAuditWorkspace.tsx`、`src/rdmErrors.ts`。
**Approach:** 先基于现有实例历史保留故障证据,固定RDM+四pins+实际bundle+二进制和数据绑定。补 pinned React embed构建与产物完整检查;统一全部入口能力门控、可见失败和错误分类。插件必要注册失败不能静默声明完整产品可用,可让启动拒绝或标为不可用,但不可留下可点击的半套管理面。正式环境切换需批准,备份和恢复与已有svc方案衔接。
**Tests:** 扩展 Frontend `test/workspaces.test.ts`、`test/rdm-errors.test.ts`、`e2e/plain-base.playwright.ts`、`e2e/rdm-audit.playwright.ts`;Backend `internal/app/compiled_list_test.go`、`internal/server/compiled_list_test.go`;新增RDM `scripts/rdm-product-smoke.sh`(拟建),验证实际产物而非Vite预览。
- 基座无RDM、只注册部分、命令disabled、声明分区残留:均不自动发失败审计请求;已开页面能转不可用态。
- 构建后真实根页200及JS/CSS匹配固定frontend SHA;缺dist拒绝作为完整Web安装;清洁重构建不能借旧dist成功。
- 有效登录后dev命令清单及capabilities成功;创建者/域管理员/纯平台管理员分别查询各自可审计范围;外部账号拒绝。
- 403权限拒绝与401过期文案不同;query失败保留reason;密码form警告独立回归。
**完成条件:** 实际8788及FRP入口能加载同一批准产物并查询有数据项目;没有以9015对照或health代替。工作树和CI的验证身份仍按SELF/GATE/REPLAY区分。
### U2. 修复命令契约并统一授权服务
**Requirements:** R2/R4/R6/R7/R8;**依赖:** U9的公开契约、基座发布和RDM升pins,schema修正可先独立交付。**责任:** RDM实施者,公开扩展由Dev责任人承接。**Files:** RDM `plugins/rdm/plugin.go`、`internal/rdmapp/perms_api.go`、`projects_api.go`、`draft.go`、`draftproposal.go`、`internal/domain/doctree.go`、`review.go`;Dev公开契约与执行端消费者按U9先交付。
**Approach:** 先写真实注册总线/HTTP用例捕获schema身份矛盾,删除客户端签字身份字段。梳理全部命令、工具、上传、下载、Host和恢复路径;新旧成员命令兼容别名调用同一服务。统一动作+资源+状态守卫,归档/结项禁止新业务写;草稿列表及聚合计数按可见性过滤。合法用户职责可读文档,不错误要求全项目审计权。
**Tests:** RDM `plugins/rdm/three_sig_test.go`、`internal/rdmapp/perms_test.go`、`resource_authz_test.go`;新增 `plugins/rdm/command_bus_contract_test.go`(拟建,消费公开extension启动/注册路径,不导入Backend internal)。
- 不提供身份字段的合法approve/reject/final能通过schema;伪造字段、空project、错对象所属项目拒绝。
- 各别名在禁member.manage、归档、最后owner更新/移除时结果一致;并发变动不移除最后owner。
- reviewer/approver/普通成员/管理员无编制职责时各内容写入口拒绝;指定编制且动作上限允许时可写。
- 禁阶段、私有草稿/原件、撤权后的旧卡/任务/下载均拒绝;过滤后的分页/计数不泄漏。
**完成条件:** 建立入口×动作×身份×资源矩阵,直接handler单测之外有真实总线/HTTP正负例。
### U3. 项目成员与可信账号目录
**Requirements:** R2/R5;**依赖:** U2。**Files:** RDM `internal/members/members.go`、`internal/rdmapp/projects_api.go`、`plugins/rdm/plugin.go`;Dev公开身份/账号目录扩展申请与相应Host实现;Frontend `src/api.ts`。
**Approach:** 研发项目和初始owner原子写,Host一对一映射双方授权核对。有权管理者分页查找最小有效账号,添加/调整/移除均按权限及生命周期;创建者事实保持不可改,owner变动不伪造创建者。幂等请求记录稳定operationId及策略版本,成功后加入账号看到同一项目并新建私有会话。
**Tests:** RDM `internal/members/members_test.go`、`internal/rdmapp/sysproj_test.go`;基座账号/Host扩展新增契约测试(路径立项时固定)。
- 非有效账号/停用账号不能加;非管理者查不到全系统用户目录;搜索和分页只返回必要字段。
- 双用户同名建项、owner写失败、Host绑定失败/恢复、绑定他人宿主项目均不留下可用的错误项目。
- 最后owner改为member、旧命令强制member、并发移除均守不变量。
- 加入→同ID可见→私有对话;移除→现有会话/模型读取/导出立即受限,历史操作保留。
**完成条件:** 真账号项目生命周期闭环,身份目录、领域项目与宿主映射有固定公开契约。
### U4. 专业角色与可解释权限矩阵
**Requirements:** R3/R4;**依赖:** U2/U3。**Files:** RDM `internal/perms/perms.go`、`internal/rdmapp/perms_api.go`、`plugins/rdm/plugin.go`;拟新增 `internal/perms/roles.go`、角色/关联迁移及解释DTO。Frontend渲染由U6承接。
**Approach:** 按KTD3建持久专业角色、版本及账号关联;角色CRUD、默认/上限更新、项目覆盖、解释读面都调用统一evaluator。平台管理员信任来源经Host,不接受param.isAdmin。矩阵查询按管理范围过滤,返回动作目录、默认、上限、覆盖、有效值及来源/拒绝原因,资格变化使旧许可立即失效。
**Tests:** 扩展RDM `internal/rdmapp/perms_test.go`;拟新增 `internal/perms/roles_test.go`、`plugins/rdm/roles_contract_test.go`。
- 创建自定义角色、关联账号、修改/停用/重启,结果持久且内置系统身份不可经角色CRUD伪造。
- default允许+cap禁止+override允许仍拒绝;撤上限后旧override即时失效;负责人不能改全局角色上限。
- 矩阵解释与实际业务调用逐动作一致,doc.read与audit.read、assign与approve不混用。
- 旧数据迁移干跑和故障回滚、停用角色仍有引用的处理、同版本并发编辑冲突可见。
**完成条件:** 角色能实际创建并影响执行,不是仅显示固定三个标签;矩阵不靠浏览器推算。
### U5. 固定整文三权与正式版本
**Requirements:** R5/R6/R7;**依赖:** U2/U3/U4。**Files:** RDM `internal/domain/review.go`、`doctree.go`、`eventlog.go`、`replay.go`、`internal/rdmapp/draftproposal.go`、`review`应用服务、`docx.go`、`plugins/rdm/plugin.go`;拟新增整文submission及annotations实体/迁移。
**Approach:** 复用持久提案与整文快照,补KTD4冻结字段、轮次、事件与审批状态。提交/批注/通过/驳回/撤回/批准共用固定提交对象,数据与事件同事务。无职责等待可见;分配时查当前账号、项目、动作资格和互异。批准读/导出固定快照,不从current章节拼装。
**Tests:** `internal/domain/review_test.go`、`internal/rdmapp/docduties_test.go`、`plugins/rdm/three_sig_test.go`、现有提案/重放/导出测试;拟新增 `internal/domain/document_submission_test.go`。
- 至少三份独立账号:作者提交、多审核缺一拒批、审核驳回、批准批注及批准;作者/管理者代审拒绝。
- 改正文/依据/模板/职责、撤成员、换批准人使受影响旧票失效;换名字/职责不能洗掉原作者历史。
- 章节贡献分配不改变整文签字人;旧章节PASS不聚合为整文PASS;旧活动轮次迁移有显式结果。
- 旧卡签新版本、并发审签、重复提交、事件写失败、重启恢复、未知schema及历史水位查询均有可判定结果。
- 正式DOCX及合规导出与批准正文/模板/来源/职责摘要一致,新内部修订保留旧正式版。
**完成条件:** 整文状态机及三个真实身份完整签署,管理权和签字权分离,全部写入入口遵守编制职责。
### U6. 补齐系统管理与创建者项目设置
**Requirements:** R2-R6;**依赖:** U3/U4;文档职责依赖U5。**Files:** Frontend `src/components/AdminZone.tsx`、`adminSections.tsx`、`ProjectSettingsModal.tsx`、`TaskSidebar.tsx`、`src/api.ts`、`src/store.ts`;复用UI `src/SettingsShell.tsx`;拟新增RdmRolesSection/RdmPermissionMatrix/RdmMembersSection/RdmDutiesSection组件。
**Approach:** 使用现有入口和SettingsShell。角色表支持创建/修改/停用;系统矩阵支持默认/上限解释;项目成员页支持账号选择及角色关联;项目矩阵只允许上限内override;文档职责页列文档状态、编制/审核/批准与资格不足原因。未分配不伪装有流程。异步对象单一所有者;全部样式和折叠按DESIGN令牌/原语。
**Tests:** 扩展Frontend `test/workspaces.test.ts`及相关组件测试;拟新增 `test/rdm-management.test.tsx`、`e2e/rdm-management.playwright.ts`;执行Frontend/UI design-guard与必要构建。
- 纯创建者而非管理员能看到并完成项目管理;普通成员不可配置;平台角色管理入口与领域项目管理按实际能力展示。
- 角色创建→系统矩阵→成员添加→项目覆盖→职责分配,刷新/重启保留且readback来自服务端。
- 同名账号、停用账号、空清单、服务器拒绝、409并发、断网未知结果时有明确状态,不乐观写成成功。
- 禁止上限勾选不能通过手造请求保存;所有异步取消/切项目/撤权状态一致;键盘、对比度及主题可用。
**完成条件:** 用户指出的四项缺失功能均在既有入口可操作,服务端同一规则强制执行。
### U7. 对话、审签工作卡与审计读面
**Requirements:** R1/R6/R7/R8;**依赖:** U5/U6。**Files:** RDM `plugins/rdm/plugin.go`、意图/工具声明、`internal/rdmapp/inspection.go`、卡片/任务接线;Frontend `src/api.ts`、`src/components/RdmAuditWorkspace.tsx`、工作卡组件。
**Approach:** 将已有原子命令公开为合法工具/意图,带真实当前项目和确认上下文;读状态和写动作同对象。模型只准备签字,用户认证确认执行。审计页补完整分页、另一端关系判定、不可还原/未提供状态、generation处理。Host审计覆盖和领域事件区分,补真实四链/矩阵、导出进度与下载,而不声称当前四页签已覆盖全部合规展示。
**Tests:** Frontend `e2e/rdm-audit.playwright.ts`及管理e2e;RDM `plugins/rdm/intents_test.go`、`internal/rdmapp/u3_inspection_test.go`、导出/任务测试;新增真实对话与审核/批准卡回道用例。
- 按钮和对话完成同一成员/职责对象,返回同operationId归因;工具传Actor、伪造project或旧卡均拒绝。
- 右栏关闭仍可读取状态并完成允许的用户确认;真实审核与批准始终属于相应人的认证会话。
- 快速对象A→B、项目切换、不同历史seq并发、撤权事件与迟到响应,不显示旧对象或旧权限正文。
- 数据多于首屏能分页,读失败与空数据分开,缺count非零;关联另一端正确;事件水位与正式快照一致。
- dev+FRP真实入口完成角色→成员→职责→整文审签→追溯→固定导出,账号不能全都兼管理员。
**完成条件:** 用户可见完整首批业务链和负例有真实账号、浏览器、固定制品证据;局部单测不是替代。
### U8. 回填全系统矩阵并推进剩余能力
**Requirements:** 全部原UR/SR/F;**依赖:** 按完整目标总案,不新增平行编号权威。**Files:** RDM `docs/records/2026-10-11-requirements-evidence-matrix.md`、`2026-10-12-final-acceptance-ledger.md`、`docs/requirements/10-实施推进方案-基座与下游二次开发.md`;Documents完整目标/模板/追溯/存储/恢复方案入口。
**Approach:** 保存旧快照和真实收据,新增当前SHA实现/剩余/部署/验收列。优先以下切片,逐包立项和评审:
1. 完整目标U9:slow持久project/owner/输入版本与授权恢复;取消、状态读取和卡片同源,先补恢复可信项目断点。
2. U5/U6/U12:完整格式解析与锚点、发布补偿、共享检索、两层结论裁决;复用#236真实抓取,真实法规双通道为竞品模板前置。
3. U7/U8/U16:首批建议书/竞品分析真实闭环后扩展所有69模板及报价XLSX,逐类登记模板内容/格式版本与验收。catalog不能结项。
4. U11/U10:真实需求/风险/措施/验证生产与四链,阶段适用文档/批准/合规/过期门禁,固定对象推进及结项。
5. U13/U14:复用Dev存储/恢复在途任务,领域PG/多实例租约与故障恢复、容量、迁移及发布包,最终九层验证和用户上线签收。
6. U15:F-01到F-10保留owner/依赖/状态;F-06/F-09已纳入当前链,F-10待用户标准模板,不隐式取消后续目标。
**Tests:** 延用各总案列出的直接测试,并落实 `make test`/`make build`、发布制品实测、需求到收据映射。每个子任务立项时冻结样本、数据档位、具体命令和验收环境;上述远期任务不以本稿粗粒度条目直接启动未授权实验。
**完成条件:** 112条都有当前对象与证据状态、责任包;已合入局部能力不会重复重建,旧过期缺口不继续冒充现状。所有最终需求仅在真实证据或用户明确取消/替代裁定后闭合。
### U9. 先交付通用公开授权和身份契约
**Requirements:** R2/R4/R5/R7/R8;**依赖:** 无,可与U1并行。**责任:** Dev Backend公开扩展owner;RDM提出/验收契约。**Files:** Dev Backend `pkg/extension/extension.go`、`pkg/extension/host.go`、`internal/app/compiled.go`、`hostcaps.go`、`internal/server/server.go`、`internal/store/content.go`及相应资源/共享检索授权测试;Documents沿既有扩展申请主记录补四要素。RDM消费发布tag并更新pins,不在pins内改代码。
**Approach:** 契约输入包括认证主体、动作、资源类型/ID、真实资源属主和项目,字段从受信存储/执行上下文生成,不能接受body自报资源归属。资源策略安装后对RDM域内所有访问权威,包括owner自有命中和共享读取;列表/统计/检索候选逐项过滤,SSE/下载/模型上下文注入在当前权限下重验。角色/职责/原件可见性仍由RDM判定,基座不硬编码RDM状态机。兼容使用可选注册能力与版本声明,旧普通基座行为保持;RDM缺该必需能力时停止共享启用而非整项目回退。
同包冻结最小账号目录及宿主项目资格读面:授权项目管理者只获得可选账号的稳定身份/有效态,不获得完整系统用户管理权限;Host项目查验包含存在性、当前主体管理/绑定资格和实例域。复用已存在AdminProvider、项目共享/会话公开扩展,只补缺少字段与检查。
交付顺序为扩展申请评审→基座实现与提供者/消费者契约验证→基座发版→RDM升pins/公开能力检查→U2/U3消费;发版按仓库人工双钥匙,由用户执行。本轮不创建发布或迁移。下游只使用公开符号,真实命令总线测试走公开启动/注册与HTTP,不跨internal边界。
**Tests:** 扩展Backend `internal/server/resource_authz_test.go`、`internal/app/compiled_authz_test.go`及Host/检索测试;RDM新增公开契约消费测试,衔接U2真实HTTP负例。
- 同一项目中A私有原件和B获授权文档,列表/详情/内容/下载/搜索/摘要/模型上下文仅返回获许可对象,私域owner自有命中也不绕过受控文档职责。
- 撤销角色、成员、分享后旧任务及已开流在新输出/使用边界重验;拒绝/错误/未知资源元数据不变成放行,私聊始终owner隔离。
- 假projectId、假资源属主、跨实例宿主ID、绑定他人项目均被执行端解析/资格检查拒绝。
- 未注册时普通基座兼容;RDM旧公开契约缺失时明确拒启受控共享;提供者发版和消费者固定pins组合都有证据。
**完成条件:** 不经RDM命令入口的HTTP/Host/检索也遵守同一资源策略,U2/U3可以在不修改基座internal或pins源码的前提下完成私域/项目绑定要求。
## Verification Contract
正式启动前处理共享锁的owner现场,在相应项目各自通过precheck、从权威main建立worktree和任务卡;不删除他人锁兜底。文档、源码、迁移、测试、部署各有授权范围。阶段内可迭代,跨阶段按Dev `policy/delivery.md` 人工评审,用户沉默不是授权。
验证必须包含三层:模块/公开契约;真实注册总线+认证HTTP;固定正式产物+浏览器用户链。命令语义与服务端拒绝优先,不能用直接handler返回或一张页面截图替代。
最小账号集:平台管理员、RDM域管理员、项目创建者/负责人、编制人、审核人(多审核时至少两人)、批准人、普通成员、外部用户。可以在不冲突场景复用账号,但审计兜底和三权签字用例必须拆开;两个独立项目和私有素材,禁止把所有账号均设管理员让负例失效。
| 层级 | 计划检查 | 判定 |
|---|---|---|
| 规范/门禁 | 启动precheck、验收/审核/合入各task-sync、共享写入owner核对 | 同步对象和任务范围有收据;本轮共享BUSY不掩盖 |
| RDM | `make test`;真实cmdbus/HTTP契约;角色/成员/整文事务及回放 | 选中用例且全部必要正负例有输出,非零用例或SKIP不算PASS |
| Dev组合 | `make test`+`make build`,检查精确pins和被测工作树 | CI PR HEAD为GATE;本地仅SELF;公开扩展兼容及组合构建均核实 |
| UI | design-guard、相关组件、实际固定产物的管理/审计/三权浏览器流程 | 有用户动作及可见结果;不能只跑Vite测试而遗漏embed产物 |
| 部署 | 固定dev制品、manifest、数据身份、同源/FRP入口、登录及七命令 | 新旧时点分开;根页200与有数据查询;启动健康不替代业务验收 |
| 持久/故障 | 并发成员/签字、撤权、断连未知结果、事件失败、重启/备份恢复 | 无越权或半事务,操作有可对账身份;真实DB档位与恢复对象明确 |
| 审核 | 独立审阅者先重放最小集,再读作者SELF;核对CI身份/链接/SHA | 本稿Agent审阅不代替正式REPLAY/GATE、人审和上线签收 |
完成声明的precheck/task-sync/测试三段输出由evidence写入任务卡;产出物引用任务卡/原收据。本轮仅保存调查与precheck收据,不补写业务测试输出。业务测试、真实模型、迁移、重启、部署、当前登录态审计验收均NOT_RUN。
## Definition of Done
本稿交付:矩阵覆盖全部原需求、故障因果链有固定对象/运行历史、五个问题分别定位到已有与缺口、方案有依赖/模块/测试/验收/兼容及停止条件,报告可审阅并保存。没有要求或宣称此轮实施。
首批整改验收:在实际dev及FRP入口,管理员建角色/配置上限,创建者管理成员/覆盖项目权限/分配文档职责,真实三权完成整文审签,审计历史和导出一致;越权/撤权/旧卡/旧版本负例成立。源码、CI、组合、部署、用户验收分别签收。
全系统C1:完整目标U1-U14及U16全部对应证据齐备;C2额外包含U15最终扩展或用户明确裁定,不把后续备案当已实现。新报告只记录当前差距,不修改旧收据或取消需求。
停止条件:权威需求改变;必要公开扩展不兼容;实际制品/数据身份无法确定;迁移权限扩大或旧审签票迁移规则不明;跨出当前批准范围或共享写者未退出。先保存证据/现场,提交受影响设计评审,不以临时放宽权限继续。
## 待人工评审与下一步
建议优先批准**本稿U1:正式产品构建及审计实际入口**,U9公开契约并行;U2可先在隔离工作区建立schema失败用例,完整资源授权出口依赖U9发版/升pins。上述首批工作不依赖69模板全量完成。随后U3/U4固定服务契约,U5整文三权与U6页面接线按依赖并行,U7交付用户完整流程。
需评审的新增技术选择:RDM组合二进制嵌入React正式入口;RDM专业角色首版单角色;旧cap/角色映射不扩大权限;整文签字替代章节级正式签字并保全历史。项目级批量职责默认若需要,另定义应用范围与显式覆盖,不把它作为此次分配每文档职责的隐藏前置。
这些是待批准设计,不重问是否实现角色/成员/权限/三权。正式实施负责人、隔离测试环境和部署切换窗口在批准启动时登记。此次独立报告入仓仍待共享门禁解除,未创建提交或PR。
## Appendix
随附文件 `source-runtime-receipt.json` 为make evidence原始调查收据,`precheck-receipt.json` 为启动拒绝收据;`readonly-probe.py` 为可复核只读命令脚本。报告审阅记录另保留;同一次作者侧子代理检查仍为SELF。
### 逐条需求定位与计划索引
以下只携带现有权威矩阵ID、摘要与既有工作包,原文位置相对RDM `docs/requirements/01-用户需求与系统需求.md`。摘要可能被原矩阵截断,完整语义以原文为准。历史矩阵中的“源码状态”列不复制,当前实现/缺口以本稿功能域表及固定源码为准;每行运行结论均为NOT_RUN。
| 原ID | 权威摘要 | 既有完整目标工作包 | 原文行 | 当前运行验收 |
|---|---|---|---|---|
| SR-A1 | 系统应支持 doc/docx/pdf/ppt/pptx/xls/xlsx/md/txt/图片等常见格式上传,对不支持格式仅提醒不阻断 | U5/U9/U14;G9/G10/G15 | 437 | NOT_RUN |
| SR-A2 | 上传不强制附带文字指令;无指令时进入默认"记忆构建"流程(见 SR-B 系列),不输出制式化"未识别需求"回复 | U5/U9/U14;G9/G10/G15 | 438 | NOT_RUN |
| SR-A3 | 支持单文件、多文件批量上传,并记录来源渠道(Web/飞书/其他)与上传人 | U5/U9/U14;G9/G10/G15 | 439 | NOT_RUN |
| SR-A4 | 上传后 60 秒内输出第一阶段反馈(相关性结论 + 初步阶段归类);完整入库允许后台异步完成 | U5/U9/U14;G9/G10/G15 | 440 | NOT_RUN |
| SR-A5 | 入库完整性保障:解析失败、部分内容不可解析或入库异常时,必须显式告知用户并在入库记录中标记,原始文件永久保留可取回;禁止静默降级或静默产出残缺结果(教训来源:旧版曾发生报价单 Excel 数据丢失、P… | U5/U9/U14;G9/G10/G15 | 441 | NOT_RUN |
| SR-B1 | 对每份上传资料输出相关性判定(相关 / 存疑 / 无关)及判定依据;存疑时必须挂起并向用户请求确认,确认前不入库 | U5/U6;G9/G10 | 447 | NOT_RUN |
| SR-B2 | 对资料进行结构化解析,保留章节/页/表格级锚点,锚点在后续所有引用与追溯中可用 | U5/U6;G9/G10 | 448 | NOT_RUN |
| SR-B3 | 将内容片段映射到研发阶段及"该阶段应从事的具体工作事项",映射结合项目当前所处阶段;支持一片段映射多阶段 | U5/U6;G9/G10 | 449 | NOT_RUN |
| SR-B4 | 每个切片附带结构化标签(JSON):阶段、工作事项、主题、可行性维度(技术/市场/注册)、关联需求 ID、来源、上传时间、置信度;并生成一句话描述(description) | U5/U6;G9/G10 | 450 | NOT_RUN |
| SR-B5 | 支持"两速入库":快速通道(打标签 + 摘要 + 入库)先行返回,慢速通道(细切片、嵌入向量化)后台补齐,状态对用户可见 | U5/U6;G9/G10 | 451 | NOT_RUN |
| SR-B6 | 入库完成后向用户输出勾连总结:本文档涉及哪些内容、对应哪些阶段/工作事项/文档章节,以显式清单呈现 | U5/U6;G9/G10 | 452 | NOT_RUN |
| SR-B7 | 会议纪要类资料按同一管道处理,并可抽取"结论 / 待办 / 待确认"三类条目 | U5/U6;G9/G10 | 453 | NOT_RUN |
| SR-B8 | 笔记树内一致性检测:同一主题簇下多个切片的陈述不一致(如多人表述冲突)时,系统检测冲突 + 记录入追溯网(何时/何人/何节点/何操作)+ 通知触发冲突的用户 + 挂起待裁决;智能体不自行处理冲突,裁决… | U4/U6;G11 | 454 | NOT_RUN |
| SR-B9 | 并发更新冲突避免与及时提示:多人几乎同时更新同一树节点时,系统忠实记录全部操作入追溯网,冲突以候选子节点组并存挂起,智能体不自行处理冲突;裁决集中在编制人发起编制时经 HITL 完成(裁决两层,规则同… | U4/U6;G11 | 455 | NOT_RUN |
| SR-B10 | 任务快慢双速:对用户任务按快慢双速模式执行——快通道同步短链路即时反馈(如上传文档→相关性判断→相关给概要/不相关给理由+相似文档供选择),慢通道小队(subagent)后台深度执行(逐页解析、建节点… | U9/U13;G15 | 456 | NOT_RUN |
| SR-B11 | 结论节点:结论作为笔记树的节点类型保存(结论入树);结论节点与切片同受 08 R1–R5 硬规则约束(append-only、软删除、结构事件日志、可重建);结论节点与其依据切片/来源的关联入追溯网。… | U6;G11 | 457 | NOT_RUN |
| SR-B12 | 总结触发:何时生成阶段总结交模型自主判断(不设固定阈值)——信息足够支撑结论时自动生成阶段性总结并询问用户是否纳入文档(HITL 确认);保留人工触发入口(用户明确指令触发);上传后先快速摘要反馈、后… | U6;G11 | 458 | NOT_RUN |
| SR-C1 | 内置可配置的研发体系文档树(阶段 → 文档 → 章节),每章有内容要求说明;文档树对应设计开发控制程序,商务对接与策划合并为同一阶段 | U7/U8/U16;G7/G8 | 464 | NOT_RUN |
| SR-C2 | 体系文档模板集中注册、版本化管理;模板与阶段/文档节点的关联可配置,不与具体工作流实例硬绑定。模板策略:本期按当前已有模板设计与完善;标准模板待系统完成并通过测试后由用户补充(E-T3,后续目标 F-… | U7/U8/U16;G7/G8 | 465 | NOT_RUN |
| SR-C3 | 文档生命周期状态机:草稿 → 评审中 → 已基线 →(变更中)→ 新版本基线;基线文档不可被直接修改 | U4/U8/U10;G6/G8/G17 | 466 | NOT_RUN |
| SR-C4 | 新切片填充文档章节前,与该章节现有内容比对,输出三分类结论:新增 / 更新 / 冲突;更新与冲突均需用户确认后生效 | U4/U8/U10;G6/G8/G17 | 467 | NOT_RUN |
| SR-C5 | 缺项分析仅在两种触发条件下输出:文档提交评审时、项目申请推进阶段时;上传节点禁止输出缺项提示 | U10/U11;G14 | 468 | NOT_RUN |
| SR-C6 | 每次文档内容变化生成版本记录,可查看任意两版本差异及差异来源切片 | U4/U8/U10;G6/G8/G17 | 469 | NOT_RUN |
| SR-C7 | 三权分立流程规则:编制/审核/批准三权异人(编制唯一、批准唯一且异于编制人、审核可多人但异于编制与批准人);编制发起唯一;审核/批准仅可批注与通过/驳回,不可修改正文或发起编写;提交审核即锁定;驳回回… | U3/U8;G6/G17 | 470 | NOT_RUN |
| SR-C8 | 批准后修改的处理:本期路径=撤回重审(D-12:撤回后修改并重新升版审批)+影响提示(沿追溯网列出受影响范围给人看,不走流程,见 SR-D3);松散管理取向,但审计链不断(08 R1/R2/R5 不动… | U3/U8;G6/G17 | 471 | NOT_RUN |
| SR-D1 | 建立并持久化双向追溯网络:资料切片 ↔ 需求条目 ↔ 文档章节 ↔ 法规条款 ↔ 测试用例;每条边记录类型、来源(人工/规则/模型候选)与置信度 | U11/U14;G12/G17 | 477 | NOT_RUN |
| SR-D2 | 需求条目化管理:用户需求与系统需求大表,字段含状态(草稿/已评审/已基线)、版本、关联文档与法规;支持增删改与批量导入 | U11/U14;G12/G17 | 478 | NOT_RUN |
| SR-D3 | 新内容入库触发变更检测:与已评审条目比对,不一致时向用户提示风险并给出"确认变更 / 维持原样 / 发起变更流程"选项。影响提示(V2.1 增补):批准后修改或引用内容变化时,系统沿追溯网列出受影响范… | U6/U11;G11/G16 | 479 | NOT_RUN |
| SR-D4 | 变更流程闭环(变更申请 → 影响分析 → 评审 → 批准 → 执行 → 验证 → 关闭,全程留痕):整体后移,不作为本阶段系统实现目标——变更流程走公司内部管理流程,移入后续目标备案 F-02(《10… | U15/F-02;G14 | 480 | NOT_RUN |
| SR-D5 | 任一需求可导出完整追溯链报告;无法匹配进体系的资料进入"待裁定"清单,提醒用户处理 | U11/U14;G12/G17 | 481 | NOT_RUN |
| SR-D6 | 追溯主体扩展:追溯网每个节点的信息来源可溯——来自哪个用户、哪个智能体、哪次网络搜索、哪个文档树模板、哪条知识树切片,保证所有信息细节的准确性与可追溯性 | U4/U8/U11;G8/G17 | 482 | NOT_RUN |
| SR-D7 | 完整合规追溯模型(权威定义见 08 第十六章):15 类受控节点(含危害/风险控制措施/设计确认/设计转换/变更)+11 类合规边(两端=节点 ID@版本,模型仅候选、人工确认转正)+四条链视图(13… | U11/U14;G12/G17 | 483 | NOT_RUN |
| SR-D8 | 需求分类与分解框架:用户需求与性能需求分到不同文档;先确认用户需求再分解系统需求;系统需求按六维度分类(功能/交互/安全/运输包装/维护/合规);智能体可从法规反推部分系统需求,但不完全依赖智能体;先… | U11/U14;G12/G17 | 487 | NOT_RUN |
| SR-D9 | 风险登记册追溯:危害(HAZ)与风险控制措施(RCM)入网;每个 RCM 同时登记为需求并必须被验证(verifies 边);每个危害至少被一项 RCM mitigate;措施-危害-验证三向可查(术… | U11/U14;G12/G17 | 484 | NOT_RUN |
| SR-D10 | 验证结果绑定被测版本:VR 记录对应用例与被测对象版本;被测版本≠当前基线版本时系统报「验证过期」并列入缺口;设计确认(VAL)必须追溯到用户需求 | U11/U14;G12/G17 | 485 | NOT_RUN |
| SR-D11 | SOUP 组件登记与追溯:软件组成项(含 SOUP)入网为架构项,其需求分配与验证沿用同一边模型 | U11/U14;G12/G17 | 486 | NOT_RUN |
| SR-E1 | 意图识别分层:规则层(仅限整句完全匹配的高频确定性短指令)→ 语义层 → LLM 层;规则层不得单独触发高风险操作 | U2/U8/U9/U10;G1/G8/G14/G15 | 493 | NOT_RUN |
| SR-E2 | 规则层命中必须通过上下文校验(上一轮存在对应的待确认事项)才可执行;无上下文时降级为普通对话 | U2/U8/U9/U10;G1/G8/G14/G15 | 494 | NOT_RUN |
| SR-E3 | 确认、变更、删除、阶段推进等操作一律通过标签卡/按钮交互完成,卡片明示操作对象与后果 | U2/U8/U9/U10;G1/G8/G14/G15 | 495 | NOT_RUN |
| SR-E4 | 支持意图分类(查询 / 编写 / 命令 / 讨论)与意图切换识别;编写类意图需命中目标文档并确认后执行 | U2/U8/U9/U10;G1/G8/G14/G15 | 496 | NOT_RUN |
| SR-E5 | 简单询问即时回答;复杂任务先给出执行计划与预计耗时,执行中提供进度反馈 | U2/U8/U9/U10;G1/G8/G14/G15 | 497 | NOT_RUN |
| SR-E6 | 对话完备路径:从立项到结项的全部状态变更操作(创建项目、提交评审、批准变更、阶段推进、导出、结项等)均可通过对话指令驱动,页面/按钮不是任何步骤的唯一入口;高风险操作的对话路径终点为对话流内联确认卡(… | U2/U8/U9/U10;G1/G8/G14/G15 | 498 | NOT_RUN |
| SR-F1 | 复杂任务由多角色"小队"在固定流程骨架约束下执行:骨架显式定义步骤序列与返回检查节点,角色在骨架内有限自主 | U8/U9/U13;G8/G15/G18 | 504 | NOT_RUN |
| SR-F2 | 每个角色显式声明:职责、可用工具白名单、禁区;角色提示词作为受控资产版本化管理 | U8/U9/U13;G8/G15/G18 | 505 | NOT_RUN |
| SR-F3 | 涉及法规的任务强制执行"法规知识库检索 + 网络检索"双通道,结果附引用来源;冲突时以权威来源为准并提示 | U12;G13 | 506 | NOT_RUN |
| SR-F4 | 长任务后台异步执行,进度可查询、完成有通知;不得阻塞对话主线程 | U8/U9/U13;G8/G15/G18 | 507 | NOT_RUN |
| SR-F5 | 执行任务时自动组装上下文:项目当前状态、相关记忆切片、目标文档模板、近期对话;上下文构成可解释 | U8/U9/U13;G8/G15/G18 | 508 | NOT_RUN |
| SR-G1 | 飞书集成:智能助手可加入群聊,支持群内对话、收文件、推送反馈与通知。本期不做飞书功能(J-11),本条与 UR-20 一并后移 → F-01 | U15/F-01;外部依赖 | 514 | NOT_RUN |
| SR-G2 | 基于角色与项目阶段的权限控制(ABAC),阶段转换需满足准入准出条件并留痕。判定维度(角色 × 项目 × 阶段 × 动作)保留;权限主数据裁决(J-10,R2 关闭):本期系统内建最小权限系统(管理员… | U2/U3;G3/G4 | 515 | NOT_RUN |
| SR-G3 | 全量审计日志:上传、入库、更新、变更、确认、生成等动作均可审计 | U4/U11;G5/G17 | 516 | NOT_RUN |
| SR-G4 | 系统以自身研发项目为首个运行实例(自举元项目),自身需求与体系文档由本系统管理 | U14;G19 | 517 | NOT_RUN |
| SR-G5 | 结构追溯:笔记树、文档树、追溯网自身的结构变更全程留痕——节点与关系的增/删/改记录操作者、时间、理由与前后值;删除一律软删除(tombstone);追溯边有"候选 → 生效 → 废止"全生命周期;支… | U4/U11;G5/G17 | 518 | NOT_RUN |
| SR-G6 | 系统管理员与系统级设置:全局唯一管理员拥有所有权限;仅管理员可进行系统级设置——Tavily API Key、大模型相关设置、Agent 参数(工具调用轮数/工具权限等)、系统级插件管理、用户/角色的… | U2/U3;G3/G4 | 519 | NOT_RUN |
| SR-G7 | 角色管理:角色定义与默认权限集——能否创建项目/是否拥有某些文档的读取权限/能否推进项目到下一阶段/能否为项目添加成员/能否为成员配置项目内权限/能否为各模板文档分配三权负责人;角色可分配给用户(如项… | U2/U3;G3/G4 | 520 | NOT_RUN |
| SR-G8 | 权限覆盖优先级——上限内覆盖(J-05,原存疑关闭):管理员设定角色默认权限与权限范围上限(最底层约束);项目负责人(创建者)在该范围内调整项目成员权限;项目内配置可覆盖角色默认配置,但不得突破管理员… | U2/U3;G3/G4 | 521 | NOT_RUN |
| SR-G9 | 项目负责人权限:项目创建者即项目负责人,拥有项目内全部权限——添加项目成员、编辑项目成员权限、为各模板文档分配编制/审核/批准负责人 | U2/U3;G1/G2 | 522 | NOT_RUN |
| SR-G10 | 项目唯一性与成员自动可见:同名项目全系统唯一;用户被添加为项目成员后,其界面自动出现该项目,并可直接开始项目工作(新建对话等) | U2/U3;G1/G2 | 523 | NOT_RUN |
| SR-G11 | 对话隐私:用户之间的对话互相不可见,仅本人可见本人与智能体的对话;智能体会话/中间过程默认互不可见(J-06,原存疑关闭),协作全部经两树一网项目共享层;用户分享分层(整个项目/会话/部分会话)的精细… | U3/U5/U9;G4/G5/G10 | 524 | NOT_RUN |
| SR-G12 | 文档分享:上传者可将文档分享给指定成员/部分成员/全部项目成员;被分享者只读、不可编辑;被分享文档进入接收者上下文,支撑其后续对话中查看并基于这些文档对话 | U3/U5/U9;G4/G5/G10 | 525 | NOT_RUN |
| SR-G13 | 上下文时间权重:本期最小实现——检索与注入排序新内容优先;替换/冲突场景走 J-02 人裁决(SR-B8/SR-B9)。可配置时间权重衰减模型(权重数值、配置粒度)移入后续目标 F-04(J-07,优… | U5/U15/F-04;G10 | 526 | NOT_RUN |
| SR-G14 | 飞书项目对接适配(接口层四项功能:产品创建/账户绑定扫码登录/URL 协同连接/知识库上传生成链接;飞书角色权限映射读取):本期不做飞书功能,整条移入后续目标备案 F-01(J-11);保留设计预留说… | U15/F-01;外部依赖 | 527 | NOT_RUN |
| SR-G15 | 虚拟人账号(企业账号下为智能体创建固定账号持有文档/文件夹访问权限;授权范围、审批与定期审计流程待明确,《10》Q-04):随飞书对接整体后移,移入后续目标备案 F-01(J-11) | U15/F-01;外部依赖 | 528 | NOT_RUN |
| SR-G16 | 代码执行安全:多用户共享部署在隔离执行档就位前,以启动级硬关闭禁用执行原语(run_shell/run_python/register_artifact 及内核执行配置),用户设置不得覆盖(基座已交付… | U13;G18 | 529 | NOT_RUN |
| SR-N1 | 性能:上传首轮反馈 < 60 秒;单文档完整入库(后台)< 10 分钟;追溯链查询 < 3 秒 | U14;G18/G19 | 535 | NOT_RUN |
| SR-N2 | 可维护性:模块边界清晰、依赖单向;任一核心功能(如文档入库)可在 5 分钟内定位到对应代码模块;支撑每周代码审查机制 | U1/U14;G19 | 536 | NOT_RUN |
| SR-N3 | 可解释性:每个入库、更新、变更动作给出依据(来源切片、命中标签、比对结果) | U4/U5/U8;G10/G17 | 537 | NOT_RUN |
| SR-N4 | 部署与数据:支持本地化部署;法规知识库本地存储;项目数据按项目隔离 | U2/U3/U13;G5/G18 | 538 | NOT_RUN |
| SR-N5 | 模型无关性:大模型通过抽象层接入,可替换(当前为 MiniMax,不绑定) | U9/U13;G8/G18 | 539 | NOT_RUN |
| UR-01 | 自由上传 | U5/U9/U14 | 547 | NOT_RUN |
| UR-02 | 相关性把关 | U5/U6 | 548 | NOT_RUN |
| UR-03 | 自动归纳入库 | U5/U6/U9/U14 | 549 | NOT_RUN |
| UR-04 | 及时反馈 | U2/U5/U6/U8/U9/U10/U13/U14 | 550 | NOT_RUN |
| UR-05 | 渐进式清晰 | U4/U7/U8/U10/U16 | 551 | NOT_RUN |
| UR-06 | 缺项提示时机 | U10/U11 | 552 | NOT_RUN |
| UR-07 | 冲突与变更 | U4/U6/U8/U10/U11/U15 | 553 | NOT_RUN |
| UR-08 | 严格可追溯 | U4/U5/U6/U8/U10/U11/U14 | 554 | NOT_RUN |
| UR-09 | 需求条目化 | U6/U11/U14 | 555 | NOT_RUN |
| UR-10 | 模糊澄清 | U2/U4/U5/U6/U8/U9/U10 | 556 | NOT_RUN |
| UR-11 | 一键生成文档 | U2/U8/U9/U10/U13 | 557 | NOT_RUN |
| UR-12 | 主动提问 | U2/U5/U6/U8/U9/U10 | 558 | NOT_RUN |
| UR-13 | 外部查询入库 | U5/U6/U8/U9/U12/U13 | 559 | NOT_RUN |
| UR-14 | 法规双通道 | U12 | 560 | NOT_RUN |
| UR-15 | 商务策划贯通 | U7/U8/U16 | 561 | NOT_RUN |
| UR-16 | 显式确认 | U2/U8/U9/U10 | 562 | NOT_RUN |
| UR-17 | 阶段门禁权限 | U2/U3/U4/U11 | 563 | NOT_RUN |
| UR-18 | 会议纳入记忆 | U5/U6 | 564 | NOT_RUN |
| UR-19 | 自举 | U14 | 565 | NOT_RUN |
| UR-20 | 协作平台接入 | U15 | 566 | NOT_RUN |
| UR-21 | 系统角色与权限管理 | U2/U3 | 567 | NOT_RUN |
| UR-22 | 项目成员与协作 | U2/U3 | 568 | NOT_RUN |
| UR-23 | 文档分享与上下文注入 | U3/U5/U9/U15 | 569 | NOT_RUN |
| UR-24 | 三权分立文档流程 | U3/U8 | 570 | NOT_RUN |
| UR-25 | 版本全量保留与来源追溯 | U4/U8/U10/U11 | 571 | NOT_RUN |
| UR-26 | 并发更新冲突避免与提示 | U4/U6 | 572 | NOT_RUN |
| UR-27 | 快慢处理与任务拆解展示 | U9/U13 | 573 | NOT_RUN |
| UR-28 | 简易看板 | U4/U6/U8/U10/U11 | 574 | NOT_RUN |
| UR-29 | 难度分级与降级使用 | U8/U9/U13/U14/U15 | 575 | NOT_RUN |
| UR-30 | 对抗验证机制 | U8/U9/U13/U14/U15 | 576 | NOT_RUN |
| UR-31 | 飞书项目对接 | U15 | 577 | NOT_RUN |
| UR-32 | 代码管理工具集成 | U15 | 578 | NOT_RUN |
| UR-33 | 法规合规追溯 | U11/U14 | 579 | NOT_RUN |
| UR-34 | 结论沉淀与阶段总结 | U6 | 580 | NOT_RUN |
| F-01 | 飞书对接全套(渠道 EXT-3、扫码登录、权限映射、虚拟人账号、文档同步/版本关联) | U15/F-01 | 643 | NOT_RUN |
| F-02 | 变更流程引擎(七步闭环、变更单、完整影响分析) | U15/F-02 | 644 | NOT_RUN |
| F-03 | 用户分享分层(整个项目/会话/部分会话)与智能体可见性的精细设计 | U15/F-03 | 645 | NOT_RUN |
| F-04 | 可配置上下文时间权重衰减模型 | U15/F-04 | 646 | NOT_RUN |
| F-05 | 代码管理工具集成(GitLab token 只读拉取、需求-版本-缺陷关联) | U15/F-05 | 647 | NOT_RUN |
| F-06 | 看板与卡片流的界面统一(随原型 V2.3) | U9/U14 | 648 | NOT_RUN |
| F-07 | 会议遗留问题组(Q-01/02/03/07/10/13/14 等,《12》问题 8 组);其中 Q-02 经晚会部分裁决(C-03,见 §7.1) | U15/F-07 | 649 | NOT_RUN |
| F-08 | 难度分级评估表与降级机制的落地细化(UR-29 保留 P1,实施细节备案) | U15/F-08 | 650 | NOT_RUN |
| F-09 | 追溯网可视化(先功能后展示,暂缓) | U11/U14 | 651 | NOT_RUN |
| F-10 | 标准模板替换:本期按当前已有模板设计与完善;待系统完成并通过测试后,由用户补充标准模板(取代晚会 T2「今晚下载官方模板替换」,不执行) | U16+U15/F-10 | 652 | NOT_RUN |
@@ -0,0 +1,384 @@
---
title: 服务重启与全量数据恢复方案
type: fix
date: 2026-10-12
artifact_contract: ce-unified-plan/v1
execution: code
product_contract_source: ce-plan-bootstrap
---
# 服务重启与全量数据恢复方案 r3
确认状态:原 r2 批准记录保留。**r3 新增(R11/R12、KTD13–KTD15、U8)于 2026-10-12 已批准**,当时授权连续推进到 PR 可合入;该历史批准不代替当前交付准入。合入按现行规范由智能体执行。
U8 进展(2026-10-12,未合入):Backend #183 与 Dev #482;旧记录在 `ef66bfb` 上记有 vet-and-test success(历史 SELF 引用,非本轮 GATE)。Dev 侧在允许 `app → instanceguard` 与 `instanceguard → store` 两条架构边后的提交是 `4464255`,该 HEAD 的 CI 以作业结论为准,不在本文升为 GATE。
r3.1=同日增补 D1/D2/D3(部署根治;编号避开本案 U1–U8)。映射:D1 补 U1 身份消费缺口,D2 补 U6 部署回退,D3 补 U7 真实组合门禁。确认状态:用户 2026-10-12 授权按实施计划连续推进到 PR 可合入;D1–D3 仍供人工评审,不因 U8 批准而代签。
修订记录:r1=2026-10-12 初稿并完成六角色文档自审(见同名审阅记录第一轮);r2=2026-10-12 吸收外部源码复核(U1/U3/U4/第9节四处修订,见审阅记录第二轮),需求范围与量化指标未变。
r3=同日根据 dev 8788 账户故障续查刷新源码/运行事实,保留 R1–R10、KTD1–KTD12、U1–U7;补充 R11/R12、KTD13–KTD15、U8 单实例保护及近期验证合同。原故障档和时间指标保持候选值,未宣称实测达标。上述 r3 新增已于 2026-10-12 批准。
需求来源:2026-10-12(Asia/Shanghai)用户要求“系统应该在停止并再次启动(通过 svc 或异常终止)后,应当能够恢复所有服务和数据,给我一个完善方案”。负责人:weichen;编制:Codex;实施与运维负责人在启动对应增量时指定。
主记录:本文;任务卡:Dev `.task/feature-service-restart-recovery-plan.md`。本文的源码路径以 Dev 根目录为基准。
## 1. 目标与成功边界
**目标:系统停止后再次启动,用户仍能访问原有数据和服务,未完成工作进入可继续或可处理的确定状态。**
采用“稳定实例配置与身份、依赖编排、进程监管、持久恢复账本、一致性文件发布、组合备份与实测验收”的方案。复用现有 PostgreSQL/SQLite、运行表、事件、命令、通知和恢复隔离机制,补齐实际接线与崩溃窗口。首期落实单机完整恢复;多实例所有权沿用已有协作存储方向,不重新设计一套集群平台。
必须区分三类恢复:
| 故障档 | 需要达到的结果 | 数据与时间合同 |
|---|---|---|
| `svc stop/start/restart`、进程 SIGTERM/SIGKILL、应用 OOM | 原配置启动;持久数据完整;安全任务继续;未知副作用隔离 | 存储正常、确认结果已持久化的前提下,RPO=0;建议冷启动至业务就绪≤60秒 |
| 主机重启、操作系统崩溃或断电,磁盘仍可用 | 数据库 WAL 恢复、文件一致性恢复、服务按既定意图启动 | 只有 DB 与文件落盘策略、底层存储满足耐久性且实测后,才承诺已确认数据 RPO=0;建议 RTO≤5分钟 |
| 数据盘损坏、主机丢失、误删或不可逆污染 | 在新目标恢复匹配的 DB、文件、配置和版本 | 沿用协作存储案建议 RPO≤5分钟、RTO≤60分钟;如要求此档 RPO=0,另行批准跨故障域同步复制 |
以上时间为**待批准的验收目标**,不是已测性能。大规模扫描与冷索引重建不要求全部在60秒内完成:必需数据对账及安全恢复决策完成后可开放API,派生索引按明确降级合同后台重建。故障超出资源预算时报告阻塞及原因,不能以假就绪满足时间指标。
恢复保存的是持久业务状态、步骤和已确认结果。进程内 goroutine、模型连接及未持久化 token 不可原样复活;模型回合从持久上下文和步骤边界重建。已经接受的用户消息、排队任务、审批和取消意图必须先落库再返回接受;尚未确认的结果不能事后冒充成功。
## 2. 当前事实及重点差距
本轮源码基线:权威 Dev `2723e452440fc11022c0f6d916cd34cc4cd17335`;文档任务同步后 HEAD `26f2045e33516207959b5983acd32e1d3ea66bca`(任务元数据提交);Backend `5e8ada727c358438f8ff9f94eabb697e99fe28dc`;Core `89f3906c390027512ef47b5333088c3d3a019e84`;Frontend `cc233fec908d0f8c12193042942b94ad68508091`;固定 Documents `8d0810bd35f4934e0ad37fb96d7bab6d7a732473`。草案独立 Documents 基线 `1048e7c6afc2bb4efc541e68575c3fb2669ee332`,未推进 Dev gitlink。原 r2 对象为历史,不用于证明当前运行行为。
来源为 SELF·只读观察;原始脱敏命令和运行输出由 Dev `make evidence` 写入 `.task/feature-svc-account-durability-plan.md`。故障表现为源码推导,故障/恢复/耐久性验收 NOT_RUN。
最终 Dev 同步基线 `d6d46fde6d903d0d8e37440d830fb5183d6ef5e9` 已纳入主干的 svc 实例内存态修复和 Documents 指针 `1048e7c6afc2bb4efc541e68575c3fb2669ee332`;Backend/Frontend 未变。旧 gitlink 是启动时点,本轮仅同步权威上游,未推进本轮草案组合或重复实现该修复。
| 对象 | 已存在的基础 | 尚需解决的恢复缺口 |
|---|---|---|
| 数据库绑定与身份 | svc 统一解析已接线;manifest/marker 和 Backend DB identity 已存在;manifest 写入已有 file/dir fsync | 部分消费方仍读派生 svc.env;自定义根和 legacy/direct 启动需要完整核验;identity 不等于活动服务独占锁 |
| 服务生命周期 | svc 已有 desired/autostart、recover、watchdog timer;PG 优先拉起 | 没有完整服务组依赖/单一进程组监管;不管理 Redis 类型;登记版本与实际二进制可能不一致 |
| 启动与停机 | 启动对账开放 run;优雅停机尝试中断和事件 flush | 恢复通知/子代理发生在完整接线前;HTTP停机超时可跳过flush;无所有worker等待;子代理 cancelled 可覆盖 interrupted |
| 运行恢复 | `runmgr.go:2046` 对账、子代理派生请求/转录、pending_notices持久化、恢复hold检查 | 主run与HITL统一收为中断/取消;子代理先派生再写文件标记;notice消费非事务且绕过PG会话占用 |
| 执行所有权与额度 | `store/execution.go` 有 owner/epoch/lease,终态有fencing;额度有持久表 | 续租只有定义未接入生产调用;15分钟租约可过期;额度无崩溃回收;不能据此宣称安全接管 |
| 命令与投影 | 取消/HITL持久收件箱、Surface待投递标志、事件seq与SSE续传 | 命令先 consumed 后执行,kill窗口丢命令;跨实例取消入队缺conversation;Surface失败仍可清pending且仅扫100条 |
| 工具副作用 | Native Session已有tool intent/result转录、安全重放判定;Backend有hold表及管理员释放入口 | `SetRecoveryHold`仅定义;Native的未知效果被写成工具错误后仍可继续模型,尚未与Backend run/owner/epoch和持久hold形成统一隔离闭环 |
| 文件与备份 | blob temp+rename、SQLite 一致性快照、pg_dump 已存在;Native 转录 Write→Sync;manifest 有原子同步链 | 工件原文先覆写再更新 DB,无不可变版本;agent 快照缺权威 manifest,PG 和文件快照不是同一恢复点 |
| SQLite 服务所有权 | WAL、30 秒 busy_timeout、每进程一连接;数据库事务可排队 | 无跨进程活动服务独占;恢复扫描全部开放 run,第二个服务可打断第一服务;不具备 PG 的会话执行租约 |
2026-10-12 17:37:03(Asia/Shanghai)实际 dev 进程打开 `runtime/dev/data/agent-system.db`,DB marker 为 `sqlite`,运行 Backend `5e8ada7`;没有登记 PG 绑定。候选 rdmcand 已停止且登记来源与实际文件版本不符。前一轮共享数据观察是历史风险线索,不冒充当前双进程事实。**实际文件/marker 已核对,不等于全栈恢复或断电耐久性 PASS。**
当前 PG 事件总线已有真重连、分页追赶和周期补查,Native 已接持久工具转录;这些基础不重复建设。SQLite 应用连接未显式声明 synchronous;诊断连接 PRAGMA 不能证明应用配置,见 R12。
18:14:09(Asia/Shanghai)重新实测:外部流程已将 rdmcand 拉起于独立数据根,实际 DB inode 与 dev 不同且制品/登记版本一致;dev 仍打开原库、账户最后设密时间未前进。当前共享现场已缓解;U8 的剩余任务是强制运行时防误用和隔离验收,不重复执行已完成的人工分根。完整停机/恢复和锁能力仍 NOT_RUN,本轮没有改变服务或数据。
旧报告中“DSN重启丢失”“迁移DDL与版本分开提交”“通知仅内存”等问题已有源码改进,本案只验证并复用这些基础,不把旧缺陷重新列成新建设。
## 3. 需求合同
| ID | 范围 | 要求与可判定验收 |
|---|---|---|
| R1 | 服务 | 启动显式服务组时,全部已启用的必需服务按依赖就绪;可选失败明确降级;主动停止不被监管误拉起 |
| R2 | 身份 | 连续裸启停、更换端口/程序/cwd后,DB identity、数据/工件/工作区根、实例ID、认证及插件组合一致;缺配置拒绝启动 |
| R3 | 已确认数据 | 消息、项目、成员/权限、文档、设置、插件启用/授权、任务、审批、事件、工件原文与版本在RPO=0档零遗漏;灾难档完整恢复批准恢复点内数据,并对账/报告恢复点后的缺失和外部效果 |
| R4 | 任务 | 已接受排队任务不丢;安全任务从持久步骤继续;HITL保留稳定gate与答案;取消意图在重启/换owner后仍生效 |
| R5 | 副作用 | started但无确定result的外部动作自动隔离;已确认动作不重做;恢复与发布验证当前权限和执行代次 |
| R6 | 所有权 | 单一有效写者;旧进程迟到写状态/事件/工件被拒;过期额度回收;恢复本身可重复且可再次中断 |
| R7 | 文件与派生状态 | DB引用的文件内容、版本和hash一致;损坏现场保留并报告;缓存/检索索引可从权威源重建 |
| R8 | 停机与就绪 | 停机先拒绝新工作再排空;全部worker、sidecar和工具子进程收口;错误不跳过后续清理;ready反映业务可用 |
| R9 | 升级与灾难 | 保留上一程序/插件/资产组合及兼容合同;备份恢复到新目标并完成业务/权限/文件对账;不在普通启动覆盖现库 |
| R10 | 可见与证据 | 用户能区分继续、等待审批、等待恢复确认、失败;运维能定位阻塞依赖;每项验收绑定精确组合、制品、配置与原始输出 |
| R11 | 本地服务隔离 | 同一 SQLite/数据资源只允许一个活动服务运行时;直接二进制、路径别名和 legacy 入口同样受保护;账户短事务 CLI 不启动第二运行时;测试实例使用独立根 |
| R12 | 耐久性档 | 显式设置并从应用实际连接核验 DB 耐久策略;文件和目录同步覆盖权威对象;DB/文件持久失败不能确认成功;未实测的断电 RPO 保持候选 |
覆盖“所有数据”需要先完成数据归属清单:除Backend业务表,还含插件自有持久库/目录和下游RDM等已启用模块。每个插件声明恢复适配器、版本、权威位置、必需程度与兼容性;无法证明可恢复的必需插件阻塞全系统签收,不能只恢复Backend便宣称全部完成。
## 4. 技术决策与服务结构
KTD1. **持久配置是启动权威,PID只是观察。** 每实例保存完整类型化manifest:service/instance ID、配置revision、desired state、服务类型与管理权、依赖、固定程序/插件/资产摘要、DB identity与凭据引用、数据/工作区/工件根、认证、监听、必需/可选属性、恢复政策。临时环境只作显式覆盖;必需字段必须能从持久值或稳定受保护引用重新解析。机密放受保护文件/秘密服务,manifest仅存引用,不把密码或DSN写进日志。
KTD2. **配置整份提交,覆盖按字段合并。** 每实例和服务组串行化生命周期操作,配置以revision做CAS;候选完整解析与校验后,临时文件落盘、原子替换、目录同步。legacy迁移同样一次提交,故障留下旧版或完整新版。更改端口不隐式更改data;数据根迁移是独立操作。恢复启动发现预期DB/marker/目录丢失时阻塞,初次初始化需要明确入口,禁止新建空库掩盖数据丢失。
KTD3. **svc控制期望状态,唯一supervisor管理进程。** Linux部署推荐systemd;svc兼容既有单服务入口,增加显式stack/group控制。每服务仅一个监管者,不能nohup watcher与systemd同时拉起。分发仓已有模板要接入同一manifest合同。外部/共享PG、Redis仅探测连接,不擅自启停;managed-local只管理身份已核实且归该服务组独占的资源。pgvector是PG扩展,不另造守护进程;Redis只有配置并启用时才进入依赖图。
KTD4. **主动停止与异常退出分开。** stop先提交desired=stopped,再关闭服务;普通故障仅desired=running可重启。restart保留最终running意图并记录operation_id、执行阶段和恢复政策,不能因中途stop留下stopped。监管采用有界退避、重试预算与失败阻塞;错误配置不能无限重启。开机只恢复已登记且策略允许的服务。intent、operation、actual state必须分开,不能以pidfile存在视为运行。
KTD5. **团队业务权威沿用PG,个人档沿用SQLite。** 团队PG失败保持未就绪,绝不切SQLite。普通重启让既有数据库完成自身WAL恢复,不导入备份。验证数据库identity/schema/权限和关键记录;SQLite恢复到预期文件并检查完整性,不能只看文件存在。断电承诺要求明确DB同步设置及底层存储合同,不把rename原子性当作落盘保证。依据:[PostgreSQL耐久性](https://www.postgresql.org/docs/current/wal-reliability.html)、[SQLite WAL](https://www.sqlite.org/wal.html)。
KTD6. **恢复扫描与恢复执行分离。** 装配Store、权限、插件/工具、工作区、预算、Workflow、命令消费者与事件投递之后,才分类认领恢复任务。扫描失败或归属未知进入blocked/hold;不能吞掉错误直接ready。恢复有持久cursor/attempt和CAS,支持分批、失败重试及再次重启;禁止全库无归属盲扫并续跑其他实例的任务。
KTD7. **持久执行账本统一主run、子run和后台任务。** 保持稳定logical_run_id、request_id、parent关系;每次执行用新的attempt/boot/epoch。步骤记录输入引用、已提交输出、等待原因、调度位置、恢复决策;完成记录与业务结果原子提交。现有文件修改checkpoint不是完整执行checkpoint,不能直接拿它宣称主对话/工作流可续跑。后台任务表目前仅状态登记;只恢复明确有executor的类型,其他类型进入可见unsupported/blocked,补适配后验收。
KTD8. **副作用先登记,结果未知先对账。** 复用Native `runtime/session/intent.go`和生产接线`internal/runtime/llm_direct.go:245–301`,以同一call/operation ID关联现有intent/result与Backend的run/owner/epoch/hold,不能让两个恢复器各自决定重放。DB账本裁决执行和hold,转录保存完整上下文及结果投影;本地个人档同样须有持久裁决。调用外部工具前持久化operation_id、参数摘要/安全引用、授权与gate、owner/epoch、幂等类别及started;确定结果写result/receipt。启动遇到started无确定result自动hold,不能只把“副作用未知”写成普通工具错误后允许模型继续发起动作。
目标支持可靠幂等键时按同一key重试;非幂等动作必须取得确定未执行的终态证据,并证明旧执行者及已发请求都不会再产生效果,才允许重试。“暂未查到结果”“取消请求已发送”“本地进程已退出”均不充分。否则保持hold。shell、代码执行、Git、数据库/远端写入默认按不透明副作用处理。模型/工具因失权立即取消;无法围栏的外部动作进入hold,不能靠租约到期证明旧动作停止。
KTD9. **所有工作入口共用执行所有权与额度。** 前台、notice、子代理恢复、命令消费者均经过持久claim。稳定instance_id与每次boot_id分开;续租持续进行,丢租停止执行;CAS/事务围栏覆盖状态、事件、步骤、工件发布和副作用准入。execution与admission lease关联run/attempt/epoch;恢复终态和已证明失效的许可,禁止一启动就清空全库锁。父任务等待HITL/子任务让出执行额度;持久队列及跨实例等待者有有界唤醒机制。
KTD10. **命令、通知和投影处理后确认。** 命令 pending→claimed(带租约)→applied/rejected,超时claim可重领;取消先从run解析已授权conversation,按逻辑run转交当前owner;HITL验证gate/version与当前权限。notice_id/旧子run的恢复claim、对应新run、消息和销项以事务与唯一约束关联,文件resumed标记仅作投影。outbox成功才ACK,失败保持pending;分批持续drain,不受单次100条限制。
KTD11. **不可变对象加DB发布记录保持文件一致性。** 写新版本对象、完成必要fsync/hash校验后,在事务中发布引用与版本;失败留下可辨认未发布对象,不直接覆盖已发布版本。工作区变更另用既有overlay/CAS与副作用账本核对,不能把可变工作区伪装为不可变对象。checkpoint/JSONL尾部截断须保存原件、识别未确认尾部,已确认部分校验失败阻塞。工件缺失报告损坏,不静默返回空内容。孤立对象按清单、引用、保留期与备份需求回收。
KTD12. **业务readiness与恢复摘要分开。** liveness仅证明进程存活;readiness包含身份/认证、DB/schema、必需目录与插件、恢复决策完成和worker接线。已隔离且不影响其他会话的hold可允许API就绪,并暴露计数与处理入口;损坏权威数据或必需依赖失败不能ready。详细恢复状态只向有权owner/admin开放;公共健康响应不泄漏路径、任务ID、凭据或业务内容。
服务依赖结构(实线为必需;可选项以实例manifest为准):
```mermaid
flowchart TB
M[持久实例manifest与启动意图] --> S[svc控制入口]
S --> P[唯一进程监管者]
P --> D[受管PG或SQLite数据]
P --> A[应用与恢复协调]
X[外部PG或可选Redis:仅探测] --> A
D --> A
F[持久文件与插件组合] --> A
A --> W[任务/命令/通知/投影workers]
A --> H[业务readiness]
H --> U[Web或下游业务入口]
```
systemd的顺序依赖不能替代DB可用性检测;需真实探测,且明确依赖断开后的重连/恢复政策。监管策略参考systemd官方[service契约](https://github.com/systemd/systemd/blob/main/man/systemd.service.xml)与[进程组停止契约](https://github.com/systemd/systemd/blob/main/man/systemd.kill.xml)。
KTD13. **SQLite 活动服务锁由 Backend 强制。** 在迁移和启动 run 对账之前按实际 DB/数据资源取得 OS advisory lock,持有至运行时退出;覆盖规范化路径和文件别名。marker/PID 不替代锁,SIGKILL 后由 OS 释放。合法账户 CLI 只核验同实例和兼容 schema 后做 DB 短事务,不启动 Manager;迁移独立维护。锁文件丢失或 DB 替换导致身份改变时拒绝自动续跑,不能新建可绕过的锁继续。
KTD14. **初始化与事故后缺库分开。** 已登记实例启动和运维先验证预期库/marker,缺失则阻塞;显式 init 才允许创建。SQLite 可靠档明确 WAL+FULL 并核验每个连接;PG 核验实际 fsync/synchronous_commit/full_page_writes 等,不用诊断连接默认值证明应用配置。[SQLite WAL](https://www.sqlite.org/wal.html)、[PostgreSQL WAL](https://www.postgresql.org/docs/current/runtime-config-wal.html)。
KTD15. **manifest 单一权威与派生视图修复。** 复用现有 temp→fsync→rename→dirsync;读侧直接消费 manifest 或验证派生 revision。manifest 提交后、svc.env 派生前崩溃可重新生成视图,不能按旧派生配置换库。未知制品能力、登记/实际版本不符报告并拒绝危险操作,不猜测。
## 5. 启停流程与恢复政策
### 5.1 启动和优雅停止
```mermaid
sequenceDiagram
participant C as svc/监管者
participant A as 应用生命周期
participant D as 持久存储
participant W as workers与子进程
C->>D: 校验manifest、数据身份与操作锁
C->>C: 启动归本组管理的依赖并探测
C->>A: 启动固定版本
A->>A: SQLite取得活动服务锁;PG按既有执行所有权合同
A->>D: 校验schema、文件与恢复候选
A->>W: 完成插件/权限/预算/工作区全部装配
A->>D: 分类认领、对账未知效果、恢复命令与额度
A->>W: 开放安全恢复执行
A-->>C: readiness与恢复摘要
C->>A: 停止请求
A->>A: readiness=false;拒绝新写和新任务
A->>W: 停止领取、取消或保存安全边界
W-->>A: bounded join与子进程结果
A->>D: 持久化恢复意图、flush、收口许可/所有权
A->>D: 关闭存储
A->>A: 释放本进程SQLite活动服务锁
A-->>C: 停机结果(含未完成原因)
C->>C: 复核进程组消失;逆序停止独占依赖
```
停机预算建议应用30秒、监管60秒,必须按最长合法步骤与故障实测调整;SSE连接主动结束,不能占满排空预算。某阶段出错继续运行后续可安全清理,保留聚合结果。工具无法停止或副作用未定时先持久hold并保留现场;强制结束后必须走崩溃恢复路径,不返回“已优雅停止”。
### 5.2 不同工作的恢复策略
| 停机前状态 | 重启处理 | 自动执行边界 |
|---|---|---|
| 已完成/失败/明确取消 | 原样加载结果及原因 | 不重新执行 |
| 已接受但未开始 | 按持久队列、权限和预算重新调度 | 条件满足后自动 |
| 纯读、可重建的计算 | 从已提交步骤边界继续 | 不重复已提交业务结果;模型回合可重新生成 |
| 正在执行幂等副作用 | 根据operation_id、目标查询/幂等合同核对 | 确认安全后继续 |
| 非幂等副作用结果未知 | 自动hold,展示原因和可核对证据 | 有权人对账具体operation;确认完成则记录receipt并检查剩余步骤;确认未执行须满足KTD8终态与旧请求隔离条件;可明确放弃整项任务;禁止直接“放行即重跑” |
| 等待HITL | 恢复稳定gate/version及持久答案 | 未回答继续等待;已回答幂等消费;撤权/版本变化拒绝并说明 |
| 子代理/后台notice | DB唯一恢复claim关联旧、新attempt | 不由文件标记决定唯一性,不重复派生/投递 |
| 索引与缓存 | 从文档/内容权威源重新排队,记录索引generation | Redis可清空重建;恢复模型/维度/版本一致性后发布索引 |
| 未配置executor、缺文件或未知归属 | 保持blocked并提供处理原因 | 不丢行、不假完成、不盲续跑 |
```mermaid
stateDiagram-v2
[*] --> pending
pending --> running: 获得有效owner/预算
running --> waiting_hitl: 持久gate
waiting_hitl --> running: 当前权限下消费答案
running --> completed: 结果与状态原子提交
running --> recovering: 停机或失联
waiting_hitl --> recovering: 执行者重启
recovering --> pending: 核对可安全继续
recovering --> waiting_hitl: 恢复原等待
recovering --> hold: 副作用未知/权威数据不完整
hold --> pending: 有权人对账确认安全
hold --> recovering: operation对账结果与receipt已持久化
recovering --> completed: 全部必要步骤与业务结果已确认完成
hold --> cancelled: 明确放弃
```
`recovering/hold`在这里是目标业务语义,**不是声称现有Core枚举已支持**。过渡可用恢复账本表达;若新增公开状态,Core/Backend/Frontend/下游契约兼容必须同增量处理。已有interrupted历史记录保留,不强改成成功。
用户侧复用现有任务状态、对话卡和系统管理区,显示恢复原因、进度和动作。当前只有管理员恢复 API 基础,Frontend 对账接线待 U4 实施,不宣称已有可用界面。SSE按持久seq补发并丢弃旧事件,刷新重载权威快照;断连不推断完成。实施界面先读 DESIGN.md,遵守令牌、Collapsible和单异步状态所有者。
## 6. 全量数据与组合备份
| 数据类别 | 权威与恢复方法 | 必须对账 |
|---|---|---|
| 用户、项目、成员/权限、会话/消息、文档/版本、卡片/Surface、设置、插件授权 | PG团队库或个人SQLite;包含全部已启用插件/下游的自有存储 | 主键、owner、权限、版本、关键内容摘要;禁止以空库替代 |
| run/step/命令/通知/审批/取消/额度/恢复hold | 持久账本与状态事务 | 链接、唯一请求、gate版本、owner/epoch、队列位置与外部receipt |
| 上传、工件、文档大内容、输入附件、转录、派生请求 | 持久对象/文件目录,与DB清单匹配 | 内容hash、尺寸、引用版本、权限与可读性 |
| 执行工作区、overlay/checkpoint、任务Git现场 | 受管workspace与副作用记录 | 实际修改、基准SHA、未提交文件、执行者退出与恢复边界 |
| 程序、Web资产、插件版本、实例配置、秘密引用/密钥 | 不可变组合manifest;受限配置/秘密备份 | 摘要、schema兼容、插件签名/授权、恢复凭据可用且未泄漏 |
| 检索/向量索引、Redis缓存、临时PID/连接 | 从权威数据重建;PID按新boot重新观察 | 模型/维度/generation;不作为任务成功、审批或永久幂等权威 |
普通启停不从备份还原;数据库与文件继续使用同一身份及位置。灾难恢复由显式受管入口在新目标进行,禁止start自动覆盖当前数据。
当前 agent backup 只复制 svc.env、history 和 data(逐 SQLite 一致性导出),不含权威 manifest,在线非 DB 文件与 DB 没有统一快照时点;它是数据目录快照,不是完整恢复包。当前 pg_dump 默认在 runtime 子目录,完整包及副本须放在数据/runtime 生命周期之外;生成时使用受限临时目录,校验成功后原子发布完成标记。半成品不列作恢复点,完成且验证的新备份存在前不执行保留策略删除。
首期备份取得明确停写窗口:关闭准入、排空或隔离在途操作、停止全部相关写者,核对独占管理边界后备份DB及文件并生成manifest。共享PG不能仅停一个API实例便宣称一致;写者无法证明停止则阻塞此类快照。后续可用不可变对象、DB发布记录、物理基础备份+连续WAL/PITR建立在线恢复点,manifest关联source snapshot、时间/LSN、schema、源码/制品/插件组合和对象版本。
恢复到新目标首先处于隔离验证模式,不启动任务调度/副作用,也不自动连接生产外部写目标。正式切换须证明旧实例、worker、sidecar、工具子进程及已发请求的写路径已经隔离:可采用停止并验证、资源侧拒绝旧执行代次、专用执行凭据失效或网络写路径隔离;不得为此擅自轮换共享凭据。生成新的恢复权威代次,并保证实际写目标能够拒绝旧路径。两个独立恢复库各自认可的epoch不能互相围栏;旧实例不可联系不能当作停止证明。无法核实则保持副作用hold,只开放受权的数据核验。
同时对账恢复点至故障/隔离完成期间的外部效果:它们可能已执行却不在恢复后的账本里。结合独立receipt、目标日志或人工核对,将已确认动作登记到恢复账本,确认安全后逐项解锁;不能仅扫描备份里的started记录就自动重试。灾难档报告批准RPO内可能丢失的写入范围、恢复点内完整性与外部对账结果。
灾难恢复另设安全状态门禁:开放正常认证前作废备份中的全部会话和未使用登录 Key,防止已注销/消费的凭据复活。恢复点后的改密、长期 Key 撤销、角色/成员/插件授权变更与独立受信记录核对;缺记录或无法证明当前有效性时,相关主体/资源保持鉴权隔离,有权 owner/运维重新建立凭据或确认授权后开放。新执行 epoch 不代替认证撤销。普通启停/更新不执行此规则;普通账户恢复保留集成 Key 的合同也不允许灾难恢复盲目启用旧 Key。
PG逻辑pg_dump用于独立逻辑恢复;PITR须有物理基础备份和连续WAL,不能用pg_dump冒充其基础备份,依据[PostgreSQL备份与PITR](https://www.postgresql.org/docs/current/continuous-archiving.html)。SQLite使用现有一致性备份接口,不能在线只复制.db遗漏WAL。文件内容先耐久发布再提交DB引用,备份保留覆盖恢复点所需的对象版本。
备份副本及密钥与原数据同级保护:加密、专用受限目录/角色、异机或异故障域副本、保留期限与清理owner;密钥须独立可恢复。拟定每日日常备份、持续WAL、每月及重大升级前恢复演练,频率按批准的RPO与数据量固定。实际恢复须验证登录、跨项目隔离、历史文档与附件、任务/HITL、工件下载和插件业务链;恢复时间从故障触发开始计时。
部署先构建并检查完整候选目录,再切固定组合;失败仅在schema/插件/配置向后兼容时回退程序。数据回退须对账回退点后已接受业务和外部效果,不能“恢复旧库”而静默丢失新写入。
## 7. 实施增量与依赖
以下U-ID属于本案,与协作存储案的同名U-ID独立。每个增量完成设计细化、自检、正式验收与Review后按policy/delivery.md人工评审;本次不授权实施。新增文件名是建议,最终按实际模块边界落位。
### U1. 实例与数据恢复身份
当前 manifest/DB identity 基础已在源码,既有合同见 Dev `docs/recovery/u1-identity-manifest.md`;本轮只规划消费缺口、派生修复和显式 init/restore,不重复建立身份层。
对应R2/R3/R9;无前置。范围:`scripts/svc.sh`、`docs/svc.md`、`tests/test_svc.py`、`tests/test_svc_precheck.py`及新增manifest/identity验证模块。
做完整配置、逐字段覆盖、原子revision与操作锁、稳定秘密引用、DB/数据目录身份marker、独立init/restore入口;保留现有dbref修复并提供旧登记一次性兼容迁移。先补现状刻画回归,再改解析器。
验收:连续两次裸启停保持同一DB与原始记录;只改端口保持data/plugins;单独data覆盖按合同生效/拒绝;配置迁移每个写边界kill后只能读到完整旧/新版;缺凭据、错DB、丢marker不得新建空系统;更换二进制路径/程序版本或以不同cwd调用svc后,DB identity、数据/工件/工作区根与插件组合保持一致(对应R2更换程序/cwd条款)。使用真实PG特有测试记录核对,桩测试只能辅助。
### U2. 服务组与进程监管
当前 recover/watchdog/desired 已有首切片,余量为服务组、依赖 readiness、唯一监管与完整操作恢复,不再记为全部未实现。
对应R1/R8;依赖U1。范围:svc组编排、可选Redis适配、分发仓`deploy/agent-system.service`及安装接线、新增隔离服务组故障测试。
按KTD3/KTD4建立依赖图、desired state、可恢复lifecycle operation与单一监管;加入boot/start/exe身份与进程组校验。必需/可选、受管/外部资源由manifest决定。首次切监管在明确停机窗口完成,失败回到原监管且不形成双启动。
验收:全组停止后启动;先PG后应用;主动stop保持停止;kill自动退避恢复;主机重启按策略恢复;PID复用、残留子进程、端口冲突、依赖启动失败、不透明外部DB均正确拒绝/报告;不得停止其他服务组的共享依赖。
### U3. 应用启动、停机与真实就绪
对应R1/R8/R10;依赖U1,可与U2并行。范围:`modules/backend/internal/app/app.go`、`runmgr/runmgr.go`、`runmgr/events.go`、`plugins/host_v2.go`、server健康接口及其生命周期测试。
统一lifecycle context、准入开关、消费者停止与worker join;恢复执行移到装配结束;不同停机原因统一条件结算;sidecar受监督并纳入收口;readiness、恢复摘要和受限诊断按KTD12实现。停机预算属预算来源变更:现状HTTP停机超时仅5秒且超时即返回、跳过后续事件清冲(app.go停机序列,SELF源码核验);“应用30秒/监管60秒”须显式替换该常量并按最长合法步骤与故障实测校准,不得沿用旧值。
验收:插件/预算/Workflow未装好不启动恢复任务;停机同时提交新run被拒;SSE与慢工具不跳过flush/清理;子run不被cancelled覆盖;sidecar崩溃可检测;DB坏/恢复扫描失败不ready;hold不影响无关会话的正常读写。
### U4. 持久任务恢复与副作用隔离
对应R4/R5/R7;依赖U3,并复用U5所有权接口;U4/U5作为同一安全交付批次,完整性验收前不开放自动续跑。范围:runmgr/runtime工具入口、store运行/恢复/hold表、checkpoint适配、Core公开状态及Frontend兼容、对应恢复与真实工具替身测试。
落实KTD7/KTD8,主run、Workflow、子代理、已配置后台executor共享恢复政策;持久化步骤/输入/结果/operation;自动hold连接到工具与启动扫描。HITL保持gate、答案和权限;修复子代理恢复链唯一性。文件checkpoint仅承担其明确的文件修改范围;若新增recovering/hold为公开状态,设计阶段先交付Core枚举→Backend→Frontend及下游契约的最小状态映射表,作为设计评审前提。
Frontend 接线复用任务/对话卡和系统管理区:有权 owner/admin 查看具体 operation、未知原因和证据引用,提交已完成 receipt、未执行终态及旧请求隔离证明,或明确放弃。提交防重复,失败保留输入与原因,成功重载权威状态;Backend 按 operation 权限/版本/epoch 裁决,不以当前整 run release API 代替逐项对账。浏览器验收覆盖发现 hold→对账→剩余步骤恢复,拒绝越权和「放行即重跑」,不新增页面。
验收:排队/主run/子run/HITL/索引各类任务kill并两次恢复;工具“完成外部动作、结果未提交”只hold不重做;查询暂未发现但外部请求稍后完成时不发送第二次请求;幂等目标使用同operation key;Native pending intent只由统一账本决策,不生成普通错误后绕过hold;确认一个operation完成后执行剩余必要步骤,不假结算整run;未知工具默认隔离;撤权后禁止续跑;无executor类型明确blocked。真实模型最小任务级恢复对照单独申请测试资源,未跑标NOT_RUN。
### U5. 所有权、额度、命令、通知与投影闭环
对应R4/R5/R6/R10;依赖U3;与U4共同验收。范围:`store/execution.go`、`store/admission.go`、`runmgr/admission.go`、`runmgr/commands.go`、server取消/HITL、notice、surfacesvc与PG集成/多进程故障测试。
续租及失权取消覆盖全部入口;持久队列/额度对账与共享唤醒;命令lease+处理后ACK;notice事务消费;Surface成功后ACK且持续批量drain。租约到期后的外部不确定行为仍进入U4 hold。
验收:占满额度kill后新工作可前进;长run跨租期不失权;旧owner晚到状态/事件/工件被拒;claim后kill命令可重领;取消正确解析conversation并不越权;HITL答案一次生效;notice及子代理并发恢复只建一个后继;超过100条投影事件全部处理,发送失败不清pending。两真实进程与真实PG是必要证据。
### U6. 文件发布、组合备份与部署回退
对应R3/R7/R9;依赖U1/U3,恢复账本完整验收依赖U4/U5。范围:blobstore/content、workspace与checkpoint、插件恢复适配合同、svc deploy/update/backup、分发仓安装、备份manifest与restore测试。
按KTD11发布不可变版本,扫描缺失/孤立对象;登记全部插件/下游存储;按第6节生成一致恢复点、保护副本、恢复到新目标;候选完整构建后切版本,保留兼容上一组合。
验收:对象写后DB提交前kill;覆盖发布过程中kill;日志尾截断/文件缺失保留现场;备份恢复后原文hash/权限/插件链一致;恢复新目标后旧实例复活仍不能产生外部效果,未完成旧写路径隔离时新目标不调度;恢复点后已发生的外部效果对账完成前保持hold;升级ready失败可在兼容条件下回退;不兼容schema拒绝程序自动回退;数据回退不静默丢新写入。
另覆盖恢复点后注销会话、消费/撤销登录 Key、撤销集成 Key、改密与撤回角色/项目/插件权限:恢复旧包后旧会话和登录 Key 不再有效,无法证明有效的长期 Key/授权保持隔离;owner 正常确认后的新凭据可用。与普通重启原密码保持分别签收。
### U7. 故障验收与交付放行
对应全部需求;依赖U1–U6。范围:Dev新增隔离`tests/integration/recovery/`、故障注入控制点、运行手册与需求证据表。
固定Dev/全部组件、运行制品与配置摘要;使用脱敏数据、独立端口/PG库/文件根及工具目标;记录故障点和恢复统计。先执行小规模逐点故障,再在批准规模混合运行。破坏性kill/断电测试只能在隔离环境实施。
验收:第8节每类故障均有可重放证据;RPO=0档已确认数据零遗漏,灾难档恢复点差距≤批准RPO且点内数据零遗漏、点后缺失和外部效果明确对账;零未识别重复副作用、零越权/双有效写者;时间满足批准指标;用户实际刷新、重连、登录、任务/HITL、文档和工件链通过。服务恢复与数据/任务恢复分别签收。
建议交付批次:A=U1/U2/U3(可靠启动及安全停机,自动任务续跑关闭);B=U4/U5(安全自动续跑与命令闭环);C=U6/U7(文件耐久性、灾难恢复及全系统签收)。只交付A不能宣称完成用户的全部需求。
### U8. SQLite 活动服务隔离与既有存储门禁
覆盖 R2/R3/R6/R11/R12,复用 U1 身份;近期优先于自动恢复和共享库测试。范围:Backend `internal/app/app.go`、`internal/store/store.go`、`internal/store/system_identity.go`、新增 `internal/instanceguard/`(拟定);Dev `scripts/svc.sh`、`docs/svc.md`。锁只控制活动服务运行时,CLI 身份/schema 合同由[账户方案](2026-10-12-svc-unified-deploy-and-login-key.md) U7 负责。负责人待实施批准时指定。
依赖:既有 U1;联合确认 service/CLI/migration 模式,先刻画原例和别名冲突,再实现;不直接把当前 dev 数据迁往 PG。
测试:新增 Backend `internal/instanceguard/guard_test.go`,扩展 `internal/store/system_identity_test.go`;Dev 新增 `tests/test_svc_storage_ownership.py`,复用 `tests/test_svc_identity.py`。新增路径为计划。
T8-1:两个独立进程同时启动同 SQLite,只有一个进入迁移/恢复;第二个明确拒绝,第一个 run/HITL 不变。
T8-2:直接二进制、legacy、符号链接和可构造的文件别名不能绕过;真实 DB 替换/锁根丢失被识别。
T8-3:活动服务 SIGKILL 后合法同实例可重启,OS 释放锁;主动停止不被 watchdog 错拉起。
T8-4:服务运行期间合法账户 CLI 可提交短事务;错实例/缺库拒绝、不建目录、不 migrate;迁移不与活动服务并发。
T8-5:更换端口、cwd、程序版本保持同一资源;测试候选默认独立根,显式指定共享根也不得绕过保护。
T8-6:参数来自应用实际连接;SQLite FULL/PG 同步设置按批准合同核验,磁盘满/写失败不返回成功。
环境:独立 SQLite 根与端口、真实 PG 独立库回归;双进程和 kill 禁止在当前 dev/candidate 执行。全部 T8 当前 NOT_RUN。
近期批次 A0=U8+账户方案 U7/U5:先稳定数据归属和账户链路;另行授权后完成 dev 原账户正常登录/重启/更新验收,见账户方案 §7。A/B/C 保留;U4/U5 联合验收后才开放自动续跑,A0 不代替全量恢复。
## 8. 验证合同
| 故障/操作 | 最小判据 | 对应需求 |
|---|---|---|
| `svc stop/start`连续两次、restart、地址与版本变更 | 原DB identity、记录/权限、data/plugins/artifacts根和固定组合一致 | R1/R2/R3 |
| SQLite 双进程、直接启动、别名、锁释放 | 第二活动服务在迁移/run对账前拒绝;合法 CLI 可用;kill 后同实例可重启 | R2/R6/R11 |
| 实际 DB 耐久档、权威文件发布点、磁盘满 | 参数来自应用连接;确认结果已耐久;失败不发布成功;旧版本可读 | R3/R7/R12 |
| 应用SIGTERM/SIGKILL/OOM | 持久数据完整;安全工作可恢复;额度无永久占用;无残留写者 | R3/R4/R6/R8 |
| PG停止/重启、断连或提交响应丢失 | 不切SQLite;不假接受;按幂等记录对账;重连后可用 | R2/R3/R5 |
| 主动stop与异常退出、监管/编排中途kill | 主动停止不拉起;异常按running意图恢复;操作重复安全 | R1/R2/R8 |
| PID复用、重复启动、旧进程冻结后复活 | 不误杀其他进程;一个有效owner;旧epoch无发布/副作用权限 | R1/R5/R6 |
| 排队、HITL、跨实例取消、子代理/notice恢复中途kill | 接受意图不丢;审批一次生效;后继run/消息不重复 | R4/R5/R6 |
| 外部效果完成而结果未落库、旧请求延迟完成 | 自动hold、有receipt对账和权限检查;暂未发现结果不触发非幂等重试;动作结算后继续未完成步骤 | R4/R5 |
| 文件rename/发布边界kill、磁盘满、文件/日志截断 | 不确认未耐久结果;原发布版本一致;损坏可定位、原件保留 | R3/R7 |
| 插件sidecar退出、插件存储缺失、索引重建失败 | 必需失败不ready;可选明确降级;数据与授权保留 | R1/R3/R7/R8 |
| SSE断开/页面刷新、>100待投影、投递持续失败 | cursor补齐持久事件;旧事件丢弃;失败记录不被ACK | R4/R7/R10 |
| 主机重启/断电 | 原数据盘恢复、全部期望服务重新就绪、耐久性指标有真实证据 | R1/R3/R7/R8 |
| 完整备份在新目标恢复、旧实例复活、升级失败/回退 | DB+文件+秘密/版本匹配;旧写路径隔离;恢复点后外部效果对账;灾难档满足批准RPO;权限与业务链可用;回退兼容且不静默丢新写入 | R3/R5/R6/R9/R10 |
验证分层:svc治理桩回归→Backend单元/SQLite→真实PG及多进程→真实工具替身故障链→少量真实模型→真实浏览器与主机级故障→灾难恢复。每层证明不同合同,不相互替代。
执行时使用项目已有`make test-governance`、`make test-backend-pg`、`make test`、`make build`并增加受管隔离recovery入口。真实PG/Redis/模型/主机测试缺环境时必须明确NOT_RUN或SKIP及缺项,禁止把零用例或条件跳过当通过。按AGENTS要求验收/请求审核/合入前分别task-sync;所有precheck、同步、测试原始输出通过make evidence进入任务卡,并区分SELF/REPLAY/GATE。业务行为面的真实模型验证遵循policy/delivery.md,单测不替代。
本轮只进行源码与文档检查,业务/数据库身份查询、故障注入、模型试验、迁移、服务启停、部署均NOT_RUN。方案r2不能作为恢复能力验收结论。
## 9. 兼容、在途任务与批准事项
本案补充[多人协作存储与分布式演进方案](2026-10-11-collaboration-storage-and-distribution.md)的R7及恢复/运维合同;不覆盖其批准记录或迁移、多实例放行条件。已存在的执行所有权、命令、outbox实现以当前代码为基础继续,不另起重复模块。
原 r2 的 svc-autorecover 二选一属于历史启动现场;当前 recover/watchdog 和 U1 身份已有源码,不再要求重新启动同一基础任务。新实施前仍核对在途 svc 监管/RDM UI/端口回收任务,避免重复修改入口。RDM/插件只有纳入兼容与恢复清单并验收后才能覆盖「所有数据」承诺。
备选:仅修svc脚本成本较小,只能覆盖启动配置/进程,无法满足在途任务和副作用恢复;另造常驻恢复daemon会增加新的监管者与恢复责任,首期无需。推荐现有svc+系统监管+Backend恢复协调的职责划分。
实施批准时需要固定:目标实例/服务组及独占管理权、实际数据归属清单、故障档与RPO/RTO、正常停机预算、既有在途任务分工。本文已给默认建议;没有这些确认不在共享运行环境做故障/迁移/监管切换。后台是否自动重做模型回合可按任务政策配置,但未知副作用不得靠默认重试放行。
r3 编制期的历史下一任务建议(不是当前批准状态)为 U8 与账户方案 U7/U5 的首批设计/实施评审:先保护 dev 原数据,补足账户一致性与登录语义;随后 U3 停机/就绪、U4/U5 任务恢复、U6/U7 文件与灾难演练。新增 U8 未批准前不实施。数据清单、故障档预算、正式组合验证仍为放行条件;PG 迁移、监管切换、备份恢复、部署和故障实验分别授权。
## 10. 全系统完成条件
只有在所有启用的必需服务/插件被纳入清单、R1–R12均有当前组合与运行对象的重放证据、第8节故障矩阵通过、未知副作用有可处理隔离状态、组合备份实际恢复成功、人工验收及代码Review通过并完成合入/部署后,才可声明“系统停止或异常终止后能够恢复所有服务和数据”。
编制期历史交付状态止于**待审核方案**;当前批准与进展见页首及第 11 节。批准不等于全系统恢复已验收,不以记录、源码能力、桩测试、健康接口或本地文档检查代替上述完成条件。
## 11. D1/D2/D3 部署根治补充(r3.1)
编号 D1/D2/D3 只属于本补充,避免与本案 U1–U8 重名。已合入且不再重做:Dev #474(按实例重置身份变量、停旧前候选门禁、update 走 manifest 迁移、普通启动只验证)、Backend #180(`pkg/identity`)、RDM #276(identity 子命令与未知位置参数退出)、Dev #477(backend pin 到含 #180 的 `acabb85`)。
### 11.1 现场快照与 rdmcand 数据归属(SELF,2026-10-12T13:39:21Z)
快照目录(在线 `sqlite3 .backup` / RDM `VACUUM INTO`,未停服务):
- `runtime-backups/{dev,rdm1,rdmcand}/20261012T133921Z`
- `runtime-backups/{dev,rdm1,rdmcand}/domain-20261012T133921Z`
只读核对副本,未移动任何业务数据。rdmcand 在 `2026-10-12T06:51:14Z`–`10:02:40Z` 使用 `runtime/dev/data`。该窗口内:
- dev 库的会话、消息、事件均不落在窗口内。最后一条消息时间 `06:50:43Z`,早于 rdmcand 挂上该目录。会话与用户属于 dev(owner `weichen`、`genui-smoke`)。
- 窗口内仅有 13 条 `command_audit`,全部是 `rdm.inspect.*`,owner `weichen`,没有领域事件。
- 三份 `rdm.db` 的 `events` 均为 0。dev 的领域库更大(含权限表,schema_version=6),rdm1/rdmcand 的领域库只有字典与 schema 行。
- rdm1/rdmcand 的 `agent-system.db` 只有 `2026-10-12T13:19:47Z` / `13:20:12Z` 由候选门禁写入的身份行,没有业务行。
处置(未执行,需逐项授权):不把 dev 的会话或领域库迁到 rdmcand。没有一份应属于 rdmcand 的历史领域数据需要回迁,因此不触发身份 `adopt` 重审。rdm1/rdmcand 当前库是空壳加已建立的身份行。
### 11.2 D1 身份流程收尾
对应 U1 的消费缺口。完成条件:
- 身份 CLI 只打开既有库:不建文件、不建目录、不迁移。`agent_system_identity` 表(v27 起,列冻结为 instance_id/dbref/schema_version/created_at)缺失则拒绝并提示受控迁移。比本二进制更旧或更新的 schema,只要该表仍在,verify 仍可读。
- verify 输出带 `schema_version`。DSN 走 `AGENT_SYSTEM_DSN` 或权限恰好 0600 的 `--dsn-file`;`--dsn` 保留并告警。
- 能力文档一份 JSON,经 `version --json` 与 `identity capabilities` 输出。探测只跑 `version --json`,在空目录、清空环境、超时内执行。非 JSON 视为无能力。
- 顶层未知子命令 exit 2,不以 `-` 开头才拦截,避免落入 serve。
- manifest `identity.db_marker`:`fresh` | `pending` | `established`。新实例首次部署目标目录必须为空,启动建库后 ensure 变为 established。领养时有能力且库已存在则 ensure,否则 pending。pending 只在库文件存在时补齐,不迁移。established 缺行或不匹配时,start/restart/deploy/update/recover/init 全部拒绝;唯一修复入口是显式 `adopt --confirm <instance_id>`,并先打印库大小、关键表行数和最近写入时间。
- `svc_lifecycle` 是 start/restart/deploy/update/recover 的共同入口。update 与 recover 逐服务以 `env -i` 启动子进程,不传入 `AGENT_SYSTEM_*`。serve 使用显式环境,并写入 0600 的 `serve.env` 供裸启动与 recover 复用。
### 11.3 D2 切换事务
对应 U6 的部署回退。制品进入 `runtime/<name>/releases/<rid>/`,`current` 用临时符号链接加 `mv -T` 切换。`bin`/`plugins`/`htdocs` 改为指向 `current/` 的稳定链接。切换日志 `deploy-journal.json`(0600)先写 phase 再执行。失败回到上一版本并恢复原期望运行态,不覆盖业务库。schema 不兼容时在停旧服务前拒绝。前进迁移必须 `deploy --migrate-schema --confirm <instance_id>` 且先 backup,日志标记 forward-only。能力文档增加 `schema.target` 与 `schema.compatFloor`;每条迁移登记是否破坏旧版读取,漏登记则测试失败。
### 11.4 D3 真实组合门禁
对应 U7 的故障验收入口,范围限于部署生命周期。Dev 用 `tests/integration/lifecycle/rdm.pin` 固定 RDM SHA(当前、上一版、无 identity 的旧版)。CI test-pg 按 pin 取固定 SHA,白名单加入 RDM 及其 pins。`make test-lifecycle` 缺 PG、源码或制品即失败,不静默跳过。桩测试不能代替该门禁。RDM 登录入口与账户 CLI 的 DSN 退出命令行依赖账户方案 U7/U5;未就绪的项保持 NOT_RUN,D3 不得标完成。
### 11.5 验收
缺一项则对应增量保持未完成:双向混合批次身份不串用;无 manifest 时 deploy/update/recover 一致;无能力、缺行、不匹配在停旧前拒绝且不建库;两次裸重启及换端口、换版本、换目录后身份不变;构建失败、启动即退、健康超时、工作台失败可回滚;切换中断后登记与制品一致;真实 PG 绑定与多实例检查通过且凭据不进命令行、日志和证据;RDM 页面、登录、领域命令和原有数据可验证,不能只看 HTTP 200。
@@ -0,0 +1,291 @@
---
title: svc 统一部署与一次性登录 Key 方案
type: feature
date: 2026-10-12
artifact_contract: ce-unified-plan/v1
execution: code
product_contract_source: ce-plan-bootstrap
---
# svc 统一部署与一次性登录 Key 方案 r3
确认状态:**r1 原批准保留;r2 新增(R13–R15、KTD11–KTD14、U7)的 2026-10-12 批准记录保留;r3 登录恢复实施记录待人工评审**。r2 的批准来自原状态任务 Documents #89(来源提交 `b8df6f3c2a3180b06c61d2303bbfea9a3914f186`),不由 #87 的合入推定。2026-10-14 用户已明确授权智能体接管 Dev #489/#488/#486,继续验证、试行、合入及清理;本轮全部合入由智能体执行,不扩展到部署、共享数据库或其他未纳入任务。
U7 进展(历史记录,2026-10-12,未合入):Backend #185 与 Dev #486 的旧候选曾记录 CI success,来源为旧任务记录,不能放行本轮候选。原 U7/U8 候选都占用迁移 28;本轮须同步后按当前主干已用版本顺延,保留主干已有迁移与账户保护。账户 U5 的登录恢复接线见 r3 与 §11;账户 U8 消费审计按其独立范围推进,不由 U7 批准代签。
修订记录:r1=2026-10-12 草案经源码复核后定稿(四项取舍采纳;补齐 §6 合同;对齐恢复方案 KTD 与已合入的 recovery U1 实例身份);同日获批并进入推送与 U1/U4 实施。
r2=同日复核 dev 登录故障、当前 U1/U4 源码和帮助缺口;保留 R1–R12、KTD1–KTD10、U1–U6 的含义与编号,补充 R13–R15、KTD11–KTD14、U7/U8,并细化 U5。保留原 r2 批准记录,不以该批准代签其他新增范围。
r3=2026-10-13 用户提交《登录流程方案》并指示「按此方案实施」——该指示即登录恢复范围的实施批准;当日实施合入(Backend #187、Frontend #76、Dev #504),合同定稿于 Dev `docs/svc-deploy/2026-10-13-login-recovery-contract.md`,实施记录见 §11。r3 为实施记录与三裁定回写,不改动 R/KTD/U 编号语义。
需求来源:2026-10-12 用户提出将 `svc.sh` 增强为统一部署入口(二进制与源码、环境准备、无初始密码开户与账户恢复),并要求一次性 API Key 只能兑换「设置密码」受限会话。负责人:weichen;编制:Cursor Agent。
主记录:本文;任务卡:Dev `.task/feature-svc-unified-deploy-login-key.md`。源码路径以 Dev 根目录为基准。
## 1. 目标与成功边界
**目标:在干净或既有机器上,用同一套 `svc` 入口完成二进制或源码部署、按档准备依赖,并通过后端账户能力完成无初始密码开户与账户恢复;一次性登录 Key 只能兑换设密受限会话,完成设密前不能访问业务数据。**
必须区分三类能力:
| 能力 | 结果 | 非目标 |
|---|---|---|
| 统一安装 / 升级 | 指定版本或提交物化为可切换候选;切换后实例身份、DB、数据根与账户不变 | 不接管共享 PostgreSQL;不因发现端口而认领外部服务 |
| 环境检测与准备 | `doctor` 只报告;`env prepare` 按模式执行可幂等计划 | 不把任意发行版 Go/Node 标为可构建;工具链版本读自所选提交或发布清单 |
| 账户激活 / 恢复 | 无预设密码开户或签发恢复 Key;原子兑换 → 受限会话 → 设密 → 正常登录 | 不删除重建用户;不迁移业务归属;普通找回默认不撤销长期集成 Key |
与 [服务重启与全量数据恢复方案](2026-10-12-service-restart-data-recovery.md) 的关系:
- **复用** KTD1–5、KTD12:持久 manifest、唯一监管者、team=PG 且失败不回落 SQLite、readiness 与身份。
- **复用** 已合入的 recovery U1(Dev #415):`runtime/<name>/manifest.json`、启动身份校验、`svc init`、原子写路径(见 Dev `docs/recovery/u1-identity-manifest.md`)。
- **本方案新增**:部署来源统一(binary/source)、doctor/env prepare、账户生命周期与一次性登录 Key、安装入口与双轨收敛。
- 命名区分:**账户恢复 Key** ≠ **服务数据恢复**。
## 2. 当前事实及重点差距
本轮 source 基线(SELF):权威 Dev `2723e452440fc11022c0f6d916cd34cc4cd17335`;文档任务同步后 HEAD `26f2045e33516207959b5983acd32e1d3ea66bca`(增加任务元数据);Backend `5e8ada727c358438f8ff9f94eabb697e99fe28dc`;Frontend `cc233fec908d0f8c12193042942b94ad68508091`;Dev 固定 Documents `8d0810bd35f4934e0ad37fb96d7bab6d7a732473`。本轮 Documents 草案从其独立权威 main `1048e7c6afc2bb4efc541e68575c3fb2669ee332` 起步;与 Dev 固定版相比,两份目标方案正文没有上游差异。Dev gitlink 未推进。原 r1 基线只作历史,不用于当前能力判断。
2026-10-12 17:37:03(Asia/Shanghai)的只读运行观察和启动/同步命令,原始脱敏输出由 Dev `make evidence` 写入 `.task/feature-svc-account-durability-plan.md`。这是 SELF 观察,不是登录、故障或恢复验收,后者均 NOT_RUN。
最终同步基线为 Dev `d6d46fde6d903d0d8e37440d830fb5183d6ef5e9`:主干另已推进固定 Documents 至 `1048e7c6afc2bb4efc541e68575c3fb2669ee332`,并修复 svc 批量操作的 PIDCHECK/EXEC 等内存态串用;本轮未重复该修复,也未推进本轮 Documents 草案 gitlink。Backend/Frontend 固定 SHA 未变;上述初始基线和17:37观察保留历史时点,不冒充最终 HEAD。
| 对象 | 已存在的基础 | 尚需补齐 |
|---|---|---|
| 部署来源 | `deploy --from local\|dev\|release\|rdm`;dev/rdm 独立缓存物化;release 读本地 Releases 仓并校验 sha256 | 远程下载/离线导入;统一 `install`;release@ver 钉扎(现 `sort -V\|tail -1` 取最大版本,见 `scripts/svc.sh` `resolve_release`) |
| 部署生命周期 | 预检失败不停机;预检通过后 **先停再构建**;无程序备份/自动回滚 | 候选获取与校验全程不停旧服务;缺摘要硬失败;迁移后回退独立判断 |
| 实例身份 | recovery U1:manifest + marker + init;`svc.env` 派生 | 账户 CLI 必须绑定实例最终配置;缺绑定拒绝,禁止回落 `./data` |
| 环境 | 端口/`flock`/pg 工具链按需检查;文档列前提 | `doctor` / `env prepare`;无 `flock` 时不得放行冲突操作(现状直通) |
| 账户 CLI | Backend 已有 create/reset-password/list/issue-login-key/revoke-login-key/bootstrap-admin;svc 已接 `user` 且附加 OpenExisting | 顶层/专题帮助未列账户入口;OpenExisting 仍 migrate;账户路径未完整验证 DB identity;参数回显及 argv 凭据需整改 |
| 登录凭据 | 长期 `api_keys` 与独立 `login_keys` 已分离;一次性 Key 原子兑换为短期受限会话 | 原子开户+签发、统一密码变更及审计仍有缺口;不能把基础实现等同于整体验收 |
| 强制改密 | Backend 已有受限会话和 must-change 中间件,强制设密成功销毁会话并要求重新登录 | Frontend 仍只有密码/长期 Key 两个入口,未接兑换及 sessionScope/reloginRequired;设密后直接 onDone 与后端不兼容 |
| 安装双轨 | Dev `svc deploy` 多实例;Releases `install.sh` 系统 systemd | 统一部署计划;`install.sh` 薄封装或明确遗留 |
命题裁定(源码复核):
1. 长期 API Key 是 show-once plaintext,不是 single-use;一次性登录 Key 是独立类型,当前代码已区分。
2. r1 所记「无统一改密门」已被 U4 源码覆盖,不能继续作为待建能力;普通改密/管理员重置仍缺统一事务及旧恢复 Key 作废,见 `modules/backend/internal/server/accounts.go:208`、`modules/backend/internal/store/auth.go:244`。
3. `scripts/svc.sh:1503` 已实现 user 转发,但帮助未列;`modules/backend/internal/app/app.go:743` 的账户插入和 Key 签发分别提交,不能采信注释中的「同事务」。
### 2.1 dev 8788 事件与归因边界
用户明确故障对象为 dev(127.0.0.1:8788)。17:37 的实际进程打开 `runtime/dev/data/agent-system.db`,数据库 marker 为 dev 的 SQLite 身份;该现场没有使用 PostgreSQL,不能沿用旧报告的 pg1/agent 描述。
| 只读对象(北京时间) | 账户身份 | 最后设密时间 | 与 live 摘要比较 |
|---|---|---|---|
| 12:35:03 快照 | 与 live 用户 ID 相同 | 09:52:11 | 不同 |
| 14:50:37 快照 | 与 live 用户 ID 相同 | 09:52:11 | 不同 |
| 17:37 的 live | 同一账户,must-change=0 | 16:03:20 | 当前值 |
比较仅输出时间、状态及相等性,不输出摘要或凭据。它证明字段重写,不证明明文改变;随机盐使同一明文的重新散列也可能不同。未发现正常启动/更新/迁移 up/设置播种自动覆盖既有密码的路径;现有 audit_events 只有 Surface 事件,无法归因此次写入。另有已消费恢复 Key,但其消费时间不能证明之后哪次设密由它触发。
前一轮观察到 dev 与候选 rdmcand 指向同一数据根;17:37 候选处于停止,因此历史共享不写成该时点双进程事实。18:14:09 续查时,外部流程已将候选重新启动于独立的 `runtime/rdmcand/data/agent-system.db`,实际文件 inode 与 dev 不同,登记和制品版本相符;dev 最后设密时间仍为16:03:20。这缓解了当前共享现场,不能代替 Backend 防误用锁或完整验收。历史共享说明跨实例影响范围,不证明某次更新主动改密;本轮未执行这些现场变更。
本轮不进行真实账户登录尝试或再次重置来验证旧密码;故障重放仅在脱敏、独立数据副本上执行。首批完成还需另行授权的 dev 原账户正常登录验收,见 U5/U8 合同;该验收不在 live 进行 kill、并发或故障注入。历史操作者归因仍未证实,新增审计不能反向补造旧事件。
## 3. 需求合同
| ID | 范围 | 要求与可判定验收 |
|---|---|---|
| R1 | 安装入口 | `doctor` / `install` / 兼容 `--from` 生成同一部署计划;二进制无需 Go/Node;源码固定提交且子模块组合可核验 |
| R2 | 实例身份 | 启停、升级、开户、签发 Key 命中同一 store 与 data 根;缺失/不符拒绝;与恢复案 R2/manifest 一致 |
| R3 | 切换安全 | 构建/下载/摘要失败时旧服务继续;程序+插件+前端作为版本组合切换;固定版本不得被「最大版本」替代 |
| R4 | 存储档 | team 默认 PG+auth;`existing` / `managed-local` / `local(SQLite)` 显式选择;PG 失败不回落 SQLite |
| R5 | 开户 | 无初始密码;角色明确;创建与激活 Key 同事务;同名冲突不覆盖 |
| R6 | 账户恢复 | 精确命中既有账户;不改密码/不吊销会话/不改业务数据于签发时;保持 owner/角色/成员关系 |
| R7 | 一次性 Key | ≥256bit、只存摘要、activate\|recover、默认 TTL 30min、状态机、原子兑换、专用 POST body |
| R8 | 受限会话 | 仅身份查询、设密、退出;业务/下载/SSE/admin/插件拒绝;普通 `must_change` 同样服务端限制 |
| R9 | 设密事务 | 写 hash、清待激活/待改密、作废未用恢复凭据、失效相关会话同事务;成功后销毁受限会话并要求密码重新登录 |
| R10 | 集成 Key | 普通找回默认保留长期 API Key;失陷恢复显式 `--revoke-all-credentials` |
| R11 | 首次管理员 | 仅核验为新实例(无用户且无历史业务标记);事务防并发;不得因「未发现管理员」接管有数据环境 |
| R12 | 证据 | 验收绑定固定源码/制品摘要/环境;SELF/REPLAY/GATE 分源 |
| R13 | 可发现与兼容 | 完整/短帮助、help user、实例 user --help 和文档列出实际账户能力;不支持的制品在调用前拒绝;帮助/探测不建库、不迁移、不启动服务 |
| R14 | 账户稳定与审计 | 普通启停/更新不隐式重置;密码变更、恢复凭据/会话处理及成功审计原子提交;记录 actor、入口、实例、operation 与时间,不记录密码、摘要或 Key 明文 |
| R15 | 运维既有库 | 账户操作核验预期库和实例;读操作不建库或 migrate;schema 不兼容明确拒绝,迁移走独立入口;CLI 参数和日志不暴露凭据 |
## 4. 技术决策(KTD)
KTD1. **部署方式只决定程序来源,不决定数据位置。** binary ↔ source 可切换;切换保持 DB、数据根、账户与 instance_id。
KTD2. **账户规则只在 Go 后端。** 脚本调用实例对应版本的 CLI;不直接改用户表。
KTD3. **一次性登录凭据独立于长期 `api_keys`。** 专用表与兑换 API;普通 Bearer、SSE `?key=`、长期 Key 路径均拒绝。
KTD4. **受限会话为独立 scope。** 默认 10 分钟;allowlist 仅 me / 设密 / logout。
KTD5. **团队安装默认 PostgreSQL;存储选择显式。** 与恢复 KTD5、`config.Tier=team` 一致。
KTD6. **一次性 Key 默认 30 分钟**(可配置建议范围 5–120 分钟);审计记实际 TTL。
KTD7. **激活/恢复设密成功后必须重新密码登录**(销毁受限会话、清 cookie)。普通主动改密可保留「要求原密码」路径;激活路径不要求原密码。
KTD8. **普通账户恢复默认保留长期集成 Key;失陷显式撤销全部凭据。** 两种情况均保留业务数据。
KTD9. **候选校验完成前不停旧服务**;切换短窗;schema 迁移后能否自动回退旧程序另行判断,失败不自动用备份覆盖业务库。
KTD10. **双轨收敛到同一部署计划。** 新旧 CLI 同后端;Releases `install.sh` 变为薄封装或文档降级为遗留,禁止第三套生命周期。
KTD11. **能力声明与帮助同源,但后端仍是执行权威。** 新制品提供无副作用的结构化能力声明;旧制品仅按已验证版本兼容,未知形态拒绝。禁止尝试未知子命令或靠 strings 包含某词推断能力。保留 reset-password 的直接重置语义,不偷偷改成签发恢复 Key。
KTD12. **统一密码与开户事务。** 严格唯一 INSERT;散列计算在事务外,事务内重新核验权限/账户版本。主动改密、CLI/管理员重置、恢复设密共同执行密码+标志+旧登录 Key 作废+规定会话处理+审计。普通路径保留集成 Key,失陷模式按 KTD8 明确撤销;失败全部回滚。
首次管理员按实例串行,不能只依赖 owner UNIQUE:PG 锁定既有实例身份行,SQLite 使用立即事务,取得串行权后重新核验无用户、无历史业务;引导与能改变此前置条件的开户共用串行点。管理员、激活 Key 和审计共同提交;marker 缺失时由显式 init 处理,账户命令不得补建身份。
KTD13. **审计可归因,运维不隐式迁移。** 成功审计与变化同事务;失败记录注明未提交;HTTP actor 来自已认证会话,CLI 记录受信 OS 运维 UID/身份来源,不接受调用方填写的 actor 作为证明。实例身份和操作 ID 实填。既有库读命令只校验兼容性;迁移另行批准和执行。
KTD14. **凭据只经安全输入和单次交付。** 优先无回显输入/stdin/受保护文件,DSN 不传 argv。serve 已消费 AGENT_SYSTEM_DSN,账户 CLI 的等价安全输入需在 U7 显式接入并以能力声明核验,不能假定当前 user flags 已读取环境。非交互输出独占创建 0600 文件,日志/evidence 只记凭据 ID。提交后交付失败按 operation 查询,再撤销/重发;库存摘要不能重新打印旧明文,不把重试当首次创建。
## 5. 职责划分与接口示例
| 部分 | 负责 |
|---|---|
| `svc.sh` | doctor、env prepare、获取制品、构建、实例配置、生命周期、调用账户 CLI |
| 后端 CLI | 创建账户、签发/撤销一次性 Key、核验目标库、OpenExisting、操作审计 |
| 后端认证 | 原子消费 Key、受限会话、设密事务、中间件限制 |
| 登录页 | 输入一次性 Key、设密、过期/重发提示;遵循 `DESIGN.md` |
| 发布制品 | 版本、平台、摘要、组件版本、能力声明 |
拟新增 CLI(当前脚本尚不支持;兼容 `--from` 保留):
```bash
./svc.sh doctor --mode binary --tier team
./svc.sh install prod --mode binary --version <固定版本>
./svc.sh install prod --mode source --repo <仓库> --ref <固定提交>
./svc.sh prod deploy --mode binary --version <固定版本>
./svc.sh prod user create --owner alice --role user
./svc.sh prod user issue-login-key --owner alice --purpose recover
./svc.sh prod user list
./svc.sh prod user revoke-login-key --id <凭据编号>
```
Linux 服务账户与应用账户分开管理。
## 6. 规格合同(实施前必须写进 U1/U4,否则返工)
1. 独立凭据类型 + `POST` body 兑换 API。
2. 会话 scope / 中间件 allowlist;覆盖 `must_change` 普通首登。
3. 设密接口分型:受限会话不校验原密码;普通改密继续要求原密码;同事务完成写 hash / 清标志 / 作废 Key / 吊销会话。
4. 密码未设置状态:`password_hash` 可空或 sentinel;`VerifyLogin` 拒绝未设密;创建 = 用户行 + 激活 Key 同事务。
5. CLI `OpenExisting`:目录/DB 不存在则失败;账户运维默认只校验兼容 schema,不 migrate;迁移独立执行。配套 U1 v0.2 候选同此合同,原 requireCompatible 自动 migrate 是历史实现。
6. `release@<ver>` 必须解析到该版本目录;缺摘要硬失败。
7. 部署:获取/构建/校验不停旧服务;组合切换;迁移后回退独立判断。
8. `install` 与 `--from` 同一计划;双轨收敛(KTD10)。
9. 首次管理员仅新实例;事务防并发。
10. 凭据交付:交互 stdout 一次 / 非交互 `chmod 600` 文件;日志与 evidence 只记凭据 ID;随机密码路径首期可并存但默认无密码 + Key。
11. 无 `flock` 时拒绝冲突生命周期与账户操作(收紧现状「直通」)。
详细设计(正文在 Dev 仓,随本任务分支提交):
- U1:`docs/svc-deploy/u1-instance-account-binding.md`
- U4:`docs/svc-deploy/u4-one-time-login-key.md`
## 7. 增量与完成门槛
| 增量 | 主要范围 | 完成条件 |
|---|---|---|
| **U1** 实例—账户绑定补齐 | 账户 CLI 读实例 manifest;OpenExisting;锁缺失拒绝;install 骨架对接既有 identity | 开户/签发命中同一 store;错误 data/DSN 拒绝;与 recovery U1 字段对齐 |
| **U2** 二进制与源码来源 | 下载/离线导入、仓库物化、版本清单、候选先校验 | 无开发仓可部署;固定版本与摘要可核验;修复 release 钉扎 |
| **U3** 环境检测与准备 | 系统适配器、依赖计划、专用工具链、监管配置 | Ubuntu/Debian 首验;幂等;不接管共享服务;binary 不装 Go/Node |
| **U4** 一次性凭据与认证限制 | Backend CLI/Store/Server/迁移 | 原子开户/兑换/设密;受限会话无法调业务 API;并发兑换单胜 |
| **U5** 脚本与登录页接线 | 账户帮助、无副作用能力探测、凭据安全交付、Login/设密页 | 新建与恢复走通;设密后清受限会话并返回密码登录;不支持的产品明确拒绝;DESIGN.md |
| **U6** 组合与故障验收 | Dev 组合、发布包、真机、数据保护 | 两种部署 × 存储档;故障注入;浏览器 + 真机;治理回归 |
| **U7** 账户事务与稳定性补齐 | 原子开户/引导、统一改密与撤销、审计、只读兼容打开 | 并发建号不覆盖;中断无半状态;旧恢复 Key 失效;身份缺失不改库;升级保持登录能力 |
| **U8** 实例运维核验与凭据诊断 | 账户状态/事件查询、绑定和制品诊断;补齐 U1 身份消费 | 可定位合法变更来源、识别错库/失效会话/错误 Key 类型;只展示非秘密元信息 |
**当前 U1/U4 基础已在源码中,近期优先 U7 和 U5,并与恢复方案 U8 隔离保护协调。** U7 先冻结后端账户事务/审计及能力声明合同;U5 随后完成浏览器与脚本;U8 诊断复用其记录。U2/U3 保留后续,不让通用安装器阻塞 dev 账户稳定。各仓从共同批准基线起独立任务;Backend → Frontend → Dev 组合,正式组合验证后才推进 gitlink。
### U7 近期实施与验证合同
覆盖 R5/R6/R9/R10/R11/R14/R15;依赖既有 U1/U4,实施负责人待指定。
范围(相对于 Backend):`internal/store/auth.go`、`internal/store/login_keys.go`、`internal/store/platform.go`、`internal/app/app.go`、`internal/server/accounts.go`、`cmd/agent-system/main.go`;迁移目录仅在 schema 需要时改动。
先刻画现有显式改密、重置及建号行为,再修复并发与中断窗口。账户校验、禁止隐式 migrate、严格 INSERT 和统一密码事务是单一后端实现,脚本不直接写表。
现有测试参考 `internal/store/login_keys_test.go`、`internal/server/login_key_test.go`、`auth_e2e_test.go`;新增 `internal/store/account_lifecycle_test.go` 与真实 PG 跨进程用例(路径相对于 Backend)。
T7-1:两个独立进程同名开户,只有一个账户/激活 Key 成功,败者不改变胜者角色、密码和成员。
T7-2:开户、Key 签发、改密、会话处理、审计提交各故障点,最终只见完整旧态/新态;输出失败但提交未知时按 operation 查询。
T7-3:普通改密、临时重置、恢复设密后旧未用 Key 都不可兑换;长期集成 Key 按 R10 保留/撤销。
T7-4:读命令命中旧 schema、缺库、错 marker 均拒绝且不 DDL/建库;两个独立进程以不同 owner 并发首次引导单胜,另覆盖引导与普通开户竞争;有历史业务而无用户时拒绝。
T7-5:普通重启、两次更新、SIGTERM/SIGKILL 后测试账户原密码仍验证成功,账户权限及成员不变;不以摘要是否变化替代密码可用性。
执行环境:独立 SQLite 副本、真实 PostgreSQL 独立库、独立端口;不在当前 weichen 账户上故障注入。所有 T7 用例当前 NOT_RUN。
### U5/U8 近期接线与验证合同
U5 覆盖 R7/R8/R9/R13/R15,依赖 U7 对外字段合同;范围 `scripts/svc.sh`、`docs/svc.md`、Frontend `src/api.ts`、`src/auth.ts`、`src/components/LoginPage.tsx`、`src/App.tsx`。复用现有登录/设密页,类型明确消费 sessionScope、passwordSet、reloginRequired;恢复 Key 不写持久浏览器存储或 URL。
同一登录页保留默认账号密码入口,增加「激活/恢复 Key」入口并说明只用于设密;长期 API 密钥入口标清集成用途。错类型提示指向正确入口,切换清输入,更新初始密码旧说明,不新增独立恢复页面。
刷新/兑换响应不确定时先查询会话,有效受限会话恢复设密;会话不存在且 Key 已消费/过期时提示联系账户管理员重发,返回「激活/恢复 Key」入口。无密码账户不得被引导用旧密码登录。
测试参考 `tests/test_svc_user_binding.py`、Frontend `test/auth.test.ts`、`e2e/changepw-form.playwright.ts`;新增 Dev `tests/test_svc_user_help.py`、Frontend `e2e/login-key.playwright.ts`(计划文件)。
T5-1:完整/短/专题/实例帮助覆盖六个账户命令,并均无 DB/目录/服务副作用。
T5-2:旧产品和 RDM 不支持账户 CLI 时在执行前拒绝;stdout 单次交付,stderr/进程参数/history 无秘密;两类 Key 双向填错有正确引导且切换清输入。
T5-3:激活/恢复完成兑换→设密→重新密码登录;刷新/响应丢失先核会话;Key 已消费而会话失效时经管理员重发的新 Key 可以续办;过期、重复兑换、CSRF 错误有准确提示。
T5-4:受限会话无法访问业务/下载/SSE/admin/插件;设密成功后不得因直接 onDone 误放行。
U8 覆盖 R2/R14/R15,依赖 U7 审计;在 `user info`/账户事件查询(拟新增)展示实例、设密时间、凭据类型及状态。错误配置、注销、Key 失效与密码错误分别诊断,普通登录错误不泄漏他人账户信息。CLI/HTTP 两入口产生可追溯同一 operation 记录;历史无审计事件保持未知。
首批 dev 原账户闭环(NOT_RUN):实现及隔离验证通过后,另行确认运行验收窗口/实例/版本,由 owner 在浏览器输入已知密码,检查原 user ID、角色、成员及原数据访问。若确实不能登录,明确恢复授权后才签发恢复 Key,保持账户和业务归属;不能为验收先重置能用的密码。随后在授权窗口验证普通重启及两次受控更新后原账户仍可登录。密码不交给 Agent、不进入证据;本轮不操作 live。
### 必须覆盖的验收场景(摘要)
干净机器二进制安装;源码固定提交与子模块;两种部署互切后数据不变;构建/摘要/配置失败旧服务可用;PG 身份不符拒绝且不回落 SQLite;无密码开户且不覆盖既有;同 Key 并发兑换仅一次成功;受限会话拒业务/SSE/admin;消费后建会话失败与设密中途失败无半完成态;恢复前后业务与权限对账;SQLite 与真实 PG;治理回归;源码测试不代替浏览器与真机。
额外钉住:`release@v` 多版本不得装成更高版本;账户 CLI 不得回落默认 `./data`。
## 8. 一次性 Key 流程
```mermaid
flowchart LR
A["创建账户或签发恢复 Key"] --> B["输入一次性 Key"]
B --> C["后端原子消费"]
C --> D["仅允许设置密码的短期会话"]
D --> E["设置并确认新密码"]
E --> F["作废恢复凭据及相关旧会话"]
F --> G["使用新密码正常登录"]
```
凭据规则:独立前缀;只存摘要;用途 `activate`|`recover`;状态未使用/已消费/已撤销/已过期;密码变更后旧恢复凭据不可再用。符合 [OWASP Forgot Password](https://cheatsheetseries.owasp.org/cheatsheets/Forgot_Password_Cheat_Sheet.html) 与 [Session Management](https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html);保留现有 CSRF 校验。
## 9. r2 编制期历史记录:风险与当时未授权范围
本节与第 10 节保留 r2 编制时点的原始边界,不表述本轮当前状态。当前批准、接管与交付范围见页首及 Dev #486;登录恢复实施记录见第 11 节。历史 NOT_RUN 保持原对象范围,部署及共享数据库操作仍须另行授权。
- 编制时点的实施、故障注入、真机部署、浏览器验收:**未授权 / NOT_RUN**。
- 本轮交付终点:r2 本地草案、恢复配套修订、任务卡与索引、文档核查和审阅记录;以本地文档提交固定审阅对象并满足同步门禁。新增修订仍待批准,不推进 Dev gitlink、不推送/建 PR;启动/同步工具的任务元数据提交单独记录。
- 与 recovery U1 重叠处只做增量,不重做已合入的 manifest 层。
## 10. r2 编制期历史记录:规划进展与当时下一步
- r1 已批准;U1/U4 基础实现存在于当前固定源码,完整浏览器/故障/运行验收不可据此推断通过。r2 的新增需求和设计仍待人工评审。
- 首选下一任务(待授权):恢复方案 U8 的 SQLite 服务隔离+本案 U7 账户一致性;先消除共享测试数据和不可归因密码变化,再落实 U5。U2/U3 保持后续。
- 前置:审核新增 R13–R15、U7/U8 及 U5 更新,明确实现和隔离测试范围/owner;实现、测试、部署分别授权。Documents 与 Dev 文档草案位于各自独立工作区;正式组合、gitlink 推进与运行验收未执行。
## 11. r3 实施记录:登录恢复流程(2026-10-13)
授权:用户 2026-10-13「按此方案实施」(会话指示,覆盖登录恢复范围的实施与合入;
代码 Review 与 PR 合入按 Dev `policy/delivery.md` 由智能体执行)。
### 三项裁定(对 r2/U5 合同的分歧,用户按新方案裁定)
| 分歧 | r2 表述 | r3 裁定 |
|---|---|---|
| 登录页长期 API 密钥入口 | 保留并标注集成用途 | 移除日常登录入口;程序化客户端直接带 Authorization 头 |
| 管理员网页恢复方式 | 直接设置新密码 | 改为签发一次性登录 Key(旧 HTTP 端点兼容保留,仅前端 UI 下线) |
| must-change 首登会话 | full 会话 + 动态拦截 | 登录即建 `set_password_only` 受限会话,`me.sessionScope` 统一驱动设密门 |
### 已合入(2026-10-13)
- Backend #187(`f103540d`):迁移 v28(`users/sessions.auth_version` + `account_events` 审计);
管理员 `POST/GET /api/admin/users/{owner}/login-keys`、`DELETE .../login-keys/{id}`;
改密事务内复验会话与认证版本;登录会话创建绑定认证版本(竞态窗口关闭);
主动改密/管理员与 CLI 重置统一单事务;兑换入口按 IP 退避;TLS 下 Secure cookie。
- Frontend #76(`0655bc3`):登录页双入口(密码默认 + 一次性 Key,移除 `ask_`);
设密门免当前密码、成功后回登录页(消费 `reloginRequired`);刷新按 `sessionScope` 恢复门;
用户管理改签发/撤销 Key(明文仅一次)。
- Dev #504(`268ef29`):合同文档 + 组件 pin。
覆盖判定:R7/R8/R9 及 U5 的浏览器接线主体已实现;U7 的登录恢复事务部分已实现,
**原子开户/引导、CLI 凭据安全交付与 PG 锁串行仍未实施**,U7 不得据此记完成。
### 验收证据
- GATE:Dev #504 HEAD CI 三作业(test / test-pg / svc-realcombo)success;Backend #187 CI success。
test-pg 即真实 PostgreSQL 运行本任务 store 测试(含 100 并发兑换单胜、登录竞态)。
- SELF(收据,绑定 Dev HEAD `268ef29`):真实浏览器全流程验收 PASS——
`login-key.playwright.ts` + `changepw-form.playwright.ts` 于隔离 auth-on 实例
(`serve --data /tmp/lr-e2e-data --auth on`,二进制 backend=467718a+frontend=9fc7da2):
管理员签发 → 只输 Key 兑换 → 免旧密码设密 → 新密码登录进工作台 → 同 Key 重复兑换被拒。
收据 sha256:`be7ae9a2…`(验收)、`b3a9e691…`(终态)。用例文件待 Dev 工作区解封后入库。
### 遗留(另行任务与授权)
SSE 存量长连接断流通知;`e2e/login-key.playwright.ts` 入库与 Dev pin;U7 余量;
部署与 live 账户验收。详见合同文档「遗留项」。
@@ -0,0 +1,176 @@
---
title: 面向非专业用户的工作台整体界面重设计
revision: r0.2
status: approved-for-continuous-implementation
date: 2026-10-12
owner: weichen
scope: requirements-and-design
implementation: implemented
delivery: tracked-in-dev-task-record
project-record: persisted
---
# 工作台整体界面重设计 r0.2
用户在评审 r0.1 后明确授权“开始实施直到完成”。本稿 r0.2 保留已选设计,并通过本次独立任务连续实施、验证、Review 与合入。已有快慢通道执行方案的其他增量不由界面授权自动扩大。
## 1. 设计目标
让不懂命令、脚本、模型和代理的用户,通过表达目标、提供材料、查看结果、完成必要确认来推进工作。
默认界面回答三件事:现在在做什么,已经得到什么,下一步是否需要我处理。用户能够只用对话完成主要工作,也能在需要时展开工作摘要、阅读文件、核对依据。
用户明确要求:不要过于复杂;以辅助工作为中心;渐进、多层级展示;减少命令和脚本细节;大气、现代、简约、美观、易用。
本稿的场景假设:主要工作包括材料整理、分析比较、问题审查和文档生成,兼顾日常问答。业务领域的具体审批和发布入口按当前服务端能力提供。
## 2. 推荐形态与备选
推荐**渐进展开的三栏工作台**。左侧找项目与历史,中间通过对话推进工作,右侧按需处理工作或文件。普通问答默认收起右栏,复杂工作时提供概览;用户手动收起后不因普通更新反复打开。
| 形态 | 适用和取舍 | 本稿选择 |
|---|---|---|
| 渐进三栏 | 对话入口清晰,复杂任务可展开,文件有稳定位置 | 推荐 |
| 纯对话 | 学习成本低;长文件、并行工作和多次确认容易淹没在历史消息中 | 作为轻量状态 |
| 总览仪表盘 | 跨任务监控方便;默认要求用户理解更多指标和导航 | 仅在确有项目总览需求时另审 |
不单独建设快通道页、慢通道页或后台管理页。新增功能先判断能否放进现有对话、工作和文件入口。
## 3. 界面布局
**左栏:上下文。** 项目身份集中出现一次;新建对话、最近对话、搜索;文件和已启用的领域工作区放底部;账户与个人设置沉底。管理员操作只由管理员入口提供。
**中栏:推进工作。** 当前对话标题;用户的目标和材料;助手的结论、简短说明、必要动作;输入区上方一条工作状态。附件入口始终易找。权限设置保留清晰入口,展开说明其实际含义;初次使用采用现有默认值,不暗中扩大授权。
**右栏:工作 / 文件。** 工作按需要你处理、当前关注的工作、其他进行中或排队、新成果排列。完成历史收纳后仍可找回。文件负责列表、预览、编辑和下载;全屏阅读是同一个预览的放大。来源点击也进入同一预览对象,定位能力不足时说明定位范围。
左栏约 200–240,工作右栏约 320–420,中央弹性。正式落地继续消费已有拖拽宽度和文件阅读档规则。空间不足时先隐藏辅助栏;手机显示一个主视图,工作和文件按需打开,并有明确返回对话入口。
## 4. 渐进展示层级
| 层级 | 显示内容 | 打开方式 |
|---|---|---|
| L0 概览 | 后台工作数量、必要确认、新成果 | 一条状态行或小徽标 |
| L1 摘要 | 业务目标、真实状态、当前工作、最多 3 条重要发现、缺项、下一步 | 当前任务卡或对话锚点 |
| L2 依据与范围 | 阶段结果、来源、覆盖范围、未决问题和结论更正 | 原位置展开 |
| L3 执行记录 | 按工作阶段分组的动作、结果和有权限查看的诊断信息 | 明确点击执行记录 |
默认 L0/L1,不展开所有任务。必要确认、重要限制和失败影响不能藏在 L2/L3。L3 不是模型内部思考的展示入口,也不改变日志和来源的访问权限。
示例任务卡:
> 整理三份项目材料 · 进行中
> 正在核对:会议结论与需求说明
> 当前发现:上线时间出现两种说法;3 项需求缺少验收条件
> 待核查:评审意见中的补充要求
> 查看依据与范围
没有阶段成果时诚实显示“尚无阶段结论,正在读取材料”。以上业务发现是示例数据,当前 U1 骨架并不证明已经具备真实阶段发现发布能力。
## 5. 快慢通道的连续体验
用户界面主要使用“助手正在处理”“后台继续整理”等业务语言。快通道是当前对话回合,慢通道是后台工作,不是由用户选择的快慢速度档位。
| 时刻 | 用户看到的内容 | 表述边界 |
|---|---|---|
| 发消息或材料 | 接收结果、可先回答的内容、接下来处理的范围 | 已选文件不等于上传成功;解析不等于分析完成 |
| 任务登记或排队 | 同一工作对象显示已登记、排队中 | 登记成功才能说已登记;未开跑不能写进行中 |
| 工作进行中 | 当前工作、真实阶段结果、缺项 | 没有可信进度就不显示百分比或预计完成时间 |
| 用户继续输入 | 后台继续工作时可继续对话;前台忙时说明消息排队 | 发送不等于即时执行,不承诺已改变正在跑的任务 |
| 有新成果 | 更新原卡;重要结果提供一条对话通知 | 不逐条回投工具动作,不把所有任务复制成另一条聊天流 |
| 等待用户 | 操作、范围、影响和明确选择 | 等待、执行、生成、用户认可和正式发布分开 |
| 完成或失败 | 结论、最多 3 个要点、范围或缺项、文件和下一步 | 保存失败不得声称已交付;部分完成不能冒充完整结果 |
后台更新不切换用户正在读的文件,不抢焦点,不把历史阅读强行滚到底部。状态恢复期间保留最后已知内容并注明“正在重新连接,最新进展待确认”。
## 6. 按工作选择展示形式
统一骨架保持稳定,内容形态随任务改变。默认由工作目的决定,用户无需先学习或配置一种展示模式。
| 工作 | 默认成果形式 | 进一步展开 |
|---|---|---|
| 简单问答 | 一段结论,必要说明 | 依据与例子 |
| 材料整理 | 主要结论、问题和缺项 | 材料覆盖清单、来源 |
| 方案比较 | 一条建议、关键差异表 | 判断依据、取舍和适用条件 |
| 问题审查 | 按影响排列的问题清单 | 原文、影响、处理建议 |
| 文档生成 | 草稿文件、完成范围、需要评审的事项 | 文件预览与后续修订 |
| 多步骤流程 | 当前阶段、已完成阶段、必要动作 | 阶段结果与历史 |
| 用户确认 | 简明操作说明、影响、选择 | 参数与诊断详情 |
图表仅在数量、趋势或关系能帮助判断时使用;可理解的短表不升级成图表。生成式任务页面作为可选增强,关闭插件后仍能通过任务卡、文字和文件读到主要结果。领域审批不能成为所有基座任务的固定步骤。
## 7. 等待确认与异常
确认卡先写操作及影响,例如“依据三份材料新增 1 份项目草稿,保留原件,不对外发送”。涉及覆盖、发送、发布或权限变化时,关键对象和影响必须在默认层显示。避免只有“是否执行”而没有范围。
对话和右栏操作同一确认对象。提交中阻止重复提交;已处理同步更新;超时显示“正在核实处理结果”,查清后再允许后续动作。示例稿只演示本地状态同步,不证明服务端幂等和恢复。
异常表述使用“发生了什么 → 对结果的影响 → 用户可以做什么”。例:“评审意见未能读取;已整理另外两份材料,完整结论尚未生成;可补充清晰版本或先讨论已有结果”。错误代码、脚本与输出置于授权可读的详情。动作只按服务端当前能力显示;未核验的暂停、独立取消、续跑、自动重试不进入默认设计。
## 8. 视觉规则
沿用 DESIGN.md 和 @ui/tokens.css:灰白表面阶梯、单色反色主按钮、发丝边框、克制语义色;清晰的标题与正文层级;常用信息保持可读,不以缩小字号装下所有内容。
大气来自稳定分栏、整齐对齐、合理阅读行长和区块间距;简约来自减少同时出现的内容。没有营销式大标题、装饰渐变、速度表盘、满屏彩色卡片或默认工具日志。
字型走 --fs-ui-*,界面字号可调。状态同时有文字和形状。折叠消费 @ui Collapsible,动效只用 mk-* 并响应减少动效。交互稿复制固定 UI 令牌,实际使用当前 Collapsible 源码与 MotionKit,不新建颜色和动效体系。
## 9. 当前依据与依赖
本轮只读源码核对,来源 SELF;没有对生产或当前 dev 服务作功能验收。
| 对象 | 固定提交 | 核对点 |
|---|---|---|
| Dev | 4d362537d0e8755a03b1757b5bad92779a064b33 | DESIGN.md、policy/delivery.md、既有规划 |
| Frontend | 1edd872c554f666ba43353da7e6f0605ecec311b | Workbench.tsx、Conversation.tsx、Workspaces.tsx |
| Backend | acabb85e2ae970f834defae916c7539d0a47993d | spawnBackgroundOpts、CancelRun、createBackgroundCard、finishBackgroundCard |
| UI | 83e80f5648649c3cc070f4dbc6bf118996828ae8 | tokens.css、Collapsible.tsx、motion.css |
| Documents | 3cc6438030803b8e2355d2867766e9654203f265 | 快慢通道展示 r1.1 及 U1 实施计划 |
当前读到的源码已有三栏“工作 / 文件”、前台忙时输入排队、后台并行限制、排队工作、精炼卡片骨架以及失败 CardFailed 映射。这里只说明源码形状,不推断已部署与运行表现。
与既有方案衔接:`modules/documents/docs/proposals/2026-10-12-fast-slow-channel-display.md` 是快慢通道摘要与异步投影的已有主记录;本稿补充整体交互与各种成果形式,不另起一套状态或快照契约。U2/U3/U4 的真实阶段发现、持久恢复、确认闭环和窄屏完善继续以原记录及后续批准为准。
## 10. 实施需求
以下为本次界面实施与验收范围;实现消费真实已有能力,不伪造尚未发布的阶段发现。
| ID | 需求 | 优先级 | 可判定的验收方向 |
|---|---|---|---|
| UI01 | 对话能完成主要工作 | P0 | 关右栏仍能读摘要、核对依据、处理确认、打开成果 |
| UI02 | 普通问答保持轻量 | P0 | 无后台工作时不生成空任务卡和空进度条 |
| UI03 | 默认内容可支持下一步 | P0 | 用户能说明当前工作、结果范围、必要下一动作 |
| UI04 | 快慢通道连续展现 | P0 | 前后台并行、排队和完成状态归属正确且不重复刷屏 |
| UI05 | 四层渐进阅读 | P0 | 默认无命令日志,关键限制和确认不被折叠藏起 |
| UI06 | 成果按目的呈现 | P1 | 整理、比较、审查和生成各能支持对应工作判断 |
| UI07 | 状态与动作忠实 | P0 | 不伪造进度,不暴露未支持控制,不把失败显示成功 |
| UI08 | 同一文件同一预览 | P0 | 对话、来源、文件列表均进入同一预览位置 |
| UI09 | 确认结果一致 | P0 | 双入口、重复点击、超时未知和已处理均有一致表现 |
| UI10 | 阅读稳定 | P0 | 普通后台更新不抢焦点、换文件或改阅读位置 |
| UI11 | 窄屏和大字可用 | P0 | 320/390/736/1024/1440 及 18px 字号必要动作可达 |
| UI12 | 遵守设计系统 | P0 | 令牌、Collapsible、MotionKit、对比度守护符合规范 |
| UI13 | 能力与权限匹配 | P0 | 未启用领域入口不显示;摘要与来源不绕过访问控制 |
最终产品验收场景:三个附件无文字发送;前后台并行及排队;确认双入口;完整/部分/失败结果;查看来源与文件;刷新和断线;新对话;窄屏、大字、键盘及减少动效。r0.1 设计评审时,真实模型、真实后端和真实浏览器任务验收均为 NOT_RUN;实施期结果见第 13 节,示例交互稿不能代替验收。
## 11. 落地次序建议
1. **整体界面与文案。** 在既有三栏和 U1 上整理默认内容、必要操作和阅读路径。优先确定 UI01–UI03/UI05/UI08/UI12;不在此增量改变后台执行契约。
2. **动态工作摘要。** 接续既有快慢通道 U2/U3,在真实快照与检查点之上显示业务发现、范围和恢复状态;避免另外安排重复任务。
3. **成果形式与适配。** 衔接 U4,完成比较、审查、可选任务页面、窄屏和具体领域入口。先用结构化文字/表格,再增强生成式展示。
r0.1 布局与展示已获连续实施授权,当前按 r1 计划交付界面。完成本增量后的首选衔接仍是既有快慢通道 U2/U3 的真实阶段发现与恢复验收;需先核对其在途任务和批准范围,不能由本界面任务重复启动或改变路由。
## 12. 授权与实施记录
来源:2026-10-12 用户在本聊天评审 r0.1 后指示“开始实施直到完成”。模式 authorized-continuous;阶段 1–10 在本稿界面范围内连续推进,平台门禁和高后果双钥匙保留。启动检查从已登记干净 Dev 检出捕获,后由 make task-start 创建 feature/work-companion-ui,并导入原始 SELF 收据。保护主检出的 Frontend 更新与其他任务现场。
实施计划见 [r1](2026-10-12-work-companion-ui-plan.md);进展和原始证据仅维护于 Dev .task/feature-work-companion-ui.md。PR、CI、Review、合入与部署分别记载,不因本授权预先标为通过。
## 13. 实施进展与能力边界
2026-10-12:渐进任务卡、轻量对话/输入、响应三栏和单一异步状态投影已形成可审阅候选。SELF 验证包括 Frontend 210 与 UI 155 单元测试、类型/设计守护/knip、Dev make test 与 make build;现有 Playwright 11 个展示场景、6 个移动导航场景及隔离 HTTP/MockRunner 2 个真实接口链路场景通过。原始命令、精确对象和完整输出以 Dev 任务卡为准,测试成功不推断已经合入或部署。
原始独立代码 Review 已完成,必要问题均已有整改候选;最终精确版本复审、组合 CI 与合入进展只维护在 Dev 任务主记录,方案正文不复制第二份交付状态。UI 仓原 CI 在下载 GitHub action 时失败,交付补充改用既有平台固定 SHA 检出和 Node22 镜像,保留原测试;安全和规范 Review 及实际平台结果均须记录。
动态摘要只消费系统发布的真实内容:缺少阶段发现时显示诚实占位,不生成示例百分比、ETA 或虚构成果。真实模型阶段发现质量 NOT_RUN,后台自动路由和模型提示词未在本增量修改。旧运行服务未更新;最终组合、Review、GATE 和本任务安全收口以 Dev 主记录为准。
@@ -0,0 +1,154 @@
# Work companion interface implementation plan r1
> **For agentic workers:** Implement in independent units with ce-work native workers; the orchestrator owns integration, evidence, commits, Review and Gitea delivery. Use test-first coverage for behavior changes. User authorization: “开始实施直到完成”; continuous execution is limited to the approved interface design.
**Goal:** Deliver the approved simple, modern, progressive workbench through real project, conversation, activity-card, confirmation and file APIs.
**Architecture:** Keep the three existing pane responsibilities. Project existing ActivityCard bodies into readable summaries in the UI library; Frontend integrates them into conversation and work panes. Preserve server authority and harden event, query and action races in the one Frontend store. No new task executor, model routing, database schema or UI vocabulary is required.
**Tech Stack:** React 19, TypeScript, existing @ui Collapsible/MotionKit/tokens, Vitest, Playwright, Go backend with existing API and SSE.
**Spec:** [Approved interface design](2026-10-12-work-companion-ui-design.md), UI01–UI13; [existing fast/slow design](2026-10-12-fast-slow-channel-display.md), U1 skeleton and applicable presentation rules. Dynamic model-generated findings remain dependent on the existing U2/U3 work; this interface renders real available content and an honest placeholder otherwise.
## Global constraints
- Settled user decision: three pane workbench, conversation first, “工作 / 文件” in the same right pane, one preview object.
- Settled user decision: concise default content and progressive depth; necessary confirmation and outcome limits stay visible.
- Colors/radii/type consume @ui/tokens.css, type uses --fs-ui-*, motion only mk-*, folds use Collapsible.
- No percentage, ETA, pause, independent cancel, resume or retry buttons unless supplied by a verified server action.
- State is derived from real cards, runs, files and responses; no prototype example data enters production.
- Model internal thinking and command parameters/output do not occupy the normal reading layer.
- Main checkout and other task worktrees are protected. All owned changes live in feature/work-companion-ui.
- Evidence uses the Dev make evidence tool. Local checks are SELF; current PR HEAD CI is GATE.
- Component branches are based on their authoritative origin/main. Dev is based on R0 4d362537d0e8755a03b1757b5bad92779a064b33.
- No deployment/restart of existing services, data migration, credentials or branch-protection changes.
## Review focus
1. Older SSE frames or delayed queries must not replace newer cards or inject data into a different conversation/project.
2. Replay of a currently running conversation must still reconstruct its live output while duplicates are dropped.
3. A confirmation submitted through either view must block duplicate submission and represent unknown results honestly.
4. Closing auxiliary panes and opening files must leave necessary work and confirmation paths accessible at 320px and 18px UI type.
5. New background results must not take over an existing file, focus or reading position; result summaries must retain failure and coverage limits.
## U1 — Progressive activity cards and work groups
**Own files:** UI src/ActivityCardView.tsx, src/InlineConfirmCard.tsx, src/InboxList.tsx, src/index.ts, src/ui.css, new src/activitySummary.ts, src/ProgressCardBody.tsx and focused UI tests. Do not change generated contracts or tokens.
**Consumes:** Existing ActivityCard/UINode and DocBridge; U1 body keys 状态/正在做/当前发现/剩余/下一步. Unknown words remain supported by the generic renderer.
**Produces:** Existing ActivityCardView remains source-compatible; export activitySummary/cardStatusLabel/groupActivityCards as pure projections. CardViewCallbacks and InlineConfirmCallbacks may add `actionState?: (card: ActivityCard) => 'submitting' | 'unknown' | undefined`; existing callbacks remain optional. Core vocabulary is unchanged.
- [ ] Add tests for queued and running labels, modern failed and legacy done+danger, no-findings placeholder, internal material keys hidden by default, real document nodes still reachable, and confirmation buttons disabled for submitting/unknown.
- [ ] Run the focused Vitest tests before production edits; record expected red assertions through evidence.
- [ ] Build the projection with literal canonical body keys and card states; never interpret arbitrary output as a new execution fact.
- [ ] Render L1 summary first, remaining body and source/range information in Collapsible, diagnostic metadata behind a nested explicit record entry. Known failure/remaining/next-step content must remain visible.
- [ ] Keep unknown/legacy bodies intact in the generic detail renderer. Tables, structured lists and document references retain their current renderer.
- [ ] Group unpinned work as needs-action, active, results, history, preserving order inside each group. Pinned items remain stable.
- [ ] Simplify chrome; use text plus status shape and existing neutral surfaces.
- [ ] Verify full UI suite, tsc and design/contrast guards; hand off files and red/green evidence without committing.
Example behavioral expectation:
```ts
const queued = { ...card, status: 'active', body: [{ type: 'kv', kv: [['状态', '排队中'], ['材料键', 'mk_private']] }] }
expect(cardStatusLabel(queued)).toBe('排队中')
expect(groupActivityCards([completed, pending, queued]).map(g => g.key)).toEqual(['needs-action', 'active', 'results'])
```
## U2 — Conversation, input and inline work reading
**Own files:** Frontend src/components/Conversation.tsx, src/components/ProcessTimeline.tsx, src/messageparts.ts if required by process policy, new src/components/ConversationWork.tsx, new src/companion-conversation.css, focused conversation/messagepart tests. Do not edit styles.css, App, Workbench or store.
**Consumes:** Existing store fields and actions; existing UI ActivityCardView/Collapsible/DocBridge, including the additive actionState callback. The orchestrator supplies state.cardActionStates.
**Produces:** ConversationWork renders current cards from the same store in an inline Collapsible; default ordinary Q&A has no empty progress. Component CSS imports live in the owned component file.
- [ ] Add failing behavior tests for normal Q&A without progress, task summary reachable while right pane is closed, progress record folded by default, failure/limits visible, and process final answer outside its fold.
- [ ] Replace command-oriented empty states with goal/material prompts and three optional natural-language examples that fill input rather than trigger hidden work.
- [ ] Simplify header; keep execution profile, cross-reading and session settings inside a clearly labeled settings fold, preserving existing behavior and consent.
- [ ] Keep add-materials and send visible; move permission selector into operation settings without changing its effective value. Explain queue state and upload failures in user language.
- [ ] Show a light continuity line from real runs/cards with confirmed counts; inline work uses the same cards/actions as the work pane.
- [ ] Fold tool parameters and output even during running by default; keep a compact real phase label and preserve manual expansion. Do not display model internal thinking as ordinary content.
- [ ] Protect scroll reading and reset compose/expanded context correctly on conversation switches; do not remove artifact or rewind capabilities.
- [ ] Verify focused tests and the integrated Frontend suite; hand off files and evidence without committing.
Example behavioral expectation:
```ts
expect(showProcessInline(live, true)).toBe(false)
expect(showProcessInline(live, false)).toBe(true)
// Render real ConversationWork with zero cards: no progress object is produced.
// Render with a real active progress card: summary is present independent of rightCollapsed.
```
## U3 — Responsive shell and context navigation
**Own files:** Frontend src/App.tsx, src/components/TopBar.tsx, src/components/TaskSidebar.tsx, new src/companion-shell.css, new src/workbenchLayout.ts and focused shell/layout tests. Do not edit store, Conversation, Workbench, shared styles.css or UI.
**Consumes:** Existing leftCollapsed/rightCollapsed/rightTab/previewExpanded and store pane/file operations. May add only local ephemeral responsive state, not another asynchronous task owner.
**Produces:** Desktop three pane layout; narrow screen one active pane with clear contextual return actions, using the same Workbench/PreviewPane objects. Export a pure layout selector if a decision is needed for tests.
- [ ] Write failing behavioral tests for single-pane navigation, restoring conversation, expanded file reading, and no hidden-only essential operation.
- [ ] Match the approved calm prototype through spacing and type hierarchy, preserving canonical palette and default existing theme preferences.
- [ ] Keep project identity on the left, conversation identity central, work/files on the right. Rename primary creation to 新建对话 where it actually creates a conversation.
- [ ] Reduce duplicate permanent chrome; retain project creation/search/account/admin/available workspace paths.
- [ ] Adapt to 320/390/736/1024/1440; hide/return controls remain keyboard- and touch-accessible. Do not let stored pane widths force horizontal overflow.
- [ ] Keep file expansion as one preview enlargement, not another overlay or fourth pane.
- [ ] Verify layout tests and report desktop/mobile screenshots after integration; hand off owned files without committing.
## U4 — One state owner, safe updates and confirmation feedback
**Own files:** Frontend src/store.ts, new src/eventProjection.ts if a pure helper is useful, src/components/Workbench.tsx, src/components/PreviewPane.tsx only when integration requires it, focused store tests. Orchestrator implements this unit.
**Consumes:** Existing SSE event identity/seq/runId, conversation detail resumeSeq/lastSeq, cards API, project events, cardAction and resolveHITL APIs.
**Produces:** Store `cardActionStates: Record<string, 'submitting' | 'unknown'>`; both work and inline confirmation callbacks read this same map. Current session/project cursors and query generation checks remain in one store.
- [ ] Add red tests for duplicated and stale cards; delayed conversation/project list queries after switching contexts; foreground replay versus background agent notes; duplicate action submission; unknown response followed by a server query; new Surface while reading a file.
- [ ] Guard event application by current context and per-stream applied sequence. Live replay uses its own replay cursor and never re-applies older card/plan/status projection effects.
- [ ] Guard asynchronous queries by their requested context and generation/sequence so slow snapshots do not wipe newer events or another context's state.
- [ ] Suppress background progress in foreground token output; update actual runs/cards instead of creating an unrelated LiveState.
- [ ] Lock confirmation/action submission by card or HITL identity before awaiting. Clear on observed server outcome. Unknown results remain disabled until read-only reconciliation determines the current state; do not blindly resend an effect.
- [ ] Show submitting and unknown feedback at both entrances. Preserve all server-supplied actions and their original scope.
- [ ] Leave current file/Surface selection and explicit pane preference intact on background updates; show a small new-result cue rather than auto-opening.
- [ ] Default new users to a light, compact conversation layout with right pane closed; keep saved theme/layout choices and explicit file opening.
- [ ] Verify focused store tests, integrated Frontend tests, and browser cross-view flows.
Example behavioral expectations:
```ts
store.applyEvent({ ...newerStatus, seq: 12 })
store.applyEvent({ ...olderStatus, seq: 11 })
expect(store.getState().cards[0].status).toBe('done')
// Hold the first action response; call through the second view and assert one API request.
// Resolve or query the real returned card and assert both views leave submitting together.
```
## U5 — Integration, browser acceptance and delivery
**Own files:** Dev DESIGN.md, PROJECT.md, task card and exact gitlinks; Documents design/plan/index and delivery record; Frontend e2e/work-companion.playwright.ts and isolated browser fixtures if required; external screenshots and receipts.
- [x] Record authorization and implementation units; retain original startup evidence unchanged.
- [x] Integrate all workers, inspect owned paths and contracts, run authoritative focused tests, and commit logical component changes with Why/Evidence/Impact/Refs bodies.
- [x] Update DESIGN §9.6 and information architecture to the approved progressive behavior; no palette changes are planned, so do not change canonical token values merely to create a paired diff.
- [ ] Run make task-sync through evidence at acceptance, review and merge checkpoints; resolve any parent/component conflicts without altering unrelated owner work.
- [x] Pin exact committed component revisions and run Dev make test plus make build through evidence.
- [x] Browser checks: normal conversation; three selected attachments; background task plus foreground input/queue; pending confirmation through either entrance; done/failed/partial results; real file preview; reading preserved during update; duplicate/stale updates; refresh/switch; all five widths and 18px type.
- [x] UI fixture-driven browser cases validate presentation only. Use an isolated real backend/browser smoke for API wiring, file/confirmation/card persistence where feasible. No mock model findings are reported as live-model acceptance.
- [ ] Run required simplification and independent code review; fix findings, re-run affected checks, and record reviewer/object identity.
- [ ] Push component branches, create and attach Gitea PRs, verify their current HEAD required CI and merge in dependency order. Update Dev pins to merged revisions, verify combination CI at current Dev HEAD, Review and merge Dev PR.
- [ ] Fold/close only this task card under continuous authorization. Preserve or safely reclaim only owned workspace artifacts. Do not modify active main checkout state for other tasks.
## Definition of done
UI01–UI13 are mapped to observed source/tests/browser outcomes or an explicit inherited capability limit; no prototype fixture enters product state. All changed components compile and relevant tests pass. Current-head mandatory CI is verified before merge. Review findings are closed. The actual merged Dev combination and saved evidence are recorded. Existing running services remain unchanged; deployment is a separately identified operation.
Continuous authorization covers implementation, verification, reversible isolation, documentation, commit/push/PR, agent Review/merge and task-specific safe closure. Stops apply to genuine scope changes, unowned content collisions, missing current-head platform gates and high-consequence dual-key operations. These conditions do not require re-approval of routine already-authorized work.
## Delivery status
2026-10-12: U1–U4 implementation candidates are integrated; U5 local combination and browser checks passed as SELF evidence. Original independent review is complete; the required fixes are implemented and locally verified. Final fixed-version review, current-head platform CI/merge and safe closure are tracked only in the Dev task main record; this plan does not maintain a second delivery-status copy. Code review may produce small corrective iterations; each has its own fixed object and relevant replay. The UI CI bootstrap repair is required to run the retained checks, not a waiver of them. Actual merged versions and final verification remain recorded in the Dev task card; no existing service is deployed by this task.
2026-10-12 corrective candidate: UI0da2e3a / Frontend43d1933. SELF: UI155 and Frontend210 tests with type/knip checks, 11 presentation plus6 mobile-navigation browser cases,2 isolated realHTTP/MockRunner cases. The live attachment case now proves exact upload→send→persist associations across reload. The review repairs cover source links, per-option context, real browser scroll/focus, terminal reconciliation, action feedback ownership, explicit preview intent, latest outcomes and visible public explanations. These are interface and state-projection corrections; no live-model routing, prompt or existing-service deployment change. Final delivery facts are recorded in the linked Dev PR/task archive.
@@ -0,0 +1,462 @@
# 快慢通道 U2/U3 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. 本计划建议在同一会话原生实施,最后独立 Review;若用户选择子代理方式,改用 superpowers:subagent-driven-development。实施批准依据:2026-10-13用户“确认,继续推进”;连续授权覆盖本计划U2/U3阶段5–10,不包含既有服务部署。任务复选框不是验证证据。
**Goal:** 让材料整理期间的真实活动和带来源的阶段发现更新同一张任务卡,刷新、并行与重启后仍能准确读取。
**Architecture:** Core 冻结可选 TaskSnapshot 与检查点候选契约;Backend 在现有 activity_cards.payload 内保存权威快照,并将卡、执行态投影和 card.* 事件原子提交。Runtime 只提交候选;Frontend 的现有 store 是唯一异步状态所有者,UI 继续使用当前渐进卡和 DocBridge。
**Tech Stack:** Go、既有 SQLite/PostgreSQL Store、agent-native 子代理循环、React/TypeScript、现有 UI/Collapsible、既有 SSE 与 Playwright。
**Spec:** [已批准快慢通道展示方案 r1.1](2026-10-12-fast-slow-channel-display.md),特别是 §8、§9、§13–15;界面基础以[工作台设计 r0.2](2026-10-12-work-companion-ui-design.md)和[界面实施计划 r1](2026-10-12-work-companion-ui-plan.md)为准。
状态:**部分收口:阶段5已批准;Task1–6与r0.6零付费机制已合入,Task7模型质量验收未通过(r0.4 A01 FAIL,r0.5/r0.6 A01 NOT_RUN),留待后续任务;未部署**。版本 r0.1;日期 2026-10-13(北京时间);owner weichen;计划作者为本聊天 Codex。来源:用户“继续”并明确选择“推进快慢通道 U2/U3”。本文件补齐上一批明确排除的 U2/U3;不把上一批界面的持续授权自动移作本批授权。
## Global Constraints
- 沿用“左侧找上下文、中间推进对话、右侧处理工作”,不增设通道页面或状态微服务。
- 默认展示真实状态、工作、最多三条发现、剩余/下一步;依据与执行记录按需展开,思维链不是成果。
- “taskId 在排队前持久登记并关联同一张卡”;排队没有 runId 时不制造 run。
- “重启对账不能把展示快照当作执行队列”;无可信执行所有者的排队记录必须中断,不自动重派。
- “持久化与事件写入须原子一致”;快照与重放水位一致,不同会话/项目流的 seq 不可比较。
- “不同内容不得复用旧任务成果”;内容 hash 与解析/处理配置进入输入身份,文件名和字数不是版本。
- 当前批准前不改业务代码、不运行真实模型实验、不操作运行数据库或部署服务。实施批准后仅使用任务独立测试环境;既有实例、凭据、保护规则和正式发布仍不在本计划范围。
- 颜色、圆角、字号、动效只消费既有 UI 令牌和 mk-*;折叠仍用 Collapsible。无新增视觉令牌需求。
## Review Focus
1. 同名、同字数、不同内容;更新解析器或截断配置后不得返回旧批材料结论。Task 2 给出固定红测。
2. 卡已落盘但事件失败、并发终态与晚到阶段候选;不得出现数据库和可重放事件分裂或终态回退。Task 3 注入事务失败与竞争。
3. 重启遗留无 runId 的排队卡、PG 中另一实例仍持有执行权;只中断确属本实例失去所有者的任务。Task 4 双实例及队列恢复用例。
4. 用户收纳/置顶、窄屏阅读、快照期间后台更新和跨会话迟到响应;不得被工作更新覆盖偏好或移走焦点。Task 5 复用并扩展真实浏览器回归。
5. 模型伪造 task/source/verified/动作、来源更新或访问失效、预算耗尽;不提升模型叙述的可信等级,不发布越权文本,不影响主任务收尾。Task 6、7 验证。
## 1. 当前固定基线及实际差距
| 对象 | SHA |
|---|---|
| Dev R0 | 5212fef01e59b7f9e12fa7fc42cd987c6792a786 |
| Core | ba289e7b1780a29855aef8477bf1ac49bd563eb2 |
| Backend | 0f192a481388184df39f81c28b0587a7e16ec3ca |
| Frontend | 43d1933b8c3377ae548eb495305e9f0de29dcb59 |
| UI | 0da2e3acd6c8ae8957825b64ddb54b250c0979c0 |
| Documents 写作起点 | cf74a200e877d898d928052e6738681be2b670fc |
来源 SELF:本轮读取固定源码与远端开放 PR;原始审计由 Dev 本任务卡的 make evidence 记录。以下是代码事实,不是新能力运行通过声明。
| 事实 | 精确入口 | 本批处理 |
|---|---|---|
| U1 已有 TaskSummaryView 和固定骨架 KV;没有持久 TaskSnapshot | Core task_summary.go、activity.go | 添加可选结构化字段,保留既有 Body 回退 |
| 材料键仅取排序后的 filename + runeCount | Backend internal/runmgr/material.go:44 | 内容与配置身份修正是 U2 前置 |
| 卡整块 JSON 已持久化,且有卡级 version/CAS | internal/store/cards.go;card_version_test.go | 使用现有 payload/version,不新增任务表 |
| SaveCard 与 emitCard 分开;finishBackgroundCard 更新 Body 后另发状态 | internal/cardsvc/cardsvc.go;internal/runmgr/runmgr.go | 新投影事务一次写入正文、状态、tone、事件 |
| AppendEvents 在事务中分配 seq,并在 PG 同事务 NOTIFY | internal/store/messages.go:268;dialect.go | 提取事务内事件助手;沿用现有锁与通知 |
| bgQueue 在内存;ReconcileInterrupted 只扫描已有 run | internal/runmgr/runmgr.go:95、2240 | 持久排队卡对账,禁止用展示记录恢复执行 |
| 子代理 text_delta 的前 80 字成为 agent.progress | internal/runtime/sub_loop.go | 不把该文本截断当业务发现;新增受控检查点 |
| 前端已隔离后台 notes,保存卡级观察和恢复保护;无业务 TaskSnapshot.revision | Frontend src/store.ts、test/work-state.test.ts | 扩展既有 store,保留既有锁/恢复/预览意图 |
| 新界面与阅读稳定性已交付 | Dev PR493 / 归档 PR494;上述 FE/UI SHA | 复用现有渐进卡、确认和窄屏,不再重复改版 |
远端核对未发现本方向的开放 U2/U3 PR。已存在审计导出、账户事务、SQLite 活动实例保护及其文档/组合 PR;本批不修改这些任务的记录。它们后续合入时依规 task-sync,并对受到影响的组合重新验证。
## 2. 本批决定与验收边界
推荐分期:**U2 → U3**,每期独立可验收;下面 Task 1–5 属 U2,Task 6–7 属 U3。不把 U1 和 U2 再合并成一个含糊出口。
- 首期结构化任务只使用现有卡 JSON。Core 的可选字段是扩展兼容;旧卡无该字段仍使用 Body。首次不增加 schema migration、不做旧库回填;旧材料卡无法证明内容身份时只保留历史展示,不自动复用其整理结论。
- 第一批真实业务成果覆盖**附件材料整理**。运行时检查点能力保持通用;研究、生成、审查的专门提示配方与业务校验作为后续消费者增量,不以本批材料样例宣称全部场景完成。
- 摘要附加模型调用 **0 次**:当前子代理在自然检查点提交候选。每次 attempt 最多接受 6 次有实质变化的非终态成果发布;相同检查点重投不扣新次数。首条有效成果立即发布,后续按内容去重;本批不建设额外定时摘要模型或持久延迟候选队列。
- 高频活动的展示更新上限 1 次/秒,终态、必要确认与重要更正即时;执行记录不因显示节流而丢失。
- “已纳入输入/已提供片段”由服务端输入账本确认;不把它说成模型已完整分析。阶段发现分别标材料记载、分析判断、初步判断、待确认;“已核对”只能来自受控检查结果。
- 支持读取、展开依据、打开既有文件和现有 HITL/命令能力。无新暂停、重试或独立取消按钮;后续新尝试保存新 attempt/卡,原失败历史保留。
| 需求 | 实施项 | 可判定出口 |
|---|---|---|
| R03-b/R04 活动 | 1、3–5 | 真实工具/执行状态持续更新同一卡;无阶段成果时诚实占位 |
| R03-c/R04/R05 成果 | 1、2、6、7 | 长材料至少两个有依据、有工作价值的真实检查点;短任务可直接收尾 |
| R06 并行 | 3–5、7 | 3 个后台 + 前台 + 第四任务排队,任务与正文归属正确 |
| R09 恢复 | 3–5、7 | 刷新/断线/乱序后不回退;排队失去执行者不永久“排队” |
| R12 阅读 | 5、7 | 不抢文件、焦点和滚动;原 FE/UI 阅读用例继续通过 |
| R17 尝试与结果 | 1、3、4、6 | attempt 与执行/展示/回投分开;旧执行者与终态后候选不能覆盖结果 |
| R07 确认 | 5–7 | 复用既有两入口,后台进展不覆盖提交中/未知结果;服务端 CAS/命令收据证明无重复效果 |
| R10 最终结果 | 3、6、7 | 结论、默认最多三点、范围/缺项、真实结果引用;有摘要不等于文件保存成功 |
| R14 成本与失败 | 6、7 | 0 次额外摘要模型;限制发布次数,失败保留成果并允许主任务完成 |
## 3. 契约与文件职责
### Task 1:冻结 Core 数据与旧客户端兼容(U2)
**Files:** 新增 Core `task_snapshot.go`、`task_snapshot_test.go`;修改 `activity.go`、`data.go`、`ts/types.ts`、`task_summary.go`;随后 Dev `make contracts` 同步 FE/UI 的 `src/contracts.ts`。
**Interfaces:** `ActivityCard.Task *TaskSnapshot`,JSON 名 `task`、omitempty。TaskSnapshot 是当前权威投影;检查点类型先随契约定义,U3 才注册执行入口。最低字段如下,子类型全部在本任务定义:
```go
type DocumentOrigin struct {
ArtifactID ID
ContentHash, ParserRevision string
}
// DocMeta 增加 Origin *DocumentOrigin,json:"origin,omitempty";旧调用方可不提供。
type TaskPhase struct { ID, Label string; ObservedAt time.Time }
type TaskSourceRef struct {
ID, ArtifactID, ContentHash, ParserRevision string
BlockIndex int
Label, Quote, Availability string
}
type TaskResultRef struct {
ArtifactID, SurfaceID ID
Version, ContentHash, Availability string
}
type TaskFinding struct {
ID, Text, Impact, Kind, Status string
Revision int64
Sources []TaskSourceRef
Assumptions string
Corrects string
}
type TaskSnapshot struct {
SchemaVersion int
TaskID, AttemptID, CardID, ProjectID, ConversationID, SourceMessageID ID
ParentRunID, RunID ID
OwnerInstanceID string
ExecutionEpoch int64
Revision, SourceSeq int64
StreamScope, InputRevision, Title, Goal string
ExecutionState, OutcomeCompleteness, DeliveryState string
Phase TaskPhase
Focus, Coverage, Remaining, NextStep string
Findings []TaskFinding
Actions []UIAction
ResultRefs []TaskResultRef
LastActivityAt, LastMeaningfulUpdateAt time.Time
}
type TaskSourceQuote struct { SourceID string; BlockIndex int; Quote string }
type WorkCheckpointCandidate struct {
CheckpointID, PhaseID, Focus, Remaining, NextStep string
Findings []WorkFindingCandidate
}
type WorkFindingCandidate struct {
FindingKey, Text, Impact, Kind, Assumptions, Corrects string
Sources []TaskSourceQuote
}
func (s TaskSnapshot) Validate() error
func ValidateWorkCheckpoint(c WorkCheckpointCandidate) error
func (s TaskSnapshot) SummaryBody() []UINode
```
实现必须写显式 camelCase JSON tags,TS 采用同一字段名。候选没有 owner/taskId/runId、动作、URL、CardStatus 或“已核对”开关;归属、时间和 revision 由服务端盖章。`ExecutionState` 固定 queued/running/awaiting_user/completed/failed/interrupted;`OutcomeCompleteness` 固定 none/partial/complete;`DeliveryState` 固定 pending/available/reported。`Phase.ID` 允许稳定活动阶段及经注册检查点阶段,不由计时推进。
- [ ] 先写字段缺失、未知状态、非安全整数 revision/seq、超过限制和旧卡 JSON 回退的红测。单快照总 JSON ≤64KiB;候选 ≤16KiB、单次 findings ≤6、当前有效发现最多12;默认只展示3项,不截掉风险/金额/日期而伪造完整性。超限拒绝候选,已有结果不变。
- [ ] 在 Core 运行 `go test ./... -run 'TaskSnapshot|WorkCheckpoint|TaskSummary' -count=1`,确认测试因新契约缺失或不变量失败。
- [ ] 按上述类型与枚举实现校验和 Body 纯投影。保留旧 KV 常量;执行状态映射状态词与 tone 一次产生。UI 收纳状态与 executionState 分离;dismissed 不代表已停止。
- [ ] Go/TS 字段逐项核对后 `make contracts`;运行完整 Core 测试和 FE/UI 类型检查。提交只包含本单元的契约与兼容变更。
核心负例:
```go
func TestTaskSnapshotRejectsMissingIdentity(t *testing.T) {
s := TaskSnapshot{SchemaVersion: 1, Revision: 1, ExecutionState: "running"}
if s.Validate() == nil { t.Fatal("missing scope/attempt must be rejected") }
}
func TestCheckpointCannotDeclareVerified(t *testing.T) {
c := WorkCheckpointCandidate{CheckpointID: "cp1", PhaseID: "crosscheck", Focus: "核对材料",
Findings: []WorkFindingCandidate{
{FindingKey: "f1", Text: "日期不一致", Impact: "需要确定口径", Kind: "verified",
Sources: []TaskSourceQuote{{SourceID: "s1", BlockIndex: 0, Quote: "上线六月"}}},
}}
err := ValidateWorkCheckpoint(c)
if err == nil || !strings.Contains(err.Error(), "kind") {
t.Fatal("expected kind rejection, not a missing unrelated field")
}
}
```
### Task 2:材料内容身份与可核对来源登记(U2 前置)
**Files:** 修改 Backend `internal/runmgr/material.go`、`material_test.go`、`runmgr.go`、`internal/server/server.go` 的材料接收装配;新增 `internal/runmgr/material_sources.go`、`material_sources_test.go`。不修改解析器实现或检索排名。
**Interfaces:** 保留 `materialKey([]core.ParsedDocument) string` 作为解析内容级键,改为确定性 hash 完整 IR、parser 和 warnings;排除 ParsedAt。新增私有 `materialInputRevision(items []materialInputItem, processingRevision string) string` 构成完整复用身份。`materialInputItem` 定义 `ArtifactID core.ID`、`Parsed core.ParsedDocument`、`OriginalHash string`;Server在接收并授权具体artifact_ref、解析其bytes时赋予 Task 1 的DocMeta.Origin,Manager成对记录到runCtx并传给后台binding,禁止按文件名猜匹配。保留现有StartConversationRun/StartClaimedConversationRun方法签名,新Origin是可选扩展。不能假设当前DocMeta/Artifact已存在hash/version字段,也不信任客户端或模型自填Origin;Manager核对实际artifact归属与版本。没有原始hash时使用完整解析内容摘要并标识fallback。配置摘要包含实际解析版本及材料内联/截断设置;集合排序保留重复文件,不能仅按文件名覆盖。
内容级键排除Origin.ArtifactID等传输标识及ParsedAt,避免同内容重新上传仅因新ID重做。processingRevision还包含实际材料指令/子代理配方内容版本,不能在提示配方已改后复用旧解释。重新上传复用前仍校验旧结果来源可用与权限,没有可取回依据时创建新attempt。
`material_sources.go` 定义 `materialSourceRegistry`:由当前消息 artifact_ref 和可信 RunCtx.Artifact 建立 sourceId→工件/内容hash/解析版本/实际 DocBlock 的映射;记录已提供全文或片段范围。不得用待发布模型文本构造该账本。
- [ ] 在现有 `material_test.go` 写同名等长不同内容、顺序交换、ParsedAt变化、重复同名文件、parser/配置变化和图片/空解析的红测。
- [ ] 运行 `go test ./internal/runmgr -run 'MaterialKey|MaterialSource|MaterialInput' -count=1`;同名等长变体必须先失败。
- [ ] 替换内容身份并记录完整键到受控 TaskSnapshot.InputRevision。新去重只复用同 owner/会话、相同输入/配置、当前来源仍可访问且已完成或实际有执行者的记录。旧12字符 Body KV 不能作为新材料已整理的证明。
- [ ] 从真实 ArtifactContent 及 DocBlock 建立来源 registry;无页码就用块/章节片段,不生成页码。新尝试保存新 attempt/卡,旧失败/撤回结果保留。
- [ ] 跑相关材料完整测试并提交该前置。普通无附件对话不建任务,也不改变已有材料派发时机。
```go
func TestMaterialKeySameNameSameLengthDifferentText(t *testing.T) {
a := []core.ParsedDocument{{Meta: core.DocMeta{Filename: "决定.txt", Parser: "builtin:md"},
Blocks: []core.DocBlock{{Type: core.BlockPara, Text: "上线六月"}}}}
b := []core.ParsedDocument{{Meta: a[0].Meta,
Blocks: []core.DocBlock{{Type: core.BlockPara, Text: "上线七月"}}}}
if materialKey(a) == materialKey(b) { t.Fatal("different content reused an old result") }
}
```
### Task 3:卡快照、状态、事件与一致水位原子提交(U2)
**Files:** 新增 Backend `internal/store/task_projection.go`、`task_projection_test.go`、`internal/cardsvc/task_projection.go`、`task_projection_test.go`;修改 `internal/store/messages.go`、`cards.go`、`internal/runmgr/events.go`、`internal/cardsvc/cardsvc.go`、`internal/server/server.go`。
**Interfaces:** Store 是唯一持久写入 owner。新增以下输入/输出与方法;不把 sql.Tx/DB 句柄交给 Runtime、UI 或插件:
```go
// store 包;Card 与 Task 必须一致,Channels 由宿主策略生成。
type TaskProjectionWrite struct {
Owner string
Card core.ActivityCard
Ref string
ExpectedCardVersion int
ExpectedTaskRevision int64
Channels []string
}
type CardsSnapshot struct { Cards []core.ActivityCard; ReplaySeq int64 }
func (s *Store) CommitTaskProjection(w TaskProjectionWrite) ([]core.StreamEvent, error)
func (s *Store) CardsAtCursor(owner, conversationID string) (CardsSnapshot, error)
```
`cardsvc` 新增 `CommitTask(owner string, next core.TaskSnapshot, expectedRevision int64) error`,内部读取当前卡及卡 version、保留用户 pin/dismiss 状态,派生 Body/状态/tone;提交时再次校验 owner、归属、attempt、合法迁移和两种版本。读写冲突明确返回 ErrConflict;不得盲写覆盖。
- [ ] 在 Store 复用 `openTestStore` 与 `newVersionedCard` 写事件插入失败回滚、owner不同、CAS竞争、终态后晚到更新、多流seq独立和快照水位测试。SQLite 用测试 trigger 让 INSERT events 失败;PG 使用本测试独立 schema 的同等触发器,不能修改运行库。
- [ ] 运行 `go test ./internal/store ./internal/cardsvc -run 'TaskProjection|CardsAtCursor' -count=1`,先确认故障条件能暴露旧双写问题。
- [ ] 提取现有 AppendEvents 的事务内助手,供旧入口和新事务复用。按排序后的 channel 获取现有会话咨询锁,卡 CAS、完整 JSON、冗余状态列、会话/允许的项目 card.updated、PG NOTIFY 同事务;失败全部回滚。唯一性/CAS不能只由 mutex 或“先查后写”保证。
- [ ] eventBuffer 增加受控投影提交方法:在现有 flushing 串行边界内取出相关流缓冲、按同一事务先后保存并发布已提交事件;禁止持 flushing 再调用会重取该锁的 flushConversation。新路径不能另走 emitCard 二次分配 seq。只发布成功提交的对象,内存缓存提交失败时不前进。
- [ ] 列表保持既有 `{cards: [...]}`,新增可选 `replaySeq`;事务中读取一致的卡与会话水位,PG 使用一致快照。旧消费者忽略新增字段。项目列表水位独立,不与会话水位比较;Task.SourceSeq只表示其会话流。
- [ ] 卡收纳/置顶、动作裁决、复制到项目等触及带 Task 的写入口要保持 Task 或拒绝非法覆盖。to_project 是成果引用投影,不创建第二个工作执行 owner;本批优先保留原任务引用,不自动复制可更新执行状态。
- [ ] SQLite/PG 原子、并发和故障测试通过后提交。本批不增加任务表或迁移;若证据表明现有 schema 无法实现不变量,先修订计划,不临时加入迁移。
故障注入骨架(store 包,`newVersionedCard` 是现有测试 helper):
```go
st := openTestStore(t)
c, owner := newVersionedCard(t)
p, err := st.CreateProject(owner, "task projection")
if err != nil { t.Fatal(err) }
conv, err := st.CreateConversation(owner, p.ID, "task projection", "")
if err != nil { t.Fatal(err) }
c.ProjectID, c.ConversationID = core.ID(p.ID), core.ID(conv.ID)
c.Task = &core.TaskSnapshot{
SchemaVersion: 1, TaskID: "t1", AttemptID: "a1", CardID: c.ID,
ProjectID: c.ProjectID, ConversationID: c.ConversationID,
SourceMessageID: "m1", ParentRunID: "parent1", RunID: "run1", Revision: 1,
OwnerInstanceID: "test-instance", ExecutionEpoch: 1,
StreamScope: "conversation:" + conv.ID,
InputRevision: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
Title: "测试任务", Goal: "读取测试材料", Phase: core.TaskPhase{ID: "reading", Label: "读取材料"},
ExecutionState: "running", OutcomeCompleteness: "none", DeliveryState: "pending",
LastActivityAt: c.CreatedAt,
}
c.Body = c.Task.SummaryBody()
if err := st.SaveCard(owner, &c, ""); err != nil { t.Fatal(err) }
// SQLite case;PG case 在独立 schema 使用拒绝 INSERT 的函数/trigger。
_, err = st.db.Exec(`CREATE TRIGGER reject_task_event BEFORE INSERT ON events
BEGIN SELECT RAISE(ABORT, 'task event injection'); END`)
if err != nil { t.Fatal(err) }
next := c
task := *c.Task
task.Revision = 2
task.Focus = "核对材料"
next.Task = &task
next.Body = task.SummaryBody()
_, err = st.CommitTaskProjection(TaskProjectionWrite{
Owner: owner, Card: next, ExpectedCardVersion: 1,
ExpectedTaskRevision: 1, Channels: []string{conv.ID},
})
if err == nil { t.Fatal("injected event failure must roll back") }
if !strings.Contains(err.Error(), "task event injection") { t.Fatal("wrong failure trigger") }
got, ver, err := st.GetCardVersion(owner, c.ID)
if err != nil || ver != 1 || got.Task.Revision != 1 { t.Fatal("card changed without event") }
events, err := st.EventsAfter(conv.ID, 0, 100)
if err != nil || len(events) != 0 { t.Fatal("rolled-back event leaked") }
```
### Task 4:实际执行生命周期及排队重启对账(U2)
**Files:** 修改 Backend `internal/runmgr/runmgr.go`、`material.go`、`recovery_test.go`;新增 `internal/runmgr/task_projection.go`、`task_projection_test.go`。复用现有 run/instance/lease,不新建调度器。
**Interfaces:** `task_projection.go` 定义私有 `taskBinding`(taskId、attemptId、cardId、owner、项目/会话、parentRunId、instanceID、已确认执行epoch);新增 `registerBackgroundTask`、`updateTaskActivity`、`finishTaskProjection`、`reconcileTaskProjections`,只由 Manager 调用。其持久更新统一走 Task 3 的 cardsvc.CommitTask。
```go
func (m *Manager) registerBackgroundTask(parent core.Run, opts bgSpawnOpts) (taskBinding, core.ActivityCard, error)
func (m *Manager) updateTaskActivity(binding taskBinding, phase core.TaskPhase) error
func (m *Manager) finishTaskProjection(binding taskBinding, payload core.AgentResultPayload, runErr error) error
func (m *Manager) reconcileTaskProjections() error
func shouldInterruptQueued(ownerInstanceID, currentInstanceID string, hasLiveExecutionWitness bool) bool
```
- [ ] 写四任务槽位、排队晋升保留ID、终态正文/灯一次出现、无run排队重启、PG他实例活租约、失去租约旧写和用户已收纳卡的测试。
- [ ] `go test ./internal/runmgr -run 'TaskProjection|TaskQueue|TaskReconcile' -count=1` 先取得失败证据。
- [ ] 入队前创建 TaskSnapshot 和卡并持久登记;成功持久后才可说“已登记”。后台实际启动才绑定 runId。工具开始/结束只生成确定性活动,绝不从 progress.Note 截断文本提炼发现。
- [ ] 阶段状态、最终摘要、真实工件引用和旧卡 Body 一次提交。completed/failed/interrupted 不接受晚到运行中写;新 attempt 必须有新记录,不擦除旧失败。执行完成与 notice 已汇报分别更新 DeliveryState。
- [ ] 启动对账在监听前运行:先沿用既有 ReconcileInterrupted,再对属本实例的 Task 做账。没有 runId/有效持久入队及执行权的 queued→interrupted,文案“排队任务未恢复,未开始执行”,解除相应材料去重。PG不得扫描并封存其他活实例任务;实例/执行epoch必须有可信关联记录,不能以“找不到本地goroutine”推断全局失败。
- [ ] OwnerInstanceID/ExecutionEpoch 是服务端持久绑定,不由模型设置;读取执行凭据失败必须停止对账并报告,不能当作“没有执行者”。旧卡没有可信Task/内容身份时仅作历史并标明执行状态未核实,不保持虚假的排队承诺,也不擅自认定失败或重派。
- [ ] 将持久通知ID和相同 task/attempt 关联,重投同一结果不会再派一次材料任务。回投失败不撤销已可读结果。跑恢复/材料/通知既有回归后提交。
```go
func TestQueuedReconcileRequiresOwnershipAndLostExecution(t *testing.T) {
if shouldInterruptQueued("B", "A", true) { t.Fatal("foreign live instance was sealed") }
if shouldInterruptQueued("A", "A", true) { t.Fatal("live execution witness was ignored") }
if !shouldInterruptQueued("A", "A", false) { t.Fatal("orphan owned queue remained queued") }
}
```
以上是归因策略的最小红测;出口还必须用现有双档 openRecoveryStore/newRecoveryManager 建立实际两实例、真实租约和持久队列卡重跑,单纯布尔策略测试不能作为恢复能力证据。
### Task 5:单一前端投影、来源入口与阅读恢复(U2)
**Files:** 修改 Frontend `src/api.ts`、`src/store.ts`、`src/components/ConversationWork.tsx`、`test/work-state.test.ts`、`e2e/work-companion.playwright.ts`;UI `src/activitySummary.ts`、`src/ProgressCardBody.tsx`、`src/progressive-cards.test.tsx`。契约同步归 Task 1,不另手写分叉。
**Interfaces:** 新 `api.listCardsSnapshot` 读取 Task 3 的 `{cards,replaySeq}`;只在现有 store 合并 TaskSnapshot。新增纯 `mergeTaskSnapshot<T extends {taskId: string; attemptId: string; revision: number}>(current: T, incoming: T): T`:归属相同且新 revision 才替换;未知 schemaVersion 回退 Body,不猜枚举。函数只返回给现有store,不拥有异步状态。UI 摘要从同一个 card.task 派生;旧卡仍可读,但无可信运行绑定的历史队列显示“当前执行状态未核实”,不能伪装正在推进。
- [ ] 写会话/项目独立seq、重复/乱序revision、快照期间到达新事件、游标缺号、切会话迟到回复和任务终态后的旧更新用例。
- [ ] 运行 `npx vitest run test/work-state.test.ts`(Frontend);UI 运行 `npx vitest run src/progressive-cards.test.tsx`,确认新字段/恢复触发尚不能通过。
- [ ] 扩展现有卡观察与epoch守护:查询期间缓冲新事件,按快照水位重放;不可仅Math.max推进游标后丢失缺号事件。确认状态仍归现有cardActionStates,unknown不能因阶段更新被清除;不再创建第二套pending map。
- [ ] 结构化 findings 默认3条,展开保留当前有效全部项和修正历史。来源只使用受控 DocBridge;UI普通层不显示inputRevision、模型参数或工具脚本。Body回退与结构化字段不能各自更新成不同结果。
- [ ] 必要确认、失败原因和关键限制保持默认可见,不占普通发现“三条”的截断预算。来源的处理版本与当前文件不同,在唯一预览中给明确版本提示;无法读取处理时版本时提供保存的合法引用片段并说明限制,不能把最新文件伪装成旧版本。
- [ ] 在既有五宽度/大字号、窄屏水合导航、原生DOM移动滚动/焦点与文件预览用例上重跑;新事件不打开 Surface、不更换文件、不夺取焦点。
- [ ] 来源更新/访问失效时显示可读限制并请求权威对账;会话/身份切换清理相关缓存。类型、knip、design-guard及相关浏览器检查通过后提交。
```ts
expect(mergeTaskSnapshot(
{ taskId: 't1', attemptId: 'a1', revision: 9 },
{ taskId: 't1', attemptId: 'a1', revision: 8 },
)).toMatchObject({ revision: 9 })
expect(mergeTaskSnapshot(
{ taskId: 't1', attemptId: 'a1', revision: 9 },
{ taskId: 't1', attemptId: 'a2', revision: 10 },
)).toMatchObject({ attemptId: 'a1', revision: 9 })
```
### Task 6:可信检查点候选及首批材料成果(U3)
**Files:** 新增 Backend `internal/runtime/work_checkpoint.go`、`work_checkpoint_test.go`;修改 `sub_loop.go`、`runner.go`;新增 `internal/runmgr/task_checkpoint.go`、`task_checkpoint_test.go`;修改 `material.go` 的材料指令与来源描述;必要读取权限过滤放入 `internal/cardsvc/task_visibility.go`、`internal/server/server.go`,通过窄接口接现有授权策略,不导入RDM域规则。
**Interfaces:** Runtime 可选 `WorkCheckpointSink`,避免破坏所有 RunCtx/fake 的基础接口:
```go
type WorkCheckpointSink interface {
PublishWorkCheckpoint(core.WorkCheckpointCandidate) error
}
```
新增本地内置工具 `publish_work_checkpoint`,参数严格按 Task 1 候选结构,unknown JSON keys 拒绝。仅当前材料后台 run、支持 sink 且宿主/现有 ToolPolicy 允许时注册;不绕过 deny/NeedsConfirm,不覆盖同名插件工具。无 sink 的消费者仍走旧路径。实际 task/attempt/run、instance/epoch、检查点序号、来源账本从受控 runCtx 取得,模型不能选这些身份。
- [ ] 在 Runtime fake stream 与 Manager 测试覆盖:两个有效检查点、原子发布后重读、伪造来源/跨项目/不存在片段、verified提权、重复checkpoint异载荷、终态后/旧attempt候选、次数耗尽、发布失败而主任务完成。
- [ ] 分别运行 `go test ./internal/runtime -run 'WorkCheckpoint' -count=1` 与 `go test ./internal/runmgr -run 'TaskCheckpoint' -count=1` 先取得红测。
- [ ] 模型调用工具后,校验引用确属本次提供材料或已授权真实工具结果,quote是指定块实际片段,版本/hash仍一致;检查点序号拒绝迟到回退。同checkpointId同载荷幂等返回,异载荷冲突。没有来源的关键事实拒绝,推断必须是analysis/provisional并带依据/限定;verified只能由受控确定性检查入口生成。
- [ ] 源文档 quote 只证明片段真实存在,不证明模型解释必然正确。不得用JSON校验取代真实模型质量验收。
- [ ] 候选findingKey只是当前attempt内的局部业务键;只由服务端生成全局Finding ID/修订状态,替换或撤回以前结论时保留正确历史关系。曾提示用户采取行动的重要更正立即幂等提醒;无动作的新发现仅改同一卡,不反复发聊天消息。
- [ ] 撤回、更正、终态不消耗普通成果发布次数,不因次数用尽保留已知错误。历史保存以明确的finding/revision关系和既有持久事件为依据;超限拒绝新增大载荷,关键撤回仍可提交精炼状态,不能靠剪掉金额/日期满足限制。
- [ ] 默认自然检查点目标为读入可用材料、发现实质差异/缺项、形成可用结论;不是所有任务必经动画。没有有用发现就诚实继续,短任务可直接完成。不消费thinking_delta作为发现。
- [ ] 必要用户决定绑定已有HITL/命令记录;模型候选不能创建可执行命令。复用已交付两入口反馈,并重跑后端 CAS/命令收据的跨浏览器重复确认与未知结果对账场景。
- [ ] needs_user发现本身不是HITL或执行暂停;没有真实待确认记录时,只显示问题/影响和现有输入入口,不造确认按钮,也不将executionState改成awaiting_user。
- [ ] 首批0次额外摘要模型;有效非终态发布最多6次,重复不计,超过上限返回保留成果的说明,终态仍可提交。子代理预算通过现有 loopCaps/toolBudget 及 RunBudget 绑定,不能沿用无界maxTurns而声称预算有效。
- [ ] 每次新读、重放与重新呈现缓存均重新校验任务和来源访问。拒绝时隐藏受限发现正文、来源名称及由其生成的Body,而不只是禁用链接;从当前账号撤权不意味着已合法送达用户的信息能够收回。不扩大会话卡项目镜像权限,沿用MirrorConvCards策略。
- [ ] 引用绑定处理当时不可变的输入内容/hash。当前工件更新后旧版本仅进入有明确版本提示的历史,当前摘要/建议标明依据已更新并重新核验;不能把旧quote伪装成当前文件内容。权限过滤同时覆盖Focus、Coverage、Remaining、NextStep、结果摘要等由受限来源派生的文本。耗时的文件hash和模型调用在事务外进行,提交时校验可信版本/范围凭据;无法提供可证明版本一致性的来源不进入有效发现。
- [ ] Runtime、Manager、源权限与工具策略回归通过后提交 U3 业务单元。
有效候选格式(示例数据只定义合同,不是验收证据):
```json
{
"checkpointId": "material-difference-1",
"phaseId": "crosscheck",
"focus": "核对需求与会议决定",
"remaining": "评审意见仍在核查",
"nextStep": "整理需要确认的口径",
"findings": [{
"findingKey": "launch-date",
"text": "两份材料中的上线月份不一致",
"impact": "安排交付前需要确定权威版本",
"kind": "material_record",
"sources": [
{"sourceId": "src_a", "blockIndex": 0, "quote": "上线六月"},
{"sourceId": "src_b", "blockIndex": 0, "quote": "上线七月"}
]
}]
}
```
### Task 7:真实模型、真实接口及固定组合验收(U2/U3)
**Files:** 新增 Backend `eval/live/work_checkpoints_test.go`,复用该目录现有 `helpers_test.go`/`live_test.go` 的凭据与模型入口;新增 Frontend `e2e/work-checkpoints.playwright.ts`;更新本计划关联的 Dev 任务卡和既有设计进展入口。真实材料、模型输出和评测记录存仓外。
**Interfaces:** live harness 固定 baseline/candidate 的 Dev与组件SHA、同材料、同任务、同模型/参数;采集actual task/attempt/run/card IDs、事件seq/revision、原始来源和Usage。浏览器通过真实HTTP取回记录,不能仅给DOM注入示例卡冒充后端链路。
当前live_test.go使用`//go:build live`和AGENT_EVAL_BASE/AGENT_EVAL_MATERIALS/AGENT_EVAL_OUT。新测试复用HTTP基础助手,但不复用其自动选第一个HITL选项的策略;必要决定保留或使用明确的测试专属答复,不能无条件批准业务动作。
测试启动器提供`WORK_CHECKPOINT_EVAL_OWNERSHIP_MANIFEST`,内容只含本任务PID、二进制/组件SHA、地址和独立data目录;不含凭据/DSN。新测试先核验该进程和隔离目录,再允许HTTP写入;只有localhost地址不能证明是本任务实例。缺少/不匹配该清单即失败,不使用旧harness的默认实例作为兜底。
- [ ] 先完成所有机制红绿与固定组合 `make test && make build`;PG执行 `make test-backend-pg`,缺环境不能把SKIP记录为通过。真实评测前先验证预算与当前chat路由,服务与数据目录均为任务独立临时实例。
- [ ] 初批真实模型对照3种材料整理任务:A01三长附件无文字、A02带明确分析重点、A04部分解析缺失;baseline/candidate各一次,共最多6个素材任务(每个含其前台即时答复和后台run),不自动重跑失败样本。A06同名等长更新另由真实HTTP/机制用例覆盖,无需为哈希问题额外消费模型。
- [ ] 每个run建议MaxTurns=8、MaxToolCalls=12、MaxTokens=20000、300秒;每个素材任务最多1个前台和1个后台,本批最多6个素材任务/12个run、0次附加摘要模型。必须验证主/子run均受预算约束,统计逐调用实际token和可得费用;按已返回Usage对账的全批tokens目标上限240000。请求内可能发生的预算超额须由单次输出上限和停止规则约束,未回报Usage的重试不能冒充已计费上界。当前provider无法给出可核费用/限额时,真实实验标NOT_RUN并先确认上限,不修改密钥或擅自更换路由。
- [ ] A01长任务至少两个在结束前落盘的真实成果点;对照已知材料独立检查每条结论、影响和引用,记录错误/遗漏/更正。实际生成但没有有用成果不算通过;不使用模型自评作为独立质量证据。短任务直接完成合法,不延长任务凑次数。
- [ ] 真实接口/浏览器覆盖3后台+前台+第4排队、刷新、断线补号、会话切换、终态乱序、来源更新/移除/拒绝、双入口确认、无run排队重启以及PG活实例不被错封。记录Actor、被测版本及受信来源等级,不能将SQLite单机结果写为多实例证明。
- [ ] 比较材料整理、主要发现、需要处理与来源定位的可读性;10秒目标作为待测指标记录实际时间/错误,不以作者直觉宣称达标。精炼度首先看风险和限定是否保留。
- [ ] 验收、请求审核、合入前按project门禁task-sync,固定新候选,原始命令由make evidence记录。最终独立审阅者先重放最小检查,再读作者证据;组件提交精确SHA及Dev组合当前HEAD全部CI通过后才可按依赖合入。
建议运行入口(实验门控变量及现有 harness 行为应在本任务开工时核对):
```bash
# 机制:在Backend根目录,真实实验不由这些命令自动启动
go test ./internal/store ./internal/cardsvc ./internal/runmgr ./internal/runtime -count=1
# 组合:在Dev任务工作区
CMD='make test && make build' make evidence
# 真实模型:只在本计划和评测预算批准、两实例均为任务独立环境后运行
: "${WORK_CHECKPOINT_EVAL_BASE:?必须指定本任务独立实例地址}"
: "${WORK_CHECKPOINT_EVAL_MATERIALS:?必须指定仓外材料目录}"
: "${WORK_CHECKPOINT_EVAL_OUT:?必须指定仓外原始记录路径}"
: "${WORK_CHECKPOINT_EVAL_OWNERSHIP_MANIFEST:?必须指定本任务进程与数据归属清单}"
AGENT_EVAL_BASE="$WORK_CHECKPOINT_EVAL_BASE" \
AGENT_EVAL_MATERIALS="$WORK_CHECKPOINT_EVAL_MATERIALS" \
AGENT_EVAL_OUT="$WORK_CHECKPOINT_EVAL_OUT" \
go test ./eval/live/ -tags live -run TestWorkCheckpoints -count=1 -v -timeout 35m
# 浏览器:使用本任务的现有Playwright运行器及独立HTTP实例配置
# 新测试文件名固定为e2e/work-checkpoints.playwright.ts,原展示/导航/附件用例继续运行。
```
## 4. 交付、停止条件与当前状态
每个业务单元沿用模块各自任务分支与固定组合版本;Core契约先行,Backend和消费方在同一Dev候选组合验证。U2达到出口后才进入U3真实成果发布。先保留确实需要的图形/日志在展开层,不另造示例业务状态。
触发以下任一情形,停止受影响增量并保留现场:来源越权;状态/结果串任务;原子性破裂;终态或修正历史被旧写覆盖;无有效执行权的任务被再次派发;预算无法证明有效;真实模型连续生成无依据成果。试验失败如实记FAIL/NOT_RUN,不降低“真实且有用”的出口。
| 项目 | 本次状态 |
|---|---|
| 当前实现与在途核对 | SELF,基线/原始审计见Dev任务卡 |
| 既有r1.1方向、阶段1–4 | 原批准继续有效;本计划新增具体接口、约束和验证需阶段5评审 |
| U2/U3范围来源 | 2026-10-13本聊天用户明确选择推进U2/U3 |
| 本实施计划 | r0.1,2026-10-13用户“确认,继续推进”批准,阶段5–10连续授权 |
| Task1–6 | 本地实施与独立代码复审已完成;原子持久化、来源绑定、队列/恢复、渐进展示与预算守卫有SELF/REPLAY依据 |
| Task7真实模型 | 原六样本、第一次额外A01及第6节另行批准的v7后续A01均已执行;后续A01两付费run、五次provider调用、57997 reported tokens;两次running态检查点确已落盘,但无后台最终结果且有无依据的“已批准决定”断言 |
| 当前出口 | U3质量验收仍FAIL;第6节一次性授权已用完,不自动重跑 |
| 平台CI/合入/既有实例部署 | Dev旧HEAD 7692503的三项平台CI已通过;新组合待验,质量门禁未通过故未合入;部署不在本批授权内 |
计划评审入口只维护本文件;Dev任务卡维护当前动作、授权、原始证据及交付进展。用户已批准并按本文件的U2→U3顺序实施;下一阶段建议不自动启动U4或既有实例部署。
## 5. 实施核验与剩余出口(2026-10-13)
实际进展及证据边界见[本批核验报告](../reports/2026-10-13-fast-slow-u2-u3-validation.md)。原计划Task1–6源码变更已完成,Task7保留失败而非将引用存在视为语义正确。原六样本不因后续修复自动改为PASS。
等价整改:材料记录由宿主以经过核验的原文和文件名展示,省略模型对该类型的转述、影响和前提;分析/推断保持独立类别及前提,不提升为verified。正文与执行过程分开;失败/中断的下一步不得承诺仍在自动处理。输入配方版本已递增,旧成果不因文件名相同而复用。评测仅收紧输出上限,不能放大生产预算。
第6节的一次后续A01质量复验已另行获批、执行并失败。下一步先分析无依据的批准状态断言、第二检查点紧贴预算失败与缺失最终结果,再评审修订方案及资源边界;本次授权不延伸为再次付费试验。U3质量出口未通过,不进入合入。U4和既有实例部署保持未启动。
## 6. 质量出口后续试验(另行批准一次并执行;结果FAIL)
**触发和证据。** 已批准的额外A01实际使用两个run、四次provider调用、42203 returned Usage token,零接受的阶段发现。模型先提交含未知字段和错误嵌套的五条发现,随后尝试用省略号拼接来源引文;严格校验正确拒绝,两轮后台调用达到原每run 20000 token阈值,任务失败。独立逐项分析与原始收据见[核验报告](../reports/2026-10-13-fast-slow-u2-u3-validation.md)及额外A01评估。不能把错误引用当有效证据,也不能重用旧失败run补写成果。
**已准备的等价整改。** 模型侧检查点声明最多引导1–3条新增发现,要求单段落连续的短原文引用;宿主仍只接受可信来源、完整原文和当前版本,不更改Core最多6项的受控上界或来源权限。材料处理配方递增至v7,避免把旧结果复用为新行为。SQLite完整后端套件通过;后续真实模型结果见下文。
**已批准的资源边界。** 用户2026-10-13另行明确批准同一A01合成材料的一次受控试验:两个付费run为上限,每run MaxTurns=8、MaxToolCalls=12、MaxTokens从20000调为30000、最长300秒;已返回Usage的本次合计目标不超过60000 token,单次输出上限4000并继续保留生产更低的剩余额度,缺Usage立即停止后续调用。不换模型/路由、不使用重试或回退、不自动确认HITL。该目标不是严格账单上界,一次在途请求可能越过剩余额度。
**验收和停止。** 仍要求至少两个真正有用、结束前保存的不同成果点;逐条检查数字、意见/决定、假设、引文与文件归属,明确无最终结果或因预算中断。模型JSON错误、非原文引用、未知Usage、超出两run或额度目标时停止,保留现场且不重跑。该一次性授权已经执行,不覆盖任何后续付费重跑;CI通过也不放行合入。
**实际结果与读数修正。** Backend 7f8674f/Dev c1c1942 的隔离样本确有两个付费run、五次provider调用、57997 returned Usage token;通知run零调用。检查点1含3项发现,检查点2累计6项发现、10处引用均可匹配原文;两次检查点均以running态原子落盘。第二次仅比失败终态早约1毫秒,250毫秒轮询客户端漏读并误报“少于两个落盘成果”;独立数据库事件重放纠正该读数,不追溯改写原评测exit1。后台run因每run 30000 token阈值失败,没有最终结果;首批已发布内容把材料中的预算/范围错误称为“已批准决定”,缺乏依据。因此有两次持久化并不等于两个可用成果,U3质量出口仍FAIL。原件和独立复审见核验报告;没有再次付费试验授权。
**执行停止边界偏差。** 原计划上段明确要求“非原文引用时停止”。本次后台第2次候选因非原文引文被拒绝后,同一个子run又发起第3次付费provider请求,返回14231 Usage token并修正引用;它没有新开run或执行传输重试,但仍违反该停止条件。57997低于本次60000目标也不能抵消这一偏差。评测入口已增加“检查点工具拒绝后阻止任何后续provider请求”的零付费RED→GREEN门禁;原样本、原exit1和偏差照实保留,不因代码修复追溯改为合规或质量通过。
## 7. U3 质量修订 r0.2(书面方案已批准,实施计划待评审)
用户已在本会话确认“来源一次呈现、批准状态不由模型推断、为最终答复留预算”的修订方向。可审阅的[质量修订设计 r0.2](2026-10-13-fast-slow-u3-quality-revision.md)另行固定三个职责、备选取舍、旧失败证据、零付费门禁与真实模型出口;本文 r0.1 已实施的 U2 契约、持久化、权限和三栏界面不因方向确认而重写。r0.2 书面方案已获批准;[实施计划 r0.2](2026-10-13-fast-slow-u3-quality-implementation-plan.md)仍待阶段 5 人工评审,新的付费样本尚未授权。
@@ -0,0 +1,259 @@
# 快慢通道 U3 质量修订 Implementation Plan r0.2
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. 本任务沿用已登记的 Dev worktree 和原生逐项实施方式;不再创建同名任务或重复启动 precheck。本文已获阶段 5 人工批准并开始零付费实施,**不是**新增付费模型授权。
**Goal:** 让同一任务卡的材料阶段成果忠于已提供原文、清楚标出待核对判断,并在受控预算内尽量形成真实最终答复。
**Architecture:** Backend 用现有 `materialSourceRegistry` 把来源编号和实际提供的原文块一次呈现,不改变来源权限或 Core JSON。Backend 在检查点提交前挡住模型生成的肯定批准断言,材料子代理依据已返回 Usage 为最终答复留请求空间;UI 在既有卡片中区分材料记载与待核对判断。旧失败样本、执行偏差和现有三栏仍是验收基线。
**Tech Stack:** Go、`agent-native/runtime` 子代理循环、SQLite/PostgreSQL、React/TypeScript、现有 `@ui`/Vitest/Playwright、Dev `make evidence` 与 Gitea CI。
**Spec:** [已批准书面设计 r0.2](2026-10-13-fast-slow-u3-quality-revision.md)。原 [U2/U3 计划 r0.1](2026-10-13-fast-slow-u2-u3-plan.md) 的 U2 契约、执行权及失败恢复不重做。用户已批准本实施计划开始零付费阶段;真实模型样本的资源边界仍待单独批准。
## Global Constraints
- 保留现有三栏、同一任务卡及右栏「工作 / 文件」;不增加通道页、命令详情或新的确认能力。
- 不改变 Core `WorkCheckpointCandidate` JSON、Store 表、SSE 事件、owner/project 约束及来源 quote 必须为连续原文的校验。
- 不新增摘要/审核模型回合;旧样本及其原始 `exit=1`、57,997 Usage、14,231-token 停止规则偏差不重写。
- 本轮只做零付费代码与浏览器验证。任何新真实模型样本须**另行明确批准** run 数、单 run/总 Usage 目标、在途越额风险和停止条件;未获批准为 `NOT_RUN`。
- UI 颜色/圆角/字号只消费 `@ui/tokens.css`,动效只用 `@ui/motion.css`,折叠只用 `@ui` Collapsible;异步状态仍由现有 Frontend store 单一所有者按 seq 处理。
- 组件先各自提交;Dev gitlink 每次推进后跑 `make test && make build`。正式验收、请求审核与合入前按 `policy/delivery.md` 和 AGENTS.md 执行 `make task-sync`;SELF 原始输出经 `make evidence` 进入任务卡。新候选的 GATE 只能引用准确 HEAD。
## Review Focus
1. **重复文字/无 Origin/截断末块**:模型只得到注册表授权的 sourceId,输入文字仍与实际提供前缀一致;Task 1 的 `TestMaterialSourceInlineAnnotationsPreserveProvidedPrefix` 和 `TestMaterialSourceInlineAnnotationsNeverExposeHiddenBlocks` 覆盖。
2. **否定、疑问与肯定审批表达**:“审批尚未完成”“是否已批准”“防止把50万写成已批准”不能被误拒;“预算是已批准决定”必须整批拒绝;Task 2 的表驱动测试覆盖。
3. **默认摘要把 analysis 当事实**:既有材料记载可见,待核对判断带限定且总默认项数不超过三;Task 3 的 UI 组件测试覆盖。
4. **两个检查点后仍无限继续/只有一个检查点时余额不足**:优先真实最终答复或诚实部分结果,不多发 provider 请求;Task 4 的假 provider 用量序列覆盖。
5. **正常通知、来源导航与停止边界**:测试通知不代表生产通知质量;Task 5 的实际 HTTP/browser 用例及 Task 6 的独立真实样本出口分别覆盖,任何工具拒绝后不继续付费。
---
### Task 1:一次呈现原文和可引用来源(Backend)
**Files:** Modify `modules/backend/internal/runmgr/material_sources.go`、`material.go`、`material_sources_test.go`、`material_test.go`;update the live-tag, zero-paid mechanism fixture in `modules/backend/internal/server/work_checkpoint_eval_test.go` and its regression in `work_checkpoint_eval_budget_test.go`;不改 `modules/core/task_snapshot.go`。
**Interfaces:** `materialSources(docs, perDoc)` 继续产出唯一授权注册表。给内部 `materialSource` 增加 `Start, End int`(相对于 `strings.TrimSpace(d.PlainText())` 的 byte offset),新增 `annotateProvidedMaterial(d core.ParsedDocument, provided string, sources materialSourceRegistry) string`。`buildMaterialTask` 仅渲染各文档提供的前缀与紧邻的 `sourceId/blockIndex`,删除末尾重复索引;`validate` 原语义不动。测试专用 `mechanismCheckpointSources(text string) [][]string` 仍返回正则组 `[full,id,blockIndex,providedLine]`,只适配新内联格式。
- [ ] **Step 1: 在既有测试写 RED。** `material_sources_test.go` 用含重复段落、截断段落、缺 Origin 和表格的文档,断言只对注册表里的块插入 `sourceId=... blockIndex=...`;移除这些标记后,正文与当前 `strings.TrimSpace(d.PlainText())` 的实际提供前缀逐字节相同。`material_test.go` 断言同一个短事实只出现一次、每个可引用标记紧邻其实际块、超长提示仍出现。
```go
func TestMaterialSourceInlineAnnotationsPreserveProvidedPrefix(t *testing.T) {
d := materialDocs()[0]
d.Meta.Origin = &core.DocumentOrigin{ArtifactID: "art1", ContentHash: strings.Repeat("a", 64), ParserRevision: "docx1"}
docs := []core.ParsedDocument{d}
provided := strings.TrimSpace(d.PlainText())
got := annotateProvidedMaterial(d, provided, materialSources(docs, 48000))
markers := regexp.MustCompile(`(?m)^sourceId=src_[a-f0-9]+ blockIndex=[0-9]+\n`)
if !markers.MatchString(got) { t.Fatal("provided block has no source marker") }
if markers.ReplaceAllString(got, "") != provided {
t.Fatal("source annotations changed the provided material bytes")
}
}
```
在 live-tag 夹具新增 `TestMechanismSourceExtractionAfterSourceOnce`:给它 `sourceId=src_... blockIndex=0\n上线六月。验收条件需要补齐`,断言读取到真实 ID、索引和连续原句。当前夹具只接受尾部“引用定位片段:”行,故此测试须先 RED;它不发真实模型请求。
```go
func TestMechanismSourceExtractionAfterSourceOnce(t *testing.T) {
id := "src_" + strings.Repeat("a", 24)
got := mechanismCheckpointSources("sourceId=" + id + " blockIndex=0\n上线六月。验收条件需要补齐")
if len(got) != 1 || got[0][1] != id || got[0][2] != "0" || !strings.Contains(got[0][3], "上线六月") {
t.Fatalf("inline source unavailable to mechanism fixture: %v", got)
}
}
```
- [ ] **Step 2: 运行 RED。** 在 Backend 分别运行 `go test ./internal/runmgr -run 'TestMaterialSourceInlineAnnotations|TestBuildMaterialTaskInlineBudget' -count=1` 和 `go test -tags live ./internal/server -run '^TestMechanismSourceExtractionAfterSourceOnce$' -count=1`;期望新增的“一次呈现/标记权限”和夹具内联读取断言各自失败,而旧来源 CAS 测试仍可运行。
- [ ] **Step 3: 实现最小改动。** 在 `materialSources` 记录已提供块的 byte 起止;按 `Start` 排序,在原 `provided` 字符串里只插入来源标记,保持所有非标记字节、顺序和截断位置不变;缺 Origin 不赋 ID。`buildMaterialTask` 只构造一次注册表,不再调用末尾的 `prompt()`;`materialRevision` 的 `material-recipe.v7` 更新为 `v8`,旧完成结果不被新输入布局复用。同步更新 `evalMechanismStream` 的测试专用 source 提取器,使它读取新内联标记后面的已提供原句;它仍只提交来自可信 ID 和字面引用的假 provider 检查点,不替代真实模型验收。
```go
sources := materialSources(docs, perDoc)
// 原有每份文档的 cap/left 计算保持不变。
take := cap
if runes < take { take = runes }
provided := string([]rune(text)[:take])
b.WriteString(annotateProvidedMaterial(d, provided, sources))
```
- [ ] **Step 4: 验证 GREEN 与权限。** 重跑 Step 2,加 `go test ./internal/runmgr -run 'TestMaterialSourceQuoteRequiresActualProvidedBlock|TestMaterialSourceDuplicateTextDoesNotAuthorizeUnprovidedBlock|TestMaterialInputRevisionIncludesProcessingVersion' -count=1`,以及 `go test -tags live ./internal/server -run '^TestMechanismSourceExtractionAfterSourceOnce$' -count=1`。用旧 A01 材料在离线诊断中记录新旧输入字符数、sourceId 集合与 hash;只声明实际测得的长度,不推断新模型 token 使用量。
- [ ] **Step 5: 自审并提交 Backend 独立提交。** 检查 `git diff --check`、新增 ID 与注册表一一对应、没有未提供文本或权限放宽;按本仓 `Why/Evidence/Impact/Refs` 提交。此项可被独立退回而不影响 Task 2 的审批防误判实现。
### Task 2:检查点审批断言守卫(Backend)
**Files:** Create `modules/backend/internal/runmgr/checkpoint_claim_guard.go` 与 `checkpoint_claim_guard_test.go`;modify `task_checkpoint.go`、`task_checkpoint_test.go`、`internal/runtime/work_checkpoint.go` 的工具说明。生产拒绝只作用于系统材料整理的受控检查点,不修改一般对话正文。
**Interfaces:** `validateMaterialApprovalClaims(candidate core.WorkCheckpointCandidate) error` 在 `PublishWorkCheckpoint` 的 Core 基础校验后、任何持久写入前调用。检查 `analysis/provisional` 的 `Text/Impact/Assumptions` 及默认可见的 `Focus/Remaining/NextStep`。`material_record` 继续由宿主重写成原文;`needs_user` 可询问审批状态。肯定审批表达至少覆盖“已批准/已获批/审批通过/批复同意/已通过审批”,否定与待核对表达单列测试;返回稳定的 `checkpoint.claim: approval needs explicit source record` 错误,不把它包装成已通过校验。
- [ ] **Step 1: 写 RED。** 在 `task_checkpoint_test.go` 复用 `checkpointEnvironment` 的合法“上线六月”quote,却让 analysis 无依据声称“预算是已批准决定”,断言 `PublishWorkCheckpoint` 返回 `checkpoint.claim` 且卡 revision/发现数/事件数均不变。表驱动测试覆盖 `Text/Impact/Assumptions/Focus/Remaining/NextStep`,并包含“审批尚未完成”“是否已批准”“防止把50万写成已批准”、确有批准原文的 `material_record` 与 `needs_user` 问句,断言不误拒。
```go
func TestTaskCheckpointRejectsUnsupportedApproval(t *testing.T) {
c := checkpointEnvironment(t)
cp := validCheckpoint(c, "unsupported-approval")
cp.Findings[0].Kind = "analysis"
cp.Findings[0].Text = "需求规定50万元,是已批准决定"
cp.Findings[0].Assumptions = "把需求条目作为项目基线"
if err := c.PublishWorkCheckpoint(cp); err == nil || !strings.Contains(err.Error(), "checkpoint.claim") {
t.Fatalf("unsupported approval was published: %v", err)
}
}
```
- [ ] **Step 2: 运行 RED。** `cd modules/backend && go test ./internal/runmgr -run 'TestTaskCheckpointRejectsUnsupportedApproval|TestMaterialApprovalClaims' -count=1`;期望错误分析目前被接受,修复后转为拒绝。
- [ ] **Step 3: 实现有限守卫。** 新文件按中文句子边界检查明确的肯定审批短语,排除同句的未批准/疑问/防止误写语境;仅以此处理可确定的表达,不宣称通用语义正确。`PublishWorkCheckpoint` 先运行守卫,再走原有来源、owner、版本、CAS 与事务路径;工具说明要求批准事实只作为明确原文 `material_record`,推断为待核对。
```go
if err := core.ValidateWorkCheckpoint(candidate); err != nil { return err }
if err := validateMaterialApprovalClaims(candidate); err != nil { return err }
// 原有来源、权限、版本及 CommitTaskSources 路径继续执行。
```
- [ ] **Step 4: 跑 GREEN 与邻接回归。** Step 2 加 `go test ./internal/runmgr -run '^TestTaskCheckpoint' -count=1` 和 `go test ./internal/runtime -run '^TestWorkCheckpoint' -count=1`。若短语误拒或遗漏已批准变体,补夹具后只调整这个守卫;不借更宽泛的模型分数降低原来源门禁。
- [ ] **Step 5: 自审并提交 Backend 独立提交。** 复核分析仍保留来源和 assumptions、材料记载的原文不被删除、被拒批次无半落盘;`git diff --check` 后按四段提交。
### Task 3:任务卡把原文与判断分层(UI)
**Files:** Modify `modules/ui/src/ProgressCardBody.tsx`、`src/activitySummary.ts`、`test/progressive-cards.test.tsx`;仅在现有卡内分组,不修改 Frontend store 或新增 UI token。
**Interfaces:** `TaskProgressBody` 保持同一个 `ActivityCard.Task`。默认最多三条:优先展示至多两条 `material_record`,其余位置可放带“待核对的判断”标识的 analysis/provisional;`needs_user` 与更正继续即时可见。`activitySummary` 给模型判断加限定,不得把 analysis 的原始句子作为无保留的摘要事实;完整依据仍在现有 Collapsible。
- [ ] **Step 1: 写 RED。** 在 `test/progressive-cards.test.tsx` 构造两条材料记载、一条 analysis “预算已批准”、一条 `needs_user` 和第四条普通记录,断言默认三个以内且 analysis 所在区域有“待核对的判断”标签;`activitySummary` 的摘要不能出现无前缀的“预算已批准”;点击现有“查看依据/全部发现”仍能读原 quote 与历史更正。另用仅 analysis 的卡断言说明“已有待核对判断”,不冒称“已核对”。
```tsx
// 在 test/progressive-cards.test.tsx 增加 activitySummary 与 TaskFinding import。
const subject = card()
const source = { id: 's', artifactId: 'art', contentHash: 'h', parserRevision: 'txt', blockIndex: 0, label: '需求.txt · 段落1', quote: '预算50万尚未审批', availability: 'available' }
const finding = (id: string, kind: string, text: string): TaskFinding =>
({ id, kind, text, status: 'active', revision: 1, sources: [source] })
subject.task = { schemaVersion: 1, taskId: 't', attemptId: 'a', cardId: subject.id,
projectId: subject.projectId, conversationId: subject.conversationId!, ownerInstanceId: 'i',
revision: 3, sourceSeq: 3, streamScope: 'conversation:' + subject.conversationId,
title: subject.title, executionState: 'running', outcomeCompleteness: 'partial',
deliveryState: 'available', phase: { id: 'crosscheck', label: '核对材料' },
findings: [finding('r1', 'material_record', '材料记载1'), finding('r2', 'material_record', '材料记载2'),
finding('a', 'analysis', '预算已批准'), finding('q', 'needs_user', '请确认预算'),
finding('r3', 'material_record', '材料记载3')] }
render(<ActivityCardView card={subject} />)
expect(screen.getByText('待核对的判断')).toBeTruthy()
expect(screen.getByText('预算已批准').closest('.acard-findings')?.textContent).toContain('待核对')
expect(activitySummary(subject).findings).not.toContain('预算已批准')
```
- [ ] **Step 2: 运行 RED。** `cd modules/ui && npm test -- test/progressive-cards.test.tsx`;预期当前同组“当前发现”会把 analysis 当普通项。
- [ ] **Step 3: 实现最小 UI。** 沿用 `@ui` Collapsible 和现有 `acard-*` 类;按 kind 投影到材料记载/待核对判断/需要留意,默认总数上限三,剩余到“查看全部发现与更正记录”;更新摘要选择,不改变卡片状态或来源导航。若需 CSS,只消费现有 `@ui/tokens.css`、`--fs-ui-*` 和 `mk-*`。
```tsx
const records = ordinary.filter(f => f.kind === 'material_record')
const judgments = ordinary.filter(f => f.kind === 'analysis' || f.kind === 'provisional')
const visibleRecords = records.slice(0, 2)
const visibleJudgments = judgments.slice(0, 3 - visibleRecords.length)
// needs_user/更正仍走既有关键项路径;未展示项保留在原 Collapsible。
```
- [ ] **Step 4: 跑 GREEN 与设计守护。** `cd modules/ui && npm test -- test/progressive-cards.test.tsx test/design-guard.test.ts test/contrast-guard.test.ts && npm run typecheck`;检查浅/深色和窄屏文本层级,没有新裸色、私有 keyframes 或 `<details>`。
- [ ] **Step 5: 提交 UI 独立提交。** 自审普通用户能一眼区分原文与模型判断,`git diff --check` 后按四段提交;它独立于 Task 4 的预算实现。
### Task 4:材料子代理的最终答复预留(Backend)
**Files:** Create `modules/backend/internal/runtime/material_final_reserve.go`、`material_final_reserve_test.go`;modify `sub_loop.go`、`usage_n3_test.go`;replay the existing `run_budget_stream_test.go` unchanged。一般子代理、前台、生产模型路由和 `budgetedStream` 的已返回 Usage 守卫不扩大。
**Interfaces:** `type materialBudgetState struct { Limit, Used, LastPrompt, OutputCap, SavedCheckpoints, Responses int; UsageKnown bool }` 与 `materialFinalDecision(s materialBudgetState) (finalOnly, stop bool)` 只处理 `agent.sub.material`。`Responses=0` 是尚未产生调用的初态;已有响应但 Usage 未知则 fail-closed。增长余量 `margin=max(1024, LastPrompt/4)`;最终预留 `reserve=LastPrompt+OutputCap+margin`,再做一次检查点的估算成本也取同一值。`Limit-Used <= LastPrompt+margin` 时停止;否则 `SavedCheckpoints>=2` 或 `Limit-Used <= 2*reserve` 时进入 final-only。首个响应前不套用该估算。这样保留一次最终请求的空间,且一次成果后发现下一次发布会挤占预留时优先收尾,明确这是部分结论而非第二项。final-only 不再向 provider 声明 `publish_work_checkpoint`,并添加系统拥有的简短最终答复指令;若剩余额度不容纳预计最终 prompt,则不发新请求,保留已保存卡和真实失败状态。它不保证在途请求不越过总目标。
- [ ] **Step 1: 写 RED。** `material_final_reserve_test.go` 用假 stream 顺序返回用量,断言“初始零响应允许首个请求”“两个合法检查点→下一次仅最终答复”“只有一个检查点且额度临界→真实部分最终答复”“额度不足→0 次额外 provider 请求”“已有响应而全部 Usage 缺失→停止”“非材料子代理保持原行为”。`usage_n3_test.go` 补一条 `TotalTokens=0` 但 prompt/completion 有值时按两者之和入账的回归,与现有 `budgetedStream` 口径一致。故意让假 provider 在 final-only 中仍请求隐藏的检查点,断言 `runTool` 拒绝、设置本次执行的停止标记,下一轮在 provider 前停止且没有持久发布。测试检查 provider 请求里的工具声明和系统提醒,而非只检查内部布尔值。
```go
func TestMaterialFinalReserveAfterTwoCheckpoints(t *testing.T) {
finalOnly, stop := materialFinalDecision(materialBudgetState{Limit: 30000, Used: 16000, LastPrompt: 5000, OutputCap: 4000, SavedCheckpoints: 2, Responses: 2, UsageKnown: true})
if !finalOnly || stop { t.Fatalf("want one final-only request: final=%v stop=%v", finalOnly, stop) }
finalOnly, stop = materialFinalDecision(materialBudgetState{Limit: 30000, Used: 27000, LastPrompt: 8000, OutputCap: 4000, SavedCheckpoints: 1, Responses: 2, UsageKnown: true})
if !stop { t.Fatalf("insufficient final prompt budget started another request: final=%v", finalOnly) }
}
```
- [ ] **Step 2: 运行 RED。** `cd modules/backend && go test ./internal/runtime -run 'TestMaterialFinalReserve|TestRunBudgetStreamStopsReportedTokenExhaustion' -count=1`;期望当前两检查点之后仍继续暴露发布工具或临界余额耗尽。
- [ ] **Step 3: 实现调度。** `subRun.runTool` 仅在检查点真实成功时增加 `savedCheckpoints`,在 final-only 阶段拒绝模型凭旧记忆仍提交的检查点并设置停止标记;`wrapped` 下一次调用先检查此标记,直接返回错误而不接触 provider;`onEvent(message_end)` 用返回 Usage 更新 `Used/LastPrompt/Responses/UsageKnown`。`TotalTokens=0` 时仅在 prompt+completion 大于零才采用其和;三项均为零才标 Usage 未知并阻断后续请求。该回退也修复子 run 的 `AddUsage` 记账,不修改前台或 `budgetedStream`。在 `SubLLMRunner.Execute` 的 `wrapped` 调用前计算决策;final-only 只改当前请求的工具声明和系统提示,不写回历史、不提高 `MaxTokens` 或单次输出上限。预算不能证明可用时保留原失败/部分投影,不伪造正文。
```go
if st.finalOnlyRejected {
out := make(chan agentllm.Event, 1)
out <- agentllm.Event{Kind: agentllm.KindError, Err: fmt.Errorf("budget_exceeded: checkpoint requested after final-only transition")}
close(out)
return out
}
limit := *rc.Profile().Budget.MaxTokens // 仅在 MaxTokens 非 nil 且 >0 的材料分支调用
outputCap := outputTokenCap(rc.Profile().Budget, rc.Settings(), "models.chat.maxOutputTokens")
finalOnly, stop := materialFinalDecision(materialBudgetState{Limit: limit,
Used: st.usageTotal.TotalTokens, LastPrompt: st.usageTotal.LastPromptTokens,
OutputCap: outputCap, SavedCheckpoints: st.savedCheckpoints,
Responses: st.responses, UsageKnown: st.usageKnown})
if stop {
out := make(chan agentllm.Event, 1)
out <- agentllm.Event{Kind: agentllm.KindError, Err: fmt.Errorf("budget_exceeded: final-answer reserve unavailable")}
close(out)
return out
}
requestDecls := append([]agentllm.ToolDecl(nil), decls...)
requestMessages := append([]agentllm.Message(nil), messages...)
if finalOnly {
filtered := make([]agentllm.ToolDecl, 0, len(requestDecls))
for _, d := range requestDecls { if d.Name != workCheckpointTool { filtered = append(filtered, d) } }
requestDecls = filtered
requestMessages = append([]agentllm.Message{{Role: agentllm.RoleSystem, Content: "阶段成果已保存;现在用现有材料写出真实最终结论与未决项,不再发布检查点。"}}, requestMessages...)
}
in := stream(ctx, model, requestMessages, requestDecls, opts)
```
- [ ] **Step 4: 跑 GREEN 与现有子代理回归。** Step 2 加 `go test ./internal/runtime -run 'TestWorkCheckpoint|TestSub|TestRunBudget' -count=1`。用 A01 离线 Usage 序列(6,778/10,134/11,343 prompt,整体 35,632)验证决策会在原子预算检查之前转入 final-only 或诚实停止;不能把这个离线判断当新版真实模型通过。
- [ ] **Step 5: 自审并提交 Backend 独立提交。** 检查无隐藏的附加模型回合、无流式并发数据竞争、无“两个检查点”计数伪造;按四段提交。
### Task 5:固定组件组合、零付费回归与独立 Review(Dev)
**Files:** Modify Dev `modules/backend`、`modules/ui`、`modules/documents` gitlinks、`.task/feature-fast-slow-u2-u3-plan.md` and Documents 核验报告;Core/Frontend 不变。若测试证明公开契约或 Frontend store 必须改变,先返回方案评审再扩围。
- [ ] **Step 1: 确认每个组件工作树干净、提交 SHA 与 PR HEAD 一致。** Backend 完整 `go test ./... -count=1`,UI `npm test && npm run typecheck`,Frontend 受影响的现有 store/阅读测试重放;每项保留真实命令、SHA 和输出。
- [ ] **Step 2: 在已登记 Dev 任务 worktree 固定 gitlink 和任务卡。** 先提交组件,再推进 Dev 指针;不要把旧样本的 `SELF` 或旧 HEAD CI 当新候选证据。
- [ ] **Step 3: 正式组合验收。** 在干净的 Dev HEAD 以 `RECEIPT=/tmp/fast-slow-u2-u3-r02-sync-20261013.json CMD='make task-sync' make evidence` 同步最新主干,导入工具收据;随后以 `RECEIPT=/tmp/fast-slow-u2-u3-r02-combination-20261013.json CMD='make test && make build' make evidence` 捕获完整 SELF 输出并导入任务卡。执行前检查同名收据不存在;若已占用则用新的任务专用时间后缀,不覆盖。对数据库、来源 CAS 和预算路径执行直接相关 SQLite/真实 PG 测试。
```bash
test ! -e /tmp/fast-slow-u2-u3-r02-sync-20261013.json
RECEIPT=/tmp/fast-slow-u2-u3-r02-sync-20261013.json CMD='make task-sync' make evidence
IMPORT_RECEIPT=/tmp/fast-slow-u2-u3-r02-sync-20261013.json make evidence
# 先提交任务卡中的同步收据,确保组合测试从干净 HEAD 开始。
test ! -e /tmp/fast-slow-u2-u3-r02-combination-20261013.json
RECEIPT=/tmp/fast-slow-u2-u3-r02-combination-20261013.json CMD='make test && make build' make evidence
IMPORT_RECEIPT=/tmp/fast-slow-u2-u3-r02-combination-20261013.json make evidence
```
- [ ] **Step 4: 实际浏览器验收。** 用任务自有、带 PID/二进制 SHA/数据目录 manifest 的 mechanism 实例运行 `e2e/work-checkpoints.playwright.ts`;该 manifest 必须由本轮启动过程写入并在执行前验证,不复用旧文件。证明来源跳转、后台不抢阅读、刷新/旧版本、材料记载标签与浅色默认阅读;analysis 的限定标签由 Task 3 组件测试证明。不得使用旧端口或旧服务作为新版本证据。
```bash
mkdir -p /tmp/fast-slow-u2-u3-r02
test ! -e /tmp/fast-slow-u2-u3-r02/mechanism-data
test ! -e /tmp/fast-slow-u2-u3-r02/mechanism-manifest.json
test ! -e /tmp/fast-slow-u2-u3-r02/server-eval.test
cd modules/backend
go test -tags live -c ./internal/server -o /tmp/fast-slow-u2-u3-r02/server-eval.test
# 在保持打开的任务终端中执行前台服务,不用 nohup 后台启动。
backend_sha="$(git rev-parse HEAD)"
dev_sha="$(git -C ../.. rev-parse HEAD)"
WORK_CHECKPOINT_SERVER_MODE=mechanism WORK_CHECKPOINT_SERVER_DATA=/tmp/fast-slow-u2-u3-r02/mechanism-data WORK_CHECKPOINT_SERVER_MANIFEST=/tmp/fast-slow-u2-u3-r02/mechanism-manifest.json WORK_CHECKPOINT_BACKEND_SHA="$backend_sha" WORK_CHECKPOINT_DEV_SHA="$dev_sha" /tmp/fast-slow-u2-u3-r02/server-eval.test -test.run='^TestServeWorkCheckpointEval$' -test.v
```
在任务终端 B 从 Dev 根目录验证 manifest,启动预览。代理目标必须从本轮 manifest 读取,不能沿用旧端口;4179 若已占用则停止并选择另一个本任务专用空闲端口,不能接管既有预览:
```bash
cd modules/frontend
npm run build
python3 -c 'import hashlib,json,os; m=json.load(open("/tmp/fast-slow-u2-u3-r02/mechanism-manifest.json")); assert m["mode"]=="mechanism" and m["dataDir"]=="/tmp/fast-slow-u2-u3-r02/mechanism-data" and m["base"].startswith("http://127.0.0.1:") and os.path.realpath("/proc/%s/exe" % m["pid"])==m["binary"] and hashlib.sha256(open(m["binary"],"rb").read()).hexdigest()==m["binarySHA256"]'
api_target="$(python3 -c 'import json; print(json.load(open("/tmp/fast-slow-u2-u3-r02/mechanism-manifest.json"))["base"])')"
PLAYWRIGHT_API_TARGET="$api_target" PLAYWRIGHT_PREVIEW_PORT=4179 npm run preview -- --host 127.0.0.1 --strictPort
```
在同时保持打开的任务终端 C,从 Frontend 目录执行浏览器用例;结束后只停止这两个任务拥有的前台进程并保存截图/追踪:
```bash
cd modules/frontend
PLAYWRIGHT_BASE_URL=http://127.0.0.1:4179 WORK_CHECKPOINT_HTTP_MANIFEST=/tmp/fast-slow-u2-u3-r02/mechanism-manifest.json npm run e2e -- e2e/work-checkpoints.playwright.ts
```
- [ ] **Step 5: 独立代码审阅与草稿 PR。** 审阅准确的 Backend/UI/Docs/Dev SHA,重放来源映射、审批误判、预算、停止边界及浏览器最小集;修正发现后只重跑受影响的检查。推送草稿 PR 并核验当前 HEAD 的 Gitea CI 运行身份、SHA、每个必需 job/step;质量出口仍 `NOT_RUN` 时不合入。
### Task 6:真实模型质量出口与交付决策(单独资源授权)
**Files:** Backend `eval/live/work_checkpoints_test.go` 仅在固定候选所需的受控入口/读数缺口确有证据时修改;Dev 任务卡、Documents 核验报告写入结果。旧原始样本不覆盖、不补写。
- [ ] **Step 1: 先准备可审查资源提案。** 固定 Backend/Dev/Frontend/UI/Docs 精确 SHA、模型路由来源及受保护配置引用、A01 同一合成材料、Run/单 run/returned Usage 目标、输出上限、300 秒、缺 Usage、任何检查点拒绝、越额的停止规则与成本边界。明确在途调用可能越过目标;不给出虚假的账单硬上限。
- [ ] **Step 2: 等待用户另行明确批准该一次性付费范围。** 未获批准时只记录 `NOT_RUN`,不以本计划或“继续”推定新样本授权;保持六个 PR 草稿。
- [ ] **Step 3: 只在批准范围内运行一次。** 启动新的隔离数据目录与一份独立结果文件,启动前验证 PID/二进制哈希、route 文件权限及零既有 run;运行后逐调用对账真实付费 run ID、Usage、检查点持久事件、来源字面与语义、用户可读窗口和最终正文。拒绝工具候选后全实例停止,不自动重试或补写。
- [ ] **Step 4: 独立审阅与门禁。** 若两个阶段、逐项语义、最终结果或停止规则任一 FAIL,就保留证据与草稿 PR,不合入或部署。若全部 PASS,依 `policy/delivery.md` 再同步 base/head、复核独立 Review 与当前 HEAD CI,然后由智能体合入、核验实际结果并按任务卡规则安全收口;部署仍不在本计划授权内。
@@ -0,0 +1,45 @@
# 快慢通道 U3 质量修订设计 r0.2
状态:三处修订方向、本文书面设计及[实施计划 r0.2](2026-10-13-fast-slow-u3-quality-implementation-plan.md)已于 2026-10-13 在本会话获用户确认,零付费实施已获批准。新的付费模型样本仍须另行明确授权;合入须满足真实模型质量出口,既有实例部署不在范围。原 [U2/U3 计划](2026-10-13-fast-slow-u2-u3-plan.md)的 U2 持久化、执行权、来源权限和三栏工作台目标继续有效;其 Task7 质量出口仍为 FAIL。
## 目标与已证实的问题
目标仍是让普通用户在同一张卡里及时看到有用、可追溯的阶段成果,随后得到真实的最终整理结果。材料原文、模型判断、待用户确认的决定须易于区分;默认视图不把未经证实的判断当成已批准事实。保留左侧找上下文、中间推进对话、右侧处理工作,不新增页面或命令展示。
已获批的 v7 A01 样本在 Backend `7f8674f` 上产生两次 running 态落盘,但后台因 30,000-token 运行目标耗尽而没有最终正文;首批 analysis 把需求里的“规定总预算/包含12项”说成“已批准决定”,引用原文没有该批准事实,会议还写明审批尚未完成。第二批距失败终态仅 1.076 毫秒,不能作为两个用户可感知阶段窗口的证明。该样本使用两个付费 run、五次 provider 调用、57,997 reported tokens;非原文引用被拒后仍继续一次 14,231-token 调用,违反原计划停止条件。原始失败与[独立核验](../reports/2026-10-13-fast-slow-u2-u3-validation.md)保留,不追溯改判。后续评测入口的实例级停止门禁已独立复审通过,但没有新的模型行为证据。
离线复盘:后台首轮输入 10,657 字符,其中单独追加的 33 条来源索引约 6,355 字符,主要重复已内联的材料。后台三次调用的 prompt tokens 分别为 6,778/10,134/11,343,累计 Usage 35,632;最后一次请求前没有为最终答复留下可用额度。来源引文的字面校验只证明片段存在,不能证明 analysis 对批准状态的解释正确。上述成本结构是可测的改进机会,**尚不能证明压缩后模型必定完成**。
## 方案选择
| 路径 | 取舍 | 结论 |
|---|---|---|
| 仅加强提示词或提高预算 | 改动少,但 v7 已经证明提示词无法独自防止批准误判;提高额度会增加付费且不修正语义 | 不作为下一候选 |
| 增加第二个模型审核/摘要回合 | 可检查部分判断,但违反本批零附加模型调用边界,也引入新成本与时序 | 本轮不选 |
| 来源一次呈现、宿主限制批准断言、为最终答复留额度 | 利用既有来源账本和检查点,不扩大权限或页面;需要回归验证映射、误拒与模型实际行为 | **推荐,分三项实施** |
## 设计一:来源与正文合并呈现
`materialSources` 仍是唯一可信来源注册表,`validate` 的 owner/project、原件 hash、blockIndex、连续原文 quote 与版本检查不放宽。构造子任务输入时,按原文块顺序把已提供片段与它的 `sourceId`/`blockIndex` 放在一起;不再把相同内容以最多 180 字的索引片段重复附在末尾。模型只看到本次真正提供的前缀及其来源标识,未提供、无 Origin 或已截断的块不得获得可引用标识;原解析警告、文件名、表格文字与超长提示仍保留。这样来源编号紧挨着可引用原文,模型无需从两份文本间反查。
改变输入布局时递增材料处理配方版本,旧完成结果不复用为新行为。验收不仅比较字数,还要逐块证明:可见文本与原已提供前缀等价,来源 ID 集合与注册表一致,重复文本、截断块、表格、空文档和缺失 Origin 不越权。目标是显著减少 A01 输入重复量;数字由代码和固定材料实测给出,不事先声称节省 token 的比例。
## 设计二:批准状态和用户可见层级
`material_record` 继续由宿主以文件名和通过校验的原文片段生成,不接受模型转述。模型生成的 `analysis`/`provisional` 不能把审批、批复、通过等**肯定的批准状态**直接写成已成立事实;有明确批准原文时,让用户看到该原文记录,需要推断时写成待核对或 `needs_user`。宿主在检查点提交前拒绝可确定的肯定批准断言,保持整批原子拒绝,不把“尚未批准/待确认是否批准”误当肯定句。该规则只收紧这一类高后果断言,不能冒称通用语义验证器;A01 的每条分析仍须由独立审阅逐项核对。
现有任务卡继续展示真实状态、材料记载、判断、剩余工作与下一步。默认摘要优先呈现来源字面可核对的材料记载;模型判断明确标为“待核对的判断”,与原文记录分组,来源仍可在原 Collapsible 中展开。既有阅读、焦点、窄屏和三栏布局不变;颜色、字号、圆角、动效只用已有 UI 令牌。若只剩判断没有原文记录,卡片说明“已有待核对判断”,不写“已核对”或隐含批准。错误分析在独立样本中出现时不得进入无保留的默认摘要。
## 设计三:阶段成果后的最终答复额度
只对系统派发的材料整理子任务增加最终答复预算调度,不改变其他子代理与前台运行。依据 provider **已返回 Usage**、最新 prompt tokens、当前剩余额度、生产单次输出上限和已成功保存的检查点数,在下一次请求前预留至少一次完整最终答复的空间。已有两个有用检查点时,下一轮仅提供最终答复所需工具/提示,不再鼓励新增检查点;若只完成一项而继续发布会吃掉最终预留,优先给用户真实的部分结论,不伪造第二项。若连预计最终请求都放不下,就在发起新付费请求前停止并保留已保存成果。
预算是基于已返回 Usage 的请求前守卫,不宣称对在途请求构成严格账单上限。未知 Usage、检查点拒绝、达到 run/批次目标均按受控评测停止规则处理;不得因为缺额而自动扩大额度、换模型、回退或重新启动样本。正常产品路径可以继续按现有策略报告失败/部分成果,不能把阶段卡冒充最终正文。具体预留公式和最小可接受答复由后续实施计划固定,并用假 provider 覆盖高输入、两次发布、只完成一次、缺 Usage 与临界额度。
## 范围、验证与出口
预计修改 Backend 的材料输入组装、检查点提交守卫和材料子代理预算路径;UI 仅调整现有任务卡的来源/判断分组和摘要选择。Core 候选 JSON、数据库表、SSE 事件、权限模型、确认入口、并行/恢复所有权、生产路由和既有服务部署不在本修订范围。若实施发现必须改变上述公开契约或数据/权限设计,返回方案评审,不把它归为局部修复。
零付费门禁:来源映射与前缀等价测试;“需求规定50万、会议审批未完成”的错误批准候选先 RED 后 GREEN,明确批准原文与否定/待确认表达不误拒;预算假 provider 的两阶段加最终、临界额度与失败保持;UI 现有阅读、窄屏、焦点、设计守护及实际 HTTP 浏览器回归;Backend SQLite/真实 PostgreSQL 与 Dev 组合测试;独立代码审阅和精确组件 SHA。旧样本可用于离线回归,**不能当成新版真实模型前后对照**。
真实模型出口仍用同一合成 A01 及正常材料整理路径,至少两个真正有用、结束前可感知的不同阶段成果,逐项数字/审批/意见/引文正确,并有真实最终正文和完整 Usage;同时遵守任何检查点拒绝后停止的独立边界。行为面改动依 [Dev 交付政策](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/src/branch/feature/fast-slow-u2-u3-plan/policy/delivery.md)须在固定新候选上做任务级真实模型前后对照。新的付费样本、run 数、token 目标及停止条件要在候选代码和零付费审阅准备好后另行明确批准;未获批准标 `NOT_RUN`,全部 PR 保持草稿,不合入、不部署。
@@ -0,0 +1,56 @@
# U3 r0.3:有依据的阶段判断
状态:**书面设计与[详细实施计划](2026-10-13-fast-slow-u3-r03-evidence-implementation-plan.md)均于 2026-10-13 获用户批准,零付费实施与验证进行中**。用户选择“保留阶段判断,数字和归属须有可验证依据;不能证明就标待确认;不增加模型调用”。计划批准不授权新付费模型样本、合入或部署。
关联:[U2/U3 原计划](2026-10-13-fast-slow-u2-u3-plan.md)、[r0.2 质量设计](2026-10-13-fast-slow-u3-quality-revision.md)、[r0.2 实施计划](2026-10-13-fast-slow-u3-quality-implementation-plan.md)及[真实样本核验](../reports/2026-10-13-fast-slow-u2-u3-validation.md)。既有任务卡、来源权限、执行权和三栏工作台继续有效。
## 要解决的具体失败
r0.2 唯一获批 A01 在固定 Dev `501ae35` / Backend `d89c72e` 上有两个运行中阶段成果(相隔约13秒,第二次至终态约21秒)和真实最终正文,五次 provider 调用返回 Usage 共46,154 tokens。第二批 `analysis` 却把“总12项中3项依赖外部接口”和“第一期8项”推成“剩余4项**包含**这3项”。原文未说明接口依赖项位于哪一期。该条仍是最终卡的 active finding,独立只读重放判质量 **FAIL**;测试入口 exit0、11处字面引文正确都不能改变此结论。
当前材料配方 v8 已明确写着“原文没有给出的分期归属不能写成事实”,仍未阻止错误。现有宿主守卫只阻断部分肯定“已批准”措辞,无法判断集合关系;`assumptions` 是模型自述,也可能重复错误前提。用户要看到及时、可用的判断,但不能把不可推出的归属当事实。界面继续把原文、判断和待确认事项分层,后台细节不默认呈现。
## 方案取舍
| 路线 | 收益 | 主要代价 | 结论 |
|---|---|---|---|
| 只加提示词、自检句 | 接口变化小 | v8 的明确禁令已在真实样本失效,无法给宿主可复核依据 | 不单独采用 |
| 再加一个语义审核模型 | 可覆盖更多自然语言 | 新付费回合、延迟和第二模型的误判,且仍不能证明正确 | 本轮不选 |
| **结构化依据 + 宿主保守归一化** | 在不加模型调用的条件下保留可证明的判断,未知关系变成明确问题 | 需收紧候选契约和支持的关系范围;不认识的表达会降为待确认 | 推荐 |
## 用户可见结果
沿用同一张任务卡和现有分组:原文仍显示为“材料记载”;能由宿主核对的算式显示为带前提的“待核对的判断”;无法确定的归属显示为“需要留意/待确认”,例如“已提供片段没有说明3项接口依赖需求分别属于哪一期,请核对”。宿主不复述模型原来的肯定归属句。来源仍可在原有“查看依据”中展开;没有新页面、命令详情或确认按钮。
本文限定的是**阶段检查点**。最终正文仍须在单独真实模型样本中逐项核验,不能因为阶段归一化就称全文语义已由宿主证明。已有 r0.2 错误卡和原始结果不追溯改写;后续纠正沿现有版本/更正历史走。
## 候选与宿主边界
`WorkFindingCandidate` 增加可选的 `evidence` 对象,仅给本轮材料整理工具使用;已有 `TaskFinding` 展示字段、来源引用、事件序号与持久化表保持不变。模型一次工具调用仍提交1–3条新增发现,不新增摘要或审核模型回合。处理配方从 `material-recipe.v8` 递增,旧完成结果不当成新规则结果复用。
`evidence` 先支持三种明确结果:
1. **原文直接关系。** 候选给出 sourceId、blockIndex 和连续原句。宿主沿既有 owner/project、原件 hash、解析版本和可见前缀校验,只把原句明确说出的归属或决定作为材料记载展示;自由转述不提升可信等级。
2. **可复算数量。** 候选给出“总量”“已明确子范围”两个带原文短引的整数前提及减法。宿主只在受支持的数量/范围表述能从各自原文定位时计算差额并生成文字,如“12−8=4(推算)”;这个差额不自动等于第二期清单,也不推出3项接口依赖位于差额中。未知措辞、单位不一致、前提超出已提供片段或算式不符,都不发布肯定数量判断。
3. **关系未定。** 如材料只给总量12、第一期8、其中3项依赖接口,宿主能算出剩余4,但接口项与剩余部分的交集可能是0–3,不能确定为3。宿主将该条归一化为 `needs_user` 的待核对问题,保留经校验的来源;模型提供的肯定归属原句不进入任务卡。只有原文直接给出接口项的分期归属,或受支持的前提把可能范围收敛成唯一值时,才可发布确定关系。
任何带数字、集合包含、阶段/批次归属或“已决定/已批准”状态的**模型自由判断**,若没有受支持的 `evidence`,走保守待确认通道,不以模型 `assumptions` 代替证明。普通没有这些高后果关系的分析仍保留 r0.2 “待核对的判断”标签和来源展开,不宣称通用自然语言蕴含验证。输入语义解析只采用公开、有限、可测试的表述模式;遇到同义或复杂句不猜测而转待确认。校验器应记录归一化原因供审阅,但不把内部术语放到默认界面。
提交顺序仍是“校验全部来源与候选 → 归一化可确定/待确认条目 → 一次 CAS 事务提交同批结果”。来源无效、伪造 ID、版本漂移或候选结构不合法时整批拒绝,并遵守既有“拒绝后不再发付费请求”的受控试验边界;**关系证据不足但来源合法**时不是工具错误,而是由宿主在同一批中安全生成待确认条目,不丢弃同批有效发现。工具结果须明确告知模型该条已转待确认,供正常下一轮最终答复使用,不增加额外模型回合或自动重跑。
## 接口、权限和失败恢复
- Core 只扩展候选 JSON 的可选依据结构及校验;Backend 的工具声明、材料配方和检查点校验实现证据处理。Frontend/UI 跟随 Core 生成类型镜像,但既有卡片显示原语不变;若实施发现必须改展示契约,再回设计评审。
- 来源登记表、actor/owner/project、引用必须是已提供原文连续片段、原件 hash/解析版本与原子提交边界不放宽。不存在“模型说有依据,所以宿主接受”的路径。
- 新字段只作用于后续候选,旧卡、旧事件和原 r0.2 结果只读保留,无数据库迁移。中断恢复仍按宿主 attempt/epoch 执行;同一候选幂等键及原有更正语义不变。
- 预算依赖真实返回 Usage 与已修复的宿主 run ID 分组;依据字段可能增加输入/输出 token,实施时需离线比较上下文体积。没有额外调用或静默提高额度。任何新付费 A01 必须重新提交 run 数、用量目标和在途越额边界并取得单独批准。
## 零付费验证与真实出口
先写失败用例再实现,至少覆盖:本次 A01 的错误归属不能作为分析落盘;同样数字但**明确写明**3项均在第二期的原句可作为材料记载;12−8=4可显示为推算但不附加接口归属;交集可能范围0–3转待确认;已批准/尚未批准/是否批准与“六月已决定”无直接决定原句时的状态区分;同批一条有效一条证据不足的原子归一化;伪造来源和版本漂移仍整批拒绝;旧检查点幂等、刷新/阅读焦点不回退。Backend SQLite/真实 PostgreSQL、Core/类型镜像、UI设计守护、Dev `make test && make build`、任务自有 HTTP 浏览器和独立代码复审均固定准确 SHA。
真实质量出口沿用同一 A01 合成材料:至少两个真正有用、终态前可感知的阶段成果;所有金额、决定状态、日期意见、12/8/3数字、来源及集合归属逐项正确;有完整最终正文与 Usage;任何拒绝后零后继付费请求。阶段问题可诚实写“未明确”,不得靠删除判断、隐藏错误历史或降低验收条件放行。新模型样本在书面设计与实施计划获批、零付费候选完成后另行申请资源;失败保留草稿 PR,不合入或部署。
## 已知边界与待审决定
有限原文模式可能把真实但陌生的表述降为待确认,这是偏保守的可用性成本;需在真实材料与测试中量化,不能把它描述为通用语义正确性证明。依据字段增加模型输出负担,可能缩短最终答复余量,仍由已返回 Usage 调度;质量样本必须验证不牺牲最终正文。设计审批时请确认这一“保守降级,保持来源可查看”的取舍;若不可接受,需重新评估独立语义审核或人工处理的成本与边界。
@@ -0,0 +1,144 @@
# U3 r0.3 有依据的阶段判断 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. 本计划已于 2026-10-13 获用户阶段5批准,授权在现有任务工作区内做零付费实施与验证;新付费样本仍须单独批准。
**Goal:** 保留同一任务卡中有用的阶段判断;数字、集合归属和决定状态没有可核对依据时,只显示待确认问题,不把模型的肯定句当成事实。
**Architecture:** Core 为材料检查点候选增加可选结构化依据;Backend 沿既有来源注册表校验短引与有限数量关系,把可复算结论或未定关系归一化,再用现有 CAS 一次提交。UI 仍消费原有 `material_record`、`analysis`、`needs_user`;不增页面、按钮、数据库表或模型回合。真实模型质量仍须另行授权验证。
**Tech Stack:** Go、Core Go/TypeScript 契约、Backend runmgr/runtime、SQLite/PostgreSQL、React/TypeScript、Vitest、Playwright、Dev `make evidence` 与 Gitea CI。
**Spec:** [U3 r0.3 书面设计](2026-10-13-fast-slow-u3-r03-evidence-backed-judgments-design.md);失败依据在[U2/U3 核验报告](../reports/2026-10-13-fast-slow-u2-u3-validation.md)。初始工作区沿用已登记的 Dev `feature/fast-slow-u2-u3-plan`,不重做本任务 precheck、不创建第二份任务卡。r0.2 唯一 A01 的 `46,154` Usage、语义 FAIL 和原始文件均不改判。书面设计与本计划均已获用户批准;付费资源未获新授权。
## Global Constraints
- **阶段边界:** 本计划获人工批准后才改 r0.3 语义代码;真实模型样本仍须另外固定 run/Usage/在途风险并单独批准。旧授权已用尽,不自动重试。新样本任一语义或停止规则失败,六 PR 保持草稿,不合入或部署。
- **既有能力:** 不改 TaskSnapshot 数据表、事件序号、owner/project/attempt/epoch 权限、连续原文引用、历史更正与最终正文所有者。来源无效/版本漂移仍整批拒绝;依据不足但来源有效则安全归一化,并将同批结果一次 CAS 保存。
- **界面:** 左侧上下文、中间对话、右侧工作/文件不变;默认最多三项普通发现,关键 `needs_user` 可见,历史和依据仍用 `@ui` Collapsible。颜色/字号/圆角仅用 `@ui/tokens.css`,动效仅用 `@ui/motion.css`;异步状态唯一所有者仍是 Frontend store,旧 seq 丢弃。
- **成本:** 不增摘要/审核模型回合,不改生产路由或默许提高预算;依据字段增加 token 的影响必须离线量化,最终答复预留按真实返回 Usage 继续生效。
- **治理:** 实施首步先核对并同步已推进的权威 main,组件各自提交后推进 Dev gitlink;已有任务不重复 `make precheck`。验收、请求审核和合入前分别以 `CMD='make task-sync' make evidence` 同步;组合 `make test && make build` 的完整 SELF 收据由工具导入任务卡。独立 REVIEW/REPLAY 与精确 HEAD GATE 分开标记,禁止用旧 SHA CI 放行。
## File Map and Interfaces
| 单元 | 文件 | 职责 |
|---|---|---|
| 候选契约 | `modules/core/task_snapshot.go`、`task_snapshot_test.go`、`ts/types.ts` | 可选 `WorkFindingEvidence`,只约束候选,不改持久 TaskFinding;`sourceIndex` 指向同条现有 `sources` |
| 原文计数 | `modules/backend/internal/runmgr/material_evidence.go`、`material_evidence_test.go` | 在已校验来源短引中识别有限的总量/首期/依赖数量,算差额和可能交集,未知降级 |
| 提交与提示 | `modules/backend/internal/runmgr/task_checkpoint.go`、`material.go`、`material_sources.go`、相关测试;`internal/runtime/work_checkpoint.go` | 全字段风险检查、单批归一化/CAS、工具 JSON、归一化回执与 v9 处理配方 |
| 类型镜像/展示 | `modules/frontend/src/contracts.ts`、`modules/ui/src/contracts.ts`(`make contracts` 生成);`modules/ui/test/progressive-cards.test.tsx`、`modules/frontend/test/work-state.test.ts` | 消费相同现有卡片类别,待确认默认可见、历史/阅读无回退;无新页面 |
| 组合和记录 | Dev gitlinks、`.task/feature-fast-slow-u2-u3-plan.md`、Documents 核验报告 | 精确 SHA、SQLite/PG/浏览器、独立评审、草稿 PR 和结果出口 |
候选新增的内部契约固定为:
```go
type WorkEvidencePremise struct {
Role string `json:"role"` // total, phase, dependent, direct_relation
SourceIndex int `json:"sourceIndex"` // index into this finding's Sources
Value *int `json:"value,omitempty"`
}
type WorkFindingEvidence struct {
Mode string `json:"mode"` // direct_relation, difference, unresolved_relation
Premises []WorkEvidencePremise `json:"premises"`
Result *int `json:"result,omitempty"` // only difference
}
// Add to existing WorkFindingCandidate only:
Evidence *WorkFindingEvidence `json:"evidence,omitempty"`
```
Core 只验证枚举、数量、索引、字段组合和现有 16KiB 候选上限。Backend 的 `normalizeMaterialEvidence(candidate core.WorkCheckpointCandidate, sources materialSourceRegistry) (core.WorkCheckpointCandidate, []string, error)` 对已验短引、数值角色和关系作安全归一化:返回归一化候选、给工具结果看的简短说明、或必须整批拒绝的错误。实现时用 `TaskFinding` 原有类别和 `Sources/Assumptions` 保存输出,不引入新表。`direct_relation` 仅允许 `material_record`,只在短引本身明确写出关系时按现有宿主路径展示原文;`difference` 由宿主生成 `analysis` 和 `total-phase` 算式及“推算”;`unresolved_relation` 对可验证的三个计数计算交集范围,范围不唯一时由宿主生成 `needs_user`,范围唯一时也只由宿主生成有前提的判断,均不复制模型肯定归属句。现有无依据的 `material_record` 原文路径继续有效。
有限识别只接受短引中明确的“总/包含 N 项”“第一期 N 项”“其中 N 项依赖外部接口”等受支持中文数量语法及直接关系原句;超过已提供前缀、单位不一致、多个无法消歧的数字、陌生表述均走待确认。**不声称通用自然语言蕴含证明**。风险检查同时覆盖 findings 的 text/impact/assumptions 和 focus/remaining/nextStep;后者不能携带未经证明的归属或决定肯定句,必要时由宿主替换为中性进度/待核对说明。结构合法但原文不能证明的依据按“待确认”处理;sourceId/版本/权限不合法仍整批拒绝。
## Review Focus
1. **数字同句多义:** “第一期8项、第二期4项”不能把第二个数字当首期;单位“万元/项”不得交叉计算。Task 2 的多数字/混合单位 RED 用例必须保守降级。
2. **来源重复与截断:** 相同文字在两个文件、无 Origin、或来源只提供了首段时,`sourceIndex` 不得越权引用另一个块。Task 2 的来源映射与版本 RED 用例必须整批拒绝伪造来源。
3. **旁路字段:** findings 正确但 focus/remaining/nextStep 称“已决定第二期含3项”时,默认卡不能泄露该肯定句。Task 3 的全字段投影测试必须验证中性替换。
4. **混合批次:** 一条有效差额、一条归属未定、一条来源无效:前两者可在来源均合法时原子归一化;来源无效时全部不提交,且没有后继付费请求。Task 3 的 CAS/拒绝/幂等测试覆盖。
5. **预算和阅读回归:** 结构化依据扩大提示后,final-only 仍为最终正文留额度;待确认发现刷新/窄屏/来源跳转不抢文件和焦点。Task 4 的 fake-stream、UI/Frontend 与真实 HTTP 浏览器测试覆盖。
---
### Task 1:Core 候选依据契约
**Files:** Modify `modules/core/task_snapshot.go`、`task_snapshot_test.go`、`ts/types.ts`;不改 `TaskSnapshot`/`TaskFinding` 和数据库。
**Interfaces:** `WorkFindingCandidate.Evidence *WorkFindingEvidence`;`SourceIndex` 只引用同一 finding 的 `Sources`。Core 的 `ValidateWorkCheckpoint` 验证 `direct_relation` 恰一条关系前提且无 Result;`difference` 恰有 total/phase 两项且有 Result;`unresolved_relation` 恰有 total/phase/dependent 三项且无 Result。整数范围 `0..1,000,000`,同一模式不允许重复 role,索引须 `0 <= index < len(Sources)`;计算与原文语义交给 Backend。
- [ ] **Step 0: 在现有任务工作区同步基线。** 确认当前 Root/组件提交及任务卡收据已保存,使用 `RECEIPT=/tmp/fast-slow-u3-r03-first-sync-20261013.json CMD='make task-sync' make evidence`;导入原始收据。先核对最新 main 的项目成员/公开契约差异,遇到需改变本设计的冲突停在计划阶段。组件分支随后以同一权威主干处理各自合并;不得用旧 r0.2 组合假定兼容。
- [ ] **Step 1: 写 RED。** 在 `task_snapshot_test.go` 用现有合法候选加 `Evidence`,表驱动覆盖三个模式的合法组合、索引越界、负数、重复 role、未知 mode、difference 缺结果、unresolved 偷带结果以及候选 JSON 不超过现有16KiB工具上限。TS `types.ts` 增加同名可选字段后,构建期校验生成镜像一致。
```go
candidate.Findings[0].Evidence = &WorkFindingEvidence{Mode: "difference", Premises: []WorkEvidencePremise{
{Role: "total", SourceIndex: 0, Value: intPtr(12)},
{Role: "phase", SourceIndex: 1, Value: intPtr(8)},
}, Result: intPtr(4)}
if err := ValidateWorkCheckpoint(candidate); err != nil { t.Fatal(err) }
```
- [ ] **Step 2: 跑 RED。** `cd modules/core && go test ./... -run 'TestWorkCheckpointEvidence' -count=1`;预期新类型/校验缺失。
- [ ] **Step 3: 实现 Core 类型与结构校验。** 仅增加上述候选字段及 `ValidateWorkCheckpoint` 的有限模式检查;TS 权威镜像同步,不增加状态枚举或前端行为。
- [ ] **Step 4: 跑 GREEN。** `cd modules/core && go test ./... -count=1`;检查 `git diff --check` 和 Go/TS 字段名一致。
- [ ] **Step 5: 独立提交 Core。** 主题行英文祈使,body 写 `Why:/Evidence:/Impact:/Refs:`;Dev 指针留到 Task 4 统一绑定。
### Task 2:Backend 纯依据判定与保守降级
**Files:** Create `modules/backend/internal/runmgr/material_evidence.go`、`material_evidence_test.go`;Backend 内嵌 `deps/agent-system-core` 指向 Task 1 精确 SHA。组件同步若涉及权限/公开契约取舍,暂停并交人工决定。
**Interfaces:** `normalizeMaterialEvidence(core.WorkCheckpointCandidate, materialSourceRegistry) (core.WorkCheckpointCandidate, []string, error)` 不写库、不调用模型;调用方先对全部 `sources` 执行 `registry.validate` 与持久原件校验,函数只使用已提供前缀和候选中的同条来源短引。`parseCountPremise(quote, role, value) bool` 只识别受支持数量模式。`difference` 由宿主重新计算 result;`unresolved_relation` 用 `remaining=total-phase`、`low=max(0,dependent-phase)`、`high=min(dependent,remaining)`,`low!=high` 时把对应 finding 改为 `needs_user`、清空模型肯定 text/impact、填入宿主文字与真实来源;`low==high` 时也只发布宿主生成的、附前提的确定数量关系。前提数值超出总量安全降级,绝不输出伪算式。
- [ ] **Step 1: 写 RED。** 用 r0.2 A01 的三份首段构造来源注册表及候选:错误 `phase-list-gap` 不得保存“剩余4项包含3项”;12−8=4可保留为带“推算”的判断;明确原句“第二期包含3项依赖外部接口”可展示原文;0–3的未定交集转待确认。另覆盖 `12项/8万元`、同句两个阶段数字、来源重复、无 Origin、截断块、旧 parserRevision 和陌生数词。
```go
normalized, notes, err := normalizeMaterialEvidence(candidate, sources)
if err != nil { t.Fatal(err) }
if normalized.Findings[0].Kind != "needs_user" || strings.Contains(normalized.Findings[0].Text, "其中包含3项") {
t.Fatal("unsupported phase membership escaped", normalized.Findings[0])
}
if len(notes) == 0 { t.Fatal("model was not told that the claim became pending") }
```
- [ ] **Step 2: 跑 RED。** `cd modules/backend && go test ./internal/runmgr -run 'TestMaterialEvidence|TestMaterialSetBounds' -count=1`;预期未实现或错误断言失败。
- [ ] **Step 3: 实现最小纯函数。** 原文直接关系优先保留 quote 的字面展示;仅支持 `total/phase/dependent` 的有限角色和一致单位。自由文本中 `已决定/已批准/其中/包含/属于/剩余/第一期/第二期` 与数量或归属共现、却无可验证依据时,产出通用待确认句,不原样回显风险词句;不认识的表达也走保守路径。
- [ ] **Step 4: 跑 GREEN 与现有审批边界。** `go test ./internal/runmgr -run 'TestMaterialEvidence|TestMaterialSetBounds|TestMaterialApprovalClaims|TestMaterialSource' -count=1`;测试未触发的普通分析仍带“待核对”,否定/疑问审批表达不误拒。
- [ ] **Step 5: 自审并提交 Backend 独立提交。** 记录识别语言的有限范围及未知降级成本,不声称通用语义正确性。
### Task 3:一次提交、提示与预算兼容
**Files:** Modify `modules/backend/internal/runmgr/task_checkpoint.go`、`task_checkpoint_test.go`、`material.go`、`material_sources.go`、`material_sources_test.go`;modify `modules/backend/internal/runtime/work_checkpoint.go`、`work_checkpoint_test.go`。不改已经落盘的 r0.2 样本、数据库表或 SSE 契约。
**Interfaces:** `PublishWorkCheckpoint` 先结构校验和**全部**来源合法性,再调用 Task 2 纯函数归一化与审批/全字段风险守卫,最后沿现有 `CommitTaskSources` 做一次 CAS。Backend 对所有模型文本和结果文本都做守卫;有明确原文的 `material_record` 沿现有宿主引用路径显示。有效来源但不唯一的关系提交 `needs_user`;来源伪造、hash/版本漂移、JSON未知字段或越权依旧整个检查点失败。`runtime.WorkCheckpointSink.PublishWorkCheckpoint` 从 `error` 改为 `(string,error)`,`runCtx` 在 CAS 成功后才返回简短归一化回执;`publishCheckpoint` 将回执附在既有成功消息,供正常下一轮模型看见,不新增 provider 调用。处理配方从 `material-recipe.v8` 到 `material-recipe.v9`。
- [ ] **Step 1: 写 RED。** `task_checkpoint_test.go` 用 SQLite 断言“有效差额+未定关系”同批一次提交、无伪造肯定句;同批再加非法 sourceId 后整个批次零提交且已保存旧成果不丢;幂等同 ID 不重复计数,更正旧 finding 保留历史。`work_checkpoint_test.go` 的假 stream 断言工具成功消息说明“转待确认”,仍只有既有最终答复请求;focus/remaining/nextStep 注入无依据决定句会被中性化。
```go
before := card.Task.Revision
receipt, err := ctx.PublishWorkCheckpoint(mixedCandidate)
if err != nil { t.Fatal(err) }
if !strings.Contains(receipt, "待确认") { t.Fatal(receipt) }
after, _ := store.GetCard(owner, card.ID)
if after.Task.Revision != before+1 || after.Task.Findings[len(after.Task.Findings)-1].Kind != "needs_user" {
t.Fatal("mixed batch was not normalized atomically")
}
```
- [ ] **Step 2: 跑 RED。** `cd modules/backend && go test ./internal/runmgr ./internal/runtime -run 'TestWorkCheckpointEvidence|TestMaterialFinalReserve' -count=1`。
- [ ] **Step 3: 连接校验与工具说明。** 更新严格 JSON schema 的可选 evidence;将 `WorkCheckpointSink`、`runCtx` 与现有单测调用点一起迁移到 `(string,error)`,使同一 checkpointId 幂等重发也能返回同一安全说明。材料任务提示只说明三种依据及未知归属要转待确认,不重复整份来源索引;工具结果回报归一化原因但不向默认UI暴露 sourceId。完整来源/阶段状态仍由宿主唯一拥有。
- [ ] **Step 4: 跑 GREEN 与失败恢复。** `go test ./internal/runmgr ./internal/runtime -count=1`,加 `go test -tags live ./internal/server -run 'TestMechanismSourceExtractionAfterSourceOnce|TestEvaluationStops' -count=1`;离线比对 A01 输入与工具 schema 字符数/估算 token,若最终预留明显不足,停下来重新评审预算策略,不能私自提高额度。
- [ ] **Step 5: 提交 Backend。** 精确记录 Core gitlink、新配方版本、RED/GREEN、正常/拒绝路径,不把假 stream 称为模型质量证明。
### Task 4:组合、真实数据库与既有阅读界面
**Files:** Update generated `modules/frontend/src/contracts.ts`、`modules/ui/src/contracts.ts` only through `make contracts`;add/adjust `modules/ui/test/progressive-cards.test.tsx` and `modules/frontend/test/work-state.test.ts` if the current behavior is not already covered;update Dev component gitlinks and task card。任何新视觉令牌、页面、store 所有权或公开 TaskSnapshot 字段需求须回设计评审。
- [ ] **Step 1: 同步后的组件核对。** 复查 Task 1 的权威 main 同步记录和 Core/Backend 分支来源;组件各自与最新权威 main 核对,解决不改变设计的冲突。当前主干已含项目成员相关 Backend/Frontend/Documents 变化,不能用旧 r0.2 组合声称兼容。
- [ ] **Step 2: 类型镜像 RED→GREEN。** 固定 Core SHA 后先运行 `make contracts`,用 `git diff --exit-code` 检查生成镜像与 Core 类型一致;该命令预期在两个镜像尚未提交时指出差异,随后按生成结果提交。UI 断言材料记载优先、待核对判断限量、`needs_user` 在“需要留意”默认可见;Frontend 断言刷新/迟到来源响应不抢文件/焦点,旧 seq 丢弃。`cd modules/ui && npm test && npm run typecheck`、`cd modules/frontend && npm test && npm run build`。
- [ ] **Step 3: PostgreSQL 与 SQLite。** Backend 全量 `go test ./... -count=1`;用任务自有新数据目录/端口启动隔离 PostgreSQL,`AGENT_PG_TEST_DSN` 仅指向该测试库,运行 `go test ./internal/runmgr ./internal/cardsvc ./internal/store -count=1` 并停止任务进程;来源CAS、混合批次和预算路径须在两档一致。输出经 `make evidence` 记录。
- [ ] **Step 4: Dev 组合与真实浏览器。** 组件都提交后推进 gitlink,干净 HEAD 上用 `CMD='make test && make build' make evidence` 捕获完整输出并导入任务卡。启动带 PID/二进制 SHA/数据目录/组件 SHA manifest 的新任务自有 mechanism 实例;`PLAYWRIGHT_BASE_URL`、`WORK_CHECKPOINT_HTTP_MANIFEST` 均从本轮 manifest 验证后传入 `e2e/work-checkpoints.playwright.ts`。用真实 HTTP 验证待确认卡、来源跳转、版本变化、刷新和后台不抢阅读;仅停止本任务进程,保留 trace。
- [ ] **Step 5: 独立代码复审与草稿 PR。** 审阅者用准确 Core/Backend/Frontend/UI/Docs/Dev SHA 重放五类 Review Focus;修复 Important 后按影响补测。六个 PR 继续草稿,推送当前 HEAD,核验 Dev `test/test-pg/svc-realcombo`、Backend `vet-and-test`、UI `test` 的受信 runner、SHA、所有必需步骤;Core/Frontend/Documents 无独立工作流时由 Dev 组合 CI 覆盖其 gitlink。真实模型仍 `NOT_RUN`,不合入。
### Task 5:真实模型质量出口(另行资源审批)
**Files:** 只在受控评测入口确有缺口时改 `modules/backend/eval/live/work_checkpoints_test.go`/`internal/server/work_checkpoint_eval_test.go`;结果写 Dev 任务卡与 Documents 核验报告。旧 r0.2 A01 的原始 exit0、46,154 Usage 和语义 FAIL 不改写。
- [ ] **Step 1: 准备可审查、一次性的资源提案。** 固定新 Dev/Backend/UI/Frontend/Docs SHA、同一 A01 材料哈希、受保护路由来源(不输出 key)、新结果文件名、最多 run 数、单 run 与整批**返回 Usage 目标**、输出上限/300秒、缺 Usage/检查点拒绝/超额停止规则;明确在途调用可越过目标,无法凭源码承诺货币硬上限。
- [ ] **Step 2: 等待用户明确批准。** 没有新授权则 `NOT_RUN`,六 PR 草稿且不合入;r0.2 的“授权”只覆盖已经执行的一次,不能复用标签或重跑。
- [ ] **Step 3: 获批后只运行一次。** 全新隔离数据/manifest/输出,启动前重验 PID、二进制哈希、路由权限、零既有 run;逐调用核对实际 paid run ID、工具次数、Usage、持久阶段窗口、每条原文与逻辑归属、最终正文;任何工具拒绝后不再发 provider 请求。结果与失败用 `make evidence` 原样保存,不补写或重试。
- [ ] **Step 4: 独立 REPLAY 与交付裁决。** 两个实质阶段、数字/决定/归属语义、完整最终答复及停止边界全部 PASS 后提交阶段 6/7 产物供人工评审;人工通过后才进入 `policy/delivery.md` 的重新同步、独立代码复审、精确 HEAD CI 和智能体 PR 合入。任一 FAIL 保留真实证据与草稿,修订设计/资源后再单独评审。部署不在本计划范围;合入成功后按已授权的任务卡归档和安全工作区回收规则收尾。
@@ -0,0 +1,52 @@
# IAM I1 阶段 7 正式测试与验收候选
日期:2026-10-13(北京时间);负责人:weichen;测试执行:Codex;状态:用户已通过阶段 7。正式代码 Review、PR、CI、合入和部署分别记录,不由本页代签。
用户在本会话回复“确认”,对应 Dev `4af5956`、Documents `064d4b5`、RDM `70e27b08` 的阶段 7 报告及下述明确缺项。按 Dev `policy/delivery.md` 进入智能体负责的阶段 8–9;同步后的新组合须重新验证与独立 Review。工作区清理、部署和 U3–U9 仍需各自授权。
## 批准与范围
用户回复“批准”,对应 [阶段 6 实施交付](2026-10-13-iam-i1-review.md) 的 Documents c023551、RDM b93908e、Dev 72ed8b4。批准原版本保留,恢复同步后的测试版本另列。本次按已获批 [统一方案 r1](2026-10-13-identity-role-permission-plan.md) 的 I1=U1–U2 及 [权限合同](2026-10-13-iam-i1-permission-contract.md) 验证当前公开命令/API边界;不关闭 R1–R20 全部目标,不实施 U3–U9,不操作现有服务、生产数据库或真实账号。
恢复处理包括:Dev Documents 同步冲突保留上游项目成员规划及三份 I1 批准文档原文;RDM 采用上游 `rdm.project.member.set-role` 合法命令 ID,保留 I1 身份包装。没有恢复旧权限旁路,没有变更 RDM pins;所有失败、恢复、同步收据保留。
## 固定对象与完整收据
| 对象 | 固定版本及结果 | 原始记录 |
|---|---|---|
| Dev 集成组合 | `10789653f989da6dc8a5ecc72d996dc2764208db`,同步目标 `ee9b437b22b49f96e1bc65f79417b22e8e82a37c`;`make test` 退出 0 | Dev 任务卡 SELF 收据 `ea7b77587b568d968594b0cb90c5362cab27d8eab1492da8cdea14d74e43d11d` |
| RDM 完整组合及 HTTP | `70e27b08c65d8e966a11b1d30723414ec3e36f8e`,同步目标 `6c689caa1fa271c2a16174427df51a9b8919c4e0`;`make test`+真实 HTTP+产物/测试摘要检查退出 0 | RDM 任务卡 SELF 收据 `6e684a9047e43b0bdafbc71604ab5debe06bf437d1e3c95c4169d310f11d70c0` |
| 独立最小重放 | `/root/i1_phase7_review` 未参与源码修改;先在 `58a23f8c` 重跑 39 个顶层 TestIAMI1,再审查作者材料并重跑最终 HTTP 10 组;退出 0 | 已导入 RDM 卡的完整 SELF 工具收据 `6bbb0f747e41c28d3c2327c587e162072a69495573def6f97a6d1657eb0b0d76`、`c7edde369566552acf4060500985a4a80ea004af80455446de9a215f64f89587`;工具标签不自行升级 |
| RDM 二进制 | SHA256 `93aabc13041cf5a5c5636ebd0c88979a4d0f6fd0f79ba1272defc75176a75d81`;从实际组合产物运行,没有使用 Vite 或仅源码模拟 | `bin/PRODUCT_MANIFEST.json` 与上述工具收据 |
| HTTP helper | SHA256 `a7d1d3260f4a62f0cb14b91339506419e9be306f2d0e3f7c74a6e77e76a458d4` | RDM `.task/artifacts/iam-i1-http-acceptance.py`;代码与测试材料已提交 |
RDM 固定 Backend `0f192a481388184df39f81c28b0587a7e16ec3ca`、Frontend `4965de269a441a7df02b46d8533067f044e79b8b`、UI `bfecf8b51f9a0fdbd9a13590cddf8fc06b7ae700`;前端 dist 摘要为 `13acbec506086fe8`。Dev 新组合与 RDM 产品各自固定、各自检查;不能用 Dev 新接口存在证明旧 RDM pins 已消费其能力。后续只记录文本的提交不改变这些行为对象;最终记录提交及工作树检查另见任务卡。
完整命令输出由 evidence 工具保存于两个任务卡,本文只提供判据和结果摘要,不转写输出、不提升来源等级。测试本地来源为 SELF;用户批准、受信 CI、平台账号独立批准及部署各自独立。
## 需求到证据
| I1 要求 | 正常/异常/边界判据 | 当前结果与测试 |
|---|---|---|
| R6/R12 系统与项目作用域 | 合法管理员创建/配置/任命角色成功;获 A 的 project.settings 者可改 A 名称,但全局 role/cap/admin transfer 被权限拒绝;body 伪造 actor/owner 不改变认证身份 | PASS;注册命令 TestIAMI1+真实 Bearer HTTP,先检查命令已注册,再要求权限原因,不把未知命令或 schema 拒绝计通过 |
| R7/R8 管理资格不授 B 业务访问 | /api/me 明确实际平台管理员身份;A 创建者且管理员对 B 的成员、权限、归档和审计操作拒绝,当前项目清单不显示 B;合法角色获授者可建 B | PASS;真实新实例 /api/commands/{id}+项目/审计相关 Go 正反例 |
| R9 创建者也受硬 cap | 已确认 Alice 在 A 的 doc.write 允许并有 allow 覆盖;保留 default=true,只关闭 cap;实际高危命令确认后因上限拒绝 | PASS;HTTP 隔离 cap 变量;Go 创建者 cap、平台 cap、未知角色动作与读策略故障等边界 |
| R11 停用/换岗/旧覆盖 | 旧 doc.write allow 后换到未定义该动作角色,执行及解释拒绝;停用前 doc.read 允许,停用后消失,执行/矩阵均显示已停用原因 | PASS;HTTP 精确原因与前后矩阵+TestIAMI1;没有借其他已存在拒绝原因替代停用测试 |
| R18 私人原件/草稿与读取范围 | 真实 held 原件仅上传者可确认;管理员与未知 batch 获相同不透明拒绝且无实际 B 项目或文件信息;私人候选、差异、快照、审核状态、聚合读面/模型输入按当前 owner/阶段/grant 判定 | PASS;真实 HTTP 上传确认+SQLite/已注册命令实际正文和持久状态负例;本次不声称完整 U5/U6 资源职责模型已实现 |
| R12/R18 幂等回执和 outbox | 操作/项目/主体/资源不匹配 opID 不返回他人回执;合法重放保留;outbox 归属与业务在同 Tx 写入,仅送到实际 owner Host,未知旧归属保持 pending | PASS;TestIAMI1 实际回执和 SQLite 状态+既有原子/失败重试回归 |
| 注册和组合回归 | 当前 set-role 等命令 ID 正确注册并保留身份校验;根页为实际 React embed、未认证命令 401;RDM 29 项 Web、全部 Go;Dev 治理、公开边界/pins、库、Core、Backend、Frontend/UI、命令检查 | PASS;两套 make test 及当前产物真实 HTTP;不把 HTML 获取等同于浏览器交互验收 |
## HTTP 测试过程及独立复核
实际 HTTP 使用全新临时 SQLite、三名合成主体和随机 API Key;平台首位管理员在其他开户之前由可信 CLI 建立,/api/me 核验其真实身份。服务仅绑定随机回环端口,强制关闭执行工具,环境不继承 DSN、服务实例绑定或模型密钥,HTTP 禁用代理。真实私有会话和确认卡到最终回执的路径执行高危命令;native 项目仅为确认上下文,不作为 RDM project.create 政策的通过证据。测试结束只终止自己的 PID;成功临时场景回收,失败场景保留用于诊断,不修改既有实例。
初次 HTTP 在未经过高危确认流程时拒绝,该结果没有被计为权限通过;补齐确认路径后重验。首位管理员创建顺序错误同样保留失败证据,不关闭原防接管机制。独立审阅又指出停用/默认与 cap 的两处测试假阳性风险;已分别加停用前后读权及原因检查、保留 default/allow 只关 cap。最终独立 HTTP 重跑 10 组通过,审阅范围内无剩余 Critical/Important。
## 缺项、兼容边界与验收决定
- 全产品浏览器交互和真实模型任务级前后对照:NOT_RUN。本轮 I1 没有业务 UI 实现,已规划出口为直接命令/API与当前回归;完整浏览器及 Agent 闭合属后续单元。工具描述真实模型对照仍是明确缺项:本轮未建立固定模型/配置/任务集/费用范围,mock 与 HTTP 不能替代模型行为。补救为另行明确测试条件后执行任务级对照,在后续 Agent/全产品验收前闭合;不能计 PASS。
- PostgreSQL、多实例、在途后台最终提交 epoch、账号有效态/恢复、多职位/项目选用及完整三权:本轮完整验收未执行;按 U3–U9 依赖和各自授权推进,不迁移生产 DB。
- 已批准的 I1 默认拒绝保留:无范围证明的 whole-prefix 知识撤销和公共全量自举拒绝;没有可信 Host 项目证明/资源分类的共享读取拒绝;audit.read 不随管理员或创建者自动授予;旧未知归属 outbox 不推测 owner。恢复这些能力须新公开提供者/消费者合同,不由此次测试擅自补接口或改 pins。
- PR/受信 CI/GATE、正式阶段 8 Review、合入、部署及工作区回收:NOT_RUN。独立提前审阅和本地重跑不代替平台条件。
原提交给用户的阶段 7 决定范围:固定 I1 U1–U2 的命令/API边界与回归结果,以及上述明确缺项/既定兼容限制。提交时结论为“本地测试已通过,待人工验收”;用户随后回复“确认”,已在页首记录为阶段 7 通过。原长期方向及下一任务仍为获批方案 I2/U3,需另行授权,当前不启动。
@@ -0,0 +1,193 @@
# IAM I1 权限边界与公开扩展合同 r1
负责人:weichen;编制:Codex;更新时间:2026-10-13。
依据:[用户、职位角色与分层权限统一方案 r1](2026-10-13-identity-role-permission-plan.md)
(Documents `a088809`,原文 SHA256 `39b8e9a6e078dc509bd80118c1807ce6ed23e4466e5902b51f4bfa255d55c0a1`)。
用户已批准该方案并授权 I1=U1–U2,原实施终点为本地人工评审;阶段 6、7 已分别获用户“批准”“确认”。当前按 Dev policy/delivery.md 进入智能体 Review、PR、CI 与合入,状态及固定对象见[验收记录](2026-10-13-iam-i1-acceptance.md)。迁移、部署、工作区清理及后续增量未授权。
本合同为 U1 产物,冻结已批准语义与提供者/消费者责任;新增公开接口仍须对应模块实现、固定版本及合同验证,不能据此宣称能力已提供。
源码、业务测试及运行验收结果以 I1 任务卡的工具收据为准;本文不复制测试结果。
## 1. 当前增量与最终目标
最新用户裁定取代旧“管理员拥有全部业务权限”“创建者不受职位 cap”“每人仅一个生效职位”的现行解释。
历史会议、原方案、旧批准记录和 `.tmp` 原件保留;旧结论只用于解释历史行为。
系统管理员管理系统与授权主数据;读取他人业务内容必须有具体项目和资源授权。
职位支持一职多人、一人多职,项目明确选用有效职位绑定;新任命不自动增加既有项目权限。
通用职位、绑定、默认/上限与系统授权迁至 Backend 是已批准设计;RDM 保留项目成员、项目选用绑定、项目覆盖、资源及文档职责/状态。
| 层 | I1 范围 | 后续范围 |
|---|---|---|
| 文档 U1 | 需求裁定、动作目录、角色 cap、隐私、公开扩展申请与验收合同 | 按固定公开版本补提供者/消费者验证 |
| 执行端 U2 | 在现有 RDM 单绑定和旧管理台账上收口可达越权路径;实际结果另见任务卡 | 账号有效态、受控目录及恢复能力 U3;通用职位与多绑定 U4;项目明确选用 U5 |
| UI/Agent/迁移 | 不以文档保存证明能力已就位 | 矩阵、统一工具、完整撤权与数据迁移分别按 U7–U9 授权实施 |
I1 的 legacy 单绑定适配不是最终多职模型:旧账号至多一个专业角色,项目尚无显式 bindingId 集合。
已有绑定必须先检查角色有效态、动作定义与 cap,再计算默认/项目覆盖;停用或失效不能回落为无绑定成员默认。
未绑定旧会员的关系默认只能作为已登记的 legacy 兼容来源,仍受平台 cap、项目关系和资源限制;不能伪装成新的职位绑定或最终模型的资格证明。
U4/U5 迁移后无有效选用绑定的业务动作默认拒绝;迁移差异须单独评审,不在 I1 静默改造数据。
旧 RDM 管理台账在 I1 仅为明确系统管理动作的兼容来源,不能生成项目成员关系、业务 grant 或资源 bypass;`Host.IsAdmin()` 同样不能代替业务授权。
I1 还将当前分发 Host 的平台管理员身份显式适配为上述四项受保护系统动作;必须同时满足认证 actor 与 Host.Owner 一致,不接受 body 的管理员声明,也不把该适配扩展到其他未知动作或业务动作。细粒度系统 grant 的通用权威仍属 U4。
## 2. 动作目录与配置主体
scope 由受信 `ActionMeta`/权限注册表确定,不接受请求自报 scope,不按字符串前缀推断。
系统动作只消费系统来源;项目动作限定实际项目;资源读取还须匹配实际资源、分类与读取动作。
下表为 I1 稳定动作合同。“后续”项仅冻结目录,当前尚未提供相关接口。
| actionId | scope | 配置/执行主体 | 附加边界 |
|---|---|---|---|
| `system.roles.manage` | system | 受保护系统管理者 | 角色创建/编辑/停用/读取;不能经项目覆盖获取 |
| `system.roles.assign` | system | 受保护任命者 | 任命在可委派上限内;不能间接授予受保护系统权限 |
| `system.policy.manage` | system | 受保护策略管理者 | 平台 cap 与权限政策;保护最后有效管理者 |
| `system.admin.transfer` | system | 当前有移交资格的系统管理者 | 明确移交目标;旧 `rdm.perm.transfer` 映射此门禁 |
| `project.create` | system | 有明确系统/职位建项 grant 的有效用户 | 创建者管理 cap 资格见 §3;不接受项目 allow |
| `project.archive` | project | 目标项目的合法管理者 | 保留稳定 ID;纠正旧目录误标的 system scope |
| `project.settings` | project | 目标项目创建者/委任管理者或合法获授者 | 仅本项目设置与覆盖;不能进入全局角色、cap 或管理员移交 |
| `member.manage` | project | 本项目合法管理者 | 成员及选用角色管理;不得替他人做本人受限重选 |
| `duty.assign` | project | 本项目合法分配者 | 候选有效成员+对应资格 cap+三权异人;分配不代签 |
| `stage.advance` | project | 有阶段推进 grant 的成员 | 阶段准入准出、当前状态 |
| `doc.read` | project | 有读取 grant 的成员 | 文档阶段范围+受控正文职责/明确资源授权 |
| `doc.write` | project | 有编制资格的指定编制人 | 具体文档、当前状态、冻结版本;不因管理权取得 |
| `doc.publish` | project | 有发布资格及对应职责的成员 | 固定整文版本及已批准状态,不替代批准签字 |
| `review.participate` | project | 有评审资格的指定审核/批准人 | 按具体职责决定可执行动作;只能批注及通过/驳回 |
| `trace.edit` | project | 有追溯编辑 grant 的成员 | 文档层/项目层裁定范围与状态分别检查 |
| `knowledge.publish` | project | 有发布 grant 的成员 | 明确提交/发布;不能借发布读取私人原件 |
| `audit.read` | project | 有明确业务审计 grant 的当前成员 | 独立于正文读取;当前角色动作 cap、平台 cap 与范围均满足 |
| `system.settings.read`/`system.settings.write`及设置子项 | system,后续目录 | 对应系统管理者 | 模型、插件、Agent、检索等设置分项授权 |
| `system.users.view`/`create`/`edit`/`disable`、`credential.recover` | system,后续目录 | 对应账号管理者/恢复提案者 | 编辑资料不能改管理员资格;恢复见 §6 |
| `permission.manage`、`knowledge.read`、`trace.read`、`document.read`/`export`、业务审计导出 | 后续目录,project | 按注册元数据和当前业务关系 | 当前 `doc.*` 等 ID 不静默重命名;新增需公开版本映射 |
`audit.read` 是 I1 新独立项目动作:必须由合法项目管理者在上限内明确授予,或来自明确配置的角色默认 grant;管理身份本身不提供审计 grant。
非成员 admin、仅持 `Host.IsAdmin()` 的主体、无审计 grant 的创建者、cap 已收紧的旧获授者均拒绝。
系统安全日志只披露必要安全动作、结果及不透明对象标识,不能包含业务正文、文件名、项目名、内容摘要或完整业务差异;业务审计仍走 `audit.read`。
| 旧入口/元数据 | I1 兼容规则 |
|---|---|
| `rdm.role.create`/`action`/`disable`/`list` | 命令 ID 保留,系统门禁改为 `system.roles.manage` |
| `rdm.role.assign` | 命令 ID 保留,系统门禁改为 `system.roles.assign` |
| `rdm.perm.cap` | 命令 ID 保留,系统门禁改为 `system.policy.manage` |
| `rdm.perm.transfer` | 命令 ID 保留,系统门禁改为 `system.admin.transfer` |
| 旧 `project.archive` scope=system | 目录版本标记改为 project;具体项目重验;旧系统覆盖写法不继续接受 |
| `project.settings` 作为全局门禁 | 不兼容保留;项目 grant 不被翻译成系统 grant |
| 未登记 ID、旧示例 `admin.transfer`/`business-audit.read` | 不是隐式别名;拒绝执行/写入,采用上表稳定 ID 或显式版本映射 |
## 3. cap、创建者资格与撤权
最终系统动作路径为:有效账号 ∩ 受信系统动作 ∩ 平台允许范围 ∩ 受保护规则 ∩ 明确系统 grant 或完整系统职位默认路径;项目覆盖不能参与。
最终项目动作对每个有效且本项目选用的 binding 建立完整路径:
`有效成员/管理关系 ∩ 已定义动作 ∩ 平台 cap ∩ 本职位 cap(含范围) ∩ 项目覆盖/当前默认 ∩ 资源关系 ∩ 阶段/状态 ∩ 文档职责`。
至少一条完整路径允许才放行,不拼接不同职位的 grant 与资源范围;平台禁止、项目明确 deny 和资源禁止对所有路径生效。
`allow` 只能替换默认 grant,不能创造未配置动作或越 cap;`deny` 阻断该成员该项目该动作的全部路径;`inherit` 使用当前默认。
停用、解绑、换岗、cap 收紧、账号停用和成员移除后重验当前资格;遗留 allow 不能复活旧权。
创建者关系只提供本项目管理默认,其有效角色 cap 与平台 cap 仍先验;A 创建者不能管理 B,不能读取私人资源或代签。
建项前校验创建者角色组合具备 `project.settings`、`member.manage`、`duty.assign` cap 资格;这些角色 default 可关闭,由创建者关系提供项目内管理默认。
最终创建项目、创建者成员关系及所选 binding 在同一领域事务落地;宿主绑定以可恢复状态和幂等对账处理。
已有项目遇 cap 收紧保留 `createdBy` 与历史归属,阻断受影响动作并说明等待重新任命;不能扩大 cap 恢复管理。
受限“重新选择本人项目职位”是后续独立动作,不复用 `project.settings`:仅当前有效负责人本人,从账号当前有效任命中明确选取具备管理 cap 的 binding,按项目当前版本确认。
仅此动作可使用尚未被本项目选用的任命;它不改变负责人、不恢复遗留 allow、不清除 deny、不授予资源读取或三权。
系统任命者不能代选;无合格任命时保持等待。项目内移除最后负责人须保护实际可操作管理资格;系统必要撤权不因这一保护而被阻止。
## 4. 资源、正文与审计读取合同
认证 actor、资源真实 owner/projectId/resourceId/分类来自执行端受信上下文;客户端标识只能定位对象,不能授予访问。
本人的私聊、私人原件和个人草稿属于私人资源;在当前账号有效且资源确属本人时按自有资源规则读取,不因放在项目下变为受控正文。
受控文档正文即使物理由本人生成,也须具体文档职责或明确资源授权、当前项目资格及当前 cap;真实 owner 相等不绕过受控规则。
审核/批准职责仅开放送审正文与明确关联材料,不开放未分享原件、私聊或私人草稿;分享只授予指定资源的只读能力,不授予编写或签字。
项目知识只由明确提交/发布产生;成员身份不意味着私人资源或所有受控正文全量可读。
历史签字、职责与事件保留;历史内容读取依旧使用当前授权,时间点重建不恢复当时权限。
读取、下载、列表、搜索、stream、模型上下文均遵循同一分类和当前判定;裁剪列表后再返回数量/分页,拒绝不得泄露存在性。
I1 现有项目聚合审计 DTO 含正文预览,故除 `audit.read` 外还必须具备当前完整项目 `doc.read`;阶段范围受限者不能通过全项目聚合审计取得范围外正文,按资源裁剪的细粒度审计由 U5 完善。具体文档导出检查该文档的 `doc.read` 和阶段范围,不把审计 grant 当成导出 grant。
I1 私人 pending/rejected 草稿仅提案人可读与决定;知道 proposalId、拥有项目管理权或文档职责都不能采纳/拒绝他人私稿。已采纳正文仍按当前文档读取授权逐项过滤。原件批次确认只限上传者本人,管理台账可披露经当前管理授权限定的业务元数据,不能因此读取或确认私人原件。
## 5. 公开扩展:现有能力与四要素申请
以下现有公开面是 I1 原合同的 Backend `0f192a481388184df39f81c28b0587a7e16ec3ca` 快照,参考 `pkg/extension/extension.go`、`host.go` 与 `surface.txt`,不导入 Backend internal。
该快照的 `SurfaceVersion=2.11.0-experimental` 源码声明不是部署或消费者可用性证明,也不代表后续主干能力;同步后的组合必须重新核对提供者及消费者实际固定版本。
| 现有能力 | 提供者/消费者 | 足够性与边界 |
|---|---|---|
| EXT-18 `AdminProvider.IsAdmin()`/`Request.HostProjectID` | Backend 分发 Host → RDM | 平台管理身份与宿主项目定位;不能证明系统分项授权、账号有效态、RDM 项目关系或业务访问 |
| EXT-19 `AccountLister.ListAccounts(cursor, limit)`,`AccountEntry{Owner,Valid}` | Backend → 授权目录消费者 | 最小身份目录,非资料页;不提供姓名、联系方式、多职绑定或写权;缺能力不允许新增产品路径无校验继续 |
| EXT-8b `ResourceAuthzQuery`/`ResourceAuthorizerV2`/注册口 | Backend 构造受信查询 → RDM 提供策略 → Backend 执行 | 现有六要素为 actor/action/resourceType/resourceId/owner/projectId;读取专用,V2 对域内读权威(含自有命中);未注册的 V1 回落不能替代 I1 必需的资源限制 |
以下是 U1 冻结的公开扩展申请四要素,符号为合同草案,I1 不新增导出实现、不更改 surface 版本。
| 申请 | 场景 | 希望的公开符号/路径 | 现有注册点为何不足 | 兼容方式 |
|---|---|---|---|---|
| IAM-P 政策与动作目录 | UI/命令/工具需查询 scope、cap、有效绑定、权限解释与版本;角色通用权威迁移后供 RDM 同源判定 | 可选 `PermissionCatalogProvider`、`AuthorizationProvider`;公开目录/判定/解释与授权管理预览提交服务 | `IsAdmin` 只有布尔身份;`ActionMeta` 在 RDM 内部;EXT-8b 仅资源读,无法供系统管理或管理写入事务使用 | 新可选接口及版本化 DTO;旧 Host 不加必实现方法;RDM legacy 适配与新权威切换分别固定版本 |
| IAM-D 受控人员目录 | 项目选人需要稳定身份、有效态和最小辨识字段,系统资料管理需独立授权 | 可选 `AccountDirectoryProvider` 与版本化查询/投影 DTO;既有 EXT-19 保留 | `AccountEntry` 仅 owner+valid,没有字段权限、搜索模式、可披露辨识资料及多职;私自扩展所有账号资料会扩大披露 | 新可选接口;旧 `ListAccounts` 不改变返回隐私范围;不得向旧消费者塞入联系方式 |
| IAM-R 资源与当前政策上下文 | 跨原件/草稿/正文/审计分类,查询当前 policy/duty epoch,撤权影响读面与后台提交 | 新版资源查询/决策 DTO 及可选政策上下文提供者;保留 `ResourceAuthorizerV2` | 六要素无分类、职责/版本/epoch;bool 返回不能携带可披露原因与版本,读适配器不能承担写入事务 | 新版本资源接口或明确 DTO 增补;禁止未知字段零值放行,必需提供者缺失即拒绝;版本协商与双读仅作诊断 |
| IAM-C 账号本人恢复 | 管理者只能提出恢复,账号本人经独立证明才能取得可兑换设密能力 | 公开恢复提案/本人确认/兑换回执合同,隔离恢复凭据与业务会话 | `IsAdmin`、目录、资源授权均不提供本人证明或安全凭据交付,不能用个人资料代替 | 新路径/可选能力,不向普通管理员交付目标账户可兑换 Key;旧不满足证明的线上路径明确拒绝 |
| DTO | 必须冻结的字段与版本语义 |
|---|---|
| `PermissionDescriptor` | `actionId`、`label`、`description`、`scope`、`resourceTypes`、`group`、`conditions`、`delegationLevel`、`risk`、`descriptorVersion`;稳定 ID 不随改名变化,新增项默认拒绝 |
| 授权查询/解释 | 受信 actor、actionId、资源定位与实际归属、当前状态/版本、选用 binding;输出 allow/deny、可披露 reason、来源链、`authorityEpoch`;解释只限本人或有权管理对象 |
| 目录查询/投影 | 稳定 userId/owner、valid、获授权姓名/登录名/工号/职位投影、cursor/limit、精确/模糊模式及字段/状态过滤、`directoryVersion`;未授权字段不返回、不参与匹配;电话、邮箱、部门、备注只在独立授权资料面披露 |
| 管理 patch/预览 | 固定对象 ID、expectedVersion、authorityEpoch、patch 摘要、幂等键;预览不代替提交授权,非法对象/越 cap/冲突整体拒绝;跨模块写入不冒充单库事务 |
| 资源决策扩展 | 受信分类(私人/发布知识/受控正文/业务审计)、resourceVersion、policyVersion、dutyVersion、authorityEpoch 与决策原因;缺失或不认识分类拒绝,禁止请求自报归属 |
目录 r1 的 scope 修订不能只改显示标签;执行端必须同时拒绝错误作用域写入。公开版本须同时登记导出面快照、版本号、变更表、提供者/消费者合同及固定组合。
缺必需能力、未知动作/字段/状态、政策读取失败、归属不一致、过期版本、失效绑定均 fail-closed;不能用 `Host.IsAdmin()`、缓存 allow、V1 粗粒度授权或手填 owner 兜底。
通用迁移前 legacy 台账只在其声明范围使用;迁移时保留 userId/owner/roleId/projectId/createdBy,禁止双主写入,不生成旧管理员的永久业务 grant,回滚不复活旧越权。
## 5a. 当前公开能力缺口的 I1 处理
以下是 U2 收口所需的默认拒绝策略,不是后续能力已实现声明;本地候选的实际验证见 I1 评审记录。
- 未归属事件盘点、归属迁移、全量 outbox 队列必须另有 owner 批准的精确资源范围。I1 的 `Runtime.SetLegacyAccessAuthorizer` 为实例内受信集成点,查询绑定 actor/action/project/seq;不存在用户自授命令,不持久化、不跨重启继承。无提供者或提供者失败即拒绝。迁移另检查目标 `knowledge.publish`。
- 当前 `Host.KnowledgeDelete` 仅能删当前 owner 的整个插件前缀,不能限定项目。`rdm.knowledge.revoke` 先验证目标项目 `knowledge.publish`,再明确拒绝执行,不能借 A 项目 grant 删除 B 项目索引。
- `rdm.init` 当前实现读服务器路径并写全量未归属域,公开命令拒绝;可信本地 CLI/bootstrap 仍需操作授权。本轮不另造公开目录读取和项目初始化能力。
- Host↔RDM 绑定须证明两个项目的管理资格;旧映射行与请求中的 HostProjectID 都不是此证明。I1 的实例内受信 Host 项目授权集成点必须绑定 actor/action/两个实际项目,缺失即拒绝绑定、解绑及基于映射的共享访问。旧映射不自动升级成授权证明。
- 现 Backend `project/list` 授权成功后会返回项目下全部 owner 工件元数据,缺少逐资源 owner 裁剪,I1 拒绝此聚合共享。项目级 search 无发布分类证明时也拒绝跨 owner 检索;自有私人资源的具体读取路径保留。
- 项目聚合 DTO 尚无安全的按阶段裁剪投影时,要求当前完整 `doc.read`;章节/文档接口按实际对象检查阶段。业务审计另需显式 `audit.read`。后续安全裁剪不得用 UI 隐藏代替执行端检查。
- 新 outbox 回执以事务内 `rdm_audit_outbox_scope` 记录实际 project/owner,只送入对应 owner 的 Host;旧未知归属回执保持 pending,禁止按下一调用者猜测归属。该关联表为新增领域元数据,无历史自动归属,本轮未执行生产数据库变更。
- status/resume/cancel 按私人批次的真实 owner 判定;恢复另检查当前项目写权及生命周期,取消仅保留本人停止私人任务的能力。opID 重放必须绑定操作、项目、主体与实际资源,冲突不能返回另一资源回执。
| 扩展申请补充 | 场景 | 希望的公开符号/路径 | 现有注册点不足 | 兼容方式 |
|---|---|---|---|---|
| IAM-K 项目级知识撤销 | 合法 A 项目发布者仅撤销 A 已发布资源 | 可选项目/资源限定的知识撤销 DTO 与提供者;实际命名待模块评审 | EXT-9 whole-prefix 删除跨同一 owner 多项目;无可靠逐 ref 删除契约 | 新可选公开接口,旧缺失拒绝;固定提供者/消费者版本,不改 pins 猜测能力 |
| IAM-H 宿主项目管理证明与资源裁剪 | 绑定需双方管理证明,共享读取需当前项目授权与实际资源分类 | 受信 Host 项目授权查询/证明及逐件资源投影提供者;实际命名待模块评审 | EXT-18 仅给当前 actor 的管理员位与项目定位;EXT-8b project/list 是整面 bool,无逐件过滤 | 新可选契约、权威对象与版本;旧映射只作定位,缺失默认拒绝;RDM 私有受信适配不能冒充 Backend 公共实现 |
## 6. 账号恢复证明与交付
普通管理员仅发起恢复提案;本人须使用管理员不能单方改写或取得的既有有效会话确认,或预先建立的本人恢复证明,才取得可兑换设密能力。
姓名、电话、邮箱、工号均为可选资料,不自动成为恢复证明;新证明建立或更换不能由恢复提案管理员单独完成。
无独立本人验证条件时拒绝线上恢复,不向普通管理员签发可兑换的目标账户 Key;异常人工恢复由另行批准的 owner 操作处理。
恢复能力限制为一次消费、目标账号、设密用途与有效期,不生成业务会话;消费后本人使用正式凭证重新认证。
本合同不证明恢复实现已具备;U3须验证“管理员提出恢复后自行设密接管业务身份”负例,旧路径未收口前 R7 不得闭合。
## 7. 验收矩阵与证据边界
R1–R20 到 RDM 原 UR/SR 的映射由 RDM `docs/proposals/2026-10-13-iam-i1-contract-adoption.md` 维护,原需求 ID 不重新编号。
| 判据 | I1 文档核对 | 行为验收归属 |
|---|---|---|
| 系统动作不可由项目 override 或 `project.settings` 获取 | §2逐动作 scope/旧命令映射 | U2:普通成员合法本项目设置成功,全局角色/cap/移交拒绝 |
| 创建者仍受有效角色 cap,遗留覆盖不越界 | §1/§3 | U2:创建者 cap=false、角色动作未定义、停用/换岗及旧 allow 负例 |
| 管理员无业务身份旁路,审计独立授权 | §2/§4 | U2:admin/Host.IsAdmin 非成员及无 audit grant 拒绝;合法成员 audit grant∩cap 正例 |
| 私人资源与受控正文分开 | §4/EXT-8b 消费边界 | U2 可达路径;U5/U6 统一资源及职责、当前版本完整验收 |
| 一职多人、一人多职、项目明确选用 | §1/§3/IAM-P | U4/U5:新任命不扩既有项目、解绑再任命不复活、完整路径不拼接 |
| 账号目录敏感投影与本人恢复 | §5/§6 | U3:未授权字段不匹配/不返回;管理员不能取得本人兑换凭据 |
| 冻结文档轮次、撤权与迟到事件 | §3/§4/IAM-R | U6/U8:当前职责与 cap 重验;旧卡/Surface/SSE/后台最终提交拒旧 |
| 单权威迁移、版本兼容、完整组合 | §1/§5 | U4/U9:旧→新差异、双主拒绝、当前固定提供者/消费者和制品验收 |
U1 只检查文档差异、链接、动作与 scope 一致性、R1–R20 追溯及原方案摘要保持;无行为变更,不运行业务测试。
本地检查来源为 SELF;审核与正式验收须按任务规则同步对象、独立重放并核验 GATE/REPLAY 身份及 SHA。
公开实现、业务测试、浏览器、真实模型、数据库迁移、服务运行、部署与正式验收均不能用本合同的保存结果代替。
## 8. I1 宿主改名投影的已批准修订(2026-10-13)
用户已批准[委任改名契约修订与修复计划 r1](https://gitea.naitangbaobao.cn/weichen/Agent-System-RDM/src/commit/4ee4eb99a95460d6660f05a67181357b67e2e956/docs/proposals/2026-10-13-iam-i1-host-projection-amendment.md),批准对象原文摘要为 `3eee5714cce974ce13229b3e184bc3aa763a5e0819fdf7dcf088dafe68b1ed2a`。正文维护在 RDM 一处;批准状态与实际实现、测试、Review、CI 和合入分开记录。
合法项目 `project.settings` 可以委任改名;现有 `ProjectHost` 的管理修改保持 owner-only。RDM 仅对这一动作建立受信的单目标投影适配:先以实际认证 actor 判定当前项目设置权及状态,再核对域/宿主绑定/物理项目的完整身份,只用受信创建者的 scoped Host 执行该 hostID 的改名。不借创建者身份重新授权,不把投影句柄返回或传入其他业务动作;无需额外 `doc.read`,私人读取和 Native work 不扩权。
首次改名要求 ready;失败恢复必须对应同事务持久的改名意图、同一主体/项目/host/创建者/目标与版本,并再次检查实际 actor 的当前资格。未知 failed/create 不恢复,未就绪时读/work 仍拒绝。该元数据只属于 RDM 项目投影,不修改旧账号或项目身份,不实施生产迁移,也不冒称完整跨库 epoch。
命令与 HTTP lifecycle 都使用原请求 Host 审计实际操作者。Backend 审计的 `Actor=plugin:rdm` 继续表示插件来源;业务 actor 由受信 Host.Owner 和审计 evidence.actor 记录。命令保留既有 DTO,HTTP 保留 core.Project 及公开元数据的脱敏设置;不得带出物理 owner 的原始管理设置。
本修订不新增 Backend 公开符号或放宽其 owner-only 管理规则。正式通过须覆盖合法委任及无读取权管理、cap/停用/非成员、实际归属变化、失败/重启/未知恢复、两入口审计和真实 HTTP;未通过当前组合验证时不能声称 I1 完成。
@@ -0,0 +1,73 @@
# IAM I1 实施候选与人工评审记录
负责人:weichen;实施协调:Codex;日期:2026-10-13;状态:阶段 6 已由用户批准;阶段 7 测试候选已形成,待用户验收。原阶段 6 对象与收据保留,最新状态见下方批准记录及验收报告。
本页维护已批准统一方案 I1 的实际进展;原方案原文摘要保持不变。本轮只执行 U1–U2,交付终点为“给我评审”,不启动后续增量。
## 批准对象与当前候选
- [统一方案 r1](2026-10-13-identity-role-permission-plan.md):用户已批准并授权 I1=U1–U2;原文 SHA256 `39b8e9a6e078dc509bd80118c1807ce6ed23e4466e5902b51f4bfa255d55c0a1`,Documents `a088809` 保存原批准快照。
- [I1 权限合同 r1](2026-10-13-iam-i1-permission-contract.md):稳定动作与 scope、角色/平台 cap、独立业务审计、隐私及公开扩展申请。提供者缺失默认拒绝,合同文档不能证明接口已提供。
- RDM 初始 R0:`b1fe932883d2a55f0373bb0930950da3d12d2b5e`;同步后的 main:`2f1a36f55a4979262e386150af26085d4d15b2a1`,包含职责批量分配与权限覆盖删除。两项注册冲突已保留主干功能并接入身份包装;组合结果须重新测试。
- RDM 已独立审阅的行为候选:`dfb9c407858173ba501a623631c17643bd1985b5`(代码截至 `4e3d7665e973838b77d6e81164b8d70540de907d`,后者之后仅同步任务卡;之后旧测试断言/import与证据记录继续收口)。最终收据与记录提交可能前进,测试有效性按行为文件/组件是否变化核对。
- [Dev 任务卡](/home/weichen/projects/Agent-System-Dev-wt-feature-iam-i1-permission-boundaries/.task/feature-iam-i1-permission-boundaries.md) 与 [RDM 任务卡](/home/weichen/projects/Agent-System-RDM-wt-feature-iam-i1-permission-boundaries/.task/feature-iam-i1-permission-boundaries.md) 保存启动、红测、失败、同步、绿测完整工具输出,来源均为本地 SELF。
## 本次行为变化
| 边界 | 候选中的具体变化 | 对应要求 |
|---|---|---|
| 系统与项目 | role/cap/任命/移交走独立受保护系统 action;项目 settings 不能授予这些动作;当前 actor 必须匹配 Host.Owner。新增 unset 也检查注册项目 scope、实际成员与当前管理权 | R6/R8/R12 的 I1 部分 |
| 当前资格与 cap | 创建者、管理者与成员均受平台 cap;已绑定职位先检查存在/有效/动作定义与 cap;停用、换岗及旧 allow 不能回落或越界。矩阵解释与执行共用评估器 | R9/R11 的当前单绑定部分 |
| 项目业务访问 | 去掉域管理员和 Host.IsAdmin 的跨项目业务旁路;项目清单按当前成员关系;归档仍可由合法 archive 权限恢复,其他业务写入拒绝 | R7/R8/R11 的 I1 部分 |
| 业务审计 | 新独立 audit.read,平台 cap 初始关闭,关系默认不授予;实际授权成员还须当前完整 doc.read。聚合审计含正文预览,不能借阶段受限读权读全项目 | R7/R18 的 I1 部分 |
| 正文读取与导出 | 章节/文档按真实对象检查阶段;标题导出只接受唯一匹配、按同一解析目标授权与生成;差异、审核状态、法规快照检查阶段/真实项目归属。无法安全阶段裁剪的聚合 DTO 要求完整读权 | R12/R18 的 I1 部分 |
| 私人原件与草稿 | pending/rejected 私人提案只允许提案人查看/采纳/拒绝,采纳还验编制职责;上传原件只允许本人确认;管理上传视图为元数据;历史上传清单不跨项目混入 | R18 的当前可达路径 |
| 私人批次 | status/resume/cancel 先按真实 owner 判定;私有与不存在统一不透明拒绝;恢复另验当前 doc.write/成员关系/职位/cap/生命周期,不能凭旧属主身份重新入队;本人停止私人流程保留 | R11/R12/R18 的当前入口 |
| 模型输入与写回结果 | draft.compose 发模型前需要目标正文读取范围;结论确认在返回 stored text 前需完整 doc.read。写权不能代替读权 | R12/R18 的当前入口 |
| 回执归属 | opID 使用 JSON 元组绑定操作/项目/主体/资源,短路与事务内重放一致,旧不可信 key 拒绝。outbox 新回执以同事务关联真实项目与 owner,只送入对应 Host;旧未知归属项保留 pending | R12/R18/R20 的当前入口 |
完整多职位、项目明确选用绑定、账号有效态、恢复证明、三权全模型、政策 epoch 与所有后台最终提交撤权均未在 I1 实现。这里的 R 行不是完整 R1–R20 关闭声明。
## 验证与证据
U1 为规范文本更新:核对本地链接、17 个稳定 action/scope、R1–R20 追溯、批准原文摘要及固定 RDM 初始基线的 08 核心 R1–R5;无业务行为,不制造文本单元测试。
U2 先运行真实临时 SQLite 与已注册命令负例,再修改实现并保留相应合法流程。旧测试中期待 admin 跨项目、停用角色回落、他人代确认等断言按批准合同修正,正常路径仍通过真实授权夹具运行;没有删除失败用例以绕过测试。
| 检查 | 当前结果 | 证据边界 |
|---|---|---|
| 初始负例与审阅补漏 | 已真实复现并记录;红测保留 | 包含越权写入、实际正文/原件元数据回执、未知归属写入与跨 owner 审计投递;编译失败与夹具失败也保留,不冒充行为证据 |
| 新回归与相关旧流程 | 通过(SELF);独立重跑 39 个顶层 I1 回归 | 工具记录命令、HEAD、dirty 摘要与完整输出;本轮编译失败、夹具失败和“no tests to run”均保留,不计为行为通过 |
| RDM make test | 通过(SELF),对象 ef075bd1 | 完整收据 ab592b80c858543f…见 RDM 任务卡:组合产品构建、29 项 Web 检查、Go 全量均退出 0;不包含部署/生产数据验收 |
| Dev make test/文档检查 | 已通过(SELF),对象 0ab70b0c;最终文档记录后的对象另见任务卡 | 完整收据 b12914e5136cc405…见 Dev 任务卡;含工作树、gitlink、治理、模块/UI/命令组合检查,本任务未改业务 UI。最终文字记录收口后按固定 gitlink 再核验,新增收据由工具记录,不复制输出 |
| 独立提前源码审阅与 focused 重放 | 通过,39 组顶层回归全部通过(本地) | 审阅者 /root/i1_security_review 未参与源码写入;对象 dfb9c407,独立重跑命令与完整 SELF 工具收据见 RDM 任务卡;不是用户批准、平台账号独立批准或受信 CI |
| 正式验收/CI/浏览器/真实模型/生产迁移/部署 | NOT_RUN | 模型注册描述已按实际拒绝边界改写;未建立本轮固定模型任务级前后基线,测试使用 mock Host,不能声称模型行为通过。正式阶段应固定模型/配置/任务集,补真实对照及浏览器链路 |
## 必须审阅的兼容影响
1. 新 audit.read 初始不授予任何人。合法系统管理者先开平台上限,角色有资格后由合法项目管理者授予业务审计;此前 admin/创建者自动审计行为停止。
2. KnowledgeDelete 只能按当前账号整插件前缀删除,故项目 revoke 明确拒绝,等待项目/资源限定公开接口;公开 rdm.init 也因读服务器目录并写全量未归属域而拒绝,可信本地操作保留。
3. Host↔RDM 绑定、解绑及映射共享读取需可信双方项目授权提供者;当前未安装生产提供者,缺失默认拒绝。project/list 的整批私人工件元数据共享关闭;现项目级跨 owner search 缺发布分类证明也拒绝。自有资源具体读取和明确的 RDM 项目知识读面保留;不是完整共享 RAG 已验收声明。
4. 存量未归属盘点/迁移/全量 outbox 状态需独立范围授权;实例内可信集成不是用户自授接口,重启不继承。旧未知归属 outbox 保留 pending,新增关联表仅处理之后的可证明来源;不推测历史 owner、不丢记录。本轮未变更生产 DB。
5. 有阶段范围的用户无法读取尚未安全裁剪的全项目聚合 DTO;后续应逐对象投影与重算计数。失效绑定和旧不可信 opID 回执拒绝,不能把兼容回退当作当前资格。
这些限制是避免当前公开契约不足扩大授权的 I1 处理;正式产品恢复对应能力需固定提供者/消费者的新公开版本与独立正反例,不能靠当前平台管理员位补足。
## 进展与下一步
U1 权限合同与需求追溯已完成;U2 当前 RDM 可达路径整改、本地组合自检和独立提前复审已完成,等待用户阶段 6 评审。独立提前源码复审已通过;后续测试记录更新必须确认生产源码与此对象等价。未推送、未创建 PR、未合入、未部署,保留两个独立工作区及全部失败收据。
首选下一任务为已规划 I2/U3:账号可选资料、受控人员目录与本人恢复证明。推荐理由是先建立可信身份/有效态与安全恢复边界,随后才能实施 Backend 通用角色和多绑定 U4。前置条件:用户批准 I1 实施结果并另行授权 U3;核对已有账号目录实现,复用最小 EXT-19 边界;公开提供者先审接口,不能绕过 pins。预期产物:资料全空合法、字段授权搜索不泄漏、项目目录只投影获准辨识字段、普通管理员不能获取目标本人可兑换设密能力的真实负例及成功本人流程。此建议不启动新任务。
公开 Host 能力缺口另有 IAM-H/IAM-K 申请;可与 U3 的公开提供者工作协调,恢复共享/撤销前先完成固定契约,不以设计文档存在放行。
## 实施调用与单元记录
实施引擎为 native Codex,委派单元为权限合同、初始负例、旧测试对齐、幂等隐私补漏与独立提前审阅;无外部模型路由绑定/回退/detached run,实际服务模型未独立证明。source_kind=plan,source_digest 为上方批准原文摘要;plan_checkpoint 为 Documents a088809。行为单元 U2 的原始红→绿观察保存于当时工具收据,不能从最终 diff 重构;U1 为非行为文档核对。单位 canonical commit 和完整 changed_files 由所属仓的当前分支与任务卡追溯。此本地交付跳过推送、PR、CI与合入 shipping tail。
Dev 同步 main 到 143e636736 后随主干物化 Backend 15566f9a、Core 5773e740、Frontend c294835f、UI 2c4322ef;本任务相对该 main 只改变 Documents、PROJECT 导航与任务卡。RDM 产品仍按自身 pins 固定 Backend 0f192a48、Frontend 4965de26、UI bfecf8b5,未自行推进 pins;两套组合的检验与状态分开,不用 Dev 测试证明 RDM 的提供者能力。
## 阶段 6 人工批准(2026-10-13,北京时间)
用户在本页 c023551 对应的实施候选与兼容影响交付后回复“批准”。阶段 6 实施与自检结论:通过;对象为 Documents c023551、RDM b93908e、Dev 72ed8b4。该结论不代签尚未完成的阶段 7 验收,也不启动后续 U3–U9 或生产部署。恢复时已有主干推进,正式测试将固定同步后的对象,报告正常/异常/边界/回归证据与缺项,再请求用户验收;原获批对象和所有早期失败收据保留。
阶段 7 当前产物:[正式测试与验收候选](2026-10-13-iam-i1-acceptance.md)。上述阶段 6 测试与缺项记录为当时快照;新的真实 HTTP 结果、独立重跑及仍未执行项目以阶段 7 报告和工具收据为准。
@@ -0,0 +1,574 @@
---
title: 用户、职位角色与分层权限统一设计及实施计划 r1
date: 2026-10-13
type: refactor
execution: code
artifact_contract: ce-unified-plan/v1
product_contract_source: legacy-requirements
---
# 用户、职位角色与分层权限统一设计及实施计划 r1
负责人:weichen;编制:Codex;更新时间:2026-10-13(北京时间)。
确认状态:本轮两项用户裁定已确认;完整需求表、架构调整、迁移与实施计划待人工评审。
推进状态:源码调研与方案编制;业务修改、业务测试、数据库迁移、部署及运行验收均为 NOT_RUN。
本文是本次改造的唯一方案主记录;任务卡与索引引用本文,不复制推进状态。
## Goal Capsule
让管理员按企业职位管理人员与能力,让创建者在自己的项目管理成员和文档责任,并让用户清楚知道自己能操作什么、为什么可以或不可以。
复用现有账号、职位角色、项目成员、权限解释与整文审签能力,修正作用域混用,再补齐资料、搜索、单对象配置与批量矩阵。
本轮交付终点为完整方案及分阶段计划,业务实施与运行操作需取得对应阶段授权。
用户已明确选择:系统管理员管理账号、角色与权限上限,访问他人项目业务内容需要明确授权;首期支持一人多职,每个项目明确选用该用户的哪些职位角色。
这两项决定来自本轮对话,完整方案仍为待评审草案。
---
## Product Contract
### Problem Frame
当前存在四种概念:系统账号、企业职位、项目管理关系、文档编制/审核/批准职责。
它们在部分命名、管理入口和授权函数中混用,导致项目设置权限能够进入全局管理、管理员自动获得业务访问、角色停用或换岗后权限不一致。
改造的重点是统一权限语义和执行端判定,同时把配置权、作用域和具体资源责任说清楚。
“系统权限、角色权限、项目权限”是同一套权限模型的不同配置来源与作用范围。
角色是能力模板,系统权限是系统范围的动作,项目权限是限定到一个项目的授权。
文档三权进一步确定谁对某个版本履行哪项职责。
### Sources and Current Evidence
权威顺序采用 RDM `docs/requirements/README.md`:最新用户指示 → 当前 U0/Q 裁定与权威需求正文 → 当前矩阵 → 未被取代的旧设计 → 原始会议。
`.tmp` 原件作为设计来源保留,不回写历史原稿。
本轮优先阅读 `.tmp/Discussion-Meetings/2026-10-08_12-24/Outputs/11-角色与权限管理方案.md`,并与 01/03/08 系列、RDM 当前需求和后续计划交叉核对。
| 对象 | 本轮读取的固定版本 | 证据边界 |
|---|---|---|
| Dev 源码基线 | `3fb8210f6495a78e70a67af3661bdfe9c00fb9de` | 本地源码与启动检查,SELF |
| Dev Backend | `dc736e339d01c59e658abc63c81909059bd6ea02` | 本地源码,SELF |
| Dev Frontend | `dcd2699933eff51c06193cac7beb15c3d20a01ff` | 本地源码,SELF |
| Documents / UI | `05c13a42b14d70f878cc8a51c543e018a7f7a663` / `0da2e3acd6c8ae8957825b64ddb54b250c0979c0` | 文档与设计约束 |
| RDM | `255f9cba0c9e6f981fbff66142be92532d5c5f2d` | 本地源码,SELF |
RDM 自己的 Backend/Frontend pins 与 Dev 组合不同,不能把某一工作树的能力视为另一组合已部署的能力。
命令、对象与脱敏输出由任务卡的 evidence 收据保存;本稿的源码事实不等于部署重现、GATE 通过或正式验收。
| 已核实的源码情况 | 对方案的影响 | 源码位置,路径以所列仓为根 |
|---|---|---|
| 已有独立职位角色、多账号可绑定同一角色;账号当前只能绑定一个角色 | 扩展已有模型,支持多职、描述和编辑 | RDM `internal/perms/roles.go` |
| 用户资料没有电话、邮箱、工号等;公开目录仅 owner+valid | 账号资料和受控目录必须有 Backend 公开契约 | Backend `internal/store/auth.go`、`pkg/extension/extension.go`、`internal/app/hostcaps.go` |
| 角色/全局上限/管理员移交复用 `project.settings` | 首批拆开系统动作与项目动作 | RDM `internal/rdmapp/perms_api.go` 中 `AuthorizeGlobal`、`roleAdminGate` |
| 域管理员和基座超管在多处自动读取项目、审计、导出、原件或草稿 | 同步修订所有业务读面,取消身份式业务放行 | RDM `perms_api.go`、`runtime.go`、`upload.go`、`draftproposal.go` |
| owner 跳过职位上限;角色停用回落内置 member;换岗后遗留 override 可跳过未配置动作的角色上限 | 采用完整授权链,覆盖创建者、停用与换岗负例 | RDM `perms_api.go` 中 `evalPerm`、`internal/perms/roles.go` |
| “权限矩阵”是单成员有效权限解释;角色页每次编辑一个动作 | 保留解释能力,补可编辑角色矩阵与成员矩阵 | Frontend `src/components/adminRdmSections.tsx` |
| 用户、角色、三权候选主要手输 owner/docId;入口依赖 isAdmin | 接受服务端能力与目录查询结果,使用稳定 ID 选择 | Frontend `adminSections.tsx`、`adminRdmSections.tsx`、`AdminZone.tsx` |
| 基座建项接口与 RDM 建项命令的门禁不同 | 统一产品入口;区分宿主项目与研发项目后封闭旁路 | Backend `internal/server/server.go`;RDM `plugins/rdm/plugin.go` |
### Requirements
需求编号仅用于本方案,不替换原有 UR/SR 编号。
**身份、职位与人员查找**
| ID | 需求与可判定验收条件 | 来源 |
|---|---|---|
| R1 | 角色是独立职位对象,有稳定 ID、名称、可选描述、状态和版本;改名不改变人员身份或历史 | 本轮用户;SR-G7 |
| R2 | 同一职位可关联多人;一人可关联多个职位;项目只采用明确选定的有效绑定,新增职位不自动扩张既有项目 | 本轮用户裁定;当前概念模型 |
| R3 | 姓名、电话、邮箱、工号、部门与备注均可选;全部留空仍能建号;资料不成为登录凭证或授权主键 | 本轮用户 |
| R4 | 支持精确与模糊搜索、字段选择、状态/职位等过滤、分页与同名辨识;最终授权对象是稳定用户 ID | 本轮用户 |
| R5 | 系统管理者可维护账号资料;本人可编辑非授权资料;项目选人只获得必要目录投影,无权读取完整联系方式或凭证 | 本轮用户;隐私边界 |
**系统与项目授权**
| ID | 需求与可判定验收条件 | 来源 |
|---|---|---|
| R6 | 系统设置、用户管理、角色管理、策略管理与建项采用明确系统动作;项目权限编辑不能写入系统动作 | SR-G6/G7/G8;本轮用户 |
| R7 | 系统管理员无项目/资源授权时不能读取他人业务正文、原件、草稿、业务审计、导出、搜索命中或模型上下文 | 本轮管理员裁定;修订旧跨项目审计口径 |
| R8 | A 创建者不能凭 A 的管理权管理 B;创建事实固定,负责人接替采用明确委任记录 | SR-G9/G10 |
| R9 | 创建者在本项目管理成员、覆盖权限与分配三权;项目覆盖可覆盖角色默认,但不能突破平台和角色上限 | SR-G8/G9 |
| R10 | 多角色按完整授权路径合成;平台禁止、项目明确拒绝与资源限制不能被另一角色绕过 | 本轮多职裁定;SR-G2/G8 |
| R11 | 角色停用、解绑、换岗、上限收紧、账号停用和成员移除及时撤权;遗留覆盖不能复活旧权 | 当前源码缺口;SR-G8/N4 |
| R12 | 同一动作的 UI、HTTP、命令、工具、任务恢复与最终提交遵循同一服务端判定;未知或失败状态拒绝 | SR-G2;U0 D1 |
**配置体验与文档职责**
| ID | 需求与可判定验收条件 | 来源 |
|---|---|---|
| R13 | 单角色编辑与角色×权限矩阵是同一数据的两种视图,支持分组、精确/模糊搜索、过滤与批量草稿 | 本轮用户 |
| R14 | 单成员编辑与成员×权限矩阵共享草稿;显示继承/授予/拒绝、角色默认、上限、最终结果与原因 | 本轮用户;SR-G8 |
| R15 | 批量保存有具体差异、影响预览、版本冲突保护、原子提交和审计;隐藏行不丢草稿,不逐格即时落库 | 配置完整性与当前缺口 |
| R16 | 每份受控文档编制一人、批准一人、审核至少一人,三类人员互异;候选必须是有效成员并具备对应能力上限 | SR-C7/G9 |
| R17 | 职位能力只提供资格;实际编写、审核、批准同时检查具体职责、文档状态与冻结版本;管理权不代签 | SR-C7/C8;U0 D2/D5 |
| R18 | 私聊、私人原件与个人草稿保持私有;项目知识由明确提交/发布产生;受控文档按职责或明确授权读取 | SR-G11/G12;U0 D3 |
| R19 | 权限变化同步影响已开页面、旧卡、Surface、下载、检索、SSE 和后台任务;迟到事件不能恢复权限 | SR-G2/G11/N4;根 AGENTS.md |
| R20 | 保留用户/项目/角色稳定标识与历史;迁移输出旧→新差异,不把旧管理员全权转成永久业务授权 | 持久化与兼容要求 |
### Confirmed Decisions and Scope
管理员业务访问边界已经用户选择确认(session-settled: user-directed — chosen over 管理员自动获得全部项目业务访问: 业务访问需要明确授权;Governs R7)。
首期多职及项目明确选用已经用户更正确认(session-settled: user-directed — chosen over 每人仅一个生效职位: 用户改为采用多职建议;Governs R2/R10)。
本次覆盖用户资料、职位模型、系统/项目授权、配置界面、文档职责与读取授权、Agent 同源执行、迁移及验收。
飞书/SSO、组织树与岗位继承、全自动任命/签字、全量模板补齐、整个工作流引擎重建和外部权限服务采购不纳入本次。
本次修订需要更新 RDM 权威需求与相关方案,但 `.tmp` 历史稿保留。
---
## Planning Contract
### KTD1. 数据职责与统一入口
建议把通用账号资料、职位定义、用户—职位绑定、系统动作授权及平台/角色上限集中到 Backend 的通用身份与授权服务。
RDM 负责项目成员、项目选用角色、项目覆盖、资源归属、阶段状态和文档三权,注册领域动作及资源策略;UI 和 Agent 消费同一公开服务。
用户主身份沿用基座稳定 ID 与现有 owner 映射,不另建账号;RDM 历史 owner 标识保留。
这是对现行“专业角色主表在 RDM”的明确架构调整建议,须在方案阶段评审,不能借旧 U0 D1 当作已经批准。
集中通用职位定义可以让账号管理、建项与项目业务共同消费一份授权事实,并避免两个角色台账同步漂移。
RDM 专有的职责与状态规则仍留在 RDM,基座只知道注册动作、约束及判定协议。
下游通过正式公开扩展及固定版本消费,禁止修改 pins 源码或导入 Backend internal。
主要备选:保留 RDM 角色主表并让基座经公开策略提供者查询。
该路径减少角色数据搬迁,但系统管理动作会依赖领域插件及其可用性;若采用,必须冻结单一权威、插件缺失时拒绝策略和根管理恢复通道,不能再建第二套独立职位表。
不推荐仅补 UI:它不能解决已经存在的服务端 scope 混用。
### KTD2. 概念模型
| 对象 | 核心字段/关系 | 权威 |
|---|---|---|
| User / Profile | 稳定 userId、owner 映射、账号有效态;可选姓名、电话、邮箱、工号、部门、备注;profileVersion | Backend |
| Role | roleId、名称、描述、状态、roleVersion、创建/变更主体 | Backend,拟迁移现有 RDM 角色 |
| UserRoleBinding | bindingId、userId、roleId、有效态、任命主体/时间、版本;支持多对多 | Backend |
| PermissionDescriptor | 稳定 actionId、中文名、说明、scope、资源类型、分组、条件、委派级别、风险与版本 | Backend 注册表,RDM 注册领域项 |
| RolePermission | roleId+actionId、默认 grant、cap、允许的资源范围;default 范围不得超 cap | Backend |
| SystemGrant | 明确系统动作授予与上限;受保护管理员/策略管理授权独立记录 | Backend |
| Project / Membership | 稳定 projectId、固定 createdBy、当前负责人委任;成员身份、明确选用的 bindingId、版本 | RDM |
| ProjectOverride | 项目+成员+动作的 inherit/allow/deny,以及资源范围收缩、版本 | RDM |
| ResourceGrant | 资源稳定 ID、类型、真实属主、项目、分类、明确接收者/职责、只读范围、撤销版本 | 资源 owner;统一公开判定 |
| DocumentDuty / Round | 文档职责、冻结正文/职责/策略版本、轮次与真实操作者 | RDM |
这些是逻辑模型,具体表名与迁移编号在实施时确定。
删除有引用的用户和角色采用停用/归档,保留审计身份;无引用对象才允许物理删除。
同名职位的规范化重复检查独立于显示名;同名人员允许存在,工号与联系方式不作为强制唯一标识。
可选资料做长度与格式校验,空值合法;电话仅按明确规则规范化,避免错误匹配。
### KTD3. 权限目录与系统权限
权限目录的 scope 由受信注册表确定,不能凭动作字符串前缀或请求体自报作用域。
旧 actionId 通过版本化映射兼容,作用域冲突的旧项不继续接受写入。
| 权限类别 | 动作示例 | 谁能配置/怎样生效 |
|---|---|---|
| 系统设置 | system.settings.read/write,model/plugin/agent 设置子项 | 具备对应系统管理权者;平台策略限制 |
| 用户管理 | system.users.view/create/edit/disable;credential.recover 单列 | 分项授权;普通资料编辑不允许改管理员资格 |
| 职位管理 | system.roles.manage/assign | 管理职位与普通任命;不能越可委派上限 |
| 高权限管理 | system.policy.manage/privileges.manage;admin.transfer | 受保护动作;项目覆盖和普通职位任命不可间接获得 |
| 创建项目 | project.create,scope=system | 有效系统/职位 grant;选定产品与创建者角色上下文 |
| 项目管理 | project.settings、member.manage、permission.manage、duty.assign、stage.advance/archive | 具体项目创建者或明确委任;受 cap 与状态约束 |
| 项目内容 | knowledge.read/publish、trace.read/edit、business-audit.read/export | 项目关系、角色范围和资源关系同时满足 |
| 文档动作 | document.read/export、author/review/approve 等资格项 | 能力资格+具体文档职责/授权+状态 |
管理员徽标由受保护系统授权产生,职位名称叫“管理员”不会改变其权限。
首期保留至少一个有效策略管理者与安全恢复通道;并发撤销最后管理者必须在事务中拒绝。
普通角色管理者不能编辑受保护权限,也不能给自己或别人任命超出其可委派范围的角色。
系统管理员不自动加入项目,不自动获得业务统计或业务审计。
系统安全日志仅披露必要的账号、安全动作、结果与不透明对象标识,不含业务正文、文件名、项目名称、内容摘要或完整历史差异。
访问业务审计采用对应项目的明确授权,与正文授权分别显示。
### KTD4. 单一权限判定与多角色合成
输入由认证会话、受信资源存储和实际执行上下文组成:主体、动作、资源类型/ID、真实项目/属主、当前版本与当前状态。
请求体里的 actor、owner、projectId 不能替代受信归属;资源与项目不一致时拒绝。
服务端返回 allow/deny、来源链、拒绝原因及 authorityEpoch,UI 不重新计算权限。
解释接口只能解释调用者自己或其有权管理的对象,不能成为探测他人资料的旁路。
系统动作只读系统授权来源,不接受 ProjectOverride。
其有效值为当前有效账号、平台允许范围、对应受保护规则,以及明确 SystemGrant 或一条完整的系统职位默认授权路径;不依赖项目所选职位,也不接受项目 allow 作为系统授权来源。
项目动作先确认成员/创建者/明确委任与资源归属,再对每个有效且本项目选用的职位绑定建立完整候选路径:
`角色动作已定义且启用 ∩ 角色 cap(含范围) ∩ 平台 cap ∩ 项目 grant/默认 ∩ 资源关系 ∩ 阶段/状态 ∩ 文档职责`。
对具体动作,至少一条完整路径通过才允许。
一个角色的动作授权不能与另一个角色的资源范围拼接;角色 cap=false 只关闭该角色的路径,平台禁止、项目明确 deny 和资源禁止对全部路径生效。
项目 override=allow 仅替换默认 grant,不能创造不存在的动作、突破任一 cap 或跳过资源关系。
override=deny 阻断该成员在该项目对此动作的全部角色路径;inherit 使用当前有效默认。
多个角色可共同授予不同动作,但一次动作必须有完整证据来源。
加入项目时明确选择该用户的有效 bindingId;只有一个有效角色可预选,多角色需明确选择。
新任命角色不自动加入已有项目;解绑后旧 binding 立即无效,重新任命产生新 binding,旧项目配置不自动复活。
停用角色没有回落授予;无有效角色仅保留显式最小账号自助能力,业务动作拒绝并说明缺少资格。
新增权限默认拒绝;读取策略失败、缺元数据、未知动作或必需提供者缺失时拒绝。
创建者关系提供本项目管理默认,仍经过其有效角色 cap 和平台 cap,不能自动读私域或代签。
建项前检查创建者角色组合具备本项目设置、成员管理与三权分配的 cap 资格,避免建成无法管理的项目;role default 可关闭这些动作,由创建者关系提供项目内默认。
已有项目遇 cap 收紧时保留归属,阻断受影响动作,并向授权管理者显示需要调整任命的原因。
为避免唯一负责人换岗后无法重新选用职位,提供受限的“重新选择本人项目职位”动作:仅当前有效负责人本人,可从其账号当前有效任命中显式选择具备平台和项目管理 cap 资格的 binding,并按当前项目版本确认保存。
仅该动作可使用尚未被项目选用的当前任命;普通项目动作仍只使用项目已选用的 binding。
它只修复本人在本项目的角色选择,不改变项目负责人、不恢复旧 allow 覆盖、不清除明确 deny,也不授予资源读取或三权;完成后普通动作重新经过完整判定。
角色任命者只能处理系统任命,不能代选项目职位;没有合格任命时项目保持等待,不能扩大 cap 恢复。
项目内移除/降权最后负责人时保护实际可操作的管理资格,而不仅计数 owner 关系;系统 cap 收紧造成的暂停则明确记录与提示,不能阻止管理员执行必要撤权。
创建项目、创建者成员关系与所选 binding 在同一领域事务落地;宿主绑定采用可恢复状态与幂等对账,失败不能留下可使用的无负责人项目。
判定、解释与所有入口共同调用该服务。
设计采用最小权限、默认拒绝和每次请求重验,也结合项目关系与资源状态;依据 [OWASP Authorization Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html)。
### High-Level Technical Design
```mermaid
flowchart TB
U[用户及多个职位绑定] --> I[基座身份与通用授权服务]
C[系统动作与权限目录] --> I
R[角色默认与角色上限] --> I
P[项目成员 所选绑定 项目覆盖] --> D[统一判定]
I --> D
A[资源归属 明确分享 文档职责] --> D
S[阶段 文档状态 当前版本] --> D
D --> E[HTTP 命令 工具 任务提交与读取]
D --> X[有效权限解释与矩阵]
```
```mermaid
flowchart TB
Q[受信主体与资源定位] --> A{账号 动作与归属有效}
A -->|否| N[拒绝并给出可披露原因]
A -->|是| B{系统动作}
B -->|是| C[系统来源与受保护权限检查]
B -->|否| D[项目资格与硬限制检查]
D --> E[逐角色建立完整路径]
E --> F[资源 职责 状态 版本检查]
C --> G{当前授权通过}
F --> G
G -->|否| N
G -->|是| H[允许 在提交或输出边界再检查]
```
### KTD5. 文档三权与读取范围
复用现有整文审签,不建立另一套审批引擎。
项目创建者通过统一服务选择有效项目成员,系统验证职位资格与文档三权异人要求,再记录真实分配者和受指派人员。
审核人可多人,全部指定审核人通过后才允许批准;审核/批准只能批注和通过/驳回,不能修改正文。
审核与批准人员因实际职责可读提交审阅的正文和明确关联材料;这不开放私人对话、未分享原件或私人草稿。
共享授权只增加规定资源的读取能力,不转为编写或签字资格。
审签轮次冻结正文版本、职责版本与政策版本;人员停用、解绑、移除或权限收紧后,待处理轮次进入明确等待/失效状态,重新指派及提交。
历史已完成的签字和操作者身份保留,不因换岗改写;历史内容读取仍使用当前授权。
批准后修改采用既定撤回重审+影响提示;职责替换不能清洗同一版本实际编制者的记录。
未分配三权的文档显示等待分配,并阻断受控编写/提交,不回落为全成员可写。
```mermaid
stateDiagram-v2
[*] --> WaitingDuty
WaitingDuty --> Drafting: 指派有效三权
Drafting --> Reviewing: 编制人提交固定整文版本
Reviewing --> Drafting: 驳回或撤回
Reviewing --> Approving: 全部指定审核通过
Approving --> Drafting: 驳回或撤回
Approving --> Approved: 指定批准人签字
Approved --> Drafting: 撤回并开启新版本
Reviewing --> WaitingDuty: 职责或必要资格失效
Approving --> WaitingDuty: 职责或必要资格失效
```
### KTD6. 查找与配置界面
沿用系统管理区、项目设置和文档入口,遵守 Dev `DESIGN.md`,不新增无用途的权限仪表盘。
1. 系统管理 → 用户:可搜索列表、职位/状态过滤、用户详情;详情显示可选资料、职位绑定、系统能力及来源。创建账号不要求填写人员资料。
2. 系统管理 → 角色与权限:角色列表+名称/描述/状态/绑定人数;选中角色后编辑默认与上限,也可切角色×权限矩阵。系统级受保护项按操作者资格显示。
3. 项目设置 → 成员与权限:选人、选择项目生效职位、项目覆盖;单成员视图与成员×权限矩阵共用草稿,显示最终解释。
4. 文档现有入口 → 三权:文档×编制/审核/批准矩阵与单文档选择器;候选范围、资格不足、多人审核及冻结状态直接说明。
精确搜索按选定字段规范化后完全匹配,稳定 ID/登录名优先;模糊搜索首期采用包含匹配和明确的前缀排序,不默认增加拼音/向量/模型识人。
搜索资料范围遵循目录权限;被禁字段既不返回,也不参与未经授权的匹配,防止通过命中数量探测联系方式。
过滤包括权限 scope、分组、默认/上限/最终允许、继承/覆盖、职位与账号状态、当前修改;精确/模糊与过滤可以组合。
共享“职位”不代表可查看所有同职位人员的私密资料。
同名候选显示姓名(如有)、登录名、职位与工号的授权投影;人名不清楚时必须选择具体对象,模糊匹配不能直接完成任命。
矩阵不是一张无限扩展的大表:按分组及分页显示,固定对象标签,提供单元格说明和键盘导航。
单角色视图的 default 与 cap 两列,成员视图的 inherit/allow/deny,与最终“允许/拒绝”的只读结果有明确区分。
过滤隐藏项不清空草稿;“全选”只选当前明确列出的结果,服务端提交固定 ID 清单与选择数量,不能把模糊查询直接当成授权范围。
### KTD7. 批量变更、撤权与 Agent
所有配置走“草稿 → 差异及影响预览 → 提交确认 → 服务端重验 → 原子写入与审计回执”。
预览绑定操作者、对象 ID、策略版本及 patch 摘要;它不能作为跳过提交授权的凭证。
一批多个角色/成员的修改采用 expectedVersion/authorityEpoch 与事务,任一非法对象、越上限或冲突均不部分提交。
跨 Backend 与 RDM 的一项业务变更不伪装成单库原子事务;按明确 owner 分开提交,显示实际状态和可恢复步骤。
超时结果标为未知,以幂等键查询事务回执,避免重复授权或错误声称失败。
权限 epoch 的权威落在存储和服务端判定;进程通知用于使缓存尽快失效,通知丢失不能继续使用旧授权。
HTTP/检索/下载在输出边界检查当前权限;任务入队、恢复、使用资源和最终提交分别检查;持续流在新输出前重验并在撤权后终止受影响订阅。
已经交付到客户端或既有模型上下文的内容无法追回,撤权会清除应用缓存并阻断后续读取、工具执行和结果披露;对含已撤数据的模型运行终止并重新构造上下文。
UI、对话、Agent 工具共用权限目录查询、候选选择、解释、预览与提交 primitives。
沿用公开命令总线,但明确声明工具投影和风险级别;管理写入经宿主的人类确认,模型不能确认自己的授权提案或签署三权。
管理区发起的确认使用现有确认卡/弹层能力,并提供可发现的返回路径;不能只报“请到对话确认”而丢掉当前草稿。
异步状态只由一个 store 管理,按 actor+project+对象版本+request generation+seq 丢弃过期响应,失败时清空对应旧能力。
```mermaid
sequenceDiagram
participant H as 人类管理者
participant UI as 单对象或矩阵视图
participant API as 公开授权服务
participant DB as 权威存储
H->>UI: 选择固定对象并修改草稿
UI->>API: 请求差异和影响预览
API->>DB: 读取当前版本与授权
API-->>UI: 返回具体变更和拒绝原因
H->>UI: 确认变更
UI->>API: patch 版本 幂等键
API->>DB: 重验并事务写入与审计
API-->>UI: 完成 冲突 拒绝或未知结果
```
### Compatibility and Migration
迁移必须保持账号 owner/userId、roleId、projectId、createdBy、资源标识及历史签字身份。
既有单角色绑定导入一个有效 binding;项目只选用该绑定,不自动加入新增角色。
旧 profile 字段映射到可选资料;未知资料留空,不推断人员姓名或联系方式。
现有两套管理员身份仅映射为明确的系统动作来源,不生成全项目业务 grant;旧 owner 的正文默认、停用回落与遗留越 cap 覆盖列为权限收缩差异。
角色权威迁移采用版本化清单与冻结写窗口:导出带来源版本及摘要的角色/绑定/cap,导入 Backend 后核对数量、稳定 ID、逐项范围和所有引用,再切换消费者。
禁止双主写入;过渡 RDM 旧管理命令转发新权威服务或明确只读,旧表只保留可核对历史。
冻结期间不能取得一致快照时停止迁移,不做无事务的跨库复制。
先在隔离副本执行迁移与双评估,输出用户×项目×动作的旧→新差异;双评估只用于记录,新算法上线时只有一个执行权威。
扩权项必须有明确新授权;收缩项逐项列出原因和处理人,不能为消除差异恢复旧越权。
生产迁移前完成备份及恢复演练、固定程序/配置/数据身份,按发布和迁移授权切换。
回滚不得重新启用身份式业务全权或复活撤销记录;不能满足这一条件时进入维护/拒绝状态,先修复迁移或程序。
账号恢复需修订既有账户方案的信任与交付合同,防止管理员拿一次性 Key 设密后接管业务身份;一次性本身不满足 R7。
普通管理员仅发起恢复提案,账号本人须使用管理员不能单方改写或取得的既有有效会话确认或预先建立的本人恢复证明,才能取得可兑换设密能力。
可选姓名、电话、邮箱和工号只是人员资料,不自动成为恢复证明;新证明的建立或更换不能由发起恢复的管理员单独完成。
若没有独立本人验证条件,线上恢复拒绝,不向普通管理员交付可兑换的目标账户 Key;异常人工恢复采用另行批准的 owner 操作,不纳入普通角色管理权限。
U1 冻结证明与交付合同,U3 消费已批准能力并验证该负例;既有恢复命令未收口前不能宣称 R7 完成。
### Dependencies and Existing Work
本方案衔接 [RDM 功能与实现整改方案](2026-10-12-rdm-function-implementation-plan.md)、[RDM 完整交付方案](2026-10-11-rdm-final-target-completion.md)、[两树一网追溯审计方案](2026-10-11-rdm-two-trees-trace-audit-integration.md) 与 [账户和登录 Key 方案](2026-10-12-svc-unified-deploy-and-login-key.md)。
本轮管理员决定将修订前述审计方案的跨全部项目业务审计放行口径,以及权威 SR-G6 的“所有权限”表述;旧批准记录保留,新候选条款须按本方案评审和切换。
账户方案中恢复 Key 可交付给签发者的既有口径同样需要按 R7 修订;对已有业务账号不能只保留短时设密限制。
多职选择将修订 10-12 方案的首版单角色建议。
U0 D2/D3/D5 的管理不代签、私域与冻结整文规则继续作为约束。
现有 `feature/admin-notes-repair` 涉及管理样式与角色勾选同步;其他 RDM 工作区有审计/导出/pins 相关任务。
这些仅依据本地任务记录和分支阅读,不代表本轮已经核验远端 PR 或 CI。
实施启动时查询最新权威 base/head、实际公开契约、已合入内容和在途负责范围,复用有效改动,避免平行修改同一管理页面与审签引擎。
基座公开扩展的实现、兼容验证及固定版本消费是 U4/U5 的依赖;发布版本仍由用户按高后果双钥匙执行。
---
## Implementation Units
以下均为待批准工作项;U 编号带本方案名称使用,避免与其他方案的 U 编号混淆。
文件范围以指定仓根目录为基准;标“新增”的文件为规划位置,实施可按项目模块规范调整。
### U1. 冻结需求、权限目录与公开扩展合同
目标:将本轮两项裁定和 R1–R20 落到权威需求、动作 scope、通用服务/领域规则边界及公开提供者/消费者合同。
依赖:人工确认本方案需求与 KTD1;负责人为产品负责人和基座/RDM 模块 owner。
文件:RDM `docs/requirements/01-用户需求与系统需求.md`、`03-产品设计方案.md`、`08-核心数据模型-两树一网.md`;Documents 相关方案与扩展申请;Backend `pkg/extension/extension.go` 合同草案。
方法:冻结权限目录、敏感字段投影、系统管理恢复条件、账号本人恢复证明与凭据交付、项目创建与角色 cap 关系、公开版本兼容和旧命令映射。
验证:文档差异与链接核对、动作×scope×配置主体表逐项评审;本单元不实施业务,也不制造业务测试 PASS。
出口:阶段 1–5 对应产物和人工结论齐备,明确选择通用角色权威位置后才能进入其实施。
### U2. 收口现有系统与项目越权路径
目标:先修 R6–R12/R18 的当前路径,为后续迁移建立安全基线。
依赖:U1 对动作与边界的批准;RDM 执行端 owner 负责。
文件:RDM `internal/rdmapp/perms_api.go`、`runtime.go`、`upload.go`、`draftproposal.go`、`plugins/rdm/plugin.go`;测试扩展 `plugins/rdm/roles_test.go`、`draft_visibility_test.go`、`internal/rdmapp/perms_test.go`、`u1_auth_test.go`、`resource_authz_test.go`。
方法:系统管理使用独立资格;清除自动业务 admin 放行;先验证角色动作存在和 cap,再考虑覆盖;停用不回落更宽默认;创建者走相同硬约束。
执行方向:以当前源码触发方式先建立会失败的公开执行负例,避免仅测试新帮助函数。
测试场景:
- 普通角色获 project.settings 后,全局 cap、角色管理、admin 移交仍拒绝。
- A 创建者改 B 的成员、权限、职责和归档均拒绝;矩阵解释一致。
- 管理员未获 B 业务授权,正文/业务审计/原件/私人草稿/导出均拒绝。
- 先设 allow 覆盖,再换到未配置该动作角色,当前执行与解释均拒绝。
- 停用受限角色不新增权限;owner 遇 cap=false 同样拒绝;有效合法成员仍可执行原有合法动作。
出口:直接 API/命令负例与正常回归闭合;不得宣称完整迁移或最终产品已验收。
### U3. 基座账号资料、有效态与受控目录
目标:实现 R3–R5/R11,提供真实人员查找而不复制账号。
依赖:U1 目录及系统管理合同;Backend owner 负责。
文件:Backend `internal/store/auth.go`、迁移、`internal/server/accounts.go`、`internal/app/hostcaps.go`、`pkg/extension/extension.go`;新增账号资料/有效态测试及扩展 `internal/app/account_lister_test.go`、服务器账户测试。
方法:资料 CRUD 与停用有明确系统资格;目录查询按系统管理/项目选人/职责候选投影字段,分页稳定;停用同步终止会话与能力。
测试场景:
- 姓名电话邮箱工号均空成功建号;填写和清空资料不改身份。
- 两名同名用户精确按 ID/登录名正确选定;模糊结果要求再次选择对象。
- 项目选人未经联系方式权限不能按电话号码探测命中,不能批量导出完整目录。
- 本人改备注不能改角色、管理员位或有效态;停用账号不能继续操作或作为三权候选。
- 管理员持有 credential.recover 仍不能取得目标用户可兑换凭据或正常登录能力;无本人验证条件时恢复拒绝;管理员改可选资料不能改变恢复证明。
- SQLite 与 PostgreSQL 的空值、格式、分页和并发版本冲突行为一致。
出口:公开提供者/消费者契约验证及后台真实目录数据闭合。
### U4. 通用职位、多职、默认与上限及原子批量服务
目标:实现 R1/R2/R6/R10/R13/R15/R20。
依赖:U1、U3、U2 安全基线;Backend 与 RDM owner 共同负责迁移窗口。
文件:Backend 新增 `internal/authz/` 通用目录、角色、binding、版本与系统授权存储和测试;公开扩展与注册面;RDM `internal/perms/roles.go` 和 `perms_api.go` 兼容转发;新增 `internal/authz/roles_test.go`、`policy_batch_test.go` 和迁移测试;RDM `plugins/rdm/roles_test.go` 消费契约。
方法:KTD1–KTD4/KTD7;保留 roleId;用户绑定多职;角色默认与上限范围成对校验;保护高权限任命与最后管理者;预览及提交均授权。
测试场景:
- 一个职位绑定两人,同一人绑定两个职位;编辑说明不影响用户/项目 ID。
- 默认 grant 超 cap、未知动作、停用角色任命、无权编辑受保护项均拒绝。
- 一角色有动作无目标范围,另一角色有目标范围无该动作,组合仍拒绝。
- 批量里一对象非法或版本冲突,全部不写;同一幂等请求只生成一次变更及审计。
- 旧单角色数据导入保持 ID/绑定,双主写入被阻断;失败迁移恢复不复活撤权。
出口:角色与绑定只有一个权威来源,系统动作与新旧公开消费者结果一致。
### U5. 项目角色选择、覆盖和统一资源读取
目标:实现 R2/R7–R12/R14/R18/R19。
依赖:U3/U4 与公开版本就位;RDM 项目 owner、Backend 资源接口 owner 配合。
文件:RDM `internal/members/members.go`、`internal/projects/projects.go`、`internal/rdmapp/projects_api.go`、`perms_api.go`、`runtime.go`、`plugins/rdm/plugin.go`;Backend 项目 API、`internal/server/resource_authz_test.go`、`resource_authz_consumption_test.go`、`internal/app/resource_authz_v2_test.go`;RDM `member_guards_test.go`、`resource_authz_test.go`、`perms_test.go`。
方法:加入和建项保存明确 binding;项目覆盖只操作本项目;资源策略消费完整 action/type/id/owner/project;列表、计数、检索、历史和导出均过滤;宿主项目和领域项目稳定绑定。
测试场景:
- 新增用户职位不改变已有项目;项目选择新增 binding 后才生效。
- 解绑再重新任命不能自动恢复旧项目选择/旧覆盖。
- 唯一负责人解绑后重新任命合格职位,可经受限入口由本人明确重选并恢复管理;普通管理员、前负责人或 cap 不足者不能代修复,也不能借此读资源或恢复旧 allow。
- 项目明确 deny 在另一角色可 grant 时仍拒绝;allow 超所有可用 cap 拒绝。
- 创建者可以管理本项目,不能读私聊或未分享原件;无管理资格建项不留下可使用半成品。
- 篡改 projectId、资源 ID、owner 以及使用基座直连建项/下载/检索不能绕过域策略。
- 策略提供者错误、缺失或权限通知丢失时拒绝;分页与数量不泄露被过滤对象。
出口:HTTP/Host/命令/模型上下文的直接入口均有同一作用域和资源边界。
### U6. 三权资格、冻结轮次及真实分配者审计
目标:实现 R16/R17/R18,复用已有整文审签能力。
依赖:U4/U5;RDM 文档模块 owner 负责。
文件:RDM `internal/domain/review.go`、`internal/rdmapp/docsubmission.go`、`draft.go`、`plugins/rdm/plugin.go`;扩展 `write_duty_stage_test.go`、整文审签测试和职责候选测试。
方法:统一分配服务检查有效账号、项目成员、选用职位、cap 与异人;审计记录真实操作者;轮次冻结与资格撤销处理按 KTD5。
测试场景:
- 跨项目、停用、非成员和 cap 不足候选拒绝;编制/审核/批准同人拒绝。
- 多审核人未全部通过时批准拒绝;旧票不能签新正文。
- 管理员/创建者未被指派不能代编、代审、代批;审核人能读提交正文但不能读取未分享原件。
- 在途撤权或换职责使待处理轮次失效;历史已签版本和主体保留。
- 分配者与受指派编制人不同,审计 actor 是真实分配者。
出口:一份整文由真实三个职责完成与拒绝链,资格解释和执行一致。
### U7. 用户、角色、项目权限与三权界面
目标:实现 R4/R5/R13–R16,形成完整管理操作路径。
依赖:U3–U6 相应服务合同稳定;Frontend/UI owner 负责。
文件:Frontend `src/components/adminSections.tsx`、`adminRdmSections.tsx`、`AdminZone.tsx`、`rdmManagement.ts`、`api.ts`、`store.ts`;复用 `test/rdmroles-reject.test.ts`,新增角色矩阵/成员矩阵/目录与三权交互测试;沿用两个仓的 `design-guard.test.ts`。
方法:KTD6/KTD7;先整合在途管理页面改动;消费服务端权限目录与 capabilities,共用草稿模型,选择稳定 ID。
测试场景:
- 单角色与矩阵产生等价 patch;过滤和翻页不丢草稿;全选范围与预览一致。
- 姓名同名但登录名不同不误选;资料空值正确展示;无资格者看到明确拒绝原因。
- 两窗口并发编辑返回冲突并保留草稿;等待确认/已完成/结果未知分开显示。
- 快速切项目/角色/搜索词,迟到结果不能覆盖新目标;403 不被当成登录失效或永久加载。
- 明暗主题、键盘导航、焦点、窄屏及广告过滤环境可用;令牌和折叠原语门禁成立。
出口:真实用户通过既有页面完成建号/任命/项目选人/覆盖/三权,没有手填 ID 的必要主流程。
### U8. Agent 同源工具、撤权与后台提交
目标:实现 R12/R19,并验证 UI 与对话动作 parity。
依赖:U4–U7;命令总线与运行时 owner 负责。
文件:RDM `plugins/rdm/plugin.go` 工具声明和描述、任务资源使用/提交位置;Backend `internal/cmdbus/`、`internal/runmgr/`、公开策略集成测试;Frontend 卡片/Surface/能力 store 相关测试。
方法:查询、解释、预览和提交用同一 primitives;对角色/项目/三权写操作使用宿主确认;任务恢复与新输出重验,终止含已撤数据的运行。
测试场景:
- 同一动作 UI/命令/工具的允许、拒绝、审计和对象一致,模型不能伪造 actor 或确认自己的提案。
- 入队后撤权、恢复旧任务、确认旧卡、使用旧 Surface 均不能提交。
- 已开 SSE/下载/检索遇撤权终止后续读取,权限通知丢失仍由当前存储判定拒绝。
- 含已撤资料的模型上下文不被继续使用或披露,恢复从新授权上下文开始。
- 真实模型能查询候选、解释权限和请求人确认;遇歧义人名停止在选人步骤。
出口:mechanism 测试与适用真实模型任务级验证分别留证,不用 mock 代替模型验收。
### U9. 迁移演练、精确组合及正式验收
目标:闭合 R1–R20,交付单一权威的实际产品行为。
依赖:U2–U8 完成对应评审;迁移、部署和运行测试各有明确授权;集成 owner 与用户验收人负责。
文件:各仓迁移与验收记录;Dev task evidence、组合 pins 和功能规划;新增多账号权限端到端用例按仓内测试规范保存。
方法:先隔离副本、SQLite/PG 同构迁移、差异审阅和恢复演练;固定 base/head/pins/config/data identity,再在授权环境执行真实账号验证。
测试场景:
- 至少两个独立项目;系统管理员、A 创建者、B 创建者、同职位两人、一人多职、两名审核人、批准人、普通成员和无关用户。
- 完成资料/职位/系统能力/项目选择及覆盖/文档三权全过程,并逐项执行跨项目、换岗、停用、上限收紧与私域负例。
- 重启后任命/覆盖/职责与撤销保持;两实例缓存失效、并发编辑和任务恢复一致。
- 迁移 diff 无未经批准扩权;回滚保留撤权事实,不启用旧管理员业务旁路。
- 实际浏览器由最终固定产物提供;系统角色变化、公开契约、模型工具、文档正文和审计结果同一对象。
出口:用户正式验收、独立 Review、当前 HEAD 的权威 CI、合入及部署记录各自齐备;不能用其中一项替代其余。
### Phased Delivery
```mermaid
flowchart TB
U1[U1 需求与公开合同评审] --> U2[U2 当前授权路径收口]
U1 --> U3[U3 用户资料与目录]
U2 --> U4[U4 统一职位与多职服务]
U3 --> U4
U4 --> U5[U5 项目与资源授权]
U5 --> U6[U6 三权资格与轮次]
U3 --> U7[U7 管理界面]
U4 --> U7
U5 --> U7
U6 --> U7
U7 --> U8[U8 Agent及撤权全链]
U8 --> U9[U9 迁移组合与正式验收]
```
建议分四个可验增量:I1=U1+U2 的边界修正;I2=U3+U4 的人员/职位与目录;I3=U5–U7 的项目、三权及配置体验;I4=U8+U9 的全链和迁移验收。
各增量遵循 policy/delivery.md 的需求、方案、实施、验收人工出口;阶段内可继续调查、自检与整改。
既有公开契约只读、UI 单对象/矩阵模型设计可在依赖批准后并行;服务端迁移和同一页面写入按 owner 协调。
实施工期在 U1 完成、实际在途任务及公开版本核定后估算,不把未验证的迁移规模写成日期承诺。
---
## Verification Contract
以下是后续验证计划,本轮业务结果全部 NOT_RUN。
| 层 | 验证内容 | 命令/环境与证据要求 |
|---|---|---|
| 文档 | 当前引用、需求追溯、两项裁定、规则一致性 | 文档 diff 与链接检查;SELF |
| 账号与通用授权 | 正常/越权/停用/并发/多职/批量/迁移 | Backend 相关 Go 测试与合同测试;执行时固定 SHA |
| RDM 领域 | 项目隔离、角色选用、范围、三权、私域和状态 | RDM 相关 Go 测试、公开 HTTP/命令集成;`make test` |
| UI | 搜索、选择、两种矩阵、确认、冲突与拒旧 | Dev `make test-frontend`、`make test-ui`;固定组合实际浏览器 |
| 产品组合 | 基座提供者/RDM 消费者/正式前端产物 | 各仓和 Dev `make test`、`make build`,核对实际 pins 与制品 |
| 存储与恢复 | SQLite/PG 迁移、并发、重启与多实例撤权 | 隔离数据与授权运行环境;最小权限真实账号集 |
| Agent | 查询/解释/确认/拒绝/恢复/资源使用 | 真实模型任务级测试;机制单测与模型结果分开 |
| 正式交付 | 同步、测试、Review、CI、合入及部署 | 当前 base/head;precheck/task-sync/检查输出经 evidence;GATE 运行身份+SHA 或独立 REPLAY |
本地 evidence 为 SELF,不因标签或摘要提升可信级别。
正式验收固定被测源码、组件 SHA、配置与数据身份;Reviewer 按最小重放集独立核验。
未执行、跳过、零用例或源代码存在不能写为业务 PASS。
文档保存只检查文档,不启动业务测试、数据库迁移或服务操作。
---
## Definition of Done
本轮方案交付:本文包含当前差距、完整需求、明确模型与合成规则、界面方案、迁移与兼容、工作项/文件/测试/依赖和评审出口;两项用户决定有准确来源;主入口与任务卡可接续。
完整功能交付:R1–R20 均能映射至实际实现及固定对象证据,所有必要正常、异常、边界和权限负例成立;用户正式验收后按仓库规则完成独立 Review、当前 CI 与组合核验。
启动实施前需完成的评审选择:KTD1 通用职位权威迁移、创建者管理与角色 cap 的耦合和本人重选规则、受控目录可披露字段、账号本人恢复证明及交付合同,以及生产迁移/切换范围。
这些是当前草案中已给推荐方案但尚未批准的设计选择,不影响本轮方案交付,不授权实施者自行替换路线。
实施时再确定的细节:表名/迁移编号、最终 package 位置、目录分页与搜索索引阈值、通知实现和隔离环境,不改变上述产品边界。
停止条件:范围或需求改变;必要公开契约不兼容;角色数据无法取得一致快照;发现未批准扩权;实际制品/数据身份不明;在途任务 owner 冲突;越出迁移/部署授权。
发生时保存当前证据与现场,返回受影响方案或计划评审,不能放宽授权继续。
推荐下一步为评审 U1 和 I1,先批准本次权限边界与公开合同,再实施已有可达授权路径的收口。
这项建议不自动启动业务任务;完整用户资料与矩阵设计已有后续依赖和验收,不会在首批完成后遗漏。
@@ -0,0 +1,336 @@
# 最终验证与合入调度 Implementation Plan r1
> **For agentic workers:** REQUIRED SUB-SKILL: Use `executing-plans` for native execution or `subagent-driven-development` when that method is selected. Read the specification and this plan; implement and verify one work item at a time. Checkboxes describe required steps; current progress and fixed objects are recorded in the Dev task card.
**Goal:** 减少多个就绪分支因其他正常合入而反复同步、解决冲突和重跑最终 CI,同时保证实际合入候选通过既有检查。
**Architecture:** 开发并行;同一目标由一个明确协调者安排最终同步至合入核验的串行窗口。首版使用源码外 Gitea 调度 Issue、幂等同步和分级恢复入口;保留现有 workflow 及平台准入,不建设自动调度 daemon。
**Tech Stack:** 现有 Bash/Git 任务脚本、Python 标准库 evidence 工具、Makefile、unittest 临时真实仓库夹具、Gitea PR/Actions。
**Spec:** Agent-System-Dev `policy/merge-queue.md` r1(本地来源提交 `913b214f2826a50b3dab65f79d9ebf83e84f2519`);Development-Guidelines `standards/merge-queue.md` 与 `templates/merge-queue.md`(本地候选提交 `606f21db99b971aae82c2348a9b7959e6aa2060c`,draft.11)。两项来源尚未推送/合入,不生成不可访问的远端源码链接。
**Status:** approved(阶段 5);编制日期 2026-10-13(Asia/Shanghai);负责人 weichen。用户在本计划 r1@ba4044d57e38d0887dd425d052abf26b20a28bf4 交付后回复「批准」,按推荐的原生方式实施。源码与自检已在 Dev 任务分支推进,证据和当前对象以任务卡为准;平台所有者操作及真实三任务 CI 试行 NOT_RUN。
**Document baseline:** Documents `origin/main=5a06acf7cded07797ec4ebfea42c89331359b0bb`。本计划正文只维护于 Documents;任务进度、命令证据和批准依据仍以 Dev 任务卡为准。
## Global Constraints
- 共同起点及最终交付实际同步最新目标保留;正式验收、审核、合入仍分别核验新鲜度与候选身份。
- 一个目标最多一个交付窗口,覆盖最终同步、正式验证、必要复审、合入及真实内容核对。
- 队列更新、CI 链接和候选固定后的本地收据位于被测源码之外;不能向 main 提交调度心跳或状态。
- 当前 HEAD 的全部必需 CI 必须实际通过;不复制旧绿色状态,不把跳过必需作业当通过。
- 人工阶段结论、独立 Review、SELF/REPLAY/GATE 的身份边界不变。入队与领取不是批准或新的工作授权。
- 修改治理脚本必须执行 `make test-governance`;跨仓指针推进前执行 Dev `make test`,最终精确 HEAD 的平台 CI 另核验。
- 首版人工预算沿用规格:无进展 20 分钟、窗口 90 分钟、已知基础设施失败最多额外重试一次、等待队列每 30 分钟复查。实际 runner 容量及长期预算在试行前核验。
- 分支保护变更由 Agent 准备、用户确认并亲手执行;本计划不授权绕过保护、改写历史或发布版本。
- 不隐式 stash/reset/强推,不覆盖组件 feature 分支,不丢失现有收据或他人现场。
## Review Focus
1. 同步已经完成,但为记录再创建提交:U1 对有任务卡的真实仓库重复调用,断言 HEAD、索引和卡片不变。
2. LOCAL_READY 被当作可启动新任务或可合入:U2 覆盖启动拒绝、严格恢复拒绝、未知远端及脏现场继续阻断。
3. evidence 写回任务卡后才确认候选,或最终 SHA 仍指向记录提交之前:U1 核对输出真实 HEAD,U3 对源码外收据流程核对前后身份。
4. 队列 Issue 被误认为互斥锁,或失联协调者被盲目接管:U4/U6 分别检查 manual 登记、旧执行者退出确认和未知结果对账。
5. 分支 CI 绿色但其语义组合、组件或平台必需检查无效:U4/U5/U6 覆盖外部推进、组件版本不回退、精确对象与真实拒绝路径。
## 1. 范围、决策及来源核对
### 本增量
U1–U3 为可在隔离仓库验证的任务与证据改进;U4 将已批准条文和实际能力接到交付入口;
U5 准备并验证平台准入条件;U6 在已授权真实任务上试行。实施顺序固定 U1 → U2 → U3 → U4 → U5 → U6。
三个源码单元完成后可先提交实施产物供阶段 6 评审;模式切换需 U4/U5 条件齐备,不能把脚本通过当线上启用。
首版不修改 `.gitea/workflows/ci.yaml` 的触发、必需作业或检查上下文。节省重复最终 CI 的方法是:
其他就绪分支不因 main 前进推送同步提交;当前窗口分支完成所有必要记录后只推送固定最终候选。
现有开发提交仍可能运行完整 CI,首版不声称已自动区分轻重检查或能抢占 runner。
后续 workflow 分流、自动原子领取和执行端 fencing 单独立项,不能为完成本计划顺手建设。
### 已确定的选择
| 决策 | 采用方式与理由 |
|---|---|
| 调度方式 | 人工首版:一份共享 Issue、一个协调者;与已批准规格一致,先控制实际推进顺序 |
| 同步方式 | 保留 merge 历史;只有目标尚未包含时发生同步写入,同基线节点只核验 |
| 启动/恢复 | 新任务和默认交付模式仍严格;仅既有合法任务可以显式选择局部恢复 |
| 收据格式 | 本增量保留 schema 1 及原始校验和;局部模式由真实 precheck 输出及验证用途区分,不随意添加 snapshot 字段 |
| 固定后证据 | 使用已有 RECEIPT 捕获模式,不增加冻结数据库或签名协议;manual 流程每个节点核对实际对象 |
| 独立审核 | 建议原生逐项实施,末尾按现有交付规范安排独立 Review;编制时仅为计划,尚未启动审阅/实施代理 |
### 编制时实现基线(源码观察 SELF)
| 路径/符号 | 本次确认的行为 | 对计划的约束 |
|---|---|---|
| Dev `scripts/task.sh:cmd_sync` | 先获取目标并检查/物化组件;有任务卡时每次追加记录并提交;输出 head 在记录提交前取值 | U1 必须消除无变更提交,并输出记录完成后的 HEAD |
| Dev `scripts/task.sh:cmd_precheck` | 远端失败为 REMOTE_UNVERIFIED;脏现场为 SHARED_WORKSPACE_BUSY;落后为 SYNC_REQUIRED | U2 不整体改成 READY,保持默认严格 |
| Dev `scripts/evidence.py:validate_precheck` | 只接受真实 precheck 命令、READY、成功及固定源/目标;用于 task-start | 新任务不能消费局部恢复收据 |
| Dev `scripts/evidence.py:read_receipt/validate_snapshot` | schema 1 和 snapshot 字段集合严格校验,允许可选 capture_note | 无必要不改 wire schema;历史收据不重写 |
| Dev `scripts/evidence.py:main/write_receipt` | RECEIPT 模式已存在,绝对未用路径、0600、完整输出、before/after;默认模式写任务卡 | U3 复用能力,最终窗口明确选择源码外路径 |
| Dev `scripts/zcode/write_guard.py:check_location` | 检查目标实际仓库及分支,未读取 precheck 收据或判断目标落后 | 不把当前守卫描述为阶段/新鲜度强制闸;保留分支检查与负例 |
| Dev `.gitea/workflows/ci.yaml` | PR/main push 触发 test、test-pg、svc-realcombo;checkout 核对固定 SHA 与仓库 allowlist | 不凭 queue label 跳过检查;不能直接复制此 workflow 到临时仓当作合法等价 CI |
以上为编制时源码观察;当前能力与执行进展见任务主记录及固定候选的 PR/源码外收据。源码单元实施前再次读取实际符号,记录新的 base/head;行号变动不改变接口选择。
平台配置、runner 容量和在途任务用当场记录核验,不复用旧观察作当前准入证明。
## 2. 公共入口与兼容约定
以下是本计划拟新增或调整的接口;编制时均未声明已实现,当前状态以任务主记录及其固定候选证据为准。
| 入口 | 默认/输入 | 结果及兼容 |
|---|---|---|
| `make task-sync` | 正常严格同步;来源仍为权威 origin/目标 | 保留 `[synced]`;完整 sync_base、最终 tested_head、checked_at,追加 changed=0/1;未变不提交卡片 |
| `make precheck` | `TASK_WORK_MODE=delivery` 默认;可显式 local | delivery 保留 READY/SYNC_REQUIRED;local 仅既有登记任务输出 LOCAL_READY,不称可合入 |
| `make task-resume PRECHECK_RECEIPT=...` | 复用登记任务;TASK_WORK_MODE 与 precheck 一致 | 验证相应用途的原始收据后原样导入,不建分支、不后台同步 |
| `make task-start` | 始终用途 start、严格 READY | 无视外部试图选择局部验证用途的参数;LOCAL_READY 必须拒绝 |
| `VALIDATE_RECEIPT_PURPOSE` | evidence 内部验证用途;默认 start | start、resume-delivery、resume-local 三值;未知值拒绝,两个任务入口显式设置用途 |
| `RECEIPT=... CMD=... make evidence` | 既有捕获接口 | 保留 schema 1、原命令状态、完整脱敏输出及来源 SELF;固定候选期间路径在当前 checkout 与 Git 元数据之外 |
`LOCAL_READY` 是局部工作的检查结果,不能提升为交付准入。旧的 schema 1 收据和 READY 输出继续可读。
`VALIDATE_RECEIPT_PURPOSE` 不传给被测命令子进程,避免改变测试环境;不能由它改变来源等级。
## 3. 工作项
### U1:同步幂等化及最终对象输出(R1/R2,MQ3/MQ4)
**Files(Dev 仓):** Modify `scripts/task.sh`;Test `tests/test_task.py`;对应说明在 U4 同步。
**Interfaces:** 消费 `fetch_target`、`check_worktree` 和原任务卡;产出第 2 节的 `[synced]` 协议。
- [ ] 在现有 `TaskLifecycleTests` 中补有任务卡的夹具。使用已有 `self.git/self.worktree`,记录实际 R0,不创建假测试证据:
```python
def record_task_card(self, wt):
branch = self.git(wt, "branch", "--show-current").stdout.strip()
r0 = self.git(wt, "rev-parse", "origin/main").stdout.strip()
card = wt / ".task" / (branch.replace("/", "-") + ".md")
card.parent.mkdir(exist_ok=True)
card.write_text(
f"# {branch}\n状态:进行中;owner:Lifecycle Test\n"
f"- 权威仓:fixture;目标分支:main;R0(initial_base_sha)= {r0}\n"
f"- 工作区:{wt}(worktree);分支:{branch}\n"
)
self.git(wt, "add", str(card.relative_to(wt)))
self.git(wt, "commit", "-m", "Record fixture task")
return card
def test_sync_same_base_preserves_head_and_card(self):
wt = self.worktree()
card = self.record_task_card(wt)
head = self.git(wt, "rev-parse", "HEAD").stdout.strip()
content = card.read_bytes()
for _ in range(2):
result = self.task(wt, "sync")
self.assertEqual(self.git(wt, "rev-parse", "HEAD").stdout.strip(), head)
self.assertEqual(card.read_bytes(), content)
self.assertEqual(self.git(wt, "status", "--porcelain").stdout, "")
self.assertIn("changed=0", result.stdout)
self.assertIn(f"tested_head={head}", result.stdout)
```
- [ ] 执行 `PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -p 'test_task.py' -k sync -v`,确认当前无变更提交行为导致新例失败,再改实现。
- [ ] 同步前检查父仓未保存内容和活动操作;脏父仓/子仓拒绝,不自动 stash。成功 fetch 后区分祖先检查的 0、1 和其他错误。
- [ ] 已包含目标时仍核对/物化必要组件,未变则不追加卡片、不提交;未包含时保留 merge、冲突处置和一次必要记录。记录提交完成后再读取最终 HEAD 输出。
- [ ] 补新增目标成功纳入、重复调用保持 HEAD/索引/卡片、输出等于实际最终 HEAD、脏父仓/子仓/离线拒绝、组件 feature 分支保留和冲突不误报成功的测试。复用原组件夹具和已存在负例。
- [ ] 重跑上述直接检查,输出经 evidence 保存;按本仓四段提交格式保存此单元,不捎带其他任务文件。
### U2:既有任务局部恢复与严格准入分开(R1/R5,MQ4)
**Files(Dev 仓):** Modify `scripts/task.sh`、`scripts/evidence.py`、`Makefile`;Test `tests/test_task.py`、`tests/test_evidence.py`、`tests/test_write_guard.py`;独立恢复集成场景放 `tests/test_task_recovery.py`,复用原真实 Git 夹具。
`scripts/zcode/write_guard.py` 的现有分支级规则保留;无已证实兼容问题时不改它。
**Interfaces:** 使用 TASK_WORK_MODE 和第 2 节验证用途;`task-resume` 验证后复用 IMPORT_RECEIPT,不建立新工作区。
- [ ] 先补局部模式与默认严格模式的对照测试:
```python
def test_local_precheck_allows_existing_clean_task_behind_target(self):
wt = self.worktree()
self.record_task_card(wt)
head = self.git(wt, "rev-parse", "HEAD").stdout.strip()
self.advance_remote()
strict = self.task(wt, "precheck", check=False)
self.assertNotEqual(strict.returncode, 0)
self.assertIn("SYNC_REQUIRED", strict.stdout)
local = self.task(wt, "precheck", check=False,
env=self.env | {"TASK_WORK_MODE": "local"})
self.assertEqual(local.returncode, 0, local.stdout)
self.assertIn("[verdict] LOCAL_READY", local.stdout)
self.assertEqual(self.git(wt, "rev-parse", "HEAD").stdout.strip(), head)
```
- [ ] 执行 `PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -p 'test_task.py' -k precheck -v`,确认新例失败。新任务入口仍消费严格收据。
- [ ] local 只允许登记的合法任务 worktree/分支/任务卡,原 R0 必须仍是当前任务及权威目标的祖先;无卡、集成分支、错误归属、异常历史均拒绝。允许已知落后,不允许脏现场、活动操作、组件漂移、远端未知。
- [ ] `validate_precheck` 增加用途参数,由任务入口显式选择。保留命令、原始输出、源 HEAD、common_dir 等校验;start/resume-delivery 仍要求严格 READY 与当前目标一致。
- [ ] 测试夹具显式清理 TASK_WORK_MODE/VALIDATE_RECEIPT_PURPOSE,再由目标用例注入,避免开发终端环境污染默认严格模式的测试。
- [ ] resume-local 接受实际 LOCAL_READY;收到同一来源任务的历史观察后重新 fetch 核对当前目标及 R0,目标正常前进不要求改写原收据或同步分支。读取失败、源 HEAD 变更或 R0 不适用拒绝,两个观察的来源与对象分别记录。
- [ ] 补 LOCAL_READY 不能 task-start、不能严格恢复、用途未知拒绝、伪造任意命令拒绝、收据串仓/损坏拒绝、旧 READY 兼容、局部恢复不改 HEAD、已知目标前进与异常历史的对照。写守卫原有 main/detached/软链接拒绝测试继续通过,不宣称它已校验阶段批准。
- [ ] 执行上述 precheck 检查及 `test_evidence.py`、`test_write_guard.py` 的 unittest discover;记录实际输出后提交此单元。
### U3:候选固定前后使用不同证据保存位置(R2/R3,MQ3/MQ4)
**Files(Dev 仓):** Modify `policy/governance.md` 的证据流程;Test `tests/test_evidence.py`;同步任务卡模板说明于 U4。
现有 `scripts/evidence.py` 的捕获/导入协议复用;本单元不改 schema,也不增加冻结状态库。
**Interfaces:** RECEIPT 捕获、IMPORT_RECEIPT 导入、真实 snapshot;只有源码外记录满足固定后的流程。
- [ ] 用已有 `tests/test_evidence.py` 的真实仓库夹具补完整使用流程:捕获到仓外唯一路径,断言卡片字节、HEAD、索引不变,校验原始命令输出、before/after 和 0600;重复目标拒绝,旧收据原样导入且幂等。
以下用例放入既有 `EvidenceTests`,复用已核对的 `self.git/self.capture/self.card/self.receipt`:
```python
def test_fixed_candidate_capture_preserves_checkout(self):
self.git("add", ".task/main.md")
self.git("commit", "-qm", "Save fixture card before validation")
head = self.git("rev-parse", "HEAD")
card = self.card.read_bytes()
index = self.git("ls-files", "--stage")
data = self.capture("printf 'fixed candidate check\\n'")
self.assertEqual(data["before"]["head"], head)
self.assertEqual(data["after"]["head"], head)
self.assertEqual(data["output"], "fixed candidate check\n")
self.assertEqual(self.git("rev-parse", "HEAD"), head)
self.assertEqual(self.git("ls-files", "--stage"), index)
self.assertEqual(self.card.read_bytes(), card)
self.assertEqual(self.git("status", "--porcelain"), "")
self.assertEqual(self.receipt.stat().st_mode & 0o777, 0o600)
```
- [ ] 这项是既有能力的流程回归,允许先通过,不伪造“新增机制失败”结果。执行 `PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -p 'test_evidence.py' -v`。
- [ ] 固定前流程:同步 → 所有必要本地检查及任务卡收据 → 保存/提交卡片 → 核对干净组合 → 读取最终 HEAD → 推送并记录当前 CI 对象。
- [ ] 固定后流程使用以下既有接口,候选 SHA/组件/相关配置由调度尝试引用;路径须位于 checkout 和 Git 元数据之外:
```bash
RECEIPT=/tmp/mq-attempt-unique-check.json CMD="make test-worktree" make evidence
```
每个调用使用新的未占用路径,例中 unique 由执行者替换为该次尝试唯一名称。命令期间若对象变了,保留实际新旧对象和输出,不作为固定候选通过依据,返回 preparing 或退出整改。
- [ ] 未通过必要检查、未保存内容或新增提交时建立新尝试;既有最终 CI 不能沿用。合入/清理之后再按既有授权闭合,原始收据不能补写成预期输出。
- [ ] 文档与直接回归记录保存后提交;能力矩阵将此登记为 manual 流程+现有工具捕获能力,不宣称 OS 级冻结保护。
### U4:将窗口接到实际交付规则及单一记录(R1–R5,MQ1/MQ2/MQ5/MQ6)
**Files:** Guidelines 已有 draft.11 候选;Dev Modify `AGENTS.md`、`PROJECT.md`、`policy/delivery.md`、`policy/governance.md`、`policy/merge-queue.md`、`policy/adoption.md`、`policy/tool-adaptation-matrix.md`、`scripts/task.sh` 的任务卡模板;Test `tests/test_task.py` 的模板行为;Documents 保留本计划及索引。
**Interfaces:** 通用正文固定 SHA+项目采纳记录;一份实际平台调度 Issue;原任务卡只引用 entry_id/attempt_id。
- [ ] 按既有规范完成 Guidelines 文档 Review 与 PR 交付;Dev 采纳实际合入的完整 SHA,不能直接引用本地候选提交作为远端已交付事实。父仓指针正式推进前完成组合 `make test`。
- [ ] 根入口只路由到权威条文,修改 AGENTS.md 前应用 writing-for-agents;阶段 7–9 的核验职责不删,改为同一窗口内对象未变只核验。U1–U3 的入口和恢复语义同步到采纳记录、模板与矩阵。
- [ ] 文档先记录 approved/pending-activation;只在 U5 准入条件满足、协调者和记录建立后切换 active。源码改进可先交付,不由指针更新或本地测试替代上线切换。
- [ ] 在已获该动作授权的实施阶段建立一份 Gitea 调度 Issue,复制通用模板,填写实际协调者、目标、现有写入者清单、CI 预算与接管者;没有协调者则不开放领取。
- [ ] 所有正常合入者、闭合 PR、机器人和紧急通道按记录安排。manual 状态由协调者串行修改;Issue 无原子领取能力,不能用编辑成功证明互斥。窗口失联先对账,确认旧执行者停止后交接。
- [ ] CI 首版按可用资源和实际运行状态安排当前最终候选,不自动取消其他任务、改 runner 配置或建立定时自动化;30 分钟复查由协调者负责。
- [ ] 模板核对必含记录位置、entry_id、attempt_id、固定对象及实际结果引用。治理脚本/模板变更完成后执行 `CMD="make test-governance" make evidence`,正式交付另核验精确对象的全部 CI。
### U5:平台条件准备及所有者验证(R3/R5,MQ4/MQ8)
**Files(Dev 仓):** Modify `policy/platform-admission.md`、`policy/tool-adaptation-matrix.md`;必要事实更新经当场验证写 `policy/facts.md`。
**Interfaces:** 现有 Gitea 分支保护、PR head 状态/运行、所有者亲手执行;不新增本地合入权威。
- [ ] 当场读取当前 main、保护配置、合法固定 PR 的状态上下文及运行身份;输出经 evidence 脱敏保存。旧 SELF 观察仅作定位。
- [ ] 准备保留禁直推与陈旧候选保护、要求实际全部必需 PR 检查的具体配置和恢复步骤;从当次状态确认完整名称,不只保留历史 test 上下文。批准数和身份策略不随本计划擅自调整。
- [ ] 与所有者确认隔离验证对象与影响范围;Agent 不自行变更分支保护。用户亲手执行后,取得缺检查、失败检查、陈旧候选、无权推进被拒及合法候选可合入的实际结果。
- [ ] 临时平台仓可验证保护机制,但其 fixture CI 不能宣称覆盖 Dev 的完整业务组合。现有 Dev workflow 有仓库 allowlist,不修改 allowlist/凭据范围来让临时仓冒充 Dev;Dev 精确 HEAD 的实际 CI 另核验。
- [ ] 已知无法验证的能力标 NOT_RUN/manual;原子准入条件未满足时不切换新模式。自动接管的旧代次拒绝不是人工首版的通过断言,留待后续执行端实现。
- [ ] 回填真实对象、身份、运行/拒绝链接及 GATE/REPLAY;仅 API 配置成功仍为观察,不标 enforced。
### U6:三个真实任务的受控试行与复盘(R1–R5,MQ1–MQ8)
**Files:** Dev 创建 `tests/test_merge_queue_trial.py`(仅本地临时仓库场景);Documents 试行后创建 `docs/records/2026-10-13-merge-queue-trial.md`,实际日期不同则用真实日期;状态仍以各任务/调度记录为准。
**Interfaces:** U1–U5 的命令、调度记录和平台入口;不同目标/跨仓依赖使用已有任务授权,不新建业务需求。
- [ ] 隔离真实 Git 夹具覆盖 A/B/C 共同 R0,按窗口顺序最终同步、检查、合入;断言每条目第一次最终同步后重复核验不产生提交,后继不被要求提前同步。该测试的执行次数不冒充真实 Actions CI 次数。
新文件复用已有夹具对象,不继承整套 TestCase,避免旧测试被重复发现。下面固定正常路径;故障用例在同一类内复用该夹具:
```python
import unittest
import test_task as lifecycle
class QueueTrialTests(unittest.TestCase):
def setUp(self):
self.fixture = lifecycle.TaskLifecycleTests(methodName="runTest")
self.fixture.setUp()
self.addCleanup(self.fixture.doCleanups)
def test_sequential_delivery_does_not_sync_waiting_branches(self):
f = self.fixture
branches = ["feature/a", "feature/b", "feature/c"]
worktrees = {}
waiting_heads = {}
for branch in branches:
wt = f.root / branch.replace("/", "-")
f.git(f.repo, "worktree", "add", "-b", branch, str(wt), "origin/main")
f.record_task_card(wt)
name = branch.split("/")[1]
(wt / name).write_text(name + "\n")
f.git(wt, "add", name)
f.git(wt, "commit", "-m", "Add independent fixture change")
worktrees[branch] = wt
waiting_heads[branch] = f.git(wt, "rev-parse", "HEAD").stdout
f.advance_remote()
for position, branch in enumerate(branches):
wt = worktrees[branch]
f.task(wt, "sync")
candidate = f.git(wt, "rev-parse", "HEAD").stdout
f.task(wt, "sync")
self.assertEqual(f.git(wt, "rev-parse", "HEAD").stdout, candidate)
self.assertEqual(f.git(wt, "status", "--porcelain").stdout, "")
f.git(f.repo, "merge", "--no-ff", branch, "-m", "Merge fixture candidate")
f.git(f.repo, "push", "origin", "main")
for waiting in branches[position + 1:]:
self.assertEqual(f.git(worktrees[waiting], "rev-parse", "HEAD").stdout,
waiting_heads[waiting])
```
- [ ] 注入冲突、已知失败、紧急插队、目标外部推进、依赖未满足和未知合入结果,核对允许继续的健康对照;不同目标互不阻塞,组件组合不回退。
本地自动用例证明 Git/脚本行为;Issue 状态、失联交接及平台结果未知的处置由受控操作清单和实际对账记录验证,不因本地测试通过而宣称人工流程已自动互斥。
- [ ] 执行 `PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -p 'test_merge_queue_trial.py' -v` 和 `make test-governance`;回归实际 stdout/对象,不制造 GATE 标签。
- [ ] U5 条件满足且用户批准试行后,由协调者选择三个已经获实施/合入授权且就绪的真实任务;不足三个时保留待试行,不为凑数生成生产 PR,也不干预未纳入的任务。
- [ ] 记录每个尝试的实际最终同步次数、全部 CI 尝试/运行耗时、因目标移动废弃的运行、等待时长、恢复次数及真实结果。区分开发 CI、最终 CI 和 main 合入后 CI,不能只统计省下的一类。
- [ ] 正常顺序交付的验收目标是没有因其他正常排队任务的合入而废弃最终 CI;整改、插队等另计。无可比历史数据时只报告本次观察,不给节省百分比。
- [ ] 人工评审试行结果后决定继续/调整/回退。回退先停止领取、对账活动合入,再恢复旧流程;保留全部记录,不删除未知结果历史。
## 4. 验证、交付与停止条件
| 对象 | 最小验证 | 结果权威 |
|---|---|---|
| U1 | 有卡片的重复同步、新目标、真实最终 SHA、父子仓/网络/冲突保护 | 本地 SELF;正式交付补对应 GATE/REPLAY |
| U2 | 严格/局部对照、启动/恢复用途、历史收据、分支守卫负例 | 同上 |
| U3 | 原始仓外捕获、固定身份、原样导入、无重复写入 | 同上;不把流程约定标工具冻结 |
| U4 | 权威条文、采纳、模板、全部写者/协调者安排及 make test-governance | 规范批准与命令证据分别记录 |
| U5 | 实际缺检查/失败/陈旧/无权拒绝及合法路径 | 固定对象的 GATE/REPLAY,配置观察不替代 |
| U6 | 临时真实 Git 故障/健康对照+真实三任务与全部 CI 成本 | 临时测试 SELF,实际平台运行 GATE,人工验收另记 |
每个源码单元只提交其拥有文件。所有完成声明保留 precheck、task-sync 与直接相关检查的工具收据;
新对象需重新判断结论,固定后收据位于源码之外。验收、Review、合入分别遵循当时仍有效的门禁,不抢先使用未启用的新语义。
Docs、Guidelines、Dev 各仓 PR 和实际合入 SHA 分别核验;文档计划合入不授权执行所有者操作或启动业务试行。
停止条件:需求/契约或优先顺序变化,原 R0 不再适用,现场归属不明,当前平台/CI 身份无法核验,
用户批准缺失,或实际合入结果未知。只暂停受影响范围;符合授权的其他局部工作继续。
## 5. 自审与完成定义
| 规格要求 | 计划覆盖 |
|---|---|
| 调度对象、记录和共同基线 | U2/U4/U6 |
| 最终同步至核验串行窗口 | U1/U4/U6 |
| 源码外证据及真实候选 | U1/U3/U5 |
| CI 分配、去重与结果适用性 | U4/U5/U6;首版明确现有 workflow 不分流 |
| 依赖、插队、失败与恢复 | U4/U6;自动接管明确不在首版 |
| 采纳、能力登记与回退 | U4/U5/U6 |
计划通过评审后,U1–U3 可以开始隔离实施;U4–U6 依前置条件推进。
源码已实现、规范已采纳、平台已核验、模式已切换、三任务试行通过分别记录,不用一个“完成”代替。
计划编制时源码与平台试验均 NOT_RUN;编制检查仅覆盖计划来源、路径、链接、状态和需求覆盖。
实施续办:U1–U3 在 Dev 任务分支实现并保留实际验证收据;U4 的规则/模板和待启用 Issue #518 已准备;
U5 仅完成只读观察、配置与恢复材料;U6 临时真实 Git 场景已运行,真实 CI/业务试行仍待 U5 和相应批准。
当前源码/自检不从历史计划推断,统一回链
Dev `.task/feature-merge-queue-policy-draft.md` 的完整对象与原始输出。
建议采用原生逐项实施:三个源码单元紧密依赖同一套任务/evidence 接口,由一个写者修改更易保持兼容。
实施产物和计划仍需既有人工阶段评审;最终代码 Review 按仓库职责安排独立审阅,不由作者自签。
@@ -0,0 +1,247 @@
---
title: RDM 设置归属、成员、文档职责与权限矩阵完善增量方案
date: 2026-10-13
type: feature
execution: code
artifact_contract: rdm-increment-plan/v1
product_contract_source: legacy-requirements
---
# RDM 设置归属、成员、文档职责与权限矩阵完善增量方案 r1
负责人:weichen;编制:ZCode;核对日期:2026-10-13(北京时间)。
上游方案:[2026-10-12 RDM 功能、实现与计划矩阵及整改方案](2026-10-12-rdm-function-implementation-plan.md)(下称"总案"),本增量承接其本稿 U3、U4、U6,涉及职责一致性的部分衔接 U5。
评审状态:2026-10-13 用户评审通过(同意方案及技术评审意见),并授权按本方案实施(P1–P8 两批推进;正式验收与清理回收节点保留人工确认)。技术评审对源码声明的逐项核查结论见文末「评审核查记录」。
## Goal Capsule
以现有 RDM 实施总案的一个完整增量,先厘清设置归属和服务端权限,再补齐搜索、选择、职责分配与权限矩阵交互,保证界面显示、保存结果和实际执行一致。终点:创建者、普通成员、职责人员在真实账号浏览器流程中完成成员添加、职责分配、权限查看与设置保存,且服务端边界(受管设置、成员校验、原子职责变更、权限范围)全部经真实请求验证。
非目标:不扩展飞书集成、组织架构、多角色叠加或全量文档生成工程。
## 一、当前实现与需要补齐的内容
| 方面 | 当前源码情况 | 本次需要完成 |
|---|---|---|
| 设置归属 | 项目设置展示完整 schema;用户、项目设置都能覆盖模型等配置 | 设置作用域、管理员系统设置入口、写入与最终生效值双重约束 |
| 成员管理 | 手填账号;已有分页账号目录,但只有账号和有效态 | 账号/姓名搜索、提示选择、下拉浏览、专业角色过滤、明确的项目身份修改 |
| 文档职责 | 手填文档 ID 和人员账号;主要读取提交快照 | 文档搜索/列表/树选择、当前职责回填、项目成员选择、提交校验 |
| 权限查看 | 已有单成员权限解释表 | 单成员详情与多人矩阵、中文标签、项目动作范围、上限内配置 |
| 一致性 | 存在职责目标未校验成员、职责更新与审签失效分步执行等缺口 | 服务端统一校验、原子变更、版本冲突、撤权及历史保全 |
对应实现锚点:Frontend `src/components/ProjectSettingsModal.tsx`、`src/components/adminRdmSections.tsx`;Backend `internal/settings/settings.go`(覆盖链 `defaults → system → user → project`);RDM `plugins/rdm/plugin.go`、`internal/perms/perms.go`、`internal/rdmapp/docsubmission.go`。
## 二、设置归属与界面结构
沿用现有设置入口和 `SettingsShell`,项目设置收敛为四个页面:
| 页面 | 内容 |
|---|---|
| 项目设置 | 真正属于本项目的共享配置与协作规则 |
| 项目成员 | 成员搜索、添加、项目身份调整、移除 |
| 文档职责 | 文档查找、职责查看与分配、相关审签状态 |
| 项目权限 | 单成员权限详情、成员权限矩阵、允许范围内的配置 |
系统管理中补齐“模型与服务配置”,承接主模型、轻量模型、Embedding、Rerank、模型密钥与 Tavily 等系统配置;Agent 工具限制、系统插件、全局专业角色和权限上限也归系统管理。个人设置只保留个人偏好。
实施时需要处理三个层面:
- **展示范围**:设置描述携带允许作用域、管理资格、生效时机;项目页面只消费项目项。
- **写入范围**:用户/项目 API 拒绝写入系统受管项,包括嵌套字段和点路径形式,插件设置也遵守同一规则。
- **实际生效**:旧用户/项目覆盖值不能继续影响系统模型;个人画像的模型路由及个人模型密钥也必须纳入受管校验,堵住其他覆盖入口。
另外,当前“项目设置”实际上按“用户+项目”保存(Backend `Effective(owner, projectID)`,project scope 物理存储在各 owner 名下)。需要区分:
- **共享项目业务配置**:以项目为权威,同一项目不同成员读取一致。
- **个人在该项目中的偏好**:继续属于个人。
跨会话读取必须保留本人会话的隐私边界,不能因项目配置共享而开放其他成员的私聊、上传原件或个人草稿。
## 三、成员管理交互
采用**一个可搜索的人员选择器**,同时支持输入、提示选择和下拉浏览,不为每种途径增加独立页面。
添加流程:打开人员选择器 → 输入账号或姓名,或浏览候选 → 可按专业角色过滤 → 选择人员 → 设置项目身份 → 添加。
具体行为:
- 输入账号支持精确匹配;姓名、账号支持模糊检索。
- 未输入时显示分页候选;选择器内提供“全部专业角色/系统工程师/软件工程师……”筛选。
- 候选显示“姓名、账号、专业角色”;同名人员通过账号区分,姓名为空时使用账号。
- 已加入人员标记“已加入”,避免重复添加造成隐式身份变更。
- 最终提交稳定账号标识,不能直接提交搜索文字。
- 成员表分别展示“专业角色”和“项目身份”,不混用两者。
项目身份使用“项目负责人/项目成员”等中文名称。成员行提供明确的“调整项目身份”和“移除”操作;继续保护最后一位负责人。
服务端复用已有 `rdm.account.list`,补齐受限的姓名搜索、精确账号校验和专业角色摘要。**不能直接把管理员用户列表或包含全部账号绑定的角色管理接口开放给项目负责人。**
角色筛选只帮助找到人员;项目负责人不能借此修改账号的全局专业角色。账号有效状态必须来自基座实际能力,不能把当前简单的 `valid=true` 当作完整的账号停用机制。
## 四、文档查找与职责分配
> 2026-10-15:本节的职责页交互(文档清单加选中详情、章节级入口、整文审签)已被
> [文档职责矩阵整改 r2](2026-10-15-rdm-duty-matrix-rework.md) 取代。成员校验、版本冲突、
> 在途审签确认和历史保全仍然有效。下文保留作被取代前的记录。
文档职责页面采用“**文档清单+选中文档的职责详情**”:
- 上方提供统一搜索框,支持文档 ID 精确检索、标题精确/模糊匹配。
- 支持文档列表与树形浏览;阶段、文档类型、未分配/已分配、审签状态可用于筛选。
- 树形视图忠实呈现当前文档结构,只有文档节点可以作为职责分配对象,章节不能误作 `docId`。
- 搜索、列表和树选择共用同一目录与选中状态。
- 结果显示名称、阶段/类型、职责概况和状态;ID 保留为辅助定位信息。
已有文档树查询属于审计面,不能降低它的授权规则来供选择器使用。应补齐专用的职责管理元数据读面:
- 有职责分配权的管理者可以读取必要的管理元数据。
- 普通成员只获得其有权查看的文档范围。
- 标题、数量、筛选结果和树节点均在服务端过滤,避免通过搜索泄露不可见资源。
选中文档后,立即读取并回填**当前职责**,包括尚未提交过审签的文档。当前职责与“某轮提交冻结的职责名单”分别展示,不能混为一份数据。
人员选择规则:
| 职责 | 选择方式 | 约束 |
|---|---|---|
| 编制人 | 搜索、下拉、专业角色过滤 | 单选 |
| 审核人 | 搜索、下拉、专业角色过滤 | 多选,至少一人 |
| 批准人 | 搜索、下拉、专业角色过滤 | 单选 |
**所有候选只能来自当前项目成员。**保存时服务端再次校验账号、项目成员关系、对象归属、操作资格和职责版本;文档级(`rdm.review.assign.doc`)、章节级(`rdm.review.assign`)及旧命令入口均遵守同一规则。
保留编制、审核、批准互异的规则。专业角色筛选不自动授予文档职责;管理权也不自动获得代编、代审或代批资格。
职责变更需要补齐以下行为:
- 在途审签受影响时,先显示受影响轮次与“需要重新提交”的提示。
- 明确确认后,职责更新、在途审签失效和事件记录原子完成。
- 保留旧冻结名单、审核记录和已批准历史,不把旧票带入新轮次。
- 无变化保存保持幂等;并发修改返回明确冲突。
- 移除仍承担当前职责的成员前,展示受影响文档并引导处理,防止留下无人可执行的职责。
总案要求的批量分配放在同一文档清单中:勾选文档、预览统一职责方案、确认提交。首版采用有界批次,任一文档校验失败则整批不写入,并列出原因。
## 五、单成员权限与多人矩阵
“项目权限”提供两个视图,共享同一服务端权限解释:
| 视图 | 默认行为 | 用途 |
|---|---|---|
| 按成员查看 | 普通成员查看自己;管理者可搜索其他成员 | 查看具体权限、配置来源和拒绝原因 |
| 权限矩阵 | 管理者查看成员×项目动作 | 比较成员权限,发现缺失或差异 |
矩阵支持成员搜索、专业角色/项目身份过滤、分页及权限分组。点击单元格可展开解释,显示角色默认、管理员上限、项目覆盖及结果。
项目覆盖使用三态:沿用角色默认/项目内允许/项目内禁止。管理员上限禁止的动作不能通过项目覆盖授予;“恢复默认”需要实际撤销覆盖,不能用一个布尔值模拟。
权限目录必须明确动作所属范围:
| 内部标识 | 显示名称 | 所属范围 |
|---|---|---|
| `project.create` | 创建项目 | 系统角色权限,项目页面不出现 |
| `member.manage` | 管理项目成员 | 项目 |
| `duty.assign` | 分配文档职责 | 项目 |
| `stage.advance` | 推进项目阶段 | 项目 |
| `doc.read` | 读取文档 | 项目动作,具体文档仍须授权 |
| `doc.write` | 编制与编辑文档 | 项目动作,仍受职责和状态限制 |
| `knowledge.publish` | 发布项目知识 | 项目 |
这个范围划分同时约束矩阵读面和覆盖写面:**不能只是隐藏 `project.create`,服务端也必须拒绝在项目中配置它。**
权限名称、项目身份、来源、状态及拒绝原因统一使用人类可读文案。内部标识只保留在按需展开的技术详情中。
同时核对每项权限与真实操作门禁。例如当前项目归档还有创建者/域管理员条件,矩阵解释必须反映真实条件。矩阵中的“允许编制文档”也不能意味着能修改项目内所有文档。
普通成员自查权限的条件收敛为“当前有效项目成员”,避免文档读取权限被收回后,连自身权限与原因也无法查看。
## 六、技术划分与实施工作包
基座负责身份、基本资料、受管设置机制与通用契约;RDM 负责项目成员、专业角色、权限策略及文档职责;Frontend 负责业务交互;UI 仓提供通用选择器原语。
| 工作包 | 内容与主要范围 | 依赖 | 完成条件 |
|---|---|---|---|
| P1 契约与需求固定 | 设置作用域、项目动作目录、人员/文档候选 DTO、能力与版本语义;更新关联方案 | 无 | 本次五项要求都有稳定验收条件,四类身份/角色/职责概念明确 |
| P2 系统设置闭环 | Core 设置描述、Backend 设置 API/存储/生效链/模型及密钥解析;系统管理入口 | P1;**基座发版与 RDM/Dev 升 pins**(见评审补充 1) | 系统受管项只能由有权管理员配置,旧个人/项目值不能覆盖 |
| P3 人员与成员接口 | 扩展公开账号搜索;RDM 专业角色摘要、成员查询、项目身份调整与提交校验 | P1;姓名来源核实(见评审补充 3) | 账号/姓名/角色过滤同源,添加与身份调整明确分离 |
| P4 文档与职责接口 | 专用文档目录、当前职责读取、统一职责服务、版本校验、变更失效及成员移除联动 | P1、P3 | 跨项目/非成员指派被拒,职责与审签变更全成或全败 |
| P5 通用选择器 | UI 仓搜索选择、单/多选、键盘操作、分页与状态;Frontend 人员适配。文档职责页的文档选择器改由 r2 三视图承接 | P1,接线依赖 P3、P4 | 人员选择共享交互,无自由文本误提交。职责页交互见 r2 |
| P6 权限解释与矩阵 | RDM 项目动作目录、单人/批量解释、覆盖三态、来源与拒绝原因 | P1、P3 | 矩阵与执行规则一致,系统动作无法写入项目覆盖 |
| P7 项目设置集成 | 重构现有项目页,连接设置、成员与权限页。文档职责页改为 r2 的三视图,不再包含整文审签 | P2—P6 | 创建者、普通成员、职责人员均有对应可用流程。职责页验收以 r2 为准 |
| P8 迁移与组合验收 | 旧配置处置、真实数据库与浏览器验收、精确组件组合验证、证据回填 | P2—P7 | 需求到证据闭合,无越权、隐私泄露或数据丢失 |
前端主要改动落在现有 `ProjectSettingsModal`、`adminRdmSections`、`rdmManagement`、`api` 和 `store`;按业务拆分成员、职责及权限组件,避免继续扩大一个管理组件文件。
目前 Dev 与 RDM 固定的 Backend 版本存在能力差异。实施时必须按公开契约推进相关版本,再完成组合验证,不能因为独立 RDM 仓已有某个接口就假定 Dev 组合可直接使用。
## 七、界面与异步状态要求
按根目录 `DESIGN.md` 实施,复用现有令牌、动效、设置外壳和折叠原语。
- 一种对象只有一个主要选择路径,搜索和浏览在同一选择器完成。
- 姓名、文档名为主要信息,账号和 ID 为辅助信息。
- 下拉支持键盘移动、确认、关闭;审核人多选使用清晰标签。
- 加载、空结果、权限不足、接口未装配、查询失败分别呈现。
- 切项目、切文档、改筛选时清除不适用的选中项和结果;迟到响应不能覆盖当前对象。
- 异步状态只有一个所有者,按请求代次/事件顺序丢弃过期结果。
- 保存后读取服务端结果;网络断开且结果未知时先核对状态,避免盲目重放。
- 未保存改动提供轻量离开提示;需重启的设置明确显示待生效,不能统一宣称即时生效。
- 窄屏按成员查看权限,矩阵可横向浏览,不压缩成不可读的小格子。
## 八、迁移、验证与交付安排
旧配置先做脱敏盘点,列出配置路径、来源和冲突状态。不能任取某个用户/项目的模型配置提升为全系统配置。先确定并验证系统配置,再启用受管策略;旧值保留受保护的恢复依据,退出生效链。
旧项目内 `project.create` 覆盖退出项目策略,保留历史依据。历史职责、审核与批准记录保留;无效的当前职责列入修复清单,不自动替换人员。
正式验收至少覆盖:
| 验收场景 | 预期结果 |
|---|---|
| 项目与个人设置写入系统模型项,包括手造请求 | 拒绝;旧覆盖也不影响运行结果 |
| 账号、姓名、下拉、专业角色过滤查找成员 | 能找到并选择稳定账号;同名不会误选 |
| 重复添加已有负责人、并发修改最后负责人 | 不发生隐式降级,不破坏负责人约束 |
| 文档 ID、标题、列表、树查找 | 指向同一文档;章节及其他项目对象不能误提交 |
| 搜索后人员被移出项目,再保存职责 | 服务端拒绝 |
| 职责变更中途失败 | 职责、审签状态与事件完整回滚 |
| 单成员详情与多人矩阵对照实际操作 | 结果与原因一致;具体资源限制清晰 |
| 项目覆盖授予超上限动作或 `project.create` | 拒绝;恢复默认真正生效 |
| 快速切项目/文档、断网、迟到响应 | 不显示旧对象数据,不误报成功 |
| 同项目多成员使用、刷新及重启 | 共享配置一致,个人会话与原件仍私有 |
验证分为领域与契约测试、真实 SQLite/PostgreSQL 集成、真实身份浏览器流程,以及 Dev 精确组合的 `make test`、`make build`。浏览器需要覆盖非管理员项目负责人、普通成员、互异的编制/审核/批准人员及两个项目;不能用全管理员账号代替权限验收。
分两批形成可审查实现:先完成 P1—P4、P6 的服务端边界与契约,再完成 P5、P7 和 P8 的交互及组合验收。界面设计可在第一批同时评审。
## 评审补充(2026-10-13 技术评审并入,随方案一并批准)
1. **P2 显式依赖基座发版。** 受管设置机制是基座(Backend/Core)公开契约扩展,按总案交付顺序走“扩展申请评审→基座实现→基座发版→RDM/Dev 升 pins→组合验证”。P2 完成条件在原基础上追加:基座版本已发、pins 已升、Dev 组合 `make test` 通过。
2. **项目共享配置的存储迁移规则。** 当前 project scope 物理存储在各 owner 名下;改为“以项目为权威”需要:新项目作用域存储、存量多 owner 副本的合并策略(默认规则:同键取最近写入时间,冲突清单列出不自动合并的键并交项目负责人裁定)、旧键退出生效链并保留只读恢复依据。P8 交付物含迁移清单与执行记录。
3. **姓名来源与账号停用能力须先过 facts。** 基座账号目录当前明确“不含姓名/联系方式”。P3 的姓名搜索依赖基座账号模型是否存有姓名/显示名字段;P1 契约先定姓名来源(基座扩契约,或 RDM 专业角色档案补姓名)。账号停用机制现状同样按 `policy/facts.md` 登记验证,未证实前不把 `valid=true` 当作停用语义。
## 顺序裁定(2026-10-13)
本增量按自身 P1→P8 顺序推进;P2 的基座契约扩展按总案 369 行发版顺序执行,与总案 U1/U9 残余项的交织在扩展申请评审时统一排队,不因本增量跳过 U1(正式产物)与 U9(公开授权契约)的既有优先级。
## 评审核查记录(2026-10-13,源码 3fb8210 / RDM 255f9cb)
评审对方案“当前源码情况”逐项核查,全部属实:
| 声明 | 证据 |
|---|---|
| 项目设置按“用户+项目”保存 | Backend `settings.go` `Effective(owner, projectID)`,project scope 以 owner 为键 |
| user/project 覆盖可改模型设置,无受管拦截 | 同上覆盖链,无“系统受管”概念 |
| 成员手填账号 | `adminRdmSections.tsx` RdmMembersSection |
| 账号目录仅 owner+有效态 | RDM `rdm.account.list` 描述“owner+有效态;不含姓名/联系方式” |
| 职责手填 docId 与账号 | RdmDutiesSection placeholder |
| 已有单成员权限解释表 | `rdm.perm.check`(动作/生效/来源/原因),前端默认自省 |
| 权限标识与所属范围 | RDM `internal/perms/perms.go:21-31`,`project.create` 注释即“全局动作” |
| 职责目标未校验成员 | `rdmReviewAssign` handler 注释“数据,非身份”——按 G1-5 旧裁定绕过成员校验;**本方案 P4 推翻该裁定,属规则变更,在 P1 契约中记录** |
| 职责更新与审签失效分步 | 文档级 assign 先写职责再调 `InvalidateActiveDocSubmission`,两步顺序非原子;**章节级 assign 完全未接失效** |
## 主记录与推进
- 主记录:本文件(唯一正文);任务卡 `.task/feature-rdm-increment-settings-duties.md` 承载需求表、证据与阶段结论。
- 来源:`.tmp/Discussion-Meetings/2026-10-08_12-24/.tmp/user-supplement.txt`(原始用户补充)、2026-10-13 会话评审。
- 下一步:P1 已随本稿固定;按两批顺序进入 P2(基座受管设置契约扩展申请)与 P3/P4/P6 服务端实现。
@@ -0,0 +1,84 @@
# 系统项目、成员工作入口与私域协作闭环 r1.1
状态:用户 2026-10-13 已批准方向并授权阶段 1–9 连续推进;实现与隔离验证进行中。发布版本、部署、8788 数据修复及工作区清理不在本次授权内。
本增量补齐总案 [RDM 最终目标核对与完整交付方案 r1](2026-10-11-rdm-final-target-completion.md) 的 U2,以及 U3/U5 与项目成员协作直接相关的边界。需求来源为 2026-10-13 用户复现和 `.tmp` 会议补充中“同名项目唯一、加入后可见且能新建对话、会话私有、每项目共享两树一网”。这不是模板全量迁移或三权流程重设计。
## 已定位的问题
8788 的成员添加记录已保存,但用的是宿主项目 ID;该 ID 没有领域注册或宿主绑定。列表和对话创建的共享适配器因此拒绝它。新建项目走宿主 owner 表,而成员管理、两树一网走领域表,缺少统一生命周期。会话列表还只检查宿主 owner,领域的名称 UNIQUE 也没有覆盖宿主创建入口。
r1.1 增量:合并现行主干的成员 Picker、职责目录和权限矩阵,并闭合其独立重放发现的首次提交、渲染确认、迟到响应、职责幂等和持久版本问题;范围仍为本次成员与私域协作。
运行制品仅有短来源标记,不能把当前源码视为其已证明的组件组合。只读现场证据、对象 SHA 和完整脱敏输出保存在 Dev 本任务卡,不在本文复制命令输出或线上数据。
## 职责与公开契约
RDM 保持项目、成员、职责与领域数据权威。Backend 管认证、宿主技术投影、私人会话/工件和通用资源执行边界。Frontend 只消费服务端身份与状态。
```mermaid
flowchart LR
U[认证用户] --> P[统一项目应用服务]
P --> D[RDM 项目与成员]
P --> H[宿主一对一投影]
H --> C[按用户归属的个人会话和原件]
D --> W[按项目分片的两树一网]
W --> K[成功发布的知识切片]
K --> R[当前项目的授权检索与模型上下文]
```
基座扩展申请的四要素:
| 要素 | 结论 |
|---|---|
| 场景 | 统一产品项目创建/改名/归档,验证映射两端,并允许项目成员创建个人会话 |
| 公开能力 | 可选 `extension.ProjectHost`、`ProjectLifecycle`、`ProjectLifecycleRegistry`;复用 `/api/projects` 与其会话路径;资源查询追加可选 `Source` |
| 现有能力不足 | 只读 V1/V2 不承担生命周期、跨库初始化和动作授权;原 Host 没有项目技术投影与管理验证接口;仅项目布尔或已知切片 ID 不能证明索引行仍是发布来源 |
| 兼容 | 保留必需 Host/Registry 接口;新能力经可选接口注册。未注册生命周期保留通用基座行为。RDM 产品缺该能力拒绝注册,防止悄然回到宿主个人项目路径 |
`ProjectHost` 由执行端按认证主体构造;投影修改和管理查找保持 owner 限制,共享 metadata 经过授权和脱敏。`ProjectLifecycle` 的 List/Create/Rename/Archive/Work 是完整注册的一组回调,公共项目入口委托给它。客户端传入的 projectId 或 `rdm.projectId` 均是定位符。
## 项目身份、名称和恢复
- 领域项目、名称保留和创建者负责人同库事务提交。跨库投影使用确定的宿主 ID 和持久 `provisioning/failed/ready` 映射;失败重试保持身份,不持有领域事务跨宿主调用。
- 本增量名称为去首尾空白后的精确名称;数据库唯一保护覆盖不同账号和并发。改名、归档后保留旧名归属。Unicode/大小写归一没有在本增量自动引入。
- 所有产品创建、改名、归档路径使用应用服务;归档保存会话、原件和数据,不能继续新工作。管理重试可定位未完成映射,但仍须 owner/动作检查。
- 新绑定验证真实宿主的存在和当前主体管理资格;既有绑定的 metadata/工作还验证物理宿主 owner 与映射创建者相符,不能只信映射存在。
- 现有孤立宿主项目通过 `rdm.project.adopt` 先预览、再显式 apply;保留宿主 ID 和 owner,将成员关系移到领域根。不能凭名称猜测已有领域身份,不把未归属历史默认搬入新根。
## 共享与私域
| 数据 | 默认边界 |
|---|---|
| 个人会话/消息/原件/附件 | owner 私有;成员加入不使其对其他成员可读 |
| 个人 pending/rejected 草稿 | 仅提案人;管理角色及其他职责不自动取得正文 |
| 受控正文、差异与导出 | 当前项目成员身份、阶段/动作及有效章节或文档职责;审计许可不代替正文许可 |
| 已采纳提案的本人不可变历史 | 本人自己的原始提案可保留;其他人读取受控内容走职责 |
| 树结构、元信息、快照哈希 | 项目协作所需的结构视图;不能用元信息入口夹带正文预览 |
| 历史正文预览 | 当前有效权限,不从历史重放恢复已撤销的职责 |
| 原件台账、待处理数量 | 当前 actor 在目标项目的条目;管理角色不自动得全员原件视图 |
| 项目发布知识 | 成员、明确领域根、成功发布台账、当前撤销代际与存活切片共同授权 |
发布切片保留其 ID、owner、原件锚点,索引 `ProjectID` 为领域 ID,来源为 `plugin:rdm:published`。跨 owner 查询还检查实际存储行的 `Source`;手工/私人来源不能借已知切片 ID 绕行。撤销代际阻止已排队或在途任务重新授予共享。替换按 owner、精确项目(含空 ID)、ref、插件命名空间隔离。
会话使用宿主 ID;HTTP、Host 和模型上下文通过服务端 provider 的可信 metadata 解析领域检索范围。每个实际知识对象再经过 V2,不能先按错误 ID 查空,也不能把 private 候选截断置于授权之前而隐藏合法结果。
## 界面与执行
沿用现有侧栏与项目设置,不新增管理屏。服务端 metadata 提供平面的 `rdm.projectId` / `rdm.state`,领域命令用 canonical ID,通用会话接口保留宿主 ID。未就绪项目不能回退创建默认项目;归档/关闭项目仍能读成员、权限和审签状态,不能新工作或修改。
账号切换使所有待返回的列表、工件、卡片和工作续接失效。执行在确认后、排队恢复以及写入前重验当前权限,撤权后的 HITL 回复不能产生工件或恢复执行。
项目 SSE 的历史重放和实时发送也必须按对象过滤。旧上传卡没有可信共享声明,不能因加入成员而暴露文件名、解析器或预览。权限从实际卡片/运行归属取值;明确共享由内部发布入口写入与 channel、seq、type 和 payload hash 绑定的声明,客户端 payload 不授予共享。未知或损坏证明拒绝,跳过私域事件仍推进扫描游标,保留未注册基座兼容。此为内部事件数据约束,不增加下游必需接口。
职责保存先校验对象、三权、成员及版本;无变化不使在途轮次失效,仅实际变更生效前执行既有失效规则。职责版本随事件持久化,旧载荷按实际角色变化重建;写入失败不修改内存职责。
## 验证与交付
追溯:R1 名称→并发/碰撞/旧名保留;R2 身份→真实创建/失败重试/物理 owner/绑定;R3 成员→真实登录、同 ID 项目、个人对话;R4 项目分片→两项目隔离;R5 私域→所有查询/预览/台账/模型上下文及撤权;R6 旧数据→显式预览/幂等修复/保留;R7 真实组合→浏览器、真实模型任务对照、独立 Review 和当前 HEAD CI。
测试原始输出由 evidence 工具写入任务卡,来源分开。单测、桩适配器、源码存在均不作为用户流程已完成的证明。当前完整运行/CI结果在任务卡维护,不在本文预写 PASS。
RDM README/AGENTS 要求合入前回到基座 tag pin;开发期采用隔离 modfile组合验证。发布新 tag 属用户亲手执行的高后果操作,必须先形成已评审且 CI 通过的具体基座候选。tag、合入、部署、运行库修复和清理分别核验,不能合并成一个“完成”。
下一步:完成本增量的组合验收与 tag 消费闭环;随后建议由用户授权在 8788 部署精确组合,并预览/修复已确认的孤立项目。未知历史归属、名称碰撞或身份不一致保留现场交人工裁定。
@@ -0,0 +1,313 @@
---
title: DHF 模板接入 RDM 文档生成管线 - Plan
type: feat
date: 2026-10-14
artifact_contract: ce-unified-plan/v1
product_contract_source: legacy-requirements
origin: 2026-10-11-rdm-template-dialog-generation.md
execution: code
---
# DHF 模板接入 RDM 文档生成管线 - Plan
## 批准与实施进展(2026-10-14 后续附注)
本节记录批准后的状态;下方 r0.1 主文保留批准前评审快照,原对象 SHA256 为 `f99e1424a9bb86f68ad6de91657102a36004c61fb0f36c8427e913d9e0cf9643`。主文中的“草案”“待批准”“本轮 NOT_RUN”指当时状态,不代表今日仍未获实施授权。
- owner 已批准 r0.1 的需求、方案和实施计划并授权 U1–U6 按阶段推进,另批准 E1-R1 隔离追加试验。U1 当前增量已走完阶段 6–10:阶段 6/7 获 owner 人工结论,独立 Review 闭合整改,最终 HEAD 的 GATE 与独立重放核验记录在案,三份交付 PR 均已合入。
- RDM 已封装 44 个逻辑原件,owner 分别接受项目建议书、F01、F02、DI 四份确切四哈希包(内容与版式接受,正式发布授权仍未给出);全部 44 项仍 `needs-review`,正式发布数 0。E1/E1-R1 使 14 DOC 均有转换候选,但逐项 Word 保真 **NOT_PASSED**;其余 40 项待包级裁定。F01/F02 的正式类型/存量字典升级及 U2–U6 真实产品流程仍未完成。
- U1 当前增量的终态以归档任务卡为准:Dev 仓 `.task/archive/feature-dhf-template-pipeline-plan.md`(随 Dev #542 归档合入)。合入记录:[Documents #102](https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/102) merge `9062445db808`、[RDM #365](https://gitea.naitangbaobao.cn/weichen/Agent-System-RDM/pulls/365) merge `57d2214feb0a`、[Dev #540](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/540) merge `11aa76a3bc1c`,三个 main 树各自与受测 head 一致。U1 剩余 40 项包级裁定、14 DOC 保真对照、类型合同与 U2–U6 按本方案顺序继续;此前 WIP/待整改表述与旧 GATE 不再作为放行依据。
- **2026-10-14 收口(本轮)**:批量 1–5 包级裁定获 owner「全部按推荐」批复并落档(RDM `docs/records/dhf/package-review-decision-2026-10-14.md`);其余 DOC 11 份(#377)与 DOCX 17 份(#381)四哈希候选包合入,44/44 具备候选包;owner 同轮授权 catalog 翻转,#383 将 44 项全部置 `published`+confirmed+绑定四哈希+issues 全清。U5 交付命令接线与实例播种随 #385 落地,真实产品二进制全链路试点 PASS;U6 逐项验收矩阵随 #387 完成——44/44 入账=41 PASS+2 EXPECTED_BLOCKED(F01/F02 字典门禁,owner 裁定暂缓)+1 EXPECTED_LIMITED(无槽位确认报告,空填充 fail-closed 拒绝实测),0 FAIL;过程中修复 F05/F06 封面双层嵌套缺陷并补登记 11 个批量裁定 docType。卡片 #379/#382/#384/#386/#388/#390/#392 全部归档,RDM main `c5ea0f5`。交接文档 [u6-replay-handoff.md](https://gitea.naitangbaobao.cn/weichen/Agent-System-RDM/src/branch/main/docs/records/dhf/u6-replay-handoff.md) 固化 owner 侧三项动作:①部署发布包+三用户真实试点(回传导出 Word SHA256 与审签元数据);②独立审阅者以一键驱动 `scripts/dhf-u6-replay.sh` 完成 R1–R4 重放并签署(作者 SELF 试运行全绿,审阅者重跑方为 REPLAY);③提供带附件/页眉页脚的真实原件路径以启动 U4。独立 REPLAY 与真实环境试点完成前,本方案 DoD 的「试点交付/全量交付」两项维持 owner 阻塞态。
修订 r0.1;需求负责人 weichen;方案编制 Codex;各仓实施负责人待立项指定。
本文件是 DHF 接入专项的评审草案,授权终点为源码/资产调查、方案和计划文档、记忆归档。
需求取舍、设计、实施和测试计划仍须按 Dev `policy/delivery.md` 逐阶段评审;本文不授予业务实施、转换试验、迁移、发布或部署权限。
文件路径以目标仓为准:`Dev:` 为 Agent-System-Dev,`RDM:` 为 Agent-System-RDM,`Frontend:` 为 Agent-System-Frontend;无前缀为 Documents 仓。
## Goal Capsule
用户能在 RDM 项目对话中,按提供的 DHF 标准模板编制文档,取得内容有依据、格式可核查、审签版本一致的 Word 文件。
采用现有 RDM 模板、两树一网、持久提案和三权流程,补齐 Word 资产解析、固定绑定和模板填充导出。
本批最终覆盖 Dev `.templates/DHF 文件模板/` 全部 44 份逻辑资产;试点成功只代表试点完成。
首选下一步是评审范围及解析试验 E1;E1 的 DOC 保真结果是全量接入的前置条件。
---
## Product Contract
### Summary
将 44 份 Word 原件转为可审核发布的模板包,使其内容结构、填写规则和原始版式共同约束文档生成。
先用真实 DHF 项目建议书完成一条用户闭环,再按文档族接入全部资产;设计输入规格书和验证确认报告同时作为结构与示例语义的压力样本。
登录恢复为已收官基线;本专项不把部署增强或账户恢复重新列作遗留实现项。
### Problem Frame
RDM 当前注册量不能代表标准模板可用量。
已有模板选择、章节实例化和导出器缺少共同的模板身份,新增 Word 文件后仍可能生成错误用途的正文,或者丢失原件的表格与排版。
模板中的示例测试结果和签署意见还可能被误当作本项目已经发生的事实。
### Current State
本轮源码/资产观察为 SELF,业务测试、DOC 转换、真实模型、浏览器验收、CI 和部署均为 NOT_RUN。
调查对象:Dev R0 `add097d06137c4912a4ed9279e98ca353e4e4cf1`;RDM `6fcb256205c2384abed35d3b6ab96ca7216e9297`;Documents 草案从本轮 SSH/API 同值的 main `7bd4e17827d4c7c88647bf3c9199c495b60cb107` 建立。
RDM 正式产品的 Frontend gitlink 与实际检出均为 `eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b`;该源码基线用于定位当前预览行为,不代表组合浏览器验收。
Dev 固定 Documents 的 `a7ff466…` 与本轮 Documents main 不同;本轮只保存规划,不推进 gitlink,未来集成须处理两条历史及规范差异。
源码/资产原始输出与完整 SHA 由 Dev 任务卡的 evidence 段记录;以下是静态分析,不是运行通过声明。
| 对象 | 当前事实 | 接入含义 |
|---|---|---|
| DHF 原件 | 44 份:30 DOCX、14 DOC,7 阶段;41 个不同 SHA256 | 同内容不同阶段仍保留独立逻辑用途 |
| RDM 目录 | 69 个 docType,73 项 registry:4 定制 Markdown+69 骨架 | 骨架含“内容要求待补”,不算 69 份标准正文已迁入 |
| Word 原件 | RDM 未跟踪 DOC/DOCX 原模板 | 需要可脱离 Dev 工作目录的正式资产包 |
| 现有解析 | DOCX 主要读 document.xml,DOC 不支持 | 不能用文本抽取代替完整内容和版式解析 |
| 模板选择 | Compose 按适用列表首项选 key;rd_proposal 首项为 weekly-report | 必须消除注册顺序决定正文用途 |
| 结构实例化 | 独立 structure YAML 建文档/章节,无公开的按模板实例化命令 | 模板发布、文档创建与生成入口需要接成一条路径 |
| 固定版本 | Doc/Section/Version 未存真实模板绑定;提交的 TemplateVersion 实为字典版本 | 当前快照无法证明 Word 模板身份不漂移 |
| 审签与提案 | 有事务采纳、幂等、持久提案及整文三权 | 扩展既有机制,不重写审批和项目权限 |
| DOCX 导出 | 新建最小 OOXML,不消费原件版式;未按指定整文审批轮次导出 | 需要原模板填充和批准快照再现 |
| 用户入口 | 自然语言写文档 intent 用错 docType 且仅查询模板;正式 Web 使用 Frontend pin | 真实对话、工具 schema 与正式 React 产品均需验证 |
资产阶段分布:商务 1、策划 3、设计输入 15、设计输出 9、设计验证 8、设计转换 3、设计确认 5。
四份输出/验证/转移/确认评审原件字节相同,但不能合并为一份逻辑模板。
候选适配为 32 份映射既有类型、12 份新增或细分用途待评审;不等同于批准新增 12 个类型。
### Requirements
资产与内容约束:
| ID | 要求 | 可判定验收条件 | 来源 |
|---|---|---|---|
| R1 | 44 份原件逐份登记来源、用途、版本和状态 | 每个路径有完整 hash 和处置;重复内容保留逻辑用途;未验证项不可标可用 | 本轮范围;TT-T01/T04 |
| R2 | 保留真实多级结构、表格、填写规则与关键版式 | 对照每份原件无关键静默丢失;DOC 的解析/转换差异有人工裁定 | TT-T01/T02;现有模板方案 R3/R11 |
| R3 | 示例、说明、占位符与固定文本分别处理 | 无真实证据时不预填验证成功、样本量或签署;模板内产品示例不进入项目事实 | 原件填写说明;原方案 R6 |
| R4 | 模板用途和项目适用性明确 | 选择显式正文模板;计划/报告、验证/确认用途不混用;不适用部分注明理由 | TT-T03;原方案 R1/R3 |
生成与受控交付:
| ID | 要求 | 可判定验收条件 | 来源 |
|---|---|---|---|
| R5 | 新实例及历史内容固定实际模板身份 | templateId/version 与原件、结构、渲染包的完整 hash 可复核;升级不改旧版本 | TT-T04;原方案 R3/R9 |
| R6 | 用户能从项目对话创建或更新模板文档 | 真实认证总线到实例化、生成、提案、采纳;歧义先澄清;总结请求不触发写入 | 原方案 R2/R7/R13 |
| R7 | 生成和下载遵守现有项目、资源和文档职责 | 仅指定编制人生成/采纳;检索与模型输入授权;恢复、撤权及下载再次核验 | 原方案 R4/R9/R11 |
| R8 | 模板、正文、依据和审签使用同一冻结对象 | 旧卡片/并发/模板退役均不能覆盖新内容;正式导出读取指定批准快照 | 原方案 R5/R7/R8/R9/R11 |
| R9 | 完成状态以实际 Word 与用户流程验收为准 | 每个发布模板至少一个正常样例及一个空缺/冲突样例;44 份全部有结果 | 原方案 R12;TT-V01–03 |
### Scope Boundaries
本专项承接在途 `feature/rdm-two-trees-latest-templates` 的 TT-T01–04,依赖其 TT-D01–04 的递归结构、结构提案和版本保护。
该任务已形成阶段 2 评估;本轮读取的记录仍待人工评审,不把其文字升级为实施批准。
两个任务只能有一处权威模板/内容块契约和一份 44 资产台账;实施立项前指定契约 owner,按共同 R0 分工,禁止各做一套树或升级机制。
原两树一网任务其余需求继续由其主记录维护,本专项的聚焦不削减那 28 项完整范围。
### Deferred to Follow-Up Work
未提供新标准原件的其余 37 个既有类型保留兼容和明确状态;不以本批 44 份宣称覆盖全部 69 类型。
历史报价 XLSX 不在本批 Word 接入范围;全局项目字典扩展、默认成员工作上下文、完整审计展示继续归原两树专项。
`-open-existing` 修复和 U2/U3 部署增强保持独立新需求。
旧项目批量改绑、运行库迁移和上线需独立方案与授权,本轮不启动。
### User Flow
用户在可信项目对话中提出“按 DHF 模板生成项目建议书”;系统确认目标文档、用途和已发布模板。
已有同类文档时展示更新目标;缺职责时等待负责人分配,由指定编制人接续。
模板不适用、资料不足或用途歧义时保留待处理状态,不能退回任意骨架继续生成。
生成任务使用已固定且有权使用的项目依据,返回逐块内容、来源、差异和缺项;编制人采纳后才形成内部版本。
审核和批准绑定整文快照;草稿与正式版可区分地预览/下载,正式 Word 从指定批准快照和固定模板包生成。
---
## Planning Contract
### Key Technical Decisions
KTD1. 将原件、结构合同、渲染包组成同一个不可变模板发布版本;登记阶段/用途、适用规则和来源谱系。
原件永久保存;DOC 转换产物是派生件,记录转换器版本/配置及产物 hash。
默认模板只能从人工确认的显式绑定取得;语义版本比较替代字符串最大值,骨架显示“待标准模板”,不得混成已发布 DHF。
共享模板/默认绑定治理沿用[原模板方案 KTD1](2026-10-11-rdm-template-dialog-generation.md#ktd1-template-contract-and-authority)的获批仓库发布边界;本专项不开放运行时模板管理权限。
KTD2. Word 在资产准备阶段规范化为 DOCX,运行时不新增 LibreOffice 服务依赖。
先复用在途 E1 的隔离试验,验证 DOC→DOCX 的可行性与损失;不得直接把 DOC 二进制当字符串或重命名扩展名。
建议方法受官方格式与转换接口支持,但本批保真尚未验证:[MS-DOC 格式](https://learn.microsoft.com/en-us/openspecs/office_file_formats/ms-doc/ccd7b486-7881-484c-a137-51170af7cc22)、[LibreOffice 转换参数](https://help.libreoffice.org/latest/en-US/text/shared/guide/start_parameters.html)、[格式过滤器](https://help.libreoffice.org/latest/en-US/text/shared/guide/convertfilters.html)。
E1 先检验用户需求、软件测试用例、采购技术说明三种 DOC 样本,再覆盖全部 14 份;失败项保留未验证,不能降低 R2。
本轮 PATH 未找到 LibreOffice/soffice;固定工具版本、隔离环境和试验授权仍是前置条件。
E1 使用独立转换器 profile、只读原件和隔离临时输出,禁用宏、外部内容加载和网络;转换进程不得访问用户凭证或运行库。
KTD3. 结构合同采用原两树专项的递归内容块,模板只定义其约束和 Word 槽位映射。
块具有稳定 ID、层级、顺序、填写语义、字段/重复行/合并关系、依据需求、适用性和附件引用;显示标题不作为身份。
解析综合样式继承、outlineLvl、自动编号、正文顺序和表格关系,人工确认其业务含义。
蓝字、斜体、黑字只是分类线索;预填的 IQ/OQ/PQ 成功、样本量 22 和“同意”意见必须按 R3 处理。
KTD4. 扩展现有领域对象、事件 payload 和 replay,固定模板绑定及每次生成的内容/依据基线。
增加 RDM 领域的按模板实例化与生成编排入口;既有 compose/propose/adopt 适配到同一约束,不建立第二个提案或审批库。
实例化事务创建文档、内容块和模板绑定;确认/采纳使用预期版本、opId 幂等和事务内复验。
生成任务保存输入清单与候选,失败可恢复;恢复重新验证权限及模板可用性,缺少依赖时返回明确待处理结果。
KTD5. DOCX 采用固定原模板包的槽位填充渲染,结构化内容是业务正文权威。
保留原件的封面、页眉页脚、样式、编号、图片和非填充部件,确定性填充已标记的段落/单元格/重复行。
发布检查识别会自动读取外部内容的关系;派生渲染包禁止保留外链图片加载,普通引用链接保持可审查的文本/超链接语义。
本批《原材料进货检验规范》的图片同时有内嵌 rId11 和外链 rId12;派生包保留内嵌图片,移除 rId12 关系及对应 r:link,原件不变,处置进入差异台账。
只有外链而无可保全本地内容时阻止发布,不能静默删图或自动下载补齐。
原模板包不得直接把示例结论保留为实例结果;签署区域只映射真实审签元数据,不生成手写签名。
提交快照冻结真实模板 binding、内容块/章节版本、依据和渲染器版本;导出明确选择草稿或某一批准快照,不能读取各章当前最新版拼装。
批准 Word 首次生成后,字节、完整 hash、固定输入与精确批准快照持久关联,随批准历史保留;现有短期导出工件的 24 小时寿命不能作为该文件的保留策略。
采用 RDM 自有的受控导出产物仓储,复用现有文件/hash 完整性机制,下载权限使用 `doc_export_visibility.go` 的受控正文授权,区分短期导出和批准历史文件;下载链接可短期失效,批准文件不能因此删除。
批准后排队生成并保存该交付物,生成失败不回滚已批准的文档状态,文件状态保持待生成或失败;固定输入的幂等重试保存完整文件及关联后才可声明文件就绪。
同一快照再次取得文件返回原批准字节;首次生成或获准重建只能使用可执行的固定渲染版本,相关模板包/槽位映射缺失、原件 hash 不符或旧渲染路径不可执行时明确阻塞,禁止自动改用新版渲染器。
软件升级和例行清理必须保全批准文件及关联;结构化内容仍是业务权威,存档 Word 是对应快照的固定交付物。
现有仅含字典版本的历史快照不补造模板身份;继续按旧导出路径提供并标明历史格式,不能宣称新 DHF 保真。
KTD6. RDM 持有领域模板与生成/导出逻辑,Frontend 持有正式用户界面。
对话、工具及工作区消费同一服务端对象和状态;修正错误 intent 参数,并公开合法的模板绑定和提案 schema。
正式产品必须检验 Frontend 发布版本和 RDM pins 的组合;仅修改 RDM `web/app.js` 不算正式产品交付。
按 Dev DESIGN 复用三栏、卡片与唯一文件预览,界面消费令牌和已有原语;文档纸面保留原件自己的字体和颜色。
预览明确区分页式视图、版式降级的内容视图和无法读取;页式渲染失败时显示“版式预览不可用,当前仅展示内容”,保留同一 Word 文件的下载入口供核对,不把内容视图当作格式验收。
仅当已批准路径无法由公开扩展点实现时,向基座提交四要素扩展申请;禁止改 RDM pins 或导入 Backend internal。
### High-Level Technical Design
以下图示规定权威和流向;具体类型名、函数及路径由实施时确定。
```mermaid
flowchart LR
O[44份只读原件] --> N[DOC规范化与差异核对]
N --> T[固定模板包: 原件/结构/槽位]
T --> I[可信项目与按模板实例化]
K[授权知识与原文版本] --> G[逐块生成和校验]
I --> G
G --> P[持久提案和差异]
P --> A[编制人采纳: 事务/CAS]
A --> S[整文提交/审核/批准快照]
T --> E[固定模板填充导出]
S --> E
E --> F[同一文件预览和下载]
```
```mermaid
stateDiagram-v2
[*] --> Imported
Imported --> NeedsReview: 结构/语义/版式待确认
NeedsReview --> Published: 资产评审通过
NeedsReview --> Blocked: 关键丢失或用途不明
Blocked --> NeedsReview: 有依据的修正
Published --> Retired: 受控退役
```
```mermaid
sequenceDiagram
actor A as 编制人
participant C as 对话/工具
participant R as RDM领域服务
participant D as 事务与事件库
participant E as Word导出
A->>C: 指定项目/目标/模板
C->>R: 可信主体与明确绑定
R->>D: 实例化及生成输入快照
R-->>A: 候选、差异、缺项与来源
A->>R: 采纳固定提案
R->>D: 权限/版本复验,原子提交
Note over R,D: 三权审签后冻结整文及真实模板
A->>R: 导出指定批准快照
R->>E: 固定内容与模板包
E-->>A: 经授权的文件预览/下载
```
### Dependencies and Open Questions
实施启动阻塞项:本轮范围与取舍评审、在途两树任务契约 owner、44 份逐项阶段/type/用途映射、E1 授权与 DOC 保真结果、原件内容分类及导出槽位合同。
特别是 F02《验证确认报告》虽位于设计验证目录,正文是过程 IQ/OQ/PQ 确认,须由业务负责人裁定用途,不按目录自动映射。
导出关键版式以 R2 为底线;允许的字体替代和跨 Office 分页差异在 E1/样例评审中逐项确认,不承诺像素一致。
源模板中的企业信息、示例产品名和标识需人工分类为企业固定项或项目替换项;无人确认时保持待发布。
具体 helper 名称、序列化细节和测试夹具目录由实施者确定;不得用这些细节延后上述业务裁定。
---
## Implementation Units
以下 U-ID 只属于本专项;均为待批准工作,不代表 E1 或任何业务实施已启动。
### U1. Asset Contract and Conversion Proof
覆盖 R1–R4;先与 TT-T/TT-D 的 owner 固定共享契约与台账。
Files:RDM `internal/rdmapp/templates/`、`templates.go`、`templates_embed.go`;新增 `docs/records/dhf/` 台账及 `template_asset_contract_test.go`(拟定);Dev 原件保持只读。
产物为 44 份完整谱系、用途/适用性映射、内容分类、保真差异台账和已评审结构/槽位规范。
先用项目建议书 DOCX 完成内容模型;设计输入规格书及 F02 报告校验多级结构与示例语义,复用 E1 覆盖全部 DOC。
验证场景:损坏/加密/不支持对象拒绝发布;重复 hash 不吞用途;混合标题/编号正确;黑字假结论不能成为项目结果;每个 DOC 关键差异有判定;外链图片处置后内嵌图完整且导出无自动外部内容读取。
出口:44 份处置明确,全部 14 DOC 方法可核验;未通过资产保持阻塞,不能进入全量发布。
### U2. Published Template Binding and Instantiation
依赖 U1 共享契约;覆盖 R1/R4/R5/R8。
Files:RDM `templates.go`、`structure.go`、`internal/domain/doctree.go`、`payloads.go`、`replay.go`、`plugins/rdm/plugin.go`;新增 `dhf_template_instance_test.go`(拟定)。
增加发布模板包与明确默认用途,原子创建文档/块/真实模板 binding;内容块复用 TT-D,不按标题去重代替身份。
验证场景:v2/v10 选择、周报与建议书同 docType、缺包/hash 错误、退役、重复创建、跨项目、更名同名章、失败回滚及重启重放;模板升级不会覆盖旧实例。
出口:无 Dev 源码目录的构建制品可实例化试点模板;新对象与历史对象有明确兼容路径。
### U3. Evidence-Based Generation and Confirmed Adoption
依赖 U2;覆盖 R3/R6–R8。
Files:RDM `compose.go`、`draft.go`、`draftproposal.go`、`plugins/rdm/plugin.go`;扩展 `compose_test.go`、`draftproposal_test.go`、`plugins/rdm/intents_test.go`。
修正 intent 和总线 schema;按块要求组织有权依据,结构化生成并校验,复用持久提案/事务采纳;同时落实 Compose 的指定编制人门禁。
验证场景:真实自然语言请求从正确模板到提案;无资料、示例黑字、适用条件冲突均诚实留缺;未分配职责、非编制人和私人未发布资料拒绝;并发采纳、重复点击、取消、断连/恢复及撤权结果可查且不重复生效。
出口:项目建议书有固定来源的完整候选和内部版本;无证据的测试/验证字段仍空缺或注明未执行。
### U4. Approved Snapshot and Word Fidelity
依赖 U2/U3;覆盖 R2/R3/R5/R8/R9。
Files:RDM `docsubmission.go`、`docx.go`、`doc_export_visibility.go`、`export_artifact.go`、领域快照 payload/replay;扩展 `docx_test.go`、`plugins/rdm/doc_submission_test.go`;新增 `dhf_docx_fidelity_test.go`(拟定)。
冻结真实模板及渲染版本,补整文快照选择;实现原 OOXML 槽位填充、重复行和附件映射及批准 Word 持久关联,旧导出语义独立兼容。
验证场景:审核中改正文被拒、提交后模板更新/退役、批准后当前章变化、历史批准轮次重导出、槽位重复/缺失、长表格跨页、合并关系、编号、图片、页眉页脚、中文字体、非法 XML;无真实签署不填意见;下载撤权立即拒绝。
跨版本验收:旧版批准/导出→超过短期工件 TTL→升级并更换渲染实现→取得同一轮次 Word,字节 hash 与原批准文件一致;下载仍按当前权限判断。原批准文件损坏或丢失且固定渲染版本不可执行时明确阻塞,不生成外观相近的新文件冒充历史产物。
故障验收:生成失败不改变审批结论;写文件与关联记录部分失败不发布就绪文件,重启后可查并幂等恢复;文件下载采用正文职责权限,普通审计权不扩大文件读取范围。
出口:三用户完成试点审签,Word 内容/依据与批准快照相同,关键版式对照通过;ZIP 非空或可打开仅为辅助检查。
### U5. Formal Product Path and Offline Package
依赖 U3/U4;覆盖 R6/R7/R9。
Files:RDM `scripts/build-product.sh`、`scripts/pack-release.sh`、`templates_embed.go`、`templates_embed_test.go`;Frontend `src/previewsetup.ts`、真实对话卡片/文件预览/API 与相关浏览器用例(其余路径实施前按当前发布版定位)。
统一包内模板路径、读取路径和 hash 校验;对话与辅助工作区复用同一任务/提案/快照,交付正式 Frontend 版本后由 RDM 正常消费。
验证场景:真实 auth-on 两项目三用户,关闭右栏完成编制,刷新/重启/撤权/旧卡片;脱离源码运行同一制品,资产缺失/摘要错误拒绝;原模板字体/颜色在预览保留;页式渲染失败明确降级,完全无法读取显示错误及下载入口;证明浏览器使用精确 Frontend SHA。
出口:项目建议书在正式产品完成全流程,固定组合 CI 与独立重放齐备;静态工作台或桩测试不能替代。
### U6. Complete All DHF Families
依赖 U1–U5 试点通过;覆盖 R1–R9。
Files:RDM 模板包、registry、映射台账及每文档族的内容/Word 回归样例,复用 U1 的唯一资产台账。
顺序为策划/输入→输出→验证/确认→商务/转换及剩余评审;DOC 规范化与 DOCX 内容整理可在同一契约下并行,发布仍逐批评审。
每份模板至少运行一个有材料的完整样例和一个缺证据/冲突样例;报告类只使用实际提供的验证记录,不能生成执行记录。
出口:44 份逐资产结果齐全,声明可用者通过真实生成/采纳/审签/导出;未解决项显式保留,本目标不能标全量完成。
---
## Verification Contract
验证在后续批准的阶段执行;本轮只能做原件/源码阅读和文档一致性检查。
实施期先补关键链路的行为测试,再扩展原有实现;正式验收遵循 Dev evidence、精确组件 SHA、CI GATE 与独立 REPLAY 门禁。
| 证据层 | 对象与方法 | 硬判据 |
|---|---|---|
| 资产 | 44 份路径、原件/派生/结构/渲染 hash、DOC 差异和业务分类 | 44/44 可追溯;原件不变;关键结构/语义/格式无静默丢失 |
| 领域 | RDM 模板/实例/提案/审签/事件重放测试 | 固定绑定、CAS/幂等、失败全回滚、历史再现,负向越权为零 |
| 真实总线 | 意图→schema→认证主体→实例化/生成/采纳/导出 | 用合法 docType/templateRef;工具暴露参数和处理器一致 |
| 模型行为 | 固定真实素材、原件和任务,人工审核正文与引用 | 不编造事实、样本量、执行记录、结论或签署;缺项明确 |
| Word | OOXML 核对+真实 Office/LibreOffice 打开+人工原件对照+升级后历史文件重取 | 内容/表格/合并/编号/图片/页眉页脚/关键样式与固定快照一致;批准历史文件不受短期 TTL 清理 |
| 正式浏览器 | 真实 auth-on 三用户两项目、对话/卡片/预览/下载、重启/撤权 | 完整用户流程,文件可读可下载,职责/私域隔离有效 |
| 安装制品 | 固定 RDM/Frontend/Backend pins 与模板包,源码外运行 | 无 cwd 依赖;读/打包路径同值;错包拒绝,不回退到骨架 |
RDM 的现有 `make test`、product build、模板/提案/审签测试用于回归;Frontend 使用相关浏览器测试;Dev 有 gitlink 改动时执行组合 `make test` 和 `make build`。
正式以各 PR 当前 HEAD 的必需 CI 为准;原件盘点 SELF、模型自评和历史绿色 CI不能代替当前验收。
生成耗时、费用和人工修订量先建立试点基线,再确认目标;本轮不编造工期或质量评分。
## Definition of Done
规划交付:范围、源码基线、44 资产特点、技术决策、依赖、工作包、验证和阻塞项可审查;未批准及未执行阶段明确。
试点交付:真实 DHF 项目建议书在正式产品,经三用户完成生成/采纳/审签/按快照 Word 导出,精确组合证据齐备。
全量交付:U6 达到 44 份逐资产验收,原两树任务的共同契约和台账同步;试点或 registry 数量不能替代。
上线交付:另行确认实例、制品和迁移范围,按批准窗口部署并运行验收;本方案完成不等于上线。
## Appendix
主要源码:RDM `internal/rdmapp/templates.go`、`templates_gen.go`、`templates_embed.go`、`structure.go`、`parse.go`、`compose.go`、`draftproposal.go`、`docsubmission.go`、`docx.go`、`plugins/rdm/plugin.go`、`scripts/build-product.sh`。
本轮资产证据索引:[44 份原件的路径/hash/结构特征及源文件摘要](../records/2026-10-14-dhf-assets.json);完整命令输出以 Dev 任务卡 evidence 为准。
上游来源:[原模板生成方案](2026-10-11-rdm-template-dialog-generation.md)、[最终目标方案](2026-10-11-rdm-final-target-completion.md)、[两树一网方案](2026-10-11-rdm-two-trees-trace-audit-integration.md)及在途 `feature/rdm-two-trees-latest-templates` 阶段 1/2 记录;旧“四模板”盘点只作历史。
登录收官来源:Dev `docs/svc-deploy/2026-10-13-login-recovery-contract.md` 的最后一项为“完成”,PR #516 已合入;owner 于 2026-10-13 自行在浏览器确认通过,密码不经 Agent。本轮不重做该验收。
@@ -0,0 +1,52 @@
# U3 r0.4:可靠的首条阶段发现与失败收口
状态:**书面设计待人工评审**。用户于 2026-10-14(Asia/Shanghai)认可“先发布一条有来源的短事实,再按需检索,并补足异常诊断与失败展示”的设计方向;这只授权写本文,不授权实施代码、再次调用付费模型、降低验收条件或合入。关联 [U2/U3 计划](2026-10-13-fast-slow-u2-u3-plan.md)、[r0.3 设计](2026-10-13-fast-slow-u3-r03-evidence-backed-judgments-design.md)及[核验记录](../reports/2026-10-13-fast-slow-u2-u3-validation.md)。
## 目标、边界与实际失败
普通用户上传材料后,应先在对话中获得简短即时反馈,再在同一张工作卡上及时看到有原文依据的阶段发现、仍需核对的问题和最终整理结果;失败时应知道已保存了什么、接下来能做什么。沿用三栏工作台、任务卡、现有“材料记载/待核对的判断/待确认”层级和来源展开;不新增默认命令、脚本、模型过程页或确认按钮。
r0.3 固定 Dev `e31443a8ff1f099f9b2ef320c295b0ddcdaf503d`、Backend `5f834544b0b808cb16214a36725f2ae3cb90bfd4` 的唯一获批 A01 已执行,**质量 FAIL**。快通道及时给出正确的三份材料概览;慢通道先作三次无命中的 `knowledge_search`,第一次 `publish_work_checkpoint` 的参数停在 `"findings": `,没有一条可用阶段发现或最终整理正文。两次付费 run、四次 provider 调用共返回 37,134 Usage tokens;检查点拒绝后没有再发 provider 请求,隔离实例已停止。原件和逐调用、SQLite、SELF 收据在受限归档 `/home/weichen/.local/share/agent-system-evidence/fast-slow-u3-r03-a01-20261014/`,清单哈希在 `archive-manifest.json`。旧 r0.2 的语义 FAIL 和本次 r0.3 的执行 FAIL 分别保留,不相互改判。
只读重放确认三份附件确已入本次 SQLite 索引;实际“文件名+多个中文关键词”查询在 FTS 和整串 LIKE 兜底均零命中,单独文件名各命中一条。另用合成 SSE 证明:当前 Agent-Native 解析器在 `finish_reason=tool_calls` 却缺 `[DONE]` 时仍可能放行半截工具参数。**本次未保存服务商原始 SSE,不能断定该机制就是 A01 参数截断的来源。**本次生成的失败通知还在无可用整理结果时要求交付物选择;评测关闭了通知模型回合,因此不能声称浏览器实际发出了选择卡。
## 方案取舍
| 路线 | 能解决的事 | 不足 | 结论 |
|---|---|---|---|
| 原样再跑同一候选 | 检查一次是否偶发 | 已批准额度耗尽;即使通过,也不修复已证实的流终态和失败通知缺口 | 不选 |
| 工具调用出错后自动请求模型修补 | 可能挽救一次格式错误 | 增加付费回合和延迟,可能让来源错误绕过停止规则,违背本轮“无额外模型调用”边界 | 不选 |
| **首条短事实优先+材料范围内的检索兜底+流终态守卫+状态感知通知** | 同时改善阶段可见性、来源检索和失败诚实性;保持模型调用边界 | 涉及 Agent-Native 与 Backend 的跨组件验证,模型是否遵循顺序仍须真实样本判定 | 推荐 |
## 用户可见行为
当已内联的材料含有可直接引用的实质事实,慢通道第一轮先尝试发布 **一条** `reading` 阶段 `material_record`:短句、原文连续引文、当前材料的 sourceId 与 blockIndex;先落到现有任务卡,再做可选检索和跨文档核对。它不是“已收到文件”或工作过程,也不得把日期、预算审批、分期归属等推断装成材料原句。第二条及之后只发布新增的、不同的核对结果;r0.3 的数字、归属、决定状态及来源校验原样保留。材料无可用原文时不强凑首条;模型未遵循顺序时如实记录,不能由宿主捏造一条发现来满足计数。
仅在已内联片段不足以完成当前工作时,慢通道调用现有 `knowledge_search`。材料子任务应先用**精确文件名**定位被截断的附件;如果模型仍把唯一附件文件名和关键词混成一个查询且常规检索无命中,宿主只在本任务已登记的附件集合中做一次同工具调用内的精确文件名兜底。兜底结果必须同时匹配 owner、project、附件 artifactId/ref 和本次输入版本;可从当前任务的解析快照证明版本,无法证明时就保持无命中。重名或多个匹配不猜,索引/原件版本不一致不返回旧内容。它不扩大通用知识检索的可见范围,兜底本身也不增加 provider 回合;返回内容仍按现有工具结果大小限制处理,检查点引用仍经原件与连续短引校验。首条检查点改为优先发布可能改变既有工具驱动回合的实际时序和总数,但不引入独立摘要、审核或自动修复模型;仍受每 run 的轮数、工具数、时间及 Usage 边界约束,必须在真实样本中逐调用核对。
任务失败时,工作卡保留已原子提交的旧阶段发现,并明确标注“整理未完成”和未完成范围;若从未保存阶段发现,就明确说没有可用整理结果。此时对话只给出简短恢复说明,**不**从不存在的“建议后续处理”生成交付物选择卡,也不使用默认四选项兜底。只有成功终态且有可用整理结论与实际建议时,才允许既有 `confirm_choice` 流程;成功但没有可用建议时请用户说明下一步目标,不伪造建议。通知和终轮兜底应读取宿主终态/成果可用性,不以“材料整理已结束”字面串代替成功判断。
## 组件职责与安全契约
**Agent-Native 流边界。** OpenAI 兼容 SSE 的工具调用在终态完整性得到证明前不进入执行层:需要受支持的正常结束原因、完整终止信号和每个工具调用的非空 ID/名称、合法且为对象的 JSON 参数。缺 `[DONE]`、参数不完整、流解码失败或结束原因表明截断时,返回**不可自动重试**的失败;已经返回的 Usage 仍纳入本次 run 和整批预算,后续 provider 请求被阻断。具体事件形状须在实施计划中与现有 `consume`/runner 的 Usage 累加契约一起固定,不得只丢弃 tool call 后把空正文误报为成功。普通无工具文本、合法多片工具调用与现有供应商兼容路径不能因守卫回退。仅保存诊断元数据(run ID、调用序号、结束原因、是否完整终止、参数长度/哈希与 JSON 有效性、Usage 是否存在),不记录原始 SSE、密钥或额外完整提示词。
**Backend 材料任务。** 在 `buildMaterialTaskFor` 的 r0.3 来源语义守卫之上,收敛首批发布指令,先一条短事实、再核对差异;材料配方从 v10 递增到 v11,防止旧完成任务以新规则复用。材料范围内的检索兜底沿 `runCtx.Retrieve`/工具授权链执行,不接受客户端指定 artifactId 作为权限证明。`publish_work_checkpoint` 的来源登记、原件 hash/解析版本、CAS 一次提交、幂等与更正历史保持不变。失败通知从持久终态和可用成果判断;无成果时不触发 `confirm_choice` 或其 stop 兜底,不静默重复派发整理任务。
**Frontend/UI。** 先复用现有卡片状态和失败文案、来源展开、刷新和文件预览;只有实际浏览器验证证明现有表述无法解释“部分成果已保存/没有成果”时,才在同一张卡上做最小文案调整,仍消费 `DESIGN.md` 与 UI 令牌、`@ui` 原语。异步卡片与对话仍各有单一状态所有者,按 seq 丢弃过期事件,不抢文件、输入焦点和阅读位置。没有新的页面、弹窗或模型内部日志。
Core 的可选 evidence 契约和 TaskSnapshot 持久字段不变;无数据库迁移、生产模型路由或预算放宽。流守卫若落在独立的 Agent-Native 仓,将在现有六个草稿 PR 之外增加该组件的 PR,并由 Backend 更新其固定 gitlink、Dev 再固定 Backend;不能只改 Backend 的嵌套检出后声明已交付。Documents 与 Dev 的记录也各按本仓任务分支提交、推送和组合验证;设计审批不等于合入授权或已通过模型验收。
## 失败恢复、验证与交付门槛
零付费先证明失败和正常路径:
1. 合成流覆盖 `tool_calls` 有结束原因却无 `[DONE]`、有 `[DONE]` 却参数不完整、`length` 截断、合法多片参数、正常纯文本;逐例断言是否执行工具、错误是否不可自动重试、已返回 Usage 是否保留。不得把坏 JSON 自动补全后调用工具。
2. SQLite/PostgreSQL 的材料检索覆盖本次三条“文件名+关键词”原查询、单文件名、重名、跨 owner/project、artifactId 不匹配和输入版本漂移;断言兜底只在本任务唯一附件内命中,同一次工具调用内完成且不泄露其他资料。
3. 假流和真实 HTTP 覆盖首条有用 `reading` 检查点先于可选检索、第二批不同 `crosscheck` 发现、无实质原文时不凑数、非法来源/数字关系整批拒绝、旧成果保留。失败通知和终轮兜底均不得在无可用建议时发选择卡;成功且有建议仍走原确认链。
4. 浏览器覆盖运行中阶段卡、失败零成果、失败有部分成果、成功交付、刷新和来源版本变化;默认界面只给用户行动所需信息,后台不抢阅读。执行组件测试、Dev `make test && make build`、独立代码复审及当前 HEAD 平台 CI,收据与 SHA 分别标 SELF/REPLAY/GATE。
真实模型质量仍使用同一 A01 合成材料:至少两个真正有用、终态前可感知的不同阶段成果,完整最终正文,六月计划与七月评审意见、50 万元预算及审批状态、总 12/第一期 8/接口依赖 3 项的关系与验收缺项均准确;无法证明接口项属于哪一期时标待确认。逐调用核对实际 run ID、工具数、返回 Usage 与停止规则。**新付费样本必须在本设计及实施计划分别获批、零付费候选固定后单独提交资源提案;不沿用 r0.3 已用完的授权。**任何质量失败或安全门禁失败,相关 PR 保持草稿,不合入或部署。
## 已知风险与待评审取舍
首条短事实能减小工具参数负担,但不能保证模型一定按顺序调用,亦不能证明本次 A01 的半截参数来自服务商而非流适配。要求完整流终态可能暴露某供应商的非标准结束行为;若发现这种事实,须先提出受限、可重放的等价终态定义,经评审后处理,不静默放宽守卫。材料精确文件名兜底可能取回比关键词检索更多的同附件文本,必须有既有结果大小与来源限制。若这些取舍不可接受,需要重新评估增加模型纠错回合或人工恢复的成本;当前版本不预授权两者。
@@ -0,0 +1,203 @@
# U3 r0.4 Reliable First Checkpoint Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 上传材料后先产生一条真实、有来源的阶段事实;材料检索、模型工具流和失败通知均按可复核边界工作,使慢通道能够逐步帮助普通用户而不展示内部过程。
**Architecture:** Agent-Native 在流终态阻断不完整工具调用并保留已返回 Usage;Backend 从本任务附件快照提供受限检索兜底,收敛材料任务的首批发布顺序,并以实际终态和可用建议决定是否发交付物选择卡。沿用 r0.3 的 TaskSnapshot、来源与语义守卫、同一张卡和现有 UI 原语。
**Tech Stack:** Go 1.27、SQLite/PostgreSQL、Agent-Native SSE/runtime、Backend runmgr/runtime、React/Vite/Playwright、Dev `make test`/`make build` 与 Gitea CI。
**Spec:** [已批准的 r0.4 书面设计](2026-10-14-fast-slow-u3-r04-reliable-first-checkpoint-design.md),Documents `7b21e6d495e99e15c458d608db47c517b2fdc599`;[r0.3 A01 失败记录](../reports/2026-10-13-fast-slow-u2-u3-validation.md)。本计划版本仍待阶段 5 人工批准;设计批准不授权代码或新付费模型请求。
## Global Constraints
- 保留 r0.3 的来源原文连续短引、owner/project、artifact hash/解析版本、数字/分期/决定状态守卫和 CAS;旧结果不追溯改写。Core 候选契约、TaskSnapshot 持久字段、数据库表和生产模型路由不变。
- 只沿现有三栏、同一张任务卡和“材料记载/待核对的判断/待确认”分层呈现;默认不展示模型调用、命令或原始 SSE。UI 变更先读 Dev `DESIGN.md`,只用 `@ui` 令牌与原语,事件按 seq 丢弃过期项。
- 不增加独立摘要、审核或自动修复模型;自然工具回合仍受每 run 的轮数、工具数、300 秒及返回 Usage 边界约束。工具拒绝、缺 Usage 或额度耗尽后不得追加 provider 请求。新付费 A01 必须单独审批,不沿用 r0.3 的额度或标签。
- 旧 r0.2 语义 FAIL 与 r0.3 执行 FAIL 保留。新 A01 仍须两个真正有用、终态前可感知的不同阶段成果和完整准确正文;来源字面匹配、单测、假流或绿色 CI 均不能代替这项真实模型质量出口。
- Agent-Native、Backend、Documents、Dev 各在自己的任务分支提交;不要直接编辑 Backend 内嵌的 detached Agent-Native 后把本地文件当已交付。新 Agent-Native PR 是现有六个草稿 PR 的依赖,固定指针和合入顺序为 Agent-Native → Backend → Dev。
- 启动/恢复、`make evidence`、`task-sync`、Review、当前 HEAD CI、阶段 6/7 人工结论和安全回收遵循 Dev `AGENTS.md` 与 `policy/delivery.md`。本计划只申请零付费实施与验证;不得从计划批准推导新模型资源或部署授权。
## Review Focus
1. **看似正常的 `tool_calls` 结束原因但没有 `[DONE]`:** 不得执行任何工具,返回不可自动重试的失败,已返回 Usage 仍计入预算。Task 1 的 `TestParseSSEToolFinishWithoutDone` 和 `TestRunTerminalToolFailureKeepsUsage` 钉住。
2. **同名附件或其他 owner/project 的知识命中:** 文件名兜底必须拒绝歧义和越界,不将其他人的材料带入当前任务。Task 2 的 `TestMaterialAttachmentFallbackScope` 钉住。
3. **本次附件注册后原件被替换:** 同 artifactId 的旧解析快照和索引不得继续供模型读取。Task 2 的 `TestMaterialAttachmentFallbackVersionDrift` 钉住。
4. **后台失败但旧阶段发现已保存:** 卡保留已验证发现并明确未完成,不出现“全部完成”或交付物选择卡。Task 4 的 `TestFailedMaterialNoticeKeepsPartialFindingsWithoutChoice` 钉住。
5. **后台成功但没有实际建议项:** 不生成默认四选项,也不触发弱模型选择卡兜底;让用户自由说明下一步。Task 4 的 `TestMaterialNoticeWithoutSuggestionsDoesNotNudge` 钉住。
## 文件与交付顺序
| 单元 | 主要文件(均相对于对应组件仓根目录) | 单一职责与可独立验证的产物 |
|---|---|---|
| Agent-Native 流终态 | `runtime/llm/{types,sse,sse_test}.go`、`runtime/{loop,loop_test}.go` | 完整工具调用才可执行;错误保留 Usage、不可自动重试。单独 Agent-Native PR。 |
| Backend 材料检索 | `internal/runmgr/{runmgr,material_retrieve,material_retrieve_test}.go` | 仅本次材料子任务从唯一附件快照兜底,拒绝歧义、越权和版本漂移。 |
| Backend 首条发布 | `internal/runmgr/{material,material_test}.go`、`internal/runtime/{work_checkpoint,work_checkpoint_test}.go` | v11 配方和一条短事实优先;不伪造发现、不增加独立模型回合。 |
| Backend 失败交互 | `internal/runmgr/{runmgr,material_test}.go`、`internal/runtime/{verify,llm_direct,material_flow_test}.go` | 成功且有实际建议才发选择卡;失败和无建议不强制选择。 |
| Backend 评测与组合 | `internal/server/{work_checkpoint_eval_test,work_checkpoint_eval_budget_test}.go`、`eval/live/work_checkpoints_test.go`、`modules/frontend/e2e/work-checkpoints.playwright.ts`(从 Dev 根目录) | 诊断元数据、预算停止、实际 HTTP/浏览器和固定组合证据。 |
以上单元紧扣同一材料整理链路,接口按表格顺序依赖;暂不拆成互不关联的新项目。UI 仅在实际浏览器证明现有失败文案不足时修改 Frontend/UI,届时在同一任务卡记录影响并重跑各自设计守护;不预设新增组件。
### Task 1: Agent-Native 完整工具终态与 Usage
**Files:** Agent-Native `runtime/llm/types.go`、`runtime/llm/sse.go:53-180`、`runtime/llm/sse_test.go:65-155`、`runtime/loop.go:320-360`、`runtime/loop_test.go`。
**Interfaces:** 扩展内部 `llm.Event` 的 `StreamComplete bool`;对不完整工具调用发一个含 `Usage`、`StopReason=StopError`、非空 `Err` 且无 `ToolCalls` 的 `KindMessageEnd`。`runtime.Run` 计入该终态已返回 Usage 后以不可重试错误结束;Backend 既有逐调用 wrapper 仍能从 `KindMessageEnd` 计量。普通文本和合法完整工具调用保持原行为。
- [ ] **Step 1: 建 Agent-Native 隔离分支并写 RED。** 从其权威 `origin/main` 建 `feature/fast-slow-u3-r04-stream-guard`(不要在 Backend 的 detached gitlink 上写);在 `sse_test.go` 增加两例:`tool_calls` 结束但无 `[DONE]`,及有 `[DONE]` 但参数停在 `"findings": `。使用与既有 `TestParseSSEToolCallIncrements` 相同的 SSE 输入写法,断言:
```go
if end.Kind != KindMessageEnd || end.Message.StopReason != StopError ||
len(end.Message.ToolCalls) != 0 || end.Err == nil || end.Retryable ||
end.Usage.TotalTokens != 17 {
t.Fatalf("unsafe incomplete terminal: %#v", end)
}
```
同时在 `loop_test.go` 用假 stream 发上述错误终态(Usage 17),工具处理器计数必须为 0,`res.Err != nil`、`res.Usage.TotalTokens == 17`、没有第二次 provider 调用。
- [ ] **Step 2: 重放 RED。** 在 Agent-Native 根运行 `GOWORK=off go test ./runtime/llm ./runtime -run 'TestParseSSEToolFinishWithoutDone|TestParseSSEInvalidToolArguments|TestRunTerminalToolFailureKeepsUsage' -count=1`;记录预期失败的原始 SELF 收据,不能把旧 `TestParseSSEUncleanEndDropsToolCall` 当作已覆盖 `finish_reason=tool_calls` 的情况。
- [ ] **Step 3: 最小 GREEN。** 在 `emitParsed` 拼完工具片段后要求 `sawDone`、受支持结束原因、每个非空 ID/名称及可解为 JSON 对象的参数;不完整时构造错误终态,不修补参数。实现形状:
```go
func terminalToolFailure(content string, usage Usage, reason string, complete bool, why string) Event {
err := &StreamError{Message: why, Retryable: false}
return Event{Kind: KindMessageEnd, Message: Message{Role: RoleAssistant,
Content: content, StopReason: StopError}, Usage: usage,
FinishReason: reason, StreamComplete: complete, Err: err,
ErrorMessage: why, Retryable: false}
}
```
`runtime.Run` 在现有 Usage 累加之后、工具执行与 stop-hook 之前,遇 `end.Err != nil` 即返回 `Result{StopReason: llm.StopError, Usage: usage, Err: end.Err, Retryable: false}`;更新与新语义相冲突的旧 `length`/断流测试预期。`KindToolCallDelta` 可以作为过程事件,但不得据此执行工具。
- [ ] **Step 4: 跑 GREEN 与正常回归。** 运行定向测试、`GOWORK=off go vet ./...`、`GOWORK=off go test -count=1 ./...`,另断言合法多片工具调用和无工具正常文本仍 PASS。用 `make evidence` 保存完整 SELF 输出;审阅返回 Usage 的终态错误不会被上层误报为成功,也不会触发 LLM 自动重试。
- [ ] **Step 5: 提交并开草稿 PR。** 仅提交本任务 Agent-Native 文件;英文祈使句主题、`Why/Evidence/Impact/Refs` body。推送该组件分支并记录准确 SHA 和草稿 PR,不修改其 `main` 或发布版本。
### Task 2: Backend 只读、限域的附件检索兜底
**Files:** Backend `internal/runmgr/runmgr.go:966-1018`;新建 `internal/runmgr/material_retrieve.go`、`internal/runmgr/material_retrieve_test.go`;必要时复用 `task_projection.go:358-370` 的原件 hash 检查。
**Interfaces:** `func (c *runCtx) materialAttachmentFallback(q core.RetrievalQuery) ([]core.RetrievalHit, error)` 仅在 `c.subAgent == materialSubagentID`、正常检索成功但零命中时调用;消耗 `c.attachments`(`startBackgroundSlot` 已从受信 `bgSpawnOpts.documents` 固定),不得从客户端 query 中取 artifactId 作权限。返回的每条 hit 的 `Doc.Ref` 必须等于当前任务唯一附件 artifactId。
- [ ] **Step 1: 写 RED 与版本负例。** 用 `newCardSpawnEnv`、`materialDocs()` 及真实 SQLite knowledge/artifact fixture,让本次 A01 的 `需求.txt 上线 预算 验收 接口` 在当前常规路径零命中,而兜底应找到当前任务的 `需求.txt`;重复文件名、另一 owner/project、同 ID 原件内容修改和 `Task.Inputs` 中 hash/解析版本不匹配时,兜底必须零命中或返回不含旧正文的明确错误。核心断言:
```go
if len(got) != 1 || got[0].Doc.Ref != string(docs[0].Meta.Origin.ArtifactID) ||
got[0].Doc.ProjectID != rc.run.ProjectID ||
got[0].Doc.Owner != rc.run.Owner {
t.Fatal("material fallback crossed the task boundary")
}
```
- [ ] **Step 2: 重放 RED。** `go test ./internal/runmgr -run 'TestMaterialAttachmentFallbackScope|TestMaterialAttachmentFallbackVersionDrift|TestMaterialAttachmentFallbackQuery' -count=1`,记录每例失败原因,不用未授权共享知识充当正例。
- [ ] **Step 3: 实现受限兜底。** 从 `q.Text` 识别**恰好一个**当前附件文件名;核对该 origin artifactId/hash/解析版本与 `card.Task.Inputs`;经 `GetArtifact(owner,id)`、`ArtifactContent(owner,id)` 和项目 ID/sha256 再读确认后,从本次 `ParsedDocument` 快照构造有限 `RetrievalHit`(`Source=upload`、`Ref=artifactId`)。若查询有其余词,优先返回包含这些词的有界原文片段;仅文件名时返回尚未内联的部分或当前文档的有限原文,最多遵守现有 `MaxToolResultChars`。在 `runCtx.Retrieve` 的正常结果为零、错误为 nil 时调用:
```go
if err == nil && len(hits) == 0 && c.subAgent == materialSubagentID {
return c.materialAttachmentFallback(q)
}
return hits, err
```
不得改变通用检索的 FTS/LIKE、共享授权或其他子代理结果;重名和版本证明失败时 fail closed,不猜测最相近文件。
- [ ] **Step 4: 跑 GREEN、权限与存储回归。** 运行上述三例、`go test ./internal/runmgr ./internal/store -count=1`,再在任务自有 PostgreSQL 上重放材料兜底与权限负例;相同文档多段、中文关键词和超长结果必须保持有限输出。记录被测 Backend SHA、数据库实例及 SELF 收据。
- [ ] **Step 5: 提交 Backend 检索单元。** 只提交本任务文件并核对 `git diff --check`;此时仍未改变阶段提示或失败交互,单元测试可独立审阅。
### Task 3: 首条有来源事实优先,配方 v11
**Files:** Backend `internal/runmgr/material.go:88-132,286-303`、`internal/runmgr/material_sources.go:144`、`internal/runmgr/material_test.go`、`internal/runtime/work_checkpoint_test.go`。
**Interfaces:** 不改 `WorkCheckpointCandidate` 或 `publish_work_checkpoint` JSON 契约。`buildMaterialTaskFor` 在已有实质内联片段时要求首个 `reading` 工具调用只含一条 `material_record`、当前 `sourceId/blockIndex/quote`;第二阶段沿 r0.3 evidence 守卫产生新的差异/待确认。材料输入修订从 `material-recipe.v10` 改为 `material-recipe.v11`,旧完成卡只读保留。
- [ ] **Step 1: 写 RED。** `material_test.go` 用三份完整内联 A01 和一份空/不可读材料分别断言:前者任务指令明确“首条一项短事实、先于检索”;后者不要求凑发现。`work_checkpoint_test.go` 的假流先发布原文事实、再可选检索、后发布不同的 crosscheck 条目,核对运行中卡片 seq、两批不同 findingKey/来源及最终正文;再用无效 sourceId 断言整批零提交。关键检查形状:
```go
if first.Task.CheckpointSeq != 1 || second.Task.CheckpointSeq != 2 ||
first.Task.Findings[0].Kind != "material_record" ||
second.Task.Findings[1].Kind != "needs_user" {
t.Fatal("reading and crosscheck did not remain distinct")
}
```
- [ ] **Step 2: 重放 RED。** `go test ./internal/runmgr ./internal/runtime -run 'TestMaterialFirstFindingBeforeOptionalSearch|TestMaterialNoForcedFindingWithoutSource|TestWorkCheckpointTwoUsefulPhases' -count=1`。如果假流只证明宿主接受顺序、无法证明真实模型会遵循,明确在任务卡标“机制 PASS / 模型 NOT_RUN”。
- [ ] **Step 3: 最小 GREEN。** 把材料任务的首条指令放在长篇最终正文要求之前,避免模型先写完整计划或做已提供材料的冗余检索;提示只要求一条已提供原文短引,不复制全部来源索引或增加新工具。实现形状:
```go
task = "先从已提供的实质原文发布一条 reading 材料记载:只写一项,附当前 sourceId、blockIndex 和连续短引;发布成功后再按需检索、核对差异和形成完整正文。\n\n" + task
```
空文本或只有处理警告时不追加强制首条要求;将配方常量更新到 v11。Host 不凭规则自行合成内容,模型未按顺序调用时如实失败或继续原有受控流程。
- [ ] **Step 4: 跑 GREEN 与预算体积检查。** 运行前述定向测试和 Backend `go test ./... -count=1`;离线比对 v10/v11 任务提示及工具 schema UTF-8 字节和粗估 token 增量,不能将粗估当真实 Usage。补测旧 r0.3 数字、决定、来源及 CAS 回归。
- [ ] **Step 5: 提交 Backend 首条发布单元。** 仅提交提示、配方与相关测试,记录“优先顺序不等于模型质量保证”的限制。
### Task 4: 失败通知按终态与建议可用性分流
**Files:** Backend `internal/runmgr/runmgr.go:2254-2400`、`internal/runmgr/material_test.go:198-230`、`internal/runtime/verify.go:34-44`、`internal/runtime/llm_direct.go:148-161,634-648`、`internal/runtime/material_flow_test.go:146-225`。
**Interfaces:** `materialChoiceReady(bgNotice, core.ActivityCard) bool` 仅在 `material && Status==completed`、任务卡确有可用最终正文且正文“建议后续处理”包含 3–4 条带依据的真实选项时为真。只有该路径加入新的内部 `materialChoiceReadyMarker` 并开启 stop 兜底;失败、取消、零成果及成功但无建议时只投递状态/恢复说明,保留已经持久化的旧发现,不出现默认四选项。
- [ ] **Step 1: 写 RED。** 扩展 `TestMaterialNoticeContract`:失败零成果、失败但卡已有一条合法 finding、取消、完成但无建议、完成且有 3 条建议。前四种系统提醒均不得含 `confirm_choice`/ready marker;第五种仍含两者。`material_flow_test.go` 加失败及无建议通知回合,断言不会产生 HITL 或 `materialNoticeBackstopReason`,成功有建议仍生成选择卡。
- [ ] **Step 2: 重放 RED。** `go test ./internal/runmgr ./internal/runtime -run 'TestMaterialNoticeContract|TestFailedMaterialNoticeKeepsPartialFindingsWithoutChoice|TestMaterialNoticeWithoutSuggestionsDoesNotNudge|TestMaterialNoticeChoiceChain' -count=1`;保存失败原件。
- [ ] **Step 3: 最小 GREEN。** 从 `bgNotice.payload.Status`、任务卡 `Task.OutcomeCompleteness`/结果和正文里的实际建议列表判断选择资格;只接受“建议后续处理”标题下 3–4 个非空选项,每项有材料依据文本。保守解析失败时提示用户自行说明目标,不生成虚构选项。`verify.go` 用与“已结束”不同的内部 ready marker;`llm_direct.go` 只按该 marker 设置 `st.materialNotice`。实现门槛示意:
```go
func materialChoiceReady(n bgNotice, card core.ActivityCard) bool {
return n.material && n.payload.Status == core.RunCompleted &&
card.Task != nil && card.Task.OutcomeCompleteness == "complete" &&
len(parseMaterialSuggestions(n.payload.Text)) >= 3
}
```
若当前 Task 的实际完成枚举或结果落点不同,以 `core.TaskSnapshot` 的现有定义修正该判断并在同一测试证明;不要硬编码“状态:completed”字符串。通知正文和终轮兜底保持一致,失败时不再要求 `delegate_task` 基于不存在的建议启动工作。
- [ ] **Step 4: 跑 GREEN。** 重跑定向测试、`go test ./internal/runmgr ./internal/runtime ./internal/cardsvc -count=1` 和正常完成链;检查旧阶段发现/失败终态的持久事件没有被新通知写成成功。所有结果由 `make evidence` 写入任务卡。
- [ ] **Step 5: 提交 Backend 失败交互单元。** 只提交相关文件和测试,通知文字使用普通用户能理解的状态,不输出 tool/JSON/Usage 细节。
### Task 5: 评测诊断与停止规则零付费重放
**Files:** Backend `internal/server/work_checkpoint_eval_test.go:347-455`、`internal/server/work_checkpoint_eval_budget_test.go:201-300`、`eval/live/work_checkpoints_test.go:146-295`;Agent-Native `runtime/llm/types.go` 提供 Task 1 的 `StreamComplete`。
**Interfaces:** 评测逐调用记录增加 `finishReason`、`streamComplete`、`toolArgumentBytes`、`toolArgumentsValid` 和 `usagePresent`;原有 run ID、调用数、reported Usage、输出上限保留。诊断字段不含 API key 或原始 SSE;`KindMessageEnd` 的错误终态仍计入 Usage,任一检查点拒绝或缺 Usage 后零后继 provider 请求。
- [ ] **Step 1: 写 RED。** 用本地 `httptest` SSE 服务分别发送“合法工具调用”“有 `tool_calls`、已返回 Usage、缺 `[DONE]`”“有 `[DONE]` 但参数半截”“无 Usage”四种结果;每次从全新隔离 SQLite 和 0 个既有 run 开始。断言坏结果后第二次请求没有到达服务端、记录 Usage 如实、`toolArgumentsValid=false`、结果卡为失败。不得调用外部模型。
- [ ] **Step 2: 重放 RED。** 在 Backend 根运行 `go test -tags live ./internal/server -run 'TestEvaluationStopsAfterMalformedToolTerminal|TestEvaluationKeepsUsageOnTerminalFailure' -count=1`;在 `eval/live` 用 `go test -tags live ./eval/live -run 'TestFollowupA01KeepsItsOwnOneShotResult|TestPersistedRunningCheckpointMaxDoesNotMissShortWindow' -count=1` 保留既有零付费结果名与窗口回归。`TestWorkCheckpoints` 必须保持 `NOT_RUN`,此步不提供模型实例或路由。
- [ ] **Step 3: 最小 GREEN。** 从 Task 1 的终态字段和每个 `ToolCall.Arguments` 的 `json.Valid` 生成诊断布尔值;错误终态的 `Usage` 必须先进入 `reportedTokens` 与 provider record,再向 runner 发出非重试失败。评测 wrapper 增加批次级 `terminalFault`,遇此错误后与 `checkpointRejected`/`usageUnknown` 一样拒绝所有后继 provider 请求;即使直接再次调用 stream,也只返回本地错误。不要把失败伪装成正常 `message_end` 或用下一轮模型修补参数。
- [ ] **Step 4: 跑 GREEN 与上限。** 运行上述 live-tag 假 provider 集及 `go test ./internal/server -count=1`;`eval/live` 只用上述 `-tags live -run` 选择零付费用例,避免无 manifest 时误执行 `TestWorkCheckpoints`。核对每 run 30,000 配置、8轮/12工具/300秒、单次输出4,000、整批返回 Usage 停止目标的既有逻辑未变。对失败和正常路径分别保存 SELF 收据。
- [ ] **Step 5: 提交 Backend 评测单元。** 记录新诊断只证明机制,不能把旧 r0.3 A01 或未运行的 r0.4 模型质量改判。
### Task 6: 固定组合、真实浏览器、复审与资源出口
**Files:** Dev `modules/backend`、`modules/documents` gitlink、`.task/feature-fast-slow-u2-u3-plan.md`、`PROJECT.md`;Backend `deps/agent-native` gitlink;视需要 Frontend `e2e/work-checkpoints.playwright.ts`(若 UI 确需文字调整,再列明 Frontend/UI 文件和设计守护)。
**Interfaces:** 对外的 TaskSnapshot、卡片事件 seq 和来源跳转保持现有契约。各组件分支自己的 commit/PR 是唯一交付对象;Dev 组合 pin 明确 Core、Backend、Frontend、UI、Documents、嵌套 Agent-Native 的 SHA。
- [ ] **Step 1: 固定依赖与 RED/GREEN 组合。** 先把 Agent-Native 草稿 PR 的准确 SHA 固定进 Backend gitlink,在 Backend 跑 `GOWORK=off go test ./...`;提交/推送 Backend。Dev 再固定 Backend 与已批准计划 Documents SHA,跑 `RECEIPT=/tmp/fast-slow-u3-r04-20261014-combo-implementation.json CMD='make test && make build' make evidence`(该路径必须尚不存在;若已占用,选新的带序号绝对路径,绝不覆盖),导入原始收据并提交/推送 Dev gitlink。任何 pin 漂移、活动 Git 锁或其他工作区未保存内容均停止,不强删锁或覆盖。
- [ ] **Step 2: PG 与 HTTP/浏览器。** 启动**本任务独有** PostgreSQL 和 HTTP 假流实例;manifest 记录 PID、二进制 SHA、Dev/Backend/Agent-Native SHA 与数据目录,测试前验证绑定。PG 重放 runmgr/cardsvc/store;`PLAYWRIGHT_BASE_URL` 指向受验 manifest 的本地地址后运行 `e2e/work-checkpoints.playwright.ts`,覆盖两次 running 阶段、零成果失败、部分成果失败、成功建议选择、刷新和来源版本变化、后台不抢文件/焦点。只停止任务自有进程并保留 trace。
- [ ] **Step 3: 独立 Review 与正式固定。** 在请求审核前、验收前及合入前分别按 Dev `AGENTS.md` 用 `CMD='make task-sync' make evidence` 同步最新权威 main;同步改变 base/head 或组件时按影响重跑组合、PG、浏览器和代码复审。独立审阅者对 Agent-Native 流边界、检索权限/版本、成功/失败通知、预算停止、UI 状态投影和计划范围作最小重放;不能把作者 SELF 升格为 REPLAY。Dev 当前 HEAD 的 `test`、`test-pg`、`svc-realcombo` 与 Agent-Native/Backend/适用 UI 的必需 CI 必须核对实际 SHA、runner 和所有步骤。
- [ ] **Step 4: 阶段 6 与模型资源分开审阅。** 将零付费候选、独立 Review、精确 HEAD CI 和实际浏览器结果交用户确认阶段 6;只有候选固定且用户另行批准一次性资源提案后,才能用原 A01 材料、受保护路由、全新 0-run 数据目录和独立输出名运行真实模型。提案必须列明最多付费 run、单 run token/轮/工具/时间、批次返回 Usage 目标、输出 cap、在途超额风险、停止规则及不自动重试;**本计划不预填或授权新的用量数字**。
- [ ] **Step 5: 依据真实结果决策。** 只读重放 SQLite、逐调用 Usage、运行中卡片窗口、每条短引及逻辑归属、完整正文;任何 FAIL 保留所有相关 PR 草稿,不自动重跑或合入。质量 PASS 后仍须阶段 7 人工验收,随后按 Dev 策略完成 Agent-Native → Backend → 其他组件 → Dev 的独立 Review、准确 HEAD CI、串行 PR 合入、合入后内容核验、任务卡闭合和安全回收;未获阶段结论时写 NOT_RUN,不能提前标完成。
## 计划自检与停止条件
每个实现单元的 RED、GREEN、独立审阅、失败原件和版本都进入同一 Dev 任务主记录;Documents 设计/计划仅作引用,不复制第二份状态。局部代码修复若只改变等价实现,在已批准阶段内按影响补测;若改变工具公开契约、权限、模型调用数/预算、阶段验收条件或组件职责,回到设计/计划人工评审。真实模型样本一旦缺 Usage、检查点拒绝、预算停、输出不完整或语义错误,停止后续请求,保留原件并报告,不通过“再试一次”抹平失败。计划获批后才开始 Task 1;目前 Task 1–6 均 **NOT_RUN**。
@@ -0,0 +1,61 @@
# U3 r0.5:安全终态证据与可信快通道反馈
状态:**书面设计已获人工评审通过**。批准对象为 Documents `0d473fe866703eab32f715ddf12d1b25913b822b`、Dev `c7ff687c1de6911b43163433bc19e4e55df24eed`;用户于 2026-10-14(Asia/Shanghai)答复“批准设计,继续实施计划”。此前用户认可的方向是“保持不完整工具流的安全拒绝,增加无原始内容或凭据的终态/传输诊断与零付费重放;快通道数字和分期归属缺少依据时标待确认”。这两次答复只授权写设计及详细实施计划,**不授权产品代码、付费模型请求、合入或部署**。负责人 weichen;实施候选与验收主记录为 Dev `feature/fast-slow-u2-u3-plan` 任务卡,历史结果见[核验报告](../reports/2026-10-13-fast-slow-u2-u3-validation.md),前版见 [r0.4 设计](2026-10-14-fast-slow-u3-r04-reliable-first-checkpoint-design.md)和[实施计划](2026-10-14-fast-slow-u3-r04-reliable-first-checkpoint-implementation-plan.md)。
## 目标与已知事实
用户上传材料后应立即知道“已收到、正在做什么、何处看结果”;阶段发现和最终整理仍由同一张工作卡逐级呈现,并且数量、分期、审批状态与来源一致。非专业用户默认只看简短状态、有用发现和待确认问题,不看 SSE、脚本或 token 细节。沿用左侧上下文、中间对话、右侧工作/文件,不增加页面或独立模型回合。
r0.4 唯一获批 A01 固定在 Dev `d38dbdc396b7b8c6a9e34142ea8e6018abbed1fc`、Backend `37e2cb7adb6202902345d38bc591e12be7aa79c0`、Agent-Native `a5e3c7c817166865d75b764337b15ca7d505d131`。原始样本和独立只读评估(原件路径见[核验报告](../reports/2026-10-13-fast-slow-u2-u3-validation.md))确认:两个付费 run、三次调用、29,062 已返回 Usage tokens;工具回合有 `finishReason=tool_calls`、合法 JSON 参数片段和 Usage,但解析器未观察到 `[DONE]`,所以没有工具执行、运行中检查点或最终整理正文。三次终态的 `streamComplete` 均为 false,前两次纯文本仍被当作正常结束。**没有保存原始 SSE,无法区分服务端未发结束标记、连接中途结束或适配器遗漏;不能把“JSON 可解析”当成完整工具调用的证明。**
快通道问题中的“剩余 4 项(含 3 项依赖接口)”也没有材料依据:原文只给总 12、第一期 8、总量中接口依赖 3,未给依赖项与分期的交集。问号不撤销括号内的肯定关系。r0.3 的结构化检查点守卫没有覆盖前台自由文本;r0.4 `materialStartedNote` 仍要求模型即时给“初步判断、需要澄清的问题”。这条未经来源校验的可见路径必须收敛。
原候选还漏记失败子 run 的 7,148 tokens。Backend `0637547cc5640d51e2d67b65ab07b184269f8371` 已在 r0.4 授权诊断范围内完成零付费修复并通过独立复审(原件 `/tmp/fast-slow-u3-r04-20261014/usage-fix-final-review.md`)及准确 HEAD CI;该修复晚于样本,不改写原结果,也不证明流终态或快通道质量已通过。八个相关 PR 仍是草稿,r0.4 质量出口为 **FAIL**。
## 方案取舍
| 路线 | 收益 | 代价与风险 | 取舍 |
|---|---|---|---|
| 仅修改提示词,要求模型“谨慎” | 改动小 | 前台自由文本已出现无依据归属;提示不能构成发布门禁,也不能解释缺 `[DONE]` | 不选 |
| **保留严格工具门禁,补不含内容的终态诊断;自动材料入口用宿主确认反馈,来源判断进任务卡** | 不执行不完整工具;即时反馈不依赖模型推断;零新增模型调用 | 暂不使缺 `[DONE]` 的工具请求成功;复杂材料的首条实质发现仍取决于慢通道 | **推荐** |
| 将“干净 EOF+结束原因+合法 JSON”直接视作 `[DONE]`,或自动让模型补发工具参数 | 可能减少一次失败 | 缺失尾帧也可能是截断;无本次原始流可证等价,补发增加付费回合并违反停止条件 | 不选;未来如有证据须另审 |
本修订先补“为什么终止”和“哪些话可以立即显示”的可靠边界。它不是宣布供应商终态已兼容,也不以更宽松的模型质量标准换取通过。
## 用户可见行为与快通道边界
系统**已确定性启动或复用**材料整理任务时,立即由宿主在原对话给一条短确认,并保持同一张任务卡:例如“已收到 3 份材料,正在核对;有依据的发现会陆续出现在‘材料整理’中,尚不能确认的关系会明确标注”。材料数量、文件名及任务状态只能来自当前授权的附件快照与任务卡,不能由模型猜测。任务排队、已有活动任务、失败启动和已完成复用分别读实际状态,不把“已启动”发给启动失败的任务,不重派同一批材料。
对于这个**自动材料入口的首个可见快通道回复**,模型自由文本不作为已核对的材料结论直接流给用户。若要显示实质数量、分期、决定或跨文件关系,必须走已有来源、原句、范围和归属校验后成为 `material_record`/`needs_user` 等阶段条目;在此之前,只给宿主确认与“待确认”状态。样本中的正确表达是“总量、首期和接口依赖数量分别有记载;依赖项属于哪一期待确认”,不能写“剩余 4 项含 3 项依赖接口”。不凭单独的问号、免责声明或“可能”放行前面的肯定关系。这个选择减少即时推断,但用户会更早得到真实进度,稍后通过右侧卡片查看带来源的内容。
方案优先覆盖 **系统预启动材料整理的首回合**:无文字上传及达到材料阈值的文字+材料。后者原用户工作重点已由 `buildMaterialTaskFor` 带给慢通道;短确认应说明稍后将结合该重点汇报,而非假称当场已经回答。文字+小材料仍走普通对话与既有 stop 兜底,不把它伪装成本方案已验收的路径;实施计划须列出这一路径的风险与回归,并评估是否需要后续独立范围。原始模型候选若被抑制,不得进入用户可见事件、会话持久转录或后续模型上下文。实现时若不能保证这一点,选择直接跳过该首回合模型请求,由宿主正常落一条确认消息;不得先流出不可信片段再撤回。省略首回合模型请求是少一次请求,不是新增模型摘要或审核调用;对预算和 A01 基线的影响仍须如实记录。
后台成果不因快通道收敛而降格:首条仍须真实、短、有连续原文来源的 `reading` 事实,第二批是不同且有用的 `crosscheck` 发现,最终有准确完整正文。未验证阶段不得显示虚构的进度百分比、ETA 或“全部完成”;失败沿用 r0.4 的零成果/部分成果分流,不生成无依据的交付物选择卡。
## 终态诊断与安全契约
Agent-Native 是 SSE 读取与工具执行边界的所有者。保留现有规则:工具调用只有在受支持的完成原因、完整终止标记及 ID/名称/对象 JSON 参数全部满足时才交给执行器;缺 `[DONE]`、读取错误、取消或参数不完整时继续安全失败,已返回的 Usage 仍计入预算,不因失败自动补发请求。文本回合当前在缺 `[DONE]` 时可正常结束的事实需要单列诊断,不能借此推断工具回合也安全。Backend 的受控评测 wrapper 仍在终态故障、检查点拒绝、缺 Usage 或额度边界后阻断后继 provider 请求;不改模型路由、轮数、工具数、时间与输出上限。
新增**有界、无内容**的每次调用终态收据,与既有 `runId`、调用序号和逐调用 Usage 关联。字段建议为:HTTP 状态与可判定的响应完成类型、读结果(正常 EOF/读错误/取消)、`[DONE]` 是否观察到、最后一个 SSE 事件是否完整 JSON、已观察到的 `finishReason`、是否含工具片段及片段数量、参数总字节数与 JSON 对象有效性、Usage 是否出现与 token 数、最终是否放行工具。只记录枚举、计数、布尔值及受限错误类别;**不保存原始 SSE、prompt、正文、推理文本、工具名/参数、API key 或请求头**。不可从无内容收据反推出尾帧原文;读取错误细节需脱敏并限长,日志与归档采用任务自有权限。模型失败时诊断与失败状态同一调用保存,不让观测失败触发重试。
`bufio.Scanner.Err()==nil` 的 EOF 仅说明读取器没有报告错误,不证明供应商发送了所有预期事件;完整 `finishReason`、Usage 和合法 JSON 也不能独立补足 `[DONE]`。诊断先回答“解析器看到了什么、底层读取如何结束、工具是否被执行”。若零付费重放显示解析器漏认合法终止形式,或未来经单独批准的受限真实试验取得足够的供应商终态证据,才提出**按路由受限的等价终态定义**及正反例,回到方案评审;r0.5 本身不放宽工具门禁。
Backend 只消费 Agent-Native 的终态分类和 Usage,保留 run/card/source 版本权威;Frontend/UI 只显示“整理中/未完成/待确认”等用户可行动状态,不展示诊断字段。核心 `TaskSnapshot`、公开工具契约、数据库结构、权限和服务配置保持现有版本。若需持久诊断,优先落在已受控的评测记录/运行诊断面,实施计划须说明清理期限与是否需要新增内部字段;不得以完整原始流作为默认遥测。
## 零付费验证与阶段出口
1. **传输/解析重放。** 用 `httptest` 和人工 SSE 帧覆盖有 `[DONE]`、正常 EOF 却无 `[DONE]`、半个 JSON 帧、结束原因与工具片段不一致、读错误、取消、缺 Usage、纯文本缺终止标记。逐一断言收据分类、工具执行次数、返回及持久 Usage、后继 provider 请求数。特别验证“干净 EOF+合法工具 JSON”仍为 **0 次工具执行**。
2. **快通道投影。** 对附件仅发送、文字+长材料预启动、排队、活动任务复用、启动失败、已完成复用分别用真实 HTTP/浏览器核对首条确认、卡片与会话转录。以 A01 的 12/8/3 和跨文档改写变体作反例,断言首回合任何可见文字均不包含未经证明的交集关系,明确标“待确认”;原用户文字仍在慢任务重点中,普通文字+小材料路径没有被误改。
3. **渐进成果与失败。** 零付费假流核对第一条 `reading`、第二批不同 `crosscheck`、终态完整正文、零成果/部分成果失败,以及刷新、来源跳转和后台不抢阅读焦点;不能把宿主确认算成一个阶段发现。SQLite 与隔离 PostgreSQL 分别核对事件 seq、任务快照及已返回 Usage。
4. **组合与审阅。** Agent-Native、Backend、适用的 Frontend/UI 和 Dev 固定准确 SHA 后做组件测试、`make test && make build`、真实浏览器、独立最小重放与准确 HEAD 平台 CI。源码、收据和独立审阅按 `SELF`/`REPLAY`/`GATE` 标识;没有运行的项目写 `NOT_RUN`。界面若确需修改,先读 Dev `DESIGN.md` 并只用 `@ui` 令牌、动效与折叠原语。
正式 A01 质量标准仍是至少两条**真正有用且终态前可感知**的不同阶段成果、完整准确最终正文、原文来源和数字/决定状态正确,逐调用核对实际 run ID、Usage、工具数和停止规则。宿主确认不计入两条;零付费重放只证明机制,不证明模型会完成任务。r0.4 的一次性资源已用尽;新的真实模型调用必须在本设计与详细实施计划分别获批、零付费候选固定和单独资源提案获批后才可运行。任何安全、语义或质量 FAIL 保持八个 PR 草稿,不进入阶段 7、合入或部署。
## 风险与待评审决定
- **诊断不等于修复供应商行为。** 当前原件缺原始 SSE,因此只能证明“未观察到 `[DONE]`”;本版保守失败可能继续导致零阶段成果。是否再做受限供应商探针或提出等价终态,必须依据新证据和单独资源审批,不在本设计中偷渡。
- **快通道即时信息减少。** 宿主先确认真实状态,实质判断等来源核验后再上卡。若用户更看重未经核实的即时概览,需要另行决定风险,而不能把模型自由文本称为已核对结论。
- **首回合跳过/隔离的实现选择。** 两者都不得让候选文本先进入事件或持久转录;实施计划应以最小零付费探针比较对已有会话、通知、计费、重入和用户文字重点的影响,推荐更小且可证明的路径。若探针显示需要改变公开消息契约或异步所有者,返回设计评审。
- **范围边界。** 本版优先关闭预启动材料入口的快通道错误;普通文字+小附件问答仍需单列验证,不从 A01 推断全路径正确。若评审要求覆盖该路径,应在计划前扩展设计和验收矩阵。
请人工重点审阅:是否接受“先可信确认、实质判断稍后上卡”的体验取舍;是否同意缺 `[DONE]` 的工具流继续严格拒绝,并先以无内容诊断求证;以及短文字+小材料是否纳入同一增量。书面设计批准后才写详细实施计划,批准计划后才进行零付费代码实施;真实模型资源仍单独批准。
@@ -0,0 +1,206 @@
# U3 r0.5 Safe Terminal Evidence and Fast Feedback Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 上传材料后立即给出可信的收件与工作状态,让实质结论经来源核对后逐步上同一张卡;为未见 `[DONE]` 的模型流保存无内容诊断,同时继续拒绝执行不完整工具调用。
**Architecture:** Agent-Native 的 OpenAI SSE 解析器为每次终态附加有界、无原文的读取观察;Backend 评测入口把它与实际 run ID、Usage 和停止决定一起落到受限记录。Backend 在系统预启动材料整理的首回合选择宿主确认 runner,不调用前台模型,因此不会先流出无法核对的自由文本;后台仍按 r0.4 的来源、阶段和失败规则运行。普通文字+小材料与已完成任务上的新提问继续原路径,并单独验证其范围限制。
**Tech Stack:** Go 1.27、Agent-Native SSE/runtime、Backend runmgr/受控评测、SQLite/隔离 PostgreSQL、React/Vite/Playwright、Dev `make test`/`make build` 与 Gitea CI。
**Spec:** [已批准的 r0.5 书面设计](2026-10-14-fast-slow-u3-r05-terminal-evidence-and-fast-feedback-design.md),Documents `0d473fe866703eab32f715ddf12d1b25913b822b`;[r0.4 A01 核验记录](../reports/2026-10-13-fast-slow-u2-u3-validation.md)。用户只批准**编写本计划**;计划本身待阶段 5 人工评审,不授权产品代码、付费模型、合入或部署。
## Global Constraints
- r0.4 原始 A01(Dev `d38dbdc`,2 个付费 run/3 次调用/29,062 返回 Usage,0 个检查点)与受限归档原样保留,质量判定 **FAIL**。Backend `0637547` 的失败子 run Usage 修复也不追溯改写样本。
- 缺 `[DONE]`、读取错误、取消、工具身份或对象 JSON 参数不完整时,工具执行次数必须为 0;合法 JSON、`finish_reason`、Usage 或正常 EOF 均不能单独替代完整终止标记。不新增自动重试、补参数、供应商切换或模型摘要调用。
- 新终态诊断只保存枚举、布尔值、计数、HTTP 状态、实际 run ID/调用序号和 Usage;**不保存新的原始 SSE、prompt、正文、思考文本、工具名/参数、API key、请求头**。旧历史原件保持只读;新评测记录要移除现有 `messages`、`toolDeclarations`、`terminal` 的原始内容副本。
- 保留 r0.3/r0.4 的 sourceId、owner/project、artifact hash/解析版本、原句、数字归属、CAS、seq、失败通知与建议选择条件。Core `TaskSnapshot`、HTTP 公开契约、数据库表、生产模型路由、预算与既有普通聊天入口不改。
- 宿主确认不计入两个有用阶段成果。自动材料入口只有在系统确实预启动或复用活动任务时跳过前台模型;排队、运行、复用、启动失败与已完成复用按真实卡片状态分流。用户原文字重点继续进入慢任务;文字+小材料仍走原直连路径,不能用 A01 证明其质量。
- 默认仍是三栏与一张任务卡。若实际浏览器证明必须修改 UI 代码,先读 Dev `DESIGN.md`,只消费 `@ui` 令牌、`mk-*` 动效和 Collapsible 原语;相关计划范围与组件 PR 需按影响重新评审。异步投影仍按 seq 丢弃过期事件,不抢文件、焦点和阅读位置。
- 所有实施、真实 HTTP、PG、浏览器、审阅与 CI 都是**零付费**;只用 `httptest`/本地假流,不能运行 live `TestWorkCheckpoints` 或受保护模型路由。后续受限供应商探针或 A01 必须分别提交资源提案;本计划不预填、不授权任何 token/run 额度。
- Dev `AGENTS.md` 的唯一 precheck 收据、`task-resume`、请求审核/验收/合入前 `task-sync`、`make evidence`、独立 REPLAY、准确 HEAD GATE 和任务工作区保护全部适用。计划实施需另获用户阶段 5 批准;质量 FAIL 时八个 PR 保持草稿。
## Review Focus
| 容易伤害用户的输入/状态 | 所属任务的固定用例与预期 |
|---|---|
| `tool_calls` 有合法参数、Usage、正常 EOF,却没有 `[DONE]` | Task 1 `TestTerminalObservationCleanEOFWithoutDone`、Task 3 `TestEvaluationStopsAfterUnmarkedToolEOF`:记录 clean EOF,0 次工具执行、0 次后继请求。 |
| SSE 最后一帧半个 JSON,或 HTTP 读取错误/取消 | Task 1 `TestTerminalObservationMalformedAndReadError`:分类不同、已返回 Usage 不丢、原始内容不入诊断。 |
| 三个后台槽已满,材料排队;同批材料重发 | Task 2 `TestMaterialAckQueueAndReuse`:确认文字与卡片真实状态一致,只有一个材料子任务、前台 provider 0 次调用。 |
| 用户带文字+长材料,或文字+小材料 | Task 2 `TestMaterialAckPreservesUserFocusAndSmallPath`、Task 4 浏览器用例:前者重点进入慢任务且前台只确认,后者仍走原模型路径。 |
| prompt、工具参数或 provider 错误含敏感文本;诊断文件写入失败 | Task 3 `TestEvaluationTerminalRecordContainsNoPayload`、`TestEvaluationStopsWhenTerminalRecordUnavailable`:文件无哨兵原文,写入失败不放行工具终态或下一次请求。 |
## 文件责任与依赖顺序
| 单元 | 文件(相对对应仓根) | 产物/消费者 |
|---|---|---|
| 1 Agent-Native 终态观察 | 修改 `runtime/llm/{types,sse,client,sse_test}.go`,新建 `runtime/llm/client_test.go` | `llm.Event.TerminalObservation`;Task 3 消费。Agent-Squad 与 Backend 的 Agent-Native gitlink随后固定同一 SHA。 |
| 2 Backend 可信快反馈 | `internal/runmgr/{material,material_ack,runmgr,material_test,material_ack_test}.go` | 内部 `materialIntakeDecision` 与 `materialAckRunner`;Task 4 的 HTTP/浏览器消费。 |
| 3 Backend 受控评测记录 | `internal/server/{work_checkpoint_eval_test,work_checkpoint_eval_budget_test}.go` | 内容最小化的 `provider-records.json` 与故障停止证据;Task 5 消费。 |
| 4 整条用户链 | Backend `internal/runmgr/material_notice_failure_test.go`、`internal/server/work_checkpoint_eval_test.go`;Frontend `e2e/work-checkpoints.playwright.ts` | 真实 HTTP、SQLite、隔离 PG、浏览器的收件→阶段→终态证据。Frontend 仅按需要改测试,不预设 UI 生产代码。 |
| 5 固定与评审 | Agent-Squad `deps/agent-native`;Backend `deps/agent-native`;Dev `deps/agent-native`、`deps/agent-squad`、`modules/backend`、可选 `modules/frontend`、任务卡与 Documents 指针 | 单一准确组件组合、独立复审、当前 HEAD CI、阶段 6 人工评审材料及资源决策。 |
接口顺序:Task 1 的只读终态观察由 Task 3 记录;Task 2 的宿主确认由 Task 4 从真实浏览器观察;Task 1–4 的组件 SHA 进入 Task 5。Task 2 与 Task 3 可在各自包内分别验证,但 Backend 提交和 Dev 固定仍按上述依赖顺序完成。已有登记任务工作区与草稿 PR 继续使用,不从嵌套 detached gitlink 直接交付。
### Task 1: Agent-Native 有界终态观察,不放宽工具门禁
**Files:** 修改 `runtime/llm/types.go`、`runtime/llm/sse.go`、`runtime/llm/client.go`、`runtime/llm/sse_test.go`;新建 `runtime/llm/client_test.go`。**Interfaces:** 生产现有 `llm.Event` 的 `FinishReason`、`StreamComplete`、`Usage`、`HTTPStatus` 保留;新增只在终态/错误事件上出现的 `*TerminalObservation`,字段为 `ReadOutcome`(`done_marker|clean_eof|read_error|cancelled|invalid_frame|provider_error`)、`LastFrameJSONComplete`、`UsagePresent`、`ToolFragments`、`ToolArgumentBytes`(饱和计数)、`ToolArgumentsValid`。不包含原文、工具名或错误原句。Task 3 只消费这些标量。
- [ ] **Step 1: 写 RED。** 以现有 `TestParseSSEToolFinishWithoutDone`、`TestParseSSEReaderErrorAfterUsageKeepsUsage` 为底,新增 `TestTerminalObservationCleanEOFWithoutDone`:SSE 有合法工具 JSON、`finish_reason=tool_calls`、Usage 17,却在正常 EOF 结束;断言终态错误、`ReadOutcome=clean_eof`、`StreamComplete=false`、`ToolArgumentsValid=true`、`ToolFragments=1`、`ToolArgumentBytes>0`、`len(Message.ToolCalls)==0`。`TestTerminalObservationMalformedAndReadError` 表驱动比较半帧 JSON、注入读错误、取消;断言分类及返回 Usage。`client_test.go` 的本地 `httptest` 断言成功 HTTP 200 只作为标量传到终态,不保存 URL/请求头。
```go
if end.Err == nil || end.StreamComplete || len(end.Message.ToolCalls) != 0 ||
end.TerminalObservation == nil || end.TerminalObservation.ReadOutcome != "clean_eof" ||
end.Usage.TotalTokens != 17 {
t.Fatalf("unsafe or unclassified terminal: %#v", end)
}
```
- [ ] **Step 2: 记录 RED。** `GOWORK=off go test ./runtime/llm -run 'TestTerminalObservationCleanEOFWithoutDone|TestTerminalObservationMalformedAndReadError|TestClientTerminalObservationHTTPStatus' -count=1`;预计因新观察字段/分类缺失而失败,使用 Dev `make evidence` 保存原始 SELF 输出。不得用旧 r0.4 守卫测试的 PASS 代替新诊断测试。
- [ ] **Step 3: 最小 GREEN。** 在 `sseEventReader`/`emitParsed` 区分 `[DONE]`、扫描器 clean EOF、`sc.Err()`、坏 JSON 和取消;仅维护布尔、枚举与计数,参数字节数饱和到 `4*1024*1024+1`。为诊断先计算已收参数的对象 JSON 有效性,**再**运行原有“缺 `[DONE]` 必拒绝”的工具释放门禁,不能因 `ToolArgumentsValid=true` 绕过它。创建终态 Event 时附观察;`client.run` 对成功响应复制 `resp.StatusCode` 到终态,不读取或记录头/body。现有 `toolFinishExecutable` 与“缺 `[DONE]` 不发 ToolCalls”的顺序一字不放宽;`KindError` 路径也要给出可判定的失败类别,不伪造正常终态。
```go
type TerminalObservation struct {
ReadOutcome string
LastFrameJSONComplete bool
UsagePresent bool
ToolFragments int
ToolArgumentBytes int
ToolArgumentsValid bool
}
// 仅 llm.Event 追加:TerminalObservation *TerminalObservation
```
- [ ] **Step 4: 跑 GREEN 与兼容。** 重跑 Step 2;另跑 `GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./...`,重点复看合法多片工具、纯文本缺 `[DONE]` 的既有行为,以及 `runtime.Run` 的 Usage/不重试测试。测试诊断序列化后不含哨兵 prompt、工具名、参数原文。记录若当前 `client.go` 的 HTTP 状态只在错误事件有值,新增正常 200 不影响 fallback 选择。
- [ ] **Step 5: 提交 Agent-Native。** 仅提交该组件文件;描述 `Event` 的加法式 Go 契约及 Agent-Squad/Backend 固定指针依赖,不宣布供应商行为已修复。推送现有草稿 PR,核对它的准确 HEAD CI。
### Task 2: Backend 预启动材料的宿主确认
**Files:** `internal/runmgr/material.go`、新建 `internal/runmgr/material_ack.go` 与 `material_ack_test.go`、`internal/runmgr/runmgr.go`、`internal/runmgr/material_test.go`。**Interfaces:** 内部 `materialIntakeDecision{Note string, State materialIntakeState, CardID core.ID}`;`State` 仅为 `none|queued|running|reused_running|completed|failed|unknown`。`materialAckRunner` 实现已有 `runtime.Runner`,只消费可信附件数、工作重点是否存在与卡片状态。`completed`/`none` 继续原 runner;`queued|running|reused_running|failed|unknown` 走宿主确认,不请求前台 provider。
- [ ] **Step 1: 写 RED。** 用 `newCardSpawnEnv` 和实际 `Store` 增加 `TestMaterialAckAttachmentOnlyDoesNotCallParentModel`:三附件无文字时先建任务卡,再在同一对话 run 保存一条不含“剩余4项含3项依赖接口”的宿主消息;前台 stream 调用数 **0**,慢任务数 **1**,宿主消息不增加 `checkpointSeq`。`TestMaterialAckQueueAndReuse` 将三个后台槽占满再发送,断言卡为 queued、确认文案不称“正在执行”;同批重发只复用一张卡,后台刚完成但内存活动键尚未释放时以卡片终态为准。`TestMaterialAckPreservesUserFocusAndSmallPath` 断言文字+长材料的原文重点在 `buildMaterialTaskFor`,文字+小材料仍调用原 runner;完成态重发仍可进入普通问答。`TestMaterialAckSkipsSquadEntrypoint` 将 `runtime.entry=squad`,断言系统预启动分支也不调用小队 runner。`TestMaterialAckFailureAndUnknown` 注入注册/读卡错误,断言不称已启动、不追加模型请求。
```go
if parentProviderCalls != 0 || materialChildren != 1 || card.Task.CheckpointSeq != 0 ||
strings.Contains(visibleReply, "剩余 4 项(含 3 项依赖接口)") ||
!strings.Contains(visibleReply, "待确认") {
t.Fatalf("first reply is not a truthful host acknowledgement")
}
```
- [ ] **Step 2: 记录 RED。** `GOWORK=off go test ./internal/runmgr -run 'TestMaterialAckAttachmentOnlyDoesNotCallParentModel|TestMaterialAckQueueAndReuse|TestMaterialAckPreservesUserFocusAndSmallPath|TestMaterialAckSkipsSquadEntrypoint|TestMaterialAckFailureAndUnknown' -count=1`;旧实现会调用前台 runner/缺状态分流,预计失败。原始 SELF 收据经 Dev `make evidence`,不要手抄输出。
- [ ] **Step 3: 最小 GREEN。** 把 `materialIntake`、`materialExisting`、`materialSpawn` 的内部返回收敛为 `materialIntakeDecision`,更新同包调用和现有测试;从已注册的、同 owner/project/inputRevision 的卡片读取 queued/running/terminal 状态,读不到就 `unknown`,不靠中文 note 判断分支。`startClaimedRun` 在 `materialIntake` 后按 `State` 将 `runner` 替换为 `materialAckRunner`;该 runner 发一次既有 `EvRunPhase(Responding)`/`EvMessageDelta`,再用 `SetAssistantParts` 交给 `finishRun` 正常持久化。短文案只用可信附件数/状态,并明确未经核对的关系“待确认”;失败态提示可重新提出请求但不自动重试。原始模型候选不调用、不进入事件、转录或后续上下文。`none`/`completed` 保留原模型入口;`ensureMaterial` 的文字+小材料兜底继续原路径。
```go
type materialIntakeState string
const (
materialNone materialIntakeState = "none"
materialQueued materialIntakeState = "queued"
materialRunning materialIntakeState = "running"
materialReusedRunning materialIntakeState = "reused_running"
materialCompleted materialIntakeState = "completed"
materialFailed materialIntakeState = "failed"
materialUnknown materialIntakeState = "unknown"
)
func (s materialIntakeState) needsAcknowledgement() bool {
return s == materialQueued || s == materialRunning || s == materialReusedRunning ||
s == materialFailed || s == materialUnknown
}
decision := m.materialIntake(rc)
rc.materialNote = decision.Note
if decision.State.needsAcknowledgement() {
runner = materialAckRunner{decision: decision, attachmentCount: len(rc.attachments), hasUserFocus: messageText(rc.userMessage) != ""}
}
```
- [ ] **Step 4: 跑 GREEN 与并发。** 重跑 Step 2,再跑 `GOWORK=off go test -count=1 ./internal/runmgr ./internal/runtime ./internal/cardsvc` 与 `GOWORK=off go test -race -count=1 ./internal/runmgr -run 'TestMaterialAckQueueAndReuse|TestMaterialIntakeAttachmentOnlyLifecycle'`。核对授权关闭、无附件、任务注册失败、取消、重启后的活动卡去重、原已有完成结果、任务来源版本变化与后台 notice;宿主确认不能被通知当作最终整理正文或建议列表。
- [ ] **Step 5: 提交 Backend 快反馈单元。** 只提交此任务相关文件,保留消息/卡片的现有 Core 契约;说明首回合少一次模型请求及其 Usage 可比性变化,不把普通小材料问答标成已整改。
### Task 3: 受控评测的无内容记录与停止规则
**Files:** `internal/server/work_checkpoint_eval_test.go`、`internal/server/work_checkpoint_eval_budget_test.go`。**Interfaces:** 消费 Task 1 `Event.TerminalObservation`、既有 `FinishReason`/`StreamComplete`/`Usage`/`HTTPStatus`;`provider-records.json` 保留 `runId`、调用号、输出上限、返回 Usage、结束原因及诊断标量,移除以后样本里的 `messages`、`toolDeclarations` 和原样 `terminal`。历史 r0.4 文件哈希不变。
- [ ] **Step 1: 写 RED。** `httptest` 分别返回带 `[DONE]` 的合法工具调用、正常 EOF 无 `[DONE]` 且 JSON/Usage 合法、半帧 JSON、读错误、缺 Usage。新增 `TestEvaluationRecordsContentFreeTerminal`:将哨兵 `PRIVATE_PROMPT_R05` 放入请求消息、`PRIVATE_ARGUMENT_R05` 放入工具参数,断言新 `provider-records.json` 不含两串和原始 `messages`/`toolDeclarations`/`terminal` 键,但有 run ID、调用号、`readOutcome`、`usagePresent`、`reportedTokens`。`TestEvaluationStopsAfterUnmarkedToolEOF` 与 `TestEvaluationStopsWhenTerminalRecordUnavailable` 分别断言无 `[DONE]` 和 0600 写入失败后第二次 provider 调用数仍为 **0**;已返回 Usage 必须保留。
```go
raw, err := os.ReadFile(filepath.Join(dir, "provider-records.json"))
if err != nil { t.Fatal(err) }
if bytes.Contains(raw, []byte("PRIVATE_PROMPT_R05")) ||
bytes.Contains(raw, []byte("PRIVATE_ARGUMENT_R05")) ||
bytes.Contains(raw, []byte(`"toolDeclarations"`)) {
t.Fatal("evaluation record contains model payload")
}
```
- [ ] **Step 2: 记录 RED。** `GOWORK=off go test -tags live ./internal/server -run 'TestEvaluationRecordsContentFreeTerminal|TestEvaluationStopsAfterUnmarkedToolEOF|TestEvaluationStopsWhenTerminalRecordUnavailable' -count=1`。只运行这些本地假 provider 测试;**不得**用无 `-run` 的 live-tag 命令误启动 `eval/live/TestWorkCheckpoints`。
- [ ] **Step 3: 最小 GREEN。** 在 `evalProviderStreamWithProvider` 的“先关流、落 Usage/停止记录、再释放终态”顺序内生成只含标量的记录;`terminal==nil` 时使用有限的 `missing_terminal` 类别,错误信息仅记录枚举,不保存 `Err.Error()` 的可能敏感原文。`terminalFault`、`usageUnknown`、`checkpointRejected`、批次与单 run 上限继续在下次请求前拒绝。记录写入失败则终态不执行工具、下一次请求继续被本地拒绝;原始历史记录不迁移。
```go
type evalCallRecord struct {
RunID string `json:"runId"`
Call int `json:"call"`
OutputCap int `json:"outputCap"`
ReportedTokens int `json:"reportedTokens"`
FinishReason string `json:"finishReason"`
StreamComplete bool `json:"streamComplete"`
Observation *agentllm.TerminalObservation `json:"terminalObservation,omitempty"`
FailureClass string `json:"failureClass,omitempty"`
}
// 不再包含 messages、toolDeclarations 或整个 terminal Event。
```
- [ ] **Step 4: 跑 GREEN 与控制组。** 重跑 Step 2,再跑 `GOWORK=off go test -count=1 ./...`;仅用精确正则执行 `GOWORK=off go test -tags live ./internal/server ./eval/live -run 'TestEvaluationRecordsContentFreeTerminal|TestEvaluationStopsAfterUnmarkedToolEOF|TestEvaluationStopsWhenTerminalRecordUnavailable|TestFollowupA01KeepsItsOwnOneShotResult|TestFollowupA01UsesNewBoundedAuthorization' -count=1`。保存合法 `[DONE]` 工具调用成功、纯文本缺标记仍按旧行为且诊断清楚、坏工具终态失败三种记录,不能把诊断字段出现当作质量 PASS。
- [ ] **Step 5: 提交 Backend 诊断单元。** 与 Task 2 合并前确认没有 `messages`、原始终态或工具参数在新的评测文件中,且 A01 标签/路由/模型预算没有变化。推送 Backend 草稿 PR 并核对准确 HEAD CI。
### Task 4: 用户链零付费组合重放
**Files:** Backend `internal/runmgr/material_notice_failure_test.go`、`internal/server/work_checkpoint_eval_test.go`;Frontend `e2e/work-checkpoints.playwright.ts`。**Interfaces:** 只通过现有 HTTP 消息、run、卡片、事件及 `TaskSnapshot` 观察 Task 2/3;不新增前端状态所有者或 API 字段。
- [ ] **Step 1: 写 RED。** 在 `e2e/work-checkpoints.playwright.ts` 的 `Scenario` 联合类型中增加 `fast-ack`,并在任务自有 HTTP 假流夹具加入“附件仅发送”“文字+长材料”“三个槽位已满”“同批重发”“启动失败”“已完成复用”“文字+小材料”场景;浏览器先断言宿主确认在原对话可见、任务卡在右侧同一入口、未出现无依据的 `剩余4项含3项依赖接口`、宿主确认不增加 finding/checkpoint。文字+小材料断言仍有原直连答复;后台失败零发现、部分成果、成功建议选择仍按 r0.4 规则。先让新增用例在旧前台模型路径失败,保存 SELF RED。
```ts
test('attachment-only material intake shows a safe first reply', async ({ page, request }) => {
const seed = await setup(request, 'fast-ack', false)
await open(page, seed)
await expect(page.getByText(/已收到.*份材料.*待确认/)).toBeVisible()
await expect(page.getByText(/剩余\s*4\s*项.*含\s*3\s*项依赖接口/)).toHaveCount(0)
const card = (await (await request.get(manifest.base + `/api/conversations/${seed.conv.id}/cards`)).json()).cards.find((c: any) => c.task)
expect(card.task.checkpointSeq).toBe(0)
})
```
- [ ] **Step 2: 完成受控机制夹具。** Backend 夹具在每个场景使用新的隔离 SQLite、固定三份合成文本与人工 SSE;父回合计数器记录 provider 调用数,子回合按场景给合法 `[DONE]`/阶段工具/失败终态。保留实际 HTTP 的 owner/project 与来源哈希核验;不把 fixture 中的 `reading`/`crosscheck` 当成真实模型遵循顺序的证明。
```go
// 每个 scenario 使用新 dataDir;stream 只连 httptest.Server。
parentCalls := atomic.Int32{}
parentStream := func(ctx context.Context, model string, messages []agentllm.Message,
tools []agentllm.ToolDecl, opts agentllm.StreamOptions) <-chan agentllm.Event {
parentCalls.Add(1)
out := make(chan agentllm.Event, 1)
out <- agentllm.Event{Kind: agentllm.KindMessageEnd,
Message: agentllm.Message{Role: agentllm.RoleAssistant, Content: "本地夹具答复", StopReason: agentllm.StopEnd},
Usage: agentllm.Usage{PromptTokens: 2, CompletionTokens: 1, TotalTokens: 3}, StreamComplete: true}
close(out)
return out
}
// 自动材料入口完成后断言 parentCalls.Load()==0;文字+小材料对照为 1。
```
- [ ] **Step 3: 跑 GREEN 与视觉回归。** 启动本任务独有的 mechanism 二进制和数据目录,manifest 固定 PID、可执行文件 SHA、Dev/Backend/Agent-Native/Frontend SHA、模式与地址;先用 manifest 的 `pid` 核查对应 `/proc/` 可执行文件和目录归属,再将 manifest 的 `base` 设为 `PLAYWRIGHT_BASE_URL`、manifest 路径设为 `WORK_CHECKPOINT_HTTP_MANIFEST`,运行 `npx playwright test e2e/work-checkpoints.playwright.ts`。至少覆盖 1440px 桌面与 390px 窄屏:默认只见短确认,任务卡阶段发现、来源、失败和选择卡按现有层级展示,刷新和后台更新不抢文件、输入焦点或阅读位置;禁止新增命令/SSE 展示。只停止任务自有 PID,保留 trace/截图及 SELF 收据。
- [ ] **Step 4: 隔离 PG 与完整 Backend。** 使用本任务独有的 PostgreSQL/Redis 实例和 DSN(不能连接既有服务),先验证实例 PID、数据根和数据库身份;设置 `AGENT_PG_TEST_DSN`、`AGENT_REDIS_TEST_ADDR` 后运行 `make test-backend-pg`,缺变量不得跳过。另运行 Backend `GOWORK=off go vet ./... && GOWORK=off go test -count=1 ./...`,以及纯文档/Frontend 受影响的正常路径。记录失败与修复版本;PG 和 SQLite 都核对 seq、宿主消息、来源卡和失败 Usage。
- [ ] **Step 5: 提交实际测试增量。** Backend/Frontend 只提交本单元实际新增的夹具与浏览器测试;若需要改 Frontend/UI 生产组件才能表达正确状态,停止该部分,补设计与计划评审,再读 `DESIGN.md`、固定 `@ui` 令牌 PR 和设计守护测试。真实模型质量继续 `NOT_RUN`。
### Task 5: 固定跨仓候选、复审与资源出口
**Files:** Agent-Squad `deps/agent-native`、Backend `deps/agent-native`、Dev `deps/agent-native`/`deps/agent-squad`/`modules/backend`/可选 `modules/frontend`、`.task/feature-fast-slow-u2-u3-plan.md`、`PROJECT.md`、Documents 的核验报告。**Interfaces:** 公开 Core/HTTP/TaskSnapshot 不变;准确 gitlink 与运行 manifest 是唯一测试对象。
- [ ] **Step 1: 按依赖提交并固定。** Agent-Native 先提交并推送准确 SHA;Agent-Squad 在自己分支固定同一 SHA,完整 Go vet/test 后提交;Backend 固定嵌套 Agent-Native(及现有 Core)并完成 Task 2/3/4 的全量测试后推送;Frontend 如只改 e2e 则提交相应用例。Dev 最后暂存全部新 gitlink,先跑 `make test-pins`,再用 `CMD='make test && make build' make evidence` 保存组合;禁止用 detached 嵌套检出的未提交代码冒充可交付组件。
- [ ] **Step 2: 记录最小重放集。** 任务卡列明 r0.5 需求/设计/用例/结果矩阵:`[DONE]` 与 EOF、半帧、读取错误、缺 Usage、queue/reuse/failed/completed、附件仅发送、文字+长/小材料、0/部分/两批成果、刷新与来源版本。每条标 `SELF`/`REPLAY`/`GATE`,旧 r0.4 A01 继续 FAIL;新真实模型 A01 为 `NOT_RUN`。文档补齐精确 SHA、原件保存路径和已知限制,不写未经验证的供应商终态原因。
- [ ] **Step 3: 独立复审与当前 HEAD CI。** 请求审核前、验收前、将来合入前各用 `CMD='make task-sync' make evidence` 纳入最新权威 main;同步若改变代码、依赖、配置或 head,按影响重跑 Task 1–4 与组合。独立审阅者重放终态无内容记录、坏工具零执行、前台零 provider、队列/失败真实性、原文归属、Usage 与脚本权限,整改到无 Critical/Important。逐仓核验 Agent-Native、Agent-Squad、Backend、适用 Frontend 及 Dev 的准确 HEAD CI,Dev 的 `test`、`test-pg`、`svc-realcombo` 全部作业/步骤均须 GATE 成功;源外 RECEIPT 留固定后检查。
- [ ] **Step 4: 提交阶段 6 人工评审。** 交付零付费候选、实际 HTTP/浏览器和 PG 的 SELF、独立 REPLAY、准确 HEAD GATE、未解决风险与八个草稿 PR 链接。用户仅评审 r0.5 实施候选;即使代码机制 PASS,仍不等于真实模型质量、阶段 7 或合入批准。没有人工阶段 6 结论,不进入资源决策。
- [ ] **Step 5: 单独资源决策,不自动跑 A01。** 先判断无内容终态诊断是否仍不能证明缺 `[DONE]` 的工具流可安全执行。若不能,记录“工具仍保守失败”,向用户提交独立的、受限供应商终态探针或后续设计修订选择;**不得**直接复用 r0.4 A01 额度、放宽门禁或自动再跑。仅在后续必要设计/计划评审和单独资源提案获批、质量候选固定后,才按实际授权的 run/token/时间/输出/停止边界执行新真实模型对照。真实质量 PASS 后仍须阶段 7 人工验收,随后才按 Dev 策略做最终 Review、准确 HEAD CI、串行 PR 合入、合入核验与安全回收;质量 FAIL 则保持全部 PR 草稿。
## 计划自检与停止条件
- 本计划的终点是**可审阅的零付费实施候选**和阶段 6 材料;当前用户只授权编写计划,Task 1–5 的代码与测试均 `NOT_RUN`。不得将本计划的绿色文档 CI、未来单测或假流当成真实 A01 通过。
- Task 1 的观察字段只增加无内容诊断,不更改 `toolFinishExecutable`;Task 2 只接管预启动首回合,保持用户重点与既有消息合同;Task 3 先持久 Usage/故障记录再放终态;Task 4 以真实 HTTP/浏览器检验用户看到的内容;Task 5 只固定实际提交的组件与证据。接口消费和责任边界按此顺序复核。
- 任何需要接受无 `[DONE]` 的工具请求、增加模型调用、变更公开消息/TaskSnapshot 契约、数据库迁移、扩大权限或改变验收标准的发现,立即停止受影响实现,返回书面设计与计划人工评审;未受影响的零付费调查可继续。任何付费请求必须另有明确资源批准,失败不自动重跑。
@@ -0,0 +1,51 @@
# U3 r0.6:当前路由的传输完成性证据设计
状态:**书面设计已获阶段 4 人工评审通过。** 用户先于 2026-10-14 的同会话答复“认可证据优先,写设计(推荐)”,随后审阅 Documents `54d39ef13034b2ce84cb84681566ea21311f79a0`、Dev `89125b8dda5f8f988a8a760ed64bf00827e1de5c` 的文稿及准确 HEAD CI,并明确答复“批准设计,继续实施计划”。该批准只允许编写详细实施计划;**不授权产品代码、额外付费请求、A01 复验、合入或部署。** 本次状态行仅记录评审结论,不改已批准设计的技术取舍。负责人 weichen;目标仍是让非专业用户在同一张任务卡上先看到可信收件反馈、再看到有来源的两批阶段成果和准确最终正文。既有[U2/U3 主计划](2026-10-13-fast-slow-u2-u3-plan.md)、[r0.5 设计](2026-10-14-fast-slow-u3-r05-terminal-evidence-and-fast-feedback-design.md)、[核验报告](../reports/2026-10-13-fast-slow-u2-u3-validation.md)及 Dev `feature/fast-slow-u2-u3-plan` 任务卡是本设计的上下文;本版只处理阻断后台工具流的终态归因,不重新设计界面或降低业务质量标准。
## 事实、问题与目标
r0.4 A01 在固定候选上有两次付费 run、三次 provider 调用,工具流返回 `tool_calls` 和 Usage,但客户端未见 `[DONE]`;工具安全拒绝,质量 FAIL。r0.5 随后保留严格门禁、增加无内容终态观察,并把自动材料入口首回合改成可信宿主确认。其零付费实施与阶段 6 已获人工确认。用户另行批准的**唯一**小型 MiniMax-M3 工具流探针在 Dev `0959e1c1566df9766878b2122eccc0ab42af10a3` 上返回 HTTP 200、`finishReason=tool_calls`、`ReadOutcome=clean_eof`、最后一帧已观察到的 JSON 完整、返回 Usage **513 tokens**,但 `StreamComplete=false`,工具放行/执行 **0/0**。一次性授权已消耗,不得补跑;见[作者判定](/tmp/fast-slow-u3-r05-20261014/probe-result-assessment.md)和[独立结果复核](/tmp/fast-slow-u3-r05-20261014/probe-result-independent-assessment.md)。本设计中的“当前路由”只指该探针 `SELF` 预检核对的 MiniMax-M3、`api.minimaxi.com/v1`、无 fallback,受保护路由文件 SHA-256 `2a92569d2416d74e8d07029219af88474cb6f860c2aa897a5ffdd10fcbe9b495`;身份漂移即重新评审,不复制或公开 API key。r0.5 真实 A01 仍 **NOT_RUN**,八个 PR 仍为草稿。
这一次短工具请求重现了“有结束原因和 Usage,但未见 `[DONE]`”的**客户端观察**,排除了“只在三材料长任务中才出现”作为必要条件;它没有原始 SSE、HTTP 尾部元数据或供应商侧记录,无法判断服务端未发送、传输途中结束,还是适配器漏认。`clean_eof` 表示读取器没有报告扫描错误;它不证明供应商已交付预期的全部 SSE 事件。当前 [MiniMax Chat Completions API 文档](https://platform.minimax.cn/docs/api-reference/text-chat-openai)列出流式、工具和 Usage 字段,但没有在这页给出该路由以字面 `[DONE]` 结束工具流的可核验契约;不能把 OpenAI 兼容接口的惯例当作该路由的事实。
本版要回答两个分开的判断:**HTTP 响应体在客户端边界如何结束?SSE 应用层是否有经证实的完整工具调用终态?** 成功标准是形成可重放、无内容的诊断与决策证据,减少原因的不确定性;本版不承诺 r0.6 代码一落地就让工具流成功,也不把一次小探针等同于 A01 质量验收。
## 方案取舍
| 路线 | 能回答什么 | 代价与结论 |
|---|---|---|
| **A. 当前路由上分层观察 HTTP 读取与 SSE 终态,先保守拒绝** | 区分已知长度、分块、HTTP/2、关闭分隔等响应体结束类型;定位解析器是否漏认本地合法终止形式 | **推荐。** 零付费重放先行;真实路由若仍缺应用层契约,保持拒绝,再单独评审兼容规则或替代路由 |
| B. 直接换成另一个终态已验证的模型路由 | 可能绕开当前路由的兼容性问题 | 需要新模型质量基线、路由配置与资源评审;当前证据不足以指定替代对象,作为 A 无法得到可信终态时的后备方向 |
| C. 将 `clean_eof + tool_calls + Usage + JSON` 直接等同 `[DONE]` | 可能放行这类响应 | **不采纳。** 已观察到的最后一帧完整不等于整条业务流完整;尾帧缺失仍可能留下看似合法的参数 |
选择 A 不排斥后续 B。只有在明确证据与另行批准下,才能提出限路由的等价终态;本设计本身不定义一个可直接放行的 EOF 组合。
## 职责、数据流与隐私
Agent-Native 的 `Client.Stream` 已拿到 `http.Response`,`ParseSSE` 已拥有 `[DONE]`、`finishReason`、Usage、帧完整性与工具片段观察;**只有 Agent-Native** 可以在同一次调用中把两层事实关联成一条有界终态观察。Backend 只按现有 run ID/调用序号消费分类和 Usage,保留 r0.5 的拒绝后停止、预算和归档规则。Frontend/UI 沿用已实现的“整理中/未完成/待确认”、同一张任务卡、来源和失败展示;默认不显示协议字段、命令或 token。异步事件仍由原所有者按 seq 丢弃过期项,诊断记录不能成为另一个进度状态源。
建议在 Agent-Native 的内部终态观察中增加**有限枚举与饱和计数**,而非另存一份响应:
- HTTP 层:状态码、协议大类 `http1|http2|other`、响应体定界类别 `known_length|chunked|http2_stream|close_delimited|unknown`、声明长度是否存在、客户端实际读取字节数的有界计数、是否到达 `io.EOF`、读取错误类别、是否发生自动解压。已知长度时可给出“读取字节数与声明长度相符/不符”;未知长度不得伪造相符结论。Go [`net/http.Response`](https://pkg.go.dev/net/http#Response) 暴露 `ContentLength`、`TransferEncoding`、协议版本及 `Uncompressed`,并说明 `Body` 在读取时流式返回;这些字段支持**客户端边界**的分类,不暴露供应商上游到代理之间的完整性。
- SSE 层:沿用 `done_marker|clean_eof|read_error|cancelled|invalid_frame`、`StreamComplete`、受限 `finishReason`、Usage 是否存在及数量、最后一个**已观察**帧是否完整;只增加尾部事件的结构类别与有界计数,如 `done_literal|json_frame|empty_data|comment|unknown_non_json|partial_frame`,用于区分本地解析遗漏与真正未见标记。**不记录未知帧文字、尾部字节、原始 SSE 或其内容哈希。**
- 工具边界:分别记录“工具片段存在”“ID/名称齐全”“参数为 JSON 对象”“放行/实际执行次数”。现有 `ToolArgumentsValid` 只证明 JSON 对象可解析,不能偷换成 schema 或业务语义有效;本版不顺带新增工具 schema 校验器。缺 `[DONE]`、读取错误、取消、半帧、身份/参数不完整时仍为零放行、零执行。
所有字段只允许枚举、布尔和饱和计数;HTTP header/trailer 的名称与值、URL 查询、IP、请求 ID、证书细节、正文、思考、工具名及参数、prompt、API key、原始错误句均不入日志、评测记录或 UI。响应体计数只在流式读取时累计字节,不额外缓冲或复制模型内容。评测文件仍置于任务自有 0700 目录、0600 文件,保留期限沿现有受控评测清理规则;若需新增内部持久字段,实施计划须明确存储 owner、模式兼容与清理期限。公开 Core/HTTP/TaskSnapshot 合同和数据库表默认不变;发现必须改变时回到本设计重审。
`net/http` 可能自动解分块或解压,某些传输细节在 `Response.Body` 之上已不可见。实现计划应先用本地实验确定哪些字段能可靠观察;**不能观测就记 `unknown`**,不能为了满足一张表而声称看到了原始 HTTP 分块终止符或 HTTP/2 帧。响应体按协议完整读到 EOF,也只证明客户端收到的**响应体**结束,不能单独证明提供方本来就打算结束业务 SSE。真实路由的上游代理与供应商侧仍需外部契约或受控证据,不由客户端元数据代签。
## 决策规则与失败恢复
本版实现目标是**诊断,不放宽执行门禁**。终态首先按现有规则确定能否释放工具;新观察字段只给出原因与证据等级,不参与 `toolFinishExecutable` 的放行条件。非工具纯文本目前可以在缺 `[DONE]` 时按旧行为结束,但必须独立标注,不能把文本容忍路径借给工具。已返回 Usage 继续记账;诊断写入失败时保持原失败与停止决定,不让观察故障触发重试。取消、读错或多终态按保守失败处理;单次模型请求最多产生一条受限终态收据,Backend 不建立第二个状态所有者。
后续若要**提出**当前路由的等价终态规则,至少需要同时满足:① 可复核的供应商契约或该路由、模型、版本的授权外部证据,明确没有字面 `[DONE]` 时怎样表示业务完成;② 本地解析器能识别所约定的终止形式,并有正常、截断、半帧、缺 Usage、重定向/错误、取消的正反例;③ 客户端可区分响应体按协议结束与未知关闭,工具身份和参数完整性可验证,预算与停止门禁仍成立;④ 该规则只绑定经核验的路由身份,不对其他 OpenAI 兼容服务泛化。若还需声明 schema 校验,应在该轮方案中明定,不从当前 JSON 对象有效性推得。满足这些条件只进入**另一轮方案/计划评审**,不能自动改代码放行。若外部契约缺失、传输完整性未知或证据彼此矛盾,保持工具拒绝,并评估替代路由;不得因本次 513-token 探针成功返回 Usage 而补跑 A01。
## 零付费验证与阶段出口
详细实施计划获批前,本节只规定验收边界,不分派代码任务:
1. 本地 `httptest`/TLS HTTP/2 假流覆盖有 `[DONE]`、无 `[DONE]` 的完整 JSON、已知长度与字节不符、合法 chunked、连接中断、HTTP/2 正常结束、关闭分隔未知、自动解压、半帧、尾部非 JSON、缺 Usage、重定向、取消。对每例核对 HTTP 与 SSE 分层分类、已返回 Usage、工具放行/执行次数和后继请求数;至少一组证明“响应体按协议结束但无应用终止契约”仍拒绝工具。
2. 以哨兵正文、思考、工具名、参数、header/trailer、凭据与未知错误文字扫描新终态记录、日志和浏览器可见面;不得出现这些原文。计数边界、负值/溢出、未知枚举和多终态都须保守。正常 `[DONE]` 工具调用与 r0.5 快通道确认、排队/失败卡、来源跳转、刷新及按 seq 更新不得回退。
3. 固定 Agent-Native 与消费它的组件 SHA 后,做组件测试、Dev 组合 `make test && make build`、适用的真实 HTTP/浏览器及隔离 PostgreSQL 回归、独立重放和准确 HEAD CI;`SELF`、`REPLAY`、`GATE` 分开标注。零付费测试只证明观测机制,不证明 MiniMax 真实流或 A01 质量。真实模型、供应商账单和业务成果均标 `NOT_RUN`,直至另获资源批准。
阶段 4 的用户结论已记录在文首;现进入**详细实施计划编写**,计划仍待阶段 5 人工评审。计划获批后才可零付费改代码和验证。任何新付费探针或 A01 都须在固定新候选、单独资源提案与明确批准后进行;r0.5 一次性授权不能沿用。真实 U3 质量仍要求两条在终态前可感知且有用、有来源的阶段成果、准确完整最终正文及全部调用 Usage/停止规则,宿主收件确认不计入两条。质量未通过时八个 PR 保持草稿,不合入或部署。
@@ -0,0 +1,257 @@
# U3 r0.6 Transport Completion Evidence Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 在当前 MiniMax-M3 工具流上留下可重放、无内容的 HTTP 响应体与 SSE 业务终态分层证据,同时保持缺 `[DONE]` 时工具零执行。
**Architecture:** Agent-Native 在现有 `Client.Stream → ParseSSE` 链路里流式计数响应体并归类最后的 SSE 结构,合成一条只含有限枚举、布尔和饱和计数的 `TerminalObservation`。Backend 受控评测白名单归一化该观察,与实际 run ID、调用号和 Usage 一起落到受限记录;普通用户界面仍只展示任务卡的真实状态与有来源成果。此版不把 HTTP EOF 变成工具放行条件,也不修改模型路由或加请求。
**Tech Stack:** Go 1.27、`net/http`/`httptest`、Agent-Native OpenAI 兼容 SSE、Backend 受控评测与 SQLite、任务自有 Playwright 机制实例、Dev 组合测试和 Gitea CI。
**Spec:** [已获阶段 4 人工批准的 r0.6 书面设计](2026-10-14-fast-slow-u3-r06-transport-completeness-design.md)。批准对象 Documents `54d39ef13034b2ce84cb84681566ea21311f79a0`、Dev `89125b8dda5f8f988a8a760ed64bf00827e1de5c`;用户答复“批准设计,继续实施计划”。本计划本身**待阶段 5 人工评审**;该答复只授权编写计划,不授权以下代码步骤、付费探针、A01、合入或部署。
## Global Constraints
- 范围固定为已核验的 MiniMax-M3、`api.minimaxi.com/v1`、无 fallback 的路由身份(保护文件 SHA-256 `2a92569d2416d74e8d07029219af88474cb6f860c2aa897a5ffdd10fcbe9b495`)。代码观察可以复用在 OpenAI 兼容客户端,但**解释与未来兼容决策只针对该路由**;路由字节或模型改变须重新评审。不得把 API key、路由文件原文或供应商数据写进仓库与收据。
- 保持 `toolFinishExecutable` 原有判据:缺 `[DONE]`、读错、取消、半帧、工具身份或 JSON 对象参数不完整时,不释放或执行工具;不新增自动重试、补参数、模型回退、摘要模型调用或额外 provider 回合。文本缺标记的既有容忍路径不得扩给工具。
- 新观察只保存有限枚举、布尔和饱和计数。不得保存原始 SSE/尾部字节及其内容哈希、正文、思考、prompt、工具名/参数、HTTP header/trailer 名称或值、URL 查询、IP、请求 ID、证书细节、API key、原始错误句。诊断不进入普通用户 UI,异步状态仍由原所有者按 seq 处理。
- Agent-Native 的终态事件是唯一诊断来源;Backend 只白名单消费并保留已返回 Usage、实际 run ID、停止边界。既有公开 Core/HTTP/TaskSnapshot 合同、数据库表、前端状态 owner、r0.5 宿主确认及来源判定不改。若证明必须改公开契约、权限、持久模式或 UI,停止受影响单元,返回设计评审;UI 修改前先读 Dev `DESIGN.md` 并使用 `@ui` 令牌/原语。
- r0.5 唯一付费探针已消耗授权,结果 `incomplete_terminal`、返回 Usage 513、工具 0;r0.4 A01 仍 FAIL,r0.5 真实 A01 仍 `NOT_RUN`。本计划实施阶段只跑假流、真实本地 HTTP/浏览器与隔离 PG/CI,不运行 `TestWorkCheckpoints`、不使用 `WORK_CHECKPOINT_SERVER_MODE=model`、不读取保护路由 key。新的供应商试验和 A01 均须候选固定后另交资源提案并获明确批准。
- 每个源代码单元先 RED、再最小 GREEN、再组件测试与提交;证据经 Dev `make evidence` 保存,例如 `RECEIPT=/tmp/fast-slow-u3-r06-task1-red.json CMD='GOWORK=off go -C deps/agent-native test ./runtime/llm -run TestClientBodyBoundary -count=1' make evidence`,来源为 SELF。每次换一个未使用的收据路径。独立审阅重跑为 REPLAY;准确 HEAD CI 为 GATE。正式用户验收与所有 PR 合入仍在后续阶段,八个 PR 维持草稿。
## Review Focus
以下五类容易被“有 EOF/有 Usage”掩盖的输入必须由相应任务的测试直接覆盖:
1. 声明长度大于实际响应体:`TestClientBodyBoundaryShortRead`(Task 1)应记读取错误或长度不符,仍零工具。
2. 自动 gzip 解压使线上长度不可直接比:`TestClientBodyBoundaryUncompressed`(Task 1)应记长度关系 `unknown`,不能伪造匹配。
3. 合法 `[DONE]` 在客户端未读到 HTTP EOF 前出现:`TestClientDoneDoesNotNeedBodyEOF`(Task 1)应维持原有合法工具终态,不把新观测变成额外放行门槛。
4. Usage 后出现注释、空 `data:`、未知非 JSON 或半帧:`TestSSETailStructure`(Task 2)只记结构类别,不泄漏原文;缺 `[DONE]` 的工具仍零释放。
5. 上游或测试注入未知枚举、负数、超上限计数:`TestEvaluationTransportObservationSanitized`(Task 3)应归 `unknown`/钳制计数,不让供应商可控文字入评测记录。
## File Ownership Map
| 文件/组件 | 单一职责 |
|---|---|
| Agent-Native `runtime/llm/body_observation.go`、`client.go` | 只观察 HTTP 响应体读取与有限传输类别,不碰 SSE 内容或工具准入 |
| Agent-Native `runtime/llm/sse.go`、`types.go` | SSE 尾部结构、现有 `[DONE]` 门禁及一个终态观察合同 |
| Backend `internal/server/work_checkpoint_eval_test.go` | 在既有受控评测记录边界深拷贝并白名单化 Agent-Native 标量 |
| Agent-Squad/Backend/Dev gitlinks | 使各消费方固定同一已提交 Native SHA;Dev 验证真实组合 |
| Frontend 既有 Playwright 文件 | 只重放用户可见状态;本计划不修改前端生产代码 |
---
### Task 1: Agent-Native 流式 HTTP 响应体观察
**Files:**
- Create: `deps/agent-native/runtime/llm/body_observation.go`(只计数和归类,不缓冲响应内容)
- Modify: `deps/agent-native/runtime/llm/types.go`(`TerminalObservation.BodyBoundary` 加法字段)
- Modify: `deps/agent-native/runtime/llm/client.go`(在既有响应上附观察,不改请求体/重定向/重试)
- Test: `deps/agent-native/runtime/llm/client_test.go`
**Interfaces:** `TerminalObservation.BodyBoundary *BodyBoundaryObservation`;`BodyBoundaryObservation` 只包含 `ProtocolClass`(`http1|http2|other`)、`FramingClass`(`known_length|chunked|http2_stream|close_delimited|unknown`)、`DeclaredLengthKnown`、饱和的 `BytesRead`、`BytesSaturated`、`EOFSeen`、`LengthRelation`(`match|mismatch|unknown`)及 `Uncompressed`。`ParseSSE(ctx, io.Reader)` 的签名、`Event.StreamComplete` 和工具门禁不变;独立调用 `ParseSSE` 时 `BodyBoundary=nil`。
- [ ] **Step 1: 写 RED。** 在 `client_test.go` 增加上述三个 Review Focus 测试与 `TestClientBodyBoundaryChunkedAndHTTP2`。用 `httptest.NewServer` 显式设置正确/过长 `Content-Length`,用 `Flush` 生成 chunked,`httptest.NewUnstartedServer`+`EnableHTTP2`+`StartTLS` 生成 HTTP/2;gzip 用 `gzip.NewWriter` 返回压缩体。`TestClientDoneDoesNotNeedBodyEOF` 复用本文件已有的 `terminalRoundTripFunc`,返回含 `[DONE]`、但不要求随后读取到 `io.EOF` 的本地 `http.Response`,避免依赖真实网络调度。工具帧为本地固定 JSON;无 `[DONE]` 的用例必须同时断言 `len(end.Message.ToolCalls)==0`、返回 Usage 不丢、HTTPStatus 200。合法 `[DONE]` 用例必须保留当前可释放的 ToolCalls。测试只用本地假响应,不使用保护路由。
```go
// 关键断言形状;同一表驱动覆盖已知长度、chunked、HTTP/2、gzip、短读。
if end.TerminalObservation == nil || end.TerminalObservation.BodyBoundary == nil {
t.Fatal("missing body boundary observation")
}
body := end.TerminalObservation.BodyBoundary
if body.FramingClass != wantFraming ||
body.LengthRelation != wantLengthRelation || body.EOFSeen != wantEOF {
t.Fatalf("wrong body boundary: %+v", body)
}
if !wantDone && (end.StreamComplete || len(end.Message.ToolCalls) != 0) {
t.Fatalf("unfinished tool stream was released: %+v", end)
}
```
- [ ] **Step 2: 记录 RED。** 在 Dev 工作树运行 `GOWORK=off go -C deps/agent-native test ./runtime/llm -run '^(TestClientBodyBoundary.*|TestClientDoneDoesNotNeedBodyEOF)$' -count=1`,由 Dev `make evidence` 保存原始 SELF 失败;预期因 `BodyBoundary` 字段/分类尚不存在而编译失败,不改测试绕过。
- [ ] **Step 3: 最小 GREEN。** 在 `types.go` 定义上面的导出结构;`body_observation.go` 用 `io.Reader` 包装 `resp.Body`,仅对 `Read` 返回的 `n` 累加,饱和上限 `32*1024*1024+1`,记录 `io.EOF`,绝不复制 `p[:n]`。以 `resp.ProtoMajor`、`ContentLength`、`TransferEncoding`、`Close` 和 `Uncompressed` 归类;已知长度只在未自动解压、未饱和且读到 EOF 时比较,其他情况记 `unknown`。`client.run` 对一次 `http.Client.Do` 的成功响应把计数器传给 `ParseSSE`,只在终态事件附上快照;HTTP 错误/请求前错误仍保留原错误分类。
```go
type BodyBoundaryObservation struct {
ProtocolClass, FramingClass string
DeclaredLengthKnown bool
BytesRead int64
BytesSaturated, EOFSeen bool
LengthRelation string
Uncompressed bool
}
// 现有 TerminalObservation 追加:BodyBoundary *BodyBoundaryObservation `json:"bodyBoundary,omitempty"`
```
- [ ] **Step 4: 跑 GREEN 与边界。** 重跑 Step 2;再从 Dev 运行 `GOWORK=off go -C deps/agent-native vet ./runtime/llm` 与 `GOWORK=off go -C deps/agent-native test ./runtime/llm -count=1`。补一例关闭分隔/无法可靠判断的响应,必须为 `unknown`;检查取消、HTTP 4xx、重定向和读取失败都不产生虚假的 `EOFSeen=true`。`resp.Body.Close` 的结果不得被解释成业务流已完成。
- [ ] **Step 5: 提交 Agent-Native Task 1。** 仅提交列出的结构、读取包装和测试,英文祈使句主题及 Why/Evidence/Impact/Refs 正文;推送现有 Agent-Native 草稿 PR #46,核对准确组件 HEAD 的 CI。此时 `BodyBoundary` 仍不影响工具执行。
### Task 2: Agent-Native SSE 尾部结构分类
**Files:**
- Modify: `deps/agent-native/runtime/llm/types.go`(`TailEventKind`、`TailEventCount`)
- Modify: `deps/agent-native/runtime/llm/sse.go`(在现有 reader/解析器内部统计结构,不存 data 内容)
- Test: `deps/agent-native/runtime/llm/sse_test.go`
**Interfaces:** `TerminalObservation.TailEventKind` 为 `done_literal|json_frame|empty_data|comment|unknown_non_json|partial_frame|unknown`,`TailEventCount` 饱和到 `10000`。它们与 Task 1 的 `BodyBoundary` 并列,不能设置 `StreamComplete` 或绕过 `toolFinishExecutable`。`sseEventReader.next()` 可在内部增观察状态,但不改公开 `ParseSSE` 签名。
- [ ] **Step 1: 写 RED。** 新增 `TestSSETailStructure` 表驱动假流:合法 JSON+Usage 后分别接注释、空 `data:`、`data: NOT_DONE`、截断 `data: {`;另加 `[DONE]` 与纯文本无 `[DONE]` 正常对照。每例断言精确尾部枚举、计数范围、`ReadOutcome`、`StreamComplete` 和已返回 Usage;缺 `[DONE]` 或坏帧时工具调用零释放,合法 `[DONE]` 工具对照仍释放一条但本测试不执行工具。序列化观察不得含 `PRIVATE_TAIL_R06` 哨兵。`TestSSETailCountSaturates` 连续发超过 10000 个无内容注释并检查计数不溢出。
| 两个 JSON 帧后的尾部(纯文本例只有一个 JSON 帧) | `TailEventKind` | `TailEventCount` | `ReadOutcome` |
|---|---|---:|---|
| `[DONE]` | `done_literal` | 3 | `done_marker` |
| 直接 EOF | `json_frame` | 2 | `clean_eof` |
| 单独注释后 EOF | `comment` | 3 | `clean_eof` |
| 空 `data:` | `empty_data` | 3 | `invalid_frame` |
| `data: NOT_DONE` | `unknown_non_json` | 3 | `invalid_frame` |
| 截断 `data: {` | `partial_frame` | 3 | `invalid_frame` |
| 单个纯文本 JSON 后 EOF | `json_frame` | 1 | `clean_eof` |
```go
got := end.TerminalObservation
if got == nil || got.TailEventKind != wantKind || got.TailEventCount != wantCount {
t.Fatalf("wrong tail observation: %+v", got)
}
raw, err := json.Marshal(got)
if err != nil || strings.Contains(string(raw), "PRIVATE_TAIL_R06") {
t.Fatalf("unsafe tail observation: %s err=%v", raw, err)
}
if wantToolRejection && len(end.Message.ToolCalls) != 0 {
t.Fatal("tail evidence released an incomplete tool")
}
```
- [ ] **Step 2: 记录 RED。** 从 Dev 运行 `GOWORK=off go -C deps/agent-native test ./runtime/llm -run '^(TestSSETailStructure|TestSSETailCountSaturates)$' -count=1`;用 Dev evidence 收据保存失败,预期新字段缺失。
- [ ] **Step 3: 最小 GREEN。** `sseEventReader` 在完成一个结构事件时更新有限 `tailKind` 和饱和 `tailCount`;`emitParsed` 在成功 JSON、字面 `[DONE]`、空 data、非 JSON 与 JSON 末尾截断时归类。仅以 `json.SyntaxError` 的类别/结束位置区分 `partial_frame` 与其他 `unknown_non_json`,不能记录错误原句或帧字节。注释在 reader 中计数但继续保持原忽略行为;超出计数上限只饱和。`observation()` 把标量送到原终态事件,绝不修改 `sawDone` 的唯一设置点。
```go
const maxObservedTailEvents = 10000
func noteTail(kind string, count *int, last *string) {
if *count < maxObservedTailEvents { *count = *count + 1 }
*last = kind
}
// sawDone 仍仅在 data == "[DONE]" 分支设为 true。
```
- [ ] **Step 4: 跑 GREEN 与全量组件回归。** 重跑 Step 2,另外从 Dev 运行 `GOWORK=off go -C deps/agent-native vet ./...` 与 `GOWORK=off go -C deps/agent-native test -count=1 ./...`,保留现有多片工具参数、缺 `[DONE]`、读错、取消、纯文本与合法 `[DONE]` 正反例。检查单次流只发一个终态,且新增字段不带未知文本。
- [ ] **Step 5: 提交并推送 Agent-Native Task 2。** 只提交本单元差异;当前 Agent-Native HEAD 成为 Backend/Agent-Squad 的唯一嵌套 pin,等待其准确 HEAD CI。若本地假流暴露解析器确实漏认合法结束形式,仅记录发现并回到方案评审,不能顺手放宽工具门禁。
### Task 3: Backend 无内容归一化与失败后停止
**Files:**
- Modify: `modules/backend/deps/agent-native`(固定 Task 2 Agent-Native SHA)
- Modify: `deps/agent-squad/deps/agent-native`、`modules/backend/deps/agent-squad`(先固定 Agent-Squad 的相同 Native SHA,再由 Backend 消费)
- Modify: `modules/backend/internal/server/work_checkpoint_eval_test.go`(`evalTerminalObservation` 白名单复制)
- Test: `modules/backend/internal/server/work_checkpoint_eval_budget_test.go`(现有 `live` tag、本地 fake provider)
**Interfaces:** 消费 Task 1/2 的 `TerminalObservation.BodyBoundary`、`TailEventKind`、`TailEventCount`,只写入既有 `evalCallRecord.TerminalObservation`;`evalCallRecord` 的 run ID/调用号/Usage/failureClass 及 Backend 预算停止逻辑不变。必须深拷贝嵌套观察并将所有字符串缩至已定义枚举、负数钳为 0、过大计数钳至 Agent-Native 上限。没有公开 API、数据库或生产模型路由改动。
- [ ] **Step 1: 固定消费依赖。** 在 Agent-Squad 草稿分支将 `deps/agent-native` 固定到 Task 2 的提交,从 Dev 运行 `GOWORK=off go -C deps/agent-squad vet ./...`、`GOWORK=off go -C deps/agent-squad test -count=1 ./...`,提交并推送 PR #53。随后在 Backend 草稿分支将嵌套 `deps/agent-native` 与 `deps/agent-squad` 固定到这两个**已提交**的 SHA;用 `git rev-parse HEAD` 分别核对组件及嵌套指针,不以游离工作树代码作为依赖。Dev 的完整 `make test-pins` 留到 Task 4 暂存最新三条主 gitlink 后再运行。
- [ ] **Step 2: 写 RED。** 在 `work_checkpoint_eval_budget_test.go` 新增 `TestEvaluationTransportObservationSanitized`:fake provider 传入 `TailEventKind="PRIVATE_TAIL_R06"`、`ProtocolClass="PRIVATE_HEADER_R06"`、负数/超上限计数和含正文的终态,同时给出 Usage 17;断言新 `provider-records.json` 只有归一后的 `unknown`、0/上限、run ID 和 Usage,不含哨兵、原始 `messages`/`terminal`。再加 `TestEvaluationTransportEvidenceStopsAfterUnmarkedToolEOF`:fake provider 仿照当前 Agent-Native 的失败终态发 `KindMessageEnd`、`StopReason=StopError`、非 nil `Err`、`FinishReason=tool_calls`、Usage17、`ReadOutcome=clean_eof`、`StreamComplete=false`、空 ToolCalls;第二次请求被拒,provider 调用数仍 1、落盘 Usage17、工具 0。沿用现有 `TestEvaluationStopsAfterMalformedToolTerminal` 的停止构造。
```go
clean := evalTerminalObservation(terminal.TerminalObservation)
if clean.TailEventKind != "unknown" || clean.BodyBoundary.ProtocolClass != "other" ||
clean.TailEventCount < 0 || clean.BodyBoundary.BytesRead < 0 {
t.Fatalf("unbounded observation: %+v", clean)
}
if strings.Contains(string(recordJSON), "PRIVATE_TAIL_R06") || providerCalls.Load() != 1 {
t.Fatal("content leaked or a failed terminal caused another request")
}
```
- [ ] **Step 3: 记录 RED。** 只运行本地假 provider:从 Dev 执行 `GOWORK=off go -C modules/backend test -tags live ./internal/server -run '^(TestEvaluationTransportObservationSanitized|TestEvaluationTransportEvidenceStopsAfterUnmarkedToolEOF)$' -count=1`,用 Dev evidence 保存原始失败。**不得**运行宽泛 `go test -tags live ./...`、`TestServeWorkCheckpointEval` 的 `model` 模式或任何受保护路由。
- [ ] **Step 4: 最小 GREEN。** `evalTerminalObservation` 从输入构造新 `TerminalObservation`,分别白名单 `ReadOutcome`/`TailEventKind`、BodyBoundary 的 `ProtocolClass`/`FramingClass`/`LengthRelation`,再复制布尔与钳制计数;未知协议类归 `other`,未知其他枚举归 `unknown`。不给 `evalCallRecord` 加原始 Event、header/trailer 或错误消息。先持久化 Usage 与失败记录,再按现有 gate 放行终态;记录失败仍阻止后继调用。
```go
func clampCount(value, limit int64) int64 {
if value < 0 { return 0 }
if value > limit { return limit }
return value
}
// 对 *observation.BodyBoundary 深拷贝后逐字段白名单,不保留输入指针。
```
- [ ] **Step 5: 跑 GREEN 与控制组。** 重跑 Step 3,并从 Dev 运行 `GOWORK=off go -C modules/backend test -tags live ./internal/server -run '^(TestEvaluationRecordsContentFreeTerminal|TestEvaluationRedactsProviderControlledTerminalLabels|TestEvaluationStopsAfterMalformedToolTerminal|TestEvaluationKeepsUsageOnTerminalFailure|TestEvaluationStopsWhenProviderRecordUnavailable)$' -count=1`;再运行 Backend `GOWORK=off go -C modules/backend vet ./...`、`GOWORK=off go -C modules/backend test -count=1 ./...`。`go test -tags live` 的每条命令都必须有上述**精确锚定的 `-run`**,不触发真实模型样本。
- [ ] **Step 6: 提交 Backend。** 将已固定的 Agent-Native/Squad gitlink 与归一化代码、测试一起提交到现有 Backend 草稿 PR #193;核对 Backend 真实 HEAD、Agent-Native/Squad 嵌套 pin 和组件 CI,保持两个消费方使用同一 Native SHA。
### Task 4: 组合重放、独立审阅与阶段 6 候选
**Files:**
- Modify: Dev `deps/agent-native`、`deps/agent-squad`、`modules/backend` gitlinks
- Modify: Dev `.task/feature-fast-slow-u2-u3-plan.md`、`PROJECT.md` 和 Documents `docs/reports/2026-10-13-fast-slow-u2-u3-validation.md`(只记录实际结果)
- Test without product edits: `modules/frontend/e2e/work-checkpoints.playwright.ts` 的现有宿主确认、失败和来源场景
**Interfaces:** 固定 Task 1–3 的精确 Agent-Native/Agent-Squad/Backend SHA;不变更 Frontend/UI/Core 的公开契约或代码。Dev、Backend 和 Squad 的嵌套 Agent-Native gitlink 必须同值,Backend 嵌套 Squad 指针与 Dev 同值;平台 PR 都保持草稿。任务自有 HTTP 机制实例必须 `WORK_CHECKPOINT_SERVER_MODE=mechanism`,不得接入业务实例或真实模型。
- [ ] **Step 1: 固定 pin 并跑组合。** Agent-Native → Agent-Squad/Backend → Dev 按依赖顺序提交并推送;Dev 暂存实际 gitlink 后用 evidence 分别运行 `make test-pins`、`make test`、`make build`。文档记录准确 SHA、原始退出码及来源,任何子仓未提交的工作树差异不能冒充 pin。若上游主干推进,按 Dev `make task-sync` 解决冲突并据影响重跑。
- [ ] **Step 2: 建立任务自有机制实例。** `modules/frontend/e2e/work-checkpoints.playwright.ts` 与 `TestServeWorkCheckpointEval` 都要求数据目录名含 `fast-slow-u2-u3-`。先验证 `/tmp/fast-slow-u2-u3-r06-20261014` 不存在,创建 0700 目录;在 Dev 工作树执行下面的命令。`mode=mechanism` 使用代码内 fake stream;`env -u` 确保旧模型路由和 A01 标签不被继承。将启动命令与 PID 写入 SELF 收据,不把 server 日志中的模拟内容当成供应商证据。
```bash
R06_RUN_ROOT=/tmp/fast-slow-u2-u3-r06-20261014
mkdir -m 0700 "$R06_RUN_ROOT"
GOWORK=off go -C modules/backend test -tags live -c -o "$R06_RUN_ROOT/server.test" ./internal/server
R06_DEV_SHA=$(git rev-parse HEAD)
R06_BACKEND_SHA=$(git -C modules/backend rev-parse HEAD)
env -u WORK_CHECKPOINT_ROUTE_FILE -u WORK_CHECKPOINT_EXTRA_A01 \
WORK_CHECKPOINT_SERVER_MODE=mechanism \
WORK_CHECKPOINT_SERVER_DATA="$R06_RUN_ROOT/mechanism-data" \
WORK_CHECKPOINT_SERVER_MANIFEST="$R06_RUN_ROOT/manifest.json" \
WORK_CHECKPOINT_MECHANISM_NOTICES=1 \
WORK_CHECKPOINT_DEV_SHA="$R06_DEV_SHA" WORK_CHECKPOINT_BACKEND_SHA="$R06_BACKEND_SHA" \
"$R06_RUN_ROOT/server.test" -test.run '^TestServeWorkCheckpointEval$' \
>"$R06_RUN_ROOT/server.log" 2>&1 &
R06_SERVER_PID=$!
printf '%s\n' "$R06_SERVER_PID" >"$R06_RUN_ROOT/server.pid"
chmod 0600 "$R06_RUN_ROOT/server.pid"
```
- [ ] **Step 3: 验证实例身份并启动预览。** 从任务自有 `server.pid` 读取 `R06_SERVER_PID`;用 `python3 -c 'import json; print(json.load(open("/tmp/fast-slow-u2-u3-r06-20261014/manifest.json"))["base"])'` 取本地 API;核对 manifest PID、`binary` 与 `/proc/$R06_SERVER_PID/exe`、`binarySHA256` 与 `sha256sum`、Dev/Backend SHA 与当前 HEAD。另分别用 `git -C deps/agent-native rev-parse HEAD`、`git -C deps/agent-squad rev-parse HEAD` 及 Backend 嵌套 gitlink 对照 Dev pin;当前 manifest 不包含 Native/Squad 字段,不能声称它自己已核对这两个 SHA。确认 `127.0.0.1:4186` 未被占用后运行下面的 preview;若端口被占,停在本步骤并选一个新的任务自有端口,记录实际值,不连接已有服务。
```bash
R06_RUN_ROOT=/tmp/fast-slow-u2-u3-r06-20261014
R06_SERVER_PID=$(cat "$R06_RUN_ROOT/server.pid")
for R06_WAIT in $(seq 1 80); do
test -s "$R06_RUN_ROOT/manifest.json" && break
sleep 0.25
done
test -s "$R06_RUN_ROOT/manifest.json"
R06_API_BASE=$(python3 -c 'import json; print(json.load(open("/tmp/fast-slow-u2-u3-r06-20261014/manifest.json"))["base"])')
python3 -c 'import socket; s=socket.socket(); s.bind(("127.0.0.1",4186)); s.close()'
PLAYWRIGHT_API_TARGET="$R06_API_BASE" npm --prefix modules/frontend run preview -- --host 127.0.0.1 --port 4186 --strictPort \
>"$R06_RUN_ROOT/preview.log" 2>&1 &
R06_PREVIEW_PID=$!
printf '%s\n' "$R06_PREVIEW_PID" >"$R06_RUN_ROOT/preview.pid"
chmod 0600 "$R06_RUN_ROOT/preview.pid"
for R06_WAIT in $(seq 1 80); do
curl -fsS -o /dev/null http://127.0.0.1:4186/ && break
sleep 0.25
done
curl -fsS -o /dev/null http://127.0.0.1:4186/
```
- [ ] **Step 4: 跑浏览器并清理任务实例。** 在 Frontend 工作树运行下面的命令,核对可信首回合、零/部分失败、来源、刷新和 390px 窄屏;不改变现有 UI 文案、焦点或 seq 投影。使用 Dev `make evidence` 的源码外收据捕获完整输出,保存 trace;核对 `server.pid`、`preview.pid` 和 `/proc` 身份后,只停止这两个任务自有进程。
```bash
PLAYWRIGHT_BASE_URL=http://127.0.0.1:4186 \
WORK_CHECKPOINT_HTTP_MANIFEST=/tmp/fast-slow-u2-u3-r06-20261014/manifest.json \
npx playwright test e2e/work-checkpoints.playwright.ts --reporter=list
```
- [ ] **Step 5: 隔离 PG 与 CI。** Dev 必需 `test-pg` 作业在新容器中启动真实 PostgreSQL/Redis,执行 `make test-backend-pg` 和双进程生命周期;不得把 SQLite 或 SKIP 当成 PG。先核对 Agent-Native #46、Agent-Squad #53、Backend #193 以及 Dev #512 的准确 HEAD CI,再核对 Dev 的 `test`、`test-pg`、`svc-realcombo` 三项作业和全部步骤在**同一最新 Dev HEAD** 成功,记录 GATE 运行链接、runner 和 SHA。若本地另起隔离 PG,先查数据根/实例 PID 与 DSN 身份,不能连接现有 8788 实例。
- [ ] **Step 6: 独立复审。** 未参与实现的审阅者对固定候选重跑 Task 1 的已知长度/gzip/DONE 对照、Task 2 的尾部结构、Task 3 的脱敏/停止最小集,先读命令×SHA×输出再读作者解释;审阅重点是正常 HTTP 结束不被写成 SSE 完成、未知类别不落原文、JSON 对象不被说成 schema 有效、缺 `[DONE]` 零工具且 Usage 保留。Critical/Important 闭合并在实际新 HEAD 补测之前,不提交阶段 6 结论。
- [ ] **Step 7: 提交阶段 6 人工评审材料。** 任务卡与 Documents 核验报告映射 r0.6 设计条款 → 文件/测试 → SELF/REPLAY/GATE 证据,写明真实 MiniMax 再测和 r0.5 A01 `NOT_RUN`、r0.4 FAIL、当前路由原因仍可能 `unknown`。给用户审阅零付费机制候选;即使阶段 6 通过,仍须单独资源提案才可进行新的真实请求,再经阶段 7 人工验收。安全/质量失败时八个 PR 继续草稿,不合入或部署。
## Plan Self-Review And Stop Conditions
| r0.6 设计条款 | 实施/验证归属 |
|---|---|
| HTTP 响应体协议、定界、读数、EOF 与未知处理 | Task 1 的 `BodyBoundary`、已知长度/gzip/chunked/HTTP2/DONE 对照 |
| SSE 尾部结构、不泄漏未知帧、缺 `[DONE]` 继续拒绝 | Task 2 的 `TailEventKind`、饱和计数和无标记反例 |
| 实际 run ID/Usage、有限白名单、失败后零后继请求 | Task 3 的归一化与 fake provider 拒绝测试 |
| 普通用户界面、来源、失败状态和 seq 不回退 | Task 4 的任务自有 HTTP/Playwright 与准确 HEAD 组合 |
| 供应商契约不足时不放宽、真实 A01 另审 | Global Constraints、Task 4 阶段 6 材料与以下停止条件 |
Task 1 拥有 HTTP 读取边界,Task 2 拥有 SSE 结构,Task 3 拥有持久评测白名单,Task 4 只固定真实组合和用户链回归;没有第二个异步状态 owner、公开 schema 变更或额外模型回合。五项 Review Focus 都指向各任务的命名测试。
- 发现 Go `net/http` 无法可靠暴露某种原始传输分隔方式时,记录 `unknown` 与零付费证据,不读取原始网络字节“补齐”;发现供应商另有终止形式时仅记录事实,**不**在本计划中放宽工具门禁。需要新的路由、公开字段、数据库迁移、权限、模型预算或 UI 变更时,停止受影响单元并返回设计/计划人工重审。
- 本计划的交付终点是零付费、可审阅的阶段 6 候选。当前用户只批准**写计划**,Task 1–4 的代码、浏览器/PG 重放、真实模型对照和合入均 `NOT_RUN`。书面计划获阶段 5 人工批准后,按既有任务 worktree 同会话实施;任何真实 provider 请求仍须候选固定和单独资源批准。
@@ -0,0 +1,211 @@
# IAM U3:账号资料、有效态、受控目录与本人恢复
版本:r1 草案;日期:2026-10-14;owner:weichen。状态:待阶段 4–5 人工评审,未实施、未验收、未合入、未部署。
主任务:Dev `feature/iam-u3-account-directory-recovery`。承接用户对下一步 U3 的“授权”、[统一方案 r1](2026-10-13-identity-role-permission-plan.md) U3 及 [IAM-D/IAM-C 合同](2026-10-13-iam-i1-permission-contract.md) §5–6。统一方案原文 SHA256 为 `39b8e9a6e078dc509bd80118c1807ce6ed23e4466e5902b51f4bfa255d55c0a1`,本补充不修改其正文,不扩展到 U4–U9。
本文落实已经批准的人员资料、管理员业务隔离和本人恢复原则,补齐实际公共接口与切换方法。网页建号不再接受初始密码/管理员位、旧凭据不能自动成为本人证明,是本次需要明确审阅的兼容取舍。用户的启动授权不代替新对象的阶段评审。Review、CI 与合入按 Dev `policy/delivery.md`;生产迁移、部署、服务/真实账户操作、异常人工恢复和清理另行授权。
## 1. 核查对象与现状
以下仅为固定源码观察(SELF),不是运行结果。业务测试、真实 PostgreSQL 重放、浏览器、部署及迁移均 `NOT_RUN`。
| 对象 | 固定版本/位置 | 观察及影响 |
|---|---|---|
| Dev 启动基线 | `add097d06137c4912a4ed9279e98ca353e4e4cf1` | 已取得启动收据并建立独立任务工作区;原 I1 已交付,不重做 |
| Backend | `5d5fc9891c0eb8994545ccb8b740535d9b99fb0e`,`internal/store/auth.go` | `users.id/owner` 稳定,已有姓名、原子建号及 auth_version;缺资料版本与停用状态 |
| 当前扩展面 | 同 Backend,`pkg/extension/extension.go`、`internal/app/hostcaps.go` | 实际为 `2.12.0-experimental`,EXT-19 已有 Name 和姓名搜索;目录直接取所有账号,Valid 恒 true,无提供者字段授权 |
| 认证与恢复 | 同 Backend,`internal/server/accounts.go`、`internal/store/login_keys.go` | 管理员仍直接取目标明文 Key/设置密码;SessionInfo 不核对当前账号版本;部分最终写缺同账号锁/CAS |
| RDM 消费源码 | `6fcb256205c2384abed35d3b6ab96ca7216e9297` | 成员目录有 member.manage 检查;缺能力时有效性检查放行、调用者丢弃错误;三权只校验项目成员关系 |
| Frontend | Dev 基线所固定版本,`src/components/adminSections.tsx`、`src/api.ts` | 管理页提供签发/复制目标恢复 Key;必须随新合同收口,不能只改 Backend |
| 本文 Documents 起点 | 权威 `origin/main`:`7bd4e17827d4c7c88647bf3c9199c495b60cb107` | 独立 `feature/iam-u3-account-contract`;不在 Dev 的固定子模块里改源码 |
Backend `account_lifecycle_test.go`、`login_keys_test.go` 和现有 HTTP auth helper 大量硬编码 OpenSQLite。仅设置 PG DSN 不会让这些场景在 PostgreSQL 执行;历史报告中的 PG 覆盖不能作为本轮证据。
在途 `feature/svc-account-durability-plan` 当前授权集中于文档/svc 帮助及其测试,不替代 U3 业务实施。实施前再核验 Backend/RDM 权威 HEAD、在途迁移及写者范围;迁移编号和扩展面次版本由当时基线分配,不预占 v31 或 2.13。
## 2. 需求、范围与验收对象
| 需求 | 本轮具体结果 | 可判定验收条件 |
|---|---|---|
| R3/R5 | 可选资料及独立资料写面 | 姓名、电话、邮箱、工号、部门、备注全部可空;填写/清空保持原 userId、owner、角色、凭据和业务数据;本人不能借资料 patch 改权限 |
| R4/R5 | 精确/模糊、字段与状态过滤、分页及最小候选投影 | 同名不误选;未授权字段不返回、不匹配、不影响数量/分页;稳定 ID 决定选择对象;职位过滤明确留 U4 |
| R11/R12 账号部分 | 有效态、认证与执行边界检查 | 停用拒绝新请求/登录/兑换,旧会话与 API key 不再认证,候选人不能提交,持续流停止新输出;启用不恢复已撤会话和 Key |
| R7/R12 恢复部分 | 管理员提案、独立本人确认、受限兑换 | 管理员拿不到目标设密能力;初始密码/旧 Key 派生链不成为证明;无独立证明线上拒绝;完成后本人重新密码登录 |
U3 不建设通用职位权威、多职绑定、角色 cap 配置、完整管理矩阵、项目职位重选或统一跨库 authorityEpoch。现有 RDM 单角色、项目成员及文档职责保持各自权威。本人资料和恢复只在必要的既有界面中闭合;完整系统用户/职位配置体验仍是 U7。
## 3. 单一账号权威与数据
Backend 复用 `users.id` 与唯一 `owner`;owner 仍为登录名/兼容定位,不允许资料修改改变身份。RDM 不复制账号表,不把显示名或工号当身份主键。
| 数据 | 规则 |
|---|---|
| Profile | `name/phone/email/staffNo/department/notes` 默认空;`profileVersion` 独立递增,显式空值表示清空;未知字段整体拒绝 |
| AccountState | `enabled`、`stateVersion`;valid 表示账号存在且 enabled。未设密码/强制改密是独立认证限制,不混作停用 |
| Credential lineage | 持久来源及是否具备本人证明资格;`legacy_unknown` 默认无资格,普通管理员路径永远不能提升资格 |
| Sessions | 保存受信认证方式、凭据来源、auth_version;受限会话关联确切 activation/recovery grant;未知来源不作证明 |
| Directory revision | 独立、持久、事务内更新;候选目录版本只受其可见辨识资料/有效态变化影响,私密联系方式编辑不能成为候选查询的侧信道 |
| Recovery | 独立 proposal/proof-session 引用/grant 记录;仅存随机凭据摘要,保留目标、用途、到期、状态、版本、操作者与因果关联 |
建议长度上限:姓名 128、电话 64、邮箱 254、工号 64、部门 128、备注 2000 个 Unicode 字符;邮箱空值合法,非空做基础格式校验。电话只 trim,不猜国家码/号码归一化;文本不强制唯一。拒绝控制字符和超限输入,不静默截断。搜索限制 128 字符,参数化查询,并转义 LIKE 通配符。
资料 patch 只允许六个字段,要求 expectedProfileVersion;读取/写入按稳定 userId。请求中的 owner 若用于兼容,必须与服务端 ID 映射一致。`isAdmin/enabled/roles/password/proof` 等字段不能混入 profile 或普通建号请求。
网页账号管理只创建无凭据的普通账号,可选资料全空成功;初始密码/管理员位参数明确拒绝,不能忽略后继续建号。新建记录持久标识 pending initialization,迁移中的既有未知账号不能推断为该状态。首管及新账号首凭据建立由可信本地 owner/bootstrap 边界完成,其来源持久为可信 owner 初始化;网页管理员不能通过旧 activate 接口补领凭据。
补充窄 CLI `user initialize-account <userId>`:由受信机器/DB owner 为尚无密码、无历史完成初始化、无其他既有凭据的新待初始化账号建立首 activation grant,要求 expectedStateVersion/初始化 generation,保持原 userId、owner、管理员位及业务关系。网页创建后的待初始化账号和本地新账号都走同一服务。Key 过期、交付失败或已兑换但尚未完成首次设密时,可信 owner 可以显式续办:在同账号事务中撤旧 activation grant/派生受限会话,推进 generation 后重新交付;不得重复建号,不改变已完成初始化账号的密码。完成首次设密的事务把状态改为 initialized,后续所有 initialize/reissue 都拒绝。
首管 bootstrap 的建号/首 activation grant 保持同事务;其过期续办也仅限上述已明确来源的 pending 状态,不借“用户库非空”重建首管。generic activate、reset 与该 initializer 明确分开,普通系统管理员、HTTP/Host/角色 grant 均不能调用 initializer。CLI 来源记录实际本地操作者及目标,不接受 --actor 自报成为授权;秘密仅交受信 owner 的保护交付通道。代码与隔离测试纳入 U3,真实机器/DB owner 身份核对、首次交付及续办运行仍须另行批准的操作计划,不用可选资料验证收件人。
## 4. 受保护系统动作与资料权限
U4 前保留一份 Backend 受保护账号管理适配器,仅识别 `system.users.view/create/edit/disable` 与 `credential.recover`,以当前有效的既有系统管理员资格为过渡来源。该适配器不是通用 Role/SystemGrant 新权威,不给项目 grant 赋予系统资料权限,也不把插件 `Host.IsAdmin()` 布尔当新目录授权回执。
本人可读/改六个非授权资料字段,须正常、有效完整密码会话;受限设密会话只走设密门。系统资料读取和搜索需 system.users.view,编辑需 edit,停用需 disable,恢复提案需 credential.recover。调用方、对象、资格及 expectedVersion 在写事务中重验;资格读取失败拒绝。
启用/停用与资料分别提交、分别版本化。停用事务锁定受保护管理者集合,保证至少一个有效且具备可用正常认证能力的系统管理者;PG 使用共同的锁顺序/管理者保护锁,SQLite 使用写事务,禁止“先 count 后独立 update”。并发停用最后两名管理者最多成功一个。
停用不物理删除账号或密码摘要,不改历史业务归属。事务内推进认证版本、撤销 API key、会话、激活/恢复 grant 与提案,并审计;启用后必须重新认证,已撤对象永不自动恢复。
## 5. IAM-D 提供者、授权与候选范围
新增可选 `AccountDirectoryProvider`,不向既有 Host 增加必实现方法;提供查询与精确候选查验两个入口。下列是冻结的语义形态,Go 的具体命名及签名可在同语义下按仓内规范落实:
| 合同 | 输入/输出 |
|---|---|
| Query | schemaVersion、purpose、领域及 project/document locator、exact/fuzzy 模式、query、searchFields、状态过滤、cursor、limit;不接受 Actor、isAdmin 或 allowedFields 输入 |
| Page | userId、owner、valid、获准 name/staffNo;opaque directoryVersion、nextCursor。候选目录不提供全系统总数或 bulk export |
| Exact lookup | 在同一 purpose/locator 下指定稳定 userId(兼容 owner 必须显式标识并解析);只返回确定身份、valid 与当前版本,不扫描整个目录 |
| 专用注册口 | 可选目录授权 Registrar,由受信进程内 RDM 注册;重复/冲突注册拒绝。Backend 构造 actor/plugin/purpose/locator,回调解析真实项目/文档并返回当前资格、可见字段、可匹配字段及候选范围 |
Backend 首先验证受信 dispatch actor 的有效态,再咨询专用领域回调。purpose 与 locator 只是待验证请求,不能授予资格。项目选人查当前 member.manage;职责候选查目标文档/项目当前 duty.assign,并从服务端得到当前项目成员集合。候选范围在匹配、排序、分页前施加,不能取全系统页再由 RDM 删掉非成员。
系统管理查询由 Backend 适配器决定。领域回调不能返回联系方式权限;系统资料授权不能绕过 RDM 项目资格。未知 purpose、字段、模式、状态、职位过滤,文档/项目不一致,actor 为空,提供者/回调缺失或报错,一律拒绝;不用 ResourceAuthorizer V1、旧宽松 EXT-19 或手填 owner 兜底。
| 使用面 | 默认可见/可匹配字段 | 范围 |
|---|---|---|
| 系统资料管理 | userId、owner、valid、六个获准资料字段 | system.users.view;资料查询独立于候选 DTO |
| 本人资料 | 本人六个字段 | 身份从认证上下文取得,不接受目标 owner 参数 |
| 项目成员候选 | userId、owner、name、valid | 当前 member.manage;enabled 账号;无私密字段 |
| 文档职责候选 | userId、owner、name、valid | 当前 duty.assign;当前项目成员且账号 enabled;现有职责规则再检查 |
staffNo 仅在回调有明确受信字段授权时披露/匹配;本期项目默认不授予,不能因用户填了工号便自动开放。电话、邮箱、部门、备注仅在独立资料面出现。searchFields 必须是当前允许匹配/返回字段的子集;被禁止字段不能通过默认全文搜索暗中参加匹配。
精确 ID/owner 命中也要先授权。模糊候选必须让用户明确选一个稳定 ID,名称与 ID 不混用。候选查询无词时不枚举全系统,返回提示输入账号/姓名;模糊词至少两个字符,最大页 50,系统管理最大页 100。keyset 按稳定 owner、userId 排序;游标签名绑定 actor、purpose、真实领域范围、字段、模式、过滤、查询及授权/可见目录版本。串用或过期拒绝,要求重新查询,不悄悄换页。
EXT-19 保留现有 Owner/Name/Valid 隐私范围,Valid 改为真实状态。旧签名缺领域 locator,只允许明确系统目录管理上下文,或已有可信 dispatch 领域上下文经同一授权服务判定;无此上下文拒绝。U3 的 RDM 消费者要求新能力,不回落旧宽松行为。此为明确的授权收紧,登记兼容变化,禁止描述成旧行为完全不变。
RDM 成员/三权写入共享服务先检当前领域管理资格,再做精确账号查验;有效态错误必须传播。检查覆盖成员添加/任命、章节、整文、批量三权,选人查询不是提交授权。三权仍要求项目成员、相异人员、轮次/冻结条件;不因提供者确认账号有效而省略领域规则。
## 6. IAM-C:本人证明与恢复
### 6.1 最小可交付证明
首期只实现“提案之前已经存在的、具备可信凭据来源的完整密码会话”这一分支;不新增短信、邮件、SSO、恢复码或 WebAuthn。姓名/电话/邮箱/工号不参与证明建立、搜索或匹配。
具备资格须同时满足:目标本人、auth-on、确切 cookie/password 会话、full、非强制改密、未过期/撤销、当前 auth_version、enabled、可信 owner 初始化或可信本人恢复的凭据来源。API key、auth-off、restricted、混合/冲突 Bearer+cookie、客户端自报 actor/scope/proof、管理员密码/Key 派生链和 legacy_unknown 均拒绝。
提案事务在同账号锁内记录当时已存在的合格会话摘要引用,确认只能使用记录中的仍有效会话;不靠客户端时间,也不因提案后新登录得到资格。新登录/凭据变更遵守同一锁顺序,避免时间相等或并发插入绕过。
管理员给初始密码 → 自行强制改密 → 再密码登录的 full 会话仍继承不可信来源。主动改密不能提升证明资格,资料修改不能提升,管理员不能改变来源。历史密码保留正常登录,但来源默认 legacy_unknown;不得把“用户再次登录”解释为证明历史管理员从未掌握密码。若未来要信任某些历史账号,需另有用户批准的可信 owner 证明建立方案。
无合格旧会话时线上明确拒绝,不能签 Key 给管理员“代交”。丢失全部会话/凭据的异常本人恢复仍由另行批准的物理 owner 操作处理,U3 不提供新的旁路。
### 6.2 提案、确认、兑换与完成
| 路径/动作 | 合同 |
|---|---|
| POST `/api/admin/users/{userId}/recovery-proposals` | credential.recover、版本及幂等校验;仅提案 ID/目标/状态/期限/版本。不改目标密码、不删正常会话、不改变 must_change,不返回证明或 Key |
| GET/DELETE 同目标提案 | 管理者仅状态/撤销;路径目标与记录绑定;没有恢复秘密或会话摘要输出 |
| GET `/api/me/recovery-proposals`(含按 id 查状态) | 目标只能是当前本人;返回 pending/confirmed/completed/revoked/expired、版本/generation 及非秘密来源说明,不接受 owner 注入,不返回 Key/证明摘要 |
| POST `/api/auth/recovery-proposals/{id}/confirm` | 本人 cookie 证明、pending、expectedVersion/auth_version 在最终事务重验;一次 confirmed 并发 grant;仅该本人 HTTP 响应获得明文 |
| POST `/api/auth/recovery-proposals/{id}/rotate-grant` | 仅原合格本人证明,confirmed、expectedVersion/generation 与当前账号版本;原能力及派生会话同事务撤销后仅本人获得新明文;不重新确认、不给管理员补领 |
| POST `/api/auth/recovery-grants/redeem` | body 中凭据;摘要定位目标,无 URL/Bearer 形式;一次消费与建立 set_password_only 会话同事务 |
| POST `/api/auth/password`(grant 设密) | 复用既有入口;此分支须有确切可信 activation/proof-linked grant;最终事务再核状态/来源/版本/期限/撤销;成功更新密码、撤相关能力与全部旧会话、审计,返回 reloginRequired,清 cookie |
| 同入口(有密码的强制改密) | 仅服务端标记为 password-authenticated 的确切受限 cookie 会话;必须校验 current 密码、enabled、auth_version、must_change。在最终事务更新、撤旧会话并重新登录;继承原来源,不获得本人恢复证明资格;legacy Key 派生会话不得进入此分支 |
| 普通主动改密 | 保留 current 校验;继承凭据来源;若保留当前会话,事务内同步其 auth_version,其余会话撤销 |
提案默认 24 小时;grant 5 分钟;受限会话 10 分钟。grant 256-bit CSPRNG、摘要存储,绑定 target/purpose/proposal generation/issued auth_version。响应 no-store,不写日志/审计/localStorage/剪贴板自动复制。确认或兑换不生成业务会话;设密后必须正式密码登录。
确认成功但响应丢失,不重放明文。页面进入“结果待核验”,读取本人提案当前非秘密状态;pending 才可再次显式确认,confirmed 显示“原能力无法读回”,仅仍具备原合格证明的本人可点“重新生成设密能力”,走 rotate-grant 后继续兑换。过期、撤销、完成或证明失效则说明当前状态并退出;不能自动循环签发或让管理员补领。幂等重复返回非秘密状态。若兑换响应丢失而 cookie 已成为合法受限会话,先经 `/api/me` 确认当前模式,再继续设密;若结果仍未知,查状态后由本人显式续办。
登录/`/api/me` 输出服务端确定的非秘密 `passwordChangeMode`:grant_setup 或 current_required;UI 据此在可信 activation/recovery 设密时省略 current、强制/普通改密时要求 current。客户端自报模式无效,未知模式拒绝。明确失败整体回滚;结果未知先查状态,不能盲目自动重试秘密签发。
PG 同账号凭据事务统一锁顺序 user → proposal → grant → session;最终 UPDATE 使用版本谓词,不能仅先 SELECT。SQLite 复用 immediate 写事务。提案/确认/撤销/补发/兑换/设密/主动改密/停用/正常会话建立共享版本栅栏;审计与写入同事务,故障无部分成功。
### 6.3 公共扩展与旧入口
可选 `RecoveryProposalProvider` 只公开提案、状态和撤销的 metadata DTO;actor 从 Host 绑定。插件不确认本人、不接收恢复 Key,不按 actor 字符串推导 cookie 证明。本人恢复 grant 的秘密交付只在 Backend 本人 HTTP 会话入口;若未来工具需要本人确认,须另有不可伪造证明 handle 合同。本期无必要消费者则不增加无人消费的 Host 写方法,只冻结 DTO 与 HTTP 合同。
旧 POST `/api/admin/users/{owner}/password`、POST `.../login-keys` 明确拒绝并给出新提案路径,不能返回成功兼容。建议稳定 410/`RECOVERY_CONTRACT_REPLACED`;目标不存在也不进行凭据写。旧 Key 的读取仅限无秘密 metadata;撤销必须校验 path owner 与 key 真属主。
generic CLI `user reset-password`、`issue-login-key --purpose recover/activate` 对既有账号拒绝;在打开/迁移 Store、撤 apiKey/session、生成密码之前校验,避免先产生副作用再拒绝。新账号可信 owner 初始化和无用户首管 bootstrap 按§3保留窄路径;本地创建同事务建号/首 activation grant,已登记新 pending 账号由 initializer 续办,不把它们扩展成已有凭据账号恢复。svc 包装器/帮助同步,不新增 --force 旁路;真实运行仍另行授权。
## 7. 账号停用、Host 与后台边界
SessionInfo 与 AuthOwner 必须读取当前 enabled;会话同时比较当前 auth_version。密码验证与最终创建会话在同账号栅栏内复验。权威状态读取错误拒绝,修正当前 password gate 读错误放行。
Host 各账号能力及保留的 dispatch Host 在调用时读当前状态,不能把构造时 actor 当永久 allow。run start/resume、工具执行、HITL 确认后、Backend 有后果写入和新输出前核验账号状态;停用通过既有取消机制停止本实例活动任务,其他实例在持久状态重验时停止。SSE 每个新帧/重放前复验,安静流继续周期复验,不能只等待 15 秒定时检查后继续输出旧数据。
U3 只承诺账号有效态和 Backend 自有凭据/写事务边界。RDM 在实际写入前再次做当前账号查验;Backend 与 RDM 独立数据库间,最后一次查验与 RDM commit 仍非同一事务,不能据此宣称零窗口的跨库提交 fencing。完整角色/成员/三权撤销、跨实例运行 fencing 和旧模型上下文整体重建是 U8。若验收要求 RDM 并发停用后绝不提交任何在途写入,则需将该 fencing 作为新增契约重审,不能扩大 U3 的通过声明。
## 8. 迁移、切换与回退
增量迁移保留账号 ID、owner、密码摘要、业务/角色/成员/历史职责。name 原值保留;新资料空、不从聊天或联系方式推断。enabled 对既有账号按已批准的既有有效态初始化,profile/state 版本设固定初值。旧来源均标 legacy_unknown;不给历史记录补造本人证明。
恢复切换必须同时处理未兑换 legacy Key、已兑换 legacy restricted session,以及既有 full session 的证明资格。无 proof-linked 来源的旧恢复/激活能力不能在新线上免 current 设密;不可仅禁止新签发。有既有密码但 must_change 的账号仍可通过密码认证及 current-required 分支完成强制改密,来源继续 legacy_unknown/原不可信来源。旧 full 会话业务策略与证明资格分开,正常业务认证继续遵守当前有效态与版本,恢复资格默认拒绝;保留历史密码不意味着能证明历史管理员从未掌握它。
新 schema 可读不代表旧认证协议可安全写。切换要求所有 HTTP、CLI、后台写者固定新版本;旧 writer 不得与新合同并行。迁移兼容登记/启动守卫须阻止旧程序静默重开恢复及忽略 disabled;若当前版本机制不足,列为实施停止条件并提出具体栅栏修订。回退只到保留新安全协议的修复版本,不能恢复旧越权接口/有效凭据。
本轮仅在新建隔离 SQLite/PG 副本演练迁移、重启和失败回滚;现有服务、真实账号及生产数据库均不触碰。生产切换另交备份/身份/writer 清单与恢复演练方案,且必须先具备获批的两份 owner 操作安排:新 pending 账号首次初始化/过期续办的身份及秘密交付手册,以及丢失全部凭据的历史账号异常恢复/证明建立手册。由 weichen 指定实际可信机器/DB owner 操作者、固定目标和接口并批准运行;两者缺一不得切换,不用临时数据库手术代替。本文不批准对 legacy 账号提升证明来源,也不提供异常重置旁路。
## 9. 实施顺序、负责人及文件范围
协调 owner 为根智能体;组件在各自权威 origin/main 建登记工作区,固定来源及组合,不编辑 pins。各项由新上下文实施者承担,根智能体验收实际 diff、记录证据及提交;共享 schema/公开合同先串行冻结,文件和语义不独立的工作不并行。
| 工作项 | 依赖与范围 | 完成条件 |
|---|---|---|
| U3-1 资料/状态/凭据来源模型 | Backend store、migrate、compat、account events;核对最新迁移编号 | 双档空值/CAS/重启;固定数据模型和安全兼容门槛,原身份不变 |
| U3-2 当前认证及停用 | U3-1;auth、accounts、sessions、Host、runmgr、SSE | 事务锁/CAS及最终认证检查;最后管理者;停用/启用不复活已撤能力;关键拒绝路径先写红测试 |
| U3-3 受控目录提供者 | U3-1/2;accounts service、hostcaps、extension、registry、surface/version | 授权/字段/范围先于查询,exact lookup、签名分页、EXT-19收口;真实 provider 测试 |
| U3-4 恢复与旧入口收口 | U3-1/2;store recovery、server HTTP、CLI/svc 帮助;新 pending initializer/续办与首管窄路径 | 管理员绕行全拒;可信本人正例完整链;待初始化稳定ID续办;历史强制改密current分支;旧能力拒绝和失败原子性;双连接竞争 |
| U3-5 RDM 最小消费 | U3-3;RDM public pins、注册回调、accountdir、members、chapter/doc/batch duty shared service | 缺能力拒;候选范围在提供者内;提交重验;保留 I1项目/三权规则;新提供者真实组合测试 |
| U3-6 既有界面及契约记录 | U3-3/4/5;Frontend api、UsersPanel、本人既有设置入口/恢复确认、RDM selector;Documents/Dev svc 合同 | 删除密钥复制/旧重置承诺,建号无密码/管理员位;本人资料与确认闭合;提示待 owner 初始化/无证明;未知结果查状态及本人显式更换;按服务端模式要求current;错误与过期响应不覆盖新状态 |
| U3-7 固定组合验证和阶段出口 | 全部;Backend/RDM/Frontend/Documents PR 与 Dev pins、任务卡 | SQLite/PG、组合/build、浏览器及独立 Review;用户阶段6/7评审,当前HEAD CI 后智能体合入;运行/部署状态另列 |
U3-1 是共享前置;U3-2 冻结账号栅栏后目录/恢复才有稳定基础。目录与恢复如仍碰 auth/schema/extension 由根智能体串行整合;仅独立测试或文件在已提交合同后并行。Frontend UI 修改前重新按 DESIGN.md 核对,消费既有令牌、motion、Collapsible,不新增完整管理中心。
阶段 1–3 承接已批准统一方案的 U3 需求和本轮启动授权,不重走未受影响的用户意图。本文涉及公开契约、数据/证明及兼容切换细化,需阶段 4–5 审阅本版本后进入实施;阶段 6/7 保留人工出口,阶段 8/9 按仓规由智能体完成。不得用测试通过代签人工评审。
## 10. 验证计划与证据
所有下列测试当前 `NOT_RUN`。优先更新已有错误合同测试,观察期望红失败,再实现;不复制仅镜像实现的测试。测试对象为隔离临时数据,真实模型/线上账号不在本轮验证范围。
| 验证组 | 关键正常/拒绝/竞争场景 | 对象与方法 |
|---|---|---|
| 资料与身份 | 全空建号、填写清空、同名不同ID、格式/长度、未知/权限字段注入;同 expectedVersion 两写只有一胜者 | 真实 Store+HTTP,SQLite/PG 共用合同用例 |
| 目录与隐私 | self/system/member/duty权限矩阵;仅禁用电话命中的哨兵不改变结果/数量/游标;空词、限额、过期/跨范围cursor、未知过滤拒绝 | 真实 Backend provider;字段授权回调失败;序列化输出和错误无秘密 |
| 当前账号 | 密码/full/restricted/APIkey/旧Host/HITL/run/SSE;停用与建会话/兑换/最终写交错;启用不复活已撤对象;最后两管理者并发 | 两个独立 Store/连接;可控 barrier;双档,不靠 SQLite 单连接证明 PG |
| 恢复正例 | 网页建号→可信owner按原ID初始化,activation过期/交付失败/已兑换未设密可续办,首次完成后initializer拒绝;可信 owner 初始化→正式密码会话→管理员 metadata 提案→本人确认→一次受限兑换→设密→正式重新登录,身份和业务数据不变 | 真实HTTP、同源cookie;两HTTP实例共享隔离PG;无 mock 身份认证 |
| 恢复负例 | 初始密码/旧Key/reset 派生full、unknown lineage、APIkey/auth-off/提案后会话、错误owner、Bearer混合、管理员代确认均拒;资料不改proof | 实际旧/新HTTP链+CLI拒绝,确认前后数据库无不应发生的变更 |
| 原子与恢复 | confirm/revoke、redeem/reissue、completion/disable/activechange、登录insert/改密强制交错;100并发至多一有效能力;audit/commit失败回滚;响应丢失无管理员补领 | SQLite同文件双Store/PG同schema双连接;显式测试日志证实 PG 场景确实执行 |
| RDM 消费 | 项目管理先授权后lookup;不存在/disabled/provider缺失报错;章节/整文/批量三权拒失效候选;职责仍要求成员;正例I1隔离/cap保持 | 固定新Backend/RDM的实际注册提供者+命令/HTTP,不只 mock Host |
| UI 与兼容 | 管理员不见明文;全空资料建号;本人确认/无证明拒绝;确认/兑换响应丢失查状态、显式更换、失效退出;grant_setup/current_required正确显示;同名明确选择;旧接口迁移提示;桌面/移动无错位,design guard | 真实浏览器;surface snapshot/version/导出边界;不开放额外用户流程 |
| 迁移/组合 | 原ID保留;legacy Key restricted不能继续设密;既有密码强制态要求current且继承无proof来源;旧full无proof;disabled重启不复活;旧writer/不安全回退拒绝;组件固定pins+build | 隔离双档;Dev make test/build、test-pg及相关治理检查;当前HEADCI |
本地与作者工具结果为 SELF;独立审阅者重放须记录身份、命令、精确对象才是 REPLAY;当前 HEAD CI 有运行链接/受信执行身份才是 GATE。命令、对象SHA、完整脱敏输出由 `make evidence` 写入,任务卡/PR引用,不手抄测试通过。设计源码观察不冒充运行 FAIL 或 PASS。
## 11. 备选、代价及停止条件
主要备选是直接补资料、沿用旧目录和一次性 Key 交付。成本更低,但字段搜索仍可探测、管理员仍可接管目标账号,不满足已批准 IAM-D/IAM-C。另一个备选是本期同时建设外部身份/邮件/恢复码及 U4 授权权威,能改善无会话恢复,但扩大基础设施及迁移边界,当前不采用。
推荐本方案:一个账号权威、受控提供者、来源可追溯的本人会话、默认拒绝旧恢复旁路。代价是新账号需可信 owner 初始化,历史未知来源/丢失全部会话者不能线上恢复;最小搜索兼容也收紧,完整管理体验仍需 U7。方案批准不等于批准任何真实账号初始化或迁移。
遇到以下情况暂停受影响实施并修订:无法可靠判断 credential lineage 或默认拒绝旧能力;旧 writer/回退守卫不能落实;提供者必须依赖请求自报资格;新契约要求通用角色迁移、不可伪造插件本人proof、跨库 fencing 或外部身份证明;双档结果不一致;新的公共合同/权限设计需要改变本文取舍。已授权且不受影响工作可继续,不静默扩大范围或降低验收。
## 12. 交付出口
评审出口是本 r1 的明确兼容取舍及 U3 实施/测试范围。实施后分别给出需求到证据映射、剩余 U4–U9 差距、组件PR/固定组合、阶段6/7候选和独立Review记录。合入按有效 Review+当前HEADCI执行;生产上线、历史owner证明建立与工作区回收保持待授权;上线前须批准并演练§8的首次初始化/续办及异常恢复两份owner操作安排。
原 r1 仍是总方向,本补充是 U3 的具体设计对象。完成后主记录只更新真实推进状态,下一步优先核对 U4 的职位权威与现有在途工作,再提出具体任务建议;不得将本轮启动授权扩展到 U4。
@@ -0,0 +1,40 @@
# IAM U3 委任项目改名真实操作者围栏修订与实施计划 r1
状态:待阶段 4–5 人工重审;日期:2026-10-14。本文是已批准 U3 r1 及其 [A1–A4 增量修订](2026-10-14-iam-u3-stage6-review-amendment.md) 的**单点补充**。仅涉及 I1 已交付的委任项目改名投影在 U3 账号停用围栏下的真实操作者传递;不改变 RDM 项目职责规则,不启动 U4–U9,不授权 PR、合入、生产迁移、部署或真实账号操作。
## 1. 问题、对象与边界
独立只读复核在 Backend `4053c4d038b1d13a356e0196db56ab11c0e4f8e1` 后的 U3 未提交修复候选中发现:RDM `internal/rdmapp/system_projects.go` 已对请求主体 Bob 检查当前 `project.settings`,但委任 Bob 改创建者 Alice 的项目时,`internal/rdmapp/host_projection.go` 调用 `extension.NewScopedHost(Alice, "rdm")` 重建创建者 Host;Backend `internal/app/project_lifecycle.go` 的 `RenameOwnedProject` 将 Host owner Alice 同时作为最终 Store 事务 actor。若 Bob 通过 RDM 的最后授权检查后被停用,Backend 的 `projects` 表仍可在停用提交后由 Alice 身份完成改名。RDM 与 Backend 之间的授权快照窗口依旧不可原子关闭;**此次可关闭的是 Backend 同一账号数据库内 Bob 有效态与项目投影写入的窗口**,不能把后者归入已批准的跨库限制。
需求不变:项目创建者决定项目权限;获其委任且当前具有 `project.settings` 的成员可改名;系统管理员本身不因此获得项目内容或改名权。委任操作者停用后,已在途的物理投影不得在 Backend 最终事务中成功;创建者停用亦不应由旧 Host 句柄继续投影。项目 ID、创建者 owner 和委任 actor 是三个不同字段,不能互相代用。I1 的持久失败/恢复记录仍是跨库失败出口,不能假定两库提交原子性。
## 2. 推荐契约与备选
推荐新增**由当前受信请求 Host 派生**的可选项目投影能力,例如 `extension.DelegatedProjectProjectionHost.ProjectProjectionForCreator(creator, projectID) (ProjectHost, error)`。RDM 的 HTTP 生命周期回调和 `rdm.project.rename` 命令处理器都把当前认证主体绑定到各自传入的 `requestHost`;两条入口都必须从**该次收到的 Host**派生,不能另造操作者身份。派生句柄继承操作者 Bob、仅把资源 owner 收窄为 Alice。方法不接收调用方自填的 `operator`,也不复用按任意 owner 重建的全局 `NewScopedHost` 作为委任写入口。普通 `NewScopedHost` 继续服务既有读取/恢复能力,但不得替代新委任写入口。能力只向已注册的 RDM 项目生命周期/命令提供者开放;缺少能力、绑定不一致、项目不存在或插件来源不符时拒绝,不回退为创建者身份执行。
Backend 派生时核对原 Host 的操作者、插件来源、目标项目 ID 与持久创建者;RDM 仍按现有顺序检查 Bob 的当前 `project.settings`、项目 HostBinding 和改名意图。`RenameOwnedProject` 将**真实 actor Bob**、**创建者 owner Alice**、目标 ID 与名称分开送入 Store。最终 Store 事务按账号 owner 稳定排序锁定 Bob 与 Alice 并读取两者有效态,再取项目名称锁、读取持久项目 owner、校验名称并更新同一 `projects` 行;创建者本人改名时只锁一次。停用先提交则拒绝改名,改名先提交则停用等待;账号锁不授予 Bob 项目权限,RDM `project.settings` 检查继续独立存在。`auth-off` 缺失本地默认 owner 的例外只对该 owner 生效,明确停用记录拒绝。
未采用的方案:在全局 `NewScopedHost` 增加可自填 actor 参数,无法从受信请求句柄证明该 actor 是本次操作者;只在 RDM 最后授权后再查一次账号,仍有检查到 Backend SQL 之间的同库晚到窗口;把委任投影从 A1 承诺中豁免,则保留已知的 Backend 同库晚到写,与获批的 A1 契约不符。
## 3. 数据流、失败恢复与兼容
1. HTTP 认证主体 Bob → Backend 生命周期回调或命令分发的 requestHost(Bob)→ RDM 当前 `project.settings` 判定与 HostBinding/意图校验。
2. RDM 从**同一个** requestHost 派生 Alice 项目的投影能力;能力内部固定 `actor=Bob, owner=Alice, projectID=既定项目`,RDM 不提交自选 actor。
3. Backend Store 在最终事务中锁定并复核两个账号、项目 owner 与名称后提交物理改名;RDM 随后按 I1 原流程完成自己的数据库投影和意图记录。
4. 派生能力在改名意图建立前不可用时直接拒绝,RDM 数据保持原状;意图建立后的账号停用、权限撤回、超时或 Backend 写入失败按 I1 规则标记失败并保留恢复信息。重试需新的受信请求 Host 和原意图 actor,重新检查当前权限/账号;不可把旧创建者 ScopedHost 当作跳过 Bob 的恢复捷径。
这个修订增加一个可选公开 Go 能力,不改 HTTP 请求/响应、迁移表或现有 `ProjectHost` 方法集合;RDM 的测试替身需要显式实现派生能力。若正式 Backend 尚未发布该能力,RDM 委任改名须返回能力不可用,不能默默回退。Frontend 无需新控件;已有项目改名错误提示可显示拒绝。两个数据库之间以及 RDM 权限撤回后的瞬时窗口仍不能声称零窗口,按 I1 持久意图和人工核对规则处理。
## 4. 实施计划与可判定验证
1. 固定 Backend、RDM 和 Documents 候选 SHA;在 Backend `pkg/extension` 定义可选受信派生接口,在 `internal/app` 实现请求绑定、来源/项目核对。逐一追踪 HTTP 生命周期与 `rdm.project.rename` 命令两条入口;旧全局 ScopedHost 的委任写用法在两条改名路径全部替换,其它读取调用保持原状。
2. Backend Store 增加两账号稳定排序的最终事务围栏,仅在项目投影入口使用;检查 Bob 与 Alice 有效态、持久项目 owner、全局名称唯一性和 rows affected。保持单账号项目创建路径与 U7 bootstrap 锁序;不得在 RDM 回调或模型/网络调用期间持有 Backend DB 事务。
3. RDM 改名与失败重试从当前回调 Host 派生投影句柄,继续执行现有 `project.settings` 和 HostBinding/意图检查。缺少新能力时明确失败;已建立的意图按原规则保留,未建立意图的请求不凭空新增。补创建者本人、委任成员、停用创建者、错误绑定和权限撤回场景。
4. 用可控屏障在 Backend 最终投影 SQL 前暂停,分别在隔离 SQLite 双 Store、PG 双连接/两进程停用 Bob,再继续,断言 Backend 项目名不变、无创建者身份回退;反向顺序验证先改名后停用。并发 Alice/Bob 锁顺序测试不得死锁。RDM 组合测试同时覆盖无会话 `rdm.project.rename` 命令和 HTTP PATCH:委任成员仅有 `project.settings`、无 `doc.read` 时均可改名;两入口的停用围栏、授权撤回与失败意图恢复均成立,不宣称跨库原子性。
5. 重跑 Backend 全包/构建、隔离 PG、RDM 源码外 Go overlay、相关 Frontend 构建与浏览器路径;固定 SHA、命令和完整脱敏输出进入 Dev 任务卡 `SELF` 收据。随后重新提交阶段 6 人工评审;正式 pin、阶段 7、独立 Review/GATE、PR 与合入按既有前置分别处理。
停止条件:不能从受信请求 Host 得到真实操作者、测试发现 RDM 的回调来源并非可信身份、两账号锁序与 U7 冲突、或必须更改现有 `ProjectHost` 公开方法/持久数据设计时,先修订本文并重审,不以创建者代替 actor 继续交付。
## 5. 本次评审请求
请仅裁定本文件的阶段 4–5 契约与计划。批准后才实施上述新增接口与委任投影修复,并重跑受影响验证,再提交阶段 6 人工评审。本次不请求阶段 6 结论、阶段 7 验收、PR/合入、受信 tag、生产迁移或部署。
@@ -0,0 +1,58 @@
# IAM U3 阶段 6 审阅后契约修订与补测计划 r1
状态:待阶段 4–5 人工重审;日期:2026-10-14。本文是已批准 [U3 r1](2026-10-14-iam-u3-account-contract-and-plan.md) 的增量修订,不替换其已批准正文。对象是 U3 实施候选在合并 Backend U7 账号事务后暴露的四项缺口;U4–U9、生产迁移、部署和真实账户操作不在本次授权申请内。
## 1. 当前证据与为什么要重审
U3 r1 的实施候选为 Backend `4053c4d038b1d13a356e0196db56ab11c0e4f8e1`、RDM 源码 `ad815febce522d029a74cd90217409efc9a81c35`、Frontend `a961b19ebb793d6c02a72002050d269700b1a5bd`。Backend 在此后有**未提交的审阅修复候选**;它们不是已批准或已验收版本。Dev 任务卡 `feature/iam-u3-account-directory-recovery` 保存上述固定版本的 SELF 收据,RDM 任务卡保存源码外 Go overlay 的 SELF 收据。正式 pin、独立重放、GATE、生产与部署均 `NOT_RUN`。
独立只读代码审阅发现以下可复现缺口;现有绿色单测不推翻这些代码路径事实:
| ID | 触发与证据位置 | 对 U3 r1 的影响 |
|---|---|---|
| A1 在途写入 | `internal/server/server.go` 的 `createProject` 在读取请求体后调用 `Store.CreateProject`;`internal/store/projects.go` 插入时不读取当前账号。请求通过认证后暂停,另一连接停用账号,再继续请求,项目仍可在停用提交之后写入。其它非 GET 业务入口须同样盘点,不能只修这一条。 | 违反 r1 §7 Backend 有后果写入前检查有效态;同库可闭合的窗口尚未闭合。 |
| A2 API key 隐式建号 | `internal/app/app.go` 的 `CreateAPIKey` 调用 `Store.CreateAPIKey`;后者 `EnsureUser` 可创建启用、来源为 legacy 的账号,再签发完整 API key。 | 绕过 r1 §3 待初始化账号及首凭据边界;纯集成账号的历史读取兼容与新增建号须分开。 |
| A3 锁顺序 | 合并 U7 后普通建号走 account 锁再取 bootstrap 锁;首管及本地建号曾反向取得两锁,同 owner 并发有 PG 死锁风险。 | 影响首管与并发建号的活性及 U7 的准入保证。 |
| A4 游标与可见版本 | `internal/app/account_directory.go` 和 `internal/server/account_search.go` 以进程内随机密钥签游标,负载均衡切到另一实例时下一页 409。受限候选的版本又组合了全局 public revision,域外账号改名也会使该域游标过期。 | 违反 r1 §5 多实例分页及“目录版本只受可见辨识资料/有效态变化影响”的范围;后一问题还可成为域外活动侧信道。 |
本次提出的处理改变持久数据设计(共享游标签名密钥)和账号入口兼容行为(阻断 API key 隐式建号),并需要把原计划的“写前复验”细化为同库提交围栏。按 Dev `policy/delivery.md` 的“技术路线、模块职责、公开契约、数据或权限设计……修订方案或计划,经人工重审后继续”,阶段 6 评审暂缓,先审本文阶段 4–5 修订。
## 2. 修订后的契约
### A1:同库账号写入围栏
Backend 自有数据库内,每个以账号身份执行的有后果业务写入,必须在**最终写事务**内按统一顺序取得该 actor 的账号锁,读取当前 `enabled` 并在同事务提交业务变更。若目标资源另有 owner,仍由领域授权决定可写范围;账号锁不能授予项目或文档权限。停用事务取得相同账号锁并推进有效态,因此并发结果只能是业务写入先提交、停用后提交,或停用先提交、业务写入拒绝;不得出现停用提交后旧请求再写入成功。
实现采用显式 Store 事务入口和逐路由终点映射,不在请求全程持有额外数据库连接,也不以“handler 刚检查过”代替事务内复验。先盘点 Backend 当前 `66` 条非 GET API 路由,将凭据/资料写入(已有或补充最终事务复验)、Backend 自有业务写入、外部副作用/运行控制、只读或无业务后果动作分别记录。项目、会话消息、工件、设置、任务、工具/命令等适用的 Backend 自有写入改由同一账号锁和事务检查;文件或外部工具在真正执行前重验并使用既有取消机制,不能宣称跨外部系统原子性。`auth-off` 的本地默认 owner 继续按 r1 的嵌入式隐式身份规则处理;若存在明确停用记录则拒绝。独立 RDM 数据库的最终提交窗口沿用 r1 §7 已声明限制,不在 U3 声称零窗口跨库 fencing。
变更须给出“路由 → 最终 sink → actor/owner 来源 → 围栏方式 → 重放用例”清单;有未覆盖的有后果入口即阻止阶段 6 完成。对同一数据库中的认证版本、会话/API key 在途撤销窗口另作影响分析;若需要扩大本次安全承诺,先再修订本文,不用账号 enabled 检查冒充凭据撤销栅栏。
### A2:API key 不再建号
本地 `apikey create` 只对**已存在、当前启用、已完成初始化**的账号签发;迁移而来的 `legacy` 账号保留既有无密码集成 Key 兼容,但其 Key 不得作为 U3 本人恢复证明。待初始化账号、停用账号及不存在的 owner 拒绝,不执行 `EnsureUser`、不新增账号或 Key;现有 Key 不因本修订自动撤销。CLI 由当前机器/DB owner 边界执行,不能通过普通管理员 HTTP 或角色 grant 自助补领。未来新增纯集成账号须单列身份/授权方案,不能借 `apikey create` 的历史便利隐式建号。
Store 的旧 `CreateAPIKey` 目前被许多内部测试当建号 fixture 使用。生产调用入口先收紧;实施时应把内部 fixture 与正式签发 API 分离,并扫描所有非测试调用者,避免新调用重新打开隐式建号旁路。CLI 对不存在 owner 的返回由“创建并签发”改为明确拒绝,这是有意兼容收紧。
### A3:统一锁序
PG 账号事务统一按账号 owner 升序取得账号 advisory lock,再取得首次建号/末位管理员保护所需 bootstrap lock,然后锁用户行及后续 proposal、grant、session。SQLite 保持同等业务检查,依靠写事务串行。普通建号与首管竞争仍须保留 U7 的“空库同时入场仅一方成功”语义;不能通过改锁顺序让两方都成功。多 owner 操作按稳定排序,事务内重查 ID、版本和管理员资格。不得用死锁重试掩盖顺序倒置。
### A4:共享、分域且可见的游标
使用 256-bit CSPRNG 密钥,经共享账号数据库的 compare-and-set 在首次需要时原子持久化;保存密钥版本,绝不输出到 API、日志、任务卡或浏览器。管理搜索与领域目录以不同 HMAC 域签名,游标绑定密钥版本及 r1 原定的 actor、purpose、locator、范围、匹配字段、查询、过滤、可见目录版本。多实例从同一数据库读取同一密钥;密钥读取失败拒绝分页,旧进程本地随机游标切换时返回明确冲突并要求重新查询,不静默换页。
`AllCandidates` 的公共辨识变化可以使用全局公开 revision;有限候选范围的版本应由**当前可见候选集合**内的稳定 ID、有效态与获准辨识字段及领域 `ScopeVersion` 形成,不加入域外账号或未授权字段。快照读取与游标版本计算需在一致的数据库视图内完成,或在返回前复核版本并拒绝过期结果,避免版本与页面来自不同时间点。资料私密字段编辑不改变不获准字段的目录版本;当前允许披露的 `staffNo` 独立纳入版本。候选名单变化须失效旧游标。
若权威数据库已经实际应用 U3 v32,不能就地修改其迁移正文,必须追加新的迁移并给出旧游标废止步骤;只有证明 v32 尚未进入任何持久实例,才可在未发布候选内修订 v32。U7 `account_audit` 占 v31,U3 账号基础/恢复仍按已合并候选的 v32/v33 排序。
## 3. 实施与验证顺序
1. 固定当前主干与候选 SHA,盘点 66 条非 GET 路由、Host/runmgr 出口及账号写入者;给每条有后果 sink 指定最终有效态围栏和测试。完成 A2 生产入口及内部 fixture 分离,补“不存在/pending/disabled 均不建号或签 Key”双档测试。
2. 按 A3 统一 PG 锁序。用两个独立连接/进程和可控屏障覆盖首管对普通建号、同 owner 建号、管理员停用对初始化/改密;验证无死锁、唯一成功与事务审计。
3. 落 A4 密钥持久化、域分隔和范围内版本;补 SQLite 两 Store、PG 两实例跨进程翻页、字段/范围变动、域外改名、密钥不可见和故障拒绝测试;确认迁移版本前置事实。
4. 按 A1 路由清单逐类实现最终写围栏。用暂停请求体和暂停最终 SQL 写入的确定性测试,在 SQLite、PG 双连接与 PG 两进程验证“停用先提交则无晚到写”;覆盖项目、消息、工件、设置等代表性入口及实际 RDM 限制说明。外部副作用单独验证最后检查与取消。
5. 同步最新 main,重跑 Backend 全包、PG Store/Server、RDM 源码外组合与 Frontend 正常测试;对受影响真实浏览器路径重放。三仓正式 pin、GATE、独立 Review、阶段 7 验收仍遵守原计划的后续人工节点和受信发布前置。
## 4. 评审决定
请只裁定是否批准本修订的阶段 4–5,使 U3 阶段内可继续上述修复和隔离验证,然后**重新提交阶段 6 人工评审**。不请求现阶段批准阶段 6、阶段 7、PR 合入、受信版本 tag、真实机器/数据库账号操作、生产迁移或部署。若 A1 的全路由写围栏成本或 A2 的 CLI 兼容收紧不可接受,应在此处明确缩小验收承诺或另立增量;不得保留原 U3 §7 的完成声明同时留下已知晚到写。
@@ -0,0 +1,113 @@
# Dev main 第二轮 manual 合入调度实施与测试计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 让第二轮三个已授权真实任务在同一人工窗口中按序完成最终同步、审核、CI 与智能体合入,同时把所有已知 Dev main 写入及失败退出记录在唯一调度 Issue;正常排队推进不使等待分支反复重跑最终 CI。
**Architecture:** 保留现有 Gitea 分支保护、三项 PR 检查和 `task-sync`;Dev `policy/` 仅说明项目采纳、写者覆盖、记录字段及停止条件。Issue #518 是动态窗口唯一来源,原任务卡保留授权与阶段结论。只读对账从实际 main PR/合入列表反查 #518 的先前领取与事后释放;无原子锁、无自动调度服务。
**Tech Stack:** Git/Gitea 1.27 API、Dev `make precheck`/`make evidence`/`make task-sync`、Markdown 规范与 JSON 收据、现有 `.gitea/workflows/ci.yaml`。
**Spec:** [已批准的阶段 4 设计](2026-10-14-merge-queue-manual-phase2.md),Documents PR #104(合入 `8e3b5b0d2838f89430683ec731a15b32b4fa5eae`);[首轮报告](../records/2026-10-14-merge-queue-trial.md)与 Dev #518 是历史与动态证据,不能以本计划代替实时回读。
## Global Constraints
- 范围仅为 Dev 仓库 ID=29、`refs/heads/main`;普通、闭卡、紧急和机器人目标写入都纳入同一记录。组件仓按自身目标协调。
- 第二轮样本为**随后实际就绪的三个已授权真实任务**;闭卡单列。#482、#512、#537 不因本计划自动取得接管或合入授权。
- 现有 Gitea 保护、必需检查、CI workflow 和 runner 全局配置保持不变;最终 PR HEAD 的 `test`、`test-pg`、`svc-realcombo` 均须取得真实 GATE。
- 采用单一协调者维护的 `manual` 窗口。Issue 编辑、评论、`content_version` 和本地锁都不是平台原子互斥;旧执行者未确认退出时不得接管。
- 无进展 20 分钟、单窗口 90 分钟、已知基础设施失败最多额外重试一次、队列每 30 分钟复核;领取前当场核对 runner 容量。
- 阶段 5–7 依 `policy/delivery.md` 分别取得人工结论;阶段 8–9 由智能体审阅、核验精确 HEAD 与平台准入并合入。阶段 5 批准不等于第二轮已启用。
- 所有通过断言区分 GATE、REPLAY、SELF;本地输出经 `make evidence` 写入,固定后收据置于源码外;未知结果先读回,不盲目重复副作用请求。
## Review Focus
1. **已知写者仍从另一入口推进 main:**任务 2 的对账应查到实际合入但缺先前领取,暂停新领取并标记受影响候选失效。
2. **Issue 中只有事后补记:**任务 2 的对账应区分先前领取与事后释放;#539 不能被算作合格覆盖。
3. **候选固定后内容或 base 变化:**任务 3 的核验应建立新尝试,并拒用旧 Review/CI;同基线重复 `task-sync` 应保持 HEAD 不变。
4. **合入响应未知或协调者失联:**任务 3 应先回读 PR/main 并保持 `reconciling`,确认前执行者退出后才释放/交接。
5. **没有三个已就绪任务:**任务 4 应保持 `waiting`,不接管 #482/#512 或制造生产 PR,不把缺样本写为通过。
| 设计验收 | 计划中的主要验证 |
|---|---|
| M2-1 | 任务 2 入队字段、任务 4 三个真实任务与等待期间最终 CI 清单 |
| M2-2 | 任务 2 的逐合入只读对账、任务 4 每次 main 推进后的覆盖核对 |
| M2-3 | 任务 3 的同基线无变更与变更后新尝试重放 |
| M2-4 | 任务 3 的精确 HEAD 三项 GATE/智能体合入、任务 4 的每任务对象记录 |
| M2-5 | 任务 4 对正常排队造成的最终 CI 废弃数和所有 CI 成本分类 |
| M2-6 | 任务 2/3 的异常决策表与任务 4 的自然退出/`NOT_RUN` 记录 |
---
### Task 1: 固定实施范围与 Dev 规范入口(M2-1、M2-3)
**Files:**
- Modify: Dev `policy/merge-queue.md` 的状态、项目调度记录、启动与同步、采纳顺序及验收表。
- Modify: Dev `policy/adoption.md` 中合入调度采纳行。
- Modify: Dev `policy/tool-adaptation-matrix.md` 的 A10/A11 行。
- Read only: Dev `AGENTS.md`、`policy/delivery.md`、`policy/governance.md`、Guidelines 固定版 `standards/merge-queue.md`。
**Interfaces:** 仅细化已固定通用规范,不改 `task-sync`、`make evidence` 或 CI 接口。规范链接指向 Documents 阶段 4 设计和 #518;`policy/adoption.md` 区分“规范已合入”“第二轮待启用”“manual 能力”;A10 说明 Issue 协作与平台准入的不同强度。
- [ ] 在 Dev 当前 main 创建未占用收据路径,运行下列启动门禁并确认 READY;按输出读必读规范。新任务用同一收据建独立工作区,记录 R0 与写者归属;若任务已登记则在原 worktree 改用 `make task-resume PRECHECK_RECEIPT="$mq_receipt"`,不重复开卡。BUSY、SYNC_REQUIRED、REMOTE_UNVERIFIED 先排除。
```bash
mq_receipt="/tmp/mq-phase2-stage6-precheck-$(date -u +%Y%m%dT%H%M%SZ)-$$.json"
RECEIPT="$mq_receipt" CMD='make precheck' make evidence
make task-start NAME=feature/merge-queue-manual-phase2 PRECHECK_RECEIPT="$mq_receipt"
```
- [ ] 对照当前 Dev main、Guidelines gitlink、#518 与已合入设计。把 `policy/merge-queue.md` 首轮“本轮三个任务待完成”“本分支”等已过期时态改为历史结果,把第二轮规则明确标为 `approved/pending-activation`,并逐项写明 `ready_at`、`queue_entered_at`、`attempt_id`、`initial_base_sha`、`source_head_sha`、`sync_base_sha`、`frozen_head_sha`、组件/检查定义、Review 与 GATE、实际合入/释放。动态值只在 #518,不复制静态队列表。
- [ ] 在 `policy/adoption.md` 与 A10/A11 中指向同一设计及项目规则:保留首轮原始证据范围;第二轮标 `manual`、`pending-activation`,不可升级成 `enforced` 或声称自动互斥;现有源码外收据能力保持原样。
- [ ] 检查 `AGENTS.md` 与 `policy/delivery.md` 对合入窗口及阶段 7–9 的指向。若现有入口已覆盖,只记录无需修改;若确有入口断链,按文档范围补链接并将变化列入 Review。
- [ ] 运行 `git diff --check`、Markdown 相对链接检查和规则一致性检查:阶段 5 批准后尚未启用、缺写者覆盖时必须保持 waiting、三个必需检查没有删减。若动到治理脚本或任务卡模板,另运行 `CMD='make test-governance' make evidence`;纯文档不制造新脚本测试。
- [ ] 将本单元源码与 SELF 检查收据写入原任务卡并提交;阶段 6 人工评审前不把 #518 标为第二轮 active。
### Task 2: 建立 #518 入队模板与只读覆盖对账(M2-1、M2-2、M2-6)
**Files:**
- Modify: Dev `policy/merge-queue.md` 的记录示例、写者覆盖、异常与暂停规则。
- Prepare then update after Stage 6 approval: Gitea Dev Issue #518 正文的第二轮入口与追加式评论模板;不建立第二份队列状态文件。
- Save outside source: 每次只读 Gitea API 对账的原始脱敏 JSON/`make evidence` 收据;必要结论只引用对象和链接。
**Interfaces:** #518 条目至少包含 `entry_id`、目标、PR/任务卡、owner/协调者、授权与阶段版本、依赖、`queue_entered_at`、`ready_at`、状态;领取评论补 Task 1 的 attempt 字段;释放评论补实际 PR/main SHA、合入结果及 GATE 链接。`ready_at` 未知标 `NOT_MEASURED`,不足条件标 `blocked`。
- [ ] 只读查询 Dev 当前 main SHA、开放 PR、仓库协作者、可写工作区 owner、机器人/webhook/workflow 入口、#518 正文与评论,生成带观察时间和对象 SHA 的 SELF 清单;无法查到的写者类别标“未核验”,不推断不存在。
- [ ] 在 Task 1 规范中给出普通、闭卡、紧急、机器人共同的入队/领取/释放字段,规定 `blocked` 不占窗口;跨仓组件未就绪不占 Dev 窗口。未知来源与旧执行者未退出必须暂停或 `reconciling`,不得靠 20 分钟超时接管。
- [ ] 固定只读对账步骤:枚举观察区间内实际合入 Dev main 的 PR/merge SHA;逐个在 #518 找**合入前**同目标同 attempt 的领取和**合入后**释放;同时反查 Issue 中仍占用但 PR 已关闭/合入的窗口。分列“合格、仅事后补记、未找到、结果不明”,保留 API 原始响应与分页范围。
- [ ] 用 [阶段 4 SELF 快照](../records/2026-10-14-manual-phase2-source-audit.json) 回放对账口径:#539 属“仅事后补记”,#540/#542 能找到领取/释放,其余七个仅可记“在该次 #518 观察中未找到”;不得倒推出其他渠道绝无协调。源记录更新后另取实时快照,不用历史快照证明当前覆盖。
- [ ] 将模板与覆盖清单先作为 Dev PR/任务卡可审附件;Stage 6 人工确认后才更新 #518 的**待启用**入口。写入前读回 `content_version` 与活动窗口,遇到别人更新先重算差异;请求结果未知先 GET 对账,不重复 PATCH/POST。
- [ ] 当场向每位**已知目标写者**核实采用同一窗口的确认;未确认类别逐项留记录。没有全体已知写者覆盖,不转 active、不领取三个样本。人工确认不等于 Gitea 执行端隔离。
### Task 3: 用现有门禁交付 Dev 规则并验证异常边界(M2-3、M2-4)
**Files:**
- Modify: Task 1/2 的 Dev 规则差异及原任务卡(仅在候选固定前)。
- Save outside source: 最终 precheck、task-sync、直接相关检查、Review 和 CI 的原始收据及对象索引。
**Interfaces:** 复用 `make task-sync`、`make evidence`、Gitea PR/Actions 与现有分支保护;不新增自动队列或跳过 CI 的入口。
- [ ] 在阶段 6 人工通过后,正式测试前对 Dev 规则 PR 执行一次 `make task-sync`,处理真实冲突、确认组件不回退,先写完任务卡和需提交证据,再固定并推送 PR HEAD。若有脚本/模板改动跑 `make test-governance`,Dev 组合按变更影响跑 `make test`/`make build`,由 `make evidence` 保存完整 SELF 输出。
- [ ] 在临时真实 Git 场景复核同 base/head 重复 `task-sync` 的 HEAD、索引和组件不变;目标前进或候选内容变时,新 attempt 的 base/head 与旧 CI/Review 不同,旧结果不能放行。若本增量未改同步脚本,引用现有治理回归并做最小重放,不重复整个历史试行。
- [ ] 用只读或隔离模拟验证异常决策表:未登记 main 推进→暂停及候选失效;合入 API 超时/断连→`reconciling` 并先读 PR/main;代码/Review 失败→当前条目 blocked 并安全释放;未发生真实生产故障的路径只标模拟或 `NOT_RUN`。
- [ ] 阶段 7 人工审阅固定候选与测试映射后,由智能体完成阶段 8 Review 与影响重放;阶段 9 合入前再次同步核对最新 base/head/组件及当次要求的 GATE 身份、SHA、三项结果。合入请求固定 `head_commit_id` 且 `force_merge=false`,回读 PR/main 树与合入 SHA。若候选改变,重新测试及受影响评审,不沿用旧绿灯。
- [ ] 把实际阶段 6/7/8/9 结果及 GATE/REPLAY/SELF 来源写入原任务记录;规则 PR 合入并不自动启用第二轮任务窗口。
### Task 4: 第二轮启用、三任务试行与收口(M2-1–M2-6)
**Files:**
- Update dynamically: Gitea Dev Issue #518 与每个**原任务**的任务卡/PR。
- Create after actual observation: Documents `docs/records/<实际日期>-merge-queue-manual-phase2-trial.md`;与 #518 互链,不复制动态队列状态。
- Update only after result review: Dev `policy/adoption.md`、`policy/tool-adaptation-matrix.md` 的实际能力和状态(若有变化)。
**Interfaces:** Task 2 的 #518 模板;每个任务原有人工阶段与接管授权;固定 PR HEAD 的三项 GATE;智能体合入入口。此任务不承担其他任务业务代码实现。
- [ ] 在规则 PR 合入、#518 模板已登记、已知目标写者确认覆盖、无活动/未知窗口、runner 容量当场核验后,由负责人审阅启用条件与当前清单,再把第二轮从 `pending-activation` 切为 `manual active`。缺任何条件保持 `waiting`,继续独立局部开发。
- [ ] 只让三个**实际就绪且已有自身实施/合入授权**的任务依 `queue_entered_at`/`ready_at` 顺序入队;协调者在领取前核对原卡阶段结论、PR head、依赖、组件与其他写者退出。#482/#512 只有重新满足这些条件才可参与,不能因本计划自动接管。
- [ ] 每次领取后按 Task 3 固定并通过当前 HEAD 必需检查、Review 与人工阶段结论,智能体串行合入并释放;闭卡 PR 使用独立窗口,成本单列。每 30 分钟复查等待队列,记录 runner 等待与人的依赖/准备等待;时间缺失记 `NOT_MEASURED`。
- [ ] 每次 main 实际推进后运行 Task 2 只读覆盖对账;发现未登记合入、并行窗口、对象不符、旧执行者未退出接管或来源伪造时立即暂停新领取,先核清受影响候选和写者。未知合入结果不重发 POST。已合入成果不自动回退。
- [ ] 三项完成或触发停止条件时,按 M2-1–M2-6 列每个真实任务的最终 base/head、同步/新尝试原因、Review、GATE、合入树、开发/最终/main push/组件/闭卡 CI 次数与耗时、废弃原因;仅正常已登记顺序推进造成的最终 CI 废弃数作为目标指标。没有可比历史基线时不报告节省百分比,未发生的退出路径记 `NOT_RUN`。
- [ ] 用户评审第二轮报告后决定继续 manual、调整预算、停止或另立自动准入;仅实际合入与经核验的能力可更新 Dev 采纳/矩阵。阶段 10 的安全回收按工作区 owner 和 `task-finish` 现场检查执行,任务闭合经有授权的 `task-close` 与智能体 PR 合入;保留所有原始收据。
## Stage 5 decision and stop rule
2026-10-14,负责人 weichen 在本任务会话中对 Documents 草稿 PR #105 的计划稿 `28c4ceb17315e1bb06f8e39c8407eb525effb8fe` 回复“通过阶段 5”,并选择由当前智能体逐项实施。批准覆盖本计划的阶段 6 候选编制与自检,不替代阶段 6–7 的人工结论,也不等于 #518 第二轮 active。任何实施中发现原子互斥、角色隔离或执行端 fencing 被要求为通过条件,应停止扩围并回到阶段 4 重设计,不能靠文字提升 `manual` 能力。
@@ -0,0 +1,74 @@
# Dev main 合入调度第二轮 manual 扩围设计
状态:**阶段 4 方案设计与[阶段 5 实施计划](2026-10-14-merge-queue-manual-phase2-implementation-plan.md)均已通过;阶段 6 实施待评审**。2026-10-14,负责人 weichen 在本任务会话中对 Documents 草稿 PR #104 的规范稿 `aa4d372f01d0473928c570aa69c09ca771f2de45` 明确回复“通过阶段 4”,随后对 PR #105 的计划稿 `28c4ceb17315e1bb06f8e39c8407eb525effb8fe` 回复“通过阶段 5”,选择由当前智能体实施。这些批准不等于启用第二轮窗口或接管其他任务。执行协调者须在每个窗口明确登记。本文只设计 Dev 仓 `refs/heads/main` 的下一轮人工调度,不启用自动队列。
主记录:[Dev 调度 Issue #518](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/issues/518);既有规则:[Development-Guidelines 固定版合入调度](https://gitea.naitangbaobao.cn/weichen/Development-Guidelines/src/commit/2f5b19872be2a4597838a4131ad75d1be089ee5e/standards/merge-queue.md)、[Dev 项目细化](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/src/branch/main/policy/merge-queue.md);首轮结果:[三任务试行报告](../records/2026-10-14-merge-queue-trial.md)。本稿为下一轮范围与验收设计;动态队列状态只维护在 #518,不复制第二份任务进度表。
## 1. 评审结论与问题
首轮 #489、#488、#486 在同一协调者下顺序合入,每个真实任务只有一次最终 PR CI,三项各自合入后的 main CI 另计;没有因首轮正常顺序合入废弃的最终 CI。首轮报告将 MQ1、MQ5–MQ7 的未覆盖部分及自动原子领取、旧执行者拒绝列为部分满足或 `NOT_RUN`,不得据此宣布全仓自动约束已就位。
2026-10-14 22:13(Asia/Shanghai)对 #518 当前正文/评论和 Dev PR #539–#548 的只读 API 对照([SELF 观察快照](../records/2026-10-14-manual-phase2-source-audit.json),原始本机文件 `/tmp/mq-manual-expansion-audit-20261014.json`)显示:这十个 PR 均已合入;[#540](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/540)、[#542](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/542) 有窗口领取与释放记录;#539 只有合入后的事实记录;其余七个在当前 #518 正文与所返回的评论中找不到对应 PR 的窗口记录。这是**记录覆盖缺口**,不等于断言这些合入未经其他人工协调。它使“所有 Dev main 写入者都受同一 manual 窗口控制”的结论无法成立。
[#537](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/537) 曾取得旧候选绿色 GATE,但 Stage 8 审阅判为 `NOT READY`,窗口释放,后由用户取消且 PR 未合入;该例证明 CI 与人工阶段结论须分别核验。[#542](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/542) 的归档文字变化使旧候选作废,run 3100 不能放行新 head,run 3107 才属于实际合入对象。两者是应保留的正常失败/恢复事实,不计为“因正常排队 main 移动而浪费的 CI”。
目前 Dev 开放 PR 只有 #482 与 #512:#482 非草稿但落后 main、平台回读不可合入;#512 为草稿。两者的既有绿色状态均属于旧对象,且未取得本轮写者接管确认。因此**当前没有可直接领取的第二轮任务**,不得为凑满数量生成生产 PR、自动同步它们或把队列扩围理解为接管授权。
平台当前只读回读(SELF):Dev `main` 禁直推/强推,拒绝落后分支,要求三个 PR 检查上下文 `ci / test`、`ci / test-pg`、`ci / svc-realcombo`,管理员不可绕过合入。它仍不能区分共用账号下的人与智能体,也未把 #518 的窗口写入变成原子锁或执行端 fencing。本轮不变更保护、批准数、CI workflow 或 runner 全局设置。
## 2. 目标、范围与非目标
**目标:**在保留人工阶段评审和现有平台准入的前提下,将首轮单一协调者的经验扩展为可供多个已授权任务 owner 依次使用的 **manual** 窗口;在候选固定后减少因正常排队合入而造成的无效同步和完整 CI;准确统计没有节省的成本与退出案例。
**范围:**仅 Dev 仓库 ID=29、托管实例 `gitea.naitangbaobao.cn` 的 `refs/heads/main`。普通 PR、任务卡闭合、紧急和机器人目标写入均须出现在同一调度记录;不同组件仓按各自目标协调。候选任务原卡仍是需求、授权、阶段和证据的主记录。第二轮以随后实际就绪的三个已授权真实任务为观察样本,闭卡 PR 单列成本与窗口,不充作三个业务任务。
**非目标:**自动优先级、合并列车、批量/预测合并、复制旧 CI 状态、降低必需检查、调整分支保护、发布/部署、代替其他任务 owner 编写业务代码。#482、#512 和已取消的 #537 不因本设计自动变为就绪或重新授权。
取舍:立即把所有 PR 宣称为受控 manual,管理成本最低,却与七条找不到 #518 窗口记录的实际合入不符;只点名三个任务而放任其他 main 写入,不能解决等待者因外部推进失效的问题;直接建设自动队列需要真实原子领取和执行端旧代次拒绝,超出用户选择的 manual 范围。本设计选择先确认已知写者覆盖与记录完整性,再接收三个真实就绪任务;覆盖不足时诚实标记并暂停,保留以后另立自动机制的边界。
## 3. 第二轮 manual 协议
### 3.1 入队与覆盖
任务 owner 在最终同步之前登记目标仓库/分支、任务卡与 PR、授权范围及阶段结论、源 HEAD、依赖/组件、现有写者和预计最小重放集。`ready_at` 只在依赖已落主干、必要人工结论与写者排他确认均齐备时记录。尚缺任一条件的条目标 `blocked`,可以继续自己的局部开发,不领取窗口;入队不要求提前合入不断移动的 main。组件仓未交付时不占 Dev 窗口,也不持有一个目标窗口等待另一个目标。
第二轮启用前,协调者核对当时的开放 PR、可推进 main 的工作区 owner、仓库协作者、机器人/webhook 和 workflow 入口,并取得**已知目标写者**采用同一窗口的确认。普通、闭卡、紧急及机器人合入均须走 #518;仍有未接入写者时如实登记其范围,不能声明全写者覆盖,也不能保证等待任务免于外部 main 移动。
协调者按就绪时间与已批准的紧急理由安排顺序,领取前读回 #518、实际 Dev main/PR、分支保护和 runner 资源。#518 的当前窗口字段只写一个目标尝试;评论保留追加式时间线。领取后再读回核对,无匹配或发现另一执行者时停止。Issue 的 `content_version`、本地锁和评论均**不等于平台原子互斥**;本模式依靠明确写者遵约和受保护分支的最终准入。协调者换手时须确认前执行者退出及未知合入结果,不能凭 20 分钟超时自动接管。
### 3.2 固定、检查与合入
一个窗口以 `attempt_id` 标识:`target`, `owner/coordinator`, `claimed_at`, `last_progress_at`, `initial_base_sha`, `source_head_sha`, `sync_base_sha`, `frozen_head_sha`, 组件清单、检查定义、Review 对象、GATE 运行与真实结果。新增 `ready_at` 与 `queue_entered_at`,使任务等待时间和 runner 等待时间分开计算;时间未知时记 `NOT_MEASURED`,不倒推填造。
窗口领取后执行一次真实 `task-sync`,处置冲突、物化已合入组件并完成应提交的任务卡/收据;此时才固定父仓候选。目标未变的验收、Review、合入节点只做同基线核验,不生成记录提交或重复完整 CI。最终 CI 仍由现行 workflow 在**固定 PR HEAD**上运行 `test`、`test-pg`、`svc-realcombo`;独立 Review、人工阶段结论与 CI 分别审查。合入前再次核对最新 base/head、组件、保护和三个 GATE 作业身份与结果;智能体使用固定 `head_commit_id`、`force_merge=false` 经 PR 合入,回读实际 main 树、合入 SHA、组件和后续 main push CI。
源 HEAD、目标 base、组件、检查定义或相关环境改变时建立新尝试,并按影响补测/复审。旧结果保留其对象范围;不为减少 CI 次数制造绿色状态。开发期 CI、最终 PR CI、合入后 main CI、组件 CI 和闭卡 CI 分开统计。
### 3.3 失效、异常与未登记推进
发现 #518 未登记的 main 推进时,协调者先读回目标、PR、运行和活动窗口;将受影响的固定候选标失效,记录缺口来源与对象,暂停本轮新领取,待写者覆盖和影响范围核清后恢复。不得把“记录中没有”推断为平台阻断已生效。代码或 Review 失败、依赖不满足、需要人工决定超时:保存现场与原始证据,受影响条目 `blocked` 并安全释放;其它目标和局部开发继续。合入请求超时、断连或结果不明:保持目标 `reconciling`,查询 PR/main 真实状态;未确认旧执行者退出前不重发有副作用的请求,也不移交窗口。
预算沿用首轮:无进展 20 分钟、单窗口 90 分钟、已知基础设施失败最多额外重试一次、等待队列每 30 分钟复核一次。领取前重新核对当时 runner 容量,不把首轮的 capacity=12 当作永久事实;资源不足先等待,不在窗口中空占名额。预算变化必须在实际成本复盘后另行评审。
## 4. 验收、观察和停止条件
| ID | 可判定条件 | 证据与边界 |
|---|---|---|
| M2-1 | 第二轮的三个真实任务均有原卡授权、阶段结论、owner 确认和先行组件;等待期间不为追 main 重跑最终 CI | 每任务原 R0、入队/就绪/领取时间、固定 base/head、源外收据;缺任务时保持等待,不制造 PR |
| M2-2 | 每次 Dev main 实际合入在 #518 可找到同对象的先前领取和事后释放;闭卡、紧急、机器人同样登记 | 以实际 main merge/PR 列表对照 Issue 正文/时间线;遗漏即覆盖失败,不能声称“全写者受控” |
| M2-3 | 稳定候选同基线重复 `task-sync` 不改 HEAD;对象变化拒用旧 Review/CI | 独立重放及精确运行 SHA;本轮记录每次新尝试原因 |
| M2-4 | 三个真实任务各自取得当前 HEAD 三项必需 GATE 后由智能体合入,实际树与候选一致 | PR/run/job/actor/runner 链接及合入后 main 回读;平台仍是最终准入 |
| M2-5 | 正常已登记任务顺序合入造成的最终 CI 废弃数为 0;候选整改、外部推进和基础设施失败另计 | 完整列出开发、最终、main push、组件、闭卡运行次数/耗时与废弃原因;无可比基线不报告节省百分比 |
| M2-6 | 自然发生的 blocked/withdrawn/reconciling 均如实记录并安全处理;某类未发生则标 `NOT_RUN` | 不制造生产故障凑数;#537 历史可作设计参考,不冒充第二轮执行 |
若有未登记 main 合入、并行窗口、对象不匹配仍合入、伪造来源、旧执行者未退出即接管,立即暂停扩围并先对账;这是试行停止条件,不自动回退已经合入的成果。三个条目及闭卡均核验后形成第二轮报告,人工评审是否保持 manual、调整预算或另立自动准入项目。本轮即使全部满足,也只证明声明范围内的**人工协作**;自动锁、所有角色的执行端隔离和旧代次 fencing 继续 `NOT_RUN`。
## 5. 采纳顺序与阶段 4 决定
1. 阶段 4 已由用户按规范稿 `aa4d372` 批准;智能体完成本设计的 Review 与 Documents PR 合入。阶段 5 计划获批前不改 Dev 规则/Issue 状态,不领取新任务。
2. 另编实施/测试计划:对账 `policy/merge-queue.md`、`policy/adoption.md`、`policy/tool-adaptation-matrix.md` 的首轮历史快照与当前动态入口,确定 #518 第二轮条目模板和只读合入覆盖核对方法;有脚本变更时运行 `make test-governance`。规范源码、项目采纳及 Issue 记录分别标阶段,不把计划写入视作已启用。
3. 经计划阶段评审后,按 Dev 首次 precheck、独立工作区、Review、当前 HEAD CI 与智能体 PR 合入流程交付必要规范更新。高后果保护变更若将来必要,仍由用户亲手执行,本设计不要求该动作。
4. 各真实任务 owner 在自己的授权与阶段下自愿入队;协调者确认全写者覆盖、同目标唯一窗口和资源,再领取。当前 #482/#512 不满足这一步。
5. 第二轮达到三个真实任务或触发停止条件后,按本设计 M2 指标复盘;由用户作继续、调整或回退的阶段决定。
**阶段 4 决定:**用户已批准以“先补全 Dev main 合入记录覆盖、后接收三个真实就绪任务”的受控扩围作为第二轮设计,遗漏目标推进立即暂停、现有预算不变、闭卡单列成本,当前无就绪任务时保持 `waiting`。这一决定只批准设计;#518 与仓库规则的第二轮启用仍受阶段 5–7 评审及实际写者覆盖核验约束。
@@ -0,0 +1,139 @@
# 最新模板驱动的两树一网、成员工作上下文与完整可读审计
修订:r12;更新时间:2026-10-19;需求负责人:用户;记录/准备:实施记录。
当前阶段:**2026-10-19 按部分交付收口**(用户决定)。已交付并合入各仓 main:W2/W4a 项目结构与只读快照隔离、W4b 真人确认、W6 历史来源逐项复验、W9 审计截止水位,以及统一文档渲染器 Task 1–12 与 44 份 DHF 模板发布。未交付:W3 递归文档实例、W5 追溯网、W7 上下文提供方、W8 RDM 审计投影、W10 正式前端、W11 DHF 全量保真、W12 含真实模型的全组合验收、W13 收口,以及新增 X3/R3/F3/V3 产品链;这些另立后续大任务按 manual 逐增量评审。E1 保真判据仍未通过,正式运行验收 NOT_RUN,未部署。
## 目标与成功标准
根据最新`.templates`模板及`.tmp`材料补全RDM两树一网:细致完整的内容结构、每项目可扩展的节点与要求、随资料和进度提出调整并经人确认生效;同项目成员工作时自动使用当前权限内的项目依据;完整记录人物、时间、动作、内容、结果、依据和影响,以人可读的摘要与结构化详情展示审计。
成功须同时具备44份新模板的可核查接入、动态递归结构与原子版本化确认、成员真实工作上下文、完整操作留痕/追溯及可读审计。原28项及新增TT-N03/R01合计30项已确认子需求;当前目录或模板条目数量不能代替真实能力与验收。准确来源计数和差距见原对象,不缩成标题导入、只处理部分模板或仅翻译op码。
## 唯一当前记录与原对象
- [阶段1需求拆解r1原对象](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-requirements-r1.md):用户选择“确认需求,继续按阶段人工评审”;SHA256 `60fd0296840a74982ae65cc4bd1e6a810ace5109e103e8408a94d4db0573bad7`。
- [阶段2需求评估r1及E1试验提案原对象](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage2-evaluation-r1.md):用户“批准”;SHA256 `61733945c077ae6b8f8488ee5a0e41337d7e4a019854dc647e93fecbb4b72178`。原对象保留批准前文字,当前结论在本记录更新。
- [阶段3需求与验收条件r1](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage3-requirements-r1.md):28项完整范围、优先级、依赖及可判定验收,用户已确认;需求主表在Dev任务卡并逐项引用本稿。
- [阶段4方案设计r1](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage4-design-r1.md):推荐路线、共享DHF合同、项目结构/版本、X1/X2扩展、完整可读审计及恢复/验证;用户已批准。SHA256 `568aa26f6b2276f786109e2298b3ae36c6c14d3be5a54e0dfc95bf1b2db4603b`。
- [阶段5实施与测试计划r1](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage5-implementation-test-plan-r1.md):W0–W13跨仓分工、依赖、测试环境/费用上限和全部28项证据映射;用户已批准。SHA256 `b755ef629fae37854b8d0bc344b3f14c6933e4455be74244b9821a6d71b64ebe`。
- [E1结果报告r1](/home/weichen/.codex/visualizations/2026/10/13/01a13639-7c7c-7f20-aece-a3937edf6229/e1-20261014-091421/REPORT-r1.md):原件保全;解析路径部分可行,自动保真未通过;全部原始产物/完整SELF收据按批准范围留源码外,未发布为正式模板。
- [来源、固定对象与完整SELF收据](../records/2026-10-14-rdm-two-trees-latest-templates/README.md):原字节保留,历史状态不冒充当前事实。
原对象正文只在records各维护一份;本文件维护当前目标、批准、推进与接续状态。任务卡和项目入口引用本主记录,不另维护另一套方案。
## 用户确认与授权
| 决策/阶段 | 对象与结论 | 确认人及依据 | 当前有效范围 |
|---|---|---|---|
| DYN-01 | 提出变更,确认后应用;已确认 | 用户;本聊天call_8724a18c54b243c5b0e6edfb0c1d50b2第0项答复 | 所有动态结构候选确认后才生效;受控文档仍遵守三权 |
| 阶段1 | 需求拆解r1,通过 | 用户;call_22243aaf29ae4ad19c4322a1d7fd8b0f第0项答复;批准对象hash见上 | 确认目标、场景、28项子需求;继续按阶段人工评审 |
| 工作区 | 原负责人先收尾并同步 | 用户;同一call第1项答复 | 本任务没有接管旧现场;待其完成后建立独立任务工作区 |
| 阶段2/E1范围 | 通过/批准执行 | 用户;本聊天原话“批准”,承接阶段2r1及E1评审请求;2026-10-14,消息时间仅记录日期精度 | 按第8节运行源码外E1,试验后形成阶段3需求表;不是阶段4–7连续推进授权 |
| E1结果/阶段3 | 通过需求及风险处理边界 | 用户;本聊天call_87e7dc7218214a27a6a6d4911a44a387第0项:“确认阶段3,进入方案设计(推荐)”;2026-10-14,日期精度 | 确认28项及原件保全/候选/未解决不发布;授权阶段4设计,不代表E1保真通过或实施获批 |
| 阶段4 | r1通过 | 用户;本聊天call_69f62a2617e74bfd93b75a8bef7d9809第0项:“批准方案,进入实施计划(推荐)”;2026-10-14,日期精度 | 批准固定方案及剩余风险处理;授权形成阶段5计划,不授权业务实现 |
| 阶段5 | r1通过 | 用户;本聊天call_6e90e72546514d5480737f686898f013第0项:“批准计划,进入实施(推荐)”;2026-10-14,日期精度 | 确认W0–W13、DHF U2–U6原owner续办及模型48次/300,000 tokens/人民币150元任一上限;仅隔离副本迁移演练,进入阶段6 |
| 增补阶段4 | r1通过 | 用户;本聊天call_a6853c4232f34285a6cbae19dfbeeec5第0项:“批准方案,进入实施计划(推荐)”;2026-10-14,日期精度;固定hash见下 | 确认TT-N03/R01的X3观察/动作前风险判断、私域候选双重分享许可与HITL时序;只放行增补阶段5计划,未放行新接口代码 |
| 增补阶段5 | r1通过 | 用户;本聊天call_497a8a4c28bd4231a2cfd63d84375f2a第0项:“批准计划,进入实施(推荐)”;2026-10-14,日期精度;固定hash见下 | 放行X3/R3/F3/V3本地实现、隔离测试和原预算内模型评测;不含真实库迁移、tag发布、部署和增量验收 |
| 阶段6 | 增量A实施中 | W0–W4先形成可审查代码/测试;W6/W9可在独立分支并行准备 | 每增量用户确认实现产物,必要设计变化重审 |
本次记录时间见页首;用户确认的消息引用是审批依据,不由本地SELF命令代签人工或非作者Review。
## 内容范围与职责
1. 模板/文档内容:44份DOCX/DOC逐文件、章节/字段/表格/重复块/附件及适用性;原件与模板版本/hash、文档实例和历史版分开。E1已验证14份旧DOC可转换及结构提取,但分页/图形顺序/修订/字体等保真仍未关闭;转换稿仅候选。
2. 两树一网:资料切片、结论、递归文档节点、项目阶段/主题/工作事项扩展、结构提案与确认、稳定ID、CAS/幂等/原子事件/重放、受控版本关系和直接/间接影响。
3. 工作上下文:普通工作自动取得当前项目任务要求、已确认结论、授权共享资料和可读正文;固定实际依据和版本,预算内渐进读取,撤权/恢复/切换时刷新;不以手动@knowledge代替。
4. 审计/显示:成功事件与失败尝试区分,时间/人物/操作/内容前后/来源/结果/影响及实际任务关联完整;人可读摘要、字段差异、对象路径、影响清单、筛选、完整归组/历史及权限内证据跳转。
5. 验证:全部28项到当前对象证据;44模板对照、并发/失败/重启/撤权、两项目两成员真实模型与浏览器、精确pins/当前HEAD CI。组件局部SELF和提前独立审阅已有记录;全目标真实模型/浏览器、阶段7正式验收及当前HEAD CI仍为NOT_RUN。
RDM保有领域、schema/事件与业务权限;Backend仅补必要通用公开能力,Frontend/UI消费已授权的读契约和既有设计系统。新增扩展仍须四要素提案,不能导入Backend internal、改写pins内容、绕过IAM或以管理员身份取得业务正文。团队存储架构替换、线上数据操作、部署及tag发布未纳入本阶段授权。
## 准备及在途依赖
- 原共享工作区已恢复干净并包含权威origin/main;本次启动检查返回READY,完整收据由task-start原样导入。Dev R0为`add097d06137c4912a4ed9279e98ca353e4e4cf1`。
- 独立Dev worktree:`feature/rdm-two-trees-latest-templates`;Documents候选分支同名,最初从其origin/main `a7ff466d9ae91fc67a53d2bf4991f47fc63a2a4c` 建立;本次恢复已按父仓权威pin快进至 `7bd4e17827d4c7c88647bf3c9199c495b60cb107`。保存阶段记录只代表本地候选,不表示已推送、合入、部署或业务完成。
- 阶段2的7仓main、10相关PR快照及最新复核均保留;审计导出/水位(RDM#301/#307、Dev#488;Frontend#73已合入)和快慢通道工作来源(Backend#193、Frontend#79、Documents#95、Dev#512)按最终主干结果协调复用,不重复起另一套入口。快照不是未来准入证明。
- 关联规划:[原两树审计集成方案](2026-10-11-rdm-two-trees-trace-audit-integration.md)、[模板与对话生成方案](2026-10-11-rdm-template-dialog-generation.md)、[系统项目与私域协作](2026-10-13-system-project-membership.md)。本目标补齐最新模板、动态结构、默认上下文与完整审计,不用旧任务完成状态代替本轮验收。
## 阶段与下一动作
| 阶段 | 状态 | 产物/出口 |
|---|---|---|
| 1需求拆解 | 用户通过 | 固定hash原对象及确认依据 |
| 2需求评估 | 用户通过 | 固定r1原对象及E1范围获批 |
| E1探索试验 | 执行结束,风险处理已获确认;保真仍未通过 | 14份转换成功,原件hash不变;59分54秒内闭合自动环节,保真判据未通过 |
| 3需求表 | r1用户通过 | 全部28项的优先级、依赖、条件和验证方法,明确E1剩余风险 |
| 4方案 | r1用户通过 | 方案SHA256 `568aa26f6b2276f786109e2298b3ae36c6c14d3be5a54e0dfc95bf1b2db4603b`;全部28项映射 |
| 5实施/测试计划 | r1用户通过 | W0–W13、28项映射、44资产和模型预算;SHA256 `b755ef629fae37854b8d0bc344b3f14c6933e4455be74244b9821a6d71b64ebe`;放行阶段6本地实施与隔离测试 |
| 6实施 | 2026-10-19 部分交付收口 | W2/W4a、W4b、W6、W9 与统一文档渲染器已合入各仓 main;W0 清单守护未经增量人审、未合入,保留在 Dev 分支历史 `9873a55`;W3/W5/W7/W8/W10–W13 及 X3/R3/F3/V3 未实施,另立后续大任务 |
| 7正式验收 | NOT_RUN | 固定全目标候选和需求到证据映射,人审出口 |
| 8代码Review、9合入、10收口 | 部分收口 | 本次只合入已交付部分的记录与任务卡(Documents #116、Dev #630);剩余项的 Review/合入/收口随后续任务办理 |
当前按已批准阶段5计划实施:W0机械来源守护代码提交 `38ef548637f426e2e36c33a50ae6b8af8c9da453`,16项SELF定向测试及44项实际目录核对通过;只证明来源身份,0项已发布。W2/W4a原并发/回滚及迁移跨实例失效已局部修复,现按已批准读隔离修订继续;`8f80e55a4d`另保留三项时间重放RED,不能用排除该用例的绿色结果宣称W4a完整通过。W6基座上下文固定候选 `d8129abe`、W9基座审计固定候选 `130ac344` 均有局部SELF及限域独立审阅;与Backend main `8e80e261` 的迁移和公开槽冲突在独立探针 `d9b00c23` 形成隔离PG全包/race/build SELF证据,尚未推送、合入或成为产品组合。DHF原工作区owner继续原任务;本任务不覆盖其脏现场。阶段6增量A形成后提交人工评审。
2026-10-14T15:34:17+08:00的依赖SELF快照显示:DHF U1所在RDM PR #365仍开放、未合入,head `3467a178`,原owner工作区有在途修改;目录hash `65cad94f20f31a32bee26e142004288c4e5b473a93fc0c537d5c6fef1d13ca48`,44项均为needs-review、0项published。完整命令输出已由evidence写入Dev任务卡(收据 `a770d013c48e077da35061ce52b3a309748b77abf29c9ed962d246a99afa83fc`)。W3等待唯一U1内容块合同实际合入后消费;通用结构开发无需等待44项全部发布,W11逐模板发布/生成/Word验收仍须完整满足。
2026-10-14T16:21:32+08:00的后续SELF已核验RDM远端main及PR #365实际合入,merge SHA `57d2214feb0ac4a534fa58623fff7d02f93a860a`;唯一DHF U1合同已可消费,原owner工作树已不存在。44项目录hash与needs-review状态未变,合入合同不表示44份资产已发布。完整收据 `dc68957a407f534b79904e59bc4bcd1c7a7f5ef59267c2f9abcc075f495db3ae` 已在Dev任务卡。W2已同步该主干;W3的U1依赖解除,仍按已批准顺序在W4a读取隔离和时间修复后开始。
当前未决项:E1的保真差异和49字符未定位片段;44份资产逐项语义/格式人工裁定;基座X1/X2真实公开发版、旧数据兼容实测和正式模型/浏览器环境。E1结果是SELF探索证据;局部代码测试不能代替真实模型/浏览器、阶段7验收、当前HEAD CI、合入或部署,这些仍为NOT_RUN。
本轮修订不改阶段1/2原对象字节,不把试验执行成功记为保真通过。已在隔离工作区提交局部代码并执行测试;原DOC/DOCX、真实运行库与服务保持原状。E1临时环境和唯一成果仍保留,尚未执行清理。
## 阶段4调查及恢复记录
- 本次恢复前评审稿未提交,首次precheck拒绝;将本任务两仓文件、patch/hash及stash保存至源码外stage4-resume-backup,再同步权威main。Documents按新pin显式快进,后续task-sync通过;新precheck READY及task-resume收据已原样导入。原稿与上游无路径内容冲突,已逐文件恢复;旧证据保持历史对象范围。
- Dev当前设计基线main为`f00165e8d71e4dc8ba0ceb7dc50c1a8a3deb6d60`,任务合并后HEAD为`279ddf05b180576a70c817fed48371b72b26c089`;R0不变。仅纳入上游已合入文档/治理变化,未推进新的组件组合。
- [阶段4源码及在途快照](../records/2026-10-14-rdm-two-trees-latest-templates/stage4-sources.json):RDM/Backend/Frontend main未变化,Documents#89与Dev#489已合入;相关审计导出、工作发现PR仍开放。DHF专项已有本地U1及E1-R1在途,详见阶段4§2,不把候选或任务叙述当发布/验收证据。
- 方案复用DHF的TemplateAsset/ContentBlock并补齐共同合同;本专项负责项目扩展/实例/动态确认/上下文/审计,阶段5固定依赖及非重叠工作项,不接管其他工作区。
## 阶段5规划状态
- 本计划不改变阶段4已批准对象字节;DHF U1本地候选仍是40 needs-review、4 blocked、0 published。追加E1-R1四份转换稿为候选、人工格式未审核;原E1与本任务E1的输出方法不同,不能互相代签通过。
- 2026-10-14阶段5依赖快照见[记录](../records/2026-10-14-rdm-two-trees-latest-templates/stage5-dependencies.json):Frontend#73已合入其main;其余相关导出与来源PR仍需按交付时最新状态重查。Frontend main当前快照为`5313cfad4e633d0909ed40dcdfa28a11bc1902c0`;此快照不是未来精确组合候选。
- 阶段5计划r1已获用户批准,实施及有上限的模型评测进入其授权范围。是否实际执行、花费及产物仍以独立任务卡/收据为准;本稿不把未来结果写成已通过。
## 阶段6已形成的候选与依据
- [W0逐文件资产对照](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage6-w0-template-ledger-r1.md):44/44原件路径、来源Git字节、DHF逻辑ID与类型候选匹配;当前目录44 needs-review、0适用性确认,内容/保真/合同仍待审核。SHA256 `6347ca86c09e00588b202e3a6f0039ac7aec426ed2d64efe5d273ca265b62235`,SELF。
- [X1/X2公开扩展申请](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage6-public-extension-requests-r1.md):四要素、可信作用域和兼容/权限负例,Backend独立工作项消费;仅申请/方案记录,尚未发布接口。SHA256 `2afc37801d96d4c73099f0e2a73658b35ec37c0e6bdd793f835c5fca4a4dd137`。
## 本轮新增需求评估
- [阶段2受影响需求评估:工作信息拆解与主动风险澄清r1](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage2-work-observation-risk-evaluation-r1.md):用户补充要求用户发言、智能体已提交回复、实际检索及可见分析结果逐来源拆解,并在任务中及时发现歧义/风险,以对话/HITL/工作卡澄清。原`.tmp/08`已有“对话/上传/检索统一切片、切片互撞”的目标,但已批准28项未逐类验收普通工作入口、处理回执和相关动作前澄清。用户于本聊天`call_aea78d4156fe4ca89f4b9b6883b2b23f`第0项确认增补并进入需求表;评估稿SHA256 `2627342f7d6e94137d5e7418d995ce57218093f6512f67fb7b221f01067da04d`。原阶段2结论保持原范围有效,新增能力仍待阶段3–5受影响评审。
- [阶段3工作信息拆解与主动风险澄清需求表r1](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage3-work-observation-risk-requirements-r1.md):只新增TT-N03(四类普通工作来源逐项处理)和TT-R01(任务内风险/矛盾及时澄清)的可判定验收条件,原28项原字节不变;总数30项。用户于本聊天`call_b517d0f07af54aa188a01ddb100485b9`第0项确认两项并进入方案设计;固定稿SHA256 `552a9fdea996bb547c185949b5072a51efafdce1339a9eaafd49537dfedd91b4`。新公开观察接口和对应产品代码仍待阶段4/5评审,原W2/W4a/时间及不受影响的W3可继续。
- [阶段4工作来源观察与主动风险澄清方案r1](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage4-work-observation-risk-design-r1.md):Backend受信X3观察与动作前风险决定,RDM负责私域候选、当前权限/来源比对和既有HITL卡,确认后才成为项目有效事实。两轮限域设计复核已闭合消息/outbox的处理屏障、可见正文时序、私域片段双许可与撤权、RDM风险卡唯一owner等问题。用户于本聊天`call_a6853c4232f34285a6cbae19dfbeeec5`第0项批准方案并进入实施计划;固定稿SHA256 `c9edb25c1decbbcb31220ef0cec8703c37e4aaa87bee31eb308169000b335d8c`;原阶段4批准对象不受影响的条款继续有效。
- [阶段5工作来源观察与主动风险澄清实施及测试计划r1](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage5-work-observation-risk-implementation-test-plan-r1.md):X3/R3/F3/V3的仓库owner、依赖、每路观察/风险/私域分享/恢复与浏览器验收、两项需求证据映射和原预算复用;用户于本聊天`call_497a8a4c28bd4231a2cfd63d84375f2a`第0项批准进入实施,固定SHA256 `10b91e3489ac8145eafec73759a019cb6d3b73fd50e7c74563bbbb6d18e5462c`。
## 阶段6受影响设计及决定
- [W4b真人确认受影响设计修订候选r1](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage6-w4b-human-confirmation-design-adjustment-r1.md):固定Backend公开Host/Request尚不能证明本次决定来自绑定确切提案修订与hash的一次性真实人响应;建议基座X3可选证明能力加RDM事务内唯一消费。候选文件SHA256 66c1bb8a1f7c1d0be3a1fe1181541b3e490c52a8a5601c3eb6410cabe2442b10;尚待阶段4受影响方案人工评审,W4b决定写入口不实施。W3可按已批递归实例合同继续,W2限域REPLAY不构成增量A验收。
- [W4b本地实现进展](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage6-w4b-implementation-progress-r1.md):按已接受的实施计划完成本地链路。Backend `a4d6404`、RDM `528dd0c`、Dev组合测试前的指针提交见该记录。已实现并有SELF证据;未合入、未部署。隔离PostgreSQL、真实模型与真实基座确认路径为NOT_RUN。W3 RED `TestDHFInstantiateMaterializesTemplateBlockIdentity`仍不在本次范围。
- [领域时间持久化与历史缺项修订r1](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage6-time-contract-design-adjustment-r1.md):独立时间RED和固定源码核查发现新态与重放时间不同、ReviewCard时间丢失、CNode同版本更新覆盖原时间/主体。建议新字段显式持久化、事件schema 2及仅针对事件INSERT的最低写版本门禁;旧缺项保持历史兼容投影并明确来源。用户已于本聊天call_6ce04b5a3ca3496487ab2714ed208965第0项选择“批准修订,隔离实施验证(推荐)”;原稿保留评审前文字。授权在读取隔离固定后由原owner继续时间合同与隔离测试,真实库迁移和部署仍未放行。 固定评审对象SHA256 `d78849440e6346482fc09925d402790a7ad257ef76c85275610046a845a45f37`。
- [X2跨成员已提交业务审计链接修订r1](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage6-audit-link-design-adjustment-r1.md):W9发现只凭会话项目会泄露私域或重归属旧操作。建议仅将可信已提交项目事件与宿主行建立不可变链接,再按当前审计/资源权限投影。公开写/读合同改变了阶段4 X2,用户已于本聊天call_bf9116ffe4ff4c5bbc4809a58ab02cbe第0项选择“批准修订,继续跨成员审计(推荐)”;W9可按修订继续实施,但安全owner局部不等于跨成员完整审计。SHA256 `385d9d7570217ddcce9fe60a60c99dc58c9a4875ad790584a724d09a210a6e52`。
- [W2/W4实施顺序修订r1](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage6-w2-w4-sequence-adjustment-r1.md):W2的并发字典修订与事务回滚在当前RDM分支保留两条RED;将已批准W4事务隔离基础W4a移到W3之前,由W2 owner在同一工作区修复,W3仍等待DHF U1合入,W4提案/真人确认W4b仍在W3后。用户于本聊天call_c6f6ccef6a5b4e92ad473d85623d4b5f第0项选择“批准修订,先实现 W4a(推荐)”;批准对象SHA256 `aaf8c091772149a3547cbec272a7f38de3a47cc41c84b7bcef05e74510efbacf`,原稿保留评审前状态。
- [W4a项目只读快照指针隔离修订r1](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage6-w4a-read-isolation-design-adjustment-r1.md):RDM固定RED证实`WorldFor`返回的Slice/Doc/Dictionary裸指针可污染同项目缓存而无事件。私有canonical、每次读独立状态图、同代共享真正sealed事件日志及发布水位/性能验证,已由用户于本聊天call_42834c379e204aa781677882d24b54c7第0项选择“批准修订,继续 W4a(推荐)”。批准对象SHA256 `3cabd9d137eaa504e50698c333f8867aec4e2f80e16ffef08fd83d513f2456d4`。旧重放时间漂移另列未决,不由复制方案冒充已修。
- [W9 PostgreSQL审计截止水位修订r1](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage6-w9-pg-audit-cutoff-adjustment-r1.md):现有序列ID可低号晚提交,固定页游标缺少已提交前缀保证;在序列CACHE 1等前提下串行化在线审计ID分配,并补迁移/回滚/离线复制检查。用户于本聊天call_22d8212219f946d8b117837d7e5ccb3f第0项选择“批准修订,实施并验证(推荐)”;批准对象SHA256 `2357b715a7c8f3451b34cc25a578d655e8a48f3f26d9cf7561ea7a13998ca857`,只放行隔离分支,真实运行库迁移仍按原边界。
- [W6项目模型历史来源逐项复验修订r1](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage6-w6-source-recheck-design-adjustment-r1.md):独立复审发现候选`resolve_goal`把完整user/judge正文写入长期回执,已有RED证实。以实际纳入的稳定来源ID/版本/hash经可选领域接口逐项重验,移除原文持久化;用户于本聊天call_751be0cc02914fe2b1fe591042d029ec第0项选择“批准修订,继续 W6(推荐)”。批准对象SHA256 `d46168392d4fd8ea9aa7f73206be039268aff6be100faef63efa052323511616`;仅放行隔离分支,真实库迁移/tag/阶段验收仍按原边界。
- [W9全部审计写入口截止水位修订r1](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage6-w9-all-writers-cutoff-adjustment-r1.md):独立复审发现并在隔离PG以测试-only RED实测显式在线低ID绕过已批r1默认函数,`committed-prefix`误报并跨页漏行。所有INSERT同事务锁/单调门禁、UPDATE/DELETE不可改、排他离线复制与只前进序列由用户于本聊天call_4f521a6ddd0542178769f8d7231916b5第0项选择“批准修订,隔离实施验证(推荐)”;批准对象SHA256 `44f6f7cd34bf95a9c1eb844bfdd70a5c2233e1b5ffc89b3091359dcb5fc3b5d8`。仅隔离分支续办,真实运行库迁移仍未放行;当前W9 `63ebc85`本身不能强报已提交前缀。
- [Backend X1/X2与最新main组合探针r1](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage6-backend-combination-probe-r1.md):最新Backend main v31账号审计与W6/W9迁移重号在独立本地工作树按v31–v40重排,两个公开槽与surface合并;固定探针HEAD `d9b00c2` 的隔离PG全包/race/build SELF通过,独立限域复审未见新增高影响问题。仍非正式组件合入/CI/产品验收。
- [W4a读取隔离P2独立限域复审](../records/2026-10-14-rdm-two-trees-latest-templates/rdm-two-trees-stage6-w4a-p2-independent-review-r1.md):固定RDM `57a8d7caedf72d9be4bdca179ae2a93e456ba009` 的独立源码副本先验证源码/精确pins,再重放最小race集合;未发现新的高影响P2问题。报告、脚本与原始收据逐字节保存在records;工具标签仍为SELF,独立身份和被测archive在报告/输出中核验,不能用外层Dev HEAD代替被测RDM SHA。原时间RED另行修复,性能成本留增量A人审;当前结论不等于W4a、W3/W4b或全目标完成。
## 阶段6启动记录
- 用户已批准阶段5r1(见上方审批表),同意DHF原工作区owner续办U2–U6及模型预算上限;这项授权不表示资产审核或基座tag发布已完成。
- 启动时本任务Dev/Documents保留评审稿,尚无业务代码提交。独立任务从各组件权威main及各自precheck建立;W2、W6、W9可在不同工作区并行准备,共享合同/消费关系按阶段5§2处理。
- W0初始对齐以DHF已记录的44逻辑资产/41原件hash及唯一ContentBlock候选为基础;所有资产当前仍未published,E1-R1四份仅为候选。用途/格式人工结论和单一合同版本仍须实际固定,未完成前W1/W11不放行发布。
## 阶段6 X2受影响方案审批
- 批准时间记录:2026-10-14T11:49:19.752273+08:00(本地记录时间;用户消息仅能确认2026-10-14日期精度)。批准对象为stage6-audit-link-design-adjustment-r1.md,SHA256 `385d9d7570217ddcce9fe60a60c99dc58c9a4875ad790584a724d09a210a6e52`。
- 批准范围:已提交项目业务事实的受信宿主链接、当前audit.read与资源权限字段投影、旧无链接记录不补造;W9/W8/W10相应实现与测试恢复授权。私人会话不因项目绑定自动发布;Tag发布仍按双钥匙。
## 阶段6局部代码与审阅(2026-10-14T11:52:25.226437+08:00)
- W2 RDM局部提交与W9 Backend私域安全切片各有作者SELF测试,但独立代码审阅均发现需要修复的实质问题;负责工作区继续改进,当前不构成阶段6增量或完整W2/W9验收。W6仍在接完整普通工作链。具体分支/HEAD和缺项见Dev任务卡,结果变更后重验。
- W9跨成员可信宿主链接的受影响设计已获用户批准;新增公共合同与消费链尚未实现/发布,旧私人会话仍保持私域。
## 阶段6新发现(2026-10-14T12:05:20.542456+08:00)
- W0新增可重跑DHF目录保护脚本与6类红绿测试;当前44份原件/逻辑身份核对通过、0已发布。F01/F02在DHF业务复核后有2项类型候选变化,仍未确认适用性或完成版本字典登记;原阶段1候选清单保留历史,不将此变化误报为原件损坏。
- W2独立审阅的既有5项失败路径已修复,但同一World项目字典修订与资料入库同时访问仍可能竞争,需修复并补并发负例。W6/W9各自Backend分支碰到迁移v31重号,最终组合前必须按真实合入顺序重排并重验。
@@ -0,0 +1,80 @@
# svc 插件组合部署(--with)方案 r1
状态:**待评审**。日期:2026-10-14。负责人:weichen。
任务卡:Dev `.task/feature-svc-plugin-compose.md`。
需求来源:部署时用交互或参数选择把哪些插件与基座编译成同一个二进制服务,并在服务中激活这些插件。
## 1. 范围
做:
- 每次 `svc.sh` 的 agent deploy 可以选择零个或多个已登记插件。
- 被选中的插件与 `--from` 指定的 Dev 基座编译成一个仍名为 `agent-system` 的二进制。
- 部署后校验这些插件已注册且命令面处于启用;失败走现有 release 回退。
- 插件清单来自 Dev 仓 `plugins/registry.json`,不自动发现。
不做:
- 不做 sidecar,不把插件部署成独立服务。
- 不让插件自带基座 pin。基座就是本次 `--from` 的 Dev 提交;对不上就构建失败并报原因。
- 第一版最多一个带静态工作台(`web`)的插件。
- 不删除旧的 `--from rdm`。它仍用 RDM 仓自己的 `pins/` 构建,与 `--with` 互斥。
## 2. 步骤 0 试验结论(不留代码)
2026-10-14 在 `/tmp/svc-compose-spike` 复制当前 Dev 的 backend 模块,空白导入
`agent-system-rdm/plugins/rdm`(指向 `~/.cache/agent-system-svc/rdm-src`),
`go mod edit -require/-replace` 后执行 `CGO_ENABLED=0 go build -mod=mod`。
- 构建成功。产物约 40MB,`version` 仍是基座的 `agent-system 0.1.0-dev`。
- `go version -m` 显示主模块 `agent-system-backend`,依赖 `agent-system-rdm v0.0.0`。
- 二进制内可见 `rdm.project.create` 与 `rdm.ping`。
- 聚焦依赖(`golang.org/x/*`、`github.com/jackc/*`、`modernc.org/sqlite`、`gopkg.in/yaml`)版本无变化。
- 新增模块只有 `agent-system-rdm`、`github.com/kr/text`、`github.com/rogpeppe/go-internal`。
- 默认 `-mod=readonly` 会拒绝更新 `go.mod`/`go.sum`,组合构建必须使用 `-mod=mod`。
- 依赖模块自己的 `replace` 不生效,插件按主模块(Dev 基座)解析 `agent-system-backend`。这正是“基座以 Dev 提交为准”所要的结果。
试验目录是一次性的,不进入任何仓库。
## 3. 行为
### 3.1 选择
- `--with rdm,foo` 选择插件;`--with rdm@<sha>` 钉住单个插件提交;`--with none` 明确不带插件。
- 标准输入是终端且没有 `--with` 时,按登记表给出编号勾选。默认勾选上次 `svc.env` 的 `plugins=`;第一次默认不选。回车接受默认,`none` 清空。
- 非交互且没有 `--with`:沿用上次选择,没有则不带插件。已有脚本和 CI 的行为不变。
- `--dry-run` 打印基座提交和每个插件的提交,不构建。
- `--from rdm` 与 `--with`(除 `none`)互斥。`--from release` 不能再注入插件。
### 3.2 构建
1. 物化 Dev 提交的隔离 worktree,并完成前端构建,使嵌入资源就绪。`--from local` 不改主检出的 `go.mod`:把 backend 模块复制到 `runtime/.worktrees/` 再构建。
2. 每个插件使用独立源仓缓存(`~/.cache/agent-system-svc/plugin-<id>`,`repoEnv` 可覆盖克隆地址)并物化 worktree。
3. 在这份一次性 backend 副本里生成 `cmd/agent-system/zz_plugins_gen.go`(空白导入 `entryPackage`),并用 `go mod edit` 增加 `require` 与 `replace`。
4. `go build -mod=mod` 产出 `agent-system`。基座的 `version`、身份和 `user` 等子命令保持不变。
5. 测试可设 `SVC_COMPOSE_STUB=1`,跳过真实 `go build`,只记录插件选择。这不是生产路径。
### 3.3 激活与记录
- `GET /api/plugins` 与 `GET /api/registry` 的 `compiled` 列表必须包含每个所选插件。
- `GET /api/commands` 中该插件 `commandPrefix` 下至少有一条 `enabled` 命令。
- 插件在而命令全部禁用时,用与设置播种相同的临时管理员 key 调用 `POST /api/plugins/{id}/enabled`,再复查。失败则 `svc_rollback_deploy`。
- `svc.env` 写 `plugins=id@sha,id@sha`。`source` 形如 `dev@<sha>+rdm@<sha>`。release 目录的 `release.json` 带同一 `plugins` 字段。
- `update` 把基座升到远端最新,并原样带上已记录的 `--with`,不再询问。`recover` 只拉起已有二进制,不重新选择。
- 插件 id 集合变化(含从无到有、从有到无)与源种类变化一样,需要 `--allow-source-switch`。只改提交不需要。
### 3.4 工作台
登记表里 `web` 非空的插件,沿用现有伴生 static 服务(`<name>web`)。多于一个带 `web` 的插件直接拒绝。
## 4. 跨仓
- Backend:`extension.InProc` 增加可选 `HostOptions` 与 `CLI`。布尔默认按“任一为 true”合并,不覆盖显式 serve 旗标。`GET /api/registry` 增加 `compiled`。
- RDM:`plugins/rdm` 在 `InProc` 上声明 `HostOptions`(含关闭上传自动索引、会话卡镜像、执行原语)和 `-bootstrap-admin` 钩子。RDM 自己的 `main.go` 继续可用,旧 `--from rdm` 不依赖这次钩子。
- Dev:`scripts/svc.sh`、`plugins/registry.json`、`docs/svc.md`、`help plugins`、`tests/test_svc_plugins.py`,并推进 backend 与 documents 的 gitlink。
## 5. 验收
- 登记、选择、换源门禁、dry-run、stub 部署与激活走 `tests/test_svc_plugins.py`。
- Backend 的合并与 CLI 钩子走 `go test ./pkg/extension/`。
- 真实 `go build` 组合(Dev 提交 + RDM 提交)在步骤 0 已证实可编译。带网络的完整 `svc deploy --with rdm` 与 `make test-lifecycle` 不在本增量的 stub 套件里,未在本机再跑时标 NOT_RUN。
@@ -0,0 +1,393 @@
# Focused Role and Permission System Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Deliver the requested single-effective-role position model and enforce system, role, and per-project permissions from one server-side action catalog.
**Architecture:** Backend owns roles, the single active user binding, the permission catalog, system grants, and role defaults/caps. RDM consumes that public authority while retaining project membership, project overrides, creator ownership, and existing document duties. Frontend uses Backend role APIs for the single-role and matrix views and uses RDM only for project-scoped configuration.
**Tech Stack:** Go 1.27, SQLite, PostgreSQL, HTTP JSON APIs, compiled extension Host contracts, React 19, TypeScript, Vitest, Playwright.
**Spec:** `docs/proposals/2026-10-15-iam-focused-role-permission-spec.md`
## Global Constraints
- One user has at most one effective role; one role may be assigned to many users.
- Role and user stable IDs never change when display data changes.
- System administrators do not gain implicit access to project business content.
- A project creator can manage only the project they created.
- Unknown actions, missing providers, stale versions, disabled accounts, and disabled roles fail closed.
- Role defaults never exceed role caps; project allows never exceed role or platform caps.
- UI configuration uses a draft, preview, and atomic batch commit; hidden rows do not lose draft edits.
- Account recovery, multi-role bindings, Agent permissions, workflow redesign, production migration, and deployment remain outside this plan.
## Review Focus
- Reassigning a user while two administrators submit concurrently must leave exactly one active binding and return one conflict.
- Disabling a role between preview and commit must reject the commit without partial writes.
- A project creator switching from project A to B must not retain A-derived management authority in B.
- A filtered matrix batch must contain explicit action IDs and must not apply to hidden or newly registered actions.
- RDM provider absence or version mismatch must deny authorization and must not fall back to the legacy local role table.
---
### Task 1: Backend action catalog and role schema
**Files:**
- Create: `Agent-System-Backend/internal/authz/catalog.go`
- Create: `Agent-System-Backend/internal/store/role_policy.go`
- Modify: `Agent-System-Backend/internal/store/migrate.go`
- Test: `Agent-System-Backend/internal/store/role_policy_migration_test.go`
- Test: `Agent-System-Backend/internal/authz/catalog_test.go`
**Interfaces:**
- Produces: `authz.Descriptor`, `authz.DescriptorByID(string) (Descriptor, bool)`, `store.RoleRecord`, `store.RoleBinding`, and schema v35 tables.
- Consumes: existing `users(id, owner, enabled, state_version)` and migration transaction machinery.
- [ ] **Step 1: Add failing catalog tests**
```go
func TestCatalogRejectsUnknownAndProtectsManagementActions(t *testing.T) {
if _, ok := DescriptorByID("invented.action"); ok { t.Fatal("unknown action registered") }
got, ok := DescriptorByID("system.roles.manage")
if !ok || got.Scope != ScopeSystem || !got.Protected { t.Fatalf("descriptor=%+v", got) }
create, ok := DescriptorByID("project.create")
if !ok || create.Scope != ScopeSystem || create.Protected { t.Fatalf("project.create=%+v", create) }
}
```
- [ ] **Step 2: Run the focused test and confirm the missing package failure**
Run: `GOWORK=off go test ./internal/authz -run TestCatalogRejectsUnknownAndProtectsManagementActions -count=1`
Expected: FAIL because `internal/authz` does not exist.
- [ ] **Step 3: Implement the fixed action catalog**
```go
type Scope string
const ( ScopeSystem Scope = "system"; ScopeProject Scope = "project" )
type Descriptor struct { ActionID, Label, Description, Group string; Scope Scope; Protected bool }
func DescriptorByID(id string) (Descriptor, bool)
func Catalog() []Descriptor
```
Register only the system and project actions listed in the spec. Return copies so callers cannot mutate the registry.
- [ ] **Step 4: Add schema v35 and migration tests for both dialects**
Create `roles`, `role_permissions`, `user_role_bindings`, `system_grants`, `authority_state`, and `policy_receipts`. Enforce one active binding per user with a unique `user_id` key; preserve inactive history through versioned replacement rows in the same transaction. Use the existing boolean representation per dialect and foreign keys to `users(id)`.
Run: `GOWORK=off go test ./internal/store -run 'TestRolePolicyMigration|TestMigrate' -count=1`
Expected: PASS on SQLite; the existing PG migration suite later verifies PostgreSQL.
- [ ] **Step 5: Commit the schema and catalog**
```bash
git add internal/authz/catalog.go internal/authz/catalog_test.go internal/store/role_policy.go internal/store/role_policy_migration_test.go internal/store/migrate.go
git commit -m "Add the role permission catalog and schema"
```
### Task 2: Atomic role, binding, and permission store
**Files:**
- Modify: `Agent-System-Backend/internal/store/role_policy.go`
- Test: `Agent-System-Backend/internal/store/role_policy_test.go`
- Test: `Agent-System-Backend/internal/store/role_policy_pg_test.go`
**Interfaces:**
- Consumes: `authz.DescriptorByID`, current account state, store transaction helpers.
- Produces:
- `CreateRole(actor string, in RoleCreate) (RoleRecord, error)`
- `PatchRole(actor, roleID string, expected int64, patch RolePatch) (RoleRecord, error)`
- `ReplaceRolePermissions(actor, roleID string, expected int64, changes []RolePermissionChange, key string) (PolicyReceipt, error)`
- `AssignUserRole(actor, userID, roleID string, expectedState int64, key string) (RoleBinding, error)`
- `RoleForUser(userID string) (RoleBindingView, error)`
- `ReplaceSystemGrants(actor, userID string, expectedEpoch int64, actions []string, key string) (PolicyReceipt, error)`
- [ ] **Step 1: Write failing transaction and concurrency tests**
```go
func TestAssignUserRoleKeepsOneEffectiveBinding(t *testing.T) {
first := mustAssign(t, st, admin, userID, engineerID, 1, "assign-1")
second := mustAssign(t, st, admin, userID, reviewerID, first.UserStateVersion, "assign-2")
if second.RoleID != reviewerID { t.Fatalf("binding=%+v", second) }
if got := countActiveBindings(t, st, userID); got != 1 { t.Fatalf("active=%d", got) }
}
```
Also test two concurrent replacements with the same expected state, duplicate idempotency keys, disabled users, disabled roles, unknown actions, `allowed=true/capAllowed=false`, stale role versions, a multi-change batch containing one invalid item, and rejection when a system-grant batch removes the final effective `system.permissions.manage` holder.
- [ ] **Step 2: Run tests and confirm missing methods fail**
Run: `GOWORK=off go test ./internal/store -run 'TestAssignUserRole|TestReplaceRolePermissions' -count=1`
Expected: FAIL with undefined store methods.
- [ ] **Step 3: Implement transaction-scoped mutations**
Lock the actor, target account, role, and `authority_state` in the existing account-before-policy lock order. Validate the complete batch before any write. Increment `role_version` and `authority_epoch` once per successful transaction and persist one `policy_receipts` row per idempotency key.
- [ ] **Step 4: Verify SQLite and PostgreSQL behavior**
Run SQLite: `GOWORK=off go test ./internal/store -run 'Role|Policy|Binding' -count=1`
Run PostgreSQL through the isolated PG harness after it creates the mode-0600 DSN file: `AGENT_SYSTEM_TEST_PG_DSN_FILE=/tmp/iam-u4-role-policy-pg-dsn GOWORK=off go test ./internal/store -run 'Role|Policy|Binding' -count=1`
Expected: both pass with identical conflict and rollback assertions.
- [ ] **Step 5: Commit the store service**
```bash
git add internal/store/role_policy.go internal/store/role_policy_test.go internal/store/role_policy_pg_test.go
git commit -m "Add atomic role and binding policies"
```
### Task 3: Backend authorization service and HTTP API
**Files:**
- Create: `Agent-System-Backend/internal/authz/service.go`
- Create: `Agent-System-Backend/internal/server/roles.go`
- Modify: `Agent-System-Backend/internal/server/server.go`
- Modify: `Agent-System-Backend/internal/server/accounts.go`
- Test: `Agent-System-Backend/internal/server/roles_test.go`
- Test: `Agent-System-Backend/internal/server/role_authorization_test.go`
**Interfaces:**
- Consumes: Task 2 store methods and existing authenticated actor resolution.
- Produces: the HTTP endpoints in the spec and `Service.AuthorizeSystem(actor, actionID string) Decision`.
- [ ] **Step 1: Write failing authorization and HTTP tests**
```go
func TestRoleManagerCannotGrantProtectedPermission(t *testing.T) {
cookie := loginAs(t, h, "role-manager")
rec := do(h, "PUT", "/api/admin/roles/"+roleID+"/permissions",
`{"expectedRoleVersion":1,"idempotencyKey":"p1","changes":[{"actionId":"system.permissions.manage","allowed":true,"capAllowed":true}]}`, cookie)
if rec.Code != http.StatusForbidden { t.Fatalf("status=%d body=%s", rec.Code, rec.Body.String()) }
}
```
Cover role description create/edit, exact and fuzzy role search, status/action filtering, pagination, one role assigned to two users, user reassignment, stale versions, fixed-ID batches, disabled role assignment, system-grant listing/replacement, final permission-manager protection, and account profile fields remaining outside authorization.
- [ ] **Step 2: Run tests and confirm routes are absent**
Run: `GOWORK=off go test ./internal/server -run 'Role|PermissionCatalog|UserRole' -count=1`
Expected: FAIL with 404 or missing handlers.
- [ ] **Step 3: Implement service authorization and handlers**
Protected actions require explicit `system_grants`; `project.create` may also use the current enabled role permission. Provide `GET/PUT /api/admin/users/{userId}/system-grants` with expected epoch and idempotency key. Replace `requireAdmin` only for the new role endpoints in this task; existing unrelated admin endpoints remain unchanged until their explicit action is wired in Task 4.
- [ ] **Step 4: Wire account management actions without changing recovery**
Map account list/create/profile/state handlers to `system.users.view/create/edit/disable`. Do not touch recovery routes or credential behavior. Preserve first-admin bootstrap as the protected root recovery path.
- [ ] **Step 5: Run server and full Backend tests**
Run: `GOWORK=off go test ./internal/authz ./internal/server ./internal/store -count=1`
Run: `GOWORK=off go test ./... -count=1`
Expected: PASS.
- [ ] **Step 6: Commit the Backend API**
```bash
git add internal/authz/service.go internal/server/roles.go internal/server/server.go internal/server/accounts.go internal/server/roles_test.go internal/server/role_authorization_test.go
git commit -m "Expose role and system permission APIs"
```
### Task 4: Public role provider for RDM
**Files:**
- Modify: `Agent-System-Backend/pkg/extension/extension.go`
- Modify: `Agent-System-Backend/internal/app/hostcaps.go`
- Test: `Agent-System-Backend/internal/app/role_provider_test.go`
- Create: `Agent-System-RDM/internal/perms/role_provider.go`
- Modify: `Agent-System-RDM/internal/rdmapp/perms_api.go`
- Test: `Agent-System-RDM/internal/rdmapp/role_provider_test.go`
**Interfaces:**
- Produces public `extension.RolePolicyProvider` methods `RolePolicyForActor(actor string)`, `RolePolicyForUser(userID string)`, and `CheckRoleAction(userID, actionID string)` returning versioned, non-secret snapshots.
- Consumes the actual request actor from the trusted Host; caller-supplied actor fields never select authority.
- [ ] **Step 1: Add provider contract tests on both sides**
Backend tests verify stable user IDs, enabled state, role version, action default/cap, authority epoch, and rejection when the Host has no authenticated actor. RDM tests verify provider missing, wrong version, disabled role, and unknown action all deny without consulting the legacy tables.
- [ ] **Step 2: Run the contract tests red**
Run Backend: `GOWORK=off go test ./internal/app -run RoleProvider -count=1`
Run RDM: `GOWORK=off go test ./internal/rdmapp -run RoleProvider -count=1`
Expected: FAIL with missing public provider.
- [ ] **Step 3: Implement the public interface and RDM adapter**
The provider returns only role and permission metadata needed for authorization. It must not return user contact fields. RDM's evaluator must use the provider whenever a role binding exists; absence is a denial after migration readiness is enabled.
- [ ] **Step 4: Run both component suites**
Run Backend: `GOWORK=off go test ./... -count=1`
Run RDM with the reviewed Backend module overlay during development: `GOWORK=off go test ./... -count=1`
Expected: PASS; overlay evidence remains SELF until a trusted Backend tag is published.
- [ ] **Step 5: Commit each repository separately**
Backend commit: `Expose the role policy provider`.
RDM commit: `Consume the Backend role authority`.
### Task 5: RDM migration adapter and creator-only project management
**Files:**
- Create: `Agent-System-RDM/internal/perms/role_migration.go`
- Modify: `Agent-System-RDM/internal/perms/roles.go`
- Modify: `Agent-System-RDM/internal/rdmapp/perms_api.go`
- Modify: `Agent-System-RDM/plugins/rdm/plugin.go`
- Test: `Agent-System-RDM/internal/perms/role_migration_test.go`
- Test: `Agent-System-RDM/internal/rdmapp/project_creator_permissions_test.go`
- Test: `Agent-System-RDM/plugins/rdm/roles_test.go`
**Interfaces:**
- Consumes Task 4 provider and Backend import endpoint/command.
- Produces a versioned export manifest for existing RDM roles and a compatibility forwarding layer for `rdm.role.*` writes.
- [ ] **Step 1: Write migration and cross-project denial tests**
```go
func TestCreatorCannotManageAnotherCreatorsProject(t *testing.T) {
projectA := createProjectAs(t, "alice")
projectB := createProjectAs(t, "bob")
requireAllowed(t, setProjectPermission("alice", projectA, "carol", ActDocRead, "allow"))
requireDenied(t, setProjectPermission("alice", projectB, "carol", ActDocRead, "allow"))
}
```
Also assert role IDs, descriptions, bindings, defaults, caps, disabled state, and counts survive export/import; once provider readiness is set, legacy local writes and fallback reads are rejected.
- [ ] **Step 2: Implement export and forwarding without production migration**
Add dry-run export and compare functions. Forward `rdm.role.create/action/assign/disable/list` to Backend through the trusted Host. Keep old tables read-only for verification; do not delete them.
- [ ] **Step 3: Tighten project management to immutable creator ownership**
For member, permission, and duty configuration, load the actual project and compare its immutable `created_by` to the authenticated actor before applying role and platform caps. Do not add delegated project-manager behavior.
- [ ] **Step 4: Run RDM tests**
Run: `GOWORK=off go test ./internal/perms ./internal/rdmapp ./plugins/rdm -count=1`
Run: `GOWORK=off go test ./... -count=1`
Expected: PASS.
- [ ] **Step 5: Commit the RDM consumer**
```bash
git add internal/perms/role_migration.go internal/perms/roles.go internal/rdmapp/perms_api.go plugins/rdm/plugin.go internal/perms/role_migration_test.go internal/rdmapp/project_creator_permissions_test.go plugins/rdm/roles_test.go
git commit -m "Move RDM role writes to the Backend authority"
```
### Task 6: Frontend role API and shared draft model
**Files:**
- Modify: `Agent-System-Frontend/src/api.ts`
- Create: `Agent-System-Frontend/src/rolePermissions.ts`
- Test: `Agent-System-Frontend/test/role-permissions.test.ts`
**Interfaces:**
- Consumes Backend HTTP endpoints from Task 3.
- Produces `RoleRecord`, `PermissionDescriptor`, `RolePermissionDraft`, `mergeRoleDraft`, `visiblePatch`, and typed API methods.
- [ ] **Step 1: Write failing draft-model tests**
Test that filtered rows retain edits, `visiblePatch` includes only explicit action IDs, single-role and matrix edits produce identical changes, stale server refresh does not replace a newer draft generation, and `allowed=true/capAllowed=false` is rejected before submit.
- [ ] **Step 2: Implement the typed API and pure draft helpers**
```ts
export type RolePermissionValue = { allowed: boolean; capAllowed: boolean }
export type RolePermissionDraft = Record<string, RolePermissionValue>
export function visiblePatch(draft: RolePermissionDraft, visibleActionIds: string[]): RolePermissionChange[]
```
- [ ] **Step 3: Run tests and build**
Run: `npx vitest run test/role-permissions.test.ts`
Run: `npm run build`
Expected: PASS.
- [ ] **Step 4: Commit the client contract**
```bash
git add src/api.ts src/rolePermissions.ts test/role-permissions.test.ts
git commit -m "Add the role permission client model"
```
### Task 7: Single-role and matrix configuration UI
**Files:**
- Create: `Agent-System-Frontend/src/components/RolePermissionsPanel.tsx`
- Modify: `Agent-System-Frontend/src/components/AdminZone.tsx`
- Modify: `Agent-System-Frontend/src/components/AccountUsersPanel.tsx`
- Modify: `Agent-System-Frontend/src/styles.css`
- Test: `Agent-System-Frontend/test/role-permissions-ui.test.tsx`
- Test: `Agent-System-Frontend/test/design-guard.test.ts`
**Interfaces:**
- Consumes Task 6 API and draft helpers plus existing `@ui` components and tokens.
- Produces the “角色与权限” system-management section and one-role assignment in user details.
- [ ] **Step 1: Re-read Dev `DESIGN.md` and add failing interaction tests**
Cover exact/fuzzy role search, state filtering, description edit, binding count, single-role edit, matrix edit, grouped paging, hidden-row draft retention, diff preview, conflict preservation, one user role replacement, system-grant editing with final-manager protection, and a late response discarded after switching roles.
- [ ] **Step 2: Implement the panel using existing design tokens**
Use `Collapsible` from `@ui`; consume `@ui/tokens.css` and `@ui/motion.css`; do not add raw colors, private keyframes, `<details>`, or inline font sizes. Keep one request sequence owner for list/detail/preview/commit results.
- [ ] **Step 3: Replace the RDM role admin entry**
Change the section label from “RDM 角色权限” to “角色与权限” and bind it to Backend APIs. Keep RDM project permission and document-duty components in project settings.
- [ ] **Step 4: Add the user role selector**
Display the current role and explicit system grants in account details. Allow role replacement only when the server advertises `system.roles.assign`; submit stable `userId`, `roleId`, expected state version, and idempotency key. Allow system-grant editing only with `system.permissions.manage`, using the server epoch and fixed action IDs.
- [ ] **Step 5: Run Frontend and design checks**
Run: `npm test`
Run: `npm run build`
Run paired UI: `npm test` in `Agent-System-UI`.
Expected: all pass with no design-guard regression.
- [ ] **Step 6: Commit the UI**
```bash
git add src/components/RolePermissionsPanel.tsx src/components/AdminZone.tsx src/components/AccountUsersPanel.tsx src/styles.css test/role-permissions-ui.test.tsx
git commit -m "Add role and permission configuration views"
```
### Task 8: Fixed-combination verification
**Files:**
- Modify: `Agent-System-Dev/modules/backend`
- Modify: `Agent-System-Dev/modules/rdm`
- Modify: `Agent-System-Dev/modules/frontend`
- Modify: `Agent-System-Dev/modules/ui`
- Test evidence: `Agent-System-Dev/.task/feature-iam-u4-role-authority.md`
**Interfaces:**
- Consumes reviewed component commits and trusted published tags where required.
- Produces one fixed Dev combination and requirement-to-evidence map.
- [ ] **Step 1: Run component verification on exact commits**
Backend: full SQLite, isolated PostgreSQL, migration rollback/retry, build.
RDM: full tests/build against the reviewed Backend public version.
Frontend/UI: full tests/build and design guards.
- [ ] **Step 2: Run a real browser scenario on an isolated database**
Create two ordinary users, one “软件工程师” role with a description, assign both users, replace one user's role, configure `project.create`, create projects A and B under different creators, and verify A's creator cannot manage B. Verify an unassigned system administrator cannot read either project's business content. Exercise exact/fuzzy search, filters, single-role edit, matrix edit, preview, conflict, and draft retention.
- [ ] **Step 3: Run the Dev combination**
Run: `make test`
Expected: PASS on the exact component SHAs recorded by `make evidence`.
- [ ] **Step 4: Record remaining boundaries**
Mark production migration, deployment, account recovery, multi-role, Agent permissions, and workflow changes `NOT_RUN / out of scope`. Do not claim them from component tests.
@@ -0,0 +1,136 @@
---
title: 聚焦版角色与分层权限系统规格
date: 2026-10-15
type: feature
status: approved
approved_at: 2026-10-15
supersedes_scope: 2026-10-13-identity-role-permission-plan.md U4-U7 中超出本文的部分
---
# 聚焦版角色与分层权限系统规格
## 目标
实现用户要求的角色与权限系统,不引入账号恢复、多职位、Agent 授权或新的工作流能力。
首期角色等同企业职位。角色与用户分离:同一角色可分配给多个用户,每个用户同时只有一个生效角色。角色包含稳定 `roleId`、名称、可选描述、启用状态和版本。用户继续使用稳定 `userId`,姓名、电话、邮箱、工号、部门和备注均为可选资料,不参与授权主键。
权限分为三个配置面,但使用同一服务端动作目录和判定结果:
1. 系统权限控制系统设置、账号管理、角色管理、权限上限和项目创建。
2. 角色权限描述一个职位默认可以执行的动作及其上限,例如创建项目、查看获准目录信息。
3. 项目权限只在一个项目内生效,由该项目创建者维护;A 项目的管理权不能用于 B 项目。
系统管理员负责账号、角色和平台权限上限。系统管理员没有他人项目业务内容的隐式访问权,读取项目正文、原件、草稿、业务审计或导出仍需该项目的明确授权。
## 范围
### 角色与用户
- `Role`:`roleId`、名称、描述、状态、`roleVersion`、创建者、修改者和时间。
- `UserRoleBinding`:`bindingId`、`userId`、`roleId`、状态、版本、任命者和任命时间。
- 一个用户最多一条有效 binding;同一角色允许任意多个有效用户 binding。
- 改名、编辑描述和停用角色不改变用户、项目或历史记录的稳定 ID。
- 停用角色时保留 binding 和审计记录,但其角色授权立即失效;不回落到更宽的默认权限。
- 任命停用角色、未知角色或停用账号均拒绝。
### 权限目录与三层授权
动作目录由受信注册表定义 `actionId`、中文名、说明、scope、分组、风险级别和是否受保护。请求不能通过动作字符串或请求体自行声明 scope。
首期系统动作至少包括:
| 分组 | 动作 |
|---|---|
| 系统设置 | `system.settings.read`、`system.settings.write` |
| 用户管理 | `system.users.view`、`system.users.create`、`system.users.edit`、`system.users.disable` |
| 角色管理 | `system.roles.view`、`system.roles.manage`、`system.roles.assign` |
| 权限管理 | `system.permissions.view`、`system.permissions.manage` |
| 项目入口 | `project.create` |
受保护的角色、权限和管理员管理动作只能来自明确系统授权,普通角色配置不能授予。`project.create` 可以来自明确系统授权或当前有效角色的允许项,但仍受平台上限约束。
项目动作至少包括 `project.settings`、`project.members.manage`、`project.permissions.manage`、`document.duties.assign`、`document.read`、`document.author`、`document.review`、`document.approve`。项目动作必须同时满足:账号有效、项目关系有效、当前角色有效、角色动作允许且未超过角色上限、平台未禁止、项目未明确拒绝、资源关系和文档状态允许。
项目创建者只获得自己项目的管理默认,且仍受平台和角色上限约束。创建者关系不授予其他项目权限,也不自动授予项目业务内容读取或代签能力。
### 角色权限
每个角色的动作配置包含 `allowed` 与 `capAllowed`:
- `allowed=true` 表示该角色默认允许动作。
- `capAllowed=false` 表示该角色不能通过项目覆盖获得该动作。
- `allowed=true && capAllowed=false` 是非法配置,服务端拒绝。
- 未知动作和未配置动作默认拒绝。
- 角色默认和上限不得写入超出操作者可委派范围的受保护动作。
首期一个用户只有一个有效角色,因此一次判定只使用该 binding,不进行跨角色动作或范围拼接。
### 项目权限和文档三权
RDM 保留项目成员、项目创建者、项目内覆盖和现有文档三权的领域权威。Backend 负责角色、binding、系统动作和平台/角色上限。
项目覆盖使用 `inherit | allow | deny`:`allow` 不能突破平台或角色上限,`deny` 明确阻断。项目创建者只能修改自己创建项目的成员、权限和文档三权。
文档编制、审核、批准继续使用现有 RDM 三权记录;分配候选必须是该项目有效成员,账号和角色有效,并具有对应动作上限。角色只提供资格,不能代替具体文档职责。
## 服务端接口
Backend 成为角色和系统权限的唯一写入权威,提供版本化接口:
- `GET /api/admin/permissions/catalog`
- `GET /api/admin/roles`,支持名称精确/模糊搜索、状态和动作过滤、分页
- `POST /api/admin/roles`
- `GET /api/admin/roles/{roleId}`
- `PATCH /api/admin/roles/{roleId}`,使用 `expectedRoleVersion`
- `PUT /api/admin/roles/{roleId}/permissions`,批量提交固定 actionId 列表和 `expectedRoleVersion`
- `PUT /api/admin/users/{userId}/role`,替换该用户唯一有效角色,使用用户状态版本和幂等键
- `GET /api/admin/users/{userId}/role`
- `GET /api/admin/users/{userId}/system-grants`
- `PUT /api/admin/users/{userId}/system-grants`,批量提交明确系统动作并使用 `expectedAuthorityEpoch` 和幂等键
- `GET /api/authz/explain`,仅解释调用者自己或其有权管理的对象
批量权限修改在单库事务内全部成功或全部失败;任一未知动作、越权、越上限或版本冲突不得部分写入。响应返回新版本、实际差异和审计回执标识。
RDM 通过公开、固定版本的 Backend 角色读取/判定契约消费角色数据。RDM 原 `rdm.role.*` 写命令在迁移期转发 Backend;切换完成后不得继续写 RDM 旧角色表。读取失败、提供者缺失或版本不兼容时拒绝权限动作。
## 配置界面
系统管理区增加“角色与权限”入口:
- 角色列表显示名称、描述、状态和绑定人数,支持精确搜索、模糊搜索和状态过滤。
- 单角色视图编辑名称、描述、状态及权限。
- 角色矩阵以角色为行、权限为列,按权限分组和分页展示。
- 单角色视图与矩阵使用同一草稿模型和同一批量接口。
- 过滤隐藏的单元格不丢失草稿;全选只作用于当前明确显示的固定 actionId 集合。
- 提交前显示差异;冲突保留草稿并要求刷新,不逐格即时写库。
用户详情显示当前角色和明确系统授权来源,并允许有 `system.roles.assign` 权限的操作者从有效角色中选择。有 `system.permissions.manage` 权限的操作者可以编辑目标用户的系统授权,但不能撤销最后一个有效权限管理者。用户可选资料继续用于展示、搜索和辨识,不参与权限计算。
项目设置继续使用现有成员和权限入口,显示角色默认、角色上限、项目覆盖及最终允许/拒绝原因。项目创建者无法切换到其他项目后沿用原项目管理权。
## 迁移与兼容
1. 导出 RDM 当前角色、动作配置和账号单角色绑定,包含来源版本与摘要。
2. 以原 `roleId` 导入 Backend;为每个账号生成一个稳定 binding。
3. 对角色数量、绑定数量、动作默认/上限和引用逐项比对。
4. 在迁移窗口内禁止双主写;RDM 写入口改为转发 Backend。
5. 切换消费者后保留旧表只读,确认无回退依赖后再另行批准清理。
迁移失败不得启用部分角色数据;恢复时保留已撤销、停用和拒绝事实,不能复活旧权限。
## 验收条件
- 创建“软件工程师”角色并分配给两个用户,两人保留各自稳定 userId。
- 同一用户第二次任命替换原生效角色,不产生两个同时有效的 binding。
- 角色描述可编辑,用户可选资料全空仍合法。
- 未知动作、默认超过上限、停用角色任命、无授权角色管理和最后系统权限管理者撤销均拒绝。
- 普通角色可被授予 `project.create`,但不能因此修改系统设置、用户、角色或权限上限。
- A 项目创建者管理 A 的成员、项目权限和文档三权成功;操作 B 全部拒绝。
- 系统管理员未获项目授权时不能读取 A 或 B 的业务内容。
- 单角色配置和角色矩阵产生等价的固定 actionId 批量 patch;过滤和分页不丢草稿。
- SQLite 与 PostgreSQL 的版本冲突、事务回滚和迁移结果一致。
## 明确排除
本增量不实现一人多职、账号恢复、SSO/组织树、Agent 权限、工作流重建、新的文档审签流程、生产迁移或部署。现有文档三权只接入新的角色资格和项目权限判定。
@@ -0,0 +1,368 @@
---
title: IAM U4 Stage 7-10 Delivery - Plan
type: feat
date: 2026-10-15
artifact_contract: ce-unified-plan/v1
product_contract_source: specialized-project-spec
execution: code
origin: docs/proposals/2026-10-15-iam-focused-role-permission-spec.md
---
# IAM U4 Stage 7-10 Delivery - Plan
## Goal Capsule
- **Objective:** The approved IAM U4 role and permission behavior is accepted in a real browser, merged through each protected repository at reviewed commits, and closed with traceable evidence and clean workspaces.
- **Means:** Use the repository's existing Playwright stack against an isolated RDM product composition, then deliver Backend, Frontend, Documents, RDM, and Dev in dependency order with exact-head review and CI. (KTD1–KTD5)
- **Authority:** The focused specification approved at Documents `e9ce9a5` owns behavior; this plan owns delivery mechanics; `Agent-System-Dev/policy/delivery.md` and `policy/merge-queue.md` own stage and merge gates; the task card owns current evidence.
- **Execution profile:** The agent prepares and performs testing, review, PRs, conflict resolution, CI checks, merges, and cleanup. The user retains stage 7 and stage 10 decisions and personally publishes any trusted tag.
- **Stop conditions:** Stop on a changed requirement, cross-project access success, stale or mismatched candidate SHA, unresolved browser or CI failure, a conflicting merge window, a mismatched existing tag, or any request to touch production data or deployment.
---
## Product Contract
### Summary
Stage 7 proves the implemented role model and permission boundaries through the real React interface and live Backend/RDM authorization path.
Stages 8–10 then carry the same behavior through component PRs, a trusted Backend release tag, RDM pins, the Dev fixed combination, protected-branch CI, and safe task closure.
### Problem Frame
The implementation candidate has passed SQLite, isolated PostgreSQL, RDM overlay, Frontend/UI, and Dev combination checks, but those checks do not prove browser behavior or protected-repository delivery.
The repositories also move independently: RDM consumes a published Backend extension contract, while Dev pins Backend, Frontend, UI, and Documents but does not pin RDM.
Delivery must preserve those dependency and evidence boundaries without turning production migration or deployment into an implied part of acceptance.
### Requirements
**Candidate identity and formal acceptance**
- DR1. Stage 7 starts only after each task branch is synchronized with its current `origin/main` and the tested component commits are recorded together.
- DR2. Formal browser acceptance runs on a fresh isolated data root and random loopback ports, never on a registered or production service.
- DR3. Browser evidence uses the existing Frontend Playwright stack against the exact Backend, RDM, Frontend, and UI sources under review.
- DR4. Every acceptance result records the command, component SHAs, environment shape, exit code, sanitized screenshots or traces where applicable, and evidence source. Browser credentials are synthetic; artifacts use owner-restricted external storage and expire after stage 10.
- DR5. Stage 7 requires user review of the requirement-to-evidence map before any component merge begins.
**Role, user, and permission behavior**
- DR6. The browser creates and edits a role with a description while its stable `roleId` remains unchanged. Before disabling a role, the UI names it, shows the bound-user count and authorization impact, supports cancellation without a request, and sends one versioned request only after confirmation; success preserves a usable selection, while conflict or failure preserves context for retry.
- DR7. Two users can share one role, one user can be moved to another role, and the system never exposes two active roles for one user.
- DR8. Name, phone, email, staff number, department, and notes remain optional and searchable without becoming authorization identifiers.
- DR9. Exact and fuzzy role search, status and action filters, pagination, single-role editing, matrix default/cap editing, visible-page batch changes, preview, and 409 rebasing work through the rendered UI. Drafts are keyed by `roleId`: permission grouping/paging, role filters, role paging, and single/matrix switching preserve them; switching roles never transfers a draft; leaving the administration area or refreshing requires an explicit save/discard decision; a 409 rebases only the same role's draft.
- DR10. Delegated system actions expose only their permitted user, role, or permission controls; a manager without view authority cannot replace data with an empty set. Loading, stale, empty, partial-failure, retry, and success states are distinct; destructive controls remain unavailable without authoritative data. The core flow works by keyboard with named controls, announced status changes, stable focus after save/conflict/error, and a usable narrow viewport including matrix navigation.
- DR11. `project.create` works only through an explicit system grant or an enabled role default within its cap.
- DR12. Project A's creator can manage A's members, overrides, and document duties, but A's creator relation and an untrusted owner label never authorize project B. A separate valid B-side membership, current role grant, cap, and project override continue to authorize only the B actions they explicitly allow.
- DR13. System administrator identity alone cannot read another user's project business content, private conversations, originals, drafts, controlled document bodies, business audit records, or exports, and cannot create a business-content export artifact.
- DR14. Document author, reviewer, and approver assignments require current account and role eligibility, and approval remains separate from document publication.
- DR15. Missing providers, incompatible schemas, stale authority epochs, disabled accounts, disabled roles, unknown actions, and out-of-cap overrides fail closed. Version-conflict, unknown-action, and out-of-cap batch updates perform zero partial writes, with the same resulting state and migration outcome on SQLite and PostgreSQL.
**Protected delivery**
- DR16. Component branches merge in dependency order; a downstream pin never points to an unmerged commit or unpublished required tag.
- DR17. Backend's trusted tag is created only by the user after the reviewed Backend PR merge commit is verified on `origin/main`; an existing tag is never rewritten.
- DR18. RDM updates its pins only after Backend and Frontend commits are merged, then builds the product from committed Git objects or a strictly clean tracked/untracked/ignored source tree, records digests of the copied content as well as Git SHAs, and replays affected acceptance. Dirty or untracked source must fail before packaging.
- DR19. Dev enters the manual merge queue only after all component dependencies are merged and the final gitlinks point to their authoritative commits.
- DR20. Dev merge requires exact-head `test`, `test-pg`, and `svc-realcombo` GATE success, current Review, no conflicting main advance, and an explicit queue claim.
- DR21. Task closure records the actual merge commits and retains every failed, skipped, and not-run result at its real evidence level. Any source, base, pin, candidate manifest, or test-definition change after stage 7 updates the manifest, replays affected evidence, and requires a renewed stage 7 conclusion before the first component merge.
### Actors
- A1. **System administrator:** manages platform accounts, roles, explicit system grants, and platform permission ceilings.
- A2. **Delegated manager:** holds a selected subset of system actions and sees only the matching administration controls.
- A3. **Project creator:** manages only the project identified by immutable creation metadata.
- A4. **Project member:** receives project behavior from the current professional role, project override, resource relation, lifecycle state, and document duty.
- A5. **Delivery agent:** executes tests, review, PRs, CI checks, merges, and cleanup within the approved scope.
- A6. **User reviewer:** approves stage 7 evidence, personally publishes a trusted tag, and approves stage 10 cleanup.
### Key Decisions
- **One effective role remains the product model.** The delivery does not introduce multi-role assignment. Governs DR7.
- **System administration does not grant business-content access.** Project and resource authorization remain explicit. Governs DR12–DR15.
- **Production migration and deployment remain outside this delivery.** The migration machinery is tested only on isolated databases. Governs DR2, DR21.
### Key Flows
- F1. **Formal acceptance**
- **Trigger:** The synchronized component candidate is fixed.
- **Actors:** A1–A5.
- **Steps:** Build the isolated composition; seed accounts and projects; drive role, user, system grant, project, and document flows in Chromium; capture traces and API decisions; replay SQLite, PostgreSQL, and component suites.
- **Outcome:** DR6–DR15 have exact-candidate evidence or stage 7 stops.
- **Covers:** DR1–DR15.
- F2. **Serial protected delivery**
- **Trigger:** The user approves stage 7.
- **Actors:** A5, A6, Gitea.
- **Steps:** Merge Backend; publish and verify its tag; merge Frontend and Documents; update and merge RDM pins; fix the Dev gitlinks; claim the Dev queue window; pass exact-head CI; merge and verify; finish registered worktrees; close the task card through its own reviewed PR.
- **Outcome:** Every protected branch contains the reviewed behavior and the task record identifies the actual commits.
- **Covers:** DR16–DR21.
### Acceptance Examples
- AE1. **Shared position:** Given two enabled users and one enabled software-engineer role, assigning both users succeeds; replacing one user's role leaves one active binding for each user and the original role still has one member. Covers DR7.
- AE2. **Fine-grained manager:** Given `system.users.view` without role or permission view, the manager opens user details without a failing role request and cannot edit roles or grants. Covers DR10.
- AE3. **Draft conflict:** Given a local matrix draft and a concurrent role update, saving returns 409, reloads the latest role version, replays the local draft against it, and never applies role A's draft to role B. Covers DR9.
- AE4. **Creator isolation:** Given projects A and B with different creators, A's creator can change A's members, overrides, and author/reviewer/approver duties. With no valid B-side management grant, the same actor is denied for all three mutation families in B and B remains unchanged, even if the actor is a B member or carries an untrusted owner label. A separate fixture proves that a valid B-side grant authorizes only its declared B actions. Covers DR12, DR14.
- AE5. **Administrator privacy:** Given an administrator with no project content grant, direct authenticated requests to B's private conversations, originals, drafts, controlled bodies, business-audit list/detail, and export create/status/download routes are denied with no payload or export artifact. A separately authorized project actor supplies positive controls for the same routes. Covers DR13.
- AE6. **Fail-closed refresh:** Given an allowed cached role snapshot, tightening the role cap changes the authority epoch; the next project or knowledge read consumes the current Backend snapshot and denies the old permission. Covers DR15.
- AE7. **Migration rehearsal:** Given a provenance-recorded frozen v35 fixture and oracle covering active and disabled roles, inactive bindings, revoked grants, explicit denies, owner mappings, and orphan/reference failures, a trusted non-production harness invokes the real Backend/RDM stores to freeze legacy writes, stage stable IDs and full owner-to-role mappings, compare source hashes and expected results, and activate by epoch. Compare mismatch or a concurrent legacy write blocks activation; a lost success response can be retried without duplicate bindings. SQLite and PostgreSQL produce the same final state. Covers DR2, DR15, DR21.
### Scope Boundaries
Included:
- Repeatable UI and live-composition browser acceptance for the approved U4 requirements.
- Test-only adjustments needed to make that acceptance deterministic and reviewable.
- Component sync, PRs, CI, Backend tag handoff, RDM pin updates, Dev queue delivery, and task cleanup.
Excluded:
- Production schema migration, legacy-role cutover, deployment, or 8788 service changes.
- Account recovery, password flows beyond isolated fixture setup, multi-role support, Agent permissions, organization trees, SSO, and workflow redesign.
- Branch-protection changes, tag rewriting, runner changes, or merge-queue automation.
---
## Planning Contract
### Key Technical Decisions
- KTD1. **Use repository-native Playwright as the formal browser gate.** `Agent-System-Frontend/playwright.config.ts` and the existing `e2e/` suite already define the project's real-browser contract. `agent-browser` may add an exploratory visible smoke when installed, but its absence does not replace or invalidate the repeatable Playwright run.
- KTD2. **Run two browser layers.** Deterministic routed tests cover UI permission combinations, pagination, draft retention, and response ordering; a live isolated RDM product covers authentication, storage, Backend policy, RDM project boundaries, and embedded Frontend behavior.
- KTD3. **Freeze evidence by component SHA and environment.** A branch sync, pin change, test-harness change, or target-main advance invalidates only the affected results; no receipt is copied to a different object.
- KTD4. **Deliver dependencies serially.** Backend merges and receives a trusted tag before RDM updates its Backend pin. Frontend and Documents merge before RDM fixes its product pins. Dev pins only merged component commits and enters its final queue window last.
- KTD5. **Keep high-consequence operations dual-keyed.** The agent prepares and verifies the proposed Backend tag command; the user executes tag publication. Production migration and deployment have no execution unit in this plan.
- KTD6. **Treat missing component CI honestly.** Backend, RDM, and Dev consume their repository workflows. Frontend and Documents use their repository verification plus downstream Dev GATE when no repository-local workflow exists; they are not labeled GATE without a real platform run.
### High-Level Technical Design
The diagrams are delivery guidance rather than implementation specifications.
```mermaid
flowchart TB
BE[Backend reviewed commit] --> BET[User-published Backend tag]
BET --> RP[RDM Backend pin]
FE[Frontend reviewed commit] --> RP
UI[UI commit already on main] --> RP
DOC[Documents plan/spec commit] --> DEV[Dev final gitlinks]
BE --> DEV
FE --> DEV
UI --> DEV
RP --> RDM[RDM protected main]
DEV --> DCI[Dev test + test-pg + svc-realcombo]
DCI --> DM[Dev protected main]
```
```mermaid
sequenceDiagram
participant Agent as Delivery agent
participant Browser as Playwright Chromium
participant Product as Isolated RDM product
participant User as User reviewer
participant Gitea as Protected repositories
Agent->>Product: Build exact component composition
Agent->>Browser: Run deterministic and live U4 scenarios
Browser->>Product: Role, user, grant, project, and duty requests
Product-->>Browser: Current policy decisions and rendered results
Agent->>User: Stage 7 requirement-to-evidence map
User-->>Agent: Stage 7 conclusion
Agent->>Gitea: Review, CI, and serial component PR merges
Agent->>User: Exact Backend merge commit and tag command
User-->>Gitea: Publish trusted tag
Agent->>Gitea: RDM pins, Dev queue CI, merge, and verification
```
### Sequencing
1. Fix and accept the synchronized stage 7 candidate.
2. Complete stage 7 browser and database evidence and obtain the user's conclusion.
3. Re-review any files changed by acceptance work.
4. Merge Backend, then complete the user-owned tag gate.
5. Merge Frontend and Documents.
6. Sync RDM, update pins, replay the product and browser gates, then merge RDM.
7. Fix Dev gitlinks, claim the manual queue window, run exact-head CI, and merge Dev.
8. Verify merged content, preserve receipts, clean registered worktrees, and then close the task card through its own reviewed PR after stage 10 approval.
### Risks and Dependencies
- Backend, RDM, Documents, and Dev main may advance before their windows. Each affected branch must sync once at its delivery boundary and rerun affected evidence.
- RDM currently trails its authoritative main substantially. Conflict resolution must preserve upstream behavior and may invalidate the pre-sync RDM review.
- Browser execution requires the repository Playwright runtime and Chromium. If the runtime cannot launch, stage 7 stops with the launch error; another browser stack is not substituted.
- The recommended Backend version is `v0.6.0` because U4 adds public surface 2.15 and schema v36. If that remote tag exists or the release convention has changed, stop for a new user-selected version and never rewrite the ref.
- Gitea API or Actions may fail transiently. A retry is allowed only after reading the actual PR/run state; unknown results are reconciled before resubmission.
- The current Dev merge queue has no active window after the recorded release of the workbench visual task. This fact must be re-read immediately before U8 claims a new window.
---
## Implementation Units
### U1. Record approval and fix the stage 7 candidate
- **Goal:** Record the user's stage 6 approval and produce one synchronized candidate manifest for formal acceptance.
- **Requirements:** DR1, DR4, DR5.
- **Files:** `Agent-System-Dev/.task/feature-iam-u4-role-authority.md`, `Agent-System-Documents/docs/proposals/2026-10-15-iam-u4-stage7-10-delivery-plan.md`, `Agent-System-Documents/docs/proposals/INDEX.md`.
- **Approach:** Update the stage table with the approved component versions and date. Run the required task sync in each branch before its evidence is treated as current. Record base, head, component commits, test definitions, and browser-harness commit in one candidate manifest.
- **Test scenarios:** A clean same-base sync leaves the candidate unchanged; a moving target updates the manifest and invalidates affected evidence; a dirty or drifting component stops the unit.
- **Verification:** Dev precheck/task-resume receipt, `make task-sync` evidence, recursive worktree verification, and Documents `git diff --check`.
- **Dependencies:** None.
### U2. Add the repeatable IAM browser acceptance slice
- **Goal:** Make DR6–DR15 reproducible in the existing browser-test stack without production services.
- **Requirements:** DR2–DR4, DR6–DR15.
- **Files:** `Agent-System-Frontend/e2e/iam-role-authority.playwright.ts`, `Agent-System-RDM/scripts/iam-u4-role-acceptance.sh`, and only the smallest supporting test fixtures required by those files.
- **Approach:** Add deterministic route-driven cases for fine-grained navigation, filters, matrix edits, role-scoped draft lifetime, 409 rebasing, pagination, late-response rejection, role-disable impact confirmation, and independently loading role/permission data. Cover keyboard operation, focus, accessible names and announcements, and a narrow viewport with horizontal matrix navigation. Add a live harness that materializes exact committed candidate sources into a temporary build root, builds the embedded RDM product, initializes a fresh SQLite database, starts on loopback random ports, and runs the same Playwright file in live mode. Synthetic credentials and activation material remain in the temporary root and are deleted on exit; traces and screenshots are sanitized before owner-restricted retention.
- **Execution note:** Add failure-first cases for the previously reviewed permission combinations and race paths before changing the harness or UI assertions.
- **Test scenarios:** Roles-only viewer; users-only viewer; permissions viewer without manager; permissions manager without view; shared-role assignment and reassignment; exact/fuzzy/action/status filters; multi-page role selection; matrix default/cap and visible-page batch edits; draft-preserving and explicit-discard transitions; concurrent 409 rebase; stale response after role switch; role-disable cancel/success/conflict/failure; initial loading; filtered and catalog-empty states; independent role-list and permission-catalog failure; failed create/save retry; keyboard-only core flow; narrow viewport; current epoch denial; isolated service startup failure and cleanup.
- **Verification:** Focused Playwright run with trace retention, Frontend unit tests/build/design guard, harness shell check, and a clean-process check after success and failure.
- **Dependencies:** U1.
### U3. Execute stage 7 formal acceptance
- **Goal:** Produce the requirement-to-evidence map the user can approve without reading implementation details.
- **Requirements:** DR2–DR15.
- **Files:** `Agent-System-Dev/.task/feature-iam-u4-role-authority.md`; screenshots, traces, and receipts remain outside source and are linked by digest or durable run URL.
- **Approach:** Run deterministic Playwright and the live isolated product. Replay Backend SQLite and isolated PostgreSQL role-policy tests, RDM full tests against the fixed Backend, Frontend/UI suites, and Dev combination tests. Exercise migration through an isolated cross-component harness that calls the real trusted Backend/RDM store path for freeze, stage, compare, activate, failure, and retry against the frozen v35 fixture and oracle. Record each DR-ID as PASS, FAIL, SKIP, or NOT_RUN against the exact candidate.
- **Test scenarios:** AE1–AE7 plus missing provider, incompatible schema, disabled account/role, final permission-manager protection, project-override cap, document-duty cap, administrator audit/export denial, dirty product-source rejection, and SQLite/PostgreSQL batch failures for version conflict, unknown action, and out-of-cap change with zero partial writes.
- **Verification:** Evidence receipts and browser artifacts match the candidate manifest; an independent replay covers the minimum critical set; the user records the stage 7 conclusion in the task card.
- **Dependencies:** U2.
### U4. Re-review and prepare component PRs
- **Goal:** Turn the stage 7 candidate into current, reviewable component branches without changing accepted behavior.
- **Requirements:** DR4, DR16, DR21.
- **Files:** Component diffs and task records in Backend, Frontend, Documents, and RDM.
- **Approach:** Sync each component with its current main at its own delivery boundary. Resolve conflicts without weakening authorization. If source, base, dependency pin, candidate manifest, or test definition changes, update the manifest, rerun the affected U2/U3 evidence, and obtain a renewed stage 7 conclusion before any component merge. Then simplify only changed code, conduct independent code review, push the branch, and create a draft PR with the final behavior and evidence.
- **Test scenarios:** Clean sync; source conflict; changed public surface; changed Frontend API type; changed RDM provider contract; target advance after review.
- **Verification:** Each PR identifies base/head, component dependencies, review findings and closure, and current applicable CI or explicit absence of repository-local CI.
- **Dependencies:** U3 and stage 7 user approval.
### U5. Merge Backend and publish its trusted tag
- **Goal:** Establish the authoritative public role-policy contract RDM can consume.
- **Requirements:** DR16, DR17.
- **Files:** Backend PR and release tag; no production service files.
- **Approach:** Confirm Backend PR HEAD contains current main, public surface 2.15, schema v36, staged migration, and the reviewed tests. Require the `vet-and-test` GATE on that exact HEAD, complete agent Review, merge without force, and verify the merge commit on `origin/main`. Prepare an annotated `v0.6.0` command bound to that merge commit; the user executes it. Read the remote peeled tag before proceeding.
- **Test scenarios:** CI failure; main advance; merge conflict; tag absent; tag already exists at the same commit; tag exists at another commit; push result unknown.
- **Verification:** PR merge URL, exact merge SHA, successful exact-head CI, remote annotated tag and peeled commit equality.
- **Dependencies:** U4. The user-owned tag action is an internal completion gate after the Backend merge.
### U6. Merge Frontend and Documents
- **Goal:** Land the accepted administration UI and its authoritative records before RDM fixes product pins.
- **Requirements:** DR3, DR6–DR10, DR16, DR21.
- **Files:** Frontend PR, Documents PR, `Agent-System-Documents/docs/proposals/INDEX.md`.
- **Approach:** Sync and revalidate Frontend, including the IAM Playwright slice, then merge the reviewed PR. Sync Documents, verify links and claims, and merge its PR. UI requires no U4 PR when `e295cae` remains on authoritative main.
- **Test scenarios:** Frontend main changes affecting AdminZone, styles, API types, or test harness; Documents link drift; UI main no longer contains the expected token commit.
- **Verification:** Frontend tests/build/Playwright and platform status, Documents `git diff --check`, merged commits on each main, and UI ancestry check.
- **Dependencies:** U4; Backend may merge before or during this unit, but RDM pinning waits for both U5 and U6.
### U7. Update and merge the RDM composition
- **Goal:** Replace the development overlay with authoritative merged pins and prove the real product composition.
- **Requirements:** DR12–DR18, DR21.
- **Files:** `Agent-System-RDM/pins/agent-system-backend`, `pins/agent-system-frontend`, `pins/agent-system-ui`, public-contract references, product manifest, and RDM task evidence.
- **Approach:** Sync the RDM branch with current main and resolve its known divergence. Pin Backend to the verified tagged merge commit, Frontend to its merged commit, and UI to current authoritative main. Remove reliance on the temporary `go.work` overlay. Harden product assembly so it materializes committed Git objects, or rejects any tracked, untracked, or relevant ignored drift before copying, and records copied-content digests in addition to Git SHAs. Run the full RDM suite, product build, product smoke, migration rehearsal, and live IAM Playwright acceptance; review the resulting pin diff and merge the RDM PR after `build-and-test` succeeds.
- **Test scenarios:** Pin mismatch; tag/commit mismatch; tracked, untracked, or ignored source drift; copied-content digest mismatch; missing embedded assets; migration staging failure; source-hash mismatch; provider schema mismatch; browser regression after real pins.
- **Verification:** `PRODUCT_MANIFEST.json` matches the three gitlinks, RDM HEAD, and actual copied-content digests; a dirty-source negative test fails before packaging; full local receipts and exact-head RDM CI pass; merged RDM main contains the reviewed pins.
- **Dependencies:** U5, U6.
### U8. Deliver the final Dev combination through the manual queue
- **Goal:** Merge one Dev candidate that pins only authoritative component commits and carries current evidence.
- **Requirements:** DR16, DR19, DR20, DR21.
- **Files:** `Agent-System-Dev/modules/backend`, `modules/frontend`, `modules/ui`, `modules/documents`, task card, PR, and merge-queue issue #518.
- **Approach:** Re-read #518 and claim the only Dev main window. Run `make task-sync`, update gitlinks to merged component commits, fix the candidate, and store final receipts outside source. Run local `make test` and `make build`, complete final independent Review, push the Dev branch, and require `test`, `test-pg`, and `svc-realcombo` on the exact PR HEAD. Recheck main/head immediately before a non-force PR merge, then read back main and the component tree.
- **Test scenarios:** Active competing window; main advance after CI; component SHA drift; CI transient failure within retry budget; repeated failure; unknown merge response; merged main content mismatch.
- **Verification:** Queue claim/release entries, current base/head, three successful GATE jobs, review receipt, PR merge URL, final main SHA, and exact `git ls-tree` component values.
- **Dependencies:** U7 and merged component records from U5–U6.
### U9. Verify, close, and clean the task
- **Goal:** Leave authoritative records and no abandoned IAM workspaces or branches.
- **Requirements:** DR21.
- **Files:** Dev task card and archive entry; component task records where applicable.
- **Approach:** Verify actual merged contents and component ancestry. Record browser, SQLite, PostgreSQL, component CI, Dev CI, tag, PR, and merge evidence with their real source levels, then request stage 10 approval. Preserve cleanup receipts outside the worktree; after all writers have exited, run `TASK_WRITERS_STOPPED=1 make task-finish` from the registered task worktree. Then run `make task-close` from clean main and deliver its card-close PR through the applicable queue, Review, CI, merge, and readback path. Never force-delete a refused cleanup.
- **Test scenarios:** Uncommitted or untracked file; live writer; unmerged local or remote commit; missing task-card PR link; cleanup refusal; post-merge content mismatch.
- **Verification:** Stage 10 conclusion, archived task card on main, clean recursive state, merged ancestry, removed task worktrees, and preserved external receipts.
- **Dependencies:** U8. Stage 10 approval is an internal gate before cleanup.
---
## Verification Contract
| Gate | Command or platform check | Applies to | Done signal |
|---|---|---|---|
| Backend SQLite | `GOWORK=off go test ./... -count=1` | U3, U5 | All packages pass at the recorded Backend HEAD |
| Backend PostgreSQL | Isolated PostgreSQL 16 with `AGENT_PG_TEST_DSN`, then role, migration, delegation, and lock-order store tests | U3, U5 | No skips in the selected PG set; container removed |
| Cross-database atomicity | Force version-conflict, unknown-action, and out-of-cap batch failures against SQLite and isolated PostgreSQL | U3 | Both stores retain identical pre-request state with zero partial writes |
| Migration oracle | Trusted isolated Backend/RDM store harness against the frozen v35 fixture and expected oracle | U3, U7 | Freeze/stage/compare/activate/failure/retry results match on SQLite and PostgreSQL; mismatches block activation |
| Frontend unit/build | `npm test && npm run build && node scripts/check-knip.mjs` | U2, U3, U6 | Tests pass, build succeeds, knip stays within baseline |
| UI | `npm test` plus the design guard through the Frontend/Dev suite | U3, U6 | UI tests and design guard pass at the fixed UI commit |
| Browser deterministic | `npm run e2e -- e2e/iam-role-authority.playwright.ts` with isolated preview | U2, U3, U6 | Required scenarios pass; failure traces retained |
| Browser live product | `scripts/iam-u4-role-acceptance.sh` with exact source SHAs | U3, U7 | Embedded product scenarios pass on a fresh data root; screenshot and manifest digests recorded |
| RDM overlay | `GOWORK=<fixed overlay> go test ./... -count=1` | U3 | Development contract passes before authoritative pins exist |
| RDM pinned product | Dirty-source negative test, then `make test`, `make product`, and `make product-smoke` from committed sources | U7 | Drift is rejected; full suite, embedded product, copied-content digests, and manifest smoke pass without overlay |
| Documents | `git diff --check` plus link and version review | U1, U6 | No malformed diff or stale reference |
| Dev local combination | `make test && make build` after `make task-sync` | U3, U8 | Exact fixed combination passes and builds |
| Component CI | Backend `vet-and-test`; RDM `build-and-test`; current platform-required Frontend/Documents checks when present | U5–U7 | Each available GATE is successful on the merged candidate HEAD |
| Dev CI | Gitea `test`, `test-pg`, `svc-realcombo` | U8 | All three jobs succeed on the same final PR HEAD |
| Merge integrity | PR head/base readback, non-force merge, `origin/main` and component tree readback | U5–U8 | Actual protected main matches the reviewed candidate |
| Cleanup | External receipt preservation; guarded `task-finish`; then `task-close` PR Review/CI/merge/readback | U9 | No writer, unique file, unmerged commit, active lock, or cleanup result is lost |
Evidence rules:
- Local commands remain `SELF` unless an independent reviewer replays them.
- Gitea Actions counts as `GATE` only when the run identity, job, exact SHA, and result are recorded.
- A Playwright screenshot or trace proves only the scenario and build identified by its receipt.
- `SKIP` and `NOT_RUN` remain visible; they are never converted to PASS by another layer's test.
- Any source, base, pin, manifest, or test-definition change updates the named candidate and reruns the gates it affects. A post-stage-7 change also requires a renewed stage 7 conclusion before component merge; a final Dev HEAD change invalidates its three required CI jobs.
---
## Definition of Done
Global completion requires all of the following:
- DR1–DR21 all have PASS evidence. These delivery requirements are mandatory; SKIP, NOT_RUN, and exclusions block completion.
- The user has approved stage 7 and stage 10 on named candidate versions.
- Independent final Review has no unresolved Critical or Important finding.
- Backend, Frontend, Documents, RDM, and Dev PRs are merged in dependency order at the recorded commits.
- The trusted Backend tag exists remotely and peels to the reviewed Backend merge commit.
- RDM's product manifest uses authoritative merged pins and no development overlay.
- Dev's final PR HEAD has successful `test`, `test-pg`, and `svc-realcombo` jobs.
- Actual protected main branches and Dev gitlinks match the reviewed candidates.
- Production migration and deployment remain NOT_RUN unless separately authorized.
- Failed experiments, temporary build roots, credentials, processes, branches, and worktrees are removed or retained with an explicit reason; no abandoned attempt code remains in the diffs.
- Task cards are archived through the guarded workflow and external receipts remain available.
Per-unit completion:
| Unit | Completion signal |
|---|---|
| U1 | Stage 6 approval and synchronized candidate manifest are recorded |
| U2 | Repeatable deterministic and live IAM browser slices exist and pass locally |
| U3 | User approves the exact stage 7 requirement-to-evidence map |
| U4 | Current component PR candidates have valid review and applicable checks |
| U5 | Backend is merged and the user-published tag is verified |
| U6 | Frontend and Documents are merged; UI ancestry remains valid |
| U7 | RDM is merged with authoritative pins and a matching product manifest |
| U8 | Dev is merged through an exclusive queue window with three exact-head GATE jobs |
| U9 | Stage 10 is approved, records are archived, and guarded cleanup succeeds |
---
## Appendix
### Sources
- `docs/proposals/2026-10-15-iam-focused-role-permission-spec.md`
- `docs/proposals/2026-10-15-iam-focused-role-permission-implementation-plan.md`
- `Agent-System-Dev/.task/feature-iam-u4-role-authority.md`
- `Agent-System-Dev/policy/delivery.md`
- `Agent-System-Dev/policy/merge-queue.md`
- `Agent-System-Dev/.gitea/workflows/ci.yaml`
- `Agent-System-Backend/.gitea/workflows/ci.yml`
- `Agent-System-RDM/.gitea/workflows/ci.yml`
- `Agent-System-RDM/scripts/build-product.sh`
- `Agent-System-Frontend/playwright.config.ts`
- `Agent-System-Frontend/e2e/rdm-duties.playwright.ts`
@@ -0,0 +1,108 @@
# 分层 Python 环境方案 r1
状态:待评审(收录不是批准)。编制:2026-10-15。
触发:dev 8788 会话 `cnv_7936c0a799ff` 中,智能体无法把已有 Markdown 摘要渲染成 docx,并向用户报告「没有 Python 对应的包」。
## 1. 已核实的故障(不是「缺包」本身)
8788 的 `run_python` / `run_shell` 跑在 bwrap 沙箱里(只读根、`--tmpfs /home`、`--unshare-net`)。同一台宿主机的 `~/.local` 里其实已经有 python-docx、lxml、openpyxl、python-pptx。失败来自四件事叠在一起:
1. **依赖层没有接线。** 代码已有 `--exec-deps-dir`(F3),但 `scripts/svc.sh` 与 8788 的启动参数都没有传入它。沙箱把 `/home` 遮掉之后,`~/.local` 不可见。
2. **解释器解析到会被遮掉的路径。** 服务进程的 `PATH` 里 linuxbrew 在 `/usr/bin` 之前,`python3` 被解析成 `/home/linuxbrew/.linuxbrew/bin/python3`。沙箱里这条路径不存在,`run_python` 得到 `exit=127`。
3. **工具说明指向一条走不通的安装路径。** `run_python` 描述和 `base.deliverables` 都写「缺库先 `pip install --user`」。沙箱断网、根只读、家目录是空 tmpfs,这条命令必然失败。
4. **没有向系统申请包的通道。** 智能体只能探测、报错、让用户选择,再派一个后台任务去轮询一个永远不会出现的依赖。
同一次会话里还有多次模型网关 `401 invalid_api_key`。那是密钥问题,不在本方案范围内。
## 2. 目标
每个工作区和沙箱都能直接使用系统提供的 Python 能力(解释器 + 办公与数据处理基础包),不必各自新建虚拟环境。某个工作区需要额外的包时,向系统申请;系统决定装不装,并只把结果挂给这个工作区。
成功标准:
- 沙箱内 `import docx, openpyxl, pptx` 成功,`python3 -m housestyle.build` 能产出通过结构自检的 docx。
- 两个工作区要同一包的不同版本时,互不影响,基础层版本不变。
- 沙箱仍然断网。安装只发生在宿主侧的构建器里,并且只接受带哈希的预编译 wheel。
- 白名单内的包自动批准;白名单外、要改基础层版本、体积超限、用户上传的 wheel,弹审批卡。sdist 与黑名单直接拒绝。
## 3. 不采用的两条路
- **每个工作区一个 venv。** 贵的是重复下载、解析和安装,不是 venv 目录本身。同样的包会被装很多遍。
- **所有包装进一个可变的系统环境。** 一个工作区的需求会改变所有工作区的行为,版本冲突无法隔离,也无法复现「当时用的是哪一套包」。
## 4. 采用的结构
所有环境层不可变,按内容哈希命名,按会话挂载。系统只新增层,不改已经发出去的层。
```text
<envroot>/ 默认 runtime/envs/,各服务实例共享
python/cpython-<ver>/ 系统托管的 CPython(只读)
python/current -> 上述目录
layers/base-<hash>/site-packages
layers/x-<hash>/site-packages 扩展层:相对基础层的增量闭包
layers/iso-<hash>/site-packages 完整隔离层:仅在审批通过「覆盖基础层版本」时使用
wheelhouse/ 按 sha256 去重的 wheel
locks/<hash>.json
catalog.json 白名单、黑名单、单包体积上限
current -> layers/base-<hash>
bin/pip 垫片:提示改用 python_env,不以安装成功退出
```
层键 = 锁文件内容 + Python 标签 + 平台的哈希。同一份需求在任何工作区都命中同一层。
基础层由系统策划,首批为:python-docx、openpyxl、python-pptx、lxml、Pillow、numpy、matplotlib、pypdf、reportlab、markdown、pdfplumber,以及它们的传递依赖。名单可以在评审时增减;锁文件在第一次 `env ensure` 时生成并应入库,之后构建按锁复现。
解释器优先使用托管前缀(python-build-standalone 的 install_only 包)。下载失败时,退化为用系统 `python3 -m venv` 做一份唯一的托管前缀,并在 `python/SOURCE` 里写明这是退化,不是每个工作区各做一份。沙箱里的 `python3` 永远是这个前缀的绝对路径;找不到托管前缀时才用 `/usr/bin/python3`,不再走会落到 `/home` 下的 `PATH` 查找。
## 5. 一次执行如何看到这些包
沙箱参数在 `--tmpfs /home` 之后,只读挂载:托管解释器前缀(如果它位于会被 tmpfs 遮住的路径上)、基础层、该会话绑定的扩展层。`PATH` 固定为 `<托管 bin>:<envroot>/bin:/usr/local/bin:/usr/bin:/bin`,不再继承宿主 `PATH`。`PYTHONPATH` 是这些层再加上 house-style。`PIP_NO_INDEX=1`。
扩展层与基础层来自同一次以基础层为约束的解析,每个发行名只有一个版本,所以叠放顺序不影响导入。隔离层例外:它替换基础层,而不是叠在上面,用来满足「这个工作区必须要 numpy<2」这类与基础层冲突的需求。
## 6. 申请(工具 `python_env`)
动作:`status`、`request`、`wait`。
- `status` 返回基础层包清单、本会话已绑定的层、未完成的申请。
- `request` 带包规格或工作区内的 `.whl`。解析以基础层锁为约束(等价于带 constraints 的 `pip install --dry-run --report`)。分级:
- 全部在白名单内、纯 wheel、未超体积:自动批准并构建。命中已有层时只是多挂一个目录。
- 白名单外、要覆盖基础层已固定的版本、超体积、用户上传的 wheel:写入 `exec_env_requests`,发一张选择卡(批准 / 拒绝;覆盖基础层版本时多一个「建隔离层」)。系统管理员或该会话的属主可以批。决定写入 `audit_events`。
- 只有 sdist、命中黑名单、解析失败、哈希不符:拒绝,并说明原因。
- 构建在宿主侧进行:`--only-binary=:all:`,校验 sha256,只用解包 wheel,不执行 setup.py。这是唯一有网络的步骤,并且不在沙箱里。
- 构建完成后把层 ID 写进 `exec_env_bindings`。下一次 `run_python` / `run_shell` 挂上这些层。`wait` 在短超时内轮询申请状态。
## 7. 三个顾虑如何被挡住
- **成本。** 基础层覆盖常见办公和数据场景。wheel 与层按哈希缓存,第二个工作区要同一套包时不再下载、不再解析。
- **冲突。** 不存在共享的可变环境。冲突需求要么被拒绝并说明卡在基础层的哪一个版本,要么经审批得到一份只属于该会话的隔离层。基础层哈希不变。
- **包都堆进系统环境。** 基础层只放策划过的包。扩展层按会话绑定,其他会话看不见。升级基础层生成新的 `base-<hash>` 并移动 `current`;已经绑定旧基础层的会话保持不动,直到显式 rebase。
## 8. 安全
- 沙箱断网、根只读、家目录遮蔽,这些都不放宽。
- 不在宿主上执行第三方构建脚本。
- 只挂当前会话绑定的层。
- 申请记录含会话、包、wheel 哈希、批准人。
- 任务封存时应能读到基础层哈希与层 ID(绑定表就是这份清单)。
## 9. 实施切片
- **P0** 解释器与 `PATH` 不再指向会被沙箱遮住的 linuxbrew;`svc.sh` 在环境根存在时传入 `AGENT_SYSTEM_EXEC_ENV_ROOT` 与基础层 `AGENT_SYSTEM_EXEC_DEPS_DIR`;工具说明与提示词改为 `python_env`,去掉 `pip install --user`;配置了依赖层时启动做真实导入探针。
- **P1** 环境根、锁、层、wheelhouse、托管解释器,以及 `agent-system env ensure|lock|gc|doctor|rebase|python`。
- **P2** 表 `exec_env_requests`、`exec_env_bindings`,工具 `python_env`,分级审批,pip 垫片,按会话挂载。
- **P3** 管理区「Python 环境」页(层、申请、批准/拒绝、rebase、gc、上传 wheel)。
## 10. 验收
- `sandboxArgv` 覆盖多层只读挂载、固定 `PATH`、`PIP_NO_INDEX`。
- 离线解析夹具:冲突、白名单、sdist 拒绝、哈希不符。
- 有 bwrap 时:沙箱内能导入层里的模块,`pip` 垫片给出申请指引,外网不可达。
- 两个会话分别要 `foo==1` 与 `foo==2`,各得一层,基础层哈希不变。
- 在基础层可用时,`housestyle.build` 产出的 docx 通过既有 OOXML 结构自检。
## 11. 已定与未定
已定(2026-10-15 对话):白名单内自动批准,其余弹审批卡;解释器由系统托管,而不是长期绑死宿主 `/usr/bin/python3`。
未定,留在评审:基础层最终包名单是否增减;审批人除系统管理员和会话属主外,是否还要接项目角色。本实施先只认系统管理员与会话属主,避免在基座里发明第二套项目角色判断。
@@ -0,0 +1,48 @@
---
title: 文档职责矩阵整改
date: 2026-10-15
type: feature
execution: code
artifact_contract: rdm-duty-matrix/v1
product_contract_source: legacy-requirements
---
# 文档职责矩阵整改 r2
负责人:weichen;编制日期:2026-10-15。
本记录是文档职责整改的唯一主记录。它取代
[r1 增量方案](2026-10-13-rdm-settings-members-duties-perms-increment.md)
第四节,以及该方案 P5、P7 中“文档职责页”的交互;r1 的设置归属、成员、权限矩阵与其余工作包继续有效。
候选分支 `feature/rdm-settings-completion` 里的文档职责界面暂停合入。系统设置、成员选择、权限矩阵和已落地的后端安全能力不在本暂停范围内。本任务从当时的 `origin/main` 另起兄弟分支 `feature/rdm-duty-matrix`,不把该候选当作父分支。
## 四项领域裁定
1. 职责只到文档级。项目设置不再新增章节级职责;历史章节审签只读保留。
2. 项目设置只分配已有受控文档的编制、审核、批准职责。不创建文档、不从模板生成、不提交审核、不审核通过、不驳回、不终批。
3. 每份文档恰好一名编制、至少一名审核、恰好一名批准。同一人在同一文档上只担一个职责。审核可以有多人。
4. 与文档职责完全一致的旧章节覆盖可以归并为文档级。同一文档下章节人员不一致的,列出清单,由项目负责人逐文档确认,不自动覆盖。
项目负责人可以分配职责,但不因负责人身份自动成为编制、审核或批准人。当前职责与已冻结的审签名单分开保存;修改当前职责不改写已批准版本和历史名单。
姓名来源仍按 r1 评审补充第 3 条待证。本页用账号标识展示,不把未证实的姓名字段写进契约。
## 契约
读:`rdm.duty.matrix`。`view` 为 `member`、`document` 或 `matrix`。筛选在分页之前。文档页上限 20。响应给出文档完整性、`dutyVersion`、章节覆盖数、在途轮次、成员资格、单元格 `none|author|reviewer|approver`,以及当前操作人是否可分配。单元格只投影当前文档级职责。没有 `duty.assign` 的调用直接拒绝,避免矩阵列头泄露不可见文档。
写:唯一入口仍是每份文档的完整目标,`rdm.review.assign.doc` 与 `rdm.review.assign.doc.batch`(1–20 项,整批原子)。带 `expectedDutyVersion` 与 `confirmInvalidation`。`rdm.review.assign` 只返回“章节级职责已停用,请在文档级设置”。
预览:`rdm.duty.preview` 与写载荷相同,只读返回替换对象、在途失效和缺人原因,不写数据。保存时服务端重新校验。
迁移:`rdm.duty.legacy.scan` 只读;`rdm.duty.legacy.apply` 只清除与文档职责完全一致的章节覆盖。
## 三视图
按人员、按文档、成员×文档矩阵共享同一份服务端数据和同一份未保存草稿。单元格由文档三权反推。把唯一编制或批准改成其他值可以继续编辑,但在指定接替人前不能保存。替换已有编制或批准时提示“将替换某某”,保存时一次替换。窄屏不压缩整张矩阵,改走前两个视图。一次保存最多 20 份文档。请求带递增序号,过期响应丢弃。写入结果未知时重读,不自动重放。
页面顶部写明:本页只分配已有文档的职责,不创建或生成文档。
## 验收
单文档三权恰好、多审核人、一人一责、三视图草稿一致、替换提示与原子替换、缺人禁止保存、成员失效保存被拒、版本冲突、批量整批失败不写、影响预览与历史不变、无私密文档列头泄露、无创建/生成/审签按钮、迟到响应不覆盖、design-guard、`make test` 与 `make build`。部署和真实账号浏览器验收另行授权。
@@ -0,0 +1,88 @@
# 分层分支交付与规范精简 r1
- 状态:已批准实施(2026-10-18 用户指示按计划实施);推进中
- 负责人:weichen(需求与批准)
- 实施:Dev 治理大任务 `feature/delivery-model-v3`
- 适用范围:Agent-System-Dev 开发流程与规范
- 更新时间:2026-10-18
## 1. 背景
用户提出的需求:
- 减少合入 Dev main 的次数,让其他分支不必反复同步、反复跑 CI。
- L2 合入 L1 要轻;按任务类别分别处理,修复优先。
- 测试、验收、审批放在合适的层级,不在每一层重复。
- 去掉 Agent 的长时间 sleep 等待;精简膨胀的规范。
2026-10-18 只读基线(均为 **SELF** 观察):
- main 推进:14 天共 410 次(first-parent),峰值 85 次/天。按 PR 标题粗分,闭合任务卡约 40%、功能约 30%、组件 pin 约 20%、修复约 6%。
10-14 启用合入窗口后仍约 17 次/天,闭合 PR 仍占约 40%。
- 分层使用:近期 291 个已合入 PR 中 288 个 base 为 main,initiative/child 模型只用过一次。
- CI:3.3 天跑了 200 次,单次中位 8.3 分钟;闭合相关运行约占 31% 机时;main 的 push CI 有 95% 在复测与 PR head 完全相同的树;每个 PR 平均 2.4 次 CI。
- 等待:Git 远端往返约 0.35 秒。长等待来自 Agent 手写 `sleep N; curl` 轮询 CI,以及串行克隆 105 个嵌套子模块(实际只有 13 个不同仓;并行 `--jobs 8` 实测约 26 秒)。
- 规范体量:日常必读规范约 4.6 万字符;同一段 Agent 路由规则写了 7 处;归档任务卡中位 113 KB,原因是证据工具把完整 JSON 收据写进了卡。
结论:频繁触发的主因不是层级不够,而是记账类改动也在推进 main,加上每一层都执行同样重的门禁。
## 2. 目标与成功标准
- 任务卡在合入前随 PR 折叠闭合,不再单独开闭合 PR。
- 统一一个阻塞式的 CI 等待入口,按精确 SHA 等待结果。
- 完整门禁只在进入 main 时执行;L2 合入 L1 只做轻量检查。
- 任务分通道:修复直接进 main 并优先;其他类别按主题聚合进 L1。
- 规范单一权威、更精简;任务卡变小。
成功标准:采纳两周后按本次基线复测。main 推进次数、CI 次数与机时、每 PR 平均 CI 次数均下降;闭合 PR 数降到零(存量清理除外)。
## 3. 方案要点
### 3.1 固定两级分支
- L1 大任务:从 main 切出,最终一次合入 main。L2 子任务:从 L1 切出,合入 L1。
- L2 内部用 agent-exec 单元控制上下文长度,单元不开 PR,是最轻的一层。
- 不再加深层级:main 的推进次数只取决于根层交付次数;每多一层就多一条同步链,集成也被推迟;现行 Guidelines 与工具只定义了两级。
- 太大时横向拆:L1 超过约 2 周或 6–8 个子任务时拆成多个并列 L1;L2 太大就拆成兄弟 L2 或更多单元。
### 3.2 L1 章程
- 章程写在 L1 任务卡顶部:用途与目标、接纳范围与非目标、方案和计划链接、子任务登记、分级测试策略、验收条件、追加的领域规则、生命周期。
- 建 L1 时立即开一个 base 为 main 的 [WIP] PR,用于分流发现,评论区同时作为仓外调度记录。
- L1 不追 main,只在三种情况下合入最新 main:最终交付窗口;需要 main 上的某个修复;长周期 L1 到达里程碑或每周一次。
### 3.3 任务通道
- 修复:`fix/` 直接进 main 并优先排队;P0 用 `hotfix/`。
- 完善:按领域放进“完善列车” L1。
- 扩展:加入(JOIN)同主题的在途 L1。
- 新增:新建 L1 并写章程。
- 治理与规范:集中在一个治理 L1 中。
- 记录类改动不单独推进 main;组件 pin 跟随用到它的 L1 一起推进。
### 3.4 按层级分配门禁
- 单元合入 L2:worker 自检,host 做最小直接检查。
- L2 合入 L1:先同步 L1 头,跑受影响模块的测试,由一个全新会话做独立 Review,轻量 CI 作为 GATE。
不排合入窗口,不需要分流收据、三段证据和人工审批。
- L1 的 WIP PR:完整 CI 照常运行,作为不阻塞任何人的提前预警。
- L1 或修复合入 main:合入窗口、完整 CI、整体 Review、三段证据,以及一次用户专属验收。
- 人工审批只保留三处:L1 章程确认、L1 最终的用户专属验收、高后果双钥匙操作。
## 4. 阶段与关联任务
| 阶段 | 内容 | 状态 |
|---|---|---|
| R | 本主记录、PROJECT.md 链接、治理 L1 及其 WIP PR | 推进中 |
| P1 | 合入前折叠闭合并清理存量卡;`make ci-wait` 与等待规则;子模块并行物化 | 待实施 |
| P2 | CI 按 PR base 区分完整与轻量;L2 免分流、免合入窗口、免三段证据;三种卡模板;通道写入 delivery.md | 待实施 |
| P3 | 规范精简:AGENTS.md 改为入口;delivery.md 作为单一权威并并入 merge-queue;矩阵与采纳记录改为引用;证据摘要入卡、完整收据出卡 | 待实施 |
| M | 采纳两周后按本次基线复测 | 待执行 |
实时进度以 Dev 治理大任务的任务卡和 PR 为准;本记录只在阶段完成时更新。
## 5. 未纳入与限制
- 分支保护等平台设置不在本方案范围内;如需变更,由用户按双钥匙规则亲手执行。
- 不引入自动合入队列、合入列车或调度服务。
- 基线数字按 PR 标题粗分,只用于判断方向;实际效果以复测结果为准。
@@ -0,0 +1,276 @@
# EXT-20:共享法规检索与网络证据扩展点
状态:**已获用户授权(2026-10-18)**;owner:weichen;主任务:Dev 仓 initiative `feature/regulations-kb`。
来源计划:Dev 仓 `docs/superpowers/plans/2026-10-18-regulations-knowledge-base-plan.md` 的 KTD1、KTD14 与 U9(本文是 U9 的基座公开契约)。
规范依据:[扩展面兼容与演进](2026-10-01-extension-compat-policy.md)(§6 扩展点申请模板);同类先例:EXT-19 账号目录(受信插件注册、Host 可选接口消费)。
实现位置:Backend 分支 `feature/regulations-kb-ext20`(`pkg/extension/regulations.go`、`internal/app/regulations.go`、`internal/app/compiled.go`;本文核对的提交为 `499ad47`,SELF·源码级)。
撰写日期:2026-10-18。
## 1. 申请四要素(compat-policy §6)
- **场景**:Agent-System-RDM 处理涉及法规、标准或审评指导原则的问题时,必须同时查询受控法规语料库和真实网络搜索(双源核验),
并把每条法规结论绑定到固定语料修订、法规版本、条款节点与原文片段。当前两条腿都走不通:
共享法规库没有公开检索入口;RDM 现有网络腿由模型提出 URL 和摘录后再抓取比对,无法证明真实搜索发生过,基座也没有搜索能力。
- **希望符号**:`pkg/extension` 新增可选能力 `RegulationsHost`(分发 Host 侧消费)、`RegulationsRegistrar`(进程内 Registry 侧注册)、
提供方接口 `RegulationsProvider`、请求/结果 DTO、状态常量、`RegulationsSchemaVersion` 与 `ErrRegulationsUnavailable`。
`Host` 接口本身不加方法。
- **为何现有注册点组合不出来**:见第 2 节。
- **兼容**:纯加法的可选能力;`SurfaceVersion` 由 `2.14.0-experimental` 升为 `2.15.0-experimental`,见第 5 节。
## 2. 为何现有扩展点组合不出来
| 现有扩展点 | 不能承载的原因 |
|---|---|
| `Host.KnowledgeSearch` / `KnowledgeWrite` | owner 作用域的项目知识检索,返回 `core.RetrievalHit`。共享法规不属于任何 owner:写进每个 owner 的知识库会复制语料、失去修订不可变性;其返回类型没有语料修订、法规/版本/节点稳定 ID、原文哈希、定位与披露状态,加字段也改变不了 owner 隔离语义。计划 KTD14 明确禁止经它承载共享法规 |
| 项目作用域知识(`projectID` 参数、项目授权) | 共享法规访问不应随项目扩大或缩小;借项目 ID 访问会让项目成员关系变成法规访问面,也让同一条款在不同项目下出现不同可见性 |
| `AccountDirectoryRegistrar` | 机制相同(受信插件注册、Host 可选接口消费),但语义专用于账号目录候选判定,不能复用为法规检索 |
| 通用工具 / 命令总线 / KV / 后台任务 / 审计 | 都不能让一个插件把只读能力安全地提供给另一个插件:没有可归属的真实搜索记录,也不在发往外网前做查询最小化;证据无法钉住语料修订;任何插件都可以注册同名命令冒充提供方,不存在“单一受信提供方” |
| 下游直接导入法规仓 | 绕过基座的调用方身份、查询最小化与审计边界,违反 RDM“只经基座公开扩展”的约束 |
因此需要一个新扩展点同时满足四点:共享的非项目语料;可归属、做过查询最小化的真实网络搜索;钉住语料修订的不可变证据;单一受信提供方。
## 3. 公开符号(`pkg/extension/regulations.go`)
### 3.1 常量与错误
- `RegulationsSchemaVersion = 1`:基座唯一接受的请求 schema;其他值在到达提供方前被拒绝。
- 法规检索状态:`RegulationsStateOK = "ok"`、`RegulationsStateEmpty = "empty"`、`RegulationsStateDegraded = "degraded"`、`RegulationsStateUnavailable = "unavailable"`。
- 法规披露级别:`RegulationDisclosureFull = "full"`、`RegulationDisclosureExcerpt = "excerpt"`、`RegulationDisclosureMetadataOnly = "metadata_only"`、`RegulationDisclosureWithheld = "withheld"`。
- 网络搜索状态:`WebSearchStateOK = "ok"`、`WebSearchStateEmpty = "empty"`、`WebSearchStateUnavailable = "unavailable"`、`WebSearchStateRateLimited = "rate_limited"`、`WebSearchStateRejected = "rejected"`、`WebSearchStateError = "error"`。
- 网页抓取状态:`WebCaptureStateCaptured = "captured"`、`WebCaptureStateRejected = "rejected"`、`WebCaptureStateFailed = "failed"`。
- 网页留存级别:`WebRetentionFull = "full"`、`WebRetentionExcerpt = "excerpt"`、`WebRetentionMetadataOnly = "metadata_only"`。
- `ErrRegulationsUnavailable`(`"extension: regulations provider unavailable"`):能力不可用。调用方不得回退到 `KnowledgeSearch`。
### 3.2 接口
```go
// 由受信的法规知识插件(插件 ID "kbreg")实现并注册;基座不内置实现。
type RegulationsProvider interface {
SearchRegulations(context.Context, RegulationsCaller, RegulationsSearchRequest) (RegulationsSearchResult, error)
ResolveRegulationEvidence(context.Context, RegulationsCaller, RegulationEvidenceRequest) (RegulationEvidence, error)
SearchWeb(context.Context, RegulationsCaller, WebSearchRequest) (WebSearchResult, error)
CaptureWeb(context.Context, RegulationsCaller, WebCaptureRequest) (WebCapture, error)
}
// 编译进程内 Registry 的可选能力;只有插件 ID "kbreg" 可注册,且只能注册一次。
type RegulationsRegistrar interface {
RegisterRegulationsProvider(RegulationsProvider) error
}
// 分发 Host 句柄的可选能力(类型断言获取);缺失即不可用,调用方不得回退到 KnowledgeSearch。
type RegulationsHost interface {
SearchRegulations(context.Context, RegulationsSearchRequest) (RegulationsSearchResult, error)
ResolveRegulationEvidence(context.Context, RegulationEvidenceRequest) (RegulationEvidence, error)
SearchWeb(context.Context, WebSearchRequest) (WebSearchResult, error)
CaptureWeb(context.Context, WebCaptureRequest) (WebCapture, error)
}
```
`RegulationsHost` 与 `RegulationsProvider` 方法一一对应,区别只在 Host 侧没有 `RegulationsCaller` 参数:调用方身份由基座填写,调用方无法注入。
### 3.3 DTO 字段
JSON 名为 camelCase。下表“必出”指没有 `omitempty`、零值也会序列化的字段,其余字段均为 `omitempty`。
最小 `WebSearchRequest{SchemaVersion: 1, Query: "q"}` 序列化为 `{"schemaVersion":1,"query":"q"}`。
**`RegulationsCaller`**(基座从可信分发上下文填写)
| 字段 | JSON | 含义 |
|---|---|---|
| `PluginID` | `pluginId`(必出) | 发起调用的插件 ID(消费方,例如 `rdm`),不是提供方 ID |
| `Actor` | `actor` | 本次分发的操作主体 |
| `Owner` | `owner`(必出) | 本次分发的 owner |
刻意不含项目 ID:共享法规访问既不随项目扩大,也不随项目缩小。
**`RegulationsSearchRequest`**
| 字段 | JSON | 含义 |
|---|---|---|
| `SchemaVersion` | `schemaVersion`(必出) | 必须等于 `RegulationsSchemaVersion` |
| `Query` | `query`(必出) | 检索文本 |
| `CorpusRevision` | `corpusRevision` | 要检索的语料修订;空表示当前已发布修订,结果回显实际检索的修订 |
| `Kinds` | `kinds` | 文献类别过滤(法规、标准、指导原则等,取值由提供方定义) |
| `CurrentOnly` | `currentOnly` | 只返回现行版本 |
| `DocNo` | `docNo` | 按文号过滤 |
| `ClauseNo` | `clauseNo` | 按条款号过滤 |
| `Limit` | `limit` | 结果数上限,由提供方解释 |
**`RegulationsSearchResult`**
| 字段 | JSON | 含义 |
|---|---|---|
| `CorpusRevision` | `corpusRevision`(必出) | 实际检索的语料修订 |
| `State` | `state`(必出) | `ok` / `empty` / `degraded` / `unavailable` |
| `DegradedReasons` | `degradedReasons` | 降级原因(例如向量索引不可用) |
| `Hits` | `hits`(必出) | 命中列表 `[]RegulationHit` |
**`RegulationHit`**
| 字段 | JSON | 含义 |
|---|---|---|
| `RegulationID` / `EditionID` / `NodeID` | `regulationId` / `editionId` / `nodeId`(必出) | 法规、版本、条款节点的稳定 ID,重新建索引后不变 |
| `DocNo` / `Title` | `docNo` / `title` | 文号与标题 |
| `EditionLabel` / `LegalStatus` | `editionLabel` / `legalStatus` | 版本标签与法律效力状态(现行、废止等) |
| `ClauseNo` / `HeadingPath` | `clauseNo` / `headingPath` | 条款号与章节标题路径 |
| `Excerpt` / `ExcerptStart` / `ExcerptEnd` | `excerpt` / `excerptStart` / `excerptEnd` | 按披露级别允许返回的原文片段及其偏移 |
| `NodeSHA256` / `SourceAssetSHA256` | `nodeSha256` / `sourceAssetSha256` | 节点文本哈希与来源资产(原件)哈希 |
| `PageStart` / `PageEnd` | `pageStart` / `pageEnd` | 原件页码定位 |
| `Disclosure` | `disclosure`(必出) | `full` / `excerpt` / `metadata_only` / `withheld` |
| `WithheldReason` | `withheldReason` | 不披露原文的原因(例如来源权利限制) |
| `IsSummary` | `isSummary` | 命中的是摘要而不是原文 |
| `MatchKinds` | `matchKinds` | 命中方式(全文、向量、编号等,取值由提供方定义) |
| `Score` | `score` | 相关度分数 |
**`RegulationEvidenceRequest`**(取回钉住修订的节点原文片段)
| 字段 | JSON | 含义 |
|---|---|---|
| `SchemaVersion` | `schemaVersion`(必出) | 必须等于 `RegulationsSchemaVersion` |
| `CorpusRevision` | `corpusRevision`(必出) | 证据所钉住的语料修订 |
| `NodeID` | `nodeId`(必出) | 条款节点 ID |
| `Start` / `End` | `start` / `end` | 可选的片段偏移 |
**`RegulationEvidence`**
| 字段 | JSON | 含义 |
|---|---|---|
| `CorpusRevision` | `corpusRevision`(必出) | 证据所属修订 |
| `RegulationID` / `EditionID` | `regulationId` / `editionId` | 法规与版本 ID |
| `NodeID` | `nodeId`(必出) | 条款节点 ID |
| `ClauseNo` | `clauseNo` | 条款号 |
| `Excerpt` / `Start` / `End` | `excerpt` / `start` / `end` | 原文片段与偏移 |
| `NodeSHA256` / `SourceAssetSHA256` | `nodeSha256` / `sourceAssetSha256` | 节点文本哈希与来源资产哈希 |
| `PageStart` / `PageEnd` | `pageStart` / `pageEnd` | 页码定位 |
| `Disclosure` | `disclosure`(必出) | 同 `RegulationHit.Disclosure` |
| `WithheldReason` | `withheldReason` | 不披露原因 |
| `HashVerified` | `hashVerified`(必出) | 提供方报告的哈希校验结果;基座原样透传,不自行校验 |
**`WebSearchRequest`**(真实网络搜索)
| 字段 | JSON | 含义 |
|---|---|---|
| `SchemaVersion` | `schemaVersion`(必出) | 必须等于 `RegulationsSchemaVersion` |
| `Query` | `query`(必出) | 发往外网的搜索词;基座先去首尾空白再校验 |
| `Exclusions` | `exclusions` | 调用方声明的机密词(项目名、编号、人员等);查询含任一词即由基座拒绝 |
| `PreferOfficial` | `preferOfficial` | 优先官方来源 |
| `Limit` | `limit` | 结果数上限,由提供方解释 |
**`WebSearchResult`**
| 字段 | JSON | 含义 |
|---|---|---|
| `Provider` | `provider` | 实际使用的搜索提供方 |
| `SentQuery` | `sentQuery` | 实际发往外网的查询 |
| `SearchedAt` | `searchedAt`(必出) | 搜索时间 |
| `State` | `state`(必出) | `ok` / `empty` / `unavailable` / `rate_limited` / `rejected` / `error` |
| `Reason` | `reason` | 非 `ok` 状态的原因 |
| `Results` | `results` | 排序结果 `[]WebSearchHit` |
**`WebSearchHit`**:`Rank`(`rank`,必出,排名)、`URL`(`url`,必出)、`Title`(`title`)、`Snippet`(`snippet`,搜索摘要,不是已核验证据)、`Publisher`(`publisher`,发布机构)、`Official`(`official`,是否被提供方判定为官方来源)。
**`WebCaptureRequest`**(抓取先前 `SearchWeb` 找到的页面)
| 字段 | JSON | 含义 |
|---|---|---|
| `SchemaVersion` | `schemaVersion`(必出) | 必须等于 `RegulationsSchemaVersion` |
| `URL` | `url`(必出) | 要抓取的地址 |
| `SearchProvider` / `SearchQuery` / `SearchRank` | `searchProvider` / `searchQuery` / `searchRank` | 关联的来源搜索(提供方、查询与排名),用于证据溯源 |
**`WebCapture`**
| 字段 | JSON | 含义 |
|---|---|---|
| `CaptureID` | `captureId` | 抓取记录 ID |
| `FinalURL` | `finalUrl` | 跟随重定向后的最终地址 |
| `FetchedAt` | `fetchedAt`(必出) | 抓取时间 |
| `ContentType` / `ByteSize` / `SHA256` | `contentType` / `byteSize` / `sha256` | 内容类型、字节数与内容哈希 |
| `Retention` | `retention` | `full` / `excerpt` / `metadata_only` |
| `Text` | `text` | 页面全文,仅当来源权利允许全文留存时出现 |
| `Candidates` | `candidates` | 从页面解析出的条款候选 `[]WebClauseCandidate` |
| `State` | `state`(必出) | `captured` / `rejected` / `failed` |
| `Reason` | `reason` | 非 `captured` 状态的原因 |
**`WebClauseCandidate`**:`ClauseNo`(`clauseNo`)、`Excerpt`(`excerpt`,必出)、`Start` / `End`(`start` / `end`,必出,片段在抓取文本中的偏移)。
## 4. 基座强制行为(`internal/app/regulations.go`、`compiled.go`)
### 4.1 注册
1. 只有插件 ID 为 `kbreg` 的编译进程内插件可注册提供方;其他插件 ID 或 `nil` 提供方返回错误。
2. 只能注册一次:重复注册返回错误,已注册的第一个提供方保持不变。
3. 声明式 Registry(`compiledRegistry`)一律拒绝 `RegisterRegulationsProvider`。
4. 宿主未装配提供方槽时,注册返回“registration unavailable”错误;带清单记录的包装 Registry(`recordRegistry`)只把注册转发给内层 `RegulationsRegistrar`。
### 4.2 每次 Host 调用
按以下顺序执行,四个方法一致:
1. 先做账号有效性守卫(`requireEffective`);停用等无效账号直接返回守卫错误,提供方不会被调用。
2. 没有已注册提供方或没有审计存储时返回 `ErrRegulationsUnavailable`。调用绝不在无审计的情况下执行;这类不可用调用不写审计。
3. `RegulationsCaller` 由基座填写为 `{PluginID: 调用插件, Actor: 分发主体, Owner: 分发 owner}`,不含项目 ID。
4. `SchemaVersion != RegulationsSchemaVersion` 时拒绝并返回错误,提供方不会被调用;写一条 `state=invalid` 的审计。
5. 只有 `SearchWeb` 做查询最小化校验:
- 先去掉 `Query` 首尾空白,提供方收到的是去空白后的查询;
- 去空白后为空、不是合法 UTF-8 或超过 256 个 rune 时返回错误(`1-256` 按 rune 计,不按字节计),写 `state=invalid` 审计;
- 查询包含任一 `Exclusions` 词时(每个词先去首尾空白,空词忽略,按小写子串匹配,大小写不敏感),基座直接返回
`WebSearchResult{State: "rejected", Reason: "query contains an excluded term"}` 且 error 为 nil,提供方不会收到该查询,审计记 `state=rejected`。
6. 提供方返回的 `State`、`Disclosure`、`Retention`、`DegradedReasons`、`HashVerified` 等全部字段原样透传;基座不把 `degraded`、`withheld`、`rejected`、`rate_limited` 或失败包装成成功,提供方返回的 error 原样返回。
7. `CaptureWeb` 在基座侧不校验 URL:抓取安全控制(私有/保留地址、重定向、大小、权利留存)属于提供方职责(计划 U5)。
### 4.3 审计
每次到达 schema 校验的调用恰好写一条基座审计事件:owner 为分发 owner,Actor 为 `plugin:<调用插件>`,Target 为 `kbreg`。
| 方法 | 动作 | `revision` | `count` | `state` | `querySha256` |
|---|---|---|---|---|---|
| `SearchRegulations` | `regulations.search` | 成功时为结果修订,否则为请求修订 | `len(Hits)` | 提供方 `State` | `Query` 原文的 SHA-256 |
| `ResolveRegulationEvidence` | `regulations.evidence` | 结果修订非空时取结果,否则为请求修订 | 成功为 1 | 成功为 `ok` | 不记 |
| `SearchWeb` | `web.search` | 不记 | `len(Results)` | 提供方 `State`,或基座的 `rejected` | 去空白后查询的 SHA-256 |
| `CaptureWeb` | `web.capture` | 不记 | `len(Candidates)` | 提供方 `State` | 去空白后 `SearchQuery` 的 SHA-256 |
- 审计证据 JSON 只有 `revision`、`count`、`state`、`querySha256` 四个字段(`revision` 与 `querySha256` 为空时省略);查询明文、法规片段、搜索摘要与网页全文都不进审计。
- 失败时 `state` 取 `invalid`(schema 或查询校验失败)或 `error`(提供方返回 error),`count` 为 0。
- 提供方 error 优先返回;调用成功但审计写入失败时,结果被扣留并返回审计错误。
## 5. 兼容
- **可选能力**:`RegulationsHost` 与 `RegulationsRegistrar` 都经类型断言获取,`Host` 与 `Registry` 接口没有新增方法;旧插件、第三方 fake Host 与旧 Registry 实现照常编译。断言失败即能力不可用。
- **纯加法**:新增 3 个接口、12 个 DTO、20 个状态常量、`RegulationsSchemaVersion` 与 `ErrRegulationsUnavailable`;`surface.txt` 快照同步增加这些顶层名与接口方法。按 compat-policy“每次加法升次版本号”,`SurfaceVersion` 由 `2.14.0-experimental` 升为 `2.15.0-experimental`。
- **不改 `KnowledgeSearch`**:owner 作用域项目知识检索的签名与语义不变;法规能力缺失时调用方不得回退到它。
- **组合方式**:法规插件以编译进程内插件注册(`extension.RegisterCompiled`,插件 ID `kbreg`),与 RDM 同二进制组合。当前只有进程内 `inprocHost` 实现 `RegulationsHost`;sidecar `/host/v1` HTTP 路由不在本扩展范围,出现真实需求再申请。
- **请求演进**:请求 schema 以 `RegulationsSchemaVersion` 显式版本化;新增可选字段一律带 `omitempty`,不兼容的请求变更须升 schema 版本并另行申请。
## 6. 验收(对应 Backend 测试)
| 验收条件 | 测试 |
|---|---|
| 能力可选:空 Host/Registry 不暴露能力;schema 版本为 1;错误值已定义;下游仅凭 `pkg/extension` 即可实现提供方 | `pkg/extension` `TestRegulationsContractIsOptional` |
| 状态常量的线上取值固定;可选字段省略;`RegulationsCaller` 序列化不含 project | `pkg/extension` `TestRegulationsWireNames` |
| 无提供方或无提供方槽时四个方法都返回 `ErrRegulationsUnavailable`,且不写审计 | `internal/app` `TestRegulationsUnavailableWithoutProvider` |
| 只有 `kbreg` 可注册;`nil` 被拒;重复注册被拒且不替换;无槽时注册被拒 | `TestRegulationsRegistrationOnlyTrustedKbregOnce` |
| 声明式 Registry 拒绝注册;记录型包装 Registry 转发 `kbreg` 注册 | `TestRegulationsDeclarativeRegistrationRejected` |
| 提供方收到的 Caller 由分发上下文填写 | `TestRegulationsCallerFilledFromDispatchContext` |
| schema 版本 0 与 2 被拒,提供方不被调用 | `TestRegulationsRejectsOtherSchemaVersions` |
| 空查询、纯空白查询、257 rune 查询被拒;256 rune 查询通过且提供方收到去空白后的查询 | `TestRegulationsWebQueryBounds` |
| 含排除词(大小写不敏感)的查询返回 `rejected`、提供方不被调用、审计不含该词;空排除词不拦截 | `TestRegulationsExclusionRejectedBeforeProvider` |
| 提供方的 `degraded`、`withheld`、`metadata_only`、`rate_limited`、`rejected` 与 error 原样透传 | `TestRegulationsProviderStatesPassThroughUnchanged` |
| 每次调用一条审计,只含 revision、count、state、querySha256,不含查询明文、片段或网页文本 | `TestRegulationsAuditEvidenceOmitsQueryAndText` |
| 账号无效时四个方法返回守卫错误,提供方不被调用 | `TestRegulationsRequireEffectiveAccount` |
| 只用 `pkg/extension` 的测试插件以 `kbreg` 经编译插件路径注册,冒充插件注册失败,另一编译插件经 Host 断言调用成功并留下基座审计 | `TestRegulationsCompiledPluginCompatibility` |
| 未编入提供方时消费方命令不会提交成功 | `TestRegulationsCompiledConsumerWithoutProvider` |
另需 `pkg/extension` 的 surface 快照测试通过(`surface.txt` 与导出面一致)。
## 7. 分工
- **Backend(本扩展,计划 U9)**:只负责公开契约、基座强制行为与兼容测试;不内置提供方、不实现搜索或抓取、不实现 RDM 适配器。
- **`Agent-System-KB-Regulations`(计划 U2–U5)**:实现并以插件 ID `kbreg` 注册 `RegulationsProvider`,负责语料修订、检索、披露级别、真实搜索提供方适配、网页抓取安全控制与权利留存。
- **Agent-System-RDM(计划 U6/U7)**:经 `RegulationsHost` 消费本能力,把语料检索与网络搜索作为两条独立证据腿做双源核验;负责项目授权、引用渲染与业务审计投影。能力不可用时必须显式降级,不得回退到 `KnowledgeSearch`,也不得宣称完成双源核验。
- **Dev(计划 U8)**:组合 pin 与组合验证。
## 8. 不在本文范围
- sidecar `/host/v1` HTTP 路由与远程提供方形态。
- 搜索提供方选择、实网联调与费用(需用户另行确认提供方与凭据)。
- RDM 证据批次模型、引用展示与篡改检测记录(计划 U6/U7)。
+100 -27
View File
@@ -4,8 +4,51 @@
本索引负责导航与差异提示,规划正文、批准范围和验收条件仍以链接的主记录及其批准版本为准。
合入授权不批准新方向、不调整里程碑范围、不启动新的业务任务。
[分层分支交付与规范精简 r1](2026-10-18-delivery-model-v3.md):2026-10-18 经用户批准实施;
由 Dev 治理大任务 `feature/delivery-model-v3` 推进,实时进度见该任务卡与 PR。
[EXT-20 共享法规检索与网络证据扩展点](2026-10-18-ext-20-regulations-provider.md):法规知识库计划 U9 的基座公开契约;
2026-10-18 经用户授权,由 Dev initiative `feature/regulations-kb` 推进,实时进度见该任务卡与 PR。
待评审(收录不是批准):[svc 插件组合部署(--with)方案 r1](2026-10-14-svc-plugin-compose-deploy.md);
[分层 Python 环境方案 r1](2026-10-15-layered-python-env.md)(8788 无法生成 docx 的环境层;白名单自动批准,其余审批)。
## 先看哪一份
- [IAM U4 阶段 7–10 验收与交付计划](2026-10-15-iam-u4-stage7-10-delivery-plan.md):
基于已批准的聚焦角色权限实现,安排真实浏览器验收、跨仓 Review/PR/CI、Backend 受信 tag、RDM 权威 pin、Dev 手工合入窗口及安全收口。
生产迁移、部署、多角色、账号恢复、Agent 权限和工作流改造不在本计划内。
- [IAM U3 账号资料、有效态、受控目录与本人恢复 r1](2026-10-14-iam-u3-account-contract-and-plan.md):
2026-10-14 用户批准 U3 r1 阶段 4–5;[阶段 6 审阅后修订 r1(A1–A4)](2026-10-14-iam-u3-stage6-review-amendment.md)与[委托投影真实操作者修订](2026-10-14-iam-u3-delegated-projection-actor-amendment.md)均于 2026-10-14 经用户就受影响的阶段 4–5 批准。
实施已合入:Backend PR #198 于 2026-10-14 合入(`2716b9e`,发布为 v0.5.0);Frontend PR #86(`6db528d`)、RDM PR #380(`7c968d9`)与 Dev 组合 PR #626(`7716b28`)于 2026-10-19 合入。
用户在部署环境上的业务验收待完成;生产部署不在本条目范围内。
- [最新模板驱动的两树一网、成员上下文与完整可读审计 r12](2026-10-14-rdm-two-trees-latest-templates.md):2026-10-19 按部分交付收口。已合入各仓 main:W2/W4a 项目结构与只读隔离、W4b 真人确认、W6 历史来源复验、W9 审计截止水位,以及统一文档渲染器(44 份 DHF 模板发布)。剩余 W3/W5/W7/W8/W10–W13 另立后续大任务,E1 保真未通过、正式运行验收 NOT_RUN。
- [IAM I1 权限边界与公开扩展合同 r1](2026-10-13-iam-i1-permission-contract.md):
依据已批准的[用户、职位角色与分层权限统一方案 r1](2026-10-13-identity-role-permission-plan.md)
(Documents `a088809`)冻结系统/项目/资源边界、管理员无业务 bypass、创建者 cap、独立 `audit.read` 与公开扩展四要素。
2026-10-13 已授权 I1(U1–U2);多职、通用角色迁移、资料目录、矩阵及完整运行验收仍按后续单元推进,不以合同保存宣称已交付。
实际进展与证据见 [I1 实施候选与评审记录](2026-10-13-iam-i1-review.md),用户实施评审及[阶段 7 验收](2026-10-13-iam-i1-acceptance.md) 已通过,当前进入智能体 Review、PR、CI 与合入。
- [快慢通道展示与动态工作摘要方案 r1.1](2026-10-12-fast-slow-channel-display.md):
运行卡呈现状态、已完成工作、当前发现与剩余项;四层阅读、阶段成果、来源、异常恢复及 U1–U4。
2026-10-12 方案设计已批准(阶段 1–4);首批仅 U1;[U1 实施计划 r1](2026-10-12-fast-slow-channel-display-u1-plan.md) 待阶段 5 批准;业务实施和运行验收 NOT_RUN。
- [快慢通道 U2/U3 实施计划 r0.1](2026-10-13-fast-slow-u2-u3-plan.md):部分收口:阶段 5 已批准,零付费机制(含 r0.6)已合入;真实模型质量未解决(r0.4 A01 FAIL,r0.5/r0.6 A01 NOT_RUN),未部署。详见[核验报告](../reports/2026-10-13-fast-slow-u2-u3-validation.md)。
- [U3 r0.5 安全终态证据与可信快通道反馈设计](2026-10-14-fast-slow-u3-r05-terminal-evidence-and-fast-feedback-design.md):书面设计、[详细实施计划](2026-10-14-fast-slow-u3-r05-terminal-evidence-and-fast-feedback-implementation-plan.md)及零付费阶段 6 已获批准;唯一另行授权的短工具流探针返回 513 Usage、`clean_eof`、缺 `[DONE]`,工具零执行且授权已用尽。A01 质量仍 NOT_RUN,详见[核验记录](../reports/2026-10-13-fast-slow-u2-u3-validation.md)。
- [U3 r0.6 当前路由的传输完成性证据设计](2026-10-14-fast-slow-u3-r06-transport-completeness-design.md):书面设计与[详细实施计划](2026-10-14-fast-slow-u3-r06-transport-evidence-implementation-plan.md)已获批准,零付费实施通过阶段 6 并合入;唯一获批的一次性传输边界探针(472 Usage、HTTP/2 干净 EOF、缺 `[DONE]`、工具零执行)判定 INCONCLUSIVE,A01 不具备资格,未部署。
- [U3 质量修订设计 r0.2](2026-10-13-fast-slow-u3-quality-revision.md):三处修订方向和书面设计均已批准,实施计划待人工评审;原样本质量及停止边界仍 FAIL,无新付费样本授权。
- [U3 质量修订实施计划 r0.2](2026-10-13-fast-slow-u3-quality-implementation-plan.md):书面设计已批准,阶段 5 计划待人工评审;Task 1–5 为零付费实施与验证,Task 6 的真实模型样本另需明确资源授权。
Generative UI 方向已收口(U1–U7 全部落地,2026-10-12):[使用说明与评测记录](2026-10-12-generative-ui-usage-and-evaluation.md)(final);
主记录 [r2](2026-10-10-generative-ui-plugin.md) 与 [U5 动作范围 r2](2026-10-11-generative-ui-u5-action-scope.md) 保留为过程权威。
U5 已实施合入(动作闭环,Dev #367);[U5 动作范围提案 r2](2026-10-11-generative-ui-u5-action-scope.md) 为已批准范围。U6 经用户 2026-10-11 裁定:待 owner 实际体验 U1–U5 产物(人类可用性对照的执行方式)后再定启动。
r2 U5 条款要求先评审动作范围;本文给出 A/B/C/D 分类、审批挂接(复用既有 DangerHigh 确认卡与
幂等)、排除项与验收线,待三点裁定后 U5 实施另行开任务。
新增方向(已裁定取舍;U1 试验完成,r2 含结果与修订):[Generative UI 调研与插件方案 r2](2026-10-10-generative-ui-plugin.md)。
首试点为对话内完整分析页,交付采用可信编译插件;U1 试验限 MiniMax M3 + M2.7-highspeed、合成或脱敏材料、费用上限 ¥200,作为独立任务另行评审启动。
此记录独立于下方历史核验快照,不改写历史方案/PR 数量或验收结论。
@@ -60,28 +103,28 @@ Dev 链接均指向对应任务 PR,可从其任务卡继续追溯组件 PR;
|---|---|---|---|
| [系统骨架](2026-09-29-system-skeleton-design-and-plan.md) | 历史规划起点;P0–P5、D1–D16;后续有专题局部修订 | 待审 r4;决策勾选仍空 | [历史 P0–P5 实施记录](../records/2026-09-29-implementation.md)可定位阶段和提交;本轮未建立完整独立批准/验收链,不把记录勾选当当前验收 |
| [双档存储与多租户](2026-09-30-dual-tier-storage-and-multitenancy.md) | 明确局部修订骨架:多租户/RAG 前移,SQLite 默认、PG 可选;D17–D24 | accepted,页首称实施完成 | [四阶段实施记录](../records/2026-09-30-dual-tier-implementation.md)及[历史测试报告](../reports/2026-09-30-dual-tier-test-report.md);本轮未据此宣称当前多租户/RAG 已验收 |
| [启动配置面](2026-09-30-configuration-surface.md) | 配置管道、实例隔离;配置专题 | 已批准(随实现交付) | Dev [#12](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/12) 已合入 |
| [跨会话读取](2026-09-30-cross-session-reading.md) | 同项目 transcript 按需读取、权限和入口 | 已批准(随实现交付) | Dev [#67](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/67) 已合入 |
| [交互底座](2026-09-30-ui-inbox-command-workspace.md) | T0–T5:基础、卡片/命令、收件箱、命令总线、工作区、体验收尾 | 已批准总体方案与 T0 计划 | Dev #14/#15/#19/#21/#23/[#25](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/25) 已合入;各 PR 见快照 |
| [UI 重构与认证](2026-09-30-ui-redesign-and-auth.md) | 交互底座后的 R1–R4 与补充修订 | accepted(方向及 R2 范围);页首管理员发放制覆盖旧注册方案 | Dev #30/#37/#43/#53/#61/[#71](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/71) 已合入;R3 与旧正文差异见下表 |
| [卡流与过程分离](2026-09-30-cardflow-and-process-split.md) | CF0–CF2;D39–D43 | 已批准(原文记录用户五项裁定) | Dev [#79](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/79)、[#90](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/90) 已合入 |
| [流式卡片、工件统一与项目收件箱](2026-09-30-card-stream-artifact-unify-project-inbox.md) | CF-S → CF-A → CF3;D44–D52;承接卡流案 | 已批准(声明) | Dev [#100](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/100)、[#103](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/103)、[#105](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/105) 已合入;保留后台 producer 等边界 |
| [文件预览与保留能力](2026-09-30-file-preview-and-reserved-capabilities.md) | 工件管理后续;预览基座、Office、URL、fs | 已裁定(§5);实施任务已命名 | Dev [#77](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/77)、[#94](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/94) 已合入;PPTX 与右栏口径待对齐 |
| [基座路线图](2026-10-01-base-extension-roadmap.md) | 基座/下游边界总记录;显式引用 harness 与栈总案 | 实施中 | Dev [#132](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/132) 已合入;不能据此推断 tag、npm 或下游验收完成 |
| [启动配置面](2026-09-30-configuration-surface.md) | 配置管道、实例隔离;配置专题 | 已批准(随实现交付) | Dev [#12](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/12) 已合入 |
| [跨会话读取](2026-09-30-cross-session-reading.md) | 同项目 transcript 按需读取、权限和入口 | 已批准(随实现交付) | Dev [#67](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/67) 已合入 |
| [交互底座](2026-09-30-ui-inbox-command-workspace.md) | T0–T5:基础、卡片/命令、收件箱、命令总线、工作区、体验收尾 | 已批准总体方案与 T0 计划 | Dev #14/#15/#19/#21/#23/[#25](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/25) 已合入;各 PR 见快照 |
| [UI 重构与认证](2026-09-30-ui-redesign-and-auth.md) | 交互底座后的 R1–R4 与补充修订 | accepted(方向及 R2 范围);页首管理员发放制覆盖旧注册方案 | Dev #30/#37/#43/#53/#61/[#71](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/71) 已合入;R3 与旧正文差异见下表 |
| [卡流与过程分离](2026-09-30-cardflow-and-process-split.md) | CF0–CF2;D39–D43 | 已批准(原文记录用户五项裁定) | Dev [#79](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/79)、[#90](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/90) 已合入 |
| [流式卡片、工件统一与项目收件箱](2026-09-30-card-stream-artifact-unify-project-inbox.md) | CF-S → CF-A → CF3;D44–D52;承接卡流案 | 已批准(声明) | Dev [#100](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/100)、[#103](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/103)、[#105](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/105) 已合入;保留后台 producer 等边界 |
| [文件预览与保留能力](2026-09-30-file-preview-and-reserved-capabilities.md) | 工件管理后续;预览基座、Office、URL、fs | 已裁定(§5);实施任务已命名 | Dev [#77](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/77)、[#94](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/94) 已合入;PPTX 与右栏口径待对齐 |
| [基座路线图](2026-10-01-base-extension-roadmap.md) | 基座/下游边界总记录;显式引用 harness 与栈总案 | 实施中 | Dev [#132](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/132) 已合入;不能据此推断 tag、npm 或下游验收完成 |
| [插件契约 v2](2026-10-01-plugin-contract-v2.md) | 路线图配套;声明、进程内、sidecar、前端 ESM 与生命周期 | 实施中 | 与路线图同任务、Dev #132;四种形态的当前运行状态未重验 |
| [扩展兼容规则](2026-10-01-extension-compat-policy.md) | 路线图配套;兼容窗口、快照、版本发布与申请流程 | 实施中 | Dev #132;EXT-5 文档补充接口方法快照;发布动作另有双钥匙边界 |
| [Agent harness](2026-10-01-agent-harness.md) | P0–P4 前序总案;明确后续栈总案不使 P0–P4 作废 | proposed | Dev #134/#136/#138/#140/#142/[#144](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/144) 已合入;参见阶段导航 |
| [Agent 栈总案](2026-10-02-agent-stack-completion.md) | 当前库分期范围入口;承接 harness | proposed | 文档 Dev [#151](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/151);R0/R1/R2/D1 及后续交付见阶段导航 |
| [EXT-1](2026-10-05-ext-1-inproc-command-handler.md) | 扩展申请;owner 作用域 Host 与进程内命令最小集 | 实施中 | Dev [#207](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/207) 已合入;[#209](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/209) 是任务卡恢复/复核轮,不是第二次公开面实现 |
| [EXT-5](2026-10-06-ext-5-host-parse-document.md) | 继 EXT-1 开放宿主文档解析;不依赖未提交的 EXT-4 | 实施中 | Dev [#222](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/222)、修复 [#224](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/224) 已合入;下游接入和发布不等于完成 |
| [N1/Q1/I1 实施案](2026-10-07-agent-stack-n1q1i1-plans.md) | 栈总案 §5 的三个阶段细化;明确不包含 N2/Q2/I2 | proposed | 文档 Documents [#40](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/40)、Dev [#226](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/226) 已合入;实施范围差异见下表 |
| [RDM 阶段总案](2026-10-07-rdm-phase-plan.md) | 下游大目标、双仓及可退化约束;P0–P4 / MS0'–MS4 | proposed;§2.3 现状复核已回填(2026-10-08) | 文档 Documents [#41](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/41)、Dev [#229](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/229) 已合入;不代表 RDM 各阶段获准实施 |
| [N2 实施案](2026-10-07-agent-stack-n2-plan.md) | 栈总案 N2 的六 WP:上下文、协议、工具、skills、子代理、装配 | 未单列确认状态及 owner;正文称 N2 开工 | Documents [#42](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/42) 已合入;Dev [#244](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/244) 已合入(merge `7e3ba10`),闭卡 [#247](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/247)。卡内自述六 WP 落地;本索引未重放 |
| [N3 实施案](2026-10-07-agent-stack-n3-plan.md) | 栈总案 N3:持久与可观测 | 页首未单列确认状态及 owner;正文称 N3 开工 | Documents [#43](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/43) 已合入;Dev [#248](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/248) 已合入(merge `2836a87`),闭卡 [#249](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/249)。卡内自述六 WP 落地;本索引未重放 |
| [Q2/Q3 实施案](2026-10-07-agent-stack-q2q3-plans.md) | 栈总案 Q2 拓扑与 Q3 收敛互通 | 页首未单列确认状态及 owner | Documents [#44](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/44) 已合入;Dev [#250](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/250) 采纳方案,[#251](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/251)(merge `452c00a`)与 [#253](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/253)(merge `c8ce4eb`)已合入。卡内自述 Q2/Q3 落地;本索引未重放 |
| [Agent harness](2026-10-01-agent-harness.md) | P0–P4 前序总案;明确后续栈总案不使 P0–P4 作废 | proposed | Dev #134/#136/#138/#140/#142/[#144](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/144) 已合入;参见阶段导航 |
| [Agent 栈总案](2026-10-02-agent-stack-completion.md) | 当前库分期范围入口;承接 harness | proposed | 文档 Dev [#151](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/151);R0/R1/R2/D1 及后续交付见阶段导航 |
| [EXT-1](2026-10-05-ext-1-inproc-command-handler.md) | 扩展申请;owner 作用域 Host 与进程内命令最小集 | 实施中 | Dev [#207](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/207) 已合入;[#209](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/209) 是任务卡恢复/复核轮,不是第二次公开面实现 |
| [EXT-5](2026-10-06-ext-5-host-parse-document.md) | 继 EXT-1 开放宿主文档解析;不依赖未提交的 EXT-4 | 实施中 | Dev [#222](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/222)、修复 [#224](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/224) 已合入;下游接入和发布不等于完成 |
| [N1/Q1/I1 实施案](2026-10-07-agent-stack-n1q1i1-plans.md) | 栈总案 §5 的三个阶段细化;明确不包含 N2/Q2/I2 | proposed | 文档 Documents [#40](https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/40)、Dev [#226](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/226) 已合入;实施范围差异见下表 |
| [RDM 阶段总案](2026-10-07-rdm-phase-plan.md) | 下游大目标、双仓及可退化约束;P0–P4 / MS0'–MS4 | proposed;§2.3 现状复核已回填(2026-10-08) | 文档 Documents [#41](https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/41)、Dev [#229](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/229) 已合入;不代表 RDM 各阶段获准实施 |
| [N2 实施案](2026-10-07-agent-stack-n2-plan.md) | 栈总案 N2 的六 WP:上下文、协议、工具、skills、子代理、装配 | 未单列确认状态及 owner;正文称 N2 开工 | Documents [#42](https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/42) 已合入;Dev [#244](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/244) 已合入(merge `7e3ba10`),闭卡 [#247](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/247)。卡内自述六 WP 落地;本索引未重放 |
| [N3 实施案](2026-10-07-agent-stack-n3-plan.md) | 栈总案 N3:持久与可观测 | 页首未单列确认状态及 owner;正文称 N3 开工 | Documents [#43](https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/43) 已合入;Dev [#248](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/248) 已合入(merge `2836a87`),闭卡 [#249](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/249)。卡内自述六 WP 落地;本索引未重放 |
| [Q2/Q3 实施案](2026-10-07-agent-stack-q2q3-plans.md) | 栈总案 Q2 拓扑与 Q3 收敛互通 | 页首未单列确认状态及 owner | Documents [#44](https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/44) 已合入;Dev [#250](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/250) 采纳方案,[#251](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/251)(merge `452c00a`)与 [#253](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/253)(merge `c8ce4eb`)已合入。卡内自述 Q2/Q3 落地;本索引未重放 |
| [智能体工作流质量改进](2026-10-09-agent-quality-improvement-plan.md) | 直连主路径质量:诊断→六项裁定→P0–P5 分期 + 模型 A/B;推翻 fs 工具默认关闭裁定 | 已获实施授权(2026-10-09 六项裁定);首个增量 feature/agent-quality-phase01 | 随本提案 PR;诊断 SELF(真实运行转录);基线报告见任务卡 |
| [EXT 申请包 C1–C7](2026-10-08-ext-c1-c7-rdm-shared-contracts.md) | RDM 多人共享契约的基座最小扩展申请(EXT-6…EXT-12):身份停用/受管配置/授权适配器/索引发布/分发守卫/Host 工厂/投影过滤 | proposed;需求依据=RDM U0 主记录(D1–D9 裁定,2026-10-08 合入) | 随本提案 PR;每条现状证据为 SELF·源码级(Dev 34a2bbe/backend fe7c245),运行态 NOT_RUN;受理后逐条另立实现任务 |
| [EXT 申请包 G1](2026-10-09-ext-g1-b1-b3-exec-backend.md) | EXT-13…16:回合内共享检索、命令即工具、项目列表共享、执行后端接口 | proposed;需求依据=RDM 方案 V1.1 §3.3/§3.4/§5.3(2026-10-09 批复) | Documents [#52](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/52) 已合入;EXT-16 已实施(Dev #285,见其任务卡),其余受理评审待定。本行由本次索引维护补充 |
| [EXT 申请包 G1](2026-10-09-ext-g1-b1-b3-exec-backend.md) | EXT-13…16:回合内共享检索、命令即工具、项目列表共享、执行后端接口 | proposed;需求依据=RDM 方案 V1.1 §3.3/§3.4/§5.3(2026-10-09 批复) | Documents [#52](https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/52) 已合入;EXT-16 已实施(Dev #285,见其任务卡),其余受理评审待定。本行由本次索引维护补充 |
| [子代理分工、模型分级路由与任务沙箱](2026-10-10-agent-delegation-routing-sandbox.md) | 方向主记录:委派契约与角色路由方案(E1–E5 增量)+ 任务工作区沙箱设计(仅记录不实施);修正 overlay≠快照等三处假设 | proposed(2026-10-10);E1、E3、E4(R4+账本)、E5(R3)、S0-1 已完成(E4:Dev #315;S0-1:Backend #135/#136、Dev #318,2026-10-11);E2 暂缓(模型指示)、S0-2 待授权 | 随本提案 PR;现状核查与启动延迟为 SELF(任务卡 evidence);外部来源 URL 全量随任务卡 |
原查询的 19 份原文中,14 份显式标注 owner 为 weichen。双档存储、启动配置面、跨会话读取、文件预览和
@@ -98,15 +141,15 @@ RDM 总案把库分期作为支撑与依赖,不覆盖库分期的原始范围
| 阶段 | 主记录与关联任务 | 核验结果与继续工作的边界 |
|---|---|---|
| harness P0–P4 | harness 对应 `feature/agent-harness-p0` 至 `p4`,含 p3b | 上表六个 Dev PR 已合入;旧卡“后续尚未实施”只属于当时快照 |
| R0/R1、R2、D1 | 栈总案;`feature/agent-stack-r0-r1`、`r2`、`d1` | Dev [#152](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/152)、[#154](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/154)、[#156](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/156) 已合入;不得把同号审计缺陷误作阶段名 |
| N1 | N1/Q1/I1 案 §2;`feature/agent-stack-n1` | Dev [#232](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/232) 已合入;状态与范围差异已于 2026-10-08 回填至[主记录 §7.1](2026-10-07-agent-stack-n1q1i1-plans.md)(WP6b/6c 等转出项带归属,均未被后续阶段承接) |
| Q1 | 同案 §3;`feature/agent-stack-q1` | Dev [#237](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/237)、[#240](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/240) 已合入;platform task 与 squad run 的统一边界已厘清并回填至[主记录 §7.2](2026-10-07-agent-stack-n1q1i1-plans.md)(Store 层合一已做,队列翻译转出且 Q2/Q3 未承接) |
| I1 | 同案 §4;`feature/agent-stack-i1` | Dev [#234](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/234)、[#235](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/235) 已合入;blueprint entry、SetSlot/Cancel/Handoff 等后续边界已回填至[主记录 §7.3](2026-10-07-agent-stack-n1q1i1-plans.md) |
| I2 | 栈总案 §5/I2;`feature/agent-stack-i2` | Dev [#242](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/242) 已合入;主记录已加状态回填([栈总案 I2 节](2026-10-02-agent-stack-completion.md)),I2 卡断链已在 Dev 侧修正;开启态完整用户验收未重放 |
| N2 | N2 阶段案;Dev [#244](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/244),闭卡 [#247](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/247) | 2026-10-08 同步时已在 Dev main。#244 标题是接入方案并开启任务;完成声明在已归档任务卡,本索引未重放其测试 |
| N3 | [N3 实施案](2026-10-07-agent-stack-n3-plan.md);Dev [#248](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/248),闭卡 [#249](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/249) | 方案与任务卡已合入。完成声明在已归档任务卡,本索引未重放 |
| Q2 | [Q2/Q3 实施案](2026-10-07-agent-stack-q2q3-plans.md) 第一部分;Dev [#250](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/250)、[#251](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/251) | #251 已合入。完成声明在已归档任务卡,本索引未重放 |
| Q3 | 同案第二部分;Dev [#253](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/253) | #253 已合入。完成声明在已归档任务卡,本索引未重放 |
| R0/R1、R2、D1 | 栈总案;`feature/agent-stack-r0-r1`、`r2`、`d1` | Dev [#152](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/152)、[#154](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/154)、[#156](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/156) 已合入;不得把同号审计缺陷误作阶段名 |
| N1 | N1/Q1/I1 案 §2;`feature/agent-stack-n1` | Dev [#232](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/232) 已合入;状态与范围差异已于 2026-10-08 回填至[主记录 §7.1](2026-10-07-agent-stack-n1q1i1-plans.md)(WP6b/6c 等转出项带归属,均未被后续阶段承接) |
| Q1 | 同案 §3;`feature/agent-stack-q1` | Dev [#237](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/237)、[#240](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/240) 已合入;platform task 与 squad run 的统一边界已厘清并回填至[主记录 §7.2](2026-10-07-agent-stack-n1q1i1-plans.md)(Store 层合一已做,队列翻译转出且 Q2/Q3 未承接) |
| I1 | 同案 §4;`feature/agent-stack-i1` | Dev [#234](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/234)、[#235](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/235) 已合入;blueprint entry、SetSlot/Cancel/Handoff 等后续边界已回填至[主记录 §7.3](2026-10-07-agent-stack-n1q1i1-plans.md) |
| I2 | 栈总案 §5/I2;`feature/agent-stack-i2` | Dev [#242](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/242) 已合入;主记录已加状态回填([栈总案 I2 节](2026-10-02-agent-stack-completion.md)),I2 卡断链已在 Dev 侧修正;开启态完整用户验收未重放 |
| N2 | N2 阶段案;Dev [#244](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/244),闭卡 [#247](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/247) | 2026-10-08 同步时已在 Dev main。#244 标题是接入方案并开启任务;完成声明在已归档任务卡,本索引未重放其测试 |
| N3 | [N3 实施案](2026-10-07-agent-stack-n3-plan.md);Dev [#248](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/248),闭卡 [#249](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/249) | 方案与任务卡已合入。完成声明在已归档任务卡,本索引未重放 |
| Q2 | [Q2/Q3 实施案](2026-10-07-agent-stack-q2q3-plans.md) 第一部分;Dev [#250](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/250)、[#251](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/251) | #251 已合入。完成声明在已归档任务卡,本索引未重放 |
| Q3 | 同案第二部分;Dev [#253](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/253) | #253 已合入。完成声明在已归档任务卡,本索引未重放 |
原始任务卡在 Dev 仓 `.task/archive/`。任务主记录和既有分工优先复用,
索引整理不重新领取或另建相同业务任务。
@@ -158,3 +201,33 @@ RDM 总案把库分期作为支撑与依赖,不覆盖库分期的原始范围
后续维护:主案或任务变化时先更新其唯一主记录,再更新这里的导航和核验快照。
更换 Docs/Dev 基线后重新核对 PR、版本与在途任务;新的索引状态不自动产生实施授权。
## 2026-10-13 规划补充
- [最终验证与合入调度实施计划 r1](2026-10-13-merge-queue-implementation-plan.md):阶段 5 已于 2026-10-13 经用户「批准」确认,原生逐项实施;U1–U3 源码与自检在 Dev 任务分支推进,U4 待启用记录及规则已准备,U5 平台所有者操作与 U6 真实三任务 CI 试行仍 NOT_RUN。实际对象、证据和进度回链 Dev 任务卡,不把本索引当第二进度权威。
- [RDM 设置归属、成员、文档职责与权限矩阵完善增量方案 r1](2026-10-13-rdm-settings-members-duties-perms-increment.md):承接总案 U3/U4/U6(衔接 U5)的完整增量——设置作用域与受管项、可搜索人员选择器、单成员/多人权限矩阵与三态项目覆盖;含服务端一致性修复。**2026-10-13 用户评审通过并授权实施**。第四节及 P5/P7 的文档职责页交互已被下方 r2 取代,其余部分继续有效。
## 2026-10-15 规划补充
- [文档职责矩阵整改 r2](2026-10-15-rdm-duty-matrix-rework.md):项目设置只分配已有文档的编制、审核、批准;按人员、按文档、成员×文档三视图共享一份草稿。章节级新指派停用,有歧义的旧章节职责逐文档确认。2026-10-15 按实施方案执行;部署与真实账号验收未授权。收录不把其余未完成增量自动标成已验收。
## 2026-10-12 规划补充
- [svc 统一部署与一次性登录 Key 方案 r1](2026-10-12-svc-unified-deploy-and-login-key.md):将 `svc.sh` 增强为二进制/源码统一部署入口,并补齐无初始密码开户与账户恢复;一次性登录 Key 只能兑换设密受限会话。r1 含源码复核与四项取舍定案;复用恢复方案 KTD 与已合入的 recovery U1(Dev #415)。**2026-10-12 已批准**(五阶段+U1/U4 规格);r2 增补经 #87 合入;**2026-10-13 r3:登录恢复流程按用户「按此方案实施」批准并合入**(Backend #187 / Frontend #76 / Dev #504,浏览器验收 PASS;三裁定与实施记录见 §11)。规格与合同见 Dev `docs/svc-deploy/`。
- [服务重启与全量数据恢复方案 r2](2026-10-12-service-restart-data-recovery.md):2026-10-12 用户要求 svc 停止/再次启动及异常退出后恢复所有服务与数据;覆盖服务依赖/监管、持久配置和数据身份、run/HITL/命令/通知、未知副作用隔离、文件一致性与组合备份。r1 经六角色自审,r2 吸收外部源码复核(见同名 review 记录两轮)。**2026-10-12 用户批准 r2(五阶段一并)**;实施/故障注入/部署/运行验收 NOT_RUN。关联协作存储 R7;U2 首切片已由 svc-autorecover 任务合入 main(PR #396/#401,2026-10-11);U1 实例身份已合入(Dev #415,2026-10-12),余量按 KTD 对齐后续增量。
## 2026-10-11 规划补充
- [RDM 两树一网集成、完善与追溯审计展示方案 r1](2026-10-11-rdm-two-trees-trace-audit-integration.md):对应 P3/MS3,源码已有部分实现;优先补项目绑定、创建者/管理员读取隔离与历史完整性,再接统一展示。用户确认范围为 RDM 与必要基座能力;r1 已获用户评审通过(2026-10-11,五阶段一并,含 KTD4 双层管理员裁定)。U1–U5 全部实施合入(RDM PR #195/#197/#201/#213;Dev PR #368,2026-10-11;超管槽待基座能力接线,见 RDM 仓 U1 基座扩展申请)。U6 团队存储独立后续;运行验收属部署环境。
- [DHF 模板接入 RDM 文档生成管线 r0.1](2026-10-14-dhf-template-generation-plan.md):用户于 2026-10-14 批准本方案并启动实施。RDM 的首批资产合同与 44 份原件目录已在独立任务分支保存;14 份 DOC 均有自动转换候选,E1 内容与版式保真仍待人工评审,正式模板发布数为 0。真实《项目建议书》的结构/槽位评审候选已形成;U1 整体、U2–U6 用户流程、正式验收与部署尚未完成。与在途两树任务沿用同一 TT-T/TT-D 契约;每阶段仍按既有人工评审门禁推进。
- [RDM 模板与两树一网对话文档生成方案 r1.1](2026-10-11-rdm-template-dialog-generation.md):69 类旧资产、2026-10-11 四个注册模板的历史盘点及生成闭环设计;待评审,实施/迁移/模型试验/运行验收 NOT_RUN。与两树一网集成方案共用项目授权、原子事件与历史能力。 首批项目建议书/竞品分析、随后扩展全部文档已确认(2026-10-11),其余方案与实施仍待评审;2026-10-14 资产和源码刷新见 DHF 专项。
- [RDM 最终目标核对与完整交付方案 r1](2026-10-11-rdm-final-target-completion.md):本轮用户确认系统级唯一项目、管理员上限内覆盖、私域与三权读取边界;覆盖 34 UR/68 SR/10 F、全部69类模板及现有XLSX,当前源复核 RDM d8d7e743。总体方案待评审,实施/迁移/运行验收 NOT_RUN;模板方案为子方案。
- [工作台界面重设计 r0.2](2026-10-12-work-companion-ui-design.md)及[实施计划 r1](2026-10-12-work-companion-ui-plan.md):对话优先、渐进任务摘要、窄屏与单一状态投影;已获本次连续实施授权。
- [系统项目、成员工作入口与私域协作闭环 r1.1](2026-10-13-system-project-membership.md):2026-10-13 已批准方向及阶段 1–9 连续推进;统一生命周期、成员个人会话、每项目两树一网与私域权限;组合验收/CI/tag 消费推进中,部署和线上修复未授权。
File diff suppressed because one or more lines are too long
@@ -126,7 +126,7 @@
"repo": "Agent-System-Dev",
"number": 12,
"title": "Pin backend with the configuration pipe and documents with its design",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/12",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/12",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T04:27:51Z",
@@ -141,7 +141,7 @@
"repo": "Agent-System-Dev",
"number": 14,
"title": "Wire Agent-System-UI and Agent-Command into the Dev combo (T0)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/14",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/14",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T06:11:54Z",
@@ -156,7 +156,7 @@
"repo": "Agent-System-Dev",
"number": 15,
"title": "T1: pin contracts combo (core cards/commands, agent-command v0) and guard task-finish",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/15",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/15",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T06:34:06Z",
@@ -171,7 +171,7 @@
"repo": "Agent-System-Dev",
"number": 19,
"title": "T2: pin the inbox combo (cardsvc backend, ui components, frontend wiring)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/19",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/19",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T07:36:09Z",
@@ -186,7 +186,7 @@
"repo": "Agent-System-Dev",
"number": 21,
"title": "T3: pin the command-bus combo (cmdbus, InlineConfirmCard, symmetric entries)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/21",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/21",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T07:56:27Z",
@@ -201,7 +201,7 @@
"repo": "Agent-System-Dev",
"number": 23,
"title": "T4: pin the workspaces combo (OverlayHost, pure-inbox rail, Cmd shortcuts)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/23",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/23",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T08:09:48Z",
@@ -216,7 +216,7 @@
"repo": "Agent-System-Dev",
"number": 25,
"title": "T5: pin the polish combo (zero-page walkthrough, tidy, guide) - proposal complete",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/25",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/25",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T08:18:34Z",
@@ -231,7 +231,7 @@
"repo": "Agent-System-Dev",
"number": 30,
"title": "界面重构与多用户认证设计提案(documents gitlink + 任务卡)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/30",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/30",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T10:02:29Z",
@@ -246,7 +246,7 @@
"repo": "Agent-System-Dev",
"number": 37,
"title": "Task-centric sidebar R1 (option A): gitlinks + task card",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/37",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/37",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T10:46:46Z",
@@ -261,7 +261,7 @@
"repo": "Agent-System-Dev",
"number": 43,
"title": "Admin-issued accounts R2: gitlinks + task card",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/43",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/43",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T11:17:31Z",
@@ -276,7 +276,7 @@
"repo": "Agent-System-Dev",
"number": 53,
"title": "R4 visual refresh: gitlinks + task card",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/53",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/53",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T12:44:52Z",
@@ -291,7 +291,7 @@
"repo": "Agent-System-Dev",
"number": 61,
"title": "UI capability platform: gitlinks + .gitignore + task card",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/61",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/61",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T14:23:41Z",
@@ -306,7 +306,7 @@
"repo": "Agent-System-Dev",
"number": 67,
"title": "Deliver layered cross-session reading and pin the five module PRs",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/67",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/67",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T15:27:41Z",
@@ -321,7 +321,7 @@
"repo": "Agent-System-Dev",
"number": 71,
"title": "Deliver part-order fidelity, artifact downloads, file management, and the settings shell fix",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/71",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/71",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T15:44:05Z",
@@ -336,7 +336,7 @@
"repo": "Agent-System-Dev",
"number": 77,
"title": "Pin the file-preview proposal and restore the regressed module gitlinks",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/77",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/77",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T16:06:43Z",
@@ -351,7 +351,7 @@
"repo": "Agent-System-Dev",
"number": 79,
"title": "Agent-System-Dev: review fixes for chat-process-split-r1 (symlink, live interleaving, artifact process)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/79",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/79",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T16:17:03Z",
@@ -366,7 +366,7 @@
"repo": "Agent-System-Dev",
"number": 90,
"title": "Pin cardflow-r1 module combination (CF1: submit_card, card anchor, process split)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/90",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/90",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T17:14:50Z",
@@ -381,7 +381,7 @@
"repo": "Agent-System-Dev",
"number": 94,
"title": "Deliver file previews, dual-dock placement, and reserved delete/fs capabilities",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/94",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/94",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T17:21:30Z",
@@ -396,7 +396,7 @@
"repo": "Agent-System-Dev",
"number": 100,
"title": "Land card streaming (CF-S: card_begin/card_append/card_commit)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/100",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/100",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T18:23:29Z",
@@ -411,7 +411,7 @@
"repo": "Agent-System-Dev",
"number": 103,
"title": "Land artifact unification (CF-A: backfill symmetry + facade cards)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/103",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/103",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T18:44:17Z",
@@ -426,7 +426,7 @@
"repo": "Agent-System-Dev",
"number": 105,
"title": "Land cross-session project inbox (CF3: D48-D51)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/105",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/105",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T19:20:29Z",
@@ -441,7 +441,7 @@
"repo": "Agent-System-Dev",
"number": 132,
"title": "Pin the extension roadmap and downstream spike",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/132",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/132",
"state": "closed",
"merged": true,
"merged_at": "2026-10-01T10:47:14Z",
@@ -456,7 +456,7 @@
"repo": "Agent-System-Dev",
"number": 134,
"title": "Pin the harness proposal and native tool-call replay",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/134",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/134",
"state": "closed",
"merged": true,
"merged_at": "2026-10-01T12:43:41Z",
@@ -471,7 +471,7 @@
"repo": "Agent-System-Dev",
"number": 136,
"title": "Pin the harness turn loop across the three native checkouts",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/136",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/136",
"state": "closed",
"merged": true,
"merged_at": "2026-10-01T13:42:01Z",
@@ -486,7 +486,7 @@
"repo": "Agent-System-Dev",
"number": 138,
"title": "Pin backend to the final-turn result checks",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/138",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/138",
"state": "closed",
"merged": true,
"merged_at": "2026-10-01T14:00:59Z",
@@ -501,7 +501,7 @@
"repo": "Agent-System-Dev",
"number": 140,
"title": "Pin backend to the depth-one subagent loop",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/140",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/140",
"state": "closed",
"merged": true,
"merged_at": "2026-10-01T14:51:02Z",
@@ -516,7 +516,7 @@
"repo": "Agent-System-Dev",
"number": 142,
"title": "Pin P3b background subagents, review, and profile overrides",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/142",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/142",
"state": "closed",
"merged": true,
"merged_at": "2026-10-01T15:51:57Z",
@@ -531,7 +531,7 @@
"repo": "Agent-System-Dev",
"number": 144,
"title": "Add intent-to-workflow execution",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/144",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/144",
"state": "closed",
"merged": true,
"merged_at": "2026-10-02T01:04:03Z",
@@ -546,7 +546,7 @@
"repo": "Agent-System-Dev",
"number": 151,
"title": "Pin documents to the agent stack completion proposal",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/151",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/151",
"state": "closed",
"merged": true,
"merged_at": "2026-10-03T14:15:52Z",
@@ -561,7 +561,7 @@
"repo": "Agent-System-Dev",
"number": 152,
"title": "Check nested library pins and test the three agent libraries",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/152",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/152",
"state": "closed",
"merged": true,
"merged_at": "2026-10-03T12:47:36Z",
@@ -576,7 +576,7 @@
"repo": "Agent-System-Dev",
"number": 154,
"title": "Pin the R2 library and backend heads",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/154",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/154",
"state": "closed",
"merged": true,
"merged_at": "2026-10-03T13:22:55Z",
@@ -591,7 +591,7 @@
"repo": "Agent-System-Dev",
"number": 156,
"title": "Pin the D1 library and backend heads",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/156",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/156",
"state": "closed",
"merged": true,
"merged_at": "2026-10-03T14:02:34Z",
@@ -606,7 +606,7 @@
"repo": "Agent-System-Dev",
"number": 167,
"title": "Add an architecture edge ratchet and waiting-state tokens",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/167",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/167",
"state": "closed",
"merged": true,
"merged_at": "2026-10-03T16:04:36Z",
@@ -621,7 +621,7 @@
"repo": "Agent-System-Dev",
"number": 207,
"title": "Add EXT-1 inproc command handler and owner-scoped host handle (minimal set)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/207",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/207",
"state": "closed",
"merged": true,
"merged_at": "2026-10-05T11:48:46Z",
@@ -636,7 +636,7 @@
"repo": "Agent-System-Dev",
"number": 209,
"title": "Restore and complete the EXT-1 task card after branch recreation (verification round)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/209",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/209",
"state": "closed",
"merged": true,
"merged_at": "2026-10-05T12:07:12Z",
@@ -651,7 +651,7 @@
"repo": "Agent-System-Dev",
"number": 222,
"title": "Expose builtin document parsing through the host handle (EXT-5)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/222",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/222",
"state": "closed",
"merged": true,
"merged_at": "2026-10-06T15:14:31Z",
@@ -666,7 +666,7 @@
"repo": "Agent-System-Dev",
"number": 224,
"title": "Pin the wide-columns xlsx fix",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/224",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/224",
"state": "closed",
"merged": true,
"merged_at": "2026-10-06T15:39:48Z",
@@ -681,7 +681,7 @@
"repo": "Agent-System-Dev",
"number": 226,
"title": "Propose N1/Q1/I1 implementation plans (docs only)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/226",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/226",
"state": "closed",
"merged": true,
"merged_at": "2026-10-07T02:51:40Z",
@@ -696,7 +696,7 @@
"repo": "Agent-System-Dev",
"number": 229,
"title": "Propose the RDM phase plan (docs only)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/229",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/229",
"state": "closed",
"merged": true,
"merged_at": "2026-10-07T04:34:51Z",
@@ -711,7 +711,7 @@
"repo": "Agent-System-Dev",
"number": 232,
"title": "Pin the merged WP5 gate-sinking combination",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/232",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/232",
"state": "closed",
"merged": true,
"merged_at": "2026-10-07T06:50:22Z",
@@ -726,7 +726,7 @@
"repo": "Agent-System-Dev",
"number": 234,
"title": "Pin the merged I1 command-model and router combination",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/234",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/234",
"state": "closed",
"merged": true,
"merged_at": "2026-10-07T08:04:20Z",
@@ -741,7 +741,7 @@
"repo": "Agent-System-Dev",
"number": 235,
"title": "Pin the merged I1 eval-v2 combination",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/235",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/235",
"state": "closed",
"merged": true,
"merged_at": "2026-10-07T08:44:41Z",
@@ -756,7 +756,7 @@
"repo": "Agent-System-Dev",
"number": 237,
"title": "Pin the merged superstep engine (Q1 WP1/WP2)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/237",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/237",
"state": "closed",
"merged": true,
"merged_at": "2026-10-07T09:12:58Z",
@@ -771,7 +771,7 @@
"repo": "Agent-System-Dev",
"number": 240,
"title": "Pin the merged SQLite convergence (Q1 WP5)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/240",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/240",
"state": "closed",
"merged": true,
"merged_at": "2026-10-07T10:38:59Z",
@@ -786,7 +786,7 @@
"repo": "Agent-System-Dev",
"number": 242,
"title": "Take the backend intent slow lane and the I2 port pins (I2 WP3)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/242",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/242",
"state": "closed",
"merged": true,
"merged_at": "2026-10-07T11:58:02Z",
@@ -801,7 +801,7 @@
"repo": "Agent-System-Dev",
"number": 244,
"title": "Take the N2 implementation plan and open the N2 task",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/244",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/244",
"state": "open",
"merged": false,
"merged_at": null,
@@ -816,7 +816,7 @@
"repo": "Agent-System-Documents",
"number": 14,
"title": "界面重构与多用户认证设计提案 + HTML demo(方案 A/B/C + 认证)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/14",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/14",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T10:02:04Z",
@@ -831,7 +831,7 @@
"repo": "Agent-System-Documents",
"number": 27,
"title": "Propose card stream, artifact unification, and project inbox (D44-D52)",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/27",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/27",
"state": "closed",
"merged": true,
"merged_at": "2026-09-30T17:45:16Z",
@@ -846,7 +846,7 @@
"repo": "Agent-System-Documents",
"number": 31,
"title": "Document the base extension roadmap and plugin contract v2",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/31",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/31",
"state": "closed",
"merged": true,
"merged_at": "2026-10-01T10:47:11Z",
@@ -861,7 +861,7 @@
"repo": "Agent-System-Documents",
"number": 32,
"title": "Propose the agent harness and link it from the roadmap",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/32",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/32",
"state": "closed",
"merged": true,
"merged_at": "2026-10-01T12:43:26Z",
@@ -876,7 +876,7 @@
"repo": "Agent-System-Documents",
"number": 34,
"title": "Propose the agent stack audit and completion design",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/34",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/34",
"state": "closed",
"merged": true,
"merged_at": "2026-10-03T14:12:17Z",
@@ -891,7 +891,7 @@
"repo": "Agent-System-Documents",
"number": 39,
"title": "Restore the EXT-1 proposal and request EXT-5 host document parse",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/39",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/39",
"state": "closed",
"merged": true,
"merged_at": "2026-10-06T15:14:15Z",
@@ -906,7 +906,7 @@
"repo": "Agent-System-Documents",
"number": 40,
"title": "Propose N1/Q1/I1 implementation plans for the agent stack",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/40",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/40",
"state": "closed",
"merged": true,
"merged_at": "2026-10-07T02:51:31Z",
@@ -921,7 +921,7 @@
"repo": "Agent-System-Documents",
"number": 41,
"title": "Propose the RDM phase plan: direction, invariants, and stage gates",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/41",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/41",
"state": "closed",
"merged": true,
"merged_at": "2026-10-07T04:34:51Z",
@@ -936,7 +936,7 @@
"repo": "Agent-System-Documents",
"number": 42,
"title": "Propose the N2 implementation plan: context, protocol, and tools",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/42",
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/42",
"state": "closed",
"merged": true,
"merged_at": "2026-10-07T12:38:28Z",
@@ -955,7 +955,7 @@
"head_ref": "feature/agent-stack-n2",
"head_sha": "eae6992ae81335df5eb016223e2522fab952ae7f",
"title": "Take the N2 implementation plan and open the N2 task",
"url": "https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/244"
"url": "https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/244"
}
],
"Agent-System-Documents": []
File diff suppressed because one or more lines are too long
@@ -0,0 +1,14 @@
# 最终目标方案文档审阅记录
对象:[总体方案 r1](../proposals/2026-10-11-rdm-final-target-completion.md)与[112 项需求矩阵](2026-10-11-rdm-final-target-requirements-matrix.md)。日期 2026-10-11。
等级 SELF:三组本地模型阅读,覆盖一致性、可行性、产品、范围、交互、权限与失效场景;不是人工批准、独立 GATE/REPLAY 或业务验收。未执行跨供应商审阅。
审阅前增量复核 RDM 从 0081628a 到 d8d7e743 的变化:保留已新增 HostBinding、项目命令守卫、上传项目约束和单行管理员引导事实,不继续按旧缺口排重建;仍需宿主绑定双向权限、成员工作目录与文档资源/职责授权,已进入 G 表及 U2/U3。
| 发现 | 后果 | 已作修订 |
|---|---|---|
| U7 全模板真实验收是 U8 生成能力的前置,形成相互等待 | 可能以静态注册检查冒充全量模板可用 | U7 收敛为全量台账/公共契约/两模板;U8 首批闭环;新增 U16 全文档族迁移验收;U14 等 U16 |
| U8 首批竞品模板含法规要点,却未依赖 U12 | 可能用模型URL或单通道占位完成首批 | U12 加入 U8 前置,同步依赖表和说明,保持无环 |
最终产品/范围/交互复核未提出其他实质问题,34 UR、68 SR、10 F 编号集合无缺项/重复;全部69类及XLSX目标未缩水。权限/失效场景复核确认私域与授权知识快照、三权、防换角色自审、撤权、宿主双向绑定等约束已表达。
本记录仅证明文档检查及相应修订;实际执行能力、测试通过、部署和用户验收均未据此认定。
@@ -0,0 +1,136 @@
# 最终目标逐条覆盖矩阵(2026-10-11)
主记录:[完整交付方案 r1](../proposals/2026-10-11-rdm-final-target-completion.md)。来源:RDM `docs/requirements/01-用户需求与系统需求.md`(V2.2)及 README/U0/Q 裁定;复核 RDM d8d7e743。
34 UR、68 SR、10 F 均保留原编号。以下为 SELF 源码级盘点,当前运行验收均 NOT_RUN;“已有”不等于已验证/部署,“后移”不等于取消。摘要仅用于定位,语义以原文和用户确认 D1–D6 为准。G/U 均指主记录。
## 系统需求(68 条)
| ID | 原文摘要 | 当前源码级情况 | 仍需完成 | 工作包/差距 | 原文行 |
|---|---|---|---|---|---|
| SR-A1 | 系统应支持 doc/docx/pdf/ppt/pptx/xls/xlsx/md/txt/图片等常见格式上传,对不支持格式仅提醒不阻断 | 接收/解析部分已有 | 多格式、保真、发布边界、渐进反馈及实际时限需补齐 | U5/U9/U14;G9/G10/G15 | 431 |
| SR-A2 | 上传不强制附带文字指令;无指令时进入默认"记忆构建"流程(见 SR-B 系列),不输出制式化"未识别需求"回复 | 接收/解析部分已有 | 多格式、保真、发布边界、渐进反馈及实际时限需补齐 | U5/U9/U14;G9/G10/G15 | 432 |
| SR-A3 | 支持单文件、多文件批量上传,并记录来源渠道(Web/飞书/其他)与上传人 | 接收/解析部分已有 | 多格式、保真、发布边界、渐进反馈及实际时限需补齐 | U5/U9/U14;G9/G10/G15 | 433 |
| SR-A4 | 上传后 60 秒内输出第一阶段反馈(相关性结论 + 初步阶段归类);完整入库允许后台异步完成 | 接收/解析部分已有 | 多格式、保真、发布边界、渐进反馈及实际时限需补齐 | U5/U9/U14;G9/G10/G15 | 434 |
| SR-A5 | 入库完整性保障:解析失败、部分内容不可解析或入库异常时,必须显式告知用户并在入库记录中标记,原始文件永久保留可取回;禁止静默降级或静默产出残缺结果(教训来源:旧版曾发生报价单 Excel 数据丢失、P… | 接收/解析部分已有 | 多格式、保真、发布边界、渐进反馈及实际时限需补齐 | U5/U9/U14;G9/G10/G15 | 435 |
| SR-B1 | 对每份上传资料输出相关性判定(相关 / 存疑 / 无关)及判定依据;存疑时必须挂起并向用户请求确认,确认前不入库 | 摄取/标签组件已有 | 统一来源发布、锚点、摘要、共享检索和会议三类抽取未闭合 | U5/U6;G9/G10 | 441 |
| SR-B2 | 对资料进行结构化解析,保留章节/页/表格级锚点,锚点在后续所有引用与追溯中可用 | 摄取/标签组件已有 | 统一来源发布、锚点、摘要、共享检索和会议三类抽取未闭合 | U5/U6;G9/G10 | 442 |
| SR-B3 | 将内容片段映射到研发阶段及"该阶段应从事的具体工作事项",映射结合项目当前所处阶段;支持一片段映射多阶段 | 摄取/标签组件已有 | 统一来源发布、锚点、摘要、共享检索和会议三类抽取未闭合 | U5/U6;G9/G10 | 443 |
| SR-B4 | 每个切片附带结构化标签(JSON):阶段、工作事项、主题、可行性维度(技术/市场/注册)、关联需求 ID、来源、上传时间、置信度;并生成一句话描述(description) | 摄取/标签组件已有 | 统一来源发布、锚点、摘要、共享检索和会议三类抽取未闭合 | U5/U6;G9/G10 | 444 |
| SR-B5 | 支持"两速入库":快速通道(打标签 + 摘要 + 入库)先行返回,慢速通道(细切片、嵌入向量化)后台补齐,状态对用户可见 | 摄取/标签组件已有 | 统一来源发布、锚点、摘要、共享检索和会议三类抽取未闭合 | U5/U6;G9/G10 | 445 |
| SR-B6 | 入库完成后向用户输出勾连总结:本文档涉及哪些内容、对应哪些阶段/工作事项/文档章节,以显式清单呈现 | 摄取/标签组件已有 | 统一来源发布、锚点、摘要、共享检索和会议三类抽取未闭合 | U5/U6;G9/G10 | 446 |
| SR-B7 | 会议纪要类资料按同一管道处理,并可抽取"结论 / 待办 / 待确认"三类条目 | 摄取/标签组件已有 | 统一来源发布、锚点、摘要、共享检索和会议三类抽取未闭合 | U5/U6;G9/G10 | 447 |
| SR-B8 | 笔记树内一致性检测:同一主题簇下多个切片的陈述不一致(如多人表述冲突)时,系统检测冲突 + 记录入追溯网(何时/何人/何节点/何操作)+ 通知触发冲突的用户 + 挂起待裁决;智能体不自行处理冲突,裁决… | 检测/裁决基础已有 | 冲突组、精确争议关闭与两层裁决未闭合 | U4/U6;G11 | 448 |
| SR-B9 | 并发更新冲突避免与及时提示:多人几乎同时更新同一树节点时,系统忠实记录全部操作入追溯网,冲突以候选子节点组并存挂起,智能体不自行处理冲突;裁决集中在编制人发起编制时经 HITL 完成(裁决两层,规则同… | 检测/裁决基础已有 | 冲突组、精确争议关闭与两层裁决未闭合 | U4/U6;G11 | 449 |
| SR-B10 | 任务快慢双速:对用户任务按快慢双速模式执行——快通道同步短链路即时反馈(如上传文档→相关性判断→相关给概要/不相关给理由+相似文档供选择),慢通道小队(subagent)后台深度执行(逐页解析、建节点… | 内存队列/台账已有 | 持久输入、取消恢复、幂等与通用双速未完成 | U9/U13;G15 | 450 |
| SR-B11 | 结论节点:结论作为笔记树的节点类型保存(结论入树);结论节点与切片同受 08 R1–R5 硬规则约束(append-only、软删除、结构事件日志、可重建);结论节点与其依据切片/来源的关联入追溯网。… | 结论提议/确认已有 | 总结水位更新、项目约束和原子采纳未闭合 | U6;G11 | 451 |
| SR-B12 | 总结触发:何时生成阶段总结交模型自主判断(不设固定阈值)——信息足够支撑结论时自动生成阶段性总结并询问用户是否纳入文档(HITL 确认);保留人工触发入口(用户明确指令触发);上传后先快速摘要反馈、后… | 结论提议/确认已有 | 总结水位更新、项目约束和原子采纳未闭合 | U6;G11 | 452 |
| SR-C1 | 内置可配置的研发体系文档树(阶段 → 文档 → 章节),每章有内容要求说明;文档树对应设计开发控制程序,商务对接与策划合并为同一阶段 | 目录69类、注册4模板 | 完整模板结构/格式/版本、生成与全文档族覆盖未完成 | U7/U8/U16;G7/G8 | 458 |
| SR-C2 | 体系文档模板集中注册、版本化管理;模板与阶段/文档节点的关联可配置,不与具体工作流实例硬绑定。模板策略:本期按当前已有模板设计与完善;标准模板待系统完成并通过测试后由用户补充(E-T3,后续目标 F-… | 目录69类、注册4模板 | 完整模板结构/格式/版本、生成与全文档族覆盖未完成 | U7/U8/U16;G7/G8 | 459 |
| SR-C3 | 文档生命周期状态机:草稿 → 评审中 → 已基线 →(变更中)→ 新版本基线;基线文档不可被直接修改 | 章节版本/Apply已有 | 持久提案、依据保留、原子采纳和整文快照待补齐 | U4/U8/U10;G6/G8/G17 | 460 |
| SR-C4 | 新切片填充文档章节前,与该章节现有内容比对,输出三分类结论:新增 / 更新 / 冲突;更新与冲突均需用户确认后生效 | 章节版本/Apply已有 | 持久提案、依据保留、原子采纳和整文快照待补齐 | U4/U8/U10;G6/G8/G17 | 461 |
| SR-C5 | 缺项分析仅在两种触发条件下输出:文档提交评审时、项目申请推进阶段时;上传节点禁止输出缺项提示 | 简单素材检查已有 | 内容/合规要求检查未接提交和阶段门禁 | U10/U11;G14 | 462 |
| SR-C6 | 每次文档内容变化生成版本记录,可查看任意两版本差异及差异来源切片 | 章节版本/Apply已有 | 持久提案、依据保留、原子采纳和整文快照待补齐 | U4/U8/U10;G6/G8/G17 | 463 |
| SR-C7 | 三权分立流程规则:编制/审核/批准三权异人(编制唯一、批准唯一且异于编制人、审核可多人但异于编制与批准人);编制发起唯一;审核/批准仅可批注与通过/驳回,不可修改正文或发起编写;提交审核即锁定;驳回回… | 章节三权已有 | 文档级职责、资源读取、总线身份和固定整文审签未闭合 | U3/U8;G6/G17 | 464 |
| SR-C8 | 批准后修改的处理:本期路径=撤回重审(D-12:撤回后修改并重新升版审批)+影响提示(沿追溯网列出受影响范围给人看,不走流程,见 SR-D3);松散管理取向,但审计链不断(08 R1/R2/R5 不动… | 章节三权已有 | 文档级职责、资源读取、总线身份和固定整文审签未闭合 | U3/U8;G6/G17 | 465 |
| SR-D1 | 建立并持久化双向追溯网络:资料切片 ↔ 需求条目 ↔ 文档章节 ↔ 法规条款 ↔ 测试用例;每条边记录类型、来源(人工/规则/模型候选)与置信度 | 台账/受控图读模型已有 | 业务生产者、版本边确认、分解规则与历史导出需补齐 | U11/U14;G12/G17 | 471 |
| SR-D2 | 需求条目化管理:用户需求与系统需求大表,字段含状态(草稿/已评审/已基线)、版本、关联文档与法规;支持增删改与批量导入 | 台账/受控图读模型已有 | 业务生产者、版本边确认、分解规则与历史导出需补齐 | U11/U14;G12/G17 | 472 |
| SR-D3 | 新内容入库触发变更检测:与已评审条目比对,不一致时向用户提示风险并给出"确认变更 / 维持原样 / 发起变更流程"选项。影响提示(V2.1 增补):批准后修改或引用内容变化时,系统沿追溯网列出受影响范… | 部分关系/变化方法已有 | 来源变化的影响对象和职责闭环待完成 | U6/U11;G11/G16 | 473 |
| SR-D4 | 变更流程闭环(变更申请 → 影响分析 → 评审 → 批准 → 执行 → 验证 → 关闭,全程留痕):整体后移,不作为本阶段系统实现目标——变更流程走公司内部管理流程,移入后续目标备案 F-02(《10… | 后移目标保留 | 公司流程权威及七步闭环待独立交付 | U15/F-02;G14 | 474 |
| SR-D5 | 任一需求可导出完整追溯链报告;无法匹配进体系的资料进入"待裁定"清单,提醒用户处理 | 台账/受控图读模型已有 | 业务生产者、版本边确认、分解规则与历史导出需补齐 | U11/U14;G12/G17 | 475 |
| SR-D6 | 追溯主体扩展:追溯网每个节点的信息来源可溯——来自哪个用户、哪个智能体、哪次网络搜索、哪个文档树模板、哪条知识树切片,保证所有信息细节的准确性与可追溯性 | 来源字段已有 | 模板/主体/来源版本须贯穿生成历史和导出 | U4/U8/U11;G8/G17 | 476 |
| SR-D7 | 完整合规追溯模型(权威定义见 08 第十六章):15 类受控节点(含危害/风险控制措施/设计确认/设计转换/变更)+11 类合规边(两端=节点 ID@版本,模型仅候选、人工确认转正)+四条链视图(13… | 台账/受控图读模型已有 | 业务生产者、版本边确认、分解规则与历史导出需补齐 | U11/U14;G12/G17 | 477 |
| SR-D8 | 需求分类与分解框架:用户需求与性能需求分到不同文档;先确认用户需求再分解系统需求;系统需求按六维度分类(功能/交互/安全/运输包装/维护/合规);智能体可从法规反推部分系统需求,但不完全依赖智能体;先… | 台账/受控图读模型已有 | 业务生产者、版本边确认、分解规则与历史导出需补齐 | U11/U14;G12/G17 | 481 |
| SR-D9 | 风险登记册追溯:危害(HAZ)与风险控制措施(RCM)入网;每个 RCM 同时登记为需求并必须被验证(verifies 边);每个危害至少被一项 RCM mitigate;措施-危害-验证三向可查(术… | 台账/受控图读模型已有 | 业务生产者、版本边确认、分解规则与历史导出需补齐 | U11/U14;G12/G17 | 478 |
| SR-D10 | 验证结果绑定被测版本:VR 记录对应用例与被测对象版本;被测版本≠当前基线版本时系统报「验证过期」并列入缺口;设计确认(VAL)必须追溯到用户需求 | 台账/受控图读模型已有 | 业务生产者、版本边确认、分解规则与历史导出需补齐 | U11/U14;G12/G17 | 479 |
| SR-D11 | SOUP 组件登记与追溯:软件组成项(含 SOUP)入网为架构项,其需求分配与验证沿用同一边模型 | 台账/受控图读模型已有 | 业务生产者、版本边确认、分解规则与历史导出需补齐 | U11/U14;G12/G17 | 480 |
| SR-E1 | 意图识别分层:规则层(仅限整句完全匹配的高频确定性短指令)→ 语义层 → LLM 层;规则层不得单独触发高风险操作 | 基座意图/卡片与RDM命令已有 | 工具可达、对话完备、固定确认对象与恢复需补齐 | U2/U8/U9/U10;G1/G8/G14/G15 | 487 |
| SR-E2 | 规则层命中必须通过上下文校验(上一轮存在对应的待确认事项)才可执行;无上下文时降级为普通对话 | 基座意图/卡片与RDM命令已有 | 工具可达、对话完备、固定确认对象与恢复需补齐 | U2/U8/U9/U10;G1/G8/G14/G15 | 488 |
| SR-E3 | 确认、变更、删除、阶段推进等操作一律通过标签卡/按钮交互完成,卡片明示操作对象与后果 | 基座意图/卡片与RDM命令已有 | 工具可达、对话完备、固定确认对象与恢复需补齐 | U2/U8/U9/U10;G1/G8/G14/G15 | 489 |
| SR-E4 | 支持意图分类(查询 / 编写 / 命令 / 讨论)与意图切换识别;编写类意图需命中目标文档并确认后执行 | 基座意图/卡片与RDM命令已有 | 工具可达、对话完备、固定确认对象与恢复需补齐 | U2/U8/U9/U10;G1/G8/G14/G15 | 490 |
| SR-E5 | 简单询问即时回答;复杂任务先给出执行计划与预计耗时,执行中提供进度反馈 | 基座意图/卡片与RDM命令已有 | 工具可达、对话完备、固定确认对象与恢复需补齐 | U2/U8/U9/U10;G1/G8/G14/G15 | 491 |
| SR-E6 | 对话完备路径:从立项到结项的全部状态变更操作(创建项目、提交评审、批准变更、阶段推进、导出、结项等)均可通过对话指令驱动,页面/按钮不是任何步骤的唯一入口;高风险操作的对话路径终点为对话流内联确认卡(… | 基座意图/卡片与RDM命令已有 | 工具可达、对话完备、固定确认对象与恢复需补齐 | U2/U8/U9/U10;G1/G8/G14/G15 | 492 |
| SR-F1 | 复杂任务由多角色"小队"在固定流程骨架约束下执行:骨架显式定义步骤序列与返回检查节点,角色在骨架内有限自主 | 运行与部分模型调用已有 | 受控业务配方、固定上下文、恢复和真实模型对照待完成 | U8/U9/U13;G8/G15/G18 | 498 |
| SR-F2 | 每个角色显式声明:职责、可用工具白名单、禁区;角色提示词作为受控资产版本化管理 | 运行与部分模型调用已有 | 受控业务配方、固定上下文、恢复和真实模型对照待完成 | U8/U9/U13;G8/G15/G18 | 499 |
| SR-F3 | 涉及法规的任务强制执行"法规知识库检索 + 网络检索"双通道,结果附引用来源;冲突时以权威来源为准并提示 | 知识检索/声明表已有 | 网络通道为模型输出URL,缺实际抓取独立证据 | U12;G13 | 500 |
| SR-F4 | 长任务后台异步执行,进度可查询、完成有通知;不得阻塞对话主线程 | 运行与部分模型调用已有 | 受控业务配方、固定上下文、恢复和真实模型对照待完成 | U8/U9/U13;G8/G15/G18 | 501 |
| SR-F5 | 执行任务时自动组装上下文:项目当前状态、相关记忆切片、目标文档模板、近期对话;上下文构成可解释 | 运行与部分模型调用已有 | 受控业务配方、固定上下文、恢复和真实模型对照待完成 | U8/U9/U13;G8/G15/G18 | 502 |
| SR-G1 | 飞书集成:智能助手可加入群聊,支持群内对话、收文件、推送反馈与通知。本期不做飞书功能(J-11),本条与 UR-20 一并后移 → F-01 | 后移目标保留 | 外部身份/租户/渠道/同步授权与适配待交付 | U15/F-01;外部依赖 | 508 |
| SR-G2 | 基于角色与项目阶段的权限控制(ABAC),阶段转换需满足准入准出条件并留痕。判定维度(角色 × 项目 × 阶段 × 动作)保留;权限主数据裁决(J-10,R2 关闭):本期系统内建最小权限系统(管理员… | cap/override与命令守卫已有 | 平台身份接入、专业角色、资源授权与全入口待补齐 | U2/U3;G3/G4 | 509 |
| SR-G3 | 全量审计日志:上传、入库、更新、变更、确认、生成等动作均可审计 | 事件/重放基础已有 | 原子批次、权限投影、完整历史与导出一致性待补齐 | U4/U11;G5/G17 | 510 |
| SR-G4 | 系统以自身研发项目为首个运行实例(自举元项目),自身需求与体系文档由本系统管理 | 自举测试资产已有 | 真实材料/模型/登录/浏览器全程验收未完成 | U14;G19 | 511 |
| SR-G5 | 结构追溯:笔记树、文档树、追溯网自身的结构变更全程留痕——节点与关系的增/删/改记录操作者、时间、理由与前后值;删除一律软删除(tombstone);追溯边有"候选 → 生效 → 废止"全生命周期;支… | 事件/重放基础已有 | 原子批次、权限投影、完整历史与导出一致性待补齐 | U4/U11;G5/G17 | 512 |
| SR-G6 | 系统管理员与系统级设置:全局唯一管理员拥有所有权限;仅管理员可进行系统级设置——Tavily API Key、大模型相关设置、Agent 参数(工具调用轮数/工具权限等)、系统级插件管理、用户/角色的… | cap/override与命令守卫已有 | 平台身份接入、专业角色、资源授权与全入口待补齐 | U2/U3;G3/G4 | 513 |
| SR-G7 | 角色管理:角色定义与默认权限集——能否创建项目/是否拥有某些文档的读取权限/能否推进项目到下一阶段/能否为项目添加成员/能否为成员配置项目内权限/能否为各模板文档分配三权负责人;角色可分配给用户(如项… | cap/override与命令守卫已有 | 平台身份接入、专业角色、资源授权与全入口待补齐 | U2/U3;G3/G4 | 514 |
| SR-G8 | 权限覆盖优先级——上限内覆盖(J-05,原存疑关闭):管理员设定角色默认权限与权限范围上限(最底层约束);项目负责人(创建者)在该范围内调整项目成员权限;项目内配置可覆盖角色默认配置,但不得突破管理员… | cap/override与命令守卫已有 | 平台身份接入、专业角色、资源授权与全入口待补齐 | U2/U3;G3/G4 | 515 |
| SR-G9 | 项目负责人权限:项目创建者即项目负责人,拥有项目内全部权限——添加项目成员、编辑项目成员权限、为各模板文档分配编制/审核/批准负责人 | 域项目唯一、成员、绑定已有 | 成员目录、可信当前项目、双向绑定权和界面未闭合 | U2/U3;G1/G2 | 516 |
| SR-G10 | 项目唯一性与成员自动可见:同名项目全系统唯一;用户被添加为项目成员后,其界面自动出现该项目,并可直接开始项目工作(新建对话等) | 域项目唯一、成员、绑定已有 | 成员目录、可信当前项目、双向绑定权和界面未闭合 | U2/U3;G1/G2 | 517 |
| SR-G11 | 对话隐私:用户之间的对话互相不可见,仅本人可见本人与智能体的对话;智能体会话/中间过程默认互不可见(J-06,原存疑关闭),协作全部经两树一网项目共享层;用户分享分层(整个项目/会话/部分会话)的精细… | 会话owner隔离已有 | 私有原件/草稿/文档ACL与授权发布/共享上下文待贯通 | U3/U5/U9;G4/G5/G10 | 518 |
| SR-G12 | 文档分享:上传者可将文档分享给指定成员/部分成员/全部项目成员;被分享者只读、不可编辑;被分享文档进入接收者上下文,支撑其后续对话中查看并基于这些文档对话 | 会话owner隔离已有 | 私有原件/草稿/文档ACL与授权发布/共享上下文待贯通 | U3/U5/U9;G4/G5/G10 | 519 |
| SR-G13 | 上下文时间权重:本期最小实现——检索与注入排序新内容优先;替换/冲突场景走 J-02 人裁决(SR-B8/SR-B9)。可配置时间权重衰减模型(权重数值、配置粒度)移入后续目标 F-04(J-07,优… | 排序效果未验收 | 新内容优先不代替裁决,可配置衰减后续实现 | U5/U15/F-04;G10 | 520 |
| SR-G14 | 飞书项目对接适配(接口层四项功能:产品创建/账户绑定扫码登录/URL 协同连接/知识库上传生成链接;飞书角色权限映射读取):本期不做飞书功能,整条移入后续目标备案 F-01(J-11);保留设计预留说… | 后移目标保留 | 外部身份/租户/渠道/同步授权与适配待交付 | U15/F-01;外部依赖 | 521 |
| SR-G15 | 虚拟人账号(企业账号下为智能体创建固定账号持有文档/文件夹访问权限;授权范围、审批与定期审计流程待明确,《10》Q-04):随飞书对接整体后移,移入后续目标备案 F-01(J-11) | 后移目标保留 | 外部身份/租户/渠道/同步授权与适配待交付 | U15/F-01;外部依赖 | 522 |
| SR-G16 | 代码执行安全:多用户共享部署在隔离执行档就位前,以启动级硬关闭禁用执行原语(run_shell/run_python/register_artifact 及内核执行配置),用户设置不得覆盖(基座已交付… | 多人执行硬关闭已有 | 最终隔离执行及受控开放待实现验收 | U13;G18 | 523 |
| SR-N1 | 性能:上传首轮反馈 < 60 秒;单文档完整入库(后台)< 10 分钟;追溯链查询 < 3 秒 | 部分运行机制已有 | 固定样本/数据/并发规模的性能待实测 | U14;G18/G19 | 529 |
| SR-N2 | 可维护性:模块边界清晰、依赖单向;任一核心功能(如文档入库)可在 5 分钟内定位到对应代码模块;支撑每周代码审查机制 | 模块边界已有 | 公开契约、文档代码可定位性与维护机制待复核 | U1/U14;G19 | 530 |
| SR-N3 | 可解释性:每个入库、更新、变更动作给出依据(来源切片、命中标签、比对结果) | 部分依据回执已有 | 标签、来源、差异与失败可解释性需全链路验证 | U4/U5/U8;G10/G17 | 531 |
| SR-N4 | 部署与数据:支持本地化部署;法规知识库本地存储;项目数据按项目隔离 | 领域分片与本地存储已有 | 团队数据权威、私域隔离、安装和恢复未完整验收 | U2/U3/U13;G5/G18 | 532 |
| SR-N5 | 模型无关性:大模型通过抽象层接入,可替换(当前为 MiniMax,不绑定) | 模型抽象已有 | 模型替换后的真实业务与降级对照待验证 | U9/U13;G8/G18 | 533 |
## 用户需求(34 条)
每条用户需求沿原 UR→SR 关系追溯,其所有适用系统需求通过后才可关闭。
| ID | 用户目标 | 原关联SR | 实施去向 | 当前判定 | 原文行 |
|---|---|---|---|---|---|
| UR-01 | 自由上传 | SR-A1, SR-A2, SR-A3 | U5/U9/U14 | 局部组件已有;端到端未验收 | 541 |
| UR-02 | 相关性把关 | SR-B1 | U5/U6 | 局部组件已有;端到端未验收 | 542 |
| UR-03 | 自动归纳入库 | SR-A5, SR-B2, SR-B3, SR-B4, SR-B6 | U5/U6/U9/U14 | 局部组件已有;端到端未验收 | 543 |
| UR-04 | 及时反馈 | SR-A4, SR-B5, SR-E5, SR-F4 | U2/U5/U6/U8/U9/U10/U13/U14 | 局部组件已有;端到端未验收 | 544 |
| UR-05 | 渐进式清晰 | SR-C1, SR-C2, SR-C3, SR-C4, SR-C6 | U4/U7/U8/U10/U16 | 局部组件已有;端到端未验收 | 545 |
| UR-06 | 缺项提示时机 | SR-C5 | U10/U11 | 局部组件已有;端到端未验收 | 546 |
| UR-07 | 冲突与变更 | SR-B8, SR-C3, SR-C4, SR-D3, SR-D4(→ F-02) | U4/U6/U8/U10/U11/U15 | 局部组件已有;端到端未验收 | 547 |
| UR-08 | 严格可追溯 | SR-B2, SR-D1, SR-D5, SR-G3, SR-G5, SR-C6, SR-D7(合规追溯链,V2.2) | U4/U5/U6/U8/U10/U11/U14 | 局部组件已有;端到端未验收 | 548 |
| UR-09 | 需求条目化 | SR-D2, SR-D3, SR-D8(需求分类与分解框架,V2.2) | U6/U11/U14 | 局部组件已有;端到端未验收 | 549 |
| UR-10 | 模糊澄清 | SR-B6, SR-B8, SR-E5(提问交互) | U2/U4/U5/U6/U8/U9/U10 | 局部组件已有;端到端未验收 | 550 |
| UR-11 | 一键生成文档 | SR-E4, SR-F1, SR-F2, SR-F5 | U2/U8/U9/U10/U13 | 局部组件已有;端到端未验收 | 551 |
| UR-12 | 主动提问 | SR-E5, SR-B6 | U2/U5/U6/U8/U9/U10 | 局部组件已有;端到端未验收 | 552 |
| UR-13 | 外部查询入库 | SR-F1, SR-F3, SR-B4 | U5/U6/U8/U9/U12/U13 | 局部组件已有;端到端未验收 | 553 |
| UR-14 | 法规双通道 | SR-F3 | U12 | 局部组件已有;端到端未验收 | 554 |
| UR-15 | 商务策划贯通 | SR-C1, SR-C2 | U7/U8/U16 | 局部组件已有;端到端未验收 | 555 |
| UR-16 | 显式确认 | SR-E1, SR-E2, SR-E3, SR-E6 | U2/U8/U9/U10 | 局部组件已有;端到端未验收 | 556 |
| UR-17 | 阶段门禁权限 | SR-G2, SR-G3 | U2/U3/U4/U11 | 局部组件已有;端到端未验收 | 557 |
| UR-18 | 会议纳入记忆 | SR-B7 | U5/U6 | 局部组件已有;端到端未验收 | 558 |
| UR-19 | 自举 | SR-G4 | U14 | 局部组件已有;端到端未验收 | 559 |
| UR-20 | 协作平台接入 | SR-A3, SR-G1(本期不做飞书功能,一并后移 → F-01,J-11) | U15 | 后移目标保留 | 560 |
| UR-21 | 系统角色与权限管理 | SR-G2, SR-G6, SR-G7, SR-G8 | U2/U3 | 局部组件已有;端到端未验收 | 561 |
| UR-22 | 项目成员与协作 | SR-G9, SR-G10 | U2/U3 | 局部组件已有;端到端未验收 | 562 |
| UR-23 | 文档分享与上下文注入 | SR-G11, SR-G12, SR-G13(降 P2,衰减模型 → F-04) | U3/U5/U9/U15 | 局部组件已有;端到端未验收 | 563 |
| UR-24 | 三权分立文档流程 | SR-C7, SR-C8 | U3/U8 | 局部组件已有;端到端未验收 | 564 |
| UR-25 | 版本全量保留与来源追溯 | SR-C6, SR-D6, SR-G5 | U4/U8/U10/U11 | 局部组件已有;端到端未验收 | 565 |
| UR-26 | 并发更新冲突避免与提示 | SR-B8, SR-B9(J-02 落地+U0 D4 两层裁决) | U4/U6 | 局部组件已有;端到端未验收 | 566 |
| UR-27 | 快慢处理与任务拆解展示 | SR-B10(J-03 已裁决落地) | U9/U13 | 局部组件已有;端到端未验收 | 567 |
| UR-28 | 简易看板 | SR-C3, SR-D3(编制状态与变更检测为看板数据源;看板与卡片流界面统一 → F-06) | U4/U6/U8/U10/U11 | 局部组件已有;端到端未验收 | 568 |
| UR-29 | 难度分级与降级使用 | SR-F2(智能体能力边界按项目难度配置;评估表与降级规则细化 → F-08) | U8/U9/U13/U14/U15 | 局部组件已有;端到端未验收 | 569 |
| UR-30 | 对抗验证机制 | SR-F1(流程骨架中增设独立验证节点;对抗机制形态待设计,属《10》Q-13,维持开放) | U8/U9/U13/U14/U15 | 局部组件已有;端到端未验收 | 570 |
| UR-31 | 飞书项目对接 | SR-G14, SR-G15(本行整体→ F-01) | U15 | 后移目标保留 | 571 |
| UR-32 | 代码管理工具集成 | SR-D1(追溯网扩展需求—版本—缺陷关联边;本行整体→ F-05) | U15 | 后移目标保留 | 572 |
| UR-33 | 法规合规追溯 | SR-D7, SR-D9, SR-D10, SR-D11, SR-D1 | U11/U14 | 局部组件已有;端到端未验收 | 573 |
| UR-34 | 结论沉淀与阶段总结 | SR-B11, SR-B12 | U6 | 局部组件已有;端到端未验收 | 574 |
## 后续目标(10 项)
| ID | 原目标 | 当前处理 | 交付去向 | 原文行 |
|---|---|---|---|---|
| F-01 | 飞书对接全套(渠道 EXT-3、扫码登录、权限映射、虚拟人账号、文档同步/版本关联) | 保留最终目标,前置与批准见主记录 | U15/F-01 | 637 |
| F-02 | 变更流程引擎(七步闭环、变更单、完整影响分析) | 保留最终目标,前置与批准见主记录 | U15/F-02 | 638 |
| F-03 | 用户分享分层(整个项目/会话/部分会话)与智能体可见性的精细设计 | 私有默认已确认,细分分享需明确授权 | U15/F-03 | 639 |
| F-04 | 可配置上下文时间权重衰减模型 | 保留最终目标,前置与批准见主记录 | U15/F-04 | 640 |
| F-05 | 代码管理工具集成(GitLab token 只读拉取、需求-版本-缺陷关联) | 保留最终目标,前置与批准见主记录 | U15/F-05 | 641 |
| F-06 | 看板与卡片流的界面统一(随原型 V2.3) | 并入对话与看板同源收敛 | U9/U14 | 642 |
| F-07 | 会议遗留问题组(Q-01/02/03/07/10/13/14 等,《12》问题 8 组);其中 Q-02 经晚会部分裁决(C-03,见 §7.1) | 逐项裁决台账,不当作已确定的一组功能 | U15/F-07 | 643 |
| F-08 | 难度分级评估表与降级机制的落地细化(UR-29 保留 P1,实施细节备案) | 保留最终目标,前置与批准见主记录 | U15/F-08 | 644 |
| F-09 | 追溯网可视化(先功能后展示,暂缓) | 较新展示方案已批准,早期暂缓已调整 | U11/U14 | 645 |
| F-10 | 标准模板替换:本期按当前已有模板设计与完善;待系统完成并通过测试后,由用户补充标准模板(取代晚会 T2「今晚下载官方模板替换」,不执行) | 依赖用户提供标准模板;旧模板先全量实现 | U16+U15/F-10 | 646 |
验收结果槽:本轮未生成业务通过记录;后续由实施任务/CI/独立重放补入命令、对象 SHA、运行链接与输出。历史任务卡另行映射,原始收据不改。
File diff suppressed because one or more lines are too long
@@ -0,0 +1,85 @@
# RDM 文档模板资产盘点(2026-10-11)
关联方案:[对话文档生成方案 r1](../proposals/2026-10-11-rdm-template-dialog-generation.md)。本清单为 SELF 静态资产盘点,不表示线上实际文档数或模板已验收。
源:旧 Agent-System `ed4e17c81974c6d2b126fedb1ca4ed1e2c6c207f` 的 `templates/docs/*.md`;RDM `0081628a10ec48a36537c6eced11a57439c986fa` 的 `internal/domain/data/labels_seed.json`、`docs/templates/registry.yaml`。
旧路径规则为 `templates/docs/<类型键>.md`。下列 H2 数只用于估算拆解工作,不等于最终业务章节数;管理性章节需重新归位。
69 份 Markdown:bd 7、rd 60、pm 1、tm 1;另有 `templates/xlsx/cdo_quote.xlsx` 一份,不计入 69。
RDM 登记 69 种 docTypes,但只注册 4 个 v1 模板,覆盖 3 个类型;66 个类型未绑定模板。
“已绑定”仍不表示正确默认、格式兑现或完整生成可用。当前按首项匹配会混用周报/纪要,详情见方案 G3。
所有历史模板迁移/发布/业务验收均待独立评审,本清单不修改发布状态。
| 类型键 | 字典名称 | 阶段 | 历史 H2 数 | RDM 注册绑定 | 原件 SHA256 前16位 |
|---|---|---|---|---|---|
| bd_cdo_quote | CDO 报价单 | BD | 6 | 未绑定 | 4d0cb0b4e4dafecb |
| bd_feasibility_dev | 设计开发可行性评估报告 | BD | 7 | 未绑定 | dc565be65647250c |
| bd_feasibility_reg | 注册路径可行性评估报告 | BD | 9 | 未绑定 | 16add9b2558dee31 |
| bd_intake | 用户初始需求收集表 | BD | 8 | 未绑定 | 427bafe56062f616 |
| bd_prelim_design | 系统初步设计方案 | BD | 9 | 未绑定 | 4001acdbb5bafa5e |
| bd_research | 调研报告(竞品/技术/专利/市场/对比/法规) | BD | 11 | review-minutes@v1、competitive-analysis@v1 | 0b64388a16f8c7de |
| bd_user_requirements | 用户需求表 | BD | 7 | 未绑定 | 547dda49107a4d26 |
| pm_system_reqs | 系统需求规格书(SR) | 03 | 10 | 未绑定 | 3717c5ff34272088 |
| rd_adverse_events | 同类产品不良事件信息 | 03 | 11 | 未绑定 | d2cfbfed223d9dd7 |
| rd_animal_study | 动物试验方案 | 12 | 11 | 未绑定 | f070c80fb84b413d |
| rd_biocompatibility | 生物学检测方案 | 08 | 11 | 未绑定 | bcb25be8e5d8745d |
| rd_cleaning | 清洁消毒验证方案 | 08 | 11 | 未绑定 | 42ec75116e247d88 |
| rd_clinical | 临床试验报告 | 12 | 11 | 未绑定 | 9df8321b7488535d |
| rd_design_input_list | 设计输入清单 | 03 | 11 | 未绑定 | 51c0d2334a8f0475 |
| rd_design_input_spec | 设计输入规格书 | 03 | 12 | 未绑定 | a629d1b3e3dc6e9a |
| rd_design_output_list | 设计输出清单 | 06 | 10 | 未绑定 | 5ffbce9be6d92ccd |
| rd_design_plan | 设计开发计划任务书 | 01 | 11 | review-minutes@v1 | 589dec73a01b1c75 |
| rd_design_validation_report | 设计确认报告 | 13 | 11 | 未绑定 | 9ff1744ebdae179f |
| rd_design_vv | 设计验证方案 | 08 | 11 | 未绑定 | 5ec16dcfbbf55132 |
| rd_dmr_list | DMR文件清单 | 10 | 10 | 未绑定 | 437bda4f714d756b |
| rd_drawings_3d | 2D图纸和3D模型(附件清单) | 06 | 10 | 未绑定 | 96b771a7912a6393 |
| rd_ee_bom | 电子电气BOM(附件清单) | 06 | 10 | 未绑定 | 08052bb640704115 |
| rd_electrical_sys | 系统电气设计图(附件清单) | 06 | 10 | 未绑定 | df4f8aaeedbf4f5c |
| rd_emc_safety | EMC及安规摸底报告(附件清单) | 08 | 11 | 未绑定 | 9257a9a02d6ac939 |
| rd_fqc | 成品检验规范 | 06 | 11 | 未绑定 | 4891c93ff9ce889b |
| rd_hazard_analysis | 安全性问题清单及可能危险分析表 | 03 | 11 | 未绑定 | 3a8ed0db49b35553 |
| rd_ifu | 产品使用说明书 | 06 | 11 | 未绑定 | d76bc2e2a531632a |
| rd_incoming_iqc | 原材料进货检验规范 | 06 | 11 | 未绑定 | 14c21bd69cd9a756 |
| rd_input_phase_review | 设计开发评审记录(阶段3和4) | 05 | 12 | 未绑定 | 5982bdf27dab55f0 |
| rd_ipqc | 生产过程检验规范 | 06 | 11 | 未绑定 | 14bf3912f4dc6c4f |
| rd_lifetime | 产品使用期限研究方案 | 08 | 11 | 未绑定 | f7232dd9750c2369 |
| rd_output_review | 设计开发评审记录(阶段6) | 07 | 12 | 未绑定 | 87029ef45d4ac5b2 |
| rd_pack_ship | 包装运输方案 | 10 | 11 | 未绑定 | a368bd102a0535f3 |
| rd_packaging | 包装图纸和设计要求 | 06 | 11 | 未绑定 | e12a32ded3da14f1 |
| rd_pcba | PCBA原理图及Layout(附件清单) | 06 | 10 | 未绑定 | 4b91abe3191c36df |
| rd_planning_review | 设计和开发策划评审记录 | 02 | 12 | 未绑定 | 3bac17e3ef284010 |
| rd_process_flow | 工艺流程图及作业指导 | 06 | 11 | 未绑定 | c4892f9947ec3cce |
| rd_product_bom | 产品BOM(附件清单) | 06 | 10 | 未绑定 | ac57d604f77ac754 |
| rd_proposal | 项目建议书 | 01 | 11 | weekly-report@v1、project-proposal@v1 | 50ed802a9249229e |
| rd_prototype_photos | 样机照片(附件清单) | 08 | 10 | 未绑定 | be4ff90930f06842 |
| rd_purchase_spec | 采购技术规范 | 06 | 11 | 未绑定 | 72ee43993c30f01a |
| rd_qualified_suppliers | 合格供方名录 | 08 | 11 | 未绑定 | 603a9ab37998a21a |
| rd_regs_stds | 法规和标准清单 | 03 | 11 | 未绑定 | 24b98c273fb04dd8 |
| rd_req_review | 需求评审记录 | 04 | 12 | 未绑定 | d42e18d5e02b7d5c |
| rd_risk_plan | 风险管理计划 | 03 | 11 | 未绑定 | 608822eb42aa83bd |
| rd_risk_report | 风险管理报告 | 06 | 11 | 未绑定 | de4ed137e0c1b76f |
| rd_risk_report_t | 风险管理报告(转换阶段) | 10 | 11 | 未绑定 | 24c61db854d6a9de |
| rd_risk_report_v | 风险管理报告(验证阶段) | 08 | 11 | 未绑定 | 762eb5d127698215 |
| rd_risk_report_val | 风险管理报告(确认阶段) | 12 | 11 | 未绑定 | b3200d74cd74913d |
| rd_shelf_life | 货架寿命方案 | 08 | 11 | 未绑定 | 9e51627645d7c561 |
| rd_sw_arch | 软件概要设计方案 | 06 | 11 | 未绑定 | e829e164cf1c825b |
| rd_sw_config | 软件配置及维护计划 | 03 | 11 | 未绑定 | 8510491f6480b58b |
| rd_sw_plan | 软件开发计划 | 03 | 11 | 未绑定 | 79ddc781bca8bb9d |
| rd_sw_quality | 软件质量测试报告 | 12 | 11 | 未绑定 | ef1e7dbbed13abf8 |
| rd_sw_release | 软件发布清单 | 08 | 10 | 未绑定 | ac4e522903fa6872 |
| rd_sw_reqs | 软件需求规格书 | 03 | 11 | 未绑定 | eb9a1d75efe1bda1 |
| rd_sw_sys_test | 软件系统测试报告 | 08 | 11 | 未绑定 | c86e15580ee24d16 |
| rd_sw_ui | 软件UI设计文档 | 06 | 11 | 未绑定 | 9c041da7d6db8d88 |
| rd_sw_unit_test | 软件单元测试报告 | 08 | 11 | 未绑定 | 368b5939da695d0e |
| rd_system_design | 系统设计方案 | 03 | 11 | 未绑定 | adf0b6bf32fe10af |
| rd_system_reqs | 系统需求规格书(SR) | 03 | 15 | 未绑定 | 1d0aa50c5e8f06d9 |
| rd_tech_req | 产品技术要求 | 06 | 11 | 未绑定 | 03c39e46300e6719 |
| rd_transfer_review | 设计开发评审记录(转换阶段) | 11 | 12 | 未绑定 | 4be3b0770a08d6d4 |
| rd_use_error | 使用错误评估报告 | 12 | 11 | 未绑定 | 67c98d3f26b91c13 |
| rd_user_needs | 用户需求规格书(UN) | 03 | 11 | 未绑定 | cdc46e46a93bca81 |
| rd_user_test | 用户测试报告 | 12 | 11 | 未绑定 | 26ad7d32eb59b386 |
| rd_validation_plan | 设计确认方案 | 12 | 11 | 未绑定 | a0b53fc9a74df218 |
| rd_verification_review | 设计开发评审记录(验证阶段) | 09 | 12 | 未绑定 | ec68f27212649baf |
| tm_system_verification | 系统验证方案及计划(SVP) | 04 | 8 | 未绑定 | 7b66de5bd1f6b0f3 |
完整哈希应在正式迁移台账保留;本表短哈希用于阅读定位,不作为独立完整性或身份凭据。
@@ -0,0 +1,19 @@
# 模板对话生成方案 r1 文档检查记录
对象:[方案 r1](../proposals/2026-10-11-rdm-template-dialog-generation.md)。日期:2026-10-11。
性质:SELF,三组本地模型审阅覆盖七个视角,不是人工评审、业务验收或独立 GATE/REPLAY;未执行跨供应商模型审阅。
检查范围:方案一致性、可行性、产品范围、使用流程、权限和关键失效场景。业务测试 NOT_RUN。
| 视角 | 原始发现 | 处理 |
|---|---|---|
| 一致性 | 无重要矛盾 | 无修改 |
| 可行性 | 同文档旧章节职责/签署不同,不能自动合成文档批准 | KTD8/U4 补迁移与旧活动审签处置;首个整文版重新审签 |
| 产品 | 无实质发现 | 保留首批两模板建议与69类全量登记、分批验收 |
| 交互 | 新文档未分配职责或当前用户非编制人时缺对话恢复路径 | User Flow/U5 补等待分配、负责人分配、最小信息转交与指定编制人接续 |
| 范围 | 无实质发现 | 保留既有两树一网/存储分工 |
| 权限 | 模板发布、退役和默认绑定的管理权未明确 | KTD1/U2 限定首期经批准仓库发布;编制权不继承模板管理权 |
| 失效场景 | 部分采纳混合新旧章节后未重验整文依赖 | KTD6/U4 补对实际目标组合的依赖、术语、指标检查及版本/hash 绑定 |
四条原始发现均为 P2、置信度 75。主审核对依据:旧 review.go 以 sectionID 分配职责/保存审批,首期 templates.go 只读受控注册表,方案已有严格编制权与部分采纳行为;四项补充用于使既有目标成立,未扩大业务交付范围。
四项已在方案中修订并补验收场景;未代签用户保留的路线、首批顺序、文档级审批选择和实施授权。
本记录只证明文档检查及修订,后续真实业务验证仍按方案执行。
File diff suppressed because one or more lines are too long
@@ -0,0 +1,11 @@
# 经验:库级 Manager 测试通过 ≠ 跨实例 HTTP 路径正确——进程级黑盒才能抓住短路
- 状态:validated(三条缺陷均在 U7 双进程验收中复现、修复并入 CI 回归)
- 触发条件/检索词:多实例 / 跨实例 HITL / cancel / 命令总线 / Manager 层单测 / HTTP 黑盒 / 假成功 200 / conversation_id 空 / 落卡短路命令 / U5 vs U7
- 根因与来源:协作存储 U5 用真库直接调 `runmgr.Manager` 覆盖争抢/围栏/命令语义,**绕过 HTTP handler**。U7 `tests/integration/multi-instance/` 起两个真实 `serve` 进程共享 PG 后抓出三条生产路径缺陷(均已有 backend 回归):① HITL resolve 在非执行实例先把卡标 resolved,命令 fallback 的 `!card.Resolved` 判定被跳过,执行者永远等不到答案;② 跨实例 cancel 命令 `conversation_id` 传空串,消费侧执行权 JOIN 永不命中;③ `CancelRun` 在非执行实例无句柄时返回 nil,HTTP 层 200「假成功」吞掉命令路径。库级绿与进程级红可以同时为真。
- 下次应做的检查:凡涉及「任意 API 实例发起、执行实例消费」的能力(取消、HITL、命令、租约接管),验收矩阵须含 **至少一条双进程 HTTP/SSE 黑盒**(或等价:经真实 handler + 命令总线落库再消费),不能只用 Manager/Store 直调冒充跨实例已过。写回归时优先钉住「非执行实例的 HTTP 状态码与执行者观测到的最终状态」成对断言。
- 验证方法与防护:已落实——Dev `make test-multi-instance`(CI `test-pg` 必跑)覆盖跨实例读/SSE/409/HITL/取消/崩溃恢复/重启不变量;三条缺陷各有 backend 回归测试。建议保持:新增跨实例命令路径时先加进程级场景再声称 U5/U7 完成。
- 适用与不适用:适用多实例共享权威存储、命令经 DB/总线投递的架构;不适用纯单实例本地句柄路径,也不替代库级语义单测(二者互补)。
- 尚缺证据/防护:双主机(跨机网络)C3 与正式容量窗口不在本教训范围内;本条只固定「测试层级」缺口。
- 复核人、日期、版本:weichen,2026-10-12;依据 Dev 放行检查单 A6/C1 与 `tests/integration/multi-instance/README.md`「已实测发现并修复的缺陷」
- 替代/退役条件:若跨实例命令路径全部强制经同一 HTTP→命令总线集成测试门禁,且历史三条回归仍绿,可将本条降为参考;不得在无门禁时退役。
@@ -0,0 +1,64 @@
# 服务重启与全量数据恢复方案 r1 文档审阅
日期:2026-10-12(Asia/Shanghai)。对象:[主方案](../proposals/2026-10-12-service-restart-data-recovery.md)。
方法:ce-doc-review,non-interactive;六个独立上下文的原生子代理加作者源码复核。以下为审阅意见及处置摘要;来源为SELF,不是人工批准、业务验收、REPLAY或GATE。没有外部跨供应商模型评审;未跑业务测试或故障试验。
| 角色 | 原始发现数 | 处置 |
|---|---|---|
| coherence | 1 | 修正灾难恢复的分档RPO验收 |
| feasibility | 1 | 与design同一问题合并,修正动作与整run的结算边界 |
| security-lens | 1 | 加入新目标恢复前的旧写路径隔离门禁 |
| design-lens | 1 | 与feasibility同一问题合并,复用原状态/卡片展示 |
| scope-guardian | 0 | 无需扩大或缩小当前目标范围 |
| adversarial | 1 | 收紧非幂等动作的确定未执行证据 |
共5条原始发现、4项独立修正;全部已纳入候选r1,不涉及用户需求的取舍变化。人工评审仍未发生。
## 审阅意见与处置依据
1. **分档验收不一致。** 初稿目标允许灾难档RPO≤5分钟,U7却无条件要求“零已确认数据遗漏”。后果是按目标建设的备份也无法按U7签收。按已声明的故障分档,R3/U7/故障矩阵明确RPO=0档零遗漏,灾难档恢复点差距在批准范围内、点内完整并报告点后缺失。没有暗改用户的零丢失合同,所有量化指标仍待人工批准。
2. **一个外部动作完成不等于整任务完成。** 初稿状态图直接 `hold→completed`,可能跳过必要后续步骤。作者复核Native `runtime/loop.go:385–402`确认工具结果持久化后还继续模型回合;因此与design/feasibility意见一致。现改为记录operation receipt后回recovering,继续剩余步骤,只有全部必要步骤及业务结果完成才结算整run。
3. **独立恢复库不能围栏旧库的执行者。** 初稿对新目标恢复已有数据、权限和组合对账,但未明确切生产前如何阻断原权威复活。旧、新库各有有效epoch时,单库租约不能避免双执行。现加入默认隔离验证模式、旧执行者/已发请求写路径隔离、新恢复权威代次、专用资源权限边界及无法证明时hold;同时对账恢复点后的外部效果。验收增加旧实例复活和恢复点后已执行动作。
4. **暂未查到结果不足以安全重试。** 初稿“查询确认未执行”可能被理解为目标当前无结果;旧请求稍后完成则重复副作用。现要求确定未执行的终态及旧执行者/已发请求不会再生效的证明;普通查询空结果、发送取消或本地退出均不充分。补外部请求延迟完成而恢复者不得发第二次请求的故障场景。
作者另核实并修正一处事实表述:Native已有tool intent/result与safe replay机制,Backend生产Session已接线;本案复用该基础,将其与run/epoch/hold关联、指定统一恢复裁决,而不是重建第二套彼此独立的恢复政策。证据命令原始输出由Dev任务卡make evidence保存。
## 最终对象与检查
主方案SHA256:`cfc9b768a4596a268810e20101cddc2a6040e24a640e6e34dbda17b838cd45ed`。
固定源码对象:Dev `5e57029b439e5690f28dc6002f9784f0b08920eb`,Backend `eb12f102f23d8d026c3458be7ea8b2fef07ada93`;任务分支中的后续提交只记录启动/同步元数据,业务源码未改变。
任务卡保留precheck、task-sync、源码调查、Native接线核对以及最终文档检查的工具收据。检查范围为差异空白、相对链接、需求/增量/决策ID、证据完整性;通过仅证明对应文档检查,不证明服务或数据恢复。
草稿、入口和子仓改动尚未提交为固定组合;`check-evidence.py`对含未提交非任务卡改动的收据报告`unverified`。原始输出及方案内容摘要已保存,这些记录仅作为本地调查辅助,不能用于正式合入/运行验收。后续正式审核应先固定候选组合、同步并由有权审阅者重放对应检查,不能靠反复执行或更换来源标签消除此限制。
实施前仍需人工确认故障档/RPO/RTO、目标实例与独占管理权、数据归属清单和在途任务分工。按policy/delivery.md,此次审阅与候选修正不能代替任何阶段的人工批准。
## 第二轮:外部源码复核(2026-10-11)
复核者:ZCode 独立上下文;对象:r1(SHA256 `cfc9b768…`)。方法:对主案第2节差距表、基线与自审记录引用的源码断言逐项独立重验;未运行服务、测试或故障试验。来源SELF。
核验结果(抽查全部命中):五个基线SHA与任务工作区一致且Dev基线为HEAD祖先;`svc.sh:1373` resolve_db_config统一解析;runmgr `ReconcileInterrupted`(≈2046)统一封印中断;`SetRecoveryHold`与`RenewExecution`均仅有定义、无生产调用;`claimCommand` pending→consumed后执行(kill窗口无重领);app.go HTTP停机超时(现状5秒)即返回并跳过`mgr.Shutdown`事件清冲;`ListSurfaceEventsPending`默认limit=100;notice启动载入内存队列、投递后独立DELETE非事务;native `loop.go:385–402`工具结果持久化后继续模型回合。
修订处置(r1→r2,需求与指标未变):
1. U3补停机预算来源变更:现状5秒须显式替换为批准预算并实测校准。
2. U1验收补“更换二进制路径/程序版本、不同cwd调用svc后身份一致”场景(对齐R2)。
3. U4补“新增公开状态前先交付Core→Backend→Frontend→下游最小状态映射表”。
4. 第9节svc-autorecover协调改为明确的人工二选一归属决策项(实施载体 vs 放弃合并,两权威不得并存)。
流程修订:r1先按被审对象原样提交固定(documents `54fc24e`、Dev `39f719f`),r2为后续修订提交;恢复会话按门禁完成precheck(READY,R0 `555fb2162f`)并task-sync后实施修订。r2 SHA256:`9cfda2520b913e6966c68fb3f66fb7bc8382a8f7a2b69cb364122216dcdb72cd`。
遗留(人工事项):svc-autorecover归属二选一、首批实施范围、故障档/RPO/RTO与停机预算批准;全部指标维持待批准未实测。
### 追加(2026-10-11 task-sync 后):漂移检查与 svc-autorecover 实况
- task-sync 将 backend 指针由 eb12f102 前移至 25fbea85(collab-storage U5-outbox #157 合入)。漂移检查(工具收据见任务卡证据表)确认 r2 引用的差距在新指针全部成立:RenewExecution 与 SetRecoveryHold 仍无生产调用、claimCommand 仍为认领即 consumed、HTTP 停机超时仍跳过事件清冲、Surface 待投影默认仍 100 条。该合入新增 `EnqueueCommandInTx`(与业务提交同事务投递命令)与 `AppendEvents` 内同事务 `pg_notify`,属 KTD10 可直接复用的原语,不改变差距结论。
- svc-autorecover 实况修正归属决策的信息基础:其工作区并非空壳,含未提交的 autostart 期望态 + `svc.sh recover`(postgres 先于应用)+ systemd 用户级 watchdog(每分钟拉回)+ `.start.lock` 生命周期锁 + pidfile/cmdline 校验(svc.sh +317 行、docs/svc.md +61 行、Makefile +10 行)及回归测试 tests/test_svc_recover.py;但任务卡零登记(无 precheck 收据、无卡内记录、无提交),且 2026-10-11 观察其自测 10 例中 5 例未过(failures=2、errors=3)——定位是“有价值的半成品”,不是可合入实现。选项 (a)(作 U2 实施载体)价值因此上调,但需先补登记(precheck/任务卡/提交)、修复未过用例,并与本案 manifest 合同(KTD1/KTD2)对齐;选项 (b) 则须显式处置这批在途工作而非视同空白。裁定仍属人工。
## 批准记录(2026-10-12)
用户(weichen)批准方案 r2(拆解/评估/需求表/方案设计/实施计划五阶段一并),并裁定 svc-autorecover 归属选项 (a):作 U2 实施载体,先补登记、修复未过用例、对齐 KTD1/KTD2。实施按第 7 节 U1–U7 与批次 A/B/C 推进;量化指标(RPO/RTO/停机预算)在对应增量验收前固定。来源:用户对话(本记录为 SELF 转述);阶段评审明细见 Dev 任务卡。方案 r2 正文未因批准改动(SHA256 9cfda252… 不变),批准状态以本记录、任务卡与 INDEX 为准。
### 落地追踪(2026-10-12 补记)
裁定后核实:svc-autorecover 在途工作已由另一会话完成并合入 main——PR #396(autostart 期望态 + recover + watchdog)、#400(任务卡回填)、#401(KillMode=process 修复)、#402(闭卡归档)。归档卡验证摘要:tests/test_svc_recover.py 10/10、make test-governance 146/146(SELF)、CI GATE 绿(PR HEAD e0b49d1,test+test-pg,一次抖动重跑);如实登记的残留:postgres 实例真实 recover 仅代码审查未实测、agent SQLite 数据目录尚无自动备份。裁定 (a) 的“补登记、修复未过用例”已被事实完成;其对齐要求(KTD1/KTD2 manifest 合同、服务组依赖与单一监管者)转为 U2 余量增量。本记录早前“373 行未登记半成品”的表述为当时(2026-10-11)观察,已被后续事件取代。
@@ -0,0 +1,55 @@
# U7 容量测量窗口报告(SELF,2026-10-12)
来源标注:**SELF**(本机隔离栈执行;非 CI GATE、非独立 REPLAY)。不得单独据此放行第二实例写流量或双主机部署。
## 1. 环境与被测对象
| 项 | 值 |
|---|---|
| 主机 | Linux,32 逻辑 CPU,122 GiB RAM(约 98 GiB available),磁盘 1.9T/余 1.1T |
| k6 | v2.3.0(Homebrew 固定位 `/home/linuxbrew/.linuxbrew/bin/k6`) |
| 拓扑 | 双 `serve` 进程共享隔离 PG(`u7load`),`--tier team --auth on --mock --disable-exec-tools` |
| Dev HEAD(任务分支测量时) | `b6f78b503ee2e3d6f71663d5330a18adbe743239`(ladder/s60 证据点;s2h 同工作区续跑) |
| Backend gitlink | `5e8ada727c358438f8ff9f94eabb697e99fe28dc` |
| Documents gitlink(测量时) | `8d0810bd35f4934e0ad37fb96d7bab6d7a732473` |
| 入口 | Dev `tests/load/collaboration/run_load.sh --seed contract --instances 2` |
## 2. 数据集(B5 contract)
每段窗口独立灌库(编排脚本每次 `DROP/CREATE u7load_app`,无法跨次复用):
| profile | results 目录 | messages | knowledge | seed 耗时 |
|---|---|---|---|---|
| ladder | `tests/load/collaboration/results/20261012-064730/` | 1 000 000 | 100 000 | ≈12.0 s |
| sustained60m | `…/20261012-070510/` | 1 000 000 | 100 000 | ≈14.5 s |
| sustained2h | `…/20261012-081025/` | 1 000 000 | 100 000 | ≈11.2 s |
拓扑:10 seed 用户 × 5 项目 × 10 会话;约 10% knowledge `owner=''`(共享基座);**未**写入 `knowledge_vectors`。
## 3. 负载结果(阈值:读 P95≤300ms、P99≤1s、失败率≤0.1%;SSE P95≤1s;dup_seq=0)
| profile | 读 P95 | 读 P99 | fail_rate | checks | expected_contention | SSE A p95 | SSE B p95 | dup_seq | orphan runs |
|---|---|---|---|---|---|---|---|---|---|
| ladder(10→30→100,~12m) | 15.5 ms | 44.3 ms | 0 | 134922/0 | 549 | 17.5 ms | 33.0 ms | 0 | 0 |
| sustained60m(~60m @30 VU) | 3.9 ms | 6.5 ms | 0 | 504399/0 | 69 | 5.7 ms | 4.4 ms | 0 | 0 |
| sustained2h(~2h @30 VU) | 6.2 ms | 13.5 ms | 0 | 1008771/0 | 477 | 3.9 ms | 4.2 ms | 0 | 0 |
命令(每段):
```bash
tests/load/collaboration/run_load.sh --seed contract --profile <ladder|sustained60m|sustained2h> --instances 2
```
原始产物(gitignore,留在任务 worktree `results/<ts>/`):`k6-summary.json`、`sse-probe-a.json` / `-b.json`、`seed-manifest.json`、`invariants.txt`。任务卡经 `make evidence` 写入阈值复核脚本输出(SELF)。
## 4. 结论与边界
- **容量合同(B2/B3/B5/B4/C2)本机 SELF 全过**:阈值与不变量满足建议合同;数字绑定上表 SHA 与 results 目录。
- **仍不放行第二实例写**:检查单要求 CI GATE 或独立 REPLAY 才用于放行;本报告仅为 SELF。C3 双主机、C4/C5 运维演练、B6 pgbench 未做。
- **不承诺跨机/生产容量**:mock 模型、同机双进程、NVMe/本机 PG;换硬件或真实模型须重测。
## 5. 建议下一步
1. 独立审阅者 REPLAY 最小集(至少 `ladder --seed contract --instances 2`)后,方可讨论双进程写放行。
2. 用户指定第二主机后跑 C3。
3. 排期 C4/C5 运维演练;可选 B6 pgbench 只读基线。
@@ -0,0 +1,100 @@
# U7 运维演练与数据库基线报告(SELF,2026-10-12)
来源标注:**SELF**(本机隔离栈执行;非 CI GATE、非独立 REPLAY)。用户 2026-10-12 决定不做容量重放。不得据此放行第二实例写流量。
## 1. 被测对象
| 项 | 值 |
|---|---|
| Backend gitlink | `8e509775d39d1455b69be44803037faa7af844b4` |
| B6 Dev HEAD | `b2e129ab3f3bdf222f16040fcd0513872d0e2a3c` |
| C4 Dev HEAD | `308f33665eb2dfaf9ae661e87df8898c3c2ecb3a` |
| C5 Dev HEAD | `792574692609d9bfdf113e2dc5af6f43c9a176dd` |
| 主机 | 32 逻辑 CPU,122 GiB RAM;演练开始时 load average 见各 `host.txt` |
| 入口 | `tests/load/collaboration/run_pgbench.sh`;`tests/ops/run_fault_drill.sh`;`tests/ops/run_backup_drill.sh` |
原始输出在测量 worktree 的 `results/`(gitignore),不入库。任务卡 evidence 为 SELF。
## 2. B6 pgbench
结果目录 `tests/load/collaboration/results/pgbench-20261012-131948`。隔离实例 `u7bench`,scale 100,每档 60 秒,`-M prepared`。`max_connections=100`,`superuser_reserved_connections=3`,100 客户端封顶为 95。六档失败事务均为 0。
| 模式 | 客户端 | tps | P50 | P95 | P99 |
|---|---|---|---|---|---|
| select-only | 10 | 535646 | 0.018 ms | 0.024 ms | 0.030 ms |
| TPC-B 类 | 10 | 18798 | 0.339 ms | 0.673 ms | 5.560 ms |
| select-only | 30 | 952115 | 0.026 ms | 0.057 ms | 0.078 ms |
| TPC-B 类 | 30 | 52224 | 0.493 ms | 1.002 ms | 1.777 ms |
| select-only | 95 | 904708 | 0.087 ms | 0.180 ms | 0.417 ms |
| TPC-B 类 | 95 | 50607 | 1.041 ms | 3.361 ms | 18.106 ms |
主机不空闲。这是数据库参考基线,没有业务阈值,也不替代容量窗口。
## 3. C4 断连
结果目录 `tests/ops/results/fault-20261012-142734`。PG 18991,应用 18990/18992,Redis 18993。
| 判据 | pg-stop | pg-kill |
|---|---|---|
| F1 有界失败、进程仍在 | 过 | 过 |
| F2 不回落 SQLite,新进程拒绝就绪 | 过 | 过 |
| F3 恢复后两侧各 5 次写入 | 过,RTO 不到 1 秒,未重启应用 | 同左 |
| F4 失败 requestId 重放恰好一条 | 过 | 过 |
| F5 dup_seq=0、seq 无洞、无非终态 run | 过 | 过 |
Redis 限额 20 次/分钟,两实例各突发 40 个读:
| 判据 | 结果 |
|---|---|
| G1 共享限额 | 放行 20、429 为 60、其他错误 0 |
| G2 断连 | 放行 40、429 为 40、其他错误 0;已确认写入仍在 |
| G3 只拉起 Redis | 放行回到 20;`rl:*` 均有过期时间 |
| G4 | 发现:日志看不到降级计数 |
| G5 | 发现:Redis 不通时新进程拒绝启动 |
`runtime.redisAddr` 没有调用者可写的产品入口。演练用 SQL 写入默认 owner `local` 的 `user` 设置,并保留 mock。
## 4. C5 备份与恢复
结果目录 `tests/ops/results/backup-20261012-153441`。源 PG 18994,恢复目标 18997。合同数据量 seed 约 12 秒。
| 判据 | 结果 |
|---|---|
| K1 备份有效 | 过。`failed_count=0`,`archived_count=80`,`pg_verifybackup` 与 `pg_restore --list` 退出码 0 |
| K2 RPO≤5 分钟 | 过。64 秒 |
| K3 RTO≤60 分钟 | 过。4 秒。恢复后登录、列项目、读会话均为 200 |
| K4 工件与权限 | **FAIL**。五次上传都没有拿到工件编号 |
| K5 不变量 | 过。dup_seq=0,seq 无洞;恢复后消息/事件/知识/run 计数与故障前一致(消息 1 000 120);非终态 run 为 0 |
| K6 逻辑恢复 | 过。`pg_restore` 退出码 0,约 4 秒;计数等于 dump 时快照(消息 1 000 000,知识 100 000) |
| K7 权限与泄密 | 过。备份目录 700、文件 600;结果文本里没有连接串。静态加密与凭据演练记 N/A。归档和数据在同一块盘,没有模拟存储全毁 |
恢复后的计数与故障前一致,说明已提交的标记都在。64 秒是最后一条成功标记的确认时间到故障时刻的间隔;窗口末尾有的写入因为会话仍被 mock run 占用而没有落库。
K4 的原因在源应用日志:未设置 `BLOBSTORE_S3_ENDPOINT` 时,`NewS3FromEnv` 返回空的 `*S3`。这个空指针被放进 `blobstore.Store` 接口后不再等于 nil,`finishOpen` 不会回落本地目录,上传在 `blobstore.(*S3).Put` 空指针 panic。产品代码未改。因此工件 sha256 和跨用户拒绝没有测成。代码里本地后端的 `content_path` 是绝对路径;这次没有成功上传,所以没有用恢复后的下载来核验。
同日另一次恢复(`backup-20261012-150713`)在数据目录复制之后起不来,因为 socket 路径超过 107 字节。正式这次把 socket 放到 `/tmp/u7bk-18997`。
## 5. 放行(2026-10-12 当时)
B6、C4 为 SELF 通过。C5 的库恢复为 SELF 通过,工件恢复失败。第二实例写流量仍不放行。
当时还没做、该任务不启动的三项:
- 独立 REPLAY,或把 C4/C5 的快速档接进 CI 成为 GATE(需要平台准入)。
- C3 双主机。
- 上传在未配置对象存储时 panic,需要单独的产品修复后才能重测 K4。
## 6. 2026-10-13 K4 重测
上传 panic 已在 store 边界修复:带类型的空对象存储(未设置 `BLOBSTORE_S3_ENDPOINT` 时的 `(*S3)(nil)`)视为未配置,回落本地工件目录。已构造的对象存储保持不变。Backend 提交 `46073d30`,Dev 被测头 `a83588dd`,backend gitlink 同为 `46073d30`。
重跑入口仍是 `tests/ops/run_backup_drill.sh`。结果目录 `tests/ops/results/backup-20261013-013354`(SELF)。原始结果另存于仓外 `/home/weichen/projects/u7-k4-retest-preserved-20261013`。
| 判据 | 结果 |
|---|---|
| K1–K3、K5–K7 | 过。RPO 65 秒,RTO 3 秒。`pg_verifybackup` 与 `pg_restore --list` 退出码 0,逻辑恢复约 5 秒,恢复后计数与故障前一致 |
| K4 工件与权限 | **过**。5 个工件 `checked=5`、`missing=0`、`mismatch=0`。跨用户访问项目和工件均为 404 |
`content_path` 仍是绝对路径,快照继续还原到原目录。静态加密、凭据演练和整盘损坏仍是 N/A。
第二实例写流量仍不放行。剩下的门槛是独立 REPLAY 或经平台准入后的 C4/C5 CI 快速档,以及 C3 双主机。
+589
View File
@@ -0,0 +1,589 @@
{
"source": "SELF",
"dev_sha": "add097d06137c4912a4ed9279e98ca353e4e4cf1",
"rdm_sha": "6fcb256205c2384abed35d3b6ab96ca7216e9297",
"rdm_frontend_sha": "eb2d6d32f9323094d568bc9d80b4e5ed4f0af25b",
"rdm_frontend_preview_sha256": "0f53735a5b58d4c7c545ceb56ce02d0305af47f379f16d92295323a68dd5f13d",
"summary": {
"count": 44,
"formats": {
"docx": 30,
"doc": 14
},
"unique_content": 41,
"phases": {
"0. 商务阶段": 1,
"1. 策划阶段": 3,
"2. 设计输入阶段": 15,
"3. 设计输出阶段": 9,
"4. 设计验证阶段": 8,
"5. 设计转换阶段": 3,
"6. 设计确认阶段": 5
}
},
"assets": [
{
"source": ".templates/DHF 文件模板/0. 商务阶段/0.1初始要求申请表.docx",
"format": "docx",
"bytes": 17137,
"sha256": "eb9d287014911a18c5589a0b9e7b7f63ad535178cf7cf29a3a269dcf46118391",
"tables": 2,
"gridSpan": 0,
"vMerge": 0,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/1. 策划阶段/1.1、731QCP29-F01 项目建议书 02.docx",
"format": "docx",
"bytes": 25114,
"sha256": "3f54f060d9c528e3fd4e7b7c606f352fbabe9488a25ad95a7341fa7901518b29",
"tables": 2,
"gridSpan": 4,
"vMerge": 10,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/1. 策划阶段/1.2、731QCP29-F02 设计开发计划任务书 02.docx",
"format": "docx",
"bytes": 36248,
"sha256": "d152b0b4d2bb1aa30c60aaec19e331a05a552d7d119f5a6f4cc4177f163159fb",
"tables": 7,
"gridSpan": 6,
"vMerge": 106,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/1. 策划阶段/1.3、731QCP29-F07 设计开发(策划)评审记录 02.docx",
"format": "docx",
"bytes": 26043,
"sha256": "d6f3cca9c3c1f7ed1ea60322c5435f8410d6cf7ca2096b04a367fc8255ee1330",
"tables": 5,
"gridSpan": 35,
"vMerge": 0,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/2. 设计输入阶段/2.10.1、731QCP29-F13 配置管理计划 02.docx",
"format": "docx",
"bytes": 58902,
"sha256": "94e8e7fc868d76c62199fdeb30ea0aab7db3c58a36ef94aef15d629f4930b11a",
"tables": 5,
"gridSpan": 4,
"vMerge": 10,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/2. 设计输入阶段/2.10.2、软件维护计划模板.docx",
"format": "docx",
"bytes": 166962,
"sha256": "76fc4d4fddecc04e533aceb930aab9b82f4956c6bf5fb3d04f19150003c7932e",
"tables": 2,
"gridSpan": 4,
"vMerge": 10,
"headers_footers": [
"word/footer1.xml",
"word/footer2.xml",
"word/footer3.xml",
"word/footer4.xml",
"word/footer5.xml",
"word/footer6.xml",
"word/header1.xml",
"word/header2.xml",
"word/header3.xml",
"word/header4.xml",
"word/header5.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/2. 设计输入阶段/2.11.1、731QCP29-F16设计输入规格书模版.docx",
"format": "docx",
"bytes": 68678,
"sha256": "3fef2ed7d0aa5e0ac8c01b92571b0ce9dbe3a8191a06d7a79d799fb62fe5e613",
"tables": 17,
"gridSpan": 4,
"vMerge": 10,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/2. 设计输入阶段/2.12、731QCP29-F05 设计开发输入清单 02.docx",
"format": "docx",
"bytes": 20681,
"sha256": "de990de6bf13e4c692a9664719f508cf2d34765b14ddd77fbb58879c99dee6da",
"tables": 2,
"gridSpan": 4,
"vMerge": 0,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/2. 设计输入阶段/2.13、RDDHF0213-xxxx产品系统设计方案.doc",
"format": "doc",
"bytes": 419499,
"sha256": "8168ea37c7ca5f32f5d57527d0c8ff5c2d583998167e30ed713937c95e9e82d4",
"header_hex": "d0cf11e0a1b11ae1"
},
{
"source": ".templates/DHF 文件模板/2. 设计输入阶段/2.14、731QCP29-F07 设计输入评审记录.docx",
"format": "docx",
"bytes": 28675,
"sha256": "a3677cb06a3946769e501f906669f57c4cd21769109ad5e27697d76320fa8686",
"tables": 5,
"gridSpan": 35,
"vMerge": 0,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/2. 设计输入阶段/2.1、731QCP29-F14 用户需求模板.doc",
"format": "doc",
"bytes": 115712,
"sha256": "2f9c6795f81188797018ef7e2ba4c7e693db0f3fabaa2eb5a9478fb2e2b1a6ac",
"header_hex": "d0cf11e0a1b11ae1"
},
{
"source": ".templates/DHF 文件模板/2. 设计输入阶段/2.2、RDDHF0202-xxxx 医疗器械法规和标准清单.docx",
"format": "docx",
"bytes": 29384,
"sha256": "2b36daeedc8c54a7975ece49102d279584bb80a5ff262912db2941edf009feec",
"tables": 3,
"gridSpan": 5,
"vMerge": 10,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/2. 设计输入阶段/2.3、RDDHF0203-xxxx 同类产品不良事件信息.docx",
"format": "docx",
"bytes": 29958,
"sha256": "f7cd69b08c1ec1bea04ec8a30aaa54f6d8bed90a6e9544c3b9264341ac299edc",
"tables": 3,
"gridSpan": 4,
"vMerge": 10,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml",
"word/header2.xml",
"word/header3.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/2. 设计输入阶段/2.4、731QCP29-F15 系统需求规格书模板.doc",
"format": "doc",
"bytes": 119296,
"sha256": "b58d1b900c951f8c20b5f301cb75e072a91c98ab3d71b172128b51dc84c8bff3",
"header_hex": "d0cf11e0a1b11ae1"
},
{
"source": ".templates/DHF 文件模板/2. 设计输入阶段/2.5、731QCP29-F07 需求评审记录表.docx",
"format": "docx",
"bytes": 27823,
"sha256": "102ed2b6418b51b383de97a735b8a183d025af9da139152d92715e44ba860b1b",
"tables": 6,
"gridSpan": 42,
"vMerge": 0,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/2. 设计输入阶段/2.6、731QCP29-F03 风险管理计划 02.docx",
"format": "docx",
"bytes": 31626,
"sha256": "0c1484d6b29595077c9b60e08a69c73d008216744e7df59f83c0e7054f1e51c9",
"tables": 7,
"gridSpan": 8,
"vMerge": 13,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/2. 设计输入阶段/2.7.3、731QCP29-F04 风险管理报告 02.docx",
"format": "docx",
"bytes": 29910,
"sha256": "d4f18eb817dae8b655715c6832b591299d0e5c7c1196e777cf9e48e79b4f3544",
"tables": 6,
"gridSpan": 8,
"vMerge": 13,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/2. 设计输入阶段/2.8、731QCP29-Fxx 软件开发计划-模板.doc",
"format": "doc",
"bytes": 300544,
"sha256": "2dee0e085113adc4868546b2469eab89c076b6c8613417b3897e975a2adb4e29",
"header_hex": "d0cf11e0a1b11ae1"
},
{
"source": ".templates/DHF 文件模板/2. 设计输入阶段/2.9、软件需求规格书模板.docx",
"format": "docx",
"bytes": 48903,
"sha256": "aa12be2b8158439c91b77df5a90fd2d71aa658186e37332c54a6766b572b4a30",
"tables": 10,
"gridSpan": 4,
"vMerge": 10,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/3. 设计输出阶段/3.12、原材料进货检验规范-模版.docx",
"format": "docx",
"bytes": 995696,
"sha256": "34608b520ebff384cdb613818271a04d3e7fc9a71da693cdd51550ab0b38bf0c",
"tables": 18,
"gridSpan": 124,
"vMerge": 10,
"headers_footers": [
"word/footer1.xml",
"word/footer2.xml",
"word/header1.xml",
"word/header2.xml"
],
"linked_images": [
{
"part": "word/document.xml",
"link": "rId12",
"embed": "rId11"
}
]
},
{
"source": ".templates/DHF 文件模板/3. 设计输出阶段/3.15、产品技术要求.doc",
"format": "doc",
"bytes": 16896,
"sha256": "b787295c6c66089cb0895a1f9ebd77058091bb85355910f84d014613470b2512",
"header_hex": "d0cf11e0a1b11ae1"
},
{
"source": ".templates/DHF 文件模板/3. 设计输出阶段/3.17、731QCP29-F06 设计开发输出清单 02.docx",
"format": "docx",
"bytes": 22792,
"sha256": "f53a2f271bf2782ab12cba1f26a141d5560e7e7aa905a0a74b46b10bbf43e84b",
"tables": 1,
"gridSpan": 4,
"vMerge": 0,
"headers_footers": [
"word/header1.xml",
"word/footer1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/3. 设计输出阶段/3.18、731QCP29-F07 设计输出评审记录.docx",
"format": "docx",
"bytes": 28214,
"sha256": "e37ab2828e647ffee84068d8c4ce6520c70b3a3849d37d946cb7bd52bd28efe9",
"tables": 5,
"gridSpan": 35,
"vMerge": 0,
"headers_footers": [
"word/header1.xml",
"word/footer1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/3. 设计输出阶段/3.6.2、软件详细设计模板.docx",
"format": "docx",
"bytes": 51735,
"sha256": "e1089b1de6d2c06e5468adfa7f28b9cfaa13b3382f299e9e0af204543d221c20",
"tables": 30,
"gridSpan": 0,
"vMerge": 0,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/3. 设计输出阶段/3.8、RDDHF0213-xxx采购技术说明-结构&硬件.doc",
"format": "doc",
"bytes": 7791188,
"sha256": "77fd422be6f37632052d47a05490312a8e36098eceb6d529653f59dde8fe51ef",
"header_hex": "d0cf11e0a1b11ae1"
},
{
"source": ".templates/DHF 文件模板/3. 设计输出阶段/3.9.1、731QCP29-Fxx 工艺流程图模板.doc",
"format": "doc",
"bytes": 199173,
"sha256": "1d702e1cdbdca52fe7957b01d13f15f77d447d78498a78e332d4646e27ee014c",
"header_hex": "d0cf11e0a1b11ae1"
},
{
"source": ".templates/DHF 文件模板/3. 设计输出阶段/3.9.2、RDSOP00xx-00xx xxx作业指导书.docx",
"format": "docx",
"bytes": 6312572,
"sha256": "e2d5e596ee1fa24ddd4166f41575167ed054451beb6fdbd1d1bccd15a709ef48",
"tables": 7,
"gridSpan": 1,
"vMerge": 0,
"headers_footers": [
"word/footer1.xml",
"word/footer2.xml",
"word/footer3.xml",
"word/header1.xml",
"word/header2.xml",
"word/header3.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/3. 设计输出阶段/731QCP33-F01 软件可追溯性分析报告 02.docx",
"format": "docx",
"bytes": 24006,
"sha256": "23d6402dc8511a1ed7815082cc00822f9d62e3b74509bd75302987bfdf538f8a",
"tables": 3,
"gridSpan": 4,
"vMerge": 10,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/4. 设计验证阶段/24.产品有效期验证.doc",
"format": "doc",
"bytes": 144292,
"sha256": "425e993090eb84c5a88fbc6fe2d664d788d4879a7e173bd8a235b6aa0589311d",
"header_hex": "d0cf11e0a1b11ae1"
},
{
"source": ".templates/DHF 文件模板/4. 设计验证阶段/41.软件单元测试用例-模板.doc",
"format": "doc",
"bytes": 57249,
"sha256": "02f41e0770380332105851d620fbcfc470dbef93d2e7fa55c4b1dad441a7fcc0",
"header_hex": "d0cf11e0a1b11ae1"
},
{
"source": ".templates/DHF 文件模板/4. 设计验证阶段/42.软件集成测试用例-模板.doc",
"format": "doc",
"bytes": 60369,
"sha256": "1a373f9bec235d6771fceec15341c858412737298fad696dd68cb9bf262a5dec",
"header_hex": "d0cf11e0a1b11ae1"
},
{
"source": ".templates/DHF 文件模板/4. 设计验证阶段/43.软件系统测试用例-模板.doc",
"format": "doc",
"bytes": 60915,
"sha256": "22b211453d734668bd8b6a5948a5612ec93bde41838ee0fe0535551124566062",
"header_hex": "d0cf11e0a1b11ae1"
},
{
"source": ".templates/DHF 文件模板/4. 设计验证阶段/49. 软件配置管理报告-模板.doc",
"format": "doc",
"bytes": 63121,
"sha256": "243993a6ab53b475139afbeef04c9be0d593956bb2ae4e90f77c22b2e38b0063",
"header_hex": "d0cf11e0a1b11ae1"
},
{
"source": ".templates/DHF 文件模板/4. 设计验证阶段/731QCP29-F07 设计验证评审记录.docx",
"format": "docx",
"bytes": 28214,
"sha256": "e37ab2828e647ffee84068d8c4ce6520c70b3a3849d37d946cb7bd52bd28efe9",
"tables": 5,
"gridSpan": 35,
"vMerge": 0,
"headers_footers": [
"word/header1.xml",
"word/footer1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/4. 设计验证阶段/731QCP29-F08 设计开发验证记录 02.docx",
"format": "docx",
"bytes": 24111,
"sha256": "c5b84546e647259f25b9445358ff93ecf61e047075d83a87b1f0f928df32f69a",
"tables": 1,
"gridSpan": 14,
"vMerge": 0,
"headers_footers": [
"word/header1.xml",
"word/footer1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/4. 设计验证阶段/756QCP26-F02 验证确认报告 V03-.docx",
"format": "docx",
"bytes": 42712,
"sha256": "f5bbe7816e79a62e7bbbf297014be98a63b9ec306999a09723bef1a78d60b3fd",
"tables": 12,
"gridSpan": 2,
"vMerge": 0,
"headers_footers": [
"word/footer1.xml",
"word/footer2.xml",
"word/header1.xml",
"word/header2.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/5. 设计转换阶段/731QCP29-F04 风险管理报告 02.docx",
"format": "docx",
"bytes": 31234,
"sha256": "8a17e5b4cff1d4a7d51a8ee5d4cc6b5e4da9c91f3a501cbe91bc3409d3f7b0b9",
"tables": 6,
"gridSpan": 8,
"vMerge": 13,
"headers_footers": [
"word/header1.xml",
"word/footer1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/5. 设计转换阶段/731QCP29-F07 设计转移评审记录.docx",
"format": "docx",
"bytes": 28214,
"sha256": "e37ab2828e647ffee84068d8c4ce6520c70b3a3849d37d946cb7bd52bd28efe9",
"tables": 5,
"gridSpan": 35,
"vMerge": 0,
"headers_footers": [
"word/header1.xml",
"word/footer1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/5. 设计转换阶段/731QCP29-F09+试产总结报告+03-20250730.docx",
"format": "docx",
"bytes": 31901,
"sha256": "7600083fa8675a95f2365267801cb3d712bcb0d0534b49371bf12c2abda9a66b",
"tables": 4,
"gridSpan": 23,
"vMerge": 30,
"headers_footers": [
"word/footer1.xml",
"word/header1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/6. 设计确认阶段/53. 使用错误评估报告-模板zlx.doc",
"format": "doc",
"bytes": 136224,
"sha256": "75cafe0c4c26edb2d9430f3c9839c5217106acdb5f205f12dcf3d728a67f5ed8",
"header_hex": "d0cf11e0a1b11ae1"
},
{
"source": ".templates/DHF 文件模板/6. 设计确认阶段/731QCP29-F07 设计确认评审记录.docx",
"format": "docx",
"bytes": 28214,
"sha256": "e37ab2828e647ffee84068d8c4ce6520c70b3a3849d37d946cb7bd52bd28efe9",
"tables": 5,
"gridSpan": 35,
"vMerge": 0,
"headers_footers": [
"word/header1.xml",
"word/footer1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/6. 设计确认阶段/731QCP29-F11 设计开发确认记录 02.docx",
"format": "docx",
"bytes": 23026,
"sha256": "d01ff3c568416c81d7729fe35c4fe0820513dcbf74e2e33c3a6bf7db1453d609",
"tables": 1,
"gridSpan": 9,
"vMerge": 0,
"headers_footers": [
"word/header1.xml",
"word/footer1.xml"
],
"linked_images": []
},
{
"source": ".templates/DHF 文件模板/6. 设计确认阶段/756QCP20-F01 计算机软件确认报告 02.doc",
"format": "doc",
"bytes": 114176,
"sha256": "45e57b363abf14a19e6ef26af23f33b42095e68c1516f1af13f7b73f1f21050d",
"header_hex": "d0cf11e0a1b11ae1"
},
{
"source": ".templates/DHF 文件模板/6. 设计确认阶段/756QCP26-F01 验证确认方案 V03-.docx",
"format": "docx",
"bytes": 44029,
"sha256": "525b2c40d74e09318188216b1cbc3d62ca410cdb55008fa7996ed9bdbc36e3f0",
"tables": 14,
"gridSpan": 33,
"vMerge": 0,
"headers_footers": [
"word/footer1.xml",
"word/footer2.xml",
"word/header1.xml",
"word/header2.xml"
],
"linked_images": []
}
],
"rdm_source_sha256": {
"internal/rdmapp/templates.go": "3defc58f0e20dc15d8cee9d846da0d998ca3caf659af2cca2603b6d8f1741419",
"internal/rdmapp/templates_gen.go": "8d4a68a31b69ab1834e66acc583211614d8177d23e1844bd4aa61c98ff57547c",
"internal/rdmapp/templates_embed.go": "26c940d94639b283fec2add2f2312931321d0bc0cd5e6ebb95c3c3b1c4f188c1",
"internal/rdmapp/compose.go": "b2da219785cbf44ee53d1408e56628f44619c8dd93fb4415f2daa9013b591349",
"internal/rdmapp/structure.go": "116a25bf5e76f940f54ba67b87b855c5953b944a4ca4f088953766a35563fa86",
"internal/rdmapp/parse.go": "9db5e576496b60f54b6be1c6601df14b776075edefd1f712bc78d22d86bb4dc3",
"internal/rdmapp/draftproposal.go": "85c638e9ac5b8c9c81974af6eb33b8e86053d3997ab718169a64cd987d1376a6",
"internal/rdmapp/docsubmission.go": "e8070350ad794b46d226cba3acb9ff78bfed58113f766cf845d194bb6f3d686f",
"internal/rdmapp/docx.go": "7ed609f658cc31ad216464fcea5dbdaa4e25cb56b3de205bc464e9848964db3d",
"internal/rdmapp/export_artifact.go": "07a1a4fe537674e1413e38425a36af3c02e29c9e041f6478f96c45769328b2ce",
"internal/rdmapp/doc_export_visibility.go": "e4fd051ffb643ae3f002b797ee4175b8b3b2a698012c411021492cab372e7580",
"plugins/rdm/plugin.go": "25382894886fef7e9015d254fc416766d9cd7ce355671c088d2c34b0870a2eb8",
"scripts/build-product.sh": "70041237df111f064257a8ba95e463de1db6c734d71a77f0f20efa3fa812de97",
"scripts/pack-release.sh": "ebeb2b6728fb964aa9983c07e022b52e11be7d2efb76c5bbb6941ce13547d360"
},
"business_test": "NOT_RUN",
"doc_conversion": "NOT_RUN"
}
@@ -0,0 +1,210 @@
{
"source": "SELF",
"observed_at_utc": "2026-10-14T14:13:54.776253+00:00",
"repo": "weichen/Agent-System-Dev",
"main_sha": "e1bc2602e18a89e4d75a4bf6cd80bc7f9b4d2164",
"queue_issue": 518,
"issue_content_version": 34,
"issue_updated_at": "2026-10-14T13:41:21Z",
"active_window": "- 当前窗口:无(mq-dev-20261014-537-01 因独立 Stage 8 Review 的三项 Important 整改与安全设计重审,于 2026-10-14T06:06:23.872984+00:00 主动释放)。旧固定 head=6a2f7cd3e610a263b6348efe9084e386dc88f30c / base=4f84c2e1630cd0311643529fae1c3a99f1dd5d64 的 GATE run3076/3077、阶段7人工批准均只对应旧对象;PR #537 已按用户撤销指示关闭,迁移专用远端与本地分支已删除;该任务不再排队。旧 GATE 和阶段结论仅为历史记录。",
"branch_protection": {
"enable_push": false,
"enable_force_push": false,
"block_on_outdated_branch": true,
"enable_status_check": true,
"status_check_contexts": [
"ci / test (pull_request)",
"ci / test-pg (pull_request)",
"ci / svc-realcombo (pull_request)"
],
"required_approvals": 0,
"block_admin_merge_override": true
},
"post_trial_prs": [
{
"number": 539,
"merged": true,
"merge_sha": "d40579ed7fe3bbca68d3c6fcd1bce6707688d59e",
"merged_at": "2026-10-14T06:40:54Z",
"head_sha": "3b0e100fba149dbb29066c2ca3d2a74bbe1d4443",
"issue_body_ref": false,
"issue_comment_refs": [
{
"id": 6017,
"created_at": "2026-10-14T06:42:12Z",
"head": "<!-- facts-539-merge-record-20261014T0700Z -->"
}
]
},
{
"number": 540,
"merged": true,
"merge_sha": "11aa76a3bc1c5047791f9a2de154e451634b6567",
"merged_at": "2026-10-14T08:08:07Z",
"head_sha": "889f64f88167a5314ebfa42a41f9c7a57f91b404",
"issue_body_ref": false,
"issue_comment_refs": [
{
"id": 6025,
"created_at": "2026-10-14T07:02:56Z",
"head": "<!-- dhf-u1-stage7-wip-20261014-01a137f8 -->"
},
{
"id": 6059,
"created_at": "2026-10-14T08:04:24Z",
"head": "<!-- mq-dev-20261014-dhf-u1-01-claim -->"
},
{
"id": 6066,
"created_at": "2026-10-14T08:09:12Z",
"head": "<!-- mq-dev-20261014-dhf-u1-01-release -->"
},
{
"id": 6097,
"created_at": "2026-10-14T08:32:38Z",
"head": "<!-- mq-dev-20261014-dhf-cardclose-01-claim -->"
}
]
},
{
"number": 541,
"merged": true,
"merge_sha": "d23fb4363dcc0a206e71e47f9cd23a644c7e1c70",
"merged_at": "2026-10-14T07:33:18Z",
"head_sha": "221afaeb169b826ecd38567296319c20c0e94b18",
"issue_body_ref": false,
"issue_comment_refs": []
},
{
"number": 542,
"merged": true,
"merge_sha": "7e9ebdea5055a63c713ccc0fb1f938ffe35a6b9d",
"merged_at": "2026-10-14T08:46:12Z",
"head_sha": "60d48e0580a36b2e6f93c77bb1edbe9bd0be342e",
"issue_body_ref": false,
"issue_comment_refs": [
{
"id": 6097,
"created_at": "2026-10-14T08:32:38Z",
"head": "<!-- mq-dev-20261014-dhf-cardclose-01-claim -->"
},
{
"id": 6106,
"created_at": "2026-10-14T08:35:39Z",
"head": "<!-- mq-dev-20261014-dhf-cardclose-02-replacement -->"
},
{
"id": 6117,
"created_at": "2026-10-14T08:47:12Z",
"head": "<!-- mq-dev-20261014-dhf-cardclose-02-release -->"
}
]
},
{
"number": 543,
"merged": true,
"merge_sha": "da93edf23408ca871ae489ac2123e10734c24413",
"merged_at": "2026-10-14T09:24:42Z",
"head_sha": "deac1025f1810d7a535c44a16dd6368eb652c979",
"issue_body_ref": false,
"issue_comment_refs": []
},
{
"number": 544,
"merged": true,
"merge_sha": "2dbe11c5d970e7d6a71d0ce1a00eb399bfbbd427",
"merged_at": "2026-10-14T09:00:43Z",
"head_sha": "b926c701f261995b6e1acabf277bbfdfa47829ca",
"issue_body_ref": false,
"issue_comment_refs": []
},
{
"number": 545,
"merged": true,
"merge_sha": "c8eead49c5e68b2e295927c0e82cc57bcb04bad5",
"merged_at": "2026-10-14T09:10:29Z",
"head_sha": "00b35c5e6f5e0a0bc8072ff5c8c56378e6641d85",
"issue_body_ref": false,
"issue_comment_refs": []
},
{
"number": 546,
"merged": true,
"merge_sha": "3538d40f45ad5a7c779426eb3322f79751db380c",
"merged_at": "2026-10-14T09:40:57Z",
"head_sha": "4a15fa0ceadf716fb93cc2966f099f3915b5f9d9",
"issue_body_ref": false,
"issue_comment_refs": []
},
{
"number": 547,
"merged": true,
"merge_sha": "bcf225d0b981dcd69f8c736010c69b6a92d04341",
"merged_at": "2026-10-14T09:53:34Z",
"head_sha": "8522502e6e6db7a438a8f6fd391e1aa334c7a161",
"issue_body_ref": false,
"issue_comment_refs": []
},
{
"number": 548,
"merged": true,
"merge_sha": "e1bc2602e18a89e4d75a4bf6cd80bc7f9b4d2164",
"merged_at": "2026-10-14T10:05:47Z",
"head_sha": "b89dd1c20ef4aa5c93a144f00e722a81dee87a50",
"issue_body_ref": false,
"issue_comment_refs": []
}
],
"open_prs": [
{
"number": 512,
"draft": true,
"mergeable": false,
"head_sha": "89125b8dda5f8f988a8a760ed64bf00827e1de5c",
"base_sha": "e1bc2602e18a89e4d75a4bf6cd80bc7f9b4d2164",
"title": "[WIP] Deliver progressive U2/U3 work with reliable sourced checkpoints"
},
{
"number": 482,
"draft": false,
"mergeable": false,
"head_sha": "d5e8d6ab7a368f08b29e968b6f65f8898f2b28f5",
"base_sha": "e1bc2602e18a89e4d75a4bf6cd80bc7f9b4d2164",
"title": "Pin the SQLite activity guard and document its refusals"
}
],
"selected_runs": [
{
"run": 3088,
"head_sha": "6463ef430640c56940b82776adb504ee272f030c",
"status": "completed",
"conclusion": "success",
"started_at": "2026-10-14T07:02:04Z",
"completed_at": "2026-10-14T07:09:41Z"
},
{
"run": 3092,
"head_sha": "889f64f88167a5314ebfa42a41f9c7a57f91b404",
"status": "completed",
"conclusion": "success",
"started_at": "2026-10-14T07:49:37Z",
"completed_at": "2026-10-14T07:58:00Z"
},
{
"run": 3100,
"head_sha": "7dd8d0f52ed930fbcabc05f5c4b1fb2b41b10bc5",
"status": "completed",
"conclusion": "success",
"started_at": "2026-10-14T08:28:25Z",
"completed_at": "2026-10-14T08:43:31Z"
},
{
"run": 3107,
"head_sha": "60d48e0580a36b2e6f93c77bb1edbe9bd0be342e",
"status": "completed",
"conclusion": "success",
"started_at": "2026-10-14T08:33:36Z",
"completed_at": "2026-10-14T08:45:31Z"
}
]
}
@@ -0,0 +1,51 @@
# 合入调度首轮受控试行(2026-10-14)
状态:三个真实任务已由智能体依次合入;本报告记录 **manual** 模式的实际观察。是否扩大试行、调整预算或建设自动领取,仍待用户评审。依据为[已批准的实施计划](../proposals/2026-10-13-merge-queue-implementation-plan.md) U5–U6、[Dev 项目规则](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/src/branch/main/policy/merge-queue.md)和[唯一调度记录 #518](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/issues/518)。本报告不代表发布、部署或运行服务验收。
## 范围与证据口径
用户授权由当前智能体接管已有的 Dev #489、#488、#486,确认三者没有其他活动写者;所有实际 PR 合入由智能体执行。Dev `refs/heads/main` 的仓库 ID=29,协调者和窗口在 #518 登记。原任务 R0 各自不同,未伪称共同启动 SHA。组件先按自身目标交付,再固定 Dev 父仓组合;等待的 Dev 源分支没有随前一个正常合入反复同步、推最终候选或跑最终 CI。
证据分层:本机 `make evidence`、API 读取及隔离夹具输出是 **SELF**;`/root/merge_queue_review` 或 `/root/docs_delivery_review` 对固定对象的独立重放另记 **REPLAY**;Gitea Actions 的实际运行链接、作业身份和精确 SHA 才作为 **GATE**。原始 SELF 收据保存在各任务卡、#518 所指 `/tmp/mq-*` 路径及本轮私人状态目录;本文件只列对象、结论和索引,不转写命令输出。未执行的负例继续标 `NOT_RUN`。
平台前置使用用户亲手设置的私有夹具仓库 repoID38 `main` 保护规则。用户修正字段后,Root 只读回读六字段;隔离实测缺检查、失败检查、陈旧绿色候选、匿名请求及已认证绿色候选直推拒绝,合法固定候选由智能体合入。原始 SELF 收据和独立 REPLAY 索引在 #518。该夹具证明所测入口的拒绝/合法路径,不证明 Dev 所有角色、全部写者的机器隔离或旧执行者 fencing。Dev 三项业务检查仍须逐候选运行。
## 三个真实条目
| 顺序 | 原任务 R0 | 先行组件 | Dev 最终 base → head | 独立 Review 与当前 HEAD GATE | 实际合入 main |
|---|---|---|---|---|---|
| [#489](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/489) | `cd61bbb112eea6a210a64e84f2cef00b0d64bfc1` | [Documents #89](https://gitea.naitangbaobao.cn/weichen/Agent-System-Documents/pulls/89) → `7bd4e17827d4c7c88647bf3c9199c495b60cb107` | `add097d06137c4912a4ed9279e98ca353e4e4cf1` → `5e6bf4aa0546d68fb3f872158f22b2791c301a60` | `/root/docs_delivery_review` PASS;[run 3038](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/actions/runs/3038) 三作业成功 | `f00165e8d71e4dc8ba0ceb7dc50c1a8a3deb6d60` |
| [#488](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/488) | `99048dda1f48bccb3d5d798050d7beeea2907177` | [Frontend #73](https://gitea.naitangbaobao.cn/weichen/Agent-System-Frontend/pulls/73) → `5313cfad4e633d0909ed40dcdfa28a11bc1902c0`;[RDM #301](https://gitea.naitangbaobao.cn/weichen/Agent-System-RDM/pulls/301) → `ef5100a020abdd8ba8712c3d15c04c28bcac6e84` | `f00165e8d71e4dc8ba0ceb7dc50c1a8a3deb6d60` → `a70de2c54a74e175ad12c8d52ac29d0bafce9491` | `/root/merge_queue_review` PASS、隔离浏览器 7/7;[run 3050](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/actions/runs/3050) 三作业成功 | `d852c159b6b3387a2f418a42ab6d3696ac873d01` |
| [#486](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/pulls/486) | `4d362537d0e8755a03b1757b5bad92779a064b33` | [Backend #185](https://gitea.naitangbaobao.cn/weichen/Agent-System-Backend/pulls/185) → `8e80e2618eb7471dd12d5f172ff3cd23622b7d2f` | `d852c159b6b3387a2f418a42ab6d3696ac873d01` → `d805cc1697ae7f49d371a56a6a55191f00897b8c` | `/root/merge_queue_review` PASS;[run 3067](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/actions/runs/3067) 三作业成功 | `05b997b84db26c517604c48d12676f0eb2b86e18` |
三个 Dev 合入都用固定 `head_commit_id`、`force_merge=false`,合入后从远端重新读取 PR/main 并核对完整 tree 与已审候选一致;组件 gitlink 没有回退。#489 首个合入响应后的本地指针统计出错,Root 先从 PR/main 重新对账再释放窗口,未重发合入请求。#488 的独立浏览器验收使用临时二进制/私有环境,未操作 live 服务。#486 的 U7 安全审阅先发现 B1–B7,Backend 在推最终源 HEAD 前修复并以隔离 PostgreSQL 真实交叠、跨进程、SIGTERM/SIGKILL 重放;Dev 最终组合继续通过本地 `make test`、隔离 PostgreSQL/Redis `make test-backend-pg` 和 `make build` 的 SELF 检查,GATE 另见表内 run 3067。
## 同步、CI、等待与恢复
每条 Dev 任务对其本轮最新目标仅发生一次真实纳入;固定后同基线 `task-sync` 核验不生成提交。#489 为纠正旧启动状态,在正式窗口前完成源码/组件整改与目标纳入;这与理想的“领取窗口后才第一次纳入”不同,不能抹去。#488、#486 都在领取最终窗口后才执行 `changed=1`,随后成功的固定 HEAD 检查为 `changed=0`。#486 一次无变更检查被嵌套 Git 的短暂 `index.lock` 拒绝,未删锁;持锁操作结束后原对象复核通过。原始失败和成功收据都在 #518。
| Dev PR | 目标纳入次数 | 固定后成功的无变更核验 | 本轮最终 PR CI | 作业运行时长(test / test-pg / svc-realcombo) | runner 等待 |
|---|---:|---:|---|---|---|
| #489 | 1(启动整改期) | 至少 3 次,均未改 HEAD | [3038](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/actions/runs/3038):1 次、3/3 成功 | 5:10 / 7:22 / 1:46 | 每作业 3 秒 |
| #488 | 1(最终窗口) | 2 次,均未改 HEAD | [3050](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/actions/runs/3050):1 次、3/3 成功 | 5:12 / 8:42 / 1:54 | 每作业 3 秒 |
| #486 | 1(最终窗口) | 1 次成功;另 1 次锁拒绝未推进 | [3067](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/actions/runs/3067):1 次、3/3 成功 | 5:01 / 7:19 / 1:54 | 每作业 3 秒 |
三次最终 PR CI 共 3 个 run、9 个必需作业,**因本轮正常排队任务移动 main 而废弃的最终 run 为 0**;没有拿旧绿色检查放行新 HEAD。合入后 main push CI 单列:[run 3040](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/actions/runs/3040) 对 #489 合入树、[run 3053](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/actions/runs/3053) 对 #488 合入树、[run 3068](https://gitea.naitangbaobao.cn/weichen/Agent-System-Dev/actions/runs/3068) 对 #486 合入树,各自另有 3/3 作业成功;共 3 个 push run、9 个作业,不能省略这部分实际 CI 成本。3068 在 04:43:55Z 完成,精确对象为 `05b997b84db26c517604c48d12676f0eb2b86e18`。组件仓的 GATE/N/A 与 RDM #301 任务卡闭合 [PR #364](https://gitea.naitangbaobao.cn/weichen/Agent-System-RDM/pulls/364) 的 CI 不计入上述 Dev 目标 run。
自 2026-10-12 起查询到三个 PR 另有 13 次**试行前开发** Actions run(#489 2、#488 7、#486 4;6 成功、7 失败),其对象与本轮最终候选不同;原始只读清单 `/tmp/mq-trial-ci-history-20261014.json`。这些运行既不能当本轮最终准入,也不能归因于本轮 main 移动。runner 作业等待时间以各 GATE job 的 `created_at`→`started_at` 计算;人的准备/依赖等待没有统一的入队就绪时间戳,本轮不填造净等待时长。仅可复核首次最终同步到合入的可观测下界:#489 19:49、#488 24:20、#486 18:46;它们含测试、Review 和平台等待,不等同完整窗口耗时。三条目均未重新领取最终目标窗口;启动整改、#488 的 E2E 夹具失败、#486 的一次锁拒绝分别保留,不计成 CI 废弃或窗口接管成功。
## 验收与下一步边界
| 验收 | 本轮结论 | 依据及限制 |
|---|---|---|
| MQ1 | 部分满足 | 三任务顺序合入且后继未提前最终同步;最终 CI 0 次因正常排队合入废弃。#489 的目标纳入发生在启动整改期,严格“领取后首同步”未由该例满足。 |
| MQ2 | manual 已登记;原子互斥 `NOT_RUN` | 单协调者与目标窗口记录有效;重复领取的执行端拒绝及旧代次 fencing 未实现/未测。 |
| MQ3 | 本轮通过 | 三个固定对象有同基线无变更核验;#486 短暂锁失败被拒绝且重验不改 HEAD。 |
| MQ4 | 本轮通过 | 三个最终 HEAD 各跑实际新 CI;隔离夹具的陈旧绿色候选被拒。没有把组件/旧分支检查当父仓 GATE。 |
| MQ5 | 部分满足 | #486 活动锁阻断并自行恢复,#489/#488 源码和夹具问题在固定前整改;人工超时释放及无依赖任务并行负例 `NOT_RUN`。 |
| MQ6 | 部分满足 | 组件先合入,后继父仓保留其他能力;紧急插队导致候选失效的真实路径 `NOT_RUN`。 |
| MQ7 | 部分满足 | #489 合入后本地异常先对账,未重复 POST;未知请求结果与旧执行者失联接管 `NOT_RUN`。 |
| MQ8 | manual 范围通过 | 私有夹具正负例、Dev 精确 GATE 和合法智能体合入均有对象证据;全部角色/自动 fencing `NOT_RUN`。 |
| MQ9 | 待文档 PR Review | 权威规范、Dev 采纳、调度记录、实际 PR/运行互相链接;本报告的最终交叉检查需随文档 PR 完成。 |
建议维持单协调者的 **manual** 模式,按目标串行领取,把组件准备与父仓最终 CI 分开。首次试行证明“等待分支不因正常合入反复重跑最终 CI”在这三项中成立;没有可比历史基线,**不报告节省百分比**。自动模式须另行建设并验证原子持久领取、执行端旧代次拒绝、角色覆盖和异常接管,不能从本轮人工遵约推导已具备。扩大试行与预算调整留待用户阶段评审决定;本报告不替代该决定。
@@ -0,0 +1,39 @@
# 两树一网本轮来源与原始评审对象
当前推进状态只在 [方案主记录](../../proposals/2026-10-14-rdm-two-trees-latest-templates.md) 维护。
本目录按原字节保存阶段1/2原对象、源调查及SELF收据;用户已批准阶段2及E1范围,当前结论在主记录更新,原对象保留批准前文字。对象中的旧工作区状态、绝对路径和/tmp引用是历史执行环境,不代表当前工作区准入状态。初次保存收据的完整副本在evidence目录,摘要在preservation-manifest.json;不改写已批准对象去覆盖历史。
- [阶段1原对象](rdm-two-trees-requirements-r1.md)
- [阶段2原对象与E1试验范围](rdm-two-trees-stage2-evaluation-r1.md)
- [工作信息拆解与主动风险澄清的阶段2受影响评估r1](rdm-two-trees-stage2-work-observation-risk-evaluation-r1.md):用户已确认增补并要求进入阶段3;原稿字节保留,不改变原阶段2已批准对象。
- [阶段3工作信息拆解与主动风险澄清需求表r1](rdm-two-trees-stage3-work-observation-risk-requirements-r1.md):用户已确认TT-N03、TT-R01新增条件;原28项仍按原批准对象,原稿字节保留。
- [阶段4工作来源观察与主动风险澄清方案r1](rdm-two-trees-stage4-work-observation-risk-design-r1.md):受影响公开接口、候选/HITL/卡片、权限和恢复方案,用户已批准固定版本。
- [阶段5工作来源观察与主动风险澄清实施及测试计划r1](rdm-two-trees-stage5-work-observation-risk-implementation-test-plan-r1.md):TT-N03/R01 的代码 owner、依赖、隔离测试、全链路验收与原预算复用,用户已批准固定版本。
- [阶段6 W4b 真人确认受影响设计修订候选r1](rdm-two-trees-stage6-w4b-human-confirmation-design-adjustment-r1.md):固定公开 Host 缺可信一次性人工证明的合同差距、候选 X3 能力和 RDM 原子消费/恢复/测试边界;待阶段4受影响方案人工评审,确认写入暂不实施。
- [阶段3需求与验收条件r1原对象](rdm-two-trees-stage3-requirements-r1.md):已获用户确认,原字节保留。
- [阶段4方案设计r1](rdm-two-trees-stage4-design-r1.md):用户已批准,原字节保留。
- [阶段5实施与测试计划r1](rdm-two-trees-stage5-implementation-test-plan-r1.md)
- [阶段5依赖状态快照](stage5-dependencies.json)
- [W0逐文件模板/目录对照r1](rdm-two-trees-stage6-w0-template-ledger-r1.md)
- [X1/X2基座公开扩展申请r1](rdm-two-trees-stage6-public-extension-requests-r1.md)
- [X2跨成员审计可信链接设计修订r1](rdm-two-trees-stage6-audit-link-design-adjustment-r1.md):用户已批准受影响公开合同,原对象保留评审前状态。
- [W2/W4关键依赖顺序修订r1](rdm-two-trees-stage6-w2-w4-sequence-adjustment-r1.md):用户已批准W4a先行,原对象保留评审前状态。
- [W4a项目只读快照指针隔离修订r1](rdm-two-trees-stage6-w4a-read-isolation-design-adjustment-r1.md):同项目缓存污染RED后的受影响读合同已获用户批准,原对象保留评审前状态;W4a继续隔离实现/验证。
- [领域时间持久化与历史缺项修订r1](rdm-two-trees-stage6-time-contract-design-adjustment-r1.md):固定时间RED后的数据合同已获用户批准(call_6ce04b5a3ca3496487ab2714ed208965);原稿字节保留,旧历史不补造,仅隔离实施/测试。
- [W9 PostgreSQL审计截止水位修订r1](rdm-two-trees-stage6-w9-pg-audit-cutoff-adjustment-r1.md):用户已批准隔离分支实现/验证;真实运行库迁移未获放行,原对象保留评审前状态。
- [W6项目模型历史来源逐项复验修订r1](rdm-two-trees-stage6-w6-source-recheck-design-adjustment-r1.md):长期回执原文RED后的X1受影响公开合同已获用户批准;原对象保留评审前状态,W6仅隔离分支续办。
- [W9全部审计写入口截止水位修订r1](rdm-two-trees-stage6-w9-all-writers-cutoff-adjustment-r1.md):显式在线ID绕过后的DB门禁与排他复制修订已获用户批准,原对象保留评审前状态;强coverage仍待修复和验证。
- [W9隔离PG显式低ID跨页RED原始SELF收据](evidence/backend-w9-explicit-low-red-20261014-01.json):从Backend独立工作树源码外收据逐字节复制,副本与原件SHA256均为`21999df9ca7304288df42a5a0ac62687870636291bc61a8b1340fd92729bfd96`;退出码1是预期的失败用例,不是代码已修复或验收通过。
- [Backend X1/X2与最新main组合探针r1](rdm-two-trees-stage6-backend-combination-probe-r1.md):仅本地合并/测试证据,未推送或合入组件。
- [W4a读取隔离P2独立限域复审](rdm-two-trees-stage6-w4a-p2-independent-review-r1.md)、[完整原始收据](evidence/rdm-p2-review-57a8d7ca-replay-20261014-01.json)及[重放脚本](evidence/rdm-p2-review-57a8d7ca-replay.sh):逐字节保留审阅者原件。RDM固定对象57a8d7ca与外层Dev收据对象不同,输出已核验archive及pins;旧时间RED与性能人审未由本结论代替。
- [阶段4源码与在途依赖快照](stage4-sources.json)
- [模板与会议来源台账](rdm-two-trees-source-inventory.json)
- [旧DOC源码补充](rdm-two-trees-legacy-source-addendum.md)
- [固定main及PR快照](stage2-sources/remote-snapshot.json)
- [相关PR变更文件](stage2-sources/overlap-snapshot.json)
- [额外源码哈希](stage2-sources/extra-source-snapshot.json)
JSON的localCopy字段记录调查时源码外缓存的位置;仓内保留源码commit/path/hash和远端链接,不在Documents复制另一套业务源码。公开依赖仍以各仓真实源码及当前pin为准。所有本地执行收据均为SELF,不能替代CI、独立重放或人工批准。
E1已按批准范围执行,全部原始产物及完整收据留源码外:[报告与逐文件结果](/home/weichen/.codex/visualizations/2026/10/13/01a13639-7c7c-7f20-aece-a3937edf6229/e1-20261014-091421/REPORT-r1.md)。14份转换成功,完整保真未通过;原件未改变。组件本地实现及隔离自检已开展,真实模型/浏览器、正式验收和部署仍未执行;各项当前结论见主记录。此机器绝对路径只定位当前保存材料,不表示已在远端发布或可在其他机器直接取得。
@@ -0,0 +1,22 @@
#!/usr/bin/env bash
set -euo pipefail
repo=/home/weichen/projects/Agent-System-RDM-wt-feature-rdm-two-trees-project-dictionary
snapshot=/tmp/rdm-p2-review-8shrap
source_sha=57a8d7caedf72d9be4bdca179ae2a93e456ba009
verify_dir=$(mktemp -d /tmp/rdm-p2-receipt-verify-XXXXXX)
git -C "$repo" archive "$source_sha" | tar -x -C "$verify_dir"
diff -qr -x pins "$verify_dir" "$snapshot"
printf 'SOURCE_SHA=%s SOURCE_TREE=IDENTICAL_TO_GIT_ARCHIVE\n' "$source_sha"
for pin in agent-system-backend agent-system-core agent-system-frontend agent-system-ui; do
expected=$(git -C "$repo" ls-tree "$source_sha:pins" "$pin" | awk '{print $3}')
actual=$(git -C "$repo/pins/$pin" rev-parse HEAD)
test "$actual" = "$expected"
test -z "$(git -C "$repo/pins/$pin" status --porcelain=v1)"
printf 'PIN_%s=%s MATCHES_GITLINK CLEAN\n' "$pin" "$actual"
done
diff -qr -x .git "$repo/pins" "$snapshot/pins"
printf 'PIN_SOURCE=IDENTICAL_TO_VERIFIED_PIN_CHECKOUTS\n'
printf 'SNAPSHOT_PATH=%s\n' "$snapshot"
cd "$snapshot"
GOWORK=off go test -race -v ./internal/domain ./internal/rdmapp -run 'TestFrozenWorldCopySeparatesNestedStateAndSharesOnlySealedLog|TestEventLogDoesNotAliasEventInputsOrOutputs|TestEventLogCloseSealsSettersRestoresAndTransactionClosures|TestPublishedReadPointersCannotPolluteOtherReaders|TestRuntimePrivateSeedSurvivesPublicDictionaryMutationBeforeFirstProjectRead|TestRuntimePublicDictionaryCannotPoisonProjectOrHistoricalReaders|TestRetainedTransactionWorldCannotPoisonCommittedCanonical|TestWorldForSharesOnlySealedLogWithinRevision|TestSameRevisionCanonicalCannotBeReplacedByAnotherProjection|TestLaterInstanceCommitRejectsOlderPendingCanonical|TestReaderWaitsForLocalCommitPublication|TestProjectTransactionPublishesOnlyAfterCommit|TestProjectTransactionSQLiteTwoInstanceCAS|TestLegacyAttributionRefreshesOtherRuntimeSQLite|TestCancelInFlightUpdatesCardSameSource' -count=1 -timeout 90s
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More