29 KiB
title, type, date, topic, artifact_contract, artifact_readiness, product_contract_source, execution
| title | type | date | topic | artifact_contract | artifact_readiness | product_contract_source | execution |
|---|---|---|---|---|---|---|---|
| README Install-First Reorder - Plan | docs | 2026-07-15 | readme-install-first | ce-unified-plan/v1 | implementation-ready | ce-plan-bootstrap | code |
README Install-First Reorder - Plan
Base note. This plan was first drafted against
README.mdat 481 lines with eleven platform paths, then re-derived againstorigin/mainat1f29eabc, where the README is 575 lines with fourteen platform paths (Cline, Grok Build CLI, and Devin CLI landed in between). Every line number, count, and percentage below reflects that base. The growth is not incidental: it inverted OQ1's arithmetic, and on review the user redirected from a whole-block move to the split this plan now specifies. OQ1 records that resolution.
Goal Capsule
- Objective: A visitor landing on the
compound-engineering-pluginrepo sees how to install Compound Engineering as the first substantive content, immediately below the project's name and one-line description. - Product authority: The Product Contract below (bootstrapped from the user's request; no upstream brainstorm).
- Stop conditions: Surface a blocker instead of guessing if the change cannot preserve every platform's install instructions verbatim, or if any anchor would break. Adding minimal navigation (a pointer line, a section heading) is in scope; rewording, merging, or dropping any platform's instructions is not.
- Execution profile: Documentation-only content relocation in
README.md. No code, no tests, no runtime behavior. - Open blockers: None. OQ1 and OQ2 are decisions for PR review, not blockers.
Product Contract preservation: N/A — solo invocation, no upstream Product Contract to preserve. Requirements below were bootstrapped from the user's request.
Product Contract
Summary
README.md opened with Philosophy, Workflow, Quick Example, and a 30-row skill inventory, placing ## Install at line 150 — roughly 26% of the way down a 575-line file. This plan puts ## Install directly beneath the H1, badge, and tagline, carrying the three primary platforms (Claude Code, Cursor, and Codex — both its App and CLI surfaces). The Claude Code commands land at lines 12-13. The other eleven subsections move verbatim to a ## More Install Options section lower in the file, reachable by one pointer link, so leading with install costs ~90 lines instead of ~297 and ## Philosophy lands at 17% down — shallower than Install itself began. No platform's instructions change.
Problem Frame
The README's front matter sells the idea before it lets anyone act on it. A visitor who already wants the plugin — see A5 on how load-bearing and unvalidated that assumption is — must scroll past ~146 lines of philosophy, a six-step workflow table, additional-skills table, five code-block examples, and the full 30-skill inventory before finding /plugin marketplace add. The information is present and correct; it is ordered for persuasion rather than for action.
A secondary incoherence falls out of the same ordering: ## Getting Started (line 107) opens with "After installing, run /ce-setup in any project" while sitting above the install instructions it refers to.
Requirements
- R1. Install is the first substantive content — a visitor sees how to install without scrolling past philosophy, workflow, examples, or the skill inventory.
- R2. Every platform's install instructions are preserved verbatim: all fourteen platform paths (Claude Code, Cursor, Codex App, Codex CLI, Kimi Code CLI, Cline, Grok Build CLI, Devin CLI, GitHub Copilot, Factory Droid, Qwen Code, OpenCode, Pi, Antigravity CLI) plus
### Existing Installs, with nothing reworded, merged, or dropped. The only permitted additions are navigation: one pointer line from the top section to the overflow section, the overflow section's heading, and its one-line intro. - R3. Every existing anchor continues to resolve — the two intra-README links (
#full-skill-inventory,#existing-installs) and any external deep-link to#install. - R4. The rendered document has no doubled or stray horizontal rules, and all non-Install sections keep their current relative order.
- R5. The project's identity — name, CI badge, and the one-line "AI skills that make each unit of engineering work easier than the last." — remains above the install instructions.
- R6. The top section carries the three primary platforms — Claude Code, Cursor, and Codex (both its App and CLI surfaces, which must not be split across the boundary) — and the remaining eleven subsections live in a single overflow section reachable by one link.
Acceptance Examples
- AE1. A visitor reading the README sees the project name, badge, tagline, then immediately
## Install,### Claude Code, and the two/plugincommands — no README content intervenes, and the commands land within the first ~14 source lines. (On github.com the repo file browser and header render above the README, so absolute viewport visibility is not achievable on the landing page and is not claimed here.) - AE2. A Codex CLI user following the in-page find for "Codex CLI" lands on the same instructions they would have found before this change, worded identically.
- AE3. A visitor following an existing external link to
…/compound-engineering-plugin#installstill lands on the Install heading. - AE4. A reader who scrolls past Install reaches Philosophy, then Workflow, Quick Example, Getting Started, Local Development, Limitations, FAQ, Contributing, License — the same order as before.
Assumptions
Headless run (LFG pipeline) — the scoping confirmation was skipped, so the inferred calls below are recorded here for review rather than confirmed in chat. Each is cheap to reverse; the whole change is a reorder.
- A1. "All the way to the top" means immediately after the H1 + badge + tagline identity block, not above it. The H1 cannot be displaced, and a reader needs one line of what-it-is before install commands. This places the install commands at lines 12-13 — the goal is fully met without a contentless opening.
- A2.
The ask is ordering-only.Superseded 2026-07-15 by the user's redirect on PR #1146 — see OQ1 (resolved). The ask is now split-and-order: the three primary platforms lead at the top, the other eleven subsections move to an overflow section reachable by one link. Each platform's instructions still move verbatim; the only additions are navigation. - A3.
## Getting Starteddoes not travel with Install. It stays where it is and becomes a correct forward-reference once Install precedes it. - A4.
Philosophy, Workflow, and Quick Example moving below the whole Install block is the intended tradeoff.Largely dissolved by the OQ1 split. The split was adopted precisely because this assumption did not survive the re-derived base: a whole-block move put Philosophy at 53% down, deeper than Install's original 26%. With only three platforms leading, Philosophy sits at 17% — shallower than the status quo — so the tradeoff this assumption asked the user to accept is no longer being asked. - A5. The dominant repo visitor already intends to install, rather than arriving from a linked article to evaluate the idea. Unvalidated — there is no README traffic data, no issue history on install discoverability, and no upstream brainstorm; the README itself links two Every articles as inbound paths, and readers arriving that way are mid-evaluation, not mid-install. The whole plan's value rests on this assumption. It came from the user's direct instruction, which is authority enough to proceed, but it is a bet, not an established fact.
Planning Contract
Key Technical Decisions
-
KTD-1. Insertion point: after the tagline (line 5), before
## Philosophy. The identity block (H1, badge, tagline) is five lines and cannot be moved below Install without leaving the page contentless at the top. Install starting at line 7 puts### Claude Codeand its two commands at lines 12-13 — the first thing a visitor reads after learning what the project is. Rejected: inserting above the badge/tagline, which trades a one-line orientation cost for no scroll benefit. -
KTD-2. Split relocation — three platforms lead, eleven overflow, every instruction verbatim. Supersedes the original pure-move decision after the user's redirect (OQ1, resolved).
## Installkeeps its heading text (so#installsurvives) and carries Claude Code, Cursor, Codex App, and Codex CLI. The remaining eleven subsections (Kimi Code CLI through Antigravity CLI, plus### Existing Installs) move verbatim into a new## More Install Optionssection placed between### Full Skill Inventoryand## Local Development— grouping it with the install-adjacent "From your local checkout" content rather than stranding it mid-narrative.Codex is one platform with two surfaces. Codex App and Codex CLI both stay at the top. Splitting them across the boundary would land a Codex App user on a top section that does not contain their instructions — the exact failure the split exists to avoid.
Verification changes shape. This is no longer a pure relocation, so sorted-multiset equality against
HEADno longer holds. The replacement guarantee is stricter than a line count: the removed set againstorigin/mainmust be empty (nothing dropped or reworded anywhere in the file), and the added set must contain only the intended navigation lines. See U1's Verification. -
KTD-3. Anchors are heading-text-derived and all heading text is unique, so a reorder cannot break them. GitHub slugifies heading text position-independently except for duplicate heading text, which it disambiguates with positional
-1/-2suffixes — so a reorder can swap anchors when two headings share text. That precondition is satisfied here: verified that all 33 of the README's headings are textually unique. (The per-platform labels under## Local Developmentand### Existing Installsare bold text, not headings, so they generate no anchors and cannot collide with### Claude Codeand its peers.) With no duplicate slugs and no heading text changing,#install,#existing-installs, and#full-skill-inventoryall survive. This is the finding that de-risks the change: R3 needs no link edits. Verified by grep — the README contains exactly two anchor references (line 56 →#full-skill-inventory, line 159 →#existing-installs), and no file outsidedocs/plans/links to a README anchor. -
KTD-4. Cut lines 149-445 — the blank line, the heading, the content, and the trailing rule — and leave the leading rule at 148 in place. Install is currently fenced by
---at 148 and---at 445. Two off-by-one traps sit here, both empirically simulated:- Moving only 150-443 leaves the two rules adjacent — a visible
------artifact that R4 forbids. - Moving 150-445 fixes the rules but strands the blank at 149 next to the blank at 446, leaving two consecutive blanks before
## Local Development. Worse, the block then needs a new blank inserted above it at the top, so the diff adds one more line than it removes, the file grows to 576 lines, and R2's "added and removed line sets are equal" check becomes false. - Moving 149-445 (297 lines: blank + heading + content + trailing blank + rule) is correct. The traveling blank supplies the separator after the tagline, so no new line is added. At the vacated position,
---(148) is followed by the surviving blank (446) and## Local Development— mirroring the original rule/blank/heading spacing exactly. The file stays at 575 lines and the added and removed line sets are exactly equal. Verified by simulation: the two/plugincommands land at lines 12-13, rules end at 302 and 445, and no doubled blank appears at either seam.
The content-anchored description is authoritative over these line numbers. Every span here is pinned to
README.mdatorigin/main=1f29eabc; any commit touching the README before U1 executes silently rots them — which already happened once during this plan's own drafting (see the Base note). If the numbers and the description disagree, re-derive the span from the description (the blank line before## Installthrough the---following### Existing Installs) rather than cutting the stated range. - Moving only 150-443 leaves the two rules adjacent — a visible
-
KTD-5.
## Getting Startedstays put. It owns the### Full Skill Inventorytable (~35 lines of reference content, not install content), so promoting it with Install would drag the inventory to the top and undercut R1. Leaving it fixes its "After installing…" opening as a side effect of Install moving above it. -
KTD-6. Plan depth: Lightweight; no flow analysis or deepening pass. Phase 1.4b would escalate to Standard for work touching "documentation referenced by external URLs," but KTD-3 establishes that the externally-referenced surface — the anchors — is provably undisturbed by a heading-text-preserving reorder. There is no user flow, state transition, or contract to analyze in a single-block content move. Recorded here so a reviewer can challenge the classification rather than infer it.
Scope Boundaries
Non-Goals
- No changes to any platform's install instruction content, commands, or coverage — all fourteen stay, worded identically.
- No changes to any other section's content or internal order.
- No changes to
docs/skills/README.md,.opencode/INSTALL.md,.agy/INSTALL.md, or any platform manifest.
Deferred to Follow-Up Work
- Reconcile
## Local Development's "From your local checkout" per-harness list with the install per-platform lists. The two maintain parallel per-platform instructions that can drift. The split puts## More Install Optionsdirectly above## Local Development, which makes the duplication more visible and this consolidation more attractive. - Trim per-platform install prose. Several subsections repeat a "no separate Bun install step is needed" explanation.
- Revisit the top-three boundary as the target matrix shifts. See the split-boundary staleness risk. Not actionable now.
No longer deferred — the split resolved these:
Collapse the non-primary platform subsections intoThe whole point was to shrink Install's height at the top; the split does that (~90 lines instead of ~297) without<details>blocks.<details>'s cost — GitHub's in-page find does not search collapsed content, which would have hurt the eleven overflow platforms and conflicted with AE2. A plain link has no such penalty.SplitDone: it moved into### Existing Installsout of Install.## More Install Options, still linked from the Claude Code blockquote at the top.
Implementation Units
U1. Lead with the three primary platforms; move the rest to an overflow section
-
Goal:
## Installsits directly below the tagline carrying Claude Code, Cursor, Codex App, and Codex CLI; the other eleven subsections live verbatim in a new## More Install Optionssection lower in the file, reachable by one link. -
Requirements: R1, R2, R3, R4, R5, R6 (all of them — this is a single-unit plan).
-
Dependencies: None.
-
Files:
README.md -
Approach: Resolve every span by content anchor, not line number (KTD-4's rot lesson). Cut from the blank line preceding
### Kimi Code CLIthrough the last content line of### Existing Installs— leaving the---that follows it in place at the top, where it continues to fence## Installfrom## Philosophy. Reinsert that block verbatim after the blank following the---that precedes## Local Development, prefixed by the## More Install Optionsheading and its one-line intro, and suffixed by a blank +---+ blank so## Local Developmentkeeps its own fence. Add one pointer line at the tail of the top section, after Codex CLI's last line. Touch nothing inside any platform subsection.Resulting top-level order: identity block → Install (Claude Code, Cursor, Codex App, Codex CLI) →
---→ Philosophy → Workflow → Quick Example → Getting Started →---→ More Install Options (eleven subsections) →---→ Local Development → Limitations → FAQ → Contributing → License. -
Execution note: Docs-only restructuring. The evidence for R2 is that the removed set against
origin/mainis empty — not a line count and not multiset equality, both of which a split breaks by design. Do not add tests; there is no behavior to assert. -
Patterns to follow: The README's
---convention — every rule is blank-fenced on both sides and separates a major structural block. The new section inherits that shape. Section heading levels and text stay exactly as-is for every existing heading. -
Test scenarios:
Test expectation: none -- content restructuring of a documentation file.No behavior changes and no test in the suite asserts README structure. Verified:tests/release-preview.test.ts:25uses"README.md"only as a synthetic changed-file path for release-component mapping, andsrc/release/components.tsmaps it by path (order-agnostic);tests/release-metadata.test.tsdoes not read the README. Thebun testandrelease:validateruns in Verification are regression guards against unexpected coupling, not new coverage. -
Verification:
diff <(git show origin/main:README.md | sort) <(sort README.md)emits no<lines — the removed set is empty, proving nothing anywhere in the file was dropped or reworded (R2). The>lines must contain only the intended navigation: the## More Install Optionsheading, its intro line, the pointer line, one---, and blank lines.- All fourteen
### <Platform>subsections plus### Existing Installsappear exactly once each (R2, R6). ## Install,### Claude Code, and both/plugincommands appear within the first ~14 source lines (AE1).- Codex App and Codex CLI both sit inside the top
## Installsection — neither is stranded in the overflow (R6). - Top-level section order matches the sequence in Approach above (AE4).
- Every
^---$rule is blank-fenced on both sides, and no two consecutive blank lines exist anywhere (R4). - All four anchors resolve to exactly one heading each:
#install,#existing-installs,#full-skill-inventory, and the new#more-install-options(R3, AE3). - No two headings share the same text, so no positional
-1/-2slug suffix exists for the reorder to swap (R3, KTD-3's precondition). git diff --statshowsREADME.mdas the only changed file besides this plan.bun testpasses andbun run release:validatepasses.
Verification Contract
- Structural: Install is the first
##heading in the file and carries Claude Code, Cursor, Codex App, and Codex CLI; the identity block precedes it; the other eleven subsections sit in## More Install Optionsbetween### Full Skill Inventoryand## Local Development; every other section retains its prior relative order. - Content fidelity: The removed set against
origin/mainis empty (diff <(git show origin/main:README.md | sort) <(sort README.md)emits no<lines), and the added set contains only the intended navigation lines. Every one of the fourteen platform subsections plus### Existing Installsis present exactly once, verbatim. - Link integrity: All four anchors resolve (
#install,#existing-installs,#full-skill-inventory,#more-install-options); no existing heading text changed and no two headings share text, so no slug is position-dependent and external#installdeep-links survive. - Rendering: Three horizontal rules (after Install, before More Install Options, before Local Development), each blank-fenced on both sides, with no doubled blank line at any seam.
- Regression:
bun testgreen,bun run release:validategreen.
Definition of Done
README.mdopens with the identity block followed immediately by## Installcarrying Claude Code, Cursor, Codex App, and Codex CLI.- The other eleven subsections live verbatim in
## More Install Options, reachable by one pointer link from the top section. - All fourteen platform install paths and
### Existing Installsare present and verbatim; the removed set againstorigin/mainis empty. - Three horizontal rules, each blank-fenced on both sides, correctly placed per KTD-2.
- All four anchors resolve; no existing heading text changed.
bun testandbun run release:validatepass.- The change lands as a single
docs(readme):commit on a feature branch via PR (README.md is docs-only per the repo's commit conventions; the intent is reordering documentation, not changing product behavior).
Open Questions
OQ1. Should Install be split rather than moved whole? — RESOLVED: yes, split (2026-07-15).
Resolution. Raised by document review, recorded here rather than acted on unilaterally, and the user redirected to the split on PR #1146: lead with Claude Code, Cursor, and Codex; link to the rest below. That is what this plan now specifies (R6, KTD-2, U1). The question is kept rather than deleted because the reasoning below is why the redirect was the right call — and because it is a worked example of the mechanism paying off: surfacing a tradeoff instead of burying it let the user correct the approach before merge, at the cost of one review cycle.
The original framing follows.
Document review raised a sharper alternative than either arm this plan considered, and re-deriving against the current base inverted the arithmetic in its favor. The observation: only R1 is load-bearing ("a visitor sees how to install"), and ### Claude Code's two commands (~8 lines) satisfy it by themselves. The other thirteen platform paths are what create the cost.
The measured effect of moving the block whole, on the current 575-line base:
| Position | Depth | |
|---|---|---|
## Install today (the stated problem) |
line 150 | 26% down |
## Philosophy after the move (the cost) |
line 304 | 53% down |
The change does not just trade one burial for a comparable one — it buries the "what is this" content twice as deep as the install content currently sits. At first draft, against a 481-line README with eleven platforms, the same math read 31% vs 47% and was arguable. Fourteen platforms later it is not close. Adversarial review predicted this drift explicitly ("Install's height at the top grows with each platform added"), and it grew by three platforms during this plan's own drafting.
The alternative: keep ## Install at the top containing only ### Claude Code plus a one-line pointer, and move the remaining thirteen platform subsections and ### Existing Installs verbatim into a second section below Quick Example. That meets R1 and R5 at ~10 lines instead of ~297, keeps orientation content near the top, preserves both #install and #existing-installs anchors (both headings survive), and avoids the in-page-find problem that makes the deferred <details> mitigation unattractive.
Why it is not the plan of record:
- It is a different change than the one requested. "Move the install section all the way to the top" asks for a relocation; splitting the section into two is a restructuring, and A2, KTD-2, R2, and the Goal Capsule's stop condition all commit to ordering-only by construction. Adopting it means amending all four.
- It has its own cost: install guidance would live in two places, which is worse for the thirteen non-Claude platforms — they would land on a top section that does not contain their instructions.
- The plan's whole premise (A5) is already an unvalidated bet on visitor intent. Layering a second unvalidated bet — that splitting reads better than moving — on top of it compounds the guess rather than reducing it.
What actually changed on adoption: A2 superseded, A4 dissolved, R2 narrowed to "verbatim instructions, navigation may be added," R6 added, KTD-2 rewritten, the Goal Capsule stop condition adjusted, and U1 re-scoped. One unit still, not two — the split is a single coherent edit. The user's choice of three platforms rather than review's suggested one is the better call: Cursor and Codex are first-class targets, and Codex's App and CLI surfaces stay together so no Codex user lands on a section missing their instructions.
OQ2. What signal would trigger revisiting the ordering?
The first entry under Risks accepts the below-the-fold cost as "reversible, and intended," but names no condition for reconsidering it, and an open-source README has no analytics to supply one. Absent a trigger, the ~297-line front page ships and stays by default — reversible in principle, unexercised in practice. The install matrix also grows with each platform added (fourteen today, up from eleven within this session), so the accepted tradeoff worsens monotonically. A cheap convention: revisit the ordering the next time a README change touches Philosophy or the platform list, whichever comes first.
Risks
The "what is this?" content moves below the fold— resolved by the OQ1 split. The whole-block move would have put## Philosophyat line 304 (53% down), deeper than## Installwas buried at 150 (26%). Leading with three platforms puts Philosophy at 17% down — shallower than the status quo — so this is no longer a cost the change imposes. Retained as a record of why the split was adopted rather than the literal move. Severity: resolved.- Split-boundary staleness. The top three are a judgment about which platforms most users want, frozen at a moment in time. If Cursor or Codex fades, or a new host becomes primary, the boundary is wrong and nothing signals it. Cheap to move a subsection across the boundary; nothing prompts anyone to. Severity: low, and now the plan's main open risk.
- Install guidance lives in two places. A user on one of the eleven overflow platforms lands on a top section that does not contain their instructions and must follow the pointer. The pointer names all eleven explicitly so in-page find still hits the platform name at the top, which is the mitigation — but it is one hop, not zero. This is the cost the split trades for; the whole-block move had no such hop. Severity: low.
- Silent content edit inside the moved block. A 204-line cut-and-paste is the one way this change could do real damage. The empty-removed-set check against
origin/mainin U1's Verification is the specific guard — stronger than the line-count and multiset checks a split invalidates. Severity: low, given the check. - Monotonic worsening is now bounded, not eliminated. Each new platform lengthens the overflow section rather than the top, so the front page no longer grows with the target matrix. That was the structural fix; OQ2's revisit trigger matters less as a result. Severity: low.
- Line-number rot. Every span in this plan is pinned to
origin/main=1f29eabc. This already bit once mid-drafting, which is why U1's Approach resolves spans by content anchor rather than number. Severity: low, given the override.
Sources & Research
README.mdatorigin/main=1f29eabc— current structure: 575 lines;## Installat 150-443; horizontal rules at 148 and 445;## Getting Startedat 107 opening with "After installing…";### Full Skill Inventoryat 113; 30 inventory rows; fourteen platform subsections; 33 headings, all textually unique.- Whole-block cut simulation (
149-445→ insert after line 5) — verified: 575 lines preserved, sorted line-multiset identical toHEAD,/plugincommands at lines 12-13,## Philosophyat 304 (53% down). Also verified the two rejected ranges produce the artifacts KTD-4 describes. This shape shipped first, then was superseded by the split per OQ1. - Split execution (top three +
## More Install Options) — verified on the working tree: removed set againstorigin/mainis empty (nothing dropped or reworded anywhere); added set is exactly 8 lines (the heading, its intro, the pointer, one---, and blanks); all fourteen platform subsections plus### Existing Installspresent exactly once; 34 headings with zero duplicate text; all four anchors resolve; three rules each blank-fenced; zero consecutive blank pairs;## Philosophyat 102/583 = 17% down.bun test2087 pass / 0 fail;release:validatein sync. - Anchor-reference grep (
*.md,*.ts,*.json,*.yaml) — exactly two README anchor references exist, both intra-file (line 56, line 159); no file outsidedocs/plans/deep-links a README anchor. Supports KTD-3 and R3. - Test-coupling grep — no test asserts README content or section order;
src/release/components.tsmapsREADME.mdto thecompound-engineeringrelease component by path only. Supports U1'sTest expectation: none. - Directional-language grep — the only positional claim in the README is line 56's "The complete inventory is below", which remains accurate (
### Full Skill Inventorystays below line 56). - Repo conventions (project instructions in context) —
docs:is reserved for docs-only files includingREADME.md; feature branches and PRs are required for all changes tomain; markdown tables must stay pipe-delimited.