redhat-et / redhat-et/ripwire

Delivery coordination: five lanes queued for main (2026-09-08)

Open
#71 10 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
2.1k
Forks
125
Avg merge
5h 42m
Merged PRs (30d)
136

Description

Several rounds are running in parallel and all of them want `main`. This is the running order, what each
lane is blocked on, and the two traps that have already cost a red `main` once today. **Edit this issue as
lanes land** rather than starting a new thread.

`origin/main` = **4c10be9d** (lane 5 landed 2026-09-09, on top of lane 3's f2589419), gate count **563**.

## Order, and why

Not "who finished first". Two things serialise us; everything else is free:

1. **Generated files.** `docs/COMMANDS.md` is built by `docs/docs_commands_build.py`. Three lanes touch
it. **Regenerate after rebasing — never hand-merge.** `docscommandscheck` arm (G) checks which capture
produced it.
2. **Counts a gate re-derives.** The gate count (8 sites, from `regression.sh`'s loop) and the paper/repo
counts (6 sites, from `docs/LINEAGE.md` rows).

| # | lane | state | blocked on |
| --- | --- | --- | --- |
| 1 | `lane/pr55-installer-isolation` (PR #55) | ahead 3, **behind 4** | rebase onto 26abcc79 + re-dispatch. Mine |
| 2 | `ci/std-print-floor-2026-09-08` | **LANDED** — main `88a5503b` (a `--no-ff` merge of `1095ed70`; tree identical; `git revert -m 1 88a5503b` undoes it). Proof: `48c42046` green on every job in [34293608628](https://github.com/redhat-et/ripwire/actions/runs/34293608628); `1095ed70` re-proving in [34298150602](https://github.com/redhat-et/ripwire/actions/runs/34298150602); main's own run [34298547133](https://github.com/redhat-et/ripwire/actions/runs/34298547133) **green on every job** (the branch run's one macOS red was the crawl-root-mutation flake in the standing items — same tree passed on main) | What is now on main for everyone: `--version` carries `emit=std::print` (versioncheck #6); CMakeLists' libstdc++ ignorelist exempts ``/`` (spelled `c\+\+`) and g1configcheck's audited list enumerates it — any new `src:` rule must move those counts; ubuntu gcc legs pin gcc-14, RHEL probe floor 14, macOS legs Xcode 16.2, every job asserts the emitter after Build; `fallback-emitter` job; the shotgun round's `--cochange`/`--situ` naming and EVALS section |
| 3 | recall / context-mode | ✅ **LANDED** — main `30b72ec0` (--no-ff merge of `lane/recall-passage-2026-09-08` @ `d5c75a9d`), CI run 34301707466 26/26 green. Gate count 562 → **563** (`recallpassagecheck`); repositories 42 → **43** (context-mode LINEAGE row); papers 69 unchanged. Also carries the capture scrub: the 21 unredacted planning headings in `COMMANDS_showcase_2026-08-10.md` are gone from main | — |
| 4 | confident-zero (#62/#63/#66, now also #59/#60) | in progress | scope decision — see below |
| 5 | `lane/gate-isolation-2026-09-09` | **LANDED** — main `4c10be9d` (a `--no-ff` merge of `adef346d`; tree identical; `git revert -m 1 4c10be9d` undoes it). Proof: `adef346d` green on all 26 jobs in [34308541762](https://github.com/redhat-et/ripwire/actions/runs/34308541762); main's own run [34310769504](https://github.com/redhat-et/ripwire/actions/runs/34310769504) | What is now on main for everyone: `test/pargates.py` prints `tree_writes=N` on its summary line and FAILS the run when a gate leaves a new untracked/modified path in the checkout, naming the gates in flight (a 0.25 s sampler — N is a floor); `.gateprobe.*` is gitignored; gateexitcheck has arm (F); tokenbudgetcheck's determinism arms crawl a private copy of src/; prbudgetcheck spells its fixture root `$FIX`; CONTRIBUTING §1 (never write into the checkout) and §2 rule 5 (remove the shape, not the instance); `--porcelain` in test/deckcheck_allowlist.txt. No gate added |
| — | `shotgun-surgery-measured-2026-09-08` | **landed with lane 2** (`3b3cbe02` is now an ancestor of main) | nothing — lane 3 can rebase onto main directly |

## The trap that actually bit, twice

**Two lanes making the SAME count bump do not conflict in git.** They merge cleanly into a number that is
then wrong. Main said 560, a lane said 559, and the truth was 561. `manifestcheck` is what catches it.

> **Re-derive every count AFTER rebasing. Never carry a number across a rebase.**

And **`test/regression.sh`'s absorb list is one very long line ending in `; do`.** Resolve it by taking the
other side's line verbatim and inserting your name. Rebuilding it from parsed tokens drops every name your
filter misses *and* the trailing `; do`, which puts the tail of the list after the loop header — gates
that then silently never run. Done exactly that once today; `manifestcheck` caught it.

**A gate fixture that flips a byte to a CONSTANT is a 1-in-256 no-op PER BUILD CONFIGURATION.**
`doctorcheck.sh` arm (F) built its "genuine-stale binary" by writing `'X'` at offset 100000 of a copy
of `$BIN`, and never asserted the byte changed. Where the compiled binary already held `0x58` there,
the write was a no-op, the copy stayed byte-identical, `--doctor` correctly answered
`copied="1" same_bytes="1" ok="1"`, and all five of the arm's assertions inverted — reporting a
stale-detection bug that does not exist. It reddened exactly one leg of 26 (run 34299292778,
`release (ubuntu-24.04, Release, gcc, shard 1/4)`) and was invisible to every local run and every
macOS leg, which hold a different byte there. **Read the signature:** the same shard green under
`plain/gcc`, `plain/clang` and `Release/clang` and red only at `Release`×`gcc` is a fixture keyed to
build output, not a defect in that shard's gate set — a real defect reddens all four. Fixed in
`30b72ec0`: read the byte, write `(old + 1) % 256`, and `cmp -s` before trusting the arm. Latent on
main since the 2026-09-06 rewrite, so it could have bitten any lane on any run.

## Validate on GitHub, not locally

```bash
git push origin HEAD:lane/
gh workflow run ci.yml --ref lane/
```

Free on a public repo, and **better coverage than any local run**: six legs (Release/plain × macOS
AppleClang / Linux gcc / Linux clang) plus RHEL ubi9 and ASan. Today a gate passed locally, passed both
macOS legs, and failed **all four Linux legs** — it overrode `HOME` but not `XDG_CONFIG_HOME`, which is
unset on macOS and set on Linux CI. No local run could have found it.

Also: 18 cores were carrying load average 27/46/48 earlier with five sessions building at once, and two
`-j 6` batteries were killed at **exit 144** with ~270 bytes of output. That is starvation, not your gates.

## Other standing items

- **A gate must not write into the shared checkout — and the writer was not the gate named here before.** The
`tokenbudgetcheck` red on [34298150602](https://github.com/redhat-et/ripwire/actions/runs/34298150602) (macOS plain
shard 2/2, `--for` arm, est_tokens 3949 vs 3947) was `at=""` vs `at="+dirty"`: six bytes, two tokens at
2.5 B/tok. `src/gitstamp.h` reads `git status --porcelain` from ANY crawl root inside the checkout, so an untracked
file anywhere in it flips every stamped determinism arm (`--for`, `--pr-context`, `--edit-check`, `--slice`, `--situ`,
`--hotspots`, `--doctor`, …) running beside the writer. `prbudgetcheck` was innocent: it rebinds `ROOT` to its own
mktemp fixture at :48, and `src/mod4.cpp` does not exist in this tree. The writer was `gateexitcheck` arm (A):
`test/gateexitfix/.gateprobe.*.sh`, untracked, ~20 ms per fixture, three worker slots from tokenbudgetcheck in that
shard's run order (seen live under a 50 Hz `git status` watcher). Fixed on lane 5; `test/pargates.py` now samples
`git status` during every run and fails it naming the gate in flight (`tree_writes=N` on the summary line, a
floor — it is a sampler). If a determinism arm reds on a shard, read that line first.
- **Rebuild AFTER committing, before validating.** `versioncheck` compares the binary's embedded
`built_from=` to HEAD. Cost two runs today.
- **Parser version collisions:** three today (#57 took 82, #56 claimed 82 → 83, #65 claimed 83 → 84). If
you bump `kParserVer`, check `origin/main` first, and move `kIngestParserVerMirror` in the same commit.
- **confident-zero scope:** #59 and #60 reproduce on today's main and are the same class — a confident
wrong edge (`graph_ambiguous="0"` on a guessed edge) and a confident zero (`tests="0"` for code a test
exercises). Triage all five together at least once before deciding whether to take them.

Contributor guide

Open the contributing guide

Research direction

Start by reading the lane table and the current origin/main state, then inspect docs/docs_commands_build.py, test/regression.sh, test/pargates.py, and the referenced CI workflow. Run the listed GitHub Actions workflow on a lane branch and verify the relevant gates, counts, generated files, and checkout cleanliness before considering a lane landed.

Written by the indexing model from the issue text.

Assessment

Tech stack
cmake, cpp, git, github-actions, python, shell
Domain
build-system, ci-cd, release, testing, tooling
Issue type
Documentation
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
20/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.