# v0.5 Acceptance and Release Evidence This is the release traceability record for `dsh-agent-team-gui` v0.5. The product contract lives in [`v0.5-product-spec.md`](./v0.5-product-spec.md); this file records how the release candidate is verified without requiring contributors to expose provider credentials. Evidence classes used below: - **Browser** — Playwright drives the production `lib/client.js` loaded by an isolated real DSH Web `0.1.0-rc.6` Host. The gate includes Axe, console/page errors, keyboard interaction, reloads, and narrow layouts. - **Runtime** — an isolated real DSH Host, storage backend, and RPC boundary are exercised without a browser. - **Automated** — deterministic Host or rendered-Client integration tests exercise provider-facing behavior with controlled adapters. This is stronger and safer than putting real provider secrets in CI. - **Capture** — representative schema-valid durable data is reopened by the production Host and rendered by the production Client. A capture demonstrates rendering, not a claim that a provider generated the fixture. Manual exploratory journeys remain useful across provider implementations, but they are not misrepresented as automated evidence below. ## Reliability and orchestration | ID | Acceptance scenario | Evidence | Status | | --- | --- | --- | --- | | R1 | A saved team is selectable immediately after a Host restart without re-saving it. | `client-controller.spec.ts`: connection-handshake refresh and queued forced refresh; `composer.client.spec.tsx`: transient-empty protection; `smoke:install`: definitions survive restart; `smoke:browser`: live Host restart recovers the enabled Composer without visiting Settings. | **Pass — Browser + Runtime** | | R2 | Explicit Solo, explicit Team, inherited project default, and one-shot mode remain distinct. | `composer.client.spec.tsx`: three-state and one-shot interaction; `v05-host.spec.ts`: atomic concurrent one-shot claim; `smoke:browser`: cold reloads, project-default set/clear, Solo→Team one-shot RPC, and at-most-once consumption. | **Pass — Browser + Automated** | | R3 | `always/all` and omitted defaults remain compatible with v0.4 records. | `v05-host.spec.ts`: reopens v0 rows, imports v1 limits, accepts legacy 33-member/large-token records, preserves omitted inherited fields, and still applies the effective default. | **Pass — Automated** | | R4 | Smart activation may skip trivial prompts and adaptive selection may use a proper subset. | `v05-host.spec.ts`: smart skip, adaptive proper subset, invalid-plan fallback; `service.spec.ts`: deterministic distinct role-scoped assignments when planning fails. | **Pass — Automated** | | R5 | Dependencies form a DAG; ready stages run concurrently and dependants receive bounded handoffs. | `v05-host.spec.ts`: cycle/order rejection, concurrent ready waves, dependant scheduling, and bounded structured handoffs; `run-center.client.spec.tsx` plus the release capture render the three-stage DAG. | **Pass — Automated + Capture** | | R6 | Quality review/repair is bounded to the configured reviewer, repair owner, and at most two rounds. | `v05-host.spec.ts`: `0/1/2` round bounds, durable live review/repair progress, cumulative usage; `run-center.client.spec.tsx` and release capture render two review rounds and the named repair owner. | **Pass — Automated + Capture** | | R7 | Foreground has a bounded synthesis handoff; background is durably accepted, observable, cancellable, and deduplicated. | `v05-host.spec.ts`: official Jobs integration/cancel, durable queued acknowledgement, delayed-start idempotency, process-local fallback, and bounded synthesis render. | **Pass — Automated** | | R8 | Delegated sessions cannot recursively dispatch teams, workflows, or unbounded descendants. | `service.spec.ts`: nested team rejection; `v05-host.spec.ts`: parent-scoped real compiled JSON Schema recognition for default and renamed subagent/workflow tools, minimal-preset interoperability, lineage guard, and duplicate human-message claim. | **Pass — Automated regression** | | R9 | Cancellation is consistent in the API result, durable run, and affected members. | `v05-host.spec.ts`: cancellation race normalization; `run-center.client.spec.tsx`: live dock and Run Center stop wiring; `smoke:browser`: retry then stop/terminal verification against the real RPC boundary. | **Pass — Browser + Automated** | | R10 | Orphaned planning/queued/running records become `interrupted` on restart. | `v05-host.spec.ts`: all orphan active states; `smoke:install` and `smoke:browser`: restart a legal active record and assert settled phase, member error/status, retry availability, and recovered controls. | **Pass — Browser + Runtime** | | R11 | Retry creates a linked immutable run; retention and clear do not rewrite prior results. | `v05-host.spec.ts`: exact plan/assignment/DAG replay, member-only retry, lineage, explicit count/age retention, immutable clear, and a 313-run/126-version upgrade fixture proving zero-default retention deletes nothing; `smoke:install`: export and clear; `smoke:browser`: linked whole-run retry. | **Pass — Browser + Runtime** | ## Usage, versions, and portable data | ID | Acceptance scenario | Evidence | Status | | --- | --- | --- | --- | | D1 | Planner, member, review, and repair Token buckets use official provider usage without invented currency. | `v05-host.spec.ts`: four-bucket attribution, primary/fallback attempt routes, full/partial/none sample coverage, live monotonic updates; `run-center.client.spec.tsx`: partial and unavailable rendering; Run Center/Insights captures show a 9,400-Token fully metered fixture. | **Pass — Automated + Capture** | | D2 | A soft team budget stops new scheduling while hard per-member `maxTokens` is preserved. | `service.spec.ts`: official Token projection and soft-budget scheduling boundary; `client-domain.client.spec.ts`: Host/Client durable numeric-bound parity. | **Pass — Automated** | | D3 | Team versions snapshot all referenced member definitions and restore only after preview. | `v05-host.spec.ts`: immutable member snapshots, affected-team preview, monotonic retention, stale-revision rejection; `settings.client.spec.tsx`: exact selected-version preview and restore. | **Pass — Automated** | | D4 | Recipe preview is read-only, reports conflicts/routes, and apply supports explicit copy/merge/remap. | `v05-host.spec.ts`: legacy/current formats, read-only preview, remap, rollback, stale revision; `settings.client.spec.tsx`: structured conflicts/routes, preview/remap/revalidate/import; `smoke:install`: real export→preview→remap→copy import; Browser gate rejects >4 MiB locally with zero RPC. | **Pass — Runtime + Browser** | | D5 | Definition backup remains backward compatible and never accepts credential fields. | `import-export.spec.ts`: versioned round trip; `v05-host.spec.ts`: replace impact, v0/v1 compatibility, credential-field rejection, atomic rollback; `smoke:install`: real export; Browser gate rejects >16 MiB locally with zero RPC. | **Pass — Runtime + Browser** | ## Web UX, accessibility, and release engineering | ID | Acceptance scenario | Evidence | Status | | --- | --- | --- | --- | | U1 | Teams, Members, and Recipes/Data provide selected-item editors, sticky save, validation, dirty guards, and preview-first destructive actions. | `settings.client.spec.tsx`: navigation/save/discard, external revision reconciliation, policy validation, restore/import previews, oversize guards, structured Recipe UX; `smoke:browser`: keyboard tabs, durable edit/save, and zero-RPC local rejection. | **Pass — Browser + Rendered** | | U2 | Composer loading, empty, disconnected, and error states are actionable rather than mysteriously disabled. | `composer.client.spec.tsx`: transient empty, no-team CTA, malformed response, timeout/retry, viewport placement; `client-controller.spec.ts`: reconnect/stale Host; `smoke:browser`: cold start and live restart recovery. | **Pass — Browser + Rendered** | | U3 | Run Center shows plan, DAG, members, quality, synthesis, time, Token buckets, and safe actions. | `run-center.client.spec.tsx`: detail polling/null safety, DAG/quality/four buckets, stop/retry/filter/export/clear, Insights coverage, live dock; `smoke:browser`: expansion/retry/stop/Insights; production captures reopen the complete rich run. | **Pass — Browser + Capture** | | U4 | Locale follows the official Harness locale service and updates live for English and Chinese. | `composer.client.spec.tsx`: a mounted Client registered through the typed official locale contract changes EN→ZH without reload; `release-contract.spec.ts`: manifest dependency contract; local RC5 Web upgrade verification switches the real Harness locale ZH→EN→ZH while Composer, Settings, and Run Center are mounted and observes all three update without reload. | **Pass — Browser + Rendered** | | U5 | Keyboard, focus, dynamic names, reduced motion, dark/light themes, and narrow layouts work. | Rendered tab/radio/dialog/scroll-region tests; `smoke:browser`: keyboard-only Composer/Settings/Run Center/Insights, focus restoration, reduced motion, light/dark token change, Axe serious/critical gate, panel viewport bounds, and 390×844 overflow check; `capture:readme` repeats Axe on all six surfaces. | **Pass — Browser** | | P1 | Type checks, tests, clean production bundles, and tarball closure pass on supported Node versions. | Node 24 and real Node 22.19 run typecheck, Host/Client tests, and clean build; `audit:pack` verifies API v3/no-v2, runtime/declaration closure, source maps, examples, governance, six PNGs, no symlinks/absolute paths/credential patterns, and exact package contents. | **Pass — Local matrix** | | P2 | One exact tarball installs into an isolated fresh `DSH_HOME`, Web boots, RPC responds, restart preserves state, and the same tarball passes browser smoke. | `smoke:install` and `smoke:browser` both consume the single audited `dist/dsh-agent-team-gui-0.5.0.tgz`; all user/config/cache/Git/npm roots and subprocess environment values are isolated. | **Pass — Runtime + Browser** | | P3 | The exact public revision installs successfully with the documented GitHub command. | The release workflow may accept a tag selector for checkout, but resolves it to a 40-character commit and installs `github:toolclub/dsh-agent-team-gui#`. The local smoke rejects tags and short SHAs. | **Post-push gate before tag** | ## Required documentation captures All captures come from the built release candidate, use representative non-secret data, and pass PNG, dimension, console/page-error, Axe, and relevant overflow gates. | Capture | Contents | SHA-256 | | --- | --- | --- | | `assets/v0.5-teams-settings.png` | Three-member team editor and progressive orchestration controls | `b2e362fb1dc7a210828e66918969ca389f6939e80da17788ec52f0d4caf2faf7` | | `assets/v0.5-composer-mode.png` | Team/Solo/Inherited and one-shot Composer control | `1ce6728c9abaf9a1ec3c17efe33946bdde35d18b995a5d7624b4ac825d304f8e` | | `assets/v0.5-run-center.png` | Three-stage DAG, four Token buckets, and two review/repair rounds | `3a66cbf26a2efd5f81f4ad817e95915ea74227a049d5694548a786fc9b58fd52` | | `assets/v0.5-insights.png` | Team/member/model/project aggregation and metering coverage | `a0ebb154ceac0703d46a9a4a0375cd0c9867d9263b445b651030dc5e51c1dffe` | | `assets/v0.5-recipes.png` | Human-readable conflicts plus primary/fallback route remapping | `d3ec39b253f7fbf5c998d0a3ffd107f145b7c1553ebd16c1144164f0af82c8db` | | `assets/v0.5-narrow.png` | Usable 390×844 primary Run Center path without plugin overflow | `8994a5a59c6b5879ac6a418ee0074b12e18c164ddfe84304e537fd31b2a245ae` | ## Evidence log - Candidate version: `0.5.0`; tag `v0.5.0` is created only after the post-push full-SHA gate. - Supported Node matrix: Node `22.19.0` and Node `24`; both pass typecheck, Host/Client suites, and clean production build on the final candidate. - Host/Client regression baseline: **116 Host** and **62 Client** tests (final Node 24 confirmation). - Isolated compatibility target: DeepSeek Harness `0.1.0-rc.6`, API version `3`. - Audited tarball: `dsh-agent-team-gui-0.5.0.tgz`, 82 entries. Its final byte count and SHA-256 are emitted by preflight and attached to the GitHub release rather than embedded here (a package cannot reproducibly contain its own checksum). - Browser journey: explicit/inherited/one-shot modes, project default, live Host restart, orphan recovery, Settings save, oversize zero-RPC guards, retry/stop, Insights, light/dark Axe, keyboard navigation, and 390 px layout all pass against that exact tarball. - Existing-profile upgrade: a real DSH `0.1.0-rc.5` profile reopened 3 members, 1 team, 313 runs, and 4 versions without re-saving or automatic retention loss; Solo→Team→reload→Solo→reload stayed enabled, and the live Harness locale switch updated Composer, Settings, and Run Center. - Screenshot capture is reproducible through `pnpm run capture:readme`; promotion uses same-directory temporary files plus rollback, while an operating-system kill remains outside process-level atomicity guarantees. - Supplemental `dsh-plugin-doctor` runs only in credential-free CI. Local preflight intentionally skips third-party executable code unless explicitly opted in.