Skill Tracer
Skills › Compound Engineering › ce-plan › plan-sections.md

plan-sections.md

498 lines · skills/ce-plan/references/plan-sections.md at 3449230

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1# Plan Sections
2
3This reference describes what makes a great implementation plan. It does NOT
4prescribe how the plan looks on the page — rendering is handled by the
5format-specific references (`markdown-rendering.md`, `html-rendering.md`).
6

Plan Sections

This reference describes what makes a great implementation plan. It does NOT prescribe how the plan looks on the page — rendering is handled by the format-specific references (markdown-rendering.md, html-rendering.md).

Raw lines 1 to 6
7## The outcome
8
9A great plan enables three audiences to act:
11- **The implementing agent** (`ce-work` or a human) starts from an informed
12 baseline — the decisions everything else rests on are named, research breadcrumbs orient
13 their own investigation, unit boundaries are clear. The plan gives the
14 implementer a starting point, not a substitute for their own investigation.
15- **The reviewer** identifies the decisions everything else rests on and the boundaries
16 of what's being changed in one pass.
17- **The future reader** (anyone returning months later) traces why the work
18 was done, what shaped it, and where the artifacts live.
20A section belongs only when it serves one of these audiences. Omit padding.

The outcome

A great plan enables three audiences to act:

  • The implementing agent (ce-work or a human) starts from an informed baseline — the decisions everything else rests on are named, research breadcrumbs orient their own investigation, unit boundaries are clear. The plan gives the implementer a starting point, not a substitute for their own investigation.
  • The reviewer identifies the decisions everything else rests on and the boundaries of what's being changed in one pass.
  • The future reader (anyone returning months later) traces why the work was done, what shaped it, and where the artifacts live.

A section belongs only when it serves one of these audiences. Omit padding.

Raw lines 7 to 21
Names a skill ce-work :11
22## Unified plan artifact contract
24`ce-plan` writes the canonical compound-engineering plan artifact. The same
25artifact may begin as a requirements-only skeleton from `ce-brainstorm` and
26later be enriched by `ce-plan`; it is still one plan file moving through
27planning stages, not a requirements doc plus a separate implementation doc.
29When the artifact is meant to be consumed by implementation agents, use:
31- **`artifact_contract: ce-unified-plan/v1`** — declares this contract.
32- **`product_contract_source`** — where the Product Contract came from:
33 `ce-brainstorm`, `ce-plan-bootstrap`, `legacy-requirements`, or another
34 explicit source string when a repo has a specialized producer.
35- **`execution`** — `code` for implementation plans, `knowledge-work` for
36 non-code deliverables. Absence remains legacy-compatible and means `code`
37 only for older plans without `artifact_contract`.
39Determine whether a plan can be executed from its contents. The Product Contract, Planning Contract, Implementation Units, Verification Contract, and Definition of Done must give the executor enough direction, with no launch-blocking question remaining. Mark open questions as blocking or deferred; deferred implementation details do not prevent work. A Product Contract without sufficient planning needs enrichment.
41Do not write a readiness or execution-status field. When updating an older artifact, remove `artifact_readiness` from its frontmatter or visible HTML metadata. An old readiness label does not establish completeness or override a blocker. Plans carry no `status` field and no mutable execution lifecycle.
43Approach-plans, answer-seeking outputs, and universal-planning outputs remain outside this software implementation contract unless they contain the full contract above. Route non-code deliverables by their contents and `execution: knowledge-work`.

Unified plan artifact contract

ce-plan writes the canonical compound-engineering plan artifact. The same artifact may begin as a requirements-only skeleton from ce-brainstorm and later be enriched by ce-plan; it is still one plan file moving through planning stages, not a requirements doc plus a separate implementation doc.

When the artifact is meant to be consumed by implementation agents, use:

  • **artifact_contract: ce-unified-plan/v1** — declares this contract.
  • **product_contract_source** — where the Product Contract came from: ce-brainstorm, ce-plan-bootstrap, legacy-requirements, or another explicit source string when a repo has a specialized producer.
  • **execution** — code for implementation plans, knowledge-work for non-code deliverables. Absence remains legacy-compatible and means code only for older plans without artifact_contract.

Determine whether a plan can be executed from its contents. The Product Contract, Planning Contract, Implementation Units, Verification Contract, and Definition of Done must give the executor enough direction, with no launch-blocking question remaining. Mark open questions as blocking or deferred; deferred implementation details do not prevent work. A Product Contract without sufficient planning needs enrichment.

Do not write a readiness or execution-status field. When updating an older artifact, remove artifact_readiness from its frontmatter or visible HTML metadata. An old readiness label does not establish completeness or override a blocker. Plans carry no status field and no mutable execution lifecycle.

Approach-plans, answer-seeking outputs, and universal-planning outputs remain outside this software implementation contract unless they contain the full contract above. Route non-code deliverables by their contents and execution: knowledge-work.

Raw lines 22 to 44
Names a skill ce-brainstorm :25
45## Section ID Registry
47Unified artifacts use these stable logical sections. Markdown uses the
48heading text; HTML uses matching visible headings and anchor IDs. Downstream
49skills grep or anchor-scan for these names before reading large bodies.
51| Logical section | Markdown heading | HTML id | Reader use |
52|---|---|---|---|
53| Goal Capsule | `## Goal Capsule` | `goal-capsule` | Objective (outcome), Means (chosen approach), authority hierarchy, and stop conditions |
54| Product Contract | `## Product Contract` | `product-contract` | Requirements, actors, flows, acceptance examples, product scope |
55| Product Requirements | `### Requirements` under Product Contract | `product-requirements` | Requirement extraction for review and implementation trace |
56| Planning Contract | `## Planning Contract` | `planning-contract` | KTDs, technical design, assumptions, sequencing |
57| Implementation Units | `## Implementation Units` | `implementation-units` | U-ID work packets for execution |
58| Verification Contract | `## Verification Contract` | `verification-contract` | Repo-specific test commands and quality gates |
59| Definition of Done | `## Definition of Done` | `definition-of-done` | Global and per-unit completion criteria |
60| Appendix | `## Appendix` | `appendix` | Long research, raw notes, or supporting detail |
62Requirements-only artifacts are kept light: a Goal Capsule and the Product
63Contract. They must not point implementers at absent Planning Contract,
64Implementation Units, Verification Contract, or Definition of Done sections.
65`ce-plan` adds those implementation sections when it enriches to
66implementation-ready. Implementation-ready artifacts include the full registry
67above, except Appendix remains optional.

Section ID Registry

Unified artifacts use these stable logical sections. Markdown uses the heading text; HTML uses matching visible headings and anchor IDs. Downstream skills grep or anchor-scan for these names before reading large bodies.

Logical sectionMarkdown headingHTML idReader use
Goal Capsule## Goal Capsulegoal-capsuleObjective (outcome), Means (chosen approach), authority hierarchy, and stop conditions
Product Contract## Product Contractproduct-contractRequirements, actors, flows, acceptance examples, product scope
Product Requirements### Requirements under Product Contractproduct-requirementsRequirement extraction for review and implementation trace
Planning Contract## Planning Contractplanning-contractKTDs, technical design, assumptions, sequencing
Implementation Units## Implementation Unitsimplementation-unitsU-ID work packets for execution
Verification Contract## Verification Contractverification-contractRepo-specific test commands and quality gates
Definition of Done## Definition of Donedefinition-of-doneGlobal and per-unit completion criteria
Appendix## AppendixappendixLong research, raw notes, or supporting detail

Requirements-only artifacts are kept light: a Goal Capsule and the Product Contract. They must not point implementers at absent Planning Contract, Implementation Units, Verification Contract, or Definition of Done sections. ce-plan adds those implementation sections when it enriches to implementation-ready. Implementation-ready artifacts include the full registry above, except Appendix remains optional.

Raw lines 45 to 68
69### Wayfinding: map before reading (size-aware)
71The document does not carry a reading guide; consuming skills own the reading
72algorithm. A **short** plan — a lightweight or requirements-only artifact that
73fits in a screen or two — can just be read in full; that is cheaper and simpler
74than scanning and ranging. But an implementation-ready unified plan is often
75long, and HTML output (also supported) is more verbose still, so for anything
76beyond short, do **not** load the entire artifact to find your way around.
77Build a section map first, then read only the ranges the task needs:
79- **Markdown:** scan headings to get the section and unit map — e.g.
80 `rg -n '^#{1,3} ' <plan>` (top-level sections plus `### U<N>.` units).
81- **HTML:** scan the heading elements (`<h1>`–`<h3>`) and their anchor ids;
82 match on the section name and ignore the wrapper tags.
84In both formats the section **names and anchor ids are the stable contract**
85from the Section ID Registry above (`Goal Capsule`/`goal-capsule`,
86`Verification Contract`/`verification-contract`, `### U<N>.` units, …). Wayfind
87against those registry names, not a brittle tag/format pattern, so the
88instruction survives rendering changes. After mapping, read metadata, then only
89the sections the task needs — e.g. Goal Capsule, the active U-ID plus its cited
90R/F/AE/KTD, Verification Contract, and Definition of Done. Read the Appendix or
91unrelated units only when a section you are already reading cites them.

Wayfinding: map before reading (size-aware)

The document does not carry a reading guide; consuming skills own the reading algorithm. A short plan — a lightweight or requirements-only artifact that fits in a screen or two — can just be read in full; that is cheaper and simpler than scanning and ranging. But an implementation-ready unified plan is often long, and HTML output (also supported) is more verbose still, so for anything beyond short, do not load the entire artifact to find your way around. Build a section map first, then read only the ranges the task needs:

  • Markdown: scan headings to get the section and unit map — e.g. rg -n '^#{1,3} ' <plan> (top-level sections plus ### U<N>. units).
  • HTML: scan the heading elements (<h1>–<h3>) and their anchor ids; match on the section name and ignore the wrapper tags.

In both formats the section names and anchor ids are the stable contract from the Section ID Registry above (Goal Capsule/goal-capsule, Verification Contract/verification-contract, ### U<N>. units, …). Wayfind against those registry names, not a brittle tag/format pattern, so the instruction survives rendering changes. After mapping, read metadata, then only the sections the task needs — e.g. Goal Capsule, the active U-ID plus its cited R/F/AE/KTD, Verification Contract, and Definition of Done. Read the Appendix or unrelated units only when a section you are already reading cites them.

Raw lines 69 to 92
93## Whether a plan file is warranted
95SKILL.md's Output Contract gate decides this at intake, before any research: Direct and Chat brief results stay in chat (`references/output-contracts.md`); a Durable run writes the file this reference describes.

Whether a plan file is warranted

SKILL.md's Output Contract gate decides this at intake, before any research: Direct and Chat brief results stay in chat (references/output-contracts.md); a Durable run writes the file this reference describes.

Raw lines 93 to 96
97## Implementation-ready hard floor
99When an implementation-ready software plan is warranted, these sections are
100present. They carry the contracts downstream consumers depend on.
102- **Goal Capsule** — objective, means (only when an approach is fixed),
103 authority hierarchy, stop conditions, execution profile (including
104 whether the work ships as one PR or several), and who
105 finishes and ships the work. This is the fastest way for an executor to avoid drifting from
106 the plan. A reader who has not read the rest of the plan must be able to
107 hold the Objective as the goal. Remaining-true constraints live on their
108 owning R-IDs (the R-IDs that state them), not as extra Objective clauses — user-checkable is not a
109 license to pack them onto the Objective. An Objective that is only
110 understandable after later sections is not yet the Objective, even when a
111 user could check the outcome and a different implementation would still
112 serve it. The **Objective** is always the outcome: what is true for users
113 or operators afterwards, phrased so it would still read as the goal under
114 a different implementation. It sits outside the component being changed,
115 which is a question of who can check it rather than of which nouns it
116 uses: an outcome someone outside that component can verify without knowing
117 its internals is an Objective even when that component is what changed,
118 and one only its internals can settle is not the Objective however
119 outcome-shaped its wording; the registry above decides where it does
120 belong. The usual failure is an objective about the component's own
121 execution — the wall-clock it no longer holds, the runtime it no longer
122 consumes, what stays isolated inside it — which only its internals settle.
123 Infrastructure and refactor work has such an objective too: the reason
124 that component's behavior mattered to someone. The chosen approach is the
125 **Means**, its own line whenever the request or the plan has fixed one —
126 never invented for outcome-only work. It is a linked projection under the
127 one-owner rule below: one line naming the approach and citing the KTD or
128 Key Decision that owns it (`Means: … (KTD2)`), never a restatement of that
129 owner's mechanism. Test: if the implementation changed, would the
130 Objective still be the goal, and could a reader who does not know the
131 changed component's internals tell whether it was met? No to the first
132 makes it a Means. No to the second means it is stated at the component's
133 level, and the Objective is whatever depended on that component. When a
134 request supplies only its approach ("move X out of A into B"), that is the
135 Means; the Objective is the outcome it serves, derived from the request's
136 motivation, the project's stated problem, or asked for — never the approach
137 restated.
138- **Product Contract** — product scope and behavior. Contains Summary, Problem
139 Frame, Requirements with stable R-IDs, and any material Actors, Flows,
140 Acceptance Examples, Success Criteria, Scope Boundaries, Dependencies,
141 Outstanding Questions, and Sources. This replaces the separate requirements
142 artifact in new brainstorm-to-plan flows.
143- **Planning Contract** — the implementation-facing decisions: Key Technical
144 Decisions, high-level design, assumptions, implementation constraints,
145 sequencing, and research that shapes how the Product Contract will be built.
146- **Implementation Units** (with stable U-IDs) — discrete work packets sized so
147 each is independently executable. Each unit names Goal, Requirements,
148 Files, Approach, Test Scenarios, and Verification. `ce-work` and other
149 executors consume these units. When the work ships as several PRs, the
150 units are grouped by PR. Each group has a `Waits on:` line. For each PR it
151 waits on, the line says whether that PR only has to merge first or has to
152 merge or deploy before the group can start. It also names any deployment
153 that must be live before the group merges.
154 - **Unit Index (large plans only, ~10+ units).** When the plan has roughly
155 ten or more units, open the section with a compact navigation table — one
156 row per unit: **U-ID · one-line title · files touched · depends-on**. It
157 lets an executor map units to files and resolve dependency order without
158 scanning every unit body. It is a **navigation aid only**: the unit bodies
159 stay authoritative, it carries nothing beyond those four fields (no
160 approach, tests, or rationale), and `files touched` is the key/primary
161 paths, not an exhaustive restatement. **Omit it below ~10 units** — there
162 the per-unit `Dependencies`/`Files` (and any sequencing or dependency
163 diagram) already suffice, and an index would be ceremony.
164- **Verification Contract** — repo-specific commands and quality gates,
165 including which tests prove the plan, when `release:validate` applies, and
166 what behavioral skill evaluation is required. Avoid generic "run tests"
167 language when the repo has concrete commands. When the goal is
168 optimization-shaped (build time, latency, coverage, bundle size), express a
169 measurable threshold as the exit criterion (e.g., "p95 latency < 200ms",
170 "build time reduced 30%") and consider routing to `ce-optimize` — a metric
171 target is a sharper done signal for a long-running goal than a boolean check.
172- **Definition of Done** — global and per-unit done criteria. This is the
173 completion contract an executor checks before declaring the work done. Include
174 a cleanup criterion: a long autonomous run accumulates dead-end and
175 experimental code from approaches that did not pan out; declaring done
176 requires that abandoned-attempt code is removed, not left in the diff.

Implementation-ready hard floor

When an implementation-ready software plan is warranted, these sections are present. They carry the contracts downstream consumers depend on.

  • Goal Capsule — objective, means (only when an approach is fixed), authority hierarchy, stop conditions, execution profile (including whether the work ships as one PR or several), and who finishes and ships the work. This is the fastest way for an executor to avoid drifting from the plan. A reader who has not read the rest of the plan must be able to hold the Objective as the goal. Remaining-true constraints live on their owning R-IDs (the R-IDs that state them), not as extra Objective clauses — user-checkable is not a license to pack them onto the Objective. An Objective that is only understandable after later sections is not yet the Objective, even when a user could check the outcome and a different implementation would still serve it. The Objective is always the outcome: what is true for users or operators afterwards, phrased so it would still read as the goal under a different implementation. It sits outside the component being changed, which is a question of who can check it rather than of which nouns it uses: an outcome someone outside that component can verify without knowing its internals is an Objective even when that component is what changed, and one only its internals can settle is not the Objective however outcome-shaped its wording; the registry above decides where it does belong. The usual failure is an objective about the component's own execution — the wall-clock it no longer holds, the runtime it no longer consumes, what stays isolated inside it — which only its internals settle. Infrastructure and refactor work has such an objective too: the reason that component's behavior mattered to someone. The chosen approach is the Means, its own line whenever the request or the plan has fixed one — never invented for outcome-only work. It is a linked projection under the one-owner rule below: one line naming the approach and citing the KTD or Key Decision that owns it (Means: … (KTD2)), never a restatement of that owner's mechanism. Test: if the implementation changed, would the Objective still be the goal, and could a reader who does not know the changed component's internals tell whether it was met? No to the first makes it a Means. No to the second means it is stated at the component's level, and the Objective is whatever depended on that component. When a request supplies only its approach ("move X out of A into B"), that is the Means; the Objective is the outcome it serves, derived from the request's motivation, the project's stated problem, or asked for — never the approach restated.
  • Product Contract — product scope and behavior. Contains Summary, Problem Frame, Requirements with stable R-IDs, and any material Actors, Flows, Acceptance Examples, Success Criteria, Scope Boundaries, Dependencies, Outstanding Questions, and Sources. This replaces the separate requirements artifact in new brainstorm-to-plan flows.
  • Planning Contract — the implementation-facing decisions: Key Technical Decisions, high-level design, assumptions, implementation constraints, sequencing, and research that shapes how the Product Contract will be built.
  • Implementation Units (with stable U-IDs) — discrete work packets sized so each is independently executable. Each unit names Goal, Requirements, Files, Approach, Test Scenarios, and Verification. ce-work and other executors consume these units. When the work ships as several PRs, the units are grouped by PR. Each group has a Waits on: line. For each PR it waits on, the line says whether that PR only has to merge first or has to merge or deploy before the group can start. It also names any deployment that must be live before the group merges.
  • Unit Index (large plans only, ~10+ units). When the plan has roughly ten or more units, open the section with a compact navigation table — one row per unit: U-ID · one-line title · files touched · depends-on. It lets an executor map units to files and resolve dependency order without scanning every unit body. It is a navigation aid only: the unit bodies stay authoritative, it carries nothing beyond those four fields (no approach, tests, or rationale), and files touched is the key/primary paths, not an exhaustive restatement. Omit it below ~10 units — there the per-unit Dependencies/Files (and any sequencing or dependency diagram) already suffice, and an index would be ceremony.
  • Verification Contract — repo-specific commands and quality gates, including which tests prove the plan, when release:validate applies, and what behavioral skill evaluation is required. Avoid generic "run tests" language when the repo has concrete commands. When the goal is optimization-shaped (build time, latency, coverage, bundle size), express a measurable threshold as the exit criterion (e.g., "p95 latency < 200ms", "build time reduced 30%") and consider routing to ce-optimize — a metric target is a sharper done signal for a long-running goal than a boolean check.
  • Definition of Done — global and per-unit done criteria. This is the completion contract an executor checks before declaring the work done. Include a cleanup criterion: a long autonomous run accumulates dead-end and experimental code from approaches that did not pan out; declaring done requires that abandoned-attempt code is removed, not left in the diff.
Raw lines 97 to 177
Names a skill ce-work :148
Names a skill ce-optimize :170
178## Include when material
180These sections are present when they carry information that isn't covered
181elsewhere. The test is not "is this a substantial plan?" — it is
182*"does this specific plan have content this section would surface?"* Filling
183a section with placeholder prose is worse than omitting it.
185The first five entries below carry the Product Contract's product framing —
186what is being built and why. Later entries mix Product Contract subsections
187(Scope Boundaries, Open Questions, Acceptance Examples, Sources) with
188Planning Contract ones; the hard floor above remains authoritative for which
189section sits under which contract. Problem Frame is unconditional; each of the other four is included when its own test says so. A plan
190that skips all four conditional framing entries has usually inherited its
191framing from an upstream Product Contract — check before concluding none of
192them apply.
194- **Problem Frame** — the hard floor above contains it unconditionally, so
195 this entry governs its depth, never whether to include it. Give it
196 paragraphs when motivation isn't obvious from Summary alone; keep it to a
197 line or two when the motivation was settled upstream and more would only
198 echo the origin document. Backward-looking / situational. Does NOT restate
199 the proposal; the remedy lives in Summary.
201- **Key Decisions** — include when the plan carries product-level choices
202 that constrain the Requirements below, whether made during planning (scope
203 narrowings, defaults chosen against a real alternative, framing the user
204 picked) or inherited from an upstream Product Contract, which Phase 0.3
205 requires carrying forward with its rationale. Each entry is a provenance
206 index entry, not a second statement of the rule: the decision in bold, at
207 most one line of rationale, and exact `Governs R5, R7` links when it
208 constrains specific requirements. The normative text lives on the governed
209 Rs. Session-settled annotations follow the rules under "ID and content
210 rules" below. Distinct from Planning Contract's Key Technical Decisions,
211 which record how-level choices; a product decision belongs here, and a KTD
212 cites it rather than mirroring it. Skip only when no such
213 choice exists on any side: every requirement follows directly from the
214 request, any upstream Product Contract weighed no alternatives, and the
215 session settled none. A `session-settled:` decision always keeps the
216 section — plan-write and the routing table both require its labeled entry
217 to live here.
219- **Success Criteria** — include when there are quality / metric / handoff
220 signals that Requirements don't already carry: quantitative metrics ("p95
221 latency under 200ms"), qualitative criteria ("the agent's output reads as
222 one voice"), process / handoff quality ("ce-doc-review can act on this
223 without follow-ups"). Skip when Requirements ARE the success criteria
224 (every R is "done when the R is true"). Requirements that describe an
225 approach rather than an outcome are not success criteria; then include at
226 least one criterion that would show the Goal Capsule Objective was reached.
228- **Actors** — include when the work has multi-party behavior (multiple
229 humans, agents, or systems meaningfully involved) that the units must
230 honor. Skip for single-actor work and for plans whose change is internal
231 to one component — most implementation plans skip this.
233- **Key Flows** — include when the work has multi-step behavior whose
234 sequencing the units must preserve. Skip when the change is not
235 flow-shaped, or when Requirements and Acceptance Examples together already
236 prevent downstream invention of paths — again, most implementation plans
237 skip this.
239- **High-Level Technical Design** — include when the technical approach has
240 shape that prose alone doesn't carry well: architecture across components,
241 sequencing across processes, state machines, branching gates.
242 Visualizations (component topology, sequence, swim lane, flowchart,
243 data-flow) typically live here. Skip when the approach is a one-paragraph
244 pattern application that the prose itself conveys.
246- **Scope Boundaries** — include when scope is contested, when there are
247 tempting non-goals worth naming explicitly, or when "deferred for later"
248 needs distinguishing from "outside the product's identity." Skip when scope
249 is obvious from Requirements alone.
251- **Open Questions** — include when there are genuinely unresolved items that
252 block planning or implementation. Skip when the plan is complete; an empty
253 "Open Questions: none" section signals false uncertainty.
255- **System-Wide Impact** — include when the change affects cross-cutting
256 concerns (data lifecycles, auth boundaries, performance characteristics, cardinal
257 rules, shared infrastructure, agent/tool parity, prompt context, shared
258 workspaces). Skip for changes localized to one component where the impact is
259 self-evident.
261- **Risks & Dependencies** — include when there are real risks worth flagging
262 (external service changes, version pins under churn, behavioral assumptions
263 worth highlighting) or material upstream dependencies. Skip for low-risk
264 localized work.
266- **Acceptance Examples** — include when any requirement has a state-dependent
267 or conditional shape ("When X, Y") where the prose alone leaves ambiguity
268 about edge cases. Skip when all requirements are unconditional and
269 unambiguous.
271- **Documentation / Operational Notes** — include when documentation,
272 monitoring, runbooks, or rollout steps need explicit notes. Skip when the
273 work is purely internal and uses existing operational scaffolding without
274 modification.
276- **Sources / Research** — include the research that orients the implementer
277 or justifies the choices the plan rests on. The test: *"if I were the implementer
278 reading this cold, would this breadcrumb help me make better choices?"*
279 Yes → include (code locations like `services/convex/reports.ts:174-176`,
280 external docs, RFCs, constraints, prior plans — the category is inclusive,
281 not enumerated). A record of the planning process itself (reading the
282 user's prompt, glancing at obvious entry points, restating prose) → omit. Put it inline next to the
283 KTD or unit it justifies, or in a dedicated section — both shapes work.
284 A constraint adopted from a Compound Pack file is cited inline as
285 `(pack: <id>, <path within the pack>)` after the requirement, KTD, constraint,
286 or risk it shaped. The path is relative to the pack's own directory, so it
287 is stable for path- and git-sourced packs alike. Cite the pack text; do not
288 restate it. That marker is reserved for pack files; `<root>/solutions/`
289 learnings keep the ordinary path citation, so a reader can tell a
290 prescriptive pack rule from a retrospective learning.

Include when material

These sections are present when they carry information that isn't covered elsewhere. The test is not "is this a substantial plan?" — it is "does this specific plan have content this section would surface?" Filling a section with placeholder prose is worse than omitting it.

The first five entries below carry the Product Contract's product framing — what is being built and why. Later entries mix Product Contract subsections (Scope Boundaries, Open Questions, Acceptance Examples, Sources) with Planning Contract ones; the hard floor above remains authoritative for which section sits under which contract. Problem Frame is unconditional; each of the other four is included when its own test says so. A plan that skips all four conditional framing entries has usually inherited its framing from an upstream Product Contract — check before concluding none of them apply.

  • Problem Frame — the hard floor above contains it unconditionally, so this entry governs its depth, never whether to include it. Give it paragraphs when motivation isn't obvious from Summary alone; keep it to a line or two when the motivation was settled upstream and more would only echo the origin document. Backward-looking / situational. Does NOT restate the proposal; the remedy lives in Summary.
  • Key Decisions — include when the plan carries product-level choices that constrain the Requirements below, whether made during planning (scope narrowings, defaults chosen against a real alternative, framing the user picked) or inherited from an upstream Product Contract, which Phase 0.3 requires carrying forward with its rationale. Each entry is a provenance index entry, not a second statement of the rule: the decision in bold, at most one line of rationale, and exact Governs R5, R7 links when it constrains specific requirements. The normative text lives on the governed Rs. Session-settled annotations follow the rules under "ID and content rules" below. Distinct from Planning Contract's Key Technical Decisions, which record how-level choices; a product decision belongs here, and a KTD cites it rather than mirroring it. Skip only when no such choice exists on any side: every requirement follows directly from the request, any upstream Product Contract weighed no alternatives, and the session settled none. A session-settled: decision always keeps the section — plan-write and the routing table both require its labeled entry to live here.
  • Success Criteria — include when there are quality / metric / handoff signals that Requirements don't already carry: quantitative metrics ("p95 latency under 200ms"), qualitative criteria ("the agent's output reads as one voice"), process / handoff quality ("ce-doc-review can act on this without follow-ups"). Skip when Requirements ARE the success criteria (every R is "done when the R is true"). Requirements that describe an approach rather than an outcome are not success criteria; then include at least one criterion that would show the Goal Capsule Objective was reached.
  • Actors — include when the work has multi-party behavior (multiple humans, agents, or systems meaningfully involved) that the units must honor. Skip for single-actor work and for plans whose change is internal to one component — most implementation plans skip this.
  • Key Flows — include when the work has multi-step behavior whose sequencing the units must preserve. Skip when the change is not flow-shaped, or when Requirements and Acceptance Examples together already prevent downstream invention of paths — again, most implementation plans skip this.
  • High-Level Technical Design — include when the technical approach has shape that prose alone doesn't carry well: architecture across components, sequencing across processes, state machines, branching gates. Visualizations (component topology, sequence, swim lane, flowchart, data-flow) typically live here. Skip when the approach is a one-paragraph pattern application that the prose itself conveys.
  • Scope Boundaries — include when scope is contested, when there are tempting non-goals worth naming explicitly, or when "deferred for later" needs distinguishing from "outside the product's identity." Skip when scope is obvious from Requirements alone.
  • Open Questions — include when there are genuinely unresolved items that block planning or implementation. Skip when the plan is complete; an empty "Open Questions: none" section signals false uncertainty.
  • System-Wide Impact — include when the change affects cross-cutting concerns (data lifecycles, auth boundaries, performance characteristics, cardinal rules, shared infrastructure, agent/tool parity, prompt context, shared workspaces). Skip for changes localized to one component where the impact is self-evident.
  • Risks & Dependencies — include when there are real risks worth flagging (external service changes, version pins under churn, behavioral assumptions worth highlighting) or material upstream dependencies. Skip for low-risk localized work.
  • Acceptance Examples — include when any requirement has a state-dependent or conditional shape ("When X, Y") where the prose alone leaves ambiguity about edge cases. Skip when all requirements are unconditional and unambiguous.
  • Documentation / Operational Notes — include when documentation, monitoring, runbooks, or rollout steps need explicit notes. Skip when the work is purely internal and uses existing operational scaffolding without modification.
  • Sources / Research — include the research that orients the implementer or justifies the choices the plan rests on. The test: "if I were the implementer reading this cold, would this breadcrumb help me make better choices?" Yes → include (code locations like services/convex/reports.ts:174-176, external docs, RFCs, constraints, prior plans — the category is inclusive, not enumerated). A record of the planning process itself (reading the user's prompt, glancing at obvious entry points, restating prose) → omit. Put it inline next to the KTD or unit it justifies, or in a dedicated section — both shapes work. A constraint adopted from a Compound Pack file is cited inline as (pack: <id>, <path within the pack>) after the requirement, KTD, constraint, or risk it shaped. The path is relative to the pack's own directory, so it is stable for path- and git-sourced packs alike. Cite the pack text; do not restate it. That marker is reserved for pack files; <root>/solutions/ learnings keep the ordinary path citation, so a reader can tell a prescriptive pack rule from a retrospective learning.
Raw lines 178 to 291
292## Prototype sources
294When a kept prototype informed this artifact, record its absolute run-directory path in Sources and identify `decisions.md` and the selected screens or states relevant to the requirements. Label the citation machine-local and best effort while the original checkout or temporary directory exists. State in the citation that a missing prototype is not a blocker and the artifact's requirements govern any disagreement. Do not copy the prototype or capsule into the repository. An undone overlay has no surviving prototype to cite.

Prototype sources

When a kept prototype informed this artifact, record its absolute run-directory path in Sources and identify decisions.md and the selected screens or states relevant to the requirements. Label the citation machine-local and best effort while the original checkout or temporary directory exists. State in the citation that a missing prototype is not a blocker and the artifact's requirements govern any disagreement. Do not copy the prototype or capsule into the repository. An undone overlay has no surviving prototype to cite.

Raw lines 292 to 295
296## Agent agency
298The catalog is a floor, not a ceiling. When the plan's content doesn't fit
299any catalog section, introduce a new one — don't force the content into a
300section it doesn't belong in. Content drives section choices, not vice
301versa.
303The agent also picks per artifact:
305- Whether Problem Frame merges into Summary — legacy and non-unified plans
306 only. Any `ce-unified-plan/v1` artifact keeps both headings regardless of
307 plan depth: the hard floor names them separately and downstream consumers
308 anchor on them. (Scoped by artifact contract, not by depth — a `Lightweight`
309 plan can still be implementation-ready.)
310- Sub-groupings (Requirements by capability, KTDs by component, Units phased
311 into milestones). When the work ships as several PRs, the PR groups are the
312 only grouping of units
313- How much detail each section carries
314- Whether HTD has one diagram, several, or none — and whether visualizations
315 live in HTD or embedded in other sections

Agent agency

The catalog is a floor, not a ceiling. When the plan's content doesn't fit any catalog section, introduce a new one — don't force the content into a section it doesn't belong in. Content drives section choices, not vice versa.

The agent also picks per artifact:

  • Whether Problem Frame merges into Summary — legacy and non-unified plans only. Any ce-unified-plan/v1 artifact keeps both headings regardless of plan depth: the hard floor names them separately and downstream consumers anchor on them. (Scoped by artifact contract, not by depth — a Lightweight plan can still be implementation-ready.)
  • Sub-groupings (Requirements by capability, KTDs by component, Units phased into milestones). When the work ships as several PRs, the PR groups are the only grouping of units
  • How much detail each section carries
  • Whether HTD has one diagram, several, or none — and whether visualizations live in HTD or embedded in other sections
Raw lines 296 to 316
317## Prose economy
319"Include when material" sizes *which* sections appear; this sizes *how the kept
320prose reads*. A section can be material and still be written loosely — the
321failure mode is a material section padded into a wall of text where
322contradictions hide and the implementing agent loses the thread. A deep plan
323earns length through coverage (more units, more traced requirements, real
324risks), never through wordiness around that coverage.
326Write every kept section through the `ce-noslop` skill.
328Hold every kept section to these:
330- **Lead with the decision or outcome.** Put the conclusion first, then the
331 reason, then background; keep one claim plus its support per paragraph. Don't
332 bury a Key Technical Decision, the chosen scope, an open blocker, or a unit
333 goal beneath its rationale. This does not override section roles — Summary
334 stays proposal-only, Problem Frame stays motivation-only and never restates
335 the remedy.
336- **A Summary is a handful of sentences**, not one sentence with five
337 semicolons and four parentheticals. A KTD's rationale is the reason that
338 decided it, not every reason.
339- **A requirement or unit is one sentence of intent plus at most one
340 qualifier.** When it would specify two outcomes ("either A or B, the
341 implementer decides"), state the intent and send the fork to Open Questions —
342 don't write both arms in full inside the item.
344Precision is not padding: keep file paths, IDs, dates, domain terms,
345conditionals, and exact thresholds verbatim; when a concrete anchor is knowable
346from the work already done, use it instead of a vague abstraction. Economy
347targets the connective tissue around precision, never the precision itself.
349**Resolve in place; don't stratify.** When deepening, a doc-review pass, or a
350later decision supersedes earlier text, rewrite or remove the original — don't
351leave it standing as strikethrough or stack a separate "resolutions" layer on
352top of it. Version control holds the history. Stacked strata double the reading
353surface and hide which text is live.
355**One owner per rule; cite, don't restate.** A normative rule — a gate, cap,
356threshold, protocol, or output contract — is stated in full at exactly one
357owning entry: product behavior on its R-ID; an implementation choice on its
358KTD. Every other layer cites the owning ID and adds only what is local to
359it — a unit's Approach carries unit-local deltas (files, sequencing,
360patterns), never a re-derivation of the protocol its cited Rs and KTDs own.
361Linked projections are allowed (an AE restating behavior under
362`Covers R…`, a Flow citing the Rs it sequences). **Unlinked sibling
363restatement** — the same rule written out again in a KTD, Scope bullet, or
364Approach with no ID link — is the defect: each copy drifts independently.
365When linked layers disagree, authority is typed: the **R wins on product
366behavior**; the **KTD wins on implementation mechanism** within its cited R
367constraints; a unit overrides neither; AEs and Flows illustrate and
368sequence, never amend.
370**Bind external authorities; don't summarize them.** When a requirement,
371KTD, or unit adopts an external document (a field guide, spec, standard),
372state the commitment, cite the path, and record only this work's deltas. A
373multi-sentence summary of the cited document is restatement of an owner that
374lives outside the doc.
376**Named test, run before the plan is declared written:** could the implementer
377find a contradiction in each section in one pass? Could a colleague who was
378not in the session say what this work is after the Objective alone? A sentence
379carrying more than one parenthetical, a sentence chaining more than two
380semicolons, an item specifying two outcomes, or a rule stated in full in more than one section
381fails the test — split it (a semicolon chain becomes a list), defer it, or
382replace the duplicate with its owning ID.

Prose economy

"Include when material" sizes which sections appear; this sizes how the kept prose reads. A section can be material and still be written loosely — the failure mode is a material section padded into a wall of text where contradictions hide and the implementing agent loses the thread. A deep plan earns length through coverage (more units, more traced requirements, real risks), never through wordiness around that coverage.

Write every kept section through the ce-noslop skill.

Hold every kept section to these:

  • Lead with the decision or outcome. Put the conclusion first, then the reason, then background; keep one claim plus its support per paragraph. Don't bury a Key Technical Decision, the chosen scope, an open blocker, or a unit goal beneath its rationale. This does not override section roles — Summary stays proposal-only, Problem Frame stays motivation-only and never restates the remedy.
  • A Summary is a handful of sentences, not one sentence with five semicolons and four parentheticals. A KTD's rationale is the reason that decided it, not every reason.
  • A requirement or unit is one sentence of intent plus at most one qualifier. When it would specify two outcomes ("either A or B, the implementer decides"), state the intent and send the fork to Open Questions — don't write both arms in full inside the item.

Precision is not padding: keep file paths, IDs, dates, domain terms, conditionals, and exact thresholds verbatim; when a concrete anchor is knowable from the work already done, use it instead of a vague abstraction. Economy targets the connective tissue around precision, never the precision itself.

Resolve in place; don't stratify. When deepening, a doc-review pass, or a later decision supersedes earlier text, rewrite or remove the original — don't leave it standing as strikethrough or stack a separate "resolutions" layer on top of it. Version control holds the history. Stacked strata double the reading surface and hide which text is live.

One owner per rule; cite, don't restate. A normative rule — a gate, cap, threshold, protocol, or output contract — is stated in full at exactly one owning entry: product behavior on its R-ID; an implementation choice on its KTD. Every other layer cites the owning ID and adds only what is local to it — a unit's Approach carries unit-local deltas (files, sequencing, patterns), never a re-derivation of the protocol its cited Rs and KTDs own. Linked projections are allowed (an AE restating behavior under Covers R…, a Flow citing the Rs it sequences). Unlinked sibling restatement — the same rule written out again in a KTD, Scope bullet, or Approach with no ID link — is the defect: each copy drifts independently. When linked layers disagree, authority is typed: the R wins on product behavior; the KTD wins on implementation mechanism within its cited R constraints; a unit overrides neither; AEs and Flows illustrate and sequence, never amend.

Bind external authorities; don't summarize them. When a requirement, KTD, or unit adopts an external document (a field guide, spec, standard), state the commitment, cite the path, and record only this work's deltas. A multi-sentence summary of the cited document is restatement of an owner that lives outside the doc.

Named test, run before the plan is declared written: could the implementer find a contradiction in each section in one pass? Could a colleague who was not in the session say what this work is after the Objective alone? A sentence carrying more than one parenthetical, a sentence chaining more than two semicolons, an item specifying two outcomes, or a rule stated in full in more than one section fails the test — split it (a semicolon chain becomes a list), defer it, or replace the duplicate with its owning ID.

Raw lines 317 to 383
Names a skill ce-noslop :326
384## Plan metadata fields
386Every plan carries a small set of stable metadata fields that downstream
387tooling depends on. The contract is format-independent: in markdown these
388fields appear as YAML frontmatter at the top of the file; in HTML they
389appear as visible text placed as `references/html-rendering.md` describes.
390Field names and semantics are the same across both formats
391so consumers can locate them without knowing which format produced the
392plan.

Plan metadata fields

Every plan carries a small set of stable metadata fields that downstream tooling depends on. The contract is format-independent: in markdown these fields appear as YAML frontmatter at the top of the file; in HTML they appear as visible text placed as references/html-rendering.md describes. Field names and semantics are the same across both formats so consumers can locate them without knowing which format produced the plan.

Raw lines 384 to 393
394### Required
396- **`title`** — the plan's descriptive name with a ` - Plan` suffix
397 (e.g., `Highlighter Tool - Plan`), matching the H1 (markdown) or document
398 `<h1>` (HTML) so file metadata and visible heading don't drift. Stable
399 across planning stages (it is a plan at every stage). Do not put a
400 conventional-commit prefix (`feat:`/`fix:`) in the title — the `type` field
401 carries that classification.
402- **`type`** — conventional-commit-prefix-aligned classification (`feat`,
403 `fix`, `refactor`, `chore`, `docs`, `perf`, `test`, etc.). Carries the
404 intent the eventual commit message should reflect.
405- **`date`** — creation date in ISO 8601 (`YYYY-MM-DD`), ASCII digits only.
407Plans carry **no `status` field** — a plan is a decision artifact, not a
408tracked work item. `ce-work` does not mutate the plan at ship time;
409whether a plan shipped is derived from git, not stored in the doc. Do not
410add a `status` field or an `active → completed` lifecycle.

Required

  • **title** — the plan's descriptive name with a - Plan suffix (e.g., Highlighter Tool - Plan), matching the H1 (markdown) or document <h1> (HTML) so file metadata and visible heading don't drift. Stable across planning stages (it is a plan at every stage). Do not put a conventional-commit prefix (feat:/fix:) in the title — the type field carries that classification.
  • **type** — conventional-commit-prefix-aligned classification (feat, fix, refactor, chore, docs, perf, test, etc.). Carries the intent the eventual commit message should reflect.
  • **date** — creation date in ISO 8601 (YYYY-MM-DD), ASCII digits only.

Plans carry **no status field** — a plan is a decision artifact, not a tracked work item. ce-work does not mutate the plan at ship time; whether a plan shipped is derived from git, not stored in the doc. Do not add a status field or an active → completed lifecycle.

Raw lines 394 to 411
Names a skill ce-work :408
412### Optional but well-known
414These fields are not required, but when set they have fixed names and
415semantics so downstream tooling can rely on them:
417- **`origin`** — repo-relative path to an upstream brainstorm requirements
418 doc (e.g., `docs/brainstorms/2026-05-12-pagination-requirements.md`).
419 Set when planning from an upstream brainstorm; carried for traceability
420 and re-resolved when `ce-plan` re-deepens.
421- **`deepened`** — ISO 8601 date marking the first time the confidence
422 check substantively strengthened the plan. Presence affects Phase 0.1
423 resume fast-path logic (see `references/deepening-workflow.md`).
424- **`execution`** — execution domain for downstream routing: `code`
425 (the default when absent) or `knowledge-work`. `ce-work`'s input triage
426 reads this: a plan marked `execution: knowledge-work` routes to the
427 non-code carve-out (read sources, synthesize, produce a deliverable —
428 skipping the branch/test/commit/CI lifecycle); absent or `code` routes
429 to the normal code path. Written by `ce-plan`'s approach-altitude flow
430 (`references/approach-altitude.md`) when a non-code deliverable is
431 persisted for execution.
433Field names are stable across plan revisions — never rename a field or
434repurpose its semantics. Agents composing new plans MUST use these exact
435names; adding new fields is fine, but renaming `origin` to `source` or
436`date` to `created` breaks the downstream consumers above.

Optional but well-known

These fields are not required, but when set they have fixed names and semantics so downstream tooling can rely on them:

  • **origin** — repo-relative path to an upstream brainstorm requirements doc (e.g., docs/brainstorms/2026-05-12-pagination-requirements.md). Set when planning from an upstream brainstorm; carried for traceability and re-resolved when ce-plan re-deepens.
  • **deepened** — ISO 8601 date marking the first time the confidence check substantively strengthened the plan. Presence affects Phase 0.1 resume fast-path logic (see references/deepening-workflow.md).
  • **execution** — execution domain for downstream routing: code (the default when absent) or knowledge-work. ce-work's input triage reads this: a plan marked execution: knowledge-work routes to the non-code carve-out (read sources, synthesize, produce a deliverable — skipping the branch/test/commit/CI lifecycle); absent or code routes to the normal code path. Written by ce-plan's approach-altitude flow (references/approach-altitude.md) when a non-code deliverable is persisted for execution.

Field names are stable across plan revisions — never rename a field or repurpose its semantics. Agents composing new plans MUST use these exact names; adding new fields is fine, but renaming origin to source or date to created breaks the downstream consumers above.

Raw lines 412 to 437
Names a skill ce-work :425
438## ID and content rules
440These apply regardless of rendering format.
442- **Stable IDs.** R-IDs (Requirements), U-IDs (Implementation Units),
443 KTD-IDs (Key Technical Decisions, implementation-ready plans), A-IDs
444 (if the plan has Actors), F-IDs (if it has Flows), AE-IDs (if it has
445 Acceptance Examples). IDs are stable across plan revisions — never renumber to "clean
446 up gaps."
447- **Plain prefix.** `R1.`, `U1.`, `KTD1.` as bullet prefixes. Do not bold;
448 the prefix is visually distinctive on its own.
449- **KTD-IDs on implementation-ready plans.** Number Key Technical Decisions
450 (`KTD1.`, next unused number, same never-renumber rule as U-IDs) in newly
451 authored implementation-ready plans, and in an existing plan whenever a
452 KTD is added, split, or first cited by a unit. Untouched unnumbered KTDs
453 in legacy plans stay as they are — readable by label, no mass renumbering.
454- **File paths** follow the policy in `references/output-mode.md`.
455- **No record of the planning process.** No "captured at Phase X" notes, no `## Next Steps`
456 pointing to the next skill, no italic provenance lines. Engineering process
457 metadata belongs in commit messages and tool output, not the artifact.
458- **Session-settled annotations on KTDs.** A Key Technical Decision that
459 records a decision settled in the invoking conversation carries an inline
460 annotation on its entry:
461 `(session-settled: user-directed — chosen over <alternative>: <one-line reason>)`.
462 Exactly two classes: `user-directed` (the user chose against or between
463 surfaced options) and `user-approved` (the agent proposed with the tradeoff
464 surfaced; the user assented). An agent never labels its own unexamined
465 proposal. A KTD that makes the how-level choice instantiating a labeled
466 Product Contract Key Decision inherits the label and cites the decision's
467 governed R-IDs. Do **not** create a KTD that merely mirrors a Product Key
468 Decision with no new technical choice — the Key Decision plus its
469 `Governs R…` links already own that content. The annotation is
470 self-contained — decision, rejected alternative, and one-line reason
471 readable without the conversation — and lives inline on the entry: no
472 sidecar files, no frontmatter registry, no numeric weights, no lifecycle
473 field. Like a `(see origin: <path>)` citation, it is decision provenance,
474 not a record of the planning process — review passes must not strip it. A consumer that
475 does not recognize the annotation treats the entry as a normal KTD.
476- **Group Requirements by concern when they span distinct logical areas.**
477 The trigger is distinct concerns, not item count — even four requirements
478 benefit from grouping if they cover three different topics. Skip grouping
479 only when all requirements are genuinely about the same thing; a long flat
480 list is a smell that subgroups were missed. Group by capability (e.g.,
481 "Packaging", "Migration and compatibility", "Contributor workflow"), not by
482 the order requirements were discussed. R-IDs stay continuous across groups
483 (R1, R2 in the first group; R3, R4 in the second; never restart at R1 per
484 group).

ID and content rules

These apply regardless of rendering format.

  • Stable IDs. R-IDs (Requirements), U-IDs (Implementation Units), KTD-IDs (Key Technical Decisions, implementation-ready plans), A-IDs (if the plan has Actors), F-IDs (if it has Flows), AE-IDs (if it has Acceptance Examples). IDs are stable across plan revisions — never renumber to "clean up gaps."
  • Plain prefix. R1., U1., KTD1. as bullet prefixes. Do not bold; the prefix is visually distinctive on its own.
  • KTD-IDs on implementation-ready plans. Number Key Technical Decisions (KTD1., next unused number, same never-renumber rule as U-IDs) in newly authored implementation-ready plans, and in an existing plan whenever a KTD is added, split, or first cited by a unit. Untouched unnumbered KTDs in legacy plans stay as they are — readable by label, no mass renumbering.
  • File paths follow the policy in references/output-mode.md.
  • No record of the planning process. No "captured at Phase X" notes, no ## Next Steps pointing to the next skill, no italic provenance lines. Engineering process metadata belongs in commit messages and tool output, not the artifact.
  • Session-settled annotations on KTDs. A Key Technical Decision that records a decision settled in the invoking conversation carries an inline annotation on its entry: (session-settled: user-directed — chosen over <alternative>: <one-line reason>). Exactly two classes: user-directed (the user chose against or between surfaced options) and user-approved (the agent proposed with the tradeoff surfaced; the user assented). An agent never labels its own unexamined proposal. A KTD that makes the how-level choice instantiating a labeled Product Contract Key Decision inherits the label and cites the decision's governed R-IDs. Do not create a KTD that merely mirrors a Product Key Decision with no new technical choice — the Key Decision plus its Governs R… links already own that content. The annotation is self-contained — decision, rejected alternative, and one-line reason readable without the conversation — and lives inline on the entry: no sidecar files, no frontmatter registry, no numeric weights, no lifecycle field. Like a (see origin: <path>) citation, it is decision provenance, not a record of the planning process — review passes must not strip it. A consumer that does not recognize the annotation treats the entry as a normal KTD.
  • Group Requirements by concern when they span distinct logical areas. The trigger is distinct concerns, not item count — even four requirements benefit from grouping if they cover three different topics. Skip grouping only when all requirements are genuinely about the same thing; a long flat list is a smell that subgroups were missed. Group by capability (e.g., "Packaging", "Migration and compatibility", "Contributor workflow"), not by the order requirements were discussed. R-IDs stay continuous across groups (R1, R2 in the first group; R3, R4 in the second; never restart at R1 per group).
Raw lines 438 to 485
486## Rendering
488The format-specific references describe how to render these sections in each
489output format:
491- **Markdown rendering:** `references/markdown-rendering.md`
492- **HTML rendering:** `references/html-rendering.md`
494This reference (`plan-sections.md`) is about WHAT the plan contains;
495rendering references are about HOW each format presents it. The plan is
496written in one format — markdown OR HTML, never both — based on the
497resolved output mode. The section catalog is the same regardless of
498format.

Rendering

The format-specific references describe how to render these sections in each output format:

  • Markdown rendering: references/markdown-rendering.md
  • HTML rendering: references/html-rendering.md

This reference (plan-sections.md) is about WHAT the plan contains; rendering references are about HOW each format presents it. The plan is written in one format — markdown OR HTML, never both — based on the resolved output mode. The section catalog is the same regardless of format.

Raw lines 486 to 498