@geekyants/think-before 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -38,15 +38,15 @@ think-before # the installed command is just `think-be
38
38
 
39
39
  | Mode | What it's for |
40
40
  | --- | --- |
41
- | `quick` *(default)* | The "I'm about to touch the big app" moment. ~16 sharp questions about blast radius, data, contracts, your safety net, and timing. |
42
- | `full` | A team-level pre-development discovery sweep: problem, users, scope, risks, plus role sections for designers, engineers, and developers. |
41
+ | `quick` *(default)* | The "I'm about to touch the big app" moment. Blast radius, data, contracts, your safety net, and timing. |
42
+ | `full` | A team-level pre-development discovery sweep: problem, users, scope, risks, plus the questions specific to your role. |
43
43
 
44
- In `full` mode you can focus on one role (shared sections are always included):
44
+ Both modes ask **at most 10 questions** — the ones most relevant to *you*. Every question is tagged with the roles it applies to and a priority; pick a role and you get your fundamentals plus your own specialty, never a wall of questions meant for someone else:
45
45
 
46
46
  ```bash
47
- think-before full --role designer
48
- think-before full --role engineer
49
- think-before full --role developer
47
+ think-before --role designer # quick check, design-focused
48
+ think-before full --role engineer # discovery, architecture-focused
49
+ think-before full --role developer # discovery, implementation-focused
50
50
  ```
51
51
 
52
52
  ## Smart, stack-aware questions
@@ -72,7 +72,7 @@ Skip the scan anytime with `--no-detect`.
72
72
 
73
73
  ## Your role & saved config
74
74
 
75
- The first time you run it in a project, it asks **what your role is** (designer / engineer / developer) and tailors the stack questions to you. Your answer — plus the detected stack — is remembered per project in:
75
+ The first time you run it in a project, it asks **what your role is** (designer / engineer / developer) and tailors the whole question set to you. Your answer — plus the detected stack — is remembered per project in:
76
76
 
77
77
  ```
78
78
  ~/.config/think-before/config.json # honors $XDG_CONFIG_HOME
@@ -84,6 +84,33 @@ So next time it doesn't ask again. To change it: `--role <r>` to set explicitly,
84
84
  think-before config
85
85
  ```
86
86
 
87
+ ## Full-screen mode
88
+
89
+ By default, in an interactive terminal `think-before` takes over the screen like a classic text-mode installer — one boxed question at a time, no scrollback noise, so you can actually *think* about each one:
90
+
91
+ ```
92
+ ╔══════════════════════════════════════════════════╗
93
+ ║ think-before · quick ║
94
+ ╠══════════════════════════════════════════════════╣
95
+ ║ ║
96
+ ║ Question 5 / 10 · Blast radius ║
97
+ ║ ║
98
+ ║ Could this change behavior in flows you are NOT ║
99
+ ║ going to manually test? ║
100
+ ║ ║
101
+ ║ ↳ The side-effects you don't test for are exactly ║
102
+ ║ the ones that reach production. ║
103
+ ║ ║
104
+ ║ ‹ Yes › ‹ No › ‹ Skip › ║
105
+ ║ ║
106
+ ╚══════════════════════════════════════════════════╝
107
+ y yes n no s skip ? why q quit [█████░░░░░] 5/10
108
+ ```
109
+
110
+ It uses the terminal's alternate screen buffer (like `vim` or `less`), so when you're done — or quit with `q`/`Ctrl-C` — your terminal is restored exactly as it was, and the summary + report prompt print into your normal scrollback.
111
+
112
+ When input is piped or it's not a real terminal (CI, `| node …`), it automatically falls back to the classic scrolling line mode — so scripting and pipelines still work. Force either mode with `--no-tui` / `--tui`.
113
+
87
114
  ## How to answer
88
115
 
89
116
  Single keypress, no Enter needed:
@@ -106,6 +133,8 @@ Answers that point at risk get **flagged** with a one-line reason. At the end yo
106
133
  --role <r> Set your role: designer | engineer | developer (remembered per project)
107
134
  --reset-role Forget the saved role and ask again
108
135
  --no-detect Skip the project scan and stack-specific questions
136
+ --no-tui Use the classic scrolling line mode instead of full-screen
137
+ --tui Force full-screen mode
109
138
  --save [file] Save a Markdown report (optionally to <file>) without asking
110
139
  --no-save Don't save and don't ask
111
140
  --list Print the checklist and exit (no prompts)
@@ -122,14 +151,15 @@ The report is plain Markdown — drop it into a PR description, a ticket, or you
122
151
 
123
152
  ```ts
124
153
  import {
125
- quick, full, filterSections, runSession, buildMarkdown,
154
+ quick, full, filterSections, selectSections, runSession, buildMarkdown,
126
155
  detectProject, stackSection,
127
156
  } from "@geekyants/think-before";
128
157
 
129
158
  const detection = detectProject(process.cwd()); // { kind: "fullstack", frameworks: [...] }
130
159
  const extra = stackSection(detection, "engineer");
131
160
 
132
- const sections = [...filterSections(full, "engineer"), ...(extra ? [extra] : [])];
161
+ const all = [...filterSections(full, "engineer"), ...(extra ? [extra] : [])];
162
+ const sections = selectSections(all, "engineer"); // role-tailored, capped at 10
133
163
  const result = await runSession(full, sections);
134
164
  const markdown = buildMarkdown(full, result, new Date());
135
165
  ```
@@ -143,7 +173,7 @@ npm run build # compile to dist/
143
173
  npm start # run the built CLI
144
174
  ```
145
175
 
146
- Want to add or tweak questions? They live in [`src/checklists.ts`](src/checklists.ts) — each question declares which answer (`yes`/`no`) is the risky one, plus an optional `why`. PRs welcome.
176
+ Want to add or tweak questions? They live in [`src/checklists.ts`](src/checklists.ts) — each question declares which answer (`yes`/`no`) is the risky one, an optional `why`, the `roles` it applies to, and a `priority` (higher = asked first when the 10-question cap kicks in). PRs welcome.
147
177
 
148
178
  ## License
149
179
 
@@ -1,19 +1,36 @@
1
1
  import type { Checklist } from "./types.js";
2
+ /**
3
+ * Roles & priority
4
+ * ----------------
5
+ * Every question carries the `roles` it's relevant to (omit = everyone) and a
6
+ * `priority` (higher = asked first). Sections are now purely thematic grouping
7
+ * (`roles: ["shared"]`); the real tailoring happens per-question. A session
8
+ * keeps only the questions matching the user's role and, when more than the cap
9
+ * (see `MAX_QUESTIONS`) are eligible, the highest-priority ones. The aim: every
10
+ * role gets ~5 shared fundamentals + ~5 of their own specialty, never a wall of
11
+ * questions that don't apply to them.
12
+ *
13
+ * Priority bands (rough guide):
14
+ * 90-95 the question you should never skip (problem, scope, blast radius)
15
+ * 80-89 high-severity / role-defining
16
+ * 70-79 important safety nets
17
+ * 50-69 good to consider
18
+ * <50 situational
19
+ */
2
20
  /**
3
21
  * QUICK — the blast-radius check.
4
22
  *
5
- * For the "I'm about to make a small change to a big app" moment. Fast,
6
- * sharp, and focused on the side-effects people overlook. Most questions
7
- * are phrased so that the *risky* answer surfaces something to double-check
8
- * before you touch the code.
23
+ * For the "I'm about to make a small change to a big app" moment. Fast, sharp,
24
+ * and focused on the side-effects people overlook.
9
25
  */
10
26
  export declare const quick: Checklist;
11
27
  /**
12
28
  * FULL — the pre-development discovery checklist.
13
29
  *
14
- * The team-level questions to ask *before* starting any workflow, reframed
15
- * as yes/no so you can sweep them quickly. A "no" here usually means a gap
16
- * worth closing, not a blocker log it as an open question.
30
+ * The questions to ask *before* starting any work, reframed as yes/no. A "no"
31
+ * usually means a gap worth closing, not a blocker log it as an open question.
32
+ * Tailored per role: shared fundamentals plus the discovery questions that role
33
+ * most needs to answer.
17
34
  */
18
35
  export declare const full: Checklist;
19
36
  /** All built-in checklists, keyed by id. */
@@ -1 +1 @@
1
- {"version":3,"file":"checklists.d.ts","sourceRoot":"","sources":["../src/checklists.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;GAOG;AACH,eAAO,MAAM,KAAK,EAAE,SA0InB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,EAAE,SAiJlB,CAAC;AAEF,4CAA4C;AAC5C,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAGhD,CAAC"}
1
+ {"version":3,"file":"checklists.d.ts","sourceRoot":"","sources":["../src/checklists.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,KAAK,EAAE,SA2MnB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,IAAI,EAAE,SAiJlB,CAAC;AAEF,4CAA4C;AAC5C,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAGhD,CAAC"}
@@ -1,10 +1,26 @@
1
+ /**
2
+ * Roles & priority
3
+ * ----------------
4
+ * Every question carries the `roles` it's relevant to (omit = everyone) and a
5
+ * `priority` (higher = asked first). Sections are now purely thematic grouping
6
+ * (`roles: ["shared"]`); the real tailoring happens per-question. A session
7
+ * keeps only the questions matching the user's role and, when more than the cap
8
+ * (see `MAX_QUESTIONS`) are eligible, the highest-priority ones. The aim: every
9
+ * role gets ~5 shared fundamentals + ~5 of their own specialty, never a wall of
10
+ * questions that don't apply to them.
11
+ *
12
+ * Priority bands (rough guide):
13
+ * 90-95 the question you should never skip (problem, scope, blast radius)
14
+ * 80-89 high-severity / role-defining
15
+ * 70-79 important safety nets
16
+ * 50-69 good to consider
17
+ * <50 situational
18
+ */
1
19
  /**
2
20
  * QUICK — the blast-radius check.
3
21
  *
4
- * For the "I'm about to make a small change to a big app" moment. Fast,
5
- * sharp, and focused on the side-effects people overlook. Most questions
6
- * are phrased so that the *risky* answer surfaces something to double-check
7
- * before you touch the code.
22
+ * For the "I'm about to make a small change to a big app" moment. Fast, sharp,
23
+ * and focused on the side-effects people overlook.
8
24
  */
9
25
  export const quick = {
10
26
  id: "quick",
@@ -16,18 +32,20 @@ export const quick = {
16
32
  title: "Understand the change",
17
33
  roles: ["shared"],
18
34
  questions: [
19
- {
20
- id: "understand-current",
21
- text: "Do you understand what this code does today — not just the line you're editing?",
22
- risky: "no",
23
- why: "Editing code you don't fully understand is the #1 source of surprise side-effects.",
24
- },
25
35
  {
26
36
  id: "one-sentence",
27
37
  text: "Can you describe the change and its intended effect in one sentence?",
28
38
  risky: "no",
39
+ priority: 92,
29
40
  why: "If you can't state it simply, the scope isn't clear yet — and unclear scope hides risk.",
30
41
  },
42
+ {
43
+ id: "understand-current",
44
+ text: "Do you understand what this code/area does today — not just the line you're editing?",
45
+ risky: "no",
46
+ priority: 90,
47
+ why: "Editing something you don't fully understand is the #1 source of surprise side-effects.",
48
+ },
31
49
  ],
32
50
  },
33
51
  {
@@ -39,22 +57,67 @@ export const quick = {
39
57
  id: "shared-code",
40
58
  text: "Is this in shared/global code (a util, base component, hook, config, middleware) used in many places?",
41
59
  risky: "yes",
60
+ roles: ["engineer", "developer"],
61
+ priority: 88,
42
62
  why: "Shared code multiplies the blast radius — one edit ripples everywhere it's imported.",
43
63
  },
44
64
  {
45
65
  id: "found-callers",
46
66
  text: "Have you searched for every caller / usage of what you're changing?",
47
67
  risky: "no",
68
+ roles: ["engineer", "developer"],
69
+ priority: 82,
48
70
  why: "Unknown callers are unknown breakage. Grep for usages before you edit, not after.",
49
71
  },
50
72
  {
51
73
  id: "untested-flows",
52
74
  text: "Could this change behavior in flows you are NOT going to manually test?",
53
75
  risky: "yes",
76
+ roles: ["engineer", "developer"],
77
+ priority: 76,
54
78
  why: "The side-effects you don't test for are exactly the ones that reach production.",
55
79
  },
56
80
  ],
57
81
  },
82
+ {
83
+ id: "design-impact",
84
+ title: "Design impact",
85
+ roles: ["shared"],
86
+ questions: [
87
+ {
88
+ id: "ds-shared-ui",
89
+ text: "Is this a change to a shared component, pattern, or design token reused across many screens?",
90
+ risky: "yes",
91
+ roles: ["designer"],
92
+ priority: 86,
93
+ why: "One tweak to a shared UI primitive shows up everywhere it's used.",
94
+ },
95
+ {
96
+ id: "ds-states",
97
+ text: "Have you covered the states this touches — empty, loading, error, long text, large lists?",
98
+ risky: "no",
99
+ roles: ["designer"],
100
+ priority: 82,
101
+ why: "The states you didn't draw are the ones that ship broken.",
102
+ },
103
+ {
104
+ id: "ds-a11y",
105
+ text: "Will contrast, focus order, keyboard use, and screen-reader output still work after this?",
106
+ risky: "no",
107
+ roles: ["designer"],
108
+ priority: 78,
109
+ why: "Accessibility regressions are invisible until someone who relies on them hits them.",
110
+ },
111
+ {
112
+ id: "ds-consistency",
113
+ text: "Does this stay consistent with the existing design system, rather than quietly forking it?",
114
+ risky: "no",
115
+ roles: ["designer"],
116
+ priority: 74,
117
+ why: "A one-off divergence becomes the pattern everyone copies next.",
118
+ },
119
+ ],
120
+ },
58
121
  {
59
122
  id: "data-contracts",
60
123
  title: "Data & contracts",
@@ -64,18 +127,24 @@ export const quick = {
64
127
  id: "data-touch",
65
128
  text: "Does it touch persisted data — schema, migrations, stored formats, or cached values?",
66
129
  risky: "yes",
130
+ roles: ["engineer", "developer"],
131
+ priority: 86,
67
132
  why: "Data changes are the hardest to roll back; old data outlives your deploy.",
68
133
  },
69
134
  {
70
135
  id: "public-contract",
71
136
  text: "Does it change a public API, response shape, event, or contract others depend on?",
72
137
  risky: "yes",
138
+ roles: ["engineer", "developer"],
139
+ priority: 84,
73
140
  why: "Consumers you can't see — other teams, mobile apps, integrations — may break silently.",
74
141
  },
75
142
  {
76
143
  id: "backward-compat",
77
144
  text: "Have you accounted for backward compatibility and in-flight / old-shaped data?",
78
145
  risky: "no",
146
+ roles: ["engineer", "developer"],
147
+ priority: 72,
79
148
  why: "Queues, caches, and old clients may still hold the previous shape after you deploy.",
80
149
  },
81
150
  ],
@@ -89,18 +158,24 @@ export const quick = {
89
158
  id: "tests-cover",
90
159
  text: "Do existing automated tests cover this path, and do they still pass?",
91
160
  risky: "no",
161
+ roles: ["engineer", "developer"],
162
+ priority: 80,
92
163
  why: "No test means no safety net. Add or run one before the change, not after the incident.",
93
164
  },
94
165
  {
95
166
  id: "rollback",
96
167
  text: "Is there a fast way to undo this (revert, feature flag, kill switch)?",
97
168
  risky: "no",
169
+ roles: ["engineer", "developer"],
170
+ priority: 78,
98
171
  why: "If you can't roll back quickly, the cost of being wrong is much higher.",
99
172
  },
100
173
  {
101
174
  id: "observability",
102
175
  text: "If this breaks in production, will you find out (logs, metrics, alerts)?",
103
176
  risky: "no",
177
+ roles: ["engineer", "developer"],
178
+ priority: 76,
104
179
  why: "Silent failures are the worst kind — you learn about them from angry users.",
105
180
  },
106
181
  ],
@@ -114,12 +189,16 @@ export const quick = {
114
189
  id: "security",
115
190
  text: "Does it touch auth, permissions, security, or anything handling PII / secrets?",
116
191
  risky: "yes",
192
+ roles: ["engineer", "developer"],
193
+ priority: 84,
117
194
  why: "These failures are high-severity and often invisible until they're exploited.",
118
195
  },
119
196
  {
120
197
  id: "performance",
121
198
  text: "Could it affect performance at scale (N+1, large lists, hot path, extra network calls)?",
122
199
  risky: "yes",
200
+ roles: ["engineer", "developer"],
201
+ priority: 74,
123
202
  why: "What's fine with 10 rows can melt down at 10 million. Side-effects scale too.",
124
203
  },
125
204
  ],
@@ -129,18 +208,20 @@ export const quick = {
129
208
  title: "Timing & gut check",
130
209
  roles: ["shared"],
131
210
  questions: [
132
- {
133
- id: "timing",
134
- text: "Are you shipping at a risky time (Friday, right before a release, peak traffic, on-call gap)?",
135
- risky: "yes",
136
- why: "Bad timing turns a small bug into a long incident with nobody around to fix it.",
137
- },
138
211
  {
139
212
  id: "gut",
140
213
  text: "Be honest — do you actually understand the side-effects of this change?",
141
214
  risky: "no",
215
+ priority: 60,
142
216
  why: "Your gut is data. If it says 'not sure', pause and dig before you commit.",
143
217
  },
218
+ {
219
+ id: "timing",
220
+ text: "Are you shipping at a risky time (Friday, right before a release, peak traffic, on-call gap)?",
221
+ risky: "yes",
222
+ priority: 55,
223
+ why: "Bad timing turns a small bug into a long incident with nobody around to fix it.",
224
+ },
144
225
  ],
145
226
  },
146
227
  ],
@@ -148,9 +229,10 @@ export const quick = {
148
229
  /**
149
230
  * FULL — the pre-development discovery checklist.
150
231
  *
151
- * The team-level questions to ask *before* starting any workflow, reframed
152
- * as yes/no so you can sweep them quickly. A "no" here usually means a gap
153
- * worth closing, not a blocker log it as an open question.
232
+ * The questions to ask *before* starting any work, reframed as yes/no. A "no"
233
+ * usually means a gap worth closing, not a blocker log it as an open question.
234
+ * Tailored per role: shared fundamentals plus the discovery questions that role
235
+ * most needs to answer.
154
236
  */
155
237
  export const full = {
156
238
  id: "full",
@@ -162,12 +244,12 @@ export const full = {
162
244
  title: "1. Problem & Goals",
163
245
  roles: ["shared"],
164
246
  questions: [
165
- { id: "problem-statement", text: "Can you state the problem you're solving in one sentence?", risky: "no" },
166
- { id: "why-now", text: "Do you know why now and what happens if you don't build it?", risky: "no" },
167
- { id: "success-metric", text: "Is success defined with a metric, a target, and a timeframe?", risky: "no" },
168
- { id: "change-type", text: "Are you clear whether this is a new capability, an improvement, or a fix?", risky: "no", why: "It changes the risk profile and how much process it needs." },
169
- { id: "decision-maker", text: "Is the final decision-maker on scope identified?", risky: "no" },
170
- { id: "attempted-before", text: "Do you know whether this was attempted before, and what happened?", risky: "no" },
247
+ { id: "problem-statement", text: "Can you state the problem you're solving in one sentence?", risky: "no", priority: 95 },
248
+ { id: "success-metric", text: "Is success defined with a metric, a target, and a timeframe?", risky: "no", priority: 90 },
249
+ { id: "why-now", text: "Do you know why now and what happens if you don't build it?", risky: "no", priority: 66 },
250
+ { id: "decision-maker", text: "Is the final decision-maker on scope identified?", risky: "no", priority: 64 },
251
+ { id: "change-type", text: "Are you clear whether this is a new capability, an improvement, or a fix?", risky: "no", priority: 50, why: "It changes the risk profile and how much process it needs." },
252
+ { id: "attempted-before", text: "Do you know whether this was attempted before, and what happened?", risky: "no", priority: 40 },
171
253
  ],
172
254
  },
173
255
  {
@@ -175,12 +257,12 @@ export const full = {
175
257
  title: "2. Users & Stakeholders",
176
258
  roles: ["shared"],
177
259
  questions: [
178
- { id: "primary-users", text: "Do you know who the primary (and secondary) users are?", risky: "no" },
179
- { id: "job-to-be-done", text: "Is the user's job-to-be-done clearly understood?", risky: "no" },
180
- { id: "current-workflow", text: "Do you understand the current workflow without this feature?", risky: "no" },
181
- { id: "signoff-stages", text: "Are the stakeholders who must review or sign off identified, with stages?", risky: "no" },
182
- { id: "internal-users", text: "Have you considered internal users (support, ops, admins) and their needs?", risky: "no" },
183
- { id: "discovery", text: "Is there a plan for how users will find out this exists?", risky: "no" },
260
+ { id: "primary-users", text: "Do you know who the primary (and secondary) users are?", risky: "no", priority: 68 },
261
+ { id: "job-to-be-done", text: "Is the user's job-to-be-done clearly understood?", risky: "no", priority: 62 },
262
+ { id: "current-workflow", text: "Do you understand the current workflow without this feature?", risky: "no", priority: 55 },
263
+ { id: "signoff-stages", text: "Are the stakeholders who must review or sign off identified, with stages?", risky: "no", priority: 48 },
264
+ { id: "internal-users", text: "Have you considered internal users (support, ops, admins) and their needs?", risky: "no", priority: 45 },
265
+ { id: "discovery", text: "Is there a plan for how users will find out this exists?", risky: "no", priority: 42 },
184
266
  ],
185
267
  },
186
268
  {
@@ -188,12 +270,12 @@ export const full = {
188
270
  title: "3. Scope & Requirements",
189
271
  roles: ["shared"],
190
272
  questions: [
191
- { id: "in-scope", text: "Is what's IN scope for this iteration written down?", risky: "no" },
192
- { id: "out-of-scope", text: "Is what's OUT of scope written down?", risky: "no", why: "Explicit non-goals are what actually prevent scope creep." },
193
- { id: "mvp-cut", text: "Is the MVP cut the minimum that delivers value — defined?", risky: "no" },
194
- { id: "acceptance-criteria", text: "Are the acceptance criteria for 'done' defined?", risky: "no" },
195
- { id: "requirements-stability", text: "Do you know whether requirements are fixed or expected to evolve?", risky: "no" },
196
- { id: "unvalidated-assumptions", text: "Have you listed the assumptions you're making but haven't validated?", risky: "no" },
273
+ { id: "out-of-scope", text: "Is what's OUT of scope written down?", risky: "no", priority: 84, why: "Explicit non-goals are what actually prevent scope creep." },
274
+ { id: "mvp-cut", text: "Is the MVP cut the minimum that delivers value — defined?", risky: "no", priority: 78 },
275
+ { id: "acceptance-criteria", text: "Are the acceptance criteria for 'done' defined?", risky: "no", priority: 76 },
276
+ { id: "unvalidated-assumptions", text: "Have you listed the assumptions you're making but haven't validated?", risky: "no", priority: 72 },
277
+ { id: "in-scope", text: "Is what's IN scope for this iteration written down?", risky: "no", priority: 70 },
278
+ { id: "requirements-stability", text: "Do you know whether requirements are fixed or expected to evolve?", risky: "no", priority: 50 },
197
279
  ],
198
280
  },
199
281
  {
@@ -201,12 +283,12 @@ export const full = {
201
283
  title: "4. Constraints & Logistics",
202
284
  roles: ["shared"],
203
285
  questions: [
204
- { id: "deadline", text: "Is the deadline known, and whether it's hard or soft (and why)?", risky: "no" },
205
- { id: "capacity", text: "Is the available budget / capacity (people, hours) known?", risky: "no" },
206
- { id: "ownership", text: "Is long-term ownership after launch assigned?", risky: "no" },
207
- { id: "dependencies", text: "Are dependencies on other teams, vendors, or releases mapped?", risky: "no" },
208
- { id: "legal-deadlines", text: "Are any legal / contractual / regulatory deadlines identified?", risky: "no" },
209
- { id: "fallback-plan", text: "Is there a rollback / fallback plan if it goes wrong?", risky: "no" },
286
+ { id: "fallback-plan", text: "Is there a rollback / fallback plan if it goes wrong?", risky: "no", priority: 70 },
287
+ { id: "dependencies", text: "Are dependencies on other teams, vendors, or releases mapped?", risky: "no", priority: 64 },
288
+ { id: "deadline", text: "Is the deadline known, and whether it's hard or soft (and why)?", risky: "no", priority: 60 },
289
+ { id: "capacity", text: "Is the available budget / capacity (people, hours) known?", risky: "no", priority: 52 },
290
+ { id: "ownership", text: "Is long-term ownership after launch assigned?", risky: "no", priority: 50 },
291
+ { id: "legal-deadlines", text: "Are any legal / contractual / regulatory deadlines identified?", risky: "no", priority: 46 },
210
292
  ],
211
293
  },
212
294
  {
@@ -214,62 +296,62 @@ export const full = {
214
296
  title: "5. Risks & Unknowns",
215
297
  roles: ["shared"],
216
298
  questions: [
217
- { id: "biggest-risk", text: "Do you know the single biggest risk to this project?", risky: "no" },
218
- { id: "riskiest-assumption", text: "Have you identified the riskiest assumption — and can you test it cheaply first?", risky: "no" },
219
- { id: "known-unknowns", text: "Are the known unknowns to research before committing listed?", risky: "no" },
220
- { id: "three-x", text: "Do you know what could make this take 3x longer than estimated?", risky: "no" },
221
- { id: "spof", text: "Have you checked for single points of failure (one person, one system, one vendor)?", risky: "no" },
299
+ { id: "biggest-risk", text: "Do you know the single biggest risk to this project?", risky: "no", priority: 82 },
300
+ { id: "riskiest-assumption", text: "Have you identified the riskiest assumption — and can you test it cheaply first?", risky: "no", priority: 79 },
301
+ { id: "known-unknowns", text: "Are the known unknowns to research before committing listed?", risky: "no", priority: 58 },
302
+ { id: "three-x", text: "Do you know what could make this take 3x longer than estimated?", risky: "no", priority: 56 },
303
+ { id: "spof", text: "Have you checked for single points of failure (one person, one system, one vendor)?", risky: "no", priority: 54 },
222
304
  ],
223
305
  },
224
306
  {
225
307
  id: "designers",
226
308
  title: "6. For Designers",
227
- roles: ["designer"],
309
+ roles: ["shared"],
228
310
  questions: [
229
- { id: "real-research", text: "Do you have real user research (not guesses) for who you're designing for?", risky: "no" },
230
- { id: "existing-patterns", text: "Have you identified the existing patterns, components, or design-system rules that apply?", risky: "no" },
231
- { id: "key-flows", text: "Are the key user flows mapped, including error and empty states?", risky: "no" },
232
- { id: "a11y", text: "Do you know the accessibility standards to meet (e.g. WCAG AA: contrast, keyboard, screen readers, touch targets)?", risky: "no" },
233
- { id: "viewports", text: "Are the supported devices, breakpoints, and viewports defined?", risky: "no" },
234
- { id: "copy", text: "Is it clear what copy is needed, who writes it, and any localization?", risky: "no" },
235
- { id: "design-edge-cases", text: "Have you considered edge cases: long text, missing data, slow connections, large lists?", risky: "no" },
236
- { id: "validation", text: "Is there a plan to validate the design (usability test, prototype, A/B)?", risky: "no" },
237
- { id: "handoff", text: "Is the engineering handoff defined (tokens, specs, states, motion)?", risky: "no" },
238
- { id: "brand-legal", text: "Have you checked brand, legal, or compliance constraints on the UI?", risky: "no" },
311
+ { id: "real-research", text: "Do you have real user research (not guesses) for who you're designing for?", risky: "no", roles: ["designer"], priority: 89 },
312
+ { id: "key-flows", text: "Are the key user flows mapped, including error and empty states?", risky: "no", roles: ["designer"], priority: 87 },
313
+ { id: "a11y", text: "Do you know the accessibility standards to meet (WCAG AA: contrast, keyboard, screen readers, touch targets)?", risky: "no", roles: ["designer"], priority: 85 },
314
+ { id: "existing-patterns", text: "Have you identified the existing patterns, components, or design-system rules that apply?", risky: "no", roles: ["designer"], priority: 83 },
315
+ { id: "handoff", text: "Is the engineering handoff defined (tokens, specs, states, motion)?", risky: "no", roles: ["designer"], priority: 81 },
316
+ { id: "design-edge-cases", text: "Have you considered edge cases: long text, missing data, slow connections, large lists?", risky: "no", roles: ["designer"], priority: 79 },
317
+ { id: "viewports", text: "Are the supported devices, breakpoints, and viewports defined?", risky: "no", roles: ["designer"], priority: 75 },
318
+ { id: "validation", text: "Is there a plan to validate the design (usability test, prototype, A/B)?", risky: "no", roles: ["designer"], priority: 73 },
319
+ { id: "copy", text: "Is it clear what copy is needed, who writes it, and any localization?", risky: "no", roles: ["designer"], priority: 69 },
320
+ { id: "brand-legal", text: "Have you checked brand, legal, or compliance constraints on the UI?", risky: "no", roles: ["designer"], priority: 65 },
239
321
  ],
240
322
  },
241
323
  {
242
324
  id: "engineers",
243
325
  title: "7. For Engineers / Architects",
244
- roles: ["engineer"],
326
+ roles: ["shared"],
245
327
  questions: [
246
- { id: "nfrs", text: "Are the non-functional requirements (performance, scale, latency, uptime) defined?", risky: "no" },
247
- { id: "load", text: "Do you know the expected load at launch and at projected growth?", risky: "no" },
248
- { id: "data-ownership", text: "Is it clear what data you read/write, where it lives, and who owns it?", risky: "no" },
249
- { id: "external-apis", text: "Are external APIs/services, their rate limits, and SLAs identified?", risky: "no" },
250
- { id: "fits-architecture", text: "Do you know whether this fits the current architecture or needs a new pattern?", risky: "no" },
251
- { id: "security-reqs", text: "Are the security requirements (authn/authz, encryption, secrets, PII) defined?", risky: "no" },
252
- { id: "compliance", text: "Are the applicable privacy/compliance rules known (GDPR, CCPA, HIPAA, SOC 2, residency)?", risky: "no" },
253
- { id: "failure-handling", text: "Is there a plan for failures, retries, idempotency, and degraded states?", risky: "no" },
254
- { id: "observability-plan", text: "Is the observability plan (logging, metrics, tracing, alerts) defined?", risky: "no" },
255
- { id: "deploy-plan", text: "Is the deployment approach clear (CI/CD, feature flags, migrations, zero-downtime)?", risky: "no" },
328
+ { id: "nfrs", text: "Are the non-functional requirements (performance, scale, latency, uptime) defined?", risky: "no", roles: ["engineer"], priority: 89 },
329
+ { id: "fits-architecture", text: "Do you know whether this fits the current architecture or needs a new pattern?", risky: "no", roles: ["engineer"], priority: 87 },
330
+ { id: "security-reqs", text: "Are the security requirements (authn/authz, encryption, secrets, PII) defined?", risky: "no", roles: ["engineer", "developer"], priority: 85 },
331
+ { id: "data-ownership", text: "Is it clear what data you read/write, where it lives, and who owns it?", risky: "no", roles: ["engineer"], priority: 83 },
332
+ { id: "failure-handling", text: "Is there a plan for failures, retries, idempotency, and degraded states?", risky: "no", roles: ["engineer"], priority: 81 },
333
+ { id: "deploy-plan", text: "Is the deployment approach clear (CI/CD, feature flags, migrations, zero-downtime)?", risky: "no", roles: ["engineer"], priority: 77 },
334
+ { id: "observability-plan", text: "Is the observability plan (logging, metrics, tracing, alerts) defined?", risky: "no", roles: ["engineer"], priority: 75 },
335
+ { id: "external-apis", text: "Are external APIs/services, their rate limits, and SLAs identified?", risky: "no", roles: ["engineer"], priority: 73 },
336
+ { id: "load", text: "Do you know the expected load at launch and at projected growth?", risky: "no", roles: ["engineer"], priority: 70 },
337
+ { id: "compliance", text: "Are the applicable privacy/compliance rules known (GDPR, CCPA, HIPAA, SOC 2, residency)?", risky: "no", roles: ["engineer"], priority: 68 },
256
338
  ],
257
339
  },
258
340
  {
259
341
  id: "developers",
260
342
  title: "8. For Developers (Implementation)",
261
- roles: ["developer"],
343
+ roles: ["shared"],
262
344
  questions: [
263
- { id: "first-test", text: "Do you understand the acceptance criteria well enough to write the first test?", risky: "no" },
264
- { id: "small-pieces", text: "Can you break this into small, independently shippable pieces?", risky: "no" },
265
- { id: "code-location", text: "Do you know where the code lives and what conventions/standards apply?", risky: "no" },
266
- { id: "reuse", text: "Have you checked what already exists that you can reuse instead of rewriting?", risky: "no" },
267
- { id: "testing-strategy", text: "Is the testing strategy (unit, integration, e2e) and coverage target clear?", risky: "no" },
268
- { id: "run-locally", text: "Can you run this locally is the dev environment / test data ready?", risky: "no" },
269
- { id: "edge-inputs", text: "Do you know the edge cases and invalid inputs you must handle?", risky: "no" },
270
- { id: "migration", text: "Have you considered backward-compatibility and migration concerns?", risky: "no" },
271
- { id: "review-bar", text: "Is it clear how this will be reviewed and what 'ready to merge' means?", risky: "no" },
272
- { id: "docs", text: "Do you know what documentation you need to write (README, API docs, runbook)?", risky: "no" },
345
+ { id: "first-test", text: "Do you understand the acceptance criteria well enough to write the first test?", risky: "no", roles: ["developer"], priority: 89 },
346
+ { id: "code-location", text: "Do you know where the code lives and what conventions/standards apply?", risky: "no", roles: ["developer"], priority: 87 },
347
+ { id: "reuse", text: "Have you checked what already exists that you can reuse instead of rewriting?", risky: "no", roles: ["developer"], priority: 85 },
348
+ { id: "small-pieces", text: "Can you break this into small, independently shippable pieces?", risky: "no", roles: ["developer"], priority: 83 },
349
+ { id: "testing-strategy", text: "Is the testing strategy (unit, integration, e2e) and coverage target clear?", risky: "no", roles: ["developer"], priority: 81 },
350
+ { id: "edge-inputs", text: "Do you know the edge cases and invalid inputs you must handle?", risky: "no", roles: ["developer"], priority: 77 },
351
+ { id: "run-locally", text: "Can you run this locally is the dev environment / test data ready?", risky: "no", roles: ["developer"], priority: 75 },
352
+ { id: "migration", text: "Have you considered backward-compatibility and migration concerns?", risky: "no", roles: ["developer", "engineer"], priority: 73 },
353
+ { id: "review-bar", text: "Is it clear how this will be reviewed and what 'ready to merge' means?", risky: "no", roles: ["developer"], priority: 70 },
354
+ { id: "docs", text: "Do you know what documentation you need to write (README, API docs, runbook)?", risky: "no", roles: ["developer"], priority: 66 },
273
355
  ],
274
356
  },
275
357
  {
@@ -277,12 +359,12 @@ export const full = {
277
359
  title: "9. Quality & Launch Readiness",
278
360
  roles: ["shared"],
279
361
  questions: [
280
- { id: "release-checklist", text: "Is the release checklist what must be true before shipping — defined?", risky: "no" },
281
- { id: "prod-like-test", text: "Is there a plan to test in a production-like environment?", risky: "no" },
282
- { id: "monitoring-oncall", text: "Is the monitoring plan and the on-call owner after launch defined?", risky: "no" },
283
- { id: "fast-rollback", text: "Is there a fast rollback if something breaks?", risky: "no" },
284
- { id: "comms-plan", text: "Is the launch communication plan (internal + users) ready?", risky: "no" },
285
- { id: "goal-review", text: "Is there a plan and date to review whether this actually hit its goals?", risky: "no" },
362
+ { id: "fast-rollback", text: "Is there a fast rollback if something breaks?", risky: "no", priority: 72 },
363
+ { id: "monitoring-oncall", text: "Is the monitoring plan and the on-call owner after launch defined?", risky: "no", priority: 56 },
364
+ { id: "release-checklist", text: "Is the release checklist what must be true before shipping — defined?", risky: "no", priority: 58 },
365
+ { id: "prod-like-test", text: "Is there a plan to test in a production-like environment?", risky: "no", priority: 52 },
366
+ { id: "goal-review", text: "Is there a plan and date to review whether this actually hit its goals?", risky: "no", priority: 50 },
367
+ { id: "comms-plan", text: "Is the launch communication plan (internal + users) ready?", risky: "no", priority: 44 },
286
368
  ],
287
369
  },
288
370
  {
@@ -290,10 +372,10 @@ export const full = {
290
372
  title: "10. Final Gut Check",
291
373
  roles: ["shared"],
292
374
  questions: [
293
- { id: "half-value", text: "If you shipped only half of this, do you know which half delivers the most value?", risky: "no" },
294
- { id: "alignment", text: "Is everyone aligned on scope, owner, and definition of done?", risky: "no" },
295
- { id: "regret", text: "Do you know the one thing you're most likely to regret skipping?", risky: "no" },
296
- { id: "real-problem", text: "Are you solving the real problem, not just the requested solution?", risky: "no" },
375
+ { id: "real-problem", text: "Are you solving the real problem, not just the requested solution?", risky: "no", priority: 80 },
376
+ { id: "alignment", text: "Is everyone aligned on scope, owner, and definition of done?", risky: "no", priority: 64 },
377
+ { id: "half-value", text: "If you shipped only half of this, do you know which half delivers the most value?", risky: "no", priority: 60 },
378
+ { id: "regret", text: "Do you know the one thing you're most likely to regret skipping?", risky: "no", priority: 48 },
297
379
  ],
298
380
  },
299
381
  ],