Repository navigation
refactor(reborn): rename LocalDevOutboundStores -> OutboundStores (§4.4) - #6220
Conversation
🔎 IronLoop Review StatusHead: Current reviewers:
Reviewer summaries
Recent activity
Available commands
Run metadataAdmission: webhook accepted the request and IronLoop persisted reviewer state before this projection. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
💤 Files with no reviewable changes (1)
📝 WalkthroughSummary by CodeRabbit
WalkthroughRenames ChangesOutbound store type rename
Estimated code review effort: 1 (Trivial) | ~5 minutes Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 3 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (3 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Code Review
This pull request consolidates the in-memory test stores by removing InMemoryOutboundStateStore, InMemoryDeliveredGateRouteStore, and InMemoryTriggeredRunDeliveryStore in favor of using the production FilesystemOutboundStateStore backed by an in-memory filesystem (InMemoryBackend). A new test_support module is introduced in ironclaw_outbound to provide a helper for instantiating this consolidated store in tests. Usages across multiple crates and integration tests have been updated accordingly, and the architecture ratchets have been adjusted to reflect these removals. Additionally, redundant aliases like LocalDevRootFilesystem and LocalDevOutboundStores have been cleaned up and renamed to CompositeRootFilesystem and OutboundStores. As there are no review comments, I have no feedback to provide.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
0f66c28 to
71ce0ec
Compare
|
🚅 Deployed to the ironclaw-pr-6220 environment in ironclaw-ci-preview
|
✅ Ready for mergeReviewed — trivial §4.4 rename ( 🤖 Generated with Claude Code |
4fad36a to
bca5038
Compare
71ce0ec to
2cdd519
Compare
…name ratchet (§4.4/§10)
Completes the §4.4-mandated enforcement — "no public type name contains
Local/LocalDev/Hosted/Enterprise" (the doc says: "Enforce it with an
ironclaw_architecture test"). The existing `reborn_localdev_typename_ratchet`
owns `LocalDev*` (shrinking to empty as Slice B lands) and explicitly scopes out
"the broader Local*/Hosted* audit ... as a separate concern." This companion
ratchet owns that separate concern — the OTHER three prefixes:
- `Enterprise*` — NONE exist (achieved). Empty allowlist locks it in: a new
`EnterpriseTierPolicy`-style mode leak fails the "no new" check.
- `Hosted*` — all `HostedMcp*`/discovery/egress, a Bucket-3 FALSE POSITIVE
("hosted MCP" is a real domain concept — a platform-hosted MCP server — not a
hosted-TIER deployment mode). Frozen/justified so a genuine `HostedTierRuntime`
leak can't slip in behind them.
- `Local*` (excluding `LocalDev*` → sibling ratchet, and `Locale*` → localization
false positive) — the `LocalTriggerAccess*` family is genuine Bucket-1 debt
(§4.4 folds `local_trigger_access` into "seed owner grant from config at boot,"
a policy value); `LocalInvocationServicesResolver` awaits a design-call rename.
Reuses the shared `ratchet_support` scanner (comments/strings stripped,
visibility-aware, skips tests/examples/benches). Same frozen-set contract as the
sibling ratchets: no new type, no duplicate definition, trim on delete/rename.
Predicate uses `starts_with` (not `contains`) so mid-word `Local` (`HookLocalId`)
is not flagged; a self-test pins that + the `LocalDev`/`Locale` exclusions.
Test-only, no production change. Verified: 2 tests pass (frozen allowlist +
predicate self-test); clippy -D warnings clean; fmt + pre-commit clean.
Stacked on #6220.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
bca5038 to
0f07808
Compare
2cdd519 to
e739afb
Compare
…name ratchet (§4.4/§10)
Completes the §4.4-mandated enforcement — "no public type name contains
Local/LocalDev/Hosted/Enterprise" (the doc says: "Enforce it with an
ironclaw_architecture test"). The existing `reborn_localdev_typename_ratchet`
owns `LocalDev*` (shrinking to empty as Slice B lands) and explicitly scopes out
"the broader Local*/Hosted* audit ... as a separate concern." This companion
ratchet owns that separate concern — the OTHER three prefixes:
- `Enterprise*` — NONE exist (achieved). Empty allowlist locks it in: a new
`EnterpriseTierPolicy`-style mode leak fails the "no new" check.
- `Hosted*` — all `HostedMcp*`/discovery/egress, a Bucket-3 FALSE POSITIVE
("hosted MCP" is a real domain concept — a platform-hosted MCP server — not a
hosted-TIER deployment mode). Frozen/justified so a genuine `HostedTierRuntime`
leak can't slip in behind them.
- `Local*` (excluding `LocalDev*` → sibling ratchet, and `Locale*` → localization
false positive) — the `LocalTriggerAccess*` family is genuine Bucket-1 debt
(§4.4 folds `local_trigger_access` into "seed owner grant from config at boot,"
a policy value); `LocalInvocationServicesResolver` awaits a design-call rename.
Reuses the shared `ratchet_support` scanner (comments/strings stripped,
visibility-aware, skips tests/examples/benches). Same frozen-set contract as the
sibling ratchets: no new type, no duplicate definition, trim on delete/rename.
Predicate uses `starts_with` (not `contains`) so mid-word `Local` (`HookLocalId`)
is not flagged; a self-test pins that + the `LocalDev`/`Locale` exclusions.
Test-only, no production change. Verified: 2 tests pass (frozen allowlist +
predicate self-test); clippy -D warnings clean; fmt + pre-commit clean.
Stacked on #6220.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Post-restack confirmation (after #6213's merge): rebased onto main, CI fully green on the current head. Still ready for merge. |
Second §4.4 de-prefix slice (after C1's LocalDevRootFilesystem inline). Advances the doc's §4.4 enforcement endgame — "no public type name contains Local/LocalDev/Hosted/Enterprise" — one more type. `LocalDevOutboundStores` is a plain bundle struct (four outbound-store handle fields), NOT a cfg-switched policy/mode type. Its own constructor comment says it "works in both durable (libsql/postgres) and no-durable (in-memory backend) builds" — so the `LocalDev` prefix is factually wrong (it is used in libsql/ postgres PRODUCTION builds, not just local-dev). This is a bucket-2-style mis-prefix: a genuine composition type that only LOOKS like a deployment-mode leak, so the fix is a de-prefix rename, not the bucket-1 DeploymentConfig resolution the cfg-switched `LocalDev*Store` aliases need. Renamed the struct + its 3 use sites (all in factory.rs) to `OutboundStores` (name was free); trimmed it from the R2 `reborn_localdev_typename` ratchet allowlist. The `local_dev_outbound_store` builder fn keeps its name (fn names are not type-name leaks; the ratchet inventories types only). Pure type rename, semantically identical. Verified: localdev ratchet 4; `cargo build -p ironclaw_reborn_composition` (default + libsql+slack+telegram) clean; clippy -D warnings clean; fmt + pre-commit clean. Stacked on #6218. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
e739afb to
bcc2a5c
Compare
…name ratchet (§4.4/§10)
Completes the §4.4-mandated enforcement — "no public type name contains
Local/LocalDev/Hosted/Enterprise" (the doc says: "Enforce it with an
ironclaw_architecture test"). The existing `reborn_localdev_typename_ratchet`
owns `LocalDev*` (shrinking to empty as Slice B lands) and explicitly scopes out
"the broader Local*/Hosted* audit ... as a separate concern." This companion
ratchet owns that separate concern — the OTHER three prefixes:
- `Enterprise*` — NONE exist (achieved). Empty allowlist locks it in: a new
`EnterpriseTierPolicy`-style mode leak fails the "no new" check.
- `Hosted*` — all `HostedMcp*`/discovery/egress, a Bucket-3 FALSE POSITIVE
("hosted MCP" is a real domain concept — a platform-hosted MCP server — not a
hosted-TIER deployment mode). Frozen/justified so a genuine `HostedTierRuntime`
leak can't slip in behind them.
- `Local*` (excluding `LocalDev*` → sibling ratchet, and `Locale*` → localization
false positive) — the `LocalTriggerAccess*` family is genuine Bucket-1 debt
(§4.4 folds `local_trigger_access` into "seed owner grant from config at boot,"
a policy value); `LocalInvocationServicesResolver` awaits a design-call rename.
Reuses the shared `ratchet_support` scanner (comments/strings stripped,
visibility-aware, skips tests/examples/benches). Same frozen-set contract as the
sibling ratchets: no new type, no duplicate definition, trim on delete/rename.
Predicate uses `starts_with` (not `contains`) so mid-word `Local` (`HookLocalId`)
is not flagged; a self-test pins that + the `LocalDev`/`Locale` exclusions.
Test-only, no production change. Verified: 2 tests pass (frozen allowlist +
predicate self-test); clippy -D warnings clean; fmt + pre-commit clean.
Stacked on #6220.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Coverage ratchetReborn integration-tier coverageLine coverage (Reborn crates): 85.58% — 306523 / 358153 lines Per-crate breakdown (65 crates, lowest-covered first)
This table itself is informational and never gates the PR on its own — not the percentage, not the per-crate holes, not the 0-coverage callout. A separate coverage ratchet (dry-run until enforce=true; see tests/integration/coverage-floor.toml) can fail the build on specific configured floors. Exemptions (3 entry/entries excluded from the accounting above)
|
…name ratchet (§4.4/§10) (#6222) * refactor(reborn): rename LocalDevOutboundStores -> OutboundStores (§4.4) Second §4.4 de-prefix slice (after C1's LocalDevRootFilesystem inline). Advances the doc's §4.4 enforcement endgame — "no public type name contains Local/LocalDev/Hosted/Enterprise" — one more type. `LocalDevOutboundStores` is a plain bundle struct (four outbound-store handle fields), NOT a cfg-switched policy/mode type. Its own constructor comment says it "works in both durable (libsql/postgres) and no-durable (in-memory backend) builds" — so the `LocalDev` prefix is factually wrong (it is used in libsql/ postgres PRODUCTION builds, not just local-dev). This is a bucket-2-style mis-prefix: a genuine composition type that only LOOKS like a deployment-mode leak, so the fix is a de-prefix rename, not the bucket-1 DeploymentConfig resolution the cfg-switched `LocalDev*Store` aliases need. Renamed the struct + its 3 use sites (all in factory.rs) to `OutboundStores` (name was free); trimmed it from the R2 `reborn_localdev_typename` ratchet allowlist. The `local_dev_outbound_store` builder fn keeps its name (fn names are not type-name leaks; the ratchet inventories types only). Pure type rename, semantically identical. Verified: localdev ratchet 4; `cargo build -p ironclaw_reborn_composition` (default + libsql+slack+telegram) clean; clippy -D warnings clean; fmt + pre-commit clean. Stacked on #6218. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(reborn): add the Hosted*/Enterprise*/Local* deployment-mode-typename ratchet (§4.4/§10) Completes the §4.4-mandated enforcement — "no public type name contains Local/LocalDev/Hosted/Enterprise" (the doc says: "Enforce it with an ironclaw_architecture test"). The existing `reborn_localdev_typename_ratchet` owns `LocalDev*` (shrinking to empty as Slice B lands) and explicitly scopes out "the broader Local*/Hosted* audit ... as a separate concern." This companion ratchet owns that separate concern — the OTHER three prefixes: - `Enterprise*` — NONE exist (achieved). Empty allowlist locks it in: a new `EnterpriseTierPolicy`-style mode leak fails the "no new" check. - `Hosted*` — all `HostedMcp*`/discovery/egress, a Bucket-3 FALSE POSITIVE ("hosted MCP" is a real domain concept — a platform-hosted MCP server — not a hosted-TIER deployment mode). Frozen/justified so a genuine `HostedTierRuntime` leak can't slip in behind them. - `Local*` (excluding `LocalDev*` → sibling ratchet, and `Locale*` → localization false positive) — the `LocalTriggerAccess*` family is genuine Bucket-1 debt (§4.4 folds `local_trigger_access` into "seed owner grant from config at boot," a policy value); `LocalInvocationServicesResolver` awaits a design-call rename. Reuses the shared `ratchet_support` scanner (comments/strings stripped, visibility-aware, skips tests/examples/benches). Same frozen-set contract as the sibling ratchets: no new type, no duplicate definition, trim on delete/rename. Predicate uses `starts_with` (not `contains`) so mid-word `Local` (`HookLocalId`) is not flagged; a self-test pins that + the `LocalDev`/`Locale` exclusions. Test-only, no production change. Verified: 2 tests pass (frozen allowlist + predicate self-test); clippy -D warnings clean; fmt + pre-commit clean. Stacked on #6220. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(reborn): deployment-mode ratchet matches contained words, not prefixes Addresses all three review findings on #6222: - IronLoop: §4.4's rule is "no public type name CONTAINS Local/Hosted/ Enterprise" — the predicate now matches the terms at any CamelCase word boundary (followed by uppercase/digit/underscore/end), which surfaces and freezes 16 previously-invisible mode-shaped mid-names: the RebornLocal* composition family, the Reborn*LocalTriggerAccess* backends, mid-name LocalDev types, and HookLocalId (justified-keep: hook-local id is a domain concept, annotated as such). - Gemini (both): localization names need no hand-listed exceptions under boundary matching — Locale*/Localization*/Localised* continue lowercase so the word is not "Local"; the self-test now pins those exclusions plus the mid-name positives (RebornLocalRuntimeServices, HookLocalId, SelfHostedMcpClient). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
) * refactor(reborn): rename LocalDevOutboundStores -> OutboundStores (§4.4) Second §4.4 de-prefix slice (after C1's LocalDevRootFilesystem inline). Advances the doc's §4.4 enforcement endgame — "no public type name contains Local/LocalDev/Hosted/Enterprise" — one more type. `LocalDevOutboundStores` is a plain bundle struct (four outbound-store handle fields), NOT a cfg-switched policy/mode type. Its own constructor comment says it "works in both durable (libsql/postgres) and no-durable (in-memory backend) builds" — so the `LocalDev` prefix is factually wrong (it is used in libsql/ postgres PRODUCTION builds, not just local-dev). This is a bucket-2-style mis-prefix: a genuine composition type that only LOOKS like a deployment-mode leak, so the fix is a de-prefix rename, not the bucket-1 DeploymentConfig resolution the cfg-switched `LocalDev*Store` aliases need. Renamed the struct + its 3 use sites (all in factory.rs) to `OutboundStores` (name was free); trimmed it from the R2 `reborn_localdev_typename` ratchet allowlist. The `local_dev_outbound_store` builder fn keeps its name (fn names are not type-name leaks; the ratchet inventories types only). Pure type rename, semantically identical. Verified: localdev ratchet 4; `cargo build -p ironclaw_reborn_composition` (default + libsql+slack+telegram) clean; clippy -D warnings clean; fmt + pre-commit clean. Stacked on #6218. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(reborn): add the Hosted*/Enterprise*/Local* deployment-mode-typename ratchet (§4.4/§10) Completes the §4.4-mandated enforcement — "no public type name contains Local/LocalDev/Hosted/Enterprise" (the doc says: "Enforce it with an ironclaw_architecture test"). The existing `reborn_localdev_typename_ratchet` owns `LocalDev*` (shrinking to empty as Slice B lands) and explicitly scopes out "the broader Local*/Hosted* audit ... as a separate concern." This companion ratchet owns that separate concern — the OTHER three prefixes: - `Enterprise*` — NONE exist (achieved). Empty allowlist locks it in: a new `EnterpriseTierPolicy`-style mode leak fails the "no new" check. - `Hosted*` — all `HostedMcp*`/discovery/egress, a Bucket-3 FALSE POSITIVE ("hosted MCP" is a real domain concept — a platform-hosted MCP server — not a hosted-TIER deployment mode). Frozen/justified so a genuine `HostedTierRuntime` leak can't slip in behind them. - `Local*` (excluding `LocalDev*` → sibling ratchet, and `Locale*` → localization false positive) — the `LocalTriggerAccess*` family is genuine Bucket-1 debt (§4.4 folds `local_trigger_access` into "seed owner grant from config at boot," a policy value); `LocalInvocationServicesResolver` awaits a design-call rename. Reuses the shared `ratchet_support` scanner (comments/strings stripped, visibility-aware, skips tests/examples/benches). Same frozen-set contract as the sibling ratchets: no new type, no duplicate definition, trim on delete/rename. Predicate uses `starts_with` (not `contains`) so mid-word `Local` (`HookLocalId`) is not flagged; a self-test pins that + the `LocalDev`/`Locale` exclusions. Test-only, no production change. Verified: 2 tests pass (frozen allowlist + predicate self-test); clippy -D warnings clean; fmt + pre-commit clean. Stacked on #6220. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(reborn): deployment-mode ratchet matches contained words, not prefixes Addresses all three review findings on #6222: - IronLoop: §4.4's rule is "no public type name CONTAINS Local/Hosted/ Enterprise" — the predicate now matches the terms at any CamelCase word boundary (followed by uppercase/digit/underscore/end), which surfaces and freezes 16 previously-invisible mode-shaped mid-names: the RebornLocal* composition family, the Reborn*LocalTriggerAccess* backends, mid-name LocalDev types, and HookLocalId (justified-keep: hook-local id is a domain concept, annotated as such). - Gemini (both): localization names need no hand-listed exceptions under boundary matching — Locale*/Localization*/Localised* continue lowercase so the word is not "Local"; the self-test now pins those exclusions plus the mid-name positives (RebornLocalRuntimeServices, HookLocalId, SelfHostedMcpClient). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(host_api): introduce Slice-C Invocation payload vocabulary (#6168) First sub-slice of Slice C (arch-simplification §3/§5) — the capability-path DTO collapse. Per the migration plan (§9), the kernel vocabulary lands in `ironclaw_host_api` *first*, ahead of any wiring; this PR adds the single data-plane payload every layer will reference, replacing the request side of the ~14-hop re-wrap (§1.1). - ids.rs (via the crate's own `uuid_id!`/`string_id!` macros): - `ActivityId` — the invocation's idempotency identity (§11.3); what §1.1's dead-future `idempotency_key` becomes, unified rather than deleted. - `ProductKind` / `RoutineId` — validated string newtypes for the two non-loop origins (kept strings, not enums, while the product/routine sets evolve, §5.8). - invocation.rs (new): - `InvocationOrigin { LoopRun(RunId) | Product(ProductKind) | Automation(RoutineId) }` — sealed-at-membrane origin (§5.2.1); snake_case wire-tagged; `.kind()` discriminant pinned to the tag for per-origin accounting views (§5.3.3). - `Invocation { activity_id, capability, input, scope, actor, origin, estimate }` — the "one payload" (§3/§4.1). Reuses existing host_api types; `actor` is required (sealed), and authorization *outputs* (`mounts`, `resource_reservation`) are deliberately absent — they move into the sealed `Authorized` in a later slice. Additive only — nothing is wired into the dispatch path yet. The five old request DTOs still exist and function; per §9 the type count rises before it falls (~14 → ~18 → ~11) as the new vocabulary and old shapes coexist. `check-type-duplicates.py` does not flag `Invocation` against `CapabilityDispatchRequest` (it is a genuinely distinct state, not a mirror). Tests are crate-tier because the types are not production-wired yet; integration coverage is owed when a later slice threads `&Invocation` through the four capability mediators (testing.md: crate-tier when the harness cannot reach the path). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(host_api): assert specific validation rejections in origin-id tests Gemini note on #6223: pin the kind + reason of each expected rejection instead of bare is_err(), so an infrastructure failure can't masquerade as a validation pass. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
What
Second §4.4 de-prefix (after C1's
LocalDevRootFilesysteminline). Advances the doc's §4.4 enforcement endgame — "no public type name containsLocal/LocalDev/Hosted/Enterprise" — one more type.LocalDevOutboundStoresis a plain bundle struct (four outbound-store handle fields), not a cfg-switched policy/mode type. Its own constructor comment states it "works in both durable (libsql/postgres) and no-durable (in-memory backend) builds" — so theLocalDevprefix is factually wrong (used in libsql/postgres production builds, not just local-dev). This is a bucket-2-style mis-prefix (a genuine composition type that only looks like a mode leak), so the fix is a de-prefix rename — not the bucket-1DeploymentConfigresolution the cfg-switchedLocalDev*Storealiases require.Changes
factory.rs) →OutboundStores(name was free).reborn_localdev_typenameratchet allowlist.local_dev_outbound_storebuilder fn keeps its name (fn names aren't type-name leaks; the ratchet inventories types only).Pure type rename, semantically identical.
Verification
cargo build -p ironclaw_reborn_composition(default + libsql+slack+telegram) clean; clippy-D warningsclean; fmt + pre-commit cleanStack
Stacked on #6218.
🤖 Generated with Claude Code