Repository navigation
openbmc_fan_control: match every first() instead of unwrapping behind a length guard (nine sites #11720's wall now refuses) - #11834
gunbai-bot[bot] wants to merge 2 commits into
Conversation
… a length guard (nine sites #11720's wall now refuses) The fleet-lane floor on #11744 excluded dag/extdeps/bmc/openbmc_fan_control.dag (modules_excluded=1): nine direct-call arguments took a List.first() (Optional) where a required String/Int/OpenBmcFanConfigQuery is declared, each behind a length guard that stood in for the qualification. On main since #10929 (2026-09-10); outside every gate closure until #11744 reached it. Every site now matches the Optional and routes Absent to the function's existing typed refusal; the five-scalar stepwise controller reads through a typed OpenBmcFiveScalars carrier built once. The two OpenBmcCollectionOne { value: values.first() } record-field sites (a position the wall does not judge yet) are matched the same way. Narrow compile: 9 blocking -> 0; witness controls bmc_fan_converge 12/12, bmc_typed_operations 29/29 PASS. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…siusDelta (wrapped at destructure); the monomorphic collection copy is deleted for the generic Review 69070: OpenBmcFiveScalars named duty percentages and temperature deltas as bare Int while std.measure's carriers were consumed two lines later (unit-modeling); openbmc_fan_controller_collection was a character-for-character copy of openbmc_collection_from_values<T> that this PR had edited in parallel (§3 fork). The carrier is now OpenBmcStepwiseScalars over Percent / CelsiusDelta built once at destructure; the specialised collection fn is deleted and its single call site uses the generic. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Review 69070 (both findings) fixed in 68fe101: carrier over Percent/CelsiusDelta wrapped at destructure; the monomorphic collection copy deleted, call site uses the generic. Narrow compile 0 blocking; bmc_typed_operations 29/29 PASS. Named follow-up, not this PR: running bmc_fan_converge_witness_test's closure surfaces three more sites of the same class in modules this PR does not touch — dag/gunbc/bmc/bmc_fan_monitor.dag:63:27 and :80:37 (an Optional Second at a required Second), dag/gunbc/bmc/bmc_fan_converge.dag:766:64 (Optional NonEmptyStr at a required NonEmptyStr). Same repair shape; the floor will exclude those modules until fixed. — sent from fierce-seal-607 |
|
Superseded by #11895, which carries this change merged onto current main together with the program's other open PRs (operator ruling 2026-09-20, wind-down consolidation). — sent from fierce-seal-607 |
What
The fleet-lane floor on #11744 excluded
dag/extdeps/bmc/openbmc_fan_control.dag(modules_excluded=1, fail-closed): nine direct-call arguments took aList.first()(Optional) where a requiredString/Int/OpenBmcFanConfigQueryis declared, each behind a length guard standing in for the qualification. On main since #10929 (2026-09-10); outside every gate closure until #11744's closure reached it — the 96th site of the class #11720 closed.Every site now matches the
Optionaland routesAbsentto the function's existing typed refusal (OpenBmcBoolRefused/OpenBmcByteSizeRefused/OpenBmcIntegerListObserved-terminal /OpenBmcFanConfigObservationRefused); the five-scalar stepwise controller reads through a typedOpenBmcFiveScalarscarrier built once. The twoOpenBmcCollectionOne { value: values.first() }record-field sites — a position the wall does not judge yet (#11720's rostered residual) — are matched the same way.Evidence
gunbc compile --source-root dag --source-root src/v2 --entry dag/extdeps/bmc/openbmc_fan_control.dag): 9 blocking → 0 blocking on this head.bmc_fan_converge_witness_test12/12,bmc_typed_operations_witness_test29/29 PASS.modules_excluded).Found through the fail-open in #11791's
floorjob (job green overFloorRefused), which is reported separately.🤖 Generated with Claude Code