create-ai-project 1.23.4 → 1.23.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/.claude/agents-en/acceptance-test-generator.md +6 -30
  2. package/.claude/agents-en/code-reviewer.md +15 -24
  3. package/.claude/agents-en/code-verifier.md +3 -32
  4. package/.claude/agents-en/codebase-analyzer.md +10 -78
  5. package/.claude/agents-en/document-reviewer.md +10 -57
  6. package/.claude/agents-en/integration-test-reviewer.md +6 -37
  7. package/.claude/agents-en/investigator.md +6 -59
  8. package/.claude/agents-en/quality-fixer-frontend.md +1 -5
  9. package/.claude/agents-en/quality-fixer.md +1 -5
  10. package/.claude/agents-en/requirement-analyzer.md +3 -14
  11. package/.claude/agents-en/rule-advisor.md +3 -16
  12. package/.claude/agents-en/scope-discoverer.md +5 -29
  13. package/.claude/agents-en/security-reviewer.md +2 -13
  14. package/.claude/agents-en/skill-creator.md +3 -6
  15. package/.claude/agents-en/skill-reviewer.md +7 -43
  16. package/.claude/agents-en/solver.md +9 -24
  17. package/.claude/agents-en/task-decomposer.md +17 -0
  18. package/.claude/agents-en/task-executor-frontend.md +14 -19
  19. package/.claude/agents-en/task-executor.md +14 -19
  20. package/.claude/agents-en/ui-analyzer.md +16 -115
  21. package/.claude/agents-en/verifier.md +9 -53
  22. package/.claude/agents-ja/acceptance-test-generator.md +6 -30
  23. package/.claude/agents-ja/code-reviewer.md +15 -24
  24. package/.claude/agents-ja/code-verifier.md +3 -32
  25. package/.claude/agents-ja/codebase-analyzer.md +10 -78
  26. package/.claude/agents-ja/document-reviewer.md +10 -57
  27. package/.claude/agents-ja/integration-test-reviewer.md +6 -37
  28. package/.claude/agents-ja/investigator.md +6 -59
  29. package/.claude/agents-ja/quality-fixer-frontend.md +1 -5
  30. package/.claude/agents-ja/quality-fixer.md +1 -5
  31. package/.claude/agents-ja/requirement-analyzer.md +3 -14
  32. package/.claude/agents-ja/rule-advisor.md +3 -16
  33. package/.claude/agents-ja/scope-discoverer.md +5 -29
  34. package/.claude/agents-ja/security-reviewer.md +2 -13
  35. package/.claude/agents-ja/skill-creator.md +3 -6
  36. package/.claude/agents-ja/skill-reviewer.md +7 -43
  37. package/.claude/agents-ja/solver.md +9 -24
  38. package/.claude/agents-ja/task-decomposer.md +17 -0
  39. package/.claude/agents-ja/task-executor-frontend.md +14 -19
  40. package/.claude/agents-ja/task-executor.md +14 -19
  41. package/.claude/agents-ja/ui-analyzer.md +16 -115
  42. package/.claude/agents-ja/verifier.md +9 -53
  43. package/.claude/skills-en/documentation-criteria/references/plan-template.md +1 -1
  44. package/.claude/skills-en/documentation-criteria/references/task-template.md +8 -0
  45. package/.claude/skills-en/frontend-technical-spec/SKILL.md +4 -8
  46. package/.claude/skills-en/frontend-typescript-rules/SKILL.md +4 -2
  47. package/.claude/skills-en/frontend-typescript-testing/SKILL.md +5 -11
  48. package/.claude/skills-en/technical-spec/SKILL.md +4 -3
  49. package/.claude/skills-en/typescript-testing/SKILL.md +4 -4
  50. package/.claude/skills-ja/documentation-criteria/references/plan-template.md +1 -1
  51. package/.claude/skills-ja/documentation-criteria/references/task-template.md +8 -0
  52. package/.claude/skills-ja/frontend-technical-spec/SKILL.md +4 -8
  53. package/.claude/skills-ja/frontend-typescript-rules/SKILL.md +4 -2
  54. package/.claude/skills-ja/frontend-typescript-testing/SKILL.md +5 -11
  55. package/.claude/skills-ja/task-analyzer/references/skills-index.yaml +3 -3
  56. package/.claude/skills-ja/technical-spec/SKILL.md +4 -3
  57. package/.claude/skills-ja/typescript-testing/SKILL.md +4 -4
  58. package/CHANGELOG.md +8 -0
  59. package/package.json +1 -1
@@ -165,142 +165,43 @@ skills: frontend-typescript-rules, frontend-technical-spec, project-context
165
165
 
166
166
  ```json
167
167
  {
168
- "analysisScope": {
169
- "filesAnalyzed": ["path/to/component.tsx"],
170
- "stylesAnalyzed": ["path/to/styles.module.css"],
171
- "uiConventions": {
172
- "componentExtension": ".tsx",
173
- "styleStrategy": "css-modules|vanilla-css|css-in-js|utility-classes",
174
- "storybook": true,
175
- "testRunner": "vitest|jest|other"
176
- }
177
- },
168
+ "analysisScope": {"filesAnalyzed": ["path/to/component.tsx"], "stylesAnalyzed": ["path/to/styles.module.css"], "uiConventions": {"componentExtension": ".tsx", "styleStrategy": "css-modules|vanilla-css|css-in-js|utility-classes", "storybook": true, "testRunner": "vitest|jest|other"}},
178
169
  "externalResources": {
179
170
  "status": "fetched|partial|not_recorded",
180
- "designOrigin": {
181
- "fetch_status": "fetched|mcp_unavailable|skipped|not_applicable",
182
- "accessMethod": "MCP name | URL | file path | existing-implementation-only",
183
- "fetched_summary": "brief description of fetched content (e.g., screen names, frame ids, token snapshot)"
184
- },
185
- "designSystem": {
186
- "fetch_status": "fetched|mcp_unavailable|skipped|not_applicable",
187
- "accessMethod": "...",
188
- "fetched_summary": "components catalogued, tokens captured, anti-pattern identifiers"
189
- },
190
- "guidelines": {
191
- "fetch_status": "fetched|skipped|not_applicable",
192
- "accessMethod": "...",
193
- "fetched_summary": "rule categories captured (CSS, accessibility, i18n, etc.)"
194
- },
195
- "visualVerification": {
196
- "fetch_status": "available|mcp_unavailable|not_applicable",
197
- "accessMethod": "...",
198
- "notes": "how rendered output is verified during implementation"
199
- }
171
+ "designOrigin": {"fetch_status": "fetched|mcp_unavailable|skipped|not_applicable", "accessMethod": "MCP name | URL | file path | existing-implementation-only", "fetched_summary": "brief description of fetched content (e.g., screen names, frame ids, token snapshot)"},
172
+ "designSystem": {"fetch_status": "fetched|mcp_unavailable|skipped|not_applicable", "accessMethod": "...", "fetched_summary": "components catalogued, tokens captured, anti-pattern identifiers"},
173
+ "guidelines": {"fetch_status": "fetched|skipped|not_applicable", "accessMethod": "...", "fetched_summary": "rule categories captured (CSS, accessibility, i18n, etc.)"},
174
+ "visualVerification": {"fetch_status": "available|mcp_unavailable|not_applicable", "accessMethod": "...", "notes": "how rendered output is verified during implementation"}
200
175
  },
201
176
  "componentStructure": [
202
- {
203
- "name": "ComponentName",
204
- "filePath": "path/to/file:lineNumber",
205
- "propsInterface": "name and brief shape",
206
- "topLevelElement": "tag or component name",
207
- "domOrder": ["child1", "child2", "child3"],
208
- "conditionalBranches": [
209
- {"predicate": "condition expression", "renderedSubtree": "brief description"}
210
- ],
211
- "callSites": ["path/to/consumer:line"]
212
- }
177
+ {"name": "ComponentName", "filePath": "path/to/file:lineNumber", "propsInterface": "name and brief shape", "topLevelElement": "tag or component name", "domOrder": ["child1", "child2", "child3"], "conditionalBranches": [{"predicate": "condition expression", "renderedSubtree": "brief description"}], "callSites": ["path/to/consumer:line"]}
213
178
  ],
214
179
  "propsPatterns": [
215
- {
216
- "component": "ComponentName",
217
- "callSite": "path/to/file:line",
218
- "props": {"variant": "primary", "size": "md"},
219
- "computedProps": ["onClick (useCallback)"],
220
- "groupKey": "primary-md"
221
- }
180
+ {"component": "ComponentName", "callSite": "path/to/file:line", "props": {"variant": "primary", "size": "md"}, "computedProps": ["onClick (useCallback)"], "groupKey": "primary-md"}
222
181
  ],
223
182
  "cssLayout": [
224
- {
225
- "filePath": "path/to/styles.module.css",
226
- "classNamingConvention": "camelCase|kebab-case|BEM",
227
- "baseClass": "root",
228
- "layouts": [
229
- {
230
- "selector": ".className",
231
- "display": "flex|grid|block",
232
- "direction": "row|column|grid-template",
233
- "gap": "8px|none",
234
- "wrap": "wrap|nowrap|absent",
235
- "logicalProperties": true,
236
- "stateSelectors": ["[data-state=active]", "[aria-selected=true]"]
237
- }
238
- ],
239
- "responsiveBreakpoints": ["768px", "1024px"]
240
- }
183
+ {"filePath": "path/to/styles.module.css", "classNamingConvention": "camelCase|kebab-case|BEM", "baseClass": "root", "layouts": [{"selector": ".className", "display": "flex|grid|block", "direction": "row|column|grid-template", "gap": "8px|none", "wrap": "wrap|nowrap|absent", "logicalProperties": true, "stateSelectors": ["[data-state=active]", "[aria-selected=true]"]}], "responsiveBreakpoints": ["768px", "1024px"]}
241
184
  ],
242
185
  "stateDisplay": [
243
- {
244
- "component": "ComponentName",
245
- "states": [
246
- {"name": "loading|empty|partial|error|ready|disabled", "trigger": "what causes this state", "renders": "brief description"}
247
- ],
248
- "unsupportedStates": ["states the component does not currently express"]
249
- }
186
+ {"component": "ComponentName", "states": [{"name": "loading|empty|partial|error|ready|disabled", "trigger": "what causes this state", "renders": "brief description"}], "unsupportedStates": ["states the component does not currently express"]}
250
187
  ],
251
188
  "displayConditions": [
252
- {
253
- "component": "ComponentName",
254
- "condition": "feature_flag|role|route|region|tenant|page_context",
255
- "predicateLocation": "path/to/file:line",
256
- "predicate": "expression",
257
- "gatedSubtree": "brief description"
258
- }
189
+ {"component": "ComponentName", "condition": "feature_flag|role|route|region|tenant|page_context", "predicateLocation": "path/to/file:line", "predicate": "expression", "gatedSubtree": "brief description"}
259
190
  ],
260
- "i18n": {
261
- "format": "csv|json|code-catalog|other",
262
- "structuralConventions": {"csvColumns": 2, "trailingComma": false, "jsonNestingDepth": 1},
263
- "keyNamingConvention": "pattern with examples",
264
- "locales": ["ja-JP", "en-US"],
265
- "localeGaps": ["keys present in one locale only"],
266
- "generatedTypings": {"command": "generator command", "outputPath": "path/to/output"}
267
- },
191
+ "i18n": {"format": "csv|json|code-catalog|other", "structuralConventions": {"csvColumns": 2, "trailingComma": false, "jsonNestingDepth": 1}, "keyNamingConvention": "pattern with examples", "locales": ["ja-JP", "en-US"], "localeGaps": ["keys present in one locale only"], "generatedTypings": {"command": "generator command", "outputPath": "path/to/output"}},
268
192
  "accessibility": [
269
- {
270
- "component": "ComponentName",
271
- "ariaAttributes": ["role=button", "aria-label fed by prop accessibleName"],
272
- "keyboardHandling": "Enter and Space mapped to onClick",
273
- "focusStyling": "focus-visible outline",
274
- "testCoverage": "axe checks present|absent"
275
- }
193
+ {"component": "ComponentName", "ariaAttributes": ["role=button", "aria-label fed by prop accessibleName"], "keyboardHandling": "Enter and Space mapped to onClick", "focusStyling": "focus-visible outline", "testCoverage": "axe checks present|absent"}
276
194
  ],
277
195
  "generatedArtifacts": [
278
- {
279
- "kind": "css-module-typings|message-catalog-typings|route-typings|other",
280
- "command": "generator command",
281
- "trigger": "on *.module.css change|manual|other",
282
- "consumers": ["typecheck", "test", "build", "runtime"]
283
- }
196
+ {"kind": "css-module-typings|message-catalog-typings|route-typings|other", "command": "generator command", "trigger": "on *.module.css change|manual|other", "consumers": ["typecheck", "test", "build", "runtime"]}
284
197
  ],
285
198
  "focusAreas": [
286
- {
287
- "fact_id": "src/components/Card/Card.tsx:Card",
288
- "area": "Brief UI area name",
289
- "evidence": "componentStructure[name=Card] | cssLayout[selector=.root] | propsPatterns[groupKey=...] | externalResources.designOrigin",
290
- "factsToAddress": "Concrete UI facts the designer or implementer must respect",
291
- "risk": "What inconsistency results if these facts are omitted"
292
- }
199
+ {"fact_id": "src/components/Card/Card.tsx:Card", "area": "Brief UI area name", "evidence": "componentStructure[name=Card] | cssLayout[selector=.root] | propsPatterns[groupKey=...] | externalResources.designOrigin", "factsToAddress": "Concrete UI facts the designer or implementer must respect", "risk": "What inconsistency results if these facts are omitted"}
293
200
  ],
294
201
  "candidateWriteSet": [
295
- {
296
- "path": "src/components/Card/Card.tsx",
297
- "reasonRef": "focusAreas[fact_id=src/components/Card/Card.tsx:Card]",
298
- "confidence": "high|medium|low"
299
- }
202
+ {"path": "src/components/Card/Card.tsx", "reasonRef": "focusAreas[fact_id=src/components/Card/Card.tsx:Card]", "confidence": "high|medium|low"}
300
203
  ],
301
- "limitations": [
302
- "Areas the analysis could not reach with confidence"
303
- ]
204
+ "limitations": ["Areas the analysis could not reach with confidence"]
304
205
  }
305
206
  ```
306
207
 
@@ -61,7 +61,8 @@ skills: project-context, technical-spec, coding-standards
61
61
 
62
62
  1. **未トレースパス**: 症状が到達しうるのに調査でトレースされていないコードパスはないか(例: エラーハンドリング分岐、非同期フォーク、フォールバックパス)
63
63
  2. **未チェックノード**: トレース済みパス上でチェックされていないノードはないか
64
- 3. **追加の障害点**: 未トレースパスや未チェックノードから新たな障害が見つかった場合は記録する
64
+ 3. **隣接ケース**: 調査が `bug-fix` / `regression` / `state-change` / `boundary-change` に関わる場合(デバッグフローには Change Category フィールドが無いため、調査自体から判断する)、同一の経路・契約・永続状態・外部境界を共有し同じ障害を抱えうるケースはないか。妥当な隣接ケースをすべてトレースするか、トレースしないものは明示的に正当化する
65
+ 4. **追加の障害点**: 未トレースパス・未チェックノード・隣接ケースから新たな障害が見つかった場合は記録する
65
66
 
66
67
  目的は、調査のパスカバレッジが十分であるかを検証すること。
67
68
 
@@ -115,78 +116,33 @@ skills: project-context, technical-spec, coding-standards
115
116
  "identifiedGaps": ["未トレースパスや未チェックノード"]
116
117
  },
117
118
  "triangulationSupplements": [
118
- {
119
- "source": "追加で調査した情報源",
120
- "findings": "発見した内容",
121
- "impactOnFailurePoints": "既存の障害点への影響"
122
- }
119
+ {"source": "追加で調査した情報源", "findings": "発見した内容", "impactOnFailurePoints": "既存の障害点への影響"}
123
120
  ],
124
121
  "externalResearch": [
125
- {
126
- "query": "検索したクエリ",
127
- "source": "情報源",
128
- "findings": "発見した関連情報",
129
- "impactOnFailurePoints": "障害点への影響"
130
- }
122
+ {"query": "検索したクエリ", "source": "情報源", "findings": "発見した関連情報", "impactOnFailurePoints": "障害点への影響"}
131
123
  ],
132
124
  "coverageCheck": {
133
125
  "missingPaths": ["調査入力でトレースされていないパス"],
134
126
  "uncheckedNodes": ["トレース済みパス上の未チェックノード"],
135
127
  "additionalFailurePoints": [
136
- {
137
- "id": "AFP1",
138
- "nodeId": "ノード参照",
139
- "symptomId": "症状参照",
140
- "description": "新たに発見された障害",
141
- "checkStatus": "supported|weakened|blocked|not_reached",
142
- "evidence": [
143
- {"type": "supporting", "detail": "証拠の詳細", "source": "file:line"}
144
- ]
145
- }
128
+ {"id": "AFP1", "nodeId": "ノード参照", "symptomId": "症状参照", "description": "新たに発見された障害", "checkStatus": "supported|weakened|blocked|not_reached", "evidence": [{"type": "supporting", "detail": "証拠の詳細", "source": "file:line"}]}
146
129
  ]
147
130
  },
148
131
  "devilsAdvocateFindings": [
149
- {
150
- "targetFailurePoint": "FP1",
151
- "alternativeExplanation": "正常な動作である可能性は?",
152
- "hiddenAssumptions": ["暗黙の前提"],
153
- "potentialCounterEvidence": ["見落とされている可能性のある反証"]
154
- }
132
+ {"targetFailurePoint": "FP1", "alternativeExplanation": "正常な動作である可能性は?", "hiddenAssumptions": ["暗黙の前提"], "potentialCounterEvidence": ["見落とされている可能性のある反証"]}
155
133
  ],
156
134
  "failurePointEvaluation": [
157
- {
158
- "failurePointId": "FP1またはAFP1",
159
- "description": "障害点の記述",
160
- "originalCheckStatus": "調査入力のcheckStatus(検証段階で発見されたAFPはnull)",
161
- "finalStatus": "supported|weakened|blocked|not_reached",
162
- "statusChangeReason": "ステータスが変更された理由(変更があった場合)",
163
- "remainingUncertainty": ["残る不確実性"]
164
- }
135
+ {"failurePointId": "FP1またはAFP1", "description": "障害点の記述", "originalCheckStatus": "調査入力のcheckStatus(検証段階で発見されたAFPはnull)", "finalStatus": "supported|weakened|blocked|not_reached", "statusChangeReason": "ステータスが変更された理由(変更があった場合)", "remainingUncertainty": ["残る不確実性"]}
165
136
  ],
166
137
  "conclusion": {
167
138
  "confirmedFailurePoints": [
168
- {
169
- "failurePointId": "FP1",
170
- "description": "障害の内容",
171
- "location": "file:line",
172
- "symptomId": "S1",
173
- "symptomExplained": "この障害が観察された症状にどうつながるか",
174
- "causeCategory": "typo|logic_error|missing_constraint|design_gap|external_factor",
175
- "finalStatus": "supported|weakened",
176
- "causalChain": ["現象", "→ 直接原因", "→ 根本原因"],
177
- "impactScope": ["影響を受けるファイルパス"],
178
- "recurrenceRisk": "low|medium|high"
179
- }
139
+ {"failurePointId": "FP1", "description": "障害の内容", "location": "file:line", "symptomId": "S1", "symptomExplained": "この障害が観察された症状にどうつながるか", "causeCategory": "typo|logic_error|missing_constraint|design_gap|external_factor", "finalStatus": "supported|weakened", "causalChain": ["現象", "→ 直接原因", "→ 根本原因"], "impactScope": ["影響を受けるファイルパス"], "recurrenceRisk": "low|medium|high"}
180
140
  ],
181
141
  "refutedFailurePoints": [
182
142
  {"failurePointId": "FP2", "reason": "反証された理由"}
183
143
  ],
184
144
  "failurePointRelationships": [
185
- {
186
- "points": ["FP1", "FP3"],
187
- "relationship": "independent|dependent|same_chain",
188
- "detail": "障害点間の関係の説明"
189
- }
145
+ {"points": ["FP1", "FP3"], "relationship": "independent|dependent|same_chain", "detail": "障害点間の関係の説明"}
190
146
  ],
191
147
  "coverageAssessment": "sufficient|partial|insufficient",
192
148
  "unresolvedSymptoms": ["確認された障害点で完全に説明できない症状"],
@@ -212,7 +212,7 @@ This phase is required for ALL implementation approaches.
212
212
  - [ ] Security review: Verify security considerations from Design Doc are implemented
213
213
  - [ ] Quality checks (types, lint, format)
214
214
  - [ ] Execute all tests (including integration/E2E from test skeletons, when provided)
215
- - [ ] Coverage 70%+
215
+ - [ ] Coverage reviewed as a gap signal on critical paths (any enforced threshold per project CI config)
216
216
  - [ ] Document updates
217
217
 
218
218
  ### Quality Assurance
@@ -17,6 +17,13 @@ Metadata:
17
17
  Files to read before starting implementation (file path, with optional search hint):
18
18
  - [e.g., src/orders/checkout (processOrder function) — determined during task decomposition based on task nature]
19
19
 
20
+ ## Change Category
21
+ (Include this field only when the task is a bug fix, regression, state-change, or boundary-change — populated during task decomposition. Omit otherwise.)
22
+
23
+ `Change Category: <one or more of bug-fix, regression, state-change, boundary-change — comma-separated>`
24
+
25
+ When present, the implementation sweeps the cases sharing the same path, contract, persisted state, or external boundary for the same class of defect (see Implementation Steps Red Phase).
26
+
20
27
  ## Binding Decisions
21
28
  (Include this section when the work plan's ADR Bindings table covers this task. Omit otherwise.)
22
29
 
@@ -32,6 +39,7 @@ Each row is an ADR decision the implementation in this task must comply with.
32
39
  ## Implementation Steps (TDD: Red-Green-Refactor)
33
40
  ### 1. Red Phase
34
41
  - [ ] Read all Investigation Targets and record key observations
42
+ - [ ] (When Change Category is set) Sweep the adjacent cases sharing the same path/contract/state/boundary for the same class of defect; fold any found within scope into the failing tests
35
43
  - [ ] Review dependency deliverables (if any)
36
44
  - [ ] Verify/create contract definitions
37
45
  - [ ] Write failing tests
@@ -133,14 +133,10 @@ Quality checks are mandatory upon implementation completion:
133
133
  - `test:coverage:fresh` - Coverage measurement
134
134
  - `check:all` - Overall integrated check
135
135
 
136
- ### Coverage Requirements
137
- - **Mandatory**: Unit test coverage must be 60% or higher
138
- - **Component-specific targets**:
139
- - Atoms: 70% or higher
140
- - Molecules: 65% or higher
141
- - Organisms: 60% or higher
142
- - Custom Hooks: 65% or higher
143
- - Utils: 70% or higher
136
+ ### Coverage
137
+ - Treat coverage as a diagnostic signal for finding untested areas, not a target (a target gets gamed into trivial tests — Goodhart's Law)
138
+ - Concentrate test rigor on foundational, high-reuse units (shared components, custom hooks, utils) whose regression has the widest blast radius; higher-composition surfaces (organisms, pages) lean on integration/E2E coverage instead
139
+ - Any enforced numeric threshold is the project's CI/coverage config, not a goal in itself
144
140
 
145
141
  ### Non-functional Requirements
146
142
  - **Browser Compatibility**: Chrome/Firefox/Safari/Edge (latest 2 versions)
@@ -34,6 +34,7 @@ const user = raw // narrowed to User
34
34
  - **Custom hooks** are the unit of logic reuse and dependency injection (inject collaborators through the hook for testability).
35
35
  - **Function parameters:** 0-2 positional; for 3+ take a single options object.
36
36
  - **State shape:** type state explicitly; for multi-field state with discrete transitions, use `useReducer` with a discriminated-union action type rather than many `useState` calls.
37
+ - **Server/Client boundary** (RSC frameworks only — e.g. Next.js App Router): default to server components for data fetching/rendering and isolate interactivity behind a `"use client"` boundary at the smallest scope that needs it; keep browser-only APIs (`window`, `localStorage`, event handlers) inside client components, since calling them in a server component breaks the render. N/A for client-only SPAs (e.g. Vite) — skip when the project has no server-component runtime.
37
38
 
38
39
  ## Error Handling
39
40
  - Surface every error: log and handle, or propagate — never swallow.
@@ -41,6 +42,7 @@ const user = raw // narrowed to User
41
42
  - Represent expected failures as values with a `Result` type; reserve `throw` for unexpected/unrecoverable cases.
42
43
  - Use purpose-specific error classes extending a base `AppError` carrying a `code` (e.g. ValidationError, ApiError, NotFoundError).
43
44
  - **Layer responsibilities:** the API layer converts transport errors into domain errors; hooks propagate `AppError` upward; an Error Boundary catches render-time errors and shows fallback UI.
45
+ - **Effect race/cleanup:** guard `useEffect` data fetches against out-of-order responses and post-unmount state updates — abort or ignore stale results (`AbortController` or a mounted flag), or use a server-state library (React Query/SWR) that cancels and dedupes. `try-catch` alone does not cover this.
44
46
  - Never log secrets (password, token, apiKey, creditCard).
45
47
 
46
48
  ```typescript
@@ -63,8 +65,8 @@ class ErrorBoundary extends React.Component<{ children: React.ReactNode; fallbac
63
65
  ```
64
66
 
65
67
  ## Project Conventions
66
- - **Environment variables:** read through the build tool's env system (`process.env` is absent in the browser). Keep all secrets server-side — frontend code ships to the client.
67
- - **Bundle & performance:** monitor with the `build` script, keep under 500KB; memoize expensive components (`React.memo`); code-split with `React.lazy` + `Suspense`; structure state to minimize re-renders.
68
+ - **Environment variables:** read client-side env through the bundler's exposed accessor — only vars carrying its public prefix reach the browser; an unprefixed var is `undefined` there. Match the project's bundler: Vite `import.meta.env.VITE_*`, Next.js public `process.env.NEXT_PUBLIC_*`, CRA `process.env.REACT_APP_*`. Keep all secrets server-side — frontend code ships to the client.
69
+ - **Bundle & performance:** monitor bundle size with the `build` script against the project's budget; code-split with `React.lazy` + `Suspense`; structure state to minimize re-renders. Memoization: when React Compiler is enabled, rely on it; reach for manual `React.memo`/`useMemo`/`useCallback` only as a profiler- or identity-justified escape hatch (a measured bottleneck, or stable reference identity for third-party APIs / effect dependencies).
68
70
  - **Naming:** components/types `PascalCase`; variables/functions `camelCase`; hooks `use`-prefixed; constants `SCREAMING_SNAKE_CASE`.
69
71
  - **Imports:** absolute paths from `src/`; order: React → external libs → internal (absolute) → internal (relative) → type-only → styles/assets.
70
72
  - **Formatting:** follow Biome (semicolons and style come from project config).
@@ -24,21 +24,15 @@ description: Designs tests with React Testing Library, MSW, and Playwright E2E.
24
24
  ## Basic Testing Policy
25
25
 
26
26
  ### Quality Requirements
27
- - **Coverage**: Unit test coverage must be 60% or higher (Frontend standard 2025)
27
+ - **Coverage**: prioritize meaningful assertions on critical paths and high-reuse components; treat coverage as a signal for gaps, not a target (a target gets gamed into trivial tests — Goodhart's Law). Any numeric threshold is the project's CI config
28
28
  - **Independence**: Each test can run independently without depending on other tests
29
29
  - **Reproducibility**: Tests are environment-independent and always return the same results
30
30
  - **Readability**: Test code maintains the same quality as production code
31
31
 
32
- ### Coverage Requirements (ADR-0002 Compliant)
33
- **Mandatory**: Unit test coverage must be 60% or higher
34
- **Component-specific targets**:
35
- - Atoms (Button, Text, etc.): 70% or higher
36
- - Molecules (FormField, etc.): 65% or higher
37
- - Organisms (Header, Footer, etc.): 60% or higher
38
- - Custom Hooks: 65% or higher
39
- - Utils: 70% or higher
32
+ ### Where to concentrate test rigor
33
+ Test foundational, high-reuse units the hardest — shared components, custom hooks, and utils reused across many features carry the widest blast radius. Higher-composition surfaces (organisms, pages) lean on integration/E2E coverage instead. Any numeric threshold is the project's CI config.
40
34
 
41
- **Metrics**: Statements, Branches, Functions, Lines
35
+ **Metrics** (what coverage reports break down): Statements, Branches, Functions, Lines
42
36
 
43
37
  ### Test Types and Scope
44
38
  1. **Unit Tests (React Testing Library)**
@@ -74,7 +68,7 @@ src/
74
68
 
75
69
  **Rationale**:
76
70
  - React Testing Library best practice
77
- - ADR-0002 Co-location principle
71
+ - Co-location principle: tests live alongside the implementation they cover
78
72
  - Easy to find and maintain tests alongside implementation
79
73
 
80
74
  ### Naming Conventions
@@ -92,6 +92,7 @@ Quality checks are mandatory upon implementation completion:
92
92
  - **Cache issues**: Run the `test:coverage:fresh` script
93
93
  - **Dependency errors**: Clean reinstall dependencies
94
94
 
95
- ### Coverage Requirements
96
- - **MANDATORY**: Unit test coverage MUST be 70% or higher
97
- - **Metrics**: Statements, Branches, Functions, Lines
95
+ ### Coverage
96
+ - Treat coverage as a diagnostic signal for finding untested areas, not a target (a target gets gamed into trivial tests — Goodhart's Law). Concentrate tests on critical paths and business logic whose regression would matter
97
+ - Any enforced numeric threshold is the project's CI/coverage config, not a goal in itself
98
+ - **Metrics** (what coverage reports break down): Statements, Branches, Functions, Lines
@@ -14,14 +14,14 @@ description: Applies Vitest test design and quality standards. Provides coverage
14
14
  ## Basic Testing Policy
15
15
 
16
16
  ### Quality Requirements
17
- - **Coverage**: Unit test coverage must be 70% or higher
17
+ - **Coverage**: treat coverage as a diagnostic signal for finding untested areas, not a target (a target gets gamed into trivial tests — Goodhart's Law). Concentrate tests on critical paths, business logic, and behavior whose regression would matter. Any numeric threshold is the project's CI config
18
18
  - **Independence**: Each test can run independently without depending on other tests
19
19
  - **Reproducibility**: Tests are environment-independent and always return the same results
20
20
  - **Readability**: Test code maintains the same quality as production code
21
21
 
22
- ### Coverage Requirements
23
- **Mandatory**: Unit test coverage must be 70% or higher
24
- **Metrics**: Statements, Branches, Functions, Lines
22
+ ### Coverage
23
+ - Prioritize meaningful assertions over the coverage number; raise coverage where a gap leaves a real regression unguarded, not to hit a percentage
24
+ - **Metrics** (what coverage reports break down): Statements, Branches, Functions, Lines
25
25
 
26
26
  ### Test Types and Scope
27
27
  1. **Unit Tests**
@@ -212,7 +212,7 @@ Design Docの実装アプローチに基づいてフェーズ構成をひとつ
212
212
  - [ ] セキュリティレビュー: Design Docのセキュリティ考慮事項が実装されていることを確認
213
213
  - [ ] 品質チェック(型、lint、format)
214
214
  - [ ] 全テスト実行(テストスケルトン提供時は統合/E2Eテスト含む)
215
- - [ ] カバレッジ70%以上
215
+ - [ ] クリティカルパスのギャップシグナルとしてカバレッジを確認(強制しきい値はプロジェクトの CI 設定に従う)
216
216
  - [ ] ドキュメント更新
217
217
 
218
218
  ### 品質保証
@@ -17,6 +17,13 @@ Metadata:
17
17
  実装開始前に読むべきファイル(ファイルパス、任意でサーチヒント付き):
18
18
  - [例: src/orders/checkout (processOrder関数) — タスクの性質に基づきタスク分解時に決定]
19
19
 
20
+ ## Change Category
21
+ (タスクがバグ修正・リグレッション・状態変更・境界変更の場合のみ本フィールドを記載する — タスク分解時に設定。それ以外は省略する。)
22
+
23
+ `Change Category: <bug-fix, regression, state-change, boundary-change のうち該当するものをカンマ区切りで>`
24
+
25
+ 記載がある場合、実装は同一の経路・契約・永続状態・外部境界を共有するケースを、同一クラスの欠陥について走査する(Implementation Steps の Red Phase 参照)。
26
+
20
27
  ## Binding Decisions
21
28
  (作業計画書のADR Bindings表がこのタスクをカバーする場合に本セクションを記載する。それ以外は省略する。)
22
29
 
@@ -32,6 +39,7 @@ Metadata:
32
39
  ## Implementation Steps (TDD: Red-Green-Refactor)
33
40
  ### 1. Red Phase
34
41
  - [ ] 全ての Investigation Targets を読み、主要な所見を記録
42
+ - [ ] (Change Category が設定されている場合)同一の経路/契約/状態/境界を共有する隣接ケースを同一クラスの欠陥について走査し、スコープ内で見つかったものを失敗するテストに取り込む
35
43
  - [ ] Dependencies の成果物を確認(ある場合)
36
44
  - [ ] 契約定義を確認・作成
37
45
  - [ ] 失敗するテストを書く
@@ -133,14 +133,10 @@ package.jsonの`packageManager`フィールドに応じた実行コマンドを
133
133
  - `test:coverage:fresh` - カバレッジ測定
134
134
  - `check:all` - 全体統合チェック
135
135
 
136
- ### カバレッジ要件
137
- - **必須**: 単体テストのカバレッジは60%以上
138
- - **コンポーネント別目標**:
139
- - Atoms: 70%以上
140
- - Molecules: 65%以上
141
- - Organisms: 60%以上
142
- - Custom Hooks: 65%以上
143
- - Utils: 70%以上
136
+ ### カバレッジ
137
+ - カバレッジは目標ではなく未テスト領域を見つける診断シグナルとして扱う(目標化すると自明なテストに歪む — グッドハートの法則)
138
+ - 基盤的で再利用度の高いユニット(共有コンポーネント、カスタムフック、utils)にテストの重点を置く — リグレッション時の影響範囲が最も広い。合成度の高い面(organisms、ページ)は統合/E2Eのカバレッジに委ねる
139
+ - 強制する数値しきい値はプロジェクトの CI / カバレッジ設定であり、それ自体が目的ではない
144
140
 
145
141
  ### 非機能要件
146
142
  - **ブラウザ互換性**: Chrome/Firefox/Safari/Edge(最新2バージョン)
@@ -34,6 +34,7 @@ const user = raw // User に絞り込み済み
34
34
  - **Custom hook** をロジック再利用と依存注入の単位とする(テスト容易性のため、協調オブジェクトは hook 経由で注入する)。
35
35
  - **関数引数:** 位置引数は 0〜2 個。3 個以上は単一の options オブジェクトで受ける。
36
36
  - **状態の形:** 状態は明示的に型付けする。複数フィールドかつ離散的な遷移を持つ状態は、複数の `useState` ではなく discriminated union の action 型を用いた `useReducer` にする。
37
+ - **Server/Client 境界**(RSC フレームワークのみ — 例: Next.js App Router): データ取得とレンダリングは既定でサーバーコンポーネントに置き、インタラクティブ性は必要最小のスコープで `"use client"` 境界の内側に隔離する。ブラウザ専用 API(`window`、`localStorage`、イベントハンドラ)はクライアントコンポーネント内に留める — サーバーコンポーネントで呼ぶとレンダリングが壊れる。クライアントのみの SPA(例: Vite)では N/A — サーバーコンポーネントランタイムが無いプロジェクトではスキップする。
37
38
 
38
39
  ## エラーハンドリング
39
40
  - すべてのエラーを表に出す: ログして処理するか伝播する — 握り潰さない。
@@ -41,6 +42,7 @@ const user = raw // User に絞り込み済み
41
42
  - 想定内の失敗は `Result` 型で値として表現する。`throw` は想定外/回復不能なケースに限る。
42
43
  - 目的別のエラークラスは `code` を持つ基底 `AppError` を継承する(例: ValidationError, ApiError, NotFoundError)。
43
44
  - **層の責務:** API 層は transport エラーをドメインエラーへ変換する。hook は `AppError` を上位へ伝播する。Error Boundary はレンダリング時のエラーを捕捉しフォールバック UI を表示する。
45
+ - **Effect の競合/クリーンアップ:** `useEffect` 内のデータ取得は、順序が入れ替わった応答とアンマウント後の状態更新に対してガードする — `AbortController` か mounted フラグで stale な結果を中断・無視するか、キャンセルと重複排除を行うサーバー状態ライブラリ(React Query/SWR)を使う。`try-catch` だけではこれをカバーできない。
44
46
  - 機微情報(password, token, apiKey, creditCard)をログに出さない。
45
47
 
46
48
  ```typescript
@@ -63,8 +65,8 @@ class ErrorBoundary extends React.Component<{ children: React.ReactNode; fallbac
63
65
  ```
64
66
 
65
67
  ## プロジェクト規約
66
- - **環境変数:** ビルドツールの環境変数システム経由で読む(ブラウザに `process.env` は存在しない)。秘密情報はすべてサーバーサイドに置く — フロントエンドのコードはクライアントに配信される。
67
- - **バンドルとパフォーマンス:** `build` スクリプトで監視し 500KB 未満に保つ。高コストなコンポーネントは `React.memo` でメモ化する。`React.lazy` + `Suspense` でコード分割する。再レンダリングを最小化する状態構造にする。
68
+ - **環境変数:** クライアント側の環境変数はバンドラが公開するアクセサ経由で読む — 公開プレフィックスを持つ変数だけがブラウザに届き、プレフィックスの無い変数はブラウザでは `undefined` になる。プロジェクトのバンドラに合わせる: Vite は `import.meta.env.VITE_*`、Next.js の公開変数は `process.env.NEXT_PUBLIC_*`、CRA は `process.env.REACT_APP_*`。秘密情報はすべてサーバーサイドに置く — フロントエンドのコードはクライアントに配信される。
69
+ - **バンドルとパフォーマンス:** バンドルサイズは `build` スクリプトでプロジェクトの予算に対して監視する。`React.lazy` + `Suspense` でコード分割する。再レンダリングを最小化する状態構造にする。メモ化: React Compiler が有効なときはそれに任せる。手動の `React.memo`/`useMemo`/`useCallback` は、プロファイラまたは参照同一性で正当化される逃げ道としてのみ用いる(実測されたボトルネック、またはサードパーティ API effect 依存に対する安定した参照同一性)。
68
70
  - **命名:** コンポーネント/型は `PascalCase`、変数/関数は `camelCase`、hook は `use` 接頭辞、定数は `SCREAMING_SNAKE_CASE`。
69
71
  - **インポート:** `src/` からの絶対パス。順序: React → 外部ライブラリ → 内部(絶対)→ 内部(相対)→ 型のみ → スタイル/アセット。
70
72
  - **フォーマット:** Biome に従う(セミコロンやスタイルはプロジェクト設定に従う)。
@@ -24,21 +24,15 @@ description: React Testing Library、MSW、Playwright E2Eでテストを設計
24
24
  ## テストの基本方針
25
25
 
26
26
  ### 品質要件
27
- - **カバレッジ**: 単体テストのカバレッジは60%以上を必須(フロントエンド標準 2025)
27
+ - **カバレッジ**: クリティカルパスと高再利用コンポーネントに対する意味のあるアサーションを優先する。カバレッジは目標ではなくギャップ検出のシグナルとして扱う(目標化すると自明なテストに歪む — グッドハートの法則)。数値しきい値はプロジェクトの CI 設定に委ねる
28
28
  - **独立性**: 各テストは他のテストに依存せず実行可能
29
29
  - **再現性**: テストは環境に依存せず、常に同じ結果を返す
30
30
  - **可読性**: テストコードも製品コードと同様の品質を維持
31
31
 
32
- ### カバレッジ要件
33
- **必須**: 単体テストのカバレッジは60%以上
34
- **コンポーネント別目標**:
35
- - Atoms(Button、Text等): 70%以上
36
- - Molecules(FormField等): 65%以上
37
- - Organisms(Header、Footer等): 60%以上
38
- - Custom Hooks: 65%以上
39
- - Utils: 70%以上
32
+ ### テストの重点配分
33
+ 基盤的で再利用度の高いユニット(共有コンポーネント、カスタムフック、utils)を最も厚くテストする — 多くの機能から再利用されるものほど、リグレッション時の影響範囲が広い。合成度の高い面(organisms、ページ)は統合/E2Eのカバレッジに委ねる。数値しきい値はプロジェクトの CI 設定に委ねる。
40
34
 
41
- **指標**: Statements(文)、Branches(分岐)、Functions(関数)、Lines(行)
35
+ **指標**(カバレッジレポートの内訳): Statements(文)、Branches(分岐)、Functions(関数)、Lines(行)
42
36
 
43
37
  ### テストの種類と範囲
44
38
  1. **単体テスト(React Testing Library)**
@@ -74,7 +68,7 @@ src/
74
68
 
75
69
  **理由**:
76
70
  - React Testing Libraryのベストプラクティス
77
- - ADR-0002 Co-location原則
71
+ - Co-location原則: テストはそれがカバーする実装と同じ場所に置く
78
72
  - 実装と一緒にテストを見つけやすく、保守しやすい
79
73
 
80
74
  ### 命名規則
@@ -51,7 +51,7 @@ skills:
51
51
  typescript-testing:
52
52
  skill: "typescript-testing"
53
53
  tags: [quality, testing, coverage, vitest, backend, implementation]
54
- typical-use: "バックエンドテスト作成、Vitest設定、70%カバレッジ要件、テスト品質基準"
54
+ typical-use: "バックエンドテスト作成、Vitest設定、カバレッジ方針、テスト品質基準"
55
55
  size: small
56
56
  key-references:
57
57
  - "Vitest公式ドキュメント"
@@ -200,12 +200,12 @@ skills:
200
200
  frontend-typescript-testing:
201
201
  skill: "frontend-typescript-testing"
202
202
  tags: [frontend, react, quality, testing, coverage, vitest, react-testing-library, msw, component-testing, implementation, playwright, e2e]
203
- typical-use: "Reactコンポーネントのテスト作成、React Testing Library、MSW、60%カバレッジ要件、Co-location、Playwright E2Eテスト"
203
+ typical-use: "Reactコンポーネントのテスト作成、React Testing Library、MSW、カバレッジ方針、Co-location、Playwright E2Eテスト"
204
204
  size: small
205
205
  key-references:
206
206
  - "React Testing Library - Kent C. Dodds"
207
207
  - "MSW (Mock Service Worker) - API Mocking"
208
- - "ADR-0002 Co-location原則"
208
+ - "Co-location原則"
209
209
  - "references/e2e.md - Playwright E2Eパターン"
210
210
  sections:
211
211
  - "参照"
@@ -92,6 +92,7 @@ package.jsonの`packageManager`フィールドに応じた実行コマンドを
92
92
  - **キャッシュ問題**: `test:coverage:fresh` スクリプトを実行
93
93
  - **依存関係エラー**: 依存関係のクリーンインストールを実行
94
94
 
95
- ### カバレッジ要件
96
- - **必須**: ユニットテストカバレッジは70%以上
97
- - **メトリクス**: Statements、Branches、Functions、Lines
95
+ ### カバレッジ
96
+ - カバレッジは目標ではなく未テスト領域を見つける診断シグナルとして扱う(目標化すると自明なテストに歪む — グッドハートの法則)。クリティカルパスとビジネスロジックなど、リグレッションが問題になる箇所にテストを集中させる
97
+ - 強制する数値しきい値はプロジェクトの CI / カバレッジ設定であり、それ自体が目的ではない
98
+ - **メトリクス**(カバレッジレポートの内訳): Statements、Branches、Functions、Lines
@@ -14,14 +14,14 @@ description: Vitestテスト設計と品質基準を適用。カバレッジ要
14
14
  ## テストの基本方針
15
15
 
16
16
  ### 品質要件
17
- - **カバレッジ**: 単体テストのカバレッジは70%以上を必須
17
+ - **カバレッジ**: カバレッジは目標ではなく未テスト領域を見つける診断シグナルとして扱う(目標化すると自明なテストに歪む — グッドハートの法則)。クリティカルパス・ビジネスロジック・リグレッションが問題になる振る舞いにテストを集中させる。数値しきい値はプロジェクトの CI 設定に委ねる
18
18
  - **独立性**: 各テストは他のテストに依存せず実行可能
19
19
  - **再現性**: テストは環境に依存せず、常に同じ結果を返す
20
20
  - **可読性**: テストコードも製品コードと同様の品質を維持
21
21
 
22
- ### カバレッジ要件
23
- **必須**: 単体テストのカバレッジは70%以上
24
- **指標**: Statements(文)、Branches(分岐)、Functions(関数)、Lines(行)
22
+ ### カバレッジ
23
+ - カバレッジ数値よりも意味のあるアサーションを優先する。パーセンテージ達成のためではなく、ギャップが実際のリグレッションを無防備にしている箇所でカバレッジを上げる
24
+ - **指標**(カバレッジレポートの内訳): Statements(文)、Branches(分岐)、Functions(関数)、Lines(行)
25
25
 
26
26
  ### テストの種類と範囲
27
27
  1. **単体テスト(Unit Tests)**
package/CHANGELOG.md CHANGED
@@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.23.5] - 2026-06-14
9
+
10
+ ### Changed
11
+
12
+ - **Adjacent-case sweep** (agents, skills) — bug-fix / regression / state-change / boundary-change tasks carry a `Change Category` that drives a scoped sweep of sibling cases sharing the change's path, contract, state, or boundary: `task-decomposer` extends Investigation Targets, `task-executor` / `-frontend` fold in-scope residuals into tests and escalate confirmed out-of-scope siblings, `code-reviewer` adds an `adjacent_residual` finding (with optional `taskFiles` input and a self-classification fallback), and `verifier` / `solver` trace adjacent cases. Applied across en/ja.
13
+ - **Frontend rules modernization** (skills) — `frontend-typescript-rules` adopts bundler-agnostic env access (Vite / Next.js / CRA prefixes), React Compiler-aware memoization, a `useEffect` race/cleanup guard, RSC Server/Client boundary guidance, and a project-defined bundle budget in place of a fixed size.
14
+ - **Coverage reframed as a signal** (agents, skills) — coverage is a diagnostic signal rather than a target (Goodhart's Law), with any threshold deferred to the project's CI config; removed an invented standard label and a dangling ADR reference across the testing/spec skills.
15
+
8
16
  ## [1.23.4] - 2026-06-09
9
17
 
10
18
  ### Changed