Skip to content

test: add nightly workflow for the long runs (T-11) - #408

Closed
jsam wants to merge 5 commits into
mainfrom
fm/il-345-nightly-workflow
Closed

jsam wants to merge 5 commits into
mainfrom
fm/il-345-nightly-workflow

Conversation

@jsam

@jsam jsam commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Intent

Do GitHub issue #345 in inputlayer/inputlayer, part of the test restructure in TESTING.md: "Testing: Nightly workflow (T-11)".

Part of the test strategy (captain, 2026-10-05: scenarios that test the changes together; cleaner, faster suites; TESTING.md). Epic #305.

Scope. nightly.yml: INPUTLAYER_ORACLE_SEEDS=300, INPUTLAYER_SOAK=1 soak (#298: 10 min, oracle-checked histories with 200 subscribers and slow consumers), cargo fuzz parser and WS frames for 10 min each (#301), the HNSW recall test with the level-scale fix (#302) and brute-force recall over 3 sizes, perf-gate-remote.sh on the bench host under the shared lock (PR 273), coverage once a week; results posted as a job summary; a nightly failure opens or updates one tracking issue.

Acceptance. First nightly green or with named XFAILs; the perf gate report lands in the summary; #[ignore] count stays zero.

Deliver it as a small PR; done means merged with CI green.

What Changed

  • Adds .github/workflows/nightly.yml with five jobs: every test in release at nightly scale (INPUTLAYER_ORACLE_SEEDS=300 INPUTLAYER_SOAK=1 make test-release, then quarantined scenarios and the HNSW recall tests), every cargo fuzz target for 10 minutes, the benchmark-host job, coverage (Sundays or -f coverage=true), and a report job that writes a results table to the job summary and, on a failed run on main, opens or comments on one issue labeled nightly-failure. The schedule is commented out while CI is paused, so the workflow is workflow_dispatch only. Missing pieces are reported as named XFAILs rather than failures: XFAIL #301 while there is no fuzz/Cargo.toml, and an XFAIL for the soak and performance gate when the repository variable NIGHTLY_BENCH_RUNNER is unset (the bench job is then skipped). The tests job fails if more than the 4 existing #[ignore] markers are found.
  • Adds scripts/nightly-bench.sh, which runs the concurrency soak (10 minutes, 200 consumers) and then the performance gate through scripts/perf-gate-remote.sh behind the host's lock, appends the soak summary and each gate report to the job summary, and retries an INCONCLUSIVE gate once with more rounds (still INCONCLUSIVE is a warning, not a failure).
  • Adds an HNSW recall@10 test against brute force at 1,000, 10,000 and 50,000 vectors that runs only with INPUTLAYER_SOAK=1, and prints the recall in the incremental-insert test. Reorders fields in the differential oracle's EngineHost, GroupAdapter and SubscriptionAdapter so the engine closes before its data directory is removed (Revisions: one engine with a lost data directory refuses every engine's writes in the process #402). Documents the nightly tier in TESTING.md and CONTRIBUTING, and updates the Makefile comment that said no nightly workflow existed.

🤖 Generated with Claude Code

Risk Assessment

✅ Low: The change adds a workflow that only starts by hand, a wrapper script around the existing perf-gate-remote.sh, one env-gated test and docs; all five round 1 decisions are implemented as instructed and the only open point is that the new recall bar at 10,000 and 50,000 vectors has not been run.

Testing

Built the release test binaries, then ran the differential oracle repeatedly as the nightly tests job does (300 seeds, INPUTLAYER_SOAK=1): 11 runs finished, all 9 tests passing each time. Ran the concurrency soak locally at nightly size (10 minutes, 200 consumers): verdict PASS, 0 failures. Extracted every run step from nightly.yml by parsing the YAML and executed the real scripts: the report table for five result combinations, the tracking-issue step against a recording gh stand-in, the coverage rule, the fuzz-harness check, the #[ignore] cap against a disposable copy of the tree with seven variants, the HNSW recall step and the tests summary. Ran the real scripts/nightly-bench.sh against a stand-in for the benchmark host across seven outcomes. The default-settings oracle repeats had not started at report time, so they are not counted. One observation, not a failure: the widened #[ignore] pattern also counts a variable named ignore passed as a later argument (f(0, ignore)); it fails loudly rather than silently and nothing in the tree trips it today. No UI surface, so no screenshots.

  • Live validation: ✅ go - 13 of 19 scenarios driven live against the product
Scenario Result Live Evidence
The differential oracle passes repeatedly at INPUTLAYER_ORACLE_SEEDS=300 with INPUTLAYER_SOAK=1 in release, as the nightly tests job runs it (round 2 failure) ✅ pass live round3/flake/summary.txt and nightly-N.log: 11 of 11 finished runs exit 0 with 9 passed, 0 failed. Round 2 failed 6 of 17 under the same command. Runs 12-20 were still in progress at report time.
The differential oracle passes repeatedly at default settings (the PR gate's form of the same flake) ⏸️ untested no The 15 default-settings repeats are queued behind the nightly-settings repeats in the same background loop and had not started when this result was required. Nothing is out of reach; the loop only nee…
The 10-minute, 200-consumer concurrency soak (fast, slow, stalled, grouped, short-lived consumers, every observation oracle-checked) passes on this commit ✅ pass live round3/soak-local-summary.md and round3/soak-local.log: Verdict PASS, 0 failures, 86887 commits over 601 s, 150 fast / 20 slow / 10 stalled / 10 group / 10 churn consumers. Run locally, not on the ben…
First nightly as things stand: report table shows tests success, fuzz XFAIL #301, soak and gate XFAIL for the unset bench runner, coverage not due ✅ pass live round3/report-cases.md, first case
Report table shows real failures and cancellations as such, not as XFAIL ✅ pass live round3/report-cases.md, cases 3-5
A failed nightly opens one tracking issue, and comments on the open one instead of opening a second ✅ pass live round3/tracking-issue-standin.txt: gh issue create when none is open; gh issue comment 512 when one is. Driven with a recording gh stand-in, so the real step script ran but no GitHub call was made…
Coverage runs only when a manual run asks for it or on a scheduled Sunday ✅ pass live round3/coverage-due.txt
With no fuzz harness in the tree the fuzz job writes a named XFAIL #301 and reports the harness absent ✅ pass live round3/fuzz-harness.txt
The tests job passes the #[ignore] cap on the tree as shipped and lists the four tracked ignores under 'Tests marked #[ignore] (existing, tracked)' ✅ pass live round3/ignore-guard.txt (first case) and round3/tests-summary.md
Adversarial: adding a new ignored test in any form (#[ignore], with reason, reason-less cfg_attr, negated cfg_attr, multi-line cfg_attr) makes the tests job fail ✅ pass live round3/ignore-guard.txt: all five forms exit 1 with '5 tests are marked #[ignore], more than the 4 tracked'; a test gated on INPUTLAYER_SOAK exits 0
The HNSW recall step runs brute-force recall at three sizes under INPUTLAYER_SOAK=1 and every recall line reaches the summary ✅ pass live round3/recall-step.out and round3/tests-summary.md: five recall lines (n=1000, 10000, 50000, 3000, 3000 after incremental inserts), 3 tests passed
Without INPUTLAYER_SOAK the three-size recall test returns at once, so it does not slow the PR gate ✅ pass live round3/recall-no-soak.txt: 1 passed in 0.00s, no recall lines
The quarantined-scenarios step runs cleanly in release ✅ pass live round3/rt/quarantined.log: exit 0; no scenario is ignored in release, so 0 tests ran
nightly-bench.sh runs the soak then the gate, always runs both, retries an INCONCLUSIVE gate once with 30 rounds, and puts both reports in the job summary ✅ pass live round3/nightly-bench-orchestration.txt: seven host outcomes with exit codes, arguments passed to perf-gate-remote.sh and the resulting summary. The real script ran; the benchmark host was a stand-in.
The soak and the performance gate run on the real benchmark host under its shared lock and the gate report lands in the run summary ⏸️ untested no The benchmark host (sam-dev-benchmarks) is a shared service behind a lock that other work uses, so I did not start a multi-hour run on it. It also needs a self-hosted runner and the NIGHTLY_BENCH_RUNN…
The whole make test-release suite passes at nightly scale ⏸️ untested no This step's rules forbid running the complete repository test suite. I ran the parts this change touches (oracle, recall, quarantined scenarios). Hosted CI is paused, so a manual workflow_dispatch o…
The workflow runs end to end on GitHub Actions from a manual dispatch (first nightly green or with named XFAILs) ⏸️ untested no Dispatching needs the workflow on the default branch of inputlayer/inputlayer and Blacksmith runners; pushing and dispatching belong to later phases, and no local Actions runner (act) is on PATH. Star…
cargo fuzz runs the parser and WS frame targets for 10 minutes each ⏸️ untested no The fuzz harness is issue #301 and is not in the tree, so there are no targets to run; the workflow reports this as XFAIL #301.
Coverage is generated and its summary posted when asked for ⏸️ untested no make coverage needs cargo-tarpaulin, which is not installed here, and instruments the whole suite, which this step may not run. The gating rule for when it runs was driven live.
Evidence: Oracle repeat runs at nightly settings (11 complete, 0 failed)
nightly run 1 exit=0 test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 44.39s 
nightly run 2 exit=0 test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 36.75s 
nightly run 3 exit=0 test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 50.16s 
nightly run 4 exit=0 test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 37.97s 
nightly run 5 exit=0 test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 64.71s 
nightly run 6 exit=0 test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 68.50s 
nightly run 7 exit=0 test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 87.00s 
nightly run 8 exit=0 test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 83.81s 
nightly run 9 exit=0 test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 69.00s 
nightly run 10 exit=0 test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 86.12s 
nightly run 11 exit=0 test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 82.94s 
nightly run 12 exit=0 test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 47.03s 
Evidence: Local soak summary: 10 minutes, 200 consumers, PASS
# Concurrency soak

16 writers at 20 programs/s each for 601 s, rule churn every 1000 ms, 16 nodes; consumers: 150 fast, 20 slow, 10 stalled, 10 group, 10 churn, 4 read. Seed 1.

**Verdict: PASS** (0 failure(s)).

- commits: 86887 (145/s), 572 rule replacements, final revision 86911
- write latency: p50 76.7 ms, p99 352.5 ms, max 6052.2 ms
- reference: 86887 revisions judged, slowest 63.2 ms, most observations waiting 172897
- server memory: 105 MiB mid-run, 113 MiB at the end, peak 136 MiB (at 25/50/75/100% of the run: 102/104/112/90 MiB)
- server log: ws_send_timeout 33, ws_slow_subscriber_disconnected 0, ERROR 0, panicked 0

| consumers | n | connections | deltas/reads | verified | lag p50 ms | lag p99 ms | lag max ms | stalls | disconnects | notifications missed |
|---|---|---|---|---|---|---|---|---|---|---|
| fast | 150 | 150 | 12421869 | 12425169 | 20.8 | 319.2 | 4756.5 | 0 | 0 | 0 |
| slow | 20 | 40 | 895732 | 896392 | 19246.2 | 51802.9 | 60030.0 | 0 | closed 20 | 74 |
| stalled | 10 | 23 | 712141 | 712504 | 16.1 | 8890.8 | 53624.7 | 18 | closed 13 | 0 |
| group | 10 | 10 | 82330 | 823500 | 20.0 | 332.1 | 5106.4 | 0 | 0 | 0 |
| churn | 10 | 2337 | 230760 | 239458 | 18.1 | 294.9 | 4756.4 | 0 | 0 | 0 |
| read | 4 | 4 | 9450 | 236250 | - | - | - | 0 | 0 | 0 |
Evidence: Tests job summary as rendered by the workflow step
## Tests at nightly scale

`INPUTLAYER_ORACLE_SEEDS=300 INPUTLAYER_SOAK=1 make test-release`

| Binary | Tests | Failed | Seconds |
|---|---:|---:|---:|
| tests/differential_oracle/main.rs (differential_oracle) | 9 | 0 | 44.39 |
| **total (1 binaries)** | 9 | 0 | 44.39 |

\### HNSW recall

`` `
hnsw recall@10 (n=1000, dim=32, ef_search=128): 1.0000
hnsw recall@10 (n=10000, dim=32, ef_search=128): 1.0000
hnsw recall@10 (n=50000, dim=32, ef_search=128): 0.9940
hnsw recall@10 (n=3000, dim=32, ef_search=64): 0.9980
hnsw recall@10 (n=3000 after incremental inserts, dim=32, ef_search=64): 0.9980
`` `

\### Expected failures

`` `
Expected failures still open: none
`` `

\### Tests marked #[ignore] (existing, tracked)

`` `
src/hnsw_index_tests.rs:377:#[ignore = "stress test: run in release on demand, see its doc"]
tests/replication_tests.rs:932:#[ignore = "measurement lab: run on the perf gate host"]
tests/replication_tests.rs:1029:#[ignore = "measurement lab: run on the perf gate host"]
tests/scenarios/saturation.rs:191:    ignore = "timing bounds hold for a release engine; `make e2e-reactive` runs it"
`` `
Evidence: Report table for five result combinations
\### first nightly as things stand: no fuzz harness, no bench runner, coverage not asked for
inputs: TESTS=success FUZZ=success FUZZ_HARNESS=false BENCH=skipped COVERAGE=success COVERAGE_DUE=
exit=0

## Nightly, 0eec6a45

| Job | Result |
|---|---|
| Tests at nightly scale | success |
| Fuzz | XFAIL #301 (no fuzz harness yet) |
| Concurrency soak (benchmark host) | XFAIL (bench runner not registered: NIGHTLY_BENCH_RUNNER unset) |
| Performance gate (benchmark host) | XFAIL (bench runner not registered: NIGHTLY_BENCH_RUNNER unset) |
| Coverage (weekly) | not due (Sundays only) |

Run: https://github.com/inputlayer/inputlayer/actions/runs/1
(report.md, the issue body, is identical)

\### everything ran and passed
inputs: TESTS=success FUZZ=success FUZZ_HARNESS=true BENCH=success COVERAGE=success COVERAGE_DUE=true
exit=0

## Nightly, 0eec6a45

| Job | Result |
|---|---|
| Tests at nightly scale | success |
| Fuzz | success |
| Concurrency soak (benchmark host) | success |
| Performance gate (benchmark host) | success |
| Coverage (weekly) | success |

Run: https://github.com/inputlayer/inputlayer/actions/runs/1
(report.md, the issue body, is identical)

\### tests failed
inputs: TESTS=failure FUZZ=success FUZZ_HARNESS=false BENCH=skipped COVERAGE=success COVERAGE_DUE=
exit=0

## Nightly, 0eec6a45

| Job | Result |
|---|---|
| Tests at nightly scale | failure |
| Fuzz | XFAIL #301 (no fuzz harness yet) |
| Concurrency soak (benchmark host) | XFAIL (bench runner not registered: NIGHTLY_BENCH_RUNNER unset) |
| Performance gate (benchmark host) | XFAIL (bench runner not registered: NIGHTLY_BENCH_RUNNER unset) |
| Coverage (weekly) | not due (Sundays only) |

Run: https://github.com/inputlayer/inputlayer/actions/runs/1
(report.md, the issue body, is identical)

\### bench failed, fuzz crashed, coverage failed
inputs: TESTS=success FUZZ=failure FUZZ_HARNESS=true BENCH=failure COVERAGE=failure COVERAGE_DUE=true
exit=0

## Nightly, 0eec6a45

| Job | Result |
|---|---|
| Tests at nightly scale | success |
| Fuzz | failure |
| Concurrency soak (benchmark host) | failure |
| Performance gate (benchmark host) | failure |
| Coverage (weekly) | failure |

Run: https://github.com/inputlayer/inputlayer/actions/runs/1
(report.md, the issue body, is identical)

\### fuzz cancelled before the harness check
inputs: TESTS=success FUZZ=cancelled FUZZ_HARNESS= BENCH=skipped COVERAGE=success COVERAGE_DUE=
exit=0

## Nightly, 0eec6a45

| Job | Result |
|---|---|
| Tests at nightly scale | success |
| Fuzz | cancelled |
| Concurrency soak (benchmark host) | XFAIL (bench runner not registered: NIGHTLY_BENCH_RUNNER unset) |
| Performance gate (benchmark host) | XFAIL (bench runner not registered: NIGHTLY_BENCH_RUNNER unset) |
| Coverage (weekly) | not due (Sundays only) |

Run: https://github.com/inputlayer/inputlayer/actions/runs/1
(report.md, the issue body, is identical)
Evidence: First-nightly report as things stand
## Nightly, 0eec6a45

| Job | Result |
|---|---|
| Tests at nightly scale | success |
| Fuzz | XFAIL #301 (no fuzz harness yet) |
| Concurrency soak (benchmark host) | XFAIL (bench runner not registered: NIGHTLY_BENCH_RUNNER unset) |
| Performance gate (benchmark host) | XFAIL (bench runner not registered: NIGHTLY_BENCH_RUNNER unset) |
| Coverage (weekly) | not due (Sundays only) |
Evidence: #[ignore] cap: shipped tree, five new-ignore forms, control, false-positive probe
\### tree as shipped
step output: <none>
exit=0
ignore section of the summary:
    ### Tests marked #[ignore] (existing, tracked)
    
    `` `
    src/hnsw_index_tests.rs:377:#[ignore = "stress test: run in release on demand, see its doc"]
    tests/replication_tests.rs:932:#[ignore = "measurement lab: run on the perf gate host"]
    tests/replication_tests.rs:1029:#[ignore = "measurement lab: run on the perf gate host"]
    tests/scenarios/saturation.rs:191:    ignore = "timing bounds hold for a release engine; `make e2e-reactive` runs it"
    `` `

\### new #[ignore]
added tests/sneaky.rs:
    | #[test]
    | #[ignore]
    | fn t() {}
step output: ::error title=New #[ignore]::5 tests are marked #[ignore], more than the 4 tracked. Gate a long test on INPUTLAYER_SOAK=1 instead.
exit=1
ignore section of the summary:
    ### Tests marked #[ignore] (existing, tracked)
    
    `` `
    src/hnsw_index_tests.rs:377:#[ignore = "stress test: run in release on demand, see its doc"]
    tests/replication_tests.rs:932:#[ignore = "measurement lab: run on the perf gate host"]
    tests/replication_tests.rs:1029:#[ignore = "measurement lab: run on the perf gate host"]
    tests/scenarios/saturation.rs:191:    ignore = "timing bounds hold for a release engine; `make e2e-reactive` runs it"
    tests/sneaky.rs:2:#[ignore]
    `` `

\### new #[ignore = "reason"]
added tests/sneaky.rs:
    | #[test]
    | #[ignore = "slow"]
    | fn t() {}
step output: ::error title=New #[ignore]::5 tests are marked #[ignore], more than the 4 tracked. Gate a long test on INPUTLAYER_SOAK=1 instead.
exit=1
ignore section of the summary:
    ### Tests marked #[ignore] (existing, tracked)
    
    `` `
    src/hnsw_index_tests.rs:377:#[ignore = "stress test: run in release on demand, see its doc"]
    tests/replication_tests.rs:932:#[ignore = "measurement lab: run on the perf gate host"]
    tests/replication_tests.rs:1029:#[ignore = "measurement lab: run on the perf gate host"]
    tests/scenarios/saturation.rs:191:    ignore = "timing bounds hold for a release engine; `make e2e-reactive` runs it"
    tests/sneaky.rs:2:#[ignore = "slow"]
    `` `

\### new cfg_attr(debug_assertions, ignore), no reason (round 1 failure)
added tests/sneaky.rs:
    | #[test]
    | #[cfg_attr(debug_assertions, ignore)]
    | fn t() {}
step output: ::error title=New #[ignore]::5 tests are marked #[ignore], more than the 4 tracked. Gate a long test on INPUTLAYER_SOAK=1 instead.
exit=1
ignore section of the summary:
    ### Tests marked #[ignore] (existing, tracked)
    
    `` `
    src/hnsw_index_tests.rs:377:#[ignore = "stress test: run in release on demand, see its doc"]
    tests/replication_tests.rs:932:#[ignore = "measurement lab: run on the perf gate host"]
    tests/replication_tests.rs:1029:#[ignore = "measurement lab: run on the perf gate host"]
    tests/scenarios/saturation.rs:191:    ignore = "timing bounds hold for a release engine; `make e2e-reactive` runs it"
    tests/sneaky.rs:2:#[cfg_attr(debug_assertions, ignore)]
    `` `

\### new cfg_attr(not(debug_assertions), ignore)
added tests/sneaky.rs:
    | #[test]
    | #[cfg_attr(not(debug_assertions), ignore)]
    | fn t() {}
step output: ::error title=New #[ignore]::5 tests are marked #[ignore], more than the 4 tracked. Gate a long test on INPUTLAYER_SOAK=1 instead.
exit=1
ignore section of the summary:
    ### Tests marked #[ignore] (existing, tracked)
    
    `` `
    src/hnsw_index_tests.rs:377:#[ignore = "stress test: run in release on demand, see its doc"]
    tests/replication_tests.rs:932:#[ignore = "measurement lab: run on the perf gate host"]
    tests/replication_tests.rs:1029:#[ignore = "measurement lab: run on the perf gate host"]
    tests/scenarios/saturation.rs:191:    ignore = "timing bounds hold for a release engine; `make e2e-reactive` runs it"
    tests/sneaky.rs:2:#[cfg_attr(not(debug_assertions), ignore)]
    `` `

\### new multi-line cfg_attr with bare ignore on its own line
added tests/sneaky.rs:
    | #[test]
    | #[cfg_attr(
    |     debug_assertions,
    |     ignore
    | )]
    | fn t() {}
step output: ::error title=New #[ignore]::5 tests are marked #[ignore], more than the 4 tracked. Gate a long test on INPUTLAYER_SOAK=1 instead.
exit=1
ignore section of the summary:
    ### Tests marked #[ignore] (existing, tracked)
    
    `` `
    src/hnsw_index_tests.rs:377:#[ignore = "stress test: run in release on demand, see its doc"]
    tests/replication_tests.rs:932:#[ignore = "measurement lab: run on the perf gate host"]
    tests/replication_tests.rs:1029:#[ignore = "measurement lab: run on the perf gate host"]
    tests/scenarios/saturation.rs:191:    ignore = "timing bounds hold for a release engine; `make e2e-reactive` runs it"
    tests/sneaky.rs:4:    ignore
    `` `

\### control: a new test gated on INPUTLAYER_SOAK=1 (the recommended form) does not trip the cap
added tests/sneaky.rs:
    | #[test]
    | fn t() {
    |     if std::env::var("INPUTLAYER_SOAK").is_err() { return; }
    |     // we ignore this result, ignore that one
    |     let ignored = ignore_me(1);
    | }
step output: <none>
exit=0
ignore section of the summary:
    ### Tests marked #[ignore] (existing, tracked)
    
    `` `
    src/hnsw_index_tests.rs:377:#[ignore = "stress test: run in release on demand, see its doc"]
    tests/replication_tests.rs:932:#[ignore = "measurement lab: run on the perf gate host"]
    tests/replication_tests.rs:1029:#[ignore = "measurement lab: run on the perf gate host"]
    tests/scenarios/saturation.rs:191:    ignore = "timing bounds hold for a release engine; `make e2e-reactive` runs it"
    `` `

\### observation: a variable named ignore passed as a later argument is counted (false positive, fails loudly)
added tests/sneaky.rs:
    | #[test]
    | fn t() {
    |     let ignore = 1;
    |     f(0, ignore);
    | }
step output: ::error title=New #[ignore]::5 tests are marked #[ignore], more than the 4 tracked. Gate a long test on INPUTLAYER_SOAK=1 instead.
exit=1
ignore section of the summary:
    ### Tests marked #[ignore] (existing, tracked)
    
    `` `
    src/hnsw_index_tests.rs:377:#[ignore = "stress test: run in release on demand, see its doc"]
    tests/replication_tests.rs:932:#[ignore = "measurement lab: run on the perf gate host"]
    tests/replication_tests.rs:1029:#[ignore = "measurement lab: run on the perf gate host"]
    tests/scenarios/saturation.rs:191:    ignore = "timing bounds hold for a release engine; `make e2e-reactive` runs it"
    tests/sneaky.rs:4:    f(0, ignore);
    `` `
Evidence: nightly-bench.sh against a stand-in benchmark host
################ soak PASS, gate PASS (stand-in host statuses: 0,0)
=== Concurrency soak (10 min, 200 consumers) ===
=== Performance gate ===
Performance gate: PASS
nightly-bench exit=0
--- invocations of perf-gate-remote.sh:
ARGS: --rev HEAD --wait-lock 60 --bench soak -- --secs 600 --set FAST=150 --set SLOW=20 --set STALLED=10 --set GROUPS=10 --set CHURNERS=10
ARGS: --rev HEAD --wait-lock 60
--- job summary:
## Concurrency soak (10 min, 200 consumers): PASS


observations checked: 123456, mismatches: 0 (run 1)

## Performance gate: PASS


| fixture | verdict |
|---|---|
| sessions | status-0 |


################ soak FAIL, gate still runs (stand-in host statuses: 1,0)
=== Concurrency soak (10 min, 200 consumers) ===
::error title=Concurrency soak FAIL::See the job summary and log.
=== Performance gate ===
Performance gate: PASS
nightly-bench exit=1
--- invocations of perf-gate-remote.sh:
ARGS: --rev HEAD --wait-lock 60 --bench soak -- --secs 600 --set FAST=150 --set SLOW=20 --set STALLED=10 --set GROUPS=10 --set CHURNERS=10
ARGS: --rev HEAD --wait-lock 60
--- job summary:
## Concurrency soak (10 min, 200 consumers): FAIL


observations checked: 123456, mismatches: 0 (run 1)

## Performance gate: PASS


| fixture | verdict |
|---|---|
| sessions | status-0 |


################ gate INCONCLUSIVE then PASS on retry (stand-in host statuses: 0,2,0)
=== Concurrency soak (10 min, 200 consumers) ===
=== Performance gate ===
INCONCLUSIVE; retrying once with 30 rounds.
=== Performance gate, retry (30 rounds) ===
Performance gate: PASS
nightly-bench exit=0
--- invocations of perf-gate-remote.sh:
ARGS: --rev HEAD --wait-lock 60 --bench soak -- --secs 600 --set FAST=150 --set SLOW=20 --set STALLED=10 --set GROUPS=10 --set CHURNERS=10
ARGS: --rev HEAD --wait-lock 60
ARGS: --rev HEAD --wait-lock 60 --rounds 30
--- job summary:
## Concurrency soak (10 min, 200 consumers): PASS


observations checked: 123456, mismatches: 0 (run 1)

## Performance gate: INCONCLUSIVE


| fixture | verdict |
|---|---|
| sessions | status-2 |

## Performance gate, retry (30 rounds): PASS


| fixture | verdict |
|---|---|
| sessions | status-0 |


################ gate INCONCLUSIVE twice (stand-in host statuses: 0,2,2)
=== Concurrency soak (10 min, 200 consumers) ===
=== Performance gate ===
INCONCLUSIVE; retrying once with 30 rounds.
=== Performance gate, retry (30 rounds) ===
::warning title=Performance gate INCONCLUSIVE::Still too noisy after a retry with 30 rounds. Not a PASS: no regression was shown, and none was ruled out.
nightly-bench exit=0
--- invocations of perf-gate-remote.sh:
ARGS: --rev HEAD --wait-lock 60 --bench soak -- --secs 600 --set FAST=150 --set SLOW=20 --set STALLED=10 --set GROUPS=10 --set CHURNERS=10
ARGS: --rev HEAD --wait-lock 60
ARGS: --rev HEAD --wait-lock 60 --rounds 30
--- job summary:
## Concurrency soak (10 min, 200 consumers): PASS


observations checked: 123456, mismatches: 0 (run 1)

## Performance gate: INCONCLUSIVE


| fixture | verdict |
|---|---|
| sessions | status-2 |

## Performance gate, retry (30 rounds): INCONCLUSIVE


| fixture | verdict |
|---|---|
| sessions | status-2 |

**Not a PASS.** INCONCLUSIVE after 30 rounds: no supported regression, but the run was too noisy to rule one out.

################ gate FAIL (stand-in host statuses: 0,1)
=== Concurrency soak (10 min, 200 consumers) ===
=== Performance gate ===
::error title=Performance gate FAIL::See the job summary and log.
nightly-bench exit=1
--- invocations of perf-gate-remote.sh:
ARGS: --rev HEAD --wait-lock 60 --bench soak -- --secs 600 --set FAST=150 --set SLOW=20 --set STALLED=10 --set GROUPS=10 --set CHURNERS=10
ARGS: --rev HEAD --wait-lock 60
--- job summary:
## Concurrency soak (10 min, 200 consumers): PASS


observations checked: 123456, mismatches: 0 (run 1)

## Performance gate: FAIL


| fixture | verdict |
|---|---|
| sessions | status-1 |


################ host busy for both (stand-in host statuses: 4,4)
=== Concurrency soak (10 min, 200 consumers) ===
::error title=Concurrency soak NOT RUN (benchmark host busy for 60 s)::See the job summary and log.
=== Performance gate ===
::error title=Performance gate NOT RUN (benchmark host busy for 60 s)::See the job summary and log.
nightly-bench exit=1
--- invocations of perf-gate-remote.sh:
ARGS: --rev HEAD --wait-lock 60 --bench soak -- --secs 600 --set FAST=150 --set SLOW=20 --set STALLED=10 --set GROUPS=10 --set CHURNERS=10
ARGS: --rev HEAD --wait-lock 60
--- job summary:
## Concurrency soak (10 min, 200 consumers): NOT RUN (benchmark host busy for 60 s)

No summary.md: the run stopped before writing it. See the job log.

## Performance gate: NOT RUN (benchmark host busy for 60 s)

No report.md: the run stopped before writing it. See the job log.


################ unknown option (stand-in host statuses: 0,0)
nightly-bench: unknown option --bogus
nightly-bench exit=3
--- invocations of perf-gate-remote.sh:
--- job summary:
Evidence: Tracking-issue step with a recording gh stand-in
(gh replaced by a stand-in that records its arguments; no issue was created anywhere)
\### no open issue: one is created
exit=0
gh label create nightly-failure --color B60205 --description The nightly workflow failed
gh issue list --state open --label nightly-failure --limit 1 --json number --jq .[0].number // empty
gh issue create --title Nightly workflow failing --label nightly-failure --body-file report.md
\### open issue 512, label already exists: comment, no second issue
exit=0
gh label create nightly-failure --color B60205 --description The nightly workflow failed
gh issue list --state open --label nightly-failure --limit 1 --json number --jq .[0].number // empty
gh issue comment 512 --body-file report.md
Evidence: Coverage due rule
inputs.coverage=false event=workflow_dispatch weekday=real -> exit=0 output: [] summary: [Coverage runs on Sundays or when a manual run asks for it.]
inputs.coverage=true event=workflow_dispatch weekday=real -> exit=0 output: [run=true] summary: []
inputs.coverage= event=schedule weekday=7 -> exit=0 output: [run=true] summary: []
inputs.coverage= event=schedule weekday=3 -> exit=0 output: [] summary: [Coverage runs on Sundays or when a manual run asks for it.]
inputs.coverage=false event=workflow_dispatch weekday=7 -> exit=0 output: [] summary: [Coverage runs on Sundays or when a manual run asks for it.]
Evidence: Fuzz harness check
fuzz/Cargo.toml absent -> exit=0 output: [present=false ] summary: [## Fuzz  XFAIL #301: no fuzz harness in the tree (fuzz/Cargo.toml). Its parser and WS frame targets run here once it lands. ]
fuzz/Cargo.toml present -> exit=0 output: [present=true ] summary: []
this tree: fuzz/Cargo.toml absent
Evidence: HNSW recall step output
    Finished `release` profile [optimized] target(s) in 0.90s
     Running unittests src/lib.rs (target/release/deps/inputlayer-0442223589c5748f)

running 3 tests
test hnsw_index::tests::test_hnsw_recall_at_10_against_brute_force_at_three_sizes ... hnsw recall@10 (n=1000, dim=32, ef_search=128): 1.0000
hnsw recall@10 (n=10000, dim=32, ef_search=128): 1.0000
hnsw recall@10 (n=50000, dim=32, ef_search=128): 0.9940
ok
test hnsw_index::tests::test_hnsw_recall_at_10_on_3000_random_vectors ... hnsw recall@10 (n=3000, dim=32, ef_search=64): 0.9980
ok
test hnsw_index::tests::test_hnsw_recall_holds_after_incremental_inserts ... hnsw recall@10 (n=3000 after incremental inserts, dim=32, ef_search=64): 0.9980
ok

test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 3359 filtered out; finished in 6.25s
Evidence: Parsed workflow model (triggers, jobs, step conditions)
triggers: ['workflow_dispatch']
workflow_dispatch inputs: {'coverage': {'description': 'Also run coverage (otherwise Sundays only)', 'type': 'boolean', 'default': False}}
permissions: {'contents': 'read'}  concurrency: {'group': 'nightly-${{ github.ref }}', 'cancel-in-progress': False}
job tests: runs-on=blacksmith-4vcpu-ubuntu-2404 if=None needs=None timeout=90 env={'INPUTLAYER_ORACLE_SEEDS': 300, 'INPUTLAYER_SOAK': 1, 'INPUTLAYER_XFAIL_LOG': '${{ github.workspace }}/target/xfail.log', 'MAX_IGNORED': 4} outputs=None
   [0] actions/checkout@v4 if=None uses=actions/checkout@v4
   [1] Install Rust toolchain if=None uses=dtolnay/rust-toolchain@stable
   [2] Cache cargo if=None uses=useblacksmith/cache@v5
   [3] Run every test in release if=None uses=None
   [4] Run quarantined scenarios if=None uses=None
   [5] HNSW recall against brute force if=None uses=None
   [6] Summary if=always() uses=None
job fuzz: runs-on=blacksmith-4vcpu-ubuntu-2404 if=None needs=None timeout=60 env={'FUZZ_SECS': 600} outputs={'harness': '${{ steps.harness.outputs.present }}'}
   [0] actions/checkout@v4 if=None uses=actions/checkout@v4
   [1] Look for the fuzz harness if=None uses=None
   [2] Install Rust toolchain (nightly) if=steps.harness.outputs.present == 'true' uses=dtolnay/rust-toolchain@nightly
   [3] Install cargo-fuzz if=steps.harness.outputs.present == 'true' uses=None
   [4] Fuzz every target if=steps.harness.outputs.present == 'true' uses=None
   [5] Upload crashing inputs if=failure() uses=actions/upload-artifact@v4
job bench: runs-on=${{ vars.NIGHTLY_BENCH_RUNNER }} if=vars.NIGHTLY_BENCH_RUNNER != '' needs=None timeout=1080 env=None outputs=None
   [0] actions/checkout@v4 if=None uses=actions/checkout@v4
   [1] Soak and performance gate on the benchmark host if=None uses=None
   [2] Upload the reports if=always() uses=actions/upload-artifact@v4
job coverage: runs-on=blacksmith-4vcpu-ubuntu-2404 if=None needs=None timeout=45 env=None outputs={'due': '${{ steps.due.outputs.run }}'}
   [0] Sunday, or asked for if=None uses=None
   [1] actions/checkout@v4 if=steps.due.outputs.run == 'true' uses=actions/checkout@v4
   [2] Install Rust toolchain if=steps.due.outputs.run == 'true' uses=dtolnay/rust-toolchain@stable
   [3] Install cargo-tarpaulin if=steps.due.outputs.run == 'true' uses=None
   [4] Generate coverage report if=steps.due.outputs.run == 'true' uses=None
   [5] Coverage summary if=steps.due.outputs.run == 'true' uses=None
   [6] Upload coverage report if=steps.due.outputs.run == 'true' uses=actions/upload-artifact@v4
job report: runs-on=ubuntu-latest if=always() needs=['tests', 'fuzz', 'bench', 'coverage'] timeout=None env={'TESTS': '${{ needs.tests.result }}', 'FUZZ': '${{ needs.fuzz.result }}', 'FUZZ_HARNESS': '${{ needs.fuzz.outputs.harness }}', 'BENCH': '${{ needs.bench.result }}', 'COVERAGE': '${{ needs.coverage.result }}', 'COVERAGE_DUE': '${{ needs.coverage.outputs.due }}', 'FAILED': "${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }}", 'RUN_URL': '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}'} outputs=None
   [0] Summary if=None uses=None
   [1] Open or update the tracking issue if=env.FAILED == 'true' && github.ref == 'refs/heads/main' uses=None
- Outcome: 🔧 2 issues found → auto-fixed (2) ✅ across 3 runs (1h9m51s)

Pipeline

Updates from git push no-mistakes

... (3 earlier update rounds omitted to keep the PR body within GitHub's 65536-char limit; full history is in the run log.)

⚠️ **Review** - 1 info

🔧 Fix applied.
1 info still open:

  • ℹ️ src/hnsw_index_tests.rs:89 - The new test_hnsw_recall_at_10_against_brute_force_at_three_sizes returns at once unless INPUTLAYER_SOAK=1, so the PR gate and a plain cargo test never exercise its recall &gt;= 0.95 bar at n=10,000 and n=50,000 (m=16, ef_construction=200, ef_search=128, random 32-dim cosine). Review does not run tests, so that bar is unverified here, and the acceptance criterion "First nightly green or with named XFAILs" depends on it. The test step should run it once in release with the variable set: INPUTLAYER_SOAK=1 cargo test --release --all-features --lib hnsw_index::tests::test_hnsw_recall -- --nocapture --test-threads 1. No code change is needed unless that run falls below the bar.
🔧 **Test** - 2 issues found → auto-fixed (2) ✅
  • ⚠️ .github/workflows/nightly.yml:89 - The #[ignore] cap counts lines matching #\[ignore or ignore = &#34;. A test ignored with a reason-less cfg_attr, for example #[cfg_attr(debug_assertions, ignore)] or #[cfg_attr(not(debug_assertions), ignore)], matches neither. Added in a disposable copy of the tree, it left the count at 4, the step exited 0, and the new test was missing from the 'Tests marked #[ignore]' list. The recorded decision was that the workflow fails if the count rises above four. A wider pattern such as #\[ignore|,\s*ignore\s*[\])=]|ignore = &#34; would close it; I did not change the workflow in this phase.
  • 🚨 live validation verdict: no-go (11 of 16 scenarios were driven live against the product); failed: Adversarial: adding a test ignored via cfg_attr with no reason string makes the tests job fail
  • Live validation: ❌ no-go - 11 of 16 scenarios driven live against the product
Scenario Result Live Evidence
Running the nightly's HNSW recall step in release with INPUTLAYER_SOAK=1 passes and the summary shows recall for every size (1,000 / 10,000 / 50,000 against brute force, 3,000, and 3,000 after increme… ✅ pass live tests-summary.md and rt/recall.log: five recall lines, 1.0000 / 0.9990 / 0.9940 / 0.9970 / 0.9980; 3 passed. The old anchored grep on the same log returned only two lines.
Without INPUTLAYER_SOAK=1 the new three-size recall test returns at once, so the PR gate does not pay for it and it is not marked #[ignore] ✅ pass live recall-no-soak.txt: 1 passed, 0 ignored, finished in 0.00s
The differential oracle passes in release at nightly scale (INPUTLAYER_ORACLE_SEEDS=300) ✅ pass live rt/cargo-test.log: 9 passed, 0 failed in 43.49s, including seeded_random_histories_agree; XFAIL log empty. The log does not print the seed count, so 300 is taken from the environment variable the test…
The nightly's quarantined-scenarios step runs and passes ✅ pass live rt/quarantined.log: exit 0, 0 tests run, 37 filtered out (no scenario is quarantined today, as TESTING.md says)
The concurrency soak passes with the nightly's exact arguments: 10 minutes, 200 consumers (150 fast, 20 slow, 10 stalled, 10 grouped, 10 short-lived), every observation oracle-checked ✅ pass live soak-local-summary.md: Verdict PASS, 0 failures, 601 s, 110,022 revisions judged, 22 slow-consumer and 10 stalled-consumer disconnects handled. Run locally with scripts/soak.sh, not on the benchmark h…
The tests job summary shows timings, recall, expected failures and the section titled 'Tests marked #[ignore] (existing, tracked)' listing the four existing ones, and exits 0 ✅ pass live tests-summary.md, produced by the workflow's own Summary step script from the real logs
Adversarial: adding a fifth #[ignore] test makes the tests job fail with a named error ✅ pass live ignore-guard.txt: #[ignore] and #[ignore = &#34;slow&#34;] each give exit 1 with '5 tests are marked #[ignore], more than the 4 tracked'
Adversarial: adding a test ignored via cfg_attr with no reason string makes the tests job fail ❌ fail live ignore-guard.txt, last case: #[cfg_attr(debug_assertions, ignore)] added, step exits 0 and the new test is not listed
The first nightly as it ships (no fuzz harness, no bench runner, manual run without coverage) reports named XFAILs and 'not due', not green ✅ pass live report-cases.md, first case: Fuzz 'XFAIL #301 (no fuzz harness yet)'; soak and gate 'XFAIL (bench runner not registered: NIGHTLY_BENCH_RUNNER unset)'; Coverage 'not due (Sundays only)'. fuzz-harness.t…
Adversarial: real failures are not relabelled as XFAIL or 'not due' in the report ✅ pass live report-cases.md, cases 3 and 4: failed tests, bench, fuzz and coverage jobs all print 'failure'
Coverage runs only when a manual run asks for it, or on a Sunday once the schedule returns ✅ pass live coverage-due.txt: manual+false -> not due; manual+true -> run=true; schedule on Sunday -> run=true; schedule on Wednesday -> not due; manual+false on a Sunday -> not due. The two GitHub expressions we…
nightly-bench.sh runs the soak then the gate, always runs both, retries an INCONCLUSIVE gate once with 30 rounds, puts each report in the job summary and exits 1 on a failure or a busy host ⏸️ untested no The prior payload did not establish a live result: the script was driven only with a stand-in for scripts/perf-gate-remote.sh (six scripted cases plus an unknown option), which shows its own orchestra…
The soak and performance gate run on the benchmark host under its shared lock and the real gate report lands in the job summary ⏸️ untested no The real path is ssh to the shared host sam-dev-benchmarks through scripts/perf-gate-remote.sh. That is a shared service this phase must not write to, and the run takes hours. No self-hosted runner is…
A failed nightly on main opens one tracking issue labelled nightly-failure, and a later failure comments on it instead of opening a second ⏸️ untested no Only exercised against a recording stand-in for gh (the step called issue create when none was open and issue comment 512 when one was), which is not a live result. Driving it live means creating…
Starting the workflow by hand on GitHub (gh workflow run nightly.yml --ref main) ends green or with named XFAILs ⏸️ untested no workflow_dispatch only works once nightly.yml is on the default branch, and dispatching, pushing and CI belong to the outer executor. Job wiring (needs, if:, vars, outputs, Blacksmith runners) c…
The whole release suite passes at nightly scale (INPUTLAYER_ORACLE_SEEDS=300 INPUTLAYER_SOAK=1 make test-release) ⏸️ untested no This is the complete repository test suite, which this phase is told not to run. Only the pieces the nightly settings change were run: the oracle at 300 seeds and the SOAK-gated recall test.
  • Parsed .github/workflows/nightly.yml with PyYAML: triggers are workflow_dispatch only (schedule commented out); extracted every run: script to the evidence directory
  • INPUTLAYER_SOAK=1 cargo test --release --all-features --lib hnsw_index::tests::test_hnsw_recall -- --nocapture --test-threads 1 (the workflow's recall step, run verbatim) and the summary's grep -oh &#39;hnsw recall.*&#39; over its log
  • cargo test --release --all-features --lib hnsw_index::tests::test_hnsw_recall_at_10_against_brute_force_at_three_sizes without INPUTLAYER_SOAK
  • INPUTLAYER_ORACLE_SEEDS=300 INPUTLAYER_SOAK=1 cargo test --all-features --release --test differential_oracle
  • cargo test --release --all-features --test scenarios -- --ignored (the workflow's quarantined-scenarios step)
  • scripts/soak.sh --secs 600 --set FAST=150 --set SLOW=20 --set STALLED=10 --set GROUPS=10 --set CHURNERS=10 (the arguments scripts/nightly-bench.sh passes), run locally
  • Tests job Summary step script run against the real recall, oracle and XFAIL logs with a temporary GITHUB_STEP_SUMMARY
  • Tests job Summary step script run in a disposable copy of the tree with an added #[ignore], #[ignore = &#34;...&#34;] and #[cfg_attr(debug_assertions, ignore)] test
  • Report job Summary step script run under four job-result combinations
  • Coverage Sunday, or asked for step script run for manual/scheduled, asked/not asked, Sunday/Wednesday
  • Fuzz Look for the fuzz harness step script run in this tree
  • scripts/nightly-bench.sh --wait-lock 60 in a disposable copy with a stand-in scripts/perf-gate-remote.sh scripted to return 0/1/2/4, plus --bogus (not live)
  • Report job Open or update the tracking issue step script run against a recording stand-in for gh (not live)

🔧 Fix applied.
2 issues (1 error, 1 warning) still open:

  • ⚠️ src/storage_engine/revisions.rs:87 - The differential oracle binary fails intermittently, and the nightly's tests job runs it. Here iql_corpus_agrees_with_spec_and_reference failed 6 of 17 runs with nightly settings and 3 of 10 with default settings, on a private tmpfs as well as the shared one. The errors are 'Failed to create storage', 'create kg' and 'revision N is above a bound that cannot be raised', all with 'No such file or directory'. The test passes when run alone. The likely cause, not confirmed, is the process-wide revision counter from fix(storage_engine): never reissue revisions across restarts so a stale expect_revision is refused #390 (c3d08ae, on the base branch): it raises every open engine's bound file, and the oracle opens many engines in temporary directories that are deleted while others are still writing. This change does not touch that code, and the same failure would hit the PR gate's oracle run. As it stands, roughly one nightly in three would go red on the tests job and open the tracking issue, which puts 'first nightly green or with named XFAILs' in doubt. Decision needed: ship the nightly and fix the flake separately, or hold this until the base defect is fixed. I changed nothing.
  • 🚨 live validation verdict: no-go (14 of 18 scenarios were driven live against the product); failed: The differential oracle passes at INPUTLAYER_ORACLE_SEEDS=300 with INPUTLAYER_SOAK=1 in release, as the nightly tests job runs it
  • Live validation: ❌ no-go - 14 of 18 scenarios driven live against the product
Scenario Result Live Evidence
Adversarial: adding a test ignored via cfg_attr with no reason string makes the tests job fail (round 1 failure) ✅ pass live round2/ignore-guard.txt: #[cfg_attr(debug_assertions, ignore)], #[cfg_attr(not(debug_assertions), ignore)], #[cfg_attr(miri,ignore)], a multi-line cfg_attr with bare ignore, and `#[cfg_attr(mi…
Adversarial: adding a plain #[ignore] or #[ignore = "reason"] test makes the tests job fail ✅ pass live round2/ignore-guard.txt: both variants exit 1 with '5 tests are marked #[ignore], more than the 4 tracked'
The shipped tree stays within the cap and the summary lists the four tracked ignores under 'Tests marked #[ignore] (existing, tracked)'; a new non-ignored test does not trip it ✅ pass live round2/ignore-guard.txt (shipped tree and control both exit 0) and round2/tests-summary.md
The differential oracle passes at INPUTLAYER_ORACLE_SEEDS=300 with INPUTLAYER_SOAK=1 in release, as the nightly tests job runs it ❌ fail live round2/oracle-first-attempt-failed.log and round2/flake/summary.txt: 6 of 17 runs with nightly settings failed in iql_corpus_agrees_with_spec_and_reference with 'I/O error: No such file or directory…
The HNSW recall step prints recall against brute force at 1,000, 10,000 and 50,000 vectors and all recall tests pass ✅ pass live round2/recall-step.out: 1.0000, 0.9990, 0.9900 at the three sizes; 0.9990 and 0.9980 for the two 3,000-vector tests; 3 passed
The three-size recall test is a no-op without INPUTLAYER_SOAK=1, so it adds no time to the PR gate and no #[ignore] ✅ pass live round2/recall-no-soak.txt: passes in 0.00s and prints no recall line
The tests-job summary shows per-binary timings, all five recall lines (including those on libtest's 'test ... ' line), the expected-failure list and the tracked ignores ✅ pass live round2/tests-summary.md, produced by the Summary step from the logs of this run's oracle and recall runs
The quarantined-scenarios step runs and succeeds ✅ pass live round2/rt/quarantined.log: exit 0, '0 passed; 37 filtered out' (no scenario is ignored in a release build today)
With no bench runner, no fuzz harness and coverage not asked for, the report names each as XFAIL or 'not due' rather than success ✅ pass live round2/report-cases.md, first case: Fuzz 'XFAIL #301 (no fuzz harness yet)', soak and gate 'XFAIL (bench runner not registered: NIGHTLY_BENCH_RUNNER unset)', coverage 'not due (Sundays only)'
Adversarial: real failures and cancellations are not relabelled as XFAIL in the report ✅ pass live round2/report-cases.md: failure and cancelled results print as such for tests, fuzz, bench and coverage
The fuzz job reports a named XFAIL for #301 when fuzz/Cargo.toml is absent and enables the fuzz steps when it is present ✅ pass live round2/fuzz-harness.txt: absent gives present=false and the XFAIL #301 summary; present gives present=true
Coverage runs only when a manual run asks for it or on a scheduled Sunday ✅ pass live round2/coverage-due.txt: run=true only for coverage=true or schedule on weekday 7; a manual run on a Sunday without the input does not run it
The workflow is triggered by workflow_dispatch only, with a coverage input, while CI is paused ✅ pass live round2/workflow-model.txt: parsed triggers are ['workflow_dispatch'] with a boolean coverage input defaulting to false; report job has issues: write, the rest read-only
The concurrency soak at the nightly's size (10 minutes, 200 consumers including slow and stalled ones) passes with every observation checked ✅ pass live round2/soak-local-summary.md: Verdict PASS, 0 failures, 53,948 revisions judged, 150 fast / 20 slow / 10 stalled / 10 group / 10 churn consumers, 605 s. Run locally with scripts/soak.sh and the argume…
nightly-bench.sh runs the soak and the performance gate on the benchmark host under its lock and puts the gate report in the job summary ⏸️ untested no The real path goes through scripts/perf-gate-remote.sh over ssh to the shared benchmark host (sam-dev-benchmarks) and holds its one-benchmark lock for hours. That host is a shared service this phase m…
A failed nightly on main opens one tracking issue labeled nightly-failure, and a later failure comments on it instead of opening a second ⏸️ untested no Driving it for real means creating a label and an issue in inputlayer/inputlayer, which is outward-facing and outside this phase's authority; the step's if (FAILED and ref == main) is a GitHub Actio…
The whole workflow runs on GitHub Actions from a manual dispatch and its first run is green or shows only named XFAILs ⏸️ untested no workflow_dispatch needs the workflow file on the default branch, and pushing or dispatching CI belongs to the outer executor, not this phase. act is not installed and would not provide the Blacksmit…
cargo fuzz runs the parser and WS frame targets for 10 minutes each ⏸️ untested no The fuzz harness is issue #301's and is not in the tree, so there are no targets to run; the workflow reports this as XFAIL #301. Inventing a harness here would test a fixture, not the product.
  • Parsed .github/workflows/nightly.yml with PyYAML into triggers, jobs, conditions and extracted every run: script (round2/workflow-model.txt, round2/steps/)
  • bash -eo pipefail steps/tests-6.sh (tests-job Summary step, MAX_IGNORED=4) in a disposable git copy of the tree: as shipped, plus one added test file per variant: #[ignore], #[ignore = &#34;slow&#34;], #[cfg_attr(debug_assertions, ignore)], #[cfg_attr(not(debug_assertions), ignore)], #[cfg_attr(miri,ignore)], multi-line cfg_attr with bare ignore, #[cfg_attr(miri, ignore, should_panic)], and a non-ignored control
  • INPUTLAYER_ORACLE_SEEDS=300 INPUTLAYER_SOAK=1 cargo test --all-features --release --test differential_oracle three times (fail, fail, pass)
  • Oracle test binary repeated inside unshare -rm with a private tmpfs on /dev/shm: 4 runs, then 10 with nightly settings and 10 with defaults
  • bash -eo pipefail steps/tests-5.sh (HNSW recall step: cargo test --release --all-features --lib hnsw_index::tests::test_hnsw_recall -- --nocapture --test-threads 1)
  • cargo test --release --all-features --lib hnsw_index::tests::test_hnsw_recall_at_10_against_brute_force_at_three_sizes -- --nocapture with INPUTLAYER_SOAK unset
  • bash -e steps/tests-4.sh (cargo test --release --all-features --test scenarios -- --ignored)
  • bash -eo pipefail steps/tests-6.sh on the real tree with the logs of the oracle and recall runs, writing the job summary
  • bash -e steps/report-0.sh with five combinations of TESTS/FUZZ/FUZZ_HARNESS/BENCH/COVERAGE/COVERAGE_DUE
  • bash -e steps/fuzz-1.sh in directories with and without fuzz/Cargo.toml
  • steps/coverage-0.sh with inputs.coverage and github.event_name substituted and the weekday pinned, five combinations
  • scripts/soak.sh --secs 600 --set FAST=150 --set SLOW=20 --set STALLED=10 --set GROUPS=10 --set CHURNERS=10 (the arguments nightly-bench.sh passes), run locally
  • scripts/nightly-bench.sh --wait-lock 60 in a disposable repo with a stand-in perf-gate-remote.sh returning queued statuses (six cases), plus --bogus and --help
  • bash -e steps/report-1.sh with a recording stand-in for gh (two cases)

🔧 Fix applied.
✅ Re-checked - no issues remain.

  • Live validation: ✅ go - 13 of 19 scenarios driven live against the product
Scenario Result Live Evidence
The differential oracle passes repeatedly at INPUTLAYER_ORACLE_SEEDS=300 with INPUTLAYER_SOAK=1 in release, as the nightly tests job runs it (round 2 failure) ✅ pass live round3/flake/summary.txt and nightly-N.log: 11 of 11 finished runs exit 0 with 9 passed, 0 failed. Round 2 failed 6 of 17 under the same command. Runs 12-20 were still in progress at report time.
The differential oracle passes repeatedly at default settings (the PR gate's form of the same flake) ⏸️ untested no The 15 default-settings repeats are queued behind the nightly-settings repeats in the same background loop and had not started when this result was required. Nothing is out of reach; the loop only nee…
The 10-minute, 200-consumer concurrency soak (fast, slow, stalled, grouped, short-lived consumers, every observation oracle-checked) passes on this commit ✅ pass live round3/soak-local-summary.md and round3/soak-local.log: Verdict PASS, 0 failures, 86887 commits over 601 s, 150 fast / 20 slow / 10 stalled / 10 group / 10 churn consumers. Run locally, not on the ben…
First nightly as things stand: report table shows tests success, fuzz XFAIL #301, soak and gate XFAIL for the unset bench runner, coverage not due ✅ pass live round3/report-cases.md, first case
Report table shows real failures and cancellations as such, not as XFAIL ✅ pass live round3/report-cases.md, cases 3-5
A failed nightly opens one tracking issue, and comments on the open one instead of opening a second ✅ pass live round3/tracking-issue-standin.txt: gh issue create when none is open; gh issue comment 512 when one is. Driven with a recording gh stand-in, so the real step script ran but no GitHub call was made…
Coverage runs only when a manual run asks for it or on a scheduled Sunday ✅ pass live round3/coverage-due.txt
With no fuzz harness in the tree the fuzz job writes a named XFAIL #301 and reports the harness absent ✅ pass live round3/fuzz-harness.txt
The tests job passes the #[ignore] cap on the tree as shipped and lists the four tracked ignores under 'Tests marked #[ignore] (existing, tracked)' ✅ pass live round3/ignore-guard.txt (first case) and round3/tests-summary.md
Adversarial: adding a new ignored test in any form (#[ignore], with reason, reason-less cfg_attr, negated cfg_attr, multi-line cfg_attr) makes the tests job fail ✅ pass live round3/ignore-guard.txt: all five forms exit 1 with '5 tests are marked #[ignore], more than the 4 tracked'; a test gated on INPUTLAYER_SOAK exits 0
The HNSW recall step runs brute-force recall at three sizes under INPUTLAYER_SOAK=1 and every recall line reaches the summary ✅ pass live round3/recall-step.out and round3/tests-summary.md: five recall lines (n=1000, 10000, 50000, 3000, 3000 after incremental inserts), 3 tests passed
Without INPUTLAYER_SOAK the three-size recall test returns at once, so it does not slow the PR gate ✅ pass live round3/recall-no-soak.txt: 1 passed in 0.00s, no recall lines
The quarantined-scenarios step runs cleanly in release ✅ pass live round3/rt/quarantined.log: exit 0; no scenario is ignored in release, so 0 tests ran
nightly-bench.sh runs the soak then the gate, always runs both, retries an INCONCLUSIVE gate once with 30 rounds, and puts both reports in the job summary ✅ pass live round3/nightly-bench-orchestration.txt: seven host outcomes with exit codes, arguments passed to perf-gate-remote.sh and the resulting summary. The real script ran; the benchmark host was a stand-in.
The soak and the performance gate run on the real benchmark host under its shared lock and the gate report lands in the run summary ⏸️ untested no The benchmark host (sam-dev-benchmarks) is a shared service behind a lock that other work uses, so I did not start a multi-hour run on it. It also needs a self-hosted runner and the NIGHTLY_BENCH_RUNN…
The whole make test-release suite passes at nightly scale ⏸️ untested no This step's rules forbid running the complete repository test suite. I ran the parts this change touches (oracle, recall, quarantined scenarios). Hosted CI is paused, so a manual workflow_dispatch o…
The workflow runs end to end on GitHub Actions from a manual dispatch (first nightly green or with named XFAILs) ⏸️ untested no Dispatching needs the workflow on the default branch of inputlayer/inputlayer and Blacksmith runners; pushing and dispatching belong to later phases, and no local Actions runner (act) is on PATH. Star…
cargo fuzz runs the parser and WS frame targets for 10 minutes each ⏸️ untested no The fuzz harness is issue #301 and is not in the tree, so there are no targets to run; the workflow reports this as XFAIL #301.
Coverage is generated and its summary posted when asked for ⏸️ untested no make coverage needs cargo-tarpaulin, which is not installed here, and instruments the whole suite, which this step may not run. The gating rule for when it runs was driven live.
  • cargo test --release --all-features --test differential_oracle --test scenarios --lib --no-run
  • INPUTLAYER_ORACLE_SEEDS=300 INPUTLAYER_SOAK=1 cargo test --release --all-features --test differential_oracle repeated; 11 runs complete, 11 passed
  • scripts/soak.sh --secs 600 --set FAST=150 --set SLOW=20 --set STALLED=10 --set GROUPS=10 --set CHURNERS=10: PASS
  • nightly.yml parsed with PyYAML into a job/step model; each run block extracted and executed with bash
  • report job Summary step run for 5 combinations of job results
  • report job Open or update the tracking issue step run with a recording gh stand-in (no open issue; open issue 512)
  • coverage job Sunday, or asked for step run for 5 input/event/weekday combinations
  • fuzz job Look for the fuzz harness step run with and without fuzz/Cargo.toml
  • tests job Summary step (the #[ignore] cap) run against a disposable git copy of the tree: as shipped, 5 forms of new ignore, a control gated on INPUTLAYER_SOAK, and a false-positive probe
  • tests job HNSW recall against brute force step run with INPUTLAYER_SOAK=1; the three-size test also run without it
  • tests job Run quarantined scenarios step: cargo test --release --all-features --test scenarios -- --ignored
  • scripts/nightly-bench.sh --wait-lock 60 against a stand-in perf-gate-remote.sh for 7 host outcomes
✅ **Document** - passed

✅ No issues found.

⚠️ **Lint** - 1 info
  • ℹ️ .github/workflows/nightly.yml - actionlint is not on PATH, so the new workflow was not checked with it. It was checked only as far as parsing as valid YAML; scripts/nightly-bench.sh passes shellcheck, and cargo fmt --check and clippy (-D warnings, all targets, all features) are clean.
✅ **Push** - passed

✅ No issues found.

jsam added 5 commits October 6, 2026 05:14
nightly.yml runs once a night on main, or by hand: every test in release
with INPUTLAYER_ORACLE_SEEDS=300 and INPUTLAYER_SOAK=1, quarantined
scenarios, the HNSW recall tests, every cargo fuzz target for 10 minutes
(XFAIL #301 until the harness exists), the 10-minute 200-consumer soak and
the performance gate on the benchmark host behind its lock
(scripts/nightly-bench.sh), and coverage on Sundays. Results go to the job
summary; a failed night opens or updates one tracking issue.

Adds one test, gated on INPUTLAYER_SOAK=1: HNSW recall@10 against brute
force at 1,000, 10,000 and 50,000 vectors.

Refs #345
@jsam

jsam commented Oct 6, 2026

Copy link
Copy Markdown
Contributor Author

@jsam jsam closed this Oct 6, 2026
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