Skip to content

P0: release cells are hand-coded, not DERIVED from apr's interface — the gate cannot see a verb, flag or input shape nobody typed into a list (run --prompt --chat, serve, code all leaked) #3745

Open
1 of 1 issue completed

Description

@noahgift

Operator, verbatim, 2026-09-21: "again, the way to prevent testing leakage is tests are dervived from surface and SHACL enforced...WE ARE NOT ENFORCING our interface AT ALL..it is hand coded not derived"

The defect

Every release cell today comes from a list someone typed:

A verb, flag or input shape missing from the list is invisible to the gate. The three leaks of 0.69.0 are exactly this class:

Decided design (cop ruling; the operator's line above is the requirement)

  1. The surface is emitted by the binary under test, never typed. A hidden apr subcommand walks <Cli as clap::CommandFactory>::command() recursively and prints JSON: every subcommand path, every arg (long/short/positional, num_args, value_enum values, defaults) and each arg's role. Roles come from typed markers in the code: a shared ModelArg / PromptArg / InputFileArg / BackendArg constructor, so the role is read from how the arg is BUILT, not from its name. A guard refuses a command that loads a model without declaring its model arg through the marker. It is generated at gate time from the release-candidate binary, never committed.
  2. A pv extractor cli-surface turns that JSON into entities (Command, Arg, InputShape, ModeValue). It is registered in contracts/ontology.yaml as implemented, with its own pc_extract planted control (PMAT-3704 / ONT-4c3: pc_extract draws one planted defect per implemented extractor — parity-receipt, json and pv-contract gain their controls, and the set is tied to Σ #3706's Σ-tie rule).
  3. Cells are computed, not listed. For every command whose surface has a ModelArg:
  4. SHACL enforces it. release-readiness-v1 targets the DERIVED cell set. A derived cell with no receipt is a violation. A receipt must be Pass or a typed refusal by name; CPU fallback under a GPU request, a 0-layer model and an empty answer are not Pass.
  5. Hand lists die. A guard refuses a literal verb or flag enumeration in any release gate, contract or dogfood script. The ladder, P0 release-process: the train can publish with "most models working" — the model gate is a hand-picked ladder with OPTIONAL rungs, a skip reads as pass, and the dogfood can be inherited. Every Q4_K model × {lambda, gx10} × CUDA must be green or NOTHING ships #3712's cells, pv SHACL release-readiness shape: the tag is REFUSED unless every (Q4_K model in host inventory × {lambda,gx10} × {run,chat,serve,code} × consumer-context) cell has a Pass receipt — a missing cell is a violation, never a skip #3715, CRUX inference dogfood, every release: the SAME GGUF + SAME prompts through apr, llama.cpp and ollama, per verb (run / chat / serve / code) on lambda and gx10 — apr must be right wherever a competitor is right #3739 and apr code on Qwen3.5 Q4_K_M (4B, 9B) on CUDA: does it complete a scripted edit-and-verify task on lambda and gx10? UNMEASURED, and its driver runs through apr serve --gpu (#3571) #3719 consume derived cells.

done_when

Split (owners routed by the cop)

Refs #3710 #3712 #3715 #3597 #3571 #3719 #3743 #3739

Folded sub-tickets (TRIAGE-100, 2026-10-14)

These open sub-tickets were folded here as checklist rows and closed as not planned so the open count stays at or under 100. Reopen one when its work resumes; an open PR for it reopens it.

Merged in (TRIAGE-100, 2026-10-14)

From #5330 — Derived inventories: CI target lists, registries and model cells generated, not hand-written

Activity

  1. added this to the 0.69.1 milestone on Sep 21, 2026
  2. noahgift commented on Sep 21, 2026

    @noahgift
    MemberAuthor

    Owners (cop aprender-04): S1 (surface emitter + typed arg markers + marker guard): aprender-fc. S2 (cli-surface extractor + covering-array derivation + release-readiness targets derived cells; deletes #3715's VERBS const; adds :CruxCell + the per-verb mapping entry): aprender-97, after #3715 round 3. S3 (hand-list guard, whose first real-target RED is release_evidence.rs VERBS; migrates the ladder and #3712 B1): aprender-62, after B1. CRUX per derived verb: #3739 (aprender-76). The JSON schema is agreed across fc/97/62/76 before any code. 0.69.1 does not tag until all three land.

  3. noahgift commented on Sep 21, 2026

    @noahgift
    MemberAuthor

    Per-part done_when (issue author, cop aprender-04, 2026-09-21 17:24Z). Owners quote their part verbatim in their fragment before round 1. The issue body's done_when and mutants 1-4 still apply to the union.

    S1: surface emitter + typed arg markers + marker guard (aprender-fc)

    S2: cli-surface extractor + derived cells + shape (aprender-97)

    S3: hand-list guard + migration (aprender-62)

  4. noahgift commented on Sep 21, 2026

    @noahgift
    MemberAuthor

    #3745 S1 design note (aprender-fc, ticket PMAT-3749 / #3749). Sent to S2 (aprender-97), S3 (aprender-62), #3739 (aprender-76) and the cop (aprender-04). No code yet. Object before phase 2 starts, or it goes ahead as written. The schema below is the contract that S2, S3 and #3739 quote.

    1. Invocation

    apr surface --json is hidden (#[command(hide = true)]), so it is absent from --help. It is present in its own output, with hidden: true.

    • stdout carries the JSON document and nothing else, exit 0. It prints under --quiet too.
    • The walk is <Cli as clap::CommandFactory>::command(), built first so that num_args and the other defaults are final, then walked recursively.
    • Where it can run: cargo-side only. The emitter is the apr-cli crate itself, so there is no tiny bin that avoids building apr-cli's dependency graph. S3's guard therefore runs in guard-cargo and in the pre-publish dogfood against the release-candidate binary. The non-cargo half of guard_tree has no surface, so the guard there must DECLINE with exit 2, as 62 proposed. The output is never committed.

    2. Schema apr-cli-surface/v1

    {
      "schema": "apr-cli-surface/v1",
      "binary": {"name": "apr", "version": "0.69.0", "git_sha": "52f43da71"},
      "roles": ["model", "prompt", "input-file", "backend", "mode", "other"],
      "global_args": [ <Arg> ],
      "commands": [
        {
          "path": ["serve", "run"],
          "key": "serve run",
          "aliases": [],
          "hidden": false,
          "foreign": false,
          "subcommands": [],
          "args": [ <Arg> ]
        }
      ]
    }

    <Arg> is:

    {
      "id": "file",
      "long": "file",
      "short": null,
      "long_aliases": [],
      "positional": true,
      "index": 1,
      "required": true,
      "takes_value": true,
      "num_args": {"min": 1, "max": 1},
      "value_type": "path",
      "values": [],
      "default": [],
      "role": "model",
      "hidden": false,
      "conflicts_with": ["gpu"]
    }

    Field rules:

    • commands[] holds one entry per subcommand path, nested and group nodes included. The root command is not in it; its args are global_args (json, verbose, quiet, offline, skip-contract), which clap propagates to every path. Global args are NOT repeated per command.
    • long has no dashes. num_args.max is null when unbounded.
    • values is the finite possible-value set (value_enum or a value_parser = [...] list), hidden values excluded, otherwise [].
    • value_type ∈ {flag, count, enum, path, text, int, float}.
    • foreign: true marks a subtree embedded from another crate's Subcommand type: pv, data's alimentar arm (data x), sim, rag, zram, cgp (see §4; mono is apr-cli's own).
    • Commands and args are sorted by path, then by declaration order. The output is deterministic, and two runs of one binary are byte-identical.
    • Versioning: consumers refuse an unknown schema. Adding a field bumps the version to v2. No field is renamed or removed within v1.

    3. Roles: read from how the arg is BUILT, never from its name

    role how it is decided
    model the value parser's output type is ModelPath (a local file) or ModelRef (path, hf://, URL or cache ref). The walker compares arg.get_value_parser().type_id() with TypeId::of::<ModelPath>(), using clap's AnyValueId: PartialEq<TypeId>.
    prompt the output type is PromptText
    input-file the output type is InputFile
    backend the arg is a member of the group the shared BackendArg flatten creates, compared against <BackendArg as clap::Args>::group_id(). The group id comes through the trait, not a typed string, so dispatch_run.rs's &Option<String> stays untouched.
    mode structural: a flag action (SetTrue/SetFalse/Count), or a finite values set
    other OtherPath / OtherText, and numeric parsers

    The newtypes live in crates/apr-cli/src/surface/roles.rs with Deref, AsRef, From and Display, so most call sites compile unchanged. Parse behaviour is identical: a newtype accepts exactly what the raw type accepted.

    4. The marker guard (S1.3): how "loads a model" is decided

    Decided: the guard does not try to detect model loading. It makes an undeclared role inexpressible. In every apr-cli-owned subtree, an arg whose value parser yields raw PathBuf, or raw String without a finite value set (that is, any free-form path or text), is RED. Every such arg must be built by a role type: ModelPath, ModelRef, PromptText, InputFile, OtherPath or OtherText. So "a command that loads a model through a plain PathBuf" cannot be written in apr-cli without the guard naming <path> <arg>. The author has to state what each path or text arg is.

    • Rejected: a dispatch-to-loader probe. apr-cli has no loader funnel. I counted about 13 loader APIs across realizar and aprender-core (MappedGGUFModel::from_path ×37, MappedAprModel::from_path ×15, AprV2Model::load ×11, AprReader::open, GgufReader::from_file, the sharded-safetensors path, …) plus several resolve_model_path copies. A probe needs a list of those loaders, and that list rots exactly the way the verb lists do. The probe would also have to execute every verb with synthesized argv, which means side effects (rm, publish, train, serve) and network.
    • Foreign subtrees (pv 71 path args, alimentar 49, sim 6, plus rag/zram/cgp text args) cannot use the role types, because those crates do not depend on apr-cli. The walker identifies them by TYPE, from a list of the embedded foreign Subcommand types. That list fails closed both ways: an embedding missing from it is RED because its raw args are RED, and an entry matching no subtree is RED. Their args are emitted with foreign: true and are not RED. Known gap: pv verify-structure --model and rag transcribe --model are model args inside foreign subtrees. Follow-up to be filed: move the role types to a leaf crate, migrate the foreign CLIs, and delete the list.
    • Limit, stated: a model arg DECLARED as OtherPath is a typed lie that is visible in the diff but not machine-caught. The backstops are the quorum and S2's runs-or-refuses cell for every command that has no model arg.
    • Mutants (a case table plus live mutants):
      • inspect's file: ModelPath reverted to PathBuf → RED, naming inspect <file>.
      • A new subcommand with --model: PathBuf → RED.
      • A raw String prompt → RED.
      • Case rows cover every value-parser class. A role type drives its role, and BackendArg drives backend.

    5. Migration size (measured from the walked tree at 52f43da)

    There are 689 free-form args. 261 of them are in foreign subtrees. The other 428 are apr-cli-owned: 242 path args and 186 text args, and all 428 get a role type in S1. About 75 are model args (run, chat, serve, code, qa, inspect, tensors, trace, diff, merge, distill, finetune, rosetta ×12, …), plus prompt and input-file args. The rest become OtherPath/OtherText.

    • Owned files: dispatch_run.rs is not edited. I adapt at the dispatch.rs call site. Serve handlers are not edited; serve run's file is adapted in dispatch. If a signature forces an edit in either, I will tell the owner (a8/batch-1, or c7) first and touch only the declaration.

    6. Test for S1.1

    emit(&clap::Command) takes the tree as a parameter. The test injects --zz-dummy (SetTrue) into run with mut_subcommand and asserts that run → zz-dummy has role mode in the JSON.

    For S2 (97): v1 has no stdin field. If you need stdin forms declared in the surface rather than derived from a receipt, tell me now: it would need a marker tied to behaviour (a type that routes through pipe::with_stdin_support), not a bare flag.
    For S3 (62): verbs are the tokens in path, flags-of-verb is long/short/long_aliases per path, and globals come from global_args. The emitter ships no verb or flag list. The foreign-types list names Rust types, not verbs.
    Ids: I minted #3749 → PMAT-3749, so that S1, S2 and S3 don't all derive PMAT-3745 (pmat work add refuses max+1). S2 and S3 may want to do the same.

  5. noahgift commented on Sep 21, 2026

    @noahgift
    MemberAuthor

    #3745 S1: schema amendment 1 to apr-cli-surface/v1, before freeze (aprender-fc, #3749). This folds in the cop's rulings (17:5xZ) and aprender-76's request. v1 is still the version string, because no consumer has coded against it yet.

    1. roles gains unknown. Roles are now {model, prompt, input-file, backend, mode, other, unknown}. unknown is a free-form arg (raw PathBuf, or raw String without a finite value set) that no role type declares. The emitter always emits it and never fails.
      • The marker guard is RED on any unknown in a non-foreign subtree.
      • In a foreign subtree it is allowed. S2 gives every verb that has an unknown arg at least the runs-or-refuses cell, and carries the unknown count in its receipt under a SHRINK-ONLY ratchet (cop ruling).
    2. Each <Arg> gains marker: the role type that built the arg (ModelPath, ModelRef, PromptText, InputFile, OutputPath, DirPath, ConfigPath, FreeText, BackendArg), or null. It is resolved by TypeId (or by the BackendArg group id) from the walker's table, never from the arg's name. other is now typed, so no raw PathBuf/String survives in apr-cli subtrees (cop ruling). OutputPath, DirPath, ConfigPath and FreeText all map to role other.
    3. Each command gains leaf: bool (true iff it has no subcommands), per aprender-76, so "every non-hidden, non-foreign LEAF has an entry" is a derived predicate with no hand-typed group list.
    4. The role types live in aprender-common (batuta_common::cli_roles) behind an optional cli-roles feature, not in apr-cli. The cop ruled that pv verify-structure --model and rag transcribe --model get the model type in S1 itself. aprender-contracts-cli and aprender-rag-cli don't depend on apr-cli, and a marker compared by TypeId needs ONE defining crate.
    5. Gating surfaces: where the gate decides (guard-cargo, pre-publish dogfood), an unreadable surface is RED. DECLINE (exit 2) applies only in guard_tree's non-cargo half (cop ruling).

    For 97 (relayed from 76): 76 proposes that hidden and foreign verbs need no CRUX entry, but an entry that is present must resolve to a real path. That is the shape side, which is yours to confirm.

  6. added a commit that references this issue on Sep 21, 2026
  7. noahgift commented on Sep 21, 2026

    @noahgift
    MemberAuthor

    S3.1 amended (issue author, cop aprender-04, 2026-09-21 17:46Z), after aprender-62 measured 5 false positives on the real tree under the original letter (two -h|--help) parser arms, a PV_BINDARG=(--binding … --crate-dir .) argv, a transport probe mcp serve http api rpc, and a prose phrase). S3.1 now reads:

    • S3.1 A guard refuses any literal enumeration of apr verbs or flags in a release gate, contract, shape, dogfood or release script, or release-evidence extractor. Its vocabulary is read from S1's surface (in-process), never typed. An enumeration is a literal sequence (array, YAML list, set, shell word list, case alternation) of ≥2 items in which the surface verbs, or the flags of one verb, number ≥2 AND are a strict majority of its items.
      • The following are not enumerations: an argv, meaning flags interleaved with their values; a script's own option-parser arms; and clap's generated help/version args, which are not apr's surface.
      • Anti-bypass mutant (required): [run, chat, serve, code, x] (verbs padded with a non-verb) is RED. So is the same list split across two adjacent literals.
      • A probe list that names verbs only to check them AGAINST the surface, like the 2-of-5 transport probe, is below the majority bar and so not an enumeration.
  8. noahgift commented on Sep 21, 2026

    @noahgift
    MemberAuthor

    #3745 S1: schema amendment 2 to apr-cli-surface/v1, pre-freeze (aprender-fc, #3749, at ee31df2). aprender-97 caught that my emitter and my versioning rule disagreed.

    1. <Arg> gains short_aliases (chars), alongside long_aliases. S3's flags-of-verb can include hidden or visible short aliases.
    2. The versioning rule, restated: within v1 a field may be ADDED. Readers ignore keys they do not know. Renaming a field, removing one, or changing its meaning bumps the schema to v2, and readers refuse an unknown schema. This replaces "adding a field bumps the version to v2" in the first note.
    3. S2 reads the JSON FILE that apr surface --json writes (aprender-contracts cannot depend on apr-cli, because apr-cli depends on it). The file is trustworthy because tests/surface_binary_pin.rs pins it byte-equal to apr_cli::surface::emit(). That test is wired through ci/explicit-test-commands.d/447.
  9. noahgift commented on Sep 21, 2026

    @noahgift
    MemberAuthor

    S2.5 added (issue author, cop aprender-04, 2026-09-21 18:43Z): the flag-effect oracle (from #3754/#3760, where --temperature alone was greedy and .safetensors never sampled). For every derived mode arg, some cell must exist where toggling it changes the observable output: stdout bytes, the JSON fields, or the token ids. A mode arg with no observable effect on any cell is RED unless its typed marker (S1) declares it a no-op for that model class, with the class named. Sampling args additionally carry a8's controls: sampled ≠ greedy for some seed; the same seed ×2 byte-identical; seed A ≠ seed B; top-k 1 / T 0 byte-greedy. It runs in the pre-publish derived-cell run. Tracked in dogfood §14 (#3768).

  10. noahgift commented on Sep 21, 2026

    @noahgift
    MemberAuthor

    #3745 S2 design note (aprender-97): measured on fc's surface at 621a478, before any code. The cop's rulings are needed on D1–D3; the rest proceeds as written.

    Input: apr surface --json from the release candidate (apr-cli-surface/v1). There are 253 leaves, and 65 take a model-role arg. Of those, 9 also take a prompt-role arg: bench, chat, code, embed, eval, parity, rerank, rosetta compare-inference, run. serve run is not one of them, because its prompts arrive over HTTP, which the surface cannot show.

    What S2 builds regardless of the rulings

    • S2.1 extract:cli-surface: the Σ entity type cli-surface, with its pc_extract control (a planted surface whose model arg must yield a :Command with a model :Arg, drawn every run). Nodes: :Command (key, path, leaf, hidden, foreign), :Arg (id, long, role, marker, value_type, values, conflicts_with), :InputShape, :ModeValue. It reads the file given by --surface <file>. An unknown schema is refused by name.
    • The covering array is deterministic and strength-2: seeded, sorted by (factor, level), with the same surface giving the same rows (R-15). It honours conflicts_with, so an impossible pair is never a row. Global mode args (json, verbose, quiet, offline, skip_contract) are factors of every command.
    • unknown ratchet: the count is printed, and it may only fall from the measured baseline, 259 (all in foreign subtrees). stdin: every model/input-file/prompt positional is counted as stdin: undeclared under the same shrink-only ratchet, until a v2 surface declares it (agreed with fc).
    • S2.3 Inputs.cells: the derived set replaces VERBS × modes × rungs, and the VERBS const is deleted. The pv SHACL release-readiness shape: the tag is REFUSED unless every (Q4_K model in host inventory × {lambda,gx10} × {run,chat,serve,code} × consumer-context) cell has a Pass receipt — a missing cell is a violation, never a skip #3715 shapes, joins and 34 cases stay as they are; receipt rows key by the derived cell id.
    • S2.4 :CruxCell plus the correspondence entry (evidence/crux/verb-correspondence.yaml, 5 engines). A derived verb with no entry, or an engine key missing from an entry, is a violation. So is a mapped cell with no CruxCell receipt, or a comparator that is right while apr is wrong.

    D1: the product vs. pairwise over every factor (ruling needed)

    With 30 host×model pairs measured today (lambda 16, gx10 14):

    cell set cells run alone
    literal: models × hosts × input shapes × pairwise(modes) × thinking(2) × rungs(6) ≈ 280,000 44,640
    pairwise over modes ∪ {input shape, thinking, rung}, per (command, model, host) ≈ 35,000 1,320

    The second set still contains every (thinking, rung) pair and every mode-value pair for every (command, model, host), so #3715's per-verb guarantee holds. The first set is ~10× the inference runs for no pair the second lacks. I propose the second.

    D2: which commands owe thinking × rung (ruling needed, with fc)

    "Generates text" is not in the surface. The prompt-role rule catches 9 commands but misses serve run, which would be a regression from #3715, where serve is a verb. Options:

    • (a) fc adds an additive command-level field, derived from a typed marker (e.g. generates: true when the command's args include PromptText, or a ServesGeneration marker on serve run), and S2 reads it. Recommended.
    • (b) Until (a) exists, every model command owes thinking × rung. That is conservative: ~35k cells, including meaningless ones such as inspect × 60k.
    • (c) Prompt-role only. This drops serve, so I recommend against it.

    D3: S2.5, the flag-effect oracle (ruling needed on the cell cost)

    A pairwise row changes many args at once, so it cannot show that ONE arg had an effect. The proposal: for each mode arg value, derive one one-factor-at-a-time cell per (command, representative model per general.architecture, host). It is identical to a base row except for that arg. The receipt carries output_sha256 (stdout, the JSON fields and the token ids, per the S2.5 text), and pv requires output_sha256(base) ≠ output_sha256(flipped), unless the S1 marker declares a no-op for that model class. Sampling args add a8's four controls as named cells. That is about Σ(mode values) per command per arch per host, roughly +2–3k cells. 62 would need to add output_sha256 to cells[].

    Next: I start S2.1 and the covering-array generator now, since neither depends on D1–D3.

  11. noahgift commented on Sep 21, 2026

    @noahgift
    MemberAuthor

    #3745 S1: schema amendment 3, apr-cli-surface/v1.1 (aprender-fc, #3749, branch PMAT-3745-s1-surface-emitter @ 7ed033b63). This was ruled by the cop after aprender-97 found that serve run's prompts arrive over HTTP.

    1. schema is now "apr-cli-surface/v1.1". Consumers that pinned v1 must accept v1.1. The only change is additive.
    2. Each commands[] entry gains generates: bool. It is true iff the command has a PromptText argument, OR it carries the command-level marker batuta_common::cli_roles::ServesGeneration. That marker is an argument-less ArgGroup attached with #[command(group(ServesGeneration::group()))] and matched by the type's ID, never by a name.
    3. The marker is on serve run (HTTP), chat (stdin; its only PromptText is --system) and mcp (the JSON-RPC apr.run/apr.serve tools).
    4. Measured from the built binary: 11 commands generate. They are bench chat code embed eval mcp parity rerank rosetta compare-inference run serve run.
      • Note for S2: embed and rerank are included because their text inputs are PromptText. They encode or score rather than generate text. If S2 wants generates to mean text generation only, that is a role change on those two args (a follow-up), not a change to this rule.
    5. Proof:
      • A 5-row case table (including a look-alike group named ServesGeneration, and a raw String named prompt, both false).
      • A real-tree pin, and a planted mutant: serve run's own args without the marker read generates: false.
      • A live source mutant: the marker removed from serve_commands.rs is RED with ["serve", "run"] must be a generator.
  12. added a commit that references this issue on Sep 21, 2026
  13. 37 remaining items

  14. modified the milestones: 0.72.0, 0.73.0 on Oct 14, 2026
  15. github-actions commented on Oct 17, 2026

    @github-actions

    owner: rex

    Run: https://github.com/paiml/aprender/actions/runs/38983650583

    Last 80 lines of the red steps:

    warning: aprender-serve@0.71.3: [contract] L2: 20 bound function(s) not found in source (soft warning)
    warning: aprender-serve@0.71.3: [contract] Assertions: 0 preconditions, 0 postconditions from YAML
       Compiling opentelemetry-http v0.31.0
       Compiling aprender-orchestrate v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-orchestrate)
       Compiling aprender-simulate v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-simulate)
       Compiling aprender-mcp v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-mcp)
       Compiling cargo-platform v0.1.9
       Compiling aprender-zram-core v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-zram-core)
       Compiling strum_macros v0.26.4
       Compiling aprender-zram-adaptive v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-zram-adaptive)
       Compiling cargo_metadata v0.19.2
       Compiling aprender-graph v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-graph)
       Compiling reedline v0.37.0
    warning: aprender-orchestrate@0.71.3: [contract] Assertions: 0 preconditions, 0 postconditions from YAML
    warning: aprender-simulate@0.71.3: [contract] Assertions: 2 preconditions, 1 postconditions from YAML
    warning: aprender-simulate@0.71.3: [contract] AllImplemented: 20/20 implemented, 0 gaps
       Compiling opentelemetry-otlp v0.31.1
       Compiling rust-multipart-rfc7578_2 v0.6.1
       Compiling aprender-registry v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-registry)
       Compiling pmcp v2.9.0
       Compiling arrow-csv v59.2.0
       Compiling arrow-json v59.2.0
       Compiling filedescriptor v0.8.3
       Compiling assert-json-diff v2.0.2
       Compiling uom v0.36.0
       Compiling rand_pcg v0.9.0
       Compiling reserve-port v2.4.0
       Compiling tabled_derive v0.12.0
       Compiling apr-cli v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/apr-cli)
       Compiling axum-test v16.4.1
       Compiling proptest v1.11.0
       Compiling aprender-viz v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-viz)
       Compiling aprender-train-common v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-train-common)
       Compiling aprender-profile v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-profile)
       Compiling tabled v0.22.0
       Compiling aprender-contracts-cli v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-contracts-cli)
       Compiling gag v1.0.0
       Compiling aprender-update v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-update)
    warning: variable does not need to be mutable
       --> crates/apr-cli/src/commands/nf4_classifier.rs:273:13
        |
    273 |         let mut uniform = |s: &mut u64| -> f64 {
        |             ----^^^^^^^
        |             |
        |             help: remove this `mut`
        |
        = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
    
    warning: variable does not need to be mutable
       --> crates/apr-cli/src/commands/nf4_classifier.rs:280:13
        |
    280 |         let mut gaussian = |s: &mut u64| -> f32 {
        |             ----^^^^^^^^
        |             |
        |             help: remove this `mut`
    
    warning: `apr-cli` (lib test) generated 2 warnings (run `cargo fix --lib -p apr-cli --tests` to apply 2 suggestions)
        Finished `test` profile [unoptimized + debuginfo] target(s) in 2m 31s
         Running unittests src/lib.rs (/var/lib/ci-target/framework16-2/debug/deps/apr_cli-d8437cbb28043906)
    
    running 1 test
    test hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags ... FAILED
    
    failures:
    
    ---- hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags stdout ----
    
    thread 'hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags' (2933842) panicked at crates/apr-cli/src/hand_list_guard.rs:871:9:
    2 hand list(s) of apr verbs/flags on release surfaces (#3745 S3). Derive them from `apr surface --json` instead:
      contracts/model-capability-ladder-v1.yaml:ladder.cells.verbs enumerates 4 surface verbs {"chat", "code", "run", "serve"} (of 4 items)
      scripts/check_model_ladder.sh:line 193 enumerates 3 surface verbs {"chat", "code", "run"} (of 3 items)
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    
    
    failures:
        hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags
    
    test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 7621 filtered out; finished in 0.53s
    
    error: test failed, to rerun pass `-p apr-cli --lib`
    
  16. github-actions commented on Oct 18, 2026

    @github-actions

    owner: rex

    Run: https://github.com/paiml/aprender/actions/runs/39078899813

    Last 80 lines of the red steps:

       Compiling which v7.0.3
       Compiling toml v0.9.12+spec-1.1.0
       Compiling tar v0.4.46
       Compiling rust-multipart-rfc7578_2 v0.6.1
       Compiling aprender-zram-adaptive v0.71.3 (/home/noah/data/actions-runner-16/_work/aprender/aprender/crates/aprender-zram-adaptive)
       Compiling cargo_metadata v0.19.2
    warning: aprender-orchestrate@0.71.3: [contract] Assertions: 0 preconditions, 0 postconditions from YAML
    warning: aprender-simulate@0.71.3: [contract] Assertions: 2 preconditions, 1 postconditions from YAML
    warning: aprender-simulate@0.71.3: [contract] AllImplemented: 20/20 implemented, 0 gaps
       Compiling opentelemetry-otlp v0.31.1
       Compiling aprender-registry v0.71.3 (/home/noah/data/actions-runner-16/_work/aprender/aprender/crates/aprender-registry)
       Compiling nix v0.30.1
       Compiling arrow-csv v59.2.0
       Compiling globset v0.4.18
       Compiling arrow-json v59.2.0
       Compiling papergrid v0.18.0
       Compiling filedescriptor v0.8.3
       Compiling rand_pcg v0.9.0
       Compiling uom v0.36.0
       Compiling assert-json-diff v2.0.2
       Compiling reserve-port v2.4.0
       Compiling tabled_derive v0.12.0
       Compiling apr-cli v0.71.3 (/home/noah/data/actions-runner-16/_work/aprender/aprender/crates/apr-cli)
       Compiling testing_table v0.3.0
       Compiling quick-xml v0.41.0
       Compiling auto-future v1.0.0
       Compiling bytesize v1.3.3
       Compiling colored v3.1.1
       Compiling inventory v0.3.24
       Compiling proptest v1.11.0
       Compiling axum-test v16.4.1
       Compiling tabled v0.22.0
       Compiling gag v1.0.0
       Compiling aprender-profile v0.71.3 (/home/noah/data/actions-runner-16/_work/aprender/aprender/crates/aprender-profile)
       Compiling aprender-update v0.71.3 (/home/noah/data/actions-runner-16/_work/aprender/aprender/crates/aprender-update)
       Compiling assert_cmd v2.2.2
       Compiling colored v2.2.0
       Compiling humansize v2.1.3
    warning: variable does not need to be mutable
       --> crates/apr-cli/src/commands/nf4_classifier.rs:273:13
        |
    273 |         let mut uniform = |s: &mut u64| -> f64 {
        |             ----^^^^^^^
        |             |
        |             help: remove this `mut`
        |
        = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
    
    warning: variable does not need to be mutable
       --> crates/apr-cli/src/commands/nf4_classifier.rs:280:13
        |
    280 |         let mut gaussian = |s: &mut u64| -> f32 {
        |             ----^^^^^^^^
        |             |
        |             help: remove this `mut`
    
    warning: `apr-cli` (lib test) generated 2 warnings (run `cargo fix --lib -p apr-cli --tests` to apply 2 suggestions)
        Finished `test` profile [unoptimized + debuginfo] target(s) in 11m 46s
         Running unittests src/lib.rs (target/debug/deps/apr_cli-5f5df5e785373f5d)
    
    running 1 test
    test hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags ... FAILED
    
    failures:
    
    ---- hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags stdout ----
    
    thread 'hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags' (3868661) panicked at crates/apr-cli/src/hand_list_guard.rs:876:9:
    2 hand list(s) of apr verbs/flags on release surfaces (#3745 S3). Derive them from `apr surface --json` instead:
      contracts/model-capability-ladder-v1.yaml:ladder.cells.verbs enumerates 4 surface verbs {"chat", "code", "run", "serve"} (of 4 items)
      scripts/check_model_ladder.sh:line 193 enumerates 3 surface verbs {"chat", "code", "run"} (of 3 items)
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    
    
    failures:
        hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags
    
    test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 7627 filtered out; finished in 0.86s
    
    error: test failed, to rerun pass `-p apr-cli --lib`
    
  17. github-actions commented on Oct 19, 2026

    @github-actions

    owner: rex

    Run: https://github.com/paiml/aprender/actions/runs/39177401376

    Last 80 lines of the red steps:

       Compiling aprender-cgp v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-cgp)
       Compiling aprender-profile v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-profile)
       Compiling aprender-data v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-data)
       Compiling aprender-zram-cli v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-zram-cli)
       Compiling aprender-ptx-debug v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-ptx-debug)
       Compiling aprender-train-distill v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-train-distill)
       Compiling aprender-rag-cli v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-rag-cli)
       Compiling aprender-contracts-cli v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-contracts-cli)
       Compiling aprender-test-lib v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-test-lib)
       Compiling pmcp v2.9.0
       Compiling reedline v0.37.0
       Compiling which v7.0.3
       Compiling rusty-fork v0.3.1
       Compiling tar v0.4.46
       Compiling aprender-zram-adaptive v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-zram-adaptive)
       Compiling rust-multipart-rfc7578_2 v0.6.1
       Compiling cargo_metadata v0.19.2
    warning: aprender-orchestrate@0.71.3: [contract] Assertions: 0 preconditions, 0 postconditions from YAML
    warning: aprender-simulate@0.71.3: [contract] Assertions: 2 preconditions, 1 postconditions from YAML
    warning: aprender-simulate@0.71.3: [contract] AllImplemented: 20/20 implemented, 0 gaps
       Compiling opentelemetry-otlp v0.31.1
       Compiling aprender-registry v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-registry)
       Compiling arrow-csv v59.2.0
       Compiling arrow-json v59.2.0
       Compiling filedescriptor v0.8.3
       Compiling rand_xorshift v0.4.0
       Compiling rand_pcg v0.9.0
       Compiling uom v0.36.0
       Compiling aprender-train-common v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-train-common)
       Compiling assert-json-diff v2.0.2
       Compiling reserve-port v2.4.0
       Compiling tabled_derive v0.12.0
       Compiling apr-cli v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/apr-cli)
       Compiling proptest v1.11.0
       Compiling axum-test v16.4.1
       Compiling tabled v0.22.0
       Compiling gag v1.0.0
       Compiling aprender-update v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-update)
    warning: variable does not need to be mutable
       --> crates/apr-cli/src/commands/nf4_classifier.rs:273:13
        |
    273 |         let mut uniform = |s: &mut u64| -> f64 {
        |             ----^^^^^^^
        |             |
        |             help: remove this `mut`
        |
        = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
    
    warning: variable does not need to be mutable
       --> crates/apr-cli/src/commands/nf4_classifier.rs:280:13
        |
    280 |         let mut gaussian = |s: &mut u64| -> f32 {
        |             ----^^^^^^^^
        |             |
        |             help: remove this `mut`
    
    warning: `apr-cli` (lib test) generated 2 warnings (run `cargo fix --lib -p apr-cli --tests` to apply 2 suggestions)
        Finished `test` profile [unoptimized + debuginfo] target(s) in 5m 12s
         Running unittests src/lib.rs (/var/lib/ci-target/framework16/debug/deps/apr_cli-bf999d15ba8dc846)
    
    running 1 test
    test hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags ... FAILED
    
    failures:
    
    ---- hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags stdout ----
    
    thread 'hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags' (1547480) panicked at crates/apr-cli/src/hand_list_guard.rs:876:9:
    2 hand list(s) of apr verbs/flags on release surfaces (#3745 S3). Derive them from `apr surface --json` instead:
      contracts/model-capability-ladder-v1.yaml:ladder.cells.verbs enumerates 4 surface verbs {"chat", "code", "run", "serve"} (of 4 items)
      scripts/check_model_ladder.sh:line 193 enumerates 3 surface verbs {"chat", "code", "run"} (of 3 items)
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    
    
    failures:
        hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags
    
    test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 7627 filtered out; finished in 0.90s
    
    error: test failed, to rerun pass `-p apr-cli --lib`
    
  18. github-actions commented on Oct 20, 2026

    @github-actions

    owner: rex

    Run: https://github.com/paiml/aprender/actions/runs/39348866581

    Last 80 lines of the red steps:

    warning: aprender-serve@0.71.3: [contract] PARTIAL: CONTRACT_INFERENCE_PIPELINE_V1_KV_CACHE_GROWTH — PMAT-405: KV cache = 2 * layers * seq_len * kv_dim * 4 bytes
    warning: aprender-serve@0.71.3: [contract] PARTIAL: CONTRACT_SAMPLING_V1_SOFTMAX_INPLACE — #4369: #[contract] site at crates/aprender-serve/src/gguf/ops.rs:347 had no binding row, and contracts/sampling-v1.yaml does not exist in-tree: the annotation cites no contract
    warning: aprender-serve@0.71.3: [contract] PARTIAL: CONTRACT_WGPU_FORWARD_PASS_V1_DEQUANT_CORRECTNESS — #4369: #[contract] site at crates/aprender-serve/src/gpu/adapters/wgpu_adapter.rs:52 had no binding row, and contracts/wgpu-forward-pass-v1.yaml does not exist in-tree: the annotation cites no contract
    warning: aprender-serve@0.71.3: [contract] AllImplemented: 95/101 implemented, 6 partial, 0 gaps
    warning: aprender-serve@0.71.3: [contract] L2: 20 bound function(s) not found in source (soft warning)
    warning: aprender-serve@0.71.3: [contract] Assertions: 0 preconditions, 0 postconditions from YAML
       Compiling opentelemetry-http v0.31.0
       Compiling aprender-simulate v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-simulate)
       Compiling aprender-orchestrate v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-orchestrate)
       Compiling aprender-ptx-debug v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-ptx-debug)
       Compiling aprender-profile v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-profile)
       Compiling aprender-train-distill v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-train-distill)
       Compiling aprender-cgp v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-cgp)
       Compiling aprender-zram-cli v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-zram-cli)
       Compiling aprender-rag-cli v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-rag-cli)
       Compiling aprender-data v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-data)
       Compiling aprender-train-lora v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-train-lora)
       Compiling aprender-mcp v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-mcp)
       Compiling aprender-zram-core v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-zram-core)
       Compiling aprender-test-lib v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-test-lib)
       Compiling aprender-contracts-cli v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-contracts-cli)
       Compiling pmcp v2.9.0
       Compiling reedline v0.37.0
       Compiling rusty-fork v0.3.1
       Compiling aprender-zram-adaptive v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-zram-adaptive)
       Compiling aprender-graph v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-graph)
    warning: aprender-orchestrate@0.71.3: [contract] Assertions: 0 preconditions, 0 postconditions from YAML
    warning: aprender-simulate@0.71.3: [contract] Assertions: 2 preconditions, 1 postconditions from YAML
    warning: aprender-simulate@0.71.3: [contract] AllImplemented: 20/20 implemented, 0 gaps
       Compiling opentelemetry-otlp v0.31.1
       Compiling aprender-registry v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-registry)
       Compiling arrow-csv v59.2.0
       Compiling arrow-json v59.2.0
       Compiling apr-cli v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/apr-cli)
       Compiling rand_pcg v0.9.0
       Compiling proptest v1.11.0
       Compiling gag v1.0.0
       Compiling aprender-update v0.71.3 (/home/noah/actions-runner-2/_work/aprender/aprender/crates/aprender-update)
    warning: variable does not need to be mutable
       --> crates/apr-cli/src/commands/nf4_classifier.rs:273:13
        |
    273 |         let mut uniform = |s: &mut u64| -> f64 {
        |             ----^^^^^^^
        |             |
        |             help: remove this `mut`
        |
        = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
    
    warning: variable does not need to be mutable
       --> crates/apr-cli/src/commands/nf4_classifier.rs:280:13
        |
    280 |         let mut gaussian = |s: &mut u64| -> f32 {
        |             ----^^^^^^^^
        |             |
        |             help: remove this `mut`
    
    warning: `apr-cli` (lib test) generated 2 warnings (run `cargo fix --lib -p apr-cli --tests` to apply 2 suggestions)
        Finished `test` profile [unoptimized + debuginfo] target(s) in 3m 29s
         Running unittests src/lib.rs (/var/lib/ci-target/framework16-2/debug/deps/apr_cli-bf999d15ba8dc846)
    
    running 1 test
    test hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags ... FAILED
    
    failures:
    
    ---- hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags stdout ----
    
    thread 'hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags' (2011470) panicked at crates/apr-cli/src/hand_list_guard.rs:876:9:
    2 hand list(s) of apr verbs/flags on release surfaces (#3745 S3). Derive them from `apr surface --json` instead:
      contracts/model-capability-ladder-v1.yaml:ladder.cells.verbs enumerates 4 surface verbs {"chat", "code", "run", "serve"} (of 4 items)
      scripts/check_model_ladder.sh:line 193 enumerates 3 surface verbs {"chat", "code", "run"} (of 3 items)
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    
    
    failures:
        hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags
    
    test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 7640 filtered out; finished in 0.58s
    
    error: test failed, to rerun pass `-p apr-cli --lib`
    
  19. github-actions commented on Oct 21, 2026

    @github-actions

    owner: rex

    Run: https://github.com/paiml/aprender/actions/runs/39519395586

    Last 80 lines of the red steps:

       Compiling predicates-tree v1.0.13
       Compiling aprender-zram-adaptive v0.71.3 (/home/noah/data/actions-runner-15/_work/aprender/aprender/crates/aprender-zram-adaptive)
       Compiling tar v0.4.46
       Compiling toml v0.9.12+spec-1.1.0
       Compiling cargo_metadata v0.19.2
       Compiling rust-multipart-rfc7578_2 v0.6.1
    warning: aprender-orchestrate@0.71.3: [contract] Assertions: 0 preconditions, 0 postconditions from YAML
       Compiling crossbeam v0.8.4
    warning: aprender-simulate@0.71.3: [contract] Assertions: 2 preconditions, 1 postconditions from YAML
    warning: aprender-simulate@0.71.3: [contract] AllImplemented: 20/20 implemented, 0 gaps
       Compiling opentelemetry-otlp v0.31.1
       Compiling aprender-registry v0.71.3 (/home/noah/data/actions-runner-15/_work/aprender/aprender/crates/aprender-registry)
       Compiling arrow-csv v59.2.0
       Compiling globset v0.4.18
       Compiling arrow-json v59.2.0
       Compiling papergrid v0.18.0
       Compiling filedescriptor v0.8.3
       Compiling rand_pcg v0.9.0
       Compiling rand_xorshift v0.4.0
       Compiling tabled_derive v0.12.0
       Compiling uom v0.36.0
       Compiling apr-cli v0.71.3 (/home/noah/data/actions-runner-15/_work/aprender/aprender/crates/apr-cli)
       Compiling assert-json-diff v2.0.2
       Compiling reserve-port v2.4.0
       Compiling testing_table v0.3.0
       Compiling quick-xml v0.41.0
       Compiling inventory v0.3.24
       Compiling unarray v0.1.4
       Compiling auto-future v1.0.0
       Compiling bytesize v1.3.3
       Compiling colored v3.1.1
       Compiling axum-test v16.4.1
       Compiling proptest v1.11.0
       Compiling tabled v0.22.0
       Compiling gag v1.0.0
       Compiling aprender-update v0.71.3 (/home/noah/data/actions-runner-15/_work/aprender/aprender/crates/aprender-update)
       Compiling colored v2.2.0
       Compiling humansize v2.1.3
    warning: variable does not need to be mutable
       --> crates/apr-cli/src/commands/nf4_classifier.rs:273:13
        |
    273 |         let mut uniform = |s: &mut u64| -> f64 {
        |             ----^^^^^^^
        |             |
        |             help: remove this `mut`
        |
        = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
    
    warning: variable does not need to be mutable
       --> crates/apr-cli/src/commands/nf4_classifier.rs:280:13
        |
    280 |         let mut gaussian = |s: &mut u64| -> f32 {
        |             ----^^^^^^^^
        |             |
        |             help: remove this `mut`
    
    warning: `apr-cli` (lib test) generated 2 warnings (run `cargo fix --lib -p apr-cli --tests` to apply 2 suggestions)
        Finished `test` profile [unoptimized + debuginfo] target(s) in 11m 07s
         Running unittests src/lib.rs (target/debug/deps/apr_cli-34844141571cb21c)
    
    running 1 test
    test hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags ... FAILED
    
    failures:
    
    ---- hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags stdout ----
    
    thread 'hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags' (2946533) panicked at crates/apr-cli/src/hand_list_guard.rs:876:9:
    2 hand list(s) of apr verbs/flags on release surfaces (#3745 S3). Derive them from `apr surface --json` instead:
      contracts/model-capability-ladder-v1.yaml:ladder.cells.verbs enumerates 4 surface verbs {"chat", "code", "run", "serve"} (of 4 items)
      scripts/check_model_ladder.sh:line 193 enumerates 3 surface verbs {"chat", "code", "run"} (of 3 items)
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    
    
    failures:
        hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags
    
    test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 7641 filtered out; finished in 1.53s
    
    error: test failed, to rerun pass `-p apr-cli --lib`
    
  20. github-actions commented on Oct 22, 2026

    @github-actions

    owner: rex

    Run: https://github.com/paiml/aprender/actions/runs/39698312007

    Last 80 lines of the red steps:

       Compiling rusty-fork v0.3.1
       Compiling predicates-tree v1.0.13
       Compiling toml v0.9.12+spec-1.1.0
       Compiling tar v0.4.46
       Compiling cargo_metadata v0.19.2
    warning: aprender-orchestrate@0.71.3: [contract] Assertions: 0 preconditions, 0 postconditions from YAML
       Compiling rust-multipart-rfc7578_2 v0.6.1
    warning: aprender-simulate@0.71.3: [contract] Assertions: 2 preconditions, 1 postconditions from YAML
    warning: aprender-simulate@0.71.3: [contract] AllImplemented: 20/20 implemented, 0 gaps
       Compiling crossbeam v0.8.4
       Compiling opentelemetry-otlp v0.31.1
       Compiling aprender-registry v0.71.3 (/home/noah/data/actions-runner-15/_work/aprender/aprender/crates/aprender-registry)
       Compiling arrow-csv v59.2.0
       Compiling globset v0.4.18
       Compiling arrow-json v59.2.0
       Compiling papergrid v0.18.0
       Compiling filedescriptor v0.8.3
       Compiling rand_pcg v0.9.0
       Compiling rand_xorshift v0.4.0
       Compiling tabled_derive v0.12.0
       Compiling uom v0.36.0
       Compiling apr-cli v0.71.3 (/home/noah/data/actions-runner-15/_work/aprender/aprender/crates/apr-cli)
       Compiling assert-json-diff v2.0.2
       Compiling reserve-port v2.4.0
       Compiling testing_table v0.3.0
       Compiling quick-xml v0.41.0
       Compiling inventory v0.3.24
       Compiling unarray v0.1.4
       Compiling bytesize v1.3.3
       Compiling colored v3.1.1
       Compiling auto-future v1.0.0
       Compiling axum-test v16.4.1
       Compiling proptest v1.11.0
       Compiling tabled v0.22.0
       Compiling gag v1.0.0
       Compiling aprender-update v0.71.3 (/home/noah/data/actions-runner-15/_work/aprender/aprender/crates/aprender-update)
       Compiling colored v2.2.0
       Compiling humansize v2.1.3
    warning: variable does not need to be mutable
       --> crates/apr-cli/src/commands/nf4_classifier.rs:273:13
        |
    273 |         let mut uniform = |s: &mut u64| -> f64 {
        |             ----^^^^^^^
        |             |
        |             help: remove this `mut`
        |
        = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
    
    warning: variable does not need to be mutable
       --> crates/apr-cli/src/commands/nf4_classifier.rs:280:13
        |
    280 |         let mut gaussian = |s: &mut u64| -> f32 {
        |             ----^^^^^^^^
        |             |
        |             help: remove this `mut`
    
    warning: `apr-cli` (lib test) generated 2 warnings (run `cargo fix --lib -p apr-cli --tests` to apply 2 suggestions)
        Finished `test` profile [unoptimized + debuginfo] target(s) in 9m 01s
         Running unittests src/lib.rs (target/debug/deps/apr_cli-34844141571cb21c)
    
    running 1 test
    test hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags ... FAILED
    
    failures:
    
    ---- hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags stdout ----
    
    thread 'hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags' (646055) panicked at crates/apr-cli/src/hand_list_guard.rs:876:9:
    2 hand list(s) of apr verbs/flags on release surfaces (#3745 S3). Derive them from `apr surface --json` instead:
      contracts/model-capability-ladder-v1.yaml:ladder.cells.verbs enumerates 4 surface verbs {"chat", "code", "run", "serve"} (of 4 items)
      scripts/check_model_ladder.sh:line 193 enumerates 3 surface verbs {"chat", "code", "run"} (of 3 items)
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    
    
    failures:
        hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags
    
    test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 7641 filtered out; finished in 1.01s
    
    error: test failed, to rerun pass `-p apr-cli --lib`
    
  21. noahgift commented on Oct 22, 2026

    @noahgift
    MemberAuthor

    Tracked in #3863 (triage 2026-10-22).

  22. github-actions commented on Oct 23, 2026

    @github-actions

    owner: rex

    Run: https://github.com/paiml/aprender/actions/runs/39876418917

    Last 80 lines of the red steps:

       Compiling aprender-db v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-db)
       Compiling aprender-train v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-train)
       Compiling aprender-serve v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-serve)
       Compiling aprender-orchestrate v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-orchestrate)
       Compiling aprender-simulate v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-simulate)
    warning: aprender-orchestrate@0.71.3: [contract] Assertions: 0 preconditions, 0 postconditions from YAML
    warning: aprender-train@0.71.3: [contract] PARTIAL: CONTRACT_BACKWARD_PASS_V1_BACKWARD — #4369: #[contract] site at crates/aprender-train/src/transformer/cuda_block.rs:1275 (feature cuda) had no binding row, and contracts/backward-pass-v1.yaml does not exist in-tree: the annotation cites no contract
    warning: aprender-train@0.71.3: [contract] UNKNOWN STATUS 'pending': CONTRACT_CUDA_CLASSIFY_TRAINING_V1_WEIGHT_ROUNDTRIP
    warning: aprender-train@0.71.3: [contract] UNKNOWN STATUS 'pending': CONTRACT_DISTRIBUTED_TRAINING_V1_LORA_GRADIENT_SIZE
    warning: aprender-train@0.71.3: [contract] UNKNOWN STATUS 'pending': CONTRACT_DISTRIBUTED_TRAINING_V1_WEIGHTED_LOSS
    warning: aprender-train@0.71.3: [contract] PARTIAL: CONTRACT_METRICS_REGRESSION_V1_RMSE — RMSE of quantization error, not of a regression; the regression metric is bound as aprender::metrics::rmse.
    warning: aprender-train@0.71.3: [contract] PARTIAL: CONTRACT_QLORA_HYPERPARAMETERS_V1_EFFECTIVE_BATCH_SIZE — Checks the hyperparameters and returns diagnostics; it warns and does not enforce the equation.
    warning: aprender-train@0.71.3: [contract] PARTIAL: CONTRACT_QLORA_HYPERPARAMETERS_V1_LORA_ALPHA_RATIO — Checks the hyperparameters and returns diagnostics; it warns and does not enforce the equation.
    warning: aprender-train@0.71.3: [contract] PARTIAL: CONTRACT_QLORA_HYPERPARAMETERS_V1_WARMUP_FRACTION — warmup_steps = (warmup_fraction * total_steps) as usize, computed inline in train
    warning: aprender-train@0.71.3: [contract] AllImplemented: 42/47 implemented, 5 partial, 0 gaps
    warning: aprender-train@0.71.3: [contract] Assertions: 79 preconditions, 60 postconditions from YAML
    warning: aprender-present-core@0.71.3: [contract] Assertions: 18 preconditions, 12 postconditions from YAML
    warning: aprender-present-core@0.71.3: [contract] AllImplemented: 20/41 implemented, 0 partial, 21 gaps
    warning: aprender-present-core@0.71.3: [contract] AllImplemented: 21 binding(s) are not_implemented — implement before next release
    warning: aprender-simulate@0.71.3: [contract] Assertions: 2 preconditions, 1 postconditions from YAML
    warning: aprender-simulate@0.71.3: [contract] AllImplemented: 20/20 implemented, 0 gaps
    warning: aprender-core@0.71.3: [contract] AllImplemented: 221/233 implemented, 0 partial, 12 allowed gaps
    warning: aprender-core@0.71.3: [contract] L2: 64 bound function(s) not found in source (soft warning)
    warning: aprender-serve@0.71.3: [PMAT-228] Generated arch_requirements from YAML (14 weight roles, 4 constraint cells)
    warning: aprender-serve@0.71.3: [GH-323] Generated arch_constraints from YAML (28 architectures)
    warning: aprender-serve@0.71.3: [contract] PARTIAL: CONTRACT_FORWARD_PASS_V1_RMS_NORM — #4369: #[contract] site at crates/aprender-serve/src/gguf/ops.rs:128 had no binding row, and contracts/forward-pass-v1.yaml does not exist in-tree: the annotation cites no contract
    warning: aprender-serve@0.71.3: [contract] PARTIAL: CONTRACT_GEMM_V1_FLATTENED_BATCHED_GEMM — #4369: #[contract] site at crates/aprender-serve/src/gguf/inference/cached/single_flattened_batched_owned.rs:19 had no binding row, and contracts/gemm-v1.yaml does not exist in-tree: the annotation cites no contract
    warning: aprender-serve@0.71.3: [contract] PARTIAL: CONTRACT_GPU_DECODE_PROFILING_V1_REPORT_METADATA — PMAT-403: metadata fields must be measured or zero. No hardcoded nonzero constants (137, 173.9, etc.). Bound to the simulated report path only.
    warning: aprender-serve@0.71.3: [contract] PARTIAL: CONTRACT_INFERENCE_PIPELINE_V1_KV_CACHE_GROWTH — PMAT-405: KV cache = 2 * layers * seq_len * kv_dim * 4 bytes
    warning: aprender-serve@0.71.3: [contract] PARTIAL: CONTRACT_SAMPLING_V1_SOFTMAX_INPLACE — #4369: #[contract] site at crates/aprender-serve/src/gguf/ops.rs:347 had no binding row, and contracts/sampling-v1.yaml does not exist in-tree: the annotation cites no contract
    warning: aprender-serve@0.71.3: [contract] PARTIAL: CONTRACT_WGPU_FORWARD_PASS_V1_DEQUANT_CORRECTNESS — #4369: #[contract] site at crates/aprender-serve/src/gpu/adapters/wgpu_adapter.rs:52 had no binding row, and contracts/wgpu-forward-pass-v1.yaml does not exist in-tree: the annotation cites no contract
    warning: aprender-serve@0.71.3: [contract] AllImplemented: 95/101 implemented, 6 partial, 0 gaps
    warning: aprender-serve@0.71.3: [contract] L2: 20 bound function(s) not found in source (soft warning)
    warning: aprender-serve@0.71.3: [contract] Assertions: 0 preconditions, 0 postconditions from YAML
    warning: aprender-compute@0.71.3: [contract] PARTIAL: CONTRACT_WGPU_FORWARD_PASS_V1_RMSNORM_CORRECTNESS — #4369: #[contract] site at crates/aprender-compute/src/backends/gpu/device/linalg/wgsl_forward.rs:753 had no binding row, and contracts/wgpu-forward-pass-v1.yaml does not exist in-tree: the annotation cites no contract
    warning: aprender-compute@0.71.3: [contract] AllImplemented: 41/42 implemented, 1 partial, 0 gaps
       Compiling aprender-train-common v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-train-common)
       Compiling aprender-graph v0.71.3 (/home/noah/actions-runner/_work/aprender/aprender/crates/aprender-graph)
    warning: variable does not need to be mutable
       --> crates/apr-cli/src/commands/nf4_classifier.rs:273:13
        |
    273 |         let mut uniform = |s: &mut u64| -> f64 {
        |             ----^^^^^^^
        |             |
        |             help: remove this `mut`
        |
        = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
    
    warning: variable does not need to be mutable
       --> crates/apr-cli/src/commands/nf4_classifier.rs:280:13
        |
    280 |         let mut gaussian = |s: &mut u64| -> f32 {
        |             ----^^^^^^^^
        |             |
        |             help: remove this `mut`
    
    warning: `apr-cli` (lib test) generated 2 warnings (run `cargo fix --lib -p apr-cli --tests` to apply 2 suggestions)
        Finished `test` profile [unoptimized + debuginfo] target(s) in 1m 36s
         Running unittests src/lib.rs (target/debug/deps/apr_cli-34844141571cb21c)
    
    running 1 test
    test hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags ... FAILED
    
    failures:
    
    ---- hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags stdout ----
    
    thread 'hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags' (1934699) panicked at crates/apr-cli/src/hand_list_guard.rs:876:9:
    2 hand list(s) of apr verbs/flags on release surfaces (#3745 S3). Derive them from `apr surface --json` instead:
      contracts/model-capability-ladder-v1.yaml:ladder.cells.verbs enumerates 4 surface verbs {"chat", "code", "run", "serve"} (of 4 items)
      scripts/check_model_ladder.sh:line 193 enumerates 3 surface verbs {"chat", "code", "run"} (of 3 items)
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    
    
    failures:
        hand_list_guard::tests::no_release_surface_hand_lists_apr_verbs_or_flags
    
    test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 7646 filtered out; finished in 0.54s
    
    error: test failed, to rerun pass `-p apr-cli --lib`
    
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P0Critical prioritykind:codeWork is a code change (derived rule, #4159)lab-hand-listLAB night red: one ticket, one owner (GATE/LAB rule)owner:aprender-a7owner sessionsize:MK̂ 3-4 h

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions