v0.4.0
Immutable
release. Only release title and notes can be modified.
Added
- Parallel groups — concurrent role execution as a single compiled node. A
workflow may declareparallel_groups(an array of arrays of role names, each
group with>= 2members). The members run concurrently
(Promise.allSettled) as one compiled group node. They must not depend on each
other (no sibling edges), cannot bekind: "scoring", and must share the same
donesuccessor — all validated, with abad_parallel_grouperror on
violation. If any member emits an interrupt/terminal event
(error/question/waiting/needs_review) or fails hard, that event
propagates and halts the run (highest-precedence wins) rather than being
swallowed.run-manifest.jsonrecords theresolved_parallel_groups. - Coverage ingestion — structured coverage from command roles. A command
role'sparser.coverage.formatacceptsc8-json,lcov,jest-json,
cobertura,clover, orregex(theregexformat requires apctcapture
pattern). After the command exits, the runner reads the declared coverage file
(path-confined, 4 MB cap) and fillsevaluation.coverageas
{ overall_pct, by_command }—overall_pctis the arithmetic mean across
contributing commands. An unknown format is rejected at validation
(bad_command_spec). - GitHub issue tracker backend. Set a tracker
kind: "github"with
owner/repo/token(plus an optionallabel, defaultmaestro). It polls
the REST API for labeled open issues and performs write-backs (comment, close,
add-label), staying rate-limit aware. - Inbound webhooks.
POST /api/v1/webhook/:kindacceptsgithub
(HMAC-SHA256 signature viawebhook_secret, verified timing-safe) and
generic(bearer token viawebhook_bearer_token, verified timing-safe).
The body is capped at 1 MB. Awebhook_template(with{{payload.path}}
interpolation) renders the dispatched task title; the task is created against
the configuredworkflow. - Outbound lifecycle notifications. A
notifyconfig
{ on: [...events], url, format }(format: "slack" | "generic") fires
best-effort POSTs oncompleted,halted, andapproval_needed. It never
throws and makes one attempt per event. - Real mid-run cancellation. Cancelling a task now aborts the in-flight run
at the next step boundary (viaAbortController), sets statuscancelled, and
stampscancelled_atinrun-manifest.json. Previously cancellation only
updated bookkeeping.
Changed
- Correctness scoring now blends coverage. When a workflow produces
evaluation.coverage.overall_pct,correctness_scorebecomes the mean of
pass_rateandoverall_pct / 100(waspass_ratealone). MIGRATION NOTE:
workflows that opt into coverage parsing may seecorrectness_scoredrop even
at a 100% pass rate — check anymin_correctnessgate. Workflows without
coverage parsing are unaffected. require_distinct_revieweris now default-on. When absent it behaves as
true, but for this release it emits a WARNING (non_distinct_reviewer)
rather than an error; it becomes a hard error in v0.5.0.
Deprecated
experimental_per_edge_contextgraduated to the stable key
per_edge_context. The old key still works but emits a deprecation warning —
rename it.require_distinct_reviewer: falseis deprecated. The check defaults on in
v0.4.0 and becomes required in v0.5.0.
Notes
- Role Convention doc no longer pitches Maestro as the
plan → execute → reviewpipeline.docs/role-convention.mdnow frames that flow as just the
stock graph, consistent with the README's positioning. Documentation only — no
behavior or API change.