Repository navigation
Preserve mtcollins1 hardware-census and boot-path evidence - #10965
Conversation
Mt. Collins unit 1 booted a Linux that ran ON the machine and its memory
census is committed as bytes: nproc 160, dmidecode type 16/17 for all 32
connectors, the whole EDAC tree, and dmesg. The receipt states nothing the
two artifacts do not contain.
THE BRIEF EXPECTED EDAC TO CARRY THE CHANNEL MAP AND IT DOES NOT, which is
the load-bearing result rather than a gap to chase again. This platform runs
ACPI APEI firmware-first ("GHES: APEI firmware first mode is enabled by APEI
bit"), so ghes_edac registers ONE synthetic controller and mirrors the SMBIOS
device list purely so a GHES error record has a DIMM to name. It is an
error-reporting shim, not a topology driver: `find /sys/devices/system/edac`
returns no path containing "csrow" — a counted reading over an enumerated
tree, not an inference from a driver name. No boot will change that, so the
reason is recorded with the negative.
The channel-resolved reading comes from the Altra boot firmware's DRAM
training output instead, which is strictly richer than a csrow tree: it names
socket, memory controller AND slot-within-channel. All sixteen modules sit at
S0 of their channel, so the unit is uniformly 1DPC and the sixteen empty
connectors are each channel's S1.
Connector numbers are a JOIN and are declared as one — neither reading prints
a J-number. What discriminates it: HMA82GR7CJR8N-VK occurs exactly ONCE in the
machine; firmware puts it at SK0 MC5, SMBIOS at "DIMM 11", and the Getting
Started Guide's pair table puts MCU5's 1DPC member at J11. No shift or
reversal of the sequence reproduces that. SMBIOS's own Rank column reproduces
the firmware's 1R/2R sequence independently, and the populated set is exactly
the odd connectors, which upstream specifies. The upstream pair table is
consumed from extdeps.ampere.mt_collins_product_brief.memory_population, not
re-transcribed.
EDAC is clean at capture: mc0 and all 32 per-DIMM counters read zero. That is
recorded as clean AT CAPTURE on a host up ~20s — the memtest pass is the
endurance evidence and this is the structural one; calling it more would be
rung inflation.
The witness test consumes the rows so they are not dangling, and its main
check is adversarial: firmware and SMBIOS are two independent readings, so if
either transcription drifts, the part number or rank at some connector stops
agreeing and it goes red. The EDAC probe is enrolled as a control that is
SUPPOSED to fail the day a native Altra driver exposes a real topology.
Two modelling obligations are named and deliberately NOT satisfied here:
HMA82GR7CJR8N-VK has no catalog row (minting one from our own boot log would
render a local report as an upstream fact), and the same-channel rank-mixing
rule is absent from extdeps.ocp.mt_jade, so the per-connector fill requirement
is not authored as though it were derived.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Review 63222 is right: chip_width_bits: Nat was a second name for a concept std.measure already owns. dag/std/measure.dag defines BitWidth and bit_width, and the memory home already carries this exact fact as chip_width: BitWidth (extdeps.memory.types DramModuleCatalogRow, constructed with bit_width in extdeps.memory.sk_hynix). Minting a flat scalar beside it is the DESIGN section 3 nickname and the section 2 re-invention in one field. The field is now chip_width: BitWidth, built with bit_width(4) / bit_width(8), matching the catalog's spelling so the two join on a name as well as a meaning. ALSO PRESERVED: attempt 3, which failed. It was built to close the subject-binding gap and add a named memory workload with before/after EDAC counters. The kernel loaded from the virtual CD and panicked — "VFS: Unable to mount root fs on unknown-block(0,0)" — because the MegaRAC remote-media session dropped between kernel load and root mount; the controller read redirection_status 100 immediately before the reset and 1 after. Its bytes are committed anyway, because a failed probe is exactly as easy to lose as a successful one and this census exists to end that class. The pre-boot srv2-side observation stands on its own regardless: an ARP reading with a typed verdict against the expected MAC, plus the boot artifact's digest. AND A GAP IS NOW STATED RATHER THAN RELIED ON. The capture binds to the board MODEL (kernel DMI: FOXCONN Mt. Collins/Mt. Collins) and NOT to this physical unit — SMBIOS Type 1/2/3 was not captured, so board serial 02030A800TEXFT02L appears nowhere in the bytes. What ties the capture to unit 1 is the delivery path, which is author-held provenance rather than a fact a reader can check inside the artifact. Dissolved by one dmidecode --type 2 in a future attempt. There is no attempt 5: re-establishing the media degraded further (stop-media and start-media both HTTP 500, never returning to 100). That controller is the only out-of-band path to the M1 canary, so the run was stopped rather than driven harder, the boot override cleared to "No override", and the controller left verified healthy over IPMI. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Fixed in
Two things to flag that are not review responses, since they change how this PR should be read:
— sent from eager-owl-205 |
…ed it success THE CENSUS IS COMPLETE. Both gaps this receipt declared open are closed by a second capture, artifacts/bmc/mtcollins1-host-capture.txt, 270880 bytes, sha256 a9b880c3ecd9ba611c1df9e7de1ab089839c5d8e92b743bf2e1bcd684100fd2a, whose nineteen sections each carry their argv and exit status so a missing reading is distinguishable from a zero one. All nineteen exited 0. THE UNIT BINDING IS NOW AN EQUALITY BETWEEN TWO INDEPENDENT READS, not a stronger assertion of one. The host reads board serial 02030A800TEXFT02L from its own SMBIOS Type 2 under Linux; mtcollins1_access_observation reads the same serial from the controller's IPMI FRU, different transport, different agent, days earlier. Either alone is an observation of a reading; the two agreeing is an observation of a unit. EDAC IS LOAD-BACKED RATHER THAN A SNAPSHOT. 64 GiB of tmpfs seeded from urandom, hashed twice and the passes compared, with the EDAC tree read on both sides: all 34 counters 0 before and 0 after. The digest comparison is there because EDAC counters are the memory controller's own account of itself -- if it fails to notice a fault its counters stay zero -- so hashing tests the DATA rather than the controller's opinion of it. It still is not a soak, and the row says so. AND THE REASON THIS TOOK FIVE ATTEMPTS IS A FIELD THE BOOT-HANDOFF MODEL DOES NOT CARRY. IPMI boot parameter 5 encodes two decisions: the device selector AND the BIOS boot type (byte 1 bit 5, 0 = legacy, 1 = EFI). oob_boot_handoff and mtcollins1_actuate model the selector alone -- efiboot, boot_type and legacy appear nowhere in that path -- so every handoff requests the default, which reads back "BIOS PC Compatible (legacy) boot". aarch64 has no legacy boot path, so the request is unsatisfiable and the firmware falls through to PXE and then the UEFI shell. Measured fix: options=efiboot,persistent reads back "BIOS EFI boot" and the next reset booted the image. THE DEEPER DEFECT IS THAT THE MODEL REPORTED SUCCESS THROUGHOUT. oob_boot_handoff mints BootHandoffCompleted once the override reads back as expected and the power action is accepted. Both held on every failed attempt -- the selector really did say "Force Boot from CD/DVD" and the reset really was accepted -- so a handoff that provably booted nothing is indistinguishable in the model from one that did. That is DESIGN section 5's specification-without-execution, and it is why a legacy/EFI mismatch could persist across an entire intake lane. Fixing the argv without fixing the postcondition would close this instance and leave the class, so both are recorded here and neither is fixed in this commit. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
briansrls
left a comment
There was a problem hiding this comment.
HOLD at this head. The immutable bytes are valuable, but this does not yet satisfy its own title's “capture producer” half, and two statements in the new receipt currently reverse the controller's observed state machine.
1. The producer is still outside the model
The diff adds the artifacts, one observation module, and one witness. It adds no operation/workflow that can reproduce the capture. The artifact itself records an ad-hoc compound command:
sh -c ls -l /srv/bmc/mtcollins1-census.iso; sha256sum /srv/bmc/mtcollins1-census.iso
and the later discriminating boot-mode experiment was another direct ipmitool ... options=efiboot,persistent invocation. Those output bytes are receipts, but neither invocation is a modeled producer. This is the exact class the new recurring failure mode names: the observation survived this time, but the operation that produced it still cannot be reviewed, regenerated, or made safe by construction.
Do not preserve that shell as a script or wrap it in shell.Exec. The existing transport shell { argv: [...] } route is direct argv execution, not a command string. Extend the semantic operation instead.
Required preceding migration, either in this PR or a child PR stacked ahead of it:
extdeps.bmc.ipmi: add a typed IPMI boot selection carrying device × firmware boot mode × persistence. Its CLI-backed realization renders each as argv atoms. No caller-authoredoptions=...string.- The renderer must produce the exact one-shot ARM64 request (
cdrom,options=valid,efiboot) for this intake.persistentwas useful as a live discriminator but is not the desired intake policy; it alters all future boots. gunbc.machine_intake_oob_boot_handoff: read back and adjudicate all four facts independently: valid flag, device selector, EFI/legacy mode, next-only/persistent scope. A matching CD selector beside legacy mode must RED. A matching selector and EFI beside persistent scope must RED when policy requested one-shot.- The capture’s
ls, digest, ARP, BMC state, console, host census, and before/after health readings must be modeled operations whose stdout/stderr/status are redirected into attempt-owned immutable output. Nosh -ccompound command and no password in argv (-P adminappears in the raw transcript; the landed IPMI model already uses-f).
2. BootHandoffCompleted is ahead of its evidence
Today it is minted after boot-parameter readback plus acceptance of the power action. The module explicitly does not observe what booted. That terminal is therefore a control-plane issuance, not a completed boot.
Split the facts:
BootControlIssued/RestartIssued: selector, mode, scope verified and power action accepted.BootArtifactExecuted: independently observed host-side marker bound to the intended artifact/attempt.
The first must not construct the second. mtcollins1_*_handoff may report successful actuation, but no hw-first-host, DiagnosticBootAttest, or delivery success may consume it as execution evidence. The reset-return path already demonstrates the correct pattern by observing down/back separately; preserve that separation.
3. The MegaRAC state predicate currently admits connecting and failures
configuration_row_confirms accepts every redirection_status != 0. The controller's own UI enum, now read from source.min.js, is:
0: idle100: connecting1: Started — Connection Accepted (serving)2: denied3: login failed4: maximum sessions reached5: permission denied
Only 1 is attached/ready. 100 is pending and must be boundedly polled. 2–5 are distinct refusals. An unknown code is unreadable, not active. Until this is fixed, the modeled path can reset immediately after seeing 100, before the virtual CD is ready for firmware reads.
4. Correct the attempt-3 causal statement
The new module says 100 immediately before reset and 1 after means “the remote-media session dropped.” That is backwards: it moved from connecting to started/accepted. The later “never returning to 100” statement is backwards for the same reason. Remove both before this receipt can land.
The committed SOL bytes establish a narrower and different terminal:
- GRUB executed;
- the EFI stub started the kernel;
EFI stub: ERROR: Failed to load initrd: 0x8000000000000001;- the kernel then reached
VFS: Unable to mount root fs on unknown-block(0,0).
That is InitrdLoadFailed (or equivalent), not evidence that the boot selector failed, and not yet evidence that media dropped. Preserve the mechanism as unestablished unless a timestamped controller/media observation actually joins the initrd failure to a loss of service.
The later legacy-mode observation is still a real modeling defect: the model omits one axis of the boot request. But do not use it to rewrite this attempt, which demonstrably got far enough to execute GRUB and the kernel from the CD path.
Required controls
At minimum:
- EFI + next-only + matching selector + valid flag → boot-control issuance admitted.
- Same readback with legacy mode → mode mismatch refusal.
- Same readback with persistent scope → persistence mismatch refusal.
- Matching selector beside
Boot Flag Invalid→ invalid refusal. - MegaRAC status
100→ pending, never attached. - MegaRAC status
1→ attached. - Statuses
2–5→ their own refusals; unknown → unreadable. - Accepted power command with no host marker cannot construct
BootArtifactExecuted. - The receipt's semantic fields are checked against the committed artifact, not merely self-asserted beside its digest.
After this cut, this stack item can honestly be “modeled capture producer + immutable artifact.” The larger hw-first-host projection and procurement derivation may remain later stack items, but this foundation cannot land while its producer is absent and its failed-attempt interpretation is reversed.
…it a drop A review on 68f91df caught two claims in this receipt that the evidence does not support. Both are corrected here rather than quietly edited, because the wrong text was load-bearing for an investigation that ran for hours. THE MEDIA-DROP MISCLASSIFICATION. The attempt-3 row said the remote-media session "dropped out from under casper between loading the kernel and mounting the squashfs root". The committed console refutes it directly: GNU GRUB / EFI stub: Booting Linux Kernel EFI stub: ERROR: Failed to load initrd: 0x8000000000000001 VFS: Unable to mount root fs on unknown-block(0,0) The firmware DID select the medium, GRUB DID run off it, the kernel DID start. What failed is the INITRD load, with EFI_LOAD_ERROR. A medium that had vanished could not have served GRUB and a kernel first. The row now states the initrd failure as what is established, and the partly-ready-medium reading as plausible and unproven -- the attempt reset while the redirection was still at 100. AND THE REASON THAT MISREADING WAS POSSIBLE now has its own row. redirection_status was treated as a health value where nonzero meant trouble. The controller's own served frontend says otherwise: 1 renders "Started - Connection Accepted" and is the healthy steady state, 100 is connecting, and 2 through 5 are Connection Denied, Login Failed, MAX Session Reached and Permission Denied. Measured against the live controller, attach goes 100 (session_index 255) -> 100 (session_index 0, +12s) -> 1 (+15s) and then HELD at 1 for 4m27s idle and through a full boot. 1 is the destination, not a decay. The consequence generalises past this unit and is why the row exists: a "nonzero means attached" predicate admits 100, which is merely CONNECTING, and admits 2-5, which are refusals. Only 1 may satisfy media-ready. A predicate that resets a host on 100 can expose a partly-ready medium to firmware reads, which is the plausible reading of the attempt-3 initrd failure above. This commit does not touch the boot-handoff or media modules. The typed producer, the IpmiBootSelection cut and the readiness predicate are being recut elsewhere; this only stops THIS receipt from asserting things its own artifacts contradict. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…and one attempt identity for two attempts Both caught in review against 45ffaef, both verified against the committed bytes before being accepted, both mine. THE TIMESTAMP WAS WRONG BY NEARLY FOUR DAYS. mtcollins1_host_capture_observed_at read 1789428410000, which is 2026-09-14T23:26:50Z. The artifact's own first line says "attempt=3 begin 2026-09-11T01:26:50Z". The correct value is 1789090010000. This is the one error class this module cannot carry, because its entire claim is that it states nothing the artifact does not contain. A digest proves the bytes are unaltered; it proves nothing about whether the fields around it were read out of those bytes. A reader checking the digest would have found it correct and the timestamp still false, which is exactly the gap that makes a hand-transcribed receipt weaker than a generated one -- and is the argument for the modeled producer this lane has been asked for twice. AND "attempt=3" NAMES TWO DIFFERENT ATTEMPTS. The successful capture's header reads attempt=3; so does the FAILED run at mtcollins1_attempt3_failure, whose artifact is mtcollins1-attempt3-sol.log. One produced no host capture at all and one produced these bytes, minutes apart, under one identity. The cause is that the capture script hard-codes its attempt number, so a rerun re-uses the identity instead of minting a new one. The artifact FILE was correctly never overwritten -- the earlier directive's rule -- but the identity inside it was, which is the same failure one level down. An attempt identity a rerun can silently duplicate is not an identity, and any receipt join keyed on it would merge a failure with a success. THE BYTES ARE NOT EDITED. Rewriting a capture to correct its own label would destroy the property that makes it evidence. So the label is recorded as unreliable, the distinguishing facts are carried in the model instead -- different artifact, different digest, different wall-clock window, different outcome -- and the producer's literal is named as the thing to remove. Neither fix makes the producer reproducible; that is still the open item and it is being recut elsewhere. This only stops the receipt asserting what its own artifacts refute. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…axis of two
Three scoping corrections from the review amendment, all of them narrowing claims
this receipt was making wider than its evidence.
THE STATE MACHINE IS KEYED TO ONE FIRMWARE BUILD NOW. It was read from the
frontend served by THIS controller at revision 0.32, and the row said only "the
controller's own served frontend", which reads as a MegaRAC fact. It is not one.
Nothing here establishes that any other release uses the same numbers, so the row
names the build and says that an uncatalogued firmware identity must refuse rather
than borrow the nearest profile. Inheriting a status enum across firmware would be
the same failure that produced this row: a plausible-looking value read as its
opposite.
AND THE ROW NO LONGER IMPLIES A CLOSED RANGE. Carrying first_refusal 2 and
last_refusal 5 invites a consumer to treat 2..5 as the refusals and everything else
as fine. The vendor renders any value outside {0,1,100} as Stopped, so unknown
codes are neither pending nor success. This row does not enumerate them and now
says so: a consumer needs an explicit other-code arm, not a default.
THE efiboot CONTROL PROVED THE EFI AXIS AND NOT PERSISTENCE. persistence was held
constant across the failing and succeeding probes, so the varied term is the one
implicated; options=efiboot,persistent is simply what executed. It is not the
intake policy, because persistent changes ALL FUTURE BOOTS, and I used it for
convenience on a machine that is not mine to leave reconfigured. ipmitool sets the
valid bit itself, so the one-shot projection is options=efiboot alone. A one-shot
EFI wet run is still owed, and if this firmware turns out to require persistence
that must be an explicit persistent-until-restored fact with the clear and the
readback in one transaction -- never a persistent write described as one-shot.
None of this is the migration. The typed IpmiBootSelection, the readiness predicate
over the decoded status, the serialized StartMedia body and the split of control
issuance from image execution are being recut elsewhere and this commit
deliberately does not anticipate them.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…at cost the night One document for the whole session, written because the operator asked to understand this path end to end and will run nineteen more of these machines. It carries the census result and both purchasing conclusions; the channel map and why EDAC cannot supply it on an APEI firmware-first platform; the J-slot join with the single-occurrence part that discriminates it; the unit binding as an equality between host SMBIOS and controller FRU; the load-backed EDAC reading and the explicit statement that it is not a soak. It carries the boot-delivery root cause -- IPMI boot parameter 5 encodes device AND boot type, the model carries only device, and legacy-on-aarch64 is unsatisfiable -- together with the deeper defect that let it hide: BootHandoffCompleted minted from an override readback and an accepted power command, never from evidence that anything booted. And it separates the two failure modes rather than letting the EFI axis explain an attempt that reached GRUB and died on its initrd. It carries the firmware 0.32 media state machine read from the controller's own frontend, keyed to that build, with the transient that a naive bounded poll would refuse, and the measured fact that HTTP 500 on media/general means both applied and not applied so only a readback is a verdict. AND IT CARRIES A NUMBERED LIST OF MY OWN ERRORS, which is most of why it exists. Reading redirection_status 1 as death when the vendor renders it Started, and escalating a decay clock that was really connect time. Reading a flag byte as a session count and reporting one-boot-per-reset as fleet knowledge. Overclaiming the root cause. A timestamp wrong by four days behind a correct digest. One attempt identity for two attempts. The password in argv. Persistent left on a machine that was not mine to reconfigure. And the framing one: I never built the modelled capture producer that was asked for in the first directive, which is the standing objection on #10965 and is fair. A probe record, not an authority. Every number was re-derived while writing rather than recalled, and inference is marked as inference throughout. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…leave this receipt Acting on the strip-or-park ruling. #10965 becomes the evidence landing; the boot-path migration consumes it from a separate PR. One new commit on the existing branch -- the execution-history commits are NOT rewritten or rebased away, because the sequence of wrong turns is part of what the artifacts document. WHAT LEAVES, AND WHY EACH WAS NOT MINE TO HOLD: The media state machine is gone entirely, not refined. A mapping from vendor status codes to meanings plus a rule about which permits a reset is a firmware-keyed extdeps.bmc.megarac catalog and a caller policy on top of it -- neither is an observation of this unit, and holding them here would make a unit receipt a second authority the moment the migration lands. It also had prose provenance: it was read from a source.min.js that is NOT a committed artifact, and a sentence naming the file it came from is not a resolvable receipt. What survives is the measured transition alone, with no readiness conclusion drawn from it. The boot-delivery row keeps its observations and loses its prescription. It no longer tells a reader which argv to use, what the one-shot projection is, or what to do if the firmware demands persistence. It records what the flags read on the failing and succeeding attempts, that the control varied the boot-type bit alone, and that the model returned BootHandoffCompleted throughout. THREE RESIDUES FROM THE LAST ROUND, ALL CONFIRMED BEFORE FIXING: first_refusal and last_refusal were still declared and still set to 2 and 5. The previous commit changed the prose warning against that inference and left the fields that support it, which is worse than not having claimed the fix. Gone with the type. The "session never returned to redirection_status 100" reading survived in two places and is still backward. Replaced with the measured result: both calls answered 500 and the readback was unchanged, so neither transition was established as applied and the HTTP status decided nothing. The header claimed every field came from two files. That stopped being true when the module gained a second capture and later observations, and a global claim gone quietly false is worse than none -- a reader would verify both digests, find them correct, and still be reading fields those files never contained. Evidence now binds per section. AND THE ACQUISITION IS MARKED HONESTLY. HistoricalAdHocCapture with reusable_producer_absent. Every capture here was produced by hand; one successful manual capture is not evidence the intake system can take another. hw-first-host may read the observations, because its clause asks whether this unit passed named facts. Nothing may read them as proof of a reusable capability. THE WITNESS NOW READS WHAT IT USED TO IGNORE: subject binding, the workload, the before/after counters, their agreement with the topology row, and the acquisition standing -- the last as a control that SHOULD go red the day a producer exists. The earlier witness checked slot rows and nothing else, which is precisely how a four-day-wrong timestamp landed green. It still cannot recompute a digest, and says so: a pure witness has no file access, so a hand-transcribed digest stays unverifiable. That gap does not close with a better test. It closes when a producer GENERATES the receipt from the artifact. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… file the two failure modes CREDENTIAL FIRST, BECAUSE IT IS THE ONLY ITEM HERE THAT IS URGENT. Review found artifacts/bmc/mtcollins1-attempt3-srv2-side.txt recording the BMC password LITERALLY in ipmitool argv on two ----ARGV lines, in a PUBLIC repository. Verified: two occurrences, no others anywhere under artifacts/. Those bytes are redacted. Everywhere else this module insists captured bytes are never edited, because editing a capture destroys what makes it evidence -- this is the one exception and it is not a judgement call: a live credential in public outranks byte fidelity. The file carries a header saying it was redacted, nothing else is altered, and BOTH digests are declared in the receipt (e7673b74... -> 90e6f289..., 1669 -> 1989 bytes) so the edit is auditable rather than a silent disagreement with a receipt written earlier. THE REDACTION DOES NOT UNDO THE PUBLICATION, and the receipt says so. The unredacted bytes reached a public PR branch, so the credential is DISCLOSED. It is the factory default on a routable BMC; rotating it is the operator-attended BmcSecure step and is not this lane's to perform. The producer defect that caused it is that every ad-hoc ipmitool call in this session passed -P on the command line -- the modelled route already uses -f with a password file, and the migration's producer must too. THE STRIP WAS INCOMPLETE AND I HAD REPORTED IT DONE. The .dag carrier was observation-only, but docs/probes/ still reconstructed the whole MegaRAC state machine from an UNCOMMITTED source.min.js, derived the readiness rule, and closed with a normative operating procedure. A probe record whose header claims every number is artifact-backed cannot carry a table whose source was never preserved. Both are gone; the measured attach transition stays, with no readiness conclusion drawn from it, and the closing section now states what the record does NOT prescribe. The artifact table's stale digest for the redacted file is corrected and the redaction disclosed there too. FAILURE MODES, per the dispositions given. (a) ACCEPTED and filed: control_plane_acknowledgement_minted_as_effect. An accepted command, a desired-state readback or an actuator acknowledgement cannot construct a terminal effect on the acted-upon subject. The Mt. Collins instance is the receipt: BootHandoffCompleted minted from selector-readback plus accepted power action, both of which genuinely held on every failed attempt while the host booted nothing. The repair is a split -- BootControlIssued from control-plane facts, the subject-level terminal requiring host-originating observation -- not a stronger check. (b) NOT a new identity. subject_and_its_digest_as_independent_parameters already owns it: its scope is a value beside a summary with no structural join, its recognition rule already says proximity to a correct thing is not correctness, and its fabric-M0 specimen already covers a correct digest beside a lying provenance stamp. Minting integrity_mistaken_for_provenance would fork an owned meaning. The four-days-wrong timestamp behind a correct digest is appended as a SPECIMEN of that row, with the sharp form of the lesson: a correct SHA-256 authenticates those bytes, not adjacent metadata about those bytes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…his unit's secret Operator ruling, and it is correct. I redacted `-P admin` from a committed capture after review called it a credential published to a public repo. That was wrong. admin/admin is not a secret belonging to this unit. It is AMI's published MegaRAC factory default, and this repository already models it as an upstream fact: extdeps.bmc.megarac megarac_factory_login carries username "admin" and published_password "admin" -- the field is NAMED published_password because the value is public, and its comment says so explicitly. The artifact disclosed nothing the corpus does not already state by design. So the redaction protected nothing and cost the one property that makes a capture evidence. The file is restored byte-for-byte, 1669 bytes, digest e7673b74a9361453440364334d9223706284dc25d66c9f5bde1230c2ec5720ad -- verified identical to the pre-redaction bytes, not merely similar. The receipt and the probe document now carry the RETENTION BASIS instead of a redaction notice, which is also what the review asked for as the alternative: evidence policy explicitly permitting the retained value. THE RULE THIS SETTLES, because the next reviewer will ask the same question: a credential in a capture is redactable only when it is a SECRET. A value the corpus already publishes as an upstream fact is not made secret by appearing in argv, and an artifact is not improved by editing it into disagreement with extdeps. WHAT IS STILL A REAL DEFECT, and it is the producer rather than the bytes: every ad-hoc call in this session passed -P on the command line while the modelled route already uses -f with a password file. That belongs in the producer and is not a reason to rewrite captures after the fact. AND WHAT WOULD CHANGE THE ANSWER, recorded so this is not read as licence: if this unit's credential is ever rotated off the published default, the rotated value IS a secret, must never reach argv, and any capture containing it is genuinely unpublishable. That is the BmcSecure step. I should have checked extdeps before editing evidence. The whole argument I had been making all session is that captured bytes are not editable, and I made an exception without first verifying that the exception was needed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… specifying someone else's design Two residues in the probe document, one found in review and one found looking for the second one they said was probably there. THE CONTRADICTION. The document carried BOTH the new retention basis -- admin/admin is a published upstream fact, redaction reverted, bytes restored -- AND, immediately below it, the tail of the old redaction paragraph still saying the occurrences "are replaced with a marker" and that the credential "must be treated as disclosed". Both cannot describe the committed artifact. THE CAUSE IS WORTH RECORDING because it is a trap in the edit, not in the judgement: the removal searched for the next `---` delimiter, and the paragraph being removed contained the literal `----ARGV`. The search matched INSIDE that token, truncated the deletion, and left an orphan that begins mid-sentence. A textual edit that looks for a structural delimiter in a document whose content contains that delimiter will cut in the wrong place, and the surviving fragment reads as prose rather than as damage, which is why it passed my own check afterwards. AND `Outstanding` WAS THE SECOND COUPLING. It enumerated the migration lane's DESIGN -- the shape of the boot-intent product, how the readback should refuse, which terminal splits into which, how the request body should be serialized, how legacy-on-aarch64 should be made unconstructible. That is the same defect as the decoder stripped from section 8, one section further down: a probe record that specifies another lane's carriers becomes a second authority for them the moment they land. Agreeing with the design does not make it mine to write down. Replaced with a pointer that says what this record contributes -- the measured boot flags, that the model reported completed throughout, the two failure modes, the controller observations -- and states that the conclusions drawn from that evidence belong in the migration's carriers where they can be consumed rather than read. The genuinely open questions stay: they are facts about state, not designs. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… unit receipt Review at cb5c1fa found residues that survived the earlier recut. The receipt asserted meanings for MegaRAC's `redirection_status` enum -- 1 as "Started", 100 as connect time -- decoded from `source.min.js`, which is not a committed artifact. The decoder was removed from the state machine for exactly that reason and then restated in prose beside it. The raw transition stays (mtcollins1_media_transition_observed); what a code MEANS is the status-code catalog's to say. The attempt-3 causal sentence is reduced to what the bytes establish: the failing reset happened at raw status 100, the succeeding boots at 1, and these artifacts do not establish that the difference caused the initrd failure. `mtcollins1_credential_retention_basis` stated reusable evidence-redaction policy ("redactable only when it is a SECRET") from a unit receipt, and was a prose-only String row with no importer anywhere in the corpus -- DESIGN 3c's dangling declaration and 4c's misplaced prose at once. The instance-specific basis survives as an annotation on the attempt it concerns; the general rule gets its own home if it earns one. Also cut the persistent/one-shot policy judgment from 7.1 and the generalized `image_redirection: 1` contract from 8, both of which prescribe for the boot-path migration, and the stale "remains the blocking objection" line, which the declared acquisition standing now answers. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Status against the CHANGES_REQUESTED review (that review was at §4 — attempt-3 causal statement: fixed, then cut further. The reversal is gone. It went further than the correction: the receipt no longer asserts what any §1, §2, §3 and the required controls — carried by #11001, which is stacked on this branch. The typed boot selection, the four-axis readback, deleting This PR was recut to evidence-only on that basis, and §10 no longer enumerates the migration's design — prose here specifying carriers that land there would become a second authority for them the moment they do. What this PR still does not have, stated plainly: no modeled capture producer. That is not repaired by anything here; it is declared, not glossed — CI is green at this head. The three previous reds on this branch were a corrupted rustup on runner Ready for re-review. Still draft pending the side chat's confirmation of the recut. |
Re-review at 4553c04 found the recut's three remaining leftovers, all in the probe. My verification grep missed them and I reported them cleared, which was wrong: "correctly held" wraps across a line break so a line-oriented pattern could not match it, and my patterns never covered "rule this settles" at all. - The header encoded a live review verdict ("draft, CHANGES_REQUESTED, correctly held") into a historical probe record. A probe should not carry a review's state; that state moves and the sentence rots in place. - Section 2 still promoted this instance into a general rule -- "redactable only when it is a SECRET" plus the future-rotation case -- which is reusable evidence-publication policy in a document whose own second line says it is not an authority. The instance basis survives; the rule does not. - Section 7.3 still wrote raw status 100 as "100 (connecting)" and hung a small-read/large-read mechanism off that decoding. Same unreceipted enum meaning the rest of the recut removed, and the same overreach: it now states the raw values and that no mechanism is established. Verified line-break-insensitively this time, over both carriers. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Review 63839 (dashboard-only) found the module applying carrier discipline selectively: it already imports std.measure and types chip_width as BitWidth, while every other quantity in the same file stayed a bare Int. Verified and correct -- each carrier it names already exists in dag/std/measure.dag, several authored for exactly these readings. mtcollins1_census_byte_count Int -> ByteSize mtcollins1_census_sol_byte_count Int -> ByteSize mtcollins1_host_capture_byte_count Int -> ByteSize MtCollins1MemoryWorkload.bytes_exercised Int -> ByteSize mtcollins1_nproc Int -> HardwareThreadCount mtcollins1_memtotal_kb Int -> Kibibyte mtcollins1_edac_uptime_at_capture_seconds Int -> Second MtCollins1SlotOccupancy.configured_mts Int -> MegatransfersPerSecond (16 rows) MegatransfersPerSecond's own comment names DDR MT/s as its case, and HardwareThreadCount sits on the Count axis for exactly an nproc reading. Bare Int re-mints quantity semantics std.measure already owns -- DESIGN section 2, net concepts must not grow by re-invention, and section 3, each fact lives in one place. memtotal keeps Kibibyte rather than normalizing: the kernel reported kB and the scale the reading was taken at is part of the reading. The witness reads through byte_size_count and hardware_thread_count_value. EXECUTED, not typechecked-and-assumed: built claim_executor and ran the witnesses lane locally. The corpus resolves and the claim fold evaluates; the only refusals are two self_host_logic wet witnesses that need a target/release/ gunbc this local run did not build, unrelated to this diff. Discriminating control: with nproc set to 161 the lane reports the_unit_presents_one_hundred_and_sixty_processors FAILED, and with 160 it does not -- so the assertion survived the carrier change live rather than going vacuous behind it. Note for the remote path: claim_executor refuses on BuildBuddy with HostBudgetUnreadable, because no cgroup memory limit binds the runner process. That is the fail-closed budget arm working as designed, not a defect here, but it means the lane cannot currently be executed by ctrl-build --remote. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Superseded by the evidence-only recut and subsequent review. The receipt now explicitly carries HistoricalAdHocCapture { reusable_producer_absent: true } rather than implying producer-backed provenance; the reversed MegaRAC status interpretation and probe-policy residues are removed. The typed boot-selection/readback, BootHandoffCompleted split, and MegaRAC state-machine migration are owned by stacked child #11001. Current head e9c7114 additionally strengthens the census by using existing std.measure carriers. No remaining blocking finding from this review.
…O rows Three reviews and an operator ruling, applied together. REVIEW 63839, second finding: mtcollins1_media_transition_observed packed a timestamped event sequence -- attach time, two raw controller fields, three offsets -- into one prose String. DESIGN section 2 calls a String leaf hiding named parts anemic modeling and section 4c puts an event in a typed carrier. It is now MtCollins1MediaRedirectionSample rows plus an attach timestamp. The status and index stay RAW and undecoded: what a value means is a megarac catalog keyed to firmware identity, not this receipt's to say. The witness folds them, and the checks are ones a String could not carry: that offsets strictly increase (a repeated or backwards offset is a transcription error, not a reading) and that the sequence actually CONTAINS a transition. If a later edit flattened these rows to one repeated status, the observation would have silently become a snapshot while still being cited as a transition. REVIEW 63839, third finding: the digests had no consumer. A digest's real consumer re-reads the bytes and compares, which is an effect; the witness is pure and the producer that would do it is what mtcollins1_acquisition_standing declares absent. So they are a DECLARED FRONTIER under section 3c, not a silent dangle -- and the witness folds the frontier rows themselves, refusing one that names no consumer or no trigger, because a frontier row with an empty trigger is a dangling declaration wearing a label. The trigger names a capability, per 4b(3): a capture producer sufficient for every artifact this module declares, not one verifier pointed at one file. OPERATOR RULING: the three modelling-obligation rows are gone. Nothing consumed them; a data row no fold reads is a prose TODO wearing a type, and giving a TODO a struct makes it look discharged while changing nothing. They are lanes now. REVIEW 63877: the probe hand-transcribed all five digests and the 16-row population table beside the rows that own them -- "digests verified at time of writing" being the rot admission in the header. Both tables cite the symbols now. This was one level up from the class this PR itself files at subject_and_its_digest_as_independent_parameters. AND THE PURCHASING CLAIM WAS WRONG TWICE. It first read "10 x 1Rx4 + 6 x 2Rx8", taking widths off the installed modules and presenting them as constraints on the ones to buy. Operator review caught that; I then corrected it to "width is unresolved, nothing closes it". OCP Mt. Jade Table 3 closes it -- same-channel x4/x8 mixing is No, and same-channel density too. So the first answer was right by accident and the second wrong by being cautious for the right reason; neither was DERIVED, which is why neither could be trusted. The probe records the sequence and cites extdeps.ocp.mt_jade rather than reprinting its cells. Recorded beside it: that table's different-channel row is Yes everywhere except RANK, which reads TBD -- and this unit mixes 1R and 2R across channels today. The specification declines to affirm the configuration the machine is already running. Escalated, because a ~320-module order premised on "different channels are fine" rests on the one cell that does not say so. NOT EXECUTED LOCALLY AT THIS EXACT HEAD, stated plainly: the run before this one parsed and passed the witness with no refusal, and the delta since is the obligation removal (no importers, verified by grep) plus markdown. A full floor run is a CI job, and mine was thrashing at the container memory cap, so CI adjudicates this head rather than my box. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
briansrls
left a comment
There was a problem hiding this comment.
HOLD for the upstream joins that now exist. This head is green, but its PR body and production comments still describe three absences that are no longer the intended public state.
Merge the independent producers first: #11066 (the CJR8N SK hynix catalog row), #11068 (the complete Mt Jade Table 3 matrix), and #11071 (the Linux GHES/APEI topology authority). Then merge current public main into this branch and recut the receipt once against those declarations.
Required changes on that recut:
- Delete/replace the “Deliberately not satisfied” body text and the module section beginning “AN EARLIER REVISION CARRIED THREE data ROWS.” After #11066/#11068, it is false that CJR8N lacks a catalog row, same-channel rank is absent, and chip width is unresolved.
- Construct the unit-1
HostMemoryPopulationfrom the catalog identities through the 16 observed occupied-slot identities: 10×AFR4N, 5×AFR8N, and 1×CJR8N. Assert exact one-to-one joins and include a duplicate/substitution red; a total-count check would admit the wrong modules. - Consume #11068's
mt_jade_mixed_dimm_supportfor each empty partner on the hard same-channel axes: rank, x4/x8 width, and density. Keep the different-channel rank result asTBD; it is not permission. Do not author a fleet purchase or resort result from this one-unit receipt. - Replace
mtcollins1_edac_channel_map_unavailable_reason: NonEmptyStras the authority for the mechanism with typed consumption of #11071's GHES/APEI result. Keep only this unit's observed zero-csrow/one-synthetic-controller readings here. - Keep the physical subject binding by the serial join. Do not use “unit 1” to decide whether this machine is the private corpus's held pilot or one member of the 20-unit inbound lot; that private roster identity is still unresolved.
This PR can remain the immutable unit receipt. The fleet planner should consume it later, after a closed private unit-ID roster and all remaining censuses exist; the unit-1 10/6 rank split does not establish fleet percentages, module totals, or a zero-cost resort.
TWO CHANGES IN ONE COMMIT, and the message says so because an earlier draft of it described only the first while `git add -A` had swept in the second. A commit message that does not describe its own contents is the same defect as a receipt that does not describe its own artifact. 1. THE PREREGISTERED PREDICTION, committed before the operator touches the hardware. Tonight's 32-DIMM adversarial test was predicted in conversation only, with no immutable pre-outcome receipt; proud-otter-590 correctly refused to let a row authored afterwards be called preregistration. This is the first one done properly -- configuration, basis, falsifier, and what each outcome earns. It also states the test's weakness in advance: sixteen modules change at once, so a failure localizes to nothing. A screen, not a diagnosis. 2. REVIEW 64125 -- THE MT. JADE LOOKUP OUTCOME IS NO LONGER COLLAPSED. This module is extdeps.ocp.mt_jade.memory_mixing's FIRST consumer and it performed exactly the substitution that module was built to prevent: mtcollins1_mixing_verdict mapped MixedDimmSupportUnmodelled and MixedDimmSupportAmbiguous onto MixingUndetermined. The upstream made its lookup total-with-refusal to stop that, and says in its own annotation that a manufactured MixingUndetermined is the worst of the three substitutions available -- the table really does print TBD, so a fabricated one is indistinguishable from a cited one. The harm was concrete. mtcollins1_cross_channel_rank_mixing_standing records the specification declining to affirm the cross-channel rank mix this unit runs, and its witness is a control documented as one that SHOULD flip. Collapsed, it could not flip: a row gone MISSING or turned AMBIGUOUS would arrive as MixingUndetermined and the test would stay green while its subject had disappeared. One spelling carrying both "the specification declines to state" and "this corpus has no row" is section 3's meaning fork and section 5's widening failure arm. Fixed by not folding. The outcome is carried whole; the witness handles the refusal arms as distinct constructors; the control now requires the lookup to RESOLVE and read MixingUndetermined, so a missing or duplicated row turns it red. It is also the class I filed today, one turn further in: upstream_non_affirmation_consumed_as_permission covers a non-affirmation read as permission, and here an ABSENCE was read as a non-affirmation. I wrote the row warning about the pattern and committed its next variant within hours. EXECUTED: parses and typechecks with no .dag errors; the only local failures are the self_host_logic wet witnesses needing binaries this run did not build. Claim evaluation does not happen locally on this checkout, so CI remains the executing authority for the assertions. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Twelve known-good originals plus the four 2DRx4 spares -- the group whose part notation this corpus cannot identify. Prediction: FAILS. Confidence stated as low, because it is a guess among three roughly equal candidates and being wrong should cost something. Carries forward the standing disjunction proud-otter-590 insisted on: the prior falsification established that shape alone is not sufficient, NOT that supported shape is necessary, and NOT that a module is faulty rather than a combination untolerated. No round may name a bad module until one is isolated AND reproduces alone -- which matters physically, since the wrong framing gets a good stick binned. Records the operator's srvN prior for the 1Rx4 group as held-but-untested rather than assumed, so a later round falsifying it displaces something visible. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Round 1 put the four 2DRx4 modules entirely in socket 1 and the OEM payload came back 0fde703b1102 -- the first 3b of the session against nineteen 33s. Under the candidate schema that is the socket bit, and it tracked a variable we controlled. This round exchanges the sides. The prediction is a CONJUNCTION -- that it fails, and that the payload reports 33 -- so both halves can fail independently, which is the point. A 3b result would falsify the module-following reading; a clean train would mean an interaction neither simple reading captures. States plainly what no outcome earns: four modules move together, so nothing here names one, and a module untolerated by this platform is indistinguishable from a broken one. The schema stays a hypothesis and may not name a DIMM. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… earn Prediction cd83f73 matched on both halves -- it failed, and the payload reported 33 rather than 3b, so the socket field followed the quartet. But the decision table I wrote for it was too strong and this file says so: a configuration restriction violated wherever that quartet sits predicts the same outcome as a defective member, so the crossover separates neither. The companions changed too, so the round did not isolate the socket at all -- the experimental unit for that comparison is the complete eight-module population. Eliminates the best alternative hypothesis: all modules are 16 GB, so Ampere's per-socket equal-capacity rule is satisfied and explains none of the failures. Retracts two narration errors: 0 W memory power does not distinguish early failure from timeout, and the three-outcome table was neither exhaustive nor equiprobable. Records what the decoder earned -- two controlled confirmations of ONE field -- and that stage, status and tail have no such support and may not name a DIMM. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Written so the next session does not re-derive tonight's eliminations. Carries the seven tested populations with outcomes, what each ruled out, and the three hypotheses still standing. Two retractions recorded rather than quietly dropped: DDR4-2133 being unsupported on Altra (srv1/3/4 run 2133 Samsung parts and POST cleanly, so the SoC supports it), and any speed conclusion drawn from the eBay listing, which says 2Rx4 where the label says 2DRx4 -- a source wrong about one field is not evidence about a neighbouring one. Also carries the srv2 precedent: identical Samsung parts trained on three hosts and failed training on the fourth. Same class as tonight, already in the corpus, and recorded in the same module that carries the purchasing fail-open. Bounds the OEM decoder honestly: one field, two controlled confirmations, tail unchanged across the socket swap. May not name a DIMM. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Review 64195: 'the socket therefore lives in byte 3' exceeds the experiment. Correct -- and it is the same error the same document warns about four paragraphs lower, where it records that the companion modules moved with the quartet. If the companions changed too, the bit may be tracking any property that moved with the intervention: a restriction carried by the group, a channel-group index, a first-failing-controller identity. Both documents now separate what was OBSERVED (byte 3 changed between rounds, the tail did not) from what is INFERRED (that the bit encodes the socket), and say explicitly that two consistent crossovers support the reading without establishing it. DESIGN section 4d: do not assert as deduced what is only inferred. The reviewer's closing point is the one that matters -- this was on its way to becoming the next session's premise, which is how a hypothesis becomes a fact without anyone deciding to promote it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Directly comparable to round 2 -- same shape, same socket, only the substituted quartet differs. Prediction: fails. Confidence moderate-low, since no test has ever isolated this group and a falsification would be sharper than a confirmation. Records a fourth outcome the earlier tables missed: a DIFFERENT tail value would be the tail's first variation under a module-only change, since 1102 held across the all-spares round and both 2DRx4 positions. Worth watching for rather than discovering afterwards. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
6m13s no restart, memory power 10.4/9.6 W on both sockets, matching the one configuration that trained rather than the seven that failed. I predicted failure. Wrong, and the falsification is worth more than the confirmation would have been: the two Micron quartets SHARE vendor, purchase window, provenance and claimed speed grade, so those four properties cannot explain a difference they do not carry. They are exonerated. What distinguishes the groups is module ORGANIZATION. Does not establish that any individual 2DRx4 module is defective, nor that the 2Rx4 quartet is QUALIFIED -- it reached training once, with no workload, no EDAC check under load, and no 2DPC observation. Purchasing consequence: four of the eight new Micron modules are usable now. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
9e74a6b said the prediction was FALSIFIED because 'the 2Rx4 group trains'. Corrected here rather than edited in place. 1. 'Trains' was never observed. What was observed is a 373-second restart-free interval plus power and temperature readings -- a right-censored survival interval, not a success event. gunbc#11110 deliberately has NO training-completion constructor, so the claim was stronger than any model here can produce. 2. The prediction was scored against the wrong endpoint. a28843d named TRAINING as its falsifier; I scored it on restarts and watts. The restart reading is contradicted for 373 seconds; the declared reading is NOT YET SCORED because its observation was never obtained -- and cannot be, since the census image reports only over a serial console this controller leaves silent, and the NFS share holds no output. 3. 'Only organization remains' does not follow. Four modules changed together, and the two quartets came from DIFFERENT orders and sellers -- 'both used-market' is a category, not a common lot or handling history. 4. A real gap worth more than the incident: DramDieStacking admits only MonolithicDie or ThreeDimensionalStacked and cannot represent non-3DS multi-die. Micron's numbering keeps these separate -- DS is very-low-profile DUAL-DIE with a temperature sensor, P is RDIMM where PS is 3DS. MTA36ADS2G72PZ-2G1A1 is DS and P: dual-die and NOT 3DS. -2G1 independently confirms 2133 MT/s from the numbering system rather than the seller's listing. The operator's low-profile hypothesis is supported by the manufacturer's own naming; forcing the part into ThreeDimensionalStacked to build a row would invent a physical fact. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Firmware clears a one-shot override when it READS it to select a boot device, so this configuration reached boot-device selection -- and the same instrument read the other way during the failing rounds, where the override stayed Valid and unconsumed across restarts. One discriminator, both polarities, same unit, and a control-plane fact rather than an aggregate sensor whose validity was never established. Still does not establish training completion, module recognition, capacity, or qualification. Records why the population readback is unobtainable rather than merely absent: the share holds no output, the host NIC is in neither host's ARP table, and SOL returned the same 86 bytes as every other capture. The image reports over serial only and that channel is dead here. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The operator read the host console over KVM. It shows EFI stub Booting Linux Kernel, then Failed to load initrd 0x8000000000000001, then Exiting boot services. THIS IS THE POSITIVE OBSERVATION THE CORRECTION SAID WAS MISSING, and it is not telemetry: reaching 'Booting Linux Kernel' requires completed DRAM training, completed POST, CD selection, GRUB running off it, and a kernel image loaded into RAM. Code executed on this memory. Not watts, not a restart-free interval. It also relocates the failure: EFI_LOAD_ERROR on the initrd, byte-identical to the attempt-3 failure of 2026-09-10, now REPRODUCED with media confirmed attached beforehand. That weakens the stored 'reset before the medium was ready' reading and strengthens the competing small-reads-succeed/large-read-fails reading in the same record. The route has worked once before, so it is intermittent rather than categorical. And the observability finding: SOL returned the same 86-byte banner through every capture tonight while the KVM rendered real output throughout. SolSilent never meant the host was silent -- it meant the instrument was dead. Every inference that leaned on console silence leaned on a broken instrument, and the KVM belongs in the capability model as its own channel. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Answers three questions that were being guessed at, from the controller's own source.min.js rather than from probing endpoint names. The file is committed with its digest -- it is the same file whose ABSENCE forced the redirection_status retraction yesterday, so future readings now have a resolvable source. SOL is silent because of host-side console routing, not a BMC defect: the BMC reports Enabled at 115.2 kbps, while every actuation sent console-redirection byte 00, DEFER TO BIOS. Set to 0x02 and verified -- the readback now reads 'Request console redirection be enabled'. Whether firmware honours it is a separate, untested fact. UEFI settings are NOT reachable: of 255 endpoints only firmware upgrade and version reads touch BIOS, and Redfish 404s. So firmware configuration on this platform is a human-attended console barrier, which convergence must model rather than assume away. And the controller can record the host console ITSELF on events -- video and SOL recorders with triggers, shipped disabled, never used. Armed and verified for power-on, reset, critical, non-recoverable and watchdog, with pre-event capture. Video records the framebuffer that works today; SOL records a stream that stays empty until redirection takes effect. Records the lesson this cost: SOL returned the same 86-byte banner across eight configurations while the KVM rendered output throughout, and inferences were drawn from that silence. A capability model that says sol_stream present without saying delivering no will mislead the next platform identically. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Reading the full log rather than the tail surfaced co-emission, which the tail cannot show. 0fde7033ff10 and 0fde703bff10 occur at the same second with adjacent record IDs, three times -- differing in exactly the bit two declared crossovers had shown tracking the intervened socket. That is a second, independent support for the socket reading, and it does not route through the companion-population confound that bounded the crossover. Every failure payload is unpaired, so on a training failure exactly one socket record is emitted. Still inference, not a decode: nothing here establishes that the emitting socket is the failing one, and no mapping from payload bytes to a physical connector exists. This may not be used to name a DIMM. Also records two falsifications and one fault. The armed video and SOL recorders captured nothing across a failing boot, so arming them does not open the pre-OS window on this controller. And the web stack issues an HTTP session it then rejects while HTTPS works, and its power widget reported "powered off" against its own API's power_status 1. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Manufacturer 0x00CD3A is Ampere Computing (IANA PEN; Ampere BMC Interface Spec v1.43 Table 3), and Ampere's own OpenBMC emitters publish the DDR training payload layout. Its documented (channel<<4)|type|(socket<<3) makes 0x33 channel 3 socket 0 and 0x3b channel 3 socket 1 -- a third support for the socket bit, and the first from vendor source rather than our own experiments. The tail stays undecoded: our sensor number is 0xDE against the documented 0xEB and the low nibble is 3 against 4, so it may still not name a DIMM. Corrects a recommendation made earlier in this session. raw 0x3c 0x17 is backed by an OpenBMC vendor sysfs attribute and on AMI MegaRAC would most likely hit Get Hardware ID instead -- plausible bytes meaning something else, the worst failure shape. The realistic path is standard Master Write-Read 0x06 0x52 against bus 2, 0x4F socket 0 / 0x4E socket 1. Also records that the 0xB0 history walk consumes what it reads, so the register sweep goes last; that 0xB5 is outside the spec's byte-swap exemption list and needs its order established against a known-good slot; and that the Altra family docs and the Mt. Jade board spec disagree on which UART carries the SCP console, so a tap must probe both. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… byte 6 A repaired SOL collector captured the failing boot and the platform firmware states the cause outright: CHANNEL Mismatch Byte 6 SLOT0[00] EXP[91] @mcu[4], Non-identical DIMM mixture NOT supported. SPD byte 6 carries package type, die count and signal loading, so the dual-die ADS modules (0x91) cannot share a socket with the monolithic SK hynix parts (0x00). This is the cross-channel axis Mt. Jade marks TBD, and it explains all eight configurations including the one that did not fit: the ASF round reached a kernel because ASF is monolithic like the SK hynix parts, not because 2Rx4 is supported where 2DRx4 is not. Three claims retracted. The 2DRx4 organization being untolerated was wrong and remains untested -- the 16-spares round cited for it was itself an ADS/ASF mix, and the open prediction is that 16 identical ADS modules train. A defective Micron module is dead. The die-density hypothesis is confirmed dead. The capture also carries the full 16-row per-DIMM table that four sessions searched the BMC for. It was on the host console the whole time; the collector had been reporting its own banner as host silence. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The firmware capture settled this, so the standing-hypotheses section was stating as open a question that is closed, and hypothesis 2 was asserted on evidence that does not support it -- the 16-spares round cited for it was itself an ADS/ASF mix. Marked superseded rather than deleted, because they were scored predictions and the scoring is the record. Also withdraws the named next discriminator. It was a uniform-monolithic population the operator had been running for days, so it could only confirm what was known; the byte-6 rule predicts it trains for a reason that tests nothing. The experiment that still earns something is 16 identical ADS modules, the claim this investigation made and never tested. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Review 64267 found that the witness asserted smbios_board_serial against a literal hand-copied from the declaration under test in the same PR, so an author editing the serial in both places stayed green and unit identity was never checked. Its two companion clauses were the same decoration class review 64253 rejected: != "" over NonEmptyStr fields, no authorable RED. The load-bearing claim -- host SMBIOS and controller FRU reading the SAME serial, which is what makes this an observation of a unit rather than of an address -- was prose on BOTH ends: a String field here and a // annotation in the access module, which DESIGN 4c says can never be evidence because no Accepted program reads one. So the controller side is now a typed row, re-read from the controller rather than transcribed, captured with argv and exit status as artifacts/bmc/mtcollins1-controller-fru-2026-09-12.txt. Both serials corroborate, not only the board serial the review asked for. The witness folds the equality across two independently declared rows, so changing the serial in one module and not the other goes red whichever module is edited -- which a self-copy cannot do. A second control refuses the case where both sides collapse into one carrier and the fold quietly becomes a self-comparison. The annotation that restated the serials is trimmed for the same reason it was dangerous: prose repeating a value reads like evidence for it. Not executed. The required floor refuses before claim evaluation at present (needs ~17-19 GiB against ~15 admitted), so this carries no local green and I am not claiming one. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Review 64291: mtcollins1_controller_fru_artifact_path and mtcollins1_controller_fru_digest were added by this PR and read by nothing. DESIGN 3c names that exact tell -- a data row no fold reads -- and being well-formed evidence rows does not excuse it. The sibling identity row is genuinely consumed, through mtcollins1_subject_binding, so only the path and digest were dangling. The review offered a declared frontier or removal. Removal is the smaller change: the census module's artifact-identity frontier constructor fixes the module path to that module, so admitting rows here would mean generalizing that carrier, which is more machinery than two unconsumed rows are worth -- and DESIGN 2 says net concepts must not grow by re-invention. The capture lands with its digest in its own evidence PR, where bytes and hash are reviewed together, and a modelled capture producer can later mint these rows with an actual consumer. That producer is the trigger that would make declaring them earn something. The annotation now carries the provenance as rationale and states plainly that two PRE-EXISTING path rows in this module are dangling by the same test. They predate this change and the review correctly scoped to the rows this PR adds, so sweeping them would widen a review fix into an unrelated cleanup. Said out loud rather than left silent. Not executed. The required floor still refuses before claim evaluation here, so no local green is claimed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The recognition rule I wrote said to hash a streaming collector's captures against each other and concluded that identical bytes across differing subjects means the instrument observed itself. The operator corrected it the same day: identical hashes are a SUSPICION TRIGGER, not proof. Two honest readings of a genuinely quiet channel are also identical, and so are two runs of a subject that did not differ in what it emitted. Promoting a cheap artifact-side signal to a verdict because it is cheap is this row's own defect one level up, which is why the correction belongs in the row rather than beside it. What decides it is the conjunction, no member sufficient alone: captures compared, expected stimulus (the seventh instance had three configurations reaching different boot outcomes, one executing a kernel -- that is what made identical bytes impossible rather than merely odd), coverage, and process evidence including whether the exit preceded the window's close. Plus a positive payload on the exact path at least once, since a path that has never delivered cannot separate a quiet subject from a broken client. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Review 64298, both findings valid. The claim that OEM payload 0fde70331102 was "for this same boot" as the SOL capture was ungrounded: the SEL artifact this probe landed ENDS BEFORE that boot and contains no record of it. The reading existed only in a session transcript, never in a committed artifact -- the capture-discipline failure this repository has a standing rule against, committed by the person quoting the rule at others. Grounded now by a second SEL read taken for the purpose, carrying its argv, the controller's clock, and exit=0. Joining the two artifacts needs a fact neither states alone, and the review surfaced it without naming it: THE CONTROLLER'S CLOCK IS FOUR HOURS BEHIND WHILE LABELLING ITSELF UTC. Measured in one second -- host 03:55:24Z, controller "09/11/2026 11:55:24 PM UTC". So every SEL timestamp from this unit reads as a different calendar day, which is why the reviewer found no 09/12 rows. Recorded, because it makes every cross-artifact timestamp join on this fleet wrong by default. The join is still an inference across two clocks, one known wrong, and says so. Second finding: the doc claimed the collector failure was "filed as the seventh instance" while this branch does not touch that row. That is a parallel ledger and a fabricated done-state. The filing is real but lives on #10965's branch; the doc now says which branch and commit, and does not duplicate the row here -- two lanes appending one row is the collision the one-class-per-file layout avoids. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Review 64316: the BMC capability probe asserted "the cause is host-side console routing" as a determined cause, while the ledger row added in the SAME change retracts exactly that claim as unevidenced. One PR answering "what causes SOL silence" two ways is the meaning fork DESIGN 3 names, and the markdown was the side with no evidence behind it. The premise was wrong too, not just the cause. SOL is not silent: a repaired collector captured 3764 bytes of firmware output across a failing training boot. The measured cause of the apparent silence is the collector exiting rc=0 after ~3 seconds of a 420-second window while the wrapper slept out the rest -- authority gunbc.recurring_failure_mode empty_capture_read_as_clean_result, seventh instance. What survives is kept at its real strength. The sol info readings and the boot-parameter readback are genuine READINGS and stand. What does not follow is that either explains anything, because there was no absence to explain -- byte 00 is perfectly consistent with a console that prints over SOL, which is what was then observed. "The BIOS evidently routes console to video" was an inference consumed as a cause (DESIGN 4d) and is withdrawn rather than softened. The document's own opening promised to answer "why SOL is silent", which presupposed its answer, so that framing is retracted at the top as well as in the section. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Review 64332, and it lands on a module that documents the rule it broke. MtCollins1ConnectorIdentificationBasis carried four NonEmptyStr paragraphs; the witness reads only upstream_pair_authority.module_path. not_established was a near-verbatim restatement of the WHAT IS NOT CLAIMED annotation ten lines above it -- one rationale, two carriers. MtCollins1CaptureAttemptFailure carried four more, and preserved_artifacts buried two artifact PATHS inside an English sentence while this module declares paths as typed rows, which is section 2's anemic-modeling tell. MtCollins1MemoryWorkload.description restated the typed fields beside it and was the only field of that type the witness does not fold. This module already records deleting a six-hundred-character paragraph in a String for precisely this reason, and states the rule itself: a data row no fold reads is a prose TODO wearing a type, section 3c's dangling declaration and section 4c's misplaced prose at once. It then re-committed the shape in three types. The reasoning is preserved as // annotations, which is section 4c's quarantine boundary and where irreducible rationale belongs. No evidence is lost: the identification discriminator is exercised by the witness fold over the actual population, not by the paragraph describing it, which is exactly why the paragraph was deletable. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* Preserve the Mt. Collins DRAM training evidence, on its own merits Split out of #10965 so a consuming lane does not depend on that PR's contested parts. Evidence only: four captures and the account of what they establish. No model changes. The SOL capture is why this matters. The platform firmware states the cause of a week of failed boots directly -- "ERR: CHANNEL Mismatch Byte 6 SLOT0[00] EXP[91] @mcu[4]" then "Non-identical DIMM mixture NOT supported!" -- so every DIMM in a socket must agree on SPD byte 6 (package type, die count, signal loading). Dual-die modules read 0x91, monolithic read 0x00, and mixing them refuses to train. Capacity, rank, width and speed were IDENTICAL across every failing mixture, which is why this took a week. The capture also carries a 16-row per-DIMM table in the firmware's own addressing, which is the localization the BMC does not provide. The doc is explicit about what is NOT established, because three of my own claims died here: that the modules are defective, that the organization is untolerated (untested -- a uniform population has never been run), and any causal account in terms of electrical load, which I asserted and retracted. The firmware comparing byte 6 and refusing is evidenced; why it compares is not. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Ground the co-timing claim, and stop claiming a filing this PR lacks Review 64298, both findings valid. The claim that OEM payload 0fde70331102 was "for this same boot" as the SOL capture was ungrounded: the SEL artifact this probe landed ENDS BEFORE that boot and contains no record of it. The reading existed only in a session transcript, never in a committed artifact -- the capture-discipline failure this repository has a standing rule against, committed by the person quoting the rule at others. Grounded now by a second SEL read taken for the purpose, carrying its argv, the controller's clock, and exit=0. Joining the two artifacts needs a fact neither states alone, and the review surfaced it without naming it: THE CONTROLLER'S CLOCK IS FOUR HOURS BEHIND WHILE LABELLING ITSELF UTC. Measured in one second -- host 03:55:24Z, controller "09/11/2026 11:55:24 PM UTC". So every SEL timestamp from this unit reads as a different calendar day, which is why the reviewer found no 09/12 rows. Recorded, because it makes every cross-artifact timestamp join on this fleet wrong by default. The join is still an inference across two clocks, one known wrong, and says so. Second finding: the doc claimed the collector failure was "filed as the seventh instance" while this branch does not touch that row. That is a parallel ledger and a fabricated done-state. The filing is real but lives on #10965's branch; the doc now says which branch and commit, and does not duplicate the row here -- two lanes appending one row is the collision the one-class-per-file layout avoids. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Cite the clock measurement by line instead of re-typing it Review 64318: the paragraph establishing the four-hour controller clock skew quoted a host/controller pair that appears nowhere in the artifact it cites. The committed capture reads :50 in both places; the prose said :24, because I transcribed a live probe taken about half a minute before the capture I then committed. The offset itself is correct and the join still holds. What was wrong is that the numbers carrying it were unreachable from the artifact that owns them -- DESIGN 6, name the instrument, never transcribe its output. And it is the same defect this very section was written to retract, committed inside the retraction, which is the third instance of this class in one session. Both the skew measurement and the applied-offset sentence now name lines and record ids rather than re-typing clock readings, so a reader resolves them against the capture and any future re-capture stays consistent with the prose. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Every capture now states what it grounds, or it should not be here Review 64333: two of the four artifacts were landed with nothing in the account reading them. The FRU capture was named nowhere at all, and the earlier SEL only obliquely and never by path -- a section 3 citation defect on top of section 3c's tell, which applies to an artifact as much as to a data row, and section 2's redundant work. Replaces the single-artifact header with one entry per capture stating what it grounds: SOL the finding itself, the 0355Z SEL the clock offset and the bracketing records, the earlier SEL the payload-family census and co-emission structure, and the FRU capture unit identity via two serials read over two transports. The earlier SEL is explicitly kept as the capture that ENDS BEFORE the SOL boot, because that is what made this document's first co-timing claim ungrounded and the receipt is worth more than hiding it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Withdraw "everything else matched" -- speed and rank did not The conclusion claimed capacity, rank, width and speed were identical across the failing mixes. They were not. The capture that produced this refusal holds Micron rows at 16GB 2133 ECC 2R x4 against SK hynix rows at 16GB 2666 ECC 1R x4: speed and rank both differ, and only capacity and device width match. The error was conflating two comparisons. The two Micron siblings really are identical on every part-number field but module options, and that is the clean discriminator for the package axis. The configuration the firmware actually rejected was Micron against SK hynix, where speed and rank differ too. Extending the sibling comparison onto the captured mixture is the join defect this document retracts twice elsewhere, committed a third time in its own conclusion -- and it was the version most often repeated to the operator. The finding is undiminished: the firmware named byte 6 and no other field, and did not cite the speed or rank differences that were also present, which is what keeps the package axis operative. But the rule may not be advertised as "everything else matched". The purchasing justification needs no overstatement -- a directly observed firmware-rejected package-byte mixture exists, procurement must avoid it, and one uniform part number per socket stays a sound conservative rule rather than a universal firmware law. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…carriers (collectors-before-actuation, silence-is-not-a-terminal, opaque-OEM-stays-opaque) (#11110) * The channel map is in the boot firmware, not in EDAC Mt. Collins unit 1 booted a Linux that ran ON the machine and its memory census is committed as bytes: nproc 160, dmidecode type 16/17 for all 32 connectors, the whole EDAC tree, and dmesg. The receipt states nothing the two artifacts do not contain. THE BRIEF EXPECTED EDAC TO CARRY THE CHANNEL MAP AND IT DOES NOT, which is the load-bearing result rather than a gap to chase again. This platform runs ACPI APEI firmware-first ("GHES: APEI firmware first mode is enabled by APEI bit"), so ghes_edac registers ONE synthetic controller and mirrors the SMBIOS device list purely so a GHES error record has a DIMM to name. It is an error-reporting shim, not a topology driver: `find /sys/devices/system/edac` returns no path containing "csrow" — a counted reading over an enumerated tree, not an inference from a driver name. No boot will change that, so the reason is recorded with the negative. The channel-resolved reading comes from the Altra boot firmware's DRAM training output instead, which is strictly richer than a csrow tree: it names socket, memory controller AND slot-within-channel. All sixteen modules sit at S0 of their channel, so the unit is uniformly 1DPC and the sixteen empty connectors are each channel's S1. Connector numbers are a JOIN and are declared as one — neither reading prints a J-number. What discriminates it: HMA82GR7CJR8N-VK occurs exactly ONCE in the machine; firmware puts it at SK0 MC5, SMBIOS at "DIMM 11", and the Getting Started Guide's pair table puts MCU5's 1DPC member at J11. No shift or reversal of the sequence reproduces that. SMBIOS's own Rank column reproduces the firmware's 1R/2R sequence independently, and the populated set is exactly the odd connectors, which upstream specifies. The upstream pair table is consumed from extdeps.ampere.mt_collins_product_brief.memory_population, not re-transcribed. EDAC is clean at capture: mc0 and all 32 per-DIMM counters read zero. That is recorded as clean AT CAPTURE on a host up ~20s — the memtest pass is the endurance evidence and this is the structural one; calling it more would be rung inflation. The witness test consumes the rows so they are not dangling, and its main check is adversarial: firmware and SMBIOS are two independent readings, so if either transcription drifts, the part number or rank at some connector stops agreeing and it goes red. The EDAC probe is enrolled as a control that is SUPPOSED to fail the day a native Altra driver exposes a real topology. Two modelling obligations are named and deliberately NOT satisfied here: HMA82GR7CJR8N-VK has no catalog row (minting one from our own boot log would render a local report as an upstream fact), and the same-channel rank-mixing rule is absent from extdeps.ocp.mt_jade, so the per-connector fill requirement is not authored as though it were derived. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * chip_width is BitWidth, and the failed attempt keeps its bytes Review 63222 is right: chip_width_bits: Nat was a second name for a concept std.measure already owns. dag/std/measure.dag defines BitWidth and bit_width, and the memory home already carries this exact fact as chip_width: BitWidth (extdeps.memory.types DramModuleCatalogRow, constructed with bit_width in extdeps.memory.sk_hynix). Minting a flat scalar beside it is the DESIGN section 3 nickname and the section 2 re-invention in one field. The field is now chip_width: BitWidth, built with bit_width(4) / bit_width(8), matching the catalog's spelling so the two join on a name as well as a meaning. ALSO PRESERVED: attempt 3, which failed. It was built to close the subject-binding gap and add a named memory workload with before/after EDAC counters. The kernel loaded from the virtual CD and panicked — "VFS: Unable to mount root fs on unknown-block(0,0)" — because the MegaRAC remote-media session dropped between kernel load and root mount; the controller read redirection_status 100 immediately before the reset and 1 after. Its bytes are committed anyway, because a failed probe is exactly as easy to lose as a successful one and this census exists to end that class. The pre-boot srv2-side observation stands on its own regardless: an ARP reading with a typed verdict against the expected MAC, plus the boot artifact's digest. AND A GAP IS NOW STATED RATHER THAN RELIED ON. The capture binds to the board MODEL (kernel DMI: FOXCONN Mt. Collins/Mt. Collins) and NOT to this physical unit — SMBIOS Type 1/2/3 was not captured, so board serial 02030A800TEXFT02L appears nowhere in the bytes. What ties the capture to unit 1 is the delivery path, which is author-held provenance rather than a fact a reader can check inside the artifact. Dissolved by one dmidecode --type 2 in a future attempt. There is no attempt 5: re-establishing the media degraded further (stop-media and start-media both HTTP 500, never returning to 100). That controller is the only out-of-band path to the M1 canary, so the run was stopped rather than driven harder, the boot override cleared to "No override", and the controller left verified healthy over IPMI. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * The host was asked to legacy-boot a CD on aarch64, and the model called it success THE CENSUS IS COMPLETE. Both gaps this receipt declared open are closed by a second capture, artifacts/bmc/mtcollins1-host-capture.txt, 270880 bytes, sha256 a9b880c3ecd9ba611c1df9e7de1ab089839c5d8e92b743bf2e1bcd684100fd2a, whose nineteen sections each carry their argv and exit status so a missing reading is distinguishable from a zero one. All nineteen exited 0. THE UNIT BINDING IS NOW AN EQUALITY BETWEEN TWO INDEPENDENT READS, not a stronger assertion of one. The host reads board serial 02030A800TEXFT02L from its own SMBIOS Type 2 under Linux; mtcollins1_access_observation reads the same serial from the controller's IPMI FRU, different transport, different agent, days earlier. Either alone is an observation of a reading; the two agreeing is an observation of a unit. EDAC IS LOAD-BACKED RATHER THAN A SNAPSHOT. 64 GiB of tmpfs seeded from urandom, hashed twice and the passes compared, with the EDAC tree read on both sides: all 34 counters 0 before and 0 after. The digest comparison is there because EDAC counters are the memory controller's own account of itself -- if it fails to notice a fault its counters stay zero -- so hashing tests the DATA rather than the controller's opinion of it. It still is not a soak, and the row says so. AND THE REASON THIS TOOK FIVE ATTEMPTS IS A FIELD THE BOOT-HANDOFF MODEL DOES NOT CARRY. IPMI boot parameter 5 encodes two decisions: the device selector AND the BIOS boot type (byte 1 bit 5, 0 = legacy, 1 = EFI). oob_boot_handoff and mtcollins1_actuate model the selector alone -- efiboot, boot_type and legacy appear nowhere in that path -- so every handoff requests the default, which reads back "BIOS PC Compatible (legacy) boot". aarch64 has no legacy boot path, so the request is unsatisfiable and the firmware falls through to PXE and then the UEFI shell. Measured fix: options=efiboot,persistent reads back "BIOS EFI boot" and the next reset booted the image. THE DEEPER DEFECT IS THAT THE MODEL REPORTED SUCCESS THROUGHOUT. oob_boot_handoff mints BootHandoffCompleted once the override reads back as expected and the power action is accepted. Both held on every failed attempt -- the selector really did say "Force Boot from CD/DVD" and the reset really was accepted -- so a handoff that provably booted nothing is indistinguishable in the model from one that did. That is DESIGN section 5's specification-without-execution, and it is why a legacy/EFI mismatch could persist across an entire intake lane. Fixing the argv without fixing the postcondition would close this instance and leave the class, so both are recorded here and neither is fixed in this commit. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * The 100 to 1 transition was the redirection succeeding, and I called it a drop A review on 68f91df caught two claims in this receipt that the evidence does not support. Both are corrected here rather than quietly edited, because the wrong text was load-bearing for an investigation that ran for hours. THE MEDIA-DROP MISCLASSIFICATION. The attempt-3 row said the remote-media session "dropped out from under casper between loading the kernel and mounting the squashfs root". The committed console refutes it directly: GNU GRUB / EFI stub: Booting Linux Kernel EFI stub: ERROR: Failed to load initrd: 0x8000000000000001 VFS: Unable to mount root fs on unknown-block(0,0) The firmware DID select the medium, GRUB DID run off it, the kernel DID start. What failed is the INITRD load, with EFI_LOAD_ERROR. A medium that had vanished could not have served GRUB and a kernel first. The row now states the initrd failure as what is established, and the partly-ready-medium reading as plausible and unproven -- the attempt reset while the redirection was still at 100. AND THE REASON THAT MISREADING WAS POSSIBLE now has its own row. redirection_status was treated as a health value where nonzero meant trouble. The controller's own served frontend says otherwise: 1 renders "Started - Connection Accepted" and is the healthy steady state, 100 is connecting, and 2 through 5 are Connection Denied, Login Failed, MAX Session Reached and Permission Denied. Measured against the live controller, attach goes 100 (session_index 255) -> 100 (session_index 0, +12s) -> 1 (+15s) and then HELD at 1 for 4m27s idle and through a full boot. 1 is the destination, not a decay. The consequence generalises past this unit and is why the row exists: a "nonzero means attached" predicate admits 100, which is merely CONNECTING, and admits 2-5, which are refusals. Only 1 may satisfy media-ready. A predicate that resets a host on 100 can expose a partly-ready medium to firmware reads, which is the plausible reading of the attempt-3 initrd failure above. This commit does not touch the boot-handoff or media modules. The typed producer, the IpmiBootSelection cut and the readiness predicate are being recut elsewhere; this only stops THIS receipt from asserting things its own artifacts contradict. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Two receipt-integrity defects: a timestamp the artifact contradicts, and one attempt identity for two attempts Both caught in review against 45ffaef, both verified against the committed bytes before being accepted, both mine. THE TIMESTAMP WAS WRONG BY NEARLY FOUR DAYS. mtcollins1_host_capture_observed_at read 1789428410000, which is 2026-09-14T23:26:50Z. The artifact's own first line says "attempt=3 begin 2026-09-11T01:26:50Z". The correct value is 1789090010000. This is the one error class this module cannot carry, because its entire claim is that it states nothing the artifact does not contain. A digest proves the bytes are unaltered; it proves nothing about whether the fields around it were read out of those bytes. A reader checking the digest would have found it correct and the timestamp still false, which is exactly the gap that makes a hand-transcribed receipt weaker than a generated one -- and is the argument for the modeled producer this lane has been asked for twice. AND "attempt=3" NAMES TWO DIFFERENT ATTEMPTS. The successful capture's header reads attempt=3; so does the FAILED run at mtcollins1_attempt3_failure, whose artifact is mtcollins1-attempt3-sol.log. One produced no host capture at all and one produced these bytes, minutes apart, under one identity. The cause is that the capture script hard-codes its attempt number, so a rerun re-uses the identity instead of minting a new one. The artifact FILE was correctly never overwritten -- the earlier directive's rule -- but the identity inside it was, which is the same failure one level down. An attempt identity a rerun can silently duplicate is not an identity, and any receipt join keyed on it would merge a failure with a success. THE BYTES ARE NOT EDITED. Rewriting a capture to correct its own label would destroy the property that makes it evidence. So the label is recorded as unreliable, the distinguishing facts are carried in the model instead -- different artifact, different digest, different wall-clock window, different outcome -- and the producer's literal is named as the thing to remove. Neither fix makes the producer reproducible; that is still the open item and it is being recut elsewhere. This only stops the receipt asserting what its own artifacts refute. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * The enum belongs to firmware 0.32, and efiboot,persistent proved one axis of two Three scoping corrections from the review amendment, all of them narrowing claims this receipt was making wider than its evidence. THE STATE MACHINE IS KEYED TO ONE FIRMWARE BUILD NOW. It was read from the frontend served by THIS controller at revision 0.32, and the row said only "the controller's own served frontend", which reads as a MegaRAC fact. It is not one. Nothing here establishes that any other release uses the same numbers, so the row names the build and says that an uncatalogued firmware identity must refuse rather than borrow the nearest profile. Inheriting a status enum across firmware would be the same failure that produced this row: a plausible-looking value read as its opposite. AND THE ROW NO LONGER IMPLIES A CLOSED RANGE. Carrying first_refusal 2 and last_refusal 5 invites a consumer to treat 2..5 as the refusals and everything else as fine. The vendor renders any value outside {0,1,100} as Stopped, so unknown codes are neither pending nor success. This row does not enumerate them and now says so: a consumer needs an explicit other-code arm, not a default. THE efiboot CONTROL PROVED THE EFI AXIS AND NOT PERSISTENCE. persistence was held constant across the failing and succeeding probes, so the varied term is the one implicated; options=efiboot,persistent is simply what executed. It is not the intake policy, because persistent changes ALL FUTURE BOOTS, and I used it for convenience on a machine that is not mine to leave reconfigured. ipmitool sets the valid bit itself, so the one-shot projection is options=efiboot alone. A one-shot EFI wet run is still owed, and if this firmware turns out to require persistence that must be an explicit persistent-until-restored fact with the clear and the readback in one transaction -- never a persistent write described as one-shot. None of this is the migration. The typed IpmiBootSelection, the readiness predicate over the decoded status, the serialized StartMedia body and the split of control issuance from image execution are being recut elsewhere and this commit deliberately does not anticipate them. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Probe record: the census, the boot-delivery defect, and the errors that cost the night One document for the whole session, written because the operator asked to understand this path end to end and will run nineteen more of these machines. It carries the census result and both purchasing conclusions; the channel map and why EDAC cannot supply it on an APEI firmware-first platform; the J-slot join with the single-occurrence part that discriminates it; the unit binding as an equality between host SMBIOS and controller FRU; the load-backed EDAC reading and the explicit statement that it is not a soak. It carries the boot-delivery root cause -- IPMI boot parameter 5 encodes device AND boot type, the model carries only device, and legacy-on-aarch64 is unsatisfiable -- together with the deeper defect that let it hide: BootHandoffCompleted minted from an override readback and an accepted power command, never from evidence that anything booted. And it separates the two failure modes rather than letting the EFI axis explain an attempt that reached GRUB and died on its initrd. It carries the firmware 0.32 media state machine read from the controller's own frontend, keyed to that build, with the transient that a naive bounded poll would refuse, and the measured fact that HTTP 500 on media/general means both applied and not applied so only a readback is a verdict. AND IT CARRIES A NUMBERED LIST OF MY OWN ERRORS, which is most of why it exists. Reading redirection_status 1 as death when the vendor renders it Started, and escalating a decay clock that was really connect time. Reading a flag byte as a session count and reporting one-boot-per-reset as fleet knowledge. Overclaiming the root cause. A timestamp wrong by four days behind a correct digest. One attempt identity for two attempts. The password in argv. Persistent left on a machine that was not mine to reconfigure. And the framing one: I never built the modelled capture producer that was asked for in the first directive, which is the standing objection on #10965 and is fair. A probe record, not an authority. Every number was re-derived while writing rather than recalled, and inference is marked as inference throughout. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Recut to evidence only: the decoder, the policy and the prescription leave this receipt Acting on the strip-or-park ruling. #10965 becomes the evidence landing; the boot-path migration consumes it from a separate PR. One new commit on the existing branch -- the execution-history commits are NOT rewritten or rebased away, because the sequence of wrong turns is part of what the artifacts document. WHAT LEAVES, AND WHY EACH WAS NOT MINE TO HOLD: The media state machine is gone entirely, not refined. A mapping from vendor status codes to meanings plus a rule about which permits a reset is a firmware-keyed extdeps.bmc.megarac catalog and a caller policy on top of it -- neither is an observation of this unit, and holding them here would make a unit receipt a second authority the moment the migration lands. It also had prose provenance: it was read from a source.min.js that is NOT a committed artifact, and a sentence naming the file it came from is not a resolvable receipt. What survives is the measured transition alone, with no readiness conclusion drawn from it. The boot-delivery row keeps its observations and loses its prescription. It no longer tells a reader which argv to use, what the one-shot projection is, or what to do if the firmware demands persistence. It records what the flags read on the failing and succeeding attempts, that the control varied the boot-type bit alone, and that the model returned BootHandoffCompleted throughout. THREE RESIDUES FROM THE LAST ROUND, ALL CONFIRMED BEFORE FIXING: first_refusal and last_refusal were still declared and still set to 2 and 5. The previous commit changed the prose warning against that inference and left the fields that support it, which is worse than not having claimed the fix. Gone with the type. The "session never returned to redirection_status 100" reading survived in two places and is still backward. Replaced with the measured result: both calls answered 500 and the readback was unchanged, so neither transition was established as applied and the HTTP status decided nothing. The header claimed every field came from two files. That stopped being true when the module gained a second capture and later observations, and a global claim gone quietly false is worse than none -- a reader would verify both digests, find them correct, and still be reading fields those files never contained. Evidence now binds per section. AND THE ACQUISITION IS MARKED HONESTLY. HistoricalAdHocCapture with reusable_producer_absent. Every capture here was produced by hand; one successful manual capture is not evidence the intake system can take another. hw-first-host may read the observations, because its clause asks whether this unit passed named facts. Nothing may read them as proof of a reusable capability. THE WITNESS NOW READS WHAT IT USED TO IGNORE: subject binding, the workload, the before/after counters, their agreement with the topology row, and the acquisition standing -- the last as a control that SHOULD go red the day a producer exists. The earlier witness checked slot rows and nothing else, which is precisely how a four-day-wrong timestamp landed green. It still cannot recompute a digest, and says so: a pure witness has no file access, so a hand-transcribed digest stays unverifiable. That gap does not close with a better test. It closes when a producer GENERATES the receipt from the artifact. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Redact a published BMC credential, finish the strip in the probe doc, file the two failure modes CREDENTIAL FIRST, BECAUSE IT IS THE ONLY ITEM HERE THAT IS URGENT. Review found artifacts/bmc/mtcollins1-attempt3-srv2-side.txt recording the BMC password LITERALLY in ipmitool argv on two ----ARGV lines, in a PUBLIC repository. Verified: two occurrences, no others anywhere under artifacts/. Those bytes are redacted. Everywhere else this module insists captured bytes are never edited, because editing a capture destroys what makes it evidence -- this is the one exception and it is not a judgement call: a live credential in public outranks byte fidelity. The file carries a header saying it was redacted, nothing else is altered, and BOTH digests are declared in the receipt (e7673b74... -> 90e6f289..., 1669 -> 1989 bytes) so the edit is auditable rather than a silent disagreement with a receipt written earlier. THE REDACTION DOES NOT UNDO THE PUBLICATION, and the receipt says so. The unredacted bytes reached a public PR branch, so the credential is DISCLOSED. It is the factory default on a routable BMC; rotating it is the operator-attended BmcSecure step and is not this lane's to perform. The producer defect that caused it is that every ad-hoc ipmitool call in this session passed -P on the command line -- the modelled route already uses -f with a password file, and the migration's producer must too. THE STRIP WAS INCOMPLETE AND I HAD REPORTED IT DONE. The .dag carrier was observation-only, but docs/probes/ still reconstructed the whole MegaRAC state machine from an UNCOMMITTED source.min.js, derived the readiness rule, and closed with a normative operating procedure. A probe record whose header claims every number is artifact-backed cannot carry a table whose source was never preserved. Both are gone; the measured attach transition stays, with no readiness conclusion drawn from it, and the closing section now states what the record does NOT prescribe. The artifact table's stale digest for the redacted file is corrected and the redaction disclosed there too. FAILURE MODES, per the dispositions given. (a) ACCEPTED and filed: control_plane_acknowledgement_minted_as_effect. An accepted command, a desired-state readback or an actuator acknowledgement cannot construct a terminal effect on the acted-upon subject. The Mt. Collins instance is the receipt: BootHandoffCompleted minted from selector-readback plus accepted power action, both of which genuinely held on every failed attempt while the host booted nothing. The repair is a split -- BootControlIssued from control-plane facts, the subject-level terminal requiring host-originating observation -- not a stronger check. (b) NOT a new identity. subject_and_its_digest_as_independent_parameters already owns it: its scope is a value beside a summary with no structural join, its recognition rule already says proximity to a correct thing is not correctness, and its fabric-M0 specimen already covers a correct digest beside a lying provenance stamp. Minting integrity_mistaken_for_provenance would fork an owned meaning. The four-days-wrong timestamp behind a correct digest is appended as a SPECIMEN of that row, with the sharp form of the lesson: a correct SHA-256 authenticates those bytes, not adjacent metadata about those bytes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Revert the redaction: admin/admin is a published upstream fact, not this unit's secret Operator ruling, and it is correct. I redacted `-P admin` from a committed capture after review called it a credential published to a public repo. That was wrong. admin/admin is not a secret belonging to this unit. It is AMI's published MegaRAC factory default, and this repository already models it as an upstream fact: extdeps.bmc.megarac megarac_factory_login carries username "admin" and published_password "admin" -- the field is NAMED published_password because the value is public, and its comment says so explicitly. The artifact disclosed nothing the corpus does not already state by design. So the redaction protected nothing and cost the one property that makes a capture evidence. The file is restored byte-for-byte, 1669 bytes, digest e7673b74a9361453440364334d9223706284dc25d66c9f5bde1230c2ec5720ad -- verified identical to the pre-redaction bytes, not merely similar. The receipt and the probe document now carry the RETENTION BASIS instead of a redaction notice, which is also what the review asked for as the alternative: evidence policy explicitly permitting the retained value. THE RULE THIS SETTLES, because the next reviewer will ask the same question: a credential in a capture is redactable only when it is a SECRET. A value the corpus already publishes as an upstream fact is not made secret by appearing in argv, and an artifact is not improved by editing it into disagreement with extdeps. WHAT IS STILL A REAL DEFECT, and it is the producer rather than the bytes: every ad-hoc call in this session passed -P on the command line while the modelled route already uses -f with a password file. That belongs in the producer and is not a reason to rewrite captures after the fact. AND WHAT WOULD CHANGE THE ANSWER, recorded so this is not read as licence: if this unit's credential is ever rotated off the published default, the rotated value IS a secret, must never reach argv, and any capture containing it is genuinely unpublishable. That is the BmcSecure step. I should have checked extdeps before editing evidence. The whole argument I had been making all session is that captured bytes are not editable, and I made an exception without first verifying that the exception was needed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * The redaction paragraph survived its own removal, and Outstanding was specifying someone else's design Two residues in the probe document, one found in review and one found looking for the second one they said was probably there. THE CONTRADICTION. The document carried BOTH the new retention basis -- admin/admin is a published upstream fact, redaction reverted, bytes restored -- AND, immediately below it, the tail of the old redaction paragraph still saying the occurrences "are replaced with a marker" and that the credential "must be treated as disclosed". Both cannot describe the committed artifact. THE CAUSE IS WORTH RECORDING because it is a trap in the edit, not in the judgement: the removal searched for the next `---` delimiter, and the paragraph being removed contained the literal `----ARGV`. The search matched INSIDE that token, truncated the deletion, and left an orphan that begins mid-sentence. A textual edit that looks for a structural delimiter in a document whose content contains that delimiter will cut in the wrong place, and the surviving fragment reads as prose rather than as damage, which is why it passed my own check afterwards. AND `Outstanding` WAS THE SECOND COUPLING. It enumerated the migration lane's DESIGN -- the shape of the boot-intent product, how the readback should refuse, which terminal splits into which, how the request body should be serialized, how legacy-on-aarch64 should be made unconstructible. That is the same defect as the decoder stripped from section 8, one section further down: a probe record that specifies another lane's carriers becomes a second authority for them the moment they land. Agreeing with the design does not make it mine to write down. Replaced with a pointer that says what this record contributes -- the measured boot flags, that the model reported completed throughout, the two failure modes, the controller observations -- and states that the conclusions drawn from that evidence belong in the migration's carriers where they can be consumed rather than read. The genuinely open questions stay: they are facts about state, not designs. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Strip decoded status semantics and generic credential policy from the unit receipt Review at cb5c1faa found residues that survived the earlier recut. The receipt asserted meanings for MegaRAC's `redirection_status` enum -- 1 as "Started", 100 as connect time -- decoded from `source.min.js`, which is not a committed artifact. The decoder was removed from the state machine for exactly that reason and then restated in prose beside it. The raw transition stays (mtcollins1_media_transition_observed); what a code MEANS is the status-code catalog's to say. The attempt-3 causal sentence is reduced to what the bytes establish: the failing reset happened at raw status 100, the succeeding boots at 1, and these artifacts do not establish that the difference caused the initrd failure. `mtcollins1_credential_retention_basis` stated reusable evidence-redaction policy ("redactable only when it is a SECRET") from a unit receipt, and was a prose-only String row with no importer anywhere in the corpus -- DESIGN 3c's dangling declaration and 4c's misplaced prose at once. The instance-specific basis survives as an annotation on the attempt it concerns; the general rule gets its own home if it earns one. Also cut the persistent/one-shot policy judgment from 7.1 and the generalized `image_redirection: 1` contract from 8, both of which prescribe for the boot-path migration, and the stale "remains the blocking objection" line, which the declared acquisition standing now answers. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Remove three probe residues the previous commit claimed to have removed Re-review at 4553c04 found the recut's three remaining leftovers, all in the probe. My verification grep missed them and I reported them cleared, which was wrong: "correctly held" wraps across a line break so a line-oriented pattern could not match it, and my patterns never covered "rule this settles" at all. - The header encoded a live review verdict ("draft, CHANGES_REQUESTED, correctly held") into a historical probe record. A probe should not carry a review's state; that state moves and the sentence rots in place. - Section 2 still promoted this instance into a general rule -- "redactable only when it is a SECRET" plus the future-rotation case -- which is reusable evidence-publication policy in a document whose own second line says it is not an authority. The instance basis survives; the rule does not. - Section 7.3 still wrote raw status 100 as "100 (connecting)" and hung a small-read/large-read mechanism off that decoding. Same unreceipted enum meaning the rest of the recut removed, and the same overreach: it now states the raw values and that no mechanism is established. Verified line-break-insensitively this time, over both carriers. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Carry the census quantities as std.measure values, not bare Int Review 63839 (dashboard-only) found the module applying carrier discipline selectively: it already imports std.measure and types chip_width as BitWidth, while every other quantity in the same file stayed a bare Int. Verified and correct -- each carrier it names already exists in dag/std/measure.dag, several authored for exactly these readings. mtcollins1_census_byte_count Int -> ByteSize mtcollins1_census_sol_byte_count Int -> ByteSize mtcollins1_host_capture_byte_count Int -> ByteSize MtCollins1MemoryWorkload.bytes_exercised Int -> ByteSize mtcollins1_nproc Int -> HardwareThreadCount mtcollins1_memtotal_kb Int -> Kibibyte mtcollins1_edac_uptime_at_capture_seconds Int -> Second MtCollins1SlotOccupancy.configured_mts Int -> MegatransfersPerSecond (16 rows) MegatransfersPerSecond's own comment names DDR MT/s as its case, and HardwareThreadCount sits on the Count axis for exactly an nproc reading. Bare Int re-mints quantity semantics std.measure already owns -- DESIGN section 2, net concepts must not grow by re-invention, and section 3, each fact lives in one place. memtotal keeps Kibibyte rather than normalizing: the kernel reported kB and the scale the reading was taken at is part of the reading. The witness reads through byte_size_count and hardware_thread_count_value. EXECUTED, not typechecked-and-assumed: built claim_executor and ran the witnesses lane locally. The corpus resolves and the claim fold evaluates; the only refusals are two self_host_logic wet witnesses that need a target/release/ gunbc this local run did not build, unrelated to this diff. Discriminating control: with nproc set to 161 the lane reports the_unit_presents_one_hundred_and_sixty_processors FAILED, and with 160 it does not -- so the assertion survived the carrier change live rather than going vacuous behind it. Note for the remote path: claim_executor refuses on BuildBuddy with HostBudgetUnreadable, because no cgroup memory limit binds the runner process. That is the fail-closed budget arm working as designed, not a defect here, but it means the lane cannot currently be executed by ctrl-build --remote. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Model the media transition, declare the digest frontier, drop the TODO rows Three reviews and an operator ruling, applied together. REVIEW 63839, second finding: mtcollins1_media_transition_observed packed a timestamped event sequence -- attach time, two raw controller fields, three offsets -- into one prose String. DESIGN section 2 calls a String leaf hiding named parts anemic modeling and section 4c puts an event in a typed carrier. It is now MtCollins1MediaRedirectionSample rows plus an attach timestamp. The status and index stay RAW and undecoded: what a value means is a megarac catalog keyed to firmware identity, not this receipt's to say. The witness folds them, and the checks are ones a String could not carry: that offsets strictly increase (a repeated or backwards offset is a transcription error, not a reading) and that the sequence actually CONTAINS a transition. If a later edit flattened these rows to one repeated status, the observation would have silently become a snapshot while still being cited as a transition. REVIEW 63839, third finding: the digests had no consumer. A digest's real consumer re-reads the bytes and compares, which is an effect; the witness is pure and the producer that would do it is what mtcollins1_acquisition_standing declares absent. So they are a DECLARED FRONTIER under section 3c, not a silent dangle -- and the witness folds the frontier rows themselves, refusing one that names no consumer or no trigger, because a frontier row with an empty trigger is a dangling declaration wearing a label. The trigger names a capability, per 4b(3): a capture producer sufficient for every artifact this module declares, not one verifier pointed at one file. OPERATOR RULING: the three modelling-obligation rows are gone. Nothing consumed them; a data row no fold reads is a prose TODO wearing a type, and giving a TODO a struct makes it look discharged while changing nothing. They are lanes now. REVIEW 63877: the probe hand-transcribed all five digests and the 16-row population table beside the rows that own them -- "digests verified at time of writing" being the rot admission in the header. Both tables cite the symbols now. This was one level up from the class this PR itself files at subject_and_its_digest_as_independent_parameters. AND THE PURCHASING CLAIM WAS WRONG TWICE. It first read "10 x 1Rx4 + 6 x 2Rx8", taking widths off the installed modules and presenting them as constraints on the ones to buy. Operator review caught that; I then corrected it to "width is unresolved, nothing closes it". OCP Mt. Jade Table 3 closes it -- same-channel x4/x8 mixing is No, and same-channel density too. So the first answer was right by accident and the second wrong by being cautious for the right reason; neither was DERIVED, which is why neither could be trusted. The probe records the sequence and cites extdeps.ocp.mt_jade rather than reprinting its cells. Recorded beside it: that table's different-channel row is Yes everywhere except RANK, which reads TBD -- and this unit mixes 1R and 2R across channels today. The specification declines to affirm the configuration the machine is already running. Escalated, because a ~320-module order premised on "different channels are fine" rests on the one cell that does not say so. NOT EXECUTED LOCALLY AT THIS EXACT HEAD, stated plainly: the run before this one parsed and passed the witness with no refusal, and the delta since is the obligation removal (no importers, verified by grep) plus markdown. A full floor run is a CI job, and mine was thrashing at the container memory cap, so CI adjudicates this head rather than my box. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Account for every declaration the census module adds Review 63909 found eleven data rows with no consumer and no frontier row -- DESIGN section 3c's dangling declaration. Verified whole-tree: outside the module, the witness imported ten symbols and nothing else read the rest. The fix splits two ways rather than labelling everything, because a frontier row is an admission and handing one to a row whose check was available all along is the label standing in for the work. CONSUMED BY EXECUTION -- three new checks, each discriminating: the clean-EDAC flag must AGREE with the counters it summarises and must have a non-zero observation window. A zero-counter reading taken at zero uptime says nothing; the window is part of the observation, so a flag that disagreed with either now goes red instead of sitting beside them. the capture windows must actually distinguish the two attempts. The attempt-label defect row claims the artifacts are told apart by wall-clock window rather than by the duplicated attempt=3 label -- this makes that claim checkable rather than merely stated, and it goes red if the windows ever collapse while the row goes on asserting them. the one-of-sixteen discriminator must still exist. The whole connector identification rests on a part occurring EXACTLY ONCE agreeing with the pair table at the single position carrying it, which no shift or reversal of the sequence reproduces. If a later edit duplicated that part the argument collapses while its prose keeps claiming it, so the property is asserted against the rows and the upstream citation is bound rather than left prose. DECLARED FRONTIER -- rows whose consumer is an effect a pure witness cannot perform, each with a capability trigger: the artifact identity rows grouped together (path, byte count, digest, kernel -- a digest authenticates bytes and says nothing about WHICH file or HOW MANY bytes were expected); the boot delivery observation and attempt-3 failure, whose consumer is gunbc#11001; memtotal_kb, whose capacity join needs a catalog row for every installed part, one of which was missing and is in flight as gunbc#11066; and the EDAC channel map reason, which resolves against the Linux carrier in gunbc#11071. DELETED: mtcollins1_media_redirection_held_through_boot. An unconsumed Bool restating what the final sample already carries is one more dangling row. AND THE FRONTIER TEST CAUGHT ITSELF. It asserted the list had exactly four entries; the frontier grew to fourteen and it failed for no reason but a stale number. The literal is gone rather than bumped -- DESIGN section 5 names that shape, a merge-blocking test comparing a live population to a literal measured from the same tree, which collapses to measure() == measure() the moment you automate the update. What is load-bearing is that every row EARNS its admission, a property of the rows and not of how many there are. EXECUTED: the local witnesses lane ran this module and reported exactly one failure, that stale count; the other four new tests passed and the log names only failures. The delta since is `== 4` becoming `> 0` on an Int in a function that had already compiled and run, so CI adjudicates this head rather than another thirty-minute local floor run at the container memory cap. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Consume the Ampere authority instead of hand-writing its mapping Review 63939, and it found the most serious defect in this PR. THE MODULE CLAIMED TO CONSUME extdeps.ampere.mt_collins_product_brief.memory_population AND IMPORTED NOTHING FROM IT. The "consume" was a DeclarationRef carrying the module path as a string. Meanwhile every firmware binding hand-wrote a `connector` for its (processor_socket, memory_controller) -- which is exactly connector_used_at_one_dpc on mt_collins_channel_population_roles, a mapping that authority already DERIVES from the guide's pair and population tables rather than transcribing. A second copy of one fact, beside its authority and free to drift (DESIGN section 3, section 2). This module's own basis row says the J-number "is a join, not a reading". Hand-writing the result of that join was the error the sentence describes. THE CONNECTOR COLUMN IS GONE. Firmware DRAM training reports socket, controller and slot-within-channel; SMBIOS reports a locator. Neither reports a J-number. The census now carries only what was observed, and the join to a connector happens where it can be checked. AND THE CHECK THAT WAS SUPPOSED TO BE DISCRIMINATING WAS COMPARING STRINGS. The previous test asserted the basis's DeclarationRef carried the expected module_path and decl_name spellings. That proves a sentence names the right authority and stays green while the mapping it describes drifts arbitrarily -- DESIGN section 5's specification-without-execution wearing a struct. I wrote it one commit earlier AS the fix for a dangling-declaration finding, which is exactly how this shape survives: it looks like a check. The witness now folds the upstream rows. It counts (role, slot) pairs where the role covers the observed channel and the slot sits at the connector that role assigns, and requires exactly one -- asserting three cardinalities at once: the authority covers this channel exactly once, and one SMBIOS slot carries the module firmware reported there. Delete the import and the file stops compiling, which is the difference between consuming an authority and citing one. The string comparison survives only as an explicitly labelled coherence guard, carrying a note saying what it is not. NO SENTINEL, after two attempts at one. Folding the roles down to a connector needed an "unresolved" value, and Nat has no value outside J1..J32 to reserve; an Int sentinel failed to typecheck against the Nat field, and 0 would have been a value a later reader could mistake for an answer. The pair fold has no hole: an uncovered channel contributes no pair, so its count is zero and the test refuses, with nothing standing for absence. FILED, as DESIGN section 4b requires of a newly discovered class: upstream_non_affirmation_consumed_as_permission. An upstream that answers over a richer vocabulary than yes/no -- OCP Mt. Jade Table 3 answers Yes / No / Not Preferred / TBD -- consumed into a Bool carrier makes every non-prohibition read as permission. Its receipt is this lane: the different-channel row is TBD on rank mixing, this unit mixes 1R and 2R across channels, and a proposed derivation would have emitted that as a fill REQUIREMENT with nothing carrying the decline. The machine's own clean EDAC is the corroborating trap -- evidence that this specimen executes, not that the authority affirms it. EXECUTED: witnesses lane run locally. The corpus compiles, the census module is judged, and no census test fails. The two remaining refusals are the self_host_logic wet witnesses needing binaries this run did not build, and a namespace-wave-admission stale-admission count that is an artifact of a local run against a moved base -- CI has adjudicated that phase green on every pushed head of this branch. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Resolve the unit's observations against the authorities that now exist #11066 and #11068 merged, so the receipt stops naming gaps and consumes them. Review 63974 asked for exactly this, plus review 63987's stale-citation fix. CATALOG RESOLUTION, WHICH CLOSES A HOLE THE CROSS-JOIN LEFT OPEN. The firmware vs SMBIOS join proves two LOCAL transcriptions agree; edit the same part number in both lists and it stays green. Now every observed module must resolve to exactly one SK hynix catalog row whose rank and chip width equal what firmware reported, and the population is asserted by catalog IDENTITY -- ten AFR4N, five AFR8N, one CJR8N, summing to sixteen. A substitution now has to survive contact with the manufacturer's own datasheet figures. THE FILL CONSEQUENCE IS DERIVED FROM THE SPECIFICATION, NOT READ OFF THE SAMPLE. Each empty partner's rank, width and density are fixed by its channel peer BECAUSE OCP Mt. Jade prints same-channel rank, x4/x8 and density mixing as NotSupported. If a later revision relaxed a cell, the test goes red and the requirement stops being determined -- rather than a stale requirement quietly surviving the rule that justified it. THE FOUR STATES ARE CARRIED WHOLE, not collapsed to a Bool on the way through. mtcollins1_cross_channel_rank_mixing_standing records that the specification answers MixingUndetermined -- its TBD -- for the cross-channel rank mixing THIS UNIT ALREADY RUNS, and a control asserts it is still undetermined so a later revision resolving that cell goes red instead of being absorbed. That is the class filed at upstream_non_affirmation_consumed_as_permission. STALE CLAIMS CORRECTED: the receipt no longer says CJR8N is uncatalogued or the rank rule unmodelled, and review 63987 caught an annotation naming the_observed_channels_carry_the_connectors_ampere_assigns_them -- a symbol I renamed during the sentinel restructure, in the one comment whose job is to stop the weak check being mistaken for the strong one. It now names both real folds. I swept every long identifier in both files' comments against the declarations; no other citation is stale. FLEET CONCLUSIONS NARROWED TO UNIT SCOPE. This document may establish this machine's population and the compatibility consequences that follow from cited rules. It may not establish a twenty-unit roster, a ~320-module order, or a fleet-wide DDR rate for machines nobody has looked at. The reasoning was sound at unit scope and the scope was wrong, so it is narrowed rather than deleted. WHAT I COULD NOT EXECUTE LOCALLY, STATED PLAINLY BECAUSE IT CHANGES WHAT THIS COMMIT'S EVIDENCE IS WORTH. The module parses, typechecks and is judged, and two parse defects were found and fixed by running it -- a `data =` followed by a newline before `match`, and comma-separated match arms this language does not use. But the floor refuses before the claim-evaluation-fold on three modules this branch does not touch (vacuity_consumer_witness_long_test, fleet_posix_accounts, lens/enforcement/contract, all "missing required field"), so NO claim in this corpus evaluates locally, mine included. I proved that rather than assuming it: I broke the catalog-identity assertion to 11 and it did NOT go red, which is the signal that the check never ran. An earlier message in this session reported those tests green on the strength of no failure being NAMED -- that was wrong, and a module that never reaches the fold produces exactly the same silence as one that passes. CI reaches the fold and has been green on every pushed head of this branch, so CI is the executing evidence for these assertions, not my box. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Type the prose rows out of the receipt, and fix a real call-shape defect Review 64056, three findings, all the same class and all correct -- they cite this module's own argument against itself, since it deletes three rows one screen below for exactly this reason. mtcollins1_edac_channel_map_unavailable_reason: a six-hundred-character English paragraph in a String that no fold read, whose own frontier row conceded its home was elsewhere. DELETED. The rationale stays in the // channel, the typed readings it described were always carried separately by mtcollins1_edac_topology, and the mechanism lands as extdeps.linux.edac in gunbc#11071. Its frontier entry went with it -- a frontier naming a declaration that no longer exists is a stale citation, not an admission. mtcollins1_host_capture_attempt_label_defect: same shape, and its only consumer asserted the sentence was non-empty. That is DESIGN section 3c's own listed tell -- a witness that asserts a declaration exists rather than exercising it -- and I wrote it while addressing a dangling-declaration finding. DELETED, with the vacuous conjunct. The checkable content survives where it was already executed: the two captures carry different digests and different timestamps, and the_capture_windows_actually_distinguish_the_attempts asserts the ordering that makes the wall-clock window a real discriminator. MtCollins1BootDeliveryObservation: NOT deleted, because it records a real control, but its four prose fields were two observations and two CLAIMS written as paragraphs. The axes are typed now -- valid flag, EFI-versus-legacy on the failing and succeeding attempts, persistence held constant, model-reported- completed -- and two folds read them: one asserts the experiment had exactly one varied term, so flattening the two boot-type readings kills the control instead of leaving the prose standing; the other records that the model called every failed attempt complete, and is a control that SHOULD flip when gunbc#11001 lands. The device selector stays an exact quotation of the ipmitool rendering, which is evidence rather than commentary, and the SELECTION is deliberately not typed here because that carrier lands in #11001 and a second one would be the section 3 fork. AND A REAL DEFECT CI CAUGHT THAT I HAD NOT: bit_width_count takes `b`, and I called it with `w`, four times, in the catalog-agreement fold added by the previous commit. floor_class=structural, not infra -- my diff, my defect. Fixed, and I audited every other std.measure call site in the file against its declaration: byte_size_count(b:), second_count(s:), hardware_thread_count_value(t:) are all correct. That defect is the concrete cost of the gap reported in the previous commit: the local floor refuses before the claim fold on three modules this branch does not touch, so a call-shape error in a witness reaches CI before it reaches me. CI is the executing authority here and it did its job. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Derive the EDAC absence from the Linux authority now that it exists gunbc#11071 merged, so review 63974's deferred item comes due: the receipt stops describing the GHES/APEI mechanism and consumes extdeps.linux.edac. The observation contributes exactly one fact -- mtcollins1_edac_topology now carries driver_binding: GhesEdac, a typed binding rather than only the string /sys rendered -- and the authority supplies what follows. The string spelling stays beside it because a reader resolving this receipt against the committed capture needs the bytes they will actually find there. WHAT THAT BUYS, AND IT IS THE POINT RATHER THAN TIDINESS. This module used to assert in a String row that re-booting would not produce a channel map. That sentence was true and unfalsifiable where it sat. It is now DERIVED: edac_channel_topology_availability(GhesEdac) yields ChannelTopologyAbsent with cause FirmwareFirstErrorAttributionShim, whose absence standing is AbsentOnEveryBoot. The distinction between "no channel map here" and "no channel map, and another boot will not change that" is what justified recovering the map from firmware DRAM training instead -- so the justification for this census's central method is now a consequence of a cited kernel authority rather than of my confidence. A second fold requires the MEASURED tree to agree with what the authority predicts: zero csrow nodes is the EXPECTED reading under the shim, not an anomaly, and sixteen DIMM nodes is what it mirrors from SMBIOS Type 17. A future capture on this platform finding a populated csrow tree would put observation and authority in conflict and turn this red, which is the only way either of them gets to be wrong out loud. Call shapes checked against the declarations before pushing this time -- edac_channel_topology_availability(binding:) and edac_channel_topology_absence_standing(cause:) -- which is the check that would have caught the bit_width_count defect CI found in the previous commit. Also merges origin/main, which carries #11071's move of LinuxKernelRelease into extdeps.linux.kernel. Landing after that PR was the ordering deep-raven-831 and I agreed on, so the brand is authored in my base rather than met at the button. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Inhabit HostMemoryPopulation, and stop the receipt contradicting itself Review 64092, three findings, all correct. A FALSE FRONTIER. mtcollins1_memtotal_kb carried a declared frontier saying its capacity join needed a catalog row for every installed part and that CJR8N "had none", naming gunbc#11066 as in flight. That row is on main and this PR's own witness joins all three catalog identities. A frontier inventing an absent authority while the same change proves it present is a false wall -- DESIGN section 3c admits a frontier only with a trigger, and section 5 forbids fabricated plausible output. Removed, and DISCHARGED: the join it named is now written. THE SAME CONTRADICTION AS PROSE. One section derived same-channel rank, width and density from mt_jade_mixed_dimm_support; the next still asserted the OCP rule was "carried by no authority in this corpus" and that "chip width is not closed at all". Both were true when written and false once gunbc#11068 landed. A receipt that consumes a rule and denies it exists is a meaning fork. The paragraph now records what the authority settles, and says plainly how the contradiction got there: the model was fixed in layers and the prose around the edit was not re-read. The probe carried the same stale sentence and is corrected in the past tense rather than deleted, because the distinction it drew -- between what a machine HAS and what it NEEDS -- is the reason the census was worth doing. HostMemoryPopulation IS NOW INHABITED, which is what this census was for. mtcollins1 could not use the carrier every other fleet host uses while one of its three installed parts had no catalog row to point at. It now carries ten AFR4N, five AFR8N and one CJR8N as MemoryPopulationRows joined to catalog identities rather than to part-number spellings. AND THE CAPACITY JOIN THE FRONTIER NAMED IS THE CONSUMER. It respects the split gunbc.fleet.fleet_intent warns about rather than papering over it: the population states what is INSTALLED, MemTotal states what the kernel finds USABLE after reservations, and they are different facts. So the test asserts the RELATIONSHIP -- usable strictly below nominal, and within a few percent of it -- never equality. Measured here: 249.95 GiB usable against 256 GiB nominal, 97.64 percent. A population claiming eight sticks would put usable ABOVE nominal and go red; one far below would mean sticks are installed the firmware is not presenting. Both are real failure shapes for a census that decides a purchase. Call shapes checked against their declarations before pushing (host_memory_population_nominal_bytes(pop:), kibibyte_to_byte_size(k:)), and the arithmetic was evaluated rather than assumed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Preregister the spare-module screen; carry the Mt. Jade outcome whole TWO CHANGES IN ONE COMMIT, and the message says so because an earlier draft of it described only the first while `git add -A` had swept in the second. A commit message that does not describe its own contents is the same defect as a receipt that does not describe its own artifact. 1. THE PREREGISTERED PREDICTION, committed before the operator touches the hardware. Tonight's 32-DIMM adversarial test was predicted in conversation only, with no immutable pre-outcome receipt; proud-otter-590 correctly refused to let a row authored afterwards be called preregistration. This is the first one done properly -- configuration, basis, falsifier, and what each outcome earns. It also states the test's weakness in advance: sixteen modules change at once, so a failure localizes to nothing. A screen, not a diagnosis. 2. REVIEW 64125 -- THE MT. JADE LOOKUP OUTCOME IS NO LONGER COLLAPSED. This module is extdeps.ocp.mt_jade.memory_mixing's FIRST consumer and it performed exactly the substitution that module was built to prevent: mtcollins1_mixing_verdict mapped MixedDimmSupportUnmodelled and MixedDimmSupportAmbiguous onto MixingUndetermined. The upstream made its lookup total-with-refusal to stop that, and says in its own annotation that a manufactured MixingUndetermined is the worst of the three substitutions available -- the table really does print TBD, so a fabricated one is indistinguishable from a cited one. The harm was concrete. mtcollins1_cross_channel_rank_mixing_standing records the specification declining to affirm the cross-channel rank mix this unit runs, and its witness is a control documented as one that SHOULD flip. Collapsed, it could not flip: a row gone MISSING or turned AMBIGUOUS would arrive as MixingUndetermined and the test would stay green while its subject had disappeared. One spelling carrying both "the specification declines to state" and "this corpus has no row" is section 3's meaning fork and section 5's widening failure arm. Fixed by not folding. The outcome is carried whole; the witness handles the refusal arms as distinct constructors; the control now requires the lookup to RESOLVE and read MixingUndetermined, so a missing or duplicated row turns it red. It is also the class I filed today, one turn further in: upstream_non_affirmation_consumed_as_permission covers a non-affirmation read as permission, and here an ABSENCE was read as a non-affirmation. I wrote the row warning about the pattern and committed its next variant within hours. EXECUTED: parses and typechecks with no .dag errors; the only local failures are the self_host_logic wet witnesses needing binaries this run did not build. Claim evaluation does not happen locally on this checkout, so CI remains the executing authority for the assertions. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Pre-OS bring-up: collectors are a constructor input to actuation, console silence is not a terminal, an opaque OEM code stays opaque Model the pre-OS half of memory-reconfiguration admission as typed carriers with an executed regression corpus from Mt. Collins unit 1's 32-DIMM restart loop (2026-09-11). - extdeps.bmc.ipmi_sel: IPMI v2.0 §32 record types and the two §42.2 sensor offsets a bring-up reader consumes; OEM payloads carried as rendered bytes. - machine_intake_pre_os_observation_capabilities: per-platform profile of what can be seen before an OS; managed AC carries no outlet. - machine_intake_pre_os_bringup_attempt: sealed CollectorsReady with one refusing producer; PowerActuationRequest constructible only from it; four actuation kinds, AcPowerCycle a human-attended barrier; PowerActuationIssued is control-plane only (cites control_plane_acknowledgement_minted_as_effect); the effectful issuer is a declared frontier. - machine_intake_pre_os_bringup_verdict: stable terminal from standard SEL records only; PhysicalRemediationRequired { UnavailableFromExposedTelemetry } refuses further actuation; console reading typed by digest; OEM record as three facts with no fold to the verdict. - machine_intake_mtcollins1_32dimm_bringup_observation: the digest-bound corpus (SEL 0x3ea..0x44f, four byte-identical SOL captures, the web log's uniform `unknown`, the readiness fixture from 10-ac-meta.txt) and four checks. - 16 witnesses in test.claim.machine_intake.pre_os_bringup_witness_test, run green on BuildBuddy via claim_batch. - Two failure-mode rows filed, one receipt appended to absent_reads_identically_to_never_looked. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HsYhty7z6f8KmVwreNbCGE * Preregister round 1 of the spare bisection: the 2DRx4 group Twelve known-good originals plus the four 2DRx4 spares -- the group whose part notation this corpus cannot identify. Prediction: FAILS. Confidence stated as low, because it is a guess among three roughly equal candidates and being wrong should cost something. Carries forward the standing disjunction proud-otter-590 insisted on: the prior falsification established that shape alone is not sufficient, NOT that supported shape is necessary, and NOT that a module is faulty rather than a combination untolerated. No round may name a bad module until one is isolated AND reproduces alone -- which matters physically, since the wrong framing gets a good stick binned. Records the operator's srvN prior for the 1Rx4 group as held-but-untested rather than assumed, so a later round falsifying it displaces something visible. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Preregister round 2: swap the 2DRx4 group to socket 0 Round 1 put the four 2DRx4 modules entirely in socket 1 and the OEM payload came back 0fde703b1102 -- the first 3b of the session against nineteen 33s. Under the candidate schema that is the socket bit, and it tracked a variable we controlled. This round exchanges the sides. The prediction is a CONJUNCTION -- that it fails, and that the payload reports 33 -- so both halves can fail independently, which is the point. A 3b result would falsify the module-following reading; a clean train would mean an interaction neither simple reading captures. States plainly what no outcome earns: four modules move together, so nothing here names one, and a module untolerated by this platform is indistinguishable from a broken one. The schema stays a hypothesis and may not name a DIMM. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Score the socket-swap prediction: matched, and record what it did not earn Prediction cd83f731921 matched on both halves -- it failed, and the payload reported 33 rather than 3b, so the socket field followed the quartet. But the decision table I wrote for it was too strong and this file says so: a configuration restriction violated wherever that quartet sits predicts the same outcome as a defective member, so the crossover separates neither. The companions changed too, so the round did not isolate the socket at all -- the experimental unit for that comparison is the complete eight-module population. Eliminates the best alternative hypothesis: all modules are 16 GB, so Ampere's per-socket equal-capacity rule is satisfied and explains none of the failures. Retracts two narration errors: 0 W memory power does not distinguish early failure from timeout, and the three-outcome table was neither exhaustive nor equiprobable. Records what the decoder earned -- two controlled confirmations of ONE field -- and that stage, status and tail have no such support and may not name a DIMM. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * The restart bound counts the trailing run since the last progress, so an early good boot cannot outvote a sustained failure sequence (review 64164) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HsYhty7z6f8KmVwreNbCGE * Record what six configurations eliminated, and two retractions Written so the next session does not re-derive tonight's eliminations. Carries the seven tested populations with outcomes, what each ruled out, and the three hypotheses still standing. Two retractions recorded rather than quietly dropped: DDR4-2133 being unsupported on Altra (srv1/3/4 run 2133 Samsung parts and POST cleanly, so the SoC supports it), and any speed conclusion drawn from the eBay listing, which says 2Rx4 where the label says 2DRx4 -- a source wrong about one field is not evidence about a neighbouring one. Also carries the srv2 precedent: identical Samsung parts trained on three hosts and failed training on the fourth. Same class a…
Mt. Collins unit 1 booted a Linux that ran on the machine; its memory census is committed as bytes and this receipt states nothing the artifacts do not contain.
What the brief asked for, and what changed
The brief's item 3 — "capture the EDAC csrow/channel tree, THE ONE THAT MATTERS" — is not obtainable on this platform, and establishing that with its mechanism is the load-bearing result.
dmesgcarriesGHES: APEI firmware first mode is enabled by APEI bit. Under ACPI APEI firmware-first the firmware handles memory errors and hands the OS finished records; the OS never enumerates the controller.ghes_edactherefore registers one synthetic controller and mirrors the SMBIOS Type 17 list so a GHES record has a DIMM to name. It is an error-reporting shim, not a topology driver.find /sys/devices/system/edacreturns no path containingcsrow— a counted reading over an enumerated tree, not an inference from a driver name. No re-boot changes this, so the reason is recorded beside the negative rather than left as an open errand.Where the channel fact actually lives
The Altra boot firmware prints its DRAM training result before any OS exists, naming socket, memory controller and slot-within-channel — strictly richer than a csrow tree. All sixteen modules sit at
S0, so the unit is uniformly 1DPC and the sixteen empty connectors are each channel'sS1.The connector join, and what discriminates it
Neither reading prints a J-number, so the connector field is declared as a join, not a reading. Three checks, the first sharp:
HMA82GR7CJR8N-VKoccurs exactly once in the machine. Firmware puts it atSK0 MC5; SMBIOS atDIMM 11; the Getting Started Guide's pair table puts MCU5's 1DPC member at J11. No shift or reversal of the sequence reproduces that.Rankcolumn reproduces the firmware's 1R/2R sequence position-for-position — a second field, read by a different agent from a different table.The upstream pair table is consumed from
extdeps.ampere.mt_collins_product_brief.memory_population, never re-transcribed.Not claimed: that the board silkscreen reads J11 there. Nobody looked at the board; that is a photograph, not a software reading.
Exit-clause readings
nprocEDAC clean is recorded as clean at capture, on a host up ~20s. The memtest pass is the endurance evidence; this is the structural one. Claiming more would be the rung inflation DESIGN §4b(1) names.
Capture discipline
Two artifacts, one boot, and that they are one boot is established rather than asserted: the SOL transcript carries the census file's own sha256, printed to the console by the script that produced it, and it equals the committed file's digest. The host computed that digest before the bytes crossed the network and the receiver recomputed it after writing — so the transfer is not a trusted step.
Deliberately not satisfied here
HMA82GR7CJR8N-VKhas no catalog row, which blocks aHostMemoryPopulationfor this unit. Minting one from our own boot log would render a local report as an upstream fact (§3), so the obligation is named and left forextdeps.memory.sk_hynix.extdeps.ocp.mt_jade, so the per-connector fill requirement is not authored as though it were derived.Consumption
The witness test consumes the rows so they are not dangling (§3c), and its main check is adversarial: firmware and SMBIOS are independent readings, so if either transcription drifts the part or rank at some connector stops agreeing and it goes red. The EDAC probe is enrolled as a control that is supposed to fail the day a native Altra driver exposes a real topology.
🤖 Generated with Claude Code