All notable changes to GraphStack are documented here.
- ORCHESTRATOR — Resume matrix uses
STATE.jsonrole + BRIEF status (step 9c); explicit-only brief approval; Reviewer loop count persisted inREVIEW.md; bootstrap graphify hard stop before next cycle brief; Hotfix Path; QA→Architect escalation interrupt. - TOKEN_OPTIMIZER — Manual
graph.jsonpatterns marked conceptual (usegraph query); replaced ~80% context rule with 5+ file read STATE.md checkpoint; Reviewer neighbor budget (max 3 raw reads). - ARCHITECT — BRIEF status transition table; god nodes via graph query (removed fixed
degree > 10); multi-cycle split rule for large features on existing codebases (not Bootstrapper). - BUILDER — Out-of-scope notes append to
REVIEW.md## Builder Notes; large-file targeted read; gate fail →cycle enter-builderrecovery. - REVIEWER — BRIEF In Scope always default; loop count + partial criteria in reject template; ## Deferred debt for non-blocking nits.
- QA — No test runner fallback (manual path trace); honest concurrency candidate wording; ## Escalation: Architect required block.
- SHIP — Debug log check via git diff; commit types
chore/ci/style; hotfix flow documented. handoff/REVIEW.md— Rich HTML-comment section templates (Builder Notes, Review, QA, Escalation); gate-required fields documented in header table.
graphstack cycle enter-reviewer|enter-qa|enter-ship <task-id>— mechanical phase handoffs with prerequisite checks (Review Approved, QA PASS/PARTIAL).- Gate v4 (R5–R8) — code commits and
board complete/cycle closeblocked untilrole=shipand REVIEW has Verdict: Approved + shippable QA Report (default when gate on).
cycle close— also requires shippable QA Report (unless--force).graphstack.mdc/ORCHESTRATOR.md— full-cycle mechanical handoffs; removed “skip review” / “just ship” shortcuts.- Role skills — Builder/Reviewer/QA/Ship use
cycle enter-*instead of ad-hocstate set. - Gate hook — malformed hook stdin no longer crashes strict mode (
_read_stdin_json).
graphstack cycle close <task-id>—board complete+ BRIEF Complete +state idle(requiresVerdict: Approvedunless--force).- Doctor
cycle_unclosedwarning —doing/+role=builder(or reviewer/qa) without REVIEW Verdict.
- Close-turn contract in
graphstack.mdc— implementation done ≠ cycle done; Ship must runboard complete. ORCHESTRATOR.md— close-turn misinterpretation guards;devamafter brief ≠ close cycle.BUILDER.md— mandatory[BUILDER → REVIEWER]+state set --role reviewerafter implementation.- Gate
stophook — advisory when task stuck indoing/withrole=builderand no REVIEW Verdict.
- First-turn contract —
graphstack.mdcexplicitly forbids code edits on turn 1 when the user embeds a task goal; embedded goal means Architect +cycle start+ BRIEF only. ORCHESTRATOR.md— misinterpretation guards (“proceed/devam” ≠ implement now).ARCHITECT.md— skip re-asking when goal is already in the user message; runcycle startimmediately./graphstackcommand — ARCHITECT-only routing on embedded goals (not Builder, not code).
- README — v4.6 highlights, gate v3 limitations, install tree (
cycle,gate,STATE.json,hooks.json), preferredcycleworkflow in GNAP section. docs/CURSOR_PROMPTS.md— v4.6 cycle handoff, strict gate, doctor/validate tips.- Role skills — Architect, Builder, Bootstrapper use
cycle start/cycle enter-builder(aligned with gate v3). /graphstackcommand — Activation step 9 matchesORCHESTRATOR.md(Architect on first goal, no code on turn 1).
graphstack cycle—cycle start <id> "<title>"andcycle enter-builder <id>bind board +STATE.json+ BRIEF status in one step.- Gate v3 — R2b (role must be
builderfor code edits), R3b (no edits on Draft brief), R5/R6 (ship + review approval required for code commits in strict mode). brief_utils.py— shared BRIEF/REVIEW helpers for gate, validate, and cycle.- Doctor/validate — handoff sync warnings (
BRIEFready butdoing/empty, role mismatch) and.cursor/hooks.jsongate presence checks.
graphstack.mdcv4.6 — full Activation checklist, role announcements, and cycle commands embedded inalwaysApplyrules.ORCHESTRATOR.md— Activation step 9 routes user goals to Architect immediately (no code on first turn).- Installer — merges GraphStack gate hooks into existing
.cursor/hooks.json/.claude/settings.jsoninstead of skipping.
- bootstrap.ps1 — PowerShell captured pip stdout as the function return value, so every install looked like a failure and triggered slow
git clonefallback. UseOut-Host; skip pip when CLI + project rules already exist.
- bootstrap.ps1 —
$ErrorActionPreference Stop+ stderr from pip/graphify made Cursor show exit 1 even when install worked; now usesContinue,--force-reinstall, wheel asset check, and exits 0 when.cursor/rules/graphstack.mdcexists. - graphstack init — no longer fails bootstrap when doctor reports non-fatal issues after a successful file install.
- PyPI wheel —
.cursor/rules, commands, and skills were omitted from the wheel (setuptools skips dot-directories underassets/**/*). Bootstrapirm … | iexinstalled the CLI butgraphstack initleft the project without Cursor rules; doctor exited 1. - Explicit
package-dataentries +MANIFEST.ingraft; wheel asset test added.
- README / PYPI.md — PyPI is live (
MertCapkin_GraphStack); Quick Start leads with pip/bootstrap, clone path moved to contributors. - PyPI badge and project URL in
pyproject.toml.
- PyPI distribution name —
MertCapkin_GraphStack(the namegraphstackis taken on PyPI). CLI command remainsgraphstack. - Bootstrap scripts and docs updated for the new pip package name.
- One-command bootstrap —
scripts/bootstrap.ps1(Windows) andscripts/bootstrap.sh(Unix) for Cursor terminal: pip install +graphstack init . -y --install-deps. - PyPI packaging — workflow files bundled in
graphstack/assets/;scripts/sync_assets.py;.github/workflows/publish.yml. graphstack init --install-deps— autopip install graphifyy+graphify cursor installwhen missing.board reopen <id> [--to todo|doing]— move completed tasks back to active columns.board list-done [--limit N]— list completed tasks only.docs/PYPI.md— maintainer publish guide.
- Installer — resolves workflow sources from dev repo or bundled PyPI assets (
install_source_root()). - README — prominent one-liner install section for Cursor users.
graphstack graph— graphify wrappers:query,path,explain,update(graph-first reads without manualgraph.jsonparsing).graphstack init— one-shot onboarding: install +graphify update+doctor.- Gate v2 (Cursor) —
preToolUsehook blocksWrite/Shell/Edit/Deletewithout a claimed board task (before edit, not just advisory). GRAPHSTACK_GATE=strict— fail-closed on hook internal errors (default remains fail-open).
- Installer — Cursor
hooks.jsonincludespreToolUsematcher; shipsgraph.pyandinit_cmd.py. - TOKEN_OPTIMIZER / ARCHITECT — mandate
graphstack graph queryas the primary graph access path. - validate / doctor —
graph_okcheck for the graph query module. - CONTRIBUTING — updated for Python CLI + pytest workflow.
- README Process Gate — platform matrix documents Cursor vs Claude enforcement differences honestly.
graphstack gate— deterministic process enforcement:gate check(CI/manual),gate hook cursor,gate hook claude. Rules: deny code commits/edits when no board task is indoing/, or whenBRIEF.mdis still the template. Fail-open on hook errors; bypass viaGRAPHSTACK_GATE=offorhandoff/.gate-off.graphstack state— machine-readablehandoff/STATE.json(set/get/clear) for hook verification and resume.- Hook adapters —
.cursor/hooks.json(Cursor 3.x,version: 1) and.claude/settings.json(Claude CodePreToolUse+Stop). Installer writes OS-specific commands (gate-hook.ps1on Windows,gate-hook.shon Unix). scripts/gate-hook.sh/scripts/gate-hook.ps1— portable shims (resolvepy -3/python3/pythonwithout hardcoding)..graphstack-frameworkmarker —validatewarns when the framework repo ships dirty handoff state (non-template brief,done/tasks, activeSTATE.mdentries).- Pytest —
test_gate.py(26 tests),test_state.py(5 tests).
- ORCHESTRATOR — token tier detail moved to
TOKEN_OPTIMIZER.md(reference only); state persistence now includesstate set. - BUILDER — removed duplicate user confirmation at activation (Orchestrator brief confirmation is the single human gate); activation now runs
state setand builds immediately. - ARCHITECT / BUILDER — token rules condensed to pointers to
TOKEN_OPTIMIZER.md. - CI —
graphstack gate checkstep; required-files manifest includes gate modules and hook shims. - README — Process Gate section; Limitations updated.
- Windows hook launcher — hooks no longer hardcode
python(often missing on Windows); shims preferpy -3.
graphstack run— run shell commands with token-safe output compaction (--rawfor full output).scripts/graphstack/compact/— independent compactors forgit status/diff/log,pytest, and generic commands; preserves paths, hunks, and failures; falls back to raw when signal would be lost.- Workflow integration —
TOKEN_OPTIMIZER.md,graphstack.mdc,ORCHESTRATOR.md, Builder/QA skills mandategraphstack runfor shell tools. validate/doctor—compact_okcheck for the output-compact module.- Pytest —
test_compact.py(7 tests for compaction quality).
- Installer — copies
run.pyandscripts/graphstack/compact/into target projects. - README — Shell Output Compaction section and v4.2 highlights.
pyproject.toml— install GraphStack withpip install -e .; console scriptgraphstackpoints atgraphstack.cli:main.graphstack validate— LLM-free checks for handoff layout, board task JSON,STATE.md, and graph commit vsgit HEAD(--fail-stale-graphfor CI).graphstack doctor— human-readable health report (same checks as validate; warnings do not fail by default)..graphifyignore— code-focused graph profile for the GraphStack source repo (reduces markdown noise ingraphify-out/).docs/case-studies/graphstack-self.md— honest self-analysis: graph quality on a meta-repo, token savings confidence levels, validation workflow.- README Limitations section — orchestrator enforcement, token estimates, graph ROI, setup steps.
- Pytest — 6 new tests in
test_validate.py(29 total in suite).
- CI —
pip install -e .before tests;graphstack validate --fail-stale-graphstep;pyproject.tomlandvalidate.pyin required-files manifest. - Installer — copies
validate.pyinto target projects with the Python package.
- Graph staleness check —
validate --fail-stale-graphacceptsHEAD~1when the graph was built before a dedicated graph-artifacts commit (common release workflow). - CI validate job —
actions/checkoutusesfetch-depth: 2; validate steps usepython -m graphstack; CI runsgraphify update .before--fail-stale-graph(graph built on an older commit than HEAD no longer fails shallow clones).
GraphStack v4 is the cross-platform release. Windows runs natively in PowerShell (no Git Bash needed), macOS runs without coreutils, and the entire workflow logic lives in a single Python package. The skills/ directory was unified with the post-install .cursor/skills/ layout so the source repo and an installed project look identical.
- Python core package —
scripts/graphstack/(single source of truth):cli.pydispatcher (python -m graphstack <board|install|hook>)board.py— full GNAP lifecycle (status / new / claim / complete / log)installer.py— non-destructive installer with--non-interactiveflaghook.py— smart graph-update post-commit logicplatform_utils.py— Python detection, encoding-safeecho, git wrappersconstants.py— single place for board / graphify-out paths
- PowerShell shims:
install.ps1,scripts/board.ps1,scripts/post-commit.ps1— Windows-native, no Git Bash dependency. - Pytest suite — 23 tests covering board lifecycle, installer layout, hook logic, platform detection, encoding fallbacks. Runs on all three OSes via CI matrix.
- Tri-OS CI matrix —
.github/workflows/ci.ymlnow validates on Ubuntu + macOS + Windows in parallel. Bash syntax is checked once on Linux; Python module + native shim smoke tests run on every OS. - Markdown lint job — broken relative-link detection across all
.mdfiles. requirements.txt— pinsgraphifyy>=0.7,<0.9so an upstream breaking release does not silently break GraphStack..gitkeepfiles —handoff/board/doing/andhandoff/board/done/are now tracked so cloned repos start with a complete directory structure.- OS dropdown + Python/Graphify version fields in
bug_report.ymlfor faster triage.
- Single-layout source repo —
skills/was moved to.cursor/skills/. The source repo now mirrors the installed layout exactly. Cursor working on the GraphStack source itself sees the same paths an end user would. - Bash scripts → thin shims —
install.sh,scripts/board.sh,scripts/post-commitare now 5–15 line delegators that locate Python and exec the package. All real logic lives in Python. - Role files use cross-platform commands —
bash scripts/board.sh ...was replaced withpython -m graphstack board ...inARCHITECT.md,BUILDER.md,REVIEWER.md,QA.md,SHIP.md,BOOTSTRAPPER.md,ORCHESTRATOR.md, andDEMO_WALKTHROUGH.md. ORCHESTRATOR.mdpath references — internal references likeskills/bootstrapper/BOOTSTRAPPER.mdwere corrected to.cursor/skills/bootstrapper/BOOTSTRAPPER.md(and equivalents for builder / ship). Architect, builder, reviewer, QA, and ship references are now all explicit.STATE.mdtemplate — the example session block is now wrapped in an HTML comment so the orchestrator no longer mistakes it for a real session entry.- Graphify command syntax — three places that used
/graphify . --updatewere standardised to/graphify --update. - README + CURSOR_PROMPTS — three install paths documented (bash / PowerShell / cross-platform Python). Windows section no longer references Git Bash as a prerequisite.
- macOS
realpathportability — installer no longer depends on GNU coreutils.pathlib.Path.resolve()works on a stock macOS install. - Windows Microsoft Store stub — PowerShell shims detect the WindowsApps redirect stub and fall back to
py -3automatically. - First-commit hook crash — post-commit hook now guards against missing
HEAD~1on a fresh repo instead of failing the commit. - cp1254 / Turkish locale crashes — stdout is reconfigured to UTF-8 with replacement; box-drawing characters in the board status header are plain ASCII.
- Bash
((count++))exit-code workaround — replaced with proper Python integer counters in board status. - JSON Unicode round-trip — board task files now serialize with
ensure_ascii=False, so Turkish / non-Latin titles are preserved verbatim.
- Existing
handoff/board/*.jsontask files are forward-compatible — schema is unchanged. bash scripts/board.sh ...shim still works; only its body changed.- If you have local edits in the old
skills/directory, replay them against.cursor/skills/. Everything else is non-breaking.
- Bootstrap Mode —
skills/bootstrapper/BOOTSTRAPPER.md: new role that turns a raw idea or PRD into a structured multi-cycle build plan. Enables GraphStack to be used from day zero on a new project. handoff/BOOTSTRAP.md— persistent cross-cycle memory: module map, dependency order, tech stack decisions, cross-cutting concerns, cycle log.- GNAP Board —
handoff/board/+scripts/board.sh: git-native task coordination withtodo/→doing/→done/lifecycle. Every transition creates a git commit for full audit trail. - Orchestrator —
orchestrator/ORCHESTRATOR.md: central state machine that manages all role transitions automatically. Users write one prompt; Orchestrator drives the full lifecycle. - Token Optimizer —
orchestrator/TOKEN_OPTIMIZER.md: explicit 4-tier token budget system enforced across all roles. Includes graph query patterns, parallel read protocol, output compression rules. - Session State —
handoff/STATE.md: persistent session state enables resuming across Cursor restarts with zero re-reading. - Smart Graph Update —
scripts/post-commit: graph updates only on structural changes (files added/deleted), Ship commits, or 24h staleness. Eliminates unnecessary updates on content-only edits. - Cycle-end Graph Update — Ship role now always assesses and runs graph update at end of each cycle. Bootstrapper gets fresh graph before writing each new brief.
- GitHub files —
LICENSE(MIT),.gitignore,CONTRIBUTING.md,CHANGELOG.md,.github/workflows/.
- Reviewer activation: no longer blocks waiting for user to specify files. In Orchestrator mode, reads brief's "In Scope" list directly.
- QA activation: no longer waits for user confirmation before tracing. Announces plan and proceeds.
- Builder activation: handles 0/1/2+ matching board tasks explicitly instead of ambiguous "find matching task" instruction.
- Install script: now creates
docs/directory (was missing, causingcpfailure), always createsSTATE.md, copiesBOOTSTRAP.mdtemplate. - Orchestrator activation: 3-mode detection (Normal / Bootstrap / New Project) with explicit fallbacks on every file read.
board.sh:set -euo pipefail+((count++))arithmetic exit-code crash. Changed toset -uo pipefail.board.sh new: titles with spaces were truncated to first word. Fixed withshift 2; title="${*}".board.sh new: globalrole="${3}"conflicted with per-command argument parsing. Removed global role variable..cursor/rules/graphstack.mdc: was labeled v2, now correctly labeled v3.CURSOR_PROMPTS.md: was v1-style (manual role prompts only). Rewritten as Orchestrator-first with single-prompt workflow.
- Orchestrator (initial version) with automatic role transitions
- Token optimization layer with 4-tier budget system
- STATE.md session persistence
- Demo project (Node.js auth service with walkthrough)
- All roles updated to work in both Orchestrator and manual modes
- Initial release: Architect, Builder, Reviewer, QA, Ship roles
- Graphify integration (graph-first reads)
- Cursor
.mdcalways-active rules install.shsingle-command setup