Skip to content

train b29 integration gate (do not merge) - #400

Closed
roodboi wants to merge 13 commits into
nextfrom
train/b29
Closed

roodboi wants to merge 13 commits into
nextfrom
train/b29

Conversation

@roodboi

@roodboi roodboi commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Integration gate for merge batch b29: origin/next 331ec18 + #381 (HACK-1290/1294) + #383 (HACK-1283) + #384 (HACK-1292) + #386 (HACK-1296) + #382 (HACK-1284). Tree f7debef0. Closed after the batch squashes.

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

roodboi and others added 13 commits October 21, 2026 16:07
The stream relay contract probed a free loopback port by binding
127.0.0.1:0 and dropping the listener before the publisher bound it.
Under parallel tests another socket could take the port first; the
publisher then failed bind() and exited 73 (EX_CANTCREAT) before
writing its readiness line, which the helper reported as
"readiness EOF" (CI run 39284084093).

`stream-relay --publish 0` now binds a kernel-chosen loopback port and
reports it as "ready <port>\n". Explicit ports and Unix frontends keep
the bare "ready\n" line, and port 0 stays refused (64) in every other
form, so existing callers are unchanged. Every test that used the
released probe now publishes on port 0 or holds the port it needs, and
the control-startup test drops its exit-73 retry.

Refs HACK-1284

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ion contract

The port-0 refusal cases waited on the child with output(), so a publisher
that wrongly admitted "--publish 00" kept serving and hung the test run
instead of failing it (found by mutating the exact-"0" check). Poll the
child against a 3s deadline, then kill and reap it and fail with the
admitted command.

Refs HACK-1284

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nobserved

The negative control for a symlinked .hack/.env built both refusal attempts
in an array literal, so upsertDotEnvValue and removeDotEnvKey ran
concurrently. When removeDotEnvKey's refusal settled first, its promise had
no handler yet while the loop awaited the first attempt. Bun reports that as
an unhandled rejection, fails the test and runs afterEach, which removes the
temp root while the test body is still running; the body's later readFile of
outside.env then fails with ENOENT as "Unhandled error between tests"
(HACK-1292).

caught() now takes a thunk, so every operation in this file starts inside
the await that observes it, and the loop passes thunks. No product change:
the refusal paths in private-file.ts await all their work before rejecting.

Refs HACK-1292

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ller deadline

The compound v14 routing-generation tests gave every harness operation a fixed
15 s caller deadline, while `hack up`/`down` give a retained operation the 90 s
Compose startup budget. In CI run 39289575897 the fourth lifecycle operation
outlived the 15 s deadline under suite load, and the product's fail-closed
deadline guard in mutateRetainedContainers refused as
E_LEGACY_ADOPTION_CHANGED, the same code as a real binding change. No binding
had changed, and the 32.9 s "store-close" phase in that log was the four
lifecycle operations: the test had no phase marker between them.

Each retained routing operation also costs more than the one before it: every
route-claim scan rereads every prior attempt and revalidates every held
directory, so the fourth lifecycle operation of a fresh fixture is the
slowest.

- operation() takes a closed caller deadline (the 15 s default or the
  product's DEFAULT_COMPOSE_STARTUP_TIMEOUT_MS) and records value-free timing
  of the last operation: elapsed ms, outcome, refusal code, whether the caller
  deadline had expired and whether any synthetic binding fact had moved.
- The compound lifecycle and rollback tests pass the product's caller
  deadline to every operation, mark a phase after each operation, attribute a
  failure with the last operation's timing, and get a budget that covers the
  bounds of the operations they run in sequence.
- Three regression tests use a synthetic clock advance after the first probe:
  an unchanged operation slower than 15 s completes under the product's
  deadline; the same operation under the 15 s default refuses as CHANGED with
  an expired deadline and an unchanged binding; a real volume birth drift still
  refuses as CHANGED before the deadline.

Refs HACK-1283

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hecks locally

Root test, check and typecheck, and the CLI package's test, check and
typecheck, now run `bun run check:bun-version` first. It fails when the
running Bun differs from the package.json packageManager pin that CI
installs, unless HACK_ALLOW_BUN_VERSION_MISMATCH=1 is set deliberately.
Turbo passes that variable through so package tasks honor it.

`bun run check:native-plan-cli` runs the compiled-bundle CLI checks that
previously ran only in CI's Config compiler job. A wiring test fails when
a scripts/check-native-*-plan-cli.ts is missing from it or from CI.

Refs HACK-1290
Refs HACK-1294

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The P01 killed-installer step polls owned install containers while a
concurrent `hack up` recreates the linked `install` service. Compose
removed the listed container between `docker ps -aq` and
`docker inspect`, so the helper failed with "No such object".

ownedContainers now inspects with `--type container` and accepts only a
listed ID that Docker reports missing and `docker ps` confirms absent;
any other inspection failure still fails the scenario.

Refs HACK-1296

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The check and typecheck package scripts now run check:bun-version first, so the
reviewed task catalog's pins for them were stale (stale_recipe). Pins are the
canonical-JSON digests the catalog computes; test:models is unchanged.

Refs HACK-1290, HACK-1157

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@roodboi roodboi closed this Oct 22, 2026
@roodboi
roodboi deleted the train/b29 branch October 22, 2026 08:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant