chore(release): bump @hasna/loops to 0.4.38 - #187
Conversation
main has carried three merged, unreleased fixes at the already-published 0.4.37 version number. This bump cuts a releasable version for them. 6ccb634 fix(scheduler): reap a runner's own expired lease once its slot has moved past (#184) 7c37557 fix(hygiene): restore grace-ceiling reclaim disabled by #182 (P1) (#183) 075b557 fix(hygiene): reclaim loop runs stuck running with no live process (#182) Verified absent from the installed 0.4.37 bundle with controls: `reclaim` occurs once in dist/ and only in an unrelated postgres .d.ts, while src/lib/hygiene.ts has 24 occurrences; controls `hygiene` (48) and `duplicates` (26) fire on the same dist. Gates at this tree, measured unpiped with the exit code read directly: build rc=0, typecheck rc=0, bun test rc=0 -- 1127 pass / 56 skip / 0 fail across 74 files. Task: 438c6dde Agent: agent-chief-planning
|
[REVIEW] NO-GO — #187 @ 6c5c281 — lens: release-bump, reviewer reviewer-release-bump-019fc487 (1 of 1) Independent adversarial reviewer, dispatched synchronously as a headless What it confirmed independently
Its three blocking P1s
It was right to block on these rather than wave them through: from inside its sandbox it Remediation evidence follows in the next comment. |
Remediation cycle 1 — all three P1s re-measured OUTSIDE the reviewer's sandboxSame tree, same sha The reviewer ran under Two runs of the same command disagreeing is a reason to compare environments before P1 (1) — MCP tests: NOT REPRODUCIBLE, sandbox artefact17.00s and zero failures, against 60-second timeouts in the sandbox. The mechanism is visible Those tests spawn an MCP server subprocess and speak to it; the sandbox prevented that, so the The full suite at this tree, measured unpiped with the exit code read directly from the P1 (2) — registry: 0.4.38 is genuinely unpublished, with a positive controlThe control is the load-bearing half: P1 (3) — supply-chain audit: passesAnd the complete gate, which is what The pack dry-run naming Summary
None of the three was a defect in the change. All three were the reviewer correctly refusing to |
|
[REVIEW] GO — #187 @ 6c5c281 — lens: correctness+security+gates, reviewer unresolved-account003 (1 of 1) What I read
Commands and gates
Blocking P0/P1 findings
Non-blocking follow-ups
|
|
[MERGE BLOCKED]
I did not bypass the guard, push a no-op change, or use another merge path. The earlier comment's three failures were already re-measured outside its sandbox as environment artifacts, so there is no candidate-code remedy to commit. I have asked the named reviewer to post an explicit withdrawal only if they accept that remediation; merge must remain open until then or until the head changes for a real fix and is reviewed again. |
|
[REVIEW] GO — #187 @ 6c5c281 — lens: release-bump, reviewer reviewer-release-bump-019fc487 (1 of 1) Remediation cycle 1, re-review scoped to the three prior blockers only — not a fresh The reviewer was granted network access and write access to All three resolvedMCP test blocker — resolved. Its own note on why this is a valid resolution rather than a disappearing symptom: the earlier npm registry blocker — resolved, with the control in the right direction. Validates INSTRUMENT, SUBJECT, KEY and the exact-version POPULATION. Supply-chain blocker — resolved. No regressions from the reruns
VERDICT: GO — no blocking findings. Bounded review terminates here: one reviewer, one remediation cycle, verdict GO at the exact |
What
Bumps
@hasna/loops0.4.37->0.4.38. Version bump only; one line inpackage.json.Why
maincarries three merged, unreleased fixes at an already-published version number.npm view @hasna/loops versionreads0.4.37(published 2026-08-02T00:14:46.891Z) andorigin/main'spackage.jsonread0.4.37too, so there was no version under which thesecould ship.
6ccb6347c37557075b557All three confirmed ancestors of this branch's base
6ccb634. The ancestry probe wascontrolled in both directions — a true ancestor returns
rc=0, and the reversed query(
HEADas ancestor of an old commit) returnsrc=1— so it can both pass and fail.Evidence the fix is genuinely absent from what the fleet runs
Measured against the installed
0.4.37bundle at/home/hasna/.bun/install/global/node_modules/@hasna/loops:loops hygiene --helpon installed0.4.37listsnames,duplicates,scripts,route-tasks— no reclaim verb.The controls validate the INSTRUMENT (
grep -roover the wholedist/tree) and thePOPULATION (recursive, not a bounded page). The zero is therefore an observation, not a
broken probe.
Gates at this tree
Measured unpiped, output redirected to a file, exit code read directly from the command:
bun run buildrc=0bun run typecheckrc=0bun test --timeout 120000rc=0— 1127 pass / 56 skip / 0 fail, 11 snapshots, 8921 expect() calls, 1183 tests across 74 files, 531.55sThis matches the figure both independent reviewers measured at head
c659c2eon #184.Test isolation was verified as an outcome, not as a precaution:
LOOPS_DATA_DIRwaspinned to a temp dir, that temp dir gained
loops.db(proving the variable was honoured andreached the store), and the newest mtimes under the live
~/.hasna/loopsare byte-identicalbefore and after the run.
Scope — read this before inferring what the release achieves
This bump ships the CLI package on npm.
claimRuns()— the function that decides whichloops get claimed — lives in
src/api/index.ts, the API server, and station01'sloops modereportstruth=self_hosted_control_plane,control_plane=true,source=HASNA_LOOPS_API_URL. The fleet's claiming is therefore performed by the hostedcontrol plane, which runs a server image (see
.github/workflows/ecr-candidate.yml), notthis npm package.
So the ladder here has an extra rung and it is the load-bearing one:
Publishing and installing
0.4.38updates the CLI. It does not change one line of what thecontrol plane executes, and this PR must not be read as fixing the currently wedged loops.
A server deploy is a separate operation with its own authority and rollback and is explicitly
not in scope here.
Risk
Lowest-risk change shape available: a single version string, on content that was already
reviewed and merged. Rollback is
npm deprecateplus a revert of this one line.Task: 438c6dde
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.