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.
- package/CHANGELOG.md +130 -1
- package/README.md +64 -0
- package/package.json +1 -1
- package/src/method-skills/1-analysis/wize-document-project/workflow.md +188 -20
- package/src/method-skills/1-analysis/wize-prfaq/workflow.md +150 -11
- package/src/method-skills/1-analysis/wize-product-brief/workflow.md +90 -19
- package/src/method-skills/1-analysis/wize-refresh-knowledge/workflow.md +127 -0
- package/src/method-skills/1-analysis/wize-research/workflow.md +101 -9
- package/src/method-skills/1-analysis/wize-trigger-map/workflow.md +80 -16
- package/src/method-skills/2-plan-workflows/wize-create-prd/workflow.md +132 -23
- package/src/method-skills/2-plan-workflows/wize-ux-design/workflow.md +132 -28
- package/src/method-skills/2-plan-workflows/wize-ux-scenarios/workflow.md +91 -15
- package/src/method-skills/2-plan-workflows/wize-validate-prd/workflow.md +106 -12
- package/src/method-skills/3-solutioning/wize-check-implementation-readiness/workflow.md +101 -11
- package/src/method-skills/3-solutioning/wize-create-architecture/workflow.md +197 -29
- package/src/method-skills/3-solutioning/wize-create-epics-and-stories/workflow.md +127 -12
- package/src/method-skills/3-solutioning/wize-design-system/workflow.md +182 -22
- package/src/method-skills/3-solutioning/wize-nfr-principles/workflow.md +142 -16
- package/src/method-skills/3-solutioning/wize-tech-vision/workflow.md +127 -21
- package/src/method-skills/4-implementation/wize-code-review/workflow.md +105 -10
- package/src/method-skills/4-implementation/wize-create-story/workflow.md +131 -10
- package/src/method-skills/4-implementation/wize-dev-story/workflow.md +140 -17
- package/src/method-skills/4-implementation/wize-quick-dev/workflow.md +121 -18
- package/src/method-skills/4-implementation/wize-retrospective/workflow.md +112 -10
- package/src/method-skills/4-implementation/wize-sprint-planning/workflow.md +85 -10
- package/src/method-skills/4-implementation/wize-sprint-status/workflow.md +96 -11
- package/src/orchestrator-skills/wize-help/skill.md +25 -1
- package/src/tea-skills/wize-tea-design/workflow.md +104 -13
- package/src/tea-skills/wize-tea-gate/workflow.md +115 -25
- package/src/tea-skills/wize-tea-nfr/workflow.md +104 -14
- package/src/tea-skills/wize-tea-review/workflow.md +120 -13
- package/src/tea-skills/wize-tea-risk/workflow.md +99 -10
- package/src/tea-skills/wize-tea-trace/workflow.md +83 -12
- package/tools/installer/baseline.js +128 -0
- package/tools/installer/commands/agent.js +197 -0
- package/tools/installer/commands/sync.js +45 -0
- package/tools/installer/commands/update.js +172 -0
- package/tools/installer/version-check.js +117 -0
- 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:
|
|
7
|
+
status: ready
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# Design System
|
|
11
11
|
|
|
12
|
-
**Goal.** Establish design tokens and a baseline component library
|
|
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
|
-
|
|
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
|
-
|
|
19
|
-
- `.wize/solutioning/design-system/
|
|
20
|
-
- `.wize/solutioning/design-system/
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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:
|
|
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
|
-
|
|
18
|
-
- **
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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:
|
|
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,
|
|
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
|
-
##
|
|
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
|
-
|
|
94
|
+
---
|
|
95
|
+
status: aligned
|
|
96
|
+
owner: Nick Fury
|
|
97
|
+
created: YYYY-MM-DD
|
|
98
|
+
---
|
|
19
99
|
|
|
20
|
-
|
|
21
|
-
- {Web|Mobile|Hybrid}
|
|
100
|
+
# Tech Vision — {{project_name}}
|
|
22
101
|
|
|
23
|
-
##
|
|
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
|
-
|
|
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
|
|
30
|
-
| Capability | Decision |
|
|
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
|
-
##
|
|
42
|
-
-
|
|
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:
|
|
6
|
+
status: ready
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# Code Review
|
|
10
10
|
|
|
11
|
-
**Goal.**
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
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
|
-
|
|
24
|
-
-
|
|
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`.
|