GSDL — Get Shit Done Light Orchestrator
Coordinates the full pipeline, from a raw idea or a tracked work item through to a reviewed, evidenced change:
1. Pick up the source → gsdl-fetch-source [SMALL] (tracker item, doc URL, or a plain idea)
2. Brainstorm/clarify → (folded into Step 1 and Step 3 Q&A) [LARGE]
3. Produce a plan → gsdl-create-spec [LARGE] → CHECKPOINT: SPEC.md
4. Decompose into slices → gsdl-decompose [LARGE] → CHECKPOINT: slices (tracker sub-items + tasks.md)
5. Human reviews → (gate — no skill, a real pause before Step 6)
5.5 Branch pre-flight → (orchestrator, any tier) — never implement on the default branch
6. Execute → gsdl-execute [MEDIUM subagent per parent slice]
7. Verify gates → gsdl-verify-gates [MEDIUM] → CHECKPOINT: verify-report.md
8. Open PR + bot review → gsdl-open-pr [MEDIUM] → CHECKPOINT: PR open, findings addressed
9. Close loop → gsdl-close-loop [LARGE] → CHECKPOINT: decisions + evidence, item closed
How each checkpoint is reached doesn't matter — what matters is that every checkpoint produces a consistent, reviewable artifact before the pipeline advances. Never silently skip a checkpoint.
Provider Configuration
GSDL is not locked to any tracker, docs platform, forge, or model provider. Before Step 1, read the
config contract in config.md (resolve its path the same way you resolve sub-skills,
below) and establish:
- Tracker —
linear|jira|github|notion|none - Docs —
slite|notion|confluence|none - Forge —
github|none - Models — which provider's tier mapping to use
Resolution order is: per-project config → workspace config → probe MCP servers and env vars → ask
the user once and write the answer to .planning/gsdl.config.md. Never ask twice for something
that could have been recorded.
Two provider settings change the pipeline's shape:
| Setting | Effect |
|---|---|
Tracker → provider: none |
Step 4 creates no sub-items; tasks.md is the work-item list, and tracker comments are appended to .planning/[project-name]/worklog.md. Every checkpoint still happens |
Forge → provider: none |
Step 8 is skipped; the pipeline goes verify → close-loop. Record the skip in progress.md and in the decisions document |
Nothing else in the pipeline changes with the provider.
Model Selection
This skill can be invoked from any session model. The orchestrator is a conductor — it routes each step to its capability tier by spawning a subagent with an explicit model override. The user never has to switch models mid-pipeline.
| Step | Skill | Tier | Why |
|---|---|---|---|
| 1. Pick up the source | gsdl-fetch-source |
SMALL | Fetch content, fill a template — no judgment |
| 2. Brainstorm / clarify | (inline in Steps 1 & 3) | LARGE | Open-ended intent shaping, tradeoffs, question generation |
| 3. Produce a plan | gsdl-create-spec |
LARGE | Turning fuzzy intent into a reviewable, complete plan |
| 4. Decompose into slices | gsdl-decompose |
LARGE | Slicing strategy and dependency ordering — cheap to get wrong here, expensive downstream |
| 4b. Create the sub-items | gsdl-tracker-sync |
SMALL | Resolving label IDs and POSTing items is mechanical tracker I/O |
| 5. Human review | (gate) | — | Human, not model |
| 5.5. Branch pre-flight | (orchestrator) | any | Three git commands |
| 6. Execute | gsdl-execute |
MEDIUM | Implementation against an already-approved plan |
| 7. Verify gates | gsdl-verify-gates |
MEDIUM | Discovering and running deterministic checks, reporting output verbatim |
| 8. Open PR + bot review | gsdl-open-pr |
MEDIUM | Forge CLI calls, reading review comments, applying scoped fixes |
| 9. Close loop | gsdl-close-loop |
LARGE | Synthesising decisions, architecture changes, and evidence into a durable document |
| 9b. Close in the tracker | gsdl-tracker-sync |
SMALL | Comment + status transition is mechanical tracker I/O |
Tier-to-model mapping for the configured provider is in models.md, along with what
to do when the agent tool can't override models at all.
Routing rules
- Never run a step below its tier. Downgrading silently is the failure mode this section exists to prevent. Upgrading is allowed but never required.
- Mechanical steps (1, 4b, 6, 7, 8, 9b) are always subagents, pinned with an explicit model override on the spawn call. State the tier and resolved model in the subagent prompt too, so it is recorded even where the override isn't honoured.
- Judgment steps (2, 3, 4, 9) run on LARGE:
- Session already on a LARGE model → run them inline. Preferred: the Q&A is direct.
- Otherwise → spawn a LARGE subagent and use the Question Relay below. Do not run these steps on a smaller session model, and do not ask the user to switch models.
- Subagents never talk to the user. Anything interactive — a manual paste, a clarifying question, gate-failure triage, a bot finding needing a human call — comes back to this context as a returned blocker or question, and the orchestrator handles it with the user.
- All tracker reads and writes go to SMALL via
gsdl-tracker-sync. Never spend a LARGE or MEDIUM model on a tracker API round-trip.
Question Relay (LARGE steps, smaller session model)
The judgment steps are interactive, and subagents can't ask the user anything. Bridge it:
- Spawn the LARGE subagent with the step's normal prompt, plus:
You cannot talk to the user. If you need input before you can produce your artifact,
return exactly:
QUESTIONS
1. [question]
2. [question]
...and stop — do not guess, and do not write the artifact. Otherwise, do the work
and return the artifact path plus a summary.
- If it returns
QUESTIONS, put them to the user verbatim in this context. - Re-spawn the same subagent with the full Q&A appended under a
## Answers so farheading. Repeat until it returns the artifact. - Show the artifact as the step's checkpoint as normal.
Keep the relay tight: pass the accumulated Q&A every time, since the subagent starts fresh each spawn.
Step 0: Resolve the Source (Pre-flight)
Before resolving the project name, work out what the user gave you:
| Input | Meaning |
|---|---|
A tracker item URL or bare ID — https://linear.app/…/issue/ENG-123/…, ENG-123, https://…atlassian.net/browse/PROJ-45, PROJ-45, https://github.com/o/r/issues/12, #12 |
New project from a tracked work item |
| A document URL — Notion, Slite, Confluence, Google Docs | New project seeded from a spec document |
An existing project name — /gsdl eng-123-my-feature |
Resume; skip to Step 2, no fetch |
| A plain description — "a CLI that syncs files to S3" | New project from a local idea, no tracker item |
| Nothing | Ask: "What are we picking up — a ticket, a doc, or an idea?" |
For anything that isn't a resume, delegate the fetch to a SMALL subagent with this prompt:
You are running on the SMALL tier ([resolved model]). Read and follow the gsdl-fetch-source skill
(resolve path per the Skill Path Resolution section of the gsdl orchestrator SKILL.md).
Source: [URL, ID, or the user's description verbatim]
Workspace root: [absolute path to workspace root]
You are running NON-INTERACTIVELY — do not ask the user anything. Resolve the provider config,
create .planning/[project-name]/, and write seed.md from the source.
Return: the project name, the seed.md path, the tracker item ID (or "none"), the item's suggested
git branch name if the tracker exposes one, and a one-line summary of what was fetched.
If you cannot fetch the source (no MCP, no credentials, not publicly shared) or the project already
exists with a seed.md, do NOT guess and do NOT overwrite — return a BLOCKER describing exactly
what's needed, and stop.
Then:
- If the subagent returned a blocker, resolve it inline with the user in this context (offer
the manual paste / MCP setup / overwrite choice per
gsdl-fetch-source), then re-spawn or finish the fetch inline. - Record the item's suggested branch name (if any) in
progress.mdasSuggested branch— it must survive to Step 5.5 even across a restart, which is why it is persisted now rather than held in context.seed.mdalso carries it under## Source. - Confirm with the user: "I picked up [source summary]. I'll use
[project-name]— does that work?" - Proceed to Step 2: Detect Current Step.
Step 1: Resolve Project Name
- If the user typed
/gsdl my-project(resume), usemy-projectdirectly. - If a source was resolved in Step 0, use the name it returned.
- Normalize to kebab-case. Prefix with the tracker item ID when there is one
(
eng-123-rule-calculator); otherwise use the title alone (rule-calculator).
Step 2: Detect Current Step
Read .planning/[project-name]/progress.md if it exists.
If present, extract:
step— last recorded stepspec— path toSPEC.mdtasks— path totasks.mdverify_report— path toverify-report.mditem— the tracker item ID, ornonesuggested_branch— the tracker's suggested branch name from Step 0branch— the working branch for this project, once createdpr— the pull request URL, orskipped
Verify the recorded files still exist before trusting them; fall back to a filesystem scan if not.
If progress.md is missing or stale, scan the filesystem:
| Condition | Start at |
|---|---|
No .planning/[project-name]/ folder |
Step 0 (fetch source) |
seed.md exists, no SPEC.md |
Step 3 (spec) |
SPEC.md exists, no tasks.md |
Step 4 (decompose) |
tasks.md exists with unchecked [ ] items |
Step 5.5 (branch), then Step 6 (execute) |
All tasks [x], no verify-report.md |
Step 7 (verify) |
verify-report.md exists (all gates pass), no PR recorded |
Step 8 (open PR), or Step 9 if Forge → provider: none |
PR recorded or skipped, no decisions-*.md |
Step 9 (close) |
decisions-[project-name].md exists |
Done |
Announce which step you're starting from and why before proceeding.
Skill Path Resolution
When reading a sub-skill or a shared reference file, resolve its path in this priority order:
~/.agents/skills/[skill-name]/— global install vianpx skills(preferred)- Project-local install matching the current agent, e.g.
.cursor/skills/[skill-name]/or.claude/skills/[skill-name]/ skills/[skill-name]/relative to this repo — running directly from source, not installed
Use whichever exists first. The shared references config.md and models.md live alongside this
file, in the gsdl skill's own directory.
Sub-skills used by this orchestrator:
gsdl-fetch-source— picks up the work item / doc / idea, creates the project +seed.md(Step 1) — SMALL subagentgsdl-create-spec— generatesSPEC.md(Step 3) — LARGEgsdl-decompose— breaksSPEC.mdinto slices (Step 4) — LARGEgsdl-tracker-sync— all tracker writes: sub-item creation, comments, status transitions — SMALL subagentgsdl-execute— implements slices (Step 6) — MEDIUM subagent per parent slicegsdl-verify-gates— runs deterministic checks (Step 7) — MEDIUM subagentgsdl-open-pr— opens the PR and addresses review-bot comments (Step 8) — MEDIUM subagentgsdl-close-loop— captures decisions + evidence, closes the tracker item, publishes docs (Step 9) — LARGE
Each skill declares its tier in its own frontmatter (tier:) and a ## Tier section — those are
the source of truth if this table ever drifts.
Running Each Step
Step 3 — Produce a Plan → CHECKPOINT: SPEC.md (LARGE)
Read and follow gsdl-create-spec. Interactive — ask clarifying questions, iterate with the user,
save SPEC.md. This is where Step 2's brainstorming concludes.
- Session on a LARGE model → run inline.
- Otherwise → LARGE subagent + Question Relay.
Update progress.md (step spec, spec path). Show the checkpoint and wait for confirmation.
Before Step 4, re-read SPEC.md from disk — the user may have edited it.
Step 4 — Decompose into Slices → CHECKPOINT: slices (LARGE + SMALL)
Read and follow gsdl-decompose. Two-phase: parent slices → wait for "Go" → sub-tasks + tracker
sub-items + tasks.md.
- Slicing (Phase 1 and the sub-task breakdown) is LARGE: inline if the session is on a LARGE model, otherwise a LARGE subagent with Question Relay.
- Creating the sub-items in the tracker (Phase 2's API work) is delegated to a SMALL
subagent running
gsdl-tracker-sync— hand it the resolved slice titles, descriptions, parent item ID and project/team ID, and let it resolve labels and create the items. - With
Tracker → provider: none, there is no 4b:tasks.mdis the checkpoint artifact on its own, and the slices are reviewed there.
Update progress.md (step decompose, tasks path). Show the checkpoint listing the created
sub-item links (or the local slice list when there is no tracker).
Step 5 — Human Reviews Plan + Slices (Gate, no skill)
This is the most important gate in the pipeline — do not fold it into Step 4's checkpoint.
Explicitly ask the user to confirm they've reviewed both SPEC.md and the slices before execution
starts:
👉 Before I start implementation: please review SPEC.md and the slices.
Ready for me to start executing? (yes/go to proceed, or tell me what to change first)
Only proceed to Step 5.5 on explicit confirmation.
Step 5.5 — Branch Pre-flight (Orchestrator, any tier)
No implementation work happens on the default branch. Run this before spawning the first execute subagent, and re-check it on every resume that lands at Step 6.
git rev-parse --abbrev-ref HEAD
git status --porcelain
git remote show origin | sed -n 's/.*HEAD branch: //p' # or: gh repo view --json defaultBranchRef
Decide:
| Situation | Action |
|---|---|
On the default branch (main/master) |
Create the working branch and switch to it |
On a non-default branch that matches this project's recorded branch |
Continue on it |
| On a different non-default branch | Stop and ask the user — do not switch or create silently; they may be mid-work on something else |
| Uncommitted changes present | Report them to the user before creating the branch; let them decide (commit / stash / continue) |
| Not a git repository | Report it and ask whether to git init or continue without version control — Steps 6 and 9 both read git history |
Branch name, in priority order:
progress.md'sSuggested branch— the tracker's suggested name, recorded at Step 0 (e.g.nico/eng-441-rule-calculator). On a resume, read it from disk; falling back to the project name because it isn't in context would give the same item two different branches depending on entry path.seed.md's## Sourcecarries the same value ifprogress.mdpredates this field.- Otherwise the project name, which is already kebab-case (e.g.
eng-441-rule-calculator).
git checkout -b [branch-name]
Record branch in progress.md, then tell the user which branch the work will land on before
Step 6 starts.
Step 6 — Execute (MEDIUM Subagent per Parent Slice)
Update progress.md to step execute before starting.
Re-read tasks.md from disk to identify all parent slices. For each, in order:
- Read the task file to get the parent slice title, its sub-tasks, and its tracker sub-item tag
- Spawn a subagent with the MEDIUM tier model override and this prompt (fill in all
[placeholders]):
You are running on the MEDIUM tier ([resolved model]). Read and follow the gsdl-execute skill
(resolve path per the Skill Path Resolution section of the gsdl orchestrator SKILL.md).
You are running in BATCH MODE. Complete ALL sub-tasks under the assigned parent slice
without pausing for user approval between sub-tasks. Apply the full completion protocol
after each sub-task (mark [x], update tasks.md), but immediately continue to the next
sub-task without waiting.
Project context:
- Project name: [project-name]
- Workspace root: [absolute path to workspace root]
- Task file: [absolute path to .planning/[project-name]/tasks.md]
- Working branch: [branch-name] — already created; verify you are on it before writing code,
and STOP with a blocker if you are on the default branch
- Assigned parent slice: [N.0] [Parent Slice Title] [tracker sub-item tag, or "no tracker"]
- Sub-tasks to complete: [N.1] [title], [N.2] [title], ... (list all)
When all sub-tasks under [N.0] are marked [x] and the parent is marked [x]:
- Commit to git per gsdl-execute's Parent Slice Completion protocol
- Return the tracker sub-item update payload (comment text + target state) rather than calling
the tracker yourself — the orchestrator dispatches it to a SMALL subagent
- Return a summary: what was built, files created/modified, any issues or blockers
- Do NOT start the next parent slice ([N+1].0)
- Dispatch the returned payload to a SMALL subagent running
gsdl-tracker-sync(comment on the sub-item + move it to the configured done state). WithTracker → provider: none, the same payload is appended toworklog.mdinstead — the record still gets written. - Show the user the summary
- Show the checkpoint and wait for confirmation before spawning the next subagent
Step 7 — Verify Against Deterministic Gates → CHECKPOINT: verify-report.md (MEDIUM Subagent)
After all parent slices are [x], update progress.md to step verify.
Spawn a subagent with the MEDIUM tier model override and this prompt:
You are running on the MEDIUM tier ([resolved model]). Read and follow the gsdl-verify-gates skill
(resolve path per the Skill Path Resolution section of the gsdl orchestrator SKILL.md).
Project context:
- Project name: [project-name]
- Workspace root: [absolute path to workspace root]
- Spec: [absolute path to SPEC.md]
- Task file: [absolute path to tasks.md]
You are running NON-INTERACTIVELY — do not ask the user anything, and do not attempt to fix
failing gates. Discover the project's real deterministic checks, run them, and write
verify-report.md with the command output captured verbatim.
Return: the report path, each gate's pass/fail status, and the verbatim output of any failure.
Gate failures are triaged by the orchestrator, not by the subagent. If any gate fails, stop
the pipeline here — surface the failure to the user, help resolve it (spawning a fresh MEDIUM
gsdl-execute subagent for the fix if needed), re-run this step, and do not advance until all
gates pass.
Update progress.md (step verify, verify_report path) once all gates pass.
Step 8 — Open PR + Address Review Bot → CHECKPOINT (MEDIUM Subagent)
Skip this step entirely when Forge → provider: none — record PR: skipped in progress.md,
tell the user the pipeline is going straight to close-loop, and move to Step 9.
Otherwise update progress.md to step pr and spawn a subagent with the MEDIUM tier model
override:
You are running on the MEDIUM tier ([resolved model]). Read and follow the gsdl-open-pr skill
(resolve path per the Skill Path Resolution section of the gsdl orchestrator SKILL.md).
Project context:
- Project name: [project-name]
- Workspace root: [absolute path to workspace root]
- Working branch: [branch-name]
- Tracker item: [ITEM-ID] — [item URL], or "none"
- Spec: [absolute path to SPEC.md]
- Task file: [absolute path to tasks.md]
- Verify report: [absolute path to verify-report.md]
- Review bot: [config value — auto | none | <login>]
- Existing PR (if resuming): [PR URL or "none"]
You are running NON-INTERACTIVELY — do not ask the user anything. Push the branch, open the PR
(or reuse the existing one), then poll for review-bot comments and address the ones
that are in scope.
Return: the PR URL, every bot finding with its disposition (fixed / rejected-with-reason /
needs-human), and whether anything is still outstanding. Escalate as a BLOCKER anything that
needs a product decision, changes SPEC.md's agreed scope, or that you could not fix.
Then:
- Record the PR URL in
progress.md. - Show the user the PR link and the findings table.
- Any finding marked needs-human is resolved with the user in this context, then a fresh MEDIUM subagent applies the agreed fix and re-runs Step 7's gates on it.
- Checkpoint: do not advance to Step 9 until the user confirms the PR is in the state they want.
Step 9 — Close Loop with Evidence Captured → CHECKPOINT (LARGE)
Update progress.md to step close.
Read and follow gsdl-close-loop, passing:
PROJECT_NAME,WORKSPACE_ROOTSPEC_PATH,TASKS_PATH,VERIFY_REPORT_PATH(all recorded inprogress.md)PR_URLand the findings disposition table from Step 8 (orskipped)
Session on a LARGE model → run inline. Otherwise → LARGE subagent with Question Relay; the tracker
closure itself is dispatched to a SMALL subagent (gsdl-tracker-sync) either way.
The skill generates the decisions+evidence document, then closes the tracker item on the user's confirmation, and optionally publishes to the configured docs provider.
After the document is saved and the user has answered the closure and publish prompts, update
progress.md to step done, then show:
🎉 Project '[project-name]' is complete.
Decisions & Evidence: .planning/[project-name]/decisions-[project-name].md
Verify report: .planning/[project-name]/verify-report.md
Pull request: [PR URL, or "skipped — no forge configured"]
Tracker: [closed item links, or "local only — see worklog.md"]
[If published: Published to [provider]: [URL]]
Run /gsdl [project-name] again if you want to resume or extend this project.
Progress File
Maintain .planning/[project-name]/progress.md throughout. Write it after every step transition.
Format
# [project-name] — GSDL Progress
## State
- Step: [source | spec | decompose | execute | verify | pr | close | done]
- Last Updated: [YYYY-MM-DD]
## Providers
- Tracker: [linear | jira | github | notion | none]
- Docs: [slite | notion | confluence | none]
- Forge: [github | none]
- Models: [provider name] (LARGE: [model], MEDIUM: [model], SMALL: [model])
## Active Files
- SPEC: [relative path to SPEC.md, or "none"]
- Tasks: [relative path to tasks.md, or "none"]
- Verify Report: [relative path to verify-report.md, or "none"]
- Item: [tracker item ID, or "none"]
- Suggested branch: [tracker's suggested branch name from Step 0, or "none"]
- Branch: [working branch name once created, or "none"]
- PR: [pull request URL, "skipped", or "none"]
Suggested branch is written at Step 0 and never cleared — Step 5.5 reads it from here, including
on a resume in a fresh context. The ## Providers block is a snapshot for the record; the config
file remains the source of truth.
When to write/update
| Event | Step value | SPEC | Tasks | Verify Report | Suggested branch | Branch | PR |
|---|---|---|---|---|---|---|---|
| Step 0 complete (source picked up, project created) | spec |
none | none | none | name or none | none | none |
SPEC.md saved |
decompose |
path | none | none | carried | none | none |
tasks.md + sub-items created |
execute |
path | path | none | carried | none | none |
| Branch created (Step 5.5) | execute |
path | path | none | carried | name | none |
| All slices complete | verify |
path | path | none | carried | name | none |
| All gates pass | pr |
path | path | path | carried | name | none |
| PR open and reviewed, or step skipped | close |
path | path | path | carried | name | url | skipped |
| Decisions doc saved + tracker closed | done |
path | path | path | carried | name | url | skipped |
Checkpoint Format
Show this between every step transition and between every parent slice in Step 6:
✅ [Step name / Slice N.0 title] complete.
What was done: [1–3 sentence summary]
Files touched: [key files created or modified]
👉 Review the output before continuing — you can edit it directly and your changes will be picked up automatically.
Ready to continue to [next step / Slice N+1.0]?
Type "yes" / "go" / "next" to continue, or tell me what to review or change first.
Never proceed past a checkpoint without user confirmation. Always re-read the relevant artifact from disk after the user confirms.
Resuming Mid-Pipeline
- Read
progress.md→ verify files on disk → fall back to filesystem scan if needed - Skip completed steps
- Announce: "Project '[name]' is at Step [N] ([step name]). Resuming from [description]."
- Re-run Step 5.5's branch check on any resume that will write code — the user may be on a different branch than when they left
- For Step 6, check which parent slices are already
[x]and skip them - For Step 8, if a PR is already recorded, reuse it — push new commits and re-poll the review bot rather than opening a second PR
- For Step 9, if
decisions-[project-name].mdalready exists, report the project is done — do not re-run
Rules
- Providers come from config, never from assumption — resolve once per
config.md, record the answer, and never silently switch trackers, docs targets, or forges between runs - The orchestrator runs on any model — never tell the user to switch models; route each step to its tier per Model Selection, and never downgrade a step below its tier
- Always show a checkpoint between steps and between parent slices — never chain them automatically
- All tracker I/O goes to SMALL via
gsdl-fetch-source/gsdl-tracker-sync— no tracker API round-trips on MEDIUM or LARGE - Steps 1, 4b, 6, 7, 8, 9b are subagents — always pass the tier override on the spawn; a subagent that returns a blocker gets handled with the user in this context, never re-delegated blind
- Step 6's subagent handles exactly one parent slice — never assign two slices to one subagent
- Step 5 is a real, separate gate — do not let the user "yes" through Step 4's checkpoint straight into execution without an explicit review confirmation
- Never write code on the default branch — Step 5.5 runs before the first execute subagent, and again on every resume
- Step 7 is a hard stop on failure — never advance with a failing gate
- Step 8 opens exactly one PR per project — resuming reuses it; skipping it requires
Forge → provider: noneand is always recorded, never silent - Surface blockers immediately — if a subagent reports an error, pause and resolve with the user before continuing
- All planning files stay within the project folder — never create files at workspace root
(the shared
gsdl.config.mdlives at.planning/, not the repo root) - Keep
progress.mdcurrent — update at every step transition so/gsdl [project-name]always resumes cleanly - Step 9's tracker closure and doc publishing are the only optional parts — the decisions+evidence document itself is mandatory