create-ai-project 1.23.3 → 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.
- package/.claude/agents-en/acceptance-test-generator.md +8 -31
- package/.claude/agents-en/code-reviewer.md +15 -24
- package/.claude/agents-en/code-verifier.md +3 -32
- package/.claude/agents-en/codebase-analyzer.md +10 -78
- package/.claude/agents-en/document-reviewer.md +10 -57
- package/.claude/agents-en/integration-test-reviewer.md +6 -37
- package/.claude/agents-en/investigator.md +6 -59
- package/.claude/agents-en/quality-fixer-frontend.md +4 -8
- package/.claude/agents-en/quality-fixer.md +4 -8
- package/.claude/agents-en/requirement-analyzer.md +3 -14
- package/.claude/agents-en/rule-advisor.md +3 -16
- package/.claude/agents-en/scope-discoverer.md +5 -29
- package/.claude/agents-en/security-reviewer.md +2 -13
- package/.claude/agents-en/skill-creator.md +3 -6
- package/.claude/agents-en/skill-reviewer.md +7 -43
- package/.claude/agents-en/solver.md +9 -24
- package/.claude/agents-en/task-decomposer.md +19 -1
- package/.claude/agents-en/task-executor-frontend.md +15 -20
- package/.claude/agents-en/task-executor.md +15 -20
- package/.claude/agents-en/ui-analyzer.md +16 -115
- package/.claude/agents-en/verifier.md +9 -53
- package/.claude/agents-en/work-planner.md +2 -5
- package/.claude/agents-ja/acceptance-test-generator.md +8 -31
- package/.claude/agents-ja/code-reviewer.md +15 -24
- package/.claude/agents-ja/code-verifier.md +3 -32
- package/.claude/agents-ja/codebase-analyzer.md +10 -78
- package/.claude/agents-ja/document-reviewer.md +10 -57
- package/.claude/agents-ja/integration-test-reviewer.md +6 -37
- package/.claude/agents-ja/investigator.md +6 -59
- package/.claude/agents-ja/quality-fixer-frontend.md +4 -8
- package/.claude/agents-ja/quality-fixer.md +4 -8
- package/.claude/agents-ja/requirement-analyzer.md +3 -14
- package/.claude/agents-ja/rule-advisor.md +3 -16
- package/.claude/agents-ja/scope-discoverer.md +5 -29
- package/.claude/agents-ja/security-reviewer.md +2 -13
- package/.claude/agents-ja/skill-creator.md +3 -6
- package/.claude/agents-ja/skill-reviewer.md +7 -43
- package/.claude/agents-ja/solver.md +9 -24
- package/.claude/agents-ja/task-decomposer.md +19 -1
- package/.claude/agents-ja/task-executor-frontend.md +15 -20
- package/.claude/agents-ja/task-executor.md +15 -20
- package/.claude/agents-ja/ui-analyzer.md +16 -115
- package/.claude/agents-ja/verifier.md +9 -53
- package/.claude/agents-ja/work-planner.md +2 -5
- package/.claude/commands-en/build.md +6 -15
- package/.claude/commands-en/front-build.md +4 -13
- package/.claude/commands-en/implement.md +2 -15
- package/.claude/commands-en/plan.md +7 -2
- package/.claude/commands-en/prepare-implementation.md +7 -17
- package/.claude/commands-en/sync-skills.md +3 -3
- package/.claude/commands-ja/build.md +7 -16
- package/.claude/commands-ja/front-build.md +4 -13
- package/.claude/commands-ja/implement.md +2 -15
- package/.claude/commands-ja/plan.md +6 -1
- package/.claude/commands-ja/prepare-implementation.md +8 -18
- package/.claude/commands-ja/sync-skills.md +3 -3
- package/.claude/skills-en/documentation-criteria/references/plan-template.md +1 -3
- package/.claude/skills-en/documentation-criteria/references/task-template.md +8 -0
- package/.claude/skills-en/frontend-technical-spec/SKILL.md +4 -8
- package/.claude/skills-en/frontend-typescript-rules/SKILL.md +4 -2
- package/.claude/skills-en/frontend-typescript-testing/SKILL.md +5 -11
- package/.claude/skills-en/integration-e2e-testing/SKILL.md +2 -0
- package/.claude/skills-en/subagents-orchestration-guide/SKILL.md +2 -7
- package/.claude/skills-en/technical-spec/SKILL.md +4 -3
- package/.claude/skills-en/typescript-testing/SKILL.md +4 -4
- package/.claude/skills-ja/documentation-criteria/references/plan-template.md +1 -3
- package/.claude/skills-ja/documentation-criteria/references/task-template.md +8 -0
- package/.claude/skills-ja/frontend-technical-spec/SKILL.md +4 -8
- package/.claude/skills-ja/frontend-typescript-rules/SKILL.md +4 -2
- package/.claude/skills-ja/frontend-typescript-testing/SKILL.md +5 -11
- package/.claude/skills-ja/integration-e2e-testing/SKILL.md +2 -0
- package/.claude/skills-ja/subagents-orchestration-guide/SKILL.md +2 -7
- package/.claude/skills-ja/task-analyzer/references/skills-index.yaml +3 -3
- package/.claude/skills-ja/technical-spec/SKILL.md +4 -3
- package/.claude/skills-ja/typescript-testing/SKILL.md +4 -4
- package/CHANGELOG.md +16 -0
- package/package.json +1 -1
|
@@ -165,142 +165,43 @@ Produce `candidateWriteSet[]` listing the files most likely to require modificat
|
|
|
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
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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 @@ Check the input `pathMap` for completeness:
|
|
|
61
61
|
|
|
62
62
|
1. **Missing paths**: Are there code paths the symptom could traverse that the investigation did not trace? (e.g., error handling branches, async forks, fallback paths)
|
|
63
63
|
2. **Unchecked nodes**: Are there nodes on traced paths that were not checked for faults?
|
|
64
|
-
3. **
|
|
64
|
+
3. **Adjacent cases**: When the investigation concerns a `bug-fix`, `regression`, `state-change`, or `boundary-change` (the debugging flow carries no Change Category field, so judge these from the investigation itself), are there cases sharing the same path, contract, persisted state, or external boundary that could carry the same fault? Trace all plausible adjacent cases, or explicitly justify any left untraced
|
|
65
|
+
4. **Additional failure points**: If missing paths, unchecked nodes, or adjacent cases reveal new faults, record them
|
|
65
66
|
|
|
66
67
|
The goal is to verify that the investigation's path coverage is sufficient.
|
|
67
68
|
|
|
@@ -115,78 +116,33 @@ Final message: exactly one JSON object matching the schema below (begins with `{
|
|
|
115
116
|
"identifiedGaps": ["Missing paths or unchecked nodes"]
|
|
116
117
|
},
|
|
117
118
|
"triangulationSupplements": [
|
|
118
|
-
{
|
|
119
|
-
"source": "Additional information source investigated",
|
|
120
|
-
"findings": "Content discovered",
|
|
121
|
-
"impactOnFailurePoints": "Impact on existing failure points"
|
|
122
|
-
}
|
|
119
|
+
{"source": "Additional information source investigated", "findings": "Content discovered", "impactOnFailurePoints": "Impact on existing failure points"}
|
|
123
120
|
],
|
|
124
121
|
"externalResearch": [
|
|
125
|
-
{
|
|
126
|
-
"query": "Search query used",
|
|
127
|
-
"source": "Information source",
|
|
128
|
-
"findings": "Related information discovered",
|
|
129
|
-
"impactOnFailurePoints": "Impact on failure points"
|
|
130
|
-
}
|
|
122
|
+
{"query": "Search query used", "source": "Information source", "findings": "Related information discovered", "impactOnFailurePoints": "Impact on failure points"}
|
|
131
123
|
],
|
|
132
124
|
"coverageCheck": {
|
|
133
125
|
"missingPaths": ["Paths not traced in the investigation input"],
|
|
134
126
|
"uncheckedNodes": ["Nodes on traced paths that were not checked"],
|
|
135
127
|
"additionalFailurePoints": [
|
|
136
|
-
{
|
|
137
|
-
"id": "AFP1",
|
|
138
|
-
"nodeId": "Node reference",
|
|
139
|
-
"symptomId": "Symptom reference",
|
|
140
|
-
"description": "Newly discovered fault",
|
|
141
|
-
"checkStatus": "supported|weakened|blocked|not_reached",
|
|
142
|
-
"evidence": [
|
|
143
|
-
{"type": "supporting", "detail": "Evidence detail", "source": "file:line"}
|
|
144
|
-
]
|
|
145
|
-
}
|
|
128
|
+
{"id": "AFP1", "nodeId": "Node reference", "symptomId": "Symptom reference", "description": "Newly discovered fault", "checkStatus": "supported|weakened|blocked|not_reached", "evidence": [{"type": "supporting", "detail": "Evidence detail", "source": "file:line"}]}
|
|
146
129
|
]
|
|
147
130
|
},
|
|
148
131
|
"devilsAdvocateFindings": [
|
|
149
|
-
{
|
|
150
|
-
"targetFailurePoint": "FP1",
|
|
151
|
-
"alternativeExplanation": "Could this be correct behavior?",
|
|
152
|
-
"hiddenAssumptions": ["Implicit assumptions"],
|
|
153
|
-
"potentialCounterEvidence": ["Potentially overlooked counter-evidence"]
|
|
154
|
-
}
|
|
132
|
+
{"targetFailurePoint": "FP1", "alternativeExplanation": "Could this be correct behavior?", "hiddenAssumptions": ["Implicit assumptions"], "potentialCounterEvidence": ["Potentially overlooked counter-evidence"]}
|
|
155
133
|
],
|
|
156
134
|
"failurePointEvaluation": [
|
|
157
|
-
{
|
|
158
|
-
"failurePointId": "FP1 or AFP1",
|
|
159
|
-
"description": "Failure point description",
|
|
160
|
-
"originalCheckStatus": "checkStatus from the investigation input (null when the AFP is discovered during verification)",
|
|
161
|
-
"finalStatus": "supported|weakened|blocked|not_reached",
|
|
162
|
-
"statusChangeReason": "Why status changed (if changed)",
|
|
163
|
-
"remainingUncertainty": ["Remaining uncertainty"]
|
|
164
|
-
}
|
|
135
|
+
{"failurePointId": "FP1 or AFP1", "description": "Failure point description", "originalCheckStatus": "checkStatus from the investigation input (null when the AFP is discovered during verification)", "finalStatus": "supported|weakened|blocked|not_reached", "statusChangeReason": "Why status changed (if changed)", "remainingUncertainty": ["Remaining uncertainty"]}
|
|
165
136
|
],
|
|
166
137
|
"conclusion": {
|
|
167
138
|
"confirmedFailurePoints": [
|
|
168
|
-
{
|
|
169
|
-
"failurePointId": "FP1",
|
|
170
|
-
"description": "What the fault is",
|
|
171
|
-
"location": "file:line",
|
|
172
|
-
"symptomId": "S1",
|
|
173
|
-
"symptomExplained": "How this fault leads to the observed symptom",
|
|
174
|
-
"causeCategory": "typo|logic_error|missing_constraint|design_gap|external_factor",
|
|
175
|
-
"finalStatus": "supported|weakened",
|
|
176
|
-
"causalChain": ["Phenomenon", "→ Direct cause", "→ Root cause"],
|
|
177
|
-
"impactScope": ["Affected file paths"],
|
|
178
|
-
"recurrenceRisk": "low|medium|high"
|
|
179
|
-
}
|
|
139
|
+
{"failurePointId": "FP1", "description": "What the fault is", "location": "file:line", "symptomId": "S1", "symptomExplained": "How this fault leads to the observed symptom", "causeCategory": "typo|logic_error|missing_constraint|design_gap|external_factor", "finalStatus": "supported|weakened", "causalChain": ["Phenomenon", "→ Direct cause", "→ Root cause"], "impactScope": ["Affected file paths"], "recurrenceRisk": "low|medium|high"}
|
|
180
140
|
],
|
|
181
141
|
"refutedFailurePoints": [
|
|
182
142
|
{"failurePointId": "FP2", "reason": "Reason for refutation"}
|
|
183
143
|
],
|
|
184
144
|
"failurePointRelationships": [
|
|
185
|
-
{
|
|
186
|
-
"points": ["FP1", "FP3"],
|
|
187
|
-
"relationship": "independent|dependent|same_chain",
|
|
188
|
-
"detail": "Description of how the failure points relate"
|
|
189
|
-
}
|
|
145
|
+
{"points": ["FP1", "FP3"], "relationship": "independent|dependent|same_chain", "detail": "Description of how the failure points relate"}
|
|
190
146
|
],
|
|
191
147
|
"coverageAssessment": "sufficient|partial|insufficient",
|
|
192
148
|
"unresolvedSymptoms": ["Symptoms not fully explained by confirmed failure points"],
|
|
@@ -55,7 +55,7 @@ fixture-e2e gap:
|
|
|
55
55
|
AND e2eAbsenceReason.fixtureE2e was not communicated
|
|
56
56
|
AND Design Doc or UI Spec contains user-facing multi-step user journey
|
|
57
57
|
THEN add to work plan header:
|
|
58
|
-
|
|
58
|
+
fixture-e2e Gap: This feature contains user-facing multi-step journey(s)
|
|
59
59
|
but no fixture-e2e skeleton was provided. Route this feature back through
|
|
60
60
|
acceptance-test generation to evaluate fixture-e2e candidates before the
|
|
61
61
|
UI implementation phase.
|
|
@@ -68,7 +68,7 @@ service-integration-e2e gap:
|
|
|
68
68
|
verification (data persistence across services, transactional
|
|
69
69
|
consistency, external service contract)
|
|
70
70
|
THEN add to work plan header:
|
|
71
|
-
|
|
71
|
+
service-integration-e2e Gap: This feature crosses service boundaries
|
|
72
72
|
where correctness depends on real cross-service behavior, but no
|
|
73
73
|
service-integration-e2e skeleton was provided.
|
|
74
74
|
Detected boundaries: [list crossings and AC references]
|
|
@@ -159,8 +159,6 @@ For each task, derive completion criteria from Design Doc acceptance criteria. A
|
|
|
159
159
|
- **`scale: medium` / `scale: large`**: Write a work plan following the **plan-template** from documentation-criteria skill. Include Phase Structure Diagram and Task Dependency Diagram (mermaid).
|
|
160
160
|
- **`scale: small`**: Write a single task file following the **task-template** from documentation-criteria skill (see "Output Mode by Scale" below). Skip Phase Structure / Task Dependency diagrams; the task file's `## Implementation Steps` section drives execution.
|
|
161
161
|
|
|
162
|
-
For `scale: medium` / `scale: large`, the plan header MUST include the line `Implementation Readiness: pending`. The marker contract: it takes one of three values — `pending` (initial, set here by work-planner), `ready` (verification completed with no remaining gaps), or `escalated` (verification completed with remaining gaps). The producer that promotes the marker beyond `pending` and the consumer that reads it before execution are external orchestration concerns owned outside this agent.
|
|
163
|
-
|
|
164
162
|
## Input Parameters
|
|
165
163
|
|
|
166
164
|
- **mode**: `create` (default) | `update`
|
|
@@ -365,7 +363,6 @@ When creating work plans, **Phase Structure Diagrams** and **Task Dependency Dia
|
|
|
365
363
|
- [ ] Each row's `Axis` value is exactly one of `placement` | `dependency_direction` | `contract_schema` | `data_flow` | `persistence`
|
|
366
364
|
- [ ] Each row's `Source Section` is set to `Decision` or `Implementation Guidance` matching the actual location of the decision in the ADR
|
|
367
365
|
- [ ] Every row maps to at least one covering task
|
|
368
|
-
- [ ] Plan header includes `Implementation Readiness: pending` (medium / large only)
|
|
369
366
|
- [ ] Verification Strategy extracted from Design Doc and included in plan header
|
|
370
367
|
- [ ] Proof Strategy included in plan header (proof obligation source + per-task propagation rule)
|
|
371
368
|
- [ ] Review Scope recorded in plan header (base branch / diff range / changed-files scope)
|
|
@@ -269,16 +269,8 @@ it.todo('[AC番号]-property: [不変条件を自然言語で記述]')
|
|
|
269
269
|
{
|
|
270
270
|
"status": "completed",
|
|
271
271
|
"feature": "payment",
|
|
272
|
-
"generatedFiles": {
|
|
273
|
-
|
|
274
|
-
"fixtureE2e": "tests/payment.fixture-e2e.test.[ext]",
|
|
275
|
-
"serviceE2e": "tests/payment.service-e2e.test.[ext]"
|
|
276
|
-
},
|
|
277
|
-
"budgetUsage": {
|
|
278
|
-
"integration": "2/3",
|
|
279
|
-
"fixtureE2e": "1/3",
|
|
280
|
-
"serviceE2e": "1/2"
|
|
281
|
-
},
|
|
272
|
+
"generatedFiles": {"integration": "tests/payment.int.test.[ext]", "fixtureE2e": "tests/payment.fixture-e2e.test.[ext]", "serviceE2e": "tests/payment.service-e2e.test.[ext]"},
|
|
273
|
+
"budgetUsage": {"integration": "2/3", "fixtureE2e": "1/3", "serviceE2e": "1/2"},
|
|
282
274
|
"e2eAbsenceReason": { "fixtureE2e": null, "serviceE2e": null }
|
|
283
275
|
}
|
|
284
276
|
```
|
|
@@ -288,16 +280,8 @@ it.todo('[AC番号]-property: [不変条件を自然言語で記述]')
|
|
|
288
280
|
{
|
|
289
281
|
"status": "completed",
|
|
290
282
|
"feature": "checkout-ui",
|
|
291
|
-
"generatedFiles": {
|
|
292
|
-
|
|
293
|
-
"fixtureE2e": "tests/checkout.fixture-e2e.test.[ext]",
|
|
294
|
-
"serviceE2e": null
|
|
295
|
-
},
|
|
296
|
-
"budgetUsage": {
|
|
297
|
-
"integration": "1/3",
|
|
298
|
-
"fixtureE2e": "1/3",
|
|
299
|
-
"serviceE2e": "0/2"
|
|
300
|
-
},
|
|
283
|
+
"generatedFiles": {"integration": "tests/checkout.int.test.[ext]", "fixtureE2e": "tests/checkout.fixture-e2e.test.[ext]", "serviceE2e": null},
|
|
284
|
+
"budgetUsage": {"integration": "1/3", "fixtureE2e": "1/3", "serviceE2e": "0/2"},
|
|
301
285
|
"e2eAbsenceReason": { "fixtureE2e": null, "serviceE2e": "no_real_service_dependency" }
|
|
302
286
|
}
|
|
303
287
|
```
|
|
@@ -307,16 +291,8 @@ it.todo('[AC番号]-property: [不変条件を自然言語で記述]')
|
|
|
307
291
|
{
|
|
308
292
|
"status": "completed",
|
|
309
293
|
"feature": "config-update",
|
|
310
|
-
"generatedFiles": {
|
|
311
|
-
|
|
312
|
-
"fixtureE2e": null,
|
|
313
|
-
"serviceE2e": null
|
|
314
|
-
},
|
|
315
|
-
"budgetUsage": {
|
|
316
|
-
"integration": "1/3",
|
|
317
|
-
"fixtureE2e": "0/3",
|
|
318
|
-
"serviceE2e": "0/2"
|
|
319
|
-
},
|
|
294
|
+
"generatedFiles": {"integration": "tests/config.int.test.[ext]", "fixtureE2e": null, "serviceE2e": null},
|
|
295
|
+
"budgetUsage": {"integration": "1/3", "fixtureE2e": "0/3", "serviceE2e": "0/2"},
|
|
320
296
|
"e2eAbsenceReason": { "fixtureE2e": "no_multi_step_journey", "serviceE2e": "no_multi_step_journey" }
|
|
321
297
|
}
|
|
322
298
|
```
|
|
@@ -334,7 +310,8 @@ it.todo('[AC番号]-property: [不変条件を自然言語で記述]')
|
|
|
334
310
|
|
|
335
311
|
**必須準拠事項**:
|
|
336
312
|
- `it.todo`スケルトンのみ出力: 各スケルトン内にコメントとして検証観点、期待結果、合格基準、主要な故障モード、証明義務を記述。
|
|
337
|
-
|
|
313
|
+
`it.todo` が必要とするテストフレームワークのシンボル(`describe`/`it` など)のみを import する。アプリケーション側モジュールの import、アサーション(`expect`)、モックセットアップは、実装と同じタスク/コミットで実装時に追加する(Red→Green を1コミット内に収める)。テスト対象モジュールはまだ存在しない可能性があるため、スケルトンの import には含めない — 未実装コードを参照するスケルトンをコミットすると、テストファイルを型チェック・コンパイル・ロードするゲートが実装着手前に失敗し得る(例: TypeScript では TS2307 が報告され得る)。
|
|
314
|
+
下流の処理では`it.todo`の有無によりフェーズ配置やレビュー判定が行われる。
|
|
338
315
|
- 各テストの検証観点、期待結果、合格基準を明確に記述
|
|
339
316
|
- コメントに元のAC文を保持(トレーサビリティ確保)
|
|
340
317
|
- テスト上限設定内に収める;重要テストに上限超過の場合は報告
|
|
@@ -39,6 +39,7 @@ skills: coding-standards, typescript-rules, typescript-testing, project-context,
|
|
|
39
39
|
- **designDoc**: Design Docのパス(フルスタック機能の場合は複数パス)
|
|
40
40
|
- **implementationFiles**: レビュー対象ファイルリスト(またはgit diff範囲)
|
|
41
41
|
- **reviewMode**: `full`(デフォルト)| `acceptance` | `architecture`
|
|
42
|
+
- **taskFiles**(任意): 実装の元となったタスクファイルのパス(`docs/plans/tasks/…`)。各タスクの `Change Category` と `Investigation Notes` の取得元。省略された場合は後述の「基準の読み込み」のフォールバックを行う。
|
|
42
43
|
|
|
43
44
|
## 検証プロセス
|
|
44
45
|
|
|
@@ -53,6 +54,11 @@ Design Docを**全文**読み込み、以下を抽出:
|
|
|
53
54
|
- 非機能要件
|
|
54
55
|
- **Fact Disposition Tableの行**(該当セクションがある場合): 各行を `{fact_id, disposition, rationale, evidence, relatedFiles}` として記録する。Related Files列は設計者が検証すべきパスを保持しており、ステップ4-1で各パスのファイルを読む。これらの行はステップ2〜4の検証対象となる。
|
|
55
56
|
|
|
57
|
+
続いて、隣接ケースのレビュー(ステップ2-1)を駆動するタスクコンテキストを読み込む:
|
|
58
|
+
|
|
59
|
+
- `taskFiles` が与えられた場合、各ファイルを読み、その `Change Category` 値(変更の種別: `bug-fix` / `regression` / `state-change` / `boundary-change`)と、executor が `Investigation Notes` に記録したスコープ外の隣接残余を抽出する。両者をステップ2-1に持ち込む。記録された各残余は、実装に対して確認すべき `adjacent_residual` 検出事項の候補となる。
|
|
60
|
+
- `taskFiles` がない、または `Change Category` を持たない場合はフォールバックする: レビュー対象の変更を diff と Design Doc から自分で分類し(観測された振る舞いを修正するか、壊れた振る舞いを復元するか、永続状態を変更するか、公開/利用される契約を変更するか)、その分類をステップ2-1の隣接ケースチェックのトリガーとして扱う。
|
|
61
|
+
|
|
56
62
|
### 2. 実装とDesign Docのマッピング
|
|
57
63
|
|
|
58
64
|
#### 2-1. 受入条件の検証
|
|
@@ -65,6 +71,7 @@ Step 1で抽出した各受入条件について:
|
|
|
65
71
|
- 振る舞いを変えるACでは、エビデンスがメインパスだけでなく境界パスもカバーしていることを確認する。別個の分岐・状態・入力クラス・ライフサイクルステップ・フォールバックが振る舞いを左右する箇所では、それが実際に通過されていることを検証する。参照元(source)/参照先の振る舞いと実装された振る舞いを同一粒度で比較し、境界次元における根拠のない変更は `dd_violation` とする
|
|
66
72
|
- 実装が AC・Design Doc・参照資料が明示的に要求する中核メカニズムを保持していることを確認し、出所となる文言を引用する。テストは通るが要求された中核メカニズムを落とす単純な代替は `dd_violation` とする
|
|
67
73
|
- 永続化・共有・外部から観測可能な状態への変更では、公開境界(新しい状態が別プロセス・コンポーネント・ユーザー・後続ステップから観測可能になる箇所)を特定する。部分的・未初期化・stale・ロールバックのみでありながら完了として観測可能な状態は `reliability` の検出事項とする。下流の利用者が不完全な状態を完了とみなして失敗しうるためである
|
|
74
|
+
- レビュー対象の変更が `bug-fix` / `regression` / `state-change` / `boundary-change` に分類される場合(タスクの `Change Category`、またはタスクコンテキストが与えられなかったときは「基準の読み込み」のフォールバック分類による)、その経路・契約・永続状態・外部境界を共有するケースを確認する。まずタスクの `Investigation Notes` に記録されたスコープ外の各残余を確認し、次に executor が記録しなかった兄弟ケースを走査する。変更が対処したのと同一クラスの欠陥を依然として抱える兄弟ケースは `adjacent_residual` の検出事項とする
|
|
68
75
|
|
|
69
76
|
#### 2-2. 識別子の検証
|
|
70
77
|
|
|
@@ -125,6 +132,7 @@ Step 1で抽出した各識別子仕様(リソース名、エンドポイン
|
|
|
125
132
|
| **maintainability** | コード構造が将来の変更や理解を妨げる | 長い関数、深いネスト、複数の責務、不明瞭な命名 |
|
|
126
133
|
| **reliability** | 実行時障害を引き起こし得る安全策の欠如 | 未処理のエラーパス、境界での検証漏れ、黙殺されるエラー |
|
|
127
134
|
| **coverage_gap** | 受入条件に対応するテスト検証が存在しない | コードでは充足されているがテストで検証されていないAC |
|
|
135
|
+
| **adjacent_residual** | 変更の経路・契約・永続状態・外部境界を共有するケースが、変更が対処した欠陥と同一クラスの欠陥を依然として抱えている | フォールバックパスが未修正、兄弟の状態遷移が依然 stale、変更された契約の別の利用者が未更新 |
|
|
128
136
|
|
|
129
137
|
各検出事項に`rationale`フィールドを含めること:
|
|
130
138
|
|
|
@@ -134,6 +142,7 @@ Step 1で抽出した各識別子仕様(リソース名、エンドポイン
|
|
|
134
142
|
| **maintainability** | どのような保守・理解上のリスクが生じるか |
|
|
135
143
|
| **reliability** | どのような障害シナリオが保護されておらず、どの条件で発生し得るか |
|
|
136
144
|
| **coverage_gap** | どのACがテストされておらず、なぜこのケースでテストカバレッジが重要か |
|
|
145
|
+
| **adjacent_residual** | どの隣接ケースが経路/契約/状態/境界を共有し、どのように欠陥クラスを依然として示しているか |
|
|
137
146
|
|
|
138
147
|
### 4. アーキテクチャ準拠の確認
|
|
139
148
|
|
|
@@ -194,7 +203,7 @@ identifierVerification[].codeValue: string (見つからない場合は "not
|
|
|
194
203
|
identifierVerification[].location: string (file:line; 見つからない場合は null)
|
|
195
204
|
identifierVerification[].match: boolean
|
|
196
205
|
|
|
197
|
-
qualityFindings[].category: string ("dd_violation" | "maintainability" | "reliability" | "coverage_gap")
|
|
206
|
+
qualityFindings[].category: string ("dd_violation" | "maintainability" | "reliability" | "coverage_gap" | "adjacent_residual")
|
|
198
207
|
qualityFindings[].location: string (file:line または file:function)
|
|
199
208
|
qualityFindings[].description: string
|
|
200
209
|
qualityFindings[].rationale: string (カテゴリ固有)
|
|
@@ -212,6 +221,7 @@ summary.findingsByCategory.dd_violation: number (整数 >= 0)
|
|
|
212
221
|
summary.findingsByCategory.maintainability: number (整数 >= 0)
|
|
213
222
|
summary.findingsByCategory.reliability: number (整数 >= 0)
|
|
214
223
|
summary.findingsByCategory.coverage_gap: number (整数 >= 0)
|
|
224
|
+
summary.findingsByCategory.adjacent_residual: number (整数 >= 0)
|
|
215
225
|
```
|
|
216
226
|
|
|
217
227
|
### 最小形状の例
|
|
@@ -222,33 +232,14 @@ summary.findingsByCategory.coverage_gap: number (整数 >= 0)
|
|
|
222
232
|
"identifierMatchRate": 95,
|
|
223
233
|
"verdict": "needs-improvement",
|
|
224
234
|
"acceptanceCriteria": [
|
|
225
|
-
{
|
|
226
|
-
"item": "User can log in with valid credentials",
|
|
227
|
-
"status": "fulfilled",
|
|
228
|
-
"confidence": "high",
|
|
229
|
-
"location": "src/auth/login.ts:42",
|
|
230
|
-
"evidence": ["impl: src/auth/login.ts:42", "test: src/auth/login.test.ts:18"],
|
|
231
|
-
"evidence_source": "Grep found handler at src/auth/login.ts:42; Read confirmed flow",
|
|
232
|
-
"gap": null,
|
|
233
|
-
"suggestion": null
|
|
234
|
-
}
|
|
235
|
+
{"item": "User can log in with valid credentials", "status": "fulfilled", "confidence": "high", "location": "src/auth/login.ts:42", "evidence": ["impl: src/auth/login.ts:42", "test: src/auth/login.test.ts:18"], "evidence_source": "Grep found handler at src/auth/login.ts:42; Read confirmed flow", "gap": null, "suggestion": null}
|
|
235
236
|
],
|
|
236
237
|
"identifierVerification": [{"identifier": "AUTH_TOKEN_TTL", "designDocValue": "3600", "codeValue": "1800", "location": "src/auth/config.ts:8", "match": false}],
|
|
237
238
|
"qualityFindings": [{"category": "reliability", "location": "src/auth/login.ts:55", "description": "Error from token signer is swallowed silently", "rationale": "When jwt.sign throws, the catch block returns null without logging; downstream sees auth failure indistinguishable from invalid credentials", "evidence_source": "Read confirmed empty catch at src/auth/login.ts:55-58", "suggestion": "Re-throw with context or log error then propagate to caller"}],
|
|
238
239
|
"summary": {
|
|
239
|
-
"acsTotal": 12,
|
|
240
|
-
"
|
|
241
|
-
"
|
|
242
|
-
"acsUnfulfilled": 1,
|
|
243
|
-
"identifiersTotal": 20,
|
|
244
|
-
"identifiersMatched": 19,
|
|
245
|
-
"lowConfidenceItems": 2,
|
|
246
|
-
"findingsByCategory": {
|
|
247
|
-
"dd_violation": 1,
|
|
248
|
-
"maintainability": 0,
|
|
249
|
-
"reliability": 1,
|
|
250
|
-
"coverage_gap": 0
|
|
251
|
-
}
|
|
240
|
+
"acsTotal": 12, "acsFulfilled": 10, "acsPartial": 1, "acsUnfulfilled": 1,
|
|
241
|
+
"identifiersTotal": 20, "identifiersMatched": 19, "lowConfidenceItems": 2,
|
|
242
|
+
"findingsByCategory": {"dd_violation": 1, "maintainability": 0, "reliability": 1, "coverage_gap": 0, "adjacent_residual": 0}
|
|
252
243
|
}
|
|
253
244
|
}
|
|
254
245
|
```
|
|
@@ -188,41 +188,12 @@ limitations: string[] (検証できなかった内容とその理由)
|
|
|
188
188
|
|
|
189
189
|
```json
|
|
190
190
|
{
|
|
191
|
-
"summary": {
|
|
192
|
-
"docType": "design-doc",
|
|
193
|
-
"documentPath": "docs/design/auth-design.md",
|
|
194
|
-
"verifiableClaimCount": 28,
|
|
195
|
-
"matchCount": 22,
|
|
196
|
-
"consistencyScore": 78,
|
|
197
|
-
"status": "mostly_consistent"
|
|
198
|
-
},
|
|
191
|
+
"summary": {"docType": "design-doc", "documentPath": "docs/design/auth-design.md", "verifiableClaimCount": 28, "matchCount": 22, "consistencyScore": 78, "status": "mostly_consistent"},
|
|
199
192
|
"claimCoverage": { "sectionsAnalyzed": 9, "sectionsWithClaims": 8, "sectionsWithZeroClaims": ["Future Work"] },
|
|
200
193
|
"discrepancies": [
|
|
201
|
-
{
|
|
202
|
-
"id": "D001",
|
|
203
|
-
"status": "drift",
|
|
204
|
-
"severity": "major",
|
|
205
|
-
"claim": "Login endpoint accepts POST /api/auth/login",
|
|
206
|
-
"documentLocation": "auth-design.md:45",
|
|
207
|
-
"codeLocation": "src/auth/router.ts:120",
|
|
208
|
-
"evidence": "Grep found POST /api/v2/auth/login in src/auth/router.ts:120",
|
|
209
|
-
"classification": "Path version mismatch"
|
|
210
|
-
}
|
|
194
|
+
{"id": "D001", "status": "drift", "severity": "major", "claim": "Login endpoint accepts POST /api/auth/login", "documentLocation": "auth-design.md:45", "codeLocation": "src/auth/router.ts:120", "evidence": "Grep found POST /api/v2/auth/login in src/auth/router.ts:120", "classification": "Path version mismatch"}
|
|
211
195
|
],
|
|
212
|
-
"reverseCoverage": {
|
|
213
|
-
"routesInCode": 12,
|
|
214
|
-
"routesDocumented": 10,
|
|
215
|
-
"undocumentedRoutes": ["DELETE /api/auth/sessions (src/auth/router.ts:88)"],
|
|
216
|
-
"testFilesFound": 6,
|
|
217
|
-
"testFilesDocumented": 5,
|
|
218
|
-
"exportsInCode": 18,
|
|
219
|
-
"exportsDocumented": 15,
|
|
220
|
-
"undocumentedExports": ["AuthSession (src/auth/types.ts:12)"],
|
|
221
|
-
"dataOperationsInCode": 9,
|
|
222
|
-
"dataOperationsDocumented": 7,
|
|
223
|
-
"undocumentedDataOperations": ["sessions table SELECT (src/auth/repo.ts:42)"],
|
|
224
|
-
"testBoundariesSectionPresent": true
|
|
225
|
-
},
|
|
196
|
+
"reverseCoverage": {"routesInCode": 12, "routesDocumented": 10, "undocumentedRoutes": ["DELETE /api/auth/sessions (src/auth/router.ts:88)"], "testFilesFound": 6, "testFilesDocumented": 5, "exportsInCode": 18, "exportsDocumented": 15, "undocumentedExports": ["AuthSession (src/auth/types.ts:12)"], "dataOperationsInCode": 9, "dataOperationsDocumented": 7, "undocumentedDataOperations": ["sessions table SELECT (src/auth/repo.ts:42)"], "testBoundariesSectionPresent": true},
|
|
226
197
|
"coverage": { "documented": ["login flow", "token refresh"], "undocumented": ["session deletion endpoint"], "unimplemented": ["MFA challenge response"] },
|
|
227
198
|
"limitations": ["Could not verify token refresh against running redis instance"]
|
|
228
199
|
}
|