diff --git a/AGENTS.md b/AGENTS.md index 161e317982..955a3219a2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,6 +15,7 @@ Invoke them by name (e.g., `/office-hours`). |-------|-------------| | `/office-hours` | Start here. Reframes your product idea before you write code. | | `/plan-ceo-review` | CEO-level review: find the 10-star product in the request. | +| `/plan-pm-review` | PM-mode review: RICE prioritization, JTBD segmentation, acceptance criteria. | | `/plan-eng-review` | Lock architecture, data flow, edge cases, and tests. | | `/plan-design-review` | Rate each design dimension 0-10, explain what a 10 looks like. | | `/plan-devex-review` | DX-mode review: TTHW, magical moments, friction points, persona traces. | diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e328e0edb..aae9a4d946 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,50 @@ # Changelog +## [1.44.0.0] - 2026-05-23 + +## **`/plan-pm-review` ships: RICE prioritization, JTBD segmentation, and acceptance criteria land as the missing PM voice in the review pipeline.** +## **`/autoplan` gains Phase 1.5 between CEO and Eng review — plans with 5+ deliverables, multiple user segments, or TODOS conflicts now get a cut list before architecture commits.** + +The plan review pipeline had a gap: the CEO review tells you what to build, the eng review locks in how to build it, but nobody asked who it's for, what to cut, or what "done" actually means. `/plan-pm-review` fills that role. + +Three modes, each sharpening the plan before engineering touches it. PRIORITIZE applies RICE scoring (Reach x Impact x Confidence / Effort) to every item and produces a ranked cut list with explicit tradeoffs. SHARPEN turns vague plan items into acceptance criteria and done definitions — a done condition is valid only if a QA engineer can verify it without asking the developer a question. SEGMENT runs JTBD analysis: who is the primary user, what job are they hiring this product to do, what tool are they firing when they switch, and does the plan actually solve the job or just the surface feature. All three modes produce an explicit "NOT in scope" section so deferred items are tracked, not forgotten. + +For AI-assisted projects, RICE effort is measured in CC+gstack time (not human-team months), so scores look dramatically different from traditional PM estimates. A task that takes a human team two weeks takes CC thirty minutes. The cut list reflects that. + +### The numbers that matter + +New skill: `plan-pm-review/` (1464 lines, ~17K tokens — comparable to `/plan-eng-review`). +`/autoplan` Phase 1.5 adds 60 lines to `autoplan/SKILL.md.tmpl` with skip conditions so small plans with a named segment pass through at zero cost. + +| Item | Before | After | +|------|--------|-------| +| Plan review voices | CEO + Eng (+Design, +DX conditional) | CEO + PM + Eng (+Design, +DX conditional) | +| RICE scoring in pipeline | Not available | Auto-runs for plans >5 deliverables or multiple segments | +| Acceptance criteria | Manual (user responsibility) | SHARPEN mode produces testable done conditions for every item | +| JTBD analysis | Not available | SEGMENT mode: functional + emotional + social job, firing trigger, success metric | +| `/autoplan` phases | 4 phases (1 CEO + optional Design + Eng + optional DX) | 5 phases (1 CEO + optional PM + optional Design + Eng + optional DX) | + +### What this means for builders + +Plans that hit `/autoplan` with five or more deliverables now get a PM pass before the architecture is locked. That means cuts are surfaced while they're still cheap (before eng commits to data models and test plans), user segments are named explicitly, and every item has a testable done condition. For smaller plans, Phase 1.5 skips automatically. + +To run the PM review standalone: `/plan-pm-review`. To get it inline with the full pipeline: `/autoplan` (Phase 1.5 triggers automatically when warranted). + +### Itemized changes + +#### Added + +- **`plan-pm-review/SKILL.md.tmpl`**: New skill template. Three modes: PRIORITIZE (RICE scorecard + cut list + ranked roadmap + risk-adjusted confidence table), SHARPEN (acceptance criteria format + sharpness audit), SEGMENT (JTBD framework blocks + segment coverage matrix + misalignment flags). Requires explicit scope challenge (five forcing questions) before any mode runs. All modes produce "NOT in scope" and "What already exists" sections. JSONL task emission via `{{TASKS_SECTION_EMIT:pm-review}}` feeds into `/autoplan` aggregation. +- **`plan-pm-review/SKILL.md`**: Generated from the template above. + +#### Changed + +- **`scripts/resolvers/tasks-section.ts`**: Added `'pm-review'` to `VALID_PHASES` so `{{TASKS_SECTION_EMIT:pm-review}}` resolves without throwing. +- **`autoplan/SKILL.md.tmpl`**: Phase 1.5 (PM Review) inserted between Phase 1 (CEO) and Phase 2 (Design). Skip conditions: plan <= 3 deliverables AND segment already named AND no TODOS conflicts. Run conditions: >5 work items OR multiple user segments OR borderline scope OR TODOS conflicts. Auto-selects mode (PRIORITIZE by default, SEGMENT if personas unclear, SHARPEN if items vague). Updated Pre-Gate Verification checklist, Review Scores summary, and Completion review log section. +- **`autoplan/SKILL.md`**: Regenerated. +- **`AGENTS.md`**: Added `/plan-pm-review` entry. +- **`docs/skills.md`**: Added `/plan-pm-review` table row and full section. + ## [1.43.3.0] - 2026-05-21 ## **Headed Chromium embedded by external supervisors stops auto-shutting-down after 30 minutes of HTTP idle.** diff --git a/VERSION b/VERSION index f2c85ebe28..5b692d29ac 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.43.3.0 +1.44.0.0 diff --git a/autoplan/SKILL.md b/autoplan/SKILL.md index a39b60bbd8..8ea41af73b 100644 --- a/autoplan/SKILL.md +++ b/autoplan/SKILL.md @@ -1208,18 +1208,60 @@ Sections 1-10 — for EACH section, run the evaluation criteria from the loaded > Consensus: [X/6 confirmed, Y disagreements → surfaced at gate]. > Passing to Phase 2. -Do NOT begin Phase 2 until all Phase 1 outputs are written to the plan file +Do NOT begin Phase 1.5 until all Phase 1 outputs are written to the plan file and the premise gate has been passed. --- -**Pre-Phase 2 checklist (verify before starting):** +**Pre-Phase 1.5 checklist (verify before starting):** - [ ] CEO completion summary written to plan file - [ ] CEO dual voices ran (Codex + Claude subagent, or noted unavailable) - [ ] CEO consensus table produced - [ ] Premise gate passed (user confirmed) - [ ] Phase-transition summary emitted +## Phase 1.5: PM Review (conditional — run when prioritization or user-segment clarity is needed) + +**Skip condition:** Skip Phase 1.5 if ALL of the following are true: +- The plan has 3 or fewer distinct deliverables (no prioritization needed) +- The target user segment is already explicitly named in the CEO review +- No TODOS.md items compete with this plan's scope + +If skipping, log: "Phase 1.5 skipped — plan scope is small and segment is already +defined." + +**Run condition:** Run Phase 1.5 if ANY of the following is true: +- The CEO review produced more than 5 distinct work items +- The plan touches multiple user segments or personas +- Any CEO review item was classified as "borderline scope" +- TODOS.md exists with items that may conflict or overlap + +Follow plan-pm-review/SKILL.md in **PRIORITIZE** mode by default. Switch to +**SEGMENT** mode if the CEO review surfaced user-segment ambiguity, or **SHARPEN** +mode if the CEO review produced vague scope items without acceptance criteria. + +**Override rules:** +- Mode selection: auto-select based on what the CEO review revealed (PRIORITIZE + by default; SEGMENT if personas are unclear; SHARPEN if items are vague) +- RICE scoring: use CC+gstack effort estimates, not human-team estimates +- Cut list: P3 items → TODOS.md automatically (P3) +- AskUserQuestion: suppress all except items with Confidence < 50% or where both + CEO and PM scoring conflict — surface those at the Final Gate + +**PHASE 1.5 COMPLETE.** Emit phase-transition summary: +> **Phase 1.5 complete.** PM mode: [PRIORITIZE/SEGMENT/SHARPEN]. Items scored: N. +> P1 items: N. P2 items: N. P3 items deferred to TODOS: N. +> Passing to Phase 2. + +--- + +**Pre-Phase 2 checklist (verify before starting):** +- [ ] CEO completion summary written to plan file +- [ ] CEO dual voices ran (Codex + Claude subagent, or noted unavailable) +- [ ] CEO consensus table produced +- [ ] Premise gate passed (user confirmed) +- [ ] Phase 1.5 ran (or skipped with reason logged) + ## Phase 2: Design Review (conditional — skip if no UI scope) Follow plan-design-review/SKILL.md — all 7 dimensions, full depth. @@ -1556,6 +1598,15 @@ produced. Check the plan file and conversation for each item. - [ ] Dual voices ran (Codex + Claude subagent, or noted unavailable) - [ ] CEO consensus table produced +**Phase 1.5 (PM) outputs — only if ran (not skipped):** +- [ ] Mode selected (PRIORITIZE / SHARPEN / SEGMENT) and logged +- [ ] Scope challenge: primary user named, riskiest assumption identified +- [ ] Mode-specific output produced (RICE table OR acceptance criteria OR JTBD blocks) +- [ ] "NOT in scope" section written +- [ ] "What already exists" section written +- [ ] TODOS cross-reference ran +- [ ] Phase 1.5 ran (or explicitly skipped with reason logged) + **Phase 2 (Design) outputs — only if UI scope detected:** - [ ] All 7 dimensions evaluated with scores - [ ] Issues identified and auto-decided @@ -1708,6 +1759,7 @@ I recommend [X] — [principle]. But [Y] is also viable: ### Review Scores - CEO: [summary] - CEO Voices: Codex [summary], Claude subagent [summary], Consensus [X/6 confirmed] +- PM: [mode run + key finding, or "skipped, plan ≤3 deliverables + segment already named"] - Design: [summary or "skipped, no UI scope"] - Design Voices: Codex [summary], Claude subagent [summary], Consensus [X/7 confirmed] (or "skipped") - Eng: [summary] @@ -1766,6 +1818,11 @@ TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ) ~/.claude/skills/gstack/bin/gstack-review-log '{"skill":"plan-eng-review","timestamp":"'"$TIMESTAMP"'","status":"STATUS","unresolved":N,"critical_gaps":N,"issues_found":N,"mode":"FULL_REVIEW","via":"autoplan","commit":"'"$COMMIT"'"}' ``` +If Phase 1.5 ran (PM scope): +```bash +~/.claude/skills/gstack/bin/gstack-review-log '{"skill":"plan-pm-review","timestamp":"'"$TIMESTAMP"'","status":"STATUS","unresolved":N,"critical_gaps":0,"mode":"MODE","via":"autoplan","commit":"'"$COMMIT"'"}' +``` + If Phase 2 ran (UI scope): ```bash ~/.claude/skills/gstack/bin/gstack-review-log '{"skill":"plan-design-review","timestamp":"'"$TIMESTAMP"'","status":"STATUS","unresolved":N,"via":"autoplan","commit":"'"$COMMIT"'"}' diff --git a/autoplan/SKILL.md.tmpl b/autoplan/SKILL.md.tmpl index 888cddabbc..599d68fdd1 100644 --- a/autoplan/SKILL.md.tmpl +++ b/autoplan/SKILL.md.tmpl @@ -380,18 +380,60 @@ Sections 1-10 — for EACH section, run the evaluation criteria from the loaded > Consensus: [X/6 confirmed, Y disagreements → surfaced at gate]. > Passing to Phase 2. -Do NOT begin Phase 2 until all Phase 1 outputs are written to the plan file +Do NOT begin Phase 1.5 until all Phase 1 outputs are written to the plan file and the premise gate has been passed. --- -**Pre-Phase 2 checklist (verify before starting):** +**Pre-Phase 1.5 checklist (verify before starting):** - [ ] CEO completion summary written to plan file - [ ] CEO dual voices ran (Codex + Claude subagent, or noted unavailable) - [ ] CEO consensus table produced - [ ] Premise gate passed (user confirmed) - [ ] Phase-transition summary emitted +## Phase 1.5: PM Review (conditional — run when prioritization or user-segment clarity is needed) + +**Skip condition:** Skip Phase 1.5 if ALL of the following are true: +- The plan has 3 or fewer distinct deliverables (no prioritization needed) +- The target user segment is already explicitly named in the CEO review +- No TODOS.md items compete with this plan's scope + +If skipping, log: "Phase 1.5 skipped — plan scope is small and segment is already +defined." + +**Run condition:** Run Phase 1.5 if ANY of the following is true: +- The CEO review produced more than 5 distinct work items +- The plan touches multiple user segments or personas +- Any CEO review item was classified as "borderline scope" +- TODOS.md exists with items that may conflict or overlap + +Follow plan-pm-review/SKILL.md in **PRIORITIZE** mode by default. Switch to +**SEGMENT** mode if the CEO review surfaced user-segment ambiguity, or **SHARPEN** +mode if the CEO review produced vague scope items without acceptance criteria. + +**Override rules:** +- Mode selection: auto-select based on what the CEO review revealed (PRIORITIZE + by default; SEGMENT if personas are unclear; SHARPEN if items are vague) +- RICE scoring: use CC+gstack effort estimates, not human-team estimates +- Cut list: P3 items → TODOS.md automatically (P3) +- AskUserQuestion: suppress all except items with Confidence < 50% or where both + CEO and PM scoring conflict — surface those at the Final Gate + +**PHASE 1.5 COMPLETE.** Emit phase-transition summary: +> **Phase 1.5 complete.** PM mode: [PRIORITIZE/SEGMENT/SHARPEN]. Items scored: N. +> P1 items: N. P2 items: N. P3 items deferred to TODOS: N. +> Passing to Phase 2. + +--- + +**Pre-Phase 2 checklist (verify before starting):** +- [ ] CEO completion summary written to plan file +- [ ] CEO dual voices ran (Codex + Claude subagent, or noted unavailable) +- [ ] CEO consensus table produced +- [ ] Premise gate passed (user confirmed) +- [ ] Phase 1.5 ran (or skipped with reason logged) + ## Phase 2: Design Review (conditional — skip if no UI scope) Follow plan-design-review/SKILL.md — all 7 dimensions, full depth. @@ -728,6 +770,15 @@ produced. Check the plan file and conversation for each item. - [ ] Dual voices ran (Codex + Claude subagent, or noted unavailable) - [ ] CEO consensus table produced +**Phase 1.5 (PM) outputs — only if ran (not skipped):** +- [ ] Mode selected (PRIORITIZE / SHARPEN / SEGMENT) and logged +- [ ] Scope challenge: primary user named, riskiest assumption identified +- [ ] Mode-specific output produced (RICE table OR acceptance criteria OR JTBD blocks) +- [ ] "NOT in scope" section written +- [ ] "What already exists" section written +- [ ] TODOS cross-reference ran +- [ ] Phase 1.5 ran (or explicitly skipped with reason logged) + **Phase 2 (Design) outputs — only if UI scope detected:** - [ ] All 7 dimensions evaluated with scores - [ ] Issues identified and auto-decided @@ -807,6 +858,7 @@ I recommend [X] — [principle]. But [Y] is also viable: ### Review Scores - CEO: [summary] - CEO Voices: Codex [summary], Claude subagent [summary], Consensus [X/6 confirmed] +- PM: [mode run + key finding, or "skipped, plan ≤3 deliverables + segment already named"] - Design: [summary or "skipped, no UI scope"] - Design Voices: Codex [summary], Claude subagent [summary], Consensus [X/7 confirmed] (or "skipped") - Eng: [summary] @@ -865,6 +917,11 @@ TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ) ~/.claude/skills/gstack/bin/gstack-review-log '{"skill":"plan-eng-review","timestamp":"'"$TIMESTAMP"'","status":"STATUS","unresolved":N,"critical_gaps":N,"issues_found":N,"mode":"FULL_REVIEW","via":"autoplan","commit":"'"$COMMIT"'"}' ``` +If Phase 1.5 ran (PM scope): +```bash +~/.claude/skills/gstack/bin/gstack-review-log '{"skill":"plan-pm-review","timestamp":"'"$TIMESTAMP"'","status":"STATUS","unresolved":N,"critical_gaps":0,"mode":"MODE","via":"autoplan","commit":"'"$COMMIT"'"}' +``` + If Phase 2 ran (UI scope): ```bash ~/.claude/skills/gstack/bin/gstack-review-log '{"skill":"plan-design-review","timestamp":"'"$TIMESTAMP"'","status":"STATUS","unresolved":N,"via":"autoplan","commit":"'"$COMMIT"'"}' diff --git a/docs/skills.md b/docs/skills.md index 3749fd89c3..579302914b 100644 --- a/docs/skills.md +++ b/docs/skills.md @@ -6,6 +6,7 @@ Detailed guides for every gstack skill — philosophy, workflow, and examples. |-------|----------------|--------------| | [`/office-hours`](#office-hours) | **YC Office Hours** | Start here. Six forcing questions that reframe your product before you write code. Pushes back on your framing, challenges premises, generates implementation alternatives. Design doc feeds into every downstream skill. | | [`/plan-ceo-review`](#plan-ceo-review) | **CEO / Founder** | Rethink the problem. Find the 10-star product hiding inside the request. Four modes: Expansion, Selective Expansion, Hold Scope, Reduction. | +| [`/plan-pm-review`](#plan-pm-review) | **Product Manager** | RICE/ICE prioritization, JTBD segmentation, acceptance criteria. Three modes: PRIORITIZE (cut list + ranked roadmap), SHARPEN (testable done conditions), SEGMENT (who is this for and what job does it do). | | [`/plan-eng-review`](#plan-eng-review) | **Eng Manager** | Lock in architecture, data flow, diagrams, edge cases, and tests. Forces hidden assumptions into the open. | | [`/plan-design-review`](#plan-design-review) | **Senior Designer** | Interactive plan-mode design review. Rates each dimension 0-10, explains what a 10 looks like, fixes the plan. Works in plan mode. | | [`/design-consultation`](#design-consultation) | **Design Partner** | Build a complete design system from scratch. Knows the landscape, proposes creative risks, generates realistic product mockups. Design at the heart of all other phases. | @@ -171,6 +172,26 @@ Visions and decisions are persisted to `~/.gstack/projects/` so they survive bey --- +## `/plan-pm-review` + +This is my **product manager mode**. + +After the CEO review has validated direction, I want the plan stress-tested through a PM lens before engineering locks in architecture. Three things tend to go wrong without this step: teams build the wrong thing perfectly, no one writes down what "done" means, and the user segments are never named — so everyone has a different mental model of who they're building for. + +`/plan-pm-review` runs one of three modes: + +**PRIORITIZE** — Apply RICE scoring (Reach × Impact × Confidence / Effort) to every item. The output is a ranked cut list: what ships, what defers, and what the model recommends cutting. For AI-assisted projects, effort is measured in CC+gstack time (not human-team time), so RICE scores look very different from traditional PM estimates. + +**SHARPEN** — Turn vague plan items into acceptance criteria and done definitions. Every item leaves with a testable "done" condition and a user-facing outcome statement. A done condition is valid only if a QA engineer can verify it without asking the developer a question. + +**SEGMENT** — JTBD (Jobs to Be Done) pass: who is this for, what job are they hiring it to do, what tool are they firing when they pick this, and whether the plan actually addresses the job or just the surface feature. Produces a segment-to-feature coverage matrix. + +All three modes produce a "NOT in scope" section (explicit deferrals) and a "What already exists" section (existing product coverage that prevents feature duplication). + +`/plan-pm-review` feeds into `/plan-eng-review` — RICE-scored P1 items make the architecture review much more focused. Vague plans produce vague arch reviews. The full pipeline is: `office-hours → plan-ceo-review → plan-pm-review → plan-eng-review → ship`. + +--- + ## `/plan-eng-review` This is my **eng manager mode**. diff --git a/gstack/llms.txt b/gstack/llms.txt index bb9b816b9b..b860d860d9 100644 --- a/gstack/llms.txt +++ b/gstack/llms.txt @@ -50,6 +50,7 @@ Conventions: - [/plan-design-review](plan-design-review/SKILL.md): Designer's eye plan review — interactive, like CEO and Eng review. - [/plan-devex-review](plan-devex-review/SKILL.md): Interactive developer experience plan review. - [/plan-eng-review](plan-eng-review/SKILL.md): Eng manager-mode plan review. +- [/plan-pm-review](plan-pm-review/SKILL.md): Product manager-mode plan review. - [/plan-tune](plan-tune/SKILL.md): Self-tuning question sensitivity + developer psychographic for gstack (v1: observational). - [/qa](qa/SKILL.md): Systematically QA test a web application and fix bugs found. - [/qa-only](qa-only/SKILL.md): Report-only QA testing. diff --git a/package.json b/package.json index 0b9428b9c3..2c39a80b7d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gstack", - "version": "1.43.2.0", + "version": "1.44.0.0", "description": "Garry's Stack — Claude Code skills + fast headless browser. One repo, one install, entire AI engineering workflow.", "license": "MIT", "type": "module", diff --git a/plan-pm-review/SKILL.md b/plan-pm-review/SKILL.md new file mode 100644 index 0000000000..20b68e6963 --- /dev/null +++ b/plan-pm-review/SKILL.md @@ -0,0 +1,1463 @@ +--- +name: plan-pm-review +preamble-tier: 3 +interactive: true +version: 1.0.0 +description: | + Product manager-mode plan review. Prioritize with frameworks (RICE/ICE/WSJF), + map user segments and JTBD, write acceptance criteria and done definitions, + produce a ranked roadmap with explicit tradeoffs. Three modes: PRIORITIZE + (RICE/ICE scoring + cut list), SHARPEN (acceptance criteria + done definitions), + SEGMENT (JTBD + user segment analysis). Use when asked to "PM review", + "prioritize this", "RICE scoring", "acceptance criteria", or "roadmap ranking". + Proactively suggest when the user has a plan or TODOS list and needs to know + what to cut, what to defer, or who the feature is actually for. (gstack) + Voice triggers (speech-to-text aliases): "PM review", "product review", "prioritize the plan", "RICE scoring", "acceptance criteria", "roadmap ranking". +benefits-from: [office-hours, plan-ceo-review] +allowed-tools: + - Read + - Write + - Grep + - Glob + - AskUserQuestion + - Bash + - WebSearch +triggers: + - pm plan review + - product manager review + - prioritize roadmap + - write acceptance criteria + - JTBD analysis +--- + + + +## 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 -exec rm {} + 2>/dev/null || true +_PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true") +_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no") +_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") +echo "BRANCH: $_BRANCH" +_SKILL_PREFIX=$(~/.claude/skills/gstack/bin/gstack-config get skill_prefix 2>/dev/null || echo "false") +echo "PROACTIVE: $_PROACTIVE" +echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED" +echo "SKILL_PREFIX: $_SKILL_PREFIX" +source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true +REPO_MODE=${REPO_MODE:-unknown} +echo "REPO_MODE: $REPO_MODE" +_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") +echo "LAKE_INTRO: $_LAKE_SEEN" +_TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) +_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no") +_TEL_START=$(date +%s) +_SESSION_ID="$$-$(date +%s)" +echo "TELEMETRY: ${_TEL:-off}" +echo "TEL_PROMPTED: $_TEL_PROMPTED" +_EXPLAIN_LEVEL=$(~/.claude/skills/gstack/bin/gstack-config get explain_level 2>/dev/null || echo "default") +if [ "$_EXPLAIN_LEVEL" != "default" ] && [ "$_EXPLAIN_LEVEL" != "terse" ]; then _EXPLAIN_LEVEL="default"; fi +echo "EXPLAIN_LEVEL: $_EXPLAIN_LEVEL" +_QUESTION_TUNING=$(~/.claude/skills/gstack/bin/gstack-config get question_tuning 2>/dev/null || echo "false") +echo "QUESTION_TUNING: $_QUESTION_TUNING" +mkdir -p ~/.gstack/analytics +if [ "$_TEL" != "off" ]; then +echo '{"skill":"plan-pm-review","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true +fi +for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do + if [ -f "$_PF" ]; then + if [ "$_TEL" != "off" ] && [ -x "~/.claude/skills/gstack/bin/gstack-telemetry-log" ]; then + ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true + fi + rm -f "$_PF" 2>/dev/null || true + fi + break +done +eval "$(~/.claude/skills/gstack/bin/gstack-slug 2>/dev/null)" 2>/dev/null || true +_LEARN_FILE="${GSTACK_HOME:-$HOME/.gstack}/projects/${SLUG:-unknown}/learnings.jsonl" +if [ -f "$_LEARN_FILE" ]; then + _LEARN_COUNT=$(wc -l < "$_LEARN_FILE" 2>/dev/null | tr -d ' ') + echo "LEARNINGS: $_LEARN_COUNT entries loaded" + if [ "$_LEARN_COUNT" -gt 5 ] 2>/dev/null; then + ~/.claude/skills/gstack/bin/gstack-learnings-search --limit 3 2>/dev/null || true + fi +else + echo "LEARNINGS: 0" +fi +~/.claude/skills/gstack/bin/gstack-timeline-log '{"skill":"plan-pm-review","event":"started","branch":"'"$_BRANCH"'","session":"'"$_SESSION_ID"'"}' 2>/dev/null & +_HAS_ROUTING="no" +if [ -f CLAUDE.md ] && grep -q "## Skill routing" CLAUDE.md 2>/dev/null; then + _HAS_ROUTING="yes" +fi +_ROUTING_DECLINED=$(~/.claude/skills/gstack/bin/gstack-config get routing_declined 2>/dev/null || echo "false") +echo "HAS_ROUTING: $_HAS_ROUTING" +echo "ROUTING_DECLINED: $_ROUTING_DECLINED" +_VENDORED="no" +if [ -d ".claude/skills/gstack" ] && [ ! -L ".claude/skills/gstack" ]; then + if [ -f ".claude/skills/gstack/VERSION" ] || [ -d ".claude/skills/gstack/.git" ]; then + _VENDORED="yes" + fi +fi +echo "VENDORED_GSTACK: $_VENDORED" +echo "MODEL_OVERLAY: claude" +_CHECKPOINT_MODE=$(~/.claude/skills/gstack/bin/gstack-config get checkpoint_mode 2>/dev/null || echo "explicit") +_CHECKPOINT_PUSH=$(~/.claude/skills/gstack/bin/gstack-config get checkpoint_push 2>/dev/null || echo "false") +echo "CHECKPOINT_MODE: $_CHECKPOINT_MODE" +echo "CHECKPOINT_PUSH: $_CHECKPOINT_PUSH" +[ -n "$OPENCLAW_SESSION" ] && echo "SPAWNED_SESSION: true" || true +``` + +## Plan Mode Safe Operations + +In plan mode, allowed because they inform the plan: `$B`, `$D`, `codex exec`/`codex review`, writes to `~/.gstack/`, writes to the plan file, and `open` for generated artifacts. + +## Skill Invocation During Plan Mode + +If the user invokes a skill in plan mode, the skill takes precedence over generic plan mode behavior. **Treat the skill file as executable instructions, not reference.** Follow it step by step starting from Step 0; the first AskUserQuestion is the workflow entering plan mode, not a violation of it. AskUserQuestion (any variant — `mcp__*__AskUserQuestion` or native; see "AskUserQuestion Format → Tool resolution") satisfies plan mode's end-of-turn requirement. If no variant is callable, the skill is BLOCKED — stop and report `BLOCKED — AskUserQuestion unavailable` per the AskUserQuestion Format rule. At a STOP point, stop immediately. Do not continue the workflow or call ExitPlanMode there. Commands marked "PLAN MODE EXCEPTION — ALWAYS RUN" execute. Call ExitPlanMode only after the skill workflow completes, or if the user tells you to cancel the skill or leave plan mode. + +If `PROACTIVE` is `"false"`, do not auto-invoke or proactively suggest skills. If a skill seems useful, ask: "I think /skillname might help here — want me to run it?" + +If `SKILL_PREFIX` is `"true"`, suggest/invoke `/gstack-*` names. Disk paths stay `~/.claude/skills/gstack/[skill-name]/SKILL.md`. + +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 output shows `JUST_UPGRADED `: print "Running gstack v{to} (just updated!)". If `SPAWNED_SESSION` is true, skip feature discovery. + +Feature discovery, max one prompt per session: +- Missing `~/.claude/skills/gstack/.feature-prompted-continuous-checkpoint`: AskUserQuestion for Continuous checkpoint auto-commits. If accepted, run `~/.claude/skills/gstack/bin/gstack-config set checkpoint_mode continuous`. Always touch marker. +- Missing `~/.claude/skills/gstack/.feature-prompted-model-overlay`: inform "Model overlays are active. MODEL_OVERLAY shows the patch." Always touch marker. + +After upgrade prompts, continue workflow. + +If `WRITING_STYLE_PENDING` is `yes`: ask once about writing style: + +> v1 prompts are simpler: first-use jargon glosses, outcome-framed questions, shorter prose. Keep default or restore terse? + +Options: +- A) Keep the new default (recommended — good writing helps everyone) +- B) Restore V0 prose — set `explain_level: terse` + +If A: leave `explain_level` unset (defaults to `default`). +If B: run `~/.claude/skills/gstack/bin/gstack-config set explain_level terse`. + +Always run (regardless of choice): +```bash +rm -f ~/.gstack/.writing-style-prompt-pending +touch ~/.gstack/.writing-style-prompted +``` + +Skip if `WRITING_STYLE_PENDING` is `no`. + +If `LAKE_INTRO` is `no`: say "gstack follows the **Boil the Lake** principle — do the complete thing when AI makes marginal cost near-zero. Read more: https://garryslist.org/posts/boil-the-ocean" Offer to open: + +```bash +open https://garryslist.org/posts/boil-the-ocean +touch ~/.gstack/.completeness-intro-seen +``` + +Only run `open` if yes. Always run `touch`. + +If `TEL_PROMPTED` is `no` AND `LAKE_INTRO` is `yes`: ask telemetry once via AskUserQuestion: + +> Help gstack get better. Share usage data only: skill, duration, crashes, stable device ID. No code, file paths, or repo names. + +Options: +- A) Help gstack get better! (recommended) +- B) No thanks + +If A: run `~/.claude/skills/gstack/bin/gstack-config set telemetry community` + +If B: ask follow-up: + +> Anonymous mode sends only aggregate usage, no unique ID. + +Options: +- A) Sure, anonymous is fine +- B) No thanks, fully off + +If B→A: run `~/.claude/skills/gstack/bin/gstack-config set telemetry anonymous` +If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off` + +Always run: +```bash +touch ~/.gstack/.telemetry-prompted +``` + +Skip if `TEL_PROMPTED` is `yes`. + +If `PROACTIVE_PROMPTED` is `no` AND `TEL_PROMPTED` is `yes`: ask once: + +> Let gstack proactively suggest skills, like /qa for "does this work?" or /investigate for bugs? + +Options: +- A) Keep it on (recommended) +- B) Turn it off — I'll type /commands myself + +If A: run `~/.claude/skills/gstack/bin/gstack-config set proactive true` +If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false` + +Always run: +```bash +touch ~/.gstack/.proactive-prompted +``` + +Skip if `PROACTIVE_PROMPTED` is `yes`. + +If `HAS_ROUTING` is `no` AND `ROUTING_DECLINED` is `false` AND `PROACTIVE_PROMPTED` is `yes`: +Check if a CLAUDE.md file exists in the project root. If it does not exist, create it. + +Use AskUserQuestion: + +> gstack works best when your project's CLAUDE.md includes skill routing rules. + +Options: +- A) Add routing rules to CLAUDE.md (recommended) +- B) No thanks, I'll invoke skills manually + +If A: Append this section to the end of CLAUDE.md: + +```markdown + +## Skill routing + +When the user's request matches an available skill, invoke it via the Skill tool. When in doubt, invoke the skill. + +Key routing rules: +- Product ideas/brainstorming → invoke /office-hours +- Strategy/scope → invoke /plan-ceo-review +- Architecture → invoke /plan-eng-review +- Design system/plan review → invoke /design-consultation or /plan-design-review +- Full review pipeline → invoke /autoplan +- Bugs/errors → invoke /investigate +- QA/testing site behavior → invoke /qa or /qa-only +- Code review/diff check → invoke /review +- Visual polish → invoke /design-review +- Ship/deploy/PR → invoke /ship or /land-and-deploy +- Save progress → invoke /context-save +- Resume context → invoke /context-restore +``` + +Then commit the change: `git add CLAUDE.md && git commit -m "chore: add gstack skill routing rules to CLAUDE.md"` + +If B: run `~/.claude/skills/gstack/bin/gstack-config set routing_declined true` and say they can re-enable with `gstack-config set routing_declined false`. + +This only happens once per project. Skip if `HAS_ROUTING` is `yes` or `ROUTING_DECLINED` is `true`. + +If `VENDORED_GSTACK` is `yes`, warn once via AskUserQuestion unless `~/.gstack/.vendoring-warned-$SLUG` exists: + +> This project has gstack vendored in `.claude/skills/gstack/`. Vendoring is deprecated. +> Migrate to team mode? + +Options: +- A) Yes, migrate to team mode now +- B) No, I'll handle it myself + +If A: +1. Run `git rm -r .claude/skills/gstack/` +2. Run `echo '.claude/skills/gstack/' >> .gitignore` +3. Run `~/.claude/skills/gstack/bin/gstack-team-init required` (or `optional`) +4. Run `git add .claude/ .gitignore CLAUDE.md && git commit -m "chore: migrate gstack from vendored to team mode"` +5. Tell the user: "Done. Each developer now runs: `cd ~/.claude/skills/gstack && ./setup --team`" + +If B: say "OK, you're on your own to keep the vendored copy up to date." + +Always run (regardless of choice): +```bash +eval "$(~/.claude/skills/gstack/bin/gstack-slug 2>/dev/null)" 2>/dev/null || true +touch ~/.gstack/.vendoring-warned-${SLUG:-unknown} +``` + +If marker exists, skip. + +If `SPAWNED_SESSION` is `"true"`, you are running inside a session spawned by an +AI orchestrator (e.g., OpenClaw). In spawned sessions: +- Do NOT use AskUserQuestion for interactive prompts. Auto-choose the recommended option. +- Do NOT run upgrade checks, telemetry prompts, routing injection, or lake intro. +- Focus on completing the task and reporting results via prose output. +- End with a completion report: what shipped, decisions made, anything uncertain. + +## AskUserQuestion Format + +### Tool resolution (read first) + +"AskUserQuestion" can resolve to two tools at runtime: the **host MCP variant** (e.g. `mcp__conductor__AskUserQuestion` — appears in your tool list when the host registers it) or the **native** Claude Code tool. + +**Rule:** if any `mcp__*__AskUserQuestion` variant is in your tool list, prefer it. Hosts may disable native AUQ via `--disallowedTools AskUserQuestion` (Conductor does, by default) and route through their MCP variant; calling native there silently fails. Same questions/options shape; same decision-brief format applies. + +**If no AskUserQuestion variant appears in your tool list, this skill is BLOCKED.** Stop, report `BLOCKED — AskUserQuestion unavailable`, and wait for the user. Do not write decisions to the plan file as a substitute, do not emit them as prose and stop, and do not silently auto-decide (only `/plan-tune` AUTO_DECIDE opt-ins authorize auto-picking). + +### Format + +Every AskUserQuestion is a decision brief and must be sent as tool_use, not prose. + +``` +D +Project/branch/task: <1 short grounding sentence using _BRANCH> +ELI10: +Stakes if we pick wrong: +Recommendation: because +Completeness: A=X/10, B=Y/10 (or: Note: options differ in kind, not coverage — no completeness score) +Pros / cons: +A)