Skip to content

train b55 integration gate (do not merge) - #488

Closed
roodboi wants to merge 12 commits into
nextfrom
train/b55
Closed

roodboi wants to merge 12 commits into
nextfrom
train/b55

Conversation

@roodboi

@roodboi roodboi commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Integration gate for merge batch b55: origin/next + #480 (HACK-1422) + #475 (HACK-1423) + #476 (HACK-1424) + #478 (HACK-1425) + #479 (HACK-1426). Tree aeeb0433. 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 12 commits October 24, 2026 02:00
…d flags after the subcommand

Git 2.20-2.33 ship a `rebase--interactive` builtin whose `--cmd <cmd>`
adds an exec line after each pick and runs it. The task catalog's
inline-command denylist did not model it, so `git rebase--interactive
--cmd id`, its `--cmd=id` form and the dashed `git-rebase--interactive`
were accepted. `--cmd` is now a Git inline flag under every subcommand
(no Git option shares the `--cm` prefix, and a repository alias can
rename the helper), and `<sub>--interactive` is read as its porcelain
like `<sub>--helper`, so its `--add-exec-commands` mode meets the
`rebase`-scoped flag.

Subcommand-scoped flags (`clone -u`, `rebase --add-exec-commands`) now
count only after an operand naming the subcommand: Git reads a
subcommand's options after its name and rejects an unknown option before
it, so `git push -u origin clone`, `git config --add alias.r rebase` and
`git remote set-branches --add origin rebase` pass, while an unknown
global option's value still cannot hide the subcommand. The remaining
collateral (`git commit -m rebase --add`, `git log -S clone -u`) is
documented and tested.

The tracked-pin test now uses CASE_TIMEOUT_MS.

Refs HACK-1423

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…le CI test job docs

Since #442 the `test` job is only the required fan-in of the four
`test shard i/4` jobs. It runs no Bun, but `ci:bun-crash-census` still
read it by default and reported zero crashes without saying so, and
`workflowJobBunVersion(ci.yml, "test")` found the fan-in block, which
has no setup-bun.

- With no --job, the census reads every `test shard i/n` job of a run,
  or the `test` job of a run that has no shard job (a run from before
  the split, whose `test` job ran the suite).
- --job accepts `/` and a `*` pattern, so the documented
  `--job "test shard 1/4"` and `--job "test shard *"` work; before,
  both were refused as an invalid argument.
- The workflow lookup matches a job by its `name:` template, so
  `test shard 2/4` finds the `test-shard` matrix job's Bun pin.
- The report prints a closed `warning:` line (also on stderr, and in
  --json) when no job matched or a selected job shows no Bun setup in
  its log or workflow block.
- docs/security/env-secrets-threat-model.md and
  docs/reference/shared-host-lifecycle.md now say the tests run in a
  `test shard i/4` job and that `test` is the fan-in.

Refs HACK-1424

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n bound and Loki hint wiring

- Pin NATIVE_EXIT_DRAIN_BOUND_MS at its documented 5 s floor and above the
  late-writer delay, and assert the held-descendant cases (runtime client and
  foreground graph owner) keep reading for the whole production bound, so a
  smaller constant or default no longer passes.
- Add late-closed-code cases for the one-off and recovery (selection and
  cleanup) bound drains.
- Add CLI cases that carry --pretty, --query and --until into the empty-Loki
  hint through src/commands/project.ts.
- `hack global logs-reset` now says it also deletes the Alloy read positions
  volume in its prompt and summary; regenerate docs/reference/cli.md.

Refs HACK-1425

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…urate gitignore entry, no-TTY Tailscale test)

- `hack up` without a project now prints the closed
  `E_PROJECT_NOT_FOUND: ...` line like down, restart, ps, logs and open.
- ensureGitignoreEntry reads each line as git does (trailing CR and
  spaces dropped, leading whitespace kept), so an indented
  `.hack.secret.key` no longer counts as the entry and is no longer
  refused as "re-included"; the exact entry is appended instead.
- tests: no-TTY guard test for "Turn on Tailscale?", a named warm-up
  for the cold transpiler cache in that file, the ACL test's setup moved
  inside its try, and the paired mode-000 `.hack` fixture without
  `.hack/.internal` restored.

Refs HACK-1426

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ad of refusing it as a symlink

An unlocked read of a `.hack/.env*` file (the preflight in
`upsertDotEnvValue`/`removeDotEnvKey`, and every resolver) compared the
inode seen by `lstat` with the inode it then opened. A concurrent writer's
atomic rename landing between the two made the reader exit 1 with the
"symlink or not a regular file" refusal, although the path only ever held
regular files. `readReplaceablePrivateFile` now starts the read again when
both entries are regular files (at most `REPLACEABLE_READ_ATTEMPTS`), and
still refuses a symlink or non-regular entry at once and a path replaced on
every attempt. This was the cause of the intermittent
`project-env-layer-lock` legacy dotenv failure; #435's layer lock was
already in place, so no update was lost.

Also fix two test-only flakes from HACK-1422:
- native-runtime-client: wait for the keeper's completion text, not for the
  file's existence; the keeper now opens the empty-file window every run.
- xattr-owner: give the in-process durable store cases a named 30 s budget
  instead of Bun's 5 s default; they wait on no timer.

Refs HACK-1422

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

The same-birth root replacement case still timed out at 30 s on a host at
load average 45-95 on 18 CPUs. Its cost is a fixed amount of store file
work (about 19k lstat, 13k realpath and 4.5k open calls in its second `up`,
the same on every run), so its wall time follows host load. A larger budget
alone was not enough: the fake carrier's fixed 60 s deadline then expired
first and the case failed with the storage witness refusal instead of the
asserted E_NATIVE_COMPOSE_UNCERTAIN.

The fake carrier's lifetime is now twice the store case budget, so a slow
host can only fail a case as a clean Bun timeout. The budget is 180 s, a
hang guard rather than a speed assertion.

Refs HACK-1422

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@roodboi roodboi closed this Oct 24, 2026
@roodboi
roodboi deleted the train/b55 branch October 24, 2026 18:08
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