0.42.0 · core 2026-07-06
Scope-execution rework + cross-platform tooling + state.ts refactor + canonical-name alignment. No npm publish at any name; install via pi install git:github.com/calionauta/stelow or npx skills add .... No deprecation window, no migration cosmetics, no cosupport tickets.
Highlights
- Scope-execution prevention + audit pipeline. Drop the aspirational "file-overlap guard" heuristic (which was never implemented). Ship a CLI-agnostic prevention layer (file-reservation locks) + ground-truth post-hoc detection (
git diff --name-only). Nogit worktreerequirement; no per-CLI hook integration; no merge complexity. - Cross-platform install for cymbal + sem. Auto-detect macOS / Linuxbrew / Windows PowerShell / winget / Chocolatey / curl|sh. Default
[Y]prompts; non-interactive shells auto-install. - Ataraxy-Labs sem. The
sembinary moved to Ataraxy-Labs/sem; setup.sh now detects via command-set probe (not--versiontext grep, which had a false-negative on the real binary). - state.ts slimmed. Two-level refactor: (a)
readJson<T>()/writeJson()private helpers replace 12 hand-rolled sites; (b) inbox / provenance / scope-execution concerns extracted to their own modules (extensions/stelow/inbox.ts,provenance.ts,scope.ts). state.ts shrunk 1011 → 819 lines; concerns isolated; 1034 tests pass.
Added (scope-execution)
[TARGET_FILES]convention block inspec-tech.mdscope bodies. Parsed intowf.scopes[i].target_filesandscope-contract.json#target_files. Convention over config: trailing/*⇒ prefix match, trailing/⇒ single-level match, otherwise exact.- File-reservation lock protocol (
skills/stelow-product-orchestrator/references/cli-tools/file-locking.md, synced to 25 skill mirrors viasync-cli-tools.sh). CLI-agnostic prevention for parallel scope execution. Atomic acquire vialn(EEXIST-safe), TTL-based stale-lock stealing,sha1sum(12)lock file naming. Optional[LOCK_TTL_SECONDS]block per scope; default 1800s. No hooks, nogit worktree, no per-CLI integration. Scopeinterface inextensions/stelow/types.tsextended withtarget_files?: string[],actual_files?: string[],start_sha?: string,lock_ttl_seconds?: number.- 4-class overlap classification function (
classifyOverlap()inextensions/stelow/scope.ts) — same logic Step 8 used to run inline, now extracted + testable + reused. Classes: (a) undeclared writes (declared ≠ actual), (b) real inter-scope overlaps, (c) stale locks, (d) clean. matchesDeclaredGlobpure helper (also inscope.ts) — covers the/*/// exact cases. Used byclassifyOverlap; exported for tooling reuse.- Lock acquisition / release steps in
scope-executorSKILL Steps 3c / 3e. Defensive: scope declares[TARGET_FILES]AND the orchestrator plans parallel dispatch ⇒ acquire / release. - 13 new integration tests in
tests/integration/scope-overlap-classify.test.tscovering glob match (3 modes) + all 4 classes + combinations + edge cases (missing lockDir, malformed locks, contractless scopes, empty input). Total: 1034 / 1034 passing across 33 files. scope-actual-files.jsonartifact documented insubagents.mdInput Files table. Replaces the phantomsibling-scopes.jsonclaim.
Added (tooling + install)
scripts/setup.shdetects + offers cymbal + sem install (default[Y], non-interactive auto-Y). Persists state to.stelow/tools.jsonso downstream stages know what's available without re-detecting. Read byextensions/stelow/index.tsconsumers.- Cross-platform install cascade for both tools:
brew(macOS + Linuxbrew) → PowerShellinstall.ps1(Windows, cymbal) →winget install AtaraxyLabs.sem/choco install sem(Windows, sem) →curl | sh(unix universal) → manual URL on failure. semdetection fix —verify_at_ataraxy()probessem helpoutput for Ataraxy's distinctive command set (impact / blame / entities / context / xref / mcp / setup / unsetup; ≥3 matches required). GNU Parallel'ssemsymlink (different help text) correctly excluded.- Muxy panel enhancement —
integrations/muxy/stelow/src/panel/data.jsgetScopeProgress()addsdeclaredFilesCountfield;app.jstooltip surfaces "Using file-reservation lock protocol for parallel scope prevention" when declared paths are active.
Added (testing infra)
- Muxy panel test update —
tests/unit/muxy-workflow-data.test.tsnow expects the newdeclaredFilesCountfield ongetScopeProgress()(1034/1034 pass).
Refactored (state.ts)
extensions/stelow/state.tsslimmed 1011 → 819 lines.- DRY helpers (file-private):
readJson<T>(path): T | nullreplaces 6JSON.parse(readFileSync(...))sites.writeJson(path, data)replaces 4JSON.stringify(..., null, 2) + writeFileSyncpairs. Both added at top of state.ts; never re-exported. - Extracted modules:
inbox.ts(93 lines, 7 functions + 2 constants),provenance.ts(53 lines, 3 functions + 1 constant),scope.ts(195 lines, 3 functions + 2 types). - Public API preserved via
export { ... } from "./..."re-exports in state.ts. 0 caller breakage; 1034 tests pass.
Removed
- All
git worktreereferences from stelow docs. Stelow stance: sequential default + audit + opt-in file-reservation locks. No worktree recommendation (merge complexity burden not justified for the 2-3 parallel scope scale). sibling-scopes.json(never-implemented phantom artifact) replaced byscope-actual-files.json(real, generated bygit diff --name-only).
npm name alignment
- The
namefield inpackage.jsonandextensions/stelow/package.jsonis now@calionauta/stelow. Confirmed at release time that the package was never published to npmjs.com (both@calionauta/stelowand the historical@renatocaliari/stelowreturn 404 onnpm view). No deprecation notice or migration window is required. - In-repo references to GitHub URLs were canonicalized to
calionauta/stelow(README badges, schema URLs, setup.sh install lines, plugin paths, documentation). Plugin manifestnamefields remain as@calionauta/stelowto match.
Notes for next cycle
- Herdr plugin manifest (
integrations/herdr/stelow/herdr-plugin.toml) doesn't have a[version]line thatscripts/version-sync.mjscan patch. Pre-existing limitation; tracked separately. - schema-fencing for
target_filesglob — the convention is prefix-match only (/*and/). Glob characters like?or[abc]are not yet supported. Tracked as a hardening item.