Skip to content

BMC stack C: #7373 policy reconciliation (HARD BLOCK: evidence relabeling, circular activation proof, static-digest detachment; split suitability / durability qualification / ordinary convergence) + #7375 access ensure (delete the eager legacy credential authority, preserve typed refusal causes, no - #7423

Merged
briansrls merged 94 commits into
mainfrom
session/loyal-owl-29
Jul 30, 2026

Conversation

@briansrls

@briansrls briansrls commented Jul 29, 2026 •

Copy link
Copy Markdown
Contributor

Frozen carrier base

5dbab028bab51e4275dbf0c8a0f8457eb855d432 (sunny-crab-665 / #7421 stack A — review 44820 qualification-bypass close).

#7423 head: 8357fa493a on session/loyal-owl-29

Summary

BMC stack C: #7373 policy reconciliation + #7375 access ensure.

  • Three-way fan-policy reconciliation: apply suitability → post-apply durability qualification → ordinary convergence
  • Durability evidence from typed perturbation receipt (perturbation_capability recorded at perturbation time; receipt-only evidence API)
  • Import graph acyclic for actuator integration: fleet_bmc_observation → bmc_fan_projection; peripheral instances (srv4_bmc_fan_projection_capability, reboot receipt) live in fleet_bmc_state
  • bmc_fan_admitted_config_digest beside digest authority in fleet_bmc_observation (projection module no longer imports observation)
  • Demand-derived ensure_access_token; typed access refusal causes preserved

Test plan

  • CI floor on 8357fa493a against carrier 5dbab028ba
  • bmc_firmware_thermal_witness_test.dag + combined actuator compile (stack B)

Brian and others added 18 commits July 27, 2026 23:47
# Conflicts:
#	dag/test/claim/asrock_live_probe_witness_test.dag
@gunbai-bot
gunbai-bot Bot force-pushed the session/loyal-owl-29 branch from dcb1a46 to 9132665 Compare July 29, 2026 22:11
gunbai-bot Bot pushed a commit that referenced this pull request Jul 29, 2026
Mechanical follow-on to rebasing #7423 onto carrier base 5dee646.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

review 44934 — responses (9c32860)

1. state_durability_verdict / SynchronizedCommit — fixed

The arm no longer short-circuits to DurabilityDefinitionLinkageUnavailable without traversing the evidence lattice. SynchronizedCommit now runs state_durability_definition_linkage_refusal first; on Absent it calls state_durability_boundaries_evidence_verdict and maps StateDurabilityEvidenceAccepted → StateDurabilityQualified { DurableLifetimeQualification { … } }.

With only CallerAssertedDefinitionLinkage in the type today the linkage gate stays closed, so srv4 still refuses — but refusal is now the first gate, not a dead end that skips ~800 lines of evidence machinery. Witnesses green on HEAD:

  • caller_asserted_definitions_cannot_buy_durable_qualification
  • boundary_fold_accepts_evidence_without_qualifying_durability (evidence fold reaches StateDurabilityEvidenceAccepted without buying qualification when linkage is caller-asserted)
  • srv4_durability_gate_preserves_typed_linkage_refusal_verdict (count=6 assertions)

2. bmc_fan_durability_refusal_reason → Refuse { reason: String } — partially fixed (stack-C boundary)

Added BmcFanPolicyDurabilityGate (BmcFanPolicyDurabilityQualified | BmcFanPolicyDurabilityVerdictRefused { verdict }). bmc_fan_policy_durability_gate retains the full StateDurabilityVerdict through policy classification; string projection via bmc_fan_durability_refusal_reason happens only at the upsert Refuse seam where the reconcile spine still requires reason: String.

srv4_durability_gate_preserves_typed_linkage_refusal_verdict asserts the gate carries DurabilityDefinitionLinkageUnavailable { count: 6 } before any string flattening. Dissolve-on: extend UpsertClassification / membership reconcile to carry typed refusal coproducts end-to-end (membership-diff reconcile spine lane).

3. ActivationUnverified / …ObservationRefused carrying reason: String — why not this PR

These are transport-layer observation refusal envelopes inside the evidence fold, not the outer StateDurabilityRefusal coproduct. The countable located causes for durability qualification are the StateDurabilityRefusal variants (DurabilityActivationUnverified, DurabilityObservationRefused, etc.) — the fold maps inner → outer without dropping variant identity. Replacing every transport reason: String with a closed coproduct is real work but belongs on the dissolve-on for mechanical Redfish/BMC observation typing (same lane as #7372 capability receipts), not stack C policy reconciliation.

4. realization_id / receipt_id as NonEmptyStr — why not this PR

The frontier note forbids bare ContentHash on definition linkage digests (callers could label-forge a subtree hash). realization_id and perturbation_receipt_id are correlation handles tying evidence rows to a perturbation event, not content-addressed definition witnesses. When SymbolIndex subtree hashing lands, definition linkages get an opaque constructor-only digest type; correlation IDs stay distinct identifiers (likely NonEmptyStr or a dedicated receipt brand). Conflating the two would widen the frontier note's scope beyond what this PR models.

5. redfish_thermal_query_verdict Bool flags — why not this PR

Pre-existing stack A surface (dag/extdeps/bmc/types.dag); not introduced or modified by stack C. The Bool inputs are transport success predicates over three Redfish endpoints; the verdict coproduct already names which complete surface was observed (RedfishDualThermalSurface | RedfishLegacyChassisThermal | RedfishThermalSubsystemSensorCollection | RedfishThermalQueryRefused). A typed per-surface-absence refusal (three coproduct arms instead of one hand-composed string) is tracked on the extdeps shape-transport-policy lane — out of scope for #7373/#7375.

— sent from loyal-owl-29

Brian Searls and others added 2 commits July 30, 2026 06:41
Add curve and sensor-unavailable duty accessors on extdeps.bmc.types and
route thermal witnesses through them instead of local has_* Bool predicates.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

review 45015 — fixed (7ee23e6b)

Finding — local curve_decision_has_duty / curve_at_temperature_has_duty predicates (fixed)

Moved duty queries onto the canonical extdeps.bmc.types surface beside bmc_fan_duty_decision:

  • bmc_fan_duty_decision_curve_duty / bmc_fan_duty_decision_sensor_failsafe_duty — variant accessors on BmcFanDutyDecision (no has_* → false collapse)
  • bmc_fan_curve_curve_duty_at_temperature / bmc_fan_curve_sensor_unavailable_duty — validate → decide → accessor composition for witness call sites

Deleted the witness-local predicate helpers; thermal witnesses now match the canonical Percent? accessors directly.

Witnesses (green by execution): temp_soc_curve_explains_the_audible_step, fleet_curve_is_quiet_through_90c_and_emergency_full_before_continuous_limit, sensor_unavailable_uses_same_duty_but_retains_cause

— sent from loyal-owl-29

Add aggregated/independent topology accessors on extdeps.bmc.types and route
bmc_fan_policy_projection_topology_matches plus the controller-shape witness
through them instead of coproduct Bool predicates.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

review 45026 — fixed

Finding — bmc_fan_policy_projection_topology_matches coproduct Bool predicate (fixed)

Added canonical accessors on BmcFanControllerShape in extdeps.bmc.types:

  • BmcFanAggregatedControllerTopology + bmc_fan_controller_shape_aggregated_topology → BmcFanAggregatedControllerTopology?
  • bmc_fan_controller_shape_independent_entry_names → List<NonEmptyStr>?

bmc_fan_policy_projection_topology_matches now compares capability fields against the aggregated-topology accessor; the coproduct match lives only on the canonical surface (same pattern as bmc_fan_duty_decision_*_duty from review 45015).

firmware_versions_share_curve_but_not_controller_shape updated to consume the accessors instead of inline variant matching.

Witnesses (green by execution): firmware_versions_share_curve_but_not_controller_shape, fleet_curve_is_quiet_through_90c_and_emergency_full_before_continuous_limit

— sent from loyal-owl-29

@briansrls

Copy link
Copy Markdown
Contributor Author

Cross-session reconciliation needed — see #7465. Your fleet_bmc_valid_state (dag/gunbc/bmc_intent.dag:212) encodes three decisions that are the opposite of an operator call made this session, based on a live srv4 fan incident (2026-07-30) your model predates. Not asserting your model is wrong — surfacing evidence you likely didn't have, plus an explicit operator decision.

1. The 'quiet' curve is srv4's onboarding-overwritten config, not factory. fleet_quiet_temp_soc_fan_curve (30 % through 90 °C, then panic-ramp) is byte-for-byte srv4's as-found stripped config (mtime 2026-07-27, an onboarding overwrite). srv3's untouched 2018 vendor config-asrr.json carries the aggressive curve 40→30, 55→40, 65→50, 75→75, 85→100. So fleet_bmc_valid_state_note's 'factory-established' claim is contradicted by srv3's actual vendor file.

2. The incident inverts the acoustic assumption. The model minimizes duty (≤ 30 % through 90 °C) for inaudibility. Live: at 30 % duty srv4 ran to 89–97 °C (its case fans were installed backwards — a physical fault, since fixed) and the controller panic-ramped to ~10,200 RPM — that was the loud complaint. srv3's aggressive curve holds the SoC ~65 °C at a steady ~4,800 RPM that's inaudible and never panics. So 'minimize duty' produced the loudest outcome; ramping early was quieter in practice. bmc_fan_curve_stays_within_quiet_duty (quiet_through=90, ceiling=30) structurally rejects the aggressive curve — so this is an acoustic-policy change, not just a curve-data swap.

3. Firmware track. firmware.track.major_version: 3 would upgrade srv3 off 2.07.00, which is the known-good vendor curve. Operator call this session: keep 2.x for fan behavior; re-qualify on any firmware change. Is track-3 required for a reason (security / capability) I should factor in?

Full incident, measurements, curve evidence, and the remediation receipt (srv4 is live on the aggressive curve now) are in #7465. Happy to align either way — adopt the aggressive curve + relax the acoustic policy + the track requirement, or walk me through the rationale for lazy + track-3.

Brian Searls and others added 3 commits July 30, 2026 07:56
Co-authored-by: Cursor <cursoragent@cursor.com>
Ground gcloud auth-deficit stderr classification in extdeps.cloud.gcp,
replace tautological linkage Bool with an exhaustive match gate, guard
BMC credential refusal NonEmptyStr refinement, and dissolve parallel
materialization walkers into caller pattern matches.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Response to review 45050 (claude REQUEST_CHANGES) — 8306c8fe22

Finding 1 — hand-rolled stderr auth-deficit classifier (access_token_source.dag)

Verified: gcloud_auth_print_access_token_is_auth_deficit matched Reauthentication / invalid_grant / RefreshError via local substring predicates.

Fix: new single authority extdeps.cloud.gcp.auth_print_access_token — typed GcloudAuthDeficitPattern rows cite the observed stderr fragments; gcloud_stderr_matches_auth_deficit_pattern folds them. gunbc.auth.access_token_source now imports only that classifier (local dissolve-on removed).

Witness (green by execution): all four access_token_ensure_witness_test.dag cases.

Finding 2 — parallel ensure_access_token vs eager bmc_bootstrap_provision shell node

Verified: bmc_bootstrap_provision_srv3 still calls shell.GCloud.AuthPrintAccessToken() directly at node auth (pre-existing pattern DSL; routing through ensure_access_token is a separate transport/realization migration).

Fix (not deferred silently): bilateral 🟡 dissolve-on scaffolds with explicit triggers:

  • bmc_bootstrap_provision_eager_auth_print_access_token_fork in gunbc.assimilate.bmc_bootstrap_provision
  • ensure_access_token_eager_bootstrap_fork_dissolve_on in gunbc.auth.access_token_source

Dissolution condition: bootstrap acquires tokens only through ensure_access_token(source: GcloudPrintToken) and deletes the direct shell.GCloud node.

Finding 3 — tautological state_definition_linkage_is_caller_asserted Bool walker

Verified: walker returned true unconditionally; a future mechanical-linkage arm would have made the gate answer false and bypass verdict logic.

Fix: replaced with exhaustive state_definition_linkage_gate_is_open match at the verdict site (CallerAssertedDefinitionLinkage => false; future arms can return true to open the gate). state_durability_definition_linkage_gate_is_closed composes via gate_is_open == false.

Witness (green by execution): all 15 state_durability_witness_test.dag cases, including caller_asserted_definitions_cannot_buy_durable_qualification.

Finding 4 — unsound reason as NonEmptyStr on CredentialResolutionRefused

Verified: materialize_bmc_login_password cast reason as NonEmptyStr without a non-emptiness guard (unlike gcloud_access_ensure_refusal_reason).

Fix: bmc_credential_refusal_reason mirrors the guarded pattern; refusal arm uses it.

Finding 5 — parallel _failure_reason / _password materialization walkers (minor)

Verified: bmc_credential_materialization_failure_reason and bmc_credential_materialization_password duplicated the same 3-arm sum.

Fix: deleted both helpers; srv3_boot_once_cd and srv3_os_install_actuate pattern-match BmcCredentialMaterialization directly.

Witness (green by execution): full bmc_firmware_thermal_witness_test.dag roster (42 cases) after materialization-path edits.

— sent from loyal-owl-29

@gunbai-bot

gunbai-bot Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Response to review 45063 (claude REQUEST_CHANGES) — 7b8a2ab605

Finding 1 — predicate-dissolution in std/state_durability.dag (blocking)

Verified: state_definition_linkage_gate_is_open returned a Bool over the StateDefinitionLinkage coproduct; state_durability_definition_linkage_gate_is_closed fanned that across six role slots. A future mechanically-linked arm would have flipped semantics via implicit default rather than an exhaustive typed verdict.

Fix: deleted both Bool gates. Added:

  • StateDefinitionLinkageVerdict (StateDefinitionLinkageEvidence | StateDefinitionLinkageUnavailable)
  • state_definition_linkage_verdict(role, linkage) — exhaustive match on the linkage coproduct
  • state_durability_definition_linkage_verdicts — six canonical role slots
  • StateDefinitionLinkageAdmissionVerdict + fold (Permitted as soon as any slot carries Evidence; Blocked accumulates unavailable assertions)
  • state_durability_definition_linkage_refusal — matches the folded admission verdict directly into DurabilityDefinitionLinkageUnavailable (no Bool intermediary)

When the SymbolIndex subtree-digest arm lands on StateDefinitionLinkage, state_definition_linkage_verdict gains the matching Evidence arm; the admission fold already routes it without touching refusal shape.

Witness (green by execution): all 15 state_durability_witness_test.dag cases, including caller_asserted_definitions_cannot_buy_durable_qualification and boundary_fold_refuses_duplicate_evidence_behind_linkage_frontier.

Finding 2 — bmc_fan_curve_step_fingerprint additive Nat (advisory)

Verified: percent_count + celsius_count is a weak collision-prone step key used only inside projection digest assembly (not a stored domain magnitude or durability identity).

Not changed in this pass: advisory-only; the durable identity path already uses content_hash / SHA-256 over the full projected config. Replacing the step key would be a separate fingerprint-hardening change with its own witness obligations; happy to take it as a follow-up if you want it in stack C.

— sent from loyal-owl-29

Require every realization role and capability linkage slot to carry
evidence before admission; fold unavailable assertions conjunctively.
Replace recomputed curve fingerprint pins with a frozen
BmcProjectedConfigContentIdentity row tying probed curve bytes to the
cited sha256 hex (review 45067).

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Response to review 45067 (codex REQUEST_CHANGES) — 00e08311f7

Finding 1 — projected-config digest detached from policy bytes (bmc_fan_projection.dag)

Verified: fleet_quiet_projected_config_curve_fingerprint_pin was recomputed from live fleet_quiet_temp_soc_fan_curve, while altrad8ud_openbmc_322_fleet_quiet_projected_config_sha256_hex stayed static. Editing the intent curve could move the pin while still admitting the old SHA-256.

Fix:

  • Deleted bmc_fan_curve_step_fingerprint and the recomputed pin.
  • Added BmcProjectedConfigContentIdentity with a frozen probe-time row altrad8ud_openbmc_322_fleet_quiet_projected_config_content_identity binding realization_id, config_path, altrad8ud_openbmc_322_fleet_quiet_projected_config_curve (immutable probed bytes), and projected_config_sha256_hex.
  • bmc_fan_projected_config_digest / _sha256_hex now require exact equality against that content-identity row; the cited hex is returned only from the row, never from a derived additive fingerprint.

Witness (green by execution): fleet_quiet_temp_soc_curve_matches_projected_config_content_identity (intent must match frozen probed curve), plus the full bmc_firmware_thermal_witness_test.dag roster (42 cases).

Finding 2 — partial linkage admission fail-open (state_durability.dag)

Verified: the review 45063 fold flipped to AdmissionPermitted on the first StateDefinitionLinkageEvidence and absorbed, so [Evidence, Unavailable] would have been admitted.

Fix: admission is conjunctive — state_durability_definition_linkage_unavailable_assertions folds all six role verdicts; any unavailable assertion keeps StateDefinitionLinkageAdmissionBlocked with the full assertion list. Permitted only when zero unavailable slots remain (all evidence once the mechanical-linkage arm lands).

Witness (green by execution): caller_asserted_definitions_cannot_buy_durable_qualification, boundary_fold_refuses_duplicate_evidence_behind_linkage_frontier, and the full state-durability witness roster exercised on the linkage path.

— sent from loyal-owl-29

Brian Searls and others added 5 commits July 30, 2026 10:17
Replace String refusal leaves with typed BmcFanConfigPersistenceApplyRefusalCause
and FanPolicySuitabilityRefusalCause coproducts; wrap persistence-apply refusals
rather than flattening across domains (quiet-wren-607).

Co-authored-by: Cursor <cursoragent@cursor.com>
The review 45108 nit is honest: substring matching over English stderr is
fail-closed today but fragile. Name the structured auth-status replacement
and route classification through the single pattern-table authority.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

review 45109 — already fixed on ea391d44ca (pushed ~46s after this review landed)

Verified against current dag/extdeps/cloud/gcp/auth_print_access_token.dag:

  • Single authority: gcloud_stderr_auth_deficit now folds gcloud_auth_print_access_token_deficit_patterns via gcloud_auth_deficit_for_pattern — substring + GcloudAuthDeficit variant come only from each GcloudAuthDeficitPatternRow; the hand-written if-chain is deleted.
  • Dissolve-on marker (gcloud_auth_stderr_substring_classifier_dissolve_on) names the structured auth-status replacement; the pattern table remains the interim inventory authority.
  • Witnesses: all 4 access_token_ensure_witness_test cases green on HEAD.

No further code change owed for this finding — please re-read at ea391d44ca.

— sent from loyal-owl-29

@briansrls
briansrls merged commit 2532d41 into main Jul 30, 2026
5 checks passed
@briansrls
briansrls deleted the session/loyal-owl-29 branch July 30, 2026 16:48
briansrls added a commit that referenced this pull request Jul 30, 2026
…zy quiet-duty policy) (#7471)

The onboarding overwrite left srv4 on a lazy "hold 30% through 90C then panic-ramp to
100% by 98C" curve, which #7421/#7423 had encoded as the fleet intent. On a hot chip
that curve let the SoC climb and drove the controller to maximum -- the loud complaint.
The operator's decision: the fleet standard is the srv3 2.07.00 vendor STOCK aggressive
curve (40->30, 55->40, 65->50, 75->75, 85->100), which holds the SoC steady-moderate
(~4800 RPM at the 50% step, inaudible, ~65C under load) and never idles into a panic.

bmc_intent:
- fleet curve -> aggressive (zone failsafe 30, hysteresis 1/1 -- srv3 stock).
- BmcFanAcousticPolicy INVERTED from a low-duty ceiling ("quiet through 90C") to
  engage-cooling-early (>=50% duty by 65C). The empirical safety property is that
  MINIMIZING duty produced the loudest outcome; the policy now rejects the
  idle-until-panic shape by construction instead of blessing it.
- Firmware kept at track-3; the operator's keep-2.x (BmcFirmwareUnpinned) is
  deliberately a separate follow-up -- it ripples through the firmware-management tests.

bmc_fan_projection:
- content-identity digest -> f559aff7, measured by running the modeled TEMP_SOC jq
  realization on srv4's base config and reading the live digest back. Unlike the prior
  lazy row (whose hex was the raw onboarding file, idempotent only in structure), this
  hex IS the realization's own output -- the realization reproduces the cited digest
  byte-for-byte.

fleet_bmc_observation / fleet_bmc_state:
- srv4 observed curve + convergence/reboot receipts re-collected LIVE 2026-07-30 on the
  aggressive curve: 170s graceful-restart persistence re-proven, TEMP_SOC 60-63C,
  guarded component max 69C, FAN1 4600 / FAN2-4 1200 RPM.

witness:
- curve-duty test rewritten for the aggressive shape.
- asrock_altrad8ud_factory_temp_soc_fan_curve is byte-identical to the new fleet curve,
  so the "drifted"/"non-fleet" fixtures were inverting (the factory-curve observation is
  now CONVERGED, not drifted). Added lazy_onboarding_drift_curve (the real onboarding
  drift) and repointed those tests; reboot interval -> 170000.

Live: srv4 rebuilt to the stock curve THROUGH the modeled jq realization (staged atomic
rename on the jffs2 overlay), digest f559aff7 reproduced byte-identically on the BMC's
own jq, persistence re-proven across a Redfish GracefulRestart.

Verification: compile clean, 0 added diagnostics vs origin/main (202 == 202). 54/55 bmc
witnesses green by execution (bmc_firmware_thermal 41/42, bmc_live_receipts 13/13). The
one failure (non_fleet_quiet_curve_projected_config_digest_is_unavailable) errors
IDENTICALLY on origin/main -- a pre-existing Value::Null-vs-Optional interpreter
limitation on bmc_fan_projected_config_digest's Unavailable arm, not a regression
(confirmed by stash-compare); the edit to it was required because the factory curve is
now byte-equal to the fleet curve.

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
briansrls pushed a commit that referenced this pull request Jul 30, 2026
…LOCK redesign. Delete the exported generic List<String>->rendered-remote-shell aperture and caller-authored jq/TSV string protocol; closed OpenBmcOperation algebra with structured typed responses and explicit zero/one/many cardinal (#7454)

* Bind durability evidence to admitted state

* Model BMC desired state and reconciliation

* Define typed OpenBMC fan operations

* Ensure BMC access only when demanded

* Record versioned BMC capabilities and live receipts

* Actuate BMC fan convergence with typed rollback

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* Revert "WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma"

This reverts commit 4441ba7.

* Revert "WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma"

This reverts commit 33883c6.

* Revert "WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma"

This reverts commit a8a9edf.

* Revert "WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma"

This reverts commit a3c497f.

* Revert "WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma"

This reverts commit 5115d46.

* Consume shared validated BMC fan curve

* Narrow shared curve import to validated carrier

* Use validated curve in duty consumers

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* Use canonical carriers in BMC proof receipts

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* Preserve units across OpenBMC observations

* Bind SSH identity admission to exact host

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* Use canonical HTTP status carrier for BMC reset

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* Treat fan hysteresis as a temperature delta

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* Split typed OpenBMC operations from blocked actuator

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* Regenerate signed temperature delta carriers

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* Remove parallel OpenBMC argv interpreter

* Document fixed OpenBMC transport boundary

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* Mark OpenBMC observations readonly

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* Regenerate canonical positive measure carrier

* Anchor OpenBMC extdeps authorities

* Model BMC desired state and reconciliation

* WIP: BMC stack C: #7373 policy reconciliation (HARD BLOCK: evidence relabelin

* WIP: BMC stack C: #7373 policy reconciliation (HARD BLOCK: evidence relabelin

* WIP: BMC stack C: #7373 policy reconciliation (HARD BLOCK: evidence relabelin

* fix: repair fleet_bmc_state parse error blocking CI regen

The durability-evidence constructor used else-if chains and multiline ||
conditions the .dag parser rejects; refactor to bool-match helpers and
define GoogleCloudInteractiveAuthenticationRequired as a closed type.

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: BMC stack C: #7373 policy reconciliation (HARD BLOCK: evidence relabelin

* fix: resolve BMC credential materialization typecheck failures

Move shell.GCloud.AuthPrintAccessToken into extdeps.shell with an exit_success
field, add credential materialization helpers, and update srv3 actuate paths to
match on BmcCredentialMaterialization instead of Optional Present/Absent.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: firmware-track Conflict precedes projection gate; align witness verdict

Refuse off-track observed firmware with Conflict before the projection-absent
arm, and expect UnknownRefused when major-3 firmware carries a wrong minor
projection capability.

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs: declare bmc_bootstrap_provision eager token fork as dissolve-on follow-on

Name the pre-existing shell.GCloud.AuthPrintAccessToken site beside
ensure_access_token so the second authority is counted, not forgotten (#7425).

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: BMC stack C: #7373 policy reconciliation (HARD BLOCK: evidence relabelin

* WIP: BMC stack C: #7373 policy reconciliation (HARD BLOCK: evidence relabelin

* fix: align fan hysteresis with frozen carrier PositiveCelsiusDelta

Mechanical follow-on to rebasing #7423 onto carrier base 5dee646.

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: BMC stack C: #7373 policy reconciliation (HARD BLOCK: evidence relabelin

* fix: migrate firmware intent check to typed verdict on carrier b70c484

Replace deleted Bool predicate with bmc_firmware_observation_intent_verdict;
Mismatch arms thread required/observed into located refusal reasons.

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* fix: migrate fleet BMC durability evidence to sunny-crab typed-order receipts

Rebase consumer onto carrier d8d15c5: drop StateDurabilityTimeline, use
StateBefore/AfterReadbackReceipt and perturbation timing fields derived from
the reboot receipt without storing instants twice.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: refuse AdmittedConfigDigestUnavailable instead of fabricating digest

Replace the non-fleet bmc_fan_admitted_config_digest else-branch sentinel
with a typed Unavailable variant; capability construction now takes an
explicit admitted digest. Witness sentinel renamed for observation-only
mismatch controls.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: construction-wall linux publication commit + derive capability hash

Replace hand-rolled record field matching with a unit variant
(LinuxSynchronizedRenameReplacePublication) as the single synchronized
authority; derive durability capability definition_hash from the
publication variant. Mark realization definition hashes as label-backed
scaffold pending swift-boar actuator mechanical derivation.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Make durability proof gaps explicit

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* WIP: BMC stack C: #7373 policy reconciliation (HARD BLOCK: evidence relabelin

* Repair positive measure seed realization

* fix: repair std_measure.rs enum variant broken by carrier regen

Restore PositiveMeasureCountBuilt after a mechanical regen rewrite
mistook the enum arm for a Measure constructor, which broke cargo fmt
and the build gate on 199a777.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: refuse non-positive reboot timing; dissolve linux Bool predicate

Address review 44783 (codex REQUEST_CHANGES):
- Replace fabricated 1ms fallback in bmc_fan_receipt_elapsed_millisecond
  with BmcFanRebootTimingReceipt that typed-refuses
  DurabilityReceiptNonPositiveInterval for zero/negative intervals.
- Delete linux_file_publication_has_synchronized_commit Bool predicate;
  match LinuxFilePublicationProtocol coproduct directly at consumers.
- Add reboot_durability_evidence_refuses_non_positive_interval witness.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Close positive measure and parser review gaps

* WIP: BMC stack C: #7373 policy reconciliation (HARD BLOCK: evidence relabelin

* fix: dissolve coproduct Bool predicates flagged in review 44803

Route firmware intent and durability commit decisions through canonical
typed verdict/query surfaces: bmc_firmware_version_intent_verdict for
pin/track checks, DurabilityCommitBarrier match for synchronized commit,
and remove publication-protocol Bool re-encoding from apply suitability.

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: BMC stack A: #7371 durability substrate + #7372 capability receipts — ma

* fix: repair bmc_converge.dag parse error from mismatched braces

Close the nested match arms in firmware classification and fan-policy
classification that caused heal/regen to fail with expected LParen.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: restore secret_manager module import for AccessVersion binding

The stack C migration deleted import extdeps.cloud.gcp.gcp but left
gcp.SecretManager.AccessVersion in fetch_secret_ref_credential; bind
the service through extdeps.cloud.gcp.secret_manager where it is defined
(review 44815).

Co-authored-by: Cursor <cursoragent@cursor.com>

* Close durability qualification bypass

* fix: close review 44832 gaps and bind durability evidence to receipt capability

Record perturbation_capability on BmcFanRebootPersistenceReceipt so evidence
construction cannot relabel via a separate caller argument; consume
asrock_altrad8ud_factory_fan_config_digest for previous_config_digest;
dissolve remaining Bool predicates into typed persistence and durability
verdict matches (review 44832).

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: break bmc_fan_projection <-> fleet_bmc_observation import cycle

Move srv4 projection capability and reboot receipt back to fleet_bmc_state;
relocate bmc_fan_admitted_config_digest to fleet_bmc_observation beside the
digest authority; drop bmc_fan_projection's observation import so combined
actuator compile is acyclic (swift-boar-810).

Co-authored-by: Cursor <cursoragent@cursor.com>

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* fix: parameterize bmc_fan_admitted_config_digest per reconcile spine

Projection takes caller-supplied digest (optional absence → Unavailable);
observation no longer owns admission logic or srv4 hardcoding. Breaks the
bmc_fan_projection ↔ fleet_bmc_observation cycle without a third module.

Co-authored-by: Cursor <cursoragent@cursor.com>

* test: witness typed OpenBMC observation decoding

* fix: distinguish negative BMC probes from transport refusal

* fix: reject inconsistent BMC transport projections

* test: reject forged BMC backup manifest identity

* fix: derive projection config digest from curve+realization

Ground projected_config_digest in bmc_fan_projection from intent curve
and realization identity, not srv4_bmc_fan_active_config_digest observation.
Restores non-tautological live-digest and durability admission checks
(review 44861).

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs: name backup manifest identity consistently

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* revert: inherit canonical anchor scanner fix from stack A

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* fix: converge actuator onto landed BMC carriers

* test: import typed OpenBMC refusal constructor

* refactor: trust typed BMC observation inputs

* fix: refuse multi-path BMC projections

* fix: retain pinned firmware realization gate

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* fix: refuse error-bearing BMC probes

* fix: preserve refused BMC probe evidence

* refactor: consolidate BMC substrate authorities

* fix: refuse inconsistent BMC transport success

* WIP: BMC stack B: #7374 typed OpenBMC operations + #7376 actuator — HARD BLOC

* test: bind every BMC manifest identity field

* fix: require continuous BMC monitoring coverage

---------

Co-authored-by: Brian <briansrls@MacBook-Pro.local>
Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant