Skip to content

test(reborn): freeze the RebornServicesApi facade method set (§5.2.5/§10) - #6292

Merged
ilblackdragon merged 2 commits into
mainfrom
ratchet/reborn-facade-method-freeze
Jul 20, 2026
Merged

ilblackdragon merged 2 commits into
mainfrom
ratchet/reborn-facade-method-freeze

Conversation

@ilblackdragon

Copy link
Copy Markdown
Member

Implements §5.2.5 step 1 ("freeze the facade now") of docs/reborn/2026-07-17-architecture-simplification-dto-dyn-local.md — the obvious unblocked next step on the §5.2 axis, independent of the in-flight §5.3 Resolution flip stack and Slice 0.

What

Adds crates/ironclaw_architecture/tests/reborn_facade_method_freeze_ratchet.rs — the sixth §10 anti-slippage ratchet, joining the InMemory-store, LocalDev-typename, deployment-mode-typename, deployment-mode-branching, capability-DTO-collapse, and Authorized-seal ratchets already on main.

It freezes the current 88-method RebornServicesApi trait block (crates/ironclaw_product_workflow/src/reborn_services.rs) as a set-membership allowlist (§10: set membership, never a count) and fails on:

  • a new trait method not in FROZEN_REBORN_SERVICES_METHODS — the freeze. A new product operation is a matrix-declared capability descriptor or a view descriptor (§5.2), never a facade method.
  • a removed method not trimmed from the allowlist — so the list shrinks in lock-step as each mutation migrates to a descriptor, toward the ~8-method turn-lifecycle + invoke/query end-state (§5.2.5 step 5).
  • a duplicate method name (defensive).

How it differs from the sibling ratchets

The sibling ratchets scan type definitions (struct/enum/trait/type) via the shared ratchet_support scanners. §10 requires the facade freeze be "generated from the trait block itself, not a file-wide grep," so this ratchet adds a brace-depth-aware trait-method extractor: it reads only the RebornServicesApi block, at trait-declaration depth (a fn inside a default-method body is ignored), over comment-/string-stripped source (reusing ratchet_support::strip_comments_and_strings).

Testing

Ships with self-tests (per "guardrails are code"):

  • extract_trait_methods_self_test — async + multi-line signatures, default bodies with nested fns and inner braces, impl-block/free fns after the block, and comment/string decoys.
  • extract_trait_methods_missing_trait_self_test — a renamed/absent trait yields no methods, so the main test's non-empty guard fires loudly rather than passing silently.
  • reborn_facade_method_allowlist_is_frozen_and_only_shrinks — asserts against live source.

Verified the ratchet bites: injecting brand_new_feature_method into the trait produced FAILED … Offending new methods: ["brand_new_feature_method"]. cargo test -p ironclaw_architecture fully green; cargo clippy -p ironclaw_architecture --test reborn_facade_method_freeze_ratchet --all-features -- -D warnings clean.

Follow-ups (not this PR)

🤖 Generated with Claude Code

…§10)

§5.2.5 step 1 of the architecture-simplification note: freeze the product
facade now so any *new* method fails CI and the §5.2 migration stops the
bleeding before it starts. The product surface is turn-lifecycle + `invoke`
(commands) + `query` (reads); a new product operation is a matrix-declared
capability descriptor or a view descriptor, never a facade method.

Adds `reborn_facade_method_freeze_ratchet.rs`, the sixth §10 anti-slippage
ratchet, alongside the InMemory-store / LocalDev-typename / deployment-mode /
capability-DTO-collapse / Authorized-seal ratchets. It freezes the current
88-method `RebornServicesApi` trait block
(`crates/ironclaw_product_workflow/src/reborn_services.rs`) as a set-membership
allowlist (§10: set membership, never a count) and fails on:

- a new trait method not in the allowlist (the freeze);
- a removed method not trimmed from the allowlist (so the list shrinks in
  lock-step toward the ~8-method turn-lifecycle + invoke/query end-state);
- a duplicate method name (defensive).

Unlike the sibling type-name ratchets, this one extracts the method set of one
trait block via a brace-depth-aware scan (a `fn` inside a default-method body
is ignored) over comment-/string-stripped source, reusing
`ratchet_support::strip_comments_and_strings`. Ships with self-tests covering
async/multi-line signatures, default bodies with nested fns and inner braces,
impl-block/free fns, and comment/string decoys; verified it bites by injecting
a method and observing the failure name it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ironloopai

ironloopai Bot commented Jul 19, 2026 •

Copy link
Copy Markdown
Contributor

🔎 IronLoop Review Status

Head: b3050d72412c1c0afa575d65d158abeece28d27b
Result: 1/1 reviewers completed without blocking findings.
Next: Ready for normal human review and CI checks.
Updated: 2026-07-19T23:33:35.324Z

Current reviewers:

Reviewer State Verdict Findings Last update
ironloop/common-reviewer (reviewer) Completed Approved 0 blocking findings / 0 notes 2026-07-19T23:33:35.315Z
Reviewer summaries
Reviewer Detail
ironloop/common-reviewer (reviewer) Approved; 0 blocking findings; Reviewed a normal, focused PR: one new 382-line architecture ratchet test and no production changes. The extractor is scoped to the exact RebornServicesApi trait, and the frozen…
Recent activity
Time Reviewer State Detail
2026-07-19T23:00:20.631Z ironloop/common-reviewer (reviewer) Completed Review completed and terminal status was persisted.
2026-07-19T23:30:19.091Z ironloop/common-reviewer (reviewer) Superseded A newer PR head replaced this review (b3050d7).
2026-07-19T23:30:34.718Z ironloop/common-reviewer (reviewer) Queued Accepted review request for head b3050d7.
2026-07-19T23:30:34.718Z ironloop/common-reviewer (reviewer) Queued Waiting for this reviewer lane to become available.
2026-07-19T23:30:35.725Z ironloop/common-reviewer (reviewer) Started Reviewer worker started.
2026-07-19T23:30:39.111Z ironloop/common-reviewer (reviewer) Workspace ready Prepared isolated checkout (merge_ref) at f840b4d.
2026-07-19T23:33:35.315Z ironloop/common-reviewer (reviewer) Result captured Approved; 0 blocking findings.
2026-07-19T23:33:35.315Z ironloop/common-reviewer (reviewer) Completed Review completed and terminal status was persisted.
Available commands
  • @ironloopai help
  • @ironloopai agents
  • @ironloopai review
  • @ironloopai review --agent <agent>
Run metadata

Admission: webhook accepted the request and IronLoop persisted reviewer state before this projection.

@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-6292 July 19, 2026 22:57 Destroyed
@github-actions github-actions Bot added size: XS < 10 changed lines (excluding docs) risk: low Changes to docs, tests, or low-risk modules contributor: core 20+ merged PRs labels Jul 19, 2026
@coderabbitai

coderabbitai Bot commented Jul 19, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Summary by CodeRabbit

  • Tests
    • Added automated checks that “freeze” the Reborn services API interface to detect unexpected method changes before release.
    • The test validates extracted trait method names are non-empty, contain no duplicates, only use approved allowlisted methods, and don’t miss any allowlisted entries.
    • Additional guardrails ensure parsing behaves correctly and fails safely if the targeted trait is renamed or altered unexpectedly.

Walkthrough

Adds a Rust architecture test that freezes the RebornServicesApi method surface, extracts trait-level methods while ignoring decoys, and fails when methods are added, removed, duplicated, or when the trait cannot be found.

Changes

Reborn facade ratchet

Layer / File(s) Summary
Facade contract and method extraction
crates/ironclaw_architecture/tests/reborn_facade_method_freeze_ratchet.rs
Defines the frozen method allowlist and extracts RebornServicesApi declarations by trait-level brace depth after stripping comments and strings.
Ratchet assertions and extractor self-tests
crates/ironclaw_architecture/tests/reborn_facade_method_freeze_ratchet.rs
Checks for method additions, removals, duplicates, and empty extraction; self-tests cover nested functions, decoy text, and renamed or prefixed traits.

Estimated code review effort: 2 (Simple) | ~10 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning Several required template sections are missing, including Change Type, Linked Issue, Security Impact, and Rollback Plan. Add the repository template headings and complete the missing sections/checklists, especially Change Type, Linked Issue, Validation, and Rollback Plan.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed Conventional-commit style title clearly matches the freeze-ratchet change.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a new test file, reborn_facade_method_freeze_ratchet.rs, which implements an anti-slippage ratchet to freeze the RebornServicesApi trait block and prevent the facade method surface from growing. The reviewer identified an issue in the trait extraction logic where a simple substring search could match traits sharing a common prefix (e.g., RebornServicesApiExt instead of RebornServicesApi). They recommended using boundary-aware matching to ensure robust and accurate extraction.

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.

Comment on lines +165 to +168
let decl = format!("trait {trait_name}");
let Some(decl_pos) = stripped.find(&decl) else {
return Vec::new();
};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The current substring matching logic stripped.find(&decl) can incorrectly match traits that share a common prefix with the target trait (for example, RebornServicesApiExt would be matched if it is defined before RebornServicesApi). To prevent this, we should ensure that the character immediately following the matched trait name is not a word character (i.e., not alphanumeric or underscore), adhering to boundary-aware matching principles.

    let decl = format!("trait {trait_name}");
    let mut start = 0;
    let decl_pos = loop {
        if let Some(pos) = stripped[start..].find(&decl) {
            let absolute_pos = start + pos;
            let next_byte = stripped.as_bytes().get(absolute_pos + decl.len());
            if next_byte.map_or(true, |&b| !b.is_ascii_alphanumeric() && b != b'_') {
                break Some(absolute_pos);
            }
            start = absolute_pos + 1;
        } else {
            break None;
        }
    };
    let Some(decl_pos) = decl_pos else {
        return Vec::new();
    };
References
  1. When scanning or matching terms in CamelCase identifiers, prefer structural or boundary-aware matching (e.g., requiring the term to be followed by an uppercase letter, digit, underscore, or end of string) over maintaining explicit prefix exception lists to prevent enumeration drift.

@ironloopai ironloopai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ IronLoop Review: reviewer

Review at a glance

Verdict Blocking Notes Inline Head
❌ Changes requested 1 0 1 3e97e8f93c69

Head: 3e97e8f93c691ddea5f91e739c205124a251092f
Next: Fix the blocking findings, push the PR branch, then re-run this reviewer.

Run details

Status: Current
Needs human: no
Needs validation: no

Summary

The new facade-freeze ratchet can silently bind to a renamed/prefixed trait instead of RebornServicesApi, defeating its stated rename guard.

Findings

Blocking: 1 / Notes: 0

Blocking findings

1. ❌ [MEDIUM] Require an exact trait-name match

Location: crates/ironclaw_architecture/tests/reborn_facade_method_freeze_ratchet.rs:166
find("trait {trait_name}") accepts a prefix match. If RebornServicesApi is renamed to RebornServicesApiV2 (or _legacy) with the same method set, this extractor scans that different trait and the ratchet passes, despite its promised fail-loud behavior on a rename. Require a non-identifier boundary after trait_name (and add that prefixed-name case to the missing-trait self-test).

Developer follow-up

After fixing this feedback:

  1. Push the fix to this PR branch.
  2. Re-run this reviewer with @ironloopai review --agent reviewer if you only changed this reviewer's findings.
  3. Re-run all reviewers with @ironloopai review when the fix may affect multiple areas.

fn extract_trait_methods(source: &str, trait_name: &str) -> Vec<String> {
let stripped = strip_comments_and_strings(source);
let decl = format!("trait {trait_name}");
let Some(decl_pos) = stripped.find(&decl) else {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This substring search also matches trait RebornServicesApiV2 / _legacy. A rename retaining the same method set would therefore pass while scanning the wrong trait. Require an identifier boundary after the name and self-test that prefix case.

@railway-app

railway-app Bot commented Jul 19, 2026 •

Copy link
Copy Markdown

🚅 Deployed to the ironclaw-pr-6292 environment in ironclaw-ci-preview

Service Status Web Updated (UTC)
ironclaw ✅ Success (View Logs) Web Jul 19, 2026 at 11:41 pm

@github-actions

Copy link
Copy Markdown
Contributor

Coverage ratchet

Ratchet mode: ENFORCING

RATCHET PASS: global
  observed: 85.63% (313644 / 366296 lines)
  floor:    85.3% (tolerance 0.5pp -> effective floor 84.8%)
  denominator: 366296 lines now vs 320188 at floor capture (+46108 lines, +14.4%) — material change (>5%)

⚠️ 2 Reborn crate(s) have 0 int-tier coverage (target: 0) — ironclaw_prompt_envelope, ironclaw_scripts

Reborn integration-tier coverage

Line coverage (Reborn crates): 85.63% — 313644 / 366296 lines

Per-crate breakdown (65 crates, lowest-covered first)
Crate Line % Covered / Total
ironclaw_prompt_envelope 0% 0 / 88
ironclaw_scripts 0% 0 / 345
ironclaw_runtime_policy 33.84% 89 / 263
ironclaw_event_projections 43.31% 673 / 1554
ironclaw_observability 61.54% 16 / 26
ironclaw_authorization 62.46% 604 / 967
ironclaw_dispatcher 62.88% 83 / 132
ironclaw_mcp 64.89% 595 / 917
ironclaw_triggers 65.44% 2142 / 3273
ironclaw_filesystem 67.78% 3957 / 5838
ironclaw_channel_host 68.65% 219 / 319
ironclaw_memory 69.2% 773 / 1117
ironclaw_reborn_migration 71.64% 1551 / 2165
ironclaw_trust 72.88% 661 / 907
ironclaw_wasm_limiter 74.6% 47 / 63
ironclaw_reborn_event_store 74.67% 958 / 1283
ironclaw_extractors 74.72% 538 / 720
ironclaw_capabilities 75.58% 2092 / 2768
ironclaw_projects 76.48% 400 / 523
ironclaw_reborn_cli 77.07% 10249 / 13298
ironclaw_llm 78.36% 20306 / 25915
ironclaw_product_context 78.57% 11 / 14
ironclaw_run_state 79.25% 424 / 535
ironclaw_telegram_extension 80.18% 4842 / 6039
ironclaw_wasm_product_adapters 80.36% 1448 / 1802
ironclaw_process_sandbox 80.65% 671 / 832
ironclaw_first_party_extensions 81.06% 5965 / 7359
ironclaw_memory_native 81.17% 3195 / 3936
ironclaw_events 81.95% 1594 / 1945
ironclaw_network 82.98% 673 / 811
ironclaw_reborn_identity 83.59% 433 / 518
ironclaw_processes 83.76% 939 / 1121
ironclaw_secrets 83.79% 2548 / 3041
ironclaw_wasm 84.44% 1069 / 1266
ironclaw_auth 84.81% 3233 / 3812
ironclaw_product_workflow 84.91% 11031 / 12992
ironclaw_reborn_config 85.2% 2055 / 2412
ironclaw_turns 85.58% 14398 / 16825
ironclaw_channel_delivery 85.79% 1383 / 1612
ironclaw_common 86.13% 1714 / 1990
ironclaw_threads 86.93% 4708 / 5416
ironclaw_slack_v2_adapter 87.3% 1491 / 1708
ironclaw_skills 87.58% 4470 / 5104
ironclaw_reborn_composition 88.05% 70660 / 80253
ironclaw_product_adapter_registry 88.06% 531 / 603
ironclaw_host_api 88.1% 3894 / 4420
ironclaw_product_adapters 88.1% 3384 / 3841
ironclaw_reborn_traces 88.2% 11946 / 13544
ironclaw_hooks 88.3% 10036 / 11366
ironclaw_host_runtime 88.69% 18060 / 20363
ironclaw_webui 88.9% 7652 / 8607
ironclaw_extensions 89.38% 2971 / 3324
ironclaw_reborn_openai_compat 89.5% 3778 / 4221
ironclaw_runner 89.65% 17365 / 19370
ironclaw_telegram_v2_adapter 89.7% 2717 / 3029
ironclaw_approvals 90.18% 1598 / 1772
ironclaw_conversations 90.39% 3123 / 3455
ironclaw_event_streams 90.82% 1009 / 1111
ironclaw_resources 91.65% 4476 / 4884
ironclaw_loop_host 92.28% 15577 / 16880
ironclaw_attachments 93.06% 630 / 677
ironclaw_agent_loop 94.88% 9184 / 9680
ironclaw_safety 95.09% 3682 / 3872
ironclaw_outbound 95.52% 3451 / 3613
ironclaw_first_party_extension_ports 95.62% 3672 / 3840

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)
Module / Crate Reason Issue
crate: ironclaw_embeddings v1-only: consumed only by root ironclaw (src/app.rs, src/tools/builtin/memory.rs, src/workspace/mod.rs, src/config/{mod,embeddings}.rs); no crates/* dependents. Covered by "Tests (Legacy)". #5657
crate: ironclaw_gateway v1-only: consumed only by root ironclaw (src/channels/web/platform/static_files.rs, src/channels/web/handlers/frontend.rs); no crates/* dependents. Covered by "Tests (Legacy)". #5657
crate: ironclaw_tui v1-only: consumed only by root ironclaw (src/main.rs, src/channels/tui.rs); no crates/* dependents. Crate's own doc comment confirms it bridges INTO v1, not Reborn. Covered by "Tests (Legacy)". #5657

…ndaries (#6292 IronLoop/Gemini)

The trait extractor did a plain substring `find("trait RebornServicesApi")`, so
a rename that keeps the same method set — `trait RebornServicesApiV2`,
`RebornServicesApi_legacy`, or a `subtrait`-like prefix — would silently bind to
the renamed trait and defeat the freeze's stated rename guard.

Require a word boundary on both sides of the trait name: `trait` must start a
word and the character right after the name must not be an identifier char.
Also fixes the formatting/Code-Style CI failures on the file.

Regression: `extract_trait_methods_rejects_renamed_or_prefixed_trait_self_test`
asserts the renamed/prefixed variants extract no methods while the exact
`trait RebornServicesApi` (incl. a supertrait bound / generics after the name)
still binds.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-6292 July 19, 2026 23:30 Destroyed
@ilblackdragon

Copy link
Copy Markdown
Member Author

Addressed IronLoop + Gemini's blocking finding (substring trait match could bind to a renamed/prefixed trait) plus the Code-Style/Formatting CI failures — fixed in b3050d724.

The extractor did a plain find("trait RebornServicesApi"), so trait RebornServicesApiV2 / RebornServicesApi_legacy (a rename keeping the same method set) would silently bind and defeat the rename guard. It now requires a word boundary on both sides of the trait name: trait must start a word and the char right after the name must not be an identifier char. Regression extract_trait_methods_rejects_renamed_or_prefixed_trait_self_test asserts the renamed/prefixed variants extract nothing while the exact trait RebornServicesApi (incl. a : Send supertrait bound / generics) still binds. clippy --tests clean, cargo fmt --all --check clean, all 4 ratchet tests pass.

@ilblackdragon

Copy link
Copy Markdown
Member Author

@ironloopai review

@ironloopai ironloopai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ IronLoop Review: reviewer

Review at a glance

Verdict Blocking Notes Inline Head
✅ Approved 0 0 0 b3050d72412c

Head: b3050d72412c1c0afa575d65d158abeece28d27b
Next: No reviewer action needed.

Run details

Status: Current
Needs human: no
Needs validation: no

Summary

Reviewed a normal, focused PR: one new 382-line architecture ratchet test and no production changes. The extractor is scoped to the exact RebornServicesApi trait, and the frozen set matches all 88 current direct trait methods.

Findings

None.

Developer follow-up

After fixing this feedback:

  1. Push the fix to this PR branch.
  2. Re-run this reviewer with @ironloopai review --agent reviewer if you only changed this reviewer's findings.
  3. Re-run all reviewers with @ironloopai review when the fix may affect multiple areas.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/ironclaw_architecture/tests/reborn_facade_method_freeze_ratchet.rs`:
- Around line 262-265: Update the duplicate filtering around the `duplicated`
collection to store and check references in the existing `BTreeSet` instead of
cloning each extracted method name. Preserve the current duplicate detection and
collected-result behavior while changing the set and `seen.insert` types to use
string references.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 574253ea-e9d8-44ad-9e21-164f301acb19

📥 Commits

Reviewing files that changed from the base of the PR and between 3e97e8f and b3050d7.

📒 Files selected for processing (1)
  • crates/ironclaw_architecture/tests/reborn_facade_method_freeze_ratchet.rs

Comment on lines +262 to +265
let duplicated: Vec<&String> = found
.iter()
.filter(|m| !seen.insert((*m).clone()))
.collect();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Avoid unnecessary string allocations in the duplicate filter.

You can store references in the BTreeSet to avoid cloning every extracted method name during the duplicate check.

♻️ Proposed refactor
-    let duplicated: Vec<&String> = found
-        .iter()
-        .filter(|m| !seen.insert((*m).clone()))
-        .collect();
+    let duplicated: Vec<&String> = found
+        .iter()
+        .filter(|&m| !seen.insert(m))
+        .collect();
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/ironclaw_architecture/tests/reborn_facade_method_freeze_ratchet.rs`
around lines 262 - 265, Update the duplicate filtering around the `duplicated`
collection to store and check references in the existing `BTreeSet` instead of
cloning each extracted method name. Preserve the current duplicate detection and
collected-result behavior while changing the set and `seen.insert` types to use
string references.

@ilblackdragon

Copy link
Copy Markdown
Member Author

✅ Ready for merge — facade-method-freeze ratchet (§5.2.5/§10). IronLoop: approved, 0 blocking. Fixed the earlier blocking finding (substring trait match could bind to a renamed/prefixed trait) with a word-boundary match + regression test, and the Code-Style/Formatting CI failures. CI green.

@ilblackdragon
ilblackdragon merged commit 1cbd5bf into main Jul 20, 2026
65 checks passed
@ilblackdragon
ilblackdragon deleted the ratchet/reborn-facade-method-freeze branch July 20, 2026 00:49
ilblackdragon added a commit that referenced this pull request Jul 20, 2026
Reconcile the capability-result collapse stack (host_api::Resolution as the
single loop-facing capability result; CapabilityOutcome deleted;
GateRecordStore + ReplayPayloadStore host-private stores) with 16 advancing
main commits — DeploymentConfig owns every deployment axis (#6279),
enforcement axes become resolved policy values (#6277), RebornServicesApi
facade method-set freeze (#6292), hermetic NEARAI env tests (#6272),
checkpoint stores over production impls (#6260), and the turn-state row
store work (#6263).

Single conflict: tests/integration/support/harness/mod.rs — both sides added
fields to the same refresh-input struct literal. Resolved by unioning them:
main's `trajectory_observer: None` + `extension_management` block AND the
collapse's `gate_record_store` + `replay_payload_store`.

Verified: `cargo build --workspace --all-features [--tests]` clean (no API
drift), all 12 `ironclaw_architecture` ratchet binaries pass (collapse ratchet
coexists with main's new deployment-mode-branching and facade-method-freeze
ratchets).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ilblackdragon added a commit that referenced this pull request Jul 20, 2026
…uest-side) collapse plan (#6306)

§14 status log was stale — it listed the §5.3 five-channel flip as "in flight on
integration/reborn-flip-base" and said "CapabilityOutcome is retained for Stage 2b
to delete", but that work has landed on main:

- Move the §5.3 flip stack from "In flight" to "Merged"; record #6293 (Stage 2b —
  CapabilityOutcome + all result mirrors DELETED), #6299 (the stack squash-landed on
  main, reconciled with #6279/#6277/#6292/#6296), and #6303 (auth-gate setup
  fingerprint fix + injective encoding).
- Fix the Slice C.1 bullet: the Resolution/Blocked/Suspension/HostFailure channel
  enums are now merged too.
- Add the remaining work under "Not started": the Slice C down-path (request-side)
  collapse — the 9 request mirrors still frozen in FROZEN_COLLAPSE_DTOS — with the
  concrete risk-ordered slice sequence (D1 dispatch→Authorized, D2 authorize(&Invocation),
  D3 loop membrane mints Invocation, D4 resume/auth-resume, D5 security-milestone
  seal inline, D6 ratchet-to-empty + measure).

Docs-only; the frozen contract (§1–§13) is unchanged, only the mutable §14 log.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

This branch was successfully deployed

No deployments
ironclaw-ci-preview / ironclaw-pr-6292 — b3050d72 Deployed Jul 19, 2026 by railway-app[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

contributor: core 20+ merged PRs risk: low Changes to docs, tests, or low-risk modules size: XS < 10 changed lines (excluding docs)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant