feat(workflows): experimental GSD workflow suite (gsd-*) — port from open-gsd/gsd-core#1986
feat(workflows): experimental GSD workflow suite (gsd-*) — port from open-gsd/gsd-core#1986uinstinct wants to merge 3 commits into
Conversation
…open-gsd/gsd-core Closes coleam00#1696 11 workflows porting the GSD core loop: map-codebase, new-project, discuss/plan/execute/verify phases, ship, complete-milestone, new-milestone, plus quick and debug. 10 shared role prompts in .archon/commands/gsd/ for agent context. Placed flat as .archon/workflows/experimental/gsd-*.yaml (not in a subdirectory) because workflow discovery deliberately caps at depth 1 (workflow-discovery.ts:89). All workflows run with worktree.enabled: false — .planning/ state + built code must persist across the execute→verify→ship runs. .planning/.gitignore excludes GSD scratch files.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (12)
✅ Files skipped from review due to trivial changes (1)
🚧 Files skipped from review as they are similar to previous changes (4)
📝 WalkthroughWalkthroughPorts the GSD methodology into Archon: adds role command specs, interactive workflows for map→discuss→plan→execute→verify→ship, supporting utilities (debug/quick/milestone), and .planning state artifacts with approval gates and commit protocols. ChangesExperimental GSD Workflow Suite
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Possibly related PRs
Poem
✨ Finishing Touches🧪 Generate unit tests (beta)
|
|
@Wirasm If we can merge this it will be awesome. GSD is a core workflow to many projects |
There was a problem hiding this comment.
Actionable comments posted: 7
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
.archon/workflows/experimental/gsd-execute-phase.yaml (1)
261-341:⚠️ Potential issue | 🟠 Major | ⚡ Quick winSubshell variable assignment won't persist —
PHASE_DIRwill always be empty.Lines 271-273 attempt to set
PHASE_DIRinside a while loop in a pipeline:PHASE_DIR=$(ls -d .planning/phases/*/ 2>/dev/null | sort -V | while read d; do if [ -f "${d}VERIFICATION.md" ]; then PHASE_DIR="$d"; fi done)The
whileloop runs in a subshell (due to the pipe), so thePHASE_DIR="$d"assignment doesn't persist. Additionally, the command substitution captures stdout, but nothing is printed — the assignment is silent. Result:PHASE_DIRis always empty.Suggested fix
if [ -z "$PHASE_NUM" ]; then # Best-effort: find the highest-numbered phase dir with a VERIFICATION.md - PHASE_DIR=$(ls -d .planning/phases/*/ 2>/dev/null | sort -V | while read d; do - if [ -f "${d}VERIFICATION.md" ]; then PHASE_DIR="$d"; fi - done) - if [ -n "$PHASE_DIR" ]; then + PHASE_DIR="" + for d in $(ls -d .planning/phases/*/ 2>/dev/null | sort -V); do + if [ -f "${d}VERIFICATION.md" ]; then + PHASE_DIR="$d" + fi + done + if [ -n "$PHASE_DIR" ]; then PHASE_NUM=$(basename "$PHASE_DIR" | grep -oE '^[0-9]+') fi🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.archon/workflows/experimental/gsd-execute-phase.yaml around lines 261 - 341, The PHASE_DIR assignment inside the pipeline/subshell (the "ls -d ... | sort -V | while read d; do ... PHASE_DIR=\"$d\"; done") won't persist because the while runs in a subshell and nothing is printed for command substitution; replace that pipeline with a non-subshell iteration (e.g., a for loop or while reading via process substitution) that directly assigns PHASE_DIR in the current shell, or write the matched directory to stdout for capture, so the block that sets PHASE_DIR when ARGUMENTS/PHASE_NUM is empty correctly produces a value..archon/workflows/experimental/gsd-verify-work.yaml (1)
286-315:⚠️ Potential issue | 🟠 Major | ⚡ Quick winBash node cannot access previous node outputs via dot notation.
Lines 289-293 attempt to reference guard node outputs in a bash script:
DIR=$guard.output.PHASE_DIR PHASE_BASE=$guard.output.PHASE_BASE ... UAT_FILE=$guard.output.UAT_FILEIn bash,
$guardis an undefined variable (empty), so these lines evaluate to:
DIR=.output.PHASE_DIR(literal string)PHASE_BASE=.output.PHASE_BASE- etc.
The route node needs to re-derive these values from the filesystem or receive them through a different mechanism (e.g., environment variables set by the workflow engine).
Suggested fix
- id: route depends_on: [uat] bash: | - DIR=$guard.output.PHASE_DIR - PHASE_BASE=$guard.output.PHASE_BASE - - # Count failures from UAT summary - UAT_FILE=$guard.output.UAT_FILE + # Re-derive phase directory (same logic as guard node) + if [ -n "$ARGUMENTS" ]; then + PHASE_NUM="$ARGUMENTS" + case ${`#PHASE_NUM`} in + 1) PAD="0${PHASE_NUM}" ;; + *) PAD="${PHASE_NUM}" ;; + esac + DIR=$(ls -d .planning/phases/${PAD}-* 2>/dev/null | head -1) + [ -z "$DIR" ] && DIR=$(ls -d .planning/phases/${PHASE_NUM}-* 2>/dev/null | head -1) + else + DIR=$(find .planning/phases/ -maxdepth 2 -name "*-SUMMARY.md" 2>/dev/null | sort -t/ -k3,3 | tail -1 | xargs dirname) + fi + + PHASE_BASE=$(basename "$DIR") + UAT_FILE="$DIR/${PHASE_BASE}-UAT.md" + + # Count failures from UAT summary FAILED=$(grep -c '| FAIL ' "$UAT_FILE" 2>/dev/null || echo 0)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.archon/workflows/experimental/gsd-verify-work.yaml around lines 286 - 315, The bash step in the route node is incorrectly trying to read previous node outputs via "$guard.output.PHASE_DIR", "$guard.output.PHASE_BASE" and "$guard.output.UAT_FILE" (these are not valid shell variables); update the route node to obtain those values correctly by either reading the produced files from the PHASE_DIR on disk or accepting them via environment variables passed into the bash step by the workflow engine — replace uses of DIR, PHASE_BASE and UAT_FILE to derive values from the filesystem (e.g., find or fixed paths under the workspace/PHASE_DIR) or from explicitly exported env vars (e.g., PHASE_DIR, PHASE_BASE, UAT_FILE) so the script references real shell variables like $PHASE_DIR, $PHASE_BASE and $UAT_FILE instead of $guard.output.*.
🧹 Nitpick comments (2)
.archon/commands/gsd/gsd-verifier.md (1)
93-99: 💤 Low valueBash
basenamesyntax issue in documentation example.The
basenamecommand only accepts a single suffix argument. The pattern$(basename "$artifact" .tsx? .ts)won't work as intended —basenamewill treat.tsx?as the suffix and ignore.ts.Since this is specification documentation showing conceptual verification commands, consider clarifying the intent or fixing the example:
Suggested clarification
**Level 3 — Wiring:** ```bash # Imported? -grep -r "import.*$(basename "$artifact" .tsx? .ts)" src/ --include="*.ts" --include="*.tsx" 2>/dev/null +# Strip extension to get component name (handle .ts, .tsx, .js, .jsx) +COMPONENT=$(basename "$artifact" | sed 's/\.\(tsx\?\|jsx\?\|ts\|js\)$//') +grep -r "import.*$COMPONENT" src/ --include="*.ts" --include="*.tsx" 2>/dev/null # Used beyond imports? -grep -r "$(basename "$artifact" .tsx? .ts)" src/ --include="*.ts" --include="*.tsx" 2>/dev/null | grep -v "import" +grep -r "$COMPONENT" src/ --include="*.ts" --include="*.tsx" 2>/dev/null | grep -v "import"🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.archon/commands/gsd/gsd-verifier.md around lines 93 - 99, The example uses incorrect basename usage: replace the single-call basename pattern `$(basename "$artifact" .tsx? .ts)` with a small shell step that strips extensions into a variable (e.g., compute COMPONENT from basename and remove .ts/.tsx/.js/.jsx via a sed or parameter expansion), then reuse that COMPONENT in the two grep commands; specifically, create COMPONENT from basename("$artifact") with extension removal (or use `${artifact%.*}`/sed), then use grep -r "import.*$COMPONENT" ... and grep -r "$COMPONENT" ... | grep -v "import" so both the import check and usage check reference the same cleaned component name instead of the invalid basename call..archon/commands/gsd/gsd-roadmapper.md (1)
51-55: 💤 Low valueConsider adding language identifiers to fenced code blocks.
The code blocks at lines 51-55 and 105-111 are missing language identifiers. While these are conceptual examples rather than executable code, adding a language identifier (e.g.,
textormarkdown) improves consistency and helps syntax highlighters.Suggested fix
-``` +```text Phase 1: All database models ← Too coupled-``` +```text AUTH-01 → Phase 2Also applies to: 105-111
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.archon/commands/gsd/gsd-roadmapper.md around lines 51 - 55, Add language identifiers to the fenced code blocks that currently show conceptual lines like "Phase 1: All database models ← Too coupled" and "AUTH-01 → Phase 2" by replacing the plain backtick fences with fences that include a language (e.g., use ```text or ```markdown) so syntax highlighters render them consistently; update both occurrences (the block containing the "Phase 1..." text and the block containing "AUTH-01 → Phase 2") to include the chosen language identifier.Source: Linters/SAST tools
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.archon/workflows/experimental/gsd-complete-milestone.yaml:
- Around line 346-375: The workflow currently instructs creation at
`.planning/MILESTONES.md` but stages `MILESTONES.md` at repo root, causing an
uncommitted file; pick one canonical path (prefer the repo-root `MILESTONES.md`
to match staging behavior), update the "Step 7: Update MILESTONES.md"
instructions and any template/header text to reference `MILESTONES.md` (not
`.planning/MILESTONES.md`), and ensure subsequent staging/commit steps and any
other occurrences (the later block around the staging list currently adding
`MILESTONES.md`) consistently use that same `MILESTONES.md` path.
In @.archon/workflows/experimental/gsd-debug.yaml:
- Around line 73-79: The slug derivation (SLUG) can collide or become empty due
to truncation and non-alphanumeric collapse; change the generation to append a
stable short fingerprint so filenames are unique and still human-readable: keep
the sanitized base (from ARGUMENTS) but if it is empty use a safe fallback
token, then append a short hash or short timestamp+random suffix (e.g., first 8
chars of sha256(ARGUMENTS) or epoch+rand) to form the final SLUG, and update
references to .planning/debug/$SLUG.md; ensure the sanitization step still
collapses non-alnum to hyphens and the final result is truncated only after the
hash is appended so collisions are avoided.
In @.archon/workflows/experimental/gsd-execute-phase.yaml:
- Around line 79-91: The shell glob is missing a directory separator between the
directory variable and the pattern: update the glob usages that reference
PHASE_DIR and d so they match files inside the directory (e.g., ensure the
pattern inserts a "/" between PHASE_DIR and *-PLAN.md and likewise between d and
*-PLAN.md). Fix all ls calls and the ls used in the Plan Inventory loop that use
"$PHASE_DIR"*-PLAN.md and the earlier "$d"*-PLAN.md so they correctly expand to
files inside the target directory rather than concatenating the name and the
pattern.
In @.archon/workflows/experimental/gsd-new-milestone.yaml:
- Around line 364-375: Don’t derive the next phase from the working tree
(.planning/phases) in this block (PHASE_DIR / PHASE_NUM); instead determine
NEXT_PHASE from the archived milestone data (e.g., use an existing archived
milestone variable or compute from the archived milestone’s last phase) and only
fall back to 1 if no archived milestone info exists; update the echo lines and
the suggested command to use gsd-discuss-phase $NEXT_PHASE so the workflow
continues numbering from the archived milestone rather than assuming phase 1
when no local phase dirs exist.
In @.archon/workflows/experimental/gsd-new-project.yaml:
- Around line 405-444: The roadmap node in the workflow conflicts with the
gsd-roadmapper.md role file which instructs the roadmapper to commit; update
gsd-roadmapper.md (the Commit section) to make committing conditional or remove
the automatic commit so it honors the workflow’s approval gate: either change
the Commit steps into a conditional (e.g., only commit when an explicit flag/ENV
like COMMIT_AFTER_APPROVAL is set) or replace the commit commands with
instructions to stage/save files for later (e.g., “write files but do not
commit; finalize node will commit”), and document the new expected behavior in
gsd-roadmapper.md so the roadmap agent (roadmapper role) and the finalize node
remain consistent.
In @.archon/workflows/experimental/gsd-plan-phase.yaml:
- Around line 238-251: The sed is being run against the full "Next: ..." string
so it never matches; instead extract the phase basename from PHASE_DIR and
derive the numeric prefix. Replace the pipeline that echoes "Next: ..." with
logic that captures the basename (using ${PHASE_DIR##*/}) into a variable (e.g.,
BASENAME) and then either use parameter expansion to get the phase number
(PHASE_NUM=${BASENAME%%-*}) or run sed against just the basename (echo
"${BASENAME}" | sed 's/^\([0-9][0-9]\).*/\1/'); then print the "Next: archon
workflow run gsd-execute-phase $PHASE_NUM" message. Ensure you update the line
that currently uses echo "Next: ... ${PHASE_DIR##*/}" | sed 's/^\(..\)-.*/\1/'
to the corrected extraction and echo.
In @.archon/workflows/experimental/gsd-ship.yaml:
- Line 82: The VSTATUS assignment uses GNU-only grep with -P; replace the
command that sets VSTATUS (currently using grep -oP 'status:\s*\K\S+' "$VFILE")
with a portable alternative (for example an awk or sed pipeline) that extracts
the first non-space token after "status:" from VFILE and preserves the existing
fallback (|| echo "unknown"); update the VSTATUS assignment to use that portable
extraction and still redirect errors to /dev/null as before.
---
Outside diff comments:
In @.archon/workflows/experimental/gsd-execute-phase.yaml:
- Around line 261-341: The PHASE_DIR assignment inside the pipeline/subshell
(the "ls -d ... | sort -V | while read d; do ... PHASE_DIR=\"$d\"; done") won't
persist because the while runs in a subshell and nothing is printed for command
substitution; replace that pipeline with a non-subshell iteration (e.g., a for
loop or while reading via process substitution) that directly assigns PHASE_DIR
in the current shell, or write the matched directory to stdout for capture, so
the block that sets PHASE_DIR when ARGUMENTS/PHASE_NUM is empty correctly
produces a value.
In @.archon/workflows/experimental/gsd-verify-work.yaml:
- Around line 286-315: The bash step in the route node is incorrectly trying to
read previous node outputs via "$guard.output.PHASE_DIR",
"$guard.output.PHASE_BASE" and "$guard.output.UAT_FILE" (these are not valid
shell variables); update the route node to obtain those values correctly by
either reading the produced files from the PHASE_DIR on disk or accepting them
via environment variables passed into the bash step by the workflow engine —
replace uses of DIR, PHASE_BASE and UAT_FILE to derive values from the
filesystem (e.g., find or fixed paths under the workspace/PHASE_DIR) or from
explicitly exported env vars (e.g., PHASE_DIR, PHASE_BASE, UAT_FILE) so the
script references real shell variables like $PHASE_DIR, $PHASE_BASE and
$UAT_FILE instead of $guard.output.*.
---
Nitpick comments:
In @.archon/commands/gsd/gsd-roadmapper.md:
- Around line 51-55: Add language identifiers to the fenced code blocks that
currently show conceptual lines like "Phase 1: All database models ← Too
coupled" and "AUTH-01 → Phase 2" by replacing the plain backtick fences with
fences that include a language (e.g., use ```text or ```markdown) so syntax
highlighters render them consistently; update both occurrences (the block
containing the "Phase 1..." text and the block containing "AUTH-01 → Phase 2")
to include the chosen language identifier.
In @.archon/commands/gsd/gsd-verifier.md:
- Around line 93-99: The example uses incorrect basename usage: replace the
single-call basename pattern `$(basename "$artifact" .tsx? .ts)` with a small
shell step that strips extensions into a variable (e.g., compute COMPONENT from
basename and remove .ts/.tsx/.js/.jsx via a sed or parameter expansion), then
reuse that COMPONENT in the two grep commands; specifically, create COMPONENT
from basename("$artifact") with extension removal (or use `${artifact%.*}`/sed),
then use grep -r "import.*$COMPONENT" ... and grep -r "$COMPONENT" ... | grep -v
"import" so both the import check and usage check reference the same cleaned
component name instead of the invalid basename call.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 39a9f52b-f9ee-475c-94fe-4c704d27a561
📒 Files selected for processing (23)
.archon/commands/gsd/gsd-codebase-mapper.md.archon/commands/gsd/gsd-debugger.md.archon/commands/gsd/gsd-executor.md.archon/commands/gsd/gsd-phase-researcher.md.archon/commands/gsd/gsd-plan-checker.md.archon/commands/gsd/gsd-planner.md.archon/commands/gsd/gsd-project-researcher.md.archon/commands/gsd/gsd-research-synthesizer.md.archon/commands/gsd/gsd-roadmapper.md.archon/commands/gsd/gsd-verifier.md.archon/workflows/experimental/gsd-complete-milestone.yaml.archon/workflows/experimental/gsd-debug.yaml.archon/workflows/experimental/gsd-discuss-phase.yaml.archon/workflows/experimental/gsd-execute-phase.yaml.archon/workflows/experimental/gsd-map-codebase.yaml.archon/workflows/experimental/gsd-new-milestone.yaml.archon/workflows/experimental/gsd-new-project.yaml.archon/workflows/experimental/gsd-plan-phase.yaml.archon/workflows/experimental/gsd-quick.yaml.archon/workflows/experimental/gsd-ship.yaml.archon/workflows/experimental/gsd-verify-work.yaml.planning/.gitignoreCHANGELOG.md
Shell-script correctness fixes in the gsd-* workflow bash nodes and role docs:
- gsd-execute-phase: add the missing `/` in the PLAN globs so they match
files inside the phase dir (not siblings); replace the lost-subshell
PHASE_DIR assignment in the report node with a current-shell for-loop.
- gsd-verify-work: the guard now emits a single JSON object on stdout
(diagnostics → stderr) so the engine resolves $guard.output.FIELD in the
uat prompt and route node. A schemaless bash producer with non-JSON output
throws OutputRefError on .FIELD access, which previously failed uat.
- gsd-plan-phase: derive the phase number via basename + grep instead of a
sed pattern that never matched the "Next: ..." string.
- gsd-ship: replace GNU-only `grep -oP \K` with portable awk plus an explicit
${VSTATUS:-unknown} default.
- gsd-debug: collision-safe slug (<=21-char base + 8-hex git fingerprint) with
an empty-input guard for punctuation-only descriptions.
- gsd-complete-milestone: canonical repo-root MILESTONES.md (matches staging).
- gsd-new-milestone: derive the first phase from the freshly written ROADMAP.md
rather than the highest existing phase dir.
- gsd-roadmapper.md: stop committing (callers commit after their approval gate);
add a `text` language to the two bare code fences.
- gsd-verifier.md: fix the basename extension-stripping example (single sed -E).
All 11 gsd-* workflows remain schema-valid and prettier-clean; bash nodes
verified against fixtures.
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
.archon/workflows/experimental/gsd-plan-phase.yaml (1)
242-242:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winGNU-only
find -printfmay break on macOS/BSD.The
-printf '%h\n'option is a GNU extension not available in BSD/macOSfind. Consider using a POSIX-portable alternative:- PHASE_DIR=$(find .planning/phases -name '*-PLAN.md' -printf '%h\n' 2>/dev/null | sort -u | tail -1) + PHASE_DIR=$(find .planning/phases -name '*-PLAN.md' 2>/dev/null | xargs -I{} dirname {} | sort -u | tail -1)Or using a shell loop:
PHASE_DIR=$(find .planning/phases -name '*-PLAN.md' 2>/dev/null | while read f; do dirname "$f"; done | sort -u | tail -1)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.archon/workflows/experimental/gsd-plan-phase.yaml at line 242, The command that sets PHASE_DIR uses GNU-only find -printf '%h\n' which fails on BSD/macOS; update the PHASE_DIR assignment to use a POSIX-portable sequence instead (call find without -printf and pipe the results through dirname or a while-read loop, then sort -u and tail -1) so PHASE_DIR is derived from the parent directory of the latest '*-PLAN.md' in .planning/phases; edit the line that defines PHASE_DIR to replace the -printf usage with the portable pipeline (e.g., find ... | xargs -n1 dirname | sort -u | tail -1 or find ... | while read f; do dirname "$f"; done | sort -u | tail -1) ensuring error redirection (2>/dev/null) is preserved.
🧹 Nitpick comments (1)
.archon/workflows/experimental/gsd-debug.yaml (1)
261-262: 💤 Low valueArchive
git mvsource path has redundantmkdir -p.Line 261 runs
mkdir -p .planning/debugbut the session file is already at.planning/debug/{slug}.md(created by the setup node and used throughout). The mkdir is harmless but unnecessary. More importantly, verify the paths are consistent:
- Line 261:
mkdir -p .planning/debug && git mv .planning/debug/{slug}.md .planning/debug/resolved/The
mkdir -p .planning/debugshould bemkdir -p .planning/debug/resolvedif the intent is to ensure the destination exists (though setup already creates it at line 64).🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.archon/workflows/experimental/gsd-debug.yaml around lines 261 - 262, The git mv command is creating a resolved/ destination but the mkdir used before it is for .planning/debug (mkdir -p .planning/debug && git mv .planning/debug/{slug}.md .planning/debug/resolved/); update this to ensure the destination exists by changing the mkdir to mkdir -p .planning/debug/resolved or remove the mkdir entirely if the setup step already creates .planning/debug/resolved; confirm the command around the git mv that moves .planning/debug/{slug}.md to .planning/debug/resolved/ uses the same paths consistently.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In @.archon/workflows/experimental/gsd-plan-phase.yaml:
- Line 242: The command that sets PHASE_DIR uses GNU-only find -printf '%h\n'
which fails on BSD/macOS; update the PHASE_DIR assignment to use a
POSIX-portable sequence instead (call find without -printf and pipe the results
through dirname or a while-read loop, then sort -u and tail -1) so PHASE_DIR is
derived from the parent directory of the latest '*-PLAN.md' in .planning/phases;
edit the line that defines PHASE_DIR to replace the -printf usage with the
portable pipeline (e.g., find ... | xargs -n1 dirname | sort -u | tail -1 or
find ... | while read f; do dirname "$f"; done | sort -u | tail -1) ensuring
error redirection (2>/dev/null) is preserved.
---
Nitpick comments:
In @.archon/workflows/experimental/gsd-debug.yaml:
- Around line 261-262: The git mv command is creating a resolved/ destination
but the mkdir used before it is for .planning/debug (mkdir -p .planning/debug &&
git mv .planning/debug/{slug}.md .planning/debug/resolved/); update this to
ensure the destination exists by changing the mkdir to mkdir -p
.planning/debug/resolved or remove the mkdir entirely if the setup step already
creates .planning/debug/resolved; confirm the command around the git mv that
moves .planning/debug/{slug}.md to .planning/debug/resolved/ uses the same paths
consistently.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: f2b79376-20d7-47a2-ae60-27f65fa2bdc5
📒 Files selected for processing (9)
.archon/commands/gsd/gsd-roadmapper.md.archon/commands/gsd/gsd-verifier.md.archon/workflows/experimental/gsd-complete-milestone.yaml.archon/workflows/experimental/gsd-debug.yaml.archon/workflows/experimental/gsd-execute-phase.yaml.archon/workflows/experimental/gsd-new-milestone.yaml.archon/workflows/experimental/gsd-plan-phase.yaml.archon/workflows/experimental/gsd-ship.yaml.archon/workflows/experimental/gsd-verify-work.yaml
✅ Files skipped from review due to trivial changes (1)
- .archon/commands/gsd/gsd-verifier.md
🚧 Files skipped from review as they are similar to previous changes (5)
- .archon/workflows/experimental/gsd-ship.yaml
- .archon/commands/gsd/gsd-roadmapper.md
- .archon/workflows/experimental/gsd-new-milestone.yaml
- .archon/workflows/experimental/gsd-complete-milestone.yaml
- .archon/workflows/experimental/gsd-execute-phase.yaml
Every work-producing experimental GSD workflow now ensures a non-base branch, pushes it, and creates or updates a pull request: - Phase-scoped (discuss/plan/execute/verify) ensure a gsd/phase-NN branch and open a draft PR; report/route run after publish. - Project-level (map-codebase, new-project, new-milestone, complete-milestone) ensure a date-stamped gsd/* branch and open a ready-for-review PR; complete-milestone gains a branch node ahead of archive. - gsd-ship edits + marks ready an existing PR instead of skipping it, and refuses to ship from the base branch. - gsd-quick / gsd-debug ship their work as a PR. All except gsd-debug (diagnose-only, must stay usable without GitHub) declare requires: [github]. Branch logic leaves an existing feature branch untouched and fails fast on the base branch when no phase arg is given. Headers, descriptions, and the coleam00#1696 CHANGELOG entry updated.
Summary
.archon/workflows/experimental/gsd-*.yaml) plus 10 shared role command files (.archon/commands/gsd/gsd-*.md) and a.planning/.gitignore.UX Journey
Before
After
Architecture Diagram
Before
After
Connection inventory:
Label Snapshot
risk: lowsize: Lworkflowsworkflows:experimentalChange Metadata
featureworkflowsLinked Issue
Validation Evidence
okwith zero issues.bun run validate(pre-existing pi-vendor-map staleness halts pipeline);bun run lint(pre-existing OOM);bun run test(no TypeScript changes, YAML/MD only).Security Impact
.planning/and staging area, same as existing workflows)Compatibility / Migration
Human Verification
cli validate workflowswith zero errors and zero warningscli workflow listagents:field (not supported) — models are instructed to read role files insteadapproval:schema withcapture_responseandon_rejectworktree: { enabled: false }on all 11 workflowsrequires: [github]only on gsd-shipinteractive: truecorrectly set on 7 workflows, omitted on 4Side Effects / Blast Radius
gsd-*). They don't affect bundled defaults or existing workflows.cli validate workflowscatches schema issues at load time. Workflow discovery errors are surfaced incli workflow list.Rollback Plan
git revert <commit>— single commit, no schema migrations, no code changes.Unknown workflow: gsd-*) if files are missing. YAML validation errors if schema violations.Risks and Mitigations
worktree.enabled: falseandmutates_checkoutdefaults totrue(serialized). Users are expected to branch before execute, as in GSD's own model.Deviations from Issue #1696
Flat placement:
.archon/workflows/experimental/gsd-*.yamlinstead ofexperimental/gsd/*.yaml. Reason: workflow discovery deliberately caps at depth 1 (workflow-discovery.ts:89). A subdirectory would be silently skipped. The depth cap is intentional and documented — not a bug to fix in this PR.No isolation worktrees: All 11 workflows run with
worktree.enabled: false. The issue's user-flow sketch mentioned verify-work running "in an isolation worktree," but.planning/state and unpushed execute commits would not be present in a fresh worktree. GSD's own model has users branch manually before execute — ship pushes that branch. Same model here.gsd-quick + gsd-debug: Two additional workflows beyond the issue's 9 core commands (per user request in the issue thread).
Promotion criteria: These are experimental — not bundled defaults. Promotion to
.archon/workflows/defaults/is gated on N real-world full cycles, tracked in Port GSD framework to Archon workflows (experimental/gsd/) #1696.Summary by CodeRabbit
Documentation
Chores