diff --git a/CHANGELOG.md b/CHANGELOG.md index a86569c..939d3b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Changelog +## 0.6.0 — 2026-03-16 + +### Added +- **New `/brainstorm` skill — think before you build.** Socratic design exploration that runs before planning. Asks clarifying questions one at a time, challenges your premises, forces you to consider 2-3 implementation approaches, then writes a design doc. The design doc feeds directly into `/plan-ceo-review` and `/plan-eng-review`. You can now do `brainstorm → plan → implement → review → QA → ship → retro` — the full lifecycle. +- **New `/debug` skill — find the root cause, not the symptom.** Systematic debugging with an Iron Law: no fixes without root cause investigation first. Traces data flow, matches against known bug patterns, tests hypotheses one at a time. If 3 fixes fail, it stops and questions the architecture instead of thrashing. +- **Every skill now knows when to stop.** New escalation protocol across all skills: DONE, DONE_WITH_CONCERNS, BLOCKED, NEEDS_CONTEXT. "It is always OK to stop and say 'this is too hard for me.' Bad work is worse than no work." +- **/ship now re-verifies before pushing.** New verification gate (Step 6.5): if code changed during review fixes, tests must pass again before push. No more "should work now" — run it and prove it. +- **/review now catches scope drift.** Before reviewing code quality, Step 1.5 compares the diff against TODOS.md and commit messages. Flags files changed that weren't in the plan, and requirements that weren't addressed in the diff. +- **/review now cites evidence for every claim.** "This pattern is safe" requires a line reference. "Tests cover this" requires a test name. No more "probably handled." +- **/plan-ceo-review now forces you to consider alternatives.** Step 0C-bis requires 2-3 implementation approaches before mode selection — one minimal, one ideal. You pick the approach, then the review runs against it. +- **Design docs flow downstream automatically.** `/brainstorm` writes design docs to `~/.gstack/projects/`. `/plan-ceo-review` and `/plan-eng-review` discover and read them during their pre-review audits. Branch-filtered lookup with fallback. +- **Design lineage tracking.** Brainstorm the same feature twice? The second design doc links to the first via a `Supersedes:` field. Trace how your design evolved. + +### Fixed +- Branch names with `/` (like `garrytan/better-process`) no longer break artifact filenames. Fixed in `/brainstorm` and `/plan-eng-review` test plan artifacts. + +### For contributors +- New structural tests for `/brainstorm` (Phase headers, Design Doc, Supersedes, Smart-skip) and `/debug` (Iron Law, Root Cause, Pattern Analysis, Hypothesis, DEBUG REPORT, 3-strike). +- Escalation protocol assertions added to all preamble skills (DONE_WITH_CONCERNS, BLOCKED, NEEDS_CONTEXT). +- Two new TODOs: design docs → Supabase team store sync (P2), /plan-design-review skill (P2). + ## 0.5.0 — 2026-03-16 - **Your site just got a design review.** `/plan-design-review` opens your site and reviews it like a senior product designer — typography, spacing, hierarchy, color, responsive, interactions, and AI slop detection. Get letter grades (A-F) per category, a dual headline "Design Score" + "AI Slop Score", and a structured first impression that doesn't pull punches. diff --git a/CLAUDE.md b/CLAUDE.md index 27523c7..1b3ed11 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -49,6 +49,8 @@ gstack/ ├── review/ # PR review skill ├── plan-ceo-review/ # /plan-ceo-review skill ├── plan-eng-review/ # /plan-eng-review skill +├── brainstorm/ # /brainstorm skill (Socratic design exploration) +├── debug/ # /debug skill (systematic root-cause debugging) ├── retro/ # Retrospective skill ├── document-release/ # /document-release skill (post-ship doc updates) ├── setup # One-time setup: build binary + symlink skills diff --git a/SKILL.md b/SKILL.md index 76007ee..e221801 100644 --- a/SKILL.md +++ b/SKILL.md @@ -81,6 +81,31 @@ Hey gstack team — ran into this while using /{skill-name}: Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +``` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +``` + # gstack browse: QA Testing & Dogfooding Persistent headless Chromium. First call auto-starts (~3s), then ~100-200ms per command. diff --git a/TODOS.md b/TODOS.md index d76f71c..7eac1e5 100644 --- a/TODOS.md +++ b/TODOS.md @@ -374,13 +374,25 @@ **Priority:** P3 **Depends on:** Ref staleness Parts 1+2 (shipped) -## Design Review +## Brainstorm / Design + +### Design docs → Supabase team store sync + +**What:** Add design docs (`*-design-*.md`) to the Supabase sync pipeline alongside test plans, retro snapshots, and QA reports. + +**Why:** Cross-team design discovery at scale. Local `~/.gstack/projects/$SLUG/` keyword-grep discovery works for same-machine users now, but Supabase sync makes it work across the whole team. Duplicate ideas surface, everyone sees what's been explored. + +**Context:** /brainstorm writes design docs to `~/.gstack/projects/$SLUG/`. The team store already syncs test plans, retro snapshots, QA reports. Design docs follow the same pattern — just add a sync adapter. -### /design-consultation interactive skill — SHIPPED +**Effort:** S +**Priority:** P2 +**Depends on:** `garrytan/team-supabase-store` branch landing on main + +## Design Review -~~**What:** Interactive skill that walks user through creating a DESIGN.md from scratch.~~ +### /plan-design-review + /qa-design-review + /design-consultation — SHIPPED -Shipped as `/design-consultation` on garrytan/design branch. Renamed from `/setup-design-md` to reflect the consultant approach (agent proposes a complete coherent system, user adjusts). Includes competitive research via WebSearch, combined font+color preview page, coherence validation, and LLM-judged E2E tests. +Shipped as v0.5.0 on main. Includes `/plan-design-review` (report-only design audit), `/qa-design-review` (audit + fix loop), and `/design-consultation` (interactive DESIGN.md creation). `{{DESIGN_METHODOLOGY}}` resolver provides shared 80-item design audit checklist. ## Document-Release diff --git a/VERSION b/VERSION index 8f0916f..a918a2a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.5.0 +0.6.0 diff --git a/brainstorm/SKILL.md b/brainstorm/SKILL.md new file mode 100644 index 0000000..64cb589 --- /dev/null +++ b/brainstorm/SKILL.md @@ -0,0 +1,315 @@ +--- +name: brainstorm +version: 1.0.0 +description: | + Socratic design exploration before implementation planning. Explores project + context, asks clarifying questions, forces alternatives, saves design doc. + Use before /plan-ceo-review or /plan-eng-review. +allowed-tools: + - Bash + - Read + - Grep + - Glob + - Write + - Edit + - AskUserQuestion +--- + + + +## Preamble (run first) + +```bash +_UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) +[ -n "$_UPD" ] && echo "$_UPD" || true +mkdir -p ~/.gstack/sessions +touch ~/.gstack/sessions/"$PPID" +_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +_CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) +_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") +echo "BRANCH: $_BRANCH" +``` + +If output shows `UPGRADE_AVAILABLE `: read `~/.claude/skills/gstack/gstack-upgrade/SKILL.md` and follow the "Inline upgrade flow" (auto-upgrade if configured, otherwise AskUserQuestion with 4 options, write snooze state if declined). If `JUST_UPGRADED `: tell user "Running gstack v{to} (just updated!)" and continue. + +## AskUserQuestion Format + +**ALWAYS follow this structure for every AskUserQuestion call:** +1. **Re-ground:** State the project, the current branch (use the `_BRANCH` value printed by the preamble — NOT any branch from conversation history or gitStatus), and the current plan/task. (1-2 sentences) +2. **Simplify:** Explain the problem in plain English a smart 16-year-old could follow. No raw function names, no internal jargon, no implementation details. Use concrete examples and analogies. Say what it DOES, not what it's called. +3. **Recommend:** `RECOMMENDATION: Choose [X] because [one-line reason]` +4. **Options:** Lettered options: `A) ... B) ... C) ...` + +Assume the user hasn't looked at this window in 20 minutes and doesn't have the code open. If you'd need to read the source to understand your own explanation, it's too complex. + +Per-skill instructions may add additional formatting rules on top of this baseline. + +## Contributor Mode + +If `_CONTRIB` is `true`: you are in **contributor mode**. You're a gstack user who also helps make it better. + +**At the end of each major workflow step** (not after every single command), reflect on the gstack tooling you used. Rate your experience 0 to 10. If it wasn't a 10, think about why. If there is an obvious, actionable bug OR an insightful, interesting thing that could have been done better by gstack code or skill markdown — file a field report. Maybe our contributor will help make us better! + +**Calibration — this is the bar:** For example, `$B js "await fetch(...)"` used to fail with `SyntaxError: await is only valid in async functions` because gstack didn't wrap expressions in async context. Small, but the input was reasonable and gstack should have handled it — that's the kind of thing worth filing. Things less consequential than this, ignore. + +**NOT worth filing:** user's app bugs, network errors to user's URL, auth failures on user's site, user's own JS logic bugs. + +**To file:** write `~/.gstack/contributor-logs/{slug}.md` with **all sections below** (do not truncate — include every section through the Date/Version footer): + +``` +# {Title} + +Hey gstack team — ran into this while using /{skill-name}: + +**What I was trying to do:** {what the user/agent was attempting} +**What happened instead:** {what actually happened} +**My rating:** {0-10} — {one sentence on why it wasn't a 10} + +## Steps to reproduce +1. {step} + +## Raw output +``` +{paste the actual error or unexpected output here} +``` + +## What would make this a 10 +{one sentence: what gstack should have done differently} + +**Date:** {YYYY-MM-DD} | **Version:** {gstack version} | **Skill:** /{skill} +``` + +Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" + +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +``` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +``` + +# Brainstorm — Design Exploration + +You are a **design thinking partner**. Your job is to ensure the problem is understood before solutions are proposed. This skill produces design docs, not code. + +**HARD GATE:** Do NOT invoke any implementation skill, write any code, scaffold any project, or take any implementation action. Your only output is a design document. + +--- + +## Phase 1: Context Gathering + +Understand the project and the area the user wants to change. + +```bash +SLUG=$(~/.claude/skills/gstack/browse/bin/remote-slug 2>/dev/null || basename "$(git rev-parse --show-toplevel 2>/dev/null || pwd)") +BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null | tr '/' '-' || echo 'no-branch') +``` + +1. Read `CLAUDE.md`, `TODOS.md` (if they exist). +2. Run `git log --oneline -30` and `git diff origin/main --stat 2>/dev/null` to understand recent context. +3. Use Grep/Glob to map the codebase areas most relevant to the user's request. +4. **List existing design docs for this project:** + ```bash + ls -t ~/.gstack/projects/$SLUG/*-design-*.md 2>/dev/null + ``` + If design docs exist, list them: "Prior designs for this project: [titles + dates]" + +Output: "Here's what I understand about this project and the area you want to change: ..." + +--- + +## Phase 2: Socratic Questioning + +Ask clarifying questions **ONE AT A TIME** via AskUserQuestion. The goal is to understand the problem deeply before proposing solutions. + +Questions to consider (ask only those whose answers aren't yet clear): +- **What problem are you solving?** (user outcome, not technical task) +- **Who is affected and how?** (scope of impact) +- **What constraints exist?** (time, tech debt, dependencies, team capacity) +- **What does success look like?** (measurable criteria) +- **What have you already tried or considered?** (avoid re-treading) + +**Smart-skip:** If the user's initial prompt already answers a question, skip it. Only ask questions whose answers aren't yet clear. + +**STOP** after each question. Wait for the response before asking the next. + +**Escape hatch:** If the user says "just do it," expresses impatience, or provides a fully formed plan → fast-track to Phase 4 (Alternatives Generation). If user provides a fully formed plan, skip Phase 2 entirely but still run Phase 3 and Phase 4. + +--- + +## Phase 2.5: Related Design Discovery + +After the user states the problem (first question in Phase 2), search existing design docs for keyword overlap. + +Extract 3-5 significant keywords from the user's problem statement and grep across design docs: +```bash +grep -li "\|\|" ~/.gstack/projects/$SLUG/*-design-*.md 2>/dev/null +``` + +If matches found, read the matching design docs and surface them: +- "FYI: Related design found — '{title}' by {user} on {date} (branch: {branch}). Key overlap: {1-line summary of relevant section}." +- Ask via AskUserQuestion: "Should we build on this prior design or start fresh?" + +This enables cross-team discovery — multiple users exploring the same project will see each other's design docs in `~/.gstack/projects/`. + +If no matches found, proceed silently. + +--- + +## Phase 3: Premise Challenge + +Before proposing solutions, challenge the premises: + +1. **Is this the right problem?** Could a different framing yield a dramatically simpler or more impactful solution? +2. **What happens if we do nothing?** Real pain point or hypothetical one? +3. **What existing code already partially solves this?** Map existing patterns, utilities, and flows that could be reused. + +Output premises as clear statements the user must agree with before proceeding: +``` +PREMISES: +1. [statement] — agree/disagree? +2. [statement] — agree/disagree? +3. [statement] — agree/disagree? +``` + +Use AskUserQuestion to confirm. If the user disagrees with a premise, revise understanding and loop back. + +--- + +## Phase 4: Alternatives Generation (MANDATORY) + +Produce 2-3 distinct implementation approaches. This is NOT optional. + +For each approach: +``` +APPROACH A: [Name] + Summary: [1-2 sentences] + Effort: [S/M/L/XL] + Risk: [Low/Med/High] + Pros: [2-3 bullets] + Cons: [2-3 bullets] + Reuses: [existing code/patterns leveraged] + +APPROACH B: [Name] + ... + +APPROACH C: [Name] (optional — include if a meaningfully different path exists) + ... +``` + +Rules: +- At least 2 approaches required. 3 preferred for non-trivial designs. +- One must be the **"minimal viable"** (fewest files, smallest diff, ships fastest). +- One must be the **"ideal architecture"** (best long-term trajectory, most elegant). +- One can be **creative/lateral** (unexpected approach, different framing of the problem). + +**RECOMMENDATION:** Choose [X] because [one-line reason]. + +Present via AskUserQuestion. Do NOT proceed without user approval of the approach. + +--- + +## Phase 5: Design Doc + +Write the design document to the project directory. + +```bash +SLUG=$(~/.claude/skills/gstack/browse/bin/remote-slug 2>/dev/null || basename "$(git rev-parse --show-toplevel 2>/dev/null || pwd)") +BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null | tr '/' '-' || echo 'no-branch') +USER=$(whoami) +DATETIME=$(date +%Y%m%d-%H%M%S) +mkdir -p ~/.gstack/projects/$SLUG +``` + +**Design lineage:** Before writing, check for existing design docs on this branch: +```bash +PRIOR=$(ls -t ~/.gstack/projects/$SLUG/*-$BRANCH-design-*.md 2>/dev/null | head -1) +``` +If `$PRIOR` exists, the new doc gets a `Supersedes:` field referencing it. This creates a revision chain — you can trace how a design evolved across brainstorm sessions. + +Write to `~/.gstack/projects/{slug}/{user}-{branch}-design-{datetime}.md`: + +```markdown +# Design: {title} + +Generated by /brainstorm on {date} +Branch: {branch} +Repo: {owner/repo} +Status: DRAFT +Supersedes: {prior filename — omit this line if first design on this branch} + +## Problem Statement +{from Phase 2} + +## Constraints +{from Phase 2} + +## Premises +{from Phase 3} + +## Approaches Considered +### Approach A: {name} +{from Phase 4} +### Approach B: {name} +{from Phase 4} + +## Recommended Approach +{chosen approach with rationale} + +## Open Questions +{any unresolved questions from the brainstorm} + +## Success Criteria +{measurable criteria from Phase 2} + +## Dependencies +{blockers, prerequisites, related work} +``` + +Present the design doc to the user via AskUserQuestion: +- A) Approve — mark Status: APPROVED and proceed to handoff +- B) Revise — specify which sections need changes (loop back to revise those sections) +- C) Start over — return to Phase 2 + +--- + +## Phase 6: Handoff + +Once the design doc is APPROVED, suggest the next step: + +- **`/plan-ceo-review`** for ambitious features (EXPANSION mode) — rethink the problem, find the 10-star product +- **`/plan-eng-review`** for well-scoped implementation planning — lock in architecture, tests, edge cases +- **`/plan-design-review`** for visual/UX design review (coming soon) + +The design doc at `~/.gstack/projects/` is automatically discoverable by downstream skills — they will read it during their pre-review system audit. + +--- + +## Important Rules + +- **Never start implementation.** This skill produces design docs, not code. Not even scaffolding. +- **Questions ONE AT A TIME.** Never batch multiple questions into one AskUserQuestion. +- **If user provides a fully formed plan:** skip Phase 2 (Socratic Questioning) but still run Phase 3 (Premise Challenge) and Phase 4 (Alternatives). Even "simple" plans benefit from premise checking and forced alternatives. +- **Completion status:** + - DONE — design doc APPROVED + - DONE_WITH_CONCERNS — design doc approved but with open questions listed + - NEEDS_CONTEXT — user left questions unanswered, design incomplete diff --git a/brainstorm/SKILL.md.tmpl b/brainstorm/SKILL.md.tmpl new file mode 100644 index 0000000..86031e1 --- /dev/null +++ b/brainstorm/SKILL.md.tmpl @@ -0,0 +1,225 @@ +--- +name: brainstorm +version: 1.0.0 +description: | + Socratic design exploration before implementation planning. Explores project + context, asks clarifying questions, forces alternatives, saves design doc. + Use before /plan-ceo-review or /plan-eng-review. +allowed-tools: + - Bash + - Read + - Grep + - Glob + - Write + - Edit + - AskUserQuestion +--- + +{{PREAMBLE}} + +# Brainstorm — Design Exploration + +You are a **design thinking partner**. Your job is to ensure the problem is understood before solutions are proposed. This skill produces design docs, not code. + +**HARD GATE:** Do NOT invoke any implementation skill, write any code, scaffold any project, or take any implementation action. Your only output is a design document. + +--- + +## Phase 1: Context Gathering + +Understand the project and the area the user wants to change. + +```bash +SLUG=$(~/.claude/skills/gstack/browse/bin/remote-slug 2>/dev/null || basename "$(git rev-parse --show-toplevel 2>/dev/null || pwd)") +BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null | tr '/' '-' || echo 'no-branch') +``` + +1. Read `CLAUDE.md`, `TODOS.md` (if they exist). +2. Run `git log --oneline -30` and `git diff origin/main --stat 2>/dev/null` to understand recent context. +3. Use Grep/Glob to map the codebase areas most relevant to the user's request. +4. **List existing design docs for this project:** + ```bash + ls -t ~/.gstack/projects/$SLUG/*-design-*.md 2>/dev/null + ``` + If design docs exist, list them: "Prior designs for this project: [titles + dates]" + +Output: "Here's what I understand about this project and the area you want to change: ..." + +--- + +## Phase 2: Socratic Questioning + +Ask clarifying questions **ONE AT A TIME** via AskUserQuestion. The goal is to understand the problem deeply before proposing solutions. + +Questions to consider (ask only those whose answers aren't yet clear): +- **What problem are you solving?** (user outcome, not technical task) +- **Who is affected and how?** (scope of impact) +- **What constraints exist?** (time, tech debt, dependencies, team capacity) +- **What does success look like?** (measurable criteria) +- **What have you already tried or considered?** (avoid re-treading) + +**Smart-skip:** If the user's initial prompt already answers a question, skip it. Only ask questions whose answers aren't yet clear. + +**STOP** after each question. Wait for the response before asking the next. + +**Escape hatch:** If the user says "just do it," expresses impatience, or provides a fully formed plan → fast-track to Phase 4 (Alternatives Generation). If user provides a fully formed plan, skip Phase 2 entirely but still run Phase 3 and Phase 4. + +--- + +## Phase 2.5: Related Design Discovery + +After the user states the problem (first question in Phase 2), search existing design docs for keyword overlap. + +Extract 3-5 significant keywords from the user's problem statement and grep across design docs: +```bash +grep -li "\|\|" ~/.gstack/projects/$SLUG/*-design-*.md 2>/dev/null +``` + +If matches found, read the matching design docs and surface them: +- "FYI: Related design found — '{title}' by {user} on {date} (branch: {branch}). Key overlap: {1-line summary of relevant section}." +- Ask via AskUserQuestion: "Should we build on this prior design or start fresh?" + +This enables cross-team discovery — multiple users exploring the same project will see each other's design docs in `~/.gstack/projects/`. + +If no matches found, proceed silently. + +--- + +## Phase 3: Premise Challenge + +Before proposing solutions, challenge the premises: + +1. **Is this the right problem?** Could a different framing yield a dramatically simpler or more impactful solution? +2. **What happens if we do nothing?** Real pain point or hypothetical one? +3. **What existing code already partially solves this?** Map existing patterns, utilities, and flows that could be reused. + +Output premises as clear statements the user must agree with before proceeding: +``` +PREMISES: +1. [statement] — agree/disagree? +2. [statement] — agree/disagree? +3. [statement] — agree/disagree? +``` + +Use AskUserQuestion to confirm. If the user disagrees with a premise, revise understanding and loop back. + +--- + +## Phase 4: Alternatives Generation (MANDATORY) + +Produce 2-3 distinct implementation approaches. This is NOT optional. + +For each approach: +``` +APPROACH A: [Name] + Summary: [1-2 sentences] + Effort: [S/M/L/XL] + Risk: [Low/Med/High] + Pros: [2-3 bullets] + Cons: [2-3 bullets] + Reuses: [existing code/patterns leveraged] + +APPROACH B: [Name] + ... + +APPROACH C: [Name] (optional — include if a meaningfully different path exists) + ... +``` + +Rules: +- At least 2 approaches required. 3 preferred for non-trivial designs. +- One must be the **"minimal viable"** (fewest files, smallest diff, ships fastest). +- One must be the **"ideal architecture"** (best long-term trajectory, most elegant). +- One can be **creative/lateral** (unexpected approach, different framing of the problem). + +**RECOMMENDATION:** Choose [X] because [one-line reason]. + +Present via AskUserQuestion. Do NOT proceed without user approval of the approach. + +--- + +## Phase 5: Design Doc + +Write the design document to the project directory. + +```bash +SLUG=$(~/.claude/skills/gstack/browse/bin/remote-slug 2>/dev/null || basename "$(git rev-parse --show-toplevel 2>/dev/null || pwd)") +BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null | tr '/' '-' || echo 'no-branch') +USER=$(whoami) +DATETIME=$(date +%Y%m%d-%H%M%S) +mkdir -p ~/.gstack/projects/$SLUG +``` + +**Design lineage:** Before writing, check for existing design docs on this branch: +```bash +PRIOR=$(ls -t ~/.gstack/projects/$SLUG/*-$BRANCH-design-*.md 2>/dev/null | head -1) +``` +If `$PRIOR` exists, the new doc gets a `Supersedes:` field referencing it. This creates a revision chain — you can trace how a design evolved across brainstorm sessions. + +Write to `~/.gstack/projects/{slug}/{user}-{branch}-design-{datetime}.md`: + +```markdown +# Design: {title} + +Generated by /brainstorm on {date} +Branch: {branch} +Repo: {owner/repo} +Status: DRAFT +Supersedes: {prior filename — omit this line if first design on this branch} + +## Problem Statement +{from Phase 2} + +## Constraints +{from Phase 2} + +## Premises +{from Phase 3} + +## Approaches Considered +### Approach A: {name} +{from Phase 4} +### Approach B: {name} +{from Phase 4} + +## Recommended Approach +{chosen approach with rationale} + +## Open Questions +{any unresolved questions from the brainstorm} + +## Success Criteria +{measurable criteria from Phase 2} + +## Dependencies +{blockers, prerequisites, related work} +``` + +Present the design doc to the user via AskUserQuestion: +- A) Approve — mark Status: APPROVED and proceed to handoff +- B) Revise — specify which sections need changes (loop back to revise those sections) +- C) Start over — return to Phase 2 + +--- + +## Phase 6: Handoff + +Once the design doc is APPROVED, suggest the next step: + +- **`/plan-ceo-review`** for ambitious features (EXPANSION mode) — rethink the problem, find the 10-star product +- **`/plan-eng-review`** for well-scoped implementation planning — lock in architecture, tests, edge cases +- **`/plan-design-review`** for visual/UX design review (coming soon) + +The design doc at `~/.gstack/projects/` is automatically discoverable by downstream skills — they will read it during their pre-review system audit. + +--- + +## Important Rules + +- **Never start implementation.** This skill produces design docs, not code. Not even scaffolding. +- **Questions ONE AT A TIME.** Never batch multiple questions into one AskUserQuestion. +- **If user provides a fully formed plan:** skip Phase 2 (Socratic Questioning) but still run Phase 3 (Premise Challenge) and Phase 4 (Alternatives). Even "simple" plans benefit from premise checking and forced alternatives. +- **Completion status:** + - DONE — design doc APPROVED + - DONE_WITH_CONCERNS — design doc approved but with open questions listed + - NEEDS_CONTEXT — user left questions unanswered, design incomplete diff --git a/browse/SKILL.md b/browse/SKILL.md index dd473dc..0d0566a 100644 --- a/browse/SKILL.md +++ b/browse/SKILL.md @@ -81,6 +81,31 @@ Hey gstack team — ran into this while using /{skill-name}: Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +``` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +``` + # browse: QA Testing & Dogfooding Persistent headless Chromium. First call auto-starts (~3s), then ~100ms per command. diff --git a/debug/SKILL.md b/debug/SKILL.md new file mode 100644 index 0000000..56c7566 --- /dev/null +++ b/debug/SKILL.md @@ -0,0 +1,238 @@ +--- +name: debug +version: 1.0.0 +description: | + Systematic debugging with root cause investigation. Four phases: investigate, + analyze, hypothesize, implement. Iron Law: no fixes without root cause. +allowed-tools: + - Bash + - Read + - Write + - Edit + - Grep + - Glob + - AskUserQuestion +--- + + + +## Preamble (run first) + +```bash +_UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true) +[ -n "$_UPD" ] && echo "$_UPD" || true +mkdir -p ~/.gstack/sessions +touch ~/.gstack/sessions/"$PPID" +_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ') +find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true +_CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true) +_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") +echo "BRANCH: $_BRANCH" +``` + +If output shows `UPGRADE_AVAILABLE `: read `~/.claude/skills/gstack/gstack-upgrade/SKILL.md` and follow the "Inline upgrade flow" (auto-upgrade if configured, otherwise AskUserQuestion with 4 options, write snooze state if declined). If `JUST_UPGRADED `: tell user "Running gstack v{to} (just updated!)" and continue. + +## AskUserQuestion Format + +**ALWAYS follow this structure for every AskUserQuestion call:** +1. **Re-ground:** State the project, the current branch (use the `_BRANCH` value printed by the preamble — NOT any branch from conversation history or gitStatus), and the current plan/task. (1-2 sentences) +2. **Simplify:** Explain the problem in plain English a smart 16-year-old could follow. No raw function names, no internal jargon, no implementation details. Use concrete examples and analogies. Say what it DOES, not what it's called. +3. **Recommend:** `RECOMMENDATION: Choose [X] because [one-line reason]` +4. **Options:** Lettered options: `A) ... B) ... C) ...` + +Assume the user hasn't looked at this window in 20 minutes and doesn't have the code open. If you'd need to read the source to understand your own explanation, it's too complex. + +Per-skill instructions may add additional formatting rules on top of this baseline. + +## Contributor Mode + +If `_CONTRIB` is `true`: you are in **contributor mode**. You're a gstack user who also helps make it better. + +**At the end of each major workflow step** (not after every single command), reflect on the gstack tooling you used. Rate your experience 0 to 10. If it wasn't a 10, think about why. If there is an obvious, actionable bug OR an insightful, interesting thing that could have been done better by gstack code or skill markdown — file a field report. Maybe our contributor will help make us better! + +**Calibration — this is the bar:** For example, `$B js "await fetch(...)"` used to fail with `SyntaxError: await is only valid in async functions` because gstack didn't wrap expressions in async context. Small, but the input was reasonable and gstack should have handled it — that's the kind of thing worth filing. Things less consequential than this, ignore. + +**NOT worth filing:** user's app bugs, network errors to user's URL, auth failures on user's site, user's own JS logic bugs. + +**To file:** write `~/.gstack/contributor-logs/{slug}.md` with **all sections below** (do not truncate — include every section through the Date/Version footer): + +``` +# {Title} + +Hey gstack team — ran into this while using /{skill-name}: + +**What I was trying to do:** {what the user/agent was attempting} +**What happened instead:** {what actually happened} +**My rating:** {0-10} — {one sentence on why it wasn't a 10} + +## Steps to reproduce +1. {step} + +## Raw output +``` +{paste the actual error or unexpected output here} +``` + +## What would make this a 10 +{one sentence: what gstack should have done differently} + +**Date:** {YYYY-MM-DD} | **Version:** {gstack version} | **Skill:** /{skill} +``` + +Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" + +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +``` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +``` + +# Systematic Debugging + +## Iron Law + +**NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST.** + +Fixing symptoms creates whack-a-mole debugging. Every fix that doesn't address root cause makes the next bug harder to find. Find the root cause, then fix it. + +--- + +## Phase 1: Root Cause Investigation + +Gather context before forming any hypothesis. + +1. **Collect symptoms:** Read the error messages, stack traces, and reproduction steps. If the user hasn't provided enough context, ask ONE question at a time via AskUserQuestion. + +2. **Read the code:** Trace the code path from the symptom back to potential causes. Use Grep to find all references, Read to understand the logic. + +3. **Check recent changes:** + ```bash + git log --oneline -20 -- + ``` + Was this working before? What changed? A regression means the root cause is in the diff. + +4. **Reproduce:** Can you trigger the bug deterministically? If not, gather more evidence before proceeding. + +Output: **"Root cause hypothesis: ..."** — a specific, testable claim about what is wrong and why. + +--- + +## Phase 2: Pattern Analysis + +Check if this bug matches a known pattern: + +| Pattern | Signature | Where to look | +|---------|-----------|---------------| +| Race condition | Intermittent, timing-dependent | Concurrent access to shared state | +| Nil/null propagation | NoMethodError, TypeError | Missing guards on optional values | +| State corruption | Inconsistent data, partial updates | Transactions, callbacks, hooks | +| Integration failure | Timeout, unexpected response | External API calls, service boundaries | +| Configuration drift | Works locally, fails in staging/prod | Env vars, feature flags, DB state | +| Stale cache | Shows old data, fixes on cache clear | Redis, CDN, browser cache, Turbo | + +Also check: +- `TODOS.md` for related known issues +- `git log` for prior fixes in the same area — **recurring bugs in the same files are an architectural smell**, not a coincidence + +--- + +## Phase 3: Hypothesis Testing + +Before writing ANY fix, verify your hypothesis. + +1. **Confirm the hypothesis:** Add a temporary log statement, assertion, or debug output at the suspected root cause. Run the reproduction. Does the evidence match? + +2. **If the hypothesis is wrong:** Return to Phase 1. Gather more evidence. Do not guess. + +3. **3-strike rule:** If 3 hypotheses fail, **STOP**. Use AskUserQuestion: + ``` + 3 hypotheses tested, none match. This may be an architectural issue + rather than a simple bug. + + A) Continue investigating — I have a new hypothesis: [describe] + B) Escalate for human review — this needs someone who knows the system + C) Add logging and wait — instrument the area and catch it next time + ``` + +**Red flags** — if you see any of these, slow down: +- "Quick fix for now" — there is no "for now." Fix it right or escalate. +- Proposing a fix before tracing data flow — you're guessing. +- Each fix reveals a new problem elsewhere — wrong layer, not wrong code. + +--- + +## Phase 4: Implementation + +Once root cause is confirmed: + +1. **Fix the root cause, not the symptom.** The smallest change that eliminates the actual problem. + +2. **Minimal diff:** Fewest files touched, fewest lines changed. Resist the urge to refactor adjacent code. + +3. **Write a regression test** that: + - **Fails** without the fix (proves the test is meaningful) + - **Passes** with the fix (proves the fix works) + +4. **Run the full test suite.** Paste the output. No regressions allowed. + +5. **If the fix touches >5 files:** Use AskUserQuestion to flag the blast radius: + ``` + This fix touches N files. That's a large blast radius for a bug fix. + A) Proceed — the root cause genuinely spans these files + B) Split — fix the critical path now, defer the rest + C) Rethink — maybe there's a more targeted approach + ``` + +--- + +## Phase 5: Verification & Report + +**Fresh verification:** Reproduce the original bug scenario and confirm it's fixed. This is not optional. + +Run the test suite and paste the output. + +Output a structured debug report: +``` +DEBUG REPORT +════════════════════════════════════════ +Symptom: [what the user observed] +Root cause: [what was actually wrong] +Fix: [what was changed, with file:line references] +Evidence: [test output, reproduction attempt showing fix works] +Regression test: [file:line of the new test] +Related: [TODOS.md items, prior bugs in same area, architectural notes] +Status: DONE | DONE_WITH_CONCERNS | BLOCKED +════════════════════════════════════════ +``` + +--- + +## Important Rules + +- **3+ failed fix attempts → STOP and question the architecture.** Wrong architecture, not failed hypothesis. +- **Never apply a fix you cannot verify.** If you can't reproduce and confirm, don't ship it. +- **Never say "this should fix it."** Verify and prove it. Run the tests. +- **If fix touches >5 files → AskUserQuestion** about blast radius before proceeding. +- **Completion status:** + - DONE — root cause found, fix applied, regression test written, all tests pass + - DONE_WITH_CONCERNS — fixed but cannot fully verify (e.g., intermittent bug, requires staging) + - BLOCKED — root cause unclear after investigation, escalated diff --git a/debug/SKILL.md.tmpl b/debug/SKILL.md.tmpl new file mode 100644 index 0000000..312d242 --- /dev/null +++ b/debug/SKILL.md.tmpl @@ -0,0 +1,148 @@ +--- +name: debug +version: 1.0.0 +description: | + Systematic debugging with root cause investigation. Four phases: investigate, + analyze, hypothesize, implement. Iron Law: no fixes without root cause. +allowed-tools: + - Bash + - Read + - Write + - Edit + - Grep + - Glob + - AskUserQuestion +--- + +{{PREAMBLE}} + +# Systematic Debugging + +## Iron Law + +**NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST.** + +Fixing symptoms creates whack-a-mole debugging. Every fix that doesn't address root cause makes the next bug harder to find. Find the root cause, then fix it. + +--- + +## Phase 1: Root Cause Investigation + +Gather context before forming any hypothesis. + +1. **Collect symptoms:** Read the error messages, stack traces, and reproduction steps. If the user hasn't provided enough context, ask ONE question at a time via AskUserQuestion. + +2. **Read the code:** Trace the code path from the symptom back to potential causes. Use Grep to find all references, Read to understand the logic. + +3. **Check recent changes:** + ```bash + git log --oneline -20 -- + ``` + Was this working before? What changed? A regression means the root cause is in the diff. + +4. **Reproduce:** Can you trigger the bug deterministically? If not, gather more evidence before proceeding. + +Output: **"Root cause hypothesis: ..."** — a specific, testable claim about what is wrong and why. + +--- + +## Phase 2: Pattern Analysis + +Check if this bug matches a known pattern: + +| Pattern | Signature | Where to look | +|---------|-----------|---------------| +| Race condition | Intermittent, timing-dependent | Concurrent access to shared state | +| Nil/null propagation | NoMethodError, TypeError | Missing guards on optional values | +| State corruption | Inconsistent data, partial updates | Transactions, callbacks, hooks | +| Integration failure | Timeout, unexpected response | External API calls, service boundaries | +| Configuration drift | Works locally, fails in staging/prod | Env vars, feature flags, DB state | +| Stale cache | Shows old data, fixes on cache clear | Redis, CDN, browser cache, Turbo | + +Also check: +- `TODOS.md` for related known issues +- `git log` for prior fixes in the same area — **recurring bugs in the same files are an architectural smell**, not a coincidence + +--- + +## Phase 3: Hypothesis Testing + +Before writing ANY fix, verify your hypothesis. + +1. **Confirm the hypothesis:** Add a temporary log statement, assertion, or debug output at the suspected root cause. Run the reproduction. Does the evidence match? + +2. **If the hypothesis is wrong:** Return to Phase 1. Gather more evidence. Do not guess. + +3. **3-strike rule:** If 3 hypotheses fail, **STOP**. Use AskUserQuestion: + ``` + 3 hypotheses tested, none match. This may be an architectural issue + rather than a simple bug. + + A) Continue investigating — I have a new hypothesis: [describe] + B) Escalate for human review — this needs someone who knows the system + C) Add logging and wait — instrument the area and catch it next time + ``` + +**Red flags** — if you see any of these, slow down: +- "Quick fix for now" — there is no "for now." Fix it right or escalate. +- Proposing a fix before tracing data flow — you're guessing. +- Each fix reveals a new problem elsewhere — wrong layer, not wrong code. + +--- + +## Phase 4: Implementation + +Once root cause is confirmed: + +1. **Fix the root cause, not the symptom.** The smallest change that eliminates the actual problem. + +2. **Minimal diff:** Fewest files touched, fewest lines changed. Resist the urge to refactor adjacent code. + +3. **Write a regression test** that: + - **Fails** without the fix (proves the test is meaningful) + - **Passes** with the fix (proves the fix works) + +4. **Run the full test suite.** Paste the output. No regressions allowed. + +5. **If the fix touches >5 files:** Use AskUserQuestion to flag the blast radius: + ``` + This fix touches N files. That's a large blast radius for a bug fix. + A) Proceed — the root cause genuinely spans these files + B) Split — fix the critical path now, defer the rest + C) Rethink — maybe there's a more targeted approach + ``` + +--- + +## Phase 5: Verification & Report + +**Fresh verification:** Reproduce the original bug scenario and confirm it's fixed. This is not optional. + +Run the test suite and paste the output. + +Output a structured debug report: +``` +DEBUG REPORT +════════════════════════════════════════ +Symptom: [what the user observed] +Root cause: [what was actually wrong] +Fix: [what was changed, with file:line references] +Evidence: [test output, reproduction attempt showing fix works] +Regression test: [file:line of the new test] +Related: [TODOS.md items, prior bugs in same area, architectural notes] +Status: DONE | DONE_WITH_CONCERNS | BLOCKED +════════════════════════════════════════ +``` + +--- + +## Important Rules + +- **3+ failed fix attempts → STOP and question the architecture.** Wrong architecture, not failed hypothesis. +- **Never apply a fix you cannot verify.** If you can't reproduce and confirm, don't ship it. +- **Never say "this should fix it."** Verify and prove it. Run the tests. +- **If fix touches >5 files → AskUserQuestion** about blast radius before proceeding. +- **Completion status:** + - DONE — root cause found, fix applied, regression test written, all tests pass + - DONE_WITH_CONCERNS — fixed but cannot fully verify (e.g., intermittent bug, requires staging) + - BLOCKED — root cause unclear after investigation, escalated diff --git a/design-consultation/SKILL.md b/design-consultation/SKILL.md index d92d47f..47f4855 100644 --- a/design-consultation/SKILL.md +++ b/design-consultation/SKILL.md @@ -84,6 +84,31 @@ Hey gstack team — ran into this while using /{skill-name}: Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +``` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +``` + # /design-consultation: Your Design System, Built Together You are a senior product designer with strong opinions about typography, color, and visual systems. You don't present menus — you listen, think, research, and propose. You're opinionated but not dogmatic. You explain your reasoning and welcome pushback. diff --git a/document-release/SKILL.md b/document-release/SKILL.md index 694d64d..e4448c6 100644 --- a/document-release/SKILL.md +++ b/document-release/SKILL.md @@ -82,6 +82,31 @@ Hey gstack team — ran into this while using /{skill-name}: Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +``` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +``` + ## Step 0: Detect base branch Determine which branch this PR targets. Use the result as "the base branch" in all subsequent steps. diff --git a/plan-ceo-review/SKILL.md b/plan-ceo-review/SKILL.md index b05db5e..dc1de1c 100644 --- a/plan-ceo-review/SKILL.md +++ b/plan-ceo-review/SKILL.md @@ -81,6 +81,31 @@ Hey gstack team — ran into this while using /{skill-name}: Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +``` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +``` + ## Step 0: Detect base branch Determine which branch this PR targets. Use the result as "the base branch" in all subsequent steps. @@ -149,7 +174,19 @@ git stash list # Any stashed work grep -r "TODO\|FIXME\|HACK\|XXX" --include="*.rb" --include="*.js" -l find . -name "*.rb" -newer Gemfile.lock | head -20 # Recently touched files ``` -Then read CLAUDE.md, TODOS.md, and any existing architecture docs. When reading TODOS.md, specifically: +Then read CLAUDE.md, TODOS.md, and any existing architecture docs. + +**Design doc check:** +```bash +SLUG=$(~/.claude/skills/gstack/browse/bin/remote-slug 2>/dev/null || basename "$(git rev-parse --show-toplevel 2>/dev/null || pwd)") +BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null | tr '/' '-' || echo 'no-branch') +DESIGN=$(ls -t ~/.gstack/projects/$SLUG/*-$BRANCH-design-*.md 2>/dev/null | head -1) +[ -z "$DESIGN" ] && DESIGN=$(ls -t ~/.gstack/projects/$SLUG/*-design-*.md 2>/dev/null | head -1) +[ -n "$DESIGN" ] && echo "Design doc found: $DESIGN" || echo "No design doc found" +``` +If a design doc exists (from `/brainstorm`), read it. Use it as the source of truth for the problem statement, constraints, and chosen approach. If it has a `Supersedes:` field, note that this is a revised design. + +When reading TODOS.md, specifically: * Note any TODOs this plan touches, blocks, or unlocks * Check if deferred work from prior reviews relates to this plan * Flag dependencies: does this plan enable or depend on deferred items? @@ -186,6 +223,36 @@ Describe the ideal end state of this system 12 months from now. Does this plan m [describe] ---> [describe delta] ---> [describe target] ``` +### 0C-bis. Implementation Alternatives (MANDATORY) + +Before selecting a mode (0F), produce 2-3 distinct implementation approaches. This is NOT optional — every plan must consider alternatives. + +For each approach: +``` +APPROACH A: [Name] + Summary: [1-2 sentences] + Effort: [S/M/L/XL] + Risk: [Low/Med/High] + Pros: [2-3 bullets] + Cons: [2-3 bullets] + Reuses: [existing code/patterns leveraged] + +APPROACH B: [Name] + ... + +APPROACH C: [Name] (optional — include if a meaningfully different path exists) + ... +``` + +**RECOMMENDATION:** Choose [X] because [one-line reason mapped to engineering preferences]. + +Rules: +- At least 2 approaches required. 3 preferred for non-trivial plans. +- One approach must be the "minimal viable" (fewest files, smallest diff). +- One approach must be the "ideal architecture" (best long-term trajectory). +- If only one approach exists, explain concretely why alternatives were eliminated. +- Do NOT proceed to mode selection (0F) without user approval of the chosen approach. + ### 0D. Mode-Specific Analysis **For SCOPE EXPANSION** — run all three: 1. 10x check: What's the version that's 10x more ambitious and delivers 10x more value for 2x the effort? Describe it concretely. @@ -223,6 +290,8 @@ Context-dependent defaults: * Plan touching >15 files → suggest REDUCTION unless user pushes back * User says "go big" / "ambitious" / "cathedral" → EXPANSION, no question +After mode is selected, confirm which implementation approach (from 0C-bis) applies under the chosen mode. EXPANSION may favor the ideal architecture approach; REDUCTION may favor the minimal viable approach. + Once selected, commit fully. Do not silently drift. **STOP.** AskUserQuestion once per issue. Do NOT batch. Recommend + WHY. If no issues or fix is obvious, state what you'll do and move on — don't waste a question. Do NOT proceed until user responds. diff --git a/plan-ceo-review/SKILL.md.tmpl b/plan-ceo-review/SKILL.md.tmpl index 9902faf..5ac1887 100644 --- a/plan-ceo-review/SKILL.md.tmpl +++ b/plan-ceo-review/SKILL.md.tmpl @@ -67,7 +67,19 @@ git stash list # Any stashed work grep -r "TODO\|FIXME\|HACK\|XXX" --include="*.rb" --include="*.js" -l find . -name "*.rb" -newer Gemfile.lock | head -20 # Recently touched files ``` -Then read CLAUDE.md, TODOS.md, and any existing architecture docs. When reading TODOS.md, specifically: +Then read CLAUDE.md, TODOS.md, and any existing architecture docs. + +**Design doc check:** +```bash +SLUG=$(~/.claude/skills/gstack/browse/bin/remote-slug 2>/dev/null || basename "$(git rev-parse --show-toplevel 2>/dev/null || pwd)") +BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null | tr '/' '-' || echo 'no-branch') +DESIGN=$(ls -t ~/.gstack/projects/$SLUG/*-$BRANCH-design-*.md 2>/dev/null | head -1) +[ -z "$DESIGN" ] && DESIGN=$(ls -t ~/.gstack/projects/$SLUG/*-design-*.md 2>/dev/null | head -1) +[ -n "$DESIGN" ] && echo "Design doc found: $DESIGN" || echo "No design doc found" +``` +If a design doc exists (from `/brainstorm`), read it. Use it as the source of truth for the problem statement, constraints, and chosen approach. If it has a `Supersedes:` field, note that this is a revised design. + +When reading TODOS.md, specifically: * Note any TODOs this plan touches, blocks, or unlocks * Check if deferred work from prior reviews relates to this plan * Flag dependencies: does this plan enable or depend on deferred items? @@ -104,6 +116,36 @@ Describe the ideal end state of this system 12 months from now. Does this plan m [describe] ---> [describe delta] ---> [describe target] ``` +### 0C-bis. Implementation Alternatives (MANDATORY) + +Before selecting a mode (0F), produce 2-3 distinct implementation approaches. This is NOT optional — every plan must consider alternatives. + +For each approach: +``` +APPROACH A: [Name] + Summary: [1-2 sentences] + Effort: [S/M/L/XL] + Risk: [Low/Med/High] + Pros: [2-3 bullets] + Cons: [2-3 bullets] + Reuses: [existing code/patterns leveraged] + +APPROACH B: [Name] + ... + +APPROACH C: [Name] (optional — include if a meaningfully different path exists) + ... +``` + +**RECOMMENDATION:** Choose [X] because [one-line reason mapped to engineering preferences]. + +Rules: +- At least 2 approaches required. 3 preferred for non-trivial plans. +- One approach must be the "minimal viable" (fewest files, smallest diff). +- One approach must be the "ideal architecture" (best long-term trajectory). +- If only one approach exists, explain concretely why alternatives were eliminated. +- Do NOT proceed to mode selection (0F) without user approval of the chosen approach. + ### 0D. Mode-Specific Analysis **For SCOPE EXPANSION** — run all three: 1. 10x check: What's the version that's 10x more ambitious and delivers 10x more value for 2x the effort? Describe it concretely. @@ -141,6 +183,8 @@ Context-dependent defaults: * Plan touching >15 files → suggest REDUCTION unless user pushes back * User says "go big" / "ambitious" / "cathedral" → EXPANSION, no question +After mode is selected, confirm which implementation approach (from 0C-bis) applies under the chosen mode. EXPANSION may favor the ideal architecture approach; REDUCTION may favor the minimal viable approach. + Once selected, commit fully. Do not silently drift. **STOP.** AskUserQuestion once per issue. Do NOT batch. Recommend + WHY. If no issues or fix is obvious, state what you'll do and move on — don't waste a question. Do NOT proceed until user responds. diff --git a/plan-design-review/SKILL.md b/plan-design-review/SKILL.md index c0ca951..7c1178e 100644 --- a/plan-design-review/SKILL.md +++ b/plan-design-review/SKILL.md @@ -82,6 +82,31 @@ Hey gstack team — ran into this while using /{skill-name}: Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +``` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +``` + # /plan-design-review: Designer's Eye Audit You are a senior product designer reviewing a live site. You have exacting visual standards, strong opinions about typography and spacing, and zero tolerance for generic or AI-generated-looking interfaces. You do NOT care whether things "work." You care whether they feel right, look intentional, and respect the user. diff --git a/plan-eng-review/SKILL.md b/plan-eng-review/SKILL.md index 4cd8f48..f0247fa 100644 --- a/plan-eng-review/SKILL.md +++ b/plan-eng-review/SKILL.md @@ -81,6 +81,31 @@ Hey gstack team — ran into this while using /{skill-name}: Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +``` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +``` + # Plan Review Mode Review this plan thoroughly before making any code changes. For every issue or recommendation, explain the concrete tradeoffs, give me an opinionated recommendation, and ask for my input before assuming a direction. @@ -103,6 +128,16 @@ If you are running low on context or the user asks you to compress: Step 0 > Tes ## BEFORE YOU START: +### Design Doc Check +```bash +SLUG=$(~/.claude/skills/gstack/browse/bin/remote-slug 2>/dev/null || basename "$(git rev-parse --show-toplevel 2>/dev/null || pwd)") +BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null | tr '/' '-' || echo 'no-branch') +DESIGN=$(ls -t ~/.gstack/projects/$SLUG/*-$BRANCH-design-*.md 2>/dev/null | head -1) +[ -z "$DESIGN" ] && DESIGN=$(ls -t ~/.gstack/projects/$SLUG/*-design-*.md 2>/dev/null | head -1) +[ -n "$DESIGN" ] && echo "Design doc found: $DESIGN" || echo "No design doc found" +``` +If a design doc exists, read it. Use it as the source of truth for the problem statement, constraints, and chosen approach. If it has a `Supersedes:` field, note that this is a revised design — check the prior version for context on what changed and why. + ### Step 0: Scope Challenge Before reviewing anything, answer these questions: 1. **What existing code already partially or fully solves each sub-problem?** Can we capture outputs from existing flows rather than building parallel ones? @@ -155,7 +190,7 @@ After producing the test diagram, write a test plan artifact to the project dire ```bash SLUG=$(git remote get-url origin 2>/dev/null | sed 's|.*[:/]\([^/]*/[^/]*\)\.git$|\1|;s|.*[:/]\([^/]*/[^/]*\)$|\1|' | tr '/' '-') -BRANCH=$(git rev-parse --abbrev-ref HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD | tr '/' '-') USER=$(whoami) DATETIME=$(date +%Y%m%d-%H%M%S) mkdir -p ~/.gstack/projects/$SLUG diff --git a/plan-eng-review/SKILL.md.tmpl b/plan-eng-review/SKILL.md.tmpl index 410b072..57bca4c 100644 --- a/plan-eng-review/SKILL.md.tmpl +++ b/plan-eng-review/SKILL.md.tmpl @@ -38,6 +38,16 @@ If you are running low on context or the user asks you to compress: Step 0 > Tes ## BEFORE YOU START: +### Design Doc Check +```bash +SLUG=$(~/.claude/skills/gstack/browse/bin/remote-slug 2>/dev/null || basename "$(git rev-parse --show-toplevel 2>/dev/null || pwd)") +BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null | tr '/' '-' || echo 'no-branch') +DESIGN=$(ls -t ~/.gstack/projects/$SLUG/*-$BRANCH-design-*.md 2>/dev/null | head -1) +[ -z "$DESIGN" ] && DESIGN=$(ls -t ~/.gstack/projects/$SLUG/*-design-*.md 2>/dev/null | head -1) +[ -n "$DESIGN" ] && echo "Design doc found: $DESIGN" || echo "No design doc found" +``` +If a design doc exists, read it. Use it as the source of truth for the problem statement, constraints, and chosen approach. If it has a `Supersedes:` field, note that this is a revised design — check the prior version for context on what changed and why. + ### Step 0: Scope Challenge Before reviewing anything, answer these questions: 1. **What existing code already partially or fully solves each sub-problem?** Can we capture outputs from existing flows rather than building parallel ones? @@ -90,7 +100,7 @@ After producing the test diagram, write a test plan artifact to the project dire ```bash SLUG=$(git remote get-url origin 2>/dev/null | sed 's|.*[:/]\([^/]*/[^/]*\)\.git$|\1|;s|.*[:/]\([^/]*/[^/]*\)$|\1|' | tr '/' '-') -BRANCH=$(git rev-parse --abbrev-ref HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD | tr '/' '-') USER=$(whoami) DATETIME=$(date +%Y%m%d-%H%M%S) mkdir -p ~/.gstack/projects/$SLUG diff --git a/qa-design-review/SKILL.md b/qa-design-review/SKILL.md index 08c9916..fc38098 100644 --- a/qa-design-review/SKILL.md +++ b/qa-design-review/SKILL.md @@ -83,6 +83,31 @@ Hey gstack team — ran into this while using /{skill-name}: Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +``` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +``` + # /qa-design-review: Design Audit → Fix → Verify You are a senior product designer AND a frontend engineer. Review live sites with exacting visual standards — then fix what you find. You have strong opinions about typography, spacing, and visual hierarchy, and zero tolerance for generic or AI-generated-looking interfaces. diff --git a/qa-only/SKILL.md b/qa-only/SKILL.md index 5e74f03..b651da2 100644 --- a/qa-only/SKILL.md +++ b/qa-only/SKILL.md @@ -80,6 +80,31 @@ Hey gstack team — ran into this while using /{skill-name}: Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +``` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +``` + # /qa-only: Report-Only QA Testing You are a QA engineer. Test web applications like a real user — click everything, fill every form, check every state. Produce a structured report with evidence. **NEVER fix anything.** diff --git a/qa/SKILL.md b/qa/SKILL.md index 6b078a9..db890aa 100644 --- a/qa/SKILL.md +++ b/qa/SKILL.md @@ -85,6 +85,31 @@ Hey gstack team — ran into this while using /{skill-name}: Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +``` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +``` + ## Step 0: Detect base branch Determine which branch this PR targets. Use the result as "the base branch" in all subsequent steps. diff --git a/retro/SKILL.md b/retro/SKILL.md index c778152..da42a03 100644 --- a/retro/SKILL.md +++ b/retro/SKILL.md @@ -80,6 +80,31 @@ Hey gstack team — ran into this while using /{skill-name}: Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +``` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +``` + ## Detect default branch Before gathering data, detect the repo's default branch name: diff --git a/review/SKILL.md b/review/SKILL.md index 3ad683d..1982f6a 100644 --- a/review/SKILL.md +++ b/review/SKILL.md @@ -81,6 +81,31 @@ Hey gstack team — ran into this while using /{skill-name}: Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +``` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +``` + ## Step 0: Detect base branch Determine which branch this PR targets. Use the result as "the base branch" in all subsequent steps. @@ -114,6 +139,40 @@ You are running the `/review` workflow. Analyze the current branch's diff agains --- +## Step 1.5: Scope Drift Detection + +Before reviewing code quality, check: **did they build what was requested — nothing more, nothing less?** + +1. Read `TODOS.md` (if it exists). Read PR description (`gh pr view --json body --jq .body 2>/dev/null || true`). + Read commit messages (`git log origin/..HEAD --oneline`). + **If no PR exists:** rely on commit messages and TODOS.md for stated intent — this is the common case since /review runs before /ship creates the PR. +2. Identify the **stated intent** — what was this branch supposed to accomplish? +3. Run `git diff origin/ --stat` and compare the files changed against the stated intent. +4. Evaluate with skepticism: + + **SCOPE CREEP detection:** + - Files changed that are unrelated to the stated intent + - New features or refactors not mentioned in the plan + - "While I was in there..." changes that expand blast radius + + **MISSING REQUIREMENTS detection:** + - Requirements from TODOS.md/PR description not addressed in the diff + - Test coverage gaps for stated requirements + - Partial implementations (started but not finished) + +5. Output (before the main review begins): + ``` + Scope Check: [CLEAN / DRIFT DETECTED / REQUIREMENTS MISSING] + Intent: <1-line summary of what was requested> + Delivered: <1-line summary of what the diff actually does> + [If drift: list each out-of-scope change] + [If missing: list each unaddressed requirement] + ``` + +6. This is **INFORMATIONAL** — does not block the review. Proceed to Step 2. + +--- + ## Step 2: Read the checklist Read `.claude/skills/review/checklist.md`. @@ -205,6 +264,16 @@ Apply fixes for items where the user chose "Fix." Output what was fixed. If no ASK items exist (everything was AUTO-FIX), skip the question entirely. +### Verification of claims + +Before producing the final review output: +- If you claim "this pattern is safe" → cite the specific line proving safety +- If you claim "this is handled elsewhere" → read and cite the handling code +- If you claim "tests cover this" → name the test file and method +- Never say "likely handled" or "probably tested" — verify or flag as unknown + +**Rationalization prevention:** "This looks fine" is not a finding. Either cite evidence it IS fine, or flag it as unverified. + ### Greptile comment resolution After outputting your own findings, if Greptile comments were classified in Step 2.5: diff --git a/review/SKILL.md.tmpl b/review/SKILL.md.tmpl index c122ada..7040496 100644 --- a/review/SKILL.md.tmpl +++ b/review/SKILL.md.tmpl @@ -32,6 +32,40 @@ You are running the `/review` workflow. Analyze the current branch's diff agains --- +## Step 1.5: Scope Drift Detection + +Before reviewing code quality, check: **did they build what was requested — nothing more, nothing less?** + +1. Read `TODOS.md` (if it exists). Read PR description (`gh pr view --json body --jq .body 2>/dev/null || true`). + Read commit messages (`git log origin/..HEAD --oneline`). + **If no PR exists:** rely on commit messages and TODOS.md for stated intent — this is the common case since /review runs before /ship creates the PR. +2. Identify the **stated intent** — what was this branch supposed to accomplish? +3. Run `git diff origin/ --stat` and compare the files changed against the stated intent. +4. Evaluate with skepticism: + + **SCOPE CREEP detection:** + - Files changed that are unrelated to the stated intent + - New features or refactors not mentioned in the plan + - "While I was in there..." changes that expand blast radius + + **MISSING REQUIREMENTS detection:** + - Requirements from TODOS.md/PR description not addressed in the diff + - Test coverage gaps for stated requirements + - Partial implementations (started but not finished) + +5. Output (before the main review begins): + ``` + Scope Check: [CLEAN / DRIFT DETECTED / REQUIREMENTS MISSING] + Intent: <1-line summary of what was requested> + Delivered: <1-line summary of what the diff actually does> + [If drift: list each out-of-scope change] + [If missing: list each unaddressed requirement] + ``` + +6. This is **INFORMATIONAL** — does not block the review. Proceed to Step 2. + +--- + ## Step 2: Read the checklist Read `.claude/skills/review/checklist.md`. @@ -123,6 +157,16 @@ Apply fixes for items where the user chose "Fix." Output what was fixed. If no ASK items exist (everything was AUTO-FIX), skip the question entirely. +### Verification of claims + +Before producing the final review output: +- If you claim "this pattern is safe" → cite the specific line proving safety +- If you claim "this is handled elsewhere" → read and cite the handling code +- If you claim "tests cover this" → name the test file and method +- Never say "likely handled" or "probably tested" — verify or flag as unknown + +**Rationalization prevention:** "This looks fine" is not a finding. Either cite evidence it IS fine, or flag it as unverified. + ### Greptile comment resolution After outputting your own findings, if Greptile comments were classified in Step 2.5: diff --git a/scripts/gen-skill-docs.ts b/scripts/gen-skill-docs.ts index 7a0b85a..165f40b 100644 --- a/scripts/gen-skill-docs.ts +++ b/scripts/gen-skill-docs.ts @@ -158,7 +158,32 @@ Hey gstack team — ran into this while using /{skill-name}: **Date:** {YYYY-MM-DD} | **Version:** {gstack version} | **Skill:** /{skill} \`\`\` -Slug: lowercase, hyphens, max 60 chars (e.g. \`browse-js-no-await\`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}"`; +Slug: lowercase, hyphens, max 60 chars (e.g. \`browse-js-no-await\`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" + +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +\`\`\` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +\`\`\``; } function generateBrowseSetup(): string { @@ -872,6 +897,8 @@ function findTemplates(): string[] { path.join(ROOT, 'plan-ceo-review', 'SKILL.md.tmpl'), path.join(ROOT, 'plan-eng-review', 'SKILL.md.tmpl'), path.join(ROOT, 'retro', 'SKILL.md.tmpl'), + path.join(ROOT, 'brainstorm', 'SKILL.md.tmpl'), + path.join(ROOT, 'debug', 'SKILL.md.tmpl'), path.join(ROOT, 'gstack-upgrade', 'SKILL.md.tmpl'), path.join(ROOT, 'plan-design-review', 'SKILL.md.tmpl'), path.join(ROOT, 'qa-design-review', 'SKILL.md.tmpl'), diff --git a/setup-browser-cookies/SKILL.md b/setup-browser-cookies/SKILL.md index faebe52..984df04 100644 --- a/setup-browser-cookies/SKILL.md +++ b/setup-browser-cookies/SKILL.md @@ -78,6 +78,31 @@ Hey gstack team — ran into this while using /{skill-name}: Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +``` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +``` + # Setup Browser Cookies Import logged-in sessions from your real Chromium browser into the headless browse session. diff --git a/ship/SKILL.md b/ship/SKILL.md index 8aa4a18..e1aaf76 100644 --- a/ship/SKILL.md +++ b/ship/SKILL.md @@ -80,6 +80,31 @@ Hey gstack team — ran into this while using /{skill-name}: Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}" +## Completion Status Protocol + +When completing a skill workflow, report status using one of: +- **DONE** — All steps completed successfully. Evidence provided for each claim. +- **DONE_WITH_CONCERNS** — Completed, but with issues the user should know about. List each concern. +- **BLOCKED** — Cannot proceed. State what is blocking and what was tried. +- **NEEDS_CONTEXT** — Missing information required to continue. State exactly what you need. + +### Escalation + +It is always OK to stop and say "this is too hard for me" or "I'm not confident in this result." + +Bad work is worse than no work. You will not be penalized for escalating. +- If you have attempted a task 3 times without success, STOP and escalate. +- If you are uncertain about a security-sensitive change, STOP and escalate. +- If the scope of work exceeds what you can verify, STOP and escalate. + +Escalation format: +``` +STATUS: BLOCKED | NEEDS_CONTEXT +REASON: [1-2 sentences] +ATTEMPTED: [what you tried] +RECOMMENDATION: [what the user should do next] +``` + ## Step 0: Detect base branch Determine which branch this PR targets. Use the result as "the base branch" in all subsequent steps. @@ -441,6 +466,28 @@ EOF --- +## Step 6.5: Verification Gate + +**IRON LAW: NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE.** + +Before pushing, re-verify if code changed during Steps 4-6: + +1. **Test verification:** If ANY code changed after Step 3's test run (fixes from review findings, CHANGELOG edits don't count), re-run the test suite. Paste fresh output. Stale output from Step 3 is NOT acceptable. + +2. **Build verification:** If the project has a build step, run it. Paste output. + +3. **Rationalization prevention:** + - "Should work now" → RUN IT. + - "I'm confident" → Confidence is not evidence. + - "I already tested earlier" → Code changed since then. Test again. + - "It's a trivial change" → Trivial changes break production. + +**If tests fail here:** STOP. Do not push. Fix the issue and return to Step 3. + +Claiming work is complete without verification is dishonesty, not efficiency. + +--- + ## Step 7: Push Push to the remote with upstream tracking: @@ -501,4 +548,5 @@ EOF - **Split commits for bisectability** — each commit = one logical change. - **TODOS.md completion detection must be conservative.** Only mark items as completed when the diff clearly shows the work is done. - **Use Greptile reply templates from greptile-triage.md.** Every reply includes evidence (inline diff, code references, re-rank suggestion). Never post vague replies. +- **Never push without fresh verification evidence.** If code changed after Step 3 tests, re-run before pushing. - **The goal is: user says `/ship`, next thing they see is the review + PR URL.** diff --git a/ship/SKILL.md.tmpl b/ship/SKILL.md.tmpl index 9339e90..39e3b6f 100644 --- a/ship/SKILL.md.tmpl +++ b/ship/SKILL.md.tmpl @@ -359,6 +359,28 @@ EOF --- +## Step 6.5: Verification Gate + +**IRON LAW: NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE.** + +Before pushing, re-verify if code changed during Steps 4-6: + +1. **Test verification:** If ANY code changed after Step 3's test run (fixes from review findings, CHANGELOG edits don't count), re-run the test suite. Paste fresh output. Stale output from Step 3 is NOT acceptable. + +2. **Build verification:** If the project has a build step, run it. Paste output. + +3. **Rationalization prevention:** + - "Should work now" → RUN IT. + - "I'm confident" → Confidence is not evidence. + - "I already tested earlier" → Code changed since then. Test again. + - "It's a trivial change" → Trivial changes break production. + +**If tests fail here:** STOP. Do not push. Fix the issue and return to Step 3. + +Claiming work is complete without verification is dishonesty, not efficiency. + +--- + ## Step 7: Push Push to the remote with upstream tracking: @@ -419,4 +441,5 @@ EOF - **Split commits for bisectability** — each commit = one logical change. - **TODOS.md completion detection must be conservative.** Only mark items as completed when the diff clearly shows the work is done. - **Use Greptile reply templates from greptile-triage.md.** Every reply includes evidence (inline diff, code references, re-rank suggestion). Never post vague replies. +- **Never push without fresh verification evidence.** If code changed after Step 3 tests, re-run before pushing. - **The goal is: user says `/ship`, next thing they see is the review + PR URL.** diff --git a/test/skill-validation.test.ts b/test/skill-validation.test.ts index 83cdca6..762a3fb 100644 --- a/test/skill-validation.test.ts +++ b/test/skill-validation.test.ts @@ -204,6 +204,7 @@ describe('Update check preamble', () => { 'ship/SKILL.md', 'review/SKILL.md', 'plan-ceo-review/SKILL.md', 'plan-eng-review/SKILL.md', 'retro/SKILL.md', + 'brainstorm/SKILL.md', 'debug/SKILL.md', 'plan-design-review/SKILL.md', 'qa-design-review/SKILL.md', 'design-consultation/SKILL.md', @@ -512,6 +513,7 @@ describe('v0.4.1 preamble features', () => { 'ship/SKILL.md', 'review/SKILL.md', 'plan-ceo-review/SKILL.md', 'plan-eng-review/SKILL.md', 'retro/SKILL.md', + 'brainstorm/SKILL.md', 'debug/SKILL.md', 'plan-design-review/SKILL.md', 'qa-design-review/SKILL.md', 'design-consultation/SKILL.md', @@ -531,6 +533,34 @@ describe('v0.4.1 preamble features', () => { expect(content).toContain('RECOMMENDATION'); }); } + + for (const skill of skillsWithPreamble) { + test(`${skill} contains escalation protocol`, () => { + const content = fs.readFileSync(path.join(ROOT, skill), 'utf-8'); + expect(content).toContain('DONE_WITH_CONCERNS'); + expect(content).toContain('BLOCKED'); + expect(content).toContain('NEEDS_CONTEXT'); + }); + } +}); + +// --- Structural tests for new skills --- + +describe('brainstorm skill structure', () => { + const content = fs.readFileSync(path.join(ROOT, 'brainstorm', 'SKILL.md'), 'utf-8'); + for (const section of ['Phase 1', 'Phase 2', 'Phase 3', 'Phase 4', 'Phase 5', 'Phase 6', + 'Design Doc', 'Supersedes', 'APPROVED', 'Premise Challenge', + 'Alternatives', 'Smart-skip']) { + test(`contains ${section}`, () => expect(content).toContain(section)); + } +}); + +describe('debug skill structure', () => { + const content = fs.readFileSync(path.join(ROOT, 'debug', 'SKILL.md'), 'utf-8'); + for (const section of ['Iron Law', 'Root Cause', 'Pattern Analysis', 'Hypothesis', + 'DEBUG REPORT', '3-strike', 'BLOCKED']) { + test(`contains ${section}`, () => expect(content).toContain(section)); + } }); // --- Contributor mode preamble structure validation ---