Releases: Bandersnatch0x/design-playbook
Release list
v0.20.0 - First-party UI/UX closed loop (vNext)
v0.20.0 - First-party UI/UX closed loop (vNext)
Released 2026-08-15.
Major: implements the complete vNext capability matrix resolved by Wayfinder
map #23 — interactive requirement shaping, tool-neutral design decisions,
dual-track implementation review, evidence gates, recirculation, and
cross-run learning — delivered as slices S1-S6 in one unified release
(PR #42). Spec authority: docs/specs/ui-ux-vnext/.
Tiered run profiles (process weight scales with consequence)
- Every run is graded P1 point-fix / P2 standard / P3 full by
declaration-touch surface, recorded in a mandatoryrun-profileblock at
the top ofplan.md; promotion is automatic, demotion is user-only. - P1 covers single-finding repairs (including line-level R2 backfills)
without opening a shaping session; P3 carries the full gate matrix.
Rule registry and governance
skills/design-playbook/references/rules.md: unified first-party
registry (13 entries — CRAFT-01..08 migrated with zero ID breakage,
A11Y-01/RESP-01 first-party, I18N/PERF/SEC placeholders), G8-validated at
product level and (per tier) at run level.- craft-guard detector tables migrate atomically to the seven-column
three-state format; the historical N/A contradiction is fixed by splitting
applicability from result. Historical run artifacts are never rewritten. rules-governance.jsonl: append-only governance log; promotion to
machine-enforced and exemptions are user-only decisions.- Learning candidates derive purely from run history
(3 distinct runs, 2 task contexts, 0 unexplained false positives).
Interactive requirement shaping
- Stateful S0-S6 session model with batched confirmation points
(question caps, forced-to-assume after two unproductive batches);
assumed fields age into mandatory questions after two acknowledged runs. - Session artifacts are append-only under
<run>/shaping/with an
alive→archived→discardable lifecycle; the contract stays the sole
persistent decision authority (zero-breaking v1 extension).
Dual-track review and evidence
- Product track (per-AC supported/unsupported/unverifiable), interaction
track (seven dimensions with a strict fact/judgment split — judgment
findings are advisory and never block without user escalation), and a
cross-cutting applicability matrix (accessibility + responsive in the
first version; placeholders never skip silently). - Six-block point-back report with coverage statements (G11) and
five-state×page sampling matrices (required at P3). - Manifest entries carry optional method-semantics keys; human-subject
evidence without population/ethics is quarantined and cannot support a
pass.
Recirculation machine-checked
- Repair-round counting with two-round stop → escalated-stop narration
(verdict values unchanged). - G12 tier-boundary gate reuses the G7 contract diff; tier violations
escalate the run instead of being waivable. - R1-R5 routing, DD supersedes re-entry, and baseline-drift re-review
narrate through run-status with minimal invalidated-evidence sets.
Design decisions (tool-neutral)
- decision-report deepens into versioned DD entry blocks behind the
unchanged Fill-facing header; exploration is tiered record/compare/explore
(R/C/E); providers are replaceable data-contract adapters whose assets
are reference-only.
Breaking
- Severity legacy values
high (blocking)|high|med|loware no longer
legal (two-stage migration completed; ADR-0028). Write the axis values
directly; re-checking pre-vNext run artifacts will correctly fail.
Verification
- Independent dual-track review (product + interaction + cross-cutting):
verdict Pass, zero blocking findings; four advisory findings fixed in-PR. - Full local matrix green (validate, doctor, run seam, 16 root suites,
MCP stdio groups, doc links); CIValidate pluginpass; dogfood P3
fixture passes the full chain under--strict.
v0.14.1 - Lockstep main and DSH publishing
v0.14.1 - Lockstep main and DSH publishing
Released 2026-08-14.
Patch: makes the public DSH bundle part of every stable release transaction.
One vX.Y.Z tag now drives both npm publishers and one shared GitHub Release.
Fixed release group
design-playbookanddsh-design-playbookpublish at the same version.- The DSH bundle depends on the matching
^X.Y.Zmain-package line. - Release, validation, and doctor diagnostics consume one shared lockstep
policy and fail before publication when either invariant drifts.
Ordered publication and verification
- The DSH workflow waits for the exact main-package artifact before it
publishes. - The main workflow waits for the exact DSH artifact and verifies its npm
provenance before creating the single GitHub Release. - Both packages continue to use separate npm Trusted Publisher workflows with
job-scoped GitHub OIDC and no long-lived npm token.
Recovery
- Fresh tag runs fail closed when an npm version already exists.
- Explicit manual recovery verifies an existing DSH package without
republishing it. - Shared GitHub Release recovery remains available after both registry
artifacts exist. - No new
dsh-v*tag is created; historicaldsh-v0.14.0records remain
unchanged.
dsh-design-playbook 0.14.0
dsh-design-playbook 0.14.0
Thin DSH bundle bridging design-playbook's preview + evidence MCP servers.
Depends on design-playbook@^0.14.0.
v0.14.0 - DSH integration + architecture deepening
v0.14.0 - DSH integration + architecture deepening
Released 2026-08-14.
Minor: DSH (DeepSeek Harness) plugin integration lands as a third install
surface alongside Claude Code and Codex. Six architecture deepenings
eliminate duplication across the preview and evidence runtimes.
DSH plugin integration (Issues #15-#20)
Three-phase integration: P0 skills softlink → P1 npm bundle → P2 MCP bridge
- commands. All three verified by real DSH boot smoke tests.
P1: npm bundle + skills provider (Issue #17)
packages/design-playbook/lib/index.js— Cordis plugin entry; registers
8 skills onctx.skillsviaregisterProvider()+__dirname(the
!!jsevaluation scope has norequire, socustomSkillDirscannot
point into package resources).packages/design-playbook/cordis.patch.yml— one bundle patch row
mounting the plugin by package name.packages/design-playbook/package.json— addsdsh.bundle.patch+
dsh-plugin/dsh-bundlekeywords +main+libinfiles[].
P2: MCP bridge (Issue #19)
packages/dsh-design-playbook/— thin npm bundle package depending on
design-playbook. Itscordis.patch.ymlbridges preview + evidence
MCP servers via@deepseek-ai/dsh-mcp-clientstdio.- Path resolution uses
process.getBuiltinModule('node:module') .createRequire(baseUrl).resolve(...)— DSH!!jsscope has no
requirebut exposesbaseUrl(profile dir), socreateRequire
resolvesdesign-playbookfrom the profile'snode_modules. - DSH smoke verified: both MCP tools register +
tools/callround-trip
passes (preview returns "summary is required"; evidence rejects
missingschemaVersionper ADR-0018 fail-closed).
P2: commands (Issue #20)
lib/index.jsextended:injectgrows to['skills', 'commands'];
apply()registers 6 slash commands (design-io,doctor,
run-review,run-status,ui-review,ux-spec).- Each handler loads
commands/<name>.md, substitutes$ARGUMENTS,
and injects viaagent.followup()(notinject()— slash commands
are explicit user actions that open a turn). - DSH smoke verified: 6 commands register;
/design-io <args>executes,
handler callsagent.followup()with the substituted prompt; frontmatter
stripped;$ARGUMENTSsubstituted; unknown commands rejected. - Full interactive round-trip verified: preview server starts on fixed
port, Chrome app window launches, HTTP POST auto-submits confirm form,
transaction returnsconfirmed=true+floor_pass=true, decision entry
written to disk.
Architecture deepening
Binding digest unification
compute_binding_digest()moves tointegrity.pyas the single source
for the binding shape (canonical JSON + SHA-256).transaction.py
write side andload_entry()read side both import it; G5 gate
_valid_decision_entry()consumes the same function. Three independent
implementations collapse to one.
Prototype resolution unification
_resolve_prototype()extracts the path/html resolution + digest
computation that was duplicated 3× intransaction.py. Pre-lock
binding and in-lock TOCTOU re-validation share one function.
Action dispatch registry
_run_actions75-line if/elif chain →_ACTION_HANDLERSdict mapping
do→ handler function. Each handler owns its validation + Playwright
call. Adding an action type adds a function + one entry, not an elif.
Evidence runtime-object validation
_validate_runtime_object()extracts url/type/state/actions validation
fromexecute_capture_planso the handler reads cleanly.
Preview server argument validation
_validate_preview_args()extracts the 6-field validation from
handle_preview_prototype.
Dead code + duplication cleanup
_log()duplication removed (capture_runtime.pyimports from
util.py). Dead_require_str()removed.type: ignorereplaced
withassert.
v0.13.0 - Architecture deepening (C1-C6)
v0.13.0 - Architecture deepening (C1-C6)
Released 2026-08-09.
Refactor-only minor: no new commands (inventory stays 6), no layout change —
six architecture deepenings that make the bundled runtimes, gates, and
imports single-homed. Behavior changes are narrow, sanctioned corrections
(see below); everything else is movement, not semantics.
Contract v1 lands atomically (C2, ADR-0018)
- Capture contract rules move into one package-internal module
mcp/evidence/capture_contract.py: write-sideparse_capture_contract,
read-sidevalidate_capture_snapshot, and the contract-fields JSON Schema
fragment the provider composes (const/enum/required share one source, so
schema and parser cannot drift). - G6 now validates bound manifest request snapshots through the same read
authority instead of hand-written partial checks. Sanctioned correction:
malformed viewport shape or missing freeze fail closed (was lax).
New rule IDsG6.capture_viewport_shape/G6.capture_freeze; existing
G6.capture_schema/G6.capture_viewportkeep wording.
Preview integrity deepens (C1, ADR-0008/0013)
- One read-only
mcp/preview/integrity.pyowns prototype digest, feedback
floor, current round, and confirm validity; G5 and run status consume the
same snapshot. run status aligns with G5 on Preview occurrence.
Stage registry (C4, ADR-0021)
scripts/stages.pyis the single home for named stage specs (SKILL.md step
mirror), regular resume actions, and the shared artifact names
(evidence/,manifest.jsonl,point-back.md,decision-report.md,
spec.md); run status and G6 share them, so the table and the names cannot
disagree.
Closed-loop gate split (C3, ADR-0023)
validate_run.py(1262 → 272 lines) is a thin orchestrator over focused
gate modules:g1_spec,g2_g4_pointback,g5_preview,
g6_evidence,g6_warnings, with shared ledger/manifest parsing in
g6_records. Rule IDs, messages, ordering, and exit codes remain unchanged.
Real import seam (C5, ADR-0022)
- Cross-runtime
sys.pathadapters (31) collapse to one package-root
bootstrap + absolutedesign_playbook.*imports;mcp/andscripts/
become importable packages. The duplicated rootscripts/run_status.py
dev copy is removed (one copy remains, in the package).
Preview versions collapse (C6, ADR-0024)
versions.pyno longer reaches through transaction's private seam: the
shared primitives (atomic write, directory lock, entry load, log render)
are transaction's public API, and the lock policy is one source
(DIRECTORY_LOCK_*) — no second lock namespace to desync.
Release-boundary notes
- Per ADR-0018, capture contract v1 ships as one merge/release boundary;
old unversioned run-local evidence requires recapture (no dual-read path). mainstays the stable channel (ADR-0015); this tag is the first surface
carrying the deepening branch.
v0.12.0 - vNext contracts + shallow preview control
v0.12.0 - vNext contracts + shallow preview control
Released 2026-08-08.
New commands and run machinery
- Packaged
run-statusanddoctorcommands (inventory grows from 4 → 6; ADR-0015 minor, not patch). - Persistent design contract v1 + structured G1–G6 diagnostics on the validate surface.
- G7 contract drift gate against the bound contract snapshot.
- Capture plan requires
schemaVersion: 1(fail-closed without it). - Orchestrator skill routes: load-map, first-run, a11y, and repair pointers (ADR-0016–0020).
Preview control interaction (Scheme A′)
Trusted parent control chrome (mcp/preview/control.*):
- Abort uses an explicit second-confirm popover (replaces 4s arm): fixed viewport positioning, Tab trap, Cancel / Esc / outside dismiss.
- Pill Revise is a real
/decidesubmit (not open-drawer only). - Pill Confirm keeps arm → confirm mis-tap protection (no one-click Approve; no fake
"LGTM"inject); Esc / outside click / timeout undo the arm. - Pill quick 1-line feedback (wide layouts only) shares state with the drawer textarea.
- Status chip focuses the feedback field; Ctrl/Cmd+Enter always routes confirm through
isSubstantive(ADR-0008 floor). - Visual tokens: control heights unified; float notes 999, bar 1000, drawer 1001; drawer
overflowno longer clips the abort popover.
G5 sandbox / iframe pin bridge / decision token paths are unchanged.
Dogfood
- Live HITL design-io dogfood
2026-08-08-vnext-livepass (confirm-round-2 + HTTP fill-host observe v1; G5/G6/G7 green).
Distribution
- Installable inventory: 8 model skills, 6 commands, 2 bundled MCP servers.
COMMAND_INVENTORYadmits the 0.12 command set explicitly (stable main channel).
Validation
python scripts/validate.py— VALIDATION PASSED- Seam + contract v1 + G7 + vNext integration +
vnext_live_dogfood.py preflight— green python packages/design-playbook/tests/test_floor_frontend.py— FRONTEND FLOOR TEST PASSED (incl. A′ scenarios)- Preview MCP suites (
test_browser_control,test_server_stdio) green
v0.11.1 - trusted publishing verification
v0.11.1 - trusted publishing verification
Released 2026-08-07.
Release automation
- npm publishing now runs from
.github/workflows/release.ymlthrough GitHub Actions OIDC and the package-scoped npm Trusted Publisher. - The workflow binds a stable SemVer tag to the exact
maincommit and package version before running release gates, the full test suite, and package inspection. - Registry availability and npm provenance are verified before the matching GitHub Release is created.
Security posture
- The GitHub
npmenvironment is restricted tov*release tags, and protected release tags cannot be deleted or retargeted. - No npm automation token is configured in GitHub; the trusted connection grants only the
npm publishaction.
Canvas interaction reliability
- New-anchor comment focus now completes synchronously, so a delayed callback cannot steal focus after the user moves to another control.
- The browser regression test deterministically covers immediate focus handoff followed by
Ctrl/Cmd+Zanchor undo.
Package compatibility
- Public contracts remain compatible with v0.11.0; this patch updates distribution metadata and fixes the Canvas focus race.
- Installable inventory remains 8 model skills, 4 commands, and 2 bundled MCP servers.
Validation
- Clean
origin/mainbaseline:python -m pytest -qpassed 190 tests plus 83 subtests. npm pack --dry-run:design-playbook@0.11.1, 53 files, 122.8 kB packed / 460.9 kB unpacked.
v0.11.0 — local canvas versions
v0.11.0 - local canvas versions
Released 2026-08-07.
New: local canvas version control
- Preview runs can create immutable named versions from committed decisions.
timeline()combines decisions and named versions in timestamp order, whilestate_at()replays historical state without mutating the active run.fork()derives an independent linear run from a selected historical round so exploration does not rewrite the source history.- Anchor v2 records stable node identity and structural features for more reliable feedback targeting.
Transaction integrity
- Preview writes are serialized across processes for the full transaction, including projection updates.
- Confirmation binds to the exact rendered candidate and fails closed when state changes or validation cannot be completed.
- Append-only decision and version records use atomic replacement and explicit committed-versus-projection failure semantics, preventing unsafe retries after durable commits.
- Prototype HTML and path modes are explicit, and browser-side undo preserves native comment editing while correctly removing canvas anchors.
Distribution
- Installable inventory remains 8 model skills, 4 commands, and 2 bundled MCP servers.
- The Preview MCP package now includes local version projections and the hardened transaction path.
- CI requires Chromium-backed canvas version-control end-to-end coverage.
Validation
- Release functional gates passed: version consistency, static validation, run seam, adapter floor self-check, and tag availability.
python -m pytest -q: 183 tests passed, plus 67 subtests.npm pack --dry-run:design-playbook@0.11.0, 53 files, 122.8 kB packed / 461.0 kB unpacked.
v0.10.0 — run review
v0.10.0 — run review
Released 2026-08-04.
New: cross-run run-review
- New fourth command,
run-review, reviews multiple user-side.scratch/<run>/Design I/O runs without becoming another step in a single run. - Markdown contract starts with
run-review/v1: inclusion manifest, per-run gate table, repeat-blocker frequency table, point-back citations, then row-derived rollup. - Runs without
point-back.mdare listed as skipped; fewer than two included runs refuse cleanly. - Gate status comes only from a real
validate_run.pyexit when that script is available; otherwise the report saysnot checked.
Integrity boundaries
- Repeat blockers use
observedtext after casefold + whitespace collapse, then char-for-char equality. Literal differences remain separate. _none_is a normal result. The command must not loosen normalization to manufacture repeats.- No new run ledger, prose lessons, baseline writeback, or semantic clustering.
tests/test_normalize_lockstep.pykeeps repo-sideaggregate_runs.normalize()aligned with the shipped command wording, while OPP-21 continues to count distinct runs rather than ledger rows.
Distribution
- Installable inventory: 8 model skills, 4 commands, 2 bundled MCP servers.
- Claude marketplace instructions now use the explicit public HTTPS URL. This avoids Claude Code 2.1.220 selecting SSH for
owner/reposhorthand on hosts without a GitHub SSH key. - v0.9.2 stable-main identity and version-to-command inventory enforcement remain intact.
Validation
scripts/validate.pyVALIDATION PASSED;scripts/doctor.pyDOCTOR PASSED;claude plugin validate --strictpassed.- Run seam passed; 54 repo unit tests passed.
- MCP gates passed: 27 shared transport/Preview tests, 8 Evidence pure-path tests, and 6 real-browser Evidence capture tests; frontend floor passed.
npm pack --dry-run:design-playbook@0.10.0, 50 files, 110.7 kB packed / 388.6 kB unpacked.
v0.9.2 — release-identity marker (stable main)
v0.9.2 — release-identity marker (stable main)
Released 2026-08-04.
Version-marker patch: no changes to the installable surface — skills,
commands, and MCP adapters are byte-identical to v0.9.1 (only the version
fields move). Cut so the version line carries a released marker for the
ADR-0015 stable-main restoration and the gate hardening that followed it.
Marked (repo-side, not in the npm/plugin tarball)
- ADR-0015 — stable main channel.
mainis the public install
surface; its version and installable inventory always equal the latest
formal release. The prematurely landed v0.10run-reviewcommand was
moved back tofeature/v0.10-run-reviewandmainrestored to the
v0.9.1 inventory (e5c9ed7). - OPP-01 — version-to-inventory invariant.
scripts/validate.pynow
fails whenever the shipped command set differs from what the plugin
version admits; the policy map lives in sharedscripts/_checks.pyand
scripts/doctor.pyderives its expectations from the same source. - OPP-21 — repeat-blocker counting.
scripts/aggregate_runs.py
counts a repeat blocker per distinct run, not per ledger row. - Release-checklist gate-1 count correction and ADR/ticket cleanups.
Validation
scripts/release.pygate green (tree / versions / validate / seam /
adapter floor);scripts/doctor.pyDOCTOR PASSED; full local suites
green; Ubuntu CI green on the source commit (b91879e).