feat(skills): improve skills with pipeline enforcement and skill delegation (#510)

This commit is contained in:
Carlos Florêncio
2026-03-31 22:47:03 +01:00
committed by GitHub
parent 447da7edb2
commit 8352fa1645
13 changed files with 368 additions and 114 deletions
+55 -8
View File
@@ -12,16 +12,37 @@ Verify that a feature works as intended after implementation. Assume bugs exist
Mindset: you are not confirming it works — you are discovering where it breaks.
## Steps
## Before starting: create the pipeline
### 1. Understand the intent
Create these tasks immediately (use your task/todo tracking tool if available):
1. **Understand the intent** — Read task/PR/commits to understand what was built
2. **Trace the wiring** — Verify the feature is actually connected end-to-end
3. **Test the happy path** — Run the feature as a user would
4. **Try to break it** — Boundary values, error paths, concurrency, auth
5. **Verify test coverage** — Check for missing tests, write them if needed
6. **Report** — Summarize findings with verdict
Mark each task in_progress when you begin it and completed when you finish it. Do not skip phases — tracing the wiring before testing catches disconnected code early, and testing the happy path before edge cases establishes a working baseline.
---
## Phase 1: Understand the intent
Mark task 1 as in_progress.
Read the task description, PR, or recent commits to understand what was built and what it should do. Identify:
- The expected behavior (happy path)
- System boundaries (user input, API endpoints, external data)
- Integration points (what calls what, data flow end-to-end)
### 2. Trace the wiring
Mark task 1 as completed.
---
## Phase 2: Trace the wiring
Mark task 2 as in_progress.
Before testing behavior, verify the feature is actually connected:
- Exports are imported and used (not just defined)
@@ -31,14 +52,26 @@ Before testing behavior, verify the feature is actually connected:
If something is orphaned or unwired, stop and report it — no point testing disconnected code.
### 3. Test the happy path
Mark task 2 as completed.
---
## Phase 3: Test the happy path
Mark task 3 as in_progress.
Run the feature as a user would. For backend changes, call the API. For frontend changes, trace the UI flow. For both, follow the full path:
- Does the basic use case work?
- Does the response/output match expectations?
- Is the data persisted correctly?
### 4. Try to break it
Mark task 3 as completed.
---
## Phase 4: Try to break it
Mark task 4 as in_progress.
Systematically test these categories (skip what doesn't apply):
@@ -61,14 +94,26 @@ Systematically test these categories (skip what doesn't apply):
- Can the feature be accessed without proper auth?
- Does it respect permission boundaries?
### 5. Verify test coverage
Mark task 4 as completed.
---
## Phase 5: Verify test coverage
Mark task 5 as in_progress.
Check that the implementation has tests covering the behaviors you just verified:
- Are the happy path and key error paths tested?
- Are edge cases from step 4 covered?
- Are edge cases from Phase 4 covered?
- If tests are missing, write them following TDD (write failing test first, then verify it passes with existing code)
### 6. Report
Mark task 5 as completed.
---
## Phase 6: Report
Mark task 6 as in_progress.
Summarize what was tested and what was found:
@@ -82,3 +127,5 @@ Summarize what was tested and what was found:
- Behaviors that work but have no automated test
**Verdict:** Feature complete / Has issues — fix before merge
Mark task 6 as completed.
+4
View File
@@ -7,6 +7,10 @@ description: Review changed code for quality, security, and architecture complia
Review the current changes in the codebase (Go + Next.js monorepo). Every finding needs a `file_path:line_number` reference, an explanation of *why* it matters, and a concrete fix.
## Available skills
- **`/tdd`** — Recommend when flagging untested logic. The author can use this to add tests.
## Steps
### 1. Identify changed files and check scope
+6 -2
View File
@@ -7,6 +7,10 @@ description: Stage and commit changes using Conventional Commits. Use when there
Create a git commit following this project's Conventional Commits convention. These messages are used by git-cliff (`cliff.toml`) to auto-generate changelogs and release notes. PRs are squash-merged, so the PR title becomes the commit on `main` — CI validates it via `pr-title.yml`.
## Available skills and subagents
- **`verify` subagent** — Run fmt, typecheck, test, and lint. Delegate to this before committing to catch issues early.
## Format
```
@@ -46,11 +50,11 @@ ci: add PR title linting workflow
## Steps
**Create a todo/task for each step below and mark them as completed as you go.**
**Create a task for each step below and mark them as completed as you go.**
1. Run `git status` and `git diff` to understand all changes
2. Review recent commits with `git log --oneline -10` to match project style
3. Delegate to the **`verify` sub-agent** to run the full verification pipeline (rebase, format, typecheck, test, lint). It will fix any issues it finds. Wait for it to complete before proceeding.
3. Delegate to the `verify` subagent to run the full verification pipeline (rebase, format, typecheck, test, lint). It will fix any issues it finds. Wait for it to complete before proceeding.
4. Stage relevant files (prefer specific files over `git add -A`)
5. Write a commit message following the format above
6. If changes span multiple concerns, consider separate commits
+9 -2
View File
@@ -5,9 +5,16 @@ description: Write and run web E2E tests (Playwright) using TDD — locations, p
# E2E Tests
Write E2E tests using `/tdd` (Red-Green-Refactor). Always run the tests you create and watch them fail before implementing.
Write E2E tests using TDD (Red-Green-Refactor). Always run the tests you create and watch them fail before implementing.
**Location:** `apps/web/e2e/`
## Available skills and subagents
- **`/tdd`** — Follow the Red-Green-Refactor cycle when writing tests.
- **`/verify`** — Run after completing tests to ensure everything passes across the monorepo.
## Location
`apps/web/e2e/`
```
apps/web/e2e/
+92 -29
View File
@@ -7,27 +7,69 @@ description: Guided feature development — brainstorm, explore codebase, design
Systematic feature development: understand the problem, explore the codebase, design the solution, implement with TDD, verify it works, and review.
**No implementation before design approval.**
## Available skills and subagents
The following skills and subagents are available in this repo to delegate work to. Use them instead of doing everything inline — they have specialized instructions and keep your context clean:
- **`/tdd`** — Implement changes using Test-Driven Development (Red-Green-Refactor). Delegate implementation tasks to this.
- **`/e2e`** — Write and run Playwright E2E tests using TDD. Use for the final wave when the full feature needs end-to-end coverage.
- **`qa` subagent** — Verify a feature works after implementation. Actively tries to break it — edge cases, error paths, integration wiring.
- **`verify` subagent** — Run fmt, typecheck, test, and lint across the monorepo, then fix any issues found.
- **`simplify` subagent** — Simplify recently changed code — inline one-off abstractions, remove speculative code, reduce nesting.
- **`code-review` subagent** — Review changed code for quality, security, and architecture compliance.
---
## Before anything else: create the pipeline
The first thing you do — before reading code, before asking questions, before any exploration — is create a task list for the full pipeline. This is non-negotiable because it keeps you accountable to the process and lets the user see where you are.
Create these tasks immediately (use your task/todo tracking tool if available):
1. **Understand the problem** — Clarify requirements, identify constraints, confirm understanding with user
2. **Explore the codebase** — Find similar patterns, relevant architecture, integration points
3. **Design the solution** — Propose approaches with trade-offs, get user approval before implementing
4. **Implement with TDD** — Break into waves, implement test-first, delegate where possible
5. **QA** — Verify the feature works end-to-end, try to break it
6. **Review and finalize** — Simplify, verify, code review, summarize
Then start with task 1. Mark each task in_progress when you begin it and completed when you finish it. Do not skip ahead — each phase produces context that the next phase needs. Designing without exploring leads to solutions that fight the codebase. Implementing without design approval wastes time on the wrong approach.
---
## Phase 1: Understand the problem
Mark task 1 as in_progress.
1. If the request is vague, ask clarifying questions — one at a time, prefer multiple choice
2. Challenge the premise: is this the right feature, or is the real need something different?
2. **Challenge the premise** — before accepting the feature at face value, ask whether this is the right solution to the underlying problem. For example: "Have you considered X instead?" or "Is the real need Y rather than Z?" This is especially important for vague requests where the user may not have thought through alternatives. Even for clear requests, briefly consider whether a simpler approach exists.
3. Identify: what problem is being solved, who benefits, what are the constraints
4. Summarize understanding and confirm with the user
Mark task 1 as completed.
---
## Phase 2: Explore the codebase
1. Launch 2-3 Explore agents in parallel targeting different aspects:
Mark task 2 as in_progress.
1. Search the codebase in parallel targeting different aspects:
- Similar features and their implementation patterns
- Architecture and abstractions in the relevant area
- Integration points, data flow, and extension points
2. Read all key files the agents identify
2. Read all key files identified
3. Check `docs/decisions/INDEX.md` for relevant architectural decisions in this area
4. Present a summary of existing patterns and conventions to reuse
Mark task 2 as completed.
---
## Phase 3: Design
Mark task 3 as in_progress.
1. **Scope check:** If the feature spans multiple independent subsystems, break it into sub-features first. Each should produce working, testable software on its own.
2. Identify remaining ambiguities: edge cases, error handling, scope boundaries, backward compatibility
3. Ask the user to resolve them — do not assume
@@ -35,51 +77,56 @@ Systematic feature development: understand the problem, explore the codebase, de
- Minimal change (smallest diff, maximum reuse)
- Clean architecture (maintainability, elegant abstractions)
- Pragmatic balance (speed + quality)
5. **Map the file structure:** Before getting approval, list which files will be created or modified and what each is responsible for. This locks in decomposition decisions.
6. Get explicit user approval on the approach before proceeding
5. **Map the file structure:** List which files will be created or modified and what each is responsible for. This locks in decomposition decisions.
6. **Stop and wait for explicit user approval on the approach before proceeding.** Do not start Phase 4 until the user confirms the design.
Mark task 3 as completed only after the user approves.
---
## Phase 4: Implement with TDD
**You are the coordinator.** Your job is to hold the big picture (requirements, design, file structure, wave progress) and delegate implementation to subagents. Protect your context:
Mark task 4 as in_progress.
- **Prefer subagents over inline work.** Every task you implement inline fills your context with code details and tool outputs. Delegate to subagents whenever possible — they get fresh context and return only a summary.
- **Keep coupled tasks small.** If you must implement inline (coupled tasks), keep each task focused and short. Don't read entire files unnecessarily — read only what you need to verify the subagent's work or wire things together.
- **Don't debug in the coordinator.** If a subagent's task fails quality gates, dispatch a new subagent to fix it rather than debugging inline. Pass the failure details and let the fresh subagent investigate.
**You are the coordinator.** Your job is to hold the big picture (requirements, design, file structure, wave progress) and delegate implementation. Protect your context:
- **Delegate over inline work.** Every task you implement inline fills your context with code details and tool outputs. Delegate to sub-tasks whenever possible — they get fresh context and return only a summary.
- **Keep coupled tasks small.** If you must implement inline (coupled tasks), keep each task focused and short. Don't read entire files unnecessarily — read only what you need to verify work or wire things together.
- **Don't debug in the coordinator.** If a task fails quality gates, dispatch a new sub-task to fix it rather than debugging inline. Pass the failure details and let the fresh context investigate.
- **Track progress, not details.** For each completed task, note: what was done, which files changed, commit hash. Don't carry the implementation details forward.
### 4a. Decompose into tasks
### 4a. Decompose into implementation tasks
Using the file structure map from Phase 3, break the implementation into discrete tasks. Each task should:
Using the file structure map from Phase 3, create sub-tasks for each discrete piece of work. Each task should:
- Touch a specific set of files
- Have a clear done condition (test passes, API works, component renders)
- Be classifiable as independent or coupled
### 4b. Group into waves
Subagents share the same worktree, so parallelism is constrained by build boundaries:
- **Backend (Go)**: packages compile independently — different packages can run in parallel subagents
- **Frontend (Next.js)**: single build — only ONE subagent can work on frontend at a time
Parallelism is constrained by build boundaries:
- **Backend (Go)**: packages compile independently — different packages can run in parallel
- **Frontend (Next.js)**: single build — only ONE task can work on frontend at a time
- **E2E tests**: need full build — only after both backend and frontend changes are done
- **Coupled tasks** (shared types, sequential data flow): must run sequentially regardless
Group tasks into waves. Example:
```text
Wave 1 (parallel): [Backend API handler (subagent), Frontend component + hook (subagent)]
Wave 1 (parallel): [Backend API handler, Frontend component + hook]
Wave 2 (sequential): [Wire frontend to API, integration test]
Wave 3: [E2E test for the full flow]
```
Max parallelism: 1 frontend subagent + 1-2 backend subagents (if working on independent packages). For small features with 1-3 tasks, skip wave grouping and implement sequentially.
For small features with 1-3 tasks, skip wave grouping and implement sequentially.
### 4c. Execute wave by wave
For each wave, follow `/tdd` strictly (RED-GREEN-REFACTOR):
For each wave, follow TDD strictly (RED-GREEN-REFACTOR):
**Independent tasks in the wave**: dispatch one subagent per task. Each gets fresh context with:
**Independent tasks in the wave**: delegate each task via `/tdd`. Each gets:
- Task description and acceptance criteria
- Relevant file paths from Phase 3
- Codebase conventions from Phase 2
- Instruction to follow `/tdd`
**Coupled tasks** (e.g., wiring frontend to backend, integration glue): implement inline but keep it minimal — only the glue code, not full feature implementation.
@@ -91,29 +138,45 @@ After each wave completes:
- Backend: `cd apps/backend && go test ./internal/path/...` (changed packages only)
- Frontend: `cd apps && pnpm --filter @kandev/web typecheck && pnpm --filter @kandev/web test`
- If tests fail, fix before proceeding to the next wave
- E2E tests only in the final wave or Phase 5 (QA)
- E2E tests only in the final wave (via `/e2e`) or Phase 5 (QA)
Mark each implementation sub-task as completed as it passes its quality gate.
### 4e. Stop conditions
- **Bugs or missing validation discovered during a subagent's task:** the subagent fixes it inline. If the bug surfaces after a wave completes (quality gate failure), dispatch a new subagent to fix it — don't debug in the coordinator.
- **Bugs or missing validation discovered during a task:** fix inline. If the bug surfaces after a wave completes (quality gate failure), dispatch a new task to fix it — don't debug in the coordinator.
- **Blocker (missing dependency, unclear requirement, test fails repeatedly):** stop and ask the user
- **Fix requires architectural change (new DB table, new service layer, switching libraries):** stop and ask — don't make structural decisions silently
- **3 failed fix attempts on the same issue:** stop, question the approach, ask the user
Mark task 4 as completed when all implementation sub-tasks pass their quality gates.
---
## Phase 5: QA
Delegate to the **`qa` sub-agent** to verify the feature works end-to-end. It will:
Mark task 5 as in_progress.
Delegate to the `qa` subagent to verify the feature works end-to-end. It will:
- Trace the wiring (exports used, APIs called, data flows)
- Test the happy path
- Try to break it (boundary values, error paths, concurrency)
- Write tests for any gaps found
## Phase 6: Review
Mark task 5 as completed.
1. Delegate to the **`simplify` sub-agent** to clean up the implementation
2. Delegate to the **`verify` sub-agent** to ensure fmt, typecheck, test, and lint all pass
3. Delegate to the **`code-review` sub-agent** to review the changes
---
## Phase 6: Review and finalize
Mark task 6 as in_progress.
1. Delegate to the `simplify` subagent to clean up the implementation
2. Delegate to the `verify` subagent to run fmt, typecheck, test, and lint
3. Delegate to the `code-review` subagent to review changes for quality, security, and architecture compliance
4. Fix any blockers, present suggestions to the user
5. Summarize: what was built, key decisions, files modified, suggested next steps
6. If significant architectural decisions were made, record them via `/record decision`
7. Save the feature design to `docs/plans/` via `/record plan` for permanent reference
6. If significant architectural decisions were made, record them
7. Save the feature design to `docs/plans/` for permanent reference
Mark task 6 as completed.
+54 -13
View File
@@ -5,11 +5,32 @@ description: Fix bugs and issues — reproduce, find root cause, minimal fix wit
# Fix
Systematic bug fixing: reproduce the problem, find the root cause, apply a minimal fix with a regression test. **No fix without root cause investigation first.**
Systematic bug fixing: reproduce the problem, find the root cause, apply a minimal fix with a regression test.
## Steps
## Available skills and subagents
### 1. Reproduce
- **`/tdd`** — Use for implementing the fix with a regression test (Red-Green-Refactor).
- **`/e2e`** — Use when the bug is in a user-facing flow and needs a Playwright regression test.
- **`/verify`** — Run after fixing to ensure nothing else broke.
---
## Before anything else: create the pipeline
Create these tasks immediately (use your task/todo tracking tool if available):
1. **Reproduce the bug** — Write a test or find a reliable reproduction case
2. **Find the root cause** — Trace the code path, narrow the scope, state the cause clearly
3. **Fix with TDD** — Minimal fix with regression test, no surrounding refactors
4. **Verify** — Run full verification, check for similar patterns elsewhere
Then start with task 1. Mark each task in_progress when you begin it and completed when you finish it. Do not skip ahead — fixing without reproducing leads to patches that don't address the real problem. Fixing without understanding the root cause leads to whack-a-mole.
---
## Phase 1: Reproduce
Mark task 1 as in_progress.
Before anything else, reproduce the bug reliably. Pick the right method based on where the bug lives:
@@ -21,7 +42,13 @@ Before anything else, reproduce the bug reliably. Pick the right method based on
If it can't be reproduced, add logging/assertions to gather more info — don't guess at a fix.
Find the minimal reproduction case: strip away everything that isn't needed to trigger the bug.
### 2. Narrow down the cause
Mark task 1 as completed.
---
## Phase 2: Find the root cause
Mark task 2 as in_progress.
Don't guess and patch — systematically narrow the scope:
@@ -31,27 +58,41 @@ Don't guess and patch — systematically narrow the scope:
**Check history (only if it used to work):** If a feature regressed, use `git bisect` to find the commit that broke it. Skip this for bugs that were always present.
### 3. Confirm root cause
Before fixing, state the root cause clearly:
**Before proceeding, state the root cause clearly:**
- What is the actual cause (not the symptom)?
- Why does it happen? (e.g., "empty string bypasses validation and reaches the DB layer")
- Under what conditions? (e.g., "only when the input is whitespace-only")
If you can't state this clearly, you haven't found the root cause yet — go back to step 2.
If you can't state this clearly, you haven't found the root cause yet — keep investigating. Present your root cause analysis to the user before fixing.
### 4. Fix with TDD
Mark task 2 as completed.
---
## Phase 3: Fix with TDD
Mark task 3 as in_progress.
Follow `/tdd`:
1. Write a test that reproduces the exact bug — confirm it fails
2. Write the minimal fix — change only what's necessary, don't refactor surrounding code
3. Confirm the test passes and no other tests regress
### 5. Verify
Mark task 3 as completed.
- Run `/verify` to ensure nothing else broke
- Check that the fix addresses the root cause, not just the symptom
- If the same category of bug could occur elsewhere, grep for similar patterns
---
## Phase 4: Verify
Mark task 4 as in_progress.
1. Run `/verify` to ensure nothing else broke
2. Check that the fix addresses the root cause, not just the symptom
3. If the same category of bug could occur elsewhere, grep for similar patterns and flag them
Mark task 4 as completed.
---
## Stop conditions
+5
View File
@@ -7,6 +7,11 @@ description: Wait for CI checks and automated reviews (CodeRabbit, Greptile) on
Wait for CI and code review to complete on a pull request, fix any failures or valid comments, then push.
## Available skills and subagents
- **`verify` subagent** — Run the full verification pipeline (format, typecheck, test, lint) before pushing fixes.
- **`/commit`** — Use for staging and committing fixes with Conventional Commits format.
## Context
- Current branch: !`git branch --show-current`
+8 -7
View File
@@ -5,6 +5,11 @@ description: Commit, push, and create a PR. Default is ready-for-review with aut
# PR
## Available skills
- **`/commit`** — Stage and commit changes using Conventional Commits. Runs `/verify` internally.
- **`/pr-fixup`** — Wait for CI checks and CodeRabbit review, fix any failures or valid comments, and push.
## Context
- Current git status: !`git status`
@@ -17,13 +22,9 @@ description: Commit, push, and create a PR. Default is ready-for-review with aut
- `--draft` — create the PR as draft and skip the fixup step. Use when the work is not ready for review.
- Default (no flag) — create as ready-for-review and run `/pr-fixup` to wait for CI/CodeRabbit and fix issues.
## Your task
## Steps
Commit, push, and create a pull request.
### Steps
**Create a todo/task for each step below and mark them as completed as you go.**
**Create a task for each step below and mark them as completed as you go.**
1. **Uncommitted changes:** If there are dirty or staged changes, run `/commit` first (it runs `/verify` internally).
@@ -36,7 +37,7 @@ Commit, push, and create a pull request.
**PR title** must follow Conventional Commits format (see `/commit` for full rules). CI validates via `pr-title.yml` — the PR title becomes the squash-merge commit used for release notes.
**PR body** must follow the project's pull request template:
- **Summary** (required): 1–2 sentences of prose, no heading. Lead with the problem/goal, end with the outcome. Say WHY, not what.
- **Summary** (required): 1-2 sentences of prose, no heading. Lead with the problem/goal, end with the outcome. Say WHY, not what.
- **Important Changes** (optional): short bullet list of significant architectural changes. Remove section if not needed.
- **Validation** (required): list commands or checks run (e.g. `go test ./...`, `make lint`).
- **Diagram** (optional): Mermaid diagram only for non-obvious flows. Remove section if not needed.
+5
View File
@@ -5,6 +5,11 @@ description: Commit and push to the current branch. Use --fixup to also wait for
# Push
## Available skills
- **`/commit`** — Stage and commit changes using Conventional Commits. Runs `/verify` internally.
- **`/pr-fixup`** — Wait for CI checks and CodeRabbit review, fix any failures, and push again.
## Context
- Current branch: !`git branch --show-current`
+63 -9
View File
@@ -9,16 +9,44 @@ Verify that a feature works as intended after implementation. Assume bugs exist
Mindset: you are not confirming it works — you are discovering where it breaks.
## Steps
## Available skills
### 1. Understand the intent
- **`/tdd`** — Use to write tests for any gaps found during QA.
- **`/e2e`** — Use to write Playwright E2E tests for user-facing flows that lack coverage.
---
## Before starting: create the pipeline
Create these tasks immediately (use your task/todo tracking tool if available):
1. **Understand the intent** — Read task/PR/commits to understand what was built
2. **Trace the wiring** — Verify the feature is actually connected end-to-end
3. **Test the happy path** — Run the feature as a user would
4. **Try to break it** — Boundary values, error paths, concurrency, auth
5. **Verify test coverage** — Check for missing tests, write them if needed
6. **Report** — Summarize findings with verdict
Mark each task in_progress when you begin it and completed when you finish it.
---
## Phase 1: Understand the intent
Mark task 1 as in_progress.
Read the task description, PR, or recent commits to understand what was built and what it should do. Identify:
- The expected behavior (happy path)
- System boundaries (user input, API endpoints, external data)
- Integration points (what calls what, data flow end-to-end)
### 2. Trace the wiring
Mark task 1 as completed.
---
## Phase 2: Trace the wiring
Mark task 2 as in_progress.
Before testing behavior, verify the feature is actually connected:
- Exports are imported and used (not just defined)
@@ -28,14 +56,26 @@ Before testing behavior, verify the feature is actually connected:
If something is orphaned or unwired, stop and report it — no point testing disconnected code.
### 3. Test the happy path
Mark task 2 as completed.
---
## Phase 3: Test the happy path
Mark task 3 as in_progress.
Run the feature as a user would. For backend changes, call the API. For frontend changes, trace the UI flow. For both, follow the full path:
- Does the basic use case work?
- Does the response/output match expectations?
- Is the data persisted correctly?
### 4. Try to break it
Mark task 3 as completed.
---
## Phase 4: Try to break it
Mark task 4 as in_progress.
Systematically test these categories (skip what doesn't apply):
@@ -58,14 +98,26 @@ Systematically test these categories (skip what doesn't apply):
- Can the feature be accessed without proper auth?
- Does it respect permission boundaries?
### 5. Verify test coverage
Mark task 4 as completed.
---
## Phase 5: Verify test coverage
Mark task 5 as in_progress.
Check that the implementation has tests covering the behaviors you just verified:
- Are the happy path and key error paths tested?
- Are edge cases from step 4 covered?
- If tests are missing, write them using `/tdd`
- Are edge cases from Phase 4 covered?
- If tests are missing, write them using `/tdd` (or `/e2e` for user-facing flows)
### 6. Report
Mark task 5 as completed.
---
## Phase 6: Report
Mark task 6 as in_progress.
Summarize what was tested and what was found:
@@ -79,3 +131,5 @@ Summarize what was tested and what was found:
- Behaviors that work but have no automated test
**Verdict:** Feature complete / Has issues — fix before merge
Mark task 6 as completed.
+4
View File
@@ -9,6 +9,10 @@ Post-implementation simplification pass. Review recently changed code and active
The best code is code you don't have to write. The second best is code anyone can read.
## Available skills and subagents
- **`verify` subagent** — Run after simplifications to ensure all tests, lints, and typechecks still pass.
## Steps
### 1. Identify what to simplify
+7 -7
View File
@@ -9,6 +9,11 @@ Implement code changes using strict Red-Green-Refactor. Iron law: **no productio
Wrote code before a test? Delete it. Start over from a failing test.
## Available skills and subagents
- **`/e2e`** — Use when the change needs a Playwright E2E test instead of a unit test.
- **`/verify`** — Run after completing all TDD cycles to ensure everything passes across the monorepo.
## When to use
- Bug fixes — write a test that reproduces the bug before fixing
@@ -27,14 +32,9 @@ Wrote code before a test? Delete it. Start over from a failing test.
```bash
cd apps && pnpm --filter @kandev/web test -- --run path/to/file.test.ts
```
- **Web E2E** (`apps/web/e2e/`): Playwright tests with full-stack isolation (backend + frontend + DB per worker). Uses page objects in `e2e/pages/` and fixtures in `e2e/fixtures/`. Run:
```bash
make test-e2e # all tests, headless
cd apps && pnpm --filter @kandev/web e2e -- tests/my-test.spec.ts # single file
make test-e2e-headed # with visible browser
```
- **Web E2E** (`apps/web/e2e/`): delegate to `/e2e` for Playwright tests.
Choose the right level: unit tests for isolated logic, web E2E for user-facing flows.
Choose the right level: unit tests for isolated logic, E2E for user-facing flows.
## Steps
+56 -37
View File
@@ -9,45 +9,64 @@ Run the full verification pipeline for the monorepo, then fix any issues found.
## Steps
1. **Rebase on main** (ensures CI parity — CI merges main into the PR branch):
```bash
git fetch origin main --quiet
```
- If the current branch is `main`, skip this step.
- If the branch is stacked on another feature branch (not main), skip this step.
Detect: `git rev-parse --abbrev-ref --symbolic-full-name @{upstream} 2>/dev/null` — if the upstream is NOT `origin/main` (e.g., another feature branch), skip rebase.
- Otherwise, rebase:
```bash
git rebase origin/main
```
- If the rebase has conflicts, resolve them:
1. For each conflicted file, read the file and understand both sides of the conflict
2. Resolve by keeping the correct combination of both changes (don't just pick one side)
3. `git add <resolved-file>` then `git rebase --continue`
4. Repeat for each conflicting commit until the rebase completes
5. If a conflict is too ambiguous to resolve confidently, abort (`git rebase --abort`) and ask the user for guidance
**Create a task for each step below and mark them as completed as you go.** This pipeline must run in order — formatting before linting prevents formatter-induced lint failures.
2. **Format** (prevents formatter-induced lint failures):
- `make -C apps/backend fmt`
- `cd apps && pnpm format`
### 1. Rebase on main
3. **Verify in parallel** where possible:
- `make -C apps/backend test lint`
- `cd apps && pnpm --filter @kandev/web typecheck && pnpm --filter @kandev/web lint`
Ensures CI parity — CI merges main into the PR branch.
4. **Fix issues** — do NOT just report them:
- Read each failing file at the reported line number
- Fix the root cause (don't suppress warnings or add ignores)
- Common fixes:
- **Type errors**: fix the type, add a missing import, or correct the function signature
- **Lint — function too long**: extract a helper function or sub-component
- **Lint — file too long**: split the file into smaller, cohesive files grouped by responsibility (e.g., separate types, helpers, constants, or sub-domains into their own files)
- **Lint — cyclomatic/cognitive complexity**: simplify conditionals, extract early returns, break into smaller functions
- **Lint — unused imports**: remove them
- **Lint — duplicate strings**: extract to a constant
- **Test failures**: read the test, understand the assertion, fix the code (not the test) unless the test is outdated
- After fixing, re-run only the failed command to confirm the fix
```bash
git fetch origin main --quiet
```
5. **Repeat** steps 3-4 until all commands pass. If a fix introduces new issues, address those too.
- If the current branch is `main`, skip this step.
- If the branch is stacked on another feature branch (not main), skip this step.
Detect: `git rev-parse --abbrev-ref --symbolic-full-name @{upstream} 2>/dev/null` — if the upstream is NOT `origin/main` (e.g., another feature branch), skip rebase.
- Otherwise, rebase:
```bash
git rebase origin/main
```
- If the rebase has conflicts, resolve them:
1. For each conflicted file, read the file and understand both sides of the conflict
2. Resolve by keeping the correct combination of both changes (don't just pick one side)
3. `git add <resolved-file>` then `git rebase --continue`
4. Repeat for each conflicting commit until the rebase completes
5. If a conflict is too ambiguous to resolve confidently, abort (`git rebase --abort`) and ask the user for guidance
6. **Done** when all pass cleanly: rebase, fmt, typecheck, test, lint.
### 2. Format
Run formatters first — they may change line lengths which affects linter results.
- `make -C apps/backend fmt`
- `cd apps && pnpm format`
### 3. Verify in parallel
Run these in parallel where possible:
- `make -C apps/backend test lint`
- `cd apps && pnpm --filter @kandev/web typecheck && pnpm --filter @kandev/web lint`
### 4. Fix issues
Do NOT just report issues — fix them:
- Read each failing file at the reported line number
- Fix the root cause (don't suppress warnings or add ignores)
- Common fixes:
- **Type errors**: fix the type, add a missing import, or correct the function signature
- **Lint — function too long**: extract a helper function or sub-component
- **Lint — file too long**: split the file into smaller, cohesive files grouped by responsibility (e.g., separate types, helpers, constants, or sub-domains into their own files)
- **Lint — cyclomatic/cognitive complexity**: simplify conditionals, extract early returns, break into smaller functions
- **Lint — unused imports**: remove them
- **Lint — duplicate strings**: extract to a constant
- **Test failures**: read the test, understand the assertion, fix the code (not the test) unless the test is outdated
- After fixing, re-run only the failed command to confirm the fix
### 5. Repeat
Repeat steps 3-4 until all commands pass. If a fix introduces new issues, address those too.
### 6. Done
All pass cleanly: rebase, fmt, typecheck, test, lint. Mark all tasks as completed.