Skip to content
This repository was archived by the owner on Aug 7, 2026. It is now read-only.

feat(helm-module-contracts): extract HelmModule + ModuleState from runway-app-host (RFL-128) - #10

Merged
kpernyer merged 7 commits into
mainfrom
e11/rfl-128-extract-helm-module-contract
Jul 6, 2026
Merged

kpernyer merged 7 commits into
mainfrom
e11/rfl-128-extract-helm-module-contract

Conversation

@kpernyer

@kpernyer kpernyer commented Jul 4, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • Moves HelmModule trait and ModuleState enum from runtime-runway/runway-app-host into the neutral helm-module-contracts crate — Foundation no longer defines its own mounting contract inside a substrate repo
  • init() signature simplified: removes unused &HostContext parameter (no module ever accessed it)
  • helm-operator-control and helm-truth-execution: runway-app-host dep fully removed (only needed the contract)
  • helm-coordination, helm-governed-jobs, helm-session-host: retain dep for EventHub/SSE/SessionOwnershipLayer; marked # RP-HELMS-SUBSTRATE-SEAM in Cargo.toml and registered in repo-layering.md seam table

Test plan

  • just ci passes in bedrock-platform/helms (fmt + clippy + tests)
  • helm-module-contracts: 8 unit tests pass
  • helm-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 intact

Fixes: 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 (init signature and import paths) across helms and runtime-runway; incorrect sibling checkout on CI could mask integration failures until main lands.

Overview
RFL-128 layering: HelmModule and ModuleState move from runway-app-host into neutral helm-module-contracts (via the contracts/ mini-workspace). HelmModule::init drops the unused &HostContext argument.

Dependencies: helm-operator-control and helm-truth-execution depend only on helm-module-contracts (no runway-app-host). helm-coordination, helm-governed-jobs, and helm-session-host still path-dep runway-app-host for EventHub/SSE/session substrate types, documented as # RP-HELMS-SUBSTRATE-SEAM.

CI: Adds REFLECTIVE_SIBLING_REF (github.head_ref on PRs, else main) so sibling repos clone the same branch for coordinated cross-repo changes, with validation/fallback in checkout-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.

…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>
@cursor

cursor Bot commented Jul 4, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot 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)

@cursor

cursor Bot commented Jul 4, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot 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>
@cursor

cursor Bot commented Jul 5, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot 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>
@cursor

cursor Bot commented Jul 5, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot 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>
@cursor

cursor Bot commented Jul 5, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot 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>
@cursor

cursor Bot commented Jul 6, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot 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>
@cursor

cursor Bot commented Jul 6, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot 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)

@kpernyer
kpernyer merged commit c6c5057 into main Jul 6, 2026
2 checks passed
@kpernyer
kpernyer deleted the e11/rfl-128-extract-helm-module-contract branch July 6, 2026 16:53
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant