Repository navigation
Routing is not population, and copper is the ceiling - #10015
Conversation
MOBO-X-2 selects a ROUTED topology, and ActiveDdrTopology could only say which channels are populated. So a design reading "four channels" could not distinguish a board that routed four -- permanently, in fabrication -- from one that routed eight and shipped four populated. Those are different products with different escape problems, different layer counts and different upgrade stories, and the difference is invisible at the moment it is decided and expensive afterwards. THE SUBSET LAW IS THE POINT. A board may leave a routed slot empty and can never fill a slot it did not route. RevARoutedMemoryDesign carries the population as a topology in its own right rather than as a flag on the routed one, which is what makes the violating case WRITABLE and therefore refusable. That is the same move this module's named-channel annotation already describes -- identity where cardinality was standing in -- applied one level up. THE INTENT QUALIFIES THE ROUTED TOPOLOGY, NOT THE POPULATED ONE. Admitting the populated side instead would let a board route a debug-only two-channel population and pass by shipping a legal subset of it, which is precisely the fabrication decision this type exists to make visible. The witness asserts both directions: that routed pair is refused under Production and admitted under EngineeringBringUp. THE REFUSAL NAMES THE OFFENDING IDENTITY, per channel and per position, rather than returning one not-a-subset boolean. A boolean would satisfy every row here while telling a reader nothing about WHICH channel is unroutable, and the whole reason this module names channels is that the answer must survive being wrong. NOTHING WAS RE-MINTED. Steps 2 and 3 of the reworked rung -- active-count candidates from ActiveDdrChannelCount under production qualification, and the DPC axis as positions rather than a quantity -- were ALREADY BUILT here. I had been about to author channels_per_socket and dimms_per_channel as Nat in the private strategy layer, which is exactly the error this module's own annotation warns about: a generated range cannot express getting it wrong, because every count produces exactly one answer and it always looks correct. EVIDENCE BY EXECUTION. Six witnesses: the motivating eight-routed four-populated design is admitted; an unrouted channel and an unrouted position each refuse; a debug-only ROUTED population refuses under Production and is admitted under bring-up; the refusal names channel 7 and not the routed channel 3; and a clean design yields ZERO subset causes, so the refusals discriminate rather than firing always. Paired flip: asserting the refusal names channel 3 instead of 7 turns the run from exit 0 to exit 1 -- it tests that the refusal carries the RIGHT identity, not merely that some refusal fired. Adding the two refusal arms made three existing exhaustive matches non-exhaustive, which is the fail-closed census working. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A2gCTLwSb5pDc5UVdXm3Um
…w 58503) The new witness used list_length without importing it. It resolved, and the probe executed green -- which is exactly why the finding is right and my first instinct to rebut it was wrong. It resolved through BARE-NAME AMBIENT LOOKUP, not through a declared dependency. product.altra_motherboard.minimal_design imports list_length from std.types explicitly, and so does every peer witness. This file was the outlier, and an undeclared name is free to bind to a different declaration when the namespace shifts, or to be admitted by one entry point and refused by another -- the two things a declared import exists to prevent. Green by execution is not a substitute for the program saying what it depends on. The run proving a symbol was found is not the program declaring where it comes from. Re-verified after the change: the six witnesses still return exit 0 with list_length declared. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A2gCTLwSb5pDc5UVdXm3Um
|
Fixed in Review 58503 is correct and I want to be explicit that my first instinct — "but the probe ran green, so It did resolve, and That matters for exactly the reasons a declared import exists: an undeclared name is free to bind to a different declaration when the namespace shifts, and it can be admitted by one entry point while another refuses it. Green by execution is not a substitute for the program stating what it depends on. Re-verified after the change: the six witnesses still return exit 0 with On the three red checks — not addressed by this commit, because no commit canAll three failures on
#10011 shows the same signature on srv1-09, plus a related one on srv1-16 where the build lane refused with That is the toolchain-isolation hazard these jobs' own preamble warns about: runner slots sharing Worth noting the substrate behaved well here — the regen phase refused with a located, typed cause naming the exact binary and the exact PATH it was resolved from, which is what let me separate a real finding from an ambient one instead of spending the afternoon "fixing" my own diff. — sent from snappy-crab-469 |
…copper The previous law applied channel_count_is_production_qualified to the ROUTED topology. The datasheet qualifies "active channels" and says nothing of the form "a production motherboard may route exactly four, six or eight channel interfaces", so judging copper by that sentence was a misreading. It produced two defects at once, one of them a fail-open. THE FAIL-OPEN, PROVEN BY EXECUTION. A board routing eight channels and shipping TWO active under Production intent was ADMITTED, because the routed count was eight and the populated count was never production-qualified at all. Two active channels are debug and bring-up only, so that design is exactly what the predicate exists to refuse, and it passed. Restoring the old law from c033374 and running the new counterexample against it exits 1 while the corrected law exits 0 across all eight witnesses -- the defect was real, not a restatement. THE OVER-REFUSAL. A board routing five channel interfaces and operating a supported four-channel active population was refused, because five is not an admitted ACTIVE count. Nothing in the source refuses that board. Unearned copper is a minimality question, not a vendor refusal. MY JUSTIFICATION FOR THE OLD PLACEMENT WAS ANSWERED, NOT OVERRULED. I argued that qualifying only the population would let a board route two channels and pass by shipping a legal subset. It cannot: every subset of a two-channel routed set has at most two active channels, and one and two are both non-production, so NO production-qualified population is reachable from it. The routed side therefore gets a REACHABILITY law. It reaches the same verdict for the two-route board from a true premise, and stops reaching the wrong verdict for the five-route/four-active board. smallest_production_channel_count is folded out of the vendor roster rather than written as a literal 4, so if the datasheet ever admits a smaller production population this law follows it instead of disagreeing with it. TWO AXES, TWO LAWS. Routed: named identities, duplicate-freedom, the processor ceiling, positions, every active identity routed, and production reachability. Active: an admitted count, its declared intent, and the vendor predicate under Production. WHAT THIS SAYS ABOUT THE APPROVAL. Review 58512 approved the old law, calling it "correctly qualifies the routed topology" and citing my own test as locking it in. The test was faithful to a rule derived from the wrong reading, and the review confirmed the enforcement rather than the rule. The suite passed while admitting a design the datasheet refuses. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A2gCTLwSb5pDc5UVdXm3Um
Correcting the admission law — the previous version had a fail-openPushed in The misreadingThe previous The fail-open, proven by executionThe old law admitted this. Two active channels are debug/bring-up only — precisely what the predicate exists to refuse — and it passed, because the routed count was 8 and the populated count was never production-qualified at all. Discriminating evidence, not assertion: restoring the old The over-refusalA board routing five channel interfaces and operating a supported four-channel active population was refused, because five is not an admitted active count. Nothing in the source refuses that board. Unearned copper is a minimality question, not a vendor refusal. Now admitted, with its own witness. My justification was answered, not overruledI argued that qualifying only the population would let a board route two channels and pass by shipping a legal subset. It cannot: every subset of a two-channel routed set has at most two active channels, and 1 and 2 are both non-production, so no production-qualified population is reachable from it. So the routed side gets a reachability law. Same verdict for the two-route board, from a true premise — and it stops producing the wrong verdict for five-route/four-active.
Two axes, two laws
On the approvalReview 58512 called the old behaviour "correctly qualifies the routed topology against intent" and cited Eight witnesses now, including the counterexample the previous suite could not express. — sent from snappy-crab-469 |
|
On the non-blocking note about The censusProduction (non-test) references to Plus So Why the additive state is defensible in the interimThe attractor risk DESIGN warns about is that nearby questions keep getting answered in the old vocabulary. The specific consumer that matters here is the reworked MOBO-X-2, and it consumes the new path only — What is genuinely true and worth stating: Not doing it hereFolding a three-module carrier migration into this PR would make the fail-open correction — which is the change under review and the one with executing evidence behind it — harder to review, and would mix a semantic fix with a mechanical one. I would rather land the corrected law and take the cut as its own change with its own census and its own witnesses. — sent from snappy-crab-469 |
|
The remaining red — AttributionMain's last fully-green run is Main currently fails it on consecutive runs, e.g. This branch is merged with current main and reproduces it identically. This PR's diff is One caveat rather than a clean bisect: run A correction to my earlier commentI said merging #10017 would clear this. That was wrong, and I stated it with more confidence than the evidence supported. #10017 repaired the regen drift on Status of this PR on its merits
— sent from snappy-crab-469 |
briansrls
left a comment
There was a problem hiding this comment.
REQUEST_CHANGES at exact head 6190046fc44a6056505dd95f56aa6c183925326b.
The original intent-axis fail-open and five-route over-refusal are closed, but five source blockers remain:
-
RevARoutedMemoryDesign.routedstill has typeActiveDdrTopology, whose own vocabulary ispopulated_channels. Routing and active population therefore remain one semantic carrier interpreted by field position. Introduce a routed wrapper or a neutral shared set with distinct routed/active wrappers. -
The admitted arm erases the routed design:
admit_routed_designreturnsDesignAdmitted { design: AltraMinimalMotherboard { memory: d.initially_populated, ... } }. The exact copper topology that was judged is absent from the accepted value. The success constructor must preserve the admittedRevARoutedMemoryDesign(and its lifecycle/intent), or downstream selection can no longer bind the routed fact this PR exists to expose. -
There is still one
initially_populatedtopology plus one intent, so the model cannot express one product that routes eight, brings up with two, then ships with a four/six/eight-channel production population. Add an explicit bring-up-versus-production lifecycle; judge the former underEngineeringBringUp, the latter underProduction, and require both to be subsets of routed copper. -
active_population_causeschecks only count and intent. It does not run duplicate-channel, duplicate-position, or no-position validation on the active topology. Thus[DDR0, DDR0, DDR1, DDR2]counts as production four and an active topology with zero positions passes the positional subset vacuously. Apply structural topology validation to every active population and add discriminating REDs. -
smallest_production_channel_count()uses numeric0as absence. If the vendor roster ever contains no production-qualified count,production_population_is_reachablebecomesrouted_count >= 0and admits every route exactly when no production population exists. Return an Optional/coproduct and refuse the no-qualified-population arm; no numeric absence.
Refresh the PR body, which still describes the superseded intent-on-routed law and six-witness state. Current main is 7f71ee34094d9879ea06a69d25ac9f6186c3acb5; this head is one commit behind with merge base ecda0710810f6fca89b39a3fc808f42d8a9717fe. Compose after source repair and obtain terminal exact-head CI. Run 33604829516 is still in progress.
…pens Side-chat review found five defects in the routed-vs-populated model. Two were fail-opens I proved by running the counterexamples against the previous module: both returned ADMITTED. [DDR0, DDR0, DDR1, DDR2] under Production -- list length four, so it reached the production-qualified arm, and every identity in it IS routed, so the subset law could not see the repeat. A board naming four channels while populating three. four channels with positions_per_channel: [] -- the empty-position refusal was applied only to the routed topology, and the position subset fold succeeds vacuously on an empty list. A board populating no slot at all. Duplicate and empty-position refusal is now one law stated over the identity lists, so both carriers are judged by it rather than only the one it was first written for. The third fail-open was the derived minimum. smallest_production_channel_count folded from init: 0 returning Int, so a roster with nothing production-qualified would return 0 and routed_count >= 0 would admit every routed topology at exactly the moment no production population existed. It now returns Int? and absence refuses through NoProductionQualifiedChannelCountExists. Two further corrections, both structural rather than safety: RoutedDdrTopology carries its own field names. Both fields previously had type ActiveDdrTopology, so the same type -- and a field spelled populated_channels -- meant copper under `routed` and shipped memory under `initially_populated`. Meaning that depends on which field a value was stored in cannot be read locally, and nothing refused the two being swapped at a call site. RoutedDesignAdmission retains the admitted design. The previous success constructor built a motherboard carrying only the initial active population, discarding the exact routed copper the admission had just checked, so a downstream selector could not consume the result at all -- it would have to keep the original input beside it and assert the two belong together. The routed path gets its own admission coproduct rather than changing DesignAdmitted, leaving the legacy admit_design path and its 27 production references untouched and still scheduled for their own delete-first migration. MemoryPopulationLifecycle makes a board a population over time: one board may route eight channels, come up on two under bring-up intent, and ship on four. Judging that once as EngineeringBringUp establishes nothing about the shipped product, and judging it separately as Production yields a second verdict with no structural relation to the first. Both populations are judged under their own intent against one routed ceiling. Witnesses 8 -> 14, all executed and green, including discriminating reds for each proven fail-open, both lifecycle arms, a control proving bring-up intent excuses the channel count but never the subset law, a control reading the routed set back out of the admitted value, and the non-vacuity control. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A2gCTLwSb5pDc5UVdXm3Um
The first three lines were a strict prefix of the block below them: the edit that added the lifecycle sentence kept the original comment and added its own copy rather than extending it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A2gCTLwSb5pDc5UVdXm3Um
MOBO-X-2 selects a routed topology.
ActiveDdrTopologycould only say which channels are populated.The gap
A design reading "four channels" could not distinguish:
Those are different products with different escape problems, different layer counts, and different upgrade stories. The difference is invisible at the moment it is decided and expensive afterwards.
The subset law is the point
A board may leave a routed slot empty. It can never fill a slot it did not route. Stating the population as a topology in its own right is what makes the violating case writable, and therefore refusable — identity where cardinality was standing in, applied one level up.
What this PR corrected about itself
An earlier revision of this branch qualified the ROUTED topology by the active-channel authority, and that was a fail-open. The datasheet qualifies active channels; it says nothing of the form "a production motherboard may route exactly four, six or eight channel interfaces". Judging copper by that sentence produced two defects at once:
Productionwas ADMITTED — exactly what the predicate exists to refuse;The routed side now carries a reachability law instead: every subset of a two-channel routed set has at most two active channels, and both are non-production, so no production-qualified population is reachable from it. That refuses the two-route board and leaves the five-route/four-active board admitted.
The old law was restored from
c0333745f7and run against the new counterexample to confirm the fail-open was real rather than theoretical.Three further fail-opens closed, each proven by execution
Counterexamples were run against the previous module; each returned admitted.
[DDR0, DDR0, DDR1, DDR2]has list length four, so it reached the production-qualified arm, and every identity in it is routed, so the subset law could not see the repeat. A board naming four channels while populating three.smallest_production_channel_countfolded frominit: 0returningInt. Had no count been production-qualified, it would return0, androuted_count >= 0would admit every routed topology at precisely the moment no production population existed. It now returnsInt?, and absence refuses throughNoProductionQualifiedChannelCountExists.Duplicate and empty-position refusal is now one law over the identity lists, so both carriers are judged by it rather than only the one it was first written for.
Routing and population now have two carriers
Both fields previously had type
ActiveDdrTopology, so the same type — and a field spelledpopulated_channels— meant copper underroutedand shipped memory underinitially_populated. Meaning that depends on which field a value was stored in cannot be read locally, and nothing refuses the two being swapped at a call site.RoutedDdrTopologynow carries its own field names.A board is a population over time
MemoryPopulationLifecycleisShipsWithProductionPopulation | BringUpThenFill. One production board may route eight channels, come up on two under bring-up intent, and ship on four. A single topology under a single intent cannot say that: judging it once asEngineeringBringUpestablishes nothing about the shipped product, and judging it separately asProductionyields a second verdict with no structural relation to the first. Both populations are judged under their own intent against one routed ceiling — and a lifecycle cannot launder a debug-only shipped population through the bring-up arm.The admitted value retains its routing
The previous success constructor built a motherboard carrying only the initial active population, discarding the exact routed copper the admission had just checked. A downstream selector could not consume that result at all: it would have to keep the original input beside it and assert the two belong together — the adjacent-but-unbound shape this module exists to remove.
RoutedDesignAdmissionretains the admitted design, and a witness reads the routed set back out of it.The routed path has its own admission coproduct rather than changing
DesignAdmitted, so the legacyadmit_designpath (27 production references) is untouched and remains scheduled for its own delete-first migration.Witnesses
14, up from 8 — including discriminating reds for all three proven fail-opens, both lifecycle arms, a control proving bring-up intent excuses the channel count but never the subset law, and a non-vacuity control.
Nothing was re-minted
Steps 2 and 3 of the reworked rung — active-count candidates from
ActiveDdrChannelCountunder production qualification, and the DPC axis as positions rather than a quantity — were already built here.I had been about to author
channels_per_socket: Natanddimms_per_channel: Natin the private strategy layer, which is exactly the error this module's own annotation warns about:Note on review
Two dashboard approvals landed on this file's earlier revisions: one ratifying the intent-on-routed law that turned out to be a fail-open, and one describing the revision containing the three fail-opens above as having no observed violations. Both were caught in side-chat review instead. Recorded here because the approvals are on the record and should not be read as evidence the laws were right.