@trohde/earos 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +156 -0
- package/assets/init/.agents/skills/earos-artifact-gen/SKILL.md +106 -0
- package/assets/init/.agents/skills/earos-artifact-gen/references/interview-guide.md +313 -0
- package/assets/init/.agents/skills/earos-artifact-gen/references/output-guide.md +367 -0
- package/assets/init/.agents/skills/earos-assess/SKILL.md +212 -0
- package/assets/init/.agents/skills/earos-assess/references/calibration-benchmarks.md +160 -0
- package/assets/init/.agents/skills/earos-assess/references/output-templates.md +311 -0
- package/assets/init/.agents/skills/earos-assess/references/scoring-protocol.md +281 -0
- package/assets/init/.agents/skills/earos-calibrate/SKILL.md +153 -0
- package/assets/init/.agents/skills/earos-calibrate/references/agreement-metrics.md +188 -0
- package/assets/init/.agents/skills/earos-calibrate/references/calibration-protocol.md +263 -0
- package/assets/init/.agents/skills/earos-create/SKILL.md +257 -0
- package/assets/init/.agents/skills/earos-create/references/criterion-writing-guide.md +268 -0
- package/assets/init/.agents/skills/earos-create/references/dependency-rules.md +193 -0
- package/assets/init/.agents/skills/earos-create/references/rubric-interview-guide.md +123 -0
- package/assets/init/.agents/skills/earos-create/references/validation-checklist.md +238 -0
- package/assets/init/.agents/skills/earos-profile-author/SKILL.md +251 -0
- package/assets/init/.agents/skills/earos-profile-author/references/criterion-writing-guide.md +280 -0
- package/assets/init/.agents/skills/earos-profile-author/references/design-methods.md +158 -0
- package/assets/init/.agents/skills/earos-profile-author/references/profile-checklist.md +173 -0
- package/assets/init/.agents/skills/earos-remediate/SKILL.md +118 -0
- package/assets/init/.agents/skills/earos-remediate/references/output-template.md +199 -0
- package/assets/init/.agents/skills/earos-remediate/references/remediation-patterns.md +330 -0
- package/assets/init/.agents/skills/earos-report/SKILL.md +85 -0
- package/assets/init/.agents/skills/earos-report/references/portfolio-template.md +181 -0
- package/assets/init/.agents/skills/earos-report/references/single-artifact-template.md +168 -0
- package/assets/init/.agents/skills/earos-review/SKILL.md +130 -0
- package/assets/init/.agents/skills/earos-review/references/challenge-patterns.md +163 -0
- package/assets/init/.agents/skills/earos-review/references/output-template.md +180 -0
- package/assets/init/.agents/skills/earos-template-fill/SKILL.md +177 -0
- package/assets/init/.agents/skills/earos-template-fill/references/evidence-writing-guide.md +186 -0
- package/assets/init/.agents/skills/earos-template-fill/references/section-rubric-mapping.md +200 -0
- package/assets/init/.agents/skills/earos-validate/SKILL.md +113 -0
- package/assets/init/.agents/skills/earos-validate/references/fix-patterns.md +281 -0
- package/assets/init/.agents/skills/earos-validate/references/validation-checks.md +287 -0
- package/assets/init/.claude/CLAUDE.md +4 -0
- package/assets/init/AGENTS.md +293 -0
- package/assets/init/CLAUDE.md +635 -0
- package/assets/init/README.md +507 -0
- package/assets/init/calibration/gold-set/.gitkeep +0 -0
- package/assets/init/calibration/results/.gitkeep +0 -0
- package/assets/init/core/core-meta-rubric.yaml +643 -0
- package/assets/init/docs/consistency-report.md +325 -0
- package/assets/init/docs/getting-started.md +194 -0
- package/assets/init/docs/profile-authoring-guide.md +51 -0
- package/assets/init/docs/terminology.md +126 -0
- package/assets/init/earos.manifest.yaml +104 -0
- package/assets/init/evaluations/.gitkeep +0 -0
- package/assets/init/examples/aws-event-driven-order-processing/artifact.yaml +2056 -0
- package/assets/init/examples/aws-event-driven-order-processing/evaluation.yaml +973 -0
- package/assets/init/examples/aws-event-driven-order-processing/report.md +244 -0
- package/assets/init/examples/example-solution-architecture.evaluation.yaml +136 -0
- package/assets/init/examples/multi-cloud-data-analytics/artifact.yaml +715 -0
- package/assets/init/overlays/data-governance.yaml +94 -0
- package/assets/init/overlays/regulatory.yaml +154 -0
- package/assets/init/overlays/security.yaml +92 -0
- package/assets/init/profiles/adr.yaml +225 -0
- package/assets/init/profiles/capability-map.yaml +223 -0
- package/assets/init/profiles/reference-architecture.yaml +426 -0
- package/assets/init/profiles/roadmap.yaml +205 -0
- package/assets/init/profiles/solution-architecture.yaml +227 -0
- package/assets/init/research/architecture-assessment-rubrics-research.docx +0 -0
- package/assets/init/research/architecture-assessment-rubrics-research.md +566 -0
- package/assets/init/research/reference-architecture-research.md +751 -0
- package/assets/init/standard/EAROS.md +1426 -0
- package/assets/init/standard/schemas/artifact.schema.json +1295 -0
- package/assets/init/standard/schemas/artifact.uischema.json +65 -0
- package/assets/init/standard/schemas/evaluation.schema.json +284 -0
- package/assets/init/standard/schemas/rubric.schema.json +383 -0
- package/assets/init/templates/evaluation-record.template.yaml +58 -0
- package/assets/init/templates/new-profile.template.yaml +65 -0
- package/bin.js +188 -0
- package/dist/assets/_basePickBy-BVu6YmSW.js +1 -0
- package/dist/assets/_baseUniq-CWRzQDz_.js +1 -0
- package/dist/assets/arc-CyDBhtDM.js +1 -0
- package/dist/assets/architectureDiagram-2XIMDMQ5-BH6O4dvN.js +36 -0
- package/dist/assets/blockDiagram-WCTKOSBZ-2xmwdjpg.js +132 -0
- package/dist/assets/c4Diagram-IC4MRINW-BNmPRFJF.js +10 -0
- package/dist/assets/channel-CiySTNoJ.js +1 -0
- package/dist/assets/chunk-4BX2VUAB-DGQTvirp.js +1 -0
- package/dist/assets/chunk-55IACEB6-DNMAQAC_.js +1 -0
- package/dist/assets/chunk-FMBD7UC4-BJbVTQ5o.js +15 -0
- package/dist/assets/chunk-JSJVCQXG-BCxUL74A.js +1 -0
- package/dist/assets/chunk-KX2RTZJC-H7wWZOfz.js +1 -0
- package/dist/assets/chunk-NQ4KR5QH-BK4RlTQF.js +220 -0
- package/dist/assets/chunk-QZHKN3VN-0chxDV5g.js +1 -0
- package/dist/assets/chunk-WL4C6EOR-DexfQ-AV.js +189 -0
- package/dist/assets/classDiagram-VBA2DB6C-D7luWJQn.js +1 -0
- package/dist/assets/classDiagram-v2-RAHNMMFH-D7luWJQn.js +1 -0
- package/dist/assets/clone-ylgRbd3D.js +1 -0
- package/dist/assets/cose-bilkent-S5V4N54A-DS2IOCfZ.js +1 -0
- package/dist/assets/cytoscape.esm-CyJtwmzi.js +331 -0
- package/dist/assets/dagre-KLK3FWXG-BbSoTTa3.js +4 -0
- package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dist/assets/diagram-E7M64L7V-C9TvYgv0.js +24 -0
- package/dist/assets/diagram-IFDJBPK2-DowUMWrg.js +43 -0
- package/dist/assets/diagram-P4PSJMXO-BL6nrnQF.js +24 -0
- package/dist/assets/erDiagram-INFDFZHY-rXPRl8VM.js +70 -0
- package/dist/assets/flowDiagram-PKNHOUZH-DBRM99-W.js +162 -0
- package/dist/assets/ganttDiagram-A5KZAMGK-INcWFsBT.js +292 -0
- package/dist/assets/gitGraphDiagram-K3NZZRJ6-DMwpfE91.js +65 -0
- package/dist/assets/graph-DLQn37b-.js +1 -0
- package/dist/assets/index-BFFITMT8.js +650 -0
- package/dist/assets/index-H7f6VTz1.css +1 -0
- package/dist/assets/infoDiagram-LFFYTUFH-B0f4TWRM.js +2 -0
- package/dist/assets/init-Gi6I4Gst.js +1 -0
- package/dist/assets/ishikawaDiagram-PHBUUO56-CsU6XimZ.js +70 -0
- package/dist/assets/journeyDiagram-4ABVD52K-CQ7ibNib.js +139 -0
- package/dist/assets/kanban-definition-K7BYSVSG-DzEN7THt.js +89 -0
- package/dist/assets/katex-B1X10hvy.js +261 -0
- package/dist/assets/layout-C0dvb42R.js +1 -0
- package/dist/assets/linear-j4a8mGj7.js +1 -0
- package/dist/assets/mindmap-definition-YRQLILUH-DP8iEuCf.js +68 -0
- package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/assets/pieDiagram-SKSYHLDU-BpIAXgAm.js +30 -0
- package/dist/assets/quadrantDiagram-337W2JSQ-DrpXn5Eg.js +7 -0
- package/dist/assets/requirementDiagram-Z7DCOOCP-Bg7EwHlG.js +73 -0
- package/dist/assets/sankeyDiagram-WA2Y5GQK-BWagRs1F.js +10 -0
- package/dist/assets/sequenceDiagram-2WXFIKYE-q5jwhivG.js +145 -0
- package/dist/assets/stateDiagram-RAJIS63D-B_J9pE-2.js +1 -0
- package/dist/assets/stateDiagram-v2-FVOUBMTO-Q_1GcybB.js +1 -0
- package/dist/assets/timeline-definition-YZTLITO2-dv0jgQ0z.js +61 -0
- package/dist/assets/treemap-KZPCXAKY-Dt1dkIE7.js +162 -0
- package/dist/assets/vennDiagram-LZ73GAT5-BdO5RgRZ.js +34 -0
- package/dist/assets/xychartDiagram-JWTSCODW-CpDVe-8v.js +7 -0
- package/dist/index.html +23 -0
- package/export-docx.js +1583 -0
- package/init.js +353 -0
- package/manifest-cli.mjs +207 -0
- package/package.json +83 -0
- package/schemas/artifact.schema.json +1295 -0
- package/schemas/artifact.uischema.json +65 -0
- package/schemas/evaluation.schema.json +284 -0
- package/schemas/rubric.schema.json +383 -0
- package/serve.js +238 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
# Fix Patterns -- EAROS Validate
|
|
2
|
+
|
|
3
|
+
Common validation errors, root causes, and fixes. Read this after finding errors with earos-validate.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## How to Use This File
|
|
8
|
+
|
|
9
|
+
Each section corresponds to an error type from references/validation-checks.md.
|
|
10
|
+
Find your error, apply the fix, then re-run the relevant check to confirm.
|
|
11
|
+
|
|
12
|
+
**Rule:** earos-validate reports; it does not auto-fix. Present fixes to the user for review.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Fix Pattern 1 -- Missing Required Top-Level Fields
|
|
17
|
+
|
|
18
|
+
Root cause: Profile authored before v2 or copied from an older template without the new fields.
|
|
19
|
+
|
|
20
|
+
Add missing outputs sub-fields:
|
|
21
|
+
|
|
22
|
+
outputs:
|
|
23
|
+
require_evidence_refs: true
|
|
24
|
+
require_confidence: true
|
|
25
|
+
require_actions: true
|
|
26
|
+
require_evidence_class: true
|
|
27
|
+
require_evidence_anchors: true
|
|
28
|
+
|
|
29
|
+
Add missing calibration block:
|
|
30
|
+
|
|
31
|
+
calibration:
|
|
32
|
+
required_before_production: true
|
|
33
|
+
minimum_examples: 3
|
|
34
|
+
|
|
35
|
+
Add missing change_log:
|
|
36
|
+
|
|
37
|
+
change_log:
|
|
38
|
+
- version: 1.0.0
|
|
39
|
+
date: "YYYY-MM-DD"
|
|
40
|
+
author: enterprise-architecture
|
|
41
|
+
notes: "Initial draft"
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Fix Pattern 2 -- Wrong scoring.method for Kind
|
|
46
|
+
|
|
47
|
+
Root cause: Overlay created by copying a profile without updating the scoring method.
|
|
48
|
+
|
|
49
|
+
Overlays must use:
|
|
50
|
+
|
|
51
|
+
scoring:
|
|
52
|
+
method: append_to_base_rubric
|
|
53
|
+
|
|
54
|
+
Profiles and core rubric must use:
|
|
55
|
+
|
|
56
|
+
scoring:
|
|
57
|
+
method: gates_first_then_weighted_average
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Fix Pattern 3 -- Missing inherits on Profile
|
|
62
|
+
|
|
63
|
+
Root cause: Profile created without the inherits declaration. Without this, core criteria are not applied.
|
|
64
|
+
|
|
65
|
+
Add after the header fields, before design_method:
|
|
66
|
+
|
|
67
|
+
inherits:
|
|
68
|
+
- EAROS-CORE-002
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Fix Pattern 4 -- Missing Criterion v2 Fields
|
|
73
|
+
|
|
74
|
+
The 13 required v2 fields must all be present. Common missing fields and fixes:
|
|
75
|
+
|
|
76
|
+
**decision_tree** -- must have IF/THEN branching logic. Placeholder text is not acceptable:
|
|
77
|
+
|
|
78
|
+
decision_tree: >
|
|
79
|
+
IF X absent: score 0.
|
|
80
|
+
IF X present but incomplete: score 1-2 depending on coverage.
|
|
81
|
+
IF X and Y both present with basic detail: score 3.
|
|
82
|
+
IF X and Y present with explicit rationale and evidence: score 4.
|
|
83
|
+
|
|
84
|
+
**examples.bad** -- must show the actual failure mode text (quotable), not a description of the failure:
|
|
85
|
+
|
|
86
|
+
examples:
|
|
87
|
+
good:
|
|
88
|
+
- "Section 4.2 explicitly lists A, B, C as in-scope and D, E as out-of-scope."
|
|
89
|
+
bad:
|
|
90
|
+
- "The scope of this project covers the relevant systems."
|
|
91
|
+
|
|
92
|
+
**scoring_guide** -- all 5 levels ("0" through "4") must be present and non-empty. Authors most
|
|
93
|
+
commonly skip "0" or "4". Level descriptors must be criterion-specific, not generic:
|
|
94
|
+
|
|
95
|
+
scoring_guide:
|
|
96
|
+
"0": "No [criterion-specific evidence] present."
|
|
97
|
+
"1": "Mentioned but too vague for decision support."
|
|
98
|
+
"2": "Addressed but incomplete; key elements missing."
|
|
99
|
+
"3": "Clearly addressed with adequate evidence; only minor gaps."
|
|
100
|
+
"4": "Fully addressed, well evidenced, internally consistent."
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Fix Pattern 5 -- Invalid gate Configuration
|
|
105
|
+
|
|
106
|
+
Valid severity values: critical, major, advisory. Other values (high, low, warn, blocker) are invalid.
|
|
107
|
+
|
|
108
|
+
Disabled gate must use the canonical form:
|
|
109
|
+
|
|
110
|
+
gate: false
|
|
111
|
+
|
|
112
|
+
Not the verbose form (style violation, causes YAML-STYLE warnings):
|
|
113
|
+
|
|
114
|
+
gate:
|
|
115
|
+
enabled: false
|
|
116
|
+
|
|
117
|
+
Enabled gate must have failure_effect explaining what happens when the gate fails:
|
|
118
|
+
|
|
119
|
+
gate:
|
|
120
|
+
enabled: true
|
|
121
|
+
severity: major
|
|
122
|
+
failure_effect: >
|
|
123
|
+
Cannot achieve Pass status. Status caps at Conditional Pass
|
|
124
|
+
until this criterion scores >= 2.
|
|
125
|
+
|
|
126
|
+
Gate distribution targets for a well-designed profile:
|
|
127
|
+
- gate: false -- most criteria (60-70%)
|
|
128
|
+
- severity: advisory -- 0-3 criteria
|
|
129
|
+
- severity: major -- 1-2 criteria
|
|
130
|
+
- severity: critical -- 0-1 criteria (reserved for mandatory compliance controls only)
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Fix Pattern 6 -- Duplicate Criterion IDs
|
|
135
|
+
|
|
136
|
+
Root cause: Criterion ID from one profile reused in another, or accidental duplication within a file.
|
|
137
|
+
|
|
138
|
+
Criterion IDs must be globally unique across all files. Add a profile-specific prefix to resolve collisions:
|
|
139
|
+
|
|
140
|
+
# Before: id: SCP-01 (conflicts with core criterion SCP-01)
|
|
141
|
+
# After:
|
|
142
|
+
id: SA-SCP-01
|
|
143
|
+
|
|
144
|
+
Naming conventions:
|
|
145
|
+
- Reference Architecture: RA-[AREA]-NN
|
|
146
|
+
- Solution Architecture: SA-[AREA]-NN
|
|
147
|
+
- ADR: ADR-[AREA]-NN
|
|
148
|
+
- Capability Map: CM-[AREA]-NN
|
|
149
|
+
- Roadmap: RM-[AREA]-NN
|
|
150
|
+
- Overlays: [PREFIX]-[CONCERN]-NN (e.g., SEC-AUTH-01, DG-CLASS-01)
|
|
151
|
+
|
|
152
|
+
After renaming: search all evaluation records for the old ID and update them.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Fix Pattern 7 -- Broken Cross-References
|
|
157
|
+
|
|
158
|
+
**inherits version mismatch:**
|
|
159
|
+
|
|
160
|
+
Read core/core-meta-rubric.yaml to find the actual rubric_id value. Update the profile to match exactly:
|
|
161
|
+
|
|
162
|
+
inherits:
|
|
163
|
+
- EAROS-CORE-002
|
|
164
|
+
|
|
165
|
+
**Missing overlay in evaluation record:**
|
|
166
|
+
|
|
167
|
+
Either add the overlay YAML to overlays/ with the referenced ID, or remove the overlay_applied reference
|
|
168
|
+
if the overlay was not actually applied.
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## Fix Pattern 8 -- Evaluation Record Status Inconsistency
|
|
173
|
+
|
|
174
|
+
Root cause: Status was set manually and not rechecked after scores changed, or gate logic was not applied.
|
|
175
|
+
|
|
176
|
+
Recompute status from rules (apply in order):
|
|
177
|
+
1. Any critical gate failure -> reject (ignore overall_score)
|
|
178
|
+
2. Any major gate that caps -> conditional_pass (maximum allowed)
|
|
179
|
+
3. overall_score >= 3.2 AND no dimension < 2.0 -> pass
|
|
180
|
+
4. overall_score 2.4-3.19 -> conditional_pass
|
|
181
|
+
5. overall_score < 2.4 OR any dimension < 2.0 -> rework_required
|
|
182
|
+
6. Evidence insufficient to score core gate criteria -> not_reviewable
|
|
183
|
+
|
|
184
|
+
Example fix:
|
|
185
|
+
|
|
186
|
+
# Before (wrong -- score of 3.4 is pass, not conditional_pass)
|
|
187
|
+
status: conditional_pass
|
|
188
|
+
overall_score: 3.4
|
|
189
|
+
gate_failures: []
|
|
190
|
+
|
|
191
|
+
# After (correct)
|
|
192
|
+
status: pass
|
|
193
|
+
overall_score: 3.4
|
|
194
|
+
gate_failures: []
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Fix Pattern 9 -- Documentation Accuracy
|
|
199
|
+
|
|
200
|
+
**Stale file references:** Update documentation to remove references to non-existent files,
|
|
201
|
+
or create the missing file if it genuinely should exist.
|
|
202
|
+
|
|
203
|
+
**Wrong criterion counts:** Count every item under criteria: within each dimension block.
|
|
204
|
+
Update the documentation claim to match the actual count from the YAML.
|
|
205
|
+
|
|
206
|
+
**Mismatched rubric IDs:** Read the YAML file to get the exact rubric_id value.
|
|
207
|
+
Update documentation to use the exact string -- even minor differences (CORE-001 vs CORE-002) matter.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Fix Pattern 10 -- YAML Style Violations
|
|
212
|
+
|
|
213
|
+
**Unquoted numeric keys in scoring_guide:**
|
|
214
|
+
|
|
215
|
+
# Before (causes parsing issues in some YAML tools)
|
|
216
|
+
scoring_guide:
|
|
217
|
+
0: "Absent"
|
|
218
|
+
|
|
219
|
+
# After (EAROS convention)
|
|
220
|
+
scoring_guide:
|
|
221
|
+
"0": "Absent"
|
|
222
|
+
|
|
223
|
+
**4-space to 2-space indentation:**
|
|
224
|
+
|
|
225
|
+
# Before (4-space -- violates EAROS convention)
|
|
226
|
+
dimensions:
|
|
227
|
+
- id: CM-D1
|
|
228
|
+
name: Capability coverage
|
|
229
|
+
|
|
230
|
+
# After (2-space -- correct)
|
|
231
|
+
dimensions:
|
|
232
|
+
- id: CM-D1
|
|
233
|
+
name: Capability coverage
|
|
234
|
+
|
|
235
|
+
**Placeholder decision_tree (no branching logic):**
|
|
236
|
+
|
|
237
|
+
# Before (not acceptable)
|
|
238
|
+
decision_tree: "Apply the scoring guide to determine the score."
|
|
239
|
+
|
|
240
|
+
# After (valid -- observable conditions, explicit branches)
|
|
241
|
+
decision_tree: >
|
|
242
|
+
IF no capability areas defined: score 0.
|
|
243
|
+
IF 1-2 areas defined with partial coverage: score 1-2.
|
|
244
|
+
IF all relevant areas covered with named owners: score 3.
|
|
245
|
+
IF all areas, owners, maturity levels, and gap analysis present: score 4.
|
|
246
|
+
|
|
247
|
+
**Verbose gate: false (style violation only, not an error):**
|
|
248
|
+
|
|
249
|
+
# Before
|
|
250
|
+
gate:
|
|
251
|
+
enabled: false
|
|
252
|
+
|
|
253
|
+
# After
|
|
254
|
+
gate: false
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Quick Reference -- Error Code to Fix Pattern
|
|
259
|
+
|
|
260
|
+
| Error code | Fix pattern |
|
|
261
|
+
|-----------|-------------|
|
|
262
|
+
| MISSING top-level field | Fix Pattern 1 |
|
|
263
|
+
| INVALID scoring.method | Fix Pattern 2 |
|
|
264
|
+
| MISSING inherits | Fix Pattern 3 |
|
|
265
|
+
| MISSING criterion field | Fix Pattern 4 |
|
|
266
|
+
| INVALID gate config | Fix Pattern 5 |
|
|
267
|
+
| DUPLICATE ID | Fix Pattern 6 |
|
|
268
|
+
| BROKEN cross-reference | Fix Pattern 7 |
|
|
269
|
+
| STATUS_INCONSISTENCY | Fix Pattern 8 |
|
|
270
|
+
| DOCS accuracy | Fix Pattern 9 |
|
|
271
|
+
| YAML-STYLE violations | Fix Pattern 10 |
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## After Fixing
|
|
276
|
+
|
|
277
|
+
After applying any fix:
|
|
278
|
+
1. Re-run earos-validate on the affected files to confirm the error is resolved
|
|
279
|
+
2. If the fix touched scoring thresholds or gate logic, re-run earos-calibrate on any changed profile
|
|
280
|
+
3. If a criterion ID changed, search all evaluation records for the old ID and update them
|
|
281
|
+
4. Update the changed file change_log with a PATCH version bump and a brief note describing the fix
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
# Validation Checks — EAROS Validate
|
|
2
|
+
|
|
3
|
+
Detailed procedures for each of the 7 validation checks. Run in order — schema conformance first, documentation accuracy last.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Check 1 — Schema Conformance
|
|
8
|
+
|
|
9
|
+
**Purpose:** Verify all YAML files satisfy `standard/schemas/rubric.schema.json` (for rubrics) and `standard/schemas/evaluation.schema.json` (for evaluation records).
|
|
10
|
+
|
|
11
|
+
**Files to check:**
|
|
12
|
+
- `core/core-meta-rubric.yaml`
|
|
13
|
+
- `profiles/*.yaml`
|
|
14
|
+
- `overlays/*.yaml`
|
|
15
|
+
- `examples/*.evaluation.yaml` (against evaluation schema)
|
|
16
|
+
|
|
17
|
+
**Required top-level fields for rubric/profile/overlay:**
|
|
18
|
+
|
|
19
|
+
| Field | Required | Notes |
|
|
20
|
+
|-------|----------|-------|
|
|
21
|
+
| `rubric_id` | Yes | Pattern: `EAROS-[A-Z]+-[0-9]{3}` |
|
|
22
|
+
| `version` | Yes | Semver: `X.Y.Z` |
|
|
23
|
+
| `kind` | Yes | `core_rubric` \| `profile` \| `overlay` |
|
|
24
|
+
| `title` | Yes | Non-empty string |
|
|
25
|
+
| `artifact_type` | Yes | `any` for overlays; specific type for profiles |
|
|
26
|
+
| `dimensions` | Yes | Non-empty array |
|
|
27
|
+
| `scoring` | Yes | Must have `method` and `thresholds` |
|
|
28
|
+
| `outputs` | Yes | Must have `require_evidence_refs`, `require_confidence`, `require_actions`, `require_evidence_class`, `require_evidence_anchors` |
|
|
29
|
+
|
|
30
|
+
**Additional rules by kind:**
|
|
31
|
+
|
|
32
|
+
| Kind | Additional Requirements |
|
|
33
|
+
|------|------------------------|
|
|
34
|
+
| `profile` | Must have `inherits: [EAROS-CORE-002]` |
|
|
35
|
+
| `overlay` | Must NOT have `inherits`; `scoring.method` must be `append_to_base_rubric` |
|
|
36
|
+
| `core_rubric` | No `inherits`; `scoring.method` must be `gates_first_then_weighted_average` |
|
|
37
|
+
|
|
38
|
+
**Per-dimension required fields:** `id`, `name`, `description`, `weight`, `criteria`
|
|
39
|
+
|
|
40
|
+
**Per-criterion required fields (v2 completeness — see Check 2):** 13 fields total.
|
|
41
|
+
|
|
42
|
+
**Error format:**
|
|
43
|
+
```
|
|
44
|
+
[SCHEMA] profiles/capability-map.yaml
|
|
45
|
+
MISSING: outputs.require_evidence_anchors
|
|
46
|
+
MISSING: dimensions[1].criteria[0].examples
|
|
47
|
+
INVALID: version "1" — must be semver (X.Y.Z)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Check 2 — Criterion v2 Completeness
|
|
53
|
+
|
|
54
|
+
**Purpose:** Verify every criterion has all 13 required v2 fields.
|
|
55
|
+
|
|
56
|
+
**The 13 required fields:**
|
|
57
|
+
|
|
58
|
+
| # | Field | What to check |
|
|
59
|
+
|---|-------|---------------|
|
|
60
|
+
| 1 | `id` | Non-empty, unique within file |
|
|
61
|
+
| 2 | `question` | Non-empty string |
|
|
62
|
+
| 3 | `description` | Non-empty string |
|
|
63
|
+
| 4 | `metric_type` | Must be `ordinal` |
|
|
64
|
+
| 5 | `scale` | Must be `[0, 1, 2, 3, 4, "N/A"]` |
|
|
65
|
+
| 6 | `gate` | Either `gate: false` or object with `enabled`, `severity`, `failure_effect` |
|
|
66
|
+
| 7 | `required_evidence` | Non-empty list |
|
|
67
|
+
| 8 | `scoring_guide` | Must have keys `"0"`, `"1"`, `"2"`, `"3"`, `"4"` — all non-empty |
|
|
68
|
+
| 9 | `anti_patterns` | Non-empty list |
|
|
69
|
+
| 10 | `examples` | Must have sub-keys `good` (non-empty list) and `bad` (non-empty list) |
|
|
70
|
+
| 11 | `decision_tree` | Non-empty string — must contain IF/THEN branching language |
|
|
71
|
+
| 12 | `remediation_hints` | Non-empty list |
|
|
72
|
+
| 13 | `weight` (on dimension, not criterion) | Numeric, typically 0.5–2.0 |
|
|
73
|
+
|
|
74
|
+
**Common v2 gaps to check specifically:**
|
|
75
|
+
- `examples` key exists but has no `good` or `bad` sub-keys
|
|
76
|
+
- `scoring_guide` missing `"0"` or `"4"` (authors skip extremes)
|
|
77
|
+
- `decision_tree` is a placeholder like "See scoring guide" (not acceptable)
|
|
78
|
+
- `gate: false` written as `gate: {enabled: false}` (style violation, not error, but flag it)
|
|
79
|
+
|
|
80
|
+
**Error format:**
|
|
81
|
+
```
|
|
82
|
+
[V2-COMPLETENESS] profiles/solution-architecture.yaml
|
|
83
|
+
Criterion SCP-01:
|
|
84
|
+
MISSING: examples.bad
|
|
85
|
+
INCOMPLETE: scoring_guide missing key "4"
|
|
86
|
+
Criterion TRD-01:
|
|
87
|
+
MISSING: decision_tree (placeholder detected: "Apply scoring guide")
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Check 3 — ID Uniqueness
|
|
93
|
+
|
|
94
|
+
**Purpose:** Verify that criterion IDs are unique across the file AND (for profiles) do not conflict with core criterion IDs.
|
|
95
|
+
|
|
96
|
+
**Core criterion IDs (from `core-meta-rubric.yaml`):** Load the core YAML first; extract all criterion IDs. These are reserved and must not be reused in profiles or overlays.
|
|
97
|
+
|
|
98
|
+
**Within-file uniqueness:** For each file, collect all criterion IDs under all dimensions. Flag any duplicates.
|
|
99
|
+
|
|
100
|
+
**Cross-file uniqueness:** IDs in profiles and overlays should not collide with core IDs. Two profile files may use the same ID pattern (e.g., `SCP-01` in two profiles) only if they are genuinely different rubrics — flag these as warnings for human review.
|
|
101
|
+
|
|
102
|
+
**Rubric ID format check:** All `rubric_id` values must follow `EAROS-[CATEGORY]-[NNN]`:
|
|
103
|
+
- Core: `EAROS-CORE-NNN`
|
|
104
|
+
- Profiles: `EAROS-[ARTIFACT]-NNN` (e.g., `EAROS-REFARCH-001`)
|
|
105
|
+
- Overlays: `EAROS-OVR-[CONCERN]-NNN` (e.g., `EAROS-OVR-SEC-001`)
|
|
106
|
+
|
|
107
|
+
**Error format:**
|
|
108
|
+
```
|
|
109
|
+
[ID-UNIQUENESS] profiles/reference-architecture.yaml
|
|
110
|
+
DUPLICATE criterion ID: RA-D1-VIEW-01 appears at dimensions[0].criteria[0] and dimensions[0].criteria[3]
|
|
111
|
+
|
|
112
|
+
[ID-CONFLICT] profiles/solution-architecture.yaml
|
|
113
|
+
Criterion SCP-01 conflicts with core criterion SCP-01 — use a profile-scoped prefix (e.g., SA-SCP-01)
|
|
114
|
+
|
|
115
|
+
[ID-FORMAT] overlays/regulatory.yaml
|
|
116
|
+
rubric_id "EAROS-REG-001" does not match overlay pattern EAROS-OVR-[CONCERN]-NNN
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Check 4 — Cross-Reference Validation
|
|
122
|
+
|
|
123
|
+
**Purpose:** Verify that `inherits` references and overlay applications are internally consistent.
|
|
124
|
+
|
|
125
|
+
**Checks to perform:**
|
|
126
|
+
|
|
127
|
+
1. **Inherits resolution:** Every profile must have `inherits: [EAROS-CORE-002]`. Verify that `EAROS-CORE-002` matches the `rubric_id` in `core/core-meta-rubric.yaml`.
|
|
128
|
+
|
|
129
|
+
2. **Evaluation record rubric references:** In `examples/*.evaluation.yaml`, the `rubric_id` field must match a rubric that exists in the project. Check that:
|
|
130
|
+
- `rubric_id` in the record matches an actual YAML file's `rubric_id`
|
|
131
|
+
- If `overlays_applied` is listed, each referenced overlay must exist
|
|
132
|
+
|
|
133
|
+
3. **Dimension weight sum:** Weights don't need to sum to 1.0 (they're relative), but any dimension weight of 0 or negative is a data error.
|
|
134
|
+
|
|
135
|
+
4. **Gate severity vocabulary:** All `gate.severity` values must be from the allowed set: `none`, `advisory`, `major`, `critical`.
|
|
136
|
+
|
|
137
|
+
5. **Status threshold consistency:** In `scoring.thresholds`, verify numeric values are consistent with the standard:
|
|
138
|
+
- Pass threshold ≥ 3.2
|
|
139
|
+
- Conditional pass lower bound 2.4
|
|
140
|
+
- Rework threshold < 2.4
|
|
141
|
+
|
|
142
|
+
**Error format:**
|
|
143
|
+
```
|
|
144
|
+
[CROSS-REF] profiles/adr.yaml
|
|
145
|
+
inherits references EAROS-CORE-002 but core rubric_id is EAROS-CORE-001 — version mismatch
|
|
146
|
+
|
|
147
|
+
[CROSS-REF] examples/example-solution-architecture.evaluation.yaml
|
|
148
|
+
overlay_applied "EAROS-OVR-SEC-002" not found in overlays/ directory
|
|
149
|
+
|
|
150
|
+
[CROSS-REF] profiles/roadmap.yaml
|
|
151
|
+
dimension RM-D3 has weight: 0 — must be positive
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Check 5 — Evaluation Record Schema
|
|
157
|
+
|
|
158
|
+
**Purpose:** Verify evaluation record YAML files conform to `standard/schemas/evaluation.schema.json`.
|
|
159
|
+
|
|
160
|
+
**Required top-level fields:**
|
|
161
|
+
|
|
162
|
+
| Field | Notes |
|
|
163
|
+
|-------|-------|
|
|
164
|
+
| `evaluation_id` | Non-empty string |
|
|
165
|
+
| `rubric_id` | Must match an existing rubric |
|
|
166
|
+
| `evaluation_date` | ISO 8601 date: `YYYY-MM-DD` |
|
|
167
|
+
| `artifact_ref` | Must have `title`; `artifact_type`, `owner`, `version` are expected |
|
|
168
|
+
| `evaluators` | Non-empty list; each with `name` and `mode` (`agent`/`human`/`hybrid`) |
|
|
169
|
+
| `scores` | List of criterion scores |
|
|
170
|
+
| `overall_score` | Numeric, 0.0–4.0 |
|
|
171
|
+
| `status` | One of: `pass`, `conditional_pass`, `rework_required`, `reject`, `not_reviewable` |
|
|
172
|
+
|
|
173
|
+
**Per-criterion score required fields:**
|
|
174
|
+
|
|
175
|
+
| Field | Valid values |
|
|
176
|
+
|-------|-------------|
|
|
177
|
+
| `criterion_id` | Must match a criterion in the referenced rubric |
|
|
178
|
+
| `score` | 0, 1, 2, 3, 4, or "N/A" |
|
|
179
|
+
| `evidence_anchor` | Non-empty string (required if score ≠ N/A) |
|
|
180
|
+
| `evidence_class` | `observed` \| `inferred` \| `external` |
|
|
181
|
+
| `confidence` | `high` \| `medium` \| `low` |
|
|
182
|
+
| `rationale` | Non-empty string |
|
|
183
|
+
|
|
184
|
+
**Common issues in evaluation records:**
|
|
185
|
+
- `score` stored as integer but "N/A" stored as null instead of string "N/A"
|
|
186
|
+
- `evidence_anchor` missing when score is 0 (still requires a "no evidence found" anchor)
|
|
187
|
+
- `status` not matching the computed outcome from gates and score thresholds
|
|
188
|
+
|
|
189
|
+
**Error format:**
|
|
190
|
+
```
|
|
191
|
+
[EVAL-SCHEMA] examples/example-solution-architecture.evaluation.yaml
|
|
192
|
+
criterion SCP-01: evidence_anchor is empty — required for all scored criteria
|
|
193
|
+
criterion TRD-01: confidence "medium-high" not in allowed set (high/medium/low)
|
|
194
|
+
overall_score 3.4 with status "conditional_pass" — status should be "pass" at this score
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## Check 6 — Documentation Accuracy
|
|
200
|
+
|
|
201
|
+
**Purpose:** Verify that documentation files accurately describe the current rubric structure.
|
|
202
|
+
|
|
203
|
+
**Files to check:**
|
|
204
|
+
|
|
205
|
+
| Documentation file | What to verify |
|
|
206
|
+
|-------------------|----------------|
|
|
207
|
+
| `CLAUDE.md` (Section 3 project structure) | File paths mentioned still exist |
|
|
208
|
+
| `docs/getting-started.md` | Rubric IDs and criteria counts are current |
|
|
209
|
+
| `docs/profile-authoring-guide.md` | Required field list matches v2 criterion fields |
|
|
210
|
+
| `README.md` (if exists) | Links and file references are valid |
|
|
211
|
+
|
|
212
|
+
**Specific checks:**
|
|
213
|
+
1. Every file path mentioned in documentation exists on disk
|
|
214
|
+
2. Criterion counts mentioned in docs match actual counts in YAML files
|
|
215
|
+
3. Rubric IDs mentioned in docs match `rubric_id` fields in YAML files
|
|
216
|
+
4. Required field lists in docs match the 13 required v2 fields
|
|
217
|
+
|
|
218
|
+
**Error format:**
|
|
219
|
+
```
|
|
220
|
+
[DOCS] docs/getting-started.md
|
|
221
|
+
References "profiles/postmortem.yaml" — file does not exist
|
|
222
|
+
States "EAROS-CORE has 8 criteria" — actual count is 10
|
|
223
|
+
|
|
224
|
+
[DOCS] CLAUDE.md Section 3
|
|
225
|
+
References "calibration/gold-set/[rubric-id]/" — directory structure does not match
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Check 7 — YAML Style
|
|
231
|
+
|
|
232
|
+
**Purpose:** Flag style violations that won't cause parse errors but violate EAROS conventions.
|
|
233
|
+
|
|
234
|
+
**Style rules (from CLAUDE.md conventions):**
|
|
235
|
+
|
|
236
|
+
| Rule | Violation to detect |
|
|
237
|
+
|------|-------------------|
|
|
238
|
+
| Two-space indentation | Four-space or tab indentation |
|
|
239
|
+
| Numeric scoring_guide keys quoted | `0:` instead of `"0":` |
|
|
240
|
+
| Gate false as `gate: false` | `gate:\n enabled: false` |
|
|
241
|
+
| Multi-line descriptions use `>` block scalar | Long inline strings (>120 chars) without block scalar |
|
|
242
|
+
| One list item per line | Multiple items on a single line |
|
|
243
|
+
| Kebab-case filenames | Underscores or mixed case in filenames |
|
|
244
|
+
|
|
245
|
+
**How to detect indentation issues:** Count leading spaces on indented lines. Any line with 4-space or tab indentation is a violation.
|
|
246
|
+
|
|
247
|
+
**How to detect unquoted numeric keys:** Look for `scoring_guide:` sections where child keys are `0:`, `1:`, `2:`, `3:`, `4:` without quotes.
|
|
248
|
+
|
|
249
|
+
**Error format:**
|
|
250
|
+
```
|
|
251
|
+
[YAML-STYLE] profiles/capability-map.yaml
|
|
252
|
+
line 47: scoring_guide key "0" is unquoted — should be "0": not 0:
|
|
253
|
+
line 52: gate disabled with verbose syntax — use gate: false not gate:\n enabled: false
|
|
254
|
+
line 83: description exceeds 120 chars inline — use > block scalar
|
|
255
|
+
|
|
256
|
+
[YAML-STYLE] profiles/Capability_Map.yaml
|
|
257
|
+
Filename uses underscores and mixed case — should be kebab-case: capability-map.yaml
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Validation Summary Format
|
|
263
|
+
|
|
264
|
+
After running all 7 checks, produce:
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
## EAROS Repository Validation Summary — [date]
|
|
268
|
+
|
|
269
|
+
| Check | Files Checked | Errors | Warnings | Status |
|
|
270
|
+
|-------|--------------|--------|----------|--------|
|
|
271
|
+
| 1. Schema conformance | N | N | N | ✅ / ⚠️ / ❌ |
|
|
272
|
+
| 2. Criterion v2 completeness | N | N | N | ✅ / ⚠️ / ❌ |
|
|
273
|
+
| 3. ID uniqueness | N | N | N | ✅ / ⚠️ / ❌ |
|
|
274
|
+
| 4. Cross-reference validation | N | N | N | ✅ / ⚠️ / ❌ |
|
|
275
|
+
| 5. Evaluation record schema | N | N | N | ✅ / ⚠️ / ❌ |
|
|
276
|
+
| 6. Documentation accuracy | N | N | N | ✅ / ⚠️ / ❌ |
|
|
277
|
+
| 7. YAML style | N | N | N | ✅ / ⚠️ / ❌ |
|
|
278
|
+
|
|
279
|
+
**Overall:** ✅ Clean / ⚠️ Warnings only / ❌ Errors present
|
|
280
|
+
|
|
281
|
+
**Critical issues (blocking):** [list or "None"]
|
|
282
|
+
**Warnings (non-blocking):** [list or "None"]
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
Severity classification:
|
|
286
|
+
- **Error (blocking):** Schema violations, missing required fields, duplicate IDs — must fix before governance use
|
|
287
|
+
- **Warning (non-blocking):** Style violations, documentation drift — should fix but does not block use
|