Repository navigation
Host-effect interface Phase A: mint apply(target,effect,policy) -> Reconciliation over the HostEffect coproduct per docs/plans/host-effect-orchestration.md (MERGED spec). Model-only + ShellCommand arm REALIZED green-by-execution + RedfishAction arm fail-closed Unimplemented stub. Co-mint with neat-b - #5756
Conversation
…conciliation over the HostEffect coproduct
Mints the one host-operation interface (docs/plans/host-effect-orchestration.md,
MERGED spec) as new .dag — Phase A only, model-before-implement:
- gunbc.host_effect (agnostic interface): HostEffect = ShellCommand{script} |
RedfishAction{action} coproduct; NodeControlPlane = HostOs(node) | BmcController(node)
(target-duality, the target supplies the WHERE over fleet_intent, the effect is pure
intent); Policy = OneShotIdempotent | ConvergeToFixpoint; HostEffectIntent provenance;
HostEffectEvidence. Reuses std.realization_reconcile.Reconciliation as the return — NO
second receipt grammar (DESIGN §3 single-authority).
- gunbc.host_effect_realize (dispatch + realization, peripheral per DESIGN §3):
resolve_host_effect_cell is the single total dispatch fold over (control-plane ×
effect-kind) — no `_ =>` arm, so an incompatible combo (RedfishAction@HostOs,
ShellCommand@BmcController) is a typed mismatch, not a silent no-op (DESIGN §5).
ShellCommand@HostOs REALIZED over LocalShell (extdeps.shell.shell.Exec.Run), grounded
inline from the observed exit (a nonzero exit grounds DoesNotGround → NotConverged, no
fabricated convergence). RedfishAction@BmcController is a fail-closed Unimplemented stub
(typed NotConverged, never a fake success on a power/boot action) — neat-boar-71 realizes
it over RedfishRest in Phase C. host_effect_policy_directive bakes the policy contract:
incompatible → Refused (terminal); compatible NotConverged → ReDrive under
ConvergeToFixpoint, Settled under OneShotIdempotent (the seam Phase-C poll-loop composes).
- extdeps.bmc.types: RedfishSystemAction arm TYPE (4 variants, FINAL-pinned with neat-boar),
reusing the existing boot/reset enums + std Secret; no host/system_id/creds fields (the
WHERE is the BmcController target, keeping the action transport-agnostic).
- Witness host_effect_apply_witness_test: GREEN BY EXECUTION (real sh execs) over all four
cells + the policy directive; discriminating RED control proven (flipping the fail-closed
assertion to expect a failing shell to converge flips the witness RED).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…-consumer, per the corpus-wide retirement) Co-owner review (neat-boar-71) APPROVED the architecture (all 4 co-owned points verified byte-for-byte) with one must-fix: redfish_system_action_doc, host_effect_interface_doc, and host_effect_realize_doc are zero-consumer prose-in-String constants — the exact pattern the operator is retiring corpus-wide this hour (the "delete zero-consumer prose strings" gate). The design rationale moves to the PR description + commit history. The strings INSIDE the IncompatibleCell / NotConverged arms stay — those are typed refusal payloads (located diagnostics), not docs. Removed std.types.String from extdeps/bmc/types.dag's import (the doc was its only user; Secret remains for RedfishSystemAction.SetAccountPassword). Re-verified: compile-clean gate 597 files / 0 diagnostics; witness host_effect_apply_holds green by execution. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…sition debt mark #5739 went RED on realization_vocab_clean_tree_holds: the bash-AST rework imported extdeps.languages.bash.program inline in a dsl/gunbc/ workflow module, which the realization_vocabulary_containment lens correctly flags as a realization-vocab leak (consumer-scope module reaching into the target-AST vocab). Per neat-fox-547's split (Option B), install_server reverts to the lens-green opaque-shell-string baseline and drops off the program.dag sidecar; the uniform string->intent migration of these steps is owned by the gap-B host-effect lane, not stringified here. Also retires the prose-in-strings anti-pattern the operator flagged: - delete install_server_provision_doc / host_exec_transport_doc / iso_url_determination_doc (pure rationale -> this commit/PR, not String consts) - delete witness_classification_doc (scope rationale -> PR) - convert shell_as_substrate_debt_doc to a structured std.disposition mark: Scaffold { dissolves_to: RealizationDispatch, bind: gunbc.host_effect.HostEffect } matching the bmc_onboard.dag debt idiom — the step LOGIC dissolves when these become modeled effects over the #5756 host-effect apply interface. Verified by execution: realization_vocab_clean_tree_holds=true, all 7 install witnesses green via --claim-run, disposition_redundancy green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…dissolution trigger in Phase B Phase A minted gunbc.host_effect + host_effect_realize (#5756). The ShellCommand{script:String} raw-string scaffold's named dissolution trigger now lives on the lane-authority carrier (Phase B): it dissolves jointly with host_exec's script strings onto the bash AST, symmetric to RedfishAction being typed — not left as PR-body prose. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Re: claude-opus-4-7's non-blocking nit — This is a pure re-derivation from the single authority, not a stored parallel representation. — sent from lively-stag-276 |
…lution trigger (#5759) * WIP: dag managed infra * WIP: dag managed infra * Host-effect orchestration note: fold in target-duality + HostEffect coproduct + async Receipt (neat-boar srv3 BMC evidence) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * Host-effect note: bootstrap chain mechanism-agnostic (VirtualMedia or PXE); srv3 OpenBMC ground-truth Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * WIP: dag managed infra * WIP: dag managed infra * Resolve add/add conflict in host-effect-orchestration.md (keep Phase A LANDED + Phase B dissolution) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Brian Searls <briansrls@gunb.ai> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…p was BACKWARDS (shipped false status) My prior "drift fix" was the wrong direction and un-landed correct status (§5 ships-false-status trap). Ground truth (parent neat-boar-71 verified by reading both files on origin/main): - the committed .md said Phase A "[LANDED #5756]" = CORRECT - the .dag authority (host_effect_orchestration.dag) says "[now, parallel]" = STALE (the authority itself was regressed, likely by #5764 grounding a pre-landed draft). main_wet regenerated the .md FROM the stale .dag, propagating the regression INTO the .md and reverting the accurate "[LANDED #5756]" back to "[now, parallel]". My differential control (committed == origin/main) only proved the drift was not introduced by this PR's 4 model files — it did NOT establish which side was correct. I wrongly assumed authority==truth; here the authority was the stale side. Fix: restore docs/plans/host-effect-orchestration.md to origin/main (the LANDED version). KEEP ROADMAP.md + roadmap_authority.dag (the srv3 orphan-doc pointer — legit BMC scope). Do NOT touch the .dag or re-run main_wet — the drift ROOT (stale .dag) is the host-effect lane's to fix in a separate focused PR. EXPECTED: generated_artifact_drift_gate stays RED on #5773 until the host-effect lane's .dag fix lands on main; that is correct, not a regression to chase. Rebase on main after their fix merges. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
My regeneration via main_wet reverted the plan doc from LANDED [#5756] to [now, parallel] — wrong direction. The .dag Plan authority needs to be updated (not the committed .md) to fix the drift, and that belongs to the host-effect lane (neat-boar/fierce-carp). Restoring the correct LANDED state. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
main_wet regenerates host-effect-orchestration.md from its .dag Plan authority, which still emits the pre-#5756 '[now, parallel]' text; that stale regen leaked into this PR and rewound Phase A's LANDED marker. This PR is roadmap citations only — restore origin/main's doc verbatim. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rity (drift fix)
The committed .md carried a stale pre-grounding version ('LANDED #5756'
Phase A/B text) that predated #5764's grounding of the plan into its
gunbc.plans authority. Regenerated via main_wet so the projection matches
the single-authority output (identical to origin/main); fixes the
generated_artifact_drift_gate red. No 3-file scope content touched.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… truth (regressed by #5764) (#5790) The .dag authority had a stale pre-landed draft ([now, parallel]); the committed .md was correct ([LANDED #5756]). Restores the .dag li(text) to the landed prose so projection(.dag) == committed .md and the main-wide generated_artifact_drift_gate goes green. Co-authored-by: Brian Searls <briansearls1@gmail.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…re-tower census refresh (#5788) * WIP: roadmap inversion (again) * WIP: roadmap inversion (again) * Drop unrelated host-effect doc regen-drift from roadmap-citation PR main_wet regenerates host-effect-orchestration.md from its .dag Plan authority, which still emits the pre-#5756 '[now, parallel]' text; that stale regen leaked into this PR and rewound Phase A's LANDED marker. This PR is roadmap citations only — restore origin/main's doc verbatim. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * WIP: roadmap inversion (again) --------- Co-authored-by: Brian Searls <briansearls1@gmail.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…repo requirements (DESIGN.md, extdeps conventions, no handwritten/embedded js or shell, Playwright modeled in extdeps), produce a design for review, THEN implement. Prior approaches (hand-written .mjs, embedded-JS-emit) were reject (#5773) * WIP: srv3 WebUI-KVM virtual-media install, FROM SCRATCH: FIRST understand rep * Ground srv3 WebUI-KVM virtual media as a distinct capability + install mechanism srv3's OpenBMC 2.07 exposes virtual media ONLY via the legacy WebUI KVM (OpenBMC web-UI NBD over wss), NOT over Redfish/DMTF InsertMedia (404). The on-main solve therefore resolved srv3 to PxeHttpInstall — wrong, since PXE cannot cross the Tailscale overlay (needs BIOS net-stack + same-L2). Per DESIGN §3 (single authority; the OpenBMC web-UI mechanism is a DIFFERENT mechanism than DMTF Redfish VirtualMedia, not a nickname for it): - extdeps/bmc/capability: add a DISTINCT CapabilityWebuiVirtualMedia variant (kept separate from CapabilityVirtualMedia, the Redfish surface) and ground openbmc_2_07_00_capabilities to include it (srv3 live-probe confirms the web-UI KVM media path works). - gunbc/os_install_mechanism: add the WebuiVirtualMediaInstall arm; solve prefers Redfish VirtualMediaInstall (automatable standard) first, then WebuiVirtualMediaInstall, then FirmwareUpdateThenVirtualMedia, then PXE. srv3 now falls out of the grounded solve to WebuiVirtualMediaInstall. Witness green-by-execution (8/8 PASS via claim_executor) + discriminating RED control (dropping the capability flips srv3's two grounding tests to FAIL): - redfish_vm_preferred_over_webui (both caps -> Redfish, proves ordering) - webui_vm_capable_row_solves_webui (WebUI-only -> WebuiVirtualMediaInstall) - vm_capable_firmware_row_flips_to_update_path uses an update-only current row (srv3's row now carries WebUI VM, so the old test premise moved). The install-WORKFLOW over browser ops is HELD pending the operator's runner-origin decision (see docs/plans/srv3-webui-kvm-virtual-media.md §5); this PR is pure modeling, zero JS. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * WIP: srv3 WebUI-KVM virtual-media install, FROM SCRATCH: FIRST understand rep * Rename Webui→NbdProxy virtual-media capability (§3: cite OpenBMC's real term, not a client nickname) CapabilityWebuiVirtualMedia / WebuiVirtualMediaInstall were named after one CLIENT (the WebUI browser). Per DESIGN §3 (single authority; cite the upstream's real name, not a coined nickname), the actual BMC capability is OpenBMC's nbd-proxy virtual media (upstream "proxy mode": browser/JS NBD server over a secure websocket carrying NBD) — distinct from DMTF Redfish InsertMedia (CapabilityVirtualMedia). The browser is just one client of that protocol; openbmc/jsnbd ships a non-browser reference (the nbd-proxy binary). Rename only — solve precedence (Redfish-VM > nbd-proxy-VM > firmware-update > PXE) and the 8/8 witness logic are unchanged: CapabilityWebuiVirtualMedia -> CapabilityNbdProxyVirtualMedia WebuiVirtualMediaInstall -> NbdProxyVirtualMediaInstall (+ matching test-fn / local-var names). srv3 still falls out to NbdProxyVirtualMediaInstall as a consequence of the grounded solve. This keeps the client-named nickname OFF main entirely (not cement-then-churn). The formal openbmc/jsnbd ExternalAuthority citation homes with the Layer-1 transport shape in the B design (extdeps/bmc/webui), not the capability taxonomy. Witness 8/8 green-by-execution via claim_executor. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * Design doc → architecture B (direct wss+NBD seed client), fold in srv3 read-only probe Rewrite the srv3 virtual-media design from the rejected browser/Playwright path to architecture B: the WebUI KVM "attach media" is sugar over OpenBMC's documented nbd-proxy protocol (NBD carried in a secure WebSocket; BMC is the NBD client, we are the NBD server). The honest realization is a direct wss+NBD client in the Rust seed — a transport realization like ureq/sh, NOT UI automation. No browser, no JS. Adds: - §1 the protocol grounded from openbmc/jsnbd (nbd-proxy / nbd.js) + the NBD fixed-newstyle handshake + docs/designs/virtual-media.md. - §2 read-only srv3 probe findings: Redfish VirtualMedia 404 under BOTH Systems and Managers => InsertMedia AND legacy HTTPS/CIFS share-mount are OUT (answers parent's disambiguation; Tailscale-reachability for that path is moot). New doubt: nbd ws route 404s on non-upgrade GET + no static WebUI + KVM-video-only => nbd-proxy may not be compiled into this 2.07.00 build; settling it needs an operator-gated ws-upgrade dry-run. - §3 the §3 interface/transport/policy split for NbdProxyServe. - §6 two sign-off gates before any seed code: (1) operator ws-upgrade dry-run confirming nbd-proxy is present, (2) acceptance of a seed-resident wss+NBD client as the realization origin. Capability/dispatch modeling (8/8 witness) stays done in #5773; seed client deferred. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * WIP: srv3 WebUI-KVM virtual-media install, FROM SCRATCH: FIRST understand rep * Fix §5 fail-open: keep srv3's cited row at read-only-probe truth (drop ungrounded NbdProxy VM capability) Review (claude-opus-4-7, REQUEST_CHANGES) correctly caught a §5 fail-open: the openbmc_2_07_00_capabilities cited row asserted CapabilityNbdProxyVirtualMedia for srv3, but the design doc itself flags that surface as UNSETTLED — /nbd/0 404s on a non-upgrade GET (indistinguishable from absent), and settlement is gated on the §6 operator ws-upgrade dry-run. Asserting the capability before the dry-run dispatches srv3 to NbdProxyVirtualMediaInstall on an ungrounded fact. Fix — leave the cited row at exactly what the read-only probe grounded: - drop CapabilityNbdProxyVirtualMedia from openbmc_2_07_00_capabilities (back to PowerControl/BootSourceOverride/AccountManagement/FirmwareUpdate — the 200-confirmed Redfish surfaces; KVM video != virtual media). - srv3 now HONESTLY solves to PxeHttpInstall today (FirmwareUpdate present, catalog has no VM-capable firmware), not NbdProxyVirtualMediaInstall. - witness: srv3_capabilities_are_grounded now asserts NbdProxyVirtualMedia == false; srv3_install_mechanism_is_nbd_proxy_vm_today -> srv3_install_mechanism_is_pxe_until_dry_run. Kept (reviewer: "the dispatch arm and discriminating RED rows are fine to land now"): the NbdProxyVirtualMediaInstall enum arm + solve precedence, and the synthetic-row proofs nbd_proxy_vm_capable_row_solves / redfish_vm_preferred_over_nbd_proxy — the arm is proven on a GROUNDED synthetic row, not on srv3's ungrounded one. Flipping srv3's row to CapabilityNbdProxyVirtualMedia is deferred to the PR that lands the §6 dry-run confirmation receipt. Design doc §5 updated to match. Witness 8/8 green by execution via claim_executor. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * WIP: srv3 WebUI-KVM virtual-media install, FROM SCRATCH: FIRST understand rep * Revert host-effect-orchestration.md to origin/main — my main_wet sweep was BACKWARDS (shipped false status) My prior "drift fix" was the wrong direction and un-landed correct status (§5 ships-false-status trap). Ground truth (parent neat-boar-71 verified by reading both files on origin/main): - the committed .md said Phase A "[LANDED #5756]" = CORRECT - the .dag authority (host_effect_orchestration.dag) says "[now, parallel]" = STALE (the authority itself was regressed, likely by #5764 grounding a pre-landed draft). main_wet regenerated the .md FROM the stale .dag, propagating the regression INTO the .md and reverting the accurate "[LANDED #5756]" back to "[now, parallel]". My differential control (committed == origin/main) only proved the drift was not introduced by this PR's 4 model files — it did NOT establish which side was correct. I wrongly assumed authority==truth; here the authority was the stale side. Fix: restore docs/plans/host-effect-orchestration.md to origin/main (the LANDED version). KEEP ROADMAP.md + roadmap_authority.dag (the srv3 orphan-doc pointer — legit BMC scope). Do NOT touch the .dag or re-run main_wet — the drift ROOT (stale .dag) is the host-effect lane's to fix in a separate focused PR. EXPECTED: generated_artifact_drift_gate stays RED on #5773 until the host-effect lane's .dag fix lands on main; that is correct, not a regression to chase. Rebase on main after their fix merges. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Brian Searls <briansrls@gunb.ai> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ore byte-equality proof (#5771) * WIP: P3-impl gap B: orchestration-as-intent emit(intent,Bash) core + retry_co * WIP: P3-impl gap B: orchestration-as-intent emit(intent,Bash) core + retry_co * WIP: P3-impl gap B: orchestration-as-intent emit(intent,Bash) core + retry_co * gap B review: hoist scenario extraction out of std (§3) + fail-closed Optional accessors (§5) Addresses claude-opus-4-7 review on #5771: - §3: remove retry_eagain_command/retry_eagain_pattern (gunbc-scenario nicknames) from v2.std.orchestration; the retry intent->(command,pattern) extraction now lives in the witness (gunbc layer), restoring the std<-extdeps<-workflow arrow. bash retry target models take command/pattern strings directly (gap-A emit_directive precedent: construction-safe, no Step sum-match in the realization). - §5: replace ''-fabricating accessors (classifier_pattern, step_run_command_spelling) with fail-closed Optional ones (classifier_log_pattern, step_command_spelling) -> Present only for the meaningful arm, Absent otherwise; witness threads Optional and a missing shape goes red instead of emitting an empty slot. Both witnesses green by execution under claim_batch; RED twin still breaks byte-equality. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * WIP: P3-impl gap B: orchestration-as-intent emit(intent,Bash) core + retry_co * WIP: P3-impl gap B: orchestration-as-intent emit(intent,Bash) core + retry_co * WIP: P3-impl gap B: orchestration-as-intent emit(intent,Bash) core + retry_co * WIP: P3-impl gap B: orchestration-as-intent emit(intent,Bash) core + retry_co * Regenerate host-effect-orchestration plan doc to match its .dag authority (drift fix) The committed .md carried a stale pre-grounding version ('LANDED #5756' Phase A/B text) that predated #5764's grounding of the plan into its gunbc.plans authority. Regenerated via main_wet so the projection matches the single-authority output (identical to origin/main); fixes the generated_artifact_drift_gate red. No 3-file scope content touched. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * WIP: P3-impl gap B: orchestration-as-intent emit(intent,Bash) core + retry_co * WIP: P3-impl gap B: orchestration-as-intent emit(intent,Bash) core + retry_co * WIP: P3-impl gap B: orchestration-as-intent emit(intent,Bash) core + retry_co * WIP: P3-impl gap B: orchestration-as-intent emit(intent,Bash) core + retry_co * WIP: P3-impl gap B: orchestration-as-intent emit(intent,Bash) core + retry_co * gap B (round-4): canonical list_head/list_tail + inline Predicate match; fix payload-concretization cascade Findings 1+2: deleted std nicknames (escalations_head/escalations_rest/ pipeline_first_step) and one-arm projections (predicate_log_pattern/ step_command_spelling); witness now calls canonical list_head/list_tail (algebra.dag) in test-local re-wrap helpers and matches the closed Predicate/Step coproducts inline, exhaustive + fail-closed. Interp constraint found by execution: field access / variant-match on a value bound directly from a generic list_head payload cascades (the payload type stays deferred). Concretize by re-wrapping into a concretely-annotated Optional<T> (escalation field access) and routing the Step variant-match through a concrete-EscalationLevel/Step-param helper (command extraction). 3/3 witnesses green by execution. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Brian Searls <briansrls@gunb.ai> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…mplete #5790) (#5796) #5790 restored host_effect_orchestration.dag Phase A/B to [LANDED #5756] but did NOT regenerate the committed .md projection. Meanwhile #5785 (a CI floor profiling run) had regenerated the .md from the THEN-stale .dag, leaving the committed .md at [now, parallel]. Result: .dag=LANDED vs committed .md=now-parallel — the drift gate stayed RED on main, blocking every open PR (the whole de-fork wave). This is a pure regen-on-main: the .dag authority is already correct and settled (#5790), so regenerating its projection makes projection(.dag) == committed .md with the LANDED text preserved. No content decision — just running main_wet on the already-correct authority. Verified: regen changes ONLY this file; .md now carries [LANDED #5756]; gate green. Co-authored-by: Brian Searls <briansearls1@gmail.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…599) + Optional receiver unwrap before method call (E0624) (#5777) * WIP: Lane A cargo-green re-census + Phase C1 fixed-point SCOPING (post measur * WIP: Lane A cargo-green re-census + Phase C1 fixed-point SCOPING (post measur * WIP: Lane A cargo-green re-census + Phase C1 fixed-point SCOPING (post measur * WIP: Lane A cargo-green re-census + Phase C1 fixed-point SCOPING (post measur * Fix E0599 over-broad Clone bound: narrow gate to body-is-not-param-ref Without the `body_is_param_ref` guard, `emit_fn_def` added `M: Clone` to every function whose return type was a bare generic param — breaking `generic_fn_emits_type_params_without_synthesized_bounds` (identity/fold_stack). Correct signal: `ExprVar` nodes carry the variable name as `.name` and have no children; `ExprFieldAccess` nodes carry the field name (not the receiver). So `body.name ∈ value_param_names` IFF the body is a direct parameter return. Clone bound is now added only when `return_is_bare_generic && !body_is_param_ref`, which fires for `measure_count<Q,S,M>(m) -> M { m.count }` (field access, M: Clone needed to call `.clone()` through Rc) but not for `identity<T>(x) -> T { x }` (direct param ref, no Rc access, no .clone() emitted). Also regenerate docs/plans/host-effect-orchestration.md from its .dag authority (pre-existing drift since #5764; the committed file matched an older Phase A/B state). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Revert host-effect-orchestration.md: drift fix was wrong-direction My regeneration via main_wet reverted the plan doc from LANDED [#5756] to [now, parallel] — wrong direction. The .dag Plan authority needs to be updated (not the committed .md) to fix the drift, and that belongs to the host-effect lane (neat-boar/fierce-carp). Restoring the correct LANDED state. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * E0091: realize unused type-alias params as PhantomData (cargo-green 2→0) type Compose<Algebra, MachineConstraint> = Phantom emits a bare Phantom ZST with neither param referenced in the RHS → E0091 ×2. Fix mirrors the struct path (rust_phantom_marker_inner, line ~3229): detect params absent from the alias RHS via alias_unused_param_names (same type_node_mentions_name predicate as struct_unused_param_names), then substitute std::marker::PhantomData<(Algebra, MachineConstraint)> for the RHS. Guard: only fires when unused_params |> count > 0 — param-using aliases (List<T>, Map<K,V>) have their params present in the RHS and are left unchanged. Witness: unused_param_alias_gets_phantom_data (positive — Compose gains PhantomData carrying both params) + param_using_alias_has_no_phantom_data (negative control — Wrapper<T> = List<T> is unperturbed). Both axes of E0599+E0624 witnesses still green (no regression). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fmt: fix brace placement + module order (cargo fmt --all --check red) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix html_markup_smoke_test: add dsl/extdeps source root (smoke dag imports extdeps.languages.html after d3ed2a9) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Brian Searls <briansrls@gunb.ai> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Host-effect interface Phase A: mint
apply(target, effect, policy) -> ReconciliationMints the one host-operation interface (
docs/plans/host-effect-orchestration.md, MERGED spec) as new.dag. Phase A only — model-before-implement; no B/C/D/E/F.What lands
gunbc.host_effect(agnostic interface — only the shapes):HostEffect = ShellCommand { script } | RedfishAction { action }— a COPRODUCT of effect-kinds (a Redfish op is a typed action, not bash).NodeControlPlane = HostOs { node } | BmcController { node }— target-duality: a logical node has two control planes (in-band OS shell/systemd, out-of-band BMC Redfish).applytargets a control plane, not a host address; the target supplies the WHERE (resolved overfleet_intent), the effect is pure intent.Policy = OneShotIdempotent | ConvergeToFixpoint;HostEffectIntent(provenance);HostEffectEvidence.std.realization_reconcile.Reconciliation<A,E>— NO second receipt grammar (DESIGN §3 single-authority).gunbc.host_effect_realize(dispatch + realization — peripheral to the interface, DESIGN §3):resolve_host_effect_cell= the single total dispatch fold over (control-plane × effect-kind), no_ =>arm → an incompatible combo (RedfishAction@HostOs,ShellCommand@BmcController) is a typedIncompatibleCellrefusal, unwritable-bad-state not a silent no-op (DESIGN §5).ShellCommand@HostOsREALIZED over LocalShell (extdeps.shell.shell.Exec.Run), grounded inline from the observed exit (nonzero exit →DoesNotGround→NotConverged; a failing read can never fabricateConverged).RedfishAction@BmcController= fail-closed UnimplementedNotConvergedstub — never a fake success on a power/boot action (the exact §5 trap). neat-boar-71 realizes it over RedfishRest in Phase C.host_effect_policy_directive:Converged → Settled; incompatible refusal →Refused(terminal regardless of policy — a mismatch never converges, soConvergeToFixpointcan't re-drive it forever); compatibleNotConverged → ReDrive(Converge) /Settled(OneShot). This is the seam neat-boar's Phase-C poll-loop composes on.extdeps.bmc.types:RedfishSystemActionarm TYPE (4 variants, FINAL-pinned with neat-boar:SetBootSourceOverride/ResetSystem/SetAccountPassword{new_password: Secret}/GetSystem), reusing the existing boot/reset enums + stdSecret; no host/system_id/creds fields (the WHERE is theBmcControllertarget, keeping the action transport-agnostic).Execution evidence (not grep)
host_effect_apply_holdsgreen by execution — 9 sub-witnesses over all four cells (realsh -c true/sh -c "exit 1") + the policy directive.FAIL). The green is earned.gunbc compile --target rust, whole corpus): 597 files, 0 diagnostics.Review notes
gunbc.*(the application layer above the product domain models, imports point toward std), not literallyproduct/. Confirmed correct.NodeControlPlane.node : ComputeHost(neat-boar point . #3): confirmed the right carrier —ComputeHostbindsBmcEndpointper node viabaseboard.bmc(andHostIdentityviaidentity), so Phase-CBmcController(node)resolvesbmc_host+ creds overfleet_intentwithout an interface refactor. Settled in A, verified by neat-boar.ShellCommand.script : String(claude-opus-4-7, non-blocking 🟡): a Phase-A scaffold — the in-band arm carries a raw bash string for the same reason there's no shell-action grammar yet (symmetric to RedfishAction being typed). Dissolves onto a future shell-action AST authority when one exists; tracked here rather than as an inert marker._doc: Stringconstants were removed (zero-consumer; the corpus-wide prose-in-data retirement). Rationale lives in this description + commit history. Typed refusal strings inside theIncompatibleCell/NotConvergedarms stay — those are located diagnostics, not docs.