wize-dev-kit 0.1.5 → 0.2.5

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 (39) hide show
  1. package/CHANGELOG.md +130 -1
  2. package/README.md +64 -0
  3. package/package.json +1 -1
  4. package/src/method-skills/1-analysis/wize-document-project/workflow.md +188 -20
  5. package/src/method-skills/1-analysis/wize-prfaq/workflow.md +150 -11
  6. package/src/method-skills/1-analysis/wize-product-brief/workflow.md +90 -19
  7. package/src/method-skills/1-analysis/wize-refresh-knowledge/workflow.md +127 -0
  8. package/src/method-skills/1-analysis/wize-research/workflow.md +101 -9
  9. package/src/method-skills/1-analysis/wize-trigger-map/workflow.md +80 -16
  10. package/src/method-skills/2-plan-workflows/wize-create-prd/workflow.md +132 -23
  11. package/src/method-skills/2-plan-workflows/wize-ux-design/workflow.md +132 -28
  12. package/src/method-skills/2-plan-workflows/wize-ux-scenarios/workflow.md +91 -15
  13. package/src/method-skills/2-plan-workflows/wize-validate-prd/workflow.md +106 -12
  14. package/src/method-skills/3-solutioning/wize-check-implementation-readiness/workflow.md +101 -11
  15. package/src/method-skills/3-solutioning/wize-create-architecture/workflow.md +197 -29
  16. package/src/method-skills/3-solutioning/wize-create-epics-and-stories/workflow.md +127 -12
  17. package/src/method-skills/3-solutioning/wize-design-system/workflow.md +182 -22
  18. package/src/method-skills/3-solutioning/wize-nfr-principles/workflow.md +142 -16
  19. package/src/method-skills/3-solutioning/wize-tech-vision/workflow.md +127 -21
  20. package/src/method-skills/4-implementation/wize-code-review/workflow.md +105 -10
  21. package/src/method-skills/4-implementation/wize-create-story/workflow.md +131 -10
  22. package/src/method-skills/4-implementation/wize-dev-story/workflow.md +140 -17
  23. package/src/method-skills/4-implementation/wize-quick-dev/workflow.md +121 -18
  24. package/src/method-skills/4-implementation/wize-retrospective/workflow.md +112 -10
  25. package/src/method-skills/4-implementation/wize-sprint-planning/workflow.md +85 -10
  26. package/src/method-skills/4-implementation/wize-sprint-status/workflow.md +96 -11
  27. package/src/orchestrator-skills/wize-help/skill.md +25 -1
  28. package/src/tea-skills/wize-tea-design/workflow.md +104 -13
  29. package/src/tea-skills/wize-tea-gate/workflow.md +115 -25
  30. package/src/tea-skills/wize-tea-nfr/workflow.md +104 -14
  31. package/src/tea-skills/wize-tea-review/workflow.md +120 -13
  32. package/src/tea-skills/wize-tea-risk/workflow.md +99 -10
  33. package/src/tea-skills/wize-tea-trace/workflow.md +83 -12
  34. package/tools/installer/baseline.js +128 -0
  35. package/tools/installer/commands/agent.js +197 -0
  36. package/tools/installer/commands/sync.js +45 -0
  37. package/tools/installer/commands/update.js +172 -0
  38. package/tools/installer/version-check.js +117 -0
  39. package/tools/installer/wize-cli.js +98 -11
@@ -4,33 +4,193 @@ name: Design System
4
4
  phase: 3-solutioning
5
5
  owner: wize-agent-ux-designer # Mantis (WDS Freya — Phase 7)
6
6
  absorbs: "WDS Freya — Phase 7 (Design System)"
7
- status: stub
7
+ status: ready
8
8
  ---
9
9
 
10
10
  # Design System
11
11
 
12
- **Goal.** Establish design tokens and a baseline component library that Shuri implements consistently across the product.
12
+ **Goal.** Establish design tokens and a baseline component library Shuri implements consistently. Mantis defines what; Tony picks the runtime; Shuri builds. Hawkeye verifies a11y and consistency at gate.
13
+
14
+ Mantis drives. Output lands in `.wize/solutioning/design-system/`.
13
15
 
14
16
  ## Inputs
15
- - `.wize/planning/ux/ux-design/`
17
+
18
+ - `.wize/planning/ux/ux-design/` (every component the specs use)
19
+ - `.wize/planning/nfr-principles.md` (a11y and perf budgets)
20
+ - Overlay playbooks (active):
21
+ - `web-overlay/playbooks/wcag-aa.md`, `responsive-breakpoints.md`, `semantic-html.md`
22
+ - `app-overlay/playbooks/apple-hig.md`, `material-design-3.md`, `touch-targets-and-gestures.md`
16
23
 
17
24
  ## Outputs
18
- - `.wize/solutioning/design-system/tokens.json`
19
- - `.wize/solutioning/design-system/components/{Component}.md`
20
- - `.wize/solutioning/design-system/README.md`
21
-
22
- ## Tokens covered
23
- - color (semantic + raw scale)
24
- - typography (family, sizes, weights, line-heights)
25
- - spacing scale
26
- - radii
27
- - motion (durations, easings)
28
- - shadows / elevation
29
- - z-index layers
30
-
31
- ## Component baseline
32
- Buttons, inputs, selects, modals, dialogs, tabs, cards, notifications. Enough for the first epic; expand as stories require.
33
-
34
- ## Overlays
35
- - **Web overlay** active responsive token variants, REM-based typography.
36
- - **App overlay** active platform-token sets (iOS / Android), touch-friendly spacing scale.
25
+
26
+ - `.wize/solutioning/design-system/tokens.json` — single source of truth.
27
+ - `.wize/solutioning/design-system/components/{Component}.md` — one per component.
28
+ - `.wize/solutioning/design-system/README.md` — index + theming guide.
29
+
30
+ ## Tokens (the only acceptable way to ship styles)
31
+
32
+ Mantis defines the tokens; Tony picks the runtime (Tailwind, CSS modules, Vanilla Extract, Compose theme, SwiftUI tokens). The names below are framework-agnostic.
33
+
34
+ ### Color (semantic + raw scale)
35
+
36
+ | Semantic | Light | Dark | Contrast pair |
37
+ |---|---|---|---|
38
+ | `surface.base` | #FFFFFF | #0B0F14 | text.primary |
39
+ | `surface.raised` | #F5F7FA | #121821 | text.primary |
40
+ | `text.primary` | #0B0F14 | #E5E7EB | surface.base |
41
+ | `text.secondary` | #4B5563 | #9CA3AF | surface.base |
42
+ | `accent.brand` | #6F49FF | #8B6FFF | text.onAccent |
43
+ | `text.onAccent` | #FFFFFF | #FFFFFF | accent.brand |
44
+ | `success` | #058E5C | #34D399 | text.onSuccess |
45
+ | `warning` | #C9621E | #F59E0B | text.onWarning |
46
+ | `error` | #B42318 | #FCA5A5 | text.onError |
47
+ | `border.default` | #E5E7EB | #2A313A | — |
48
+ | `border.focus` | accent.brand | accent.brand | — |
49
+
50
+ Validate every pair against WCAG AA (≥ 4.5:1 normal, ≥ 3:1 large). Run before you commit.
51
+
52
+ ### Typography
53
+
54
+ | Token | Family | Size | Weight | Line | Letter |
55
+ |---|---|---|---|---|---|
56
+ | `display.l` | Inter Display | clamp(2.5rem, 5vw, 3.5rem) | 700 | 1.05 | -0.02em |
57
+ | `display.m` | Inter Display | clamp(2rem, 4vw, 2.5rem) | 700 | 1.1 | -0.01em |
58
+ | `heading.l` | Inter | clamp(1.5rem, 3vw, 2rem) | 600 | 1.2 | -0.01em |
59
+ | `heading.m` | Inter | 1.25rem | 600 | 1.3 | 0 |
60
+ | `heading.s` | Inter | 1rem | 600 | 1.4 | 0 |
61
+ | `body.l` | Inter | 1.125rem | 400 | 1.6 | 0 |
62
+ | `body.m` | Inter | 1rem | 400 | 1.55 | 0 |
63
+ | `body.s` | Inter | 0.875rem | 400 | 1.5 | 0 |
64
+ | `caption` | Inter | 0.75rem | 500 | 1.4 | 0.01em |
65
+
66
+ Use rem for body; clamp() for fluid headings (see `responsive-breakpoints.md`).
67
+
68
+ ### Spacing scale (4px base, geometric)
69
+
70
+ `0` 0 · `1` 4 · `2` 8 · `3` 12 · `4` 16 · `5` 24 · `6` 32 · `7` 48 · `8` 64 · `9` 96 · `10` 128
71
+
72
+ ### Radius
73
+
74
+ `none` 0 · `sm` 4 · `md` 8 · `lg` 12 · `xl` 16 · `pill` 999.
75
+
76
+ ### Elevation
77
+
78
+ | Token | Light | Dark (tonal) |
79
+ |---|---|---|
80
+ | `e1` | 0 1px 2px rgba(0,0,0,.06) | surface.raised |
81
+ | `e2` | 0 2px 4px rgba(0,0,0,.08) | surface.raised + 4% |
82
+ | `e3` | 0 4px 12px rgba(0,0,0,.10) | surface.raised + 8% |
83
+ | `e4` | 0 12px 24px rgba(0,0,0,.12) | surface.raised + 12% |
84
+
85
+ App overlay: prefer tonal elevation per Material 3.
86
+
87
+ ### Motion
88
+
89
+ | Token | Duration | Easing |
90
+ |---|---|---|
91
+ | `motion.micro` | 100ms | `ease-out` |
92
+ | `motion.transition` | 200ms | `cubic-bezier(0.2, 0, 0, 1)` |
93
+ | `motion.page` | 300ms | `cubic-bezier(0.4, 0, 0.2, 1)` |
94
+ | `motion.spring.subtle` | (spring) | mass 1, stiff 350, damp 30 |
95
+
96
+ Honor `prefers-reduced-motion`. Replace transforms with fades.
97
+
98
+ ## Components — the baseline set
99
+
100
+ Each component has its own `.md` doc with: purpose, anatomy, states (default/hover/focus/active/disabled/loading), variants, accessibility, do/don't, snippets.
101
+
102
+ | Component | Mandatory states | Notes |
103
+ |---|---|---|
104
+ | Button | default, hover, focus, active, disabled, loading | variants: primary, secondary, tertiary, destructive, ghost |
105
+ | Input | default, focus, error, disabled, success | always has visible label |
106
+ | Select | default, open, focus, disabled | native first; custom only when needed |
107
+ | Textarea | as Input | auto-grow optional |
108
+ | Checkbox | unchecked, checked, indeterminate, focus, disabled | native input + custom skin |
109
+ | Radio | unchecked, checked, focus, disabled | grouped under fieldset |
110
+ | Toggle/Switch | off, on, focus, disabled | `role="switch" aria-checked` |
111
+ | Card | default, raised, interactive | elevation tokens |
112
+ | Modal / Dialog | open, closing | focus trap + ESC + restore |
113
+ | Sheet (app) | half / full | drag handle |
114
+ | Tabs | active, inactive, focus | keyboard arrows |
115
+ | Accordion | collapsed, expanded, focus | `<details>` when possible |
116
+ | Toast / Snackbar | info, success, warning, error | `role="status"` or `alert` |
117
+ | Tooltip | hidden, visible | `aria-describedby`, touch alt |
118
+ | Menu | closed, open, focus | keyboard navigation |
119
+ | Dropdown | (synonym of Menu / Combobox) | follow ARIA combobox |
120
+ | Badge | default, success, warning, error | contrast ≥ 4.5:1 |
121
+ | Avatar | image, initials, placeholder | 1:1 ratio, alt text |
122
+ | Skeleton | static, shimmer | respect reduced-motion |
123
+ | Empty state | default | message + primary action |
124
+ | Loading | spinner / progress | accessible announcement |
125
+
126
+ ## Component template (one per component)
127
+
128
+ ```markdown
129
+ ---
130
+ component: Button
131
+ status: ready
132
+ owner: Mantis
133
+ linked_screens: [signup-empty, team-list-empty, …]
134
+ ---
135
+
136
+ # Button
137
+
138
+ ## Purpose
139
+ Trigger an action. Never use for navigation between routes.
140
+
141
+ ## Anatomy
142
+ [icon?] [label] [icon?] · padding by size · radius `md`
143
+
144
+ ## Variants
145
+ - `primary` — main action; one per screen region.
146
+ - `secondary` — alternative action.
147
+ - `tertiary` — text-only.
148
+ - `destructive` — irreversible action.
149
+ - `ghost` — minimal chrome, e.g., toolbar.
150
+
151
+ ## Sizes
152
+ - `sm` (height 32, label `body.s`)
153
+ - `md` (height 40, label `body.m`)
154
+ - `lg` (height 48, label `body.m`)
155
+
156
+ ## States
157
+
158
+ | State | Treatment |
159
+ |---|---|
160
+ | default | accent.brand bg, text.onAccent label |
161
+ | hover | accent.brand 10% darker |
162
+ | focus | 2px outline `border.focus`, offset 2px |
163
+ | active | accent.brand 15% darker |
164
+ | disabled | opacity 0.4, `aria-disabled="true"`, cursor not-allowed |
165
+ | loading | spinner replaces icon; label unchanged; click ignored |
166
+
167
+ ## Accessibility
168
+ - Native `<button>`.
169
+ - `aria-label` when icon-only.
170
+ - Visible focus ring always (don't override).
171
+ - 24×24 px hit area minimum (web), 44pt (iOS), 48dp (Android).
172
+ - Min contrast on label ≥ 4.5:1.
173
+
174
+ ## Don't
175
+ - Use `<div onclick>`.
176
+ - Remove the focus ring without replacement.
177
+ - Use destructive for "Continue".
178
+ - Stack > 2 primary buttons on a screen.
179
+ ```
180
+
181
+ ## Theming + overlays
182
+
183
+ - **Web overlay:** tokens emit as CSS custom properties; dark mode toggled via `[data-theme="dark"]` on `<html>`.
184
+ - **App overlay (iOS):** tokens as SwiftUI environment values; dark mode auto.
185
+ - **App overlay (Android):** tokens as Compose `MaterialTheme` extensions; honor `dynamicColorScheme` when allowed.
186
+
187
+ ## Anti-patterns Mantis rejects
188
+
189
+ - **Hex in components.** Everything via tokens.
190
+ - **One-off components shipped without doc.** Add to the system or refuse to merge.
191
+ - **Component matrix without states.** A button without disabled+loading isn't a button.
192
+ - **Component that fails axe.** Failed at definition; don't ship.
193
+
194
+ ## Hand-off
195
+
196
+ > Tokens + 20 components at `.wize/solutioning/design-system/`. Tony picks the runtime (Tailwind / Vanilla Extract / SwiftUI tokens / Compose theme); Shuri implements. Hawkeye references this in `tea-design.md`: a11y + visual regression hooks point at these tokens.
@@ -3,31 +3,157 @@ code: wize-nfr-principles
3
3
  name: NFR Principles
4
4
  phase: 2-to-3-boundary
5
5
  owner: wize-agent-solution-strategist # Nick Fury
6
- status: stub
6
+ status: ready
7
7
  ---
8
8
 
9
9
  # NFR Principles
10
10
 
11
- **Goal.** Define non-functional non-negotiables Tony must design against and Hawkeye must verify.
11
+ **Goal.** Define non-functional non-negotiables Tony must design against and Hawkeye must verify. Hill defers to this when sizing scope. Mantis respects the a11y/perf bars in UX specs. Shuri implements with these targets in hand.
12
+
13
+ Fury drives. Output lands in `.wize/planning/nfr-principles.md`.
14
+
15
+ ## Inputs
16
+
17
+ - `.wize/planning/prd.md`
18
+ - `.wize/planning/tech-vision.md`
19
+ - `.wize/planning/brief.md` (compliance constraints, audience implications)
20
+ - Overlay perf playbooks if active:
21
+ - `web-overlay/playbooks/web-perf-budgets.md`
22
+ - `app-overlay/playbooks/mobile-perf-budgets.md`
23
+ - `web-overlay/playbooks/wcag-aa.md`
24
+ - `app-overlay/playbooks/apple-hig.md`, `material-design-3.md`
25
+
26
+ ## Outputs
12
27
 
13
- ## Output
14
28
  - `.wize/planning/nfr-principles.md`
15
29
 
16
- ## Categories
17
- - **Performance** — targets (LCP, p95, throughput).
18
- - **Security** auth model, data classes, threat surface posture.
19
- - **Reliability** — uptime, error budget, retry/idempotency policy.
20
- - **Maintainability** — coding standards, tech-debt allowance.
21
- - **Accessibility** — WCAG / platform guidelines minimums.
22
- - **Cost** monthly envelope and degradation strategy.
30
+ ## Categories (always cover these six)
31
+
32
+ For each, write **non-negotiable** + **stretch** + **deferred** (with trigger). Use the playbooks as starting points; **tighten** if PRD demands, never loosen below playbook recommendations.
33
+
34
+ ### 1. Performance
35
+
36
+ | Tier | Targets |
37
+ |---|---|
38
+ | Non-negotiable | LCP ≤ 2.5s mobile, INP ≤ 200ms, CLS ≤ 0.1 (web) — cold start ≤ 1.5s mid-range (app) |
39
+ | Stretch | LCP ≤ 1.8s, INP ≤ 100ms |
40
+ | Deferred | Server-side LCP for edge regions — revisit when audience > 30% non-NA |
41
+
42
+ ### 2. Security
43
+
44
+ | Tier | Items |
45
+ |---|---|
46
+ | Non-negotiable | OWASP Top 10 covered; auth via {{vendor}}; tokens never logged; secrets via {{provider}}; RLS on every table with user_id |
47
+ | Stretch | SOC2 type-I controls in place by {{date}} |
48
+ | Deferred | SOC2 type-II — revisit at $1M ARR |
49
+
50
+ ### 3. Reliability
51
+
52
+ | Tier | Targets |
53
+ |---|---|
54
+ | Non-negotiable | 99.9% uptime in primary region; error budget 0.1%/month; retries idempotent with deduplication key |
55
+ | Stretch | 99.95% uptime |
56
+ | Deferred | Multi-region active/active — revisit per tech-vision deferred |
57
+
58
+ ### 4. Maintainability
59
+
60
+ | Tier | Items |
61
+ |---|---|
62
+ | Non-negotiable | Lint + format on commit; > 80% test coverage on logic modules; ADRs for every architectural decision; deps audited monthly |
63
+ | Stretch | < 5% files over 300 LOC; cyclomatic complexity < 15 per function |
64
+ | Deferred | Auto-doc generation — revisit when API consumers > 3 |
65
+
66
+ ### 5. Accessibility
67
+
68
+ | Tier | Items |
69
+ |---|---|
70
+ | Non-negotiable | WCAG 2.2 AA on every shipped page; keyboard-complete; axe in CI |
71
+ | Stretch | AAA on critical flows (signup, billing) |
72
+ | Deferred | Full screen-reader manual audit every release — revisit at next compliance review |
73
+
74
+ ### 6. Cost
75
+
76
+ | Tier | Targets |
77
+ |---|---|
78
+ | Non-negotiable | Total infra ≤ ${{X}}/month under {{load}}; degradation strategy documented for 10× spike |
79
+ | Stretch | Cost-per-active-user ≤ ${{Y}} |
80
+ | Deferred | Per-feature cost attribution — revisit when finance asks |
81
+
82
+ ## Steps
83
+
84
+ ### 1. Read the playbooks first
85
+
86
+ If web/app overlays are active, the perf and a11y playbooks already hold real targets calibrated to mid-range device + 3G fast. Use them as starting point.
87
+
88
+ ### 2. Tighten by audience
89
+
90
+ Mid-range mobile is the playbook baseline. If your PRD audience is *more* constrained (emerging markets, kiosk hardware, healthcare older devices), tighten. Don't loosen.
91
+
92
+ ### 3. Map every non-negotiable to a verifier
93
+
94
+ Every non-negotiable must answer the question: *Who and how do we verify this on every release?*
95
+
96
+ - LCP → `web-perf-budgets.md` lighthouse-ci config.
97
+ - WCAG → axe in CI + Hawkeye review.
98
+ - Uptime → SLO defined in `.wize/solutioning/observability.md` (Tony).
99
+ - Error budget → tracked in {{tool}}.
100
+
101
+ A non-negotiable with no verifier is a wish.
102
+
103
+ ### 4. Tell the story (one paragraph)
104
+
105
+ Open the doc with a paragraph: *why these numbers, and what trade-offs they imply.* Future readers re-litigate non-negotiables every six months; the story saves that hour.
106
+
107
+ ### 5. Hand off
108
+
109
+ Mark `status: aligned`. Tony reads before architecture; Hawkeye reads before risk profile.
110
+
111
+ ## Output template
23
112
 
24
- ## Template
25
113
  ```markdown
26
- # NFR Principles
114
+ ---
115
+ status: aligned
116
+ owner: Nick Fury
117
+ created: YYYY-MM-DD
118
+ ---
119
+
120
+ # NFR Principles — {{project_name}}
121
+
122
+ ## Why these numbers
123
+
124
+ {{One paragraph: target audience, country mix, device class, compliance frame. Why we picked these targets specifically.}}
125
+
126
+ ## Performance
127
+ | Tier | Targets | Verifier |
128
+ |---|---|---|
129
+ | Non-negotiable | LCP ≤ 2.5s mobile (CWV), INP ≤ 200ms, CLS ≤ 0.1 | lighthouse-ci + web-vitals beacon |
130
+ | Stretch | LCP ≤ 1.8s | same |
131
+ | Deferred | Multi-region LCP — trigger: EU DAU > 5k | — |
27
132
 
28
- | Category | Non-negotiable | Stretch | Deferred |
29
- |---|---|---|---|
30
- | Performance | … | … | … |
31
- | Security | … | … | … |
133
+ ## Security
134
+
135
+
136
+ ## Reliability
137
+
138
+
139
+ ## Maintainability
140
+
141
+
142
+ ## Accessibility
143
+
144
+
145
+ ## Cost
32
146
 
33
147
  ```
148
+
149
+ ## Anti-patterns Fury rejects
150
+
151
+ - **Targets without numbers.** "Fast." Wrong. "p95 server response ≤ 200ms."
152
+ - **Stretch targets that are actually goals.** If you must hit it, it's non-negotiable.
153
+ - **No verifier.** Every non-negotiable answers *who verifies, with what tool, on what cadence*.
154
+ - **Loosening below the playbook.** Tightening is fine. Loosening is a smell — escalate.
155
+ - **Cost left blank.** Cost is always an NFR.
156
+
157
+ ## Hand-off
158
+
159
+ > NFRs at `.wize/planning/nfr-principles.md`. Tony, architecture must respect items 1.A and 4.A from day one (perf and ADR discipline). Hawkeye, your gate policy can stay advisory but NFR gate per epic is mandatory. Hill, scope must keep the budget headroom for item 6.A.
@@ -3,41 +3,147 @@ code: wize-tech-vision
3
3
  name: Tech Vision
4
4
  phase: 2-to-3-boundary
5
5
  owner: wize-agent-solution-strategist # Nick Fury
6
- status: stub
6
+ status: ready
7
7
  ---
8
8
 
9
9
  # Tech Vision
10
10
 
11
- **Goal.** State the technical north star in one page. Stack family, language, runtime envelope, build/buy/borrow calls. Not libraries — *shape*.
11
+ **Goal.** State the technical north star in one page. Stack family, runtime envelope, build/buy/borrow calls, non-negotiables. Fury sets the **shape**, not the libraries — Tony fills in inside the frame.
12
+
13
+ Output lands in `.wize/planning/tech-vision.md`. Tony reads this before drawing architecture. Hill references it when scoping. Hawkeye uses it when picking gate granularity.
14
+
15
+ ## Inputs
16
+
17
+ - `.wize/planning/prd.md` (validated)
18
+ - `.wize/planning/ux/ux-design/` (so the runtime envelope respects the UX)
19
+ - `.wize/knowledge/document-project/` (brownfield only)
20
+ - Stack catalogs (per active overlay):
21
+ - `src/web-overlay/stack-catalog.md`
22
+ - `src/app-overlay/stack-catalog.md`
23
+
24
+ ## Outputs
12
25
 
13
- ## Output
14
26
  - `.wize/planning/tech-vision.md`
15
27
 
16
- ## Template
28
+ ## Steps
29
+
30
+ ### 1. Pick the stack family
31
+
32
+ By order of constraint:
33
+
34
+ 1. **Audience reach.** Public + SEO-critical? Authenticated app? Native mobile required?
35
+ 2. **Latency budget.** Sub-1s LCP on 3G or richer-but-slower OK?
36
+ 3. **Team familiarity.** Favor what the team has shipped before unless the project truly demands new.
37
+ 4. **Backend coupling.** Separate API / fullstack monolith / BaaS?
38
+ 5. **Deploy target.** Edge / container / self-managed.
39
+
40
+ Don't pick libraries here. Pick the *shape*: "Next.js-class SSR fullstack on edge" or "React Native + Expo with a Supabase backend" or "Compose Multiplatform with Kotlin services."
41
+
42
+ ### 2. State the runtime envelope
43
+
44
+ | Dimension | Decision |
45
+ |---|---|
46
+ | Language(s) of record | TS, Kotlin, etc. |
47
+ | Runtime(s) | Browser / Node / Edge / Native iOS / Native Android / JVM |
48
+ | Persistence | Postgres / SQLite / KV / cloud-native |
49
+ | Deploy target | Vercel / Cloudflare / Fly / EKS / EAS / etc. |
50
+ | Edge vs origin | Edge-first / origin-first |
51
+
52
+ ### 3. Build / buy / borrow
53
+
54
+ For each capability the PRD implies, declare:
55
+
56
+ | Capability | Build | Buy | Borrow (OSS) |
57
+ |---|---|---|---|
58
+ | Auth | — | Clerk / Auth0 | NextAuth / Lucia |
59
+ | Payments | — | Stripe | — |
60
+ | Search | — | Algolia / Typesense Cloud | Meilisearch self-hosted |
61
+ | Queues | — | SQS / Cloud Tasks | BullMQ |
62
+ | Analytics | — | Amplitude | PostHog OSS |
63
+ | Email | — | Resend / Postmark | — |
64
+ | Realtime | — | Pusher / Ably | Supabase Realtime |
65
+
66
+ One row per capability. Empty cells are explicit choices.
67
+
68
+ ### 4. Non-negotiables
69
+
70
+ The 2–5 things the team will not compromise on.
71
+
72
+ Examples:
73
+ - *"All endpoint responses ≤ 200ms p95 from the user's region."*
74
+ - *"Single source of truth for user data — no shadow stores."*
75
+ - *"PII never leaves the EU."*
76
+ - *"On-call burden ≤ 0.5 pages per engineer per week."*
77
+
78
+ These outrank PRD goals. If they conflict, Fury escalates.
79
+
80
+ ### 5. Deferred (with triggers)
81
+
82
+ What we won't decide yet, and what would trigger the decision. Don't list "could be revisited"; list the *signal* that forces the decision.
83
+
84
+ - *"Multi-region storage: revisit when EU+US daily active users > 5k."*
85
+ - *"WebSockets vs SSE: revisit when realtime updates < 500ms become a PRD goal."*
86
+
87
+ ### 6. Hand off
88
+
89
+ Mark `status: aligned`. Tony reads it as the frame; he can argue specific decisions but not redraw the family without escalating.
90
+
91
+ ## Output template
92
+
17
93
  ```markdown
18
- # Tech Vision
94
+ ---
95
+ status: aligned
96
+ owner: Nick Fury
97
+ created: YYYY-MM-DD
98
+ ---
19
99
 
20
- ## Stack family
21
- - {Web|Mobile|Hybrid}
100
+ # Tech Vision — {{project_name}}
22
101
 
23
- ## Language(s) of record
24
- -
102
+ ## Stack family
103
+ Next.js-class SSR fullstack on edge, with Supabase Postgres as the system of record.
25
104
 
26
105
  ## Runtime envelope
27
- - {Browser|Node|Edge|Native iOS|Native Android}
106
+ | Dimension | Decision |
107
+ |---|---|
108
+ | Language | TypeScript end-to-end |
109
+ | Runtime | Edge (Vercel Edge Functions) + Node (server actions) |
110
+ | Persistence | Supabase Postgres (RLS) + PgBouncer |
111
+ | Deploy target | Vercel for app; Supabase managed for data |
112
+ | Edge vs origin | Edge-first for reads; origin for writes |
28
113
 
29
- ## Build vs buy vs borrow
30
- | Capability | Decision | Why |
31
- |---|---|---|
32
- | Auth | | |
33
- | Payments | | |
34
- | Search | | |
35
- | Queues | | |
36
- | Analytics | | |
114
+ ## Build / buy / borrow
115
+ | Capability | Decision |
116
+ |---|---|
117
+ | Auth | Buy Supabase Auth |
118
+ | Payments | Buy Stripe |
119
+ | Search | Buy Algolia (1st year), revisit |
120
+ | Queues | Borrow pg_cron + outbox pattern |
121
+ | Analytics | Borrow PostHog OSS |
122
+ | Email | Buy — Resend |
37
123
 
38
124
  ## Non-negotiables
39
- -
125
+ 1. PII (incl. emails) stored in the user's region only.
126
+ 2. p95 server response ≤ 200ms in the user's region.
127
+ 3. Single auth identity per human (no shadow accounts).
128
+ 4. On-call rotation never exceeds 0.5 pages/eng/week.
129
+
130
+ ## Deferred
131
+ - Multi-region writes: revisit when EU active users > 2k.
132
+ - Native mobile clients: revisit when web TTI > 4s on > 20% of sessions or PRD demands offline.
40
133
 
41
- ## Deferred (revisit when)
42
- - (trigger: …)
134
+ ## Constraints that drove this
135
+ - Brief constraint #2 (LGPD/GDPR) ruled out global-replica DBs.
136
+ - PRD goal G1 ruled in edge-first reads.
137
+ - Hiring tail in TypeScript ruled out Compose Multiplatform.
43
138
  ```
139
+
140
+ ## Anti-patterns Fury rejects
141
+
142
+ - **Picking a library here.** That's Tony. Pick the *family*.
143
+ - **Non-negotiables that are aspirations.** "Always 100% uptime." Wrong. "Error budget ≤ 0.1% in EU region."
144
+ - **Deferred items with no trigger.** That's procrastination.
145
+ - **A non-negotiable that contradicts a PRD constraint silently.** Surface it, escalate it, decide it.
146
+
147
+ ## Hand-off
148
+
149
+ > Tech vision at `.wize/planning/tech-vision.md`. Tony, build the architecture inside this frame. Hill, scope the PRD against the non-negotiables (item 1 means the global launch is back on the table only after EU baseline holds). Hawkeye, pick gate granularity assuming `policy = advisory`.
@@ -3,22 +3,117 @@ code: wize-code-review
3
3
  name: Code Review
4
4
  phase: 4-implementation
5
5
  owner: wize-agent-dev # Shuri (peer Shuri — done at PR open time)
6
- status: stub
6
+ status: ready
7
7
  ---
8
8
 
9
9
  # Code Review
10
10
 
11
- **Goal.** Self/peer review focused on code health. Separate from Hawkeye's story review.
11
+ **Goal.** Audit **code health** on the PR. Separate from Hawkeye's `tea-review` (which audits AC fulfillment). Both run on every story PR; they're complementary.
12
+
13
+ Shuri reviews peer PRs. Tony reviews when architecture is at stake.
14
+
15
+ ## When to run
16
+
17
+ Every PR that ships code. Quick-dev PRs get a lighter review (skip code-architecture checks unless they touched architecture).
18
+
19
+ ## Inputs
20
+
21
+ - The PR (diff + tests).
22
+ - Story file (for context — what the PR is supposed to accomplish).
23
+ - Linked design system (when components change).
24
+
25
+ ## Output
26
+
27
+ - Inline comments on the PR.
28
+ - Final review verdict: `approve` / `request-changes` / `comment`.
12
29
 
13
30
  ## What this checks
14
- - Naming, structure, dead code
15
- - Test coverage and quality (not just presence)
16
- - Security obvious-misses
17
- - Performance obvious-misses
18
- - Architectural drift (call Tony if found)
31
+
32
+ ### Naming + structure
33
+ - Are types, functions, variables named for **what they are**, not **how they're used**?
34
+ - Are files in the right folder per the architecture?
35
+ - Are exports minimal? Module boundaries respected?
36
+ - Are there new abstractions justified by the story or premature?
37
+
38
+ ### Tests
39
+ - Do tests cover the changed behavior (not just coverage %)?
40
+ - Are they fast and isolated?
41
+ - Are mocks at the boundary, not inside the unit?
42
+ - Any `test.skip` / `.only` left in?
43
+
44
+ ### Security (obvious-misses)
45
+ - Input validation at boundaries.
46
+ - Tokens / secrets / PII never logged.
47
+ - SQL parameterized, not concatenated.
48
+ - New deps audited; no known CVEs introduced.
49
+ - Auth context checked on every server entry point.
50
+
51
+ ### Performance (obvious-misses)
52
+ - No N+1 queries.
53
+ - No `await` in tight loops without batching.
54
+ - No new sync I/O on hot paths.
55
+ - Bundle delta acceptable (size of new front-end imports).
56
+
57
+ ### Architectural drift
58
+ - Story didn't quietly introduce a new layer / new pattern.
59
+ - If it did, an ADR was opened or a comment justifies it.
60
+ - Components reused from design system; new components added to system if reusable.
61
+
62
+ ### Style + convention
63
+ - Follows lint / format / type rules.
64
+ - Comments explain *why*, not *what*.
65
+ - Dead code removed.
66
+ - TODOs have an owner + a ticket.
19
67
 
20
68
  ## What this does NOT check
21
- - AC fulfillment — that's Hawkeye's `trace` + `review` + `gate`.
22
69
 
23
- ## Outputs
24
- - Inline comments / suggestions on the diff.
70
+ - Whether ACs are met — that's Hawkeye's `tea-review`.
71
+ - Whether the design is right that's reviewed in pull-request walk-through, ADR review, or party-mode.
72
+
73
+ Don't conflate. Two reviewers, two scopes.
74
+
75
+ ## Comment style
76
+
77
+ Use these prefixes:
78
+
79
+ | Prefix | Meaning |
80
+ |---|---|
81
+ | `nit:` | Cosmetic; non-blocking |
82
+ | `q:` | Question; might be a misunderstanding |
83
+ | `praise:` | Real call-outs; teams need them |
84
+ | `suggestion:` | Idea, the author decides |
85
+ | `blocking:` | Must change before merge |
86
+ | `out-of-scope:` | Real issue, separate story |
87
+
88
+ Never `LGTM` without scanning. Never `LGTM` with `blocking:` open.
89
+
90
+ ## Verdict
91
+
92
+ - **approve** — all blockings resolved.
93
+ - **request-changes** — at least one `blocking:`.
94
+ - **comment** — reviewed, no opinion (rare; used for early-draft PRs).
95
+
96
+ ## PR-open checklist (Shuri's self-review)
97
+
98
+ Before opening, Shuri runs through:
99
+
100
+ - [ ] CI green locally.
101
+ - [ ] Lint + format clean.
102
+ - [ ] Type-check clean.
103
+ - [ ] No `console.log` / `dbg!` / debug printf.
104
+ - [ ] No `test.skip` / `.only`.
105
+ - [ ] Reading the diff right now, can I explain every line?
106
+ - [ ] Self-walk: open the changed screen / call the changed endpoint.
107
+ - [ ] Story status flipped to `ready-for-review`.
108
+
109
+ ## Anti-patterns Shuri rejects in herself
110
+
111
+ - Approving without reading.
112
+ - Approving on the basis of green CI alone.
113
+ - "Big PR; will trust" — refuse and ask for slicing.
114
+ - Inline suggestions for full rewrites — open a follow-up instead.
115
+ - Demanding stylistic preferences not in the lint config.
116
+
117
+ ## Hand-off
118
+
119
+ > Reviewed PR #418 (E02-S02). 2 nits, 1 blocking on auth-context check missing in one new route. Shuri to fix; re-review needed; then Hawkeye runs `tea-review`.