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 <cursoragent@cursor.com>
This commit is contained in:
weichen
2026-09-16 15:40:10 +00:00
co-authored by Cursor
parent 5392238354
commit de65cee96c
6 changed files with 228 additions and 8 deletions
@@ -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。
+1
View File
@@ -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 |
@@ -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。
+1 -1
View File
@@ -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` |
---
@@ -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`
@@ -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 ===