@firatcand/forge 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/ETHOS.md +81 -0
  2. package/LICENSE +21 -0
  3. package/README.md +134 -0
  4. package/agents/backend-dev.md +36 -0
  5. package/agents/code-reviewer.md +37 -0
  6. package/agents/db-architect.md +36 -0
  7. package/agents/design-reviewer.md +31 -0
  8. package/agents/devops-engineer.md +34 -0
  9. package/agents/frontend-dev.md +36 -0
  10. package/agents/learning-curator.md +35 -0
  11. package/agents/linear-syncer.md +36 -0
  12. package/agents/phase-gatekeeper.md +23 -0
  13. package/agents/product-decomposer.md +39 -0
  14. package/agents/qa-engineer.md +31 -0
  15. package/agents/security-auditor.md +34 -0
  16. package/bin/forge.js +368 -0
  17. package/lib/companions.js +67 -0
  18. package/lib/github-helpers.sh +148 -0
  19. package/lib/linear-helpers.sh +188 -0
  20. package/lib/paths.js +13 -0
  21. package/lib/tools.js +68 -0
  22. package/lib/validators.sh +284 -0
  23. package/lib/worktree-helpers.sh +136 -0
  24. package/package.json +53 -0
  25. package/skills/codex/SKILL.md +50 -0
  26. package/skills/decompose/SKILL.md +47 -0
  27. package/skills/draft-design/SKILL.md +55 -0
  28. package/skills/draft-prd/SKILL.md +47 -0
  29. package/skills/draft-spec/SKILL.md +42 -0
  30. package/skills/fix/SKILL.md +23 -0
  31. package/skills/forge/SKILL.md +87 -0
  32. package/skills/implement/SKILL.md +24 -0
  33. package/skills/ingest-spec/SKILL.md +46 -0
  34. package/skills/investigate/SKILL.md +26 -0
  35. package/skills/learn/SKILL.md +53 -0
  36. package/skills/phase-gate/SKILL.md +37 -0
  37. package/skills/pickup-task/SKILL.md +53 -0
  38. package/skills/plan-task/SKILL.md +22 -0
  39. package/skills/push-to-linear/SKILL.md +42 -0
  40. package/skills/qa/SKILL.md +22 -0
  41. package/skills/retro/SKILL.md +27 -0
  42. package/skills/review/SKILL.md +20 -0
  43. package/skills/setup-repo/SKILL.md +63 -0
  44. package/skills/ship/SKILL.md +34 -0
  45. package/skills/sync-status/SKILL.md +14 -0
  46. package/templates/BRIEF.template.md +34 -0
  47. package/templates/CLAUDE.project.template.md +37 -0
  48. package/templates/CRITICAL.template.md +11 -0
  49. package/templates/DESIGN.template.md +37 -0
  50. package/templates/PRD.template.md +30 -0
  51. package/templates/SPEC.template.md +49 -0
  52. package/templates/github-workflows/claude-issue.yml +27 -0
  53. package/templates/github-workflows/claude-pr-review.yml +22 -0
  54. package/templates/github-workflows/claude-scheduled.yml +23 -0
  55. package/templates/github-workflows/test.yml +18 -0
  56. package/templates/learning.template.md +14 -0
  57. package/templates/phases.template.yaml +45 -0
  58. package/templates/retro.template.md +27 -0
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: push-to-linear
3
+ description: Push phases.yaml to Linear — creates project, cycles per phase, issues with depends_on relations. Lightweight; uses user's Linear MCP.
4
+ tools: Read, Edit
5
+ subagent: linear-syncer
6
+ ---
7
+
8
+ # /push-to-linear
9
+
10
+ Delegate to the `linear-syncer` subagent.
11
+
12
+ ## Preconditions
13
+
14
+ - `plans/phases.yaml` exists
15
+ - Linear MCP configured globally OR user has Linear API key
16
+
17
+ ## If Linear MCP available
18
+
19
+ linear-syncer subagent uses MCP directly:
20
+ 1. Create Linear project (or find existing if `linear_project_id` set)
21
+ 2. For each phase: create a Linear Cycle
22
+ 3. For each task: create issue with priority, estimate, parent (if any), and "blocked by" relations
23
+ 4. Link Linear project to GitHub repo (enables native sync)
24
+ 5. Update phases.yaml with `linear_project_id`, `linear_team_id`, and `linear_id` per task
25
+
26
+ ## If no Linear MCP
27
+
28
+ Print phases.yaml in Linear-import-friendly format. Tell user:
29
+ - Open Linear → Import
30
+ - Paste the structured tasks
31
+ - Link the project to the GitHub repo manually in Linear settings
32
+
33
+ ## Linear ↔ GitHub sync
34
+
35
+ Once linked:
36
+ - Branch `feat/{LINEAR-ID}-slug` auto-links to issue
37
+ - PR opened with `[LINEAR-ID]` in title → issue moves to "In Review"
38
+ - PR merged → issue moves to "Done"
39
+
40
+ ## Output
41
+
42
+ Linear project URL. Confirmation that GH sync is active. Updated phases.yaml committed.
@@ -0,0 +1,22 @@
1
+ ---
2
+ name: qa
3
+ description: Run test suite, browser checks, and verify acceptance criteria. Bootstrap test framework if missing.
4
+ tools: Bash(*), Read, Edit
5
+ subagent: qa-engineer
6
+ ---
7
+
8
+ # /qa
9
+
10
+ Delegate to `qa-engineer` subagent.
11
+
12
+ ## Process
13
+
14
+ 1. Detect test framework — if absent, offer to bootstrap (Vitest + Playwright defaults)
15
+ 2. Run unit + integration tests
16
+ 3. For UI tasks: run Playwright on key flows from PRD
17
+ 4. Verify acceptance criteria from Linear issue are met
18
+ 5. Report failures; auto-suggest fixes for trivial ones
19
+
20
+ ## Test-or-die enforcement
21
+
22
+ If task is a bug fix and there's no regression test, REFUSE to pass /qa. Generate the regression test first.
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: retro
3
+ description: Write a phase retrospective. Auto-invoked by /phase-gate but can run standalone.
4
+ tools: Read, Write, Bash(git*)
5
+ ---
6
+
7
+ # /retro
8
+
9
+ ## Args
10
+
11
+ - `phase-{N}` (e.g., `phase-1`)
12
+
13
+ ## Process
14
+
15
+ 1. Gather data from Linear (closed tasks in cycle N) + git log (commits during cycle) + learnings written during cycle
16
+ 2. Synthesize:
17
+ - What shipped (count + highlights)
18
+ - Cycle time avg
19
+ - Decisions made (with PR links)
20
+ - Scope changes from original phases.yaml
21
+ - Learnings (count + key ones)
22
+ - What to do differently next phase
23
+ 3. Write to `docs/retros/phase-{N}.md` using `templates/retro.template.md`
24
+
25
+ ## Output
26
+
27
+ Retro file path + 5-bullet summary printed to terminal.
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: review
3
+ description: Run code-reviewer, security-auditor (if CRITICAL.md path touched), and design-reviewer (if UI task) on current diff.
4
+ tools: Read, Bash(git*)
5
+ ---
6
+
7
+ # /review
8
+
9
+ ## Process
10
+
11
+ 1. Run `git diff dev...HEAD` to get current diff
12
+ 2. Always invoke `code-reviewer` subagent
13
+ 3. If diff touches paths in CRITICAL.md, invoke `security-auditor`
14
+ 4. If task type is "design" or "frontend", invoke `design-reviewer`
15
+ 5. Aggregate findings; categorize by severity (block / improvement / nit)
16
+ 6. Print summary; ask user to address blocks before /ship
17
+
18
+ ## Output
19
+
20
+ Markdown summary of findings per reviewer, with file:line references.
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: setup-repo
3
+ description: Bootstrap the GitHub repo for a forge project — repo creation, branch protection, GitHub Environments, CI workflows, secrets configuration.
4
+ tools: Read, Write, Edit, Bash(gh*), Bash(git*)
5
+ subagent: devops-engineer
6
+ ---
7
+
8
+ # /setup-repo
9
+
10
+ Delegate to the `devops-engineer` subagent.
11
+
12
+ ## Preconditions
13
+
14
+ - `gh` CLI installed and authenticated
15
+ - spec/PRD.md exists
16
+ - Run from inside the project directory
17
+
18
+ ## Steps (transparent — show each to user, don't hide)
19
+
20
+ 1. **Verify gh CLI**: `gh auth status`
21
+ 2. **Create repo**: `gh repo create [name] --private --source=. --remote=origin`
22
+ - Or skip if origin already exists
23
+ 3. **Initial commit**: if no commits, commit current state to `main`
24
+ 4. **Branch dev from main**: `git checkout -b dev && git push origin dev`
25
+ 5. **Branch protection on main**:
26
+ - Require PR review (1)
27
+ - Require `test` status check
28
+ - No direct pushes
29
+ - No force pushes
30
+ 6. **Branch protection on dev**:
31
+ - Require PR review (1)
32
+ - Require `test` status check
33
+ 7. **GitHub Environments**:
34
+ - `development` (auto-deploy, no approval)
35
+ - `production` (manual approval)
36
+ 8. **Copy CI workflows** from `templates/github-workflows/` to `.github/workflows/`:
37
+ - `claude-issue.yml`
38
+ - `claude-pr-review.yml`
39
+ - `test.yml`
40
+ - `claude-scheduled.yml`
41
+ 9. **Generate `.env.example`** from SPEC.md env_vars list
42
+ 10. **Setup Claude Code OAuth token**:
43
+ - Prompt user: `claude setup-token`
44
+ - Read token from clipboard or stdin
45
+ - Set as repo secret: `gh secret set CLAUDE_CODE_OAUTH_TOKEN`
46
+ 11. **Commit and push**: `.github/`, updated `.env.example`
47
+
48
+ ## Each step shown to user
49
+
50
+ Don't run all 11 steps silently. Print each:
51
+
52
+ ```
53
+ [1/11] Verifying gh CLI authentication... ✓
54
+ [2/11] Creating repo firatcand/time-logger... ✓
55
+ [3/11] Initial commit on main... ✓
56
+ ...
57
+ ```
58
+
59
+ User can interrupt at any step.
60
+
61
+ ## Output
62
+
63
+ Repo URL + summary of what was configured. Branch protection rules summary. Workflow files list.
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: ship
3
+ description: Push branch, run final gates (tests, secrets scan, conventional commit), open PR with Linear issue ID, mark issue In Review.
4
+ tools: Bash(*), Read
5
+ ---
6
+
7
+ # /ship
8
+
9
+ ## Gates (all must pass)
10
+
11
+ 1. **Tests**: `npm test` (or detected equivalent) passes
12
+ 2. **Type check**: `npm run typecheck` (if applicable) passes
13
+ 3. **Lint**: `npm run lint` (if applicable) passes
14
+ 4. **Secrets scan**: `gitleaks detect` on the diff
15
+ 5. **Conventional commit**: at least one commit on this branch follows `feat|fix|chore|docs(scope): message`
16
+ 6. **Test-or-die**: new code has new tests; bug fixes have regression tests
17
+ 7. **Multi-model review**: if diff touches CRITICAL.md paths, `/codex review` was run
18
+
19
+ If any gate fails, list what's missing. Do not proceed.
20
+
21
+ ## Push and PR
22
+
23
+ 1. `git push origin HEAD`
24
+ 2. `gh pr create --base dev --title "[LINEAR-ID] {title from issue}" --body "{description}"`
25
+ 3. PR body template:
26
+ - What changed (3-5 bullets)
27
+ - Why
28
+ - How to test
29
+ - Linked: closes #LINEAR-ID
30
+ 4. Linear native sync: issue auto-moves to "In Review"
31
+
32
+ ## Output
33
+
34
+ PR URL. Linear issue link. Reminder to run `/learn` if anything notable happened.
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: sync-status
3
+ description: Pull current Linear state and reconcile with local phases.yaml. Useful when issues were closed/reopened in Linear directly.
4
+ tools: Read, Edit
5
+ subagent: linear-syncer
6
+ ---
7
+
8
+ # /sync-status
9
+
10
+ Read `plans/phases.yaml`. For each task with a `linear_id`, query Linear for current status. Update `phases.yaml` task status fields if drifted.
11
+
12
+ Report any divergence to user (e.g., "TLOG-103 closed in Linear but local says Todo").
13
+
14
+ This isn't usually needed — Linear ↔ GitHub native sync handles most cases. Use when manual closes happen in Linear.
@@ -0,0 +1,34 @@
1
+ # {{PROJECT_NAME}} — Brief
2
+
3
+ > Forged: {{ISO_DATE}}
4
+ > Status: draft (Gate 1 pending)
5
+
6
+ ## The pain
7
+ <!-- REQUIRED: Synthesized from forge Q1. Concrete, not abstract. -->
8
+
9
+ ## The user
10
+ <!-- REQUIRED: Specific persona. JTBD format: When ___, I want ___, so I ___. -->
11
+
12
+ ## The unfair advantage
13
+ <!-- REQUIRED: From Q2. Honest list of what's defensible vs aspirational. -->
14
+
15
+ ## The smallest valuable thing
16
+ <!-- REQUIRED: From Q3. 3-5 sentence v1 description. -->
17
+
18
+ ## Non-goals
19
+ <!-- REQUIRED: From Q4. The trap list. At least 3 bullets. -->
20
+ -
21
+ -
22
+ -
23
+
24
+ ## North-star metric
25
+ <!-- REQUIRED: From Q5. Single number with target value and timeframe. -->
26
+
27
+ ## Kill criteria
28
+ <!-- REQUIRED: From Q6. Structured by horizon. -->
29
+ - At week 4:
30
+ - At week 12:
31
+ - At month 6:
32
+
33
+ ## Open questions
34
+ <!-- Anything Q&A didn't fully resolve. Carry forward to /draft-prd. -->
@@ -0,0 +1,37 @@
1
+ # {{PROJECT_NAME}}
2
+
3
+ ## Stack
4
+ <!-- Auto-populated by /draft-spec — keep in sync with spec/SPEC.md -->
5
+
6
+ ## Branch strategy
7
+ - `main` → production (protected, no direct push)
8
+ - `dev` → integration (protected, PRs only)
9
+ - `feat/{LINEAR-ID}-{slug}` → working branches in worktrees
10
+
11
+ ## Commands
12
+ - Build: `npm run build`
13
+ - Test: `npm test`
14
+ - Type check: `npm run typecheck`
15
+ - Lint: `npm run lint`
16
+ - Dev: `npm run dev`
17
+
18
+ ## Conventions
19
+ <!-- Project-specific. Examples: -->
20
+ - Functional components only, no class components
21
+ - Always handle errors explicitly — no silent catches
22
+ - New API routes must have input validation
23
+ - See `spec/` for full conventions
24
+
25
+ ## Forge principles (auto-applied — see ~/.forge/ETHOS.md)
26
+ 1. Boil the Lake — refuse weak inputs
27
+ 2. Iron Law of Investigation — no fixes without RCA
28
+ 3. Confusion Protocol — clarify, don't guess
29
+ 4. Test-or-die — every PR ships with tests
30
+ 5. Compound Learning — capture notable learnings
31
+ 6. Multi-model Second Opinion — Codex on critical paths
32
+ 7. Plan Mode Mandatory — no multi-file changes without /plan-task
33
+ 8. 12-Factor Env Discipline — never commit secrets
34
+
35
+ ## Critical paths
36
+ <!-- Files matching these patterns trigger /codex auto-review on /ship -->
37
+ See CRITICAL.md
@@ -0,0 +1,11 @@
1
+ # Files requiring multi-model review (/codex auto-triggers on /ship)
2
+ # Edit this list to match your project's critical paths
3
+
4
+ src/lib/auth/**
5
+ src/lib/billing/**
6
+ src/app/api/webhooks/**
7
+ src/app/api/auth/**
8
+ infrastructure/**
9
+ .github/workflows/**
10
+ prisma/schema.prisma
11
+ supabase/migrations/**
@@ -0,0 +1,37 @@
1
+ # {{PROJECT_NAME}} — DESIGN
2
+
3
+ ## Tokens
4
+ <!-- Reference brand assets via @inherit pattern. -->
5
+
6
+ @inherit ~/{{BRAND_PATH}}/DESIGN-SYSTEM.md#tokens
7
+
8
+ Project-specific overrides:
9
+ -
10
+
11
+ ## Components
12
+ <!-- Reference primitives from design-system. List project-specific composites. -->
13
+
14
+ @inherit ~/{{BRAND_PATH}}/DESIGN-SYSTEM.md#components
15
+
16
+ Project additions:
17
+ -
18
+
19
+ ## Layouts
20
+ <!-- Project-unique page templates. -->
21
+
22
+ ## Voice & tone
23
+ @inherit ~/{{BRAND_PATH}}/VOICE.md
24
+
25
+ Project-specific calibration:
26
+ <!-- Any shifts from brand voice for this product context. -->
27
+ -
28
+
29
+ ## Accessibility
30
+ - WCAG AA minimum
31
+ - AAA for text contrast
32
+ - All interactive elements have visible focus
33
+ - Keyboard navigation tested
34
+ - Screen reader patterns:
35
+
36
+ ## States
37
+ <!-- For every interactive element: loading, error, empty, success. -->
@@ -0,0 +1,30 @@
1
+ # {{PROJECT_NAME}} — PRD
2
+
3
+ ## Problem
4
+ <!-- REQUIRED: Concrete pain, who feels it, when. -->
5
+
6
+ ## Target user
7
+ <!-- REQUIRED: Specific persona, JTBD format. -->
8
+
9
+ ## Acceptance Criteria (the MVP)
10
+ <!-- REQUIRED: Concrete, testable bullets. -->
11
+ - [ ] User can ___
12
+ - [ ] System enforces ___
13
+ - [ ] Performance: ___ in < ___ ms
14
+ - [ ] Accessibility: ___
15
+
16
+ ## Explicit non-goals
17
+ <!-- REQUIRED: Must include all from BRIEF non-goals. -->
18
+ - Not building ___
19
+ - Out of scope: ___
20
+
21
+ ## Success metrics
22
+ <!-- REQUIRED: Must include north-star from BRIEF. -->
23
+ - North-star: ___ (target value, timeframe)
24
+ - Leading indicators: ___, ___, ___
25
+
26
+ ## Constraints
27
+ <!-- REQUIRED: Budget, timeline, regulatory, integration. -->
28
+
29
+ ## User flows
30
+ <!-- For each primary flow: numbered steps + edge cases. -->
@@ -0,0 +1,49 @@
1
+ # {{PROJECT_NAME}} — SPEC
2
+
3
+ ## Stack
4
+ <!-- REQUIRED: All choices. -->
5
+ - Runtime:
6
+ - Frontend:
7
+ - Backend:
8
+ - Database:
9
+ - Hosting: ___ (dev) / ___ (prod)
10
+ - Auth:
11
+
12
+ ## Data model
13
+ <!-- REQUIRED: Tables/collections with fields, relationships, indexes. -->
14
+
15
+ ```sql
16
+ -- Pseudo-schema or actual DDL
17
+ ```
18
+
19
+ ## Key flows
20
+ <!-- For each primary user journey: -->
21
+
22
+ ### Flow 1: ___
23
+ 1. User ___
24
+ 2. System ___
25
+ 3. Edge cases: ___
26
+
27
+ ## Integration points
28
+ <!-- External services: APIs, webhooks, queues. -->
29
+
30
+ ## Security model
31
+ <!-- REQUIRED -->
32
+ - AuthN:
33
+ - AuthZ: ___ (RLS, RBAC, claims-based?)
34
+ - Sensitive data: ___ (encryption at rest, in transit)
35
+ - Rate limiting:
36
+
37
+ ## Environment variables
38
+ <!-- REQUIRED: 12-Factor compliant. List with descriptions. -->
39
+ - `DATABASE_URL` —
40
+ - `API_KEY` —
41
+
42
+ ## Performance targets
43
+ - p95 page load:
44
+ - p95 API response:
45
+
46
+ ## Observability
47
+ - Logs:
48
+ - Metrics:
49
+ - Errors:
@@ -0,0 +1,27 @@
1
+ name: Claude — Issue Assistant
2
+ on:
3
+ issue_comment:
4
+ types: [created]
5
+ issues:
6
+ types: [opened, assigned]
7
+ pull_request_review_comment:
8
+ types: [created]
9
+
10
+ jobs:
11
+ claude:
12
+ runs-on: ubuntu-latest
13
+ if: |
14
+ contains(github.event.comment.body, '@claude') ||
15
+ (github.event.action == 'assigned' && github.event.assignee.login == 'claude-bot')
16
+ permissions:
17
+ contents: write
18
+ pull-requests: write
19
+ issues: write
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ with:
23
+ fetch-depth: 0
24
+ - uses: anthropics/claude-code-action@v1
25
+ with:
26
+ claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
27
+ allowed_tools: "Edit,Read,Bash(git*),Bash(npm run*),Bash(npx tsc*)"
@@ -0,0 +1,22 @@
1
+ name: Claude — PR Security Review
2
+ on:
3
+ pull_request:
4
+ types: [opened, synchronize]
5
+ branches: [dev, main]
6
+
7
+ jobs:
8
+ security-review:
9
+ runs-on: ubuntu-latest
10
+ permissions:
11
+ contents: read
12
+ pull-requests: write
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ with:
16
+ fetch-depth: 0
17
+ ref: ${{ github.event.pull_request.head.sha }}
18
+ - uses: anthropics/claude-code-security-review@main
19
+ with:
20
+ comment-pr: true
21
+ claude-api-key: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
22
+ fail-on-findings: false
@@ -0,0 +1,23 @@
1
+ name: Claude — Scheduled Tasks
2
+ on:
3
+ schedule:
4
+ - cron: '0 9 * * 1' # Mondays 9am UTC
5
+ workflow_dispatch:
6
+
7
+ jobs:
8
+ tech-debt:
9
+ runs-on: ubuntu-latest
10
+ permissions:
11
+ contents: write
12
+ pull-requests: write
13
+ issues: write
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ - uses: anthropics/claude-code-action@v1
17
+ with:
18
+ claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
19
+ prompt: |
20
+ Review the codebase for tech debt: duplicated code, dead code,
21
+ outdated dependencies, missing tests on critical paths.
22
+ Create branch chore/tech-debt-{date}, propose fixes, open PR to dev.
23
+ allowed_tools: "Edit,Read,Bash(git*),Bash(npm run*)"
@@ -0,0 +1,18 @@
1
+ name: Tests
2
+ on:
3
+ pull_request:
4
+ branches: [dev, main]
5
+
6
+ jobs:
7
+ test:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - uses: actions/checkout@v4
11
+ - uses: actions/setup-node@v4
12
+ with:
13
+ node-version: '20'
14
+ cache: 'npm'
15
+ - run: npm ci
16
+ - run: npm run typecheck
17
+ - run: npm run lint
18
+ - run: npm test
@@ -0,0 +1,14 @@
1
+ # {{TITLE}}
2
+ > {{ISO_DATE}} · {{LINEAR_ID}} · tags: [{{TAGS}}]
3
+
4
+ ## What we expected
5
+ {{EXPECTED}}
6
+
7
+ ## What happened
8
+ {{ACTUAL}}
9
+
10
+ ## Why
11
+ {{ROOT_CAUSE}}
12
+
13
+ ## Next time
14
+ {{DIFFERENT_APPROACH}}
@@ -0,0 +1,45 @@
1
+ project: "{{PROJECT_NAME}}"
2
+ linear_project_id: "" # populated by /push-to-linear
3
+ linear_team_id: "" # populated by /push-to-linear
4
+ github_repo: "" # populated by /setup-repo
5
+ gate_check_command: "npm run e2e && npm run typecheck && npm run lint"
6
+
7
+ phases:
8
+ - id: phase-1
9
+ name: "Foundations"
10
+ status: active
11
+ goal: "Working skeleton end-to-end with seed data"
12
+ gate_criteria:
13
+ - "All P0 + P1 tasks closed in Linear"
14
+ - "Dev deploy succeeds"
15
+ - "No P0 bugs open"
16
+ tasks:
17
+ - id: P1-T01
18
+ linear_id: "" # populated by /push-to-linear
19
+ title: ""
20
+ description: ""
21
+ type: foundation
22
+ priority: P0
23
+ depends_on: []
24
+ estimate: M
25
+ owner_type: backend-dev
26
+ acceptance:
27
+ - ""
28
+
29
+ - id: phase-2
30
+ name: "Core Features"
31
+ status: blocked
32
+ blocked_by: phase-1
33
+ goal: ""
34
+ gate_criteria:
35
+ - ""
36
+ tasks: []
37
+
38
+ - id: phase-3
39
+ name: "Polish & Launch"
40
+ status: blocked
41
+ blocked_by: phase-2
42
+ goal: ""
43
+ gate_criteria:
44
+ - ""
45
+ tasks: []
@@ -0,0 +1,27 @@
1
+ # {{PROJECT_NAME}} — Phase {{N}} Retro
2
+ > Closed: {{ISO_DATE}}
3
+
4
+ ## What shipped
5
+ - {{COUNT}} tasks closed
6
+ - Highlights:
7
+
8
+ ## Cycle metrics
9
+ - Avg cycle time: {{AVG_HOURS}} hours
10
+ - Tasks at P0: {{P0_COUNT}}
11
+ - Bugs found post-merge: {{BUG_COUNT}}
12
+
13
+ ## Decisions made
14
+ - {{DECISION}} (PR #{{PR}})
15
+
16
+ ## Scope changes from original phases.yaml
17
+ - Added:
18
+ - Removed:
19
+ - Re-prioritized:
20
+
21
+ ## Learnings harvested
22
+ - `docs/learnings/{{Q}}/{{LEARNING_SLUG}}.md`
23
+
24
+ ## Different next phase
25
+ 1.
26
+ 2.
27
+ 3.