@anhth2/spec-driven-dev-plugin 0.6.0 → 0.8.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/bin/index.js +285 -11
- package/commands/debug.md +233 -11
- package/commands/debug.tmpl +170 -6
- package/commands/define-product.md +68 -6
- package/commands/define-product.tmpl +5 -1
- package/commands/fix-bug.md +111 -11
- package/commands/fix-bug.tmpl +48 -6
- package/commands/generate-bdd.md +86 -9
- package/commands/generate-bdd.tmpl +23 -4
- package/commands/generate-code.md +146 -19
- package/commands/generate-code.tmpl +83 -14
- package/commands/generate-design-spec.md +754 -0
- package/commands/generate-design-spec.tmpl +399 -0
- package/commands/generate-prd.md +91 -7
- package/commands/generate-prd.tmpl +28 -2
- package/commands/generate-spec-manifest.md +519 -0
- package/commands/generate-spec-manifest.tmpl +164 -0
- package/commands/generate-tech-docs.md +122 -9
- package/commands/generate-tech-docs.tmpl +59 -4
- package/commands/generate-tests.md +491 -37
- package/commands/generate-tests.tmpl +428 -32
- package/commands/refine-prd.md +76 -8
- package/commands/refine-prd.tmpl +13 -3
- package/commands/review-code.md +94 -6
- package/commands/review-code.tmpl +31 -1
- package/commands/review-context.md +118 -12
- package/commands/review-context.tmpl +55 -7
- package/commands/review-tech-docs.md +76 -9
- package/commands/review-tech-docs.tmpl +13 -4
- package/commands/run-tests.md +196 -18
- package/commands/run-tests.tmpl +133 -13
- package/commands/setup-ai-first.md +192 -6
- package/commands/setup-ai-first.tmpl +136 -5
- package/commands/smoke-test.md +228 -22
- package/commands/smoke-test.tmpl +165 -17
- package/commands/validate-traces.md +77 -8
- package/commands/validate-traces.tmpl +14 -3
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/debug.md +233 -11
- package/core/commands/define-product.md +68 -6
- package/core/commands/fix-bug.md +111 -11
- package/core/commands/generate-bdd.md +86 -9
- package/core/commands/generate-code.md +146 -19
- package/core/commands/generate-design-spec.md +754 -0
- package/core/commands/generate-prd.md +91 -7
- package/core/commands/generate-spec-manifest.md +519 -0
- package/core/commands/generate-tech-docs.md +122 -9
- package/core/commands/generate-tests.md +491 -37
- package/core/commands/refine-prd.md +76 -8
- package/core/commands/review-code.md +94 -6
- package/core/commands/review-context.md +118 -12
- package/core/commands/review-tech-docs.md +76 -9
- package/core/commands/run-tests.md +196 -18
- package/core/commands/setup-ai-first.md +192 -6
- package/core/commands/smoke-test.md +228 -22
- package/core/commands/validate-traces.md +77 -8
- package/core/skills/code/SKILL.md +68 -8
- package/core/skills/debug/SKILL.md +72 -10
- package/core/skills/design-spec/SKILL.md +450 -0
- package/core/skills/discovery/SKILL.md +62 -4
- package/core/skills/prd/SKILL.md +12 -8
- package/core/skills/setup-ai-first/SKILL.md +5 -3
- package/core/skills/spec/SKILL.md +11 -7
- package/core/skills/test/SKILL.md +130 -12
- package/core/steps/context-loader.md +57 -1
- package/core/steps/gate.md +1 -1
- package/core/steps/report-footer.md +5 -3
- package/core/steps/spawn-agent.md +3 -1
- package/core/templates/design-spec.template.md +209 -0
- package/core/templates/project-context.yaml +29 -0
- package/package.json +1 -1
- package/skills/code/SKILL.md +68 -8
- package/skills/debug/SKILL.md +72 -10
- package/skills/design-spec/SKILL.md +450 -0
- package/skills/design-spec/SKILL.tmpl +95 -0
- package/skills/discovery/SKILL.md +62 -4
- package/skills/prd/SKILL.md +12 -8
- package/skills/setup-ai-first/SKILL.md +5 -3
- package/skills/spec/SKILL.md +11 -7
- package/skills/test/SKILL.md +130 -12
- package/steps/context-loader.md +57 -1
- package/steps/gate.md +1 -1
- package/steps/report-footer.md +5 -3
- package/steps/spawn-agent.md +3 -1
- package/templates/design-spec.template.md +209 -0
- package/templates/project-context.yaml +29 -0
package/commands/debug.tmpl
CHANGED
|
@@ -13,13 +13,112 @@ Different from `/fix-bug`: analysis only, no full workflow, no ticket needed.
|
|
|
13
13
|
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
-
##
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
## Step 1 — Classify debug type
|
|
17
|
+
|
|
18
|
+
After loading context, display this prompt and wait for the user's choice:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
DEBUG SESSION
|
|
22
|
+
──────────────────────────────────────────────────────────────
|
|
23
|
+
What's your situation?
|
|
24
|
+
|
|
25
|
+
1 I already have a stack trace / error log → paste it
|
|
26
|
+
2 I need to reproduce the error first → show me the run command
|
|
27
|
+
3 A test is failing → I'll run tests, then paste output
|
|
28
|
+
4 Code question (no runtime needed) → ask away
|
|
29
|
+
──────────────────────────────────────────────────────────────
|
|
30
|
+
Enter 1 / 2 / 3 / 4:
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Wait for the user's choice, then follow the corresponding path below.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
### Path 1 — Already have error output
|
|
38
|
+
|
|
39
|
+
Ask:
|
|
40
|
+
```
|
|
41
|
+
Paste your stack trace / error log below:
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Wait for input, then proceed to [Stack Trace Analysis](#stack-trace-analysis).
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
### Path 2 — Need to reproduce first
|
|
49
|
+
|
|
50
|
+
Display the run command from `conventions.service_run` in `project-context.yaml`:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
Start your service first:
|
|
54
|
+
|
|
55
|
+
{conventions.service_run}
|
|
56
|
+
|
|
57
|
+
(If you use Docker: `docker compose up -d`, then verify with `docker compose ps`)
|
|
58
|
+
|
|
59
|
+
Once the service is running:
|
|
60
|
+
1. Trigger the behavior that causes the error
|
|
61
|
+
2. Copy the full stack trace or error log
|
|
62
|
+
3. Paste it here
|
|
63
|
+
|
|
64
|
+
Waiting for your error output...
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Wait for the user to paste the error, then proceed to [Stack Trace Analysis](#stack-trace-analysis).
|
|
68
|
+
|
|
69
|
+
If `conventions.service_run` is not set → show:
|
|
70
|
+
```
|
|
71
|
+
⚠️ service_run is not configured in .agent/project-context.yaml.
|
|
72
|
+
Add it so this command can show the correct start command:
|
|
73
|
+
|
|
74
|
+
conventions:
|
|
75
|
+
service_run: "mvn spring-boot:run" # or: npm run dev / go run . / etc.
|
|
76
|
+
```
|
|
77
|
+
Then ask the user to start the service manually and paste the error when ready.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
### Path 3 — Test is failing
|
|
82
|
+
|
|
83
|
+
Display the test command from `conventions.test_command` in `project-context.yaml`:
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
Run your tests first:
|
|
87
|
+
|
|
88
|
+
{conventions.test_command}
|
|
89
|
+
|
|
90
|
+
Once the run finishes, paste the full test failure output here.
|
|
91
|
+
|
|
92
|
+
Waiting...
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Wait for the user to paste the failure output, then proceed to [Test Failure Analysis](#test-failure-analysis).
|
|
96
|
+
|
|
97
|
+
If `conventions.test_command` is not set → show:
|
|
98
|
+
```
|
|
99
|
+
⚠️ test_command is not configured in .agent/project-context.yaml.
|
|
100
|
+
Add it so this command can show the correct test command:
|
|
101
|
+
|
|
102
|
+
conventions:
|
|
103
|
+
test_command: "mvn test" # or: npm test / go test ./... / etc.
|
|
104
|
+
```
|
|
105
|
+
Then ask the user to run tests manually and paste the output when ready.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
### Path 4 — Code question
|
|
110
|
+
|
|
111
|
+
Ask:
|
|
112
|
+
```
|
|
113
|
+
Describe your question or paste the code snippet you're asking about:
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Wait for input, then answer directly using loaded project context (architecture rules, layer order, coding standards from CLAUDE.md).
|
|
117
|
+
|
|
118
|
+
---
|
|
21
119
|
|
|
22
120
|
## Stack Trace Analysis
|
|
121
|
+
|
|
23
122
|
Read from **bottom up** — `Caused by:` is the real root cause:
|
|
24
123
|
```
|
|
25
124
|
Caused by: {RealException} ← start here
|
|
@@ -28,20 +127,83 @@ Caused by: {RealException} ← start here
|
|
|
28
127
|
|
|
29
128
|
## Common Error Patterns
|
|
30
129
|
|
|
130
|
+
Use `active_module` from context to select the relevant table.
|
|
131
|
+
|
|
132
|
+
### If `platform_type = backend`
|
|
133
|
+
|
|
134
|
+
#### java-spring / golang / dotnet / php-laravel
|
|
135
|
+
|
|
31
136
|
| Error | Likely Cause | Fix Direction |
|
|
32
137
|
|-------|-------------|---------------|
|
|
33
138
|
| NullPointerException | Null object access; Optional not handled | Check Optional.orElseThrow, null guards |
|
|
34
139
|
| ClassCastException | Wrong type assumption | Check type at assignment/return |
|
|
35
140
|
| OutOfMemoryError | Loading too much data | Add pagination |
|
|
36
141
|
| StackOverflowError | Infinite recursion | Find recursive call with no base case |
|
|
37
|
-
| Connection refused | Dependency not running | Check config URLs |
|
|
142
|
+
| Connection refused | Dependency not running | Check config URLs / start service |
|
|
38
143
|
| 401 Unauthorized | Token expired, wrong config | Verify token, check auth config |
|
|
39
144
|
| 403 Forbidden | Wrong role | Check auth annotations |
|
|
40
145
|
| DB constraint violation | Duplicate key, null in NOT NULL | Check data and constraints |
|
|
41
146
|
| Serialization error | Circular reference | Check DTO/mapper config |
|
|
42
147
|
| Test assertion mismatch | Wrong mock or wrong expected | Re-read mock setup |
|
|
43
148
|
|
|
149
|
+
#### context-engineering (AI/LLM pipelines)
|
|
150
|
+
|
|
151
|
+
| Error | Likely Cause | Fix Direction |
|
|
152
|
+
|-------|-------------|---------------|
|
|
153
|
+
| `APIError` / `RateLimitError` | LLM quota exceeded or service down | Check API key, rate limits; add exponential backoff |
|
|
154
|
+
| `TokenLimitError` / `context_length_exceeded` | Input prompt too long | Truncate/chunk input; review prompt template size |
|
|
155
|
+
| `AuthenticationError` | API key invalid or expired | Check env var; rotate key |
|
|
156
|
+
| Response validation / schema mismatch | LLM output doesn't match expected format | Add output parser; retry with stricter prompt |
|
|
157
|
+
| `JSONDecodeError` on LLM output | Model returned non-JSON text | Add JSON extraction post-processing or stricter system prompt |
|
|
158
|
+
| Hanging / slow test | Real LLM called in test instead of mock | Verify `patch('...')` applied; add timeout guard |
|
|
159
|
+
| Flaky results across runs | Non-deterministic LLM response | Use fixed mock in tests; check temperature = 0 for determinism |
|
|
160
|
+
|
|
161
|
+
### If `platform_type = web-frontend`
|
|
162
|
+
|
|
163
|
+
| Error | Likely Cause | Fix Direction |
|
|
164
|
+
|-------|-------------|---------------|
|
|
165
|
+
| `Cannot read properties of undefined` | Data not loaded yet | Add loading guard / optional chaining `?.` |
|
|
166
|
+
| `useEffect` infinite loop | Dependency array wrong | Review deps, use stable refs / `useCallback` |
|
|
167
|
+
| `Cannot update state on unmounted component` | Async resolves after unmount | Cancel in cleanup / use AbortController |
|
|
168
|
+
| CORS error | API not configured | Check backend CORS config or dev proxy setup |
|
|
169
|
+
| 401 Unauthorized | Token expired or missing | Refresh token / check Authorization header |
|
|
170
|
+
| White screen / no output | Unhandled render error | Check browser console, add ErrorBoundary |
|
|
171
|
+
| Type error (Zod / TypeScript) | API response shape mismatch | Compare actual response vs type definition |
|
|
172
|
+
| `act(...)` warning in test | Async state update | Wrap in `act(async () => {...})` |
|
|
173
|
+
| Module not found | Import path wrong | Check relative path / tsconfig alias |
|
|
174
|
+
|
|
175
|
+
### If `platform_type = mobile`
|
|
176
|
+
|
|
177
|
+
#### Flutter
|
|
178
|
+
| Error | Likely Cause | Fix Direction |
|
|
179
|
+
|-------|-------------|---------------|
|
|
180
|
+
| `Null check operator on null value` | Nullable not guarded | Add `?` or null check before `!` |
|
|
181
|
+
| `pumpAndSettle timed out` | Async not completing in test | Use `pump(Duration(...))` |
|
|
182
|
+
| `setState called after dispose` | Async continues after widget removed | Cancel in `dispose()` |
|
|
183
|
+
| `RenderFlex overflow` | Widget too wide for screen | Wrap with `Flexible`, `Expanded`, or `SingleChildScrollView` |
|
|
184
|
+
| BLoC state not updating | Event not dispatched | Verify `bloc.add(Event())` is called |
|
|
185
|
+
| `MissingPluginException` | Native plugin not linked | Run `flutter clean && flutter pub get` |
|
|
186
|
+
|
|
187
|
+
#### React Native
|
|
188
|
+
| Error | Likely Cause | Fix Direction |
|
|
189
|
+
|-------|-------------|---------------|
|
|
190
|
+
| `undefined is not an object` | Null prop access | Add null check / optional chaining |
|
|
191
|
+
| Metro bundler error | Cache stale | `npx react-native start --reset-cache` |
|
|
192
|
+
| `VirtualizedLists nested` | FlatList inside ScrollView | Use `nestedScrollEnabled` or restructure |
|
|
193
|
+
| Navigation `undefined` | `useNavigation` outside navigator | Wrap component inside correct navigator |
|
|
194
|
+
| `act(...)` warning | Async state update in test | Wrap in `act(async () => {...})` |
|
|
195
|
+
|
|
196
|
+
#### iOS / Android
|
|
197
|
+
| Error | Likely Cause | Fix Direction |
|
|
198
|
+
|-------|-------------|---------------|
|
|
199
|
+
| `SIGABRT` / `EXC_BAD_ACCESS` (iOS) | Nil dereference | Add optional binding `if let` / `guard let` |
|
|
200
|
+
| `IllegalStateException` (Android) | Lifecycle violation | Check if fragment/activity still attached |
|
|
201
|
+
| `NetworkOnMainThreadException` | Network call on UI thread | Move to coroutine / background thread |
|
|
202
|
+
| Build fails after pod install | Pod cache stale | `pod deintegrate && pod install` |
|
|
203
|
+
| `Hilt injection failed` | Missing `@AndroidEntryPoint` | Add annotation to Activity/Fragment |
|
|
204
|
+
|
|
44
205
|
## Test Failure Analysis
|
|
206
|
+
|
|
45
207
|
```
|
|
46
208
|
Expected: {value}
|
|
47
209
|
Actual : {value}
|
|
@@ -49,6 +211,8 @@ Actual : {value}
|
|
|
49
211
|
```
|
|
50
212
|
1. What is the gap? 2. Is mock setup correct? 3. Is assertion logically correct?
|
|
51
213
|
|
|
214
|
+
---
|
|
215
|
+
|
|
52
216
|
## Output
|
|
53
217
|
|
|
54
218
|
{{include:steps/report-footer.md}}
|
|
@@ -31,7 +31,7 @@ Display and wait for response:
|
|
|
31
31
|
```
|
|
32
32
|
⚙️ MODEL CHECK
|
|
33
33
|
──────────────────────────────────────────────────────────────────
|
|
34
|
-
Recommended : claude-opus-4
|
|
34
|
+
Recommended : claude-opus-4 (or latest Opus model)
|
|
35
35
|
Why needed : Spec analysis, architecture review, code generation
|
|
36
36
|
require deep reasoning. Smaller models miss edge cases.
|
|
37
37
|
|
|
@@ -131,6 +131,7 @@ Read `.agent/project-context.yaml`. Extract and store:
|
|
|
131
131
|
- `paths.core_entities` → path to core-entities.md
|
|
132
132
|
- `paths.tech_docs_dir` → technical documentation root
|
|
133
133
|
- `paths.trace_dir` → trace state directory
|
|
134
|
+
- `paths.design_spec_dir` → Design Spec documents root (FE/App only)
|
|
134
135
|
|
|
135
136
|
If `paths` section is absent, use these defaults:
|
|
136
137
|
- `specs_dir` = `specs/bdd`
|
|
@@ -140,13 +141,46 @@ If `paths` section is absent, use these defaults:
|
|
|
140
141
|
- `domain_knowledge_dir` = `specs/domain-knowledge`
|
|
141
142
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
142
143
|
- `core_entities` = `specs/domain-knowledge/core-entities.md`
|
|
143
|
-
- `tech_docs_dir` = `tech-docs`
|
|
144
|
+
- `tech_docs_dir` = `specs/tech-docs`
|
|
144
145
|
- `trace_dir` = `.trace`
|
|
146
|
+
- `design_spec_dir` = `specs/design-spec`
|
|
145
147
|
|
|
146
148
|
If `tech_stack.module` is set, also load `.agent/modules/{module}/stack-profile.yaml` if it exists.
|
|
147
149
|
|
|
148
150
|
---
|
|
149
151
|
|
|
152
|
+
## Step 1.5 — [SERVICE ROUTING] Resolve service paths (umbrella mode)
|
|
153
|
+
|
|
154
|
+
*Skip this step entirely if `setup.mode` is not `"umbrella"` and `services` section is absent from project-context.yaml.*
|
|
155
|
+
|
|
156
|
+
If `services` section is present:
|
|
157
|
+
|
|
158
|
+
**1. Detect active domain** (in priority order):
|
|
159
|
+
- Read `@trace.domain` from target file frontmatter (if Gate loaded a target file)
|
|
160
|
+
- Extract from target file path: segment immediately after `prd_dir` base path
|
|
161
|
+
*(e.g., `specs/prd/user/FEAT-01.md` → domain = `user`)*
|
|
162
|
+
- If `$ARGUMENTS` contains a path, extract the segment after `prd_dir`
|
|
163
|
+
|
|
164
|
+
**2. Route to service** — if active domain matches a key in `services`:
|
|
165
|
+
- Override `paths.specs_dir` → `services.{domain}.specs_dir`
|
|
166
|
+
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
|
|
167
|
+
- Store `active_service` = `services.{domain}.path`
|
|
168
|
+
- Store `active_service_module` = `services.{domain}.module`
|
|
169
|
+
- If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
|
|
170
|
+
|
|
171
|
+
**3. Fallback** — if domain not detected or no matching service key:
|
|
172
|
+
- Keep default paths from Step 1
|
|
173
|
+
- Set `active_service = unresolved`
|
|
174
|
+
|
|
175
|
+
**4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
|
|
176
|
+
- Override `paths.prd_dir` → `{spec_source}/specs/prd`
|
|
177
|
+
- Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
|
|
178
|
+
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
179
|
+
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
180
|
+
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
150
184
|
## Step 2 — [PROJECT-CONFIG] Load module stack profile (conditional)
|
|
151
185
|
|
|
152
186
|
If `tech_stack.module` is set, read `.agent/modules/{module}/stack-profile.yaml`.
|
|
@@ -217,6 +251,26 @@ If the file does not exist → skip silently.
|
|
|
217
251
|
|
|
218
252
|
---
|
|
219
253
|
|
|
254
|
+
## Step 6.5 — [PLATFORM] Derive active_module and platform_type
|
|
255
|
+
|
|
256
|
+
Using `tech_stack.module` loaded in Step 1, derive and store two variables for use by all downstream commands:
|
|
257
|
+
|
|
258
|
+
```
|
|
259
|
+
active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
| `platform_type` | Modules |
|
|
263
|
+
|---|---|
|
|
264
|
+
| `backend` | `java-spring`, `golang`, `dotnet`, `php-laravel`, `context-engineering` |
|
|
265
|
+
| `web-frontend` | `react`, `nextjs`, `vue`, `nuxt`, `angular` |
|
|
266
|
+
| `mobile` | `flutter`, `react-native`, `ios-swiftui`, `android-compose` |
|
|
267
|
+
|
|
268
|
+
If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
|
|
269
|
+
|
|
270
|
+
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (generate-tests, debug, fix-bug, smoke-test).
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
220
274
|
## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
|
|
221
275
|
|
|
222
276
|
After loading all context, synthesize and output a compact summary block.
|
|
@@ -227,10 +281,12 @@ Output exactly this block:
|
|
|
227
281
|
```
|
|
228
282
|
[CTX LOADED]
|
|
229
283
|
Stack : {language} / {framework} / {database}
|
|
284
|
+
Platform : {active_module} ({platform_type})
|
|
230
285
|
Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
231
286
|
Ticket : {ticket_prefix}-
|
|
232
287
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
233
288
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
289
|
+
Service : {active_service} ({active_service_module}) | single-service
|
|
234
290
|
Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
235
291
|
```
|
|
236
292
|
|
|
@@ -269,6 +325,8 @@ AI scans the project and writes:
|
|
|
269
325
|
| {original} | {canonical} |
|
|
270
326
|
```
|
|
271
327
|
|
|
328
|
+
Store this terminology map in the output product-definition file under a `## Terminology Map` section — `/generate-prd` will reference it during its Terminology Rules step to ensure consistency.
|
|
329
|
+
|
|
272
330
|
---
|
|
273
331
|
|
|
274
332
|
## Phase 1 — Feature Definition *(CHECKPOINT 1)*
|
|
@@ -305,7 +363,7 @@ Confirm → write `✅ PO Confirmed: Yes` → proceed.
|
|
|
305
363
|
|
|
306
364
|
---
|
|
307
365
|
|
|
308
|
-
## Phase 3 — Clarification Log
|
|
366
|
+
## Phase 3 — Clarification Log *(CHECKPOINT 3)*
|
|
309
367
|
|
|
310
368
|
Based on Phases 1-2, AI identifies gaps and asks follow-up questions. Continue rounds until no Unresolved Items remain.
|
|
311
369
|
|
|
@@ -321,6 +379,8 @@ Based on Phases 1-2, AI identifies gaps and asks follow-up questions. Continue r
|
|
|
321
379
|
### Unresolved Items
|
|
322
380
|
- {item — or "None"}
|
|
323
381
|
|
|
382
|
+
When all Unresolved Items are resolved → write `✅ CHECKPOINT 3: No Unresolved Items` → proceed to Phase 4.
|
|
383
|
+
|
|
324
384
|
---
|
|
325
385
|
|
|
326
386
|
## Phase 4 — Business Rules *(CHECKPOINT 4)*
|
|
@@ -417,21 +477,23 @@ Suggest the logical next command based on workflow phase:
|
|
|
417
477
|
|
|
418
478
|
| Current command | Suggest next |
|
|
419
479
|
|-------------------------|-----------------------------------------------|
|
|
480
|
+
| /setup-ai-first | `/define-product` to start your first feature |
|
|
420
481
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
421
482
|
| /generate-prd | `/refine-prd {prd-file}` then `/review-context {prd-file}` |
|
|
422
483
|
| /refine-prd | Open Review Board → update PRD → `/review-context {prd-file}` |
|
|
423
|
-
| /review-context (PRD) | `/generate-
|
|
484
|
+
| /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (then BDD after sign-off); BE: `/generate-bdd {prd-file}` directly; fix PRD if NEEDS_FIX |
|
|
485
|
+
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
424
486
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
425
487
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
426
488
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
427
489
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
428
|
-
| /generate-code | `/generate-tests {UC-ID}`
|
|
490
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/generate-tests {UC-ID}` |
|
|
429
491
|
| /generate-tests | `/run-tests {UC-ID}` |
|
|
430
492
|
| /run-tests (passing) | `/review-code {UC-ID}` |
|
|
431
493
|
| /run-tests (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
432
494
|
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
433
495
|
| /smoke-test | Create PR and link to ticket |
|
|
434
|
-
| /validate-traces | `/generate-code {UC-ID}
|
|
496
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
|
|
435
497
|
| /fix-bug | Create PR and link to ticket |
|
|
436
498
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
437
499
|
|
|
@@ -25,6 +25,8 @@ AI scans the project and writes:
|
|
|
25
25
|
| {original} | {canonical} |
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
+
Store this terminology map in the output product-definition file under a `## Terminology Map` section — `/generate-prd` will reference it during its Terminology Rules step to ensure consistency.
|
|
29
|
+
|
|
28
30
|
---
|
|
29
31
|
|
|
30
32
|
## Phase 1 — Feature Definition *(CHECKPOINT 1)*
|
|
@@ -61,7 +63,7 @@ Confirm → write `✅ PO Confirmed: Yes` → proceed.
|
|
|
61
63
|
|
|
62
64
|
---
|
|
63
65
|
|
|
64
|
-
## Phase 3 — Clarification Log
|
|
66
|
+
## Phase 3 — Clarification Log *(CHECKPOINT 3)*
|
|
65
67
|
|
|
66
68
|
Based on Phases 1-2, AI identifies gaps and asks follow-up questions. Continue rounds until no Unresolved Items remain.
|
|
67
69
|
|
|
@@ -77,6 +79,8 @@ Based on Phases 1-2, AI identifies gaps and asks follow-up questions. Continue r
|
|
|
77
79
|
### Unresolved Items
|
|
78
80
|
- {item — or "None"}
|
|
79
81
|
|
|
82
|
+
When all Unresolved Items are resolved → write `✅ CHECKPOINT 3: No Unresolved Items` → proceed to Phase 4.
|
|
83
|
+
|
|
80
84
|
---
|
|
81
85
|
|
|
82
86
|
## Phase 4 — Business Rules *(CHECKPOINT 4)*
|
package/commands/fix-bug.md
CHANGED
|
@@ -31,7 +31,7 @@ Display and wait for response:
|
|
|
31
31
|
```
|
|
32
32
|
⚙️ MODEL CHECK
|
|
33
33
|
──────────────────────────────────────────────────────────────────
|
|
34
|
-
Recommended : claude-opus-4
|
|
34
|
+
Recommended : claude-opus-4 (or latest Opus model)
|
|
35
35
|
Why needed : Spec analysis, architecture review, code generation
|
|
36
36
|
require deep reasoning. Smaller models miss edge cases.
|
|
37
37
|
|
|
@@ -131,6 +131,7 @@ Read `.agent/project-context.yaml`. Extract and store:
|
|
|
131
131
|
- `paths.core_entities` → path to core-entities.md
|
|
132
132
|
- `paths.tech_docs_dir` → technical documentation root
|
|
133
133
|
- `paths.trace_dir` → trace state directory
|
|
134
|
+
- `paths.design_spec_dir` → Design Spec documents root (FE/App only)
|
|
134
135
|
|
|
135
136
|
If `paths` section is absent, use these defaults:
|
|
136
137
|
- `specs_dir` = `specs/bdd`
|
|
@@ -140,13 +141,46 @@ If `paths` section is absent, use these defaults:
|
|
|
140
141
|
- `domain_knowledge_dir` = `specs/domain-knowledge`
|
|
141
142
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
142
143
|
- `core_entities` = `specs/domain-knowledge/core-entities.md`
|
|
143
|
-
- `tech_docs_dir` = `tech-docs`
|
|
144
|
+
- `tech_docs_dir` = `specs/tech-docs`
|
|
144
145
|
- `trace_dir` = `.trace`
|
|
146
|
+
- `design_spec_dir` = `specs/design-spec`
|
|
145
147
|
|
|
146
148
|
If `tech_stack.module` is set, also load `.agent/modules/{module}/stack-profile.yaml` if it exists.
|
|
147
149
|
|
|
148
150
|
---
|
|
149
151
|
|
|
152
|
+
## Step 1.5 — [SERVICE ROUTING] Resolve service paths (umbrella mode)
|
|
153
|
+
|
|
154
|
+
*Skip this step entirely if `setup.mode` is not `"umbrella"` and `services` section is absent from project-context.yaml.*
|
|
155
|
+
|
|
156
|
+
If `services` section is present:
|
|
157
|
+
|
|
158
|
+
**1. Detect active domain** (in priority order):
|
|
159
|
+
- Read `@trace.domain` from target file frontmatter (if Gate loaded a target file)
|
|
160
|
+
- Extract from target file path: segment immediately after `prd_dir` base path
|
|
161
|
+
*(e.g., `specs/prd/user/FEAT-01.md` → domain = `user`)*
|
|
162
|
+
- If `$ARGUMENTS` contains a path, extract the segment after `prd_dir`
|
|
163
|
+
|
|
164
|
+
**2. Route to service** — if active domain matches a key in `services`:
|
|
165
|
+
- Override `paths.specs_dir` → `services.{domain}.specs_dir`
|
|
166
|
+
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
|
|
167
|
+
- Store `active_service` = `services.{domain}.path`
|
|
168
|
+
- Store `active_service_module` = `services.{domain}.module`
|
|
169
|
+
- If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
|
|
170
|
+
|
|
171
|
+
**3. Fallback** — if domain not detected or no matching service key:
|
|
172
|
+
- Keep default paths from Step 1
|
|
173
|
+
- Set `active_service = unresolved`
|
|
174
|
+
|
|
175
|
+
**4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
|
|
176
|
+
- Override `paths.prd_dir` → `{spec_source}/specs/prd`
|
|
177
|
+
- Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
|
|
178
|
+
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
179
|
+
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
180
|
+
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
150
184
|
## Step 2 — [PROJECT-CONFIG] Load module stack profile (conditional)
|
|
151
185
|
|
|
152
186
|
If `tech_stack.module` is set, read `.agent/modules/{module}/stack-profile.yaml`.
|
|
@@ -217,6 +251,26 @@ If the file does not exist → skip silently.
|
|
|
217
251
|
|
|
218
252
|
---
|
|
219
253
|
|
|
254
|
+
## Step 6.5 — [PLATFORM] Derive active_module and platform_type
|
|
255
|
+
|
|
256
|
+
Using `tech_stack.module` loaded in Step 1, derive and store two variables for use by all downstream commands:
|
|
257
|
+
|
|
258
|
+
```
|
|
259
|
+
active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
| `platform_type` | Modules |
|
|
263
|
+
|---|---|
|
|
264
|
+
| `backend` | `java-spring`, `golang`, `dotnet`, `php-laravel`, `context-engineering` |
|
|
265
|
+
| `web-frontend` | `react`, `nextjs`, `vue`, `nuxt`, `angular` |
|
|
266
|
+
| `mobile` | `flutter`, `react-native`, `ios-swiftui`, `android-compose` |
|
|
267
|
+
|
|
268
|
+
If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
|
|
269
|
+
|
|
270
|
+
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (generate-tests, debug, fix-bug, smoke-test).
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
220
274
|
## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
|
|
221
275
|
|
|
222
276
|
After loading all context, synthesize and output a compact summary block.
|
|
@@ -227,10 +281,12 @@ Output exactly this block:
|
|
|
227
281
|
```
|
|
228
282
|
[CTX LOADED]
|
|
229
283
|
Stack : {language} / {framework} / {database}
|
|
284
|
+
Platform : {active_module} ({platform_type})
|
|
230
285
|
Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
231
286
|
Ticket : {ticket_prefix}-
|
|
232
287
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
233
288
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
289
|
+
Service : {active_service} ({active_service_module}) | single-service
|
|
234
290
|
Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
235
291
|
```
|
|
236
292
|
|
|
@@ -264,17 +320,59 @@ If no ticket — CHECKPOINT:
|
|
|
264
320
|
|
|
265
321
|
## Phase 2 — Root Cause Analysis
|
|
266
322
|
|
|
323
|
+
Use `active_module` from context to select the relevant table.
|
|
324
|
+
|
|
325
|
+
### If `platform_type = backend`
|
|
326
|
+
|
|
327
|
+
#### java-spring / golang / dotnet / php-laravel
|
|
328
|
+
|
|
267
329
|
| Bug Type | Common Location | How to Check |
|
|
268
330
|
|----------|----------------|--------------|
|
|
269
331
|
| Wrong response data | Mapping layer | Check field mapping, DTO conversions |
|
|
270
|
-
| 400 Bad Request | Input validation | Check DTO constraints |
|
|
332
|
+
| 400 Bad Request | Input validation | Check DTO constraints / validators |
|
|
333
|
+
| 401 Unauthorized | Auth filter | Check token config, filter order |
|
|
271
334
|
| 403 Forbidden | Auth config | Check role-based access rules |
|
|
272
335
|
| 404 Not Found | Repository query | Check find method, ID types |
|
|
273
|
-
| N+1 Query | Data access | Check for missing JOIN FETCH |
|
|
274
|
-
| Null Pointer | Optional not handled | Check Optional.orElseThrow |
|
|
275
|
-
| Transaction rollback | Missing @Transactional | Check transaction scope |
|
|
276
|
-
| Stale cache | Missing
|
|
277
|
-
| Type mismatch
|
|
336
|
+
| N+1 Query | Data access | Check for missing JOIN FETCH / eager load |
|
|
337
|
+
| Null Pointer | Optional not handled | Check Optional.orElseThrow, null guards |
|
|
338
|
+
| Transaction rollback | Missing @Transactional | Check transaction scope, propagation |
|
|
339
|
+
| Stale cache | Missing eviction | Check cache invalidation triggers |
|
|
340
|
+
| Type mismatch | Filter / specification | Check field types in predicates |
|
|
341
|
+
|
|
342
|
+
#### context-engineering (AI/LLM pipelines)
|
|
343
|
+
|
|
344
|
+
| Bug Type | Common Location | How to Check |
|
|
345
|
+
|----------|----------------|--------------|
|
|
346
|
+
| Wrong pipeline output | Prompt template | Check prompt content; verify variables are substituted correctly |
|
|
347
|
+
| Missing context in output | Context assembly | Verify all required context blocks are included and non-empty |
|
|
348
|
+
| Schema validation failure | Output parser | Compare raw LLM output vs expected schema; add stricter output instructions |
|
|
349
|
+
| Flaky / non-deterministic results | LLM temperature | Check temperature setting; use fixed seed/mock in tests |
|
|
350
|
+
| API rate limit errors | LLM client | Implement backoff; check quota usage in provider dashboard |
|
|
351
|
+
| Token limit exceeded | Prompt assembly | Reduce context size; add chunking strategy |
|
|
352
|
+
|
|
353
|
+
### If `platform_type = web-frontend`
|
|
354
|
+
|
|
355
|
+
| Bug Type | Common Location | How to Check |
|
|
356
|
+
|----------|----------------|--------------|
|
|
357
|
+
| Wrong data displayed | State / store | Check state update logic, selector |
|
|
358
|
+
| UI not re-rendering | Missing reactive dep | Check deps array, state immutability |
|
|
359
|
+
| API data not loading | HTTP client / hook | Check network tab, error handler |
|
|
360
|
+
| 401 on API call | Auth token | Check token refresh, header injection |
|
|
361
|
+
| Form not submitting | Validation / handler | Check form state, required fields, errors |
|
|
362
|
+
| Route not found | Router config | Check route definition, lazy import |
|
|
363
|
+
| Build / type error | TypeScript types | Compare type definitions vs actual API shape |
|
|
364
|
+
|
|
365
|
+
### If `platform_type = mobile`
|
|
366
|
+
|
|
367
|
+
| Bug Type | Common Location | How to Check |
|
|
368
|
+
|----------|----------------|--------------|
|
|
369
|
+
| Screen shows stale data | State / BLoC / ViewModel | Check event dispatched, state emitted correctly |
|
|
370
|
+
| Crash on navigation | Route param missing | Check params passed, null safety |
|
|
371
|
+
| API call not firing | Repository / service layer | Add log in repo method, check network |
|
|
372
|
+
| UI not reflecting state | Widget not observing stream | Check `BlocBuilder` / `StateObserver` setup |
|
|
373
|
+
| Crash on app resume | Lifecycle handler | Check `onResume` / `viewDidAppear` logic |
|
|
374
|
+
| Auth token expired | Token refresh logic | Check refresh flow, token storage |
|
|
375
|
+
| Permission denied | OS permission | Check runtime permission request code |
|
|
278
376
|
|
|
279
377
|
CHECKPOINT — Root Cause Report:
|
|
280
378
|
```
|
|
@@ -342,21 +440,23 @@ Suggest the logical next command based on workflow phase:
|
|
|
342
440
|
|
|
343
441
|
| Current command | Suggest next |
|
|
344
442
|
|-------------------------|-----------------------------------------------|
|
|
443
|
+
| /setup-ai-first | `/define-product` to start your first feature |
|
|
345
444
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
346
445
|
| /generate-prd | `/refine-prd {prd-file}` then `/review-context {prd-file}` |
|
|
347
446
|
| /refine-prd | Open Review Board → update PRD → `/review-context {prd-file}` |
|
|
348
|
-
| /review-context (PRD) | `/generate-
|
|
447
|
+
| /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (then BDD after sign-off); BE: `/generate-bdd {prd-file}` directly; fix PRD if NEEDS_FIX |
|
|
448
|
+
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
349
449
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
350
450
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
351
451
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
352
452
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
353
|
-
| /generate-code | `/generate-tests {UC-ID}`
|
|
453
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/generate-tests {UC-ID}` |
|
|
354
454
|
| /generate-tests | `/run-tests {UC-ID}` |
|
|
355
455
|
| /run-tests (passing) | `/review-code {UC-ID}` |
|
|
356
456
|
| /run-tests (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
357
457
|
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
358
458
|
| /smoke-test | Create PR and link to ticket |
|
|
359
|
-
| /validate-traces | `/generate-code {UC-ID}
|
|
459
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
|
|
360
460
|
| /fix-bug | Create PR and link to ticket |
|
|
361
461
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
362
462
|
|
package/commands/fix-bug.tmpl
CHANGED
|
@@ -20,17 +20,59 @@ If no ticket — CHECKPOINT:
|
|
|
20
20
|
|
|
21
21
|
## Phase 2 — Root Cause Analysis
|
|
22
22
|
|
|
23
|
+
Use `active_module` from context to select the relevant table.
|
|
24
|
+
|
|
25
|
+
### If `platform_type = backend`
|
|
26
|
+
|
|
27
|
+
#### java-spring / golang / dotnet / php-laravel
|
|
28
|
+
|
|
23
29
|
| Bug Type | Common Location | How to Check |
|
|
24
30
|
|----------|----------------|--------------|
|
|
25
31
|
| Wrong response data | Mapping layer | Check field mapping, DTO conversions |
|
|
26
|
-
| 400 Bad Request | Input validation | Check DTO constraints |
|
|
32
|
+
| 400 Bad Request | Input validation | Check DTO constraints / validators |
|
|
33
|
+
| 401 Unauthorized | Auth filter | Check token config, filter order |
|
|
27
34
|
| 403 Forbidden | Auth config | Check role-based access rules |
|
|
28
35
|
| 404 Not Found | Repository query | Check find method, ID types |
|
|
29
|
-
| N+1 Query | Data access | Check for missing JOIN FETCH |
|
|
30
|
-
| Null Pointer | Optional not handled | Check Optional.orElseThrow |
|
|
31
|
-
| Transaction rollback | Missing @Transactional | Check transaction scope |
|
|
32
|
-
| Stale cache | Missing
|
|
33
|
-
| Type mismatch
|
|
36
|
+
| N+1 Query | Data access | Check for missing JOIN FETCH / eager load |
|
|
37
|
+
| Null Pointer | Optional not handled | Check Optional.orElseThrow, null guards |
|
|
38
|
+
| Transaction rollback | Missing @Transactional | Check transaction scope, propagation |
|
|
39
|
+
| Stale cache | Missing eviction | Check cache invalidation triggers |
|
|
40
|
+
| Type mismatch | Filter / specification | Check field types in predicates |
|
|
41
|
+
|
|
42
|
+
#### context-engineering (AI/LLM pipelines)
|
|
43
|
+
|
|
44
|
+
| Bug Type | Common Location | How to Check |
|
|
45
|
+
|----------|----------------|--------------|
|
|
46
|
+
| Wrong pipeline output | Prompt template | Check prompt content; verify variables are substituted correctly |
|
|
47
|
+
| Missing context in output | Context assembly | Verify all required context blocks are included and non-empty |
|
|
48
|
+
| Schema validation failure | Output parser | Compare raw LLM output vs expected schema; add stricter output instructions |
|
|
49
|
+
| Flaky / non-deterministic results | LLM temperature | Check temperature setting; use fixed seed/mock in tests |
|
|
50
|
+
| API rate limit errors | LLM client | Implement backoff; check quota usage in provider dashboard |
|
|
51
|
+
| Token limit exceeded | Prompt assembly | Reduce context size; add chunking strategy |
|
|
52
|
+
|
|
53
|
+
### If `platform_type = web-frontend`
|
|
54
|
+
|
|
55
|
+
| Bug Type | Common Location | How to Check |
|
|
56
|
+
|----------|----------------|--------------|
|
|
57
|
+
| Wrong data displayed | State / store | Check state update logic, selector |
|
|
58
|
+
| UI not re-rendering | Missing reactive dep | Check deps array, state immutability |
|
|
59
|
+
| API data not loading | HTTP client / hook | Check network tab, error handler |
|
|
60
|
+
| 401 on API call | Auth token | Check token refresh, header injection |
|
|
61
|
+
| Form not submitting | Validation / handler | Check form state, required fields, errors |
|
|
62
|
+
| Route not found | Router config | Check route definition, lazy import |
|
|
63
|
+
| Build / type error | TypeScript types | Compare type definitions vs actual API shape |
|
|
64
|
+
|
|
65
|
+
### If `platform_type = mobile`
|
|
66
|
+
|
|
67
|
+
| Bug Type | Common Location | How to Check |
|
|
68
|
+
|----------|----------------|--------------|
|
|
69
|
+
| Screen shows stale data | State / BLoC / ViewModel | Check event dispatched, state emitted correctly |
|
|
70
|
+
| Crash on navigation | Route param missing | Check params passed, null safety |
|
|
71
|
+
| API call not firing | Repository / service layer | Add log in repo method, check network |
|
|
72
|
+
| UI not reflecting state | Widget not observing stream | Check `BlocBuilder` / `StateObserver` setup |
|
|
73
|
+
| Crash on app resume | Lifecycle handler | Check `onResume` / `viewDidAppear` logic |
|
|
74
|
+
| Auth token expired | Token refresh logic | Check refresh flow, token storage |
|
|
75
|
+
| Permission denied | OS permission | Check runtime permission request code |
|
|
34
76
|
|
|
35
77
|
CHECKPOINT — Root Cause Report:
|
|
36
78
|
```
|