@skill-graph/cli 0.5.6

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 (330) hide show
  1. package/CHANGELOG.md +247 -0
  2. package/LICENSE +200 -0
  3. package/NOTICE +62 -0
  4. package/README.md +398 -0
  5. package/SKILL_GRAPH.md +443 -0
  6. package/bin/skill-graph.js +374 -0
  7. package/docs/ADOPTION.md +117 -0
  8. package/docs/CONFORMANCE.md +66 -0
  9. package/docs/PRIMER.md +384 -0
  10. package/docs/QUICKSTART-30MIN.md +333 -0
  11. package/docs/ROUTING-METRICS.md +120 -0
  12. package/docs/SKILL-MD-FORMAT-COMPATIBILITY.md +127 -0
  13. package/docs/SKILL_AUDIT_CHECKLIST.md +199 -0
  14. package/docs/SKILL_AUDIT_LOOP.md +195 -0
  15. package/docs/SKILL_METADATA_PROTOCOL.md +609 -0
  16. package/docs/_archived/marketplace-publication-priority-2026-05-18.md +239 -0
  17. package/docs/adr/0001-predicate-set.md +69 -0
  18. package/docs/adr/0002-json-ld-context.md +82 -0
  19. package/docs/adr/0003-ontoclean-rigidity-tags.md +65 -0
  20. package/docs/adr/0004-persistent-identifiers.md +74 -0
  21. package/docs/adr/0005-freshness-consolidation.md +70 -0
  22. package/docs/adr/0006-revise-predicate-rename.md +105 -0
  23. package/docs/adr/0007-audit-loop-cadence.md +99 -0
  24. package/docs/adr/0008-skill-surface-split-and-curation-policy.md +93 -0
  25. package/docs/category-consumers.md +168 -0
  26. package/docs/concept-map.md +194 -0
  27. package/docs/diagrams/drift-states.mmd +21 -0
  28. package/docs/diagrams/manifest-pipeline.mmd +25 -0
  29. package/docs/diagrams/routing-harness.mmd +41 -0
  30. package/docs/diagrams/starter-graph.mmd +53 -0
  31. package/docs/field-decision-guide.md +315 -0
  32. package/docs/field-rationale.md +211 -0
  33. package/docs/field-reference.generated.md +624 -0
  34. package/docs/field-reference.md +1426 -0
  35. package/docs/glossary.md +190 -0
  36. package/docs/head-noun-glossary.md +63 -0
  37. package/docs/images/audit-phases.png +0 -0
  38. package/docs/images/drift-states.png +0 -0
  39. package/docs/images/graded-mode.png +0 -0
  40. package/docs/images/manifest-pipeline.png +0 -0
  41. package/docs/images/routing-harness.png +0 -0
  42. package/docs/images/skill-anatomy.png +0 -0
  43. package/docs/images/starter-graph.png +0 -0
  44. package/docs/images/system-model.png +0 -0
  45. package/docs/integrations/github-actions.md +155 -0
  46. package/docs/manifest-field-mapping.md +443 -0
  47. package/docs/marketplace-publication-queue.generated.md +240 -0
  48. package/docs/marketplace-release-agent-prompt.md +82 -0
  49. package/docs/marketplace-skill-candidate-list.md +272 -0
  50. package/docs/marketplace-syndication.md +222 -0
  51. package/docs/migration-sample-review.md +155 -0
  52. package/docs/migrations/v4-to-v5.md +168 -0
  53. package/docs/migrations/v5-to-v6.md +221 -0
  54. package/docs/name-exceptions.yaml +37 -0
  55. package/docs/plans/marketplace-p1-public-migration-plan.md +41 -0
  56. package/docs/plans/multi-root-workspace.md +148 -0
  57. package/docs/plans/scripts-roadmap.md +107 -0
  58. package/docs/plans/v4-schema-bump.md +160 -0
  59. package/docs/plans/wave-2-extraction.md +122 -0
  60. package/docs/positioning-vs-marketplaces.md +175 -0
  61. package/docs/proposals/skill-audit-loop-positioning.md +160 -0
  62. package/docs/quality-doctrine.md +138 -0
  63. package/docs/recommended-skills.md +150 -0
  64. package/docs/research/skill-comprehension-eval-research.md +1830 -0
  65. package/docs/research/skill-retrieval-evidence.md +66 -0
  66. package/docs/skill-metadata-protocol.md +471 -0
  67. package/docs/skills-sh-maintainer-cleanup-request.md +80 -0
  68. package/examples/audits/a11y/findings.md +52 -0
  69. package/examples/audits/a11y/scorecard.md +21 -0
  70. package/examples/audits/a11y/verdict.md +44 -0
  71. package/examples/audits/debugging/findings.md +59 -0
  72. package/examples/audits/debugging/scorecard.md +22 -0
  73. package/examples/audits/debugging/verdict.md +33 -0
  74. package/examples/audits/documentation/findings.md +59 -0
  75. package/examples/audits/documentation/scorecard.md +22 -0
  76. package/examples/audits/documentation/verdict.md +33 -0
  77. package/examples/evals/a11y.json +140 -0
  78. package/examples/evals/api-design.json +52 -0
  79. package/examples/evals/code-review.json +52 -0
  80. package/examples/evals/data-modeling.json +52 -0
  81. package/examples/evals/database-migration.json +52 -0
  82. package/examples/evals/debugging.json +118 -0
  83. package/examples/evals/dependency-architecture.json +52 -0
  84. package/examples/evals/design-system-architecture.json +52 -0
  85. package/examples/evals/error-tracking.json +52 -0
  86. package/examples/evals/event-contract-design.json +52 -0
  87. package/examples/evals/form-ux-architecture.json +52 -0
  88. package/examples/evals/framework-fit-analysis.json +52 -0
  89. package/examples/evals/graph-audit.json +139 -0
  90. package/examples/evals/information-architecture.json +52 -0
  91. package/examples/evals/interaction-feedback.json +52 -0
  92. package/examples/evals/interaction-patterns.json +52 -0
  93. package/examples/evals/layout-composition.json +52 -0
  94. package/examples/evals/lint-overlay.json +117 -0
  95. package/examples/evals/microcopy.json +52 -0
  96. package/examples/evals/observability-modeling.json +52 -0
  97. package/examples/evals/pattern-recognition.json +96 -0
  98. package/examples/evals/performance-engineering.json +52 -0
  99. package/examples/evals/refactor.json +128 -0
  100. package/examples/evals/semiotics.json +52 -0
  101. package/examples/evals/skill-infrastructure.json +96 -0
  102. package/examples/evals/skill-router.json +140 -0
  103. package/examples/evals/skill-router.routing.json +113 -0
  104. package/examples/evals/system-interface-contracts.json +52 -0
  105. package/examples/evals/task-analysis.json +52 -0
  106. package/examples/evals/testing-strategy.json +118 -0
  107. package/examples/evals/type-safety.json +249 -0
  108. package/examples/evals/visual-design-foundations.json +52 -0
  109. package/examples/evals/webhook-integration.json +52 -0
  110. package/examples/exports/a11y.skill-md.md +80 -0
  111. package/examples/exports/debugging.skill-md.md +80 -0
  112. package/examples/exports/refactor.skill-md.md +78 -0
  113. package/examples/exports/testing-strategy.skill-md.md +81 -0
  114. package/examples/projects/markdown-static-site/README.md +115 -0
  115. package/examples/projects/markdown-static-site/skills/content-source-router/SKILL.md +131 -0
  116. package/examples/projects/markdown-static-site/skills/image-optimization-pipeline-config/SKILL.md +132 -0
  117. package/examples/projects/markdown-static-site/skills/link-rot-detection/SKILL.md +103 -0
  118. package/examples/projects/markdown-static-site/skills/markdown-post-frontmatter-validation/SKILL.md +133 -0
  119. package/examples/projects/markdown-static-site/skills/migrate-posts-to-v2-frontmatter/SKILL.md +140 -0
  120. package/examples/projects/saas-stripe-postgres/README.md +208 -0
  121. package/examples/projects/saas-stripe-postgres/db/migrations/0004_canonicalize_orders.sql +37 -0
  122. package/examples/projects/saas-stripe-postgres/db/schema.sql +112 -0
  123. package/examples/projects/saas-stripe-postgres/skills/migrate-orders-to-canonical-schema/SKILL.md +149 -0
  124. package/examples/projects/saas-stripe-postgres/skills/nextjs-server-action-validation/SKILL.md +154 -0
  125. package/examples/projects/saas-stripe-postgres/skills/payment-provider-router/SKILL.md +153 -0
  126. package/examples/projects/saas-stripe-postgres/skills/postgres-rls-pattern/SKILL.md +163 -0
  127. package/examples/projects/saas-stripe-postgres/skills/stripe-webhook-signature-verification/SKILL.md +137 -0
  128. package/examples/protocol/skill-metadata-template.md +301 -0
  129. package/examples/protocol/skills.manifest.sample.json +13245 -0
  130. package/examples/skill-metadata-template.md +317 -0
  131. package/examples/skills.manifest.sample.json +13519 -0
  132. package/examples/tests/v3-1-skos-fixture/SKILL.md +93 -0
  133. package/marketplace/README.md +17 -0
  134. package/marketplace/skills/a11y/SKILL.md +66 -0
  135. package/marketplace/skills/acid-fundamentals/SKILL.md +106 -0
  136. package/marketplace/skills/agent-engineering/SKILL.md +386 -0
  137. package/marketplace/skills/agent-eval-design/SKILL.md +55 -0
  138. package/marketplace/skills/ai-native-development/SKILL.md +294 -0
  139. package/marketplace/skills/api-design/SKILL.md +60 -0
  140. package/marketplace/skills/architecture-decision-records/SKILL.md +55 -0
  141. package/marketplace/skills/background-jobs/SKILL.md +265 -0
  142. package/marketplace/skills/bounded-context-mapping/SKILL.md +55 -0
  143. package/marketplace/skills/cap-theorem-tradeoffs/SKILL.md +127 -0
  144. package/marketplace/skills/client-server-boundary/SKILL.md +187 -0
  145. package/marketplace/skills/code-review/SKILL.md +120 -0
  146. package/marketplace/skills/color-system-design/SKILL.md +43 -0
  147. package/marketplace/skills/component-architecture/SKILL.md +126 -0
  148. package/marketplace/skills/compression/SKILL.md +112 -0
  149. package/marketplace/skills/conceptual-modeling/SKILL.md +181 -0
  150. package/marketplace/skills/connection-pooling/SKILL.md +105 -0
  151. package/marketplace/skills/constraint-awareness/SKILL.md +287 -0
  152. package/marketplace/skills/content-monitor/SKILL.md +209 -0
  153. package/marketplace/skills/context-engineering/SKILL.md +320 -0
  154. package/marketplace/skills/context-graph/SKILL.md +174 -0
  155. package/marketplace/skills/context-management/SKILL.md +174 -0
  156. package/marketplace/skills/context-window/SKILL.md +239 -0
  157. package/marketplace/skills/contract-testing/SKILL.md +120 -0
  158. package/marketplace/skills/cron-scheduling/SKILL.md +223 -0
  159. package/marketplace/skills/dark-mode-implementation/SKILL.md +47 -0
  160. package/marketplace/skills/data-modeling/SKILL.md +59 -0
  161. package/marketplace/skills/data-modeling-fundamentals/SKILL.md +117 -0
  162. package/marketplace/skills/database-migration/SKILL.md +429 -0
  163. package/marketplace/skills/debugging/SKILL.md +67 -0
  164. package/marketplace/skills/dependency-architecture/SKILL.md +58 -0
  165. package/marketplace/skills/design-module-composition/SKILL.md +43 -0
  166. package/marketplace/skills/design-system-architecture/SKILL.md +61 -0
  167. package/marketplace/skills/design-thinking/SKILL.md +44 -0
  168. package/marketplace/skills/diagnosis/SKILL.md +296 -0
  169. package/marketplace/skills/diff-analysis/SKILL.md +188 -0
  170. package/marketplace/skills/e2e-test-design/SKILL.md +113 -0
  171. package/marketplace/skills/entity-relationship-modeling/SKILL.md +218 -0
  172. package/marketplace/skills/epistemic-grounding/SKILL.md +112 -0
  173. package/marketplace/skills/error-boundary/SKILL.md +235 -0
  174. package/marketplace/skills/error-tracking/SKILL.md +261 -0
  175. package/marketplace/skills/eval-driven-development/SKILL.md +147 -0
  176. package/marketplace/skills/evaluation/SKILL.md +113 -0
  177. package/marketplace/skills/event-contract-design/SKILL.md +60 -0
  178. package/marketplace/skills/event-storming/SKILL.md +56 -0
  179. package/marketplace/skills/form-ux-architecture/SKILL.md +60 -0
  180. package/marketplace/skills/framework-fit-analysis/SKILL.md +59 -0
  181. package/marketplace/skills/frontend-architecture/SKILL.md +43 -0
  182. package/marketplace/skills/generative-ui/SKILL.md +118 -0
  183. package/marketplace/skills/graph-audit/SKILL.md +81 -0
  184. package/marketplace/skills/guardrails/SKILL.md +118 -0
  185. package/marketplace/skills/hooks-patterns/SKILL.md +185 -0
  186. package/marketplace/skills/http-semantics/SKILL.md +136 -0
  187. package/marketplace/skills/ideation/SKILL.md +41 -0
  188. package/marketplace/skills/indexing-strategy/SKILL.md +108 -0
  189. package/marketplace/skills/information-architecture/SKILL.md +59 -0
  190. package/marketplace/skills/integration-test-design/SKILL.md +111 -0
  191. package/marketplace/skills/intent-recognition/SKILL.md +136 -0
  192. package/marketplace/skills/interaction-feedback/SKILL.md +59 -0
  193. package/marketplace/skills/interaction-patterns/SKILL.md +59 -0
  194. package/marketplace/skills/journey-mapping/SKILL.md +41 -0
  195. package/marketplace/skills/keywords/SKILL.md +213 -0
  196. package/marketplace/skills/knowledge-modeling/SKILL.md +232 -0
  197. package/marketplace/skills/layout-composition/SKILL.md +59 -0
  198. package/marketplace/skills/linguistics/SKILL.md +429 -0
  199. package/marketplace/skills/lint-overlay/SKILL.md +76 -0
  200. package/marketplace/skills/mental-models/SKILL.md +126 -0
  201. package/marketplace/skills/merge-queue/SKILL.md +94 -0
  202. package/marketplace/skills/methodology/SKILL.md +317 -0
  203. package/marketplace/skills/microcopy/SKILL.md +232 -0
  204. package/marketplace/skills/middleware-patterns/SKILL.md +363 -0
  205. package/marketplace/skills/mobile-responsive-ux/SKILL.md +287 -0
  206. package/marketplace/skills/mutation-testing/SKILL.md +112 -0
  207. package/marketplace/skills/naming-conventions/SKILL.md +112 -0
  208. package/marketplace/skills/observability-modeling/SKILL.md +59 -0
  209. package/marketplace/skills/ontology-modeling/SKILL.md +67 -0
  210. package/marketplace/skills/owasp-security/SKILL.md +153 -0
  211. package/marketplace/skills/pattern-recognition/SKILL.md +472 -0
  212. package/marketplace/skills/performance-budgets/SKILL.md +185 -0
  213. package/marketplace/skills/performance-engineering/SKILL.md +58 -0
  214. package/marketplace/skills/performance-testing/SKILL.md +125 -0
  215. package/marketplace/skills/printify/SKILL.md +42 -0
  216. package/marketplace/skills/prioritization/SKILL.md +118 -0
  217. package/marketplace/skills/problem-framing/SKILL.md +41 -0
  218. package/marketplace/skills/problem-locating-solving/SKILL.md +203 -0
  219. package/marketplace/skills/project-knowledge-extraction/SKILL.md +54 -0
  220. package/marketplace/skills/prompt-craft/SKILL.md +134 -0
  221. package/marketplace/skills/prompt-injection-defense/SKILL.md +132 -0
  222. package/marketplace/skills/property-based-testing/SKILL.md +100 -0
  223. package/marketplace/skills/prototyping/SKILL.md +43 -0
  224. package/marketplace/skills/query-optimization/SKILL.md +144 -0
  225. package/marketplace/skills/real-time-updates/SKILL.md +324 -0
  226. package/marketplace/skills/ref-patterns/SKILL.md +284 -0
  227. package/marketplace/skills/refactor/SKILL.md +65 -0
  228. package/marketplace/skills/rendering-models/SKILL.md +142 -0
  229. package/marketplace/skills/replication-patterns/SKILL.md +110 -0
  230. package/marketplace/skills/research-synthesis/SKILL.md +41 -0
  231. package/marketplace/skills/route-handler-design/SKILL.md +347 -0
  232. package/marketplace/skills/schema-evolution/SKILL.md +140 -0
  233. package/marketplace/skills/security-fundamentals/SKILL.md +139 -0
  234. package/marketplace/skills/semantic-center/SKILL.md +194 -0
  235. package/marketplace/skills/semantic-relations/SKILL.md +250 -0
  236. package/marketplace/skills/semantics/SKILL.md +366 -0
  237. package/marketplace/skills/semiotics/SKILL.md +230 -0
  238. package/marketplace/skills/seo-strategy/SKILL.md +260 -0
  239. package/marketplace/skills/server-actions-design/SKILL.md +243 -0
  240. package/marketplace/skills/server-components-design/SKILL.md +190 -0
  241. package/marketplace/skills/sharding-strategy/SKILL.md +123 -0
  242. package/marketplace/skills/shopify/SKILL.md +42 -0
  243. package/marketplace/skills/skill-infrastructure/SKILL.md +320 -0
  244. package/marketplace/skills/skill-router/SKILL.md +71 -0
  245. package/marketplace/skills/skill-scaffold/SKILL.md +105 -0
  246. package/marketplace/skills/snapshot-testing/SKILL.md +120 -0
  247. package/marketplace/skills/spec-driven-development/SKILL.md +148 -0
  248. package/marketplace/skills/state-machine-modeling/SKILL.md +56 -0
  249. package/marketplace/skills/state-management/SKILL.md +134 -0
  250. package/marketplace/skills/streaming-architecture/SKILL.md +194 -0
  251. package/marketplace/skills/summarization/SKILL.md +156 -0
  252. package/marketplace/skills/suspense-patterns/SKILL.md +265 -0
  253. package/marketplace/skills/system-interface-contracts/SKILL.md +59 -0
  254. package/marketplace/skills/task-analysis/SKILL.md +201 -0
  255. package/marketplace/skills/taxonomy-design/SKILL.md +66 -0
  256. package/marketplace/skills/test-coverage-strategy/SKILL.md +108 -0
  257. package/marketplace/skills/test-doubles-design/SKILL.md +98 -0
  258. package/marketplace/skills/test-driven-development/SKILL.md +96 -0
  259. package/marketplace/skills/testing-strategy/SKILL.md +67 -0
  260. package/marketplace/skills/theme-system-design/SKILL.md +43 -0
  261. package/marketplace/skills/tool-call-flow/SKILL.md +229 -0
  262. package/marketplace/skills/tool-call-strategy/SKILL.md +292 -0
  263. package/marketplace/skills/transaction-isolation/SKILL.md +98 -0
  264. package/marketplace/skills/type-safety/SKILL.md +177 -0
  265. package/marketplace/skills/typography-system/SKILL.md +43 -0
  266. package/marketplace/skills/usability-testing/SKILL.md +43 -0
  267. package/marketplace/skills/user-research/SKILL.md +43 -0
  268. package/marketplace/skills/vercel-composition-patterns/SKILL.md +157 -0
  269. package/marketplace/skills/version-control/SKILL.md +233 -0
  270. package/marketplace/skills/visual-design-foundations/SKILL.md +59 -0
  271. package/marketplace/skills/visual-hierarchy/SKILL.md +43 -0
  272. package/marketplace/skills/webhook-integration/SKILL.md +331 -0
  273. package/marketplace/skills/writing-humanizer/SKILL.md +380 -0
  274. package/package.json +67 -0
  275. package/schemas/manifest.schema.json +811 -0
  276. package/schemas/manifest.v2.schema.json +164 -0
  277. package/schemas/manifest.v3.schema.json +758 -0
  278. package/schemas/manifest.v4.schema.json +755 -0
  279. package/schemas/manifest.v5.schema.json +755 -0
  280. package/schemas/manifest.v6.schema.json +811 -0
  281. package/schemas/skill.context.jsonld +279 -0
  282. package/schemas/skill.schema.json +919 -0
  283. package/schemas/skill.v2.schema.json +201 -0
  284. package/schemas/skill.v3.schema.json +827 -0
  285. package/schemas/skill.v4.schema.json +822 -0
  286. package/schemas/skill.v5.schema.json +830 -0
  287. package/schemas/skill.v6.schema.json +946 -0
  288. package/schemas/vocabulary/keywords.json +180 -0
  289. package/schemas/vocabulary/workspace_tags.json +23 -0
  290. package/scripts/__tests__/migrate-skill-v2-to-v3.test.js +161 -0
  291. package/scripts/__tests__/migrate-skill-v3-to-v4.test.js +158 -0
  292. package/scripts/__tests__/test-export-parser-drift.js +149 -0
  293. package/scripts/__tests__/test-marketplace-export.js +114 -0
  294. package/scripts/__tests__/test-router-paths.js +82 -0
  295. package/scripts/__tests__/test-stability-promotion.js +244 -0
  296. package/scripts/__tests__/test-v3-1-alias-contract.js +109 -0
  297. package/scripts/__tests__/test-v3-1-skos-runtime.js +116 -0
  298. package/scripts/backfill-schema-version.js +198 -0
  299. package/scripts/build-field-reference.js +160 -0
  300. package/scripts/build-retrieval-baseline.js +511 -0
  301. package/scripts/check-markdown-links.js +211 -0
  302. package/scripts/check-protocol-consistency.js +979 -0
  303. package/scripts/export-marketplace-skills.js +610 -0
  304. package/scripts/export-skill.js +374 -0
  305. package/scripts/generate-manifest.js +787 -0
  306. package/scripts/lib/alias-contract.js +83 -0
  307. package/scripts/lib/audit-prompt-builder.js +771 -0
  308. package/scripts/lib/mock-grader.js +134 -0
  309. package/scripts/lib/parse-frontmatter.js +429 -0
  310. package/scripts/lib/roots.js +119 -0
  311. package/scripts/lint/check-archetype-sections.js +185 -0
  312. package/scripts/lint/check-category-enum.js +83 -0
  313. package/scripts/lint/check-routing-eval.js +146 -0
  314. package/scripts/lint/check-routing-quality.js +211 -0
  315. package/scripts/lint/check-stability-promotion.js +220 -0
  316. package/scripts/lint/format-code-frame.js +206 -0
  317. package/scripts/marketplace-install.js +125 -0
  318. package/scripts/migrate-category-to-enum.js +169 -0
  319. package/scripts/migrate-skill-v2-to-v3.js +424 -0
  320. package/scripts/migrate-skill-v3-to-v4.js +200 -0
  321. package/scripts/migrate-skill-v5-to-v6.js +304 -0
  322. package/scripts/restructure-by-category.js +85 -0
  323. package/scripts/seed-publication-classification.js +282 -0
  324. package/scripts/skill-audit.js +893 -0
  325. package/scripts/skill-graph-drift.js +483 -0
  326. package/scripts/skill-graph-route.js +766 -0
  327. package/scripts/skill-graph-routing-eval.js +393 -0
  328. package/scripts/skill-lint.js +1317 -0
  329. package/scripts/skill-overlap.js +213 -0
  330. package/scripts/verify-skill-md-export.js +201 -0
@@ -0,0 +1,429 @@
1
+ ---
2
+ name: linguistics
3
+ description: "Use when choosing names for files/functions/variables/types/columns, writing or reviewing UI copy/error/onboarding text, disambiguating overloaded terms, or matching tone to end-user/agent/developer audiences. Covers morphology, compound-word order, abbreviation policy, verb-noun rules, polysemy resolution, audience register, blame-free error-message structure, and cross-cultural product-copy awareness. Do NOT use for casing conventions (use naming-conventions), doc structure/type selection (use documentation), or call-site-wide renames (use refactor)."
4
+ license: MIT
5
+ compatibility: "Provider-/runtime-/stack-agnostic. The morphology, polysemy, register, and error-message rules apply to any software product written in any human-spoken language; the casing-convention table is illustrative for typical OSS stacks (TypeScript, SQL, CSS, Python) — substitute the conventions of your own stack."
6
+ allowed-tools: Read Grep
7
+ metadata:
8
+ metadata: "{\"schema_version\":6,\"version\":\"1.1.0\",\"type\":\"capability\",\"category\":\"foundations\",\"domain\":\"foundations/language\",\"scope\":\"portable\",\"owner\":\"skill-graph-maintainer\",\"freshness\":\"2026-05-16\",\"drift_check\":\"{\\\\\\\"last_verified\\\\\\\":\\\\\\\"2026-05-16\\\\\\\"}\",\"eval_artifacts\":\"planned\",\"eval_state\":\"unverified\",\"routing_eval\":\"absent\",\"comprehension_state\":\"present\",\"stability\":\"experimental\",\"keywords\":\"[\\\\\\\"polysemy resolution\\\\\\\",\\\\\\\"polysemy map\\\\\\\",\\\\\\\"register selection\\\\\\\",\\\\\\\"audience register\\\\\\\",\\\\\\\"blame-free error wording\\\\\\\",\\\\\\\"three-part error structure\\\\\\\",\\\\\\\"morphology rules\\\\\\\",\\\\\\\"compound-word ordering\\\\\\\",\\\\\\\"abbreviation policy\\\\\\\",\\\\\\\"ambiguous identifier qualification\\\\\\\",\\\\\\\"linguistic precision\\\\\\\",\\\\\\\"register mismatch\\\\\\\",\\\\\\\"unqualified polysemous identifier\\\\\\\",\\\\\\\"error-message linguistics\\\\\\\",\\\\\\\"cross-cultural linguistic awareness\\\\\\\",\\\\\\\"verb-noun naming rule\\\\\\\",\\\\\\\"what-why-action error structure\\\\\\\"]\",\"examples\":\"[\\\\\\\"this variable is named provider but it could mean fulfillment, auth, or payment — what linguistic rule applies?\\\\\\\",\\\\\\\"rewrite this error message to be specific, blame-free, and actionable\\\\\\\",\\\\\\\"the word shipping means seller cost in one file and customer charge in another — how do we resolve the polysemy without a glossary cleanup?\\\\\\\",\\\\\\\"should this helper file be called utils.ts, helpers.ts, or something domain-specific?\\\\\\\",\\\\\\\"explain how to phrase the same finance concept for an end-user, an agent, and a developer\\\\\\\",\\\\\\\"audit this UI copy for register mismatch with the end-user audience\\\\\\\",\\\\\\\"when is an abbreviation acceptable in a code identifier?\\\\\\\"]\",\"anti_examples\":\"[\\\\\\\"decide kebab-case vs snake_case vs camelCase for new database columns\\\\\\\",\\\\\\\"restructure this doc into a tutorial format with progressive disclosure\\\\\\\",\\\\\\\"implement Intl.NumberFormat for DKK vs USD currency formatting\\\\\\\",\\\\\\\"give me the canonical definition of reconciliation in our domain\\\\\\\",\\\\\\\"review this PR for code quality and missing tests\\\\\\\",\\\\\\\"rename this function and update every call-site across the repo\\\\\\\"]\",\"relations\":\"{\\\\\\\"boundary\\\\\\\":[{\\\\\\\"skill\\\\\\\":\\\\\\\"naming-conventions\\\\\\\",\\\\\\\"reason\\\\\\\":\\\\\\\"naming-conventions owns the deterministic casing/format choice per artifact kind (kebab-case for files, camelCase for TS, snake_case for SQL); linguistics owns the linguistic rationale (morphology, polysemy resolution, register fit, blame-free copy) — the same 'help me name this' prompt routes by whether the user wants the convention itself or the linguistic basis behind it\\\\\\\"},{\\\\\\\"skill\\\\\\\":\\\\\\\"refactor\\\\\\\",\\\\\\\"reason\\\\\\\":\\\\\\\"refactor owns behavior-preserving structural change including rename mechanics across call sites; linguistics owns the linguistic decision of what the new name should be — the same 'rename this thing' prompt routes by whether the trigger is the rename mechanics or the naming choice itself\\\\\\\"}],\\\\\\\"related\\\\\\\":[\\\\\\\"prompt-craft\\\\\\\",\\\\\\\"intent-recognition\\\\\\\",\\\\\\\"code-review\\\\\\\"],\\\\\\\"verify_with\\\\\\\":[\\\\\\\"naming-conventions\\\\\\\",\\\\\\\"code-review\\\\\\\"]}\",\"portability\":\"{\\\\\\\"readiness\\\\\\\":\\\\\\\"scripted\\\\\\\",\\\\\\\"targets\\\\\\\":[\\\\\\\"skill-md\\\\\\\"]}\",\"lifecycle\":\"{\\\\\\\"stale_after_days\\\\\\\":365,\\\\\\\"review_cadence\\\\\\\":\\\\\\\"quarterly\\\\\\\"}\",\"mental_model\":\"|\",\"purpose\":\"|\",\"boundary\":\"|\",\"analogy\":\"Linguistics in software is to identifier names what civil engineering is to bridge geometry — the bridge holds up because the geometry obeys load-bearing rules, not because the bridge is artful; the rules don't make the bridge beautiful, but ignoring them makes the bridge fall down. A name like `handleContinue` is the equivalent of a beam sized by intuition: it might hold, but you've forfeited the proof that it will.\",\"misconception\":\"|\",\"concept\":\"{\\\\\\\"definition\\\\\\\":\\\\\\\"Linguistics applied to software is the discipline of using the rules of human language — morphology, semantics, pragmatics, sociolinguistics — to shape the words inside a software system: identifier names, type labels, error messages, UI copy, and documentation prose. Drawing from Saussure's signifier/signified distinction, Lyons's structural semantics, and Halliday's systemic-functional grammar, it treats every name and every visible string as a small linguistic artefact whose form determines whether the reader can decode the intended meaning quickly and reliably.\\\\\\\",\\\\\\\"mental_model\\\\\\\":\\\\\\\"|\\\\\\\",\\\\\\\"purpose\\\\\\\":\\\\\\\"|\\\\\\\",\\\\\\\"boundary\\\\\\\":\\\\\\\"|\\\\\\\",\\\\\\\"taxonomy\\\\\\\":\\\\\\\"|\\\\\\\",\\\\\\\"analogy\\\\\\\":\\\\\\\"|\\\\\\\",\\\\\\\"misconception\\\\\\\":\\\\\\\"|\\\\\\\"}\",\"skill_graph_source_repo\":\"https://github.com/jacob-balslev/skill-graph\",\"skill_graph_protocol\":\"Skill Metadata Protocol v5\",\"skill_graph_project\":\"Skill Graph\",\"skill_graph_canonical_skill\":\"skills/linguistics/SKILL.md\"}"
9
+ skill_graph_source_repo: "https://github.com/jacob-balslev/skill-graph"
10
+ skill_graph_protocol: Skill Metadata Protocol v4
11
+ skill_graph_project: Skill Graph
12
+ skill_graph_canonical_skill: skills/linguistics/SKILL.md
13
+ ---
14
+
15
+ # Linguistics
16
+
17
+ ## Coverage
18
+
19
+ Linguistic analysis patterns for software work — the rules that govern how names, labels, error messages, and copy are formed. Covers (1) **morphology**: casing conventions per artifact kind, compound-word head-first ordering, abbreviation decision tree, verb-noun naming patterns; (2) **polysemy resolution**: identifying ambiguous identifiers in a codebase and qualifying them with their domain (e.g., `provider` → `fulfillmentProvider` / `authProvider` / `paymentProvider`); (3) **register selection**: choosing the right tone, vocabulary, and sentence structure for end-users, agents, and developers; (4) **error-message linguistics**: the three-part What → Why → What-to-do structure with blame-free framing, specificity rules, and actionability; and (5) **cross-cultural linguistic awareness**: the linguistic facts (number structure, currency notation, grammatical gender, script direction) that shape internationalization decisions. Provides the *linguistic rationale* for these choices — not the casing convention itself, not the canonical term definition, not the i18n implementation.
20
+
21
+ ## Philosophy
22
+
23
+ Language in software is architecture. A function named `handleContinue` can do anything from persisting form state to advancing a wizard — it carries a weak contract outside its local component. A function named `transformPaymentEvent` is much harder to misunderstand. An error message that says "Error 500" transfers zero information; one that says "Order sync paused — your API key may have expired. Open Settings → Integrations to reconnect." transfers a complete causal chain plus an action. The same word can carry different meanings in different parts of the same codebase, and without disambiguation every reader must infer the meaning from surrounding context — that inference has a cost, and sometimes a failure mode.
24
+
25
+ Three linguistic laws follow:
26
+
27
+ 1. **Names are contracts.** A name commits to what a thing is and what it does. Changing behavior without changing the name is a lie.
28
+ 2. **Ambiguous terms compound.** One ambiguous term causes one bug. Ten ambiguous terms cause a combinatorial fog. Resolve at the first encounter, not in a later cleanup.
29
+ 3. **Audience determines form.** The same fact needs different words for an end-user, an agent, and a developer. Writing in the wrong register is a communication failure even when the facts are correct.
30
+
31
+ The linguistic goal is to make meaning unambiguous *at the point of contact* — in the name itself, the message itself, the label itself — not in a glossary entry the reader has to look up.
32
+
33
+ ---
34
+
35
+ ## 1. Naming Precision (Morphology)
36
+
37
+ Morphology is the study of word form — how words are built from parts. In code, the "words" are identifiers, and the "morphology rules" are casing conventions, compounding strategies, and abbreviation policies.
38
+
39
+ ### Casing Conventions and Their Linguistic Basis
40
+
41
+ | Convention | Typical Use | Linguistic Reason |
42
+ |------------|-------------|-------------------|
43
+ | `camelCase` | Variables, function names in many languages | Each morpheme boundary is marked by capitalization; reads as one compound word |
44
+ | `PascalCase` | Types, classes, components | Same compound logic, but signals "noun/thing" rather than "action/value" |
45
+ | `kebab-case` | File names, CSS classes, URL paths | Human-readable in filesystem and URL contexts where case is often flattened |
46
+ | `snake_case` | Database columns, Python identifiers | Separator makes each morpheme explicit; SQL is case-insensitive so underscores are the only safe delimiter |
47
+ | `SCREAMING_SNAKE` | Constants, enums, environment variables | All-caps signals immutability; snake separators keep it readable |
48
+
49
+ **Rule:** match the convention to the artifact-kind context, never cross-pollinate. `orderCount` in TypeScript, `order_count` in SQL, `order-count` in CSS. They are the same concept expressed in three linguistic registers. The casing decision itself belongs to `naming-conventions`; this skill explains *why* each convention fits its context.
50
+
51
+ ### Compound Word Rules
52
+
53
+ Compound words carry more semantic load than simple words. The order of morphemes matters.
54
+
55
+ **Head-first vs. modifier-first:**
56
+
57
+ In English technical compounds, the modifier comes first and the head (the main concept) comes last. The head tells you *what kind of thing it is*; the modifier qualifies it.
58
+
59
+ | Compound | Head | Modifier | Reads as |
60
+ |----------|------|----------|----------|
61
+ | `shippingCost` | cost | shipping | "a cost, specifically for shipping" |
62
+ | `orderCount` | count | order | "a count, specifically of orders" |
63
+ | `fulfillmentProvider` | provider | fulfillment | "a provider, specifically for fulfillment" |
64
+
65
+ **Anti-pattern:** reversing the order (`costShipping`, `countOrders`) breaks English morphology and makes names harder to scan. The mind expects the head at the end.
66
+
67
+ **Disambiguation through compounding:**
68
+
69
+ When a simple word is ambiguous, compound it with its domain qualifier:
70
+
71
+ | Ambiguous | Qualified | Domain |
72
+ |-----------|-----------|--------|
73
+ | `shipping` | `shippingCostCents` | Outbound cost paid by the seller |
74
+ | `shipping` | `shippingChargedCents` | Amount charged to the customer |
75
+ | `provider` | `fulfillmentProvider` | Fulfillment partner |
76
+ | `provider` | `authProvider` | Authentication identity provider |
77
+ | `provider` | `paymentProvider` | Payment processor |
78
+ | `cost` | `productionCostCents` | Production / fulfillment cost |
79
+ | `cost` | `subscriptionCost` | Plan pricing |
80
+ | `cost` | `tokenCostUsd` | Inference / API cost |
81
+
82
+ **Rule:** if a word has more than one meaning anywhere in the codebase, compound it with its domain qualifier. The unqualified form is banned in typed code.
83
+
84
+ ### Abbreviation Policy
85
+
86
+ Abbreviations save characters but cost comprehension. Use this decision tree:
87
+
88
+ ```
89
+ Is this abbreviation universally understood by every reader?
90
+ ├── Yes → Allow (examples: URL, API, DB, ID, HTML, CSS, JSON, HTTP, SKU)
91
+ └── No → Is the full form longer than 25 characters?
92
+ ├── No → Use the full form
93
+ └── Yes → Is the abbreviation used in 10+ places?
94
+ ├── No → Use the full form, consider renaming the concept
95
+ └── Yes → Define the abbreviation in the project glossary, then allow it
96
+ ```
97
+
98
+ **Always acceptable:** `id`, `url`, `api`, `db`, `html`, `css`, `json`, `http`, `sku`, `ui`, `ux`, `pii`, `gdpr`.
99
+
100
+ **Never acceptable:** `mgr` (manager), `proc` (process or procedure?), `calc` (just write `calculate`), `btn` (button), `val` (validate or value?), `auth` without qualifier (authentication or authorization?), `temp` (temporary or temperature?), `util` (a red flag — see anti-patterns).
101
+
102
+ ### Verb-Noun Naming Patterns
103
+
104
+ Functions describe actions (verbs). Variables describe things (nouns). Mixing the patterns creates naming smells.
105
+
106
+ **Function naming — verb-first:**
107
+
108
+ | Verb | When to use | Example |
109
+ |------|-------------|---------|
110
+ | `get` | Retrieval from a source, may be async | `getOrders`, `getOrderById` |
111
+ | `fetch` | Specifically async network call | `fetchExternalOrders` |
112
+ | `load` | Load into memory/state from a slower source | `loadDashboardData` |
113
+ | `validate` | Check correctness, return boolean or throw | `validateWebhookPayload` |
114
+ | `parse` | Convert raw input into typed output | `parseConnectionString` |
115
+ | `transform` | Convert one structured form to another | `transformPaymentEvent` |
116
+ | `convert` | Change units or formats, same semantic content | `convertCentsToDisplayAmount` |
117
+ | `calculate` | Derive a computed value | `calculateNetMargin` |
118
+ | `create` | Instantiate and persist | `createPlatformConnection` |
119
+ | `update` | Modify existing entity | `updateOrderStatus` |
120
+ | `delete` / `remove` | Destructive operations | `deleteAccount`, `removeLineItem` |
121
+ | `handle` | Entry point for events/webhooks (and nothing else) | `handleIncomingWebhook` |
122
+ | `process` | Multi-step pipeline execution | `processVerifiedWebhook` |
123
+ | `extract` | Pull a subset from a larger structure | `extractOrderPii` |
124
+ | `format` | Produce a display string | `formatCurrencyDisplay` |
125
+ | `build` | Assemble a complex object | `buildCanonicalOrder` |
126
+
127
+ **Anti-pattern:** using `handle` for everything in server-side or utility code. `handleSync` tells you the entry point. It does not tell you whether it validates, transforms, persists, or retries. Name the operation, not the trigger.
128
+
129
+ **Exception — UI event handlers:** in component files (e.g., React `.tsx`), `handle*` is the established convention for DOM event callbacks (`handleSubmit`, `handleChange`, `handleClose`). These are scoped to the component and the "event being handled" is self-evident from the UI context. The anti-pattern label applies to backend / service / utility functions where the operation ambiguity is real.
130
+
131
+ **Variable naming — noun-first:**
132
+
133
+ | Pattern | Example | Why |
134
+ |---------|---------|-----|
135
+ | Boolean: `is` + adjective | `isValid`, `isActive`, `isReconciled` | Reads as a question in conditions: `if (isValid)` |
136
+ | Boolean: `has` + noun | `hasConnection`, `hasFinancialData` | "Does X have Y?" — confirms presence |
137
+ | Boolean: `can` + verb | `canExportOrders`, `canEditPricing` | Permission check — "is X allowed to do Y?" |
138
+ | Count: noun + `Count` | `orderCount`, `lineItemCount` | Disambiguates from the collection |
139
+ | Collection: plural noun | `orders`, `lineItems`, `errors` | Plural form signals collection; no `List`, `Array`, `Set` suffix |
140
+ | Nullability | Express via the type system, not the name | Use `T | null`, not `*OrNull` suffixes |
141
+ | Currency-as-integer | noun + `Cents` (or unit suffix) | Mandatory for any financial integer; never store money as a float |
142
+
143
+ ---
144
+
145
+ ## 2. Polysemy Resolution (Disambiguation)
146
+
147
+ Polysemy is when one word carries multiple meanings. In natural language, surrounding context resolves the ambiguity automatically. In code and documentation, context is often missing — and the resolution cost falls on every reader.
148
+
149
+ ### Polysemy Map (Examples)
150
+
151
+ These words are commonly polysemous in software. The unqualified form should not appear in typed code; always use the qualified form.
152
+
153
+ | Ambiguous term | Context A | Context B | Context C | Qualified forms |
154
+ |----------------|-----------|-----------|-----------|-----------------|
155
+ | **margin** | Finance: profit as % of revenue | CSS: spacing property | Domain-typical range (industry-specific) | `marginPercent` (finance), CSS property (leave as-is in stylesheet) |
156
+ | **shipping** | Cost paid by the seller to a carrier | Amount charged to the customer on invoice | The carrier itself | `shippingCostCents`, `shippingChargedCents`, `carrierName` |
157
+ | **provider** | Fulfillment partner | Authentication identity provider | Payment processor | `fulfillmentProvider`, `authProvider`, `paymentProvider` |
158
+ | **cost** | Production / fulfillment cost | Subscription plan pricing | Inference / API token spend | `productionCostCents`, `subscriptionPriceCents`, `tokenCostUsd` |
159
+ | **sync** | Data import from an external platform | URL ↔ UI state coordination | Inter-process / inter-agent coordination | `platformSync`, `stateSync`, `agentSync` |
160
+ | **channel** | Sales platform | Alert delivery medium | Chat-platform channel | `salesChannel`, `alertChannel`, `chatChannel` |
161
+ | **source** | Data origin (which platform) | Source code file | Content source | `dataSource`, `sourceFile`, `contentSource` |
162
+ | **status** | Order status (pending / shipped) | Fulfillment status (in production) | Task status (in progress / done) | `orderStatus`, `fulfillmentStatus`, `taskStatus` |
163
+ | **connection** | Platform integration (a third-party connected) | Database connection pool | WebSocket connection | `platformConnection`, `dbConnection`, `wsConnection` |
164
+ | **confidence** | Data completeness score (0–100) | Statistical probability | Colloquial certainty | `dataConfidenceScore`, keep `confidence` in statistical contexts |
165
+
166
+ ### Resolution Protocol
167
+
168
+ When you encounter an ambiguous term:
169
+
170
+ 1. **Identify all contexts** where the term appears in the codebase. Grep before assuming.
171
+ 2. **Choose the qualified form** for each code context. The project glossary is the authority on canonical forms.
172
+ 3. **Update the variable name, column name, or UI label** to use the qualified form.
173
+ 4. **Document the disambiguation** in a code comment if the qualified form is not yet self-evident.
174
+
175
+ **Code naming rule:** the qualified form goes into the identifier. No fallback to context inference.
176
+
177
+ ```typescript
178
+ // Wrong — "shipping" is ambiguous
179
+ const shipping = order.shipping_cost + order.shipping_charged;
180
+
181
+ // Right — each concept is named precisely
182
+ const shippingCostCents = order.shipping_cost_cents; // seller pays this
183
+ const shippingChargedCents = order.shipping_charged_cents; // customer pays this
184
+ ```
185
+
186
+ **Documentation rule:** the first occurrence of an ambiguous term in any doc must be qualified. Subsequent occurrences may use the short form only if the surrounding context is unambiguous.
187
+
188
+ ---
189
+
190
+ ## 3. Tone and Register
191
+
192
+ Register is the level of formality and technicality appropriate for a given audience and context. The same fact requires different register for an end-user, an agent, and a developer. Writing in the wrong register is a communication failure even when the content is accurate.
193
+
194
+ ### Register Map
195
+
196
+ | Audience | Context | Register | Character | Example |
197
+ |----------|---------|----------|-----------|---------|
198
+ | **End-user** | UI copy, tooltips, empty states, error messages | Warm, plain, action-oriented | A knowledgeable friend who respects the user's time and intelligence | "Connect your fulfillment partner to see your real production cost per order." |
199
+ | **End-user** | Onboarding | Confident, step-by-step, time-honest | A setup guide written by someone who has done this a hundred times | "Step 2 of 5: Link your storefront. Takes about 2 minutes." |
200
+ | **Agent** | Skill / capability files | Dense, precise, reference-heavy | A technical spec from a colleague who assumes domain knowledge | "Use `fulfillmentProvider`, never unqualified `provider`. Three distinct meanings exist." |
201
+ | **Agent** | Structured logs | Diagnostic, no hedging | A structured log entry | `[WEBHOOK_FAILED] order_id=12345 reason=hmac_mismatch retry=true` |
202
+ | **Developer** | Code comments | Concise, rationale-focused, explains *why* | A note from the author who knows the reader is technical | `// Using the org-scoped query — must stay tenant-scoped (ABC-123)` |
203
+ | **Developer** | Architecture decision records | Formal, decision-focused, versioned | An architectural decision record | "Decision: use COALESCE(EXCLUDED.col, existing.col) to prevent null overwrites on upsert." |
204
+ | **Developer** | PR descriptions | Technical, factual, testable | A clear brief for a code reviewer | "Adds HMAC verification to platform webhooks. Test: curl the endpoint without the signature header — expect 401." |
205
+
206
+ ### End-User Register: Detailed Rules
207
+
208
+ The end-user register has the tightest constraints because it directly affects user trust and conversion.
209
+
210
+ **Vocabulary:**
211
+ - Use domain terms the user already knows: revenue, margin, SKU, fulfillment for an e-commerce audience; subscriber, MRR, churn for a SaaS audience.
212
+ - Avoid internal technical terms: `canonical`, `reconciliation` (say "matched" instead), `backfill` (say "importing past data").
213
+ - Use "you" and "your" — the UI speaks to the user directly.
214
+ - Quantify time when you know it: "~2 minutes" beats "just a moment".
215
+
216
+ **Sentence structure:**
217
+ - Lead with the outcome, not the process. "See your real profit per order" not "This feature connects your order data and calculates profit."
218
+ - Use active voice. "Sync paused" not "Sync has been paused."
219
+ - One idea per sentence in error messages.
220
+
221
+ **Tone:**
222
+ - Calm authority, not startup hype. "Know your real profit." not "Unlock powerful profit insights!"
223
+ - Honest about missing data. "Connecting your fulfillment partner will reveal your production cost." not "Your profit: $0.00" when production cost is unknown.
224
+ - Never blame the user. "We couldn't connect" not "You entered the wrong API key."
225
+
226
+ ### Agent-Facing Register: Detailed Rules
227
+
228
+ Agent-facing docs prioritize density and parsability over warmth.
229
+
230
+ **Structure:**
231
+ - Tables over prose for any comparison of 3+ items.
232
+ - Bullet points for sequential rules or lists of 3+ items.
233
+ - Code blocks for any naming example, pattern, or anti-pattern.
234
+ - No narrative introductions — lead with the rule.
235
+
236
+ **Vocabulary:**
237
+ - Use precise technical terms without definition: polysemy, morpheme, compound, register. The agent has loaded the skill.
238
+ - Name file paths absolutely (e.g., `src/lib/payment/processor.ts`), not "the payment processor".
239
+ - Reference the evidence: "Verified in `cardComponent.tsx` line 42" not "this is the pattern used".
240
+
241
+ ### Developer-Facing Register: Detailed Rules
242
+
243
+ Developer-facing content (code comments, ADRs, PR descriptions) lives closer to the code and prioritizes rationale.
244
+
245
+ **Code comments:**
246
+ - Explain *why*, not *what*. The code is the *what*. `// must use the tenant-scoped query — raw query() leaks across tenants (ABC-123)` not `// using tenant-scoped query here`.
247
+ - Flag non-obvious decisions: `// COALESCE prevents null overwrite on re-webhook — partner has a 30-day deletion window`.
248
+ - Link to the issue: `(ABC-123)` in comments that address a known bug or decision.
249
+
250
+ **PR descriptions:**
251
+ - Problem statement first: what was broken or missing.
252
+ - Solution: what changed and why this approach.
253
+ - Test protocol: how to verify the change is correct.
254
+ - Breaking changes: explicit callout if any contract changed.
255
+
256
+ ---
257
+
258
+ ## 4. Cross-Cultural Linguistic Awareness
259
+
260
+ Implementation details for currency formatting, date locale rules, and number systems belong to a separate i18n skill. This section covers only the *linguistic awareness* that shapes those decisions: different languages have fundamentally different number structures, grammatical gender, and script directions.
261
+
262
+ **Key linguistic facts that affect i18n decisions:**
263
+
264
+ - **Number structure differs by language.** English uses comma-grouping and period-decimal (`1,234.56`); many European locales reverse them (`1.234,56`). This is not a formatting preference — it changes how numbers are *read*. A developer writing number logic must know the linguistic reason for the locale parameter, not just its mechanical effect.
265
+ - **Currency symbols carry meaning beyond their value.** `$` signals USD to a US reader; `€` signals EUR. Bare numbers without currency symbols are linguistically incomplete — they transfer a quantity but not a unit. Always qualify with the currency code or symbol.
266
+ - **Grammatical gender affects pluralization.** English has no grammatical gender for numbers, but many languages do. A string like "1 order" vs "2 orders" is a morphological change; other languages require agreement with grammatical gender of the noun. Hardcoded plurals are always wrong.
267
+ - **Script direction is architectural.** Arabic, Hebrew, and Persian run right-to-left. This is not a CSS toggle — it reverses spatial reasoning (icons, progress bars, layout flow). Affects component architecture far upstream of any formatting call.
268
+ - **Operator-language vs audience-language axis.** When the maintainer's primary language differs from the target audience's, code identifiers and UI copy should follow the audience's language conventions, never the maintainer's. Personal notes can stay in the operator's language; anything an agent or another developer reads must be in the project's chosen lingua franca.
269
+
270
+ ### Operator-Language Code Mixing
271
+
272
+ When the maintainer is bilingual, all code-facing surfaces must be in the project's chosen language:
273
+
274
+ | Domain | Rule | Reason |
275
+ |--------|------|--------|
276
+ | Code identifiers | Project language only | Global readability; future contributors may not read the operator's native language |
277
+ | UI copy | Audience language only | The product speaks the audience's language |
278
+ | Internal docs (skill files, ADRs) | Project language only | Agent-readable docs must be in a single language |
279
+ | Commit messages | Project language only | Conventional-commit type/scope terms are typically English |
280
+ | Code comments | Project language only | Agents and developers across regions read these |
281
+ | Personal notes (private) | Operator's native language acceptable | Private communication between operator and operator-only tools |
282
+ | Business term references | Qualify if a non-project-language term is used | Proper nouns (carrier names, regulatory terms) are acceptable as borrowed words |
283
+
284
+ **Anti-pattern:** business concepts from the operator's native language slipping into code as abbreviations. If a word in the operator's language collides with a different meaning in the project language, the abbreviation is unsafe even when the operator finds it natural.
285
+
286
+ ---
287
+
288
+ ## 5. Error-Message Linguistics
289
+
290
+ Error messages are the most linguistically precise text in any software product. They arrive at the worst moment for the reader (something went wrong) and must deliver maximum information in minimum words.
291
+
292
+ ### The Three-Part Structure
293
+
294
+ Every error message must answer three questions in order:
295
+
296
+ 1. **What happened?** — Name the failure specifically. Not "an error occurred."
297
+ 2. **Why?** — Name the cause if known. Skip this if the cause is unknown — do not guess.
298
+ 3. **What to do next?** — Give one specific action. Not "contact support" as a first resort.
299
+
300
+ | Pattern | Example |
301
+ |---------|---------|
302
+ | What → Why → What to do | "Order sync paused — your API key expired. Open Settings → Integrations to reconnect." |
303
+ | What → What to do (cause unknown) | "Couldn't load your orders. Try refreshing. If this continues, check your storefront connection." |
304
+ | What (system message, no user action) | "Webhook received but could not be verified. The payload was rejected." |
305
+
306
+ ### Blame-Free Language
307
+
308
+ | Blame-assigning (wrong) | Blame-free (right) | Why |
309
+ |------------------------|---------------------|-----|
310
+ | "You entered the wrong API key." | "We couldn't verify your API key." | Passive construction removes blame; "verify" names the operation |
311
+ | "Invalid input." | "This field requires a number between 1 and 100." | Describe what's needed, not what was wrong |
312
+ | "You haven't connected the fulfillment partner yet." | "Connect your fulfillment partner to see your production cost." | Positive framing — lead with the outcome |
313
+ | "Your sync failed." | "Sync paused — we'll retry automatically in 5 minutes." | "Your sync failing" reads as the user's fault; "sync paused" is a system state |
314
+
315
+ **Rule:** never use "you" in a negative construction. "You haven't…", "You entered…", "Your connection failed…" all assign blame. Reframe to a system state or a missing action.
316
+
317
+ ### Specificity Rules
318
+
319
+ | Too vague | Specific | Why |
320
+ |-----------|----------|-----|
321
+ | "Something went wrong." | "Order sync failed — the API returned a 429 (rate limit). Retrying in 60 seconds." | Names the operation, the error code, and the recovery |
322
+ | "Error loading data." | "Couldn't load orders for the last 30 days. Your storefront connection may have expired." | Names the data type, time range, and probable cause |
323
+ | "Action failed." | "Couldn't archive order #1247 — it's currently in fulfillment." | Names the order, the operation, and the blocking state |
324
+
325
+ **Include the entity name** when the error involves a specific record, connection, or resource. `order #1247` beats "an order"; `your store "my-shop"` beats "your store".
326
+
327
+ ### Actionability
328
+
329
+ Every error that requires user action must end with a specific next step:
330
+
331
+ | Error type | Actionable ending |
332
+ |------------|-------------------|
333
+ | Connection expired | "Open Settings → Integrations to reconnect." |
334
+ | Missing source data | "Connect your fulfillment partner to see your production cost." |
335
+ | Sync paused | "We'll retry in 5 minutes. Or reconnect now in Settings → Integrations." |
336
+ | Rate limit hit | "We're retrying automatically. No action needed." |
337
+ | Unknown error | "Refresh the page, or check your connection in Settings." |
338
+
339
+ **Never end with a bare error.** If the error is purely informational (system log, agent message), mark it explicitly as informational so the reader knows no action is needed.
340
+
341
+ ---
342
+
343
+ ## 6. Anti-Patterns
344
+
345
+ | Anti-pattern | Example | Why it fails | Correct pattern |
346
+ |-------------|---------|--------------|-----------------|
347
+ | **Generic verb names** | `handleContinue()`, `handleRefresh()`, `handleExport()` in non-UI code | Carries too little semantic load once you leave the local UI context | Name the operation and its subject: `transformPaymentEvent()`, `validateWebhookPayload()` |
348
+ | **Unqualified polysemous terms** | `provider`, `shipping`, `cost`, `margin` in typed code | Ambiguous — requires context to resolve | Always compound with domain: `fulfillmentProvider`, `shippingCostCents`, `productionCostCents`, `marginPercent` |
349
+ | **Register mismatch** | "COGS null — display `—`" in an end-user tooltip | Agent register in an end-user context | "Cost data not yet available for this order." |
350
+ | **Blame-assigning errors** | "You haven't connected your storefront yet." | Assigns blame; creates friction | "Connect your storefront to start tracking revenue." |
351
+ | **Abbreviation overload** | `calcMgrSvcUtil()` | Three unrecognized abbreviations; zero parsability | `calculateManagedServiceUtilization()` (or rename the concept) |
352
+ | **False precision in i18n** | `$${(cents / 100).toFixed(2)}` | Hardcoded USD symbol, no locale, bypasses any shared formatter | Use the project's currency formatter or `Intl.NumberFormat(...)` |
353
+ | **Vague error messages** | "Error 500. Please try again." | Names neither the operation nor the cause | "Sync failed. We'll retry automatically — check Settings if this persists." |
354
+ | **Implicit null = zero** | Display `$0.00` when the cost field is null | Null means *unknown*; zero means *confirmed zero*. `$0.00` cost implies 100% margin | Display `—` or "Cost unknown" when null |
355
+ | **Utility file names** | `utils.ts`, `helpers.ts`, `misc.ts` | Non-names that aggregate unrelated functionality | Name by domain: `orderCalculations.ts`, `webhookValidation.ts`, `currencyFormatting.ts` |
356
+
357
+ ---
358
+
359
+ ## Verification
360
+
361
+ Before committing code, writing documentation, or shipping UI copy, run through this checklist.
362
+
363
+ ### Naming (Code)
364
+
365
+ ```text
366
+ LINGUISTICS NAMING CHECK
367
+ ========================
368
+ [ ] Every function is verb-first with a specific subject (not handle/do/process/get alone in non-UI code)
369
+ [ ] Every variable is noun-first with qualifiers for counts, booleans, and financial values
370
+ [ ] No unqualified polysemous terms in typed code: provider, shipping, cost, margin, sync, channel, source, status
371
+ [ ] Financial values end in Cents (or specify currency in the name) and are stored as integers
372
+ [ ] Abbreviations are universally understood or defined in the project glossary
373
+ [ ] File names describe what the file does, not which workflow it belongs to
374
+ [ ] No utils.ts, helpers.ts, misc.ts — name by domain
375
+ ```
376
+
377
+ ### Language (UI Copy and Error Messages)
378
+
379
+ ```text
380
+ LINGUISTICS COPY CHECK
381
+ ======================
382
+ [ ] Error messages follow What → Why → What to do structure
383
+ [ ] No blame-assigning language ("you entered", "you haven't", "your error")
384
+ [ ] Specific entity names included when a specific record/connection is involved
385
+ [ ] Every error that requires action has a specific next step
386
+ [ ] Register matches the audience (end-user: warm + plain; agent: dense + precise; developer: rationale-focused)
387
+ [ ] No agent-register terms in end-user copy (canonical, reconciliation, backfill, orchestration)
388
+ [ ] Financial terms match the project glossary definitions
389
+ ```
390
+
391
+ ### Internationalization
392
+
393
+ ```text
394
+ LINGUISTICS I18N CHECK
395
+ ======================
396
+ [ ] All code identifiers are in the project's chosen language
397
+ [ ] No business concepts from the operator's native language slipping into code abbreviations
398
+ [ ] UI copy targets the audience's language and conventions, not the operator's
399
+ [ ] Null financial values display as — or "unknown", never as $0.00 (null ≠ zero)
400
+ [ ] Currency symbol or code is always present — bare numbers without units are linguistically incomplete
401
+ [ ] Implementation details (Intl.NumberFormat, date locale, plural handling) are deferred to the i18n skill
402
+ ```
403
+
404
+ ---
405
+
406
+ ## Do NOT Use When
407
+
408
+ | Instead, use | Why |
409
+ |---|---|
410
+ | `naming-conventions` | Deciding the casing format for an artifact kind (kebab vs camel vs snake). naming-conventions owns the convention; linguistics owns the linguistic basis (morphology, polysemy, register). |
411
+ | `documentation` | Choosing a doc type, structuring a doc, or applying progressive disclosure. documentation owns doc architecture; linguistics owns the prose-form rules inside docs. |
412
+ | `refactor` | Renaming a thing across many call sites or restructuring code without behavior change. refactor owns the rename mechanics; linguistics owns the linguistic decision of what the new name should be. |
413
+ | `code-review` | Judging a specific PR or change for correctness, security, or quality. code-review uses linguistic feedback as one input; it does not own the linguistic rules. |
414
+ | (a glossary skill) | Defining the canonical meaning of a domain term. A glossary owns the *definition*; linguistics owns the *consistent application* of definitions in names and copy. |
415
+ | (a copywriting skill) | Drafting product messaging, marketing copy, or final user-facing CTA text. Copywriting owns the messaging; linguistics owns the structural form rules under that messaging. |
416
+ | (an i18n skill) | Implementing locale-aware formatting (`Intl.NumberFormat`, date pickers, ICU plurals). i18n owns the implementation; linguistics owns the linguistic awareness behind it. |
417
+
418
+ ## Key Sources
419
+
420
+ - Saussure, F. de (1916). *Cours de linguistique générale* / *Course in General Linguistics*. Payot. The foundational distinction between *signifier* and *signified*, and the principle that meaning lives in systems of contrast. The theoretical basis for treating identifier names as contracts.
421
+ - Lyons, J. (1977). *Semantics* (2 vols.). Cambridge University Press. The canonical structural-semantics textbook; polysemy, synonymy, hyponymy, and the framework for analyzing word meaning systematically.
422
+ - Cruse, D. A. (1986). *Lexical Semantics*. Cambridge University Press. Detailed treatment of word-level meaning relationships; the reference for understanding how polysemy works and how it can be resolved by qualification.
423
+ - Halliday, M. A. K., & Matthiessen, C. M. I. M. (2014). *An Introduction to Functional Grammar* (4th ed.). Routledge. Systemic-functional grammar: language as meaning-making organized by *field*, *tenor*, and *mode*. The theoretical foundation for register selection by audience.
424
+ - Grice, H. P. (1975). "Logic and Conversation." In *Syntax and Semantics, Vol. 3: Speech Acts*. Academic Press. The cooperative principle and the four maxims (quantity, quality, relation, manner); applied directly in error-message writing.
425
+ - Searle, J. R. (1969). *Speech Acts: An Essay in the Philosophy of Language*. Cambridge University Press. Speech-act theory: what utterances *do*. Foundational for distinguishing reporting from accusing in error wording.
426
+ - Austin, J. L. (1962). *How to Do Things with Words*. Oxford University Press. The original statement of performative utterances and locutionary/illocutionary/perlocutionary acts.
427
+ - Williams, J. M., & Bizup, J. (2017). *Style: Lessons in Clarity and Grace* (12th ed.). Pearson. The leading modern style guide grounded in cognitive-linguistic principles; the practical descendant of structural linguistics for technical and public-facing prose.
428
+ - Nielsen Norman Group. ["Error Message Guidelines"](https://www.nngroup.com/articles/error-message-guidelines/). Empirical UX-research statement of the what/why/what-to-do error structure and the blame-free framing rule.
429
+ - W3C. [Web Content Accessibility Guidelines (WCAG) 2.2](https://www.w3.org/TR/WCAG22/) — Understandable principle. Linguistic accessibility requirements (reading level, plain language, unambiguous error identification) at the international-standards level.
@@ -0,0 +1,76 @@
1
+ ---
2
+ name: lint-overlay
3
+ description: "Use when adding or enforcing lint rules as part of a test or verification plan. Extends testing-strategy with lint-specific guidance: rule selection, gate placement, failure triage, and migration planning when introducing rules to an existing codebase. Do NOT use standalone — load the base testing-strategy skill alongside it — and do NOT use for chasing a specific lint failure in one file (that is debugging)."
4
+ license: MIT
5
+ compatibility: "Markdown, Git, any codebase with a lint tool"
6
+ allowed-tools: Read Grep Bash
7
+ metadata:
8
+ metadata: "{\"schema_version\":6,\"version\":\"1.0.0\",\"type\":\"overlay\",\"category\":\"quality\",\"scope\":\"portable\",\"owner\":\"skill-graph-maintainer\",\"freshness\":\"2026-04-18\",\"drift_check\":\"{\\\\\\\"last_verified\\\\\\\":\\\\\\\"2026-05-13\\\\\\\",\\\\\\\"truth_source_hashes\\\\\\\":{\\\\\\\"scripts/skill-lint.js\\\\\\\":\\\\\\\"3a78f75f8921542b91dc619cd41bde29bf379de3c16bdcf3653c854ecbe9fa29\\\\\\\",\\\\\\\"scripts/lint/check-routing-quality.js\\\\\\\":\\\\\\\"b57d10f4c7c4e42a1a86c2741cbac6708e2de7dedb51b13f707283fbf91e32b5\\\\\\\",\\\\\\\"scripts/lint/check-routing-eval.js\\\\\\\":\\\\\\\"ab541922dfcbfb2cd7740c4abebb892e8b26477643e9d802fd0ea4cfbc8de649\\\\\\\",\\\\\\\"examples/evals/lint-overlay.json\\\\\\\":\\\\\\\"d60dcd4512904f36e56702d5338295dbf1238448b988dc60225fdd77285eaff9\\\\\\\",\\\\\\\"skills/testing-strategy/SKILL.md\\\\\\\":\\\\\\\"9c5da135ab8834843367da9e9120c92b57e81d1680ef84a0ea9e32f362e1456e\\\\\\\"}}\",\"eval_artifacts\":\"present\",\"eval_state\":\"passing\",\"routing_eval\":\"present\",\"stability\":\"experimental\",\"extends\":\"testing-strategy\",\"keywords\":\"[\\\\\\\"lint\\\\\\\",\\\\\\\"linting\\\\\\\",\\\\\\\"lint rules\\\\\\\",\\\\\\\"lint integration\\\\\\\",\\\\\\\"static analysis\\\\\\\",\\\\\\\"eslint\\\\\\\",\\\\\\\"format check\\\\\\\",\\\\\\\"add eslint rule\\\\\\\",\\\\\\\"lint is failing\\\\\\\",\\\\\\\"add lint check\\\\\\\",\\\\\\\"rule migration\\\\\\\",\\\\\\\"lint gate\\\\\\\",\\\\\\\"migrate legacy\\\\\\\",\\\\\\\"migrate lint\\\\\\\",\\\\\\\"phased migration\\\\\\\",\\\\\\\"phased gates\\\\\\\",\\\\\\\"legacy violations\\\\\\\",\\\\\\\"legacy lint violations\\\\\\\",\\\\\\\"noimplicitany\\\\\\\",\\\\\\\"pre-commit vs ci\\\\\\\",\\\\\\\"pre-commit gate\\\\\\\",\\\\\\\"ci gate\\\\\\\",\\\\\\\"introduce lint rule\\\\\\\",\\\\\\\"rule pre-commit\\\\\\\",\\\\\\\"rule runs pre-commit\\\\\\\"]\",\"triggers\":\"[\\\\\\\"lint-overlay\\\\\\\"]\",\"examples\":\"[\\\\\\\"plan ESLint rule introduction for a monorepo that has never had linting\\\\\\\",\\\\\\\"which lint rules should block CI and which should warn-only for now?\\\\\\\",\\\\\\\"migrate these legacy noImplicitAny violations in phased gates\\\\\\\",\\\\\\\"decide whether this new rule runs pre-commit or in CI only\\\\\\\"]\",\"anti_examples\":\"[\\\\\\\"this specific ESLint error is blocking my commit — why?\\\\\\\",\\\\\\\"decide whether to unit-test or integration-test this handler\\\\\\\",\\\\\\\"extract this repeated code pattern into a shared util\\\\\\\"]\",\"relations\":\"{\\\\\\\"boundary\\\\\\\":[{\\\\\\\"skill\\\\\\\":\\\\\\\"debugging\\\\\\\",\\\\\\\"reason\\\\\\\":\\\\\\\"debugging fixes a specific failing lint result; lint-overlay plans rule selection and gate placement\\\\\\\"},{\\\\\\\"skill\\\\\\\":\\\\\\\"refactor\\\\\\\",\\\\\\\"reason\\\\\\\":\\\\\\\"refactor changes behavior-preserving code shape; lint-overlay is verification-plan authoring, not code modification\\\\\\\"},{\\\\\\\"skill\\\\\\\":\\\\\\\"testing-strategy\\\\\\\",\\\\\\\"reason\\\\\\\":\\\\\\\"base testing-strategy owns unit-vs-integration scope selection; lint-overlay extends it only for lint-specific gate placement\\\\\\\"}]}\",\"grounding\":\"{\\\\\\\"domain_object\\\\\\\":\\\\\\\"Lint-specific verification planning in the Skill Graph starter library\\\\\\\",\\\\\\\"grounding_mode\\\\\\\":\\\\\\\"hybrid\\\\\\\",\\\\\\\"truth_sources\\\\\\\":[\\\\\\\"scripts/skill-lint.js\\\\\\\",\\\\\\\"scripts/lint/check-routing-quality.js\\\\\\\",\\\\\\\"scripts/lint/check-routing-eval.js\\\\\\\",\\\\\\\"examples/evals/lint-overlay.json\\\\\\\",\\\\\\\"skills/testing-strategy/SKILL.md\\\\\\\"],\\\\\\\"failure_modes\\\\\\\":[\\\\\\\"lint_failure_triaged_as_strategy_problem\\\\\\\",\\\\\\\"overlay_loaded_without_base_testing_strategy\\\\\\\",\\\\\\\"rule_migration_lacks_gate_placement\\\\\\\",\\\\\\\"routing_eval_claim_not_backed_by_harness\\\\\\\"],\\\\\\\"evidence_priority\\\\\\\":\\\\\\\"repo_code_first\\\\\\\"}\",\"portability\":\"{\\\\\\\"readiness\\\\\\\":\\\\\\\"scripted\\\\\\\",\\\\\\\"targets\\\\\\\":[\\\\\\\"skill-md\\\\\\\"]}\",\"skill_graph_source_repo\":\"https://github.com/jacob-balslev/skill-graph\",\"skill_graph_protocol\":\"Skill Metadata Protocol v5\",\"skill_graph_project\":\"Skill Graph\",\"skill_graph_canonical_skill\":\"skills/lint-overlay/SKILL.md\"}"
9
+ skill_graph_source_repo: "https://github.com/jacob-balslev/skill-graph"
10
+ skill_graph_protocol: Skill Metadata Protocol v4
11
+ skill_graph_project: Skill Graph
12
+ skill_graph_canonical_skill: skills/lint-overlay/SKILL.md
13
+ ---
14
+
15
+ # Lint Overlay
16
+
17
+ ## Extends
18
+
19
+ This overlay extends `testing-strategy`. Load both skills whenever lint is part of a verification plan — this overlay alone is under-specified because it relies on the base skill's effort-to-risk framework for deciding which rules to enforce at all.
20
+
21
+ **What this overlay adds on top of `testing-strategy`:**
22
+
23
+ | Concern | `testing-strategy` (base) | `lint-overlay` (this skill) |
24
+ |---|---|---|
25
+ | What to verify | Behavior under real input | Static properties of the source, independent of input |
26
+ | When to run | At the scope dictated by risk | Before unit tests, on changed files only (unless a global rule is at risk) |
27
+ | Failure meaning | A regression in shipped behavior | A rule violation — block the merge, do not debug it in situ |
28
+ | Migration pattern | Write tests for existing behavior once | Introduce rules by pinning pre-change green state; fail only on new violations |
29
+
30
+ **What this overlay does NOT override from the base:**
31
+
32
+ - Effort-to-risk matching (base decides *whether* to lint before this decides *how*)
33
+ - Evidence quality (lint output is evidence; the same "concrete, reproducible" rule applies)
34
+ - Failure-case coverage (lint catches only the cases its rules know about; behavior tests still cover the rest)
35
+
36
+ ## Coverage
37
+
38
+ - Lint as verification: when a lint step belongs in a test plan and when it is out of scope
39
+ - Rule selection: choosing which lint rules to enforce based on the risk profile of the change
40
+ - Lint-gate placement: where lint fits in the verification sequence relative to unit and integration tests
41
+ - Failure triage: separating lint failures caused by the current change from pre-existing rule violations
42
+ - Overlay discipline: what this skill adds on top of testing-strategy and what it intentionally leaves to the base
43
+
44
+ ## Philosophy
45
+
46
+ Lint is a verification signal, not a style opinion. A lint rule exists because a pattern has a measurable cost — a bug class, a readability drop, a maintenance drag — and the rule's job is to surface that cost early enough to fix it cheaply. Rules without that grounding are style preferences dressed up as gates, and style preferences should not block merges.
47
+
48
+ Three principles follow from that stance:
49
+
50
+ - **Enforce only rules that were green before the change.** A new rule that fails 200 pre-existing files on its first run is not a test — it is a scope change. Pin the pre-change green state, fail only on *new* violations, and plan the cleanup as a separate migration track.
51
+ - **Lint failures are test failures, not advisory warnings.** A rule that does not block the merge does not change behavior; it just adds noise to the log. Either the rule is worth a block or it is not a rule yet. "Warn-only" is a deployment mode for a migration window, not a permanent posture.
52
+ - **Lint scope matches test scope.** Run lint on the files the change touches, not on the entire tree. The exception is a rule whose correctness is global (e.g., a no-circular-imports check that a local diff cannot detect) — those run tree-wide, deliberately, and their cost is acknowledged.
53
+
54
+ ## Overlay Rules
55
+
56
+ These rules augment (not replace) the testing-strategy base skill.
57
+
58
+ | Rule | When it applies | Why |
59
+ |---|---|---|
60
+ | Lint runs after unit tests, before integration tests | When the change touches logic and style | Lint fails are cheap to fix; catching them before integration saves context |
61
+ | Only enforce rules that were green before the change | When introducing lint to an existing codebase | Fail on regressions, not on pre-existing violations |
62
+ | Lint scope matches the test scope | When the diff is bounded to specific files | Run lint only on changed files unless a global rule is at risk |
63
+ | Lint failures are blocking, not advisory | When lint is part of the official CI gate | A lint failure is a test failure; treat it the same way |
64
+ | New lint rules require a migration plan | When adding a rule that affects many existing files | Adding a rule that immediately fails 200 files is not a test — it is a scope change |
65
+
66
+ ## Evals
67
+
68
+ This skill ships a comprehension-eval artifact at [`examples/evals/lint-overlay.json`](https://github.com/jacob-balslev/skill-graph/blob/main/examples/evals/lint-overlay.json). Because this is an overlay, the eval prompts specifically test what the overlay adds on top of `testing-strategy` and what it deliberately leaves to the base. The eval file is how this skill is graded by `scripts/skill-audit.js --graded`.
69
+
70
+ ## Do NOT Use When
71
+
72
+ | Use instead | When |
73
+ |---|---|
74
+ | `testing-strategy` alone | Lint is not in scope for this change — load only the base skill |
75
+ | `debugging` | The task is chasing a specific lint failure in one file, not planning lint-gate strategy |
76
+ | `refactor` | The task is fixing accumulated lint debt as structural cleanup — refactor covers behavior preservation during the cleanup |