feat(agent): fail-closed seat resolution under MOSAIC_AGENTS_DIR override (#46)

Owner decision after live verification of M18: an explicit agents-dir
override that cannot resolve the named seat now refuses the launch
(exit 4, names the seat and dir) instead of launching seatless and
unbounded. Unsetting the override keeps the M13 plain governed TUI.
MOSAIC_ROLES_DIR needs no symmetric change - the M18 gate already
refuses unresolvable role contracts.

Task suite 88 -> 90 (refusal + refusal-names-the-seat). TOOLS.md Agent
section documents the refusal.

Suites 24/90/14/17 + verify green.
This commit is contained in:
2026-09-03 19:45:10 -05:00
parent ca8135d70c
commit d1d7b5598d
7 changed files with 52 additions and 2 deletions
+23
View File
@@ -499,3 +499,26 @@ tools/ tree; suites green at every gate.
Seat roles are ceilings, not labels: the M15 role field now resolves to a
versioned contract that seats cannot escalate past. Suites 24/88/14/17 +
verify green.
## Phase 23 follow-up: fail-closed seat resolution under override (#46)
- Owner live-verified M18 (2026-09-03): ceiling narrowing note with the
correct narrowed set, missing-contract refusal message, clean researcher
launch, validator positives and negatives, tool-free note — all as
expected.
- The verification surfaced a governance gap: an explicit
MOSAIC_AGENTS_DIR override that cannot resolve the named seat still
launched — seatless, unbounded, no role ceiling to bind.
- Owner decision: fail closed. agent.sh now refuses (exit 4, names the
seat and the dir) when the override is set and no seat definition
resolves; unsetting the override keeps the M13 plain governed TUI.
MOSAIC_ROLES_DIR needs no symmetric change — the M18 gate already
refuses unresolvable contracts.
- Task suite 88 → 90 (refusal + refusal-names-the-seat); TOOLS.md Agent
section documents the refusal.
## Result
Suites 24/90/14/17 + verify green. Seat resolution is now fail closed in
every direction: unknown seat under override, declared role without
contract, invalid contract, empty ceiling intersection.