diff --git a/AGENTS.md b/AGENTS.md index d872174535..831de73529 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -11,6 +11,7 @@ Skills live in `.agents/skills/`. Invoke them by name (e.g., `/office-hours`). | Skill | What it does | |-------|-------------| | `/office-hours` | Start here. Reframes your product idea before you write code. | +| `/product-iteration` | Existing-product iteration: turn usage, feedback, and surprise behavior into the next move. | | `/plan-ceo-review` | CEO-level review: find the 10-star product in the request. | | `/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. | diff --git a/CHANGELOG.md b/CHANGELOG.md index 40ca6cbc65..52eb8af64b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,49 @@ # Changelog +## [1.21.0.0] - 2026-04-29 + +## **Existing products now get their own strategy loop.** +## **You can iterate from signal, not founder taste alone.** + +If you already have users, `/office-hours` is no longer the only thoughtful starting point. gstack now ships `/product-iteration`, a new skill built for the moment after reality has spoken: users are doing something interesting, support keeps hearing the same complaint, activation is soft, or the product is being bent into a workflow you did not plan for. Instead of brainstorming from vibes, it starts from observed behavior, separates facts from interpretation, forces a normalized decision metric, classifies the problem into one primary iteration mode, and ends with 3 distinct directions plus a concrete 7-day test. + +This fills a real gap in the stack. `/office-hours` is still the greenfield move. `/plan-ceo-review` is still the ambition check. `/product-iteration` now sits between them for existing products that need evidence-driven next moves. The routing docs, install docs, and generated skill catalog all point to it, so the workflow is discoverable instead of living as tribal knowledge. + +### The numbers that matter + +Source: `product-iteration/SKILL.md.tmpl`, `README.md`, `docs/skills.md`, and `SKILL.md.tmpl` in this branch. Reproduce with repo-local inspection and `rg product-iteration README.md docs/skills.md SKILL.md.tmpl`. + +| Surface | Before | After | Δ | +|---|---:|---:|---:| +| Existing-product iteration skills in gstack | 0 | 1 | +1 | +| Explicit iteration modes in the workflow | 0 | 5 | +5 | +| Forcing questions aimed at real product signal | 0 | 6 | +6 | +| Required strategic options per run | 0 | 3 | +3 | +| Default experiment horizon in the output | 0 days | 7 days | +7 days | + +The big shift is not the file count. It is that gstack now has a first-class answer for "what should we build next?" when the right answer depends on evidence, not taste. That makes the product loop tighter for teams that already shipped and now need judgment, not just ideation. + +For founders and product builders, use `/product-iteration` the first time you have real behavior, real complaints, or real pull. It should sharpen scope before you widen it, and it should stop a lot of premature platform thinking. Try it when you catch yourself saying "users keep doing this weird thing" or "we have feedback, but I don't know what it means yet." + +### Itemized changes + +#### Added + +- `/product-iteration`, a new existing-product strategy skill focused on real usage, feedback, retention, activation, workflow expansion, monetization, and wedge decisions. +- A structured iteration brief that separates observed facts, interpretations, open questions, and evidence quality before making recommendations. +- A decision frame that requires a normalized metric, denominator, baseline, meaningful lift target, three distinct options, and a recommended 7-day test. + +#### Changed + +- Root skill routing now sends existing-product "what should we build next?" asks to `/product-iteration` instead of overloading `/office-hours` or `/plan-ceo-review`. +- `README.md`, `docs/skills.md`, `AGENTS.md`, and `CLAUDE.md` now document where `/product-iteration` fits in the gstack workflow. +- Generated skill docs now include `/product-iteration` across supported hosts. + +#### For contributors + +- `product-iteration/SKILL.md.tmpl` is the source of truth. Regenerate with `bun run gen:skill-docs` or `bun run build` after edits. +- Contributed by @tongchen92. + ## [1.20.0.0] - 2026-04-28 ## **Browser-skills land. `/scrape ` first call drives the page; second call runs the codified script in 200ms.** diff --git a/CLAUDE.md b/CLAUDE.md index c0f07f6901..e2463c4852 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -119,6 +119,7 @@ gstack/ ├── codex/ # /codex skill (multi-AI second opinion via OpenAI Codex CLI) ├── land-and-deploy/ # /land-and-deploy skill (merge → deploy → canary verify) ├── office-hours/ # /office-hours skill (YC Office Hours — startup diagnostic + builder brainstorm) +├── product-iteration/ # /product-iteration skill (existing-product iteration from real usage + feedback) ├── investigate/ # /investigate skill (systematic root-cause debugging) ├── retro/ # Retrospective skill (includes /retro global cross-project mode) ├── bin/ # CLI utilities (gstack-repo-mode, gstack-slug, gstack-config, etc.) diff --git a/README.md b/README.md index 426c8468f3..88f79682a1 100644 --- a/README.md +++ b/README.md @@ -35,10 +35,11 @@ Fork it. Improve it. Make it yours. And if you want to hate on free open source 1. Install gstack (30 seconds — see below) 2. Run `/office-hours` — describe what you're building -3. Run `/plan-ceo-review` on any feature idea -4. Run `/review` on any branch with changes -5. Run `/qa` on your staging URL -6. Stop there. You'll know if this is for you. +3. If you already have users, run `/product-iteration` on real feedback or usage +4. Run `/plan-ceo-review` on any feature idea +5. Run `/review` on any branch with changes +6. Run `/qa` on your staging URL +7. Stop there. You'll know if this is for you. ## Install — 30 seconds @@ -48,7 +49,7 @@ Fork it. Improve it. Make it yours. And if you want to hate on free open source Open Claude Code and paste this. Claude does the rest. -> Install gstack: run **`git clone --single-branch --depth 1 https://github.com/garrytan/gstack.git ~/.claude/skills/gstack && cd ~/.claude/skills/gstack && ./setup`** then add a "gstack" section to CLAUDE.md that says to use the /browse skill from gstack for all web browsing, never use mcp\_\_claude-in-chrome\_\_\* tools, and lists the available skills: /office-hours, /plan-ceo-review, /plan-eng-review, /plan-design-review, /design-consultation, /design-shotgun, /design-html, /review, /ship, /land-and-deploy, /canary, /benchmark, /browse, /connect-chrome, /qa, /qa-only, /design-review, /setup-browser-cookies, /setup-deploy, /setup-gbrain, /retro, /investigate, /document-release, /codex, /cso, /autoplan, /plan-devex-review, /devex-review, /careful, /freeze, /guard, /unfreeze, /gstack-upgrade, /learn. Then ask the user if they also want to add gstack to the current project so teammates get it. +> Install gstack: run **`git clone --single-branch --depth 1 https://github.com/garrytan/gstack.git ~/.claude/skills/gstack && cd ~/.claude/skills/gstack && ./setup`** then add a "gstack" section to CLAUDE.md that says to use the /browse skill from gstack for all web browsing, never use mcp\_\_claude-in-chrome\_\_\* tools, and lists the available skills: /office-hours, /product-iteration, /plan-ceo-review, /plan-eng-review, /plan-design-review, /design-consultation, /design-shotgun, /design-html, /review, /ship, /land-and-deploy, /canary, /benchmark, /browse, /connect-chrome, /qa, /qa-only, /design-review, /setup-browser-cookies, /setup-deploy, /setup-gbrain, /retro, /investigate, /document-release, /codex, /cso, /autoplan, /plan-devex-review, /devex-review, /careful, /freeze, /guard, /unfreeze, /gstack-upgrade, /learn. Then ask the user if they also want to add gstack to the current project so teammates get it. ### Step 2: Team mode — auto-update for shared repos (recommended) @@ -179,6 +180,7 @@ Each skill feeds into the next. `/office-hours` writes a design doc that `/plan- | Skill | Your specialist | What they do | |-------|----------------|--------------| | `/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. | +| `/product-iteration` | **Existing-Product PM** | Turn real usage, feedback, and surprise behavior into a sharp next move. Finds the strongest pull, generates 3 ambitious directions, and recommends a 7-day test. | | `/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-eng-review` | **Eng Manager** | Lock in architecture, data flow, diagrams, edge cases, and tests. Forces hidden assumptions into the open. | | `/plan-design-review` | **Senior Designer** | Rates each design dimension 0-10, explains what a 10 looks like, then edits the plan to get there. AI Slop detection. Interactive — one AskUserQuestion per design choice. | @@ -451,7 +453,7 @@ Data is stored in [Supabase](https://supabase.com) (open source Firebase alterna ``` ## gstack Use /browse from gstack for all web browsing. Never use mcp__claude-in-chrome__* tools. -Available skills: /office-hours, /plan-ceo-review, /plan-eng-review, /plan-design-review, +Available skills: /office-hours, /product-iteration, /plan-ceo-review, /plan-eng-review, /plan-design-review, /design-consultation, /design-shotgun, /design-html, /review, /ship, /land-and-deploy, /canary, /benchmark, /browse, /open-gstack-browser, /qa, /qa-only, /design-review, /setup-browser-cookies, /setup-deploy, /setup-gbrain, /retro, /investigate, /document-release, diff --git a/SKILL.md b/SKILL.md index 4269f6f4d8..d63c4297e4 100644 --- a/SKILL.md +++ b/SKILL.md @@ -436,6 +436,7 @@ quality gates that produce better results than answering inline. **Routing rules — when you see these patterns, INVOKE the skill via the Skill tool:** - User describes a new idea, asks "is this worth building", brainstorms, pitches a concept → invoke `/office-hours` +- User has an existing product and asks what to build next based on users, feedback, activation, retention, or surprising usage → invoke `/product-iteration` - User asks about strategy, scope, ambition, "think bigger", "what should we build" → invoke `/plan-ceo-review` - User asks to review architecture, lock in the plan, "does this design make sense" → invoke `/plan-eng-review` - User asks about design system, brand, visual identity, "how should this look" → invoke `/design-consultation` diff --git a/SKILL.md.tmpl b/SKILL.md.tmpl index a248cbfa32..bfa44c09aa 100644 --- a/SKILL.md.tmpl +++ b/SKILL.md.tmpl @@ -32,6 +32,7 @@ quality gates that produce better results than answering inline. **Routing rules — when you see these patterns, INVOKE the skill via the Skill tool:** - User describes a new idea, asks "is this worth building", brainstorms, pitches a concept → invoke `/office-hours` +- User has an existing product and asks what to build next based on users, feedback, activation, retention, or surprising usage → invoke `/product-iteration` - User asks about strategy, scope, ambition, "think bigger", "what should we build" → invoke `/plan-ceo-review` - User asks to review architecture, lock in the plan, "does this design make sense" → invoke `/plan-eng-review` - User asks about design system, brand, visual identity, "how should this look" → invoke `/design-consultation` diff --git a/VERSION b/VERSION index 193c1f8732..887344e04b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.20.0.0 +1.21.0.0 diff --git a/docs/skills.md b/docs/skills.md index 71d5b68dad..3f2cc9490b 100644 --- a/docs/skills.md +++ b/docs/skills.md @@ -5,6 +5,7 @@ Detailed guides for every gstack skill — philosophy, workflow, and examples. | Skill | Your specialist | What they do | |-------|----------------|--------------| | [`/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. | +| [`/product-iteration`](#product-iteration) | **Existing-Product PM** | Turn real usage, feedback, and surprise behavior into a sharp next move. Finds the strongest pull, generates 3 ambitious directions, and recommends a 7-day test. | | [`/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-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. | @@ -99,6 +100,60 @@ After the design doc is approved, `/office-hours` reflects on what it noticed ab --- +## `/product-iteration` + +This is the skill for **what to build next after reality has spoken**. + +`/office-hours` is for before the product exists. `/product-iteration` is for after users have done something interesting, annoying, or revealing enough that your next move should be anchored in evidence, not taste alone. + +### What it does + +It starts from actual product signal: + +- user behavior +- retention or activation patterns +- support complaints +- surprise workflows +- repeated feature requests +- manual workarounds + +Then it forces the core product questions: + +- Where is the pull most concentrated? +- What are users still doing outside the product? +- What surprised you in real usage? +- What pain shows up when the product fails or disappears? +- Which repeated request is actually a deeper job? +- If you believe the strongest signal, what bigger product becomes obvious? + +### Why this matters + +Most iteration advice is too mushy. It averages across users too early, overweights what people say instead of what they do, and jumps from one quote to a giant platform vision. This skill is stricter. + +It forces: + +- one primary mode: activation, retention, workflow expansion, monetization, or wedge +- a normalized decision metric with a denominator +- evidence-quality grading +- three meaningfully different options +- a concrete 7-day test with kill criteria + +The result is a product iteration brief that says, clearly: **this is the strongest signal, this is the bigger job trying to emerge, this is the direction to test next**. + +### When to use it + +Use `/product-iteration` when you say things like: + +- "What should we build next?" +- "Here’s what users are telling us." +- "Where should we double down?" +- "Help me analyze this feedback dump." +- "Activation is weak — what does the evidence say?" + +If there is no real user or product signal yet, use `/office-hours` instead. + +--- + ## `/plan-ceo-review` This is my **founder mode**. diff --git a/package.json b/package.json index 1752a38c8c..ef060fa8a0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gstack", - "version": "1.20.0.0", + "version": "1.21.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/product-iteration/SKILL.md b/product-iteration/SKILL.md new file mode 100644 index 0000000000..386ee965c6 --- /dev/null +++ b/product-iteration/SKILL.md @@ -0,0 +1,1109 @@ +--- +name: product-iteration +preamble-tier: 3 +version: 1.0.0 +description: | + gstack existing-product iteration partner. Analyze real user behavior, + feedback, and product signals from an existing product; find the strongest + pull; generate 3 + ambitious-but-earned directions; and recommend a concrete 7-day test. Use when + asked "what should we build next", "how should we iterate", "what should we + double down on", "analyze this feedback", or when there is already usage, + complaints, retention, or surprise behavior. Not for greenfield ideation — use + /office-hours when there is no product signal yet. +allowed-tools: + - Bash + - Read + - Grep + - Glob + - Write + - Edit + - AskUserQuestion + - WebSearch +triggers: + - what should we build next + - how should we iterate + - analyze this feedback + - what should we double down on + - product iteration + - user feedback analysis + - retention issue + - activation issue + - what are users telling us +--- + + + +## 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":"product-iteration","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":"product-iteration","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 satisfies plan mode's end-of-turn requirement. 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 + +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)