Files
codebase-memory-mcp/scripts/ci
Martin Vogel 57b557ced8 fix(test-impact): close the role table's fail-opens, follow literals through macros
The first commit of this branch is the Smart CI change as of the rebase
onto 9f85f104. A review of it found places where the engine could run
fewer tests than a change needs; each now runs everything or selects the
right tests, with a test that fails when its fix is reverted.

Engine:
- A `#define NAME "literal"` line counted as naming a role but selected
  nobody, so the tests that start the blocking-git probe through their
  marker macros would not have run. The scan now follows NAME, as a whole
  word, to the code that uses it, through chains of up to 4 macros; a
  define it cannot follow runs everything.
- main dispatches through the role table, so no edge leads from main to a
  handler. A table entry the engine cannot read, or whose handler is not
  exactly one function, was skipped; it now runs everything.
- In a runner file, only a test case names a role's literal. The runner's
  own helper that reads the marker no longer counts as a spawner, so a
  role only the runner names runs everything again.
- A handler reached first by a parse gap or by the spawn lift was never
  lifted. Role lifts and parse gaps now run to a fixpoint, before the
  runner check and again after the spawn lift.
- A reached sink that main calls (the blocking-git probe) counted as a way
  into main and hid the real one: #2644 now names the start-up path main
  -> cbm_index_supervisor_capture_build_fingerprint.
- No pointer past the end of a role line; the RUNNER_REACHED note clamps
  its prefix.

CI:
- pkg/npm/README.md, which test_cli reads, runs the test legs instead of
  the docs tier.
- The build rule lists the harness scripts the test legs run:
  run-test-wave.py, path-safety.sh, clean.sh.
- The revert guard rejects the ancestor's coverage when a diff fails.
- The vetoed selection is uploaded (test-selection-vetoed).

Docs: SMART_CI.md states the new fail-safe cases, the version that lacks
the new config keys, the selection base, and that the narrowed leg builds
with gcc while the coverage comes from clang.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-10-17 20:44:27 +02:00
..

scripts/ci/ — venue plumbing (single implementations)

Support scripts that keep the venues in the SAME shape. Each exists because the logic used to live inline in workflow YAML or was hand-duplicated between CI and the local infrastructure — both of which the venue-parity contract (tests/test_venue_parity_contract.sh) now forbids. Everything here answers --help (PowerShell: comment-based help, Get-Help <script>).

script job called by
new-protected-temp-root.ps1 Create the owner-stamped, inheritance-protected per-user TEMP root the daemon/install suites require (shared /tmp and default runner TEMP grant Authenticated-Users mutation rights, which the trust policy correctly refuses — running there produces security refusals, not signal). -ProtectDir stamps build dirs the same way. _test.yml, _soak.yml, vm-run-tests.sh
clean-test-residue.ps1 Sweep cbm-* residue from the Windows VM and assert runner-like free disk (default 14 GB — the GitHub runner's SSD). Long-path \\?\ fallback for the guard suites' adversarial trees; every removal VERIFIED (an earlier version counted attempts and reported 86 swept while 11 GB remained). BLOCKS below the floor: a disk that fills mid-run reads as a product bug. win.sh before every build/run
preflight-docker.sh Same idea for Colima/docker: prune runner-unlike residue, assert free space on the filesystem backing the docker data root (not the VM's /). Build cache + named volumes KEPT (the local analogue of actions/cache); --deep drops them. test-infrastructure/run.sh
check-glibc-compat.sh Run a linux binary in debian:bullseye (glibc 2.31) — the portable binary must start on old glibc. _smoke.yml portable legs
generate-sbom.py The release SPDX SBOM (vendored versions reviewable here, diffable by vendoring PRs — was inline YAML). release.yml
require-all-green.sh The aggregate gate: fail unless every needed job succeeded or legitimately skipped (was inline YAML) — and, under lane selection, every SELECTED lane ran and succeeded (skipped/cancelled/missing = red; unselected lanes may skip). pr.yml ci-ok
select-lanes.sh Decide which PR lanes a change set runs (tier, lanes, full, reasons) from its file list — the R1 rule set, fail-safe to every lane. Pinned by tests/test_select_lanes.sh and the September 2026 history replay (scripts/test-impact/replay-selector.sh). pr.yml changes
test-impact-shadow.sh The report-only test-impact shadow: fetch the latest released binary (checksum-verified) or take a given one, index this checkout into a throwaway cache, run detect_changes against the base and map it to suites (scripts/test-impact/predict.py). Never gates. pr.yml test-impact-shadow
verify-shard-union.sh Prove sharded test legs lost nothing: shard count agreement, indices 1..n, identical suite lists, union of slices == full list (was inline YAML). No manifests is green only when the lane selection holds no test leg. _test.yml shard-completeness
prepare-release-candidates.sh Copy one linker output into stripped/unstripped candidates, finalize signatures, composition-check them without execution, and record their hashes. _build.yml, local artifact smoke
stage-release-candidates.py Admit exactly eight candidate artifacts / sixteen byte-distinct binaries into the content-addressed VirusTotal scan set. _build.yml
select-release-candidates.py Apply the reviewed tuple-local VT truth table, or the explicit dry-run stripped default, and atomically copy one content-bound binary per target. _build.yml
verify-release-selection.py Recompute the selection policy and prove every executable member in all 14 public containers equals its selected SHA-256. _build.yml, release.yml final draft verification
check-virustotal.sh Poll and validate the exact candidate scan set, enforce engine coverage and the narrow documented Microsoft !ml policy, and emit content-bound results evidence. _build.yml