warp-os 1.1.2 → 1.2.1

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 (45) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/README.md +6 -4
  3. package/VERSION +1 -1
  4. package/agents/warp-annotate.md +394 -0
  5. package/agents/warp-browse.md +9 -1
  6. package/agents/warp-build-code.md +9 -1
  7. package/agents/warp-orchestrator.md +10 -1
  8. package/agents/warp-plan-architect.md +120 -1
  9. package/agents/warp-plan-brainstorm.md +93 -2
  10. package/agents/warp-plan-design.md +97 -4
  11. package/agents/warp-plan-onboarding.md +9 -1
  12. package/agents/warp-plan-optimize.md +9 -1
  13. package/agents/warp-plan-scope.md +67 -1
  14. package/agents/warp-plan-security.md +576 -35
  15. package/agents/warp-plan-testdesign.md +9 -1
  16. package/agents/warp-qa-debug.md +117 -1
  17. package/agents/warp-qa-test.md +167 -1
  18. package/agents/warp-release-update.md +290 -4
  19. package/agents/warp-setup.md +9 -1
  20. package/agents/warp-upgrade.md +21 -4
  21. package/bin/hooks/CLAUDE.md +24 -0
  22. package/bin/hooks/_warp_json.sh +4 -2
  23. package/bin/hooks/identity-briefing.sh +20 -13
  24. package/bin/hooks/validate-askuser.sh +41 -0
  25. package/bin/migrate-sessions.js +284 -173
  26. package/dist/warp-annotate/SKILL.md +404 -0
  27. package/dist/warp-browse/SKILL.md +9 -1
  28. package/dist/warp-build-code/SKILL.md +9 -1
  29. package/dist/warp-orchestrator/SKILL.md +10 -1
  30. package/dist/warp-plan-architect/SKILL.md +120 -1
  31. package/dist/warp-plan-brainstorm/SKILL.md +93 -2
  32. package/dist/warp-plan-design/SKILL.md +97 -4
  33. package/dist/warp-plan-onboarding/SKILL.md +9 -1
  34. package/dist/warp-plan-optimize/SKILL.md +9 -1
  35. package/dist/warp-plan-scope/SKILL.md +67 -1
  36. package/dist/warp-plan-security/SKILL.md +578 -35
  37. package/dist/warp-plan-testdesign/SKILL.md +9 -1
  38. package/dist/warp-qa-debug/SKILL.md +117 -1
  39. package/dist/warp-qa-test/SKILL.md +167 -1
  40. package/dist/warp-release-update/SKILL.md +290 -4
  41. package/dist/warp-setup/SKILL.md +9 -1
  42. package/dist/warp-upgrade/SKILL.md +21 -4
  43. package/package.json +2 -2
  44. package/shared/project-hooks.json +7 -0
  45. package/shared/tier1-engineering-constitution.md +9 -1
@@ -135,6 +135,8 @@ Shell commands use Unix syntax (Git Bash). Never use CMD (`dir`, `type`, `del`)
135
135
 
136
136
  ## AskUserQuestion
137
137
 
138
+ **Flow: analysis first, then decision tool.** Present your full reasoning, trade-offs, and recommendations as conversational text — the user wants to read your thinking. Then cap it with AskUserQuestion to formalize the decision. **If you're composing a message with multiple options or "which approach?" language, you MUST end it with AskUserQuestion.** Never present options in prose without the tool.
139
+
138
140
  **Contract:**
139
141
  1. **Re-ground:** Project name, branch, current task. (1-2 sentences.)
140
142
  2. **Simplify:** Plain English a smart 16-year-old could follow.
@@ -156,9 +158,15 @@ Shell commands use Unix syntax (Git Bash). Never use CMD (`dir`, `type`, `del`)
156
158
  Format: `"Option name — X/10 🟢"` (or 🟡 or 🔴). In the label, not the description.
157
159
  Rate: 🟢 9-10 complete, 🟡 6-8 adequate, 🔴 1-5 shortcuts.
158
160
 
161
+ **Pre-call checklist (verify before every AskUserQuestion invocation):**
162
+ - ☐ Completeness scores in every option label
163
+ - ☐ Recommended option listed first
164
+ - ☐ One decision per question (split if multiple)
165
+ - ☐ Analysis/reasoning already presented in message text above
166
+
159
167
  **Formatting:**
160
168
  - *Italics* for emphasis, not **bold** (bold for headers only).
161
- - After each answer: `✔ Decision {N} recorded [quicksave updated]`
169
+ - After each answer: `✔ Decision {N} recorded`
162
170
  - Previews under 8 lines. Full mockups go in conversation text before the question.
163
171
 
164
172
  ---
@@ -131,6 +131,8 @@ Shell commands use Unix syntax (Git Bash). Never use CMD (`dir`, `type`, `del`)
131
131
 
132
132
  ## AskUserQuestion
133
133
 
134
+ **Flow: analysis first, then decision tool.** Present your full reasoning, trade-offs, and recommendations as conversational text — the user wants to read your thinking. Then cap it with AskUserQuestion to formalize the decision. **If you're composing a message with multiple options or "which approach?" language, you MUST end it with AskUserQuestion.** Never present options in prose without the tool.
135
+
134
136
  **Contract:**
135
137
  1. **Re-ground:** Project name, branch, current task. (1-2 sentences.)
136
138
  2. **Simplify:** Plain English a smart 16-year-old could follow.
@@ -152,9 +154,15 @@ Shell commands use Unix syntax (Git Bash). Never use CMD (`dir`, `type`, `del`)
152
154
  Format: `"Option name — X/10 🟢"` (or 🟡 or 🔴). In the label, not the description.
153
155
  Rate: 🟢 9-10 complete, 🟡 6-8 adequate, 🔴 1-5 shortcuts.
154
156
 
157
+ **Pre-call checklist (verify before every AskUserQuestion invocation):**
158
+ - ☐ Completeness scores in every option label
159
+ - ☐ Recommended option listed first
160
+ - ☐ One decision per question (split if multiple)
161
+ - ☐ Analysis/reasoning already presented in message text above
162
+
155
163
  **Formatting:**
156
164
  - *Italics* for emphasis, not **bold** (bold for headers only).
157
- - After each answer: `✔ Decision {N} recorded [quicksave updated]`
165
+ - After each answer: `✔ Decision {N} recorded`
158
166
  - Previews under 8 lines. Full mockups go in conversation text before the question.
159
167
 
160
168
  ---
@@ -428,6 +436,36 @@ Do NOT form Hypothesis 4. Instead:
428
436
 
429
437
  If after two rounds of 3-strike recovery you still cannot find the root cause, surface the investigation to the user. Show your evidence log. Show your falsified hypotheses. Ask for additional context. The user may know something about the system that is not visible in the code.
430
438
 
439
+ ### 2D. WebSearch for Error Patterns
440
+
441
+ When hypotheses from code analysis are exhausted (3-strike rule triggered), search the web for the error pattern before escalating to the user. This often reveals known framework bugs, version-specific issues, or configuration problems that are not visible in the code.
442
+
443
+ **Sanitization protocol — MANDATORY before any web search:**
444
+ Strip all of the following from the search query:
445
+ - Hostnames, IP addresses, and port numbers
446
+ - Full file paths (use only the filename, not the path)
447
+ - SQL queries or database schema details
448
+ - Customer data, user IDs, or account identifiers
449
+ - API keys, tokens, secrets, or credentials
450
+ - Internal service names (replace with generic terms like "microservice" or "API")
451
+
452
+ **Search strategy:**
453
+ ```
454
+ Search query format: "[error message pattern]" + [technology/framework name] + [version if known]
455
+
456
+ Examples:
457
+ BAD: "ECONNREFUSED 10.0.1.42:5432 in /home/deploy/myapp/src/db/pool.ts"
458
+ GOOD: "ECONNREFUSED" postgres connection pool node.js
459
+
460
+ BAD: "TypeError: Cannot read property 'userId' of undefined at /srv/api/auth/session.ts:47"
461
+ GOOD: "TypeError: Cannot read property of undefined" session restore supabase auth
462
+ ```
463
+
464
+ **Using search results:**
465
+ - If a known issue or workaround is found, use it to form a new hypothesis (label it clearly as "from web search" in your hypothesis log).
466
+ - If the search reveals a framework bug with a specific version, check whether the project uses that version.
467
+ - Do not blindly apply Stack Overflow fixes. Treat web results as hypothesis fuel, not as solutions. Every web-sourced hypothesis still goes through the standard test-and-falsify process.
468
+
431
469
  ---
432
470
 
433
471
  ## PHASE 3: Isolate
@@ -491,6 +529,16 @@ ROOT CAUSE:
491
529
  - If the fix requires refactoring an adjacent function: **do not refactor it**. Fix only what is broken. Schedule the refactor separately.
492
530
  - Scope lock is not about being timid. It is about keeping the fix reviewable, git blame meaningful, and the regression test focused.
493
531
 
532
+ **Scope lock enforcement:**
533
+ 1. **Announce the scope lock boundary explicitly:**
534
+ ```
535
+ SCOPE LOCK ACTIVE:
536
+ Allowed: [file path(s) that may be edited]
537
+ Blocked: everything else
538
+ ```
539
+ 2. **Before every edit**, verify the target file is within the declared scope. If you catch yourself about to edit a file outside scope, stop, note the issue in the "Scope notes" section of the debug report, and do not make the edit.
540
+ 3. **After committing**, run `git diff HEAD~1 --name-only` and verify every changed file is within the declared scope boundary. If any file is outside scope, the commit is a scope lock violation — revert the out-of-scope changes and recommit.
541
+
494
542
  ### 3C. Minimal Reproduction Case
495
543
 
496
544
  Before writing the fix, create the minimal reproduction as a failing test:
@@ -537,6 +585,26 @@ You know the exact root cause. Write the minimum change that addresses it.
537
585
  | Missing error propagation | Propagate the error; add a test for the error path |
538
586
  | Wrong data shape assumed | Fix the assumption; add a type or schema check |
539
587
 
588
+ ### 4A-Gate. 5-File Blast Radius Check
589
+
590
+ Before applying the fix, count the number of files the proposed change will touch. If the fix touches **more than 5 files**, this is a blast radius warning — the fix may be too broad for a scoped debug fix.
591
+
592
+ Present via AskUserQuestion:
593
+
594
+ > This fix touches {N} files, which exceeds the 5-file blast radius threshold. Broad fixes are harder to review, more likely to introduce regressions, and may indicate the root cause is not fully isolated.
595
+ >
596
+ > Files affected:
597
+ > {list of files}
598
+ >
599
+ > - **A) Proceed** — the fix genuinely needs all these files (e.g., renaming a widely-used function, fixing a type that propagates)
600
+ > - **B) Split** — break the fix into smaller, independently committable changes that can each be verified
601
+ > - **C) Rethink** — the fix is too broad, go back to Phase 2 (Hypothesize) and consider whether the root cause is actually narrower than assumed
602
+
603
+ If B: plan the split before writing any code. Each sub-fix should have its own regression test and commit.
604
+ If C: return to Phase 2 with the observation that "fix breadth suggests the root cause may be a symptom of a deeper issue."
605
+
606
+ This gate does NOT apply to test files — only production code files count toward the 5-file threshold. A fix that changes 2 production files and 4 test files is fine.
607
+
540
608
  ### 4B. Regression Test Passes
541
609
 
542
610
  ```bash
@@ -600,6 +668,54 @@ Verification:
600
668
  - [ ] Fix does not change behavior for previously working cases
601
669
 
602
670
  Scope notes: [any adjacent issues noted but NOT fixed — filed separately]
671
+
672
+ Status: [DONE | DONE_WITH_CONCERNS | BLOCKED]
673
+ ```
674
+
675
+ ### 4D-Status. Completion Status Taxonomy
676
+
677
+ Every debug session ends with a formal completion status. This status goes in the debug report AND is announced to the user as the final output.
678
+
679
+ | Status | Meaning | Required Information |
680
+ |--------|---------|---------------------|
681
+ | **DONE** | Root cause found, fix applied, regression test passes, full suite green. | Root cause statement, commit hash, regression test name. |
682
+ | **DONE_WITH_CONCERNS** | Root cause found and fixed, but secondary issues were observed during investigation that may need attention. | Root cause statement, commit hash, regression test name, plus a numbered list of concerns with severity estimates. |
683
+ | **BLOCKED** | Cannot determine root cause with available information. Investigation halted. | List of hypotheses tested and falsified, evidence collected, specific information or access needed to continue. |
684
+
685
+ **DONE example:**
686
+ ```
687
+ STATUS: DONE
688
+ Root cause: Missing `session` dependency in useEffect array (useTrips.ts:31)
689
+ Fix: commit abc1234
690
+ Regression test: "refetches trips when session changes" in useTrips.test.ts
691
+ ```
692
+
693
+ **DONE_WITH_CONCERNS example:**
694
+ ```
695
+ STATUS: DONE_WITH_CONCERNS
696
+ Root cause: Missing `session` dependency in useEffect array (useTrips.ts:31)
697
+ Fix: commit abc1234
698
+ Regression test: "refetches trips when session changes" in useTrips.test.ts
699
+ Concerns:
700
+ 1. useFlights.ts has the same missing dependency pattern (medium risk)
701
+ 2. Session restore takes 200ms+ which causes a visible flash of empty state (low, UX)
702
+ 3. No error boundary around the trips fetch — a network failure would crash the screen (high)
703
+ ```
704
+
705
+ **BLOCKED example:**
706
+ ```
707
+ STATUS: BLOCKED
708
+ Hypotheses tested:
709
+ 1. Race condition in auth flow → falsified (timing is correct per logs)
710
+ 2. RLS policy misconfigured → falsified (direct query returns correct data)
711
+ 3. Cache serving stale data → falsified (cache is empty on first launch)
712
+ Evidence collected:
713
+ - Logs show fetch completes with 0 rows before session restore
714
+ - Database contains correct data for the user
715
+ - Issue only occurs on first launch, never on subsequent opens
716
+ Needed to continue:
717
+ - Access to Supabase real-time subscription logs (not available locally)
718
+ - Reproduction on a physical device (currently only reproducible in simulator)
603
719
  ```
604
720
 
605
721
  ### 4E. Commit
@@ -135,6 +135,8 @@ Shell commands use Unix syntax (Git Bash). Never use CMD (`dir`, `type`, `del`)
135
135
 
136
136
  ## AskUserQuestion
137
137
 
138
+ **Flow: analysis first, then decision tool.** Present your full reasoning, trade-offs, and recommendations as conversational text — the user wants to read your thinking. Then cap it with AskUserQuestion to formalize the decision. **If you're composing a message with multiple options or "which approach?" language, you MUST end it with AskUserQuestion.** Never present options in prose without the tool.
139
+
138
140
  **Contract:**
139
141
  1. **Re-ground:** Project name, branch, current task. (1-2 sentences.)
140
142
  2. **Simplify:** Plain English a smart 16-year-old could follow.
@@ -156,9 +158,15 @@ Shell commands use Unix syntax (Git Bash). Never use CMD (`dir`, `type`, `del`)
156
158
  Format: `"Option name — X/10 🟢"` (or 🟡 or 🔴). In the label, not the description.
157
159
  Rate: 🟢 9-10 complete, 🟡 6-8 adequate, 🔴 1-5 shortcuts.
158
160
 
161
+ **Pre-call checklist (verify before every AskUserQuestion invocation):**
162
+ - ☐ Completeness scores in every option label
163
+ - ☐ Recommended option listed first
164
+ - ☐ One decision per question (split if multiple)
165
+ - ☐ Analysis/reasoning already presented in message text above
166
+
159
167
  **Formatting:**
160
168
  - *Italics* for emphasis, not **bold** (bold for headers only).
161
- - After each answer: `✔ Decision {N} recorded [quicksave updated]`
169
+ - After each answer: `✔ Decision {N} recorded`
162
170
  - Previews under 8 lines. Full mockups go in conversation text before the question.
163
171
 
164
172
  ---
@@ -295,6 +303,28 @@ Via AskUserQuestion, ask:
295
303
 
296
304
  **Goal:** Understand what was built, what was tested, and what changed since the last QA pass.
297
305
 
306
+ ### 1-Pre. Clean Working Tree Check
307
+
308
+ Before any testing, verify the working tree is clean:
309
+
310
+ ```bash
311
+ git status --porcelain
312
+ ```
313
+
314
+ If the output is non-empty (uncommitted changes exist), present via AskUserQuestion:
315
+
316
+ > Your working tree has uncommitted changes. Test results may reflect code that is not committed, making them harder to reproduce later.
317
+ >
318
+ > - **A) Commit first** — commit the current changes, then run QA against the committed state
319
+ > - **B) Stash changes** — stash uncommitted work (`git stash`), run QA against the last commit, restore after
320
+ > - **C) Proceed anyway** — run QA as-is (risk: results may include uncommitted changes that are lost later)
321
+ >
322
+ > RECOMMENDATION: Choose A. QA results should always be reproducible from a specific commit.
323
+
324
+ If A: guide the user through a commit (or defer to `/warp-release-update` if they want a full ship flow).
325
+ If B: run `git stash`, proceed with QA, and remind the user to `git stash pop` after QA completes.
326
+ If C: note in the QA report header: `⚠ QA ran against dirty working tree — results may not be reproducible.`
327
+
298
328
  ### 1A. Read Pipeline Artifacts
299
329
 
300
330
  From `.warp/reports/planning/testspec.md`:
@@ -353,6 +383,35 @@ ENVIRONMENT CHECK:
353
383
 
354
384
  If any environment check fails, report as a blocking bug. Do not proceed with manual testing against a broken build.
355
385
 
386
+ ### 1D. Diff-Aware Mode
387
+
388
+ When on a feature branch with no explicit URL or test scope provided by the user, auto-scope QA to the diff against the base branch:
389
+
390
+ ```bash
391
+ # Detect base branch (try main, then master, then fall back to HEAD~10)
392
+ BASE_BRANCH=$(git rev-parse --verify main 2>/dev/null && echo "main" || (git rev-parse --verify master 2>/dev/null && echo "master" || echo "HEAD~10"))
393
+
394
+ # Get changed files since branching
395
+ git diff ${BASE_BRANCH}...HEAD --name-only
396
+ ```
397
+
398
+ Use the changed file list to:
399
+ 1. **Prioritize testing** — test areas touched by the diff first, before broader regression checks.
400
+ 2. **Scope edge cases** — focus negative testing and edge case testing on the changed code paths.
401
+ 3. **Identify blast radius** — determine which features could be affected by the changes (adjacent modules, shared utilities, downstream consumers).
402
+
403
+ ```
404
+ DIFF-AWARE SCOPE:
405
+ Branch: [current branch name]
406
+ Base: [base branch]
407
+ Files changed: [N]
408
+ Packages affected: [list]
409
+ Primary test focus: [areas directly changed]
410
+ Blast radius: [areas indirectly affected]
411
+ ```
412
+
413
+ If the user provides an explicit URL or test scope, skip diff-aware mode and use their scope instead. If on the main/master branch (no feature branch), skip diff-aware mode and test the full scope from testspec.md.
414
+
356
415
  ---
357
416
 
358
417
  ## PHASE 2: Smoke Test
@@ -410,6 +469,48 @@ If PASS:
410
469
 
411
470
  ---
412
471
 
472
+ ## FIX-DURING-QA MODE (Optional)
473
+
474
+ By default, QA operates in **report mode**: document every bug, fix nothing, hand off to the next phase. This is the correct default because fixing during QA creates a moving target.
475
+
476
+ However, for small projects, solo developers, or when the user requests it, **fix mode** is available. When a bug is found in fix mode, QA pauses testing to fix the bug immediately before continuing.
477
+
478
+ **Activation:** Fix mode is only activated when the user explicitly requests it (e.g., "fix bugs as you find them" or "qa and fix"). Never activate fix mode without user consent.
479
+
480
+ ### Report Mode (default)
481
+ Document the bug using the standard bug format. Continue testing. All bugs are fixed in the next phase.
482
+
483
+ ### Fix Mode
484
+ When a bug is found:
485
+
486
+ 1. **Pause testing.** Do not continue to the next test case.
487
+ 2. **Fix the bug** with an atomic commit: `fix(qa): [one-line description of root cause]`
488
+ 3. **Write a regression test** that reproduces the bug and verifies the fix.
489
+ 4. **Re-verify** the fix does not break any previously passing tests.
490
+ 5. **Resume testing** from where you left off.
491
+
492
+ ### WTF-Likelihood Heuristic (Fix Mode Only)
493
+
494
+ Track a rolling risk score that measures how likely the fix-during-QA approach is going off the rails:
495
+
496
+ | Event | Score Impact |
497
+ |-------|-------------|
498
+ | Fix requires a revert of a previous fix-during-QA commit | +15% |
499
+ | Fix touches more than 3 files | +5% |
500
+ | Fix touches files unrelated to the feature under test | +20% |
501
+ | Fix passes all tests on first attempt | -5% |
502
+ | Fix is a one-line change | -3% |
503
+
504
+ **Soft gate at 20%:** Present via AskUserQuestion:
505
+ > Fix-during-QA risk score is {score}%. Fixes are getting complex or reverting each other. Options:
506
+ > - **A) Switch to report mode** — stop fixing, document remaining bugs for the next phase
507
+ > - **B) Continue fixing** — you understand the risk and want to keep going
508
+ > - **C) Revert all fix-during-QA commits** — undo all QA fixes, switch to report mode, start fresh
509
+
510
+ **Hard cap at 50 fixes:** If 50 bugs have been fixed during a single QA session, force-switch to report mode regardless of risk score. This many fixes means the build was not ready for QA.
511
+
512
+ ---
513
+
413
514
  ## PHASE 3: Functional Test
414
515
 
415
516
  **Goal:** Systematically verify every AC from the testspec. This is the core of QA.
@@ -438,6 +539,40 @@ AC VERIFICATION:
438
539
  ...
439
540
  ```
440
541
 
542
+ ### Test Stub Suggestions
543
+
544
+ For every bug found (in any phase), include a skeleton test that would catch this bug if it regressed. Use the project's detected test framework from `.warp/warp-tools.json` (e.g., Jest, Vitest, Playwright, pytest). If no test framework is detected, use a generic pseudocode format.
545
+
546
+ **Extended bug report format:**
547
+
548
+ ```
549
+ BUG: [description]
550
+ Severity: [critical/high/medium/low/cosmetic]
551
+ Repro:
552
+ 1. [step]
553
+ 2. [step]
554
+ 3. [observe: what happens]
555
+ Expected: [what should happen]
556
+ Actual: [what actually happens]
557
+ Suggested test:
558
+ ```[language]
559
+ test('[description in past tense — e.g., displayed stale data after reconnect]', () => {
560
+ // Setup: [describe the precondition]
561
+ // Action: [describe the trigger]
562
+ // Assert: [describe what to verify]
563
+ });
564
+ ```
565
+ ```
566
+
567
+ **Guidelines for test stubs:**
568
+ - Name the test in past tense describing the bug (e.g., `"crashed when input was empty"`)
569
+ - Include setup, action, and assertion comments even if the implementation is not filled in
570
+ - Match the project's existing test patterns (file location, import style, assertion library)
571
+ - For visual bugs, suggest a screenshot comparison test if Playwright or similar is available
572
+ - For accessibility bugs, suggest an axe-core assertion
573
+
574
+ This format applies to ALL bug reports across all phases (smoke test, functional, visual, accessibility, cross-platform). The test stub is a gift to the developer who fixes the bug — it tells them exactly how to verify the fix.
575
+
441
576
  ### 3B. Edge Case Testing
442
577
 
443
578
  For each edge case enumerated in the testspec, test it:
@@ -1063,6 +1198,37 @@ Create the file if it doesn't exist. Append to it if it does (other QA skills ma
1063
1198
 
1064
1199
  ---
1065
1200
 
1201
+ ## TODOS.md INTEGRATION
1202
+
1203
+ After QA completes and the report is written, check for a `TODOS.md` file in the project root.
1204
+
1205
+ ### Cross-reference existing TODOs
1206
+
1207
+ If `TODOS.md` exists, read it and cross-reference against bugs found:
1208
+ - Are any open TODO items related to bugs discovered during QA? If so, annotate those TODOs with the QA finding (e.g., `— confirmed as bug in qa-report, severity: high`).
1209
+ - Are any TODOs already fixed by the current build? If so, suggest marking them complete.
1210
+
1211
+ ### Offer to add deferred bugs
1212
+
1213
+ After the QA report is approved, present via AskUserQuestion if there are medium or low severity bugs that are not ship-blockers:
1214
+
1215
+ > QA found {N} medium/low severity bugs that do not block shipping. Want to add them to TODOS.md for future fixes?
1216
+ >
1217
+ > - **A) Yes — add all deferred bugs** to TODOS.md with severity and QA date
1218
+ > - **B) Let me pick** — show the list and I will choose which to add
1219
+ > - **C) No** — the QA report is sufficient, skip TODOS.md
1220
+
1221
+ **Format for TODOS.md entries:**
1222
+ ```
1223
+ - [ ] [severity] [bug description] — from qa-test ({date})
1224
+ ```
1225
+
1226
+ Only offer this for bugs that are NOT critical or high severity. Critical and high bugs must be fixed before shipping — they do not belong in a TODO list.
1227
+
1228
+ If no `TODOS.md` exists, do not create one. Mention in the QA summary that deferred bugs are documented in the QA report for future reference.
1229
+
1230
+ ---
1231
+
1066
1232
  ## NEXT STEP
1067
1233
 
1068
1234
  After `.warp/reports/qatesting/qa-report.md` is APPROVED: