Repository navigation
Four gaps between what this project claimed and what it actually verified.
One breaking change, and it is the honest kind: the server now refuses to
start on a runtime that cannot durably store your data. No tool name, parameter
or response field changed.
Changed
- Node 22.5 is now the floor — breaking for anyone on Node 18. The package
claimedengines.node >= 18.0.0whilenode:sqlitehas only existed since
22.5, and it claimed that in the one fieldnpmchecks at install time. So a
Node 18 user got a clean install, a working--help, and then a server that
failed at its first write with a stack trace about a module that does not
exist in their runtime — after they had already pointed a real agent at it.
The claim is now true (>=22.5.0), and on an older runtime the server exits 1
with a plain sentence explaining which version it needs and why, before it
creates a data directory or prints a mock-data warning that would have sent
them looking in the wrong place. - Two escape hatches, for the runtimes that cannot be upgraded. Set
PROJECT_TANGO_PERSIST=0to run stateless (nothing is written, nothing is
lost, it just does not survive a restart), orPROJECT_TANGO_STORE=jsonto
keep the JSON backend and accept that it cannot notice another process
replacing the catalog underneath it. Both start normally, and both are stated
in the README's new Runtime floor section rather than left in the source.
Added
- A release gate that runs before a release, not after one. Two releases in
a row went out over a red CI run, and the changelog/tag lineage checks that
would have caught the cause can only run once the tag exists — so they run
minutes after the release is public.scripts/release-check.mjsmoves every
one of those conditions to the moment you can still do something about them:
the version agrees acrosspackage.json,package-lock.jsonand
SERVER_VERSION; the changelog has a dated heading and a link for it; the tag
is annotated, sits onmain's lineage, is dated the day the heading claims,
and is an ancestor ofHEAD. It is wired asnpm run release:checkand runs
in CI on tag pushes, so the mistake is caught on a private commit as often as
on a public tag. - A Windows CI leg. Every gate in this project had only ever run on Linux,
on a machine whose line endings, path separators and shell differ from the
platform a surprising share of agent tooling is actually installed on. CI now
builds and tests onubuntu-latestandwindows-latestin the same matrix,
withfail-fast: falseso a Windows failure is visible rather than inferred. - The published tarball is installed and booted before it is believed. The
package smoke test used to run against the working tree, so it could pass on a
build whose tarball was missing the entry point. CI now packs, installs into a
clean directory, boots the real binary over stdio and completes a real
place_orderagainst it — the same check, run against the artefact users
download. - The start-up refusal is tested end to end.
src/bootstrap.test.tsspawns
the realindex.tsas a child process and asserts on its exit code and
stdout: a normal runtime answersinitialize, an old one exits 1 with an
explanation and an empty stdout, and — the assertion that matters — a refused
start leaves no data directory behind, so the failure cannot be mistaken for a
corrupt install.
Fixed
- The concurrency soak could not fail. 3.1.2's freshness test asserted no
read trailed a committed write by more than one commit. Measured, that bound
was never tested: a read cost about a quarter of a write, so the reader was
almost always reading between commits andworstLagwas structurally zero. A
reader that refreshed only one read in sixty would have passed. The reader now
pauses briefly between reads, so roughly three quarters of the gaps it
observes contain two or more commits, and a new assertion fails the suite if a
run never once put the reader behind — the test can no longer pass vacuously.
Lazy-refresh and zero-delay variants were confirmed to fail it. - The Windows leg's own smoke script is verified locally, not just in CI. It
was extracted from the workflow YAML and run against a real local pack before
being trusted, including the case where the binary is missing and the script
must exit non-zero rather than pass quietly.