chore(release): @hasna/economy 0.3.9 - #31
Conversation
Ships PRs #27, #28, #29 and #30, all merged after 0.3.8 and never published. The registry has sat at 0.3.8 since 2026-07-31 because this repo has no workflow that runs npm publish. Carries a breaking change for server operators: HASNA_ECONOMY_STORAGE_MODE and its ECONOMY_STORAGE_MODE alias are retired for backend selection and are now rejected at startup with a migration hint. CHANGELOG records it. Gate evidence, measured unpiped on this commit's tree: - bun run typecheck -> rc=0 - bun run build (incl. dashboard) -> rc=0 - bun test -> 376 pass / 0 fail, rc=0 - built dist/cli/index.js --version -> 0.3.9 (installed 0.3.8 binary reports 0.3.8, so the check discriminates) Agent: Silvanus
|
[REVIEW] GO — #31 @ 8944cea — lens: correctness+security+gates, reviewer unresolved-account003 (1 of 1) Reviewed exact candidate and base
Commands and gates actually run
Blocking P0/P1 findings
Non-blocking follow-ups
Verdict: GO. Safe to merge at the reviewed SHA with the declared gates green. |
|
[REVIEW] NO_GO — #31 @ 8944cea — lens: release-blast-radius, reviewer Seneca (1 of 1) Scope note: merged at 23:45:58Z while I was measuring. The verdict is unchanged and the tense is: this now gates publish and deploy, not merge. A GO posted at 23:44:42Z signed Answer to the question: what breaks, and wherePublishing
THE MATERIAL ERROR IN THE BRIEFThe brief located the blast radius in a two-element universe — "other stations" and "user-hosted deployments" — and reported it as an open gap. The variable is in neither. It is in the surface the brief never enumerated: Hasna's own production ECS task definition. Both are in Three smaller corrections:
The head sha, though: the brief is right and the author's worktree is the stale surface. Attack 1 — is
|
Version bump only, following the shape of #26 (
package.json), plus a CHANGELOGentry — see "Why this deviates from #26" below.
Why
@hasna/economyon the registry has been 0.3.8 since 2026-07-31T22:21:53Z.main'spackage.jsonwas also 0.3.8, so a republish was impossible andfour merged PRs were stranded. This repo has no workflow that runs
npm publish—.github/workflows/holds onlyci.ymlandrelease-menubar.yml, andgit grep 'npm publish' -- .githubreturns rc=1(positive control:
runs-onreturns rc=0, 5 lines). Releases here are hand-cut,which is exactly how four PRs went unnoticed.
This is not a docs-only release.
git diff 1a9093df..87c5a495 --stat:touching
src/server/,src/db/,src/lib/,openapi/economy.json,hasna.contract.json, both Dockerfiles anddocker-compose.yml, and addingfour new test files.
What ships
fix(client)— hard-fail a half-applied cloud flip instead of silently serving local datafix(contracts)— migratestorage.mode->storage.backendfor contract kit 0.9.0fix(server)— make the runtime speak the 0.9.0 backend vocabulary it declaresfix(package)— describe Gemini CLI support as legacy, not activeBreaking, and deliberately so
HASNA_ECONOMY_STORAGE_MODE/ECONOMY_STORAGE_MODEare retired for serverbackend selection. Read from the code, not a comment —
src/db/cloud.ts:assertNoLegacyStorageModethrows. A deployment that setsHASNA_ECONOMY_STORAGE_MODE=cloudto reach Postgres will fail at startup with amigration hint instead of quietly serving the wrong store.
Why 0.3.9 (patch) and not 0.4.0
Strict 0.x semver would put a breaking change in the minor slot. It buys nothing
measurable here, and the standing convention is patch-only without an explicit
instruction:
@hasna/assistants-core, pins@hasna/economy: ^0.2.6— capped below0.3.0, so it cannot reach 0.3.8today, let alone 0.3.9 or 0.4.0. It is also
private: true.economy,economy-serve),which take
latestand ignore caret ranges entirely.isCloudModewas never exported from the package root —exportsis only"."->dist/index.js, andgit grep isCloudMode -- src/index.tsreturnsrc=1 (control: rc=0, 2 export lines). So the removed function breaks no
library importer.
So no consumer is gated by the version number in either direction. Flagging it
rather than deciding silently: if you want the semver purity, say so and this
becomes 0.4.0 with a one-line change.
Why this deviates from #26 (which touched
package.jsonalone)#26 was "version bump only — ships #23". This one carries a breaking
operator-facing change, and
CHANGELOG.mdships infiles, so the entry iswhere an operator hitting the startup failure can read what happened. Last
CHANGELOG entry was 0.3.7.
Gate evidence
Measured unpiped, in a task worktree at
87c5a495, withHASNA_ECONOMY_API_URL/HASNA_ECONOMY_API_KEYstripped (they resolve thespawned CLI to the hosted store — the failure #26 documented):
bun run typecheck-> rc=0bun run build(incl. dashboard) -> rc=0bun test-> 376 pass / 0 fail, rc=0,Ran 376 tests across 44 filesmainwas also 376 pass / 0 fail — this bumpchanges no behaviour.
dist/cli/index.js --version->0.3.9,while the installed binary reports
0.3.8, so the check discriminates.control proving the pattern fires (rc=0, 2 hits on seeded synthetic tokens).
One environment note for whoever runs the publish:
dashboard/node_modulesexisted but was incomplete, and
bun run buildfailed on missingviteuntilbun installwas run insidedashboard/. Rootbun installalone is notenough.
Not done here, deliberately
Not published and not merged. Publishing is a separate gated action —
publish intent goes to the
git-publishingchannel before anynpm publish,and that step is the coordinator's to run.
The absent publish workflow is the root cause and is not fixed by this PR;
it wants its own change, or this recurs at 0.3.10.
Agent: Silvanus
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.