$npx -y skills add Archive228/loopkit --skill suggest-next-featuresRead git log since initial scaffold + last 3 progress notes, draft feature additions to a SEPARATE suggestions file so feature_list.json stays immutable
| 1 | # suggest-next-features |
| 2 | |
| 3 | The ledger runs dry. Either every `feature_list.json` entry has `passes: true`, or the last few sessions have been shuffling half-features and adding no new work because the spec grew and the list did not. |
| 4 | |
| 5 | This skill drafts candidate additions — but to a **separate** file, `feature_list.suggestions.json`. `feature_list.json` is immutable except for the single `passes: false → true` flip that [[feature-list-json]] permits. Silently appending entries would break that contract and let a runaway session invent its own scope. |
| 6 | |
| 7 | The suggestions file is a proposal. A human hand-merges chosen entries into `feature_list.json`; the rest are ignored or deleted. No agent, ever, edits `feature_list.json` directly from this skill. |
| 8 | |
| 9 | ## Trigger |
| 10 | |
| 11 | Apply when **either** condition holds: |
| 12 | |
| 13 | - `jq '[.[] | select(.passes==false)] | length' feature_list.json` returns `0`. |
| 14 | - The last 3 progress entries in `claude-progress.txt` show no new `passes: true` flips AND the user has referenced behavior not present in `feature_list.json`. |
| 15 | |
| 16 | Do not apply just because the list looks short. 30 unfinished entries is not a trigger; 0 is. |
| 17 | |
| 18 | ## Procedure |
| 19 | |
| 20 | 1. `git log --pretty=format:'%h %s' "$(git log --grep='chore: initial scaffold' --format=%H | tail -1)"..HEAD` — every commit since the scaffold. This is what actually shipped, not what was claimed. |
| 21 | 2. Read the last 3 "What's done" / "Notes for the next session" entries from `claude-progress.txt`. This is where recent scope creep leaks. |
| 22 | 3. Read `feature_list.json` in full. You need to know what is already enumerated so you do not propose duplicates. |
| 23 | 4. Compare (1)+(2) against (3). Look for: |
| 24 | - Behavior the user asked for in recent sessions that has no matching entry. |
| 25 | - Natural next steps implied by shipped features (a feature ships a POST endpoint but no list view for its results). |
| 26 | - Categories the initial list under-covered (error states, empty states, mobile layout, keyboard shortcuts, offline behavior). |
| 27 | 5. Draft 5–10 candidate entries in the same shape as `feature_list.json`. Every one starts `passes: false`. Order them roughly by priority. |
| 28 | 6. Write the array to `feature_list.suggestions.json` at the project root. Overwrite any prior draft — this file is regenerable, not append-only. |
| 29 | 7. Print a one-line summary per suggestion so the operator can scan without opening the file. |
| 30 | 8. Stop. Do not touch `feature_list.json`. Do not commit `feature_list.suggestions.json` (it is a proposal, not project state). |
| 31 | |
| 32 | ## Output shape |
| 33 | |
| 34 | `feature_list.suggestions.json` — same schema as `feature_list.json`: |
| 35 | |
| 36 | ```json |
| 37 | [ |
| 38 | { |
| 39 | "category": "ux", |
| 40 | "description": "Empty conversation list shows an onboarding CTA", |
| 41 | "steps": [ |
| 42 | "Load app as a user with zero conversations", |
| 43 | "Verify the sidebar shows a 'Start your first chat' CTA", |
| 44 | "Click the CTA and land in a fresh conversation" |
| 45 | ], |
| 46 | "passes": false, |
| 47 | "rationale": "Sessions 41/43 both hit the empty-list path and rendered a blank sidebar; no entry covers it." |
| 48 | } |
| 49 | ] |
| 50 | ``` |
| 51 | |
| 52 | The `rationale` field is unique to the suggestions file — it justifies the proposal so the human merger can decide fast. Strip `rationale` before merging into `feature_list.json`. |
| 53 | |
| 54 | ## Anti-patterns |
| 55 | |
| 56 | - **Never edit `feature_list.json` directly from this skill.** Not to append, not to reorder, not to add a comment. The immutability rule from [[feature-list-json]] wins. |
| 57 | - **Do not delete `feature_list.suggestions.json` on the next run.** Overwrite it — the operator may have partly consumed it, and a rewrite is clearer than a diff-merge. |
| 58 | - **Do not propose more than 10 at a time.** Long lists get skimmed, not read. If more are warranted, ship the top 10 and note the rest in `claude-progress.txt`. |
| 59 | - **Do not commit the suggestions file.** It is a proposal for the operator, not a source-of-truth artifact. Add `feature_list.suggestions.json` to `.gitignore` if the operator has not already. |
| 60 | |
| 61 | ## Related |
| 62 | |
| 63 | - [[feature-list-json]] — the immutability contract this skill respects. |
| 64 | - [[shift-notes]] — where recent-scope-drift signals live. |
| 65 | - [[progress-reading-protocol]] — the fresh-session read this skill mirrors in reverse (reads history, writes forward proposals). |