Skip to content

feat(runner): model-placement execute gate — enforce frontier_ok/model_class (Closes #2195) - #2201

Open
mellanon wants to merge 1 commit into
mainfrom
feat/2195-model-placement-gate
Open

feat(runner): model-placement execute gate — enforce frontier_ok/model_class (Closes #2195)#2201
mellanon wants to merge 1 commit into
mainfrom
feat/2195-model-placement-gate

Conversation

@mellanon

Copy link
Copy Markdown
Contributor

RFC-0005 §2.5 consumer half. Gate at dispatch (after harness select, before spawn): frontier-placement harness + local-only envelope → policy_denied/term, no spawn. Harness→placement map config-declared (execution.model_placement), fail-closed on unknown. Reader imported from @the-metafactory/myelin (verified exported). Inert without config. Fail-before verified. No merge.

…l_class at dispatch (Closes #2195)

RFC-0005 §2.5 consumer half (myelin#260/PR#265 shipped the producer half:
frontier-combo reject + the parseSovereignty/canReachFrontier reader). Nothing
enforced placement at execution — no execute path lives in myelin. This gate is
that enforcement, at cortex's dispatch decision point.

- New src/runner/model-placement-gate.ts: imports parseSovereignty from the
  @the-metafactory/myelin package (the pinned 0.6.0 dep exports it — verified;
  NOT re-vendored). evaluateModelPlacement: a `frontier`-placement harness may
  run an envelope only if canReachFrontier; a `local` placement runs anything.
- Harness→placement map is CONFIG-DECLARED (execution.model_placement in both
  cortex-config.ts and config.ts schemas), FAIL-CLOSED on unknown (an unmapped
  harness id → frontier, so a local-only envelope never runs on an unclassified
  harness). No hardcoded model list beyond the config default.
- Wired into dispatch-listener AFTER harness selection, BEFORE harness.dispatch:
  a violation emits a terminal dispatch.task.failed { kind: policy_denied }
  (the RFC-0010 permanent shape, same pattern as #2191), releases the admission
  lease, and never spawns. Inert (CO-4) when the config block is absent —
  byte-identical dispatch. New `placement-checked` trace stage.

Tests: gate unit (fail-closed resolution + frontier/local/missing-frontier_ok
rules) + dispatch-listener integration (frontier harness + local-only envelope
→ policy_denied, NO spawn; frontier-cleared or local placement → spawns; inert
without config). REFUSED case verified fail-before (spawns when enforcement
neutralized) / pass-after. Full runner (1020) + common (2004) suites green;
tsc + lint clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@mellanon
mellanon requested a review from jcfischer as a code owner July 17, 2026 03:15
mellanon added a commit that referenced this pull request Jul 25, 2026
…rd-disable investigation findings (#2376)

Verifies current state of NWS review F3/F4 against origin/main + EBH-1 (merged
same day). F3: sovereigntyEnforce still defaults false on both review-consumer
and brain-consumer, with no config key to flip it; the review's named
prerequisite (cortex#327) turns out to verify envelope-signer identity, not
the consuming agent's own modelClass -- the real spoofability gap is tracked
open at #2117, with PR #2201 (unmerged, CI red) the likely fix. F4: guard-off
trigger chain confirmed sound (platform-authenticated identity, no forgeable
producer found); real residual risk is indirect injection into an
already-legitimate guard-off session, where EBH-1 now covers the file-tool
surface but Bash remains a full blind spot. Corrects a stale citation: G-301
(issue #42) does not exist as tracked work -- #42 is an unrelated, merged
migration PR.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
mellanon added a commit that referenced this pull request Jul 25, 2026
…tex#2380) (#2382)

Add policy.sovereignty.enforce (boolean, default false) so a principal can
see and, if they choose, flip the consumer-side sovereignty gate instead of
it being reachable only from a test-only constructor arg. Threads the same
resolved value into both review-consumer.ts and brain-consumer.ts so the
two lanes never diverge on this flag again. Resolved posture is logged
unconditionally at boot (cortex: security posture -- sovereignty.enforce=...)
mirroring the existing security.signing posture line.

This is a posture-visibility change, not a posture flip: default stays
false everywhere, no template or example enables it, and the docs now say
plainly that sovereignty violations are detected and logged, not denied,
naming the real prerequisite (#2117 / PR #2201) instead of the closed-but-
unrelated #327. Also corrects the stale G-301/#42 citation (G-301 was never
filed as trackable work; #42 is an unrelated merged migration PR) in
hardening-plan.md and security-preamble.ts, pointing at #2377 instead.

Closes #2380

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
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.

1 participant