@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 +40 -10
- package/dist/checklists.d.ts +24 -7
- package/dist/checklists.d.ts.map +1 -1
- package/dist/checklists.js +173 -91
- package/dist/checklists.js.map +1 -1
- package/dist/cli.js +74 -36
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/session.d.ts +10 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +47 -0
- package/dist/session.js.map +1 -1
- package/dist/stack.js +18 -18
- package/dist/stack.js.map +1 -1
- package/dist/tui.d.ts +20 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +327 -0
- package/dist/tui.js.map +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
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.
|
|
42
|
-
| `full` | A team-level pre-development discovery sweep: problem, users, scope, risks, plus
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
package/dist/checklists.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
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
|
|
15
|
-
*
|
|
16
|
-
*
|
|
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. */
|
package/dist/checklists.d.ts.map
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/checklists.js
CHANGED
|
@@ -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
|
-
*
|
|
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
|
|
152
|
-
*
|
|
153
|
-
*
|
|
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: "
|
|
167
|
-
{ id: "
|
|
168
|
-
{ id: "
|
|
169
|
-
{ id: "
|
|
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: "
|
|
192
|
-
{ id: "
|
|
193
|
-
{ id: "
|
|
194
|
-
{ id: "
|
|
195
|
-
{ id: "
|
|
196
|
-
{ id: "
|
|
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: "
|
|
205
|
-
{ id: "
|
|
206
|
-
{ id: "
|
|
207
|
-
{ id: "
|
|
208
|
-
{ id: "
|
|
209
|
-
{ id: "
|
|
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: ["
|
|
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: "
|
|
231
|
-
{ id: "
|
|
232
|
-
{ id: "
|
|
233
|
-
{ id: "
|
|
234
|
-
{ id: "
|
|
235
|
-
{ id: "
|
|
236
|
-
{ id: "validation", text: "Is there a plan to validate the design (usability test, prototype, A/B)?", risky: "no" },
|
|
237
|
-
{ id: "
|
|
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: ["
|
|
326
|
+
roles: ["shared"],
|
|
245
327
|
questions: [
|
|
246
|
-
{ id: "nfrs", text: "Are the non-functional requirements (performance, scale, latency, uptime) defined?", risky: "no" },
|
|
247
|
-
{ id: "
|
|
248
|
-
{ id: "
|
|
249
|
-
{ id: "
|
|
250
|
-
{ id: "
|
|
251
|
-
{ id: "
|
|
252
|
-
{ id: "
|
|
253
|
-
{ id: "
|
|
254
|
-
{ id: "
|
|
255
|
-
{ id: "
|
|
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: ["
|
|
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: "
|
|
265
|
-
{ id: "
|
|
266
|
-
{ id: "
|
|
267
|
-
{ id: "testing-strategy", text: "Is the testing strategy (unit, integration, e2e) and coverage target clear?", risky: "no" },
|
|
268
|
-
{ id: "
|
|
269
|
-
{ id: "
|
|
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: "
|
|
281
|
-
{ id: "
|
|
282
|
-
{ id: "
|
|
283
|
-
{ id: "
|
|
284
|
-
{ id: "
|
|
285
|
-
{ id: "
|
|
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: "
|
|
294
|
-
{ id: "alignment", text: "Is everyone aligned on scope, owner, and definition of done?", risky: "no" },
|
|
295
|
-
{ id: "
|
|
296
|
-
{ id: "
|
|
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
|
],
|