chalk: give the mindmap format its own skill, and a goal-tree companion - #21
Merged
Conversation
jarohen
marked this pull request as ready for review
August 10, 2026 18:25
jarohen
marked this pull request as draft
August 10, 2026 18:32
jarohen
marked this pull request as ready for review
August 10, 2026 18:33
`99d6166` taught chalk the *shape* of a bullet tree — one checkpoint per bullet, lead with the point, bold the load-bearing words — but not the relation that makes it a tree. Without that, the guidance licensed any well-formatted list: a model could follow every rule in it and still produce indented bullets that carry no argument. This adds the missing half, and moves the whole format out of `chalk:voice` into a skill of its own. - **`chalk:mindmap` owns the shape.** A parent is a claim and its direct children are what back it up — read downwards a summary that expands on demand, read upwards an argument. That relation is the test a flat list fails. Around it sit the rules that only make sense once it holds: subject lines carrying the argument on their own with the paragraph beneath as optional elaboration, naming the rule you split a node on where the children aren't obviously exhaustive, tags as claims, typed cross-reference IDs, and tl;dr placement. - **`chalk:goal-tree` owns the other relation.** A plan's children *serve* their parent rather than *support* it, and that difference is what makes completeness analysable: a goal states what its children have to add up to, so "are these enough?" has an answer, where an argument tree can only ever be checked for soundness. It carries the sufficiency test, the three kinds of leaf — ours, someone else's, a fact we're relying on — and the named moves for closing a gap. - **The split is deliberate, not just filing.** Both skills are orthogonal to Diataxis, so they survive a future split of docs authoring out of chalk without being touched, and either can be named directly from a project's or a user's own instructions rather than reached only through the voice. - **`chalk:voice` keeps the register and hands off the structure.** It gains "write in specification register" and "one word, one meaning" — every sentence carrying a fact, a constraint or a decision, and precision beating simplicity where the two conflict — and its tree mechanics shrink to a pointer, since two copies of a format drift. - **It also gains "name your audience", which the rest of the guidance quietly assumed.** "Optimise for the reader" was asserted in the preamble and never made actionable, because it never said who the reader is: for everything in this plugin it's nearly always a teammate, including the two who get forgotten and who between them are most of the readership — yourself in six months, and a future agent session starting cold from the artefact alone. Neither has the conversation that produced it, which is what turns "lead with what they need, not with what you did" into an instruction rather than a sentiment. Each artefact skill now states its own reader, because the specifics differ: a PR's is deciding whether the change affects them, an issue's is triaging it months later, and a chalk comment's is the *next session* on that issue — the most literal case, since a comment written for whoever sat through this session helps nobody, they've gone. - **The tl;dr rule is where that gap actually bit.** It said where a summary goes and what shape it takes, so a tl;dr could satisfy every rule while summarising the session for the person who ran it. The first draft of this branch's PR description did exactly that — it opened on which half of the format had landed previously and which was missing, which is precise, true, and unreadable to anyone who hadn't seen that commit. The tell is now written down: if the summary only parses when you already know the history, rewrite it so the first bullet tells a cold reader what the thing is and what it means for them, and push the provenance into the body. - **Commit bodies were the other real gap.** Chalk described a commit body as "a single explanation, not a sectioned document" and never asked for a tree, which is exactly how the same reasoning ends up bulleted in a PR description and as prose in the commit that carries it. A body is now a lead-in line then the tree, with no headings — the top-level bullets already partition it, so a heading layer duplicates them, and needing one is a signal the commit is too big. - **Two rules diverge from how the format was trialled.** A commit body MAY open with a tl;dr where the body is long enough that its argument needs summarising, rather than relying on the subject line alone; and a goal tree may frame a *problem*, not only a proposed solution — only the solution-shaped tree is earned by a session that actually worked the direction. The typed IDs and the tags are the two most idiosyncratic pieces, so both are scoped rather than global. IDs are for Alternatives considered, Decision rationale and Open Questions — the sections where a reviewer replies to one branch and accepts the rest, which is the thing GitHub can't do natively because a bullet has no anchor to link. Tags stay an open vocabulary with no obligation to use them, since a tag that isn't meant precisely is worse than none. `chalk:tend-docs` keeps the stricter rule it already had, requiring the audience to be named before a page is written. That now reads as a specialisation of the general one rather than a local quirk, and says why it's stricter: a docs page is the one chalk artefact whose audience isn't the team by default. Bumps the plugin to 0.14.0. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
tl;dr
Chalk has always specified the voice of a commit body, issue or PR description. It now specifies the shape as well — nested bullets whose parents are claims and whose children back them up — in a skill of its own.
chalk:mindmapfor the shape,chalk:goal-treefor direction — where a node's children accomplish it rather than argue for it. Both are loaded by the skills you already use; there's nothing new to invoke.Context / Motivation
99d6166brought the tree's mechanics intochalk:voice— one checkpoint per bullet, lead with the point, bold the load-bearing words, nest shallow, cut hard — and stopped there.99d6166and still write one.The format in practice
Start with this description. It opens with a tl;dr, draws its sections from chalk's palette, and writes each one as a tree — so the thing under review is a sample of its own output. If it doesn't read better than the prose equivalent would have, that's the argument against merging it.
Then the two PRs in
xtdb/xtdbthat were written against the skills on this branch — so unlike the rest of the repo, they're output from the change under review rather than prior art it generalises. They're the same discipline applied to opposite situations, which is the useful thing about the pair:ObjectStore(it's nowsuspend), and what moved off the shared dispatcher. Implementation notes names its own decomposition — "four things a reviewer would otherwise have to reconstruct from the diff" — and Changes gives five commits in reading order, flagging which two are behaviour-preserving.xtdb.apiover FlightSQL — where something does. A new capability, so the tl;dr says it's purely additive and a Usage section carries what to actually do: a runnable snippet, which option is required and what the rest default to, and the session semantics of holding a connection. It states its one live limitation in the tl;dr rather than letting a reader hit it, and citesD4inline as a pointer into the decision rationale below.Two issues from today are worth a look for the tagging, which neither PR needed — #5879 and #5873, both flaky-test reports whose tl;dr is the triage:
idea:for an untried fix direction,assumption:for a diagnosis not yet confirmed,check:for what must be verified before anyone relies on it.Adoption across the rest of the repo is uneven, which is the case for specifying it. Ten of today's twenty-one issues and PRs carry a tl;dr; #5865 and #5870 use the palette's sections and open with prose. Commit bodies lag further — eight of today's seventeen carry a tree, nine don't — exactly what you'd expect from guidance that asked PRs for structure and never asked commits for any. PR #5869 against the commit it carries,
ccb11a6d, is that gap in a single pair: the same reasoning as a tree in the description and as four prose paragraphs in the commit.Future state
Three skills, split by what they decide, so no rule has two homes.
chalk:voice— the register and the palette. What the reader is for (Diataxis), what earns a sentence, which sections exist. Unchanged in job; it now points at the other two instead of carrying tree mechanics inline.chalk:mindmap— the shape of anything followable. The parent/child relation, and the rules that only make sense once it holds: subject lines carrying the argument alone, naming the rule a node was split on where the children aren't obviously exhaustive, tags, typed cross-reference IDs, tl;dr placement, and the per-artefact rules for commit bodies and code comments.chalk:goal-tree— the other relation. A plan's children serve their parent, and that's what makes completeness analysable: a goal states what its children have to add up to, so "are these enough?" has an answer, where an argument tree can only be checked for soundness. Carries the sufficiency test, the three kinds of leaf, and the named moves for closing a gap.Decision rationale
D1: separate skills rather than more of
chalk:voice. Voice is 300+ lines and every writing path loads it; the alternative was another 200 lines inside it.chalk:tend-docsis its only consumer — and neither new skill is touched by that. Keeping the format inside voice would have made that split strictly harder.chalk:mindmapcan be cited directly from a project's own conventions; a section heading inside voice can't.D2: the two idiosyncratic devices are scoped, not global.
D1,I3,D2.1) are for Alternatives considered, Decision rationale and Open Questions — the sections where a reviewer answers one branch and accepts the rest. That's the thing GitHub can't do natively, because a bullet has no anchor to link to. IDs on scaffolding are noise, so they aren't the default everywhere.assumption:andcheck:carry the most weight — they state verification status at a fraction of what prose spends — but a tag that isn't meant precisely is worse than no tag, so the rule is "tag it and you've made a claim".D3: two rules diverge from how the format has been used so far.
a8058fdestablished for the other solution-shaped sections.Out of scope
chalk:tend-docspluschalk:weed-docsare the only consumers of voice's tutorial/how-to depth — but it's a packaging change, and braiding it with a format change makes the diff unreviewable. This change was checked against making that split harder, not deferred blindly.chalk:planskill.chalk:goal-treecovers writing a goal structure down; the discipline of making a plan against one is a different skill and isn't attempted here.Usage
Nothing to run. The new skills are auto-discovered from
skills/*/SKILL.mdlike chalk's existing ones, and are loaded bychalk,chalk:issue,chalk:commit,chalk:prandchalk:tend-docsrather than invoked directly./chalk:mindmapand/chalk:goal-treewill print either guide if you want to read it.One manual step, for whoever merges this: if your own instructions file carries a copy of this format, it's now redundant and will drift — replace it with a pointer at the two skills.
Test plan
No executable tests — this is skill guidance. What was checked instead:
chalk:commithad grown a third near-verbatim copy of the commit-body rules and the copies had already drifted;chalk:mindmapre-centralised the line-break mapping that an earlier commit deliberately pushed out to each calling skill;chalk:prtold PRs to goal-tree their Implementation section, which the palette defines as retrospective; and a constraint inchalk:goal-treebroadened a MUST from two of the eight gap-closing moves to all of them. The rest were stale cross-references and workflow checklists left behind by the prose above them.namechecked against the containing directory.