Issue tracker: Local Markdown

July 11, 2026 · View on GitHub

Issues and PRDs for this repo live as markdown files in .scratch/.

Conventions

  • One feature per directory: .scratch/<feature-slug>/
  • The PRD is .scratch/<feature-slug>/PRD.md
  • Implementation issues are .scratch/<feature-slug>/issues/<NN>-<slug>.md, numbered from 01
  • Triage state is recorded as a Status: line near the top of each issue file (see triage-labels.md for the role strings)
  • Comments and conversation history append to the bottom of the file under a ## Comments heading

Lifecycle after shipping

When an issue's work ships, set Status: done. When the whole feature has shipped and its dogfood round closed:

  1. Check the feature's devlog entries cover whatever in the PRD / issues still has long-term value (open questions, rejected options); move any uncovered point into the relevant devlog entry first.
  2. Delete the whole .scratch/<feature-slug>/ directory. .scratch/ holds in-flight work only — shipped tickets are provenance, and provenance lives in git history + devlog, not in the tracker.

When a skill says "publish to the issue tracker"

Create a new file under .scratch/<feature-slug>/ (creating the directory if needed).

When a skill says "fetch the relevant ticket"

Read the file at the referenced path. The user will normally pass the path or the issue number directly.

Wayfinding operations

Used by /wayfinder. The map is a file with one child file per ticket.

  • Map: .scratch/<effort>/map.md — the Notes / Decisions-so-far / Fog body.
  • Child ticket: .scratch/<effort>/issues/NN-<slug>.md, numbered from 01, with the question in the body. A Type: line records the ticket type (research/prototype/grilling/task); a Status: line records claimed/resolved.
  • Blocking: a Blocked by: NN, NN line near the top. A ticket is unblocked when every file it lists is resolved.
  • Frontier: scan .scratch/<effort>/issues/ for files that are open, unblocked, and unclaimed; first by number wins.
  • Claim: set Status: claimed and save before any work.
  • Resolve: append the answer under an ## Answer heading, set Status: resolved, then append a context pointer (gist + link) to the map's Decisions-so-far in map.md.