Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |

## 文档权威
Expand Down
1 change: 1 addition & 0 deletions docs/progress/MASTER.md
Original file line number Diff line number Diff line change
Expand Up @@ -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. |
2 changes: 1 addition & 1 deletion docs/roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -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` |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Clarify the acceptance sentence so real_tested=false is not described as real proof.

This row now says real packaged proof can come from a separate gate or real_tested=false, but the rest of this PR defines real_tested=false as the explicit non-proof boundary. That contradiction makes the acceptance contract easier to misread later.

Suggested wording
-| Desktop packaged boundary | 区分 Vite renderer、Tauri packaged、sidecar、icon、installer/signing | chat acceptance 只列 skipped `packaged-release` 边界;真实证明走独立 packaged-release gate 或明确 `real_tested=false` |
+| Desktop packaged boundary | 区分 Vite renderer、Tauri packaged、sidecar、icon、installer/signing | chat acceptance 只列 skipped `packaged-release` 边界并保持 `real_tested=false`;真实证明仅走独立 packaged-release gate |
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
| Desktop packaged boundary | 区分 Vite renderer、Tauri packaged、sidecar、icon、installer/signing | chat acceptance 只列 skipped `packaged-release` 边界;真实证明走独立 packaged-release gate 或明确 `real_tested=false` |
| Desktop packaged boundary | 区分 Vite renderer、Tauri packaged、sidecar、icon、installer/signing | chat acceptance 只列 skipped `packaged-release` 边界并保持 `real_tested=false`;真实证明仅走独立 packaged-release gate |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/roadmap.md` at line 58, The acceptance sentence in the “Desktop packaged
boundary” row is inconsistent with the PR’s `real_tested=false` contract. Update
the wording in the roadmap entry so `real_tested=false` is clearly presented as
a non-proof/skipped boundary, and reserve real packaged evidence for an explicit
`packaged-release` gate; keep the language aligned with the existing acceptance
contract used elsewhere in the docs.

| 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 |
Expand Down
12 changes: 12 additions & 0 deletions scripts/verify/chat-acceptance.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
8 changes: 7 additions & 1 deletion tests/contract/scripts/verify-chat-acceptance.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down Expand Up @@ -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');
Expand Down
Loading