Skip to content

fix(examples): an example built WITHOUT its feature is not a broken example — needs-feature - #3288

Closed
noahgift wants to merge 3 commits into
mainfrom
PMAT-3235-needs-feature
Closed

noahgift wants to merge 3 commits into
mainfrom
PMAT-3235-needs-feature

Conversation

@noahgift

@noahgift noahgift commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

examples-nightly is one of five red scheduled lanes. Its verdict is currently not a
trustworthy signal about whether examples work — which is the exact property
APR-RELEASE-001 §4.2 and T-1 want to depend on.

Run 34826552378, 980 example targets

summary pass=602 fail=22 timeout=6 needs-args=30 needs-hardware=2 needs-data=318

The 28 fail+timeout rows, classified by what the output actually says:

 6   the example is not built with the feature it needs   <- NOT broken
 2   needs a network peer (192.168.50.100:9000)           <- NOT broken
 1   needs a TTY ("No such device or address")            <- NOT broken
 6   timeout at 180 s (buggy_server, brick_computer ...)  <- servers by design?
13   remainder

A quarter of the lane's red is a missing label, not a defect. This PR takes the 6:

aprender-db::compressed_kv          This example requires the 'compression' feature.
aprender-rag::compressed_index      This example requires the 'compression' feature.
aprender-rag::semantic_embeddings   This example requires the 'embeddings' feature.
aprender-distribute::tensor_example Error: This example requires the 'tensor' feature.

plus cargo's own refusal, which phrases it differently:

target `gpu_info` in package `aprender-zram-core` requires the features: cuda

Like needs-hardware, not like needs-args

A needs-feature row is a SKIP that must be re-run WITH the feature before a release
verdict
. A green lane on a default-feature host must never be readable as "the compression
example works" — which is why the row cites the line that classified it.

This follows the precedent the file set for needs-data on 2026-09-12 (173 rows), and obeys
the rule its own header states: "one turns a real defect into a skip, so each addition belongs
in the selftest."

The regex ships both polarities

A skip class can only ever turn a fail into a non-failure, so the dangerous direction is
tested explicitly:

MUST match      This example requires the 'compression' feature.
                Error: This example requires the 'tensor' feature.
                ... requires the features: cuda
MUST NOT match  thread 'main' panicked at src/main.rs:11:39
                error[E0432]: unresolved import `trueno_gpu::driver::PinnedBuffer`
                Error: Os { code: 6, kind: Uncategorized }
                assertion failed: left == right
                feature is required for this operation     <- the deciding near-miss

Mutation, both directions:

regex matching nothing       -> selftest RED
regex widened to "feature"   -> selftest RED
shipped regex                -> green

The harness caught its own staleness: a completeness assertion hardcoded "one of the six
classes"
and went red on the seventh. Updated rather than relaxed — that assertion is what
stops a row being written with no class at all.

Deliberately not swept in

The 2 network rows, the 1 TTY row, the 6 timeouts and the 13 remaining are separate causes and
deserve their own triage. One of the 13, aprender-zram-core::gpu_info, is already owned by
#3267
, which found that trueno_gpu::driver::PinnedBuffer "does not exist and never did in
this monorepo"
.

bashrs 7.4.1: 0 errors. selftest: all rows passed.

no-close: the measurement this implements is #3182 (open, 0.68.0), which counted 9
of 44 non-pass rows as feature refusals miscalled fail. This PR adds the needs-feature
class for exactly those rows; #3182 also covers the 20 long-running-by-design timeout
rows and the needs-data surface, so it stays open. The four other red nightlies
(Coverage Nightly, Silicon Nightly, CUDA Nightly, and the rest of examples-nightly)
are separate causes.

ont-delta: none — a classification fix in a CI harness; it adds no entity, shape, verdict
reason or resolves target of its own.

🤖 Generated with Claude Code

…xample — needs-feature

examples-nightly is one of five red scheduled lanes. Its verdict is currently not a
trustworthy signal about whether examples work, which is the exact property
APR-RELEASE-001 §4.2 and T-1 want to depend on.

Run 34826552378, 980 example targets:

    summary pass=602 fail=22 timeout=6 needs-args=30 needs-hardware=2 needs-data=318

The 28 fail+timeout rows, classified by what the output actually says:

    6   the example is not built with the feature it needs   <- NOT broken
    2   needs a network peer (192.168.50.100:9000)           <- NOT broken
    1   needs a TTY ("No such device or address")            <- NOT broken
    6   timeout at 180 s (buggy_server, brick_computer ...)  <- servers by design?
   13   remainder

So a quarter of the lane's red is a MISSING LABEL, not a defect. This commit takes the
6:

    aprender-db::compressed_kv          This example requires the 'compression' feature.
    aprender-rag::compressed_index      This example requires the 'compression' feature.
    aprender-rag::semantic_embeddings   This example requires the 'embeddings' feature.
    aprender-distribute::tensor_example Error: This example requires the 'tensor' feature.
    ...

and cargo's own refusal, which says it differently:

    target `gpu_info` in package `aprender-zram-core` requires the features: cuda

This follows the precedent this file set for `needs-data` on 2026-09-12 (173 rows), and
obeys the rule its own header states: "one turns a real defect into a skip, so each
addition belongs in the selftest."

LIKE needs-hardware, NOT like needs-args. A needs-feature row is a SKIP that must be
re-run WITH the feature before a release verdict. A green lane on a default-feature
host must never be readable as "the compression example works" — which is why the row
cites the line that classified it.

THE REGEX SHIPS BOTH POLARITIES, because a skip class can only ever turn a `fail` into
a non-failure:

    MUST match      This example requires the 'compression' feature.
                    Error: This example requires the 'tensor' feature.
                    ... requires the features: cuda
    MUST NOT match  thread 'main' panicked at src/main.rs:11:39
                    error[E0432]: unresolved import `trueno_gpu::driver::PinnedBuffer`
                    Error: Os { code: 6, kind: Uncategorized }
                    assertion failed: left == right
                    feature is required for this operation     <- the deciding near-miss

Mutation, both directions:

    regex matching nothing        -> selftest RED
    regex widened to "feature"    -> selftest RED
    shipped regex                 -> green

The harness caught its own staleness too: a completeness assertion hardcoded "one of the
six classes" and went red on the seventh. Updated rather than widened — the assertion is
what stops a row being written with no class at all.

NOT touched here, because they are separate causes and deserve their own triage: the 2
network rows, the 1 TTY row, the 6 timeouts, and the 13 remaining. One of those 13,
`aprender-zram-core::gpu_info`, is already owned by #3267 — which found that
`trueno_gpu::driver::PinnedBuffer` "does not exist and never did in this monorepo".

bashrs 7.4.1: 0 errors. selftest: all rows passed.

ont-delta: none — a classification fix in a CI harness; it adds no entity, shape,
verdict reason or resolves target of its own.

Pmat-Ticket: PMAT-3235
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 14, 2026

Copy link
Copy Markdown

§13.11 rung 1 — quorum shadow verdict

S13-SHADOW pr=3288 head=106194ccc91107196650dc8c650323a1d09b9914 verdict=REFUSE class=Q1 arm_rc=1

Shadow mode: this records a verdict and merges nothing. A refusal
to arm is not a block (§13 adds zero rows to §7) — the pull request is
exactly as green as it was.

noahgift and others added 2 commits September 14, 2026 22:30
Third time tonight. My insertion helper rejoins entry blocks with an added
newline, re-serialising the entry ABOVE the insertion without any field changing —
PMAT-980 (#2874). The remedy is the one check_roadmap_diff_additive.sh names.

Pmat-Ticket: PMAT-3235

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@noahgift

Copy link
Copy Markdown
Contributor Author

Superseded by #3295, which carries this change unmodified along with eight other
collision-free CI/guard PRs as a single merge-queue entry.

Not abandoned and not rejected: the commits are merged into
PMAT-3231-batch-1-ci-guards verbatim (clean=9 conflicted=0), and this branch is
retained — reopening is one click if #3295 does not land.

Why: a successful merge_group CI run is median 78 min with max_entries_to_merge = 1,
so nine entries is ~12 h of queue for 623 insertions. As one entry it is 78 minutes.
Root cause and the full five-whys: #3294.

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