Skip to content

v0.4.0 — Windows parity, lifecycle hooks, per-ticket workspaces

Choose a tag to compare

@cskwork cskwork released this 16 May 01:10
· 650 commits to main since this release

First release with day-one Windows support, a lifecycle hook surface, and a
per-ticket git workspace model. The 7-stage workflow becomes the supported
default (Todo / Explore / In Progress / Review / QA / Learn / Done), and
headless runs now leave a human-readable progress trail next to the board.

Highlights

Cross-platform / Windows

  • Windows dispatch pipeline end-to-end — quoting, path handling, and
    child-process spawning fixed so the standard symphony flow runs on
    Windows without manual workarounds.
  • Hook execution is cross-platform — hooks no longer assume a POSIX shell;
    test isolation hardened so the suite passes on Windows as well as macOS/Linux.
  • Host board sync on Windows uses a directory junction plus
    claude --add-dir so per-ticket workspaces still see the canonical
    kanban/ / docs/ / llm-wiki/ from the host repo.
  • Skill cross-platform compatibility reference under docs/skills/
    documents the platform contract for operators.

Lifecycle hooks

  • after_done hook wired into the orchestrator — fires once a ticket
    reaches Done with the workspace path, ticket id, and run context, so you
    can chain release, deploy, or notification steps without polling.
  • Hook failure output surfaced to the operator instead of being eaten
    by the runner — a failing hook now shows up in TUI/headless logs.
  • Operator pause persists across worker exit — pressing Shift+P (added
    in 0.3.4) now stays paused even if the underlying worker process dies
    and gets re-spawned, so paused work cannot quietly resume.

Per-ticket git workspaces

  • Default workspace is now a git worktree of the host repo, scoped to
    the ticket — agents work on an isolated branch by default.
  • One commit per ticket guarantee on the issue branch when work
    reaches Done, so every ticket leaves a single, reviewable diff.
  • Auto-commit and basesha are scoped to the workspace so a stale
    host-repo SHA can no longer poison a per-ticket commit.

Workflow / 7-stage default

  • seven-stage prompts become a first-class configuration with
    qa.boot, qa.regression_budget, and after_done exposed in
    WORKFLOW.md. The previous 5-stage layout is still loadable.
  • Review rewind on MEDIUM findings — Review now sends a ticket back to
    In Progress for MEDIUM-severity findings, not just HIGH/CRITICAL.
  • using-symphony skill updated to require copying docs/symphony-prompts/
    when bootstrapping a new board, so the 7-stage default actually takes
    effect on fresh installs.

Headless / observability

  • WORKFLOW-PROGRESS.md mirror — headless runs now mirror live state
    into a markdown file next to the board, so you can tail -f the
    progress trail (or watch it from another machine) without attaching a TUI.

Claude backend

  • claude success-result parsing fixed — successful runs are no longer
    occasionally classified as failures because of message-shape variance.
  • Continuation turn budget capped — runaway continuation loops are now
    bounded, protecting the per-ticket token ceiling.

Skills / docs

  • Operator skills discoverable from any CLI — using-symphony /
    symphony-oneshot resolve from any working directory, not just the
    symphony checkout.

Operator impact

  • New / changed WORKFLOW.md keys:
    • prompts: lane templates (7-stage default)
    • qa.boot, qa.regression_budget
    • after_done lifecycle hook
  • Per-ticket workspaces are now git worktrees of your host repo by default.
    If you depend on the old shared-workspace behavior, set the workspace
    flag back to the previous mode in your WORKFLOW.md.
  • Hooks must run on the platform you're operating from — review your
    shell assumptions if your hooks rely on POSIX-only features.
  • A successful Done run produces exactly one commit on the issue branch.

Verification

  • python -m pytest -q → 331 passed, 5 skipped
  • python -c "import symphony; print(symphony.__version__)" → 0.4.0
  • Local v0.4.0 tag and remote origin/v0.4.0 both point to 6a50526.

Commits in this release

  • `8939857 fix(orchestrator): make operator pause persist across worker exit`
  • `0b9a34f docs(skill): require copying symphony-prompts and preserve 7-stage default when bootstrapping`
  • `539dd0b refactor(skills): make operator skills discoverable from any CLI`
  • `7aaccb5 feat(review): rewind to In Progress on MEDIUM findings too`
  • `828d6ab feat(hooks): default per-ticket workspace to git worktree of host repo`
  • `3950952 feat(workspace): guarantee one commit per ticket on issue branch`
  • `4251be7 fix: surface hook failure output`
  • `713d955 fix: cap continuation turn budget`
  • `2f04865 fix: parse claude success results`
  • `838db1d feat(workflow): seven-stage prompts + qa.boot/regression_budget/after_done config`
  • `fbc0045 feat(hooks): wire after_done lifecycle hook`
  • `89be8ec fix(windows): cross-platform hook + test isolation`
  • `380ca4c fix(windows): unblock dispatch pipeline end-to-end`
  • `ad3c7d3 docs(skills): cross-platform compatibility reference`
  • `91b9dcc fix(windows): keep host board in sync via junction + claude --add-dir`
  • `abfcba1 fix(workspace): scope auto-commit and basesha to the workspace`
  • `4a4d20b feat(progress): mirror live state to WORKFLOW-PROGRESS.md in headless runs`
  • `6a50526 chore(release): bump version to 0.4.0`