From 7b8c44b17f830aa68b6d722c6928665d28ed6636 Mon Sep 17 00:00:00 2001 From: Delicious233 <101502465+DeliciousBuding@users.noreply.github.com> Date: Mon, 29 Jun 2026 16:41:32 +0800 Subject: [PATCH] test(chat): separate packaged desktop evidence --- docs/architecture.md | 2 +- docs/progress/MASTER.md | 1 + docs/roadmap.md | 2 +- scripts/verify/chat-acceptance.mjs | 12 ++++++++++++ tests/contract/scripts/verify-chat-acceptance.mjs | 8 +++++++- 5 files changed, 22 insertions(+), 3 deletions(-) diff --git a/docs/architecture.md b/docs/architecture.md index 6f3a3671..726b153b 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -116,7 +116,7 @@ Conversation -> Message -> TranscriptBlock -> TranscriptItem -> RowItem / UserMs | Hub/Edge 逻辑 | focused Go tests; broad changes run `go test ./... -short -count=1` in touched service | | Backend performance/leak | [reference/backend-performance-gates.md](reference/backend-performance-gates.md) maps behavior gates, microbenchmarks, load smoke, and pprof/leak blockers | | Shared transcript/UI | shared unit/contract + Desktop/Web Playwright + Visual QA;Desktop/Web 主视口为 16:9 `1440x810` | -| Desktop packaged claim | Tauri package/sidecar/icon/installer evidence, not Vite-only | +| Desktop packaged claim | Tauri package/sidecar/icon/installer evidence, not Vite-only; chat acceptance may list this as a skipped `packaged-release` boundary, but the proof is a separate opt-in gate | | Real login/model/API claim | approved-real evidence with explicit approval and no silent fallback | ## 文档权威 diff --git a/docs/progress/MASTER.md b/docs/progress/MASTER.md index b1692936..9d88b9fb 100644 --- a/docs/progress/MASTER.md +++ b/docs/progress/MASTER.md @@ -118,3 +118,4 @@ Per-task telemetry is stored in GitHub issue comments before task closure. Adapt | 2026-06-29 | Phase 4 sync | #389 merged via #412 and closed manually because non-default base did not auto-close it; milestone #20 is 1/3 complete with drift_score 1, and #390 is the active next task with a drift warning. | | 2026-06-29 | T4.2 implementation | Added Desktop/Web Visual QA metrics and report artifacts, locked their paths in the chat acceptance manifest, and verified the full chat acceptance bundle with `real_tested=false`; PR pending. | | 2026-06-29 | Phase 4 sync | #390 merged via #414 and closed manually because non-default base did not auto-close it; milestone #20 is 2/3 complete with drift_score 1, and #391 is the active next task. | +| 2026-06-29 | T4.3 implementation | Added an explicit skipped `packaged-release` boundary row to chat acceptance, kept packaged Desktop proof opt-in, and verified docs/real-e2e/Tauri readiness contracts; PR pending. | diff --git a/docs/roadmap.md b/docs/roadmap.md index 0324f458..74856522 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -55,7 +55,7 @@ AgentHub 是 IM 形态的多 Agent 协作工作台。用户面对的是联系人 | 方向 | 目标 | 验收 | |---|---|---| | Web/Mobile client test lanes | Web 保持 Hub-only;Mobile 只澄清 RN-safe shared contract gate,不做 native/UI 深入重构 | Web data-boundary checks + Mobile mock-Hub/Expo Doctor boundary notes | -| Desktop packaged boundary | 区分 Vite renderer、Tauri packaged、sidecar、icon、installer/signing | packaged-release gate 或明确 `real_tested=false` | +| Desktop packaged boundary | 区分 Vite renderer、Tauri packaged、sidecar、icon、installer/signing | chat acceptance 只列 skipped `packaged-release` 边界;真实证明走独立 packaged-release gate 或明确 `real_tested=false` | | Source/test alignment | Shared transcript/data-mode normalizer 和 Desktop/Web 实现一致 | shared unit + app E2E | | Backend performance/leak | 对 Hub EventBus/outbox/scheduler/Redis TTL、Edge lifecycle/store/adapters 建立路径级检查 | [reference/backend-performance-gates.md](reference/backend-performance-gates.md) + `scripts/verify/verify-backend-perf-leak-gates.ps1` | | API contract hygiene | REST 以 `api/openapi.yaml` 为准,WS 以 `api/events.md` 为准 | OpenAPI parse + endpoint tests | diff --git a/scripts/verify/chat-acceptance.mjs b/scripts/verify/chat-acceptance.mjs index e3fdf211..d3c8d14a 100644 --- a/scripts/verify/chat-acceptance.mjs +++ b/scripts/verify/chat-acceptance.mjs @@ -105,6 +105,18 @@ await runGate({ skipReason: 'skipped by --skip-web-visual-qa', }); +await runGate({ + name: 'packaged-desktop-release', + surface: 'desktop', + evidenceLevel: 'packaged-release', + claim: 'Packaged Desktop sidecar, icon, installer, signing, updater, and release evidence is a separate opt-in gate; chat acceptance does not run it', + cwd: repoRoot, + command: 'pwsh', + args: ['./scripts/release/verify-tauri-package-readiness.ps1', '-RequireBuiltArtifacts'], + skip: true, + skipReason: 'separate opt-in packaged-release gate; not run by chat acceptance', +}); + const endedAt = new Date(); const counts = { passed: rows.filter((row) => row.status === 'passed').length, diff --git a/tests/contract/scripts/verify-chat-acceptance.mjs b/tests/contract/scripts/verify-chat-acceptance.mjs index f0fd4048..446c551f 100644 --- a/tests/contract/scripts/verify-chat-acceptance.mjs +++ b/tests/contract/scripts/verify-chat-acceptance.mjs @@ -30,10 +30,11 @@ try { 'web-chat-playwright', 'desktop-chat-visual-qa', 'web-chat-visual-qa', + 'packaged-desktop-release', ]) { assert(scriptText.includes(row), `runner includes ${row} row`); } - for (const level of ['fixture-unit', 'playwright-ui', 'visual-qa']) { + for (const level of ['fixture-unit', 'playwright-ui', 'visual-qa', 'packaged-release']) { assert(scriptText.includes(level), `runner records ${level} evidence`); } assert(scriptText.includes('real_tested: false'), 'runner records real_tested=false'); @@ -70,6 +71,11 @@ try { assert(json.rows.filter((row) => row.name === 'web-chat-playwright' && row.evidence_level === 'playwright-ui').length === 1, 'manifest has Web Playwright row'); assert(json.rows.filter((row) => row.name === 'desktop-chat-visual-qa' && row.evidence_level === 'visual-qa').length === 1, 'manifest has Desktop Visual QA row'); assert(json.rows.filter((row) => row.name === 'web-chat-visual-qa' && row.evidence_level === 'visual-qa').length === 1, 'manifest has Web Visual QA row'); + assert(json.rows.filter((row) => row.name === 'packaged-desktop-release' && row.evidence_level === 'packaged-release').length === 1, 'manifest has separate packaged-release row'); + assert(json.rows.find((row) => row.name === 'packaged-desktop-release')?.status === 'skipped', 'packaged-release row is skipped by chat acceptance'); + assert(json.rows.find((row) => row.name === 'packaged-desktop-release')?.real_tested === false, 'packaged-release row keeps real_tested=false when skipped'); + assert(!json.evidence_levels.includes('packaged-release'), 'skipped packaged-release row is not executed evidence'); + assert(json.planned_evidence_levels.includes('packaged-release'), 'planned evidence levels name packaged-release boundary'); assert(json.rows.find((row) => row.name === 'desktop-chat-visual-qa')?.artifacts?.includes('app/desktop/.tmp/manual-chat-flow-uiux/desktop-1440x810-chat-flow.metrics.json'), 'Desktop Visual QA row includes metrics artifact'); assert(json.rows.find((row) => row.name === 'desktop-chat-visual-qa')?.artifacts?.includes('app/desktop/.tmp/manual-chat-flow-uiux/desktop-chat-flow-visual-qa.json'), 'Desktop Visual QA row includes report artifact'); assert(json.rows.find((row) => row.name === 'web-chat-visual-qa')?.artifacts?.includes('app/web/.tmp/manual-chat-flow-uiux/web-1440x810-chat-flow.metrics.json'), 'Web Visual QA row includes metrics artifact');