Skip to content

v0.14.0 - DSH integration + architecture deepening

Choose a tag to compare

@github-actions github-actions released this 14 Aug 00:01
· 9 commits to main since this release

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 on ctx.skills via registerProvider() + __dirname (the
    !!js evaluation scope has no require, so customSkillDirs cannot
    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 — adds dsh.bundle.patch +
    dsh-plugin/dsh-bundle keywords + main + lib in files[].

P2: MCP bridge (Issue #19)

  • packages/dsh-design-playbook/ — thin npm bundle package depending on
    design-playbook. Its cordis.patch.yml bridges preview + evidence
    MCP servers via @deepseek-ai/dsh-mcp-client stdio.
  • Path resolution uses process.getBuiltinModule('node:module') .createRequire(baseUrl).resolve(...) — DSH !!js scope has no
    require but exposes baseUrl (profile dir), so createRequire
    resolves design-playbook from the profile's node_modules.
  • DSH smoke verified: both MCP tools register + tools/call round-trip
    passes (preview returns "summary is required"; evidence rejects
    missing schemaVersion per ADR-0018 fail-closed).

P2: commands (Issue #20)

  • lib/index.js extended: inject grows 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 via agent.followup() (not inject() — slash commands
    are explicit user actions that open a turn).
  • DSH smoke verified: 6 commands register; /design-io <args> executes,
    handler calls agent.followup() with the substituted prompt; frontmatter
    stripped; $ARGUMENTS substituted; 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 returns confirmed=true + floor_pass=true, decision entry
    written to disk.

Architecture deepening

Binding digest unification

  • compute_binding_digest() moves to integrity.py as the single source
    for the binding shape (canonical JSON + SHA-256). transaction.py
    write side and load_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× in transaction.py. Pre-lock
    binding and in-lock TOCTOU re-validation share one function.

Action dispatch registry

  • _run_actions 75-line if/elif chain → _ACTION_HANDLERS dict 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
    from execute_capture_plan so 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.py imports from
    util.py). Dead _require_str() removed. type: ignore replaced
    with assert.