feat(ci): run L0/L1 offline checks, mutation suites and yamllint in bounded parallel pools #149

Merged
jakman85 merged 2 commits from feat/parallel-l0-checks into main 2026-11-08 06:53:42 +00:00
Owner

Speeds up the merge gate by running independent subprocess loops in bounded pools. No verdict, exit code or output order changes.

What

  • conformance/lib/run_l1_offline.py: L0/L1 offline checks run in a thread pool (--jobs / CONF_OFFLINE_JOBS, default min(8, usable CPUs); 1 = serial). Results are consumed in submission order, so JUnit, step summary and 0/1/3 aggregation stay identical. Children get a smaller MUTATION_JOBS when the runner is parallel, to avoid nested-pool oversubscription.
  • keycloak-{passkey,client-secret}-reconciler/mutations.py: anchors are still checked first (serially), then the --selftest children run in a pool (MUTATION_JOBS, default min(8, CPUs)), reported in MUTATIONS order.
  • ci/lint.sh: yamllint runs over LINT_JOBS contiguous slices at once, with per-slice output buffered and printed in order. The stage's rc is the highest slice rc.

Measured locally (pinned toolbox, 24 CPUs)

  • gate: 183.9s -> 32.1s in-container (rc 3 both times; gitea-settings was the only stage that did not run)
  • l0 stage: 168.3s -> 21.1s; same tree, all 25 checks, serial vs parallel: 164-165s -> 18.7-19.2s, with JUnit and summary cmp-identical
  • lint: 7.8s -> 2.4s
  • Falsification (not committed): I made one passkey mutation a no-op. Serial and parallel both report SURVIVED, and the gate returns rc 1 BLOCKED.

Parallel-safety audit of all 28 offline checks, plus the timing caveats, is in decisions/2026-11-08-parallel-l0-checks.md.

Needs operator review. ci/** and conformance/** are sensitive paths, so approval-policy will be red until a non-author reviews. The agent did not and will not post /approve-override.

🤖 Generated with Claude Code

Speeds up the merge gate by running independent subprocess loops in bounded pools. No verdict, exit code or output order changes. **What** - `conformance/lib/run_l1_offline.py`: L0/L1 offline checks run in a thread pool (`--jobs` / `CONF_OFFLINE_JOBS`, default `min(8, usable CPUs)`; `1` = serial). Results are consumed in submission order, so JUnit, step summary and 0/1/3 aggregation stay identical. Children get a smaller `MUTATION_JOBS` when the runner is parallel, to avoid nested-pool oversubscription. - `keycloak-{passkey,client-secret}-reconciler/mutations.py`: anchors are still checked first (serially), then the `--selftest` children run in a pool (`MUTATION_JOBS`, default `min(8, CPUs)`), reported in `MUTATIONS` order. - `ci/lint.sh`: yamllint runs over `LINT_JOBS` contiguous slices at once, with per-slice output buffered and printed in order. The stage's rc is the highest slice rc. **Measured locally (pinned toolbox, 24 CPUs)** - gate: 183.9s -> 32.1s in-container (rc 3 both times; gitea-settings was the only stage that did not run) - l0 stage: 168.3s -> 21.1s; same tree, all 25 checks, serial vs parallel: 164-165s -> 18.7-19.2s, with JUnit and summary `cmp`-identical - lint: 7.8s -> 2.4s - Falsification (not committed): I made one passkey mutation a no-op. Serial and parallel both report `SURVIVED`, and the gate returns **rc 1 BLOCKED**. Parallel-safety audit of all 28 offline checks, plus the timing caveats, is in `decisions/2026-11-08-parallel-l0-checks.md`. **Needs operator review.** `ci/**` and `conformance/**` are sensitive paths, so `approval-policy` will be red until a non-author reviews. The agent did not and will not post `/approve-override`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
gitea-admin added 2 commits 2026-11-08 06:36:31 +00:00
- conformance/lib/run_l1_offline.py: checks run in a thread pool (--jobs / CONF_OFFLINE_JOBS,
  default min(8, usable CPUs)); results consumed in submission order, so log lines, JUnit,
  step summary and the 0/1/3 aggregation are unchanged. Exports a smaller MUTATION_JOBS to
  the children when parallel, so nested pools do not oversubscribe.
- keycloak-{passkey,client-secret}-reconciler/mutations.py: anchors checked first (serial),
  then the --selftest subprocesses run in a pool (MUTATION_JOBS, default min(8, CPUs));
  verdicts reported in MUTATIONS order. Output byte-identical to the serial loop.
- ci/lint.sh: yamllint over LINT_JOBS contiguous slices concurrently, per-slice output
  buffered and printed in order; stage rc = highest slice rc.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
docs(decisions): handoff for parallel L0 checks; runner usage names --jobs
gate / gate (pull_request) Successful in 59s
gate / conformance (pull_request) Skipped
89f48e4a5f
Co-Authored-By: Claude Opus 5.5 <[email protected]>
jakman85 approved these changes 2026-11-08 06:46:25 +00:00
Dismissed
jakman85 approved these changes 2026-11-08 06:53:29 +00:00
jakman85 merged commit 0b0b5abc8e into main 2026-11-08 06:53:42 +00:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Home-Network/home-network-k3s-impl#149