@jeffober/thatch 0.1.25 → 0.1.26

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.
package/README.md CHANGED
@@ -70,7 +70,7 @@ Include thatch's instructions in your agent's system prompt manually; see
70
70
  - **Prediction engine**: a statistical model of user decision-making
71
71
  preferences. When a prompt matches learned contexts, predictions fire
72
72
  alongside the recall nudge.
73
- - **Skills**: 20 skills for memory workflows, structured multi-specialist
73
+ - **Skills**: 21 skills for memory workflows, structured multi-specialist
74
74
  code review, change walkthroughs, and writing tasks (PR descriptions,
75
75
  tickets, PR splitting).
76
76
 
@@ -0,0 +1,253 @@
1
+ ---
2
+ name: thatch-review-followup
3
+ description: Alternate entrypoint for follow-up review rounds. Verifies whether the author's responses and code changes since your last review round adequately addressed your prior findings, offers to reply on resolved items, then optionally re-runs the full structured review. Use after you have posted review comments and the author has responded or pushed changes.
4
+ ---
5
+
6
+ You are a re-review verifier. Your job is to check whether the PR author's responses and code changes since your last review round adequately addressed your prior findings, before deciding whether another full review round is needed.
7
+
8
+ This skill is an alternate entrypoint to the review pipeline. Use it instead of `thatch-code-review` when you have already reviewed a PR and the author has responded or pushed changes. It does not dispatch specialists or run a full review from scratch. It verifies resolution of your existing findings, offers to reply on the resolved ones, then optionally hands off to `thatch-code-review` for a fresh round.
9
+
10
+ ## When to use
11
+
12
+ - You have already posted review comments on a PR (your prior review round).
13
+ - The author has responded to your comments, pushed code changes, or both.
14
+ - You want to verify your concerns were addressed before deciding whether another full review round is needed.
15
+
16
+ ## When NOT to use
17
+
18
+ - First review of a PR. Use `thatch-code-review` instead.
19
+ - You have no prior review comments on the PR. There is nothing to re-check.
20
+ - You want a full from-scratch review regardless of prior comments. Use `thatch-code-review` — its existing follow-up detection will cross-reference your prior comments automatically.
21
+
22
+ ## Step 1: Identify your prior review round
23
+
24
+ ### Detect the connected PR/MR
25
+
26
+ Run `git fetch origin` (NOT `git pull`). Inspect `git remote -v` to recognize the VCS host:
27
+ - `github.com` → GitHub (`gh`)
28
+ - `gitlab.*` → GitLab (`glab`)
29
+ - `bitbucket.org` → Bitbucket Cloud
30
+ - `dev.azure.com` → Azure DevOps
31
+
32
+ Probe for an open PR/MR on the current branch:
33
+ - **GitHub**: `gh pr view --head <branch> --json number,title,headRefOid,baseRefOid`
34
+ - **GitLab**: `glab mr list --source-branch <branch>`
35
+
36
+ If no PR/MR is found or no VCS CLI is available, you cannot re-check. Report this and stop.
37
+
38
+ ### Identify your VCS identity
39
+
40
+ Get your own username so you can separate your comments from other reviewers':
41
+ - **GitHub**: `gh api user --jq .login`
42
+ - **GitLab**: `glab api user`
43
+
44
+ ### Fetch your prior review comments
45
+
46
+ Fetch ALL review comments on the PR/MR, then filter to comments by your user:
47
+ - **GitHub**: `gh api repos/{owner}/{repo}/pulls/{N}/reviews` (review summaries with `user.login`, `commit_id`, `state`, `submitted_at`) AND `gh api repos/{owner}/{repo}/pulls/{N}/comments` (inline comments with `path`, `line`, `original_line`, `commit_id`, `body`, `user.login`, `in_reply_to_id`). Filter both to `user.login` matching your identity.
48
+ - **GitLab**: `glab api projects/:id/merge_requests/:iid/discussions`. Filter threads to those initiated by your user.
49
+
50
+ Also fetch other reviewers' comments as context. They may have raised related issues, or the author may have addressed their comments in ways that affect yours. But you are only verifying resolution of YOUR findings.
51
+
52
+ ### Determine the last-round head SHA
53
+
54
+ Find the HEAD commit at the time of your most recent review. This is the baseline for detecting what the author changed:
55
+ - If you submitted formal reviews (state COMMENTED, CHANGES_REQUESTED, APPROVED), the most recent review's `commit_id` is the last-round SHA.
56
+ - If you posted individual comments without a formal review, the most recent comment's `commit_id` is the last-round SHA.
57
+ - If you used a pending review (e.g., via oink draft-review), its `commit_id` is the last-round SHA.
58
+
59
+ Record this as `LAST_ROUND_SHA`. Record the current HEAD as `CURRENT_SHA` (from `gh pr view --json headRefOid` or equivalent).
60
+
61
+ ### Build the findings register
62
+
63
+ For each of your prior review comments, record:
64
+ - The comment body (quoted)
65
+ - The original file:line and commit SHA
66
+ - The semantic claim (one-sentence paraphrase of what you raised)
67
+ - The severity you assigned (if discernible from the comment)
68
+ - The original finding's category (if discernible)
69
+
70
+ This is the list of findings you will verify.
71
+
72
+ ## Step 2: Determine what changed since the last round
73
+
74
+ ### Check for code changes
75
+
76
+ Compare `LAST_ROUND_SHA` to `CURRENT_SHA`:
77
+ - If they are the same, the author has not pushed code. Skip to "Read author responses" below.
78
+ - If they differ, diff the two SHAs to isolate the author's changes: `git diff <LAST_ROUND_SHA> <CURRENT_SHA>`.
79
+
80
+ **Force-push check**: run `git merge-base --is-ancestor <LAST_ROUND_SHA> <CURRENT_SHA>`. If it fails, the author rewrote history (force-pushed). Line numbers may have drifted. You will need to locate each finding's equivalent location in the new HEAD by matching surrounding context, not by line number.
81
+
82
+ **Merge-from-main check**: if the author merged main into the branch between rounds, plain `git log <LAST_ROUND_SHA>..<CURRENT_SHA>` and `git diff <LAST_ROUND_SHA> <CURRENT_SHA>` both pull in every main commit, burying the author's actual response commits. To see only the author's commits, run `git log <LAST_ROUND_SHA>..<CURRENT_SHA> --not origin/main` after `git fetch origin`. Then read each remaining commit's diff with `git show <sha>`. Do not assume a large diff stat means the author rewrote the PR. Check for a merge commit first.
83
+
84
+ ### Read author responses
85
+
86
+ Fetch reply threads on your comments:
87
+ - **GitHub**: the comments API returns all comments including replies. Replies have `in_reply_to_id` pointing to the original comment's `id`. Match these to build reply threads.
88
+ - **GitLab**: the discussions API already returns threads.
89
+
90
+ For each of your findings, record:
91
+ - Whether the author responded (yes/no)
92
+ - The response body (quoted)
93
+ - Whether the author resolved the thread in the UI (GitLab `resolved` flag, GitHub `isResolved` via GraphQL if accessible). The UI resolve flag is supplementary signal only. A thread can be marked resolved while the bug persists.
94
+
95
+ ### If nothing has happened
96
+
97
+ If the head SHA is unchanged AND the author left no responses to your comments, report:
98
+
99
+ > No changes since the last review round. The head SHA is still `<SHA>`. No responses to your review comments. There is nothing to re-check.
100
+
101
+ Stop. Do not offer to re-run the review.
102
+
103
+ ## Step 3: Verify adequate resolution of each finding
104
+
105
+ For each finding in your register, determine whether it was adequately addressed. The bar is deliberately high: the author must demonstrate resolution, not just respond.
106
+
107
+ ### What counts as adequately addressed
108
+
109
+ A finding is `ADEQUATELY ADDRESSED` when one of these is true:
110
+
111
+ 1. **Code change fixed the issue.** The author changed the code in a way that resolves the root cause. Verify by reading the new code at the equivalent location in `CURRENT_SHA`. The fix must address the actual problem, not just paper over the symptom. Read the diff for the affected file(s) between `LAST_ROUND_SHA` and `CURRENT_SHA` to see what changed. Quote the new code that resolves the finding.
112
+
113
+ 2. **Author proved the finding is not a concern.** The author responded with a verifiable argument showing the finding is out of scope, the result of a misunderstanding, or structurally impossible. The argument must be checkable. You can verify the constraint, scope, or code path they cite. If the argument references a schema constraint, type, or guard, read it and quote it. If the argument says the code path is unreachable, trace the callers and verify. If the argument says the behavior is intentional, check git history and memories for design rationale.
114
+
115
+ 3. **Author filed a follow-up ticket AND explained the risk.** The author created a ticket to address the finding later AND provided a logical and plausible explanation of why there is little or no risk until that ticket is implemented. The ticket must be real and verifiable in the issue tracker. The risk explanation must be sound. Verify the ticket exists (e.g., `gh issue view <N>` or `gh issue list --search "<title>"`). Read the risk explanation and judge whether it holds.
116
+
117
+ ### What does NOT count as adequately addressed
118
+
119
+ 1. **Author responded but did not prove anything.** A response that says "I think this is fine" or "this is not a concern" without evidence is not adequate. The response must demonstrate why the finding is not a concern, not merely assert it.
120
+
121
+ 2. **Author added a comment noting the issue.** Adding a TODO or comment that describes the problem is not adequate unless paired with a follow-up ticket and a risk explanation. A comment that says "this is a known issue" without a ticket and risk assessment is an acknowledgment, not a resolution.
122
+
123
+ 3. **Author dismissed without engaging.** "Won't fix" without justification is not adequate. The author must explain why the finding does not need to be fixed.
124
+
125
+ 4. **Thread was resolved in the UI.** A thread marked "resolved" in the VCS UI is not adequate by itself. Anyone can click resolve. The code state or the author's response must demonstrate resolution. When the UI resolve flag disagrees with the code state, trust the code state.
126
+
127
+ ### Classification
128
+
129
+ For each finding, classify as:
130
+
131
+ - **`ADEQUATELY ADDRESSED`** — meets one of the three criteria above. State which criterion and provide evidence: the code change (quote the new code), the proof (quote the author's argument and the constraint, scope, or code path you verified), or the ticket + risk explanation (ticket reference and your assessment of the risk argument).
132
+ - **`NOT ADDRESSED`** — the issue persists and the author's response (if any) does not meet the bar. State what the author did or did not do, and what is still needed.
133
+ - **`PARTIALLY ADDRESSED`** — the author made progress but the resolution is incomplete. State what was done and what remains. This covers cases where the author fixed part of the issue but left related cases unhandled.
134
+ - **`DISPUTED`** — the author disagreed with the finding and provided an argument, but the argument does not hold up under verification. Explain why the argument fails. Cite the code, constraint, or scope that refutes the author's claim.
135
+ - **`NO RESPONSE`** — the author neither responded nor changed the relevant code. The finding stands as originally reported.
136
+
137
+ ### Verification method
138
+
139
+ For each finding:
140
+ 1. Locate the finding's code at `LAST_ROUND_SHA` using the original comment's file:line and commit_id.
141
+ 2. Find the equivalent location in `CURRENT_SHA` by matching surrounding context. Line numbers may have drifted after a force-push or merge. Search for unique tokens from the original region.
142
+ 3. Read the code at the current location. Does the issue still exist?
143
+ 4. If the author changed the code, read the diff for the affected file(s) to understand what changed and whether it addresses the root cause.
144
+ 5. If the author responded, read the response. Verify any claims they make against the code, constraints, or documentation. Do not accept claims at face value. Check them.
145
+ 6. Classify per the criteria above.
146
+
147
+ ## Step 4: Present the verification report
148
+
149
+ Produce a structured report for the user:
150
+
151
+ ### Re-check summary
152
+ - PR/MR number, title
153
+ - Last-reviewed SHA, current SHA
154
+ - Whether the author pushed changes, responded to comments, or both
155
+ - Force-push or merge-from-main detected (if applicable)
156
+
157
+ ### Finding verification
158
+
159
+ Group findings by status. For each finding:
160
+
161
+ #### ADEQUATELY ADDRESSED
162
+ 1. **Finding** — one-line paraphrase of the original concern
163
+ 2. **How addressed** — code change / proof / follow-up ticket + risk explanation
164
+ 3. **Evidence** — what you read to verify (code quote, constraint quote, ticket reference + risk assessment)
165
+ 4. **Original location** — file:line @ last-round SHA and file:line @ current SHA
166
+
167
+ #### NOT ADDRESSED
168
+ 1. **Finding** — one-line paraphrase
169
+ 2. **Current state** — what the author did or did not do
170
+ 3. **What's still needed** — what would resolve this finding
171
+
172
+ #### PARTIALLY ADDRESSED
173
+ 1. **Finding** — one-line paraphrase
174
+ 2. **What was done** — the progress made
175
+ 3. **What remains** — what is still needed
176
+
177
+ #### DISPUTED
178
+ 1. **Finding** — one-line paraphrase
179
+ 2. **Author's argument** — what the author claimed
180
+ 3. **Why it fails** — your verified refutation
181
+
182
+ #### NO RESPONSE
183
+ 1. **Finding** — one-line paraphrase
184
+ 2. **Status** — no response, no code change. Finding stands.
185
+
186
+ ### Round assessment
187
+ - Count of findings in each status
188
+ - Whether the unaddressed, partially addressed, disputed, or no-response findings warrant further action
189
+ - Whether the author's changes introduced new code that should be reviewed
190
+
191
+ ## Step 5: Offer to reply on adequately addressed findings
192
+
193
+ For each finding classified as `ADEQUATELY ADDRESSED`, use your judgement to decide whether a reply is appropriate and what form it should take.
194
+
195
+ ### Reply decision guide
196
+
197
+ - **Code change that solved it well**: "Oh, nice. I didn't think of solving it that way." or a thumbs-up reaction. Do not over-explain. If the fix was obvious, a reaction alone is enough.
198
+ - **Follow-up ticket agreed**: "Agreed, that can be dealt with in a follow up." Reference the ticket if the author did not.
199
+ - **Proof that it's not a concern**: "Good point, that makes sense." or a brief acknowledgment. Do not restate their argument back at them.
200
+ - **Trivial fix** (typo, naming, one-line change): an emoji reaction is enough. No need to write a comment.
201
+ - **Clever or unexpected solution**: acknowledge it specifically. "Nice, using the existing validator there is cleaner than what I suggested."
202
+
203
+ ### When NOT to reply
204
+
205
+ - If the author's response was thorough and there is nothing to add, a reaction is enough. Silence is also fine.
206
+ - If the fix was trivial and obvious, do not write a comment. A reaction or silence.
207
+ - If most findings are trivial, consider one summary comment instead of per-finding replies.
208
+
209
+ ### When to reply
210
+
211
+ - When the author filed a ticket you want to acknowledge.
212
+ - When the author's solution was clever or unexpected and worth calling out.
213
+ - When the author proved a finding was not a concern and you want to accept their reasoning on the record.
214
+ - When a brief comment helps close the thread cleanly for future readers.
215
+
216
+ ### Posting replies
217
+
218
+ Propose the replies (or reactions) to the user before posting. After the user approves:
219
+ - Post comments via the VCS CLI (`gh pr comment` or equivalent) or the oink draft-review tool when available.
220
+ - Post reactions via the VCS API (GitHub: `gh api repos/{owner}/{repo}/issues/comments/{id}/reactions` with `content` field).
221
+ - When responding on behalf of the user, prefix the response with `Landru is thinking on behalf of Jeff: ` (in bold, using the correct markup for the platform).
222
+ - Build the draft review once at the end after all replies have been decided, not incrementally after each finding.
223
+
224
+ ## Step 6: Handle unaddressed findings
225
+
226
+ For findings classified as `NOT ADDRESSED`, `PARTIALLY ADDRESSED`, `DISPUTED`, or `NO RESPONSE`, present them to the user one at a time. The user decides how to handle each:
227
+
228
+ - **Push back**: the user wants to reiterate the finding and ask the author to address it. Offer to draft a follow-up comment.
229
+ - **Accept the author's response**: the user disagrees with your verification and accepts the author's response. Reclassify as `ADEQUATELY ADDRESSED` and return to Step 5 to handle the reply.
230
+ - **Drop the finding**: the user decides the finding is no longer worth pursuing. Note this and move on.
231
+ - **Escalate**: the user wants to discuss the finding with the author in a different forum (Slack, ticket, etc.). Note this and move on.
232
+
233
+ After the user responds to each unaddressed finding, check whether a thatch prediction should be updated based on the user's decision (review threshold, severity, evidence standards, what is worth posting).
234
+
235
+ ## Step 7: Offer to re-run the structured review
236
+
237
+ After all findings have been dealt with (adequately addressed and replied to, or unaddressed and the user decided how to handle them), offer to re-run the full structured review.
238
+
239
+ ### When to offer
240
+
241
+ - **All findings adequately addressed AND author pushed code changes**: offer to run `thatch-code-review` on the current HEAD. The author's fixes may have introduced new issues. The full review will catch them. The coordinator's existing follow-up detection will cross-reference your prior comments automatically.
242
+ - **Some findings unaddressed but user wants to proceed**: offer to run the full review alongside the unaddressed findings. The new review may find additional context.
243
+ - **Author only responded (no code changes) and all findings adequately addressed**: do NOT offer a full re-run. The code has not changed, so a new review would produce the same findings as the last round. Confirm that the user is satisfied with the responses.
244
+ - **No findings were adequately addressed**: do NOT offer a full re-run. The author has not engaged with the review. Suggest the user respond to the unaddressed findings instead.
245
+ - **Author pushed changes but only addressed some findings**: offer the full re-run only after the user has decided how to handle the unaddressed ones. The user may want to push back before another review round makes sense.
246
+
247
+ ### How to offer
248
+
249
+ Present the offer as a choice:
250
+ 1. **Re-run the full structured review**: load `thatch-code-review` on the current HEAD. It will dispatch all seven specialists on the merge-base..HEAD range. The existing follow-up detection will cross-reference your prior comments. On Claude Code or Cursor (no sub-agent support), run each specialist skill in sequence, then run `thatch-review-synthesizer` to aggregate.
251
+ 2. **End the re-review here**: the user confirmed their concerns were addressed (or decided how to handle the unaddressed ones) and does not want another full round.
252
+
253
+ The offer is just an offer. The user may decline. They may have only wanted to confirm their concerns were addressed.
@@ -64,7 +64,7 @@ bin/thatch → CLI: stores|list|show|forget|search|mcp|reminder|hygi
64
64
  | `extract-queue.ts` | File-backed per-session JSONL queue (caps 20, oldest dropped). Shared by the Claude Code and Cursor hook paths, which fire one-shot per event with no cross-call state. This is the MCP-side equivalent of `extraction.ts`. |
65
65
  | `sideband.ts` | Unix domain socket server + client. The MCP server (long-lived, warm model) runs `SidebandServer` so one-shot hook processes can ask it to embed a prompt and search for matches without loading the model themselves. Handles two methods: `match` (recall nudge) and `predictions` (prediction auto-fire). Socket path is a hash of the DB path — both processes compute it independently. |
66
66
  | `prompts.ts` | Text constants: opencode system prompt, compaction context, session-start reminder, prompt-aware recall nudge (`recallNudge` / `claudeRecallNudge`), Claude Code CLAUDE.md instructions, Cursor AGENTS.md instructions, Claude Code hook text. |
67
- | `skills.ts` | `SKILL.md` content for all thatch skills, plus the installer. Skills are split into `SHARED_SKILLS` (19 skills: fact-extractor, dedup-classifier, project-primer, 7 review specialists, review synthesizer, review context, workflow research, change walkthrough, code walkthrough, session reflection, pr-description, ticket-description, split-overlarge-pr — work on both opencode and Claude Code) and `OPENCODE_ONLY_SKILLS` (1 skill: code-review coordinator — requires sub-agent support, not installed for Claude Code). `installSkills(dir, skills)` defaults to `SHARED_SKILLS`; the opencode plugin passes `[...SHARED_SKILLS, ...OPENCODE_ONLY_SKILLS]`. |
67
+ | `skills.ts` | `SKILL.md` content for all thatch skills, plus the installer. Skills are split into `SHARED_SKILLS` (20 skills: fact-extractor, dedup-classifier, project-primer, 7 review specialists, review synthesizer, review context, workflow research, review followup, change walkthrough, code walkthrough, session reflection, pr-description, ticket-description, split-overlarge-pr — work on both opencode and Claude Code) and `OPENCODE_ONLY_SKILLS` (1 skill: code-review coordinator — requires sub-agent support, not installed for Claude Code). `installSkills(dir, skills)` defaults to `SHARED_SKILLS`; the opencode plugin passes `[...SHARED_SKILLS, ...OPENCODE_ONLY_SKILLS]`. |
68
68
 
69
69
  ## Plugin hooks
70
70
 
@@ -21,9 +21,9 @@ description: Extract durable project facts ... Use when ...
21
21
  - `description` drives when the agent loads the skill (both opencode and
22
22
  Cursor auto-discover skills and use the description for relevance).
23
23
 
24
- ## The 20 skills
24
+ ## The 21 skills
25
25
 
26
- **Shared (19)** — installed everywhere; no sub-agents required:
26
+ **Shared (20)** — installed everywhere; no sub-agents required:
27
27
 
28
28
  | Skill | Role |
29
29
  |-------|------|
@@ -40,6 +40,7 @@ description: Extract durable project facts ... Use when ...
40
40
  | `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. |
41
41
  | `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. |
42
42
  | `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. |
43
+ | `thatch-review-followup` | Alternate entrypoint for follow-up review rounds. Verifies whether the author's responses and code changes since your last review round adequately addressed your prior findings, offers to reply on resolved items, then optionally re-runs the full structured review. |
43
44
  | `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. |
44
45
  | `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. |
45
46
  | `thatch-session-reflection` | End-of-session memory recording (project, user, tools, self). |
@@ -85,7 +86,7 @@ The synthesizer reuses the same verification rigor but has its own structure
85
86
  ## The two arrays
86
87
 
87
88
  ```ts
88
- const SHARED_SKILLS: SkillDef[] = [ /* 19 skills above */ ];
89
+ const SHARED_SKILLS: SkillDef[] = [ /* 20 skills above */ ];
89
90
  const OPENCODE_ONLY_SKILLS: SkillDef[] = [ /* code-review coordinator */ ];
90
91
  ```
91
92
 
@@ -119,6 +120,10 @@ and `--cursor` pass only the shared set.
119
120
  - **Full review on opencode**: load `thatch-code-review` — it gathers project context, researches affected workflows, dispatches all 7 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.
120
121
  - **Full review on Claude Code/Cursor**: run each specialist in sequence, then
121
122
  run `thatch-review-synthesizer` to verify and aggregate.
123
+ - **Follow-up round (re-review)**: load `thatch-review-followup` when the author
124
+ has responded or pushed changes after your initial review. It verifies whether
125
+ your prior findings were adequately addressed, offers to reply on resolved
126
+ items, then optionally hands off to `thatch-code-review` for a fresh round.
122
127
 
123
128
  The coordinator is the only skill that can't be used without sub-agents; that's
124
129
  why it lives in `OPENCODE_ONLY_SKILLS`.
@@ -22,7 +22,7 @@ file/IPC/CLI contracts ready to graduate into `bun:test` integration tests.
22
22
  | [UC-011](UC-011-write-time-similarity-warning.md) | Write-time warning never blocks; merge or mark-distinct reconciliation |
23
23
  | [UC-012](UC-012-model-migration.md) | `THATCH_MODEL` change: old memories skipped (not corrupted) until re-saved |
24
24
  | [UC-013](UC-013-compaction-context.md) | Compaction context re-familiarization (opencode-only) |
25
- | [UC-014](UC-014-skill-install-drift.md) | Skill install: 19 shared vs 20 opencode; drift overwritten on re-setup |
25
+ | [UC-014](UC-014-skill-install-drift.md) | Skill install: 20 shared vs 21 opencode; drift overwritten on re-setup |
26
26
  | [UC-015](UC-015-env-override-matrix.md) | `THATCH_DB_PATH`, `XDG_CONFIG_HOME`, `CLAUDE_CONFIG_DIR`, `THATCH_QUEUE_DIR`, `THATCH_RECALL_THRESHOLD`, `THATCH_MODEL` |
27
27
  | [UC-016](UC-016-concurrent-session-isolation.md) | Per-session extraction isolation (in-memory + file queue); shared stateless sideband |
28
28
  | [UC-017](UC-017-buffer-tool-vs-buffer-batch.md) | `buffer-batch` (Claude, `tool_calls[]`+`session_id`) vs `buffer-tool` (Cursor, single+`conversation_id`) |
@@ -17,12 +17,12 @@
17
17
  appends a thatch block to `CLAUDE.md` bracketed by start/end markers (replaced, not
18
18
  duplicated, on re-run), writes `.claude/settings.json` hooks (`SessionStart` -> `thatch reminder`,
19
19
  `PostToolBatch` -> `thatch buffer-batch`, `UserPromptSubmit` -> `thatch flush-tools`), and installs
20
- **19 shared skills** (no code-review coordinator) to `$CLAUDE_CONFIG_DIR/skills/` — user-scoped
20
+ **20 shared skills** (no code-review coordinator) to `$CLAUDE_CONFIG_DIR/skills/` — user-scoped
21
21
  even in project-local mode.
22
22
  - `--cursor` project-local writes `.cursor/mcp.json`, appends to `AGENTS.md`, writes
23
23
  `.cursor/hooks.json` in the **flat format** (`{version:1, hooks:{...}}`): `sessionStart` ->
24
24
  `thatch reminder --json`, `postToolUse` -> `thatch buffer-tool`, `beforeSubmitPrompt` ->
25
- `thatch flush-tools --json`; and installs 19 shared skills to `~/.cursor/skills/`.
25
+ `thatch flush-tools --json`; and installs 20 shared skills to `~/.cursor/skills/`.
26
26
  - Re-run is idempotent: instructions are not duplicated, thatch hooks are replaced (not appended),
27
27
  and non-thatch hooks are preserved. A legacy `thatch echo` hook is replaced with `flush-tools`.
28
28
  - `--global` (Claude) writes `~/.claude/CLAUDE.md` + `~/.claude/settings.json` but **no project
@@ -13,16 +13,16 @@
13
13
  5. Check whether the `thatch-code-review` coordinator skill is present.
14
14
 
15
15
  **Expected**
16
- - Claude Code and Cursor install exactly **19 shared skills** to the skills
16
+ - Claude Code and Cursor install exactly **20 shared skills** to the skills
17
17
  dir — the coordinator (`thatch-code-review`) is **absent** (it needs
18
18
  sub-agents, which those hosts lack).
19
- - opencode installs **20** — the 19 shared plus the coordinator.
19
+ - opencode installs **21** — the 20 shared plus the coordinator.
20
20
  - The locally edited `SKILL.md` is **overwritten** with the canonical content
21
21
  on the next `setup`/init (drift detection: a file is only rewritten when its
22
22
  content differs from the definition). Unrelated skill files are untouched.
23
23
  - Skills never land in the worktree — always under the user-scoped config dir
24
24
  (`~/.claude/skills`, `~/.cursor/skills`, `$XDG_CONFIG_HOME/opencode/skills`).
25
25
 
26
- _Automatable: yes — file presence, count (19 vs 20), content-diff-overwrite, and
26
+ _Automatable: yes — file presence, count (20 vs 21), content-diff-overwrite, and
27
27
  coordinator host-gating are all file assertions (`setup.test.ts` already covers
28
28
  the unit contract)._
@@ -200,6 +200,7 @@ Seven specialist review lenses, each a self-contained static-analysis pass:
200
200
  | `thatch-review-synthesizer` | Verifies and synthesizes findings from multiple specialists into a report that starts with workflow changes, then highlights, then deduplicated severity-grouped findings. |
201
201
  | `thatch-review-context` | Gathers project context (PR descriptions, git archaeology, ticket references, memory) before a review. Prevents false positives about intentionally deferred work. |
202
202
  | `thatch-workflow-research` | Researches code workflows and features affected by a change or planned change. Reads code flows, comments, git history, and produces a guide for reviewers or planners. |
203
+ | `thatch-review-followup` | Alternate entrypoint for follow-up review rounds. Verifies whether the author's responses and code changes since your last review adequately addressed your prior findings, offers to reply on resolved items, then optionally re-runs the full structured review. |
203
204
  | `thatch-change-walkthrough` | Explains a change to the user as a teaching walkthrough: researches each affected workflow at the merge-base, teaches current behavior, then overlays the modifications with file:line citations. |
204
205
  | `thatch-code-walkthrough` | Explains a feature, module, or workflow to the user as a teaching walkthrough with file:line citations. Also used to draft high-level docs for new or undocumented features. |
205
206
 
@@ -225,6 +226,7 @@ Seven specialist review lenses, each a self-contained static-analysis pass:
225
226
  | Review specialists (7) | Yes | Yes | Yes |
226
227
  | Review synthesizer | Yes | Yes | Yes |
227
228
  | Review context + workflow research | Yes | Yes | Yes |
229
+ | Review followup | Yes | Yes | Yes |
228
230
  | Walkthrough skills (2) | Yes | Yes | Yes |
229
231
  | Writing skills (3) | Yes | Yes | Yes |
230
232
  | Code review coordinator | Yes | No (requires sub-agents) | No (requires sub-agents) |
@@ -258,6 +260,18 @@ specialist in sequence, then synthesize:
258
260
  4. Load thatch-review-synthesizer, verify and aggregate all findings.
259
261
  ```
260
262
 
263
+ For a **follow-up round** (the author responded or pushed changes after your
264
+ review), load the re-check skill:
265
+
266
+ ```text
267
+ Load thatch-review-followup and check whether my prior review comments
268
+ on this PR were adequately addressed.
269
+ ```
270
+
271
+ It verifies whether each finding was resolved (by code change, proof, or
272
+ follow-up ticket with a risk explanation), offers to reply on the resolved
273
+ ones, then optionally hands off to the coordinator for a fresh full review.
274
+
261
275
  These files are plugin-owned: local edits are overwritten the next time the
262
276
  plugin initializes (this is how skill improvements ship with new versions).
263
277
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jeffober/thatch",
3
- "version": "0.1.25",
3
+ "version": "0.1.26",
4
4
  "description": "Persistent memory for AI coding agents — local embeddings, SQLite stores, zero config. Works with OpenCode (as a plugin), Claude Code (as an MCP server), and Cursor (as an MCP server).",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
package/src/prompts.ts CHANGED
@@ -38,6 +38,7 @@ Thatch ships skills for code review, project investigation, and memory
38
38
  workflows. The host auto-discovers them, but reach for them proactively:
39
39
 
40
40
  - \`thatch-code-review\` — full multi-agent code review (dispatches 7 specialists + synthesizer). Requires sub-agent support.
41
+ - \`thatch-review-followup\` — alternate entrypoint for follow-up review rounds. Verifies whether the author's responses and code changes since your last review adequately addressed prior findings, offers to reply on resolved items, then optionally re-runs the full structured review.
41
42
  - \`thatch-workflow-research\` — research code workflows affected by a change or planned change, before reviewing or planning.
42
43
  - \`thatch-change-walkthrough\` — produces a teaching walkthrough of a diff with a specific format (SYNOPSIS + per-workflow orient/mechanism/numbered-stages + change overlay mirroring the same numbers) and calibrated prose rules. Load the skill for the format and prose rules, not just for the research method.
43
44
  - \`thatch-code-walkthrough\` — produces a teaching walkthrough for a feature/workflow as it stands today with a specific format (SYNOPSIS + per-workflow orient/mechanism/numbered-stages + Key files) and calibrated prose rules. Also use proactively to draft high-level docs for new or undocumented features (suitable for pkg/README.md or docs/features/<name>.md). Load the skill for the format and prose rules, not just for the research method.
@@ -243,6 +244,7 @@ workflows. The host auto-discovers them, but reach for them proactively:
243
244
  - \`thatch-change-walkthrough\` — produces a teaching walkthrough of a diff with a specific format (SYNOPSIS + per-workflow orient/mechanism/numbered-stages + change overlay mirroring the same numbers) and calibrated prose rules. Load the skill for the format and prose rules, not just for the research method.
244
245
  - \`thatch-code-walkthrough\` — produces a teaching walkthrough for a feature/workflow as it stands today with a specific format (SYNOPSIS + per-workflow orient/mechanism/numbered-stages + Key files) and calibrated prose rules. Also use proactively to draft high-level docs for new or undocumented features (suitable for pkg/README.md or docs/features/<name>.md). Load the skill for the format and prose rules, not just for the research method.
245
246
  - \`thatch-review-context\` — gather project context (PRs, tickets, TODOs, deferred work) before a review.
247
+ - \`thatch-review-followup\` — alternate entrypoint for follow-up review rounds. Verifies whether the author's responses and code changes since your last review adequately addressed prior findings, offers to reply on resolved items, then optionally re-runs the full structured review.
246
248
  - \`thatch-review-pedantic\` / \`-acceptance\` / \`-state-flow\` / \`-no-slop\` / \`-breadcrumbs\` / \`-mark-and-sweep\` / \`-highlights\` — seven specialist review lenses. Run individually, then \`thatch-review-synthesizer\` to verify and aggregate.
247
249
  - \`thatch-project-primer\` — investigate a new project and write foundational memories.
248
250
  - \`thatch-session-reflection\` — record what you learned at end of session.
@@ -511,6 +513,7 @@ workflows. The host auto-discovers them, but reach for them proactively:
511
513
  - \`thatch-change-walkthrough\` — produces a teaching walkthrough of a diff with a specific format (SYNOPSIS + per-workflow orient/mechanism/numbered-stages + change overlay mirroring the same numbers) and calibrated prose rules. Load the skill for the format and prose rules, not just for the research method.
512
514
  - \`thatch-code-walkthrough\` — produces a teaching walkthrough for a feature/workflow as it stands today with a specific format (SYNOPSIS + per-workflow orient/mechanism/numbered-stages + Key files) and calibrated prose rules. Also use proactively to draft high-level docs for new or undocumented features (suitable for pkg/README.md or docs/features/<name>.md). Load the skill for the format and prose rules, not just for the research method.
513
515
  - \`thatch-review-context\` — gather project context (PRs, tickets, TODOs, deferred work) before a review.
516
+ - \`thatch-review-followup\` — alternate entrypoint for follow-up review rounds. Verifies whether the author's responses and code changes since your last review adequately addressed prior findings, offers to reply on resolved items, then optionally re-runs the full structured review.
514
517
  - \`thatch-review-pedantic\` / \`-acceptance\` / \`-state-flow\` / \`-no-slop\` / \`-breadcrumbs\` / \`-mark-and-sweep\` / \`-highlights\` — seven specialist review lenses. Run individually, then \`thatch-review-synthesizer\` to verify and aggregate.
515
518
  - \`thatch-project-primer\` — investigate a new project and write foundational memories.
516
519
  - \`thatch-session-reflection\` — record what you learned at end of session.
package/src/skills.ts CHANGED
@@ -43,6 +43,7 @@ function loadSharedSkills(): SkillDef[] {
43
43
  "thatch-review-synthesizer",
44
44
  "thatch-review-context",
45
45
  "thatch-workflow-research",
46
+ "thatch-review-followup",
46
47
  "thatch-change-walkthrough",
47
48
  "thatch-code-walkthrough",
48
49
  "thatch-session-reflection",