Conference of 7 experts (architect/moonshot/contrarian/coder/aiml/devex/steward) debated layering, sanitization, upgrade-safety, cross-harness robustness. Artifacts: BRIEF, 7 positions, 7 rebuttals, synthesis-v1, 3 red-team passes, canonical DESIGN.md, OPEN-QUESTIONS.md, MISSION.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
18 KiB
Rebuttal — Moonshot Visionary Lens
Responding to: position-aiml.md, position-architect.md, position-coder.md, position-contrarian.md, position-devex.md, position-steward.md
Ground truth files read: defaults/AGENTS.md (155 lines), defaults/SOUL.md (53 lines),
defaults/STANDARDS.md, templates/SOUL.md.template, templates/agent/AGENTS.md.template
(stale rails/git paths at lines 5, 12–13), runtime/claude/RUNTIME.md,
runtime/pi/RUNTIME.md, adapters/claude.md, guides/E2E-DELIVERY.md,
guides/ORCHESTRATOR.md, install.sh (PRESERVE_PATHS line 24, FRAMEWORK_VERSION=2 line 28).
Part 1 — The 2–3 Strongest Ideas Worth Keeping
1. The AI/ML lens's resident-token budget with mechanical enforcement (position-aiml.md)
This is the most technically grounded contribution in the debate. The AI/ML persona observes
that defaults/AGENTS.md already carries at least four parallel "these are the critical ones"
framings — CRITICAL HARD GATES, Non-Negotiable Operating Rules, Other Hard Rules, and
per-section (Hard Rule) tags — in 155 lines of always-resident law. It then proposes a hard
line-count cap enforced in mosaic-doctor and CI.
I endorse this without reservation. The cap is not cosmetic. Salience inflation is real: when every rule is labeled CRITICAL, none is. The CI assertion is the load-bearing control because every enforcement mechanism proposed in this debate — Constitution, layers, precedence rules — is only as good as the text that reaches the model per-token. A Constitution that grows back to 155 lines within two releases achieves nothing. The budget gate keeps it honest. Ship it with the same alpha as the Constitution, or the Constitution is cosmetic governance.
Concrete file consequence: add to tools/ci/ (or extend the existing
tools/quality/scripts/verify.sh hook point) a line-count assertion that fails CI if
CONSTITUTION.md exceeds a fixed ceiling. The AI/ML paper suggests ~40 lines; my position paper
suggested 500 words. Either is defensible; the specific number matters less than the mechanism
that prevents erosion.
2. The Contrarian's "subtraction before structure" and live path-drift evidence (position-contrarian.md)
The Contrarian documents the rails/git/ vs tools/git/ split between
templates/agent/AGENTS.md.template lines 12–13 and defaults/AGENTS.md line 30 — not as a
hypothetical risk, but as a live stale-path bug that install.sh:193 actively works around
(removes a stale rails symlink). Any agent following the template's queue-guard line gets
"no such file." That is a real breakage for downstream users today.
This single observation sharpens the entire DQ5 argument: duplication is not merely inelegant,
it already produces operational failures. The Contrarian's minimalism principle — "earn the
Constitution by deleting the four existing restatements, not by adding a fifth document" — is the
correct framing of what "success" looks like for this re-architecture. If we ship
CONSTITUTION.md and leave the law restated in templates/agent/AGENTS.md.template lines 6–16,
guides/E2E-DELIVERY.md lines 6–11, and guides/ORCHESTRATOR.md lines 9–22, we have five
disagreeing law files instead of four. The win is subtraction.
Concrete file consequence: the project template gate-block (templates/agent/AGENTS.md.template
lines 6–16, using the already-stale rails/git path) must be replaced with one line:
"This project is governed by ~/.config/mosaic/CONSTITUTION.md. Add only project-specific
extensions below." That line cannot drift from itself.
3. The DevEx lens's "hooks are the real enforcement" elevation to doctrine (position-devex.md)
The DevEx paper makes a critical observation: runtime/claude/RUNTIME.md line 30–32 already
states explicitly that the memory-write rule "alone proved insufficient — the hook is the hard
gate." That is the single most important lesson the existing framework has learned, and it is
buried in one runtime file rather than being promoted to Constitution doctrine.
The DevEx paper proposes: "a hard gate that can be enforced by a hook MUST be, on harnesses
that support hooks; the prose is the spec, the hook is the enforcement." This is the right
principle and it is already partially true for Claude (the prevent-memory-write.sh PreToolUse
hook, qa-hook-stdin.sh, typecheck-hook.sh). The gap is that the principle lives in a runtime
note, not in the Constitution, and Codex/OpenCode hook parity is untracked.
Elevating "hooks are primary enforcement; prose is the spec" to a Constitution-level statement does something valuable beyond Claude sessions: it creates a tracked gap for every other harness, making the enforcement asymmetry visible and actionable rather than invisible and assumed-away.
Part 2 — The 2–3 Weakest or Riskiest Proposals
1. The DevEx 3-way merge for user files is engineering complexity that inverts the risk (position-devex.md)
The DevEx paper proposes adding tools/_scripts/mosaic-reconcile that does git-style 3-way
merges of SOUL.md and USER.md when the upstream template version advances. The motivation is
real: users should receive framework template improvements without losing their customizations.
But the failure mode of this mechanism is worse than the problem it solves.
Concrete failure mode: SOUL.md is a freeform Markdown document, not a structured data file. A
3-way merge of Markdown prose will produce conflict markers inside the agent's identity file. An
agent running with SOUL.md.mosaic-merge active — or worse, with an auto-merged file that
contains a semantically incoherent blend — has corrupted law. The DevEx paper acknowledges that
the merge surfaces as SOUL.md.mosaic-merge "for the user to resolve, exactly like git" — but
that comparison reveals the flaw: git merge-file on prose produces line-level conflicts that
humans resolve in an editor. An automated merge of freeform behavioral principles can produce
a document that is syntactically clean and semantically broken, with no conflict markers to alert
the user.
The simpler mechanism already proposed in the AI/ML paper — *.local.md overlay files that are
structurally additive, never merged — achieves 80% of the goal without the failure mode. A user
extends SOUL.md by writing SOUL.local.md; the framework never touches their base SOUL.md
after init; the framework template evolves without merging. The user misses framework SOUL
template updates, but SOUL updates should be rare and can be communicated via release notes. The
Contrarian's point applies: resist the complexity. The merge engine is over-engineering for an
upgrade safety mechanism that will interact with an LLM's identity file in ways we cannot fully
test.
2. The Architect's per-directory physical separation (constitution/ subdirectory at deploy target) underestimates migration catastrophe (position-architect.md)
The Architect proposes restructuring the deploy target so that ~/.config/mosaic/constitution/
holds framework law (always overwritten) while user files remain at root. The Architect's own
"biggest risk" section acknowledges the danger: "the re-architecture's correctness depends
entirely on a migration that can tell 'framework file the user happened to edit' from 'user
file,' which is exactly the distinction the current flat model cannot make."
But the paper understates how bad this gets. Consider the install path:
- User has a live deployment with
~/.config/mosaic/AGENTS.mdinPRESERVE_PATHS(line 24 ofinstall.sh). - User has edited
AGENTS.md— specifically added custom guide-loading triggers. - The v2→v3 migration reclassifies
AGENTS.mdas framework-owned, clobbers it, moves content intoconstitution/. - The user's custom guide-loading triggers are gone. The migration "detected a user-edited
AGENTS.md" and "extracted their non-framework additions into
AGENTS.local.md" — but the heuristic for "non-framework additions" in a mixed document is not defined in the paper.
The Coder paper's migration approach is safer precisely because it avoids reclassification: it
keeps AGENTS.md at root as a thin pointer, seeds constitution/CORE.md as a new file that
nothing previously owned, and makes the agent self-load the Constitution from within AGENTS.md
rather than relying on launcher injection order. The physical directory move is not necessary for
the architecture to work — the ownership signal can be the filename convention
(CONSTITUTION.md = never edit, SOUL.md = yours) without restructuring the deploy layout.
The moonshot position: a physical constitution/ subdirectory is a nice structural statement but
not required for alpha correctness, and it carries real migration risk for the existing installed
base. Reserve it for v2 once the alpha has proven the ownership model works in the flat layout.
3. The Steward's "rename defaults/ to constitution/" conflates source and deploy semantics (position-steward.md)
The Steward proposes: "rename defaults/ to constitution/ to make the semantics clear and
prevent future drift." The instinct is right — the word "defaults" is confusing because it
conflates (a) the package source directory and (b) the deployed files that seed
~/.config/mosaic/. But renaming the source directory to constitution/ creates a different
confusion: it implies that defaults/SOUL.md (which ships and deploys but is then user-owned)
is part of the Constitution, which it is not.
The correct fix is to be explicit about the dual role of defaults/: it is the seeding source
for the install, and individual files within it have different ownership classes after deployment.
Renaming to constitution/ papers over the seeding role and will mislead future contributors
into thinking everything in the directory is framework law. The Moonshot position is: name the
ownership classes explicitly via file metadata (front matter mosaic-layer: 0/1/2 as proposed
in the original Moonshot paper), not via directory structure. Directory names cannot encode
per-file ownership classes. Metadata can.
Part 3 — The Key Disagreement and How to Resolve It
The disagreement: is the Constitution a document or a layer — and which should be specified first?
Every position paper agrees on: create CONSTITUTION.md, sanitize SOUL.md, add a CI PII
grep, and remove CONSTITUTION.md from PRESERVE_PATHS. This is consensus.
The substantive disagreement is architectural: should the Constitution be designed as a document (the Contrarian, Coder) or as a layer in a formally-specified model (Moonshot, Architect, DevEx)?
The Contrarian says: ship a ~40-line document with the hard gates, delete the duplicates, wire the CI grep. Done. Adding a layer model is over-engineering.
The Moonshot and Architect say: the document is the output of the layer model; design the model first or the document will not be positioned correctly to evolve cleanly.
The Coder says: the document should be self-loading (agents are instructed to read it from
AGENTS.md) rather than injection-dependent, and that mechanical self-loading is more reliable
than any launcher injection order.
The resolution: specify the layer model as a document, not as a build mechanism.
The three positions are not actually in conflict. The Contrarian is right that the immediate
alpha deliverable is a document, not a build mechanism. The Moonshot/Architect are right that
without a stated layer model, the document will not be governed correctly going forward — the
"operator policy MAY delegate merge authority" example (defaults/AGENTS.md:37, attributed to
"Policy: Jason, 2026-06-11") shows what happens when operator policy and universal law occupy
the same document with no governance model: an operator policy decision sits inside hard gate
#13 of the universal contract, attributed to a specific person on a specific date, shipped to
every downstream user. That is not fixable by "just write a cleaner document" — it requires a
governance model that defines what is allowed inside CONSTITUTION.md and what must go
elsewhere (operator policy/ files, per the Architect).
The Coder's self-loading mechanism resolves the cross-harness injection debate: instead of
fighting over whether mosaic claude composes the Constitution into --append-system-prompt
(currently not guaranteed — adapters/claude.md only references STANDARDS.md and repo
AGENTS.md, not a Constitution), make AGENTS.md unconditionally instruct the agent to read
CONSTITUTION.md at session start. This is the defensive fallback that survives any launcher
composition failure.
Concrete resolution path:
-
Write
defaults/CONSTITUTION.md— exactly as the Moonshot paper specifies (≤500 words; 6 hard gates, 3 mode declarations, 5 escalation triggers, Block/Done, superpowers list, model tier rule, guide index pointer). No operator policy, no persona, no harness mechanics. This is the alpha deliverable the Contrarian is asking for and the Moonshot is asking for — they agree on the document; they disagree only on whether to name the model that governs it. -
Add to
defaults/AGENTS.md(line 11 replacement): "At session start, read~/.config/mosaic/CONSTITUTION.md— this is the immutable law. Do not re-read it on subsequent turns." This removes the false "already in context" claim (defaults/AGENTS.md:11) that the Contrarian correctly flags as broken for direct launches, and makes Constitution loading harness-agnostic. -
Write
constitution/LAYER-MODEL.md— a single-page specification of the three ownership classes (L0 framework/immutable, L1 operator/persona/preserved, L2 operator/profile/preserved) and the precedence rule. This document does not ship to~/.config/mosaic/; it lives in the framework source as the governance spec that contributors and future PRs are measured against. The Contrarian has no objection to a governance document indocs/— only to it becoming a fourth always-resident law file. A spec inconstitution/(source only, never deployed) is not a resident file. -
Add the CI PII grep (
tools/ci/no-personal-data.sh) overdefaults/,guides/,templates/,runtime/,adapters/. Wire to.woodpecker/. This closes the re-contamination loop that the Moonshot paper identifies as the "biggest risk" — agents running on a personalized deployment proposing framework PRs that leak operator content. The grep is the only control that survives the operator's future self. -
Remove
AGENTS.mdandSTANDARDS.mdfromPRESERVE_PATHSininstall.sh:24. Both are framework-owned; both silently freeze gate updates on the first user edit.CONSTITUTION.mdreplaces them as the always-overwritten law;AGENTS.mdbecomes a thin, stable pointer that rarely changes and does not need to be user-editable. -
Extract the operator policy from hard gate #13 (
defaults/AGENTS.md:37, "Policy: Jason, 2026-06-11") intoexamples/policy/merge-authority.example.mdand replace the gate text with the mechanism only: "When a coordinator/orchestrator is active, the merge go-ahead is the coordinator's to give. Absent an operator policy stating otherwise, no-unreviewed self-merge is the default." This is the clearest single example of what belongs in the Constitution (the mechanism/rule) vs. what belongs in operator policy (who has authority in a specific deployment).
Summary: Top Contentions
-
The CI resident-budget cap is not optional. Ship it with the Constitution or the Constitution will grow back to 155 lines inside two releases and become the new problem. The AI/ML paper's mechanical line-count assertion in
mosaic-doctor/CI is the load-bearing control for everything else. -
Subtraction is the Constitution's deliverable, not addition. Creating
CONSTITUTION.mdwithout deleting the law fromtemplates/agent/AGENTS.md.templatelines 6–16,guides/E2E-DELIVERY.mdlines 6–11, andguides/ORCHESTRATOR.mdlines 9–22 produces five disagreeing law files. The liverails/gitpath bug proves this is not hypothetical. Every gate must have exactly one authoritative location. -
Operator policy has leaked into universal law and must be extracted. Hard gate #13 (
defaults/AGENTS.md:37, "Policy: Jason, 2026-06-11") is the proof case. The Constitution layer model is justified not by elegance but by this specific failure: without a formal distinction between universal law and operator policy, a coordinator merge-authority decision made by one person on one date ships as non-negotiable global law to every downstream user. The fix is apolicy/operator layer (per the Architect) with a Constitution that states only the mechanism, not the policy choice. -
3-way merge of freeform behavioral documents is riskier than the upgrade problem it solves. The DevEx paper's
mosaic-reconcile3-way merge forSOUL.md/USER.mdwill produce semantically broken identity files without surfacing conflict markers. The*.local.mdoverlay pattern (AI/ML paper) achieves upgrade safety without automated merge of prose. -
The layer model belongs in
constitution/LAYER-MODEL.md(source-only, never deployed) — not as another resident file. The Contrarian's objection to adding governance documents is valid only if those documents become resident context. A spec file that governs what can be inCONSTITUTION.mdis a contributor resource, not agent context. The Contrarian and Moonshot positions converge when the layer model is specified in the source tree rather than injected into every session.