@skill-graph/cli 0.5.7 → 0.5.8

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 (83) hide show
  1. package/CHANGELOG.md +27 -3
  2. package/README.md +40 -14
  3. package/SKILL_GRAPH.md +2 -2
  4. package/bin/skill-graph.js +118 -2
  5. package/docs/ADOPTION.md +1 -1
  6. package/docs/PRIMER.md +6 -5
  7. package/docs/QUICKSTART-30MIN.md +2 -2
  8. package/docs/SKILL_AUDIT_CHECKLIST.md +1 -1
  9. package/docs/SKILL_METADATA_PROTOCOL.md +2 -2
  10. package/docs/_archived/marketplace-publication-priority-2026-05-18.md +1 -1
  11. package/docs/_drafts/0.5.8-release-prep.md +164 -0
  12. package/docs/field-reference.generated.md +1 -1
  13. package/docs/field-reference.md +2 -2
  14. package/docs/manifest-field-mapping.md +3 -3
  15. package/docs/marketplace-publication-queue.generated.md +2 -2
  16. package/docs/plans/scripts-roadmap.md +2 -2
  17. package/docs/positioning.md +88 -0
  18. package/docs/research/skill-comprehension-eval-research.md +5 -5
  19. package/docs/research/skill-demand-gap-roadmap-2026-05-16.md +215 -0
  20. package/docs/status.generated.md +48 -0
  21. package/examples/audits/context-graph/findings.md +59 -0
  22. package/examples/audits/context-graph/scorecard.md +22 -0
  23. package/examples/audits/context-graph/verdict.md +33 -0
  24. package/examples/evals/a11y.json +45 -13
  25. package/examples/evals/api-design.json +18 -5
  26. package/examples/evals/code-review.json +18 -5
  27. package/examples/evals/data-modeling.json +18 -5
  28. package/examples/evals/database-migration.json +18 -5
  29. package/examples/evals/debugging.json +37 -11
  30. package/examples/evals/dependency-architecture.json +18 -5
  31. package/examples/evals/design-system-architecture.json +18 -5
  32. package/examples/evals/error-tracking.json +18 -5
  33. package/examples/evals/event-contract-design.json +18 -5
  34. package/examples/evals/form-ux-architecture.json +18 -5
  35. package/examples/evals/framework-fit-analysis.json +18 -5
  36. package/examples/evals/graph-audit.json +55 -13
  37. package/examples/evals/information-architecture.json +18 -5
  38. package/examples/evals/interaction-feedback.json +18 -5
  39. package/examples/evals/interaction-patterns.json +18 -5
  40. package/examples/evals/layout-composition.json +18 -5
  41. package/examples/evals/lint-overlay.json +38 -11
  42. package/examples/evals/microcopy.json +18 -5
  43. package/examples/evals/observability-modeling.json +18 -5
  44. package/examples/evals/pattern-recognition.json +32 -9
  45. package/examples/evals/performance-engineering.json +18 -5
  46. package/examples/evals/refactor.json +41 -12
  47. package/examples/evals/semiotics.json +18 -5
  48. package/examples/evals/skill-infrastructure.json +32 -9
  49. package/examples/evals/skill-router.json +42 -13
  50. package/examples/evals/system-interface-contracts.json +18 -5
  51. package/examples/evals/task-analysis.json +18 -5
  52. package/examples/evals/testing-strategy.json +36 -11
  53. package/examples/evals/type-safety.json +251 -66
  54. package/examples/evals/visual-design-foundations.json +18 -5
  55. package/examples/evals/webhook-integration.json +18 -5
  56. package/examples/fixture-skills/README.md +47 -0
  57. package/examples/fixture-skills/comprehension-full/SKILL.md +79 -0
  58. package/examples/fixture-skills/minimal-capability/SKILL.md +51 -0
  59. package/examples/fixture-skills/with-grounding/SKILL.md +78 -0
  60. package/examples/fixture-skills/with-relations/SKILL.md +87 -0
  61. package/examples/skills.manifest.sample.json +1722 -446
  62. package/marketplace/README.md +1 -1
  63. package/marketplace/skills/a11y/SKILL.md +1 -1
  64. package/marketplace/skills/best-practice/SKILL.md +211 -0
  65. package/marketplace/skills/context-graph/SKILL.md +1 -1
  66. package/marketplace/skills/debugging/SKILL.md +1 -1
  67. package/marketplace/skills/graph-audit/SKILL.md +3 -1
  68. package/marketplace/skills/postgres-rls/SKILL.md +284 -0
  69. package/marketplace/skills/refactor/SKILL.md +1 -1
  70. package/marketplace/skills/skill-infrastructure/SKILL.md +2 -0
  71. package/marketplace/skills/skill-router/SKILL.md +3 -1
  72. package/marketplace/skills/testing-strategy/SKILL.md +1 -1
  73. package/package.json +3 -1
  74. package/scripts/__tests__/test-marketplace-export.js +6 -2
  75. package/scripts/__tests__/test-v3-1-alias-contract.js +3 -3
  76. package/scripts/build-status-doc.js +177 -0
  77. package/scripts/check-doc-drift.js +224 -0
  78. package/scripts/check-markdown-links.js +34 -4
  79. package/scripts/check-mirror-freeze.js +270 -0
  80. package/scripts/export-marketplace-skills.js +35 -6
  81. package/scripts/lib/audit-prompt-builder.js +3 -3
  82. package/scripts/lib/parse-frontmatter.js +2 -2
  83. package/scripts/skill-audit.js +7 -9
@@ -1,7 +1,12 @@
1
1
  {
2
2
  "skill_name": "task-analysis",
3
3
  "subject": "Goal-driven UX route and flow analysis for actor, scenario, top task, subtasks, friction, breakpoints, and first-viewport hierarchy contracts",
4
- "adjacent_concepts": ["information-architecture", "layout-composition", "interaction-patterns", "a11y"],
4
+ "adjacent_concepts": [
5
+ "information-architecture",
6
+ "layout-composition",
7
+ "interaction-patterns",
8
+ "a11y"
9
+ ],
5
10
  "grounding_note": "Truth sources cite the whole SKILL.md file to keep the initial eval surface stable while routing boundaries are tightened.",
6
11
  "evals": [
7
12
  {
@@ -13,7 +18,9 @@
13
18
  "truth_mode": "process_correctness",
14
19
  "skill_type": "workflow",
15
20
  "criticality": "high",
16
- "truth_sources": ["skills/task-analysis/SKILL.md"]
21
+ "truth_sources": [
22
+ "skills/foundations/task-analysis/SKILL.md"
23
+ ]
17
24
  },
18
25
  {
19
26
  "id": 2,
@@ -24,7 +31,9 @@
24
31
  "truth_mode": "conceptual_correctness_plus_repo_application",
25
32
  "skill_type": "workflow",
26
33
  "criticality": "high",
27
- "truth_sources": ["skills/task-analysis/SKILL.md"]
34
+ "truth_sources": [
35
+ "skills/foundations/task-analysis/SKILL.md"
36
+ ]
28
37
  },
29
38
  {
30
39
  "id": 3,
@@ -35,7 +44,9 @@
35
44
  "truth_mode": "code_verification",
36
45
  "skill_type": "concept",
37
46
  "criticality": "normal",
38
- "truth_sources": ["skills/task-analysis/SKILL.md"]
47
+ "truth_sources": [
48
+ "skills/foundations/task-analysis/SKILL.md"
49
+ ]
39
50
  },
40
51
  {
41
52
  "id": 4,
@@ -46,7 +57,9 @@
46
57
  "truth_mode": "code_verification",
47
58
  "skill_type": "concept",
48
59
  "criticality": "normal",
49
- "truth_sources": ["skills/task-analysis/SKILL.md"]
60
+ "truth_sources": [
61
+ "skills/foundations/task-analysis/SKILL.md"
62
+ ]
50
63
  }
51
64
  ]
52
65
  }
@@ -1,7 +1,11 @@
1
1
  {
2
2
  "skill_name": "testing-strategy",
3
3
  "subject": "Verification planning for bug fixes, features, and refactors: test scope, test-level selection, effort-to-risk matching, regression targeting, evidence quality, and failure-case coverage",
4
- "adjacent_concepts": ["debugging", "refactor", "lint-overlay"],
4
+ "adjacent_concepts": [
5
+ "debugging",
6
+ "refactor",
7
+ "lint-overlay"
8
+ ],
5
9
  "grounding_note": "This skill is self-grounding. Its evals validate internal consistency against the SKILL.md body — the skill does not anchor to an external canonical source (e.g., a specific testing-pyramid paper) because the doctrine here is synthesized from industry practice rather than derived from one authoritative text. Evals cite SKILL.md line ranges deliberately; add external truth_sources only if the skill is later narrowed to a specific external framework. Line-range stability is enforced by the `checkEvalTruthSourceRanges` lint check (scripts/skill-lint.js D2) — every edit that moves a cited range out of file bounds fails lint before commit, so drift surfaces immediately rather than silently degrading grader grounding.",
6
10
  "evals": [
7
11
  {
@@ -13,7 +17,9 @@
13
17
  "truth_mode": "code_verification",
14
18
  "skill_type": "concept",
15
19
  "criticality": "high",
16
- "truth_sources": ["skills/testing-strategy/SKILL.md:84-91"]
20
+ "truth_sources": [
21
+ "skills/quality/testing-strategy/SKILL.md:84-91"
22
+ ]
17
23
  },
18
24
  {
19
25
  "id": 2,
@@ -24,7 +30,9 @@
24
30
  "truth_mode": "conceptual_correctness_plus_repo_application",
25
31
  "skill_type": "concept",
26
32
  "criticality": "high",
27
- "truth_sources": ["skills/testing-strategy/SKILL.md:76-78"]
33
+ "truth_sources": [
34
+ "skills/quality/testing-strategy/SKILL.md:76-78"
35
+ ]
28
36
  },
29
37
  {
30
38
  "id": 3,
@@ -35,7 +43,9 @@
35
43
  "truth_mode": "code_verification",
36
44
  "skill_type": "concept",
37
45
  "criticality": "high",
38
- "truth_sources": ["skills/testing-strategy/SKILL.md:111-116"]
46
+ "truth_sources": [
47
+ "skills/quality/testing-strategy/SKILL.md:111-116"
48
+ ]
39
49
  },
40
50
  {
41
51
  "id": 4,
@@ -46,7 +56,9 @@
46
56
  "truth_mode": "process_correctness",
47
57
  "skill_type": "workflow",
48
58
  "criticality": "high",
49
- "truth_sources": ["skills/testing-strategy/SKILL.md:93-98"]
59
+ "truth_sources": [
60
+ "skills/quality/testing-strategy/SKILL.md:93-98"
61
+ ]
50
62
  },
51
63
  {
52
64
  "id": 5,
@@ -57,7 +69,9 @@
57
69
  "truth_mode": "conceptual_correctness_plus_repo_application",
58
70
  "skill_type": "concept",
59
71
  "criticality": "critical",
60
- "truth_sources": ["skills/testing-strategy/SKILL.md:84-91"]
72
+ "truth_sources": [
73
+ "skills/quality/testing-strategy/SKILL.md:84-91"
74
+ ]
61
75
  },
62
76
  {
63
77
  "id": 6,
@@ -68,7 +82,10 @@
68
82
  "truth_mode": "conceptual_correctness_plus_repo_application",
69
83
  "skill_type": "concept",
70
84
  "criticality": "critical",
71
- "truth_sources": ["skills/testing-strategy/SKILL.md:84-91", "skills/testing-strategy/SKILL.md:93-98"]
85
+ "truth_sources": [
86
+ "skills/quality/testing-strategy/SKILL.md:84-91",
87
+ "skills/quality/testing-strategy/SKILL.md:93-98"
88
+ ]
72
89
  },
73
90
  {
74
91
  "id": 7,
@@ -79,7 +96,9 @@
79
96
  "truth_mode": "code_verification",
80
97
  "skill_type": "concept",
81
98
  "criticality": "normal",
82
- "truth_sources": ["skills/testing-strategy/SKILL.md:111-116"]
99
+ "truth_sources": [
100
+ "skills/quality/testing-strategy/SKILL.md:111-116"
101
+ ]
83
102
  },
84
103
  {
85
104
  "id": 8,
@@ -90,7 +109,9 @@
90
109
  "truth_mode": "conceptual_correctness_plus_repo_application",
91
110
  "skill_type": "concept",
92
111
  "criticality": "high",
93
- "truth_sources": ["skills/testing-strategy/SKILL.md:104-109"]
112
+ "truth_sources": [
113
+ "skills/quality/testing-strategy/SKILL.md:104-109"
114
+ ]
94
115
  },
95
116
  {
96
117
  "id": 9,
@@ -101,7 +122,9 @@
101
122
  "truth_mode": "conceptual_correctness_plus_repo_application",
102
123
  "skill_type": "concept",
103
124
  "criticality": "high",
104
- "truth_sources": ["skills/testing-strategy/SKILL.md:104-109"]
125
+ "truth_sources": [
126
+ "skills/quality/testing-strategy/SKILL.md:104-109"
127
+ ]
105
128
  },
106
129
  {
107
130
  "id": 10,
@@ -112,7 +135,9 @@
112
135
  "truth_mode": "conceptual_correctness_plus_repo_application",
113
136
  "skill_type": "concept",
114
137
  "criticality": "high",
115
- "truth_sources": ["skills/testing-strategy/SKILL.md:84-91"]
138
+ "truth_sources": [
139
+ "skills/quality/testing-strategy/SKILL.md:84-91"
140
+ ]
116
141
  }
117
142
  ]
118
143
  }
@@ -1,7 +1,12 @@
1
1
  {
2
2
  "skill_name": "type-safety",
3
3
  "subject": "Type-safety as a discipline: what static type systems guarantee, the difference between sound and unsound systems, structural vs nominal typing, type narrowing, the runtime boundary problem, the discipline of validating at I/O boundaries and trusting types inside, and the connection from compile-time guarantees to runtime correctness",
4
- "adjacent_concepts": ["api-design", "testing-strategy", "data-modeling", "code-review"],
4
+ "adjacent_concepts": [
5
+ "api-design",
6
+ "testing-strategy",
7
+ "data-modeling",
8
+ "code-review"
9
+ ],
5
10
  "grounding_note": "Truth sources cite line ranges in skills/type-safety/SKILL.md (frontmatter concept block at lines 63-116, body Verification at 254-262, Do NOT Use When at 264-272). Cases are authored against the v4 SKILL.md as of 2026-05-16. Comprehension-dimension extensions (comprehension_dimension, concept_field, transfer, expected_behaviors) are additive — graders that don't consume them treat them as no-ops.",
6
11
  "evals": [
7
12
  {
@@ -17,14 +22,30 @@
17
22
  "skill_type": "concept",
18
23
  "criticality": "high",
19
24
  "truth_sources": [
20
- "skills/type-safety/SKILL.md:64",
21
- "skills/type-safety/SKILL.md#type-safety"
25
+ "skills/quality/type-safety/SKILL.md:64",
26
+ "skills/quality/type-safety/SKILL.md#type-safety"
22
27
  ],
23
28
  "expected_behaviors": [
24
- { "id": "names_primary_category", "kind": "positive", "description": "Names compile-time error detection as the category" },
25
- { "id": "states_observable_effect", "kind": "positive", "description": "States that types rule out a class of runtime errors" },
26
- { "id": "no_verbatim_span", "kind": "negative", "description": "No 6-gram span shared with skills/type-safety/SKILL.md concept.definition or body" },
27
- { "id": "no_fabricated_specificity", "kind": "negative", "description": "Does not invent claims about specific languages, line counts, or guarantees not in concept.definition" }
29
+ {
30
+ "id": "names_primary_category",
31
+ "kind": "positive",
32
+ "description": "Names compile-time error detection as the category"
33
+ },
34
+ {
35
+ "id": "states_observable_effect",
36
+ "kind": "positive",
37
+ "description": "States that types rule out a class of runtime errors"
38
+ },
39
+ {
40
+ "id": "no_verbatim_span",
41
+ "kind": "negative",
42
+ "description": "No 6-gram span shared with skills/type-safety/SKILL.md concept.definition or body"
43
+ },
44
+ {
45
+ "id": "no_fabricated_specificity",
46
+ "kind": "negative",
47
+ "description": "Does not invent claims about specific languages, line counts, or guarantees not in concept.definition"
48
+ }
28
49
  ],
29
50
  "expected_reasoning": "A correct answer names the category (compile-time error detection), the effect (rules out a class of runtime errors), the cost (annotation burden up-front), and the benefit (compounding safety). It does NOT verbatim-copy the concept.definition's first sentence, which is the canonical body phrasing."
30
51
  },
@@ -41,16 +62,36 @@
41
62
  "skill_type": "concept",
42
63
  "criticality": "critical",
43
64
  "truth_sources": [
44
- "skills/type-safety/SKILL.md:65-78",
45
- "skills/type-safety/SKILL.md:208-239",
46
- "skills/type-safety/SKILL.md#the-runtime-boundary"
65
+ "skills/quality/type-safety/SKILL.md:65-78",
66
+ "skills/quality/type-safety/SKILL.md:208-239",
67
+ "skills/quality/type-safety/SKILL.md#the-runtime-boundary"
47
68
  ],
48
69
  "expected_behaviors": [
49
- { "id": "invokes_runtime_boundary_primitive", "kind": "positive", "description": "Identifies API payloads as crossing the runtime boundary, where type information stops" },
50
- { "id": "invokes_narrowing_or_validation_primitive", "kind": "positive", "description": "Invokes either the narrowing primitive (unknown forces narrowing) or the validation primitive (parse at boundary)" },
51
- { "id": "distinguishes_any_from_unknown", "kind": "positive", "description": "Names that any opts out of type-checking, unknown forces narrowing" },
52
- { "id": "conclusion_consistent_with_skill", "kind": "positive", "description": "Concludes Record<string, unknown> + validator at the boundary preserves type-safety; Record<string, any> silently disables it" },
53
- { "id": "scenario_not_in_body", "kind": "negative", "description": "Body does not mention Python-to-TypeScript migration; the answer is far transfer, not retrieval" }
70
+ {
71
+ "id": "invokes_runtime_boundary_primitive",
72
+ "kind": "positive",
73
+ "description": "Identifies API payloads as crossing the runtime boundary, where type information stops"
74
+ },
75
+ {
76
+ "id": "invokes_narrowing_or_validation_primitive",
77
+ "kind": "positive",
78
+ "description": "Invokes either the narrowing primitive (unknown forces narrowing) or the validation primitive (parse at boundary)"
79
+ },
80
+ {
81
+ "id": "distinguishes_any_from_unknown",
82
+ "kind": "positive",
83
+ "description": "Names that any opts out of type-checking, unknown forces narrowing"
84
+ },
85
+ {
86
+ "id": "conclusion_consistent_with_skill",
87
+ "kind": "positive",
88
+ "description": "Concludes Record<string, unknown> + validator at the boundary preserves type-safety; Record<string, any> silently disables it"
89
+ },
90
+ {
91
+ "id": "scenario_not_in_body",
92
+ "kind": "negative",
93
+ "description": "Body does not mention Python-to-TypeScript migration; the answer is far transfer, not retrieval"
94
+ }
54
95
  ],
55
96
  "expected_reasoning": "API payloads are an I/O boundary; their types are unverified bytes until parsed. unknown forces narrowing (the type-safe answer to 'I don't know what this is yet'); any disables checking entirely. The right answer is Record<string, unknown> at the type level plus a schema validator (Zod, io-ts) at the boundary to produce typed values. Record<string, any> would compile but silently destroy the discipline."
56
97
  },
@@ -67,13 +108,29 @@
67
108
  "skill_type": "concept",
68
109
  "criticality": "high",
69
110
  "truth_sources": [
70
- "skills/type-safety/SKILL.md:79-84"
111
+ "skills/quality/type-safety/SKILL.md:79-84"
71
112
  ],
72
113
  "expected_behaviors": [
73
- { "id": "names_pain_point", "kind": "positive", "description": "Names the pain point — runtime bugs becoming production incidents or silent data corruption" },
74
- { "id": "names_prior_alternative", "kind": "positive", "description": "Names the prior alternative — dynamic languages relying on tests, docs, and reader vigilance to communicate contracts" },
75
- { "id": "names_improvement_mechanism", "kind": "positive", "description": "States that types make contracts checkable at compile time and visible at call sites; scales with team size and code size" },
76
- { "id": "no_fabricated_purpose", "kind": "negative", "description": "Does not add purposes not in the skill e.g., does not claim types are about performance" }
114
+ {
115
+ "id": "names_pain_point",
116
+ "kind": "positive",
117
+ "description": "Names the pain point runtime bugs becoming production incidents or silent data corruption"
118
+ },
119
+ {
120
+ "id": "names_prior_alternative",
121
+ "kind": "positive",
122
+ "description": "Names the prior alternative — dynamic languages relying on tests, docs, and reader vigilance to communicate contracts"
123
+ },
124
+ {
125
+ "id": "names_improvement_mechanism",
126
+ "kind": "positive",
127
+ "description": "States that types make contracts checkable at compile time and visible at call sites; scales with team size and code size"
128
+ },
129
+ {
130
+ "id": "no_fabricated_purpose",
131
+ "kind": "negative",
132
+ "description": "Does not add purposes not in the skill — e.g., does not claim types are about performance"
133
+ }
77
134
  ]
78
135
  },
79
136
  {
@@ -89,15 +146,31 @@
89
146
  "skill_type": "concept",
90
147
  "criticality": "high",
91
148
  "truth_sources": [
92
- "skills/type-safety/SKILL.md:85-94",
93
- "skills/type-safety/SKILL.md:264-272",
94
- "skills/type-safety/SKILL.md#do-not-use-when"
149
+ "skills/quality/type-safety/SKILL.md:85-94",
150
+ "skills/quality/type-safety/SKILL.md:264-272",
151
+ "skills/quality/type-safety/SKILL.md#do-not-use-when"
95
152
  ],
96
153
  "expected_behaviors": [
97
- { "id": "identifies_cross_into_api_design", "kind": "positive", "description": "Recognizes that JSON-shape design of an API surface is api-design, not type-safety" },
98
- { "id": "names_api_design_as_owner", "kind": "positive", "description": "Names api-design as the correct owner skill" },
99
- { "id": "explains_mechanism_of_difference", "kind": "positive", "description": "States api-design owns the external surface contract; type-safety owns the discipline of expressing internal program correctness as types" },
100
- { "id": "no_partial_comply_in_type_safety_voice", "kind": "negative", "description": "Does not provide JSON shape recommendations in type-safety's voice before handing off" }
154
+ {
155
+ "id": "identifies_cross_into_api_design",
156
+ "kind": "positive",
157
+ "description": "Recognizes that JSON-shape design of an API surface is api-design, not type-safety"
158
+ },
159
+ {
160
+ "id": "names_api_design_as_owner",
161
+ "kind": "positive",
162
+ "description": "Names api-design as the correct owner skill"
163
+ },
164
+ {
165
+ "id": "explains_mechanism_of_difference",
166
+ "kind": "positive",
167
+ "description": "States api-design owns the external surface contract; type-safety owns the discipline of expressing internal program correctness as types"
168
+ },
169
+ {
170
+ "id": "no_partial_comply_in_type_safety_voice",
171
+ "kind": "negative",
172
+ "description": "Does not provide JSON shape recommendations in type-safety's voice before handing off"
173
+ }
101
174
  ]
102
175
  },
103
176
  {
@@ -113,13 +186,29 @@
113
186
  "skill_type": "concept",
114
187
  "criticality": "normal",
115
188
  "truth_sources": [
116
- "skills/type-safety/SKILL.md:95-103"
189
+ "skills/quality/type-safety/SKILL.md:95-103"
117
190
  ],
118
191
  "expected_behaviors": [
119
- { "id": "uses_taxonomy_vocab", "kind": "positive", "description": "Uses one or more of the schema's taxonomy relationship types: subset, alternative, prerequisite, composition, specialization" },
120
- { "id": "places_between_dependent_and_refinement", "kind": "positive", "description": "Places GADTs near dependent and refinement types, recognizing the partial dependency" },
121
- { "id": "preserves_existing_relationships", "kind": "positive", "description": "Placement does not contradict the relationships among existing taxonomy entries (sound vs unsound, structural vs nominal)" },
122
- { "id": "admits_imperfect_fit_or_extends", "kind": "positive", "description": "Either admits the fit is imperfect and proposes how to extend, or fits with a clear relationship-type justification" }
192
+ {
193
+ "id": "uses_taxonomy_vocab",
194
+ "kind": "positive",
195
+ "description": "Uses one or more of the schema's taxonomy relationship types: subset, alternative, prerequisite, composition, specialization"
196
+ },
197
+ {
198
+ "id": "places_between_dependent_and_refinement",
199
+ "kind": "positive",
200
+ "description": "Places GADTs near dependent and refinement types, recognizing the partial dependency"
201
+ },
202
+ {
203
+ "id": "preserves_existing_relationships",
204
+ "kind": "positive",
205
+ "description": "Placement does not contradict the relationships among existing taxonomy entries (sound vs unsound, structural vs nominal)"
206
+ },
207
+ {
208
+ "id": "admits_imperfect_fit_or_extends",
209
+ "kind": "positive",
210
+ "description": "Either admits the fit is imperfect and proposes how to extend, or fits with a clear relationship-type justification"
211
+ }
123
212
  ],
124
213
  "expected_reasoning": "GADTs sit between Haskell's vanilla parametric polymorphism and full dependent types — types can be refined by pattern-matching on constructors, but not by arbitrary value expressions. In the skill's taxonomy, the closest fit is 'specialization of sound type systems toward refinement types' or 'composition of pattern-matching with parametric polymorphism'. A correct answer either places GADTs in one of those slots or names the gap in the taxonomy."
125
214
  },
@@ -136,13 +225,29 @@
136
225
  "skill_type": "concept",
137
226
  "criticality": "normal",
138
227
  "truth_sources": [
139
- "skills/type-safety/SKILL.md:104-107"
228
+ "skills/quality/type-safety/SKILL.md:104-107"
140
229
  ],
141
230
  "expected_behaviors": [
142
- { "id": "part_a_distinguishes_npm_audit", "kind": "positive", "description": "Part A: Identifies npm audit as a different class of check (fire-marshal inspection vs structural design) — checking for vulnerabilities found AFTER the build, not for the threat class the design accounted for" },
143
- { "id": "part_b_names_real_break", "kind": "positive", "description": "Part B: Names a concrete way the analogy misleads — e.g., structural engineering is stamped once vs type-check runs every change; or escape hatches are gated in engineering but not in TypeScript by default" },
144
- { "id": "preserves_structural_relationships", "kind": "positive", "description": "Part A's mapping preserves the analogy's load-bearing relationship (build-time design verification vs runtime threat tolerance)" },
145
- { "id": "no_under_claim_on_break", "kind": "negative", "description": "Part B does not refuse to identify a break ('the analogy holds') — the analogy DOES break in identifiable ways and a refusal indicates non-engagement" }
231
+ {
232
+ "id": "part_a_distinguishes_npm_audit",
233
+ "kind": "positive",
234
+ "description": "Part A: Identifies npm audit as a different class of check (fire-marshal inspection vs structural design) — checking for vulnerabilities found AFTER the build, not for the threat class the design accounted for"
235
+ },
236
+ {
237
+ "id": "part_b_names_real_break",
238
+ "kind": "positive",
239
+ "description": "Part B: Names a concrete way the analogy misleads — e.g., structural engineering is stamped once vs type-check runs every change; or escape hatches are gated in engineering but not in TypeScript by default"
240
+ },
241
+ {
242
+ "id": "preserves_structural_relationships",
243
+ "kind": "positive",
244
+ "description": "Part A's mapping preserves the analogy's load-bearing relationship (build-time design verification vs runtime threat tolerance)"
245
+ },
246
+ {
247
+ "id": "no_under_claim_on_break",
248
+ "kind": "negative",
249
+ "description": "Part B does not refuse to identify a break ('the analogy holds') — the analogy DOES break in identifiable ways and a refusal indicates non-engagement"
250
+ }
146
251
  ]
147
252
  },
148
253
  {
@@ -158,16 +263,36 @@
158
263
  "skill_type": "concept",
159
264
  "criticality": "critical",
160
265
  "truth_sources": [
161
- "skills/type-safety/SKILL.md:108-115",
162
- "skills/type-safety/SKILL.md:208-239",
163
- "skills/type-safety/SKILL.md#the-runtime-boundary"
266
+ "skills/quality/type-safety/SKILL.md:108-115",
267
+ "skills/quality/type-safety/SKILL.md:208-239",
268
+ "skills/quality/type-safety/SKILL.md#the-runtime-boundary"
164
269
  ],
165
270
  "expected_behaviors": [
166
- { "id": "flags_misconception_unprompted", "kind": "positive", "description": "Recognizes 'JSON parsed... automatically validated at compile time' as the misconception without being told it's wrong" },
167
- { "id": "corrects_via_runtime_boundary", "kind": "positive", "description": "Corrects using the runtime boundary primitive — TypeScript types are claims about values; values from network/disk are not types until parsed" },
168
- { "id": "rejects_dropping_zod", "kind": "positive", "description": "Recommends keeping Zod (or equivalent) for I/O boundary validation; dropping it would silently disable runtime safety" },
169
- { "id": "explains_mechanism_of_mislead", "kind": "positive", "description": "States that the misconception conflates 'static type assertion' with 'runtime verification' — JSON.parse(input) as User is a claim, not a check" },
170
- { "id": "no_partial_validation_of_misconception", "kind": "negative", "description": "Does not validate the misconception even partially (e.g., 'mostly true, but...')" }
271
+ {
272
+ "id": "flags_misconception_unprompted",
273
+ "kind": "positive",
274
+ "description": "Recognizes 'JSON parsed... automatically validated at compile time' as the misconception without being told it's wrong"
275
+ },
276
+ {
277
+ "id": "corrects_via_runtime_boundary",
278
+ "kind": "positive",
279
+ "description": "Corrects using the runtime boundary primitive — TypeScript types are claims about values; values from network/disk are not types until parsed"
280
+ },
281
+ {
282
+ "id": "rejects_dropping_zod",
283
+ "kind": "positive",
284
+ "description": "Recommends keeping Zod (or equivalent) for I/O boundary validation; dropping it would silently disable runtime safety"
285
+ },
286
+ {
287
+ "id": "explains_mechanism_of_mislead",
288
+ "kind": "positive",
289
+ "description": "States that the misconception conflates 'static type assertion' with 'runtime verification' — JSON.parse(input) as User is a claim, not a check"
290
+ },
291
+ {
292
+ "id": "no_partial_validation_of_misconception",
293
+ "kind": "negative",
294
+ "description": "Does not validate the misconception even partially (e.g., 'mostly true, but...')"
295
+ }
171
296
  ],
172
297
  "expected_reasoning": "The misconception is that TypeScript catches runtime errors. It does not. TypeScript is unsound by design, and even without escape hatches, it makes no guarantees about values crossing the runtime boundary. JSON.parse(input) as User produces a value of static type User and actual type whatever the bytes contained — the static type is a claim, not a verification. Dropping Zod removes the only mechanism that actually validates at runtime; the agent should reject the proposal and explain the mechanism."
173
298
  },
@@ -184,16 +309,40 @@
184
309
  "skill_type": "concept",
185
310
  "criticality": "high",
186
311
  "truth_sources": [
187
- "skills/type-safety/SKILL.md:254-262",
188
- "skills/type-safety/SKILL.md#verification"
312
+ "skills/quality/type-safety/SKILL.md:254-262",
313
+ "skills/quality/type-safety/SKILL.md#verification"
189
314
  ],
190
315
  "expected_behaviors": [
191
- { "id": "invokes_verification_checklist_unprompted", "kind": "positive", "description": "Walks through ≥3 items from the type-safety Verification checklist without being told to" },
192
- { "id": "flags_any_without_comment", "kind": "positive", "description": "Flags `any: any` on the data variable without justification" },
193
- { "id": "flags_as_cast_without_comment", "kind": "positive", "description": "Flags `as PaymentMethod` cast on the unvalidated response.json() result" },
194
- { "id": "flags_missing_runtime_validation", "kind": "positive", "description": "Flags the fetch boundary as missing runtime validation (Zod/io-ts/valibot)" },
195
- { "id": "anchors_to_line_numbers", "kind": "positive", "description": "References specific lines or function names from the snippet, not abstract restatements" },
196
- { "id": "no_verdict_without_anchor", "kind": "negative", "description": "Does not provide an overall verdict without anchoring each judgment to a Verification criterion" }
316
+ {
317
+ "id": "invokes_verification_checklist_unprompted",
318
+ "kind": "positive",
319
+ "description": "Walks through ≥3 items from the type-safety Verification checklist without being told to"
320
+ },
321
+ {
322
+ "id": "flags_any_without_comment",
323
+ "kind": "positive",
324
+ "description": "Flags `any: any` on the data variable without justification"
325
+ },
326
+ {
327
+ "id": "flags_as_cast_without_comment",
328
+ "kind": "positive",
329
+ "description": "Flags `as PaymentMethod` cast on the unvalidated response.json() result"
330
+ },
331
+ {
332
+ "id": "flags_missing_runtime_validation",
333
+ "kind": "positive",
334
+ "description": "Flags the fetch boundary as missing runtime validation (Zod/io-ts/valibot)"
335
+ },
336
+ {
337
+ "id": "anchors_to_line_numbers",
338
+ "kind": "positive",
339
+ "description": "References specific lines or function names from the snippet, not abstract restatements"
340
+ },
341
+ {
342
+ "id": "no_verdict_without_anchor",
343
+ "kind": "negative",
344
+ "description": "Does not provide an overall verdict without anchoring each judgment to a Verification criterion"
345
+ }
197
346
  ],
198
347
  "expected_reasoning": "The Verification checklist requires (paraphrased): strict mode on, noUncheckedIndexedAccess on, no `any` without justification comment, no `as Type` without justification comment, every I/O boundary parses with a validator, discriminated unions have exhaustiveness, public APIs have explicit return types. This snippet fails the `any` rule (data: any), the as cast rule (as PaymentMethod), the I/O validation rule (fetch result is cast not parsed), the explicit return type rule on the async function (inferred only). It passes 'no @ts-ignore'. The agent should walk through these items by name and anchor each to the snippet."
199
348
  },
@@ -210,15 +359,35 @@
210
359
  "skill_type": "concept",
211
360
  "criticality": "high",
212
361
  "truth_sources": [
213
- "skills/type-safety/SKILL.md:264-272",
214
- "skills/type-safety/SKILL.md#do-not-use-when"
362
+ "skills/quality/type-safety/SKILL.md:264-272",
363
+ "skills/quality/type-safety/SKILL.md#do-not-use-when"
215
364
  ],
216
365
  "expected_behaviors": [
217
- { "id": "refuses_schema_design_in_type_safety_voice", "kind": "positive", "description": "Does not produce a column list with NOT NULL or enum suggestions in type-safety's voice" },
218
- { "id": "names_data_modeling_as_owner", "kind": "positive", "description": "Names data-modeling as the correct owner skill" },
219
- { "id": "explains_mechanism", "kind": "positive", "description": "States that data-modeling owns persistence shape; type-safety owns in-memory type contracts that consume that shape" },
220
- { "id": "no_partial_comply", "kind": "negative", "description": "Does not provide partial schema recommendations before refusing" },
221
- { "id": "no_overrefuse", "kind": "negative", "description": "If the user asks a follow-up about the TypeScript types that consume the schema once data-modeling has produced it, the agent re-engages — does not blanket-refuse all related work" }
366
+ {
367
+ "id": "refuses_schema_design_in_type_safety_voice",
368
+ "kind": "positive",
369
+ "description": "Does not produce a column list with NOT NULL or enum suggestions in type-safety's voice"
370
+ },
371
+ {
372
+ "id": "names_data_modeling_as_owner",
373
+ "kind": "positive",
374
+ "description": "Names data-modeling as the correct owner skill"
375
+ },
376
+ {
377
+ "id": "explains_mechanism",
378
+ "kind": "positive",
379
+ "description": "States that data-modeling owns persistence shape; type-safety owns in-memory type contracts that consume that shape"
380
+ },
381
+ {
382
+ "id": "no_partial_comply",
383
+ "kind": "negative",
384
+ "description": "Does not provide partial schema recommendations before refusing"
385
+ },
386
+ {
387
+ "id": "no_overrefuse",
388
+ "kind": "negative",
389
+ "description": "If the user asks a follow-up about the TypeScript types that consume the schema once data-modeling has produced it, the agent re-engages — does not blanket-refuse all related work"
390
+ }
222
391
  ]
223
392
  },
224
393
  {
@@ -234,14 +403,30 @@
234
403
  "skill_type": "concept",
235
404
  "criticality": "high",
236
405
  "truth_sources": [
237
- "skills/type-safety/SKILL.md:108-115",
238
- "skills/type-safety/SKILL.md#any-vs-unknown-vs-never"
406
+ "skills/quality/type-safety/SKILL.md:108-115",
407
+ "skills/quality/type-safety/SKILL.md#any-vs-unknown-vs-never"
239
408
  ],
240
409
  "expected_behaviors": [
241
- { "id": "flags_misconception_about_as", "kind": "positive", "description": "Recognizes that TypeScript `as` is NOT a runtime check; C++ dynamic_cast is. The comparison is wrong." },
242
- { "id": "states_as_compiles_to_nothing", "kind": "positive", "description": "States that `as` compiles to nothing — it is a directive to the type checker only, no runtime code is emitted" },
243
- { "id": "distinguishes_static_directive_from_runtime_check", "kind": "positive", "description": "Distinguishes a static directive ('trust me, this is the type') from a runtime check (`instanceof`, validator parse)" },
244
- { "id": "no_partial_validation", "kind": "negative", "description": "Does not say 'yes, with some caveats' the comparison is structurally wrong, not just imprecise" }
410
+ {
411
+ "id": "flags_misconception_about_as",
412
+ "kind": "positive",
413
+ "description": "Recognizes that TypeScript `as` is NOT a runtime check; C++ dynamic_cast is. The comparison is wrong."
414
+ },
415
+ {
416
+ "id": "states_as_compiles_to_nothing",
417
+ "kind": "positive",
418
+ "description": "States that `as` compiles to nothing — it is a directive to the type checker only, no runtime code is emitted"
419
+ },
420
+ {
421
+ "id": "distinguishes_static_directive_from_runtime_check",
422
+ "kind": "positive",
423
+ "description": "Distinguishes a static directive ('trust me, this is the type') from a runtime check (`instanceof`, validator parse)"
424
+ },
425
+ {
426
+ "id": "no_partial_validation",
427
+ "kind": "negative",
428
+ "description": "Does not say 'yes, with some caveats' — the comparison is structurally wrong, not just imprecise"
429
+ }
245
430
  ],
246
431
  "expected_reasoning": "TypeScript `as` is a static directive, not a runtime check. It compiles to nothing. C++ `dynamic_cast` IS a runtime check (returns nullptr or throws). C-style casts in C++ are closer to TypeScript `as`. A correct answer rejects the comparison: TypeScript `as` is a silent claim a misused `as` makes; the C++ comparison should be to a C-style cast, not dynamic_cast. The body's misconception field explicitly names this trap."
247
432
  }