Releases: Peter-N91/hve-squad
Release list
v0.17.0-pre (rolling preview)
Rolling preview — not a release.
Rebuilt on every merge tomain. Ships asv0.17.0when a maintainer cuts the release.
The tag moves, so re-run the install command to pick up the newest build.
0.17.0 - 2026-09-05
Added
- The documentation never pointed to the MCP server or the Copilot CLI plugin. The home page mentioned
hve-squad-mcpin passing with a bare GitHub link, andhve-squad-pluginwas absent from the site and the README entirely, so a consumer had no path from this repository to either sibling's documentation. Added an Ecosystem page (docs/ecosystem.html, wired into the navigation and pager across the site) covering what each of the three repositories is, which surface to use for which host, the MCP server's two execution modes and its tool set, the plugin's install-as-a-pair rule and its two update rules, and how releases stay aligned. The home page's companion section now covers both siblings with links to their GitHub Pages sites, andREADME.mdgained a Related repositories table (docs/index.html,README.md).
Changed
-
hve-core@8692fe3 renamed the entire data-science skill pack and retired the
Supply Chain Revieweragent outright.ds-catalog,ds-analysis-authoring,ds-dataops,ds-evaluation-design, andds-feasibilitymoved under.github/skills/data-science-engineering/asdata-catalog,analysis-authoring,dataops,evaluation-design, andfeasibility;Squad Data Scientist(squad-src/.github/agents/squad/squad-data-scientist.agent.md) andSquad Prompt Engineer(squad-src/.github/agents/squad/squad-prompt-engineer.agent.md) now route to the renamed skills, andsquad-roster.instructions.md'sdata-scientist/prompt-engineerrows and Deferred Reviewer-Class Agents table were updated to match —Data Workstream Coachis described generically as the non-dispatchable coach orchestrator its successorData Science and Engineering Coachnow ships as, and the removedSupply Chain Reviewerrow was dropped in favor of a note thatSSSC Planner/Supply Chain Skill Assessoralready cover its ground. No squad-owned charter or doc page needed a new agent;apm.ymlis regenerated and repinned to8692fe38cc0415ff8d21aa1b5d8198f008cd4038. -
Updated hve-core dependency pin to
c7ee5b9(c7ee5b9642ab1877a6b5ce5336ebc448b89b2708). -
Updated hve-core dependency pin to
b7f8a7e(b7f8a7e8b79694812ea89a46c6517d7ae6050d0b). -
Updated hve-core dependency pin to
b972914(b972914964965b00e40e3a65f42e592fe3885a1a). -
Updated hve-core dependency pin to
48a7bfd(48a7bfd14cea8b5122c1ba3c17eb0a7fdb28809d).
Fixed
- An installed
hve-squad-hve-coretree could not be proven to match the commit its marketplace entry pins.config.jsonrecords a content digest rather than the git commit SHA-1, and itsversioncomes from upstream hve-core's ownplugin.json, socopilot plugin updatereports 'already at latest' even when the pin moves. Addedscripts/Test-HveCorePin.ps1, which recomputes the git blob SHA-1 of every installed file against the pinned tree, and rewrote the marketplace description inscripts/Build-SquadPlugin.ps1to say the plugin replaces the official hve-core plugin rather than sitting beside it, and must be refreshed with uninstall-then-install.
Consumer install
Pin to this version:
apm install "Peter-N91/hve-squad#v0.17.0-pre"v0.16.2
Changed
-
Updated hve-core dependency pin to
3050cf5(3050cf5e609d50ec171cb4d657f0f4bc988e8982). -
Updated hve-core dependency pin to
7cc6dc4(7cc6dc42caf7f842e1f7aa9f3d41cb4581538f33).
Fixed
-
The published plugin marketplace could pair a release with an hve-core commit it was never
validated against. The generatedmarketplace.jsoncarried a singlehve-squadentry and
autoUpdate: true, leaving hve-core to be installed separately from its own source — so a
consumer resolved whatever was current upstream rather than the commit the installed squad
version's routing tables and role charters were built against.Build-SquadPlugin.ps1now emits a secondhve-squad-hve-coreentry whose commit SHA is read
from the built ref's ownapm.yml, so each release publishes the exact hve-core pin its
cast-delta guard validated —v0.16.1resolvesb1cae50,v0.16.2-preresolves3050cf5,
with no manifest hand-editing.autoUpdateis dropped deliberately: the two entries are a
matched pair, and an unattended update of one without the other reintroduces the same skew.publish-plugin.ymlgains an optionalmcp-versioninput so a publish can bump the
@hve-squad/mcppin in the same run; omitted, the existing.mcp.jsonpin is reused rather
than silently advanced. -
The plugin distribution shipped a partial rule set, and the squad dispatched an off-roster
role because of it. The generator distilled fifteen instruction files into ten reference files
by hand. Five had no destination at all —squad-routing, the discovery and intake gates,
notifications, and watch mode — sosquad-routing's Tracker-Write Gate ("when the active
roster does not carrybacklog-executor, propose adding it") and the roster's "never
self-fill an absent role" reached no plugin file. A federation sub-squad asked to write its
backlog to Azure DevOps dispatchedSquad Backlog Executorand wrote its history without ever
adding the role toteam.md, because in the plugin no rule said otherwise.Three further reference files (
floor.md,mcp-capability.md,notifications-and-watch.md)
existed only as hand-written files insidehve-squad-plugin, with no source of truth here and
no generator step authoring them — one of them the target of a citation the generator emitted
on every build.Build-SquadPlugin.ps1now ports every instruction file verbatim into
skills/squad/references/rules/, builds the citation index from what it ported rather than
from a hand-maintained map, and rewrites the directory-level prose that told the coordinator
its rules live under.github/instructions/squad/in a distribution that ships no such
directory. A new instruction file now reaches the plugin without anyone remembering to map it.A build-time conformance check fails the build — rather than warning — when a generated file
cites an instruction path the plugin does not ship, cites askills/target no step authored,
or when anything underagents/orskills/was not authored by the run. Every defect it
catches is invisible at run time: a dangling citation reads as a working reference, and a
hand-written orphan is indistinguishable from generated content while it drifts. -
squad-researcher.agent.mdcited an hve-core instruction under the squad namespace.
untrusted-content-boundary.instructions.mddeploys to.github/instructions/, not
.github/instructions/squad/, so the citation resolved to nothing in the package as well as in
the plugin.
Consumer install
Pin to this version:
apm install "Peter-N91/hve-squad#v0.16.2"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"v0.16.0
Added
-
The squad ran in VS Code and had no entry point anywhere else.
/squad-document,
/squad-governance-report, and/squad-learnexisted only as prompt files, which the Copilot CLI
and the Copilot app never read. All three now ship as agents selectable on any host, with their
prompts reduced to thin wrappers so VS Code keeps its slash-command ergonomics
(squad-src/.github/agents/squad/). -
A dispatched agent could run without the squad's non-negotiable rules. Every squad instruction
file is gated on**/.copilot-tracking/squad/**, so an agent that had not yet touched squad state
ran without them. A newsquad-floor.instructions.mdis scoped**and carries dispatch
discipline, the single-writer Scribe rule, the state paths, and proof of dispatch on every turn
(squad-src/.github/instructions/squad/squad-floor.instructions.md). -
Consumers discovered host limits by hitting them. The usage guide now documents per-host
invocation, the agent-name convention, the four remaining host limits, and why a fixed session model
beatsautowhen cost attribution matters (docs/usage.html). -
Nothing checked that the package a consumer installs is internally consistent. A Tier 0
conformance suite now asserts against the delivered tree: rosters resolve to delivered agents or
registered opt-in external ones, claimed skill references exist, agent bodies fit the host cap,
prompts bind to a real agent or a reserved host mode, the always-on floor ships with
applyTo: '**', and every squad artifact is declared inapm.yml. It invokes no model and reads
no secret, so it gates pull requests as well as releases
(tests/tier0/,.github/workflows/tier0-conformance.yml,tests/squad-behavior-contract.md). -
A pull request branch cannot be installed, so it could not be tested. The manifest's
self-references are bare paths, so APM resolves them against the default branch and reports every
file a branch adds as missing. Tier 0's source mode installs the manifest, then overlays the
branch'ssquad-src/on top, which is the tree that branch would deliver once merged
(tests/tier0/Invoke-Tier0Tests.ps1). -
That workaround still aborted on the branches most worth testing. A branch that adds a
squad artifact makesapm installexit non-zero, and source mode threw before a single case
ran — so any additive branch reported nothing rather than a result. Source mode now tolerates
an install failure only when every unresolved reference names a file present in the working
copy, which is precisely the file the overlay is about to supply. A failure naming anything
else still aborts (tests/lib/SquadInstall.psm1). -
Nothing verified the state a squad run leaves behind. A Tier 1 state contract now asserts the
files Init seeds, the shape ofstate.json, dispatch history as proof a stage ran, and the
consumption ledger's arithmetic — that every cost follows from its tokens and rates, that rates
matchconsumption-rates.md, and that the run total is the sum of every recorded block rather than
of the latest turn alone. The runs are nondeterministic; the assertions are not, because they read
files. A self-check generates a schema-correct fixture and then mutates it once per rule, requiring
the contract to catch each break — a suite that cannot fail is not evidence
(tests/tier1/). -
Nothing exercised a real run. A Tier 1 live harness now provisions a scratch repository
per scenario, installs the package into it, copies a small fixture over it, and drives real
headless turns before the state contract reads what was left behind. The model is pinned
because a headless run ignores themodel:frontmatter the editor honors, every turn is
bounded, and a failed scenario is retried once with both attempts kept so a flake is
separable from a regression (tests/tier1/Invoke-Tier1LiveRun.ps1,
tests/tier1/scenarios/,.github/workflows/tier1-behavior.yml). -
A squad can write a valid tree while quietly routing to a different cast. Tier 2 scores
each run against a golden baseline on four facts read from disk: the roles dispatched, the
deliverable roots and types produced, the gate verdicts recorded, and — only when asked —
whether the answer is materially equivalent. Deliverables compare as root and type rather
than filename, because the topic slug is the model's to choose while the root is the
roster's promise. Advisory until the noise floor across repeat runs is measured
(tests/tier2/,.github/workflows/tier2-semantic.yml). -
A release could be cut over a broken package. The release workflow now runs Tier 0 twice:
once against the ref being released, and once against the tag it just pushed. Only the second
can assert that the tag pinned its own self-references, because that check needs a ref to
install — and a tag that freezes the dependency list but not its contents is the defect that
made earlier tags non-reproducible. A failure there leaves a tag but no Release
(.github/workflows/release.yml). -
The state contract had no live run to assert against. A Tier 1 harness now provisions a
scratch repository per scenario, installs the package into it, copies a tiny fixture on top, and
drives real headless Copilot CLI turns before handing the resulting tree to the state contract.
Scenarios cover Init, an ordinary routing turn, and promotion from a single squad to a federation
with a cross-sub-squad handoff. The model is pinned because a headless run does not read the
model:frontmatter the editor honors and results are otherwise incomparable; every turn carries a
timeout, and a failed scenario is retried once with both attempts kept, so a flake is
distinguishable from a regression
(tests/tier1/Invoke-Tier1LiveRun.ps1,tests/tier1/scenarios/,tests/fixtures/,
.github/workflows/tier1-behavior.yml). -
A squad can write a valid tree while quietly routing to a different cast. Neither Tier 0 nor
Tier 1 can see that. Tier 2 now reduces each run to four deterministic facts — which roles ran,
which deliverable types landed at which roots, which gates fired with which verdict, and what the
run answered — and scores them against a golden baseline captured from a known-good release. Only
the answer is prose, and it is judged only when asked for. The tier is advisory until the noise
floor across repeat runs is measured, because a gate that blocks on unmeasured variance gets turned
off. Its comparator carries its own drift controls
(tests/tier2/,.github/workflows/tier2-semantic.yml).
Changed
-
Three squad agents exceeded the 30,000-character host limit and fifteen declared
model:as a
YAML array the Copilot CLI rejects outright. An over-cap profile is why a selected coordinator
could answer as a plain model, and amodel:array makes an agent fail to load entirely. The
coordinator, federation coordinator, and Scribe now bind to thesquadskill through a named Skill
Reference Contract and fit the cap;squadSKILL.md was split into ten topic reference files so
each agent loads only its own role's procedure, and the Scribe reads the seeding, consumption, and
federation files only when the turn's payload writes them; and everymodel:is now a single string
(squad-src/.github/agents/squad/,squad-src/.github/skills/squad/references/). -
The Model Attribution ladder described host behavior that measurement contradicted. A valid
frontmatter pin beats--model, an unentitled pin is substituted silently on the dispatch path with
no warning, andautooverrides a subagent's pin entirely. The ladder now leads with the
host-reported dispatch model, so the consumption ledger records what actually ran rather than what
was requested (squad-src/.github/instructions/squad/squad-state.instructions.md). -
Updated hve-core dependency pin to
8d21777(8d21777065f2f32fab4260c1366931e66f7bc51f). -
Updated hve-core dependency pin to
5b2119e(5b2119e3c924738b200ef31baaf4672a0e6938d8). -
The consumption block stored the same fact a dozen times and could store it wrong each
time. Every per-dispatch block carried the four token rates and a derivedest_cost_usdand
est_creditsalongside its own token counts — so a rate that belongs to a model was restated once
per dispatch, and a cost fully determined by its own inputs was stored next to them where the two
could disagree. A live Copilot CLI run showed both failure modes in one turn: a block carrying
Claude Sonnet 5's rate fields whose cost had been derived at Claude Sonnet 4.6's rates, and an
orchestration block whose recorded cost was 2.2× what its own numbers produced.The block is now ten fields and records consumption only —
model,model_source,priced_as,
model_tier,internal_turns, the four token counts, andbasis.input_rate,cached_rate,
cache_write_rate,output_rate,est_cost_usd, andest_creditsare gone fromhistory/
entirely. Cost is derived once per role inconsumption.md, from that row's summed token columns
and the rates of the rowpriced_asnames inconsumption-rates.md, which remains the single
source of rates.priced_asis what carries the pricing decision from the dispatch to the ledger.Four of the run's five consumption defect classes cease to exist rather than being caught later:
there is no rate field to copy wrongly, no rate to contradict a tier, no per-block divide to slip a
decimal on, and no second copy of a cost to disagree with the first. The arithmetic that remains
happens once per row in one table a reader can check at a glance. Nothing is lost — every role
still has its own cost row inconsumption.md; it simply stops being written twice.The Tier 1 contract moves with the shape: per-block assertions for rates, cost, and credits are
replaced by a p...
v0.15.3
Changed
- SQL migration guidance duplicated an upstream questionnaire and could drift from its policy.
Squad SQL Migration Advisornow prefers therecommend-migration-pathandgenerate-migration-prerequisite-planskills installed through the upstreamsql-migration-advisorplugin, preserves the bundled advisor as a recommendation-only compatibility fallback, and routes prerequisite/readiness requests explicitly (squad-src/.github/agents/squad/squad-sql-migration-advisor.agent.md,squad-src/.github/skills/sql-migration-advisor/SKILL.md, and the squad roster and routing instructions).
Fixed
- The Squad Coordinator could activate a specialist skill before dispatching its owning agent.
Dispatch discipline now keeps classification metadata-only and leaves project, plugin, and bundled
specialist skills inactive until the resolved specialist runs
(squad-src/.github/agents/squad/squad-coordinator.agent.md).
Consumer install
Pin to this version:
apm install "Peter-N91/hve-squad#v0.15.3"v0.15.2
Changed
- Updated hve-core dependency pin to
594ee84(594ee8480c9e65ad7eaee30f6cab8f0aa6cce814).
Fixed
- Every release tag served squad files from
maininstead of from the tag. The 47
Peter-N91/hve-squadentries inapm.ymlship as bare paths, and APM resolves a bare path against
the default branch — so a tag froze the dependency list but not its contents. Measured by installing
#v0.14.0and gettingmain's coordinator back, while the hve-core entries in the same manifest
resolved correctly because they carry#<sha>.release.ymlnow pins the self-references to the tag
it is cutting and pushes that commit straight torefs/tags/, so a release installs the files it was
built from (.github/workflows/release.yml,scripts/Set-SquadSelfRefPin.ps1).mainkeeps the
unpinned manifest, so development installs still trackmain. Tags before v0.15.2 remain unpinned.
Consumer install
Pin to this version:
apm install "Peter-N91/hve-squad#v0.15.2"v0.15.1
Changed
- The discovery gate shipped with no consumer documentation. The usage guide now covers it as a
sibling of the intake gate — the inverse triggers that chain a brainstorm into a validation, why it
is offered rather than automatic, the four trigger conditions, thequick/standard/deep/skip
depth tiers, and why it stays silent outside theproductandfullprofiles while the intake gate
escalates. Thediscovery=andowner=inputs are documented for the first time (docs/usage.html,
docs/index.html).
Consumer install
Pin to this version:
apm install "Peter-N91/hve-squad#v0.15.1"v0.15.0
Added
- The squad had a front door for weak inputs and none for absent ones. The intake gate validates requirement artifacts when they exist; a request with nothing written down went straight into research on framing nobody examined. The new opt-in discovery gate (
squad-src/.github/instructions/squad/squad-discovery-gate.instructions.md) fires on the inverse trigger — no input artifact, a goal rather than a settled task — and produces a brief the intake gate then validates. The two gates chain rather than loop. - It is offered, never automatic, and never unattended. Validation can be automatic because assessing a document is something an agent does alone; ideation cannot, because the value of a brainstorm is the human's ideas. The coordinator asks once per topic and honours a
discovery=quick|standard|deep|skipinput on/squadand/squad-federation. On a Watch Mode or headless run no offer is made, adiscovery=argument is ignored, and the triggering payload becomes the intake gate's input instead. - The offer is scoped to the
productandfullprofiles, the only rosters carrying the roles the gate dispatches —analystwrites the brief at every depth and no other profile seeds it. Elsewhere the gate is silent rather than escalating, which is the deliberate difference fromintake-validator: an input that exists and goes unvalidated is a skipped check worth interrupting for, while an unrequested brainstorm is not. An explicitdiscovery=is still honoured on any roster, with one combined escalation naming the roles it must add. - The dispatched roles interview the user rather than answering for them. Each puts its questions through the question tool one at a time and waits, the same discipline
Squad SQL Migration Advisoralready follows here. A role that cannot reach the user returns its outstanding questions instead of inventing the answers, and the session stops — a brief built from an agent's assumptions is the failure the gate exists to prevent. - Depth tiers scale the session to the decision and introduce no new role:
quickdispatchesanalyst;standardaddsdesigner(resolved toDT Coach) for How-Might-We framing and divergent ideation;deepaddschallengerandexperimenter. Onlyanalystwrites a file — the brief, in the existinganalystDeliverable Root — so one session leaves one artifact. - The discarded options are recorded with their reasons. The Squad Scribe writes a
## Discovery Verdicttodecisions.md(including on a decline, which is what stops the gate re-offering), carrying the framing, every option considered with why it was chosen or discarded, objections, the riskiest assumption, and the open questions research inherits. - Federation asks the question once and applies it per qualifying sub-squad, the same ask-once contract that already governs member naming and the approval channel. Each
productorfullsub-squad still runs its own session and writes its own brief and verdict under its own root; sub-squads on other profiles run unchanged, and the federation plan meta-stage never brainstorms on a sub-squad's behalf.
Changed
-
The published docs did not describe how a fix ships without shipping everything else. Added the hotfix procedure, the
refrelease input, and therelease-merge-backlabel to the contributing and maintaining pages, and documented the rolling pre-release channel on getting started and troubleshooting. -
Every merge cut a release. A fragment landing on
mainassembled the CHANGELOG, bumpedapm.yml, and tagged immediately, and the daily hve-core sync cut a release of its own on top, so a quiet week still produced several versions and nothing was ever installed before it shipped. Releasing is now a deliberate act:.github/workflows/release-prep.ymlruns on manual dispatch only, ships everything pending as one version at the highestbumpany fragment asked for, and nothing goes out on a timer. -
Merged work is now installable before it ships.
.github/workflows/preview.ymlkeeps a single GitHub pre-release in sync withmain, tagged with the version the pending fragments resolve to (v0.15.0-pre) and force-moved on every merge, so a change can be installed and tested the moment it lands. It only reads: no fragment is consumed, no version is bumped, andCHANGELOG.mdis untouched. A quick fix can ship as soon as it is verified there, while a larger change sits in preview until it is ready. -
The hve-core sync queues instead of releasing.
.github/workflows/sync-hve-core.ymlnow records a pin move as a change fragment and pushes it, leaving the release to a maintainer. The cast-delta guard and the Watch Mode handoff are unchanged. -
A fix can ship without shipping what is not ready. A release carries a commit, so a tag cut from the default branch contains everything merged into it.
release-prep.ymlandrelease.ymlaccept arefinput, which lets a hotfix be cut off the last release tag and released on its own, leaving the pending batch and its preview untouched.release.ymlalso declines the Latest badge when the version it is cutting is lower than the current latest, andpr-validation.ymlaccepts arelease-merge-backlabel so the hotfix can be merged back with the release state Release Prep already wrote. -
Invoke-ReleasePrep.ps1gained-SectionOutFileand-InstallRefso the preview can render the pending release notes and point the install snippet at the preview tag without consuming anything. -
Updated hve-core dependency pin to
2a333df(2a333df05cc5aa85d2dc9db834958b717c888bf9). -
Updated hve-core dependency pin to
c91c782(c91c7823188fef4d1ca7558c1c868b05be3aa3c2). -
Updated hve-core dependency pin to
26b9712(26b97122e19d6ff271b0b6f0401c92bb12eda03b).
Consumer install
Pin to this version:
apm install "Peter-N91/hve-squad#v0.15.0"v0.14.0
Changed
- HVE Core retired its entire dispatchable data-science agent cast (
DS Gen Data Spec,DS Gen Jupyter Notebook,DS Gen Streamlit Dashboard,DS Test Streamlit Dashboard) and itsEvaluation Dataset Creator, replacing them with reference-pack skills and adisable-model-invocation: trueorchestrator (Data Workstream Coach) thatrunSubagentcannot reach. A new squad-owned charter,Squad Data Scientist(squad-src/.github/agents/squad/squad-data-scientist.agent.md), now serves thedata-scientistrole's Primary, running theds-catalog,ds-analysis-authoring,ds-dataops,ds-feasibility, andml-experimentationskills, and reaches the existing Power BI/Fabric skills explicitly instead of ambiently.Squad Prompt Engineernow also runsds-evaluation-designfor theprompt-engineerrole's eval-dataset alternate, replacing the retiredEvaluation Dataset Creator.apm.ymlmoves to hve-core@2be87b7.
Consumer install
Pin to this version:
apm install "Peter-N91/hve-squad#v0.14.0"v0.13.2
Fixed
-
A federated sub-squad's artifacts could still be created outside the member. The Deliverable
Roots table is now explicitlysquadRoot-relative, and the Scribe resolves each root against the
squadRootit was handed at seed time before writing it into the roster — so a sub-squad's
team.mdreads.copilot-tracking/squad/members/product/plans/rather than the bare
.copilot-tracking/plans/, and its research, plans, PRDs, changes, and reviews are created inside
the member. Federation Init and Expansion verify the seeded roster before moving on, and a
promotion rebases the relocated roster's cells so every role keeps pointing at its own relocated
artifacts.docs/andoutputs/remain the two exceptions and stay at the repository root
(squad-src/.github/instructions/squad/squad-roster.instructions.md,
squad-src/.github/agents/squad/squad-scribe.agent.md,
squad-src/.github/agents/squad/squad-federation-coordinator.agent.md). -
Editing a role's
Deliverable Rootinteam.mdhad no defined effect. The roster cell is now
the running value and the table is only the seed-time default: the coordinator states each
dispatch's write path from the row it just resolved, the Artifact Gate looks for the artifact at
that same cell, and a roster refresh preserves an edited cell instead of normalizing it back. A
consumer pointing a role at their own directory therefore takes effect on the very next dispatch
with no reseed (squad-src/.github/instructions/squad/squad-roster.instructions.md,
squad-src/.github/agents/squad/squad-coordinator.agent.md,
squad-src/.github/agents/squad/squad-researcher.agent.md). -
/squad-documentis unaffected by the rebasing and now reads the squad's deliverables. Its
default output stays at the repository-rootdocs/, which the rebasing rule already exempts, and
that exemption is stated where the path is derived so a future change does not rebase it under a
sub-squad. Its search step also resolves theDeliverable Rootpaths fromteam.mdrather than
assuming the repository-root tracking paths, so a federated run grounds on the sub-squad's own
artifacts (squad-src/.github/prompts/squad/squad-document.prompt.md). -
Promoting a single squad to a federation left the squad's own work behind and could delete it.
Promotion moved only the state tree, so every artifact produced before the promotion —
brd-sessions/,plans/,details/,research/,changes/— stayed at the repository-root
tracking paths while the roster's deliverable roots had already rebased undermembers/<name>/.
Promotion now relocates those directories too, enumerated from disk rather than from the
Deliverable Roots lookup table (which names the roots the cast writes today, not every directory
a session produced) and confirmed with the user in Phase 1;docs/andoutputs/stay at the
repository root, and a Watch Mode promotion moves everything under.copilot-tracking/except
squad/and records the list in its decision entry
(squad-src/.github/instructions/squad/squad-federation.instructions.md,
squad-src/.github/agents/squad/squad-federation-coordinator.agent.md,
squad-src/.github/agents/squad/squad-scribe.agent.md). -
A promotion could clear the source before writing the destination, then report it could not find
the files to move. Every move is now an explicit copy → verify → delete-source sequence, per
file: write the destination, read it back, and only then remove the source. Nothing at the source
is removed, cleared, or truncated before its verified destination copy exists, and a failed
destination write stops the promotion with the source intact — a partially relocated tree is
recoverable and a deleted source is not
(squad-src/.github/instructions/squad/squad-federation.instructions.mdCopy, Verify, Then
Delete,squad-src/.github/agents/squad/squad-scribe.agent.mdStep 10). -
A promotion produced no consumption accounting, so the new federation reported a zero-cost first
turn over a sub-squad carrying a populated ledger. The Scribe now runs its consumption step for a
promotion payload scoped to the relocated sub-squad root, rewritesmembers/<name>/consumption.md
from the relocated history, and seeds the federationstate.jsoncurrentRuntotals from that
ledger's total row. The Federation Coordinator verifies the relocation by reading
members/<name>/back before confirming, rather than asserting success
(squad-src/.github/agents/squad/squad-scribe.agent.md,
squad-src/.github/agents/squad/squad-federation-coordinator.agent.md). -
state.jsonwas seeded at Init and then never advanced. No Scribe step touchedupdated,
turn,mode,activeRoles, oropenEscalations, so a squad appended decisions and history
every turn beside a status document still readingturn: 0— and in a federation, a routed turn
left the federation's ownstate.jsonuntouched entirely. A new Scribe Step 12 advances the
file on every turn that writes anything, as a read-modify-write that carriesschemaVersion,
notify,trigger,currentRun.sessionModel, andcurrentRun.modelOverridesforward instead of
resetting them, and leaves the cost totals to the consumption step. Both coordinators now hand the
advance on the same call that appends the logs, and both verify it before reporting the turn done
(squad-src/.github/agents/squad/squad-scribe.agent.md,
squad-src/.github/agents/squad/squad-coordinator.agent.md,
squad-src/.github/agents/squad/squad-federation-coordinator.agent.md,
squad-src/.github/instructions/squad/squad-state.instructions.md). -
A federation root never got its
history/directory. The Scribe's history step defines the
file ashistory/<agent>.mdfor a dispatched agent and requires a paired consumption block, so a
federation-level entry — which names a sub-squad, not an agent, and whose cost is already recorded
in that sub-squad's own ledger — fell outside the step and was silently dropped. The step now
covers it explicitly as the one history append that stands alone, the federation coordinator's
completion checklist catches a root that only grows its decision log, and the federation
conventions state exactly which files a healthy federation root holds and which are legitimately
absent (squad-src/.github/agents/squad/squad-scribe.agent.md,
squad-src/.github/agents/squad/squad-federation-coordinator.agent.md,
squad-src/.github/instructions/squad/squad-federation.instructions.md). -
A federated sub-squad could not reach another's work, and nothing said how it should. A run
scoped tomembers/azure/resolves every path under its own root, so aproductsub-squad's PRD
atmembers/product/plans/was invisible to it — and a sub-squad's inner run never reads
federation-level state, so the federationdecisions.mdwas not a discovery mechanism either. The
only prior mention of a handoff was one line in the federation autopilot instructions, with no
mechanism and nothing for an interactive turn. A new Cross-Sub-Squad Handoff contract makes the
Squad Federation Coordinator — the only component that sees both roots — resolve the producer's
artifacts from itsteam.mddeliverable roots, verify each file on disk rather than infer it,
and hand them to the consumer as explicit read-onlyinputs=paths. The producer runs to
completion first, the pair is not parallel-eligible for that turn, the consumer never writes across
the boundary, and the handoff is recorded in the federationdecisions.mdso a two-sub-squad
outcome stays reconstructable (squad-src/.github/instructions/squad/squad-federation.instructions.md,
squad-src/.github/agents/squad/squad-federation-coordinator.agent.md,
squad-src/.github/agents/squad/squad-coordinator.agent.md,
squad-src/.github/instructions/squad/squad-federation-autopilot.instructions.md). -
A missing upstream artifact had no defined recovery. Stopping is the safety property, not the
outcome, and a consumer left to work the requirements out for itself returns a complete-looking
deliverable built on requirements the producer never agreed — a divergence nothing in the output
reveals. A new recovery ladder mirrors the bounded auto-remediation loop of the intake gate rather
than inventing a second vocabulary: run the registered producer and resume the consumer in the
same turn, or re-dispatch only the producing stage when the artifact is partial or stale, or
offer Federation Expansion when no sub-squad owns the artifact, or take a user-supplied path or a
user's explicit decision to proceed with the gap recorded as an assumption. Interactive turns state
what will run and wait; autopilot and Watch Mode proceed unasked, because dependency-first ordering
was already settled at the plan meta-stage. The loop is capped at one producer run per handoff per
turn, and every recovery dispatch is a Scribe-recorded stage with its own consumption block
(squad-src/.github/instructions/squad/squad-federation.instructions.md,
squad-src/.github/agents/squad/squad-federation-coordinator.agent.md).
Consumer install
Pin to this version:
apm install "Peter-N91/hve-squad#v0.13.2"