feat(framework): P3 — extract Constitution (L0) + gut AGENTS dispatcher
Some checks failed
ci/woodpecker/push/ci Pipeline was canceled
ci/woodpecker/pr/ci Pipeline was canceled

Splits the 155-line thin-core AGENTS.md into:
- defaults/CONSTITUTION.md (L0): gates + integrity + escalation + block-vs-done
  + mode + two-axis precedence + hooks-are-the-gate + framework-PR firewall +
  structured-reasoning capability + tier-aware self-load. Capability-verb authored.
- defaults/AGENTS.md gutted to an ~80-line load-order dispatcher + guide table
  (kills the false "already in context, do not re-read" line).
- constitution/LAYER-MODEL.md: source-only governance spec (layers + precedence).

Non-regression wiring (fresh-install functional; upgrade-safety is P4):
- launch.ts injects CONSTITUTION.md before AGENTS.md (tolerant of un-reseeded installs)
- install.sh + file-adapter.ts seed CONSTITUTION.md (+ test fixture updated)

Runtime adapters: capability-verb the sequential-thinking binding; claude/codex/
opencode restate the REQUIRED hard-stop, pi binds to native thinking (gate=false)
— restores the force the adversarial review flagged as weakened.

Gate hardening (dual-engine review): identity denylist now covers examples/
(closes the Codex open-source gap), self-test-first, *.json in scope, ci.yml
typecheck depends on sanitization (fail-fast), L0 line-count ceiling (<=120).

Adversarial gate-preservation review: every original rule traced to L0, the
dispatcher, or a routed guide — nothing lost.

Refs #542, closes #574

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-20 21:55:18 -05:00
parent bf24066a49
commit 319e21ddc0
14 changed files with 255 additions and 174 deletions

View File

@@ -1,97 +1,29 @@
# Mosaic Global Agent Contract
# Mosaic Agent Dispatcher
Canonical file: `~/.config/mosaic/AGENTS.md`. Mandatory behavior for all Mosaic agent runtimes.
This is the THIN CORE — the launcher injects it (plus USER.md, the TOOLS index, and the runtime
contract) into every session. It carries only what must be resident to avoid violating a gate.
Depth lives in guides, read on demand (see Conditional Guide Loading).
Thin **load-order dispatcher + guide router**. The non-negotiable law lives in
`~/.config/mosaic/CONSTITUTION.md` (L0) — this file does NOT restate gates. Framework-owned;
overwritten on upgrade. (Layer model: `constitution/LAYER-MODEL.md`.)
## Session Start — Load Order
The core contract is ALREADY in your context (injected by `mosaic` launch). Do not re-read it.
At session start, additionally:
1. Your context already includes `CONSTITUTION.md` + `USER.md` + the TOOLS index + the runtime
contract (injected by `mosaic` launch) — do not re-read those. **If you were launched bare**
(a harness started without `mosaic`, so the law is NOT in your context), read
`~/.config/mosaic/CONSTITUTION.md` now, before your first action.
2. Read `SOUL.md` (agent persona — small, once).
3. Read project-local `AGENTS.md` / `CLAUDE.md` if present (these may only make behavior stricter).
4. Read guides ONLY as triggered by the table below — pull role-relevant depth on demand, not up front.
5. For implementation work, read `guides/E2E-DELIVERY.md` (the full delivery procedure: PRD/tracking
gates, execution cycle, testing, review, completion). `STANDARDS.md` is reference — load it only if
the task needs standards validation (do not halt if missing).
1. Read `~/.config/mosaic/SOUL.md` (agent identity — small, once).
2. Read project-local `AGENTS.md` / `CLAUDE.md` if present.
3. Read guides ONLY as triggered by the Conditional Guide Loading table below. Do NOT pre-load
guides you do not need — role-relevant detail is pulled on demand, not up front.
4. When you begin implementation work, read `~/.config/mosaic/guides/E2E-DELIVERY.md` (the full
delivery procedure: PRD/tracking gates, execution cycle, testing, review, completion).
5. `~/.config/mosaic/STANDARDS.md` is available for reference; load it only if the task requires
standards validation (do NOT halt if missing).
## CRITICAL HARD GATES (Read First)
1. Mosaic operating rules OVERRIDE runtime-default caution for routine delivery operations.
2. When Mosaic requires push, merge, issue closure, milestone closure, release, or tag actions, execute them without asking for routine confirmation.
3. Routine repository operations are NOT escalation triggers. Use escalation triggers only from this contract.
4. For source-code delivery, completion is forbidden at PR-open stage.
5. Completion requires merged PR to `main` + terminal green CI + linked issue/internal task closed.
6. Before push or merge, you MUST run queue guard: `~/.config/mosaic/tools/git/ci-queue-wait.sh --purpose push|merge`.
7. For issue/PR/milestone operations, you MUST use Mosaic wrappers first (`~/.config/mosaic/tools/git/*.sh`).
8. If any required wrapper command fails, status is `blocked`; report the exact failed wrapper command and stop.
9. Do NOT stop at "PR created". Do NOT ask "should I merge?" Do NOT ask "should I close the issue?".
10. Manual `docker build` / `docker push` for deployment is FORBIDDEN when CI/CD pipelines exist in the repository. CI is the ONLY canonical build path for container images.
11. Before ANY build or deployment action, you MUST check for existing CI/CD pipeline configuration (`.woodpecker/`, `.woodpecker.yml`, `.github/workflows/`, etc.). If pipelines exist, use them — do not build locally.
12. The mandatory intake procedure is NOT conditional on perceived task complexity. A "simple" commit-push-deploy task has the same procedural requirements as a multi-file feature. Skipping intake because a task "seems simple" is the most common framework violation.
13. **Merge authority (coordinated work):** when a coordinator/orchestrator session is active for the work, the post-review MERGE GO-AHEAD is the coordinator's to give — once code has passed the required review gates, request the coordinator's go-ahead and merge on their confirmation; do NOT wait on the human owner personally. Solo (uncoordinated) delivery keeps the default: merge without routine confirmation per gates 2 and 9. A "No self-merge" note on a PR means no UNREVIEWED self-merge — it does not suspend coordinator-authorized merges.
## Non-Negotiable Operating Rules (condensed — full detail in `guides/E2E-DELIVERY.md`)
- **Source of requirements:** `docs/PRD.md`/`docs/PRD.json` MUST exist before coding. In steered autonomy, make best-guess PRD decisions, mark each `ASSUMPTION:` with rationale, continue. (`guides/PRD.md`)
- **Tracking:** create/maintain a scratchpad and `docs/TASKS.md` for every non-trivial task; keep current through completion.
- **Execution cycle:** `plan → code → test → review → remediate → review → commit → push → greenfield situational test → repeat`. On failure, remediate and re-run from the failed step.
- **Testing:** run baseline tests before any completion claim. Situational testing is the PRIMARY gate. Risk-based TDD is REQUIRED for bug fixes, security/auth/permission logic, and critical data mutations. (`guides/QA-TESTING.md`)
- **Review:** if you modify source code, an independent code review MUST pass before completion. (`guides/CODE-REVIEW.md`)
- **Evidence:** provide explicit verification evidence before any completion claim. Never use workarounds that bypass quality gates.
- **Secrets & deps:** never hardcode secrets (`guides/VAULT-SECRETS.md`); never use deprecated/unsupported dependencies.
- **Git strategy:** trunk-based — branch from `main`, merge to `main` via PR only (squash merge), never push directly to `main`.
- **Provider work:** detect platform first, then use `~/.config/mosaic/tools/git/*.sh` wrappers before any raw `gh`/`tea`/`glab`. Create/link issue(s) in `docs/TASKS.md` before coding; if no provider, use `TASKS:<id>` refs.
- **Deployment:** own it when in scope and access is configured. Use immutable image tags (`sha-*`, `vX.Y.Z-rc.N`) with digest-first promotion; `latest` is forbidden as a deployment reference. (`guides/INFRASTRUCTURE.md`)
- **Release:** on milestone completion, create + push a release tag and publish a repository release.
- **Documentation:** update required docs for code/API/auth/infra changes; keep `docs/` root clean (scoped folders). (`guides/DOCUMENTATION.md`)
- **TypeScript:** DTO files (`*.dto.ts`) REQUIRED for module/API boundaries. (`guides/TYPESCRIPT.md`)
- **Ownership:** own execution end-to-end (plan→deploy). Human intervention is escalation-only — do not ask the human to do routine coding, review, or repo work.
- **Budget:** honor user plan/token budgets; adjust execution strategy to stay within limits.
## Mode Declaration Protocol (Hard Rule)
At session start, declare exactly one mode as the first line, before any tool call or step:
1. Orchestration mission: `Now initiating Orchestrator mode...`
2. Implementation mission: `Now initiating Delivery mode...`
3. Review-only mission: `Now initiating Review mode...`
Orchestration-oriented = contains "orchestrate", issue/milestone coordination, or multi-task
execution → also load `guides/ORCHESTRATOR.md` before acting. If an active mission is detected at
session start (MISSION-MANIFEST.md, TASKS.md, or scratchpads/ present) → load
`guides/ORCHESTRATOR-PROTOCOL.md` and follow the Session Resume Protocol before any action.
## Steered Autonomy Escalation Triggers
Only interrupt the human when one of these is true:
1. Missing credentials or platform access blocks progress.
2. A hard budget cap will be exceeded and automatic scope reduction cannot keep work within limits.
3. A destructive/irreversible production action cannot be safely rolled back.
4. Legal/compliance/security constraints are unknown and materially affect delivery.
5. Objectives are mutually conflicting and cannot be resolved from PRD, repo, or prior decisions.
## Block vs. Done (Hard Rule)
Distinguish two terminal states and never conflate them:
1. `done` — acceptance criteria met and all completion gates satisfied.
2. `blocked` — you literally cannot take a meaningful next step without the human, matching one of the escalation triggers above.
A routine question ("should I also update the tests?", "which naming convention?") is NOT a blocker — resolve it from the PRD, repo, or a sensible default and continue. Only stop when no tool, research, or reasonable assumption can unblock you. Do not soft-park a task inside a question when you could proceed.
## Conditional Guide Loading (role/task-driven — load only what the task needs)
## Conditional Guide Loading (load only what the task needs)
| Task | Guide |
| -------------------------------------------------- | ---------------------------------- |
| Project bootstrap | `guides/BOOTSTRAP.md` |
| PRD creation / requirements | `guides/PRD.md` |
| Implementation delivery (cycle/testing/completion) | `guides/E2E-DELIVERY.md` |
| Orchestration flow | `guides/ORCHESTRATOR.md` |
| Mission lifecycle / multi-session orchestration | `guides/ORCHESTRATOR-PROTOCOL.md` |
| Orchestrator estimation heuristics | `guides/ORCHESTRATOR-LEARNINGS.md` |
@@ -110,45 +42,39 @@ A routine question ("should I also update the tests?", "which naming convention?
## Subagent Model Selection (Cost — Hard Rule)
Select the cheapest model capable of the task; do NOT default to the most expensive. Omitting the
tier defaults to the parent (usually opus) and wastes budget.
Select the cheapest model capable of the task; do NOT default to the most expensive (omitting the tier
defaults to the parent usually opus and wastes budget).
- **haiku** — search/grep/glob, codebase exploration, status/health checks, one-line mechanical fixes.
- **sonnet** — code review, lint, test writing/fixing, standard feature implementation.
- **opus** — complex architecture / multi-file refactors, security/auth logic, ambiguous design decisions.
- **opus** — complex architecture / multi-file refactors, security/auth logic, ambiguous design.
Start cheapest; escalate only when the task genuinely needs deeper reasoning. Runtime syntax for
specifying tier is in the runtime contract.
Start cheapest; escalate only when the task genuinely needs deeper reasoning. Runtime syntax for the
tier is in the runtime contract.
## Superpowers Enforcement (Hard Rule)
## Superpowers (use your tools — under-use is a violation)
Skills, hooks, MCP tools, and plugins are force multipliers you MUST use when applicable;
under-utilization is a framework violation.
Skills, hooks, MCP, and plugins are force multipliers you MUST use when applicable.
- **Skills:** before implementation, scan `~/.config/mosaic/skills/` and load any matching the task
domain (e.g. `nestjs-best-practices` for NestJS). Include skill loading in worker kickstarts. Do
not load unrelated skills.
- **Hooks:** never bypass or suppress hook output; treat hook failures like failing tests and fix
them. If a hook is wrong, report it as a framework issue — do not work around it.
- **MCP:** sequential-thinking is REQUIRED for planning/architecture/multi-step reasoning. OpenBrain
(`capture`/`search`/`recent`) is the cross-agent memory layer — search at session start, capture
what you learn. Use web/browser/research MCP tools instead of asking the user to look things up.
- **Plugins:** use code-review / pr-review / architecture plugins proactively after significant
changes and before opening a PR — do not wait to be asked.
- **Self-evolution:** capture recurring patterns (`framework-improvement`), missing tooling
(`tooling-gap`), and value-less friction (`framework-friction`) to OpenBrain.
domain; include skill loading in worker kickstarts. Do not load unrelated skills.
- **Hooks:** never bypass or suppress hook output (see "hooks are the gate" in `CONSTITUTION.md`); fix
hook failures like failing tests. If a hook is wrong, report it as a framework issue.
- **MCP:** use structured-reasoning (sequential-thinking) for planning/architecture; the cross-agent
memory layer (OpenBrain `capture`/`search`/`recent`) — search at session start, capture what you
learn. Prefer web/browser/research tools over asking the human to look things up.
- **Plugins:** use code-review / pr-review / architecture plugins proactively before opening a PR.
- **Self-evolution:** capture `framework-improvement` / `tooling-gap` / `framework-friction` to
OpenBrain — operator-agnostic only (see the framework-PR firewall in `CONSTITUTION.md`).
## Other Hard Rules
## Missing core file
- **Sequential-thinking MCP** is REQUIRED. If unavailable, report the failure and stop planning-intensive execution.
- **Missing core file:** if `AGENTS.md`, `SOUL.md`, or the runtime contract is missing, stop and report it.
If `CONSTITUTION.md`, `AGENTS.md`, `SOUL.md`, or the runtime contract is missing, stop and report it.
## Session Closure
Before closing an implementation task, confirm: required + situational tests passed (primary gate);
aligned to `docs/PRD.md`; acceptance criteria mapped to evidence; independent code review passed (if
code changed); required docs updated; scratchpad updated with decisions/results/risks; explicit
completion evidence provided. For PR-workflow delivery: confirm merged PR number + merge commit on
`main`, terminal-green CI, and linked issue closed (or `docs/TASKS.md` equivalent). If any of those
are blocked by access/tooling failure, return `blocked` with the exact failed wrapper command — do
not claim completion. Full checklist: `guides/E2E-DELIVERY.md`.
Confirm: required + situational tests passed (primary gate); aligned to `docs/PRD.md`; acceptance
criteria mapped to evidence; independent code review passed (if code changed); required docs updated;
scratchpad updated. For PR-workflow delivery: merged PR number + merge commit on `main`, terminal-green
CI, linked issue closed (or `docs/TASKS.md` equivalent). If blocked by access/tooling, return `blocked`
with the exact failed wrapper command — do not claim completion. Full checklist: `guides/E2E-DELIVERY.md`.