Skip to content

fix(supervisor): close adapter subscription and log-filter gaps - #99

Merged
mfw78 merged 6 commits into
mainfrom
seam/c4-role
Aug 6, 2026
Merged

fix(supervisor): close adapter subscription and log-filter gaps#99
mfw78 merged 6 commits into
mainfrom
seam/c4-role

Conversation

@mfw78

@mfw78 mfw78 commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

What

Extends the chain-log fail-closed gate from #65 to the two remaining escape paths: adapter [[subscriptions]] entries and chain-log filter values.

load_provider now reads the adapter manifest's subscriptions and refuses boot on a chain not present in engine_cfg.chains, matching the module-side check.

Chain-log filter address and event_signature values are validated at load time and refuse boot on a parse failure, instead of being warn-skipped when the collection-time subscription list is rebuilt.

The boot_single manifest role now comes from the Role table (promoted to its own supervisor::role module) instead of a name-based fallback, and the provider/module load loops and telemetry helpers are folded to share that role-keyed path.

Why

Closes #80

The red-team on #65 found both gaps out of that PR's scope by design: adapter subscriptions never went through load_provider's chain check, and invalid filter values only warned at collection time rather than failing the boot that declared them. Both are the same fail-open family as #65 and belong on the same pre-compile, config-keyed gate.

Testing

cargo nextest run -p nexum-runtime supervisor::tests::chain_gate covering: boot_refuses_an_adapter_subscription_on_an_unconfigured_chain (adapter subscription past [chains] refuses before read component/compile), boot_refuses_an_invalid_chain_log_filter (bad address and bad topic each refuse boot with the offending detail in the message), and a_validated_chain_log_filter_survives_to_the_collected_subscription (a valid filter boots alive and the collected subscription's serialised filter carries the same address and topic).
unconfigured_chain_message_says_none_when_engine_toml_declares_no_chains updated for the new Role parameter on the shared refusal-message builder.

AI Assistance

Implementation by Claude Fable 5, red-team review by Claude Opus 5, PR by Claude Sonnet 5.

@mfw78
mfw78 force-pushed the seam/c3-bootenv branch from 82c7698 to 59029ef Compare August 6, 2026 07:36
@mfw78
mfw78 force-pushed the seam/c3-bootenv branch from 59029ef to 086005f Compare August 6, 2026 07:41
@mfw78
mfw78 changed the base branch from seam/c3-bootenv to main August 6, 2026 07:44
mfw78 added 6 commits August 6, 2026 07:45
…d name fallbacks

AI Assistance: Claude Fable 5 used for implementation and tests
AI Assistance: Claude Fable 5 used for implementation and tests
AI Assistance: Claude Fable 5 used for implementation and tests
…-log filters

AI Assistance: Claude Fable 5 used for implementation and tests
…e table

AI Assistance: Claude Opus 5 used for review and the fix
…e refusal point

AI Assistance: Claude Opus 5 used for review and the tests
@mfw78
mfw78 merged commit 574be89 into main Aug 6, 2026
4 checks passed
@mfw78
mfw78 deleted the seam/c4-role branch August 6, 2026 07:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

supervisor: provider subscriptions and chain-log filter values escape boot validation

1 participant