Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
02ef008
Model firmware targets, boot diagnostics, and memory part selection
Aug 12, 2026
4ce9d10
Fix import placement, ground firmware/price units on std.measure
Aug 12, 2026
1414f81
Annotate observed_failures with its type
Aug 12, 2026
6b93208
Ground the obmc push artifact byte count on ByteSize
Aug 12, 2026
8c2749e
Derive the BMC Redfish surface from firmware instead of storing it pe…
Aug 12, 2026
053b642
Move source annotations to module-item grain
Aug 12, 2026
62fc8b1
Merge annotation-grain fix
Aug 12, 2026
e1bc9da
Carry the firmware prerequisite's evidence as data, not prose
Aug 12, 2026
97669f6
Execute the prerequisite gate and the loop-cause fold
Aug 12, 2026
61e6153
Merge witness coverage
Aug 12, 2026
7829ac8
Keep observations immutable; split inventory from image; refuse dupli…
Aug 12, 2026
c6383d5
Grade the memory refusal by evidence and scope it to the board
Aug 12, 2026
3f65687
Merge memory-selection recut
Aug 12, 2026
fb4aadf
Carry the supervisor interval on Second, not bare Nat
Aug 12, 2026
7a0516a
Merge interval carrier fix
Aug 12, 2026
edf0eb8
Stop fabricating evidence bounds; add the two missing witness imports
Aug 12, 2026
ce9d230
Declare ExternalModelScope on the new extdeps modules; fix optional i…
Aug 12, 2026
88d0356
Restore the deleted contradiction fn; rebind drift fixtures to 2.07.00
Aug 12, 2026
42e44ce
Join the prerequisite oracle to the catalog instead of copying it
Aug 12, 2026
fa289c6
Declare ExternalModelScope on the new extdeps modules; fix optional i…
Aug 12, 2026
6530e44
Merge scope-gate fix from parent branch
Aug 12, 2026
f112272
Merge main into session/quiet-badger-563
Aug 12, 2026
a034041
Merge parent branch (including main)
Aug 12, 2026
7a75586
Drop two dead surface imports from the live-receipts witness
Aug 12, 2026
8c7335a
Make population admission true multiset equality
Aug 12, 2026
d7722ac
Merge multiset admission fix
Aug 12, 2026
3da7e58
Flatten the multiset comparison onto one line
Aug 12, 2026
c52fd06
Merge parse fix
Aug 12, 2026
3799d4f
Stop conflating admitted with undominated in the frontier witness
Aug 12, 2026
7867d74
Merge frontier witness fix
Aug 12, 2026
48e48b3
Take the money carrier at the helper's parameter, not inside it
Aug 12, 2026
06988d4
Merge money-carrier parameter fix
Aug 12, 2026
cfe597e
Import Present/Absent explicitly in host_boot_supervision
Aug 12, 2026
da47848
Merge explicit optional import
Aug 12, 2026
c8cb810
Merge main after #8171 squash-merge
Aug 12, 2026
51cc0cf
Fix the parse error CI found, and make the order control discriminating
Aug 12, 2026
b28b73c
Reclassify srv3's install path as unestablished, not refused-forever
Aug 13, 2026
ab627dd
Bisect the annotation gate: strip this branch's new comment blocks
Aug 13, 2026
50a5e67
Revert "Bisect the annotation gate: strip this branch's new comment b…
Aug 13, 2026
d3c3b2d
Join the prerequisite bounds oracle to its rows instead of transcribi…
Aug 13, 2026
cc69a4f
Take the singleton directly instead of folding a fabricated init over it
Aug 13, 2026
06fc580
Merge origin/main into surface-derivation
Aug 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions dag/extdeps/bmc/types.dag
Original file line number Diff line number Diff line change
Expand Up @@ -177,11 +177,7 @@ fn bmc_redfish_surface_for(
if count == 0 {
SurfaceShapeUncatalogued { firmware: firmware }
} else if count == 1 {
fold(
matches,
init: SurfaceShapeUncatalogued { firmware: firmware },
f: (acc, row) => SurfaceShapeKnown { shape: row.shape },
)
SurfaceShapeKnown { shape: matches.first().shape }
} else {
SurfaceShapeAmbiguous { firmware: firmware, matches: count }
}
Expand Down
50 changes: 38 additions & 12 deletions dag/test/claim/firmware_prerequisite_evidence_witness_test.dag
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import extdeps.boards.types { AsrockRackAltrad8ud1l2t }
import extdeps.firmware.types {
BmcController,
FirmwarePrerequisiteObservation,
FirmwareSemanticVersion,
HostBios,
NoFirmwarePrerequisite,
OpenBmcWebUiTar,
Expand Down Expand Up @@ -64,9 +65,13 @@ data reversed_evidence: List<FirmwarePrerequisiteObservation> = [
// asserting otherwise is what made it look already checked. The minimum now
// comes from the release row itself, so editing the catalog moves the tests.
//
// The RED controls below deliberately do NOT join: a falsifying probe is an
// authored input chosen to contradict the evidence, not an oracle, and joining
// it to the catalog would make it unauthorable.
// The two halves of a RED control are governed differently, and conflating them
// is what an earlier revision of this note did. Its falsifying INPUT -- the
// minimum deliberately set above or below the evidence -- stays authored, because
// a probe chosen to contradict the catalog would be unauthorable if joined to it.
// Its EXPECTED value is an oracle like any other and joins to the row that
// supplies it, so a control asserting which version was refused reads that from
// the refusal row rather than transcribing it.
fn verdict_against_declared_minimum(
observations: List<FirmwarePrerequisiteObservation>,
) -> PrerequisiteEvidenceVerdict {
Expand All @@ -77,10 +82,26 @@ fn verdict_against_declared_minimum(
}
}

// The bounds the EXECUTED pair establishes: refused at 2.07.00, accepted at
// 3.22.00. Held once and applied to several orderings below, so an ordering
// that answered differently could not be papered over by a second copy of the
// expected numbers.
fn same_firmware_version(a: FirmwareSemanticVersion, b: FirmwareSemanticVersion) -> Bool {
a.major == b.major && a.minor == b.minor && a.patch == b.patch
}

// The bounds the EXECUTED pair establishes, JOINED to the observation rows that
// establish them rather than transcribed. Held once and applied to several
// orderings below, so an ordering that answered differently could not be papered
// over by a second copy of the expected numbers.
//
// The join is the point, not a stylistic preference (DESIGN §5 test-oracle rule,
// and the same pattern this file already uses for the declared minimum): written
// as literals, `2/7` and `3/22` were a second copy of two numbers whose single
// authority is the gating_version on each row. Re-flashing at a different version
// would move the rows and leave this witness green until someone remembered to
// edit it -- exactly the failure this PR removes from the minimum path. Caught in
// review 51524.
//
// Joining does NOT weaken the discrimination, which is what makes it safe here:
// both orderings below carry a THIRD, lower refusal at 1.00.00, so a first-wins
// fold reports that instead of the refused row's own 2.07.00 and still fails.
fn bounds_are_the_executed_pair(
observations: List<FirmwarePrerequisiteObservation>,
) -> Bool {
Expand All @@ -90,7 +111,8 @@ fn bounds_are_the_executed_pair(
Present { value: rv } =>
match a {
Present { value: av } =>
rv.major == 2 && rv.minor == 7 && av.major == 3 && av.minor == 22
same_firmware_version(a: rv, b: asrock_altrad8ud_bios_310_push_refused_at_bmc_207.gating_version)
&& same_firmware_version(a: av, b: asrock_altrad8ud_bios_310_push_accepted_at_bmc_322.gating_version)
Absent => false
}
Absent => false
Expand Down Expand Up @@ -119,7 +141,10 @@ test fn the_bounds_do_not_depend_on_authoring_order() -> Bool {

// A bound with no observation behind it is ABSENT, never filled in from the
// declared minimum. Acceptance-only evidence has no refusal to report, and
// reporting one would fabricate a push that never happened.
// reporting one would fabricate a push that never happened. The acceptance bound
// is joined to the single row supplied as evidence, so the claim is that the fold
// REPORTS that row's own gating_version -- not that it happens to match a number
// transcribed here (review 51524).
test fn an_acceptance_only_history_reports_no_refusal_bound() -> Bool {
match verdict_against_declared_minimum(
observations: [asrock_altrad8ud_bios_310_push_accepted_at_bmc_322],
Expand All @@ -128,7 +153,8 @@ test fn an_acceptance_only_history_reports_no_refusal_bound() -> Bool {
match r {
Absent =>
match a {
Present { value: av } => av.major == 3 && av.minor == 22
Present { value: av } =>
same_firmware_version(a: av, b: asrock_altrad8ud_bios_310_push_accepted_at_bmc_322.gating_version)
Absent => false
}
Present { value: _ } => false
Expand All @@ -146,7 +172,7 @@ test fn a_minimum_above_the_accepting_version_is_contradicted() -> Bool {
observations: asrock_altrad8ud_bios_openbmc_prerequisite_evidence,
) {
PrerequisiteContradictedByAcceptanceBelowMinimum { accepted_at: a } =>
a.major == 3 && a.minor == 22
same_firmware_version(a: a, b: asrock_altrad8ud_bios_310_push_accepted_at_bmc_322.gating_version)
_ => false
}
}
Expand All @@ -161,7 +187,7 @@ test fn a_minimum_at_or_below_the_refusing_version_is_contradicted() -> Bool {
observations: asrock_altrad8ud_bios_openbmc_prerequisite_evidence,
) {
PrerequisiteContradictedByRefusalAtOrAboveMinimum { refused_at: r } =>
r.major == 2 && r.minor == 7
same_firmware_version(a: r, b: asrock_altrad8ud_bios_310_push_refused_at_bmc_207.gating_version)
_ => false
}
}
Expand Down
Loading