Repository navigation
Conversation
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
…cap #[ignore] count
Contributor
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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=1soak (#298: 10 min, oracle-checked histories with 200 subscribers and slow consumers),cargo fuzzparser 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.shon 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
.github/workflows/nightly.ymlwith 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), everycargo fuzztarget 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 onmain, opens or comments on one issue labelednightly-failure. The schedule is commented out while CI is paused, so the workflow isworkflow_dispatchonly. Missing pieces are reported as named XFAILs rather than failures:XFAIL #301while there is nofuzz/Cargo.toml, and an XFAIL for the soak and performance gate when the repository variableNIGHTLY_BENCH_RUNNERis unset (the bench job is then skipped). The tests job fails if more than the 4 existing#[ignore]markers are found.scripts/nightly-bench.sh, which runs the concurrency soak (10 minutes, 200 consumers) and then the performance gate throughscripts/perf-gate-remote.shbehind 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).INPUTLAYER_SOAK=1, and prints the recall in the incremental-insert test. Reorders fields in the differential oracle'sEngineHost,GroupAdapterandSubscriptionAdapterso 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 inTESTING.mdandCONTRIBUTING, and updates theMakefilecomment 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
runstep 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 recordingghstand-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 realscripts/nightly-bench.shagainst 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 namedignorepassed 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.gh issue createwhen none is open;gh issue comment 512when one is. Driven with a recording gh stand-in, so the real step script ran but no GitHub call was made…make test-releasesuite passes at nightly scaleworkflow_dispatcho…make coverageneeds 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)
Evidence: Local soak summary: 10 minutes, 200 consumers, PASS
Evidence: Tests job summary as rendered by the workflow step
Evidence: Report table for five result combinations
Evidence: First-nightly report as things stand
Evidence: #[ignore] cap: shipped tree, five new-ignore forms, control, false-positive probe
Evidence: nightly-bench.sh against a stand-in benchmark host
Evidence: Tracking-issue step with a recording gh stand-in
Evidence: Coverage due rule
Evidence: Fuzz harness check
Evidence: HNSW recall step output
Evidence: Parsed workflow model (triggers, jobs, step conditions)
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.)
🔧 Fix applied.
1 info still open:
src/hnsw_index_tests.rs:89- The newtest_hnsw_recall_at_10_against_brute_force_at_three_sizesreturns at once unlessINPUTLAYER_SOAK=1, so the PR gate and a plaincargo testnever exercise itsrecall >= 0.95bar 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#\[ignoreorignore = ". A test ignored with a reason-lesscfg_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 = "would close it; I did not change the workflow in this phase.#[ignore]and#[ignore = "slow"]each give exit 1 with '5 tests are marked #[ignore], more than the 4 tracked'#[cfg_attr(debug_assertions, ignore)]added, step exits 0 and the new test is not listedissue createwhen none was open andissue comment 512when one was), which is not a live result. Driving it live means creating…gh workflow run nightly.yml --ref main) ends green or with named XFAILsneeds,if:,vars, outputs, Blacksmith runners) c…INPUTLAYER_ORACLE_SEEDS=300 INPUTLAYER_SOAK=1 make test-release)Parsed.github/workflows/nightly.ymlwith PyYAML: triggers areworkflow_dispatchonly (schedule commented out); extracted everyrun:script to the evidence directoryINPUTLAYER_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'sgrep -oh 'hnsw recall.*'over its logcargo test --release --all-features --lib hnsw_index::tests::test_hnsw_recall_at_10_against_brute_force_at_three_sizeswithoutINPUTLAYER_SOAKINPUTLAYER_ORACLE_SEEDS=300 INPUTLAYER_SOAK=1 cargo test --all-features --release --test differential_oraclecargo 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 argumentsscripts/nightly-bench.shpasses), run locallyTests jobSummarystep script run against the real recall, oracle and XFAIL logs with a temporaryGITHUB_STEP_SUMMARYTests jobSummarystep script run in a disposable copy of the tree with an added#[ignore],#[ignore = "..."]and#[cfg_attr(debug_assertions, ignore)]testReport jobSummarystep script run under four job-result combinationsCoverageSunday, or asked forstep script run for manual/scheduled, asked/not asked, Sunday/WednesdayFuzzLook for the fuzz harnessstep script run in this treescripts/nightly-bench.sh --wait-lock 60in a disposable copy with a stand-inscripts/perf-gate-remote.shscripted to return 0/1/2/4, plus--bogus(not live)Report jobOpen or update the tracking issuestep script run against a recording stand-in forgh(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. Hereiql_corpus_agrees_with_spec_and_referencefailed 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.#[cfg_attr(debug_assertions, ignore)],#[cfg_attr(not(debug_assertions), ignore)],#[cfg_attr(miri,ignore)], a multi-line cfg_attr with bareignore, and `#[cfg_attr(mi…iql_corpus_agrees_with_spec_and_referencewith 'I/O error: No such file or directory…if(FAILED and ref == main) is a GitHub Actio…actis not installed and would not provide the Blacksmit…Parsed.github/workflows/nightly.ymlwith PyYAML into triggers, jobs, conditions and extracted everyrun: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 = "slow"],#[cfg_attr(debug_assertions, ignore)],#[cfg_attr(not(debug_assertions), ignore)],#[cfg_attr(miri,ignore)], multi-line cfg_attr with bareignore,#[cfg_attr(miri, ignore, should_panic)], and a non-ignored controlINPUTLAYER_ORACLE_SEEDS=300 INPUTLAYER_SOAK=1 cargo test --all-features --release --test differential_oraclethree times (fail, fail, pass)Oracle test binary repeated insideunshare -rmwith a private tmpfs on /dev/shm: 4 runs, then 10 with nightly settings and 10 with defaultsbash -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 -- --nocapturewith INPUTLAYER_SOAK unsetbash -e steps/tests-4.sh(cargo test --release --all-features --test scenarios -- --ignored)bash -eo pipefail steps/tests-6.shon the real tree with the logs of the oracle and recall runs, writing the job summarybash -e steps/report-0.shwith five combinations of TESTS/FUZZ/FUZZ_HARNESS/BENCH/COVERAGE/COVERAGE_DUEbash -e steps/fuzz-1.shin directories with and without fuzz/Cargo.tomlsteps/coverage-0.shwith inputs.coverage and github.event_name substituted and the weekday pinned, five combinationsscripts/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 locallyscripts/nightly-bench.sh --wait-lock 60in a disposable repo with a stand-inperf-gate-remote.shreturning queued statuses (six cases), plus--bogusand--helpbash -e steps/report-1.shwith a recording stand-in forgh(two cases)🔧 Fix applied.
✅ Re-checked - no issues remain.
gh issue createwhen none is open;gh issue comment 512when one is. Driven with a recording gh stand-in, so the real step script ran but no GitHub call was made…make test-releasesuite passes at nightly scaleworkflow_dispatcho…make coverageneeds 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-runINPUTLAYER_ORACLE_SEEDS=300 INPUTLAYER_SOAK=1 cargo test --release --all-features --test differential_oraclerepeated; 11 runs complete, 11 passedscripts/soak.sh --secs 600 --set FAST=150 --set SLOW=20 --set STALLED=10 --set GROUPS=10 --set CHURNERS=10: PASSnightly.yml parsed with PyYAML into a job/step model; eachrunblock extracted and executed with bashreport jobSummarystep run for 5 combinations of job resultsreport jobOpen or update the tracking issuestep run with a recordingghstand-in (no open issue; open issue 512)coverage jobSunday, or asked forstep run for 5 input/event/weekday combinationsfuzz jobLook for the fuzz harnessstep run with and withoutfuzz/Cargo.tomltests jobSummarystep (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 probetests jobHNSW recall against brute forcestep run with INPUTLAYER_SOAK=1; the three-size test also run without ittests jobRun quarantined scenariosstep:cargo test --release --all-features --test scenarios -- --ignoredscripts/nightly-bench.sh --wait-lock 60against a stand-inperf-gate-remote.shfor 7 host outcomes✅ **Document** - passed
✅ No issues found.
.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.