Repository navigation
Releases: sohei56/maul-team
Release list
v2.0.12
What's changed
Audit convergence (G-1 / G-2, #106)
- New
.scrum/audit-ledger.json(schema +update-audit-ledger.sh): one entry per defect class keyed byaudit_identity, with structured occurrences,dec_id-verified exclusions, linked PBIs, and a detector with its own verification stamp. Status machineopen → sweeping → guarded/accepted → closedis enforced by the wrapper. codebase-auditreads the ledger, reuses identities byte-for-byte, transcribes every class and occurrence into the ledger before writing the report, files a detector PBI + sweep PBI for machine-checkable classes, and every AC carries a mandatoryNot closed by this check:line.- Guard-first detectors run as merge-gate errors:
run-detectors.shexecutes everyguardedclass's detector on the merged tree before the project regression command; violations or a broken detector recordmerge_failure.kind=detector_regression, rollmainback, and escalate at three strikes asmerge_detector_regression. smoke-test records adetectorscategory. A class can only becomeguardedthrough a wrapper check that proves the gate is actually wired. - Migration 008 seeds the ledger from existing audit PBIs.
Retrospective-filed defects (#104)
- #96: the design reviewer reads the PBI's acceptance criteria from
.scrum/backlog.jsonitself and everymissing_ac_mappingfinding carries the criterion text, the searched string, and the matching row. - #97: guard-type deliverables must demonstrate the failing direction (
negative:/positive:steps indemo_plan); Sprint Review and PO acceptance execute both;update-backlog-status.shwarns when a guard-shaped plan lacks one. - #93 (1): the three PreToolUse guards anchor on the project root (
$CLAUDE_PROJECT_DIR, else a marker walk) instead of the working directory, and fail closed when the root cannot be resolved. Decision A on #93 (2): the Bash text scan is a guardrail; its pattern set is frozen and pinned by a lint (#105).
Reliability and CI (#103)
- The documented
sh …/scrum-start.shlaunch now works on Linux (dash): the three entry points re-exec under bash, and internal launches usebash. - CI runs every integration suite and pytest, lints workflows with actionlint, and pins shellcheck v0.11.0 to match local runs.
sign-and-notarize.shretries notary polling on transient network errors and never retries a definitive Apple verdict; a keychain-profile run no longer exits 1 on success.- Instruction text that would write
.scrum/*.jsonwithout a wrapper is caught by a lint.
Documentation (#105)
- Public pages and READMEs state the current audit flow (severity-graded findings put to the PO; whole-repo audit every third Sprint). The requirements diary is folded into the requirements themselves. All 19 skills point at the canonical output discipline. pbi-merge forbids SM inspection actions during merge.
Upgrade notes
- Redeploy targets with
setup-user.sh;migrate-state.shruns migration 008 at launch and creates.scrum/audit-ledger.json. From then onadd-backlog-item.sh --audit-identitymust name a class present in the ledger (the error message names theupsert-classcommand to run). - New merge-failure kind
detector_regression(3 strikes →merge_detector_regression). Projects that never promote a class toguardedsee no behaviour change. - A target already in
sprint_reviewwhen it redeploys still needs asprint_acceptancedecision recorded (unchanged from v2.0.11).
Verification
bats -r tests/unit/ tests/lint/ tests/integration/: 1376 passedpytest tests/dashboard/: 41 passed- ShellCheck, Ruff, actionlint: passed
tests/integration/detector-merge-gate.bats: fake detector → merge rolled back →detector_regression→ third strike escalates
Full changes: v2.0.11...v2.0.12
v2.0.11
What's changed
- Slim the Scrum Master into a thin orchestrator (
agents/scrum-master.md528 → 170 lines) and add two SM-spawned bounded agents:scrum-explorer(read-only evidence for one question) andceremony-operator(runs exactly one ceremony skill). Liveness nudges are now self-describing (scripts/stall-watchdog.sh) with an autonomous-mode handoff (autonomous_liveness_handoff()); the in-agent cron self-poll is gone by design. - Show phase-aware agent progress in the status line (
scripts/statusline.sh). - Run the whole-repo
codebase-auditevery third Sprint;cross-reviewstill closes PBIs every Sprint. - Classify Integrity divergence deterministically: source-scoped Critical/High findings count as
increment, spec/doc lag assync_lag, so documentation catching up with a same-round design amendment loops the round instead of escalating (#92). Newresolve-integrity-fail.sh+lib/integrity-gates.shown the transition. - Raise the default stall thresholds to 30 minutes (
stall_watchdog.idle_threshold_minutes/pbi_idle_threshold_minutes) and document the external liveness-nudge contract indocs/contracts/agent-interfaces.md§ System: External liveness nudge (#95). - Accept
blockedPBIs at the review-phase Stop gate; the Sprint Review names each parked PBI with its blocker and decides carry-over vs. return-to-backlog (#94). - Add the
sprint_acceptancePO decision kind and thepo_acceptance_missingStop gate insprint_review; migration 007 strips blankevidenceentries from.scrum/po/decisions.jsonalongside the schema tightening. - Register the two new agents in
CLAUDE.md,docs/contracts/sub-agents.md,docs/architecture.md,rules/scrum-context.md; dedupe the Integrity resolver snippet.
Upgrade notes
- Redeploy targets with
setup-user.sh;migrate-state.shruns migration 007 at launch and warns (by decision id) about approval records whose evidence was blank. - A target already in
sprint_reviewwill hit the newpo_acceptance_missinggate until asprint_acceptancedecision is recorded viaappend-po-decision.sh. - Explicit
stall_watchdog.*values in.scrum/config.jsonstill win; only the defaults moved from 10/15 to 30 minutes.
Verification
- Unit + lint tests (
bats -r tests/unit/ tests/lint/): 1052 passed - Integration tests (all 9 suites): 70 passed
- ShellCheck, Ruff: passed
- pytest (
tests/dashboard/): 40 passed, 1 pre-existing failure unrelated to this release (fixed in the CI follow-up)
Full changes: #101
v2.0.10
What's changed
- Add reliable per-PBI pipeline health measurement using shared activity signals and the new
pbi-idle.shhelper. - Wire Scrum Master health checks to consistent idle-time reporting.
- Validate
statoutput before lock-staleness arithmetic to avoid false signals across BSD/GNU environments. - Report never-observed activity honestly instead of fabricating elapsed time.
- Exclude paths inherited from merged
mainwhen calculating PBI diffs.
Verification
- Unit tests: 878 passed
- Lint contract tests: 106 passed
- Integration tests: 19 passed
- ShellCheck: passed
Full changes: #89
v2.0.9
Sprint-end audit: graded findings, full PO adjudication, suppression that persists
- Findings are now rated on a canonical 3-level scale —
critical(a bug that prevents the spec from being met),high(spec met, but future harm),low(need-not-fix) — stored in a machine-readableaudit_severityfield on backlog items instead of only the PBI title. Migration 006 back-fills existing audit PBIs (legacy Medium maps tohigh, which can newly block Integration-Sprint entry). - Every finding goes before the Product Owner with a plain-language, decision-ready brief; nothing is filed behind the PO's back and nothing mandatory-tiers past them.
defer/rejectverdicts are persisted per finding; arejectsuppresses re-filing across Sprints and lapses only when a later audit rates the class strictly higher. Suppressed criticals are named out loud at the Integration gate. - In human-PO mode the Scrum Master records the human's verdicts on their behalf, so suppression works identically in both modes.
Specs describe the present
- New catalog Governance Rule 8: spec bodies are current-state-only; history lives in frontmatter
revision_history, D-001 ADRs, and the decision log. Live backward-compat paths and migration version ranges are explicitly not history. - The audit detects history contamination repo-wide (new Axis A class 5) and routes it through spec adjudication → change-process; the docs-consistency reviewer blocks new contamination at merge time.
- New audit Step 4c backfills every answered spec clarification into the clause at Sprint end, so an ambiguous spec is fixed once instead of re-asked every Sprint.
Retrospectives can improve the framework itself
- New
draft-framework-issue.shdrafts a sanitized GitHub issue for this repo when a retrospective finds a framework-attributable bug or improvement: postable body and local metadata are separate files, four mechanical sanitizer checks reject target-project identifiers/paths/tokens (no--force), and repeat findings bump an occurrence count instead of drafting twice. - Posting always requires an explicit human "yes" after reading the full draft; autonomous runs queue drafts in the attention file and never post.
- The deploy stamp now records
framework_originso target projects can address this repo without network access.
Fixes
- Every documented bats invocation is now recursive (
bats -r); the non-recursive form silently skipped 658 of 930 tests locally. The CI ShellCheck glob and the schema-pairing gate were missing the same class of subdirectory coverage and are aligned. - Cross-Sprint audit dedup keys on the
audit_identityfield instead of description text; PBI worktrees can fork from an explicit base; the changelog page's v2.0.8 "Fixed" badge class now matches the CSS.
🤖 Generated with Claude Code
v2.0.8
Maul Team for Mac v2.0.8
Reliability release. No Mac app UI changes — everything here is in the
bundled framework.
A whole-codebase audit (8 read-only axes, 81 raw findings, ~71 distinct)
turned up 12 real bugs. Six of them were invisible from inside the
framework repo: they only fire in deployed target projects, which is why
the test suite stayed green throughout and CI never caught them. The
framework repo is immune to each for a structural reason — files are
git-tracked here, and the guards under discussion are deliberately not
registered here — so the masking was systematic rather than incidental.
The phase/path guard was inert in every deployed project (#85)
hooks/status-gate.sh emitted a top-level {"decision":"allow"|"deny"}.
Claude Code's top-level decision enum is ["approve","block"] —
allow/deny belong to the nested
hookSpecificOutput.permissionDecision. The object failed schema
validation, no permission decision was applied, and with no exit 2 path
the tool call proceeded.
Unenforced as a result: "only pbi-designer may write
docs/design/specs/", phase-based source-write gating, catalog.md
read-only, and catalog-config enablement.
The tell was in-repo: hooks/lib/validate.sh calls exit 2 "the Claude
Code hook deny convention", all five other guards use it, and
status-gate.sh's own header comment described the contract it did not
implement. Verified against the shipped binary (2.1.220).
The allow path deliberately stays a bare exit 0 rather than
{"decision":"approve"} — an explicit approve would bypass the user's
normal permission prompt for every Write/Edit.
Also: Claude Code matchers built only from [A-Za-z0-9_|, -] take the
exact-name membership branch, not a regex branch, so "Write|Edit" never
substring-matched NotebookEdit. All three PreToolUse guards now name the
notebook tools explicitly, in both settings surfaces.
Two breaking schema changes shipped with no migration (#85)
Both affected files sit in migrate-state.sh's blocking STRICT_MAP,
so an affected project hard-failed launch at exit 65 and the team never
spawned — with no documented repair.
003-drop-improvement-category.sh—e1958ecremovedcategoryfrom
improvements.schema.jsonunderadditionalProperties: false. Its own
commit message said "Existing state files must be migrated (strip the
key)"; none was written.004-drop-pbi-state-phase.sh—001-legacy-to-ssot.shskipped per-PBI
files on the stated grounds that "projects in flight legitimately carry
richer fields", which contradictsadditionalProperties: false. A v1
file still carryingphaseblocked the launch gate.
Each migration's first test asserts the pre-migration file is genuinely
rejected, so the launch-block is proven, not assumed.
Cross-model review was unreachable from PBI worktrees (#85)
Reviewers cd into .scrum/worktrees/<pbi-id> before sourcing
codex-invoke.sh, and a worktree checked out at sprint.base_sha cannot
see untracked files from the main working tree. In any project set up by
setup-user.sh, the source failed and every codex second opinion reported
itself "unavailable" — for an entire Sprint at a time.
The helper now deploys to .scrum/scripts/lib/, which is symlinked into
every worktree. This also stops setup-user.sh scattering four
framework-repo-only helpers into the target's scripts/ tree, where a
plain cp could clobber a same-named file.
Gates that passed vacuously (#85)
- Pragma audit.
jq -r '.pragma_pattern'yields JSON text for the
schema-sanctioned object form and the literalnullwhen the key is
absent. Either matches nothing, andallover an empty array is true —
so the pragma leg of Definition of Done was a silent no-op. All three
shapes are now handled explicitly and an unresolvable one fails loudly.
Narrowing the schema instead was rejected:config.jsonis in
STRICT_MAP, so that would have created a third launch-brick. c0_threshold/c1_thresholdwere mandated by four documents but
declared in no schema and in no example config — a typo silently
reinstated the 100% requirement.
Stalls, duplicate work, and dropped events (#85)
- A dead Developer teammate stranded its PBI at
escalatedwith a null
reason, so the handler never wroteescalation-resolution.mdand
completion-gate.shblocked every subsequent SM Stop. Adds the
teammate_unrecoverableescalation reason end to end. session-context.shreported merge-queued PBIs as active pipelines (the
in_progress_mergeexclusion its two sibling copies carry was missing),
triggering duplicate Developer re-spawn.session-context.shechoedhookEventName:"PostCompact", which is not a
member of the hook output union, so post-compaction context was silently
discarded.json_update_atomictook no lock on a read-modify-write that
dashboard-event.shruns on everyPostToolUsefrom every concurrent
agent; a droppedsubagent_stopinflatedcount_in_flight_subagents
into a spurious "N subagent(s) still running — do NOT re-spawn".pbi-mergecollapsed preflight refusals (64/65/67) with real conflicts
(exit 1), so the SM told a Developer to resolve conflicts in a worktree
that had none while the actual remedy sat in discarded stderr.
Hardening and hygiene (#85)
- All 23 scrum-state wrappers now resolve schemas through
lib/atomic.sh::resolve_schema_dirinstead of an inline probe that used
only its first candidate, with no$PWDfallback and no diagnostic. - The four top-level contract schemas under
docs/contracts/, which
nothing validated, gain fixtures and 13 tests — valid fixtures must
pass and invalid ones must be rejected. A drift guard asserts every
criterion_keya reviewer declares is in the envelope enum, the exact
defect1b2d9aafixed by hand. Both guards were mutation-tested. - Stale references,
flock-vs-mkdirlock drift in four places (the
difference is load-bearing: a mkdir lock does not auto-release on process
death), undocumentedStopFailure/PostCompacthooks, the missing
retrospective → completephase edge, and ~158 lines of duplicated prose
collapsed to pointers. Deliberate duplication was left intact and
documented as such. - Target-project Sprint identifiers removed from three files, per this
repo's own no-private-project-references rule.
Upgrading
Existing projects pick all of this up on the next scrum-start.sh launch:
the two new migrations run automatically and idempotently before the team
spawns. No manual step.
Verified: shellcheck clean · ruff clean · 715 tests green
(unit+lint 225, scrum-state 445, integration 45).
Full diff: #85
v2.0.7
Maul Team for Mac v2.0.7
Feature release: the Mac app gets browser-style project tabs and now
taps you on the shoulder when Claude is waiting for your answer, and
the bundled framework starts big projects in seconds instead of
minutes and no longer stalls overnight.
Mac app: tabs for every running project (#83)
- The workspace toolbar now shows a folder-style tab strip with
every project that has a live session, including ones running in
the background. Click a tab to switch; the × stops that session
(after a confirmation). The Projects button just takes you back to
the picker — sessions keep running, no more leave dialog. - Switching directly between two projects rebuilds the dashboard and
file tree for the one you land on, so you never see stale state.
Mac app: know when Claude needs you (#83)
- When Claude asks a question or waits on a permission prompt in any
tab, that tab shows an orange badge — and if the tab isn't the
one you're looking at, a macOS notification banner appears with
what Claude actually asked, not a generic "waiting" message.
Clicking the banner jumps straight to that tab. One banner per
question — no repeat nagging. - Under the hood, the bundled framework records "waiting for the
human" state to.scrum/attention.jsonvia a new Notification
hook, so any external UI can consume the same signal.
Bundled framework: fast launches on big backlogs (#83)
- Projects that have accumulated hundreds of PBIs no longer wait
minutes at launch: per-PBI state validation now runs as one
batch instead of one process per file — measured 233s → 5s on
a 260-PBI project. When something is actually invalid, the
launch still names every offending file exactly as before.
Bundled framework: no more silent overnight stalls (#83)
- Two real unmanned stalls (63 minutes and 8.6 hours) traced to a
deadlock where a Developer waited forever on a notification from a
finished sub-agent. The pipeline now always re-spawns sub-agents
fresh instead of resuming them, and the Scrum Master runs a
10-minute health check that probes a quiet pipeline and
re-spawns confirmed-dead work instead of watching and waiting. - All Scrum agents also adopt Opus 5 output discipline: tighter
reports and decisions everywhere, with an explicit guard so
reviewers stay concise without ever dropping findings.
Site
- The landing-page hero mockup catches up with the shipped app (tab
strip, detached editor windows) and no longer jitters vertically
while its animation loops.
Update channels
Sparkle in-app auto-update, Homebrew tap, and direct DMG download —
existing v2.0.6 installs should be offered this update automatically.
v2.0.6
Maul Team for Mac v2.0.6
Feature release: the bundled Scrum framework's Sprint-end audit now
converges instead of refilling the backlog forever, and the landing
page speaks Portuguese.
Bundled framework: audit sweep-to-zero (#80)
- The Sprint-end
codebase-auditnow files one PBI per defect
class, swept to zero: auditors must search the whole repo for
every instance of a defect class before reporting, and the filed
PBI's acceptance criteria carry the full occurrence list plus a
re-runnable zero-check — fixing one site of a repo-wide pattern no
longer counts as done, and the same class can no longer resurface
Sprint after Sprint as "new" findings. - All documentation-drift findings (stale docstrings/comments,
spec-text drift) collapse into a single per-auditDOCSbatch PBI
instead of a spread of fine-grained doc-fix PBIs that drag Sprint
velocity. - A class recurring after being swept to zero is flagged by the
existing[REGRESSION]mechanism; the integration-entry
Critical/High gate is unchanged.
Site & licensing
- Landing page adds Portuguese (pt-BR) — now eight languages.
- License wording reserves room for a future paid Enterprise tier
(no change to current terms: framework MIT, app commercial).
Update channels
Sparkle in-app auto-update, Homebrew tap, and direct DMG download —
existing v2.0.5 installs should be offered this update automatically.
v2.0.5
Maul Team for Mac v2.0.5
Maintenance release: the bundled Scrum framework picks up the
2026-07-19 cleanup-audit fixes, and the app docs catch up with the
current editor.
Bundled framework fixes
- Status line no longer counts cancelled PBIs in Sprint totals — a
Sprint with a descoped PBI now reaches N/N. - The escalation handler gains the missing
kind_mismatchresponse
(reclassify / strip / park), and escalation writes are
reason-first everywhere, soescalatedis never observable
without a recorded reason. - Contract docs (Stop hook, TaskCompleted gate, state writers)
re-synced with the implementation; duplicated shell helpers
consolidated and mirror drift is now pinned by lint.
App & docs
- macapp README rewritten for the CodeEditSourceEditor +
detached-window editor (macOS 14+, Xcode 16+, Swift 6). - New hero screenshot from the current build; site copy updated in
all seven languages.
Update channels
Sparkle in-app auto-update, Homebrew tap, and direct DMG download —
existing v2.0.4 installs should be offered this update automatically.
v2.0.4
Mac App
- In-app auto-update (Sparkle 2) — the app now checks for updates itself (with your consent on first launch) and installs them in place; a "Check for Updates…" menu item is also available. Updates are verified with an EdDSA-signed appcast. Note: auto-update delivers future releases — existing installs pick this version up via the dmg or
brew upgradeone last time. - Editor overhaul — the file editor is rebuilt on CodeEditSourceEditor with tree-sitter syntax highlighting; detached windows are now the sole editor surface.
- Editor view options — a view-options popover with custom indent guides.
Requirements
- Minimum macOS is 14 (Sonoma) — now stated correctly in the README and landing page (the app has required it since the previous release; the Homebrew cask already enforced it).
- Building from source now needs Xcode 16+ (Swift 6 toolchain).
Licensing
macapp/THIRD-PARTY-NOTICES.md lists all bundled components. CodeEditLanguages / CodeEditSymbols currently publish no upstream license grant; they are flagged UNRESOLVED there while clarification is pursued upstream.
🤖 Generated with Claude Code
v2.0.3
Highlights
This release fixes a silent deploy failure that let targets run current skills against stale .scrum/scripts/ wrappers, plus the framework-upgrade safety net that keeps it from ever recurring.
Fixed
- Space-safe deploys (#70):
setup-user.sh'scopy_treeword-split its glob, so a framework under a path containing a space — exactly the Mac app's extracted bundle in~/Library/Application Support/MaulTeam/— silently deployed nothing for agents, hooks, rules, and.scrum/scriptswrappers while skills kept updating. All deploy classes now copy correctly from any path. - Content-keyed framework extraction (#71): the Mac app keys its extracted framework on the bundled commit (
framework-<version>-<rev>), so a rebuild at the same version can no longer serve a stale extraction; older caches are swept automatically.
Added
- Upgrade safety (#70): every launch now clean-slate redeploys the wrappers, runs all idempotent state migrations with a hard launch gate (
migrate-state.sh), and stamps the deployed framework revision into.scrum/deploy-stamp.jsonfor staleness diagnosis. The status enum is derived from the deployed schema instead of being hardcoded. - Regression tests deploying end-to-end from a spaced, git-less framework copy; CI now runs the full recursive bats suite and the macapp Swift tests.
Upgrading
Install this build and reopen your project — the next launch fully syncs the deployed wrappers. PBIs already refined before the upgrade are not retroactively gated: if a kind=code PBI is missing demo_plan, set it via .scrum/scripts/set-backlog-item-field.sh <pbi> demo_plan '<how to demo locally>'.
🤖 Generated with Claude Code