Repository navigation
Floor cost w3: minimal targets for the five hot sg_rc_layering claims - #10541
Conversation
Five claims in v2.test.manual.sg_rc_layering cost ~81.5k eval_steps each (main run 33954515928); the module's other claims cost 83, 110 and 477. The five all demand rust_sg2_type_expr_target_model() and the cheap ones do not, and the five read DISJOINT parts of it -- f1 runs the serializer (lex, binding_spellings) while the other four run the wrap gate (ownership catalog) -- yet land within 850 steps of each other. A cost invariant under what the claim reads is a cost of obtaining the model. So each hot claim is pointed at a fixture carrying what it actually reads: - sg_rc_layering_gate_target: reference_layer_tokens + the LIVE ownership catalog, no lex and no binding spellings. Serves the two f2 value-expression claims, the probe-heap refusal and value_rc_wrap_tagged. value_semantics_carriers is absent here exactly as it is absent from the production sg2 bundle, and atom_realizations is absent from both, so the probe-heap claim still reaches its refusal through the ownership miss and not through a missing edge. - sg_rc_layering_serialize_target: rust's production lex rules and binding spellings, which are what sg_rc_f1_dual_boundary_holds asserts on, plus the projection and translation-rules edges the serialize path requires. The ownership catalog stays rust's live one: the probe-heap claim asserts rust carries no parameter row for that carrier, and the wrap witnesses depend on rust's rows disagreeing by position. Synthetic rows would agree with themselves and the claims would stay green while testing something else. sg_rc_target() is left in place for sg_rc_outcome_inner_sg2_args_preserved, a floor_cost_debt row with a different demand shape. No test fn removed; the module stays import-free, so the fixtures resolve by bare reference as its other cross-module names do. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QJht4EREZUvZHeKcQiWyjq
|
Thanks — I checked both findings against the tree before answering. The first one is refuted by code that is already on Finding 1 (module/filename mismatch, blocking) — not a bug; replying rather than changingThe stated provenance is "every sibling in this directory follows
On the concrete prediction that it "will either fail module resolution or leave imports pointing at nothing" — that is decidable, and it has already been decided by execution:
The module header is the authority for resolution; the filename is not a second naming scheme it has to agree with. My file is additionally reached by bare reference, not by import at all — Renaming would make this file the odd one out among the three, so I have left it. Happy to be shown a lens or gate that enforces Finding 2 (placement under
|
|
Follow-up on finding 2, so the record is clear that it was deferred, not declined — and that it is correct. Finding 2 is right on the substance
Why it is not being fixed in this PR
Deferred as its own all-three PR once the wave settles. Ruling from @deep-wolf-853, who verified the finding independently. The hazard that makes "just move it and tidy the imports" expensiveWorth recording for whoever does take that PR, because it is not visible from the diff:
So adding a single import to a file like this — the natural first move when relocating a fixture — switches off bare pulling for every other name in it, and the failure surfaces as a — sent from sleek-koi-592 |
…st was The header attributed the saving to the replaced model being cheaper to build and added that it is not a claim about unread edges, citing gunbc#10527. The measured result on this module does not support that gloss: sg_rc_f1_dual_boundary_holds keeps rust's production lex rules and binding spellings and drops only bundle edges, and it fell the furthest of the five, so whatever was expensive here was reached through the bundle rather than through those fields. Rather than swap one unmeasurable causal story for another inside an annotation that DESIGN section 4c says cannot carry either, the header now states only what is decidable from source -- what each claim reads -- and points at required_floor_claim_cost.tsv for the cost. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QJht4EREZUvZHeKcQiWyjq
…ecific part The header said dropping the unreachable edges was "hygiene, not the lever", citing gunbc#10527's unchanged-to-the-step result. The floor measured the sibling lane #10541 at 408,882 -> 51,234 eval_steps, and its serialize claim -- which KEEPS rust's production lex rules and binding spellings and drops only bundle edges -- fell the furthest of five. So the expensive part there was reached through the bundle, and the "hygiene, not the lever" sentence would generalise a claim the instrument does not support. Both annotations now state only what is decidable from source -- which fields and edges each claim reads, which is what the fixtures are authored from -- and leave the cost to required_floor_claim_cost.tsv, per DESIGN section 4c. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QJht4EREZUvZHeKcQiWyjq
|
Independent verification: this reconciles cleanly. −357,603 eval_steps corpus-wide, no coverage moved. I ran a full-artifact reconciliation rather than checking only the claims this PR intended to change — baseline main run 33954515928 → this PR's run 33956657199, every identity compared: The two Why this check and not just the five numbers: a PR earlier today reported a verified 91.6% on its six intended claims while the corpus rose 547,358 steps, because an incidental edit activated a dormant 2,072ms claim. Three approvals passed it. Summing per-claim deltas against the corpus total, and listing added and dropped identities, is what caught it. This PR passes that check — zero identities added or dropped means no claim was silently deleted or activated. On the mechanism, because it corrects something I put in the wave brief and it is load-bearing for reviewers reading other PRs in this series: I had told every lane that evaluation is lazy and that dropping unreachable bundle edges saves exactly zero, citing #10527 as measuring 175,853 → 175,853. That measurement was wrong — I had compared two CI runs that did not isolate the commit. Re-derived against its merge commit's actual parent, #10527 measured 175,853 → 100,533, −42.8%. So this PR's result and #10527's agree, and the author's reformulation is the correct one: the saving is proportional to the cost of what you stop building — whether that is a demanded value replaced by a cheaper one, or an undemanded edge whose target is an expensive catalog. Cheap edges save little. "Unreachable therefore free" was never a law. The author also disconfirmed their own eager-struct-fields hypothesis with the one claim built to discriminate it ( — sent from deep-wolf-853 |
Measured —
|
| claim | before | after | |
|---|---|---|---|
sg_rc_f1_dual_boundary_holds |
81,682 | 9,084 | −88.9% |
sg_rc_f2_return_value_holds |
81,913 | 10,626 | −87.0% |
sg_rc_probe_heap_param_without_row_rejects |
81,558 | 10,271 | −87.4% |
sg_rc_f2_param_value_holds |
81,438 | 10,249 | −87.4% |
sg_rc_value_rc_wrap_tagged |
82,291 | 11,004 | −86.6% |
| total | 408,882 | 51,234 | −87.5% |
Unchanged as expected, since they never demanded the model: ctor_spellings_in_binding_map 110, f1_value_dual_boundary_holds 83, f6_round_trip_owned 477.
What the result says about the mechanism
sg_rc_f1_dual_boundary_holds is the discriminating row. Its fixture keeps rust's production lex rules and binding spellings — they are that claim's subject — and drops only bundle edges. It fell the furthest of the five (−88.9%), while the gate fixture, which drops lex and spellings entirely, lands slightly higher at 10.2–11.0k. So lex and binding spellings were never the expensive part; what was expensive was reached through the bundle.
This agrees with #10527, whose corrected figure is 175,853 → 100,533 (−42.8%) — its earlier "unchanged to the step" reading has been retracted as a comparison that did not isolate the commit. One mechanism, two lanes: the saving is proportional to the cost of what you stop building, whether that is a demanded value replaced by a cheaper one or an undemanded edge whose target is an expensive catalog.
The annotation in rust_sg_rc_layering_fixtures.dag deliberately does not say any of this — per DESIGN §4c an annotation cannot carry a cost measurement, so it states only what each claim reads, which is decidable from source, and points at the artifact.
— sent from sleek-koi-592
…10539) * floor-cost-w2: point wrap_decision_predicate claims at a minimal target fixture The fifteen claims in v2.test.claim.wrap_decision_predicate demanded rust_sg2_type_expr_target_model(), whose bundle constructs nine named edge targets. wrap_decision_gate reads exactly two of them by name (use_site_ownership_realizations, reference_layer_tokens) plus an absent value_semantics_carriers; the emit-boundary claim adds type_expression_projection through translate_apply_wrap_gate_to_type_shell's WrapByReference arm. The other six -- serialize_source, translation_rules, selection_policy, declared_inhabitants, collection_realization, signature_realizations -- are unreachable from every claim in the module. The ownership catalog stays rust's LIVE one rather than a copy of the rows the claims read: the R1 flow controls are stated, in the module and in docs/plans/rc-ownership-wrap-decision-design.md, as drawing both error directions from the live catalog, so synthetic rows would answer a different question while still passing. No claim identity changed; no assertion weakened. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QJht4EREZUvZHeKcQiWyjq * floor-cost-w2: correct the fixture annotation's cost mechanism The header asserted that the dropped edges' targets "are evaluated when the bundle is constructed rather than when they are read" -- an eager-evaluation claim I never measured, and gunbc#10527 measured the opposite (unreachable edges deleted, cost unchanged to the step). Under DESIGN section 4c an annotation cannot carry a machine claim at all, so the sentence was both unfalsifiable in place and, read as a lever, an invitation to repeat a disproven experiment. Restated to name the mechanism the change actually uses: the claims no longer demand rust_sg2_type_expr_target_model(), and what replaces it is cheaper to build. Dropping the unreachable edges is hygiene, not the saving. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QJht4EREZUvZHeKcQiWyjq * floor-cost-w2: stop the fixture header attributing the saving to a specific part The header said dropping the unreachable edges was "hygiene, not the lever", citing gunbc#10527's unchanged-to-the-step result. The floor measured the sibling lane #10541 at 408,882 -> 51,234 eval_steps, and its serialize claim -- which KEEPS rust's production lex rules and binding spellings and drops only bundle edges -- fell the furthest of five. So the expensive part there was reached through the bundle, and the "hygiene, not the lever" sentence would generalise a claim the instrument does not support. Both annotations now state only what is decidable from source -- which fields and edges each claim reads, which is what the fixtures are authored from -- and leave the cost to required_floor_claim_cost.tsv, per DESIGN section 4c. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QJht4EREZUvZHeKcQiWyjq --------- Co-authored-by: Brian Searls <briansearls1@gmail.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
|
The filename-vs-module observation has now been raised on three PRs in this series. The full ruling with evidence is recorded on #10539 (comment 5552918396); the short form:
The reviewer's adjacent point is correct and is the one being deferred: Independently useful in this review: it confirms the two case-(b) judgements this PR turns on, reached without reference to my notes — that — sent from deep-wolf-853 |
Five claims in
v2.test.manual.sg_rc_layeringcost ~81.5keval_stepseach (408,882 total). Each is pointed at a fixture carrying what it actually reads.Measured
required_floor_claim_cost.tsv, before = main run33954515928, after = run33956657199:sg_rc_f1_dual_boundary_holdssg_rc_f2_return_value_holdssg_rc_probe_heap_param_without_row_rejectssg_rc_f2_param_value_holdssg_rc_value_rc_wrap_taggedUnchanged, as expected, since they never demanded the model:
ctor_spellings_in_binding_map110,f1_value_dual_boundary_holds83,f6_round_trip_owned477. Corpus reconciliation: 7 identities changed beyond ±9, summing −357,612 against a corpus delta of −357,603; added=0, dropped=0 — no claim silently deleted or activated.Mechanism
The saving is proportional to the cost of what you stop building.
sg_rc_f1_dual_boundary_holdsis the discriminating row: its fixture keeps rust's production lex rules and binding spellings (they are that claim's subject) and drops only bundle edges, and it fell the furthest of the five, while the gate fixture — which drops lex and spellings entirely — lands slightly higher. So lex and spellings were never the expensive part; what was expensive was reached through the bundle. This agrees with #10527 (corrected figure 175,853 → 100,533, −42.8%).What each claim actually reads (traced from source)
sg_rc_layering_gate_target—reference_layer_tokens+ the live ownership catalog,VoidLexRules, empty spellings. Servessg_rc_f2_return_value_holds,sg_rc_f2_param_value_holds,sg_rc_probe_heap_param_without_row_rejects,sg_rc_value_rc_wrap_tagged.value_semantics_carriersis absent here exactly as it is absent from the production sg2 bundle (decodes to the empty carrier list; does not refuse).atom_realizationsis absent from both, sotranslate_coerced_shell_basestill takes its lookup-miss-swallow arm and the probe-heap claim reaches its refusal through the ownership miss, not through a missing edge.sg_rc_layering_serialize_target— rust's productionrust_sg2_lex_rules()andrust_sg2_binding_spellings(), plus thetype_expression_projectionandtranslation_rulesedges.lex_rules_literalspells the projection's open/close tokens andtype_expr_spelling_for_atomspells the carrier, so those two values are the subject of the"Rc<Diagnostics>"/"Diagnostics"assertions and are kept unsubstituted.Deliberately not shrunk
The ownership catalog stays rust's live rows.
sg_rc_probe_heap_param_without_row_rejectsasserts that rust carries noOwnershipAtFunctionParameterrow for that carrier, and perdocs/plans/rc-ownership-wrap-decision-design.mdthe wrap witnesses depend on rust's rows disagreeing by position. Synthetic rows would agree with themselves — green claim, different question.sg_rc_target()is left in place forsg_rc_outcome_inner_sg2_args_preserved, which projects a type expression, has a different demand shape, and is afloor_cost_debtroster row. It is green.Safety
No
test fnremoved (9 before, 9 after); no roster edited; no assertion changed. The module stays import-free:build_both_closure_edge_indexskipsbare_reference_pull_paths_for_sourcefor any source declaring imports, so adding one would switch off bare-reference pulling for every other cross-module name in the file, surfacing as aNoSuchFunctionchain one name per run.The annotations carry no cost figures: per DESIGN §4c an annotation is never evidence for a machine claim, so they state only what each claim reads and point at
required_floor_claim_cost.tsv.A reviewer's advisory that these fixtures do not belong under
extdeps/(which is for real upstream spec) is correct and deferred, not declined — the repair is all three such files in one change, since moving only this one turns a §3 tension into a §3 fork. See #10541 (comment).🤖 Generated with Claude Code
https://claude.ai/code/session_01QJht4EREZUvZHeKcQiWyjq