v0.16.1
Added
-
hve-squad can now build its own GitHub Copilot plugin distribution. There was no repeatable way
to turn a releasedhve-squadtag into the treePeter-N91/hve-squad-pluginships — every prior
build was a manual, one-off assembly ofplugin.json,marketplace.json, and.mcp.json, with no
guarantee that a later regeneration wouldn't silently drop hand-authored fields.scripts/Build-SquadPlugin.ps1resolves either an immutable-Ref <tag>or a local-SourceRoot
dev build, and now ownsplugin.json,marketplace.json, and.mcp.jsongeneration end to end,
including an-McpVersionpin that reuses the existing@hve-squad/mcpversion when omitted and
refuses to guess one when no prior pin exists..github/workflows/publish-plugin.ymlwraps the
generator in a manual (workflow_dispatch) cross-repo publish step, failing closed when
HVE_SQUAD_PLUGIN_PUSH_TOKENis not configured rather than skipping the push silently.squad-src/.github/skills/squad/mcp-server.template.jsonis updated to match:@hve-squad/mcpis
now published to npm, the template pins an exact version instead of a bare@latestreference, and
documents why the pin is a deliberate, separate action from a content rebuild.
Changed
-
The release gate is Tier 0 only, and now says so. The behaviour contract described Tier 1 as
the release gate and told the reader the suite would be wired in "once it is green twice in a row".
It never was, so a reader comparingrelease.ymlagainst the contract found a gate the workflow
does not implement — andv0.16.0was cut on Tier 0 alone with nothing recording why.Tier 1 and Tier 2 are operator-invoked by design. The contract now carries the reasoning: they cost
Copilot requests and about an hour per cut; two of the three dispatched runs before0.16.0failed
because the contract asserted something the source did not say, so a gate on that record blocks
releases for test defects; and the defect0.16.0actually shipped sits behindmode=autopilot,
which no scenario exercises, so the gate could not have caught it. The conditions that would change
the decision are written down next to it (tests/squad-behavior-contract.md).
Fixed
-
A run reported ten dispatched roles over a
history/holding two files. An autopilot run on a
live repository produced research, a plan, an architecture, a council verdict, an IaC scaffold, a
cost model, a security review, a closing review, and a remediation — and left no
history/<agent>.mdfor any of the roles that supposedly produced them. The rule it broke is
stated in six files. Prose was not the missing ingredient, so three mechanisms replace it.The ledger's row set is now a function of
history/, not of the payload. The Scribe lists the
directory and writes that listing — one line per file with its block count — into the
### Derivationblock before any row, then writes a row for each enumerated file and for nothing
else. A role that left no file gets no row, so the eleven-row ledger that hid the gap is no longer
writable. A payload naming a role the listing does not comes back as a discrepancy in the Scribe's
confirmation note (scribe-procedure.md).The autopilot run summary now reports the gap itself.
## Stagesgains aDispatch Record
column filled fromhistory/, and a stage with no file carries— none recorded. Any such cell
forcesOutcome: incomplete (<n> stage(s) without a dispatch record). The Scribe is the only
writer of history, so it is the only participant that can say which stages actually ran — and the
coordinator's account of the run is exactly what cannot be trusted to say so
(entry-schemas.md,scribe-procedure.md).The per-stage gate is reachable again. Autopilot now hands off to the Scribe once per stage
rather than once per pipeline, andstate.jsonadvances per stage. The observed run collapsed a
fan-out, a security review, a closing review, and a remediation into a single turn, which left no
point at which stage N's missing history entry could block stage N+1
(squad-autopilot.instructions.md,squad-coordinator.agent.md). -
The contract could not see an invented ledger row.
carries no row for a role that was never dispatchedonly catches rows costed at zero, and every invented row in the observed run carried a
plausible figure.every ledger row has a history file behind itresolves each row through the
roster and requires one of its agents to hold a history file, which is the assertion that fails
that tree (tests/tier1/StateContract.Tests.ps1,tests/tier1/SquadState.psm1). -
Autopilot decided the Implement stage's shape from a list of seven role names. Deliverable
fan-out engaged only when the roster carried two or more ofanalyst,product-owner,designer,
experimenter,presenter,technical-writer,data-scientist— which isproductandfull,
and nothing else. Every other profile was classified as a singledeveloperbuild regardless of
what its roster actually owned.An
azureroster owns nine artifact roots. A live run produced a target architecture, an IaC
scaffold, a cost model, a security review, and a migration sequence — five specialist artifacts —
under a classification that says its plan is always a single build. It improvised a fan-out the
pipeline does not define, so none of the per-dispatch recording rules that belong to the fan-out
path applied: it reported ten stages and left nohistory/<agent>.mdbehind any of them.Fan-out now engages when the plan's deliverable list names two or more artifact-owning roles —
a roster row whoseDeliverable Rootnames a real path, counting every one exceptresearcher,
lead, andtester, which own the Research, Plan, and Review stages instead. The test is read
offteam.mdrather than off a profile name, so a consumer who edited a root or hired an extra
specialist is judged on the roster they actually have. A plan naming one candidate stays the
unchanged single-developershape, which is the ordinary case fordefault
(squad-roster.instructions.md,squad-autopilot.instructions.md,gates-and-modes.md,
squad-coordinator.agent.md,squad-lead.agent.md).The narrower term deliverable-producing role survives and now names one thing only: the roles
whose output the Implementation Gate treats as the turn's substantive output alongsidedeveloper.
That gate is unchanged.
Consumer install
Pin to this version:
apm install "Peter-N91/hve-squad#v0.16.1"