garrytan/gstack · v1.61.0.0 · read 2026-08-08

gstack, step by step

A software factory built entirely out of markdown files. One person describes a feature; a line of specialists talks it over, writes it, breaks it, fixes it, and ships it. This atlas walks one change from idea to production, then lists all 53 workers.

writes can change files in your repo, your git history, or your install reads inspects and reports (it may still drive a browser or write gstack's own notes)
On this page
  1. What it is
  2. Key decisions (C1–C5, F1–F8)
  3. The file is the program
  4. The preamble
  5. Think: the review panel
  6. Build: the safety rails
  7. Review: the specialist fan
  8. Test: giving it eyes
  9. Ship: the gate chain
  10. Reflect: the loop back
  11. Day zero and self-update
  12. Full roster (53)

What it is

gstack is a set of 53 skills β€” markdown files an agent reads and follows β€” that turn one coding agent into a virtual engineering team. Each skill plays a role: a CEO who rethinks the product, an eng manager who locks architecture, a designer who catches slop, a staff engineer who finds the bug that passes CI, a QA lead who opens a real browser, a security officer, a release engineer. You call them as slash commands. There is no server, no account, no runtime beyond your agent β€” the only compiled thing in the repo is a headless-browser daemon, because giving the agent eyes was the one job markdown couldn't do.

The organising idea is that a sprint is a pipeline of artifacts: /office-hours writes a design doc that /plan-ceo-review reads; /plan-eng-review writes a test plan that /qa picks up; /review finds bugs that /ship checks are fixed. Files on disk are the handoff, so nothing is lost when the agent's context window resets.

The glossary map

Shared termgstack's wordWhere it lives
skillskill (same)one directory per skill, each with a SKILL.md.tmpl
dispatcherskill routinga routing block written into your project's CLAUDE.md, plus per-skill trigger phrases
always-onthe preamblescripts/resolvers/preamble.ts β€” baked into every skill at build time
filing gatethe Review Readiness Dashboard + the Verification Gatescripts/resolvers/review.ts, ship/SKILL.md.tmpl
intake fanthe Review Armyscripts/resolvers/review-army.ts β€” one diff out to 7 specialists and back
self-repair loopthe fix-and-re-verify loopqa/SKILL.md.tmpl, investigate/SKILL.md.tmpl (stops after 3 failed fixes)
pruningprune / gating / decay/learn prune, hit-rate gating, a taste profile that decays 5%/week
night shift— none automatedthe closest thing is /retro, which you run yourself once a week
meta layerthe generator + /skillify + /plan-tunescripts/gen-skill-docs.ts β€” skills that make and tune skills
braingbrain (a separate repo)optional; wired in by /setup-gbrain and /sync-gbrain
compile vs retrieve forkgenerated-and-committed docsgstack compiles: templates become SKILL.md at build time, never at run time

Body vs brain

The body is Claude Code (and nine other agents). gstack is the process layer that sits inside it β€” it does not run anything, it tells the agent what to do next and in what order. The brain is a separate project, gbrain, which gstack can plug in but never requires. Not part of gstack: your model provider, your CI, your deploy platform, and your code.

One honest caveat. Almost none of this is enforced. Skills are prose that an agent chooses to follow, so "the gate blocks you" means "the instructions say stop." Exactly two things in the pipeline are real mechanical blocks: /freeze, which denies Edit and Write through a tool hook, and the credential scanner, which exits non-zero before a push. Everything else β€” the review gates, the iron laws, the completeness rules β€” is a very well-written suggestion. gstack says so about its own redaction guard: it is a guardrail, not airtight enforcement. The same sentence fairly describes the whole product.


Key decisions

The repo rendered as answers to the library's canonical questions. IDs are stable, so the same number can be compared across atlases.

C1 Source of truth

Chose
Your git repo, plus plain markdown skill files on disk. gstack's own memory is append-only JSONL under ~/.gstack/projects/<slug>/. Nothing hosted is required for any of it to work.
Why
The design doc for the memory layer is blunt about the target: after 20 sessions on a codebase, gstack should know every architectural decision, every past bug pattern, and every time it was wrong β€” and a context window can't hold that, so it goes to disk beside the repo. Four separate stores, deliberately non-overlapping: Learnings = what you know. Timeline = what happened. Checkpoints = where you are. Health = how good the code is.
Trade-off
Their own backlog flags JSONL as the wrong primitive for multi-writer canonical state β€” lost updates on rewrite, partial-line corruption on crash, no transactions. It was hardened with file locks and append-only opens; SQLite is the intended fix and hasn't landed. State also lives outside your repo, so it does not travel with a clone.
Links

C2 Trust & safety boundaries

Chose
Four separate boundaries rather than one policy: the browser daemon is localhost-only behind a bearer token; a remote-pairing tunnel gets its own TCP socket with a locked path allowlist; the browser sidebar runs a six-layer prompt-injection stack; and a shared redaction engine scans the exact bytes before they leave the machine.
Why
On the tunnel: The security property comes from physical port separation: a tunnel caller cannot reach /health or /cookie-picker because those paths don't exist on that TCP socket. Header inference … is unreliable; socket separation isn't. On injection: a single confident classifier is not enough, because a Stack Overflow page about prompt injection looks exactly like prompt injection β€” so BLOCK needs two classifiers agreeing at β‰₯0.75, while a leaked canary token blocks on its own.
Trade-off
Layers cost weight and money: a 22 MB model always, 721 MB if you opt into the ensemble, and a paid Haiku call on traffic that clears a 0.40 floor. And the redaction guard is bypassable by design β€” git push --no-verify, a direct gh issue create, or one env var all walk around it. There is intentionally no config key to disable the HIGH-severity block.
Links

C3 Cost model

Chose
A free deterministic tier that catches most problems, with every paid tier explicitly gated. Static validation is free and runs on every commit; the LLM-judge tier is ~$0.15; the end-to-end tier that spawns real agent sessions is ~$3.85 and ~20 minutes, and only runs on tests whose declared file dependencies appear in the diff.
Why
Stated as a rule: catch 95% of issues for free, use LLMs only for judgment calls. The same instinct runs through the skills β€” reviews under 50 changed lines skip all specialists, a specialist with zero findings in ten dispatches gets auto-skipped, and the paid transcript security check only fires when a cheaper local scan scores above 0.40.
Trade-off
The caps are heuristics, not budgets: nothing measures or limits what a long /qa or /autoplan session actually spends, and /autoplan deliberately runs four full reviews back to back. Concurrent eval runs on one machine had to be serialised behind a machine-wide lock because they were rate-limiting each other.
Links

C4 Integration surface

Chose
Slash commands and markdown. Ten host agents are supported through typed config objects β€” Claude Code, Codex, Cursor, OpenCode, Factory, Slate, Kiro, Hermes, OpenClaw, gbrain β€” and adding an eleventh is one TypeScript file with zero code changes elsewhere. MCP was explicitly rejected.
Why
Verbatim: No MCP protocol. MCP adds JSON schema overhead per request and requires a persistent connection. Plain HTTP + plain text output is lighter on tokens and easier to debug. The generator, setup script, uninstaller, health check and tests all read the host configs, so none of them contain per-host branching.
Trade-off
Skills can't be called as typed tools by another program β€” they're prose an agent reads, so behaviour varies with the model. Each host needs its own path and tool-name rewrites, and some resolvers are suppressed per host, which is real maintenance surface. gstack also asks you to put a routing block in your own CLAUDE.md so the agent knows the skills exist.
Links

C5 Extension model

Chose
The unit is a directory containing SKILL.md.tmpl. You write the prose and judgment; 22 resolver modules fill in placeholders from the actual source code at build time; the generated SKILL.md is committed to git.
Why
Hand-maintained docs drift from code, and a skill that lists a flag which doesn't exist makes the agent fail. The generated approach is structurally sound β€” if a command exists in code, it appears in docs. If it doesn't exist, it can't appear. Committed rather than generated at run time for three reasons: the agent reads the file at load time with no build step available, CI can diff it to catch staleness, and git blame keeps working.
Trade-off
Every change is a two-step: edit the template, regenerate, commit both. Merge conflicts on generated files are a documented footgun with a written rule never to resolve them by picking a side. And skills grow β€” there's a 160 KB (~40K token) warning ceiling, with the honest note that some skills legitimately pack 25–35K tokens of behaviour.
Links

F1 Role decomposition

Chose
Roles cut the way a startup org chart cuts: CEO, eng manager, senior designer, DX lead, staff engineer, QA lead, chief security officer, SRE, release engineer, technical writer, debugger. Reviews split again by when β€” a plan-stage version and a live-audit version of the same lens (/plan-design-review vs /design-review, /plan-devex-review vs /devex-review). Code reviewers run as separate subagents with fresh context.
Why
The org-chart cut is the author's own domain β€” a YC president who has watched thousands of teams β€” and it maps to what a founder already knows how to manage. Separate contexts are required for the review specialists so each one arrives with no prior review bias.
Trade-off
53 skills is a lot of surface to remember, and the roles overlap: the plan-stage and live versions of a review share a generated methodology block but are separate files, and the README's own count ("twenty-three specialists and eight power tools") no longer matches the directory listing.
Links

F2 Pipeline & gate ordering

Chose
Think β†’ Plan β†’ Build β†’ Review β†’ Test β†’ Ship β†’ Reflect, with each stage writing an artifact the next stage reads. Of everything in that chain, exactly two things can stop a ship: a clean Eng Review less than 7 days old, and the Step 16 Verification Gate that re-runs tests if any code changed after the last run. Every other review is advisory.
Why
Two gates is a deliberate anti-ceremony position β€” the dashboard shows CEO, design, adversarial and outside-voice status for context but never block shipping, so the pipeline stays fast for the bug fixes that are most of the work. The Verification Gate exists because agents lie about being done: NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE.
Trade-off
The one required gate can be turned off globally with a single config key, described in the repo as the ‘don't bother me’ setting. And the 7-day freshness window means a review from last Tuesday clears a diff written this morning.
Links

F3 Human decision points

Chose
Every auto-decision is classified mechanical (one clearly right answer β€” decide silently) or taste (reasonable people could disagree β€” decide anyway, but surface it at one final approval gate). /autoplan runs four full reviews this way, using six named principles, so you answer one question instead of fifteen to thirty.
Why
The ethos file makes it the rule that overrides all others: AI models recommend. Users decide. And explicitly: Two AI models agreeing on a change is a strong signal. It is not a mandate. When Claude and Codex both want something and the user says no, the user is right. Always. Every question uses one format β€” context, question, a RECOMMENDATION: Choose X because ___ line, then lettered options.
Trade-off
The line between mechanical and taste is drawn by the same model doing the deciding, so a bad call is invisible unless you read the plan diff. And /autoplan's six principles are opinionated in one direction β€” "choose completeness", "bias toward action" β€” which is the right default for a solo founder and the wrong one for a regulated codebase.
Links

F4 Quality enforcement

Chose
A stack, cheapest first: free static validation of every command referenced in a skill; a scope-detected fan-out of up to seven specialist subagents emitting structured JSON findings; an always-on adversarial pass; a cross-vendor second opinion from Codex; and a rule that every claim in a review must cite a line.
Why
Reviews fail two ways β€” missing bugs, and inventing them. The specialist fan attacks the first (separate contexts, one checklist each, a test_stub field when the finding is testable). The citation rule attacks the second: Rationalization prevention: ‘This looks fine’ is not a finding. Either cite evidence it IS fine, or flag it as unverified. A matching rule governs blaming a failure on someone else's change: ‘Pre-existing’ without receipts is a lazy claim. Prove it or don't say it.
Trade-off
Most of the judgment is still an LLM's, and the tier that actually spawns real sessions is the slow expensive one, so it runs on a diff-selected subset. Deduplication across specialists is a string fingerprint (path:line:category), which merges the easy duplicates and misses the reworded ones.
Links

F5 Safety rails

Chose
Opt-in and layered. /freeze registers a PreToolUse hook that returns deny for any Edit or Write outside one directory. /careful warns before destructive shell commands. /guard is both. A continuous checkpoint mode auto-commits work-in-progress locally. /canary watches production after a deploy.
Why
/freeze is the one place gstack decided prose wasn't enough β€” it is a hard block, not just a warning, because an agent debugging one module will cheerfully "fix" an unrelated one. /investigate auto-freezes to the module under investigation. Checkpoint pushes are off by default so WIP commits don't trigger everyone's CI.
Trade-off
The hook lives in your ~/.claude/settings.json, so gstack edits a file you own; it writes a timestamped backup first and has a rollback command, which is the right mitigation but still a real intrusion. Everything else in this group is advisory and can be talked out of.
Links

F6 Model routing & economics

Chose
Behaviour is patched per model family rather than routed per task. model-overlays/ holds one markdown file per family (claude, gpt, gpt-5.4, o-series, gemini, opus-4-7) with an {{INHERIT:…}} directive so a specific version builds on its family. Genuine multi-model work is a deliberate act: /codex for a second opinion, /benchmark-models to race three vendors on the same prompt.
Why
Overlays are explicitly subordinate: They are subordinate to skill workflow, STOP points, AskUserQuestion gates … If a nudge below conflicts with skill instructions, the skill wins. Treat these as preferences, not rules. Where real routing exists it's inside the browser sidebar β€” a fast model for clicking, a stronger one for reading, and a small one for the security transcript check.
Trade-off
There is no cheap-model-first gate on the expensive skills; a review runs on whatever model your session is on. Overlays are prose nudges with no enforcement, and each extra vendor brings its own auth story.
Links

F7 Distribution & team adoption

Chose
One global clone at ~/.claude/skills/gstack, with per-skill directories symlinked out of it. Team mode bootstraps your repo β€” not with vendored files, but with a CLAUDE.md section and a hook that installs gstack for any teammate who doesn't have it. Every session does a silent update check, throttled to once an hour and safe to fail.
Why
The pitch is the absence of drift: No vendored files in your repo, no version drift, no manual upgrades. Vendoring is explicitly deprecated, and gstack-team-init will find and remove an old vendored copy for you. Changes that alter on-disk state ship with a migration script that the upgrade skill runs automatically.
Trade-off
Symlinks are the whole strategy, and Windows without Developer Mode can't make them β€” setup falls back to copies, which means users there must re-run ./setup after every git pull or silently run stale skills. Team mode in required mode also blocks teammates' AI work until they install, which is a strong ask.
Links

F8 Learning loop

Chose
Four append-only stores per project (learnings, timeline, checkpoints, health history) plus an event-sourced decision log. Every skill's preamble reads them on the way in and writes to them on the way out. Three things actually change future behaviour: a specialist with no findings in ten dispatches gets auto-skipped, a design taste profile decays 5% a week and biases the next round of mockups, and a per-site browser note goes live only after three successful uses.
Why
The problem statement is the whole argument: A /review session catches an N+1 query pattern, and the next /review on the same codebase starts from scratch. The differentiator claimed against Cursor and CLAUDE.md is structure β€” typed, scored, decaying, cross-skill β€” rather than storage. The decision log is event-sourced (decide / supersede / redact) so "active" is computed and history stays honest.
Trade-off
Pruning is manual and human-judged: /learn prune flags learnings that reference deleted files or contradict each other and then asks you about each one. Nothing expires on its own, so the store grows. Cross-project recall is off by default β€” deliberately, so a consultant doesn't carry Client A's patterns into Client B's repo.
Links

The life of one change

Nine steps, in the order a change actually moves through the factory.

01

The file is the program

Before anything runs, a skill has to exist and be correct. A human writes prose and judgment into a template. A build step fills the mechanical parts β€” the command list, the flags, the shared methodology blocks β€” straight out of the source code. The result is committed to git.

That ordering is the whole trick. Docs can't claim a flag the code doesn't have, because the flag list is read from the code. And because the output is committed, the agent can just open the file: there is no build step at the moment you type a slash command.

SKILL.md.tmpl prose + judgment 22 resolvers preamble, review, gbrain… source code commands.ts, hosts/*.ts gen-skill-docs build time only writes SKILL.md committed to git symlink Claude Code ~/.claude/skills Codex, Cursor… 8 more hosts OpenClaw + tool adapter CI re-runs the generator and diffs β€” a stale SKILL.md fails the build
The generator runs at build time, never at slash-command time. CI regenerates and diffs, so a template edit that wasn't regenerated can't merge.
  • scripts/gen-skill-docs.tsReads templates and source metadata, writes every SKILL.md. Also enforces the ~40K-token warning ceiling.
  • scripts/resolvers/index.tsThe 22 placeholder resolvers β€” preamble, review dashboard, QA methodology, design methodology, gbrain blocks, redaction docs.
  • hosts/index.tsTen typed host configs. Each declares install paths, frontmatter rules, path and tool rewrites, and which resolvers to suppress.
  • setupDetects which agents you have installed and links the skills into each one's directory.
02

The preamble: what runs before every skill

Every skill opens with the same generated block β€” the always-on layer. It checks for an update, touches a session file, recovers context from disk, states the question format, and injects the builder ethos. None of it is skill-specific, which is exactly why it's generated in rather than copied.

One nice detail: it counts how many gstack sessions you've touched in the last two hours. At three or more, every skill switches to a mode where each question re-states which project and branch it's about β€” because you're juggling windows and you will get them confused.

/any-skill invoked {{PREAMBLE}} 1 Β· update check (hourly, silent) 2 Β· session tracking 3 Β· context recovery from disk 4 Β· AskUserQuestion format 5 Β· ethos: search before building on exit: 6 Β· log what went wrong count < 3 count β‰₯ 3 normal questions re-grounding mode every question names skill body runs its own steps on finish: append learnings + timeline to disk
One generated block, six jobs, one branch. The dashed return path is what makes the loop in step 8 possible: the preamble both reads the stores and writes back to them.
  • scripts/resolvers/preamble.tsGenerates the block. Also owns the writing-style directive β€” jargon glossed on first use, questions framed as outcomes, terse mode available.
  • bin/gstack-update-checkThrottled once-an-hour version check that fails silently when the network is down.
  • bin/gstack-learnings-searchPulls prior learnings for this project (or across projects, if you opted in) into the skill's context.
  • ETHOS.mdBoil the Ocean, Search Before Building, User Sovereignty. Injected into every tier-2 skill's preamble.
03

Think: the review panel argues before code exists

A change starts as a sentence. /office-hours interrogates it β€” six forcing questions, pushes back on your framing, and writes a design doc. Then up to four reviewers read that doc with different eyes: strategy, architecture, visual design, developer experience. Each writes its own artifact and a task list.

Run individually, that's fifteen to thirty questions. /autoplan runs the same four reviews at full depth but auto-answers the intermediate questions using six stated principles, sorting each call into mechanical (decide silently) or taste (decide, but show your work at the end). You answer once.

/office-hours design doc out /plan-ceo-review expand Β· hold Β· reduce /plan-eng-review data flow Β· test matrix /plan-design-review rate 0–10 per dimension /plan-devex-review TTHW Β· friction traces questions classify each 6 principles completeness Β· DRY Β· action mechanical taste decided silently never shown one approval gate you answer once rejected? the plan goes back around
The fan is the point: four independent lenses on one doc. /autoplan doesn't shorten the reviews β€” it only collapses their questions, so the depth is unchanged and the interruptions go from ~20 to 1.
  • /office-hours readsSix forcing questions that reframe the product before code exists; writes the design doc every later skill reads.
  • /plan-ceo-review readsFounder-mode scope challenge in four modes: expansion, selective expansion, hold scope, reduction.
  • /plan-eng-review readsLocks architecture, diagrams the data flow and state machines, forces hidden assumptions out, writes the test matrix.
  • /plan-design-review readsRates each design dimension 0–10, says what a 10 would look like, then edits the plan toward it. Flags AI slop.
  • /plan-devex-review readsDeveloper-experience review: personas, competitor time-to-hello-world, the magical moment, friction traced step by step.
  • /autoplan readsRuns all four at full depth with auto-decisions, surfacing only the taste calls at one final gate.
  • /spec writesFive phases from vague intent to a filed GitHub issue; can spawn an agent in a fresh worktree to execute it.
04

Build: the only rail that actually holds

While the agent writes code, three opt-in guards are available. Two of them are advisory prose: /careful warns before rm -rf, DROP TABLE, or a force-push, and you can override any warning. One is real: /freeze installs a tool hook that returns deny on any Edit or Write whose path falls outside a directory you name.

That distinction matters more than it looks. An agent debugging one module will happily "improve" an unrelated one on the way past. A warning it wrote itself won't stop it; a hook will. /investigate knows this and auto-freezes itself to the module under investigation.

HARD PATH β€” MECHANICAL agent calls Edit / Write PreToolUse hook check-freeze.sh path inside boundary outside edit lands deny SOFT PATH β€” ADVISORY PROSE agent runs rm -rf / push -f /careful warns override always allowed runs anyway if you say go running alongside checkpoint mode: auto-commit WIP: prefix + decisions body local only unless you opt in /investigate auto-freezes to the module under investigation /guard = careful + freeze
Two paths, two very different guarantees. The top one is enforced by the harness and cannot be argued with; the bottom one is a sentence in a markdown file.
  • /freeze readsRegisters a deny hook so Edit and Write outside one directory are blocked. The only mechanical rail in the build stage.
  • /unfreeze readsClears the boundary.
  • /careful readsAdvisory warnings before destructive shell commands. Say "be careful" to turn it on.
  • /guard readsBoth at once. The recommended posture for production work.
  • /context-save readsSnapshots what you're doing and why, what's decided, what's left β€” so a crash or a context reset isn't fatal.
  • /context-restore readsRebuilds that state, including from the structured bodies of WIP checkpoint commits.
05

Review: one diff out to seven specialists and back

This is the intake fan shape, run backwards: one diff goes out to several specialist subagents at once, and their findings come back to one place. Each specialist gets a fresh context and exactly one checklist, so it can't be talked out of its own domain by the rest of the review.

Three gates decide who runs. Diffs under 50 changed lines skip everyone. Then scope detection asks whether this diff even touches auth, migrations, or an API contract. Then hit-rate gating: a specialist that has found nothing in ten dispatches gets auto-skipped β€” except security and data-migration, which are tagged never-gate because they're insurance, not throughput.

Findings come back as one JSON object per line with a severity, a confidence score and a fingerprint. They get merged, deduplicated, then split: mechanical ones are fixed on the spot, judgment ones are batched into a single question. Anything that came with a proposed test is always escalated to you.

the diff vs base branch size <50 β†’ skip scope auth? api? hit rate 0 in 10 β†’ skip parallel testing maintainability security ✱ performance data-migration ✱ api-contract red-team ✱ never gated β€” insurance, not throughput merge dedupe on path:line:category auto-fix applied now one question all ASK items batched a finding with a proposed test always escalates here
Fan out, fan in. Note the direction of the gates: they run before the fan, so a skipped specialist costs nothing. Hit-rate gating means the review pipeline gets cheaper the longer you use it on one codebase.
  • /review writesThe pre-landing review. Runs the specialist fan, then the fix-first split: auto-fix the mechanical, batch-ask the rest.
  • /codex readsA different vendor's model on the same diff. Three modes: pass/fail review, adversarial challenge, open consultation.
  • /cso readsOWASP Top 10 plus STRIDE. Tuned for zero noise: 17 false-positive exclusions and a confidence gate, each finding with an exploit scenario.
  • /investigate writesRoot-cause debugging under an iron law β€” no fixes without investigation. Stops and re-thinks after 3 failed fixes.
  • /health readsType checker, linter, tests and dead code rolled into one score, tracked over time.
  • review/specialists/security.mdOne of seven checklists. Each is a plain markdown file handed to a fresh subagent.
06

Test: giving the agent eyes

This is the one part of gstack that isn't markdown, and the reason is latency. Launching a browser per command costs 2–3 seconds and loses your login between calls. So a long-lived Chromium sits behind a localhost HTTP server: first command ~3 seconds, every command after ~100–200 ms, cookies and tabs intact.

The agent addresses elements by ref β€” @e1, @e2 β€” which come from the accessibility tree, not from injected DOM attributes. Injecting attributes breaks on content-security policies, on React re-renders, and on shadow DOM; accessibility-tree locators don't touch the page at all. Refs are cleared on navigation on purpose, so a stale ref fails loudly instead of clicking the wrong thing.

On top of that, /qa runs a self-repair loop: find a bug, fix it, write the regression test, re-run the flow, confirm it's gone.

THE DAEMON β€” ~100ms PER COMMAND AFTER THE FIRST $B snapshot compiled CLI HTTP + bearer server 127.0.0.1 only CDP Chromium tabs + cookies live accessibility tree β†’ @e1 @e2 @e3 no DOM mutation Β· CSP-safe Β· shadow-DOM-safe $B click @e3 stale ref β†’ loud error THE /qa SELF-REPAIR LOOP click through bug found fix + commit regression test re-verify still broken? go round again
Two mechanisms stacked: a persistent daemon for speed, and an accessibility-tree ref system so the agent can point at things without editing the page. /qa-only runs the top half and the first box of the loop, then stops.
  • /qa writesDrives a real browser, finds bugs, fixes them in atomic commits, generates the regression test, re-verifies.
  • /qa-only readsIdentical methodology, report only. The pair exists so you can point QA at a codebase you don't want touched.
  • /browse readsThe browser CLI itself. Also a raw Chrome DevTools escape hatch behind a deny-by-default allowlist.
  • /open-gstack-browser readsA visible Chromium with a sidebar agent, anti-bot stealth and a six-layer prompt-injection defence.
  • /setup-browser-cookies readsImports cookies from your real browser so authenticated pages are testable. Values are never written to disk or shown.
  • /pair-agent readsLets another vendor's agent drive the same browser in its own tab, over a separately-bound tunnel port.
  • /benchmark readsPage load, Core Web Vitals and resource sizes, compared before and after.
07

Ship: twenty-one steps, two real gates

/ship is the longest skill in the repo and mostly it is a checklist: merge the base branch first so tests run against the merged state, run the tests, run its own review, bump the version, write the changelog, split the work into bisectable commits, push, open the pull request.

Only two things stop it. The readiness dashboard wants a clean eng review from the last seven days β€” and that's it; CEO, design, adversarial and outside-voice status are printed for context and explicitly never block. Then the verification gate at step 16: if any code changed after the last test run, the tests run again, and stale output is not accepted. "Should work now" is answered with "run it."

One more check sits between push and PR: a credential and PII scanner reads the exact bytes about to leave the machine β€” write to a temp file, scan that file, send that same file β€” because scanning a string and then re-rendering it reopens the gap.

SOLID = CAN STOP YOU Β· DASHED = PRINTS AND CONTINUES readiness eng review < 7 days dist check new binary? merge base before tests tests + coverage review army + codex version + changelog verification code changed? re-run tests redact scan exact bytes PR tests fail here β†’ back to the test step. No push. also printed, never blocking: CEO review Β· design review Β· adversarial Β· outside voice the one required gate can be switched off globally with one config key β€” the repo calls it "the don't bother me setting"
Read the stroke weights: three solid gates in a chain of nine. The design bet is that ceremony you can't skip gets skipped anyway, so make almost everything advisory and defend the two checks that catch real damage.
  • /ship writesMerge base, test, review, version, changelog, bisect the commits, verify, scan, push, open the PR.
  • /land-and-deploy writesMerge the PR, wait for CI and the deploy, then verify production is actually healthy.
  • /canary readsA post-deploy watch loop for console errors, performance regressions and page failures.
  • /landing-report readsRead-only view of the version queue when several workspaces are shipping at once.
  • /document-release writesReads every doc, cross-references the diff, updates what drifted, and maps documentation coverage.
  • bin/gstack-redactThree-tier scanner. Credentials block; PII and legal content ask; public repos get sterner per-finding confirmation.
08

Reflect: what the next run knows

Everything so far wrote something down. Four stores, deliberately not overlapping β€” learnings are what you know, the timeline is what happened, checkpoints are where you are, health history is how good the code is β€” plus an event-sourced decision log so a settled call doesn't get re-litigated next week.

Most of that is just recall. Three parts genuinely change future behaviour, and they're the interesting ones: a specialist's hit rate decides whether it runs again, a design taste profile decays 5% a week so old preferences fade, and a per-site browser note stays quarantined until it has worked three times.

What doesn't happen automatically: forgetting. Nothing expires. /learn prune finds learnings that point at deleted files or contradict each other and asks you about each one β€” which is honest, but it means the store only shrinks when you sit down with it.

a skill run finishes appends learnings.jsonlwhat you know timeline.jsonlwhat happened checkpoints/where you are health-history.jsonlhow good the code is decisions.jsonlwhat's already settled next preamble reads them back hit-rate gating β†’ step 5 0 findings in 10 runs = auto-skip taste profile β†’ design decays 5% per week domain skills β†’ step 6 quarantined until 3 clean uses nothing expires on its own β€” /learn prune is a conversation you have, not a job that runs
The library's night shift archetype is absent here: gstack has no scheduled maintenance cycle. /retro is the weekly roll-up, but you run it. The three orange arrows are the only paths where past runs silently change future ones.
  • /learn readsShow, search, prune, export and stat the project's learnings. Pruning flags stale and contradictory entries and asks you about each.
  • /retro readsWeekly retrospective: per-person breakdowns, shipping streaks, test-health trends. A global mode spans every project and AI tool.
  • /plan-tune readsWatches which questions you actually want asked and tunes question sensitivity to your psychographic.
  • bin/gstack-specialist-statsComputes per-specialist hit rates from review history and tags the ones that have stopped earning their run.
  • bin/gstack-taste-updateRecords design approvals and rejections with Laplace smoothing and weekly decay.
  • bin/gstack-decision-logAppend-only decide / supersede / redact log, so "active" is computed and the history stays honest.
09

Day zero, and how the factory updates itself

Install is one clone plus ./setup. Setup detects which of the ten supported agents you have and links the skills into each one's directory β€” real directories at the top level, with a symlinked SKILL.md inside, so the agent discovers /qa rather than something buried three levels down.

Team mode is the interesting bit: it doesn't vendor anything into your repo. It writes a CLAUDE.md section and a hook, so a teammate who clones the repo gets gstack installed for them. Every session then does a silent, once-an-hour, network-failure-safe update check. Changes that alter on-disk layout ship with a migration script that the upgrade skill runs for you.

one global clone ~/.claude/skills/gstack ./setup 10 host directories claude Β· codex Β· cursor Β· … 53 skill dirs real dir + SKILL.md symlink ./setup --team writes repo bootstrap your team's repo CLAUDE.md + hook, no vendoring teammate auto-installs hourly update check silent Β· throttled Β· fail-safe migrations run on upgrade the install updates itself in place Windows without Developer Mode can't symlink β€” setup falls back to copies, so ./setup must be re-run after every git pull.
The distribution bet: one clone, many links, zero vendored files. The whole thing rests on symlinks, which is also its one platform crack.
  • setupDetects installed agents, builds the browser binary, links skills, and remembers whether you want /qa or /gstack-qa.
  • bin/gstack-team-initWrites the repo bootstrap in optional (nudge) or required (block) mode, and removes any old vendored copy.
  • /gstack-upgrade writesDetects your install shape, syncs it, runs migrations, and shows what changed.
  • /setup-gbrain readsZero to a running brain in under five minutes β€” local, hosted, auto-provisioned, or remote.
  • /sync-gbrain writesRe-indexes this repo into the brain and refreshes the search-guidance block in your CLAUDE.md.
  • bin/gstack-uninstallRemoves skills, symlinks, global state, daemons and temp files. It deliberately does not edit your CLAUDE.md.

The full roster

All 53 skills, grouped by the job they do. writes means it can change files in your repo, your git history, or your install; reads means it inspects and reports, though it may still drive a browser or write gstack's own notes.

SkillKindWhat it does
Think & plan β€” 8
/office-hoursreadsSix forcing questions that reframe your product before code exists. Writes the design doc everything downstream reads.
/plan-ceo-reviewreadsFounder-mode scope challenge. Four modes: expansion, selective expansion, hold scope, reduction.
/plan-eng-reviewreadsLocks architecture, data flow, state machines, error paths, test matrix, failure modes.
/plan-design-reviewreadsRates each design dimension 0–10, says what a 10 looks like, edits the plan toward it. Flags AI slop.
/plan-devex-reviewreadsDeveloper-experience review: personas, competitor time-to-hello-world, magical moment, friction traces.
/plan-tunereadsLearns which questions you actually want asked, and tunes question sensitivity accordingly.
/autoplanreadsRuns CEO, design, eng and DX review at full depth, auto-deciding the mechanical calls. One approval gate.
/specwritesFive phases from vague intent to a filed GitHub issue. Can spawn an agent in a fresh worktree to execute it.
Design β€” 4
/design-consultationwritesBuilds a whole design system from scratch β€” research, creative risks, mockups β€” and writes DESIGN.md.
/design-shotgunreadsGenerates 4–6 mockup variants, opens a comparison board, collects your feedback, iterates. Learns your taste.
/design-htmlwritesTurns an approved mockup into production HTML with computed text layout, so it reflows instead of breaking.
/design-reviewwritesLive visual audit that also fixes what it finds, with atomic commits and before/after screenshots.
Review & investigate β€” 6
/reviewwritesPre-landing review: specialist fan-out, auto-fix the mechanical findings, batch-ask about the rest.
/codexreadsSecond opinion from a different vendor's model. Review, adversarial challenge, or open consultation.
/investigatewritesRoot-cause debugging under an iron law: no fixes without investigation. Stops after 3 failed fixes.
/csoreadsOWASP Top 10 plus STRIDE threat model, tuned for zero noise. Every finding carries an exploit scenario.
/devex-reviewreadsActually walks your onboarding: navigates the docs, times time-to-hello-world, screenshots the errors.
/healthreadsType checker, linter, tests and dead code as one composite score, tracked over time.
Test with real eyes β€” 9
/qawritesReal browser, real clicks. Finds bugs, fixes them, generates the regression test, re-verifies.
/qa-onlyreadsThe same QA methodology, report only. Exists so you can QA a codebase you don't want touched.
/browsereadsThe headless Chromium CLI. Persistent daemon, ~100 ms a command, plus a gated raw DevTools escape hatch.
/open-gstack-browserreadsA visible browser with a sidebar agent, anti-bot stealth, and the layered prompt-injection defence.
/setup-browser-cookiesreadsImports cookies from your real browser so authenticated pages can be tested. Values never hit disk.
/pair-agentreadsLets another vendor's agent drive the same browser in its own tab, over a separately-bound tunnel port.
/benchmarkreadsPage load, Core Web Vitals and resource sizes, compared before and after on every PR.
/scrapereadsPulls data off a page. The first call prototypes the flow; a codified call replays it in ~200 ms.
/skillifyreadsFreezes the last working /scrape flow into a permanent per-site browser skill.
Ship & operate β€” 8
/shipwritesTwenty-one steps from feature branch to open PR, with the two gates that can actually stop you.
/land-and-deploywritesMerge the PR, wait for CI and the deploy, verify production health. One command from approved to verified.
/canaryreadsPost-deploy watch loop for console errors, performance regressions and page failures.
/landing-reportreadsRead-only dashboard for the version queue when several workspaces are shipping at once.
/setup-deployreadsOne-time detection of your platform, production URL and deploy commands.
/document-releasewritesReads every doc, cross-references the diff, updates what drifted, maps documentation coverage.
/document-generatewritesWrites missing docs from scratch on the four-quadrant model: tutorial, how-to, reference, explanation.
/gstack-upgradewritesSelf-updater. Detects install shape, syncs, runs migrations, shows what changed.
Safety rails β€” 4
/freezereadsHard-blocks Edit and Write outside one directory via a deny hook. The only mechanical rail in the build stage.
/unfreezereadsClears the freeze boundary.
/carefulreadsWarns before rm -rf, DROP TABLE, force-push, git reset --hard. Any warning can be overridden.
/guardreadsCareful plus freeze in one command. The recommended posture for production work.
Memory & reflection β€” 7
/learnreadsShow, search, prune, export and stat what gstack has learned on this project.
/retroreadsWeekly retro: per-person breakdowns, shipping streaks, test-health trends. Global mode spans every project.
/context-savereadsSnapshots working state β€” decisions, files, what's left β€” so a context reset isn't fatal.
/context-restorereadsRebuilds that state, including from the structured bodies of WIP checkpoint commits.
/setup-gbrainreadsZero to a running brain in under five minutes: local, hosted, auto-provisioned, or remote.
/sync-gbrainwritesRe-indexes this repo into the brain and refreshes the search-guidance block in your CLAUDE.md.
/benchmark-modelsreadsSame prompt through Claude, GPT and Gemini. Latency, tokens, cost, and an optional judged quality score.
iOS on real hardware β€” 5
/ios-qareadsDrives a real iPhone over a USB tunnel through a debug state server. Optionally exposed to remote agents.
/ios-fixwritesAutonomous iOS bug-fix loop with regression snapshot capture.
/ios-design-reviewreadsDesigner's-eye audit on real hardware against a ten-dimension Apple interface rubric.
/ios-cleanwritesStrips the debug bridge and its conditional wiring before a release build.
/ios-syncwritesRegenerates the debug bridge and typed state accessors against the latest templates.
Publish β€” 2
/make-pdfwritesMarkdown in, publication-quality PDF out. Diagram fences render as vectors, fully offline. Also HTML and DOCX.
/diagramwritesEnglish in, a triplet out: mermaid source, an editable file, and a rendered image. Zero network.
← Accession