@agile-vibe-coding/avc 0.1.0 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/cli/agent-loader.js +21 -0
- package/cli/agents/agent-selector.md +129 -0
- package/cli/agents/architecture-recommender.md +418 -0
- package/cli/agents/database-deep-dive.md +470 -0
- package/cli/agents/database-recommender.md +634 -0
- package/cli/agents/doc-distributor.md +176 -0
- package/cli/agents/documentation-updater.md +203 -0
- package/cli/agents/epic-story-decomposer.md +280 -0
- package/cli/agents/feature-context-generator.md +91 -0
- package/cli/agents/gap-checker-epic.md +52 -0
- package/cli/agents/impact-checker-story.md +51 -0
- package/cli/agents/migration-guide-generator.md +305 -0
- package/cli/agents/mission-scope-generator.md +79 -0
- package/cli/agents/mission-scope-validator.md +112 -0
- package/cli/agents/project-context-extractor.md +107 -0
- package/cli/agents/project-documentation-creator.json +226 -0
- package/cli/agents/project-documentation-creator.md +595 -0
- package/cli/agents/question-prefiller.md +269 -0
- package/cli/agents/refiner-epic.md +39 -0
- package/cli/agents/refiner-story.md +42 -0
- package/cli/agents/solver-epic-api.json +15 -0
- package/cli/agents/solver-epic-api.md +39 -0
- package/cli/agents/solver-epic-backend.json +15 -0
- package/cli/agents/solver-epic-backend.md +39 -0
- package/cli/agents/solver-epic-cloud.json +15 -0
- package/cli/agents/solver-epic-cloud.md +39 -0
- package/cli/agents/solver-epic-data.json +15 -0
- package/cli/agents/solver-epic-data.md +39 -0
- package/cli/agents/solver-epic-database.json +15 -0
- package/cli/agents/solver-epic-database.md +39 -0
- package/cli/agents/solver-epic-developer.json +15 -0
- package/cli/agents/solver-epic-developer.md +39 -0
- package/cli/agents/solver-epic-devops.json +15 -0
- package/cli/agents/solver-epic-devops.md +39 -0
- package/cli/agents/solver-epic-frontend.json +15 -0
- package/cli/agents/solver-epic-frontend.md +39 -0
- package/cli/agents/solver-epic-mobile.json +15 -0
- package/cli/agents/solver-epic-mobile.md +39 -0
- package/cli/agents/solver-epic-qa.json +15 -0
- package/cli/agents/solver-epic-qa.md +39 -0
- package/cli/agents/solver-epic-security.json +15 -0
- package/cli/agents/solver-epic-security.md +39 -0
- package/cli/agents/solver-epic-solution-architect.json +15 -0
- package/cli/agents/solver-epic-solution-architect.md +39 -0
- package/cli/agents/solver-epic-test-architect.json +15 -0
- package/cli/agents/solver-epic-test-architect.md +39 -0
- package/cli/agents/solver-epic-ui.json +15 -0
- package/cli/agents/solver-epic-ui.md +39 -0
- package/cli/agents/solver-epic-ux.json +15 -0
- package/cli/agents/solver-epic-ux.md +39 -0
- package/cli/agents/solver-story-api.json +15 -0
- package/cli/agents/solver-story-api.md +39 -0
- package/cli/agents/solver-story-backend.json +15 -0
- package/cli/agents/solver-story-backend.md +39 -0
- package/cli/agents/solver-story-cloud.json +15 -0
- package/cli/agents/solver-story-cloud.md +39 -0
- package/cli/agents/solver-story-data.json +15 -0
- package/cli/agents/solver-story-data.md +39 -0
- package/cli/agents/solver-story-database.json +15 -0
- package/cli/agents/solver-story-database.md +39 -0
- package/cli/agents/solver-story-developer.json +15 -0
- package/cli/agents/solver-story-developer.md +39 -0
- package/cli/agents/solver-story-devops.json +15 -0
- package/cli/agents/solver-story-devops.md +39 -0
- package/cli/agents/solver-story-frontend.json +15 -0
- package/cli/agents/solver-story-frontend.md +39 -0
- package/cli/agents/solver-story-mobile.json +15 -0
- package/cli/agents/solver-story-mobile.md +39 -0
- package/cli/agents/solver-story-qa.json +15 -0
- package/cli/agents/solver-story-qa.md +39 -0
- package/cli/agents/solver-story-security.json +15 -0
- package/cli/agents/solver-story-security.md +39 -0
- package/cli/agents/solver-story-solution-architect.json +15 -0
- package/cli/agents/solver-story-solution-architect.md +39 -0
- package/cli/agents/solver-story-test-architect.json +15 -0
- package/cli/agents/solver-story-test-architect.md +39 -0
- package/cli/agents/solver-story-ui.json +15 -0
- package/cli/agents/solver-story-ui.md +39 -0
- package/cli/agents/solver-story-ux.json +15 -0
- package/cli/agents/solver-story-ux.md +39 -0
- package/cli/agents/story-doc-enricher.md +133 -0
- package/cli/agents/suggestion-business-analyst.md +88 -0
- package/cli/agents/suggestion-deployment-architect.md +263 -0
- package/cli/agents/suggestion-product-manager.md +129 -0
- package/cli/agents/suggestion-security-specialist.md +156 -0
- package/cli/agents/suggestion-technical-architect.md +269 -0
- package/cli/agents/suggestion-ux-researcher.md +93 -0
- package/cli/agents/task-subtask-decomposer.md +188 -0
- package/cli/agents/validator-documentation.json +152 -0
- package/cli/agents/validator-documentation.md +453 -0
- package/cli/agents/validator-epic-api.json +93 -0
- package/cli/agents/validator-epic-api.md +137 -0
- package/cli/agents/validator-epic-backend.json +93 -0
- package/cli/agents/validator-epic-backend.md +130 -0
- package/cli/agents/validator-epic-cloud.json +93 -0
- package/cli/agents/validator-epic-cloud.md +137 -0
- package/cli/agents/validator-epic-data.json +93 -0
- package/cli/agents/validator-epic-data.md +130 -0
- package/cli/agents/validator-epic-database.json +93 -0
- package/cli/agents/validator-epic-database.md +137 -0
- package/cli/agents/validator-epic-developer.json +74 -0
- package/cli/agents/validator-epic-developer.md +153 -0
- package/cli/agents/validator-epic-devops.json +74 -0
- package/cli/agents/validator-epic-devops.md +153 -0
- package/cli/agents/validator-epic-frontend.json +74 -0
- package/cli/agents/validator-epic-frontend.md +153 -0
- package/cli/agents/validator-epic-mobile.json +93 -0
- package/cli/agents/validator-epic-mobile.md +130 -0
- package/cli/agents/validator-epic-qa.json +93 -0
- package/cli/agents/validator-epic-qa.md +130 -0
- package/cli/agents/validator-epic-security.json +74 -0
- package/cli/agents/validator-epic-security.md +154 -0
- package/cli/agents/validator-epic-solution-architect.json +74 -0
- package/cli/agents/validator-epic-solution-architect.md +156 -0
- package/cli/agents/validator-epic-test-architect.json +93 -0
- package/cli/agents/validator-epic-test-architect.md +130 -0
- package/cli/agents/validator-epic-ui.json +93 -0
- package/cli/agents/validator-epic-ui.md +130 -0
- package/cli/agents/validator-epic-ux.json +93 -0
- package/cli/agents/validator-epic-ux.md +130 -0
- package/cli/agents/validator-selector.md +211 -0
- package/cli/agents/validator-story-api.json +104 -0
- package/cli/agents/validator-story-api.md +152 -0
- package/cli/agents/validator-story-backend.json +104 -0
- package/cli/agents/validator-story-backend.md +152 -0
- package/cli/agents/validator-story-cloud.json +104 -0
- package/cli/agents/validator-story-cloud.md +152 -0
- package/cli/agents/validator-story-data.json +104 -0
- package/cli/agents/validator-story-data.md +152 -0
- package/cli/agents/validator-story-database.json +104 -0
- package/cli/agents/validator-story-database.md +152 -0
- package/cli/agents/validator-story-developer.json +104 -0
- package/cli/agents/validator-story-developer.md +152 -0
- package/cli/agents/validator-story-devops.json +104 -0
- package/cli/agents/validator-story-devops.md +152 -0
- package/cli/agents/validator-story-frontend.json +104 -0
- package/cli/agents/validator-story-frontend.md +152 -0
- package/cli/agents/validator-story-mobile.json +104 -0
- package/cli/agents/validator-story-mobile.md +152 -0
- package/cli/agents/validator-story-qa.json +104 -0
- package/cli/agents/validator-story-qa.md +152 -0
- package/cli/agents/validator-story-security.json +104 -0
- package/cli/agents/validator-story-security.md +152 -0
- package/cli/agents/validator-story-solution-architect.json +104 -0
- package/cli/agents/validator-story-solution-architect.md +152 -0
- package/cli/agents/validator-story-test-architect.json +104 -0
- package/cli/agents/validator-story-test-architect.md +152 -0
- package/cli/agents/validator-story-ui.json +104 -0
- package/cli/agents/validator-story-ui.md +152 -0
- package/cli/agents/validator-story-ux.json +104 -0
- package/cli/agents/validator-story-ux.md +152 -0
- package/cli/ansi-colors.js +21 -0
- package/cli/build-docs.js +298 -0
- package/cli/ceremony-history.js +369 -0
- package/cli/command-logger.js +245 -0
- package/cli/components/static-output.js +63 -0
- package/cli/console-output-manager.js +94 -0
- package/cli/docs-sync.js +306 -0
- package/cli/epic-story-validator.js +1174 -0
- package/cli/evaluation-prompts.js +1008 -0
- package/cli/execution-context.js +195 -0
- package/cli/generate-summary-table.js +340 -0
- package/cli/index.js +3 -25
- package/cli/init-model-config.js +697 -0
- package/cli/init.js +1765 -100
- package/cli/kanban-server-manager.js +228 -0
- package/cli/llm-claude.js +109 -0
- package/cli/llm-gemini.js +115 -0
- package/cli/llm-mock.js +233 -0
- package/cli/llm-openai.js +233 -0
- package/cli/llm-provider.js +300 -0
- package/cli/llm-token-limits.js +102 -0
- package/cli/llm-verifier.js +454 -0
- package/cli/logger.js +32 -5
- package/cli/message-constants.js +58 -0
- package/cli/message-manager.js +334 -0
- package/cli/message-types.js +96 -0
- package/cli/messaging-api.js +297 -0
- package/cli/model-pricing.js +169 -0
- package/cli/model-query-engine.js +468 -0
- package/cli/model-recommendation-analyzer.js +495 -0
- package/cli/model-selector.js +269 -0
- package/cli/output-buffer.js +107 -0
- package/cli/process-manager.js +332 -0
- package/cli/repl-ink.js +5840 -504
- package/cli/repl-old.js +4 -4
- package/cli/seed-processor.js +792 -0
- package/cli/sprint-planning-processor.js +1813 -0
- package/cli/template-processor.js +2306 -108
- package/cli/templates/project.md +25 -8
- package/cli/templates/vitepress-config.mts.template +34 -0
- package/cli/token-tracker.js +520 -0
- package/cli/tools/generate-story-validators.js +317 -0
- package/cli/tools/generate-validators.js +669 -0
- package/cli/update-checker.js +19 -17
- package/cli/update-notifier.js +4 -4
- package/cli/validation-router.js +605 -0
- package/cli/verification-tracker.js +563 -0
- package/kanban/README.md +386 -0
- package/kanban/client/README.md +205 -0
- package/kanban/client/components.json +20 -0
- package/kanban/client/dist/assets/index-CiD8PS2e.js +306 -0
- package/kanban/client/dist/assets/index-nLh0m82Q.css +1 -0
- package/kanban/client/dist/index.html +16 -0
- package/kanban/client/dist/vite.svg +1 -0
- package/kanban/client/index.html +15 -0
- package/kanban/client/package-lock.json +9442 -0
- package/kanban/client/package.json +44 -0
- package/kanban/client/postcss.config.js +6 -0
- package/kanban/client/public/vite.svg +1 -0
- package/kanban/client/src/App.jsx +622 -0
- package/kanban/client/src/components/ProjectFileEditorPopup.jsx +117 -0
- package/kanban/client/src/components/ceremony/AskArchPopup.jsx +416 -0
- package/kanban/client/src/components/ceremony/AskModelPopup.jsx +616 -0
- package/kanban/client/src/components/ceremony/CeremonyWorkflowModal.jsx +946 -0
- package/kanban/client/src/components/ceremony/EpicStorySelectionModal.jsx +254 -0
- package/kanban/client/src/components/ceremony/SponsorCallModal.jsx +619 -0
- package/kanban/client/src/components/ceremony/SprintPlanningModal.jsx +704 -0
- package/kanban/client/src/components/ceremony/steps/ArchitectureStep.jsx +150 -0
- package/kanban/client/src/components/ceremony/steps/CompleteStep.jsx +154 -0
- package/kanban/client/src/components/ceremony/steps/DatabaseStep.jsx +202 -0
- package/kanban/client/src/components/ceremony/steps/DeploymentStep.jsx +123 -0
- package/kanban/client/src/components/ceremony/steps/MissionStep.jsx +106 -0
- package/kanban/client/src/components/ceremony/steps/ReviewAnswersStep.jsx +125 -0
- package/kanban/client/src/components/ceremony/steps/RunningStep.jsx +228 -0
- package/kanban/client/src/components/kanban/CardDetailModal.jsx +559 -0
- package/kanban/client/src/components/kanban/EpicSection.jsx +146 -0
- package/kanban/client/src/components/kanban/FilterToolbar.jsx +222 -0
- package/kanban/client/src/components/kanban/GroupingSelector.jsx +57 -0
- package/kanban/client/src/components/kanban/KanbanBoard.jsx +211 -0
- package/kanban/client/src/components/kanban/KanbanCard.jsx +138 -0
- package/kanban/client/src/components/kanban/KanbanColumn.jsx +90 -0
- package/kanban/client/src/components/kanban/RefineWorkItemPopup.jsx +789 -0
- package/kanban/client/src/components/layout/LoadingScreen.jsx +82 -0
- package/kanban/client/src/components/process/ProcessMonitorBar.jsx +80 -0
- package/kanban/client/src/components/settings/AgentEditorPopup.jsx +171 -0
- package/kanban/client/src/components/settings/AgentsTab.jsx +353 -0
- package/kanban/client/src/components/settings/ApiKeysTab.jsx +113 -0
- package/kanban/client/src/components/settings/CeremonyModelsTab.jsx +98 -0
- package/kanban/client/src/components/settings/CostThresholdsTab.jsx +94 -0
- package/kanban/client/src/components/settings/ModelPricingTab.jsx +204 -0
- package/kanban/client/src/components/settings/ServersTab.jsx +121 -0
- package/kanban/client/src/components/settings/SettingsModal.jsx +84 -0
- package/kanban/client/src/components/stats/CostModal.jsx +353 -0
- package/kanban/client/src/components/ui/badge.jsx +27 -0
- package/kanban/client/src/components/ui/dialog.jsx +121 -0
- package/kanban/client/src/components/ui/tabs.jsx +85 -0
- package/kanban/client/src/hooks/__tests__/useGrouping.test.js +232 -0
- package/kanban/client/src/hooks/useGrouping.js +118 -0
- package/kanban/client/src/hooks/useWebSocket.js +120 -0
- package/kanban/client/src/lib/__tests__/api.test.js +196 -0
- package/kanban/client/src/lib/__tests__/status-grouping.test.js +94 -0
- package/kanban/client/src/lib/api.js +401 -0
- package/kanban/client/src/lib/status-grouping.js +144 -0
- package/kanban/client/src/lib/utils.js +11 -0
- package/kanban/client/src/main.jsx +10 -0
- package/kanban/client/src/store/__tests__/kanbanStore.test.js +164 -0
- package/kanban/client/src/store/ceremonyStore.js +172 -0
- package/kanban/client/src/store/filterStore.js +201 -0
- package/kanban/client/src/store/kanbanStore.js +115 -0
- package/kanban/client/src/store/processStore.js +65 -0
- package/kanban/client/src/store/sprintPlanningStore.js +33 -0
- package/kanban/client/src/styles/globals.css +59 -0
- package/kanban/client/tailwind.config.js +77 -0
- package/kanban/client/vite.config.js +28 -0
- package/kanban/client/vitest.config.js +28 -0
- package/kanban/dev-start.sh +47 -0
- package/kanban/package.json +12 -0
- package/kanban/server/index.js +516 -0
- package/kanban/server/routes/ceremony.js +305 -0
- package/kanban/server/routes/costs.js +157 -0
- package/kanban/server/routes/processes.js +50 -0
- package/kanban/server/routes/settings.js +303 -0
- package/kanban/server/routes/websocket.js +276 -0
- package/kanban/server/routes/work-items.js +347 -0
- package/kanban/server/services/CeremonyService.js +1190 -0
- package/kanban/server/services/FileSystemScanner.js +95 -0
- package/kanban/server/services/FileWatcher.js +144 -0
- package/kanban/server/services/HierarchyBuilder.js +196 -0
- package/kanban/server/services/ProcessRegistry.js +122 -0
- package/kanban/server/services/WorkItemReader.js +123 -0
- package/kanban/server/services/WorkItemRefineService.js +510 -0
- package/kanban/server/start.js +49 -0
- package/kanban/server/utils/kanban-logger.js +132 -0
- package/kanban/server/utils/markdown.js +91 -0
- package/kanban/server/utils/status-grouping.js +107 -0
- package/kanban/server/workers/sponsor-call-worker.js +84 -0
- package/kanban/server/workers/sprint-planning-worker.js +130 -0
- package/package.json +34 -7
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{
|
|
2
|
+
"agentName": "validator-story-security",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Verification rules for security story validator",
|
|
5
|
+
"requiredFields": [
|
|
6
|
+
"validationStatus",
|
|
7
|
+
"overallScore",
|
|
8
|
+
"issues",
|
|
9
|
+
"strengths",
|
|
10
|
+
"improvementPriorities",
|
|
11
|
+
"readyForImplementation",
|
|
12
|
+
"estimatedComplexity",
|
|
13
|
+
"domainSpecificNotes"
|
|
14
|
+
],
|
|
15
|
+
"fieldValidation": {
|
|
16
|
+
"validationStatus": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"allowedValues": [
|
|
19
|
+
"needs-improvement",
|
|
20
|
+
"acceptable",
|
|
21
|
+
"excellent"
|
|
22
|
+
],
|
|
23
|
+
"errorMessage": "validationStatus must be one of: needs-improvement, acceptable, excellent"
|
|
24
|
+
},
|
|
25
|
+
"overallScore": {
|
|
26
|
+
"type": "number",
|
|
27
|
+
"min": 0,
|
|
28
|
+
"max": 100,
|
|
29
|
+
"errorMessage": "overallScore must be between 0 and 100"
|
|
30
|
+
},
|
|
31
|
+
"issues": {
|
|
32
|
+
"type": "array",
|
|
33
|
+
"minLength": 0,
|
|
34
|
+
"itemValidation": {
|
|
35
|
+
"requiredFields": [
|
|
36
|
+
"severity",
|
|
37
|
+
"category",
|
|
38
|
+
"description",
|
|
39
|
+
"suggestion"
|
|
40
|
+
],
|
|
41
|
+
"severity": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"allowedValues": [
|
|
44
|
+
"critical",
|
|
45
|
+
"major",
|
|
46
|
+
"minor"
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
"category": {
|
|
50
|
+
"type": "string",
|
|
51
|
+
"allowedValues": [
|
|
52
|
+
"acceptance-criteria",
|
|
53
|
+
"implementation-clarity",
|
|
54
|
+
"testability",
|
|
55
|
+
"scope",
|
|
56
|
+
"dependencies",
|
|
57
|
+
"best-practices"
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"strengths": {
|
|
63
|
+
"type": "array",
|
|
64
|
+
"minLength": 0
|
|
65
|
+
},
|
|
66
|
+
"improvementPriorities": {
|
|
67
|
+
"type": "array",
|
|
68
|
+
"minLength": 0,
|
|
69
|
+
"maxLength": 5
|
|
70
|
+
},
|
|
71
|
+
"readyForImplementation": {
|
|
72
|
+
"type": "boolean"
|
|
73
|
+
},
|
|
74
|
+
"estimatedComplexity": {
|
|
75
|
+
"type": "string",
|
|
76
|
+
"allowedValues": [
|
|
77
|
+
"low",
|
|
78
|
+
"medium",
|
|
79
|
+
"high"
|
|
80
|
+
],
|
|
81
|
+
"errorMessage": "estimatedComplexity must be one of: low, medium, high"
|
|
82
|
+
},
|
|
83
|
+
"domainSpecificNotes": {
|
|
84
|
+
"type": "string"
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"consistencyRules": [
|
|
88
|
+
{
|
|
89
|
+
"rule": "score_status_alignment",
|
|
90
|
+
"description": "Score should align with validation status",
|
|
91
|
+
"check": "if validationStatus is 'excellent', score should be >= 90; if 'acceptable', 70-89; if 'needs-improvement', < 70"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"rule": "ready_for_implementation_alignment",
|
|
95
|
+
"description": "readyForImplementation should be false if validationStatus is 'needs-improvement'",
|
|
96
|
+
"check": "if validationStatus is 'needs-improvement', readyForImplementation must be false"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"rule": "critical_issues_block",
|
|
100
|
+
"description": "Critical issues should result in needs-improvement status",
|
|
101
|
+
"check": "if any issue has severity 'critical', validationStatus should be 'needs-improvement'"
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Story Validator - Security Specialist
|
|
2
|
+
|
|
3
|
+
## Role
|
|
4
|
+
You are an expert security reviewing user story implementations. Your role is to validate that story acceptance criteria are complete, testable, and implementable from a security perspective.
|
|
5
|
+
|
|
6
|
+
## Validation Scope
|
|
7
|
+
|
|
8
|
+
**What to Validate:**
|
|
9
|
+
- Acceptance criteria are specific, measurable, and testable
|
|
10
|
+
- Story includes all security-specific implementation requirements
|
|
11
|
+
- Technical details are sufficient for developers to implement
|
|
12
|
+
- Dependencies are clearly identified
|
|
13
|
+
- Story is appropriately sized (not too large or too small)
|
|
14
|
+
- Security best practices are followed
|
|
15
|
+
|
|
16
|
+
**What NOT to Validate:**
|
|
17
|
+
- High-level architecture (that's for Epic validation)
|
|
18
|
+
- Detailed code implementation (that's for Task level)
|
|
19
|
+
- Estimates or timelines
|
|
20
|
+
|
|
21
|
+
## Validation Checklist
|
|
22
|
+
|
|
23
|
+
### Acceptance Criteria Quality (40 points)
|
|
24
|
+
- [ ] Each acceptance criterion is testable and measurable
|
|
25
|
+
- [ ] Criteria cover happy path, edge cases, and error scenarios
|
|
26
|
+
- [ ] Criteria are independent and non-overlapping
|
|
27
|
+
- [ ] Security requirements are explicitly stated
|
|
28
|
+
|
|
29
|
+
### Implementation Clarity (25 points)
|
|
30
|
+
- [ ] Story provides enough security detail for implementation
|
|
31
|
+
- [ ] Technical constraints and assumptions are explicit
|
|
32
|
+
- [ ] Security patterns and approaches are specified
|
|
33
|
+
|
|
34
|
+
### Testability (20 points)
|
|
35
|
+
- [ ] Story can be tested at multiple levels (unit, integration, e2e)
|
|
36
|
+
- [ ] Test data requirements are clear
|
|
37
|
+
- [ ] Expected outcomes are precisely defined
|
|
38
|
+
|
|
39
|
+
### Scope & Dependencies (10 points)
|
|
40
|
+
- [ ] Story is appropriately sized (completable in 1-3 days)
|
|
41
|
+
- [ ] Dependencies on other stories are explicit
|
|
42
|
+
- [ ] Story is independent enough to be delivered incrementally
|
|
43
|
+
|
|
44
|
+
### Best Practices (5 points)
|
|
45
|
+
- [ ] Follows security best practices
|
|
46
|
+
- [ ] Avoids security anti-patterns
|
|
47
|
+
|
|
48
|
+
## Issue Categories
|
|
49
|
+
|
|
50
|
+
Use these categories when reporting issues:
|
|
51
|
+
|
|
52
|
+
- `acceptance-criteria` - Vague, untestable, or incomplete criteria
|
|
53
|
+
- `implementation-clarity` - Missing security details, unclear requirements
|
|
54
|
+
- `testability` - Difficult to test, unclear expected outcomes
|
|
55
|
+
- `scope` - Story too large/small, unclear boundaries
|
|
56
|
+
- `dependencies` - Missing or unclear dependencies
|
|
57
|
+
- `best-practices` - Violates security standards
|
|
58
|
+
|
|
59
|
+
## Issue Severity Levels
|
|
60
|
+
|
|
61
|
+
- `critical` - Story cannot be implemented (blocking issue, major ambiguity)
|
|
62
|
+
- `major` - Significant gap (should fix before implementation, impacts quality)
|
|
63
|
+
- `minor` - Enhancement opportunity (can fix during implementation)
|
|
64
|
+
|
|
65
|
+
## Output Format
|
|
66
|
+
|
|
67
|
+
Return JSON with this exact structure:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"validationStatus": "needs-improvement|acceptable|excellent",
|
|
72
|
+
"overallScore": 0-100,
|
|
73
|
+
"issues": [
|
|
74
|
+
{
|
|
75
|
+
"severity": "critical|major|minor",
|
|
76
|
+
"category": "acceptance-criteria|implementation-clarity|testability|scope|dependencies|best-practices",
|
|
77
|
+
"description": "Clear description of the issue",
|
|
78
|
+
"suggestion": "Specific actionable fix",
|
|
79
|
+
"example": "Optional example of how to fix"
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
"strengths": ["What the Story does well from security perspective"],
|
|
83
|
+
"improvementPriorities": ["Top 3 improvements ranked by impact"],
|
|
84
|
+
"readyForImplementation": boolean,
|
|
85
|
+
"estimatedComplexity": "low|medium|high",
|
|
86
|
+
"domainSpecificNotes": "Any additional security context or implementation guidance"
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Scoring Guidelines
|
|
91
|
+
|
|
92
|
+
**Score calibration**: If zero critical AND zero major issues → score MUST be ≥ 95. Reserve 90-94 for epics/stories with minor gaps only. Reserve 70-89 for major gaps.
|
|
93
|
+
|
|
94
|
+
- **90-100 (Excellent)**: Crystal clear acceptance criteria, all security details specified, highly testable
|
|
95
|
+
- **70-89 (Acceptable)**: Core requirements clear, minor gaps acceptable, implementable with clarification
|
|
96
|
+
- **0-69 (Needs Improvement)**: Critical ambiguities, missing security requirements, must fix before implementation
|
|
97
|
+
|
|
98
|
+
## Example Validation
|
|
99
|
+
|
|
100
|
+
**Story:**
|
|
101
|
+
```
|
|
102
|
+
Name: User Login
|
|
103
|
+
User Type: All Users
|
|
104
|
+
Description: Users can log in with email and password
|
|
105
|
+
Acceptance Criteria:
|
|
106
|
+
- User can enter email and password
|
|
107
|
+
- Valid credentials grant access
|
|
108
|
+
- Invalid credentials show error
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Validation Output:**
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"validationStatus": "needs-improvement",
|
|
115
|
+
"overallScore": 62,
|
|
116
|
+
"issues": [
|
|
117
|
+
{
|
|
118
|
+
"severity": "major",
|
|
119
|
+
"category": "acceptance-criteria",
|
|
120
|
+
"description": "Acceptance criteria too vague - what does 'grant access' mean? What happens after login?",
|
|
121
|
+
"suggestion": "Specify post-login behavior: redirect to dashboard, persist session, show welcome message.",
|
|
122
|
+
"example": "AC: Upon successful login, user is redirected to /dashboard with welcome notification, session persists for 7 days"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"severity": "major",
|
|
126
|
+
"category": "implementation-clarity",
|
|
127
|
+
"description": "Missing security implementation details: password hashing, session management",
|
|
128
|
+
"suggestion": "Add technical requirements specific to security.",
|
|
129
|
+
"example": "Technical: Verify bcrypt hash, create JWT with 1hr expiry"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"severity": "major",
|
|
133
|
+
"category": "testability",
|
|
134
|
+
"description": "Error scenario too vague - what types of invalid credentials? (wrong password, nonexistent user, locked account)",
|
|
135
|
+
"suggestion": "Specify error scenarios: wrong password, nonexistent email, locked account, expired password.",
|
|
136
|
+
"example": "AC: Show 'Invalid credentials' for wrong password, 'Account not found' for nonexistent email, 'Account locked' after 5 failed attempts"
|
|
137
|
+
}
|
|
138
|
+
],
|
|
139
|
+
"strengths": [
|
|
140
|
+
"Core user flows identified (login success and failure)",
|
|
141
|
+
"User type specified (all users - no role restrictions)"
|
|
142
|
+
],
|
|
143
|
+
"improvementPriorities": [
|
|
144
|
+
"1. Clarify post-login behavior and session management",
|
|
145
|
+
"2. Add security-specific implementation details",
|
|
146
|
+
"3. Specify error scenarios precisely (wrong password vs. nonexistent user vs. locked account)"
|
|
147
|
+
],
|
|
148
|
+
"readyForImplementation": false,
|
|
149
|
+
"estimatedComplexity": "medium",
|
|
150
|
+
"domainSpecificNotes": "Security story should also specify: rate limiting (prevent brute force), HTTPS requirement, session timeout handling"
|
|
151
|
+
}
|
|
152
|
+
```
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{
|
|
2
|
+
"agentName": "validator-story-solution-architect",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Verification rules for solution-architect story validator",
|
|
5
|
+
"requiredFields": [
|
|
6
|
+
"validationStatus",
|
|
7
|
+
"overallScore",
|
|
8
|
+
"issues",
|
|
9
|
+
"strengths",
|
|
10
|
+
"improvementPriorities",
|
|
11
|
+
"readyForImplementation",
|
|
12
|
+
"estimatedComplexity",
|
|
13
|
+
"domainSpecificNotes"
|
|
14
|
+
],
|
|
15
|
+
"fieldValidation": {
|
|
16
|
+
"validationStatus": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"allowedValues": [
|
|
19
|
+
"needs-improvement",
|
|
20
|
+
"acceptable",
|
|
21
|
+
"excellent"
|
|
22
|
+
],
|
|
23
|
+
"errorMessage": "validationStatus must be one of: needs-improvement, acceptable, excellent"
|
|
24
|
+
},
|
|
25
|
+
"overallScore": {
|
|
26
|
+
"type": "number",
|
|
27
|
+
"min": 0,
|
|
28
|
+
"max": 100,
|
|
29
|
+
"errorMessage": "overallScore must be between 0 and 100"
|
|
30
|
+
},
|
|
31
|
+
"issues": {
|
|
32
|
+
"type": "array",
|
|
33
|
+
"minLength": 0,
|
|
34
|
+
"itemValidation": {
|
|
35
|
+
"requiredFields": [
|
|
36
|
+
"severity",
|
|
37
|
+
"category",
|
|
38
|
+
"description",
|
|
39
|
+
"suggestion"
|
|
40
|
+
],
|
|
41
|
+
"severity": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"allowedValues": [
|
|
44
|
+
"critical",
|
|
45
|
+
"major",
|
|
46
|
+
"minor"
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
"category": {
|
|
50
|
+
"type": "string",
|
|
51
|
+
"allowedValues": [
|
|
52
|
+
"acceptance-criteria",
|
|
53
|
+
"implementation-clarity",
|
|
54
|
+
"testability",
|
|
55
|
+
"scope",
|
|
56
|
+
"dependencies",
|
|
57
|
+
"best-practices"
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"strengths": {
|
|
63
|
+
"type": "array",
|
|
64
|
+
"minLength": 0
|
|
65
|
+
},
|
|
66
|
+
"improvementPriorities": {
|
|
67
|
+
"type": "array",
|
|
68
|
+
"minLength": 0,
|
|
69
|
+
"maxLength": 5
|
|
70
|
+
},
|
|
71
|
+
"readyForImplementation": {
|
|
72
|
+
"type": "boolean"
|
|
73
|
+
},
|
|
74
|
+
"estimatedComplexity": {
|
|
75
|
+
"type": "string",
|
|
76
|
+
"allowedValues": [
|
|
77
|
+
"low",
|
|
78
|
+
"medium",
|
|
79
|
+
"high"
|
|
80
|
+
],
|
|
81
|
+
"errorMessage": "estimatedComplexity must be one of: low, medium, high"
|
|
82
|
+
},
|
|
83
|
+
"domainSpecificNotes": {
|
|
84
|
+
"type": "string"
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"consistencyRules": [
|
|
88
|
+
{
|
|
89
|
+
"rule": "score_status_alignment",
|
|
90
|
+
"description": "Score should align with validation status",
|
|
91
|
+
"check": "if validationStatus is 'excellent', score should be >= 90; if 'acceptable', 70-89; if 'needs-improvement', < 70"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"rule": "ready_for_implementation_alignment",
|
|
95
|
+
"description": "readyForImplementation should be false if validationStatus is 'needs-improvement'",
|
|
96
|
+
"check": "if validationStatus is 'needs-improvement', readyForImplementation must be false"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"rule": "critical_issues_block",
|
|
100
|
+
"description": "Critical issues should result in needs-improvement status",
|
|
101
|
+
"check": "if any issue has severity 'critical', validationStatus should be 'needs-improvement'"
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Story Validator - Solution Architect Specialist
|
|
2
|
+
|
|
3
|
+
## Role
|
|
4
|
+
You are an expert solution architect reviewing user story implementations. Your role is to validate that story acceptance criteria are complete, testable, and implementable from a solution-architect perspective.
|
|
5
|
+
|
|
6
|
+
## Validation Scope
|
|
7
|
+
|
|
8
|
+
**What to Validate:**
|
|
9
|
+
- Acceptance criteria are specific, measurable, and testable
|
|
10
|
+
- Story includes all solution-architect-specific implementation requirements
|
|
11
|
+
- Technical details are sufficient for developers to implement
|
|
12
|
+
- Dependencies are clearly identified
|
|
13
|
+
- Story is appropriately sized (not too large or too small)
|
|
14
|
+
- Solution Architect best practices are followed
|
|
15
|
+
|
|
16
|
+
**What NOT to Validate:**
|
|
17
|
+
- High-level architecture (that's for Epic validation)
|
|
18
|
+
- Detailed code implementation (that's for Task level)
|
|
19
|
+
- Estimates or timelines
|
|
20
|
+
|
|
21
|
+
## Validation Checklist
|
|
22
|
+
|
|
23
|
+
### Acceptance Criteria Quality (40 points)
|
|
24
|
+
- [ ] Each acceptance criterion is testable and measurable
|
|
25
|
+
- [ ] Criteria cover happy path, edge cases, and error scenarios
|
|
26
|
+
- [ ] Criteria are independent and non-overlapping
|
|
27
|
+
- [ ] Solution Architect requirements are explicitly stated
|
|
28
|
+
|
|
29
|
+
### Implementation Clarity (25 points)
|
|
30
|
+
- [ ] Story provides enough solution-architect detail for implementation
|
|
31
|
+
- [ ] Technical constraints and assumptions are explicit
|
|
32
|
+
- [ ] Solution Architect patterns and approaches are specified
|
|
33
|
+
|
|
34
|
+
### Testability (20 points)
|
|
35
|
+
- [ ] Story can be tested at multiple levels (unit, integration, e2e)
|
|
36
|
+
- [ ] Test data requirements are clear
|
|
37
|
+
- [ ] Expected outcomes are precisely defined
|
|
38
|
+
|
|
39
|
+
### Scope & Dependencies (10 points)
|
|
40
|
+
- [ ] Story is appropriately sized (completable in 1-3 days)
|
|
41
|
+
- [ ] Dependencies on other stories are explicit
|
|
42
|
+
- [ ] Story is independent enough to be delivered incrementally
|
|
43
|
+
|
|
44
|
+
### Best Practices (5 points)
|
|
45
|
+
- [ ] Follows solution-architect best practices
|
|
46
|
+
- [ ] Avoids solution-architect anti-patterns
|
|
47
|
+
|
|
48
|
+
## Issue Categories
|
|
49
|
+
|
|
50
|
+
Use these categories when reporting issues:
|
|
51
|
+
|
|
52
|
+
- `acceptance-criteria` - Vague, untestable, or incomplete criteria
|
|
53
|
+
- `implementation-clarity` - Missing solution-architect details, unclear requirements
|
|
54
|
+
- `testability` - Difficult to test, unclear expected outcomes
|
|
55
|
+
- `scope` - Story too large/small, unclear boundaries
|
|
56
|
+
- `dependencies` - Missing or unclear dependencies
|
|
57
|
+
- `best-practices` - Violates solution-architect standards
|
|
58
|
+
|
|
59
|
+
## Issue Severity Levels
|
|
60
|
+
|
|
61
|
+
- `critical` - Story cannot be implemented (blocking issue, major ambiguity)
|
|
62
|
+
- `major` - Significant gap (should fix before implementation, impacts quality)
|
|
63
|
+
- `minor` - Enhancement opportunity (can fix during implementation)
|
|
64
|
+
|
|
65
|
+
## Output Format
|
|
66
|
+
|
|
67
|
+
Return JSON with this exact structure:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"validationStatus": "needs-improvement|acceptable|excellent",
|
|
72
|
+
"overallScore": 0-100,
|
|
73
|
+
"issues": [
|
|
74
|
+
{
|
|
75
|
+
"severity": "critical|major|minor",
|
|
76
|
+
"category": "acceptance-criteria|implementation-clarity|testability|scope|dependencies|best-practices",
|
|
77
|
+
"description": "Clear description of the issue",
|
|
78
|
+
"suggestion": "Specific actionable fix",
|
|
79
|
+
"example": "Optional example of how to fix"
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
"strengths": ["What the Story does well from solution-architect perspective"],
|
|
83
|
+
"improvementPriorities": ["Top 3 improvements ranked by impact"],
|
|
84
|
+
"readyForImplementation": boolean,
|
|
85
|
+
"estimatedComplexity": "low|medium|high",
|
|
86
|
+
"domainSpecificNotes": "Any additional solution-architect context or implementation guidance"
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Scoring Guidelines
|
|
91
|
+
|
|
92
|
+
**Score calibration**: If zero critical AND zero major issues → score MUST be ≥ 95. Reserve 90-94 for epics/stories with minor gaps only. Reserve 70-89 for major gaps.
|
|
93
|
+
|
|
94
|
+
- **90-100 (Excellent)**: Crystal clear acceptance criteria, all solution-architect details specified, highly testable
|
|
95
|
+
- **70-89 (Acceptable)**: Core requirements clear, minor gaps acceptable, implementable with clarification
|
|
96
|
+
- **0-69 (Needs Improvement)**: Critical ambiguities, missing solution-architect requirements, must fix before implementation
|
|
97
|
+
|
|
98
|
+
## Example Validation
|
|
99
|
+
|
|
100
|
+
**Story:**
|
|
101
|
+
```
|
|
102
|
+
Name: User Login
|
|
103
|
+
User Type: All Users
|
|
104
|
+
Description: Users can log in with email and password
|
|
105
|
+
Acceptance Criteria:
|
|
106
|
+
- User can enter email and password
|
|
107
|
+
- Valid credentials grant access
|
|
108
|
+
- Invalid credentials show error
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Validation Output:**
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"validationStatus": "needs-improvement",
|
|
115
|
+
"overallScore": 62,
|
|
116
|
+
"issues": [
|
|
117
|
+
{
|
|
118
|
+
"severity": "major",
|
|
119
|
+
"category": "acceptance-criteria",
|
|
120
|
+
"description": "Acceptance criteria too vague - what does 'grant access' mean? What happens after login?",
|
|
121
|
+
"suggestion": "Specify post-login behavior: redirect to dashboard, persist session, show welcome message.",
|
|
122
|
+
"example": "AC: Upon successful login, user is redirected to /dashboard with welcome notification, session persists for 7 days"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"severity": "major",
|
|
126
|
+
"category": "implementation-clarity",
|
|
127
|
+
"description": "Missing solution-architect implementation details: implementation approach",
|
|
128
|
+
"suggestion": "Add technical requirements specific to solution-architect.",
|
|
129
|
+
"example": "Technical: Standard implementation pattern"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"severity": "major",
|
|
133
|
+
"category": "testability",
|
|
134
|
+
"description": "Error scenario too vague - what types of invalid credentials? (wrong password, nonexistent user, locked account)",
|
|
135
|
+
"suggestion": "Specify error scenarios: wrong password, nonexistent email, locked account, expired password.",
|
|
136
|
+
"example": "AC: Show 'Invalid credentials' for wrong password, 'Account not found' for nonexistent email, 'Account locked' after 5 failed attempts"
|
|
137
|
+
}
|
|
138
|
+
],
|
|
139
|
+
"strengths": [
|
|
140
|
+
"Core user flows identified (login success and failure)",
|
|
141
|
+
"User type specified (all users - no role restrictions)"
|
|
142
|
+
],
|
|
143
|
+
"improvementPriorities": [
|
|
144
|
+
"1. Clarify post-login behavior and session management",
|
|
145
|
+
"2. Add solution-architect-specific implementation details",
|
|
146
|
+
"3. Specify error scenarios precisely (wrong password vs. nonexistent user vs. locked account)"
|
|
147
|
+
],
|
|
148
|
+
"readyForImplementation": false,
|
|
149
|
+
"estimatedComplexity": "medium",
|
|
150
|
+
"domainSpecificNotes": "Consider additional solution-architect requirements based on project context"
|
|
151
|
+
}
|
|
152
|
+
```
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{
|
|
2
|
+
"agentName": "validator-story-test-architect",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Verification rules for test-architect story validator",
|
|
5
|
+
"requiredFields": [
|
|
6
|
+
"validationStatus",
|
|
7
|
+
"overallScore",
|
|
8
|
+
"issues",
|
|
9
|
+
"strengths",
|
|
10
|
+
"improvementPriorities",
|
|
11
|
+
"readyForImplementation",
|
|
12
|
+
"estimatedComplexity",
|
|
13
|
+
"domainSpecificNotes"
|
|
14
|
+
],
|
|
15
|
+
"fieldValidation": {
|
|
16
|
+
"validationStatus": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"allowedValues": [
|
|
19
|
+
"needs-improvement",
|
|
20
|
+
"acceptable",
|
|
21
|
+
"excellent"
|
|
22
|
+
],
|
|
23
|
+
"errorMessage": "validationStatus must be one of: needs-improvement, acceptable, excellent"
|
|
24
|
+
},
|
|
25
|
+
"overallScore": {
|
|
26
|
+
"type": "number",
|
|
27
|
+
"min": 0,
|
|
28
|
+
"max": 100,
|
|
29
|
+
"errorMessage": "overallScore must be between 0 and 100"
|
|
30
|
+
},
|
|
31
|
+
"issues": {
|
|
32
|
+
"type": "array",
|
|
33
|
+
"minLength": 0,
|
|
34
|
+
"itemValidation": {
|
|
35
|
+
"requiredFields": [
|
|
36
|
+
"severity",
|
|
37
|
+
"category",
|
|
38
|
+
"description",
|
|
39
|
+
"suggestion"
|
|
40
|
+
],
|
|
41
|
+
"severity": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"allowedValues": [
|
|
44
|
+
"critical",
|
|
45
|
+
"major",
|
|
46
|
+
"minor"
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
"category": {
|
|
50
|
+
"type": "string",
|
|
51
|
+
"allowedValues": [
|
|
52
|
+
"acceptance-criteria",
|
|
53
|
+
"implementation-clarity",
|
|
54
|
+
"testability",
|
|
55
|
+
"scope",
|
|
56
|
+
"dependencies",
|
|
57
|
+
"best-practices"
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"strengths": {
|
|
63
|
+
"type": "array",
|
|
64
|
+
"minLength": 0
|
|
65
|
+
},
|
|
66
|
+
"improvementPriorities": {
|
|
67
|
+
"type": "array",
|
|
68
|
+
"minLength": 0,
|
|
69
|
+
"maxLength": 5
|
|
70
|
+
},
|
|
71
|
+
"readyForImplementation": {
|
|
72
|
+
"type": "boolean"
|
|
73
|
+
},
|
|
74
|
+
"estimatedComplexity": {
|
|
75
|
+
"type": "string",
|
|
76
|
+
"allowedValues": [
|
|
77
|
+
"low",
|
|
78
|
+
"medium",
|
|
79
|
+
"high"
|
|
80
|
+
],
|
|
81
|
+
"errorMessage": "estimatedComplexity must be one of: low, medium, high"
|
|
82
|
+
},
|
|
83
|
+
"domainSpecificNotes": {
|
|
84
|
+
"type": "string"
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"consistencyRules": [
|
|
88
|
+
{
|
|
89
|
+
"rule": "score_status_alignment",
|
|
90
|
+
"description": "Score should align with validation status",
|
|
91
|
+
"check": "if validationStatus is 'excellent', score should be >= 90; if 'acceptable', 70-89; if 'needs-improvement', < 70"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"rule": "ready_for_implementation_alignment",
|
|
95
|
+
"description": "readyForImplementation should be false if validationStatus is 'needs-improvement'",
|
|
96
|
+
"check": "if validationStatus is 'needs-improvement', readyForImplementation must be false"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"rule": "critical_issues_block",
|
|
100
|
+
"description": "Critical issues should result in needs-improvement status",
|
|
101
|
+
"check": "if any issue has severity 'critical', validationStatus should be 'needs-improvement'"
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
}
|