Skip to content

fabric_capacity_standing: a probe field that is not there is Absent, not "" - #11930

Merged
briansrls merged 1 commit into
mainfrom
session/calm-lynx-80
Sep 21, 2026
Merged

briansrls merged 1 commit into
mainfrom
session/calm-lynx-80

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 21, 2026

Copy link
Copy Markdown
Contributor

The defect

gunbc.instruments.fabric_capacity_standing has not typechecked since #11555. The floor phase refuses it at two sites, both a List .first() (honestly Optional<T>) handed straight to trim(s: String):

dag/gunbc/instruments/fabric_capacity_standing.dag:146:27: error: value does not inhabit its declared type at the direct call argument for parameter 's': declared 'Primitive(String)', produced 'Optional<Primitive(String)>'
dag/gunbc/instruments/fabric_capacity_standing.dag:289:70: same

(reproduced on origin/main at 5ed882618, run 35553819536 job 106193439576). The required gate's floor job concluded success over it the whole time; #11829, which binds the receipt's adjudicator, is what made it visible.

The repair

Not a cast, and not a fabricated default (DESIGN §5 forbids an empty string standing in for "no field" exactly as it forbids the silent widen). An index past the end of the read lines is not a field, so field_at returns String? and the absence is propagated to the arm that already names what a missing field means:

  • the probe roster path — field_at → field_named → int_named/captured_named/nat_named → decode_probe, whose Absent arms already call refuse_slot, i.e. ProbeUnreadable { detail: slot_missing(...) }. The module's existing refusal vocabulary carries it; nothing new was minted.
  • the vLLM startup-line readers — after_startup_prefix, tokens_from_gpu_kv_cache_size_line, hundredths_from_maximum_concurrency_line, hundredths_from_two_digit_x are all already Int?/String?-valued and already refuse an unparseable line; the new Absent arm joins that same none.

Site 289 (split(s: after, delimiter: " ").first()) routes through the same field_at(..., n: 0) rather than growing a second way to read a segment.

field_at is module-local (no callers outside this file), and the -> T? + match-at-the-caller shape is the one its neighbours already use: v2.workflow.floor_terminal_ledger_wire ledger_wire_field_at, extdeps.bmc.ipmi_sdr sdr_field_at, extdeps.nvidia.cuda_driver cuda_reply_field_at, extdeps.linux.proc_pid_stat proc_pid_stat_field_at. So this conforms to an existing model rather than diverging from one.

No behaviour changes on a well-formed probe read: decode_probe already refuses unless the line count equals the roster length, and after_startup_prefix already requires ≥2 split parts, so the new Absent arms are reached only where the old code would have trimmed a non-existent line.

Evidence

  • local claim_executor --required-floor --source-root dag --source-root src/v2 strict-preparation over this head — the two errors gone, no new refusal (receipt in a follow-up comment).
  • the CI floor lane on this PR.

The module is not excluded from the closure.

Scope held to these two sites and what they force in this module; the other two main-side floor blockers are #11907's.

🤖 Generated with Claude Code

…not ""

The floor phase has been refusing gunbc.instruments.fabric_capacity_standing since
#11555: `field_at` passed `lines.skip(n: n).first()` -- honestly Optional<String> --
straight into `trim(s: String)`, and `tokens_from_gpu_kv_cache_size_line` did the same
on `split(...).first()`. The required gate's floor job concluded success over both, which
is what #11829 (binding the receipt's adjudicator) made visible.

The repair is not a cast. An index past the end of the read lines is not a field, so
`field_at` returns `String?` and the absence is propagated to the arm that already names
what the missing field MEANS: `field_named` -> `refuse_slot` -> `ProbeUnreadable { detail }`
for the probe roster, and `none` for the vLLM startup-line readers, which are already
Optional-valued and already refuse an unparseable line. No empty string stands in for
"no field" anywhere.

That shape is the module's neighbours' shape, not a new one: v2.workflow.floor_terminal_ledger_wire
ledger_wire_field_at, extdeps.bmc.ipmi_sdr sdr_field_at, extdeps.nvidia.cuda_driver
cuda_reply_field_at and extdeps.linux.proc_pid_stat proc_pid_stat_field_at all return an
Optional field and match at the caller.

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

gunbai-bot Bot commented Sep 21, 2026

Copy link
Copy Markdown
Contributor Author

Receipt: the floor phase stops refusing, and the instrument discriminates

Instrument: claim_executor --required-floor --source-root dag --source-root src/v2, run locally (arm64 session container; this argv dies in-preparation under a remote dispatch and reports a false clean, so it is deliberately not remote). Binary built from this head at /tmp/.../release/claim_executor. Both arms are the same binary, the same argv, the same tree — the only variable is this file's content.

The floor's own subject selection names the module, so this is not an entry-scope run standing in for the floor:

[floor-phase] phase=touched-entry-compile-subject seeds=1 modules=["gunbc.instruments.fabric_capacity_standing"]
[floor-phase] phase=gate-closure state=completed wall_ms=31656 prefixes=0 seeds=1 closure=534 bare_pulled=133 outside_closure=5890 corpus=6424

RED — the control, with origin/main's version of the file in the tree

dag/gunbc/instruments/fabric_capacity_standing.dag:146:27: error: value does not inhabit its declared type at the direct call argument for parameter 's': declared 'Primitive(String)', produced 'Optional<Primitive(String)>'
dag/gunbc/instruments/fabric_capacity_standing.dag:289:70: error: value does not inhabit its declared type at the direct call argument for parameter 's': declared 'Primitive(String)', produced 'Optional<Primitive(String)>'

grep -c 'error:' = 2, both of them the subject — the exact two sites, lines and columns the brief reports from run 35553819536 job 106193439576. So the instrument really does see this class, and the repair is what moves it.

GREEN — this head

[floor-phase] phase=strict-preparation state=completed wall_ms=697046 modules_resolved=1945 modules_excluded=0 digest=a758ff34400c5447

grep -c 'error:' = 0. Two things worth naming explicitly, because each is a way this run could have read clean without being clean:

  • state=completed is present. Absence of errors before that line is not a verdict on preparation; this run reached it.
  • modules_excluded=0. The module was not papered over by dropping it from the closure — the 534-module touched-entry closure seeded by it compiled through frontend → normalize → reconcile → analyses, and the wider 1945-module required-prefix closure resolved with nothing excluded.

Output was redirected to a file, never piped, so no early-close can fake a zero.

What this receipt does not claim

Preparation only. The evaluation fold is a CI job, not a session job, and this run was stopped after preparation completed — it says nothing about any witness passing. The CI floor lane on this PR is the arm for that.

@gunbai-bot

gunbai-bot Bot commented Sep 21, 2026

Copy link
Copy Markdown
Contributor Author

The CI arm: the floor lane passes on this head

floor pass (33m36s) on e022e12e875e3f1d33e0b7d06434f47d447791de — https://github.com/gunb-ai/gunbc/actions/runs/35555734797/job/106198904536. Alongside it compiler pass, clippy pass, and the aggregating witnesses context pass.

That is the arm the brief asked for, and it is the one that matters more than the local run: the local receipt above is preparation-only and says nothing about the fold, whereas this lane ran the fold to completion. The two refusals reported from run 35553819536 job 106193439576 are gone, and no new refusal took their place.

— sent from calm-lynx-80

@briansrls
briansrls added this pull request to the merge queue Sep 21, 2026
Merged via the queue into main with commit 94d51a2 Sep 21, 2026
4 checks passed
@briansrls
briansrls deleted the session/calm-lynx-80 branch September 21, 2026 10:17
gunbai-bot Bot pushed a commit that referenced this pull request Sep 21, 2026
#11930 landed the fabric_capacity_standing Optional propagation and another
change landed the lens construction_justification, both while this branch was
in review. Taking main's side for both files rather than mine: they landed
first, and a second authoring of a fix already on main is the duplication
DESIGN 2 refuses.

WORTH RECORDING, because it is evidence and not just a conflict: the lens fix
on main reached the SAME classification mine did, WallAfterGrounding
dissolves_to SingleAuthority, arrived at independently. Two readings agreeing
on a judgment call is better evidence for it than either alone.

What remains on this branch is the four that nobody else has fixed: the
std.nat import, the two re-pointed PRE_EXISTING_CITATION_DEBT subject modules,
and the guarantee-stall roster membership.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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