@jeffober/thatch 0.1.18 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,20 @@
1
1
  ---
2
2
  name: ticket-description
3
- description: Draft a ticket description using instructional-design scaffolding (SYNOPSIS / PROBLEM / BACKGROUND / PROPOSED APPROACH / ACCEPTANCE CRITERIA / RELEASE PLAN / VALIDATION / DEPENDENCIES / NOTES) with bold and italic emphasis on the phrases that carry the meaning, so a reader skimming only the emphasized fragments still gets the story. Use when the user asks you to write, draft, or file a ticket, issue, or work item (Linear or Jira). Do NOT use for PR descriptions (use pr-description), commit messages, or design docs.
3
+ description: Draft a ticket description (SYNOPSIS / PROBLEM / BACKGROUND / PROPOSED APPROACH / ACCEPTANCE CRITERIA / RELEASE PLAN / VALIDATION / DEPENDENCIES / NOTES) with bold and italic emphasis on the phrases that carry the meaning, so a reader skimming only the emphasized fragments still gets the story. Use when the user asks you to write, draft, or file a ticket, issue, or work item (Linear or Jira). Do NOT use for PR descriptions (use pr-description), commit messages, or design docs.
4
4
  ---
5
5
 
6
6
  # Writing ticket descriptions
7
7
 
8
+ ## Core principle
9
+
10
+ Write for humans. Not for LLMs. Not to impress. Not to pad.
11
+
12
+ Every sentence earns its place or gets cut. Plain English over jargon. Concrete over abstract. Short over long. A ticket a human reads once and can start work from beats one that looks thorough but says nothing.
13
+
14
+ If a word does not help a human understand the work, it is dead weight. If a sentence restates the previous one, one is redundant. If a phrase sounds smart but you cannot explain it in simpler words, it is a buzzword. Cut, replace, or simplify.
15
+
16
+ Target a 7th-grade reading level. Not because the reader is dumb, but because plain prose is faster to read and harder to misread. Short sentences, common words, one idea each. The concepts stay technical; the language stays simple.
17
+
8
18
  ## The reader
9
19
 
10
20
  You are writing for two people who share one trait: neither has your context, and neither knows this subsystem's jargon.
@@ -15,7 +25,7 @@ The second reader is an **implementer** picking up the ticket cold. They need to
15
25
 
16
26
  The description is not a design doc. It is a specification that makes work startable. A design doc (when one is warranted) may live in repo docs, Linear, Notion, Archbee, Google Docs, Figma, or another system; link it from the ticket instead of inlining it. The ticket's job is to define the problem, propose a direction, and set the gates that define "done."
17
27
 
18
- This is **instructional design**, not documentation. Each section has a cognitive goal:
28
+ Each section has one job:
19
29
  - SYNOPSIS: orient to the class of work and affected area.
20
30
  - PROBLEM: make the reader agree there is something worth solving.
21
31
  - BACKGROUND: give the implementer the context they would otherwise re-derive.
@@ -26,7 +36,7 @@ This is **instructional design**, not documentation. Each section has a cognitiv
26
36
  - DEPENDENCIES: explain ordering constraints, not just list them.
27
37
  - NOTES: flag scope limits, intentional non-goals, and things that look in-scope but aren't.
28
38
 
29
- Layer the knowledge so each section builds on the previous one. The reader should never encounter a concept in section N that was not introduced in section N-1.
39
+ Each section builds on the previous one. The reader should never encounter a concept in section N that was not introduced in section N-1.
30
40
 
31
41
  ## Structure
32
42
 
@@ -119,7 +129,7 @@ Only when prod verification is non-trivial. A pure refactor with good tests does
119
129
 
120
130
  ### DEPENDENCIES (conditional)
121
131
 
122
- Blocking relationships and ordering constraints. "Blocked by PLAT-126" is the tracker field; the *why* belongs here: "PLAT-125 partitions by location_fingerprint, so it can only run after backfill completes (count == 0), not merely after PLAT-124 merges." That kind of nuance is what prevents a well-intentioned lead from reordering the queue.
132
+ Blocking relationships and ordering constraints. "Blocked by PLAT-126" is the tracker field; the _why_ belongs here: "PLAT-125 partitions by location_fingerprint, so it can only run after backfill completes (count == 0), not merely after PLAT-124 merges." That kind of nuance is what prevents a well-intentioned lead from reordering the queue.
123
133
 
124
134
  Distinguish hard data dependencies (cannot run until X completes) from soft dependencies (should run after X for cleanliness, but technically works independently). Say which kind it is.
125
135
 
@@ -141,7 +151,7 @@ If there are no notes, omit the section entirely. Do not emit an empty `## NOTES
141
151
 
142
152
  ## Emphasis for scanning: bold and italics
143
153
 
144
- Bold and italicize the "save points" - the phrases that carry meaning - not whole sentences. A reader who skims *only* the bold and italic fragments should get the story; full prose is for when they want detail.
154
+ Bold and italicize the "save points" - the phrases that carry meaning - not whole sentences. A reader who skims _only_ the bold and italic fragments should get the story; full prose is for when they want detail.
145
155
 
146
156
  **What to bold:** phrases that name the **work itself** - the component, the failure mode, the mechanism, the behavior the ticket asks for. These are the nouns and verbs that would appear in a diff of the design, not a diff of the code. "**circular wait** in the **KeyManager**" names the failure mode and the component. "**load key material outside the mutex**" names the mechanism.
147
157
 
@@ -177,10 +187,11 @@ These are hard rules, not suggestions.
177
187
  5. **No authoring-sequence narration.** Never describe the order you discovered things in, which draft had what, or what a later revision will add. Describe the ticket as it stands.
178
188
  6. **Italics for orientation asides.** Use `_italics_` for a one-phrase aside that orients the reader: _This is where the deadlock lived_. Not for emphasis.
179
189
  7. **Plain ASCII only.** No smart quotes, smart apostrophes, em dashes, en dashes, ellipsis glyphs, or arrow glyphs. Use plain hyphens (sparingly) for asides; semicolons are often better.
180
- 8. **No buzzwordy abstractions.** If a phrase sounds like it is trying to sound smart, cut or replace it. Name the code and behavior directly. "identity contract" -> "the struct field that identifies the owner". "canonical hash" -> "the SHA-256 we compute on ingestion".
181
- 9. **Prescriptive voice.** The ticket proposes work that hasn't happened yet. Use "the fix should...", "the implementation must...", "the worker should..." not "this PR moves..." or "the code now...". The PR description uses descriptive voice; the ticket uses prescriptive.
182
- 10. **Default to a numbered outline for steps.** A flat list, with an occasional inline branch ("if the path is not in the registry, return a 404; otherwise continue to step 6"), covers almost every workflow. The bar for a diagram or Mermaid chart is high: reach for one only when the flow genuinely needs two dimensions to read - a graph network with many nodes and edges, or a workflow that recurses, forks, and rejoins in ways a linear outline cannot follow without constant back-references. If the flow is one or two levels deep and does not recurse or redirect, an outline is clearer and cheaper to maintain than a diagram.
183
- 11. **Avoid loaded language.** Use neutral, current terminology unless the repo's established name is different. Prefer allowlist/blocklist over whitelist/blacklist, primary/replica over master/slave, and precise role names over moralized labels like "bad" or "evil".
190
+ 8. **No buzzwordy abstractions.** If a phrase sounds like it is trying to sound smart, cut or replace it. Name the code and behavior directly. "identity contract" -> "the struct field that identifies the owner". "canonical hash" -> "the SHA-256 we compute on ingestion". "leverage" -> "use". "utilize" -> "use". "facilitate" -> "help". If you cannot say what a phrase means in plain English, it does not belong. Buzzwords are the number-one signal that an AI wrote the ticket; do not send that signal.
191
+ 9. **Prefer specific terms over ambiguous ones.** If a word can mean more than one thing in this ticket, qualify it or replace it with the specific behavior. Do not rely on the reader guessing the local meaning. Ordinary words can be ambiguous when the code gives them a special role: claim, owner, active, current, generation, repair, coalesce, terminal, source, scope, sync, publish, resolve. "Publish the value" is vague. "Persist the value in the database so the UI can display it" is specific.
192
+ 10. **Prescriptive voice.** The ticket proposes work that hasn't happened yet. Use "the fix should...", "the implementation must...", "the worker should..." not "this PR moves..." or "the code now...". The PR description uses descriptive voice; the ticket uses prescriptive.
193
+ 11. **Default to a numbered outline for steps.** A flat list, with an occasional inline branch ("if the path is not in the registry, return a 404; otherwise continue to step 6"), covers almost every workflow. The bar for a diagram or Mermaid chart is high: reach for one only when the flow genuinely needs two dimensions to read - a graph network with many nodes and edges, or a workflow that recurses, forks, and rejoins in ways a linear outline cannot follow without constant back-references. If the flow is one or two levels deep and does not recurse or redirect, an outline is clearer and cheaper to maintain than a diagram.
194
+ 12. **Avoid loaded language.** Use neutral, current terminology unless the repo's established name is different. Prefer allowlist/blocklist over whitelist/blacklist, primary/replica over master/slave, and precise role names over moralized labels like "bad" or "evil".
184
195
 
185
196
  ## Length and style
186
197
 
@@ -207,6 +218,23 @@ Comparison process:
207
218
 
208
219
  When the codebase contradicts the ticket, flag the discrepancy to the user before drafting. Do not silently paper over the gap.
209
220
 
221
+ ## Project context for planned work
222
+
223
+ Some tickets are slices of a larger project. The code alone may not explain the project terms, ordering constraints, or prior decisions the implementer needs. Before drafting, read enough context to make the ticket startable for an engineer new to this area.
224
+
225
+ Read project context when the request, existing ticket, code comments, branch name, prior PRs, docs, or discussion mentions:
226
+ - a parent ticket, related PR, follow-up, or multi-ticket project;
227
+ - a deferred part of the design;
228
+ - an upstream dependency;
229
+ - a project-specific term whose local meaning is not obvious from the code touched by this ticket;
230
+ - a roadmap label, subsystem nickname, architecture slogan, or branch-local name.
231
+
232
+ Use available source material: linked tickets, linked PRs, nearby docs, code comments, commit messages, and project memory. Build a private term map: term -> plain behavior -> source. Do not dump the map into the ticket. Use it to write the shortest useful BACKGROUND.
233
+
234
+ If a term or dependency controls the work and you cannot resolve it from available context, stop and ask the user. Do not guess. Do not write around the missing definition with vaguer words.
235
+
236
+ Put project context in BACKGROUND only when it helps the implementer start work or helps a lead schedule it correctly. Omit generic backstory.
237
+
210
238
  ## Search before create
211
239
 
212
240
  Before filing a new ticket, search for likely duplicates in the tracker. Use the proposed title, problem keywords, affected subsystem, and any incident/customer/project references. If a plausible duplicate exists, surface it to the user before drafting or filing.
@@ -361,20 +389,22 @@ That reading alone conveys the shape, scope, and gates of all three tickets.
361
389
  1. **Gather**: read the code the ticket references. Check `git log` for recent changes to the same files. Identify the problem, the prior work, and the proposed direction.
362
390
  2. **Search before create**: search Linear/Jira for likely duplicate tickets. If one exists, surface it before drafting or filing.
363
391
  3. **Codebase comparison**: verify the problem still exists in the current code. If it was already fixed, tell the user. If it was partially mitigated, note the mitigation.
364
- 4. **Draft PROBLEM first**, in one breath, without looking at code. If you cannot state the harm in three sentences, you do not understand the problem yet. Go back and read.
365
- 5. **Write BACKGROUND** (if needed): what prior work led here, what was done, what was left behind.
366
- 6. **Write PROPOSED APPROACH**: the compass heading, not the map. Prescriptive voice.
367
- 7. **Write ACCEPTANCE CRITERIA**: observable, testable bullets. Name the test shape where relevant.
368
- 8. **Write RELEASE PLAN** (if needed): flags, ordering, rollback.
369
- 9. **Write VALIDATION** (if needed): monitoring, signals, smoke tests.
370
- 10. **Write DEPENDENCIES** (if needed): what blocks this, what this blocks, and why.
371
- 11. **Write SYNOPSIS last** - it is a compression of PROBLEM + the core approach.
372
- 12. **Bold and italicize the save points** in the allowed locations. Bold phrases that name the work (components, mechanisms, behaviors). Italicize phrases that orient to significance (conclusions, payoffs), at most one per paragraph. Apply the scan check.
373
- 13. **Add NOTES** for non-goals, declined alternatives, and scope limits. Use `## NOTES` header. Omit if empty.
374
- 14. **Suggest Linear labels** when the ticket is being filed in Linear. Use obvious stable labels only; do not guess initiative labels.
375
- 15. **Verify links**: check repo file links, external docs, tickets, PRs, and design artifacts where tooling allows. Do not claim an unverified link was verified.
376
- 16. **Verify prose style**: check each rule in Prose style. Cut design-narration, authoring-sequence, and buzzwordy abstractions. Verify plain ASCII. Verify prescriptive voice (not descriptive). Verify first-use definitions for subsystem jargon in BACKGROUND or PROBLEM. Verify plain English nouns (no code-domain nouns in prose). Verify conclusion-first in PROBLEM. Verify NOTES bullets are either short pointers or self-contained.
377
- 17. **Verify length**: if the body exceeds what the work's conceptual size warrants, cut until each line earns its place. If PROPOSED APPROACH dominates, consider splitting into a design doc plus ticket.
392
+ 4. **Read project context for planned work**: if the ticket is part of a larger project, depends on prior work, uses unexplained project terms, or has scheduling dependencies, read the linked tickets, PRs, docs, comments, and memory before drafting. Build a private term map. If a term or dependency controls the work and you cannot resolve it, ask the user.
393
+ 5. **Draft PROBLEM first**, in one breath, without looking at code. If you cannot state the harm in three sentences, you do not understand the problem yet. Go back and read.
394
+ 6. **Write BACKGROUND** (if needed): what prior work led here, what was done, what was left behind, and what project context an engineer new to this area needs to start.
395
+ 7. **Write PROPOSED APPROACH**: the compass heading, not the map. Prescriptive voice.
396
+ 8. **Write ACCEPTANCE CRITERIA**: observable, testable bullets. Name the test shape where relevant.
397
+ 9. **Write RELEASE PLAN** (if needed): flags, ordering, rollback.
398
+ 10. **Write VALIDATION** (if needed): monitoring, signals, smoke tests.
399
+ 11. **Write DEPENDENCIES** (if needed): what blocks this, what this blocks, and why.
400
+ 12. **Write SYNOPSIS last** - it is a compression of PROBLEM + the core approach.
401
+ 13. **Bold and italicize the save points** in the allowed locations. Bold phrases that name the work (components, mechanisms, behaviors). Italicize phrases that orient to significance (conclusions, payoffs), at most one per paragraph. Apply the scan check.
402
+ 14. **Add NOTES** for non-goals, declined alternatives, and scope limits. Use `## NOTES` header. Omit if empty.
403
+ 15. **Suggest Linear labels** when the ticket is being filed in Linear. Use obvious stable labels only; do not guess initiative labels.
404
+ 16. **Verify links**: check repo file links, external docs, tickets, PRs, and design artifacts where tooling allows. Do not claim an unverified link was verified.
405
+ 17. **Verify prose style and core principle**: check each rule in Prose style. Cut design-narration, authoring-sequence, and buzzwordy abstractions. Verify plain ASCII. Verify prescriptive voice (not descriptive). Verify first-use definitions for subsystem jargon in BACKGROUND or PROBLEM. Verify plain English nouns (no code-domain nouns in prose). Verify conclusion-first in PROBLEM. Verify NOTES bullets are either short pointers or self-contained.
406
+ 18. **Clarity pass**: read the draft as a cold lead skimming a backlog, then as an implementer picking up the work cold. Rewrite before returning it; do not tell the user you performed this pass. Check: does every project-specific term get plain-English meaning before or with the label? Are ambiguous terms qualified or replaced with specific behavior? Does every process word name object/action/effect? Does every contrast name current and proposed behavior? Does every causal sentence show the middle step? Did you preserve connective tissue instead of compressing meaning into noun stacks? If the draft got longer, cut a lower-value claim instead of compressing a high-value one.
407
+ 19. **Verify length**: if the body exceeds what the work's conceptual size warrants, cut until each line earns its place. If PROPOSED APPROACH dominates, consider splitting into a design doc plus ticket.
378
408
 
379
409
  ## Anti-patterns
380
410
 
package/bin/thatch CHANGED
@@ -29,6 +29,7 @@ function usage(): never {
29
29
  thatch buffer-batch Append a PostToolBatch payload to the queue (Claude Code hook only)
30
30
  thatch buffer-tool Append a single postToolUse interaction to the queue (Cursor hook only)
31
31
  thatch flush-tools [--json] Peek the queue + print an extraction nudge (hook only)
32
+ thatch flush-predictions [--json] Query predictions for the prompt (hook only)
32
33
  thatch setup --claude [--cursor] [--global]
33
34
  Install config + instructions + hooks + skills
34
35
 
@@ -351,7 +352,7 @@ switch (command) {
351
352
 
352
353
  const { peekQueue, getMissedCount, incrementMissedCount } = await import("../src/extract-queue");
353
354
  const { buildExtractionPayload } = await import("../src/extraction");
354
- const { extractionNudge, claudeWriteNudge, claudeRecallNudge } = await import("../src/prompts");
355
+ const { extractionNudge, claudeWriteNudge, claudeRecallNudge, predictionNudge } = await import("../src/prompts");
355
356
 
356
357
  let repo = "unknown";
357
358
  try { repo = await detectRepo(); } catch {}
@@ -369,16 +370,31 @@ switch (command) {
369
370
  break;
370
371
  }
371
372
 
372
- // Tier 2: recall nudge via sideband. The prompt text field name varies
373
- // by host (Claude Code: "prompt", Cursor: undocumented). Try candidates.
373
+ // Tier 2: recall nudge + prediction fire via sideband. The prompt text
374
+ // field name varies by host (Claude Code: "prompt", Cursor: undocumented).
375
+ // Both recall and predictions share the same sideband round-trip.
374
376
  const promptText = data.prompt ?? data.message ?? data.text ?? data.user_input ?? data.input;
375
377
  if (promptText && promptText.length >= 10) {
376
- const { sidebandMatch, sidebandSocketPath } = await import("../src/sideband");
378
+ const { sidebandMatch, sidebandPredictions, sidebandSocketPath } = await import("../src/sideband");
377
379
  const sockPath = sidebandSocketPath(dbPath);
378
- const threshold = parseFloat(process.env.THATCH_RECALL_THRESHOLD ?? "0.55");
379
- const matches = await sidebandMatch(sockPath, promptText, [repo, "global"], threshold, 5);
380
+ const recallThreshold = parseFloat(process.env.THATCH_RECALL_THRESHOLD ?? "0.55");
381
+ const predThreshold = parseFloat(process.env.THATCH_PREDICTION_THRESHOLD ?? "0.45");
382
+
383
+ const [matches, predictions] = await Promise.all([
384
+ sidebandMatch(sockPath, promptText, [repo, "global"], recallThreshold, 5),
385
+ sidebandPredictions(sockPath, promptText, [repo, "global"], predThreshold, 5),
386
+ ]);
387
+
388
+ const parts: string[] = [];
380
389
  if (matches && matches.length > 0) {
381
- const output = claudeRecallNudge(matches);
390
+ parts.push(claudeRecallNudge(matches));
391
+ }
392
+ if (predictions && predictions.length > 0) {
393
+ parts.push(predictionNudge(predictions));
394
+ }
395
+
396
+ if (parts.length > 0) {
397
+ const output = parts.join("\n\n");
382
398
  if (isJson) console.log(JSON.stringify({ additional_context: output }));
383
399
  else console.log(output);
384
400
  break;
@@ -407,6 +423,56 @@ switch (command) {
407
423
  break;
408
424
  }
409
425
 
426
+ case "flush-predictions": {
427
+ // UserPromptSubmit (Claude Code) / beforeSubmitPrompt (Cursor) hook.
428
+ // Standalone prediction fire: queries the sideband for scored
429
+ // predictions matching the prompt text, prints the prediction nudge
430
+ // if any matchers fire. --json wraps as { additional_context: "..." }
431
+ // for Cursor hooks. Without --json, stdout is plain text.
432
+ //
433
+ // NOTE: flush-tools already fires predictions alongside the recall
434
+ // nudge in its tier 2 block. This subcommand exists for testing and
435
+ // for hosts that want prediction-only output without the recall or
436
+ // extraction nudges.
437
+ const isJson = args.includes("--json");
438
+ try {
439
+ const raw = await Bun.stdin.text();
440
+ const data = JSON.parse(raw) as {
441
+ prompt?: string;
442
+ message?: string;
443
+ text?: string;
444
+ user_input?: string;
445
+ input?: string;
446
+ };
447
+
448
+ const promptText = data.prompt ?? data.message ?? data.text ?? data.user_input ?? data.input;
449
+ if (!promptText || promptText.length < 10) {
450
+ if (isJson) console.log(JSON.stringify({ additional_context: "" }));
451
+ break;
452
+ }
453
+
454
+ let repo = "unknown";
455
+ try { repo = await detectRepo(); } catch {}
456
+
457
+ const { sidebandPredictions, sidebandSocketPath } = await import("../src/sideband");
458
+ const { predictionNudge } = await import("../src/prompts");
459
+ const sockPath = sidebandSocketPath(dbPath);
460
+ const threshold = parseFloat(process.env.THATCH_PREDICTION_THRESHOLD ?? "0.45");
461
+ const predictions = await sidebandPredictions(sockPath, promptText, [repo, "global"], threshold, 5);
462
+
463
+ if (predictions && predictions.length > 0) {
464
+ const output = predictionNudge(predictions);
465
+ if (isJson) console.log(JSON.stringify({ additional_context: output }));
466
+ else console.log(output);
467
+ } else {
468
+ if (isJson) console.log(JSON.stringify({ additional_context: "" }));
469
+ }
470
+ } catch (err) {
471
+ console.error(`[thatch flush-predictions] failed: ${err}`);
472
+ }
473
+ break;
474
+ }
475
+
410
476
  default:
411
477
  usage();
412
478
  }
@@ -36,21 +36,21 @@ description: Extract durable project facts ... Use when ...
36
36
  | `thatch-review-no-slop` | AI writing anti-patterns: change narration, fourth-wall breaks, em dashes, filler. |
37
37
  | `thatch-review-breadcrumbs` | Comment narrative: do comments form a coherent outline of behavior? |
38
38
  | `thatch-review-mark-and-sweep` | Mechanical change completeness: whole-repo sweep for stragglers after renames, flag removals, API substitutions. |
39
- | `thatch-review-synthesizer` | Verify specialist findings against code, dedupe, classify, calibrate severity. Cross-references findings against prior review comments when a follow-up round register is provided; produces a Previously identified appendix. |
39
+ | `thatch-review-synthesizer` | Verify specialist findings against code, dedupe, classify, calibrate severity. Starts the final report with a workflow-change preface, then cross-references findings against prior review comments when a follow-up round register is provided. |
40
40
  | `thatch-review-context` | Gather project/feature context (PR descriptions, git archaeology, ticket references, memory) before fan-out. Prevents false positives about intentionally deferred work. Also fetches prior review comments on a connected PR/MR for follow-up-round detection and builds a register with preliminary addressed-check status per comment. |
41
41
  | `thatch-workflow-research` | Research code workflows/features affected by a change or planned change. Reads code flows, comments, git history, memories, docs. Produces a guide to the code for reviewers or planners. |
42
42
  | `thatch-change-walkthrough` | Explain a change to the user as a teaching walkthrough: resolve the delta, research each affected workflow at the merge-base, teach current behavior, then overlay the modifications with file:line citations and analogies. |
43
43
  | `thatch-code-walkthrough` | Explain a feature, module, or workflow to the user as a teaching walkthrough: identify the code area (optionally from a branch or PR), research how it works, teach it with file:line citations and analogies, list the key files. |
44
44
  | `thatch-session-reflection` | End-of-session memory recording (project, user, tools, self). |
45
- | `pr-description` | Draft PR descriptions with instructional-design scaffolding (SYNOPSIS / PURPOSE / DESCRIPTION / WALK-THROUGH / NOTES) and bold+italic emphasis for scanning. |
46
- | `ticket-description` | Draft ticket/issue descriptions with instructional-design scaffolding (SYNOPSIS / PROBLEM / BACKGROUND / PROPOSED APPROACH / ACCEPTANCE CRITERIA / RELEASE PLAN / VALIDATION / DEPENDENCIES / NOTES). |
45
+ | `pr-description` | Draft PR descriptions with SYNOPSIS / PURPOSE / DESCRIPTION / WALK-THROUGH / NOTES, project-context research, clarity checks, and bold+italic emphasis for scanning. |
46
+ | `ticket-description` | Draft ticket/issue descriptions with clear sections, project-context research, clarity checks, and bold+italic emphasis for scanning. |
47
47
  | `split-overlarge-pr` | Split already-completed work from an overlarge PR into human-reviewable, release-safe PRs targeting main. |
48
48
 
49
49
  **opencode-only (1)** — the coordinator needs sub-agent support:
50
50
 
51
51
  | Skill | Role |
52
52
  |-------|------|
53
- | `thatch-code-review` | Resolve review target (incl. VCS detection and connected PR/MR lookup for follow-up round detection), gather project context, research affected workflows, estimate complexity, partition, dispatch the 6 specialists in parallel, synthesize (incl. cross-referencing findings against prior review comments). |
53
+ | `thatch-code-review` | Resolve review target (incl. VCS detection and connected PR/MR lookup for follow-up round detection), gather project context, research affected workflows, estimate complexity, partition, dispatch the 6 specialists in parallel, synthesize with a workflow-change preface and prior-comment cross-reference. |
54
54
 
55
55
  ## REVIEW_COMMON
56
56
 
@@ -115,7 +115,7 @@ and `--cursor` pass only the shared set.
115
115
  ## Memory review skills in practice
116
116
 
117
117
  - **Quick single lens**: load any specialist directly and point it at a branch.
118
- - **Full review on opencode**: load `thatch-code-review` — it gathers project context, researches affected workflows, dispatches all 6 specialists in parallel (with both the context brief and workflow guide injected into each briefing), then synthesizes.
118
+ - **Full review on opencode**: load `thatch-code-review` — it gathers project context, researches affected workflows, dispatches all 6 specialists in parallel (with both the context brief and workflow guide injected into each briefing), then synthesizes a report that starts with the workflow changes before findings.
119
119
  - **Full review on Claude Code/Cursor**: run each specialist in sequence, then
120
120
  run `thatch-review-synthesizer` to verify and aggregate.
121
121