@open-agent-toolkit/cli 0.2.26 → 0.2.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/assets/NOTICES.md +156 -0
  2. package/assets/agents/oat-phase-implementer.md +312 -7
  3. package/assets/docs/contributing/explainer-kit-verification.md +125 -0
  4. package/assets/docs/contributing/index.md +1 -0
  5. package/assets/docs/reference/troubleshooting.md +47 -0
  6. package/assets/docs/workflows/projects/artifacts.md +24 -6
  7. package/assets/docs/workflows/projects/implementation-execution.md +151 -1
  8. package/assets/docs/workflows/skills/explainer-kit-providers.md +144 -0
  9. package/assets/docs/workflows/skills/explainer-kit.md +121 -69
  10. package/assets/docs/workflows/skills/index.md +1 -0
  11. package/assets/public-package-versions.json +4 -4
  12. package/assets/skills/explainer-kit/SKILL.md +18 -3
  13. package/assets/skills/explainer-kit/recipes/project-recap.json +43 -16
  14. package/assets/skills/explainer-kit/references/contracts.md +167 -20
  15. package/assets/skills/explainer-kit/references/golden-conformance.md +80 -0
  16. package/assets/skills/explainer-kit/references/visual-authoring.md +92 -0
  17. package/assets/skills/explainer-kit/references/visual-review.md +57 -0
  18. package/assets/skills/explainer-kit/schemas/author-request.v2.schema.json +172 -1
  19. package/assets/skills/explainer-kit/schemas/build-record.schema.json +7 -1
  20. package/assets/skills/explainer-kit/schemas/fact-base.schema.json +38 -2
  21. package/assets/skills/explainer-kit/schemas/manifest.schema.json +25 -1
  22. package/assets/skills/explainer-kit/schemas/run-request.schema.json +4 -0
  23. package/assets/skills/explainer-kit/schemas/set-plan.v1.schema.json +149 -0
  24. package/assets/skills/explainer-kit/schemas/visual-review-request.v1.schema.json +117 -0
  25. package/assets/skills/explainer-kit/schemas/visual-review-result.v1.schema.json +80 -0
  26. package/assets/skills/explainer-kit/scripts/lib/browser-runtime.mjs +148 -4
  27. package/assets/skills/explainer-kit/scripts/lib/catalog.mjs +243 -0
  28. package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +586 -8
  29. package/assets/skills/explainer-kit/scripts/lib/diagram.mjs +285 -8
  30. package/assets/skills/explainer-kit/scripts/lib/durability.mjs +35 -0
  31. package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +144 -8
  32. package/assets/skills/explainer-kit/scripts/lib/package-coverage.mjs +379 -0
  33. package/assets/skills/explainer-kit/scripts/lib/png.mjs +287 -0
  34. package/assets/skills/explainer-kit/scripts/lib/qa.mjs +280 -8
  35. package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +132 -3
  36. package/assets/skills/explainer-kit/scripts/lib/records.mjs +513 -21
  37. package/assets/skills/explainer-kit/scripts/lib/render.mjs +67 -3
  38. package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +43 -1
  39. package/assets/skills/explainer-kit/scripts/lib/set-plan.mjs +208 -0
  40. package/assets/skills/explainer-kit/scripts/lib/source-backlinks.mjs +218 -0
  41. package/assets/skills/explainer-kit/scripts/lib/visual-review.mjs +380 -0
  42. package/assets/skills/explainer-kit/scripts/render-qa.mjs +48 -10
  43. package/assets/skills/explainer-kit/scripts/run.mjs +859 -134
  44. package/assets/skills/oat-dispatch-subagents/SKILL.md +16 -3
  45. package/assets/skills/oat-explainer-kit/SKILL.md +40 -12
  46. package/assets/skills/oat-explainer-kit/references/author-callback.md +12 -10
  47. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +40 -2
  48. package/assets/skills/oat-explainer-kit/references/visual-review-callback.md +72 -0
  49. package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +167 -5
  50. package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +92 -5
  51. package/assets/skills/oat-explainer-kit/scripts/run.mjs +324 -2
  52. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +2 -2
  53. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +2 -2
  54. package/assets/skills/oat-project-implement/SKILL.md +5 -4
  55. package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +21 -0
  56. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +2 -2
  57. package/assets/skills/oat-project-implement/references/phase-execution.md +359 -12
  58. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +2 -2
  59. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +2 -2
  60. package/assets/templates/state.md +7 -0
  61. package/dist/commands/project/archive/archive-utils.d.ts +1 -0
  62. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  63. package/dist/commands/project/archive/archive-utils.js +109 -42
  64. package/dist/commands/project/archive/explainer-package-coverage.d.ts +14 -0
  65. package/dist/commands/project/archive/explainer-package-coverage.d.ts.map +1 -0
  66. package/dist/commands/project/archive/explainer-package-coverage.js +27 -0
  67. package/dist/commands/project/archive/explainer-source-backlinks.d.ts +18 -0
  68. package/dist/commands/project/archive/explainer-source-backlinks.d.ts.map +1 -0
  69. package/dist/commands/project/archive/explainer-source-backlinks.js +27 -0
  70. package/dist/commands/project/archive/push-runner.d.ts +2 -1
  71. package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
  72. package/dist/commands/project/archive/push-runner.js +5 -1
  73. package/dist/release/public-package-contract.d.ts +6 -0
  74. package/dist/release/public-package-contract.d.ts.map +1 -1
  75. package/dist/release/public-package-contract.js +75 -0
  76. package/package.json +2 -2
@@ -24,7 +24,13 @@
24
24
  "minItems": 1
25
25
  },
26
26
  "outcome": {
27
- "enum": ["built-durable", "built-not-durable", "failed", "incomplete"]
27
+ "enum": [
28
+ "built-durable",
29
+ "built-not-durable",
30
+ "built-needs-review",
31
+ "failed",
32
+ "incomplete"
33
+ ]
28
34
  }
29
35
  },
30
36
  "$defs": {
@@ -55,6 +55,15 @@
55
55
  "minItems": 1,
56
56
  "uniqueItems": true
57
57
  },
58
+ "lineRange": {
59
+ "type": "object",
60
+ "additionalProperties": false,
61
+ "required": ["start", "end"],
62
+ "properties": {
63
+ "start": { "type": "integer", "minimum": 1 },
64
+ "end": { "type": "integer", "minimum": 1 }
65
+ }
66
+ },
58
67
  "source": {
59
68
  "type": "object",
60
69
  "additionalProperties": false,
@@ -67,7 +76,20 @@
67
76
  "locator": { "type": "string", "minLength": 1 },
68
77
  "role": { "type": "string", "minLength": 1 },
69
78
  "sourceSetId": { "type": "string", "minLength": 1 },
70
- "revision": { "type": "string", "minLength": 1 },
79
+ "revision": { "type": "string", "pattern": "^[a-f0-9]{40}$" },
80
+ "repository": {
81
+ "type": "string",
82
+ "pattern": "^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$"
83
+ },
84
+ "path": {
85
+ "type": "string",
86
+ "pattern": "^(?!/)(?!.*//)(?!.*(?:^|/)(?:\\.|\\.\\.)(?:/|$))(?!.*\\\\).+$"
87
+ },
88
+ "lineRange": { "$ref": "#/$defs/lineRange" },
89
+ "url": {
90
+ "type": "string",
91
+ "pattern": "^https://github\\.com/[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+/blob/[a-f0-9]{40}/[^\\s?#]+#L[1-9][0-9]*(?:-L[1-9][0-9]*)?$"
92
+ },
71
93
  "hash": { "$ref": "#/$defs/hash" },
72
94
  "observedAt": { "type": "string", "format": "date-time" },
73
95
  "authoritativeFor": {
@@ -83,7 +105,21 @@
83
105
  "required": ["sourceId", "locator"],
84
106
  "properties": {
85
107
  "sourceId": { "type": "string", "minLength": 1 },
86
- "locator": { "type": "string", "minLength": 1 }
108
+ "locator": { "type": "string", "minLength": 1 },
109
+ "repository": {
110
+ "type": "string",
111
+ "pattern": "^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$"
112
+ },
113
+ "revision": { "type": "string", "pattern": "^[a-f0-9]{40}$" },
114
+ "path": {
115
+ "type": "string",
116
+ "pattern": "^(?!/)(?!.*//)(?!.*(?:^|/)(?:\\.|\\.\\.)(?:/|$))(?!.*\\\\).+$"
117
+ },
118
+ "lineRange": { "$ref": "#/$defs/lineRange" },
119
+ "url": {
120
+ "type": "string",
121
+ "pattern": "^https://github\\.com/[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+/blob/[a-f0-9]{40}/[^\\s?#]+#L[1-9][0-9]*(?:-L[1-9][0-9]*)?$"
122
+ }
87
123
  }
88
124
  },
89
125
  "claim": {
@@ -49,6 +49,11 @@
49
49
  "items": { "$ref": "#/$defs/safeRelativePath" },
50
50
  "minItems": 1,
51
51
  "uniqueItems": true
52
+ },
53
+ "backlinks": {
54
+ "type": "array",
55
+ "items": { "$ref": "#/$defs/sourceBacklink" },
56
+ "uniqueItems": true
52
57
  }
53
58
  }
54
59
  },
@@ -69,7 +74,13 @@
69
74
  },
70
75
  "immutableHashes": { "$ref": "#/$defs/hashMap" },
71
76
  "outcome": {
72
- "enum": ["built-durable", "built-not-durable", "failed", "incomplete"]
77
+ "enum": [
78
+ "built-durable",
79
+ "built-not-durable",
80
+ "built-needs-review",
81
+ "failed",
82
+ "incomplete"
83
+ ]
73
84
  },
74
85
  "buildRecord": {
75
86
  "type": "object",
@@ -106,9 +117,22 @@
106
117
  },
107
118
  "hashMap": {
108
119
  "type": "object",
120
+ "description": "Raw-byte SHA-256 coverage for the complete immutable package, including required browser, cohesion, visual-review attempt, and revision evidence.",
109
121
  "propertyNames": { "$ref": "#/$defs/safeRelativePath" },
110
122
  "additionalProperties": { "$ref": "#/$defs/hash" }
111
123
  },
124
+ "sourceBacklink": {
125
+ "type": "object",
126
+ "additionalProperties": false,
127
+ "required": ["sourceId", "url"],
128
+ "properties": {
129
+ "sourceId": { "type": "string", "minLength": 1 },
130
+ "url": {
131
+ "type": "string",
132
+ "pattern": "^https://github\\.com/[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+/blob/[a-f0-9]{40}/[^\\s?#]+#L[1-9][0-9]*(?:-L[1-9][0-9]*)?$"
133
+ }
134
+ }
135
+ },
112
136
  "failure": {
113
137
  "type": "object",
114
138
  "additionalProperties": false,
@@ -25,6 +25,10 @@
25
25
  "version": { "type": "string", "minLength": 1 }
26
26
  }
27
27
  },
28
+ "recapMode": {
29
+ "type": "string",
30
+ "enum": ["artistic", "deterministic-markdown"]
31
+ },
28
32
  "slug": {
29
33
  "type": "string",
30
34
  "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
@@ -0,0 +1,149 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "explainer-kit.set-plan/v1",
4
+ "title": "SetPlanV1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion",
9
+ "planId",
10
+ "recipe",
11
+ "sourceIds",
12
+ "ledger",
13
+ "portfolio"
14
+ ],
15
+ "properties": {
16
+ "schemaVersion": { "const": "explainer-kit.set-plan/v1" },
17
+ "planId": { "$ref": "#/$defs/safeId" },
18
+ "recipe": { "$ref": "#/$defs/recipe" },
19
+ "sourceIds": {
20
+ "type": "array",
21
+ "items": { "$ref": "#/$defs/safeId" },
22
+ "minItems": 1,
23
+ "uniqueItems": true
24
+ },
25
+ "ledger": { "$ref": "#/$defs/ledger" },
26
+ "portfolio": {
27
+ "type": "array",
28
+ "items": { "$ref": "#/$defs/portfolioEntry" },
29
+ "minItems": 1
30
+ }
31
+ },
32
+ "$defs": {
33
+ "safeId": {
34
+ "type": "string",
35
+ "pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
36
+ },
37
+ "recipe": {
38
+ "type": "object",
39
+ "additionalProperties": false,
40
+ "required": ["id", "version"],
41
+ "properties": {
42
+ "id": { "$ref": "#/$defs/safeId" },
43
+ "version": { "type": "string", "minLength": 1 }
44
+ }
45
+ },
46
+ "ledger": {
47
+ "type": "object",
48
+ "additionalProperties": false,
49
+ "description": "Shared cohesion claims. A fully empty ledger explicitly identifies a lower-tier plan without applicable shared claims; adaptive recap review requires every group to be non-empty and observed.",
50
+ "required": ["terminology", "statuses", "numbers"],
51
+ "properties": {
52
+ "terminology": {
53
+ "type": "array",
54
+ "items": { "$ref": "#/$defs/termEntry" },
55
+ "uniqueItems": true
56
+ },
57
+ "statuses": {
58
+ "type": "array",
59
+ "items": { "$ref": "#/$defs/statusEntry" },
60
+ "uniqueItems": true
61
+ },
62
+ "numbers": {
63
+ "type": "array",
64
+ "items": { "$ref": "#/$defs/numberEntry" },
65
+ "uniqueItems": true
66
+ }
67
+ }
68
+ },
69
+ "termEntry": {
70
+ "type": "object",
71
+ "additionalProperties": false,
72
+ "required": ["term", "meaning"],
73
+ "properties": {
74
+ "term": { "type": "string", "minLength": 1 },
75
+ "meaning": { "type": "string", "minLength": 1 }
76
+ }
77
+ },
78
+ "statusEntry": {
79
+ "type": "object",
80
+ "additionalProperties": false,
81
+ "required": ["subject", "value"],
82
+ "properties": {
83
+ "subject": { "type": "string", "minLength": 1 },
84
+ "value": { "type": "string", "minLength": 1 }
85
+ }
86
+ },
87
+ "numberEntry": {
88
+ "type": "object",
89
+ "additionalProperties": false,
90
+ "required": ["subject", "value", "unit"],
91
+ "properties": {
92
+ "subject": { "type": "string", "minLength": 1 },
93
+ "value": { "type": "number" },
94
+ "unit": { "type": "string", "minLength": 1 }
95
+ }
96
+ },
97
+ "portfolioEntry": {
98
+ "type": "object",
99
+ "additionalProperties": false,
100
+ "required": [
101
+ "artifactId",
102
+ "artifactType",
103
+ "profileId",
104
+ "required",
105
+ "sourceIds",
106
+ "draft",
107
+ "visualIntent"
108
+ ],
109
+ "properties": {
110
+ "artifactId": { "$ref": "#/$defs/safeId" },
111
+ "artifactType": {
112
+ "enum": ["hub", "diagram", "explainer", "deck", "catalog"]
113
+ },
114
+ "profileId": { "$ref": "#/$defs/safeId" },
115
+ "required": { "type": "boolean" },
116
+ "sourceIds": {
117
+ "type": "array",
118
+ "items": { "$ref": "#/$defs/safeId" },
119
+ "minItems": 1,
120
+ "uniqueItems": true
121
+ },
122
+ "draft": { "type": "string", "minLength": 1 },
123
+ "visualIntent": { "type": "string", "minLength": 1 },
124
+ "justification": { "$ref": "#/$defs/justification" }
125
+ }
126
+ },
127
+ "justification": {
128
+ "type": "object",
129
+ "additionalProperties": false,
130
+ "required": ["kind", "sourceIds", "rationale"],
131
+ "properties": {
132
+ "kind": {
133
+ "enum": [
134
+ "status-change",
135
+ "rollout-complexity",
136
+ "source-backed-detail"
137
+ ]
138
+ },
139
+ "sourceIds": {
140
+ "type": "array",
141
+ "items": { "$ref": "#/$defs/safeId" },
142
+ "minItems": 1,
143
+ "uniqueItems": true
144
+ },
145
+ "rationale": { "type": "string", "minLength": 1 }
146
+ }
147
+ }
148
+ }
149
+ }
@@ -0,0 +1,117 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "explainer-kit.visual-review-request/v1",
4
+ "title": "VisualReviewRequestV1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion",
9
+ "requestId",
10
+ "requestHash",
11
+ "browserRuntime",
12
+ "captureIdentity",
13
+ "plan",
14
+ "renderedArtifacts"
15
+ ],
16
+ "properties": {
17
+ "schemaVersion": {
18
+ "const": "explainer-kit.visual-review-request/v1"
19
+ },
20
+ "requestId": { "$ref": "#/$defs/safeId" },
21
+ "requestHash": { "$ref": "#/$defs/hash" },
22
+ "browserRuntime": { "$ref": "#/$defs/browserRuntime" },
23
+ "captureIdentity": { "$ref": "#/$defs/hash" },
24
+ "plan": { "$ref": "explainer-kit.set-plan/v1" },
25
+ "renderedArtifacts": {
26
+ "type": "array",
27
+ "items": { "$ref": "#/$defs/renderedArtifact" },
28
+ "minItems": 1,
29
+ "uniqueItems": true
30
+ }
31
+ },
32
+ "$defs": {
33
+ "safeRelativePath": {
34
+ "type": "string",
35
+ "minLength": 1,
36
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\).+$"
37
+ },
38
+ "safeId": {
39
+ "type": "string",
40
+ "pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
41
+ },
42
+ "hash": {
43
+ "type": "string",
44
+ "pattern": "^sha256:[a-f0-9]{64}$"
45
+ },
46
+ "browserRuntime": {
47
+ "type": "object",
48
+ "additionalProperties": false,
49
+ "required": ["kind", "name", "version"],
50
+ "properties": {
51
+ "kind": { "enum": ["launched", "fixture"] },
52
+ "name": { "const": "chromium" },
53
+ "version": { "type": "string", "minLength": 1 }
54
+ }
55
+ },
56
+ "renderedArtifact": {
57
+ "type": "object",
58
+ "additionalProperties": false,
59
+ "required": ["artifactId", "renderedPath", "renderedHash", "evidence"],
60
+ "properties": {
61
+ "artifactId": {
62
+ "type": "string",
63
+ "pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
64
+ },
65
+ "renderedPath": { "$ref": "#/$defs/safeRelativePath" },
66
+ "renderedHash": { "$ref": "#/$defs/hash" },
67
+ "cohesionObservations": {
68
+ "type": "array",
69
+ "items": { "$ref": "#/$defs/cohesionObservation" },
70
+ "uniqueItems": true
71
+ },
72
+ "evidence": {
73
+ "type": "array",
74
+ "items": { "$ref": "#/$defs/evidence" },
75
+ "minItems": 1,
76
+ "uniqueItems": true
77
+ }
78
+ }
79
+ },
80
+ "cohesionObservation": {
81
+ "type": "object",
82
+ "additionalProperties": false,
83
+ "required": ["artifactId", "contentHash", "group", "claim", "value"],
84
+ "properties": {
85
+ "artifactId": { "$ref": "#/$defs/safeId" },
86
+ "contentHash": { "$ref": "#/$defs/hash" },
87
+ "group": {
88
+ "enum": ["terminology", "statuses", "numericClaims"]
89
+ },
90
+ "claim": { "type": "string", "minLength": 1 },
91
+ "value": {
92
+ "oneOf": [{ "type": "string", "minLength": 1 }, { "type": "number" }]
93
+ }
94
+ }
95
+ },
96
+ "evidence": {
97
+ "type": "object",
98
+ "additionalProperties": false,
99
+ "required": [
100
+ "viewport",
101
+ "screenshotPath",
102
+ "screenshotHash",
103
+ "metricsPath",
104
+ "metricsHash",
105
+ "captureIdentity"
106
+ ],
107
+ "properties": {
108
+ "viewport": { "enum": ["desktop", "tablet", "mobile"] },
109
+ "screenshotPath": { "$ref": "#/$defs/safeRelativePath" },
110
+ "screenshotHash": { "$ref": "#/$defs/hash" },
111
+ "metricsPath": { "$ref": "#/$defs/safeRelativePath" },
112
+ "metricsHash": { "$ref": "#/$defs/hash" },
113
+ "captureIdentity": { "$ref": "#/$defs/hash" }
114
+ }
115
+ }
116
+ }
117
+ }
@@ -0,0 +1,80 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "explainer-kit.visual-review-result/v1",
4
+ "title": "VisualReviewResultV1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion",
9
+ "reviewId",
10
+ "requestId",
11
+ "requestHash",
12
+ "reviewedAt",
13
+ "disposition",
14
+ "artifactIds",
15
+ "findings"
16
+ ],
17
+ "properties": {
18
+ "schemaVersion": {
19
+ "const": "explainer-kit.visual-review-result/v1"
20
+ },
21
+ "reviewId": { "$ref": "#/$defs/safeId" },
22
+ "requestId": { "$ref": "#/$defs/safeId" },
23
+ "requestHash": { "$ref": "#/$defs/hash" },
24
+ "reviewedAt": { "type": "string", "format": "date-time" },
25
+ "disposition": { "enum": ["pass", "correct", "fail"] },
26
+ "artifactIds": {
27
+ "type": "array",
28
+ "items": { "$ref": "#/$defs/safeId" },
29
+ "minItems": 1,
30
+ "uniqueItems": true
31
+ },
32
+ "findings": {
33
+ "type": "array",
34
+ "items": { "$ref": "#/$defs/finding" },
35
+ "uniqueItems": true
36
+ }
37
+ },
38
+ "$defs": {
39
+ "safeId": {
40
+ "type": "string",
41
+ "pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
42
+ },
43
+ "hash": {
44
+ "type": "string",
45
+ "pattern": "^sha256:[a-f0-9]{64}$"
46
+ },
47
+ "finding": {
48
+ "type": "object",
49
+ "additionalProperties": false,
50
+ "required": [
51
+ "artifactId",
52
+ "rubric",
53
+ "severity",
54
+ "evidence",
55
+ "correction"
56
+ ],
57
+ "properties": {
58
+ "artifactId": { "$ref": "#/$defs/safeId" },
59
+ "rubric": {
60
+ "enum": [
61
+ "first-viewport",
62
+ "hierarchy",
63
+ "representation",
64
+ "legibility",
65
+ "medium-fit",
66
+ "cohesion",
67
+ "coverage",
68
+ "redundancy",
69
+ "interaction"
70
+ ]
71
+ },
72
+ "severity": {
73
+ "enum": ["critical", "important", "medium", "minor"]
74
+ },
75
+ "evidence": { "type": "string", "minLength": 1 },
76
+ "correction": { "type": "string", "minLength": 1 }
77
+ }
78
+ }
79
+ }
80
+ }