Skip to content

Add planning-cldk-work: the mode upstream of design - #35

Merged
rahlk merged 4 commits into
mainfrom
feat/planning-mode
Aug 4, 2026
Merged

Add planning-cldk-work: the mode upstream of design#35
rahlk merged 4 commits into
mainfrom
feat/planning-mode

Conversation

@rahlk

@rahlk rahlk commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Adds planning-cldk-work, a new mode upstream of design mode, for work that cannot yet be stated as a single contract decision. Also syncs two out-of-sync doc blocks and adds a CHANGELOG that declares 0.3.0's undeclared breaking change.

Motivation and Context

Every routing row in the ladder was singular — "New language", "a language", "a facade surface" — and assumed the change had already been chosen. sprint, prioriti*, capacity, portfolio appear zero times across the skills. A team shaping a quarter, or anyone holding a theme like "microservice static analysis", had no entry point and would run design mode repeatedly, producing N unrelated specs with nothing expressing order, dependency, or deliberate exclusion.

The entry test is "can this be stated as a single contract decision?" — not a count of features named, which gets both directions wrong:

  • Go L3/L4 is two levels of one decision on one repo. Order is forced, nothing to exclude. → design mode.
  • "Microservice static analysis" is one theme containing boundary-edge vocabulary, service topology, per-framework entrypoints and cross-service reachability — which compete for order and can be deferred. → planning mode.

The mode earns its place through the contract-collision sweep: microservice analysis and polyglot analysis both need boundary-edge vocabulary (http/rpc/queue), so that is ONE design decision. Designed separately they produce two vocabularies for one concept, and the parity clause forbids renaming either afterwards. Nothing else in the ladder can see this — every other mode is single-change scoped.

Output is a committed roadmap plus an epic for the one decision actually starting. Not one epic per candidate: that is the July issue flood with a nicer name.

How Has This Been Tested?

Not tested by execution. This is the honest answer and worth stating plainly:

  • tests/scenarios/planning-cldk-work/s1s3 are scenario specifications — prose describing what a subagent run should conclude. They were written alongside the skill and have not been run.
  • tests/consistency/check-readme-dispatcher-sync.sh was run and now passes. It failed on first run against this branch, catching two real defects (below) that would otherwise have shipped.
  • No dry-run subagent walk was performed against the new mode, so its entry preconditions are unvalidated in practice. Entry preconditions have historically been this plugin's weak point.

Breaking Changes

No for this PR — planning-cldk-work is additive, and the dispatcher gains a routing row without altering any existing route.

Yes for 0.3.0, which this PR documents for the first time in the new CHANGELOG.md. That release changed <HARD-GATE> semantics, removed two Red Flags rows forbidding smaller tracking shapes, moved epics to codellm-devkit/.github, retired Part of #N trailers and CHILDREN checklists in favour of sub-issues, relocated specs to docs/design/, and made every ladder transition stop for the user. #34's body never filled in this section, so it went undeclared.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the Codellm-Devkit Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally — consistency check passes; scenario specs are not executable and were not run
  • I have added appropriate error handling — n/a for skill content; entry preconditions and scope guard serve this role
  • I have added or updated documentation as needed

Additional context

Also in this PR

check-readme-dispatcher-sync.sh failed on first run, on two blocks:

  1. The dispatcher's ladder diagram still read "spec + GitHub epic" after 0.3.0 renamed it to "spec + tracking record"stale since Make issue decomposition proportional and user-decided #34 merged, which this check would have caught at the time had it been run.
  2. The README's routing row for the new mode disagreed word-for-word with the dispatcher's.

Both fixed; the check passes.

Design decisions worth reviewing

  • The dispatcher routes here automatically. A judgement call, easily reversed by deleting one routing row. Made so a new user discovers the mode; the entry test and two scope-guard red flags carry the load against false firing.
  • One living roadmap, amended in place rather than one per quarter — git history becomes the record of how thinking changed. The alternative is dated roadmaps; this one can't drift into six stale files.
  • Throughput/capacity checking was deliberately cut. The mode reasons about contracts, dependencies and release trains — not estimation or velocity. The scope guard also states it records and challenges rather than facilitating, since a planning session between people is a meeting an agent cannot run.

Known gaps

  • The entry test leans on an agent correctly judging "one contract decision", which is a judgement, not a mechanical check.
  • The collision sweep only works if themes are decomposed to decision altitude first — a theme left as one roadmap row makes the collision invisible. This is a red flag and an S1 failure condition, but nothing enforces it.
  • This PR has no tracking issue, which the conventions it extends would require. Filing one retroactively would be the "write it up after it ships" pattern its own red-flag table calls out; the next plugin change gets a work item first.

rahlk added 4 commits August 3, 2026 10:42
The ladder had no entry point for work that is not yet a single change. Every
routing row assumed the change had already been chosen, so a team shaping a
quarter -- or a theme like "microservice static analysis" -- had to run design
mode repeatedly and got N unrelated specs with nothing expressing order,
dependency, or what was deliberately excluded.

The entry test is "can this be stated as a single contract decision?" Two shapes
fail it and both belong here: a theme that decomposes into several decisions, and
several initiatives competing for the same quarter. Plurality lives in the
contract decisions, not in how many things the user named -- counting nouns gets
both directions wrong, which is what S2 and S3 pin down.

The core is the contract-collision sweep, and it is the reason the mode is worth
having: microservice analysis and polyglot analysis both need boundary-edge
vocabulary, so that is ONE design decision. Designed in separate sessions they
produce two vocabularies for one concept, and the parity clause forbids renaming
either afterwards. No other mode can see this -- they are all single-change
scoped.

Output is a committed roadmap (codellm-devkit/.github -> docs/design/roadmap.md)
plus an epic for the one decision actually starting. Not one epic per candidate:
that is the July flood with a nicer name, and it is called out in the red flags.

Deliberately excluded: estimation, capacity, velocity. The mode reasons about
contracts, dependencies and release trains -- the things specific to a multi-repo
ecosystem under a shared schema -- and records and challenges rather than
facilitating, since a planning session between people is a meeting an agent
cannot run.

Wires into the dispatcher (diagram, routing row, two scope-guard red flags), the
README, and designing-cldk-changes' entry preconditions, which now note that work
arriving from planning comes with its collision group already known.
tests/consistency/check-readme-dispatcher-sync.sh was failing on two blocks and
had not been run before opening #35:

- the dispatcher's ladder diagram still read "spec + GitHub epic" after 0.3.0
  renamed it to "spec + tracking record" -- stale since #34 merged, which the
  check would have caught then
- the README's routing row for planning-cldk-work disagreed word-for-word with
  the dispatcher's

Both now match and the check passes.

Adds CHANGELOG.md. 0.3.0 changed HARD-GATE semantics, removed two Red Flags rows
that forbade smaller tracking shapes, moved epics to another repo, retired
"Part of #N" trailers, relocated specs, and made every ladder transition stop for
the user -- all behaviour-breaking for anyone on 0.2.0 conventions, and none of
it declared anywhere. #34's PR body never filled in the org template's
"Breaking Changes" section, so this is the first place it is written down.
ponytail-review pass over the branch. The skill said the same thing three times
because the entry test, the loop step and the red-flag row were written in
separate passes and the whole file was never re-read.

- plugin.json: a json.dumps rewrite had escaped the em-dash and exploded the
  keywords array onto 8 lines -- 12 lines of churn for a one-character version
  bump. Restored to a one-line diff.
- SKILL.md: dropped the second and third copies of "microservice is a theme,
  decompose it", and two restatements of why the mode exists.
- SKILL.md: cut 4 of 8 Red Flags rows that echoed prose on the same page. The
  table is where restatement accumulates.
- roadmap-template.md: dropped "Why a doc and not issues" -- the fourth copy of
  that argument, after the skill's red flags, the org CONTRIBUTING and CLAUDE.md.
  A template shows the shape; it does not re-argue the policy. "Amending it"
  shrank from 7 lines to 2.
- scenarios: dropped the closing meta-paragraphs explaining which scenario each
  was a counterpart to. s2's also still asserted the OLD precondition ("two or
  more candidate features, none chosen"), contradicting the entry test it
  exists to check -- cutting it removed the contradiction.
- CHANGELOG: dropped the 0.4.0 "Fixed" entry, which documented doc-sync churn
  introduced and resolved inside the same unreleased version, and the empty
  0.2.0 baseline stub.

Consistency check still passes; no reference to the old precondition survives.
The HARD-GATE required the collision sweep to have run. A sweep across
undecomposed themes runs clean, reports no groups, and satisfies the gate --
while the collision it exists to catch is still there, just invisible. Gate now
requires both halves: themes decomposed to contract-decision altitude AND the
sweep run over the result.

Restores the "'Microservice analysis' is one row" red flag, reworded to state the
failure rather than repeat the instruction. The previous ponytail pass cut it as a
duplicate of the loop prose; it was not -- it was the second guard on this hole,
and the complexity review had no way to see that.

Resolves the contradiction between "vagueness is fine and expected" and step 1's
demand for decision altitude: vague wording is fine, vague altitude is not.
@rahlk
rahlk merged commit a88e8d6 into main Aug 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant