15 — Dialectic on the Refined Domain Model
Phase: 2 (consolidation gate) · Date: 2026-06-03 · Method: dialectic-research tactic
(corroborate ‖ refute → reconcile). Target: the Tier 1 domain model in 14 as refined across the
Tier-1 / cross-tier rounds.
Verdict: the structural core survives; the strategic-DDD labeling mostly does not. The Mission-aggregate ≠ MissionRun-aggregate cut is sound (ADR-mandated, CI-enforced, 1:many). But three of the four recent refinements — Context-as-subdomain-of-Execution, Actor-realized-in-Execution, Prompt-as-DTO — are refuted, and the phase-flavored domain naming is weakened. Notably, the refutations are grounded largely in our own earlier docs (
03,06,09) and the code — i.e. the last few turns regressed from more careful earlier framing. This document is the consolidation gate the design must pass before mapping to06.
Verdict table
| # | Claim under test | Verdict | Why |
|---|---|---|---|
| V1 | "Mission Management vs Execution" is a bounded-context split | WEAKENED | Boundary is real but identity-keyed, not phase-keyed; the naming ("intent/planning vs doing") is phase language; the ubiquitous language (Mission/WP/lane/status) spans both |
| V2 | Context = supporting subdomain of Execution | REFUTED | Identity/path/status resolution is consumed by planning, dashboard, acceptance, merge — it is a Shared Kernel / Open-Host context, owned by none |
| V3 | Actor realized in Execution | REFUTED as stated | Our own BPMN puts the Operator in Governance (charter) and Integrate (merge); Actor is cross-domain; only the LLM-agent step-execution is execution-bound |
| V4 | Executor Prompt = DTO (2-domain boundary) | REFUTED | It is a generated, governed projection = Published Language (OHS wire format), assembled from 4 inputs (MM + Governance + Context + consumed-by-Actor), not a dumb 2-party carrier |
| V5 | The 3-domain model refines the deep-dive context map | REFUTED as "faithful" | It fuses Charter+Doctrine (two clean contexts), dissolves Status/kanban, drops Dashboard/Glossary, and invents names with no code referent |
Reconciliation (strongest from each side)
V1 — keep the cut, re-anchor the name
Both passes agree the substance is sound: Mission (mission_id, durable, kitty-specs/, git) and
MissionRun (mission_run_id, ephemeral, .kittify/runtime/) are distinct aggregates, 1:many,
ADR 2026-04-04-2-mandated, CI-enforced (13). But status/ (MissionStatus, lane_reader,
work_package_lifecycle) is consumed by both planning (agent/tasks.py) and runtime
(runtime/next/discovery.py, decision.py) — one ubiquitous language across both claimed domains.
→ Revision: name the boundary by aggregate identity (Mission vs MissionRun), not by phase
("intent/planning vs doing"); surface Status/kanban as a shared context both consume, don't fold it into "Mission Management".
V2 — Context is a Shared Kernel / OHS, not an Execution subdomain
Decisive, and self-grounded: the dashboard/kanban read path agent_utils/status.py:131 calls
resolve_mission_identity to render a board (pure Mission-Management/visibility); resolve_mission_read_path
is consumed by acceptance/, merge/, agent/tasks.py (finalize/planning). Our own 06 already
typed this as OHS ("Command surfaces → Operation Context: OHS — one published way to get an
operation's context", 06 §3) and 09 flagged F1 as ambient ("may not belong inside the mission
composite… already injected via DoctrineService", 09 §2/§8). → Revision: reclassify Context as a
Shared Kernel / Open-Host Service consumed by Governance-read, Mission Management, and Execution.
Drop "subdomain of Execution." (This reverses the cross-tier refinement #2.)
Definitional note: the corroborator narrowly scoped "Context" = the
ActionContextclass (only 2 files, execution-concentrated). But our model defines Context broadly (Identity · Filesystem · VC · status snapshot = the09fragments). Under our own definition, the broad set is shared → V2 refuted.
V3 — Actor is cross-domain; only step-execution is execution-bound
The model's own swimlane (14 Process view) puts the Operator at charter interview (Governance)
and merge go/no-go (Integrate) — change-effecting acts outside Execution. → Revision: Actor is a
cross-domain metamodel spanning Governance, Mission Management, and Execution by actor-kind/phase.
The defensible narrow claim: an LLM agent's realization of an issued step is execution-bound. Don't
generalize to "Actor realized in Execution." (Refines cross-tier refinement #3.)
V4 — Executor Prompt is a Published Language, not a DTO
It is rendered ("fuse profile × action × gov-context × environment → render prompt", 14 sequence)
and is "the agent's entire sensorium" — a generated, governed projection. 09 already derives
PromptContext by composition from fragments (a projection, not a carrier). And it draws from four
sources (MM intent/WP + Governance rules/profile + Context environment, consumed by the Actor) — a
4-way junction, not a 2-party DTO. → Revision: retype as the Published Language of the
governed-invocation Open-Host Service — a projection rendered from Governance + Context + Mission
Management, consumed by the Actor. (Refines cross-tier refinement #4: the "boundary object" intuition
is right; "DTO" and "2-domain" are wrong.)
V5 — reconcile cell-by-cell with the deep-dive, don't re-cut
The deep-dive (03 B) names Charter and Doctrine as two separate clean contexts (zero inverse
imports, separate src/charter/ + src/doctrine/ packages) and Status/kanban as its own bounded
context. The Tier-1 model fuses Charter+Doctrine into "Governance" and dissolves Status/kanban →
lower resolution, not a refinement. → Revision: express "Governance" as an umbrella over two
contexts (Charter ⊕ Doctrine); surface Status/kanban as a shared context; keep Dashboard/Glossary
on the map; map every domain name to an existing package/context or mark it as net-new
(mission_runtime/ does not exist yet — grep for "Mission Management" in src returns zero).
What survives (the keepers)
- Mission aggregate ≠ MissionRun aggregate — 1:many, ADR-mandated, CI-enforced. The load-bearing cut.
- MissionType ∈ Governance (doctrine artifact) — uncontested.
- The
09derivation/composition model (fragments by domain × scope, composites per operation) — it already self-corrects toward Shared-Kernel/OHS and away from the Tier-1 errors.09is closer to right than the later Tier-1 refinements. - The execution spine (MissionRun issues MissionStep → targets WorkPackage) — internally consistent and code-backed (
issued_step_id). - The MissionRun-can't-name-its-Mission degeneracy as a real, separable finding (
13).
Consolidation checklist (do before mapping to 06)
- Re-name the Mission/MissionRun boundary by identity, not phase.
- Reclassify Context → Shared Kernel / OHS (per
06/09); remove "subdomain of Execution". - Re-scope Actor → cross-domain; keep only "LLM step-execution is execution-bound".
- Retype Executor Prompt → Published Language / OHS projection (4-way), not 2-domain DTO.
- Surface Status/kanban as a shared context; un-fuse Charter + Doctrine under the Governance umbrella.
- Map each domain box to an existing package/context (
03) or mark net-new.
Impressions (architect)
This is the dialectic earning its keep. The last three turns of refinement were intuitive and
fluent but drifted into strategic-DDD labels that the project's own code and prior maps don't
support — and crucially, 09 already had it more right (OHS/Shared-Kernel, projection-not-DTO).
The healthy reading: our structural instinct (durable Mission vs ephemeral MissionRun, the
execution spine) is solid and ADR-anchored; our strategic-design vocabulary got ahead of the
evidence. Consolidating items 1–6 — largely by reconciling Tier-1 back toward 09 + 03 — makes the
model internally consistent and ready to map onto 06. The next phase (codebase reassessment) should
validate the sharpened hypotheses this dialectic produced (Context is shared; status-language
spans planning+runtime; Actor is cross-domain; prompt is a governed projection; MissionRun degeneracy).