feat(helm-module-contracts): extract HelmModule + ModuleState from runway-app-host (RFL-128) - #10
Conversation
…nway-app-host (RFL-128) Move HelmModule trait and ModuleState enum from runtime-runway/runway-app-host into the neutral helm-module-contracts crate so Foundation no longer defines its own mounting contract inside a substrate repo. - HelmModule: async init(), router(), module_state() — now with #[async_trait] for dyn-compatibility; init() no longer takes HostContext (was never used by any module) - ModuleState: Shell/Live enum — also moved - runway-app-host re-exports both via thin module.rs shim - helm-operator-control, helm-truth-execution: runway-app-host dep fully removed - helm-coordination, helm-governed-jobs, helm-session-host: retain dep for EventHub/SSE/SessionOwnershipLayer; annotated # RP-HELMS-SUBSTRATE-SEAM Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_f0f5745a-e427-4fb7-8f1e-90a24d0dce22) |
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_274083ca-a4fe-4323-8bda-44bcffdbe0ee) |
…e crate Cargo loads all workspace members when following any path dep into the workspace. Since helm-module-contracts is now also a path dep of runtime-runway (RFL-128), CI for runtime-runway would need all of helms' transitive sibling repos checked out. Fix: remove helm-module-contracts from the workspace members list and give it explicit Cargo.toml values (no workspace inheritance). Cargo can then follow the path dep and build only this crate without loading the full helms workspace. helm-module-contracts tests are preserved via an explicit manifest-path test step added to the Justfile test recipe. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_a1c6f886-fcbb-4da0-b098-dc1e34a3f62d) |
…rkspace Cargo walks up from a path-dep crate to find its workspace root. With helm-module-contracts inside crates/, it found helms/Cargo.toml and tried to load all 30+ workspace members — cascading into converge/organism/etc. that aren't checked out on runtime-runway CI. Fix: introduce contracts/Cargo.toml as a minimal workspace root (one member). Cargo now stops at contracts/ when following the path dep from runtime-runway, loading only helm-module-contracts and its crates.io deps. The helms workspace is unaffected because contracts/ is not in its members list. - contracts/Cargo.toml: mini-workspace with helm-module-contracts as its sole member - contracts/crates/helm-module-contracts/: crate moved from crates/ - All helms crates: path dep updated from ../helm-module-contracts to ../../contracts/crates/helm-module-contracts - Justfile: fmt-check, check, lint, test all cover contracts/ explicitly Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_25f1a7ec-b35e-4576-aa43-94b465551a12) |
The full mount + SSE route integration test created a circular CI dependency: helms CI checks out runtime-runway main, where RunwayAppHost::mount() expects its locally-defined HelmModule, not helm_module_contracts::HelmModule. This caused a type mismatch until runtime-runway PR #15 merges. Keep only the contract assertion (module reports Live state). The full host-mount SSE integration test will live in runtime-runway once PR #15 lands. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_8321584f-a091-4631-a130-dc697b9764d5) |
checkout-reflective-siblings.sh now reads REFLECTIVE_SIBLING_REF (default main) and tries to clone each sibling at that branch before falling back to main. ci.yml sets it to github.head_ref so PRs on e11/rfl-128-* pick up matching sibling branches (atelier-showcase, arena-tests, etc.) instead of main, which doesn't yet have the contracts/ path change. Value is validated against ^[a-zA-Z0-9/._-]+$ before use to prevent argument injection in the git clone --branch call. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_21696164-02b7-4275-9da2-2e6e0889ca4d) |
Without this patch helms resolved converge-storage from crates.io (3.9.3, object_store ^0.13) while converge-manifold-adapters (also patched to local) used object_store 0.14 directly, causing an E0308 type mismatch on ObjectStore in object_storage/mod.rs. Adding converge-storage to [patch.crates-io] forces the whole graph onto the local sibling checkout (which uses object_store.workspace = true → 0.14 from the converge workspace), unifying the trait instance. Cargo.lock regenerated from scratch after the patch was added. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_3eb55ef7-0333-4539-be4e-8601a36c074a) |
Summary
HelmModuletrait andModuleStateenum fromruntime-runway/runway-app-hostinto the neutralhelm-module-contractscrate — Foundation no longer defines its own mounting contract inside a substrate repoinit()signature simplified: removes unused&HostContextparameter (no module ever accessed it)helm-operator-controlandhelm-truth-execution:runway-app-hostdep fully removed (only needed the contract)helm-coordination,helm-governed-jobs,helm-session-host: retain dep for EventHub/SSE/SessionOwnershipLayer; marked# RP-HELMS-SUBSTRATE-SEAMin Cargo.toml and registered in repo-layering.md seam tableTest plan
just cipasses inbedrock-platform/helms(fmt + clippy + tests)helm-module-contracts: 8 unit tests passhelm-truth-execution: 6 tests pass (registry_test.rs imports from helm_module_contracts)helm-operator-control: 11 tests pass (module_test.rs imports from helm_module_contracts)helm-coordination,helm-governed-jobs,helm-session-host: all tests pass with approved seam dep intactFixes: https://linear.app/reflective-labs/issue/RFL-128/extract-helm-module-contract-from-runway-app-host-layering-debt
🤖 Generated with Claude Code
Note
Medium Risk
Breaking change to the shared module mounting contract (
initsignature and import paths) across helms and runtime-runway; incorrect sibling checkout on CI could mask integration failures until main lands.Overview
RFL-128 layering:
HelmModuleandModuleStatemove fromrunway-app-hostinto neutralhelm-module-contracts(via thecontracts/mini-workspace).HelmModule::initdrops the unused&HostContextargument.Dependencies:
helm-operator-controlandhelm-truth-executiondepend only onhelm-module-contracts(norunway-app-host).helm-coordination,helm-governed-jobs, andhelm-session-hoststill path-deprunway-app-hostfor EventHub/SSE/session substrate types, documented as# RP-HELMS-SUBSTRATE-SEAM.CI: Adds
REFLECTIVE_SIBLING_REF(github.head_refon PRs, elsemain) so sibling repos clone the same branch for coordinated cross-repo changes, with validation/fallback incheckout-reflective-siblings.sh.Docs: Changelog [Unreleased] → Changed records the extraction and dependency split.
Reviewed by Cursor Bugbot for commit 2d9170f. Bugbot is set up for automated code reviews on this repo. Configure here.