From de65cee96c38ba1adba0e92f04c46a40dbf8bf1a Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 16 Sep 2026 15:40:10 +0000 Subject: [PATCH] docs(test): record FAV U7 incremental go/no-go evidence Subscriber remains OFF until separate approval; document remaining FAV port inventory and claim feature/fav-u7-publisher. Co-authored-by: Cursor --- .../audit/2026-09-16-fav-u7-remaining-port.md | 21 ++++ .doc/ops/CURRENT.md | 1 + .../2026-09-16-fav-u7-incremental.md | 39 +++++-- .doc/status/FEATURE-MATRIX.md | 2 +- ...26-09-16-fav-u7-incremental-test-report.md | 110 ++++++++++++++++++ .../unit-tests.txt | 63 ++++++++++ 6 files changed, 228 insertions(+), 8 deletions(-) create mode 100644 .doc/audit/2026-09-16-fav-u7-remaining-port.md create mode 100644 .doc/test-reports/2026-09-16-fav-u7-incremental-test-report.md create mode 100644 .doc/test-reports/assets/2026-09-16-fav-u7-incremental/unit-tests.txt diff --git a/.doc/audit/2026-09-16-fav-u7-remaining-port.md b/.doc/audit/2026-09-16-fav-u7-remaining-port.md new file mode 100644 index 00000000..2ace9937 --- /dev/null +++ b/.doc/audit/2026-09-16-fav-u7-remaining-port.md @@ -0,0 +1,21 @@ +--- +title: "FAV U7 incremental — remaining port inventory" +status: open +created: 2026-09-16 +updated: 2026-09-16 +--- + +# FAV U7 增量:未移植清单 + +相对 `feature/final-artifact-vault`,本切片 **未** 整支 merge,且因 `internal/artifactvault` 与当前 `dev`(dataset Candidate backfill)大面积 DIFF,下列能力仍待后续手工移植 + 审计: + +| 项 | 旁支路径 | 阻塞 | +|----|----------|------| +| EnumerateTerminals / LoadExclusions | `internal/artifactvault/enumerate.go` | 依赖 TerminalRow;与现 `Enumerate(Candidate)` 并存需设计 | +| TerminalRow Backfill | FAV `backfill.go` | 现 backfill 已改为 dataset 路径 | +| 完整 CLI | `cmd/artifact-vault` 全命令 | 本切片仅 status stub | +| ingest hooks | `internal/server/vault.go` OnFinalArtifact* | 会写 staging;需与 publisher 门闩同批审批 | +| schema JSON | `*.schema.json` | 可选文档资产 | +| durable Register(fav) | `cmd/events` | events 硬门 + 单独 cutover 审批 | + +**红线保持**:`FAV_DEGRADED_READ=false`;fav consumer mode=off;禁止整支 merge。 diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index 99ea1d3d..cfa6cba4 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -13,6 +13,7 @@ | owner | task | branch | worktree | mutex | status | |-------|------|--------|----------|-------|--------| +| Cursor | 2026-09-16-fav-u7-incremental | feature/fav-u7-publisher | .worktrees/feature-fav-u7-publisher | events | in_progress | | Cursor | 2026-09-16-full-backlog-override | docs/override-nogo-full-backlog | - | architecture-docs | in_progress | | Cursor | 2026-09-16-gitea-nightly-docker-datadir | fix/gitea-nightly-docker-datadir | - | ci | done | | Cursor | 2026-09-16-gitea-nightly-host-tools | fix/gitea-nightly-host-tools | - | ci | done | diff --git a/.doc/ops/short-term/2026-09-16-fav-u7-incremental.md b/.doc/ops/short-term/2026-09-16-fav-u7-incremental.md index 5b9e159b..05ddb939 100644 --- a/.doc/ops/short-term/2026-09-16-fav-u7-incremental.md +++ b/.doc/ops/short-term/2026-09-16-fav-u7-incremental.md @@ -1,11 +1,11 @@ --- title: "FAV U7 增量合入(非整支 merge)" -status: planned +status: in_progress created: 2026-09-16 updated: 2026-09-16 owner: Cursor branch: feature/fav-u7-publisher -worktree: "-" +worktree: ".worktrees/feature-fav-u7-publisher" mutex: events --- @@ -15,13 +15,38 @@ mutex: events 从 `feature/final-artifact-vault` **手工移植**经审计切片到 `dev`;consumer 默认 off;禁止整支 merge;禁止默认开 `FAV_DEGRADED_READ`。 -## 步骤 +## 范围 -1. [ ] cherry-pick / 移植 cmd/artifact-vault + vault HTTP + publisher 订阅 -2. [ ] 隔离库负例 + 默认 off 冒烟 -3. [ ] 独立 go/no-go 报告 +- 配置门闩(`FAV_DEGRADED_READ` / `FAV_PUBLISHER_ENABLED` 默认 false) +- HTTP `GET /api/v1/vault/status` + gated in-process publisher stub +- `internal/app/fav` durable subscriber stub(不注册到 cmd/events) +- `cmd/artifact-vault` status stub(完整 CLI 未移植) ## 非目标 - 整支 merge `feature/final-artifact-vault` -- 未审计启用 degraded read +- 未审计启用 degraded read / fav live / publisher production Drain +- 移植 enumerate / TerminalRow Backfill / OnFinalArtifact hooks + +## 步骤 + +1. [x] 审计 FAV vs `dev` artifactvault 冲突(多数 DIFF → 改 stub) +2. [x] 落地 stub + 默认 off 测试 +3. [x] go/no-go 报告 +4. [ ] 推送 `feature/fav-u7-publisher`(不合 dev) + +## 验收标准 + +- [x] fav consumer / Register 仍 fail-closed +- [x] `FAV_DEGRADED_READ` 默认 false +- [x] 测试报告含 NO-GO:subscriber 保持 OFF 直至单独审批 +- [ ] 已 push 远端 feature 分支 + +## 相关链接 + +- Test report: [.doc/test-reports/2026-09-16-fav-u7-incremental-test-report.md](../../test-reports/2026-09-16-fav-u7-incremental-test-report.md) +- Assets: [.doc/test-reports/assets/2026-09-16-fav-u7-incremental/](../../test-reports/assets/2026-09-16-fav-u7-incremental/) + +## 证据 / 备注 + +因 `internal/artifactvault` 与 FAV 旁支大面积分叉,未 cherry-pick 核心库;采用最小可编译、默认关闭的 publisher/HTTP/CLI stub。 diff --git a/.doc/status/FEATURE-MATRIX.md b/.doc/status/FEATURE-MATRIX.md index 61987c24..c0952217 100644 --- a/.doc/status/FEATURE-MATRIX.md +++ b/.doc/status/FEATURE-MATRIX.md @@ -66,7 +66,7 @@ | CI / E2E | PR CI、PG 集成、治理 PG、已签真实 PI 门禁;**nightly** schedule/`workflow_dispatch` + infra/product 分类 receipt | partial | 加固(阻止**下一次**晋升,不自动否定已发布) | [BUG-08](../test-reports/2026-09-16-ci-governance-pg-bug08-test-report.md);[PI 三工作流](../test-reports/2026-09-16-pi-three-workflow-e2e-test-report.md);[B3](../test-reports/2026-09-16-chat-refresh-gate-test-report.md);[B4](../test-reports/2026-09-16-frontend-gate-b4-test-report.md);[Wave2B nightly/receipt](../test-reports/2026-09-16-wave2b-nightly-promotion-receipt-test-report.md) | 关闭条件:nightly 入口 + 失败分类 + promotion-receipt 门禁已交付;TempDir race **已修**;PR CI 不依赖外部模型。Actions secret/runner 需环境配置 | `ci` | | Artifact 同 digest 晋升 | 候选 commit 一次构建、按 digest 晋升、promotion receipt | done | 加固 | [计划 PU5B](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md);[Wave2B](../test-reports/2026-09-16-wave2b-nightly-promotion-receipt-test-report.md);[Wave2C](../test-reports/2026-09-16-wave2c-same-image-digest-test-report.md) | **关闭**:same-image pin(`candidate-images-*` + `PINNED_IMAGE_MODE` + promote `--require-digests`)。**声明**:单机 retag/digest pin;远程 registry 推送另立任务 | `infra` | | 可靠事件核心 | PG dispatcher、notify/advance/projection live、生产闭包 hook 退出、Phase2 选择性解耦已合入 | done | non_blocker | [E0A–E2](../test-reports/2026-09-15-event-e0a-production-scope-contract-test-report.md) 等;[复盘](../ops/research/2026-09-15-track-e-retrospective.md);[shared live](../test-reports/2026-09-15-event-notify-shared-live-test-report.md);[phase2 closeout](../test-reports/2026-09-15-phase2-closeout-test-report.md) | **before**:与 FAV off 混成 partial → **after**:FAV 独立行。选择性后续解耦按收益触发 | `architecture-docs` / `events` | -| Final Artifact Vault(FAV) | 不可变终态制品库;`FAV_DEGRADED_READ=false` | planned | deferred_enhancement | [Track E 复盘](../ops/research/2026-09-15-track-e-retrospective.md);[short-term](../ops/short-term/2026-09-16-fav-u7-incremental.md) | **覆盖授权增量实施**;仍**禁止**整支 merge;degraded read 默认 false | `events` | +| Final Artifact Vault(FAV) | 不可变终态制品库;`FAV_DEGRADED_READ=false` | planned | deferred_enhancement | [Track E 复盘](../ops/research/2026-09-15-track-e-retrospective.md);[short-term](../ops/short-term/2026-09-16-fav-u7-incremental.md);[U7 stub 报告](../test-reports/2026-09-16-fav-u7-incremental-test-report.md);[未移植清单](../audit/2026-09-16-fav-u7-remaining-port.md) | **U7 stub 在 `feature/fav-u7-publisher`**:publisher/HTTP/CLI 默认 off;**禁止**整支 merge;subscriber **NO-GO** 直至单独审批 | `events` | --- diff --git a/.doc/test-reports/2026-09-16-fav-u7-incremental-test-report.md b/.doc/test-reports/2026-09-16-fav-u7-incremental-test-report.md new file mode 100644 index 00000000..20e72c57 --- /dev/null +++ b/.doc/test-reports/2026-09-16-fav-u7-incremental-test-report.md @@ -0,0 +1,110 @@ +# FAV U7 增量(publisher stub)测试报告 + +## 一、 测试背景 (Background) + +P7 Final Artifact Vault 禁止整支 merge `feature/final-artifact-vault`。相对当前 `dev`,FAV 旁支的 `internal/artifactvault/*` 多数文件已大幅分叉(dataset Candidate backfill vs TerminalRow),强行 cherry-pick 会引入不可控冲突。本切片改为 **U7 增量 stub**:配置门闩、HTTP status、events 订阅桩与 CLI stub,全部默认关闭。 + +## 二、 测试目标 (Test Objectives) + +- `FAV_DEGRADED_READ` 默认 false(config + docquery + vault GET) +- `FAV_PUBLISHER_ENABLED` 默认 false;进程内 Drain 不启动 +- fav durable consumer 保持 mode=off;`Registry.Register(fav)` fail-closed +- `cmd/artifact-vault` 可编译;仅 `status|version`,无破坏性操作 +- 产出 go/no-go:**subscriber 保持 OFF,直至单独审批** + +## 三、 测试方案与环境 (Test Plan & Environment) + +| 项 | 值 | +|----|----| +| OS | Linux | +| Go | 本机 `go test` / `go vet` | +| 分支 | `feature/fav-u7-publisher`(自 `dev@ebe177e`) | +| 层级 | 单元测试 + CLI 冒烟(无 stub 冒充真实 PI) | +| 证据 | `.doc/test-reports/assets/2026-09-16-fav-u7-incremental/unit-tests.txt` | + +核心用例矩阵: + +| ID | 用例 | 期望 | +|----|------|------| +| C1 | config 默认 | degraded/publisher false | +| C2 | vault init/start | publisher nil / not running | +| C3 | GET vault/status | consumer_mode=off | +| C4 | fav EventConsumer 零值 | HandleLease → ErrDisabledConsumer | +| C5 | events Registry | Register(fav) 失败;LiveConsumers 不含 fav | +| C6 | docquery | FavDegradedReadEnabled() false | +| C7 | artifact-vault status | 打印 remaining_to_port;无 backfill | + +## 四、 预期结果 (Expected Results) + +- 所有默认路径 FAIL-CLOSED:不写 vault blob、不 claim fav lease、不启用 degraded GET +- 显式 `FAV_*=true` 仅打开配置位;durable Register 仍被 events 硬门拒绝 +- go/no-go 结论:**NO-GO for enabling fav subscriber** + +## 五、 实际测试结果与判定 (Actual Results & Evaluation) + +### C1–C3 config / vault + +- **测试输入**:`config.Load("/dev/null")`;`Server{cfg}.initArtifactVault/startVaultPublisher`;`GET /api/v1/vault/status` +- **实际输出**:见 assets `unit-tests.txt` — `TestFAVFlagsDefaultOff` / `TestVaultDefaultsStayDisabled` / `TestVaultStatusReportsOff` PASS +- **评价判定**:PASS +- **耗时**:<10ms + +### C4 fav subscriber stub + +- **测试输入**:零值 `EventConsumer`;`Enabled=true` 仍调用 HandleLease +- **实际输出**:均 `events: consumer is disabled`;`Register(fav)` 失败 +- **评价判定**:PASS + +### C5–C6 events / docquery + +- **测试输入**:既有 `TestAssertLiveConsumersRejectsFAV`、`TestLiveConsumersOmitsFAV`、`TestFavDegradedReadDefaultOff` +- **实际输出**:PASS(PG claim 负例缺 `TEST_DATABASE_URL` 时 SKIP,与既有约定一致) +- **评价判定**:PASS + +### C7 CLI stub + +- **测试输入**:`go build ./cmd/artifact-vault && artifact-vault status` +- **实际输出**:JSON 含 `consumer_mode=off`、`degraded_read=false`、`remaining_to_port` 列表 +- **评价判定**:PASS + +## 六、 自动化测试套件汇总 (Test Suite Execution) + +```text +ok internal/config (FAV flags + ValidateIndependentVault) +ok internal/app/fav (subscriber defaults off) +ok internal/server (vault stub defaults off) +ok internal/events (FAV register/live omit) +ok internal/docquery (FavDegradedRead default off) +go vet PASS on touched packages +``` + +完整控制台:`assets/2026-09-16-fav-u7-incremental/unit-tests.txt` + +## 七、 测试结论与后续优化建议 (Conclusion & Next Steps) + +### Go / No-Go + +| 决策点 | 结论 | +|--------|------| +| 合入本 stub 分支到 `dev`(另占集成槽) | **条件 GO**(默认 off,可审) | +| 启用 fav durable subscriber / `Register(fav)` | **NO-GO** — 需单独审批 | +| 启用 `FAV_DEGRADED_READ` | **NO-GO** — 默认 false,未做 M2 负例放行 | +| 启用 `FAV_PUBLISHER_ENABLED` 生产 Drain | **NO-GO** — 缺 ingest hooks 与完整 CAS 接线审计 | +| 整支 merge `feature/final-artifact-vault` | **NO-GO**(红线) | + +### 仍待从 FAV 旁支手工移植(冲突重,本切片未搬) + +1. `enumerate.go`(`EnumerateTerminals` / `LoadExclusions`) +2. `TerminalRow` + `Backfill(rows)`(与现 dataset `Candidate` 路径分叉) +3. 完整 `recover-plan` / `recover-apply` / `gc-preflight` / `destroy` CLI +4. `server` ingest hooks(`OnFinalArtifact*`) +5. durable fav `Register` + live cutover(需审批解锁 events 硬门) + +### 本切片交付物 + +- `internal/config`:`FAV_*` / `VAULT_*` + `ValidateIndependentVault` +- `internal/server/vault.go`:status HTTP + gated publisher +- `internal/app/fav`:subscriber stub(默认 off) +- `cmd/artifact-vault`:status stub +- compose:`FAV_DEGRADED_READ` / `FAV_PUBLISHER_ENABLED` 钉死 false(main 硬编码) +- **未** merge 到 `dev` diff --git a/.doc/test-reports/assets/2026-09-16-fav-u7-incremental/unit-tests.txt b/.doc/test-reports/assets/2026-09-16-fav-u7-incremental/unit-tests.txt new file mode 100644 index 00000000..45fd31e0 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-16-fav-u7-incremental/unit-tests.txt @@ -0,0 +1,63 @@ +=== go test FAV disablement suite === +=== RUN TestFAVFlagsDefaultOff +--- PASS: TestFAVFlagsDefaultOff (0.00s) +=== RUN TestFAVFlagsOptInOnly +--- PASS: TestFAVFlagsOptInOnly (0.00s) +=== RUN TestValidateIndependentVault +--- PASS: TestValidateIndependentVault (0.00s) +PASS +ok chat-agent-system/internal/config 0.002s +=== RUN TestFavSubscriberDefaultsDisabled +--- PASS: TestFavSubscriberDefaultsDisabled (0.00s) +=== RUN TestFavSubscriberStillDisabledWhenFlagOnWithoutRegistryApproval +--- PASS: TestFavSubscriberStillDisabledWhenFlagOnWithoutRegistryApproval (0.00s) +PASS +ok chat-agent-system/internal/app/fav 0.002s +=== RUN TestVaultDefaultsStayDisabled +--- PASS: TestVaultDefaultsStayDisabled (0.00s) +=== RUN TestVaultStatusReportsOff +--- PASS: TestVaultStatusReportsOff (0.00s) +=== RUN TestValidateIndependentVaultRejectsDataRoot +--- PASS: TestValidateIndependentVaultRejectsDataRoot (0.00s) +PASS +ok chat-agent-system/internal/server 0.007s +=== RUN TestValidateOpsCutoverRejectsFavAndNonDev +--- PASS: TestValidateOpsCutoverRejectsFavAndNonDev (0.00s) +=== RUN TestPrincipalRejectsWildcardAndFAV +--- PASS: TestPrincipalRejectsWildcardAndFAV (0.00s) +=== RUN TestAssertLiveConsumersRejectsFAV +--- PASS: TestAssertLiveConsumersRejectsFAV (0.00s) +=== RUN TestLiveConsumersOmitsFAV +--- PASS: TestLiveConsumersOmitsFAV (0.00s) +=== RUN TestManifestJSONIncludesDisabledFAV +--- PASS: TestManifestJSONIncludesDisabledFAV (0.00s) +=== RUN TestE0B_FAVNeverClaimed_PG + dispatcher_pg_test.go:85: TEST_DATABASE_URL not set; skipping PostgreSQL integration test +--- SKIP: TestE0B_FAVNeverClaimed_PG (0.00s) +PASS +ok chat-agent-system/internal/events 0.004s +=== RUN TestFavDegradedReadDefaultOff +--- PASS: TestFavDegradedReadDefaultOff (0.00s) +=== RUN TestFavDegradedReadOnlyAfterAuthorize +--- PASS: TestFavDegradedReadOnlyAfterAuthorize (0.00s) +PASS +ok chat-agent-system/internal/docquery 0.002s +=== go build cmd/artifact-vault === +{ + "binary": "artifact-vault", + "consumer": "fav", + "consumer_mode": "off", + "degraded_read": false, + "note": "do not enable FAV_DEGRADED_READ or fav consumer without approval", + "publisher_default": false, + "remaining_to_port": [ + "enumerate.go (EnumerateTerminals / LoadExclusions)", + "TerminalRow + Backfill(rows) API (diverged from dataset Candidate path)", + "full recover-plan / recover-apply / gc-preflight / destroy", + "server ingest hooks (OnFinalArtifact*)", + "durable fav event Register after separate approval" + ], + "slice": "u7-incremental-stub", + "source_branch": "feature/final-artifact-vault" +} +=== go vet ===