Repository navigation
G3.EX: 38 of 44 non-pass rows were classifier gaps, not defects — feature refusals need a re-run, not a skip #3182
Description
What the first full G3.EX sweep measured
981 example targets, timeout 120, on lambda-vector (x86_64, RTX 4090). Evidence: evidence/dogfood/0.67.0/examples.tsv.
| class | rows |
|---|---|
pass |
740 |
needs-data |
168 |
needs-args |
29 |
fail |
23 |
timeout |
21 |
The 44 fail + timeout rows were then re-run one at a time with their own required-features and their logs kept. That is what this ticket is about: of the 44, only 6 rows were genuine defects. The rest were the classifier answering a question it was not built to answer.
| what the row actually was | rows | what the sweep called it |
|---|---|---|
| runs clean once the feature it names is enabled | 9 | fail |
| long-running by design (server, TUI, benchmark) | 20 | timeout |
| missing model/data, worded outside the regex | 3 | fail |
| missing CLI argument, worded outside the regex | 3 | fail |
| needs a TTY | 1 | fail |
this box's glibc vs a prebuilt ort artifact |
1 | fail |
| a wall-clock perf gate failing under load | 1 | fail |
| genuine defect | 6 | fail |
The three gaps, in order of how many rows they cost
1. A feature the example names at RUNTIME, not in required-features (9 rows). cuda_training_benchmark prints "This benchmark requires the 'cuda' feature" and exits 1; with --features cuda it exits 0. Same for cublas_fp8_7b_reproducer (cuda), compressed_kv and compressed_index (compression), semantic_embeddings (embeddings), tensor_example (tensor), showcase_shell (shell-autocomplete). The sweep already reads required-features from cargo metadata; these examples declare none and gate themselves in code instead.
The right behaviour is not a new skip class. It is a re-run: parse the feature the example names, run it again with that feature, and classify the SECOND run. A skip here would hide the case where the example is broken with its feature — which is exactly what gpu_info turned out to be (#3179).
2. No class for "runs until you stop it" (20 rows). api_server binds a listener and serves; pipeline_tui and calculator_tui are TUIs; buggy_server is a server; a dozen profile_*/bench_*/measure_* examples are benchmarks with no bound. Killing these after 120 s and calling it timeout — a class the skill defines as "a defect" — is wrong on all twenty. They need either a long-running class asserted from the target's own declaration (so it cannot be claimed post hoc by anything that happens to hang), or a smoke mode.
The distinction that must not be lost: a server that is still serving at 120 s is healthy; an inference example still on token 1 at 120 s is not. A class that cannot tell those apart is worse than no class.
3. NEEDS_ARGS_RE and NEEDS_DATA_RE are too tight (6 rows). ^(Usage|error: the following required arguments) misses --model-dir required (ssc_eval, ssc_preflight) and .nth(1).unwrap() on argv (check_layer4). [Mm]odel not found misses No model found. (qa_serve) and Failed to load transformer model (finetune_real).
The six genuine defects, for the record
| example | defect | ticket |
|---|---|---|
aprender-zram-core::gpu_info |
the crate's cuda feature has never compiled |
#3179 |
aprender-serve::debug_lm_head_direct |
hw_dp4a_q6k: workspace.q8_activation_buf not initialized |
#3178 |
aprender-serve::debug_q6k_controlled |
same panic, same site | #3178 |
aprender-train::llama2-train |
reads a shipped config by a cwd-relative path | (this sweep) |
aprender-serve::performance_parity |
Q4_0 buffer length is not a multiple of the block size | (this sweep) |
aprender-compute::coop_gemm_bench |
did not build; already deleted on main by #3136 | #3136 |
Why this is a ticket and not a silent widening
Widening a classifier until the red goes away is how a gate becomes theatre. Every class added here must cite the line that put the row in it — the skill already requires this for needs-hardware and needs-data — and the feature case must re-run rather than skip. PR #3163 (the needs-data class) is the template: a hermetic fixture in tests/fixtures/dogfood_examples/, a --selftest row per class, and a mutation row proving the class can still turn RED.
Done
--selftest carries a case row for each of: a runtime-feature refusal that passes on re-run, a runtime-feature refusal that still fails with the feature (must stay a defect), a declared long-running target, --model-dir required, and No model found. A full sweep on the release commit then reports genuine defects only, and the count matches a hand audit of its non-pass rows.
Activity
dogfood(G3.EX): 981 examples run for the first time on a release — 6 …
docs(release): APR-RELEASE-001 spec + PMAT-1098 receipt for session 1…
noahgift commentedon Sep 23, 2026
triage 2026-09-23 (aprender-dd, standing triage owner): milestoned to 0.70.0, theme Fast Train (CI, gates, pv, release tooling, hygiene); it moved out of
backlog(the 2026-09-17 overflow bucket, not a release).noahgift commentedon Sep 26, 2026
Addressed on branch PMAT-3560-r5-examples @ a6030b9 (#3560 R5). Examples now declare their class in
[package.metadata.dogfood-examples]. There are three new classes: needs-net, needs-tty and long-running. Each declaration is a checked claim: a missingexpectline isfail, exit 0 ispass, and a declaration naming no target or an unknown class is refused with exit 2. The selftest has a fixture per form and per refusal. Filtered nightly: https://github.com/paiml/aprender/actions/runs/36230807732 (attempt 2: 0 fail, 0 timeout).noahgift commentedon Oct 14, 2026
merged into #5317 (master ticket for epic #4381; triage rule 7b, 2026-10-14). It is a checklist row there; reopen this issue when work on it starts or its PR opens.