0.57.0 · core 2026-08-04
Host owns scheduling, Stelow slims responsibilities. The core no longer ships Pulse, the inbox mirror, or the provenance log — each host surface now drives its own deferred-item and scheduling story (Multica autopilot + backlog/todo, Fusion native scheduler, Pi pi-subagents). Includes the Multica stage-label hardening from CAL-38 (the "one stelow:* label at a time" invariant is now structural, not prompt-based).
Added
- Multica stage-label adapter (
CAL-40T4) — Newextensions/stelow/adapters/multica/labels.tswithsetStageLabel(issueId, newStage, prevStage, ctx)helper.STAGE_LABELSis derived fromPHASE_NAMES(canonical 17-stage state machine inextensions/stelow/types.ts), so adding a stage in the engine automatically gets a label.stages-guard.ts#syncStagesGuardState()now invokes the helper after every successful transition whenSTELOW_MULTICA_HOST=1andMULTICA_ISSUE_IDare set in the environment. Pre-transition drift (issues with twostelow:*labels) is corrected in-place by the helper. - Multica label invariant test (
CAL-40T4) —tests/unit/multica-labels.test.ts(18 tests) asserts the structural invariant: an issue must have at most onestelow:*label at any time, even after a transition that follows a drift state. TheassertSingleStageLabelhelper exposes the invariant as a catchable check for the audit stage. - Host Installation Guide (
CAL-40T5) — New top-levelREADME.mdsection with one concrete path per host (Pi, Fusion, Multica, Generic). Documents that scheduling/automation is host-owned with the per-host scheduler recipe.
Changed
- WORKFLOW_COMMANDS slimmed (
CAL-40T3) — Host-agnostic registry went from 19 to 16 descriptors aftersw-inboxandsw-pulsewere removed. The lastpiOnlydescriptor (sw-unlock) was moved toextensions/stelow/adapters/pi/commands.ts#PI_LOCAL_COMMANDSas a Pi-local registration. Pi now exposes 17 commands (16 agnostic + 1 Pi-local); Fusion emits all 16 agnostic descriptors. - Stage transitions project onto Multica issue labels (
CAL-40T4) —stages-guard.ts#syncStagesGuardState()now performs thestelow:*label swap automatically underSTELOW_MULTICA_HOST=1. Callers no longer need to remember to remove the previous label; the invariant is enforced by the helper. The projection is a best-effort side effect (failures are logged but don't roll back thestelow.jsonwrite). - Architecture split documented (
CAL-40T6) —architecture.mdgained a "Responsibility split (v0.57.0)" section under "Host adapters" that calls out Pulse, inbox, and runner scheduling as host responsibilities while Stelow owns workflow state, adapters, and the audit trail.
Removed
- Pulse — autonomous inbox processing (
CAL-40T1) — Deletedextensions/stelow/pulse/(pulse.sh,pulse.ps1,pulse-system.md,pulse-task.md,SETUP.md).scripts/setup-pulse.shandscripts/copy-pulse-assets.share now no-op stubs that point users at their host's native scheduler.tests/unit/pulse-assets.test.tsdeleted.setup.shlost the "Step 9/11: Pulse" step (renumbered to 9 steps). Migration: anyone runningpulse.sh/pulse.ps1from cron, systemd, launchd, or Task Scheduler must move to their host's native scheduling (Multica autopilot withrun_onlytriggers, Fusion native scheduler, Pipi-subagents). - Inbox + Provenance filesystem mirror (
CAL-40T2) — Deletedextensions/stelow/inbox.tsandextensions/stelow/provenance.ts. RemovedcmdInbox,cmdPulse,ensurePulseScripts, and their command registrations incommands.ts. Removed thereadInboxfallback instart.ts. Removed theInboxItemtype fromextensions/stelow/modules/task.ts. Migration: hosts that wanted deferred items should use Multica'sbacklog/todo, Fusion's inbox, or Pi'spi-session-state. Theaudit-trail.tsmodule stays (it is the workflow's own output, not a host inbox mirror).