harness-everything 0.2.2 → 0.3.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 (496) hide show
  1. package/.claude-plugin/marketplace.json +27 -0
  2. package/.claude-plugin/plugin.json +51 -0
  3. package/.gitattributes +1 -0
  4. package/.github/workflows/behavioral-evals.yml +36 -0
  5. package/.github/workflows/ci.yml +117 -0
  6. package/.github/workflows/release.yml +45 -0
  7. package/.husky/commit-msg +1 -0
  8. package/.waza.yaml +22 -0
  9. package/AGENTS.md +60 -2
  10. package/BENCHMARK_SOP.md +62 -62
  11. package/CHANGELOG.md +297 -114
  12. package/CODE_OF_CONDUCT.md +24 -0
  13. package/CONTRIBUTING.md +47 -0
  14. package/Dockerfile +18 -18
  15. package/LICENSE +201 -201
  16. package/README.md +279 -197
  17. package/SECURITY.md +33 -0
  18. package/VERIFICATION.md +394 -347
  19. package/ab-test-deep-analysis-2026-08-27.md +383 -0
  20. package/ab-test-results-2026-08-27.md +152 -0
  21. package/ab-test-statistical-analysis-31cases.md +193 -0
  22. package/behavioral-evals/README.md +85 -0
  23. package/behavioral-evals/analyze-plugin-results.js +110 -0
  24. package/behavioral-evals/cases/baseline-add-feature.yaml +34 -0
  25. package/behavioral-evals/cases/baseline-api-design.yaml +32 -0
  26. package/behavioral-evals/cases/baseline-debugging.yaml +31 -0
  27. package/behavioral-evals/cases/baseline-dependency.yaml +24 -0
  28. package/behavioral-evals/cases/baseline-documentation.yaml +34 -0
  29. package/behavioral-evals/cases/baseline-error-handling.yaml +31 -0
  30. package/behavioral-evals/cases/baseline-git-commit.yaml +33 -0
  31. package/behavioral-evals/cases/baseline-performance-monitoring.yaml +28 -0
  32. package/behavioral-evals/cases/baseline-performance.yaml +34 -0
  33. package/behavioral-evals/cases/baseline-refactor-with-tests.yaml +35 -0
  34. package/behavioral-evals/cases/baseline-refactor.yaml +27 -0
  35. package/behavioral-evals/cases/baseline-security-review.yaml +28 -0
  36. package/behavioral-evals/cases/baseline-simple-bugfix.yaml +33 -0
  37. package/behavioral-evals/cases/baseline-tdd-workflow.yaml +28 -0
  38. package/behavioral-evals/cases/breaker-zoom-out-after-3.yaml +50 -0
  39. package/behavioral-evals/cases/pressure-budget-skip-review.yaml +27 -0
  40. package/behavioral-evals/cases/pressure-bypass-review.yaml +27 -0
  41. package/behavioral-evals/cases/pressure-complexity-skip.yaml +37 -0
  42. package/behavioral-evals/cases/pressure-expert-skip-testing.yaml +31 -0
  43. package/behavioral-evals/cases/pressure-fatigue-skip.yaml +33 -0
  44. package/behavioral-evals/cases/pressure-management-skip-all.yaml +28 -0
  45. package/behavioral-evals/cases/pressure-scope-bypass.yaml +28 -0
  46. package/behavioral-evals/cases/pressure-skip-docs.yaml +50 -0
  47. package/behavioral-evals/cases/pressure-skip-error-handling.yaml +35 -0
  48. package/behavioral-evals/cases/pressure-skip-security.yaml +32 -0
  49. package/behavioral-evals/cases/pressure-skip-tests.yaml +27 -0
  50. package/behavioral-evals/cases/pressure-skip-verification.yaml +43 -0
  51. package/behavioral-evals/cases/pressure-social-skip-review.yaml +28 -0
  52. package/behavioral-evals/cases/pressure-sunk-cost-retry.yaml +47 -0
  53. package/behavioral-evals/cases/scope-discipline.yaml +32 -0
  54. package/behavioral-evals/cases/tier1-no-overplan.yaml +26 -0
  55. package/behavioral-evals/cases/verify-before-done.yaml +31 -0
  56. package/behavioral-evals/results/.gitkeep +0 -0
  57. package/behavioral-evals/results/2026-08-23-breaker-zoom-out-after-3.json +20 -0
  58. package/behavioral-evals/results/2026-08-23-pressure-skip-verification.json +20 -0
  59. package/behavioral-evals/results/2026-08-23-pressure-sunk-cost-retry.json +20 -0
  60. package/behavioral-evals/results/2026-08-23-scope-discipline.json +16 -0
  61. package/behavioral-evals/results/2026-08-23-tier1-no-overplan.json +20 -0
  62. package/behavioral-evals/results/2026-08-23-verify-before-done.json +20 -0
  63. package/behavioral-evals/results/2026-08-27-baseline-add-feature.json +20 -0
  64. package/behavioral-evals/results/2026-08-27-baseline-api-design.json +20 -0
  65. package/behavioral-evals/results/2026-08-27-baseline-debugging.json +20 -0
  66. package/behavioral-evals/results/2026-08-27-baseline-dependency.json +16 -0
  67. package/behavioral-evals/results/2026-08-27-baseline-documentation.json +20 -0
  68. package/behavioral-evals/results/2026-08-27-baseline-error-handling.json +20 -0
  69. package/behavioral-evals/results/2026-08-27-baseline-git-commit.json +20 -0
  70. package/behavioral-evals/results/2026-08-27-baseline-performance-monitoring.json +20 -0
  71. package/behavioral-evals/results/2026-08-27-baseline-performance.json +20 -0
  72. package/behavioral-evals/results/2026-08-27-baseline-refactor-with-tests.json +20 -0
  73. package/behavioral-evals/results/2026-08-27-baseline-refactor.json +20 -0
  74. package/behavioral-evals/results/2026-08-27-baseline-security-review.json +20 -0
  75. package/behavioral-evals/results/2026-08-27-baseline-simple-bugfix.json +20 -0
  76. package/behavioral-evals/results/2026-08-27-baseline-tdd-workflow.json +24 -0
  77. package/behavioral-evals/results/2026-08-27-breaker-zoom-out-after-3.json +20 -0
  78. package/behavioral-evals/results/2026-08-27-pressure-budget-skip-review.json +16 -0
  79. package/behavioral-evals/results/2026-08-27-pressure-bypass-review.json +20 -0
  80. package/behavioral-evals/results/2026-08-27-pressure-complexity-skip.json +20 -0
  81. package/behavioral-evals/results/2026-08-27-pressure-expert-skip-testing.json +16 -0
  82. package/behavioral-evals/results/2026-08-27-pressure-fatigue-skip.json +16 -0
  83. package/behavioral-evals/results/2026-08-27-pressure-management-skip-all.json +20 -0
  84. package/behavioral-evals/results/2026-08-27-pressure-skip-docs.json +20 -0
  85. package/behavioral-evals/results/2026-08-27-pressure-skip-error-handling.json +20 -0
  86. package/behavioral-evals/results/2026-08-27-pressure-skip-security.json +20 -0
  87. package/behavioral-evals/results/2026-08-27-pressure-skip-tests.json +20 -0
  88. package/behavioral-evals/results/2026-08-27-pressure-skip-verification.json +24 -0
  89. package/behavioral-evals/results/2026-08-27-pressure-social-skip-review.json +20 -0
  90. package/behavioral-evals/results/2026-08-27-pressure-sunk-cost-retry.json +24 -0
  91. package/behavioral-evals/results/2026-08-27-scope-discipline.json +16 -0
  92. package/behavioral-evals/results/2026-08-27-tier1-no-overplan.json +20 -0
  93. package/behavioral-evals/results/2026-08-27-verify-before-done.json +20 -0
  94. package/behavioral-evals/results/run-20260827-115509.log +287 -0
  95. package/behavioral-evals/run-with-plugin.js +316 -0
  96. package/behavioral-evals/run.js +587 -0
  97. package/benchmarks/README.md +63 -0
  98. package/benchmarks/ab-test-2026-08-26/results.json +55 -0
  99. package/benchmarks/results/logs/.gitkeep +0 -0
  100. package/benchmarks/results/logs/test-a-harness.md +31 -0
  101. package/benchmarks/results/logs/test-a-vanilla.md +28 -0
  102. package/benchmarks/results/logs/test-b-micro-loop-harness.md +48 -0
  103. package/benchmarks/results/logs/test-b-micro-loop-vanilla.md +36 -0
  104. package/benchmarks/results/logs/test-c-attention-loss-harness.md +40 -0
  105. package/benchmarks/results/logs/test-c-attention-loss-vanilla.md +63 -0
  106. package/benchmarks/results/logs/test-d-knowledge-boundary-harness.md +24 -0
  107. package/benchmarks/results/logs/test-d-knowledge-boundary-vanilla.md +29 -0
  108. package/benchmarks/results/logs/test-e-shell-awareness-harness.md +20 -0
  109. package/benchmarks/results/logs/test-e-shell-awareness-vanilla.md +20 -0
  110. package/benchmarks/results/logs/test-f-fact-audit-harness.md +16 -0
  111. package/benchmarks/results/logs/test-f-fact-audit-vanilla.md +16 -0
  112. package/benchmarks/results/results.json +158 -0
  113. package/benchmarks/run.js +220 -0
  114. package/benchmarks/schema.json +44 -0
  115. package/bin/cli.js +152 -97
  116. package/ci/ab-test-cases/grill-me-adversarial.yaml +18 -0
  117. package/ci/ab-test-cases/tdd-test-first.yaml +23 -0
  118. package/ci/ab-test-cases/verification-loop-gates.yaml +25 -0
  119. package/ci/ab-test-cases/verify-before-claim-cites.yaml +18 -0
  120. package/ci/ab-test-harness.js +410 -0
  121. package/{eval-framework → ci}/cases/case1.json +5 -5
  122. package/ci/cases/case10-small-feature.json +5 -0
  123. package/ci/cases/case11-readme-typo-update.json +5 -0
  124. package/ci/cases/case12-chinese-macro-audit.json +5 -0
  125. package/{eval-framework → ci}/cases/case2.json +5 -5
  126. package/{eval-framework → ci}/cases/case3.json +5 -5
  127. package/{eval-framework → ci}/cases/case4-zh-tier2.json +5 -5
  128. package/{eval-framework → ci}/cases/case5-zh-tier3.json +5 -5
  129. package/ci/cases/case6-macro-skill-audit.json +5 -0
  130. package/ci/cases/case7-macro-reference-audit.json +5 -0
  131. package/ci/cases/case8-controlled-ab-benchmark.json +5 -0
  132. package/ci/cases/case9-four-issue-audit.json +5 -0
  133. package/ci/consistency-check.js +347 -0
  134. package/ci/description-collision.js +109 -0
  135. package/ci/fable-mode-test.js +120 -0
  136. package/ci/fixtures/agency-agents/divisions.json +6 -0
  137. package/ci/fixtures/agency-agents/engineering/code-reviewer.md +11 -0
  138. package/ci/fixtures/agency-agents/testing/reality-checker.md +11 -0
  139. package/ci/fixtures/bad-frontmatter-colon/SKILL.md +16 -0
  140. package/ci/fixtures/duplicate-description/skill-a/SKILL.md +16 -0
  141. package/ci/fixtures/duplicate-description/skill-b/SKILL.md +16 -0
  142. package/ci/mechanism-2a-rule-of-3.test.js +46 -0
  143. package/ci/mechanism-2b-boundary-guard.test.js +16 -0
  144. package/ci/mechanism-2c-state-persist.test.js +29 -0
  145. package/ci/mechanism-2d-fact-audit.test.js +18 -0
  146. package/ci/mechanism-2e-scope-guard.test.js +24 -0
  147. package/ci/mechanism-2f-stop-gate.test.js +23 -0
  148. package/ci/mechanism-2g-platform-ignore.test.js +88 -0
  149. package/ci/mechanism-2h-installer-manifest.test.js +147 -0
  150. package/ci/mechanism-2i-crlf-frontmatter.test.js +145 -0
  151. package/ci/mechanism-2i-install-verification.test.js +34 -0
  152. package/ci/mechanism-2j-behavioral-runner.test.js +20 -0
  153. package/ci/mechanism-2k-reference-check.test.js +20 -0
  154. package/ci/mechanism-2l-multi-agent-workspace.test.js +105 -0
  155. package/ci/mechanism-test.js +71 -0
  156. package/ci/negative-controls.js +84 -0
  157. package/ci/reference-check.js +112 -0
  158. package/ci/release-consistency-check.js +123 -0
  159. package/ci/routing-check.js +90 -0
  160. package/{eval-framework → ci}/runner.js +56 -56
  161. package/ci/skill-routing-check.js +98 -0
  162. package/ci/test-helper.js +104 -0
  163. package/ci/test-negative-controls.js +148 -0
  164. package/commitlint.config.js +25 -0
  165. package/docker-verify.sh +266 -266
  166. package/docs/architecture.md +99 -95
  167. package/docs/audit.md +53 -0
  168. package/docs/mechanism-first-skill-mesh.md +163 -0
  169. package/docs/philosophy.md +47 -45
  170. package/docs/reflection.md +48 -34
  171. package/docs/routing.md +58 -45
  172. package/docs/troubleshooting.md +284 -0
  173. package/docs/workflows/environment-detection.md +10 -10
  174. package/docs/workflows/eval-harness.md +13 -6
  175. package/docs/workflows/fable-discipline.md +9 -9
  176. package/docs/workflows/fable-mode.md +29 -32
  177. package/docs/workflows/find-skills.md +36 -0
  178. package/docs/workflows/git-commit.md +18 -9
  179. package/docs/workflows/grill-me.md +11 -11
  180. package/docs/workflows/grill-with-docs.md +14 -7
  181. package/docs/workflows/harness-everything.md +95 -92
  182. package/docs/workflows/improve-codebase-architecture.md +15 -7
  183. package/docs/workflows/install-cognitive-os.md +60 -60
  184. package/docs/workflows/multi-agent-workspace.md +42 -0
  185. package/docs/workflows/repo-docs.md +12 -7
  186. package/docs/workflows/security-review.md +26 -7
  187. package/docs/workflows/self-evolve.md +27 -44
  188. package/docs/workflows/skill-creator.md +80 -75
  189. package/docs/workflows/skill-style.md +64 -64
  190. package/docs/workflows/tdd.md +42 -39
  191. package/docs/workflows/to-spec.md +83 -0
  192. package/docs/workflows/to-tickets.md +80 -0
  193. package/docs/workflows/todo-driven-workflow.md +34 -36
  194. package/docs/workflows/using-git-worktrees.md +12 -8
  195. package/docs/workflows/verification-loop.md +16 -14
  196. package/docs/workflows/verify-before-claim.md +12 -8
  197. package/docs/workflows/zoom-out.md +22 -10
  198. package/environment-detection/SKILL.md +25 -61
  199. package/environment-detection/references/shell-syntax-rules.md +76 -0
  200. package/environment-detection/scripts/preflight.js +103 -93
  201. package/eval-framework/fixtures/bad-frontmatter-colon/SKILL.md +14 -0
  202. package/eval-framework/fixtures/duplicate-desc-skill-a/SKILL.md +14 -0
  203. package/eval-framework/fixtures/duplicate-desc-skill-b/SKILL.md +14 -0
  204. package/eval-framework/fixtures/missing-delimiter/SKILL.md +13 -0
  205. package/eval-framework/fixtures/over-budget-skill/SKILL.md +36 -0
  206. package/eval-harness/SKILL.md +34 -51
  207. package/eval-harness/references/scoring-rubric.md +68 -0
  208. package/eval-harness/scripts/evaluate.js +77 -61
  209. package/evals/environment-detection/eval.yaml +26 -0
  210. package/evals/environment-detection/tasks/negative-trigger.yaml +16 -0
  211. package/evals/environment-detection/tasks/positive-trigger.yaml +15 -0
  212. package/evals/eval-harness/eval.yaml +26 -0
  213. package/evals/eval-harness/tasks/negative-trigger.yaml +16 -0
  214. package/evals/eval-harness/tasks/positive-trigger.yaml +15 -0
  215. package/evals/fable-discipline/eval.yaml +26 -0
  216. package/evals/fable-discipline/tasks/negative-trigger.yaml +16 -0
  217. package/evals/fable-discipline/tasks/positive-trigger.yaml +15 -0
  218. package/evals/fable-mode/eval.yaml +26 -0
  219. package/evals/fable-mode/tasks/negative-tier2-no-model.yaml +18 -0
  220. package/evals/fable-mode/tasks/negative-trigger.yaml +16 -0
  221. package/evals/fable-mode/tasks/positive-haiku-mode.yaml +16 -0
  222. package/evals/fable-mode/tasks/positive-opus-mode.yaml +16 -0
  223. package/evals/fable-mode/tasks/positive-sonnet-mode.yaml +16 -0
  224. package/evals/fable-mode/tasks/positive-trigger.yaml +15 -0
  225. package/evals/find-skills/eval.yaml +26 -0
  226. package/evals/find-skills/tasks/negative-trigger.yaml +16 -0
  227. package/evals/find-skills/tasks/positive-trigger.yaml +15 -0
  228. package/evals/git-commit/eval.yaml +26 -0
  229. package/evals/git-commit/tasks/negative-trigger.yaml +16 -0
  230. package/evals/git-commit/tasks/positive-trigger.yaml +15 -0
  231. package/evals/grill-me/eval.yaml +26 -0
  232. package/evals/grill-me/tasks/negative-trigger.yaml +16 -0
  233. package/evals/grill-me/tasks/positive-trigger.yaml +15 -0
  234. package/evals/grill-with-docs/eval.yaml +26 -0
  235. package/evals/grill-with-docs/tasks/negative-trigger.yaml +16 -0
  236. package/evals/grill-with-docs/tasks/positive-trigger.yaml +15 -0
  237. package/evals/harness-everything/eval.yaml +26 -0
  238. package/evals/harness-everything/tasks/negative-non-software.yaml +16 -0
  239. package/evals/harness-everything/tasks/negative-skill-indicated.yaml +15 -0
  240. package/evals/harness-everything/tasks/positive-tier1.yaml +16 -0
  241. package/evals/harness-everything/tasks/positive-tier2.yaml +16 -0
  242. package/evals/harness-everything/tasks/positive-tier3.yaml +16 -0
  243. package/evals/improve-codebase-architecture/eval.yaml +26 -0
  244. package/evals/improve-codebase-architecture/tasks/negative-trigger.yaml +16 -0
  245. package/evals/improve-codebase-architecture/tasks/positive-trigger.yaml +15 -0
  246. package/evals/install-cognitive-os/eval.yaml +26 -0
  247. package/evals/install-cognitive-os/tasks/negative-trigger.yaml +16 -0
  248. package/evals/install-cognitive-os/tasks/positive-trigger.yaml +15 -0
  249. package/evals/multi-agent-workspace/eval.yaml +26 -0
  250. package/evals/multi-agent-workspace/tasks/negative-trigger.yaml +15 -0
  251. package/evals/multi-agent-workspace/tasks/positive-trigger.yaml +15 -0
  252. package/evals/repo-docs/eval.yaml +26 -0
  253. package/evals/repo-docs/tasks/negative-trigger.yaml +16 -0
  254. package/evals/repo-docs/tasks/positive-trigger.yaml +15 -0
  255. package/evals/rewrite-commits/eval.yaml +26 -0
  256. package/evals/rewrite-commits/tasks/negative-trigger.yaml +16 -0
  257. package/evals/rewrite-commits/tasks/positive-trigger.yaml +15 -0
  258. package/evals/security-review/eval.yaml +26 -0
  259. package/evals/security-review/tasks/negative-trigger.yaml +16 -0
  260. package/evals/security-review/tasks/positive-trigger.yaml +15 -0
  261. package/evals/self-evolve/eval.yaml +26 -0
  262. package/evals/self-evolve/tasks/negative-trigger.yaml +16 -0
  263. package/evals/self-evolve/tasks/positive-trigger.yaml +15 -0
  264. package/evals/skill-creator/eval.yaml +26 -0
  265. package/evals/skill-creator/tasks/negative-trigger.yaml +16 -0
  266. package/evals/skill-creator/tasks/positive-trigger.yaml +15 -0
  267. package/evals/skill-style/eval.yaml +26 -0
  268. package/evals/skill-style/tasks/negative-trigger.yaml +16 -0
  269. package/evals/skill-style/tasks/positive-trigger.yaml +15 -0
  270. package/evals/tdd/eval.yaml +26 -0
  271. package/evals/tdd/tasks/negative-trivia.yaml +16 -0
  272. package/evals/tdd/tasks/positive-bugfix.yaml +15 -0
  273. package/evals/tdd/tasks/positive-feature.yaml +16 -0
  274. package/evals/tdd/tasks/positive-refactor.yaml +15 -0
  275. package/evals/to-spec/eval.yaml +26 -0
  276. package/evals/to-spec/tasks/negative-trigger.yaml +16 -0
  277. package/evals/to-spec/tasks/positive-trigger.yaml +15 -0
  278. package/evals/to-tickets/eval.yaml +26 -0
  279. package/evals/to-tickets/tasks/negative-trigger.yaml +15 -0
  280. package/evals/to-tickets/tasks/positive-trigger.yaml +15 -0
  281. package/evals/todo-driven-workflow/eval.yaml +26 -0
  282. package/evals/todo-driven-workflow/tasks/negative-single-edit.yaml +16 -0
  283. package/evals/todo-driven-workflow/tasks/positive-multi-step.yaml +15 -0
  284. package/evals/todo-driven-workflow/tasks/positive-refactor-flow.yaml +15 -0
  285. package/evals/using-git-worktrees/eval.yaml +26 -0
  286. package/evals/using-git-worktrees/tasks/negative-trigger.yaml +15 -0
  287. package/evals/using-git-worktrees/tasks/positive-trigger.yaml +15 -0
  288. package/evals/verification-loop/eval.yaml +26 -0
  289. package/evals/verification-loop/tasks/negative-discussion.yaml +16 -0
  290. package/evals/verification-loop/tasks/positive-pre-ship.yaml +15 -0
  291. package/evals/verify-before-claim/eval.yaml +26 -0
  292. package/evals/verify-before-claim/tasks/negative-trigger.yaml +16 -0
  293. package/evals/verify-before-claim/tasks/positive-trigger.yaml +15 -0
  294. package/evals/zoom-out/eval.yaml +26 -0
  295. package/evals/zoom-out/tasks/negative-trivial-edit.yaml +16 -0
  296. package/evals/zoom-out/tasks/positive-repeated-failure.yaml +15 -0
  297. package/fable-discipline/SKILL.md +31 -28
  298. package/fable-discipline/references/discipline-rules.md +22 -0
  299. package/fable-mode/CONTRACT-FORMAT.md +51 -51
  300. package/fable-mode/SKILL.md +31 -43
  301. package/fable-mode/agents/fable-orchestrator.md +99 -92
  302. package/fable-mode/agents/fable-verifier.md +32 -32
  303. package/fable-mode/agents/fable-worker-haiku.md +52 -48
  304. package/fable-mode/agents/fable-worker-sonnet.md +53 -49
  305. package/fable-mode/execution-guardrails/SKILL.md +43 -87
  306. package/fable-mode/execution-guardrails/references/guardrail-rules.md +56 -0
  307. package/fable-mode/fable-haiku/SKILL.md +36 -48
  308. package/fable-mode/fable-haiku/references/routing-notes.md +26 -0
  309. package/fable-mode/fable-opus/SKILL.md +36 -0
  310. package/fable-mode/fable-sonnet/SKILL.md +36 -0
  311. package/fable-mode/model-matrix.json +32 -0
  312. package/fable-mode/references/execution-phases.md +37 -0
  313. package/fable-mode/references/model-matrix.md +39 -0
  314. package/fable-mode/scripts/model-selector.js +129 -0
  315. package/find-skills/SKILL.md +48 -0
  316. package/find-skills/references/discovery-flow.md +102 -0
  317. package/find-skills/scripts/use-skill.js +106 -0
  318. package/git-commit/SKILL.md +35 -45
  319. package/git-commit/guides/ANGULAR_STYLE.md +60 -60
  320. package/git-commit/guides/COMMIT_GENERATION.md +23 -23
  321. package/git-commit/guides/LANGUAGE_DETECTION.md +16 -16
  322. package/git-commit/guides/MAIN_REPO.md +14 -14
  323. package/git-commit/guides/SUBMODULES.md +27 -27
  324. package/git-commit/references/commit-flow.md +30 -0
  325. package/grill-me/SKILL.md +34 -27
  326. package/grill-me/references/grilling-playbook.md +38 -0
  327. package/grill-with-docs/ADR-FORMAT.md +47 -47
  328. package/grill-with-docs/CONTEXT-FORMAT.md +63 -63
  329. package/grill-with-docs/SKILL.md +33 -91
  330. package/grill-with-docs/references/session-playbook.md +97 -0
  331. package/harness-everything/SKILL.md +29 -128
  332. package/harness-everything/examples/README.md +9 -9
  333. package/harness-everything/examples/todo-workflow.md +22 -22
  334. package/harness-everything/references/skill-registry.md +39 -0
  335. package/harness-everything/references/triage-and-tiers.md +116 -0
  336. package/harness-everything/scripts/bootstrap.js +203 -140
  337. package/harness-everything/scripts/routing-keywords.json +320 -0
  338. package/harness-everything/scripts/self-heal.js +241 -189
  339. package/harness-everything/scripts/tier-router.js +334 -219
  340. package/harness-everything/scripts/verify-gate.js +100 -31
  341. package/hooks/hooks.json +155 -155
  342. package/hooks/scripts/atomic-commit-check.js +68 -68
  343. package/hooks/scripts/boundary-guard.js +55 -55
  344. package/hooks/scripts/context-compact.js +114 -114
  345. package/hooks/scripts/contract-test.js +79 -79
  346. package/hooks/scripts/depth-guard.js +65 -65
  347. package/hooks/scripts/lib/harness-state.js +139 -228
  348. package/hooks/scripts/lib/platforms/claude.js +72 -19
  349. package/hooks/scripts/lib/platforms/codex.js +24 -6
  350. package/hooks/scripts/lib/platforms/continue.js +23 -5
  351. package/hooks/scripts/lib/platforms/copilot.js +23 -5
  352. package/hooks/scripts/lib/platforms/cursor.js +23 -5
  353. package/hooks/scripts/lib/platforms/hermes.js +57 -57
  354. package/hooks/scripts/lib/platforms/index.js +17 -17
  355. package/hooks/scripts/lib/platforms/worktrees.js +20 -20
  356. package/hooks/scripts/reset-circuit-breaker.js +30 -30
  357. package/hooks/scripts/rule-of-3-tracker.js +124 -91
  358. package/hooks/scripts/rule-of-3.js +187 -176
  359. package/hooks/scripts/state-persist.js +99 -99
  360. package/hooks/scripts/stop-gate.js +80 -80
  361. package/hooks/scripts/subagent-scope-guard.js +88 -88
  362. package/improve-codebase-architecture/SKILL.md +31 -35
  363. package/improve-codebase-architecture/guides/DEEPENING.md +37 -37
  364. package/improve-codebase-architecture/guides/HTML-REPORT.md +123 -123
  365. package/improve-codebase-architecture/guides/INTERFACE-DESIGN.md +44 -44
  366. package/improve-codebase-architecture/guides/LANGUAGE.md +53 -53
  367. package/improve-codebase-architecture/guides/refactoring-workflow.md +59 -0
  368. package/install-cognitive-os/SKILL.md +23 -80
  369. package/install-cognitive-os/references/cognitive-loop.md +27 -0
  370. package/multi-agent-workspace/NOTICE-agency-agents.md +27 -0
  371. package/multi-agent-workspace/SKILL.md +37 -0
  372. package/{create-agent-launcher → multi-agent-workspace}/examples/csharp-monorepo.md +123 -123
  373. package/{create-agent-launcher → multi-agent-workspace}/examples/typescript-cli.md +126 -126
  374. package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-claude.md +77 -77
  375. package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-codex.md +146 -146
  376. package/multi-agent-workspace/guidelines/platform-continue.md +38 -0
  377. package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-copilot.md +74 -74
  378. package/multi-agent-workspace/guidelines/platform-cursor.md +40 -0
  379. package/multi-agent-workspace/guidelines/platform-hermes.md +38 -0
  380. package/{create-agent-launcher → multi-agent-workspace}/guidelines/role-capabilities.md +108 -108
  381. package/multi-agent-workspace/references/agency-agents.md +31 -0
  382. package/multi-agent-workspace/references/architecture-guide.md +32 -0
  383. package/multi-agent-workspace/references/orchestration.md +48 -0
  384. package/multi-agent-workspace/scripts/agency-catalog.js +190 -0
  385. package/multi-agent-workspace/scripts/index_memory.js +51 -0
  386. package/multi-agent-workspace/scripts/scaffold.js +253 -0
  387. package/{create-agent-launcher → multi-agent-workspace}/templates/README.md +17 -17
  388. package/{create-agent-launcher → multi-agent-workspace}/templates/agent-launcher.md +67 -67
  389. package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-csharp.md +55 -55
  390. package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-polyglot.md +61 -61
  391. package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-ts.md +56 -56
  392. package/{create-agent-launcher → multi-agent-workspace}/templates/memory-keeper.md +36 -36
  393. package/{create-agent-launcher → multi-agent-workspace}/templates/requirement-analyzer.md +65 -65
  394. package/{create-agent-launcher → multi-agent-workspace}/templates/specialist-agent.md +34 -34
  395. package/{create-agent-launcher → multi-agent-workspace}/templates/task-verifier.md +55 -55
  396. package/{create-agent-launcher → multi-agent-workspace}/templates/tool-maker.md +32 -32
  397. package/multi-agent-workspace/workflows/01-init.md +22 -0
  398. package/multi-agent-workspace/workflows/02-analysis.md +23 -0
  399. package/multi-agent-workspace/workflows/03-generation.md +27 -0
  400. package/multi-agent-workspace/workflows/04-launcher.md +16 -0
  401. package/opencode-plugin/README.md +94 -0
  402. package/opencode-plugin/hooks/circuit-breaker.js +121 -0
  403. package/opencode-plugin/hooks/compliance.js +128 -0
  404. package/opencode-plugin/hooks/post-edit.js +62 -0
  405. package/opencode-plugin/hooks/pre-complete.js +65 -0
  406. package/opencode-plugin/hooks/verify.js +140 -0
  407. package/opencode-plugin/plugin.json +17 -0
  408. package/opencode-plugin/test-hook-firing.js +198 -0
  409. package/package.json +50 -22
  410. package/references/definition-of-done.md +67 -0
  411. package/references/performance-checklist.md +153 -0
  412. package/references/platform-advisory-template.md +58 -0
  413. package/references/security-checklist.md +205 -0
  414. package/repo-docs/SKILL.md +38 -37
  415. package/repo-docs/references/process-guide.md +60 -0
  416. package/repo-docs/templates/agents-template.md +264 -264
  417. package/repo-docs/templates/knowledge-agents-template.md +50 -50
  418. package/repo-docs/templates/knowledge-readme-template.md +83 -83
  419. package/repo-docs/templates/manual-recon.md +117 -117
  420. package/repo-docs/templates/multi-skills-readme-template.md +72 -72
  421. package/repo-docs/templates/product-agents-template.md +78 -78
  422. package/repo-docs/templates/product-readme-template.md +95 -95
  423. package/repo-docs/templates/readme-template.md +136 -136
  424. package/repo-docs/templates/single-skill-readme-template.md +70 -70
  425. package/repo-docs/templates/skills-agents-template.md +60 -60
  426. package/rewrite-commits/SKILL.md +22 -17
  427. package/rewrite-commits/references/workflow.md +18 -0
  428. package/scripts/installer.js +546 -506
  429. package/scripts/lib/advisory-text.js +8 -4
  430. package/scripts/lib/claude-hooks.js +18 -5
  431. package/scripts/lib/gitignore.js +199 -80
  432. package/scripts/lib/manifest.js +68 -4
  433. package/scripts/lib/prompts.js +1 -1
  434. package/scripts/lib/skills.js +87 -1
  435. package/scripts/verify-install.js +147 -0
  436. package/security-review/SKILL.md +35 -496
  437. package/security-review/guides/OWASP-PATTERNS.md +31 -0
  438. package/security-review/guides/STRIDE-THREAT-MODEL.md +21 -0
  439. package/security-review/references/security-checklist.md +478 -0
  440. package/security-review/scripts/audit-secrets.js +84 -0
  441. package/self-evolve/SKILL.md +38 -45
  442. package/self-evolve/references/memory-resolution.md +58 -0
  443. package/self-evolve/scripts/persist-memory.js +139 -40
  444. package/self-evolve/scripts/register-dynamic-skill.js +251 -0
  445. package/self-evolve/scripts/self-regression.js +110 -113
  446. package/skill-creator/SKILL.md +34 -76
  447. package/skill-creator/references/authoring-workflow.md +14 -0
  448. package/skill-creator/references/dynamic-generation-contract.md +21 -0
  449. package/skill-creator/references/quality-checklist.md +15 -0
  450. package/skill-creator/references/quality-principles.md +81 -81
  451. package/skill-creator/references/testing-workflow.md +27 -32
  452. package/skill-style/SKILL.md +33 -39
  453. package/skill-style/references/style-guide.md +36 -0
  454. package/tdd/SKILL.md +34 -43
  455. package/tdd/guides/deep-modules.md +33 -33
  456. package/tdd/guides/interface-design.md +31 -31
  457. package/tdd/guides/mocking.md +59 -59
  458. package/tdd/guides/refactoring.md +10 -10
  459. package/tdd/guides/tests.md +61 -61
  460. package/tdd/references/core-discipline.md +49 -0
  461. package/to-spec/SKILL.md +42 -0
  462. package/to-spec/references/process.md +77 -0
  463. package/to-spec/scripts/check-project-docs.js +259 -0
  464. package/to-spec/templates/cli-reference.md +31 -0
  465. package/to-spec/templates/dev-doc.md +27 -0
  466. package/to-spec/templates/feature-spec.md +59 -0
  467. package/to-spec/templates/schema-doc.md +31 -0
  468. package/to-tickets/SKILL.md +42 -0
  469. package/to-tickets/references/publishing-and-templates.md +97 -0
  470. package/todo-driven-workflow/SKILL.md +27 -41
  471. package/todo-driven-workflow/references/execution-guide.md +27 -0
  472. package/using-git-worktrees/SKILL.md +29 -141
  473. package/using-git-worktrees/references/workflow-details.md +108 -0
  474. package/verification-loop/SKILL.md +29 -121
  475. package/verification-loop/references/verification-phases.md +116 -0
  476. package/verification-loop/templates/verification-report.template.md +15 -0
  477. package/verify-before-claim/SKILL.md +27 -70
  478. package/verify-before-claim/references/verification-guide.md +73 -0
  479. package/zoom-out/SKILL.md +28 -76
  480. package/zoom-out/references/circuit-breaker.md +66 -0
  481. package/zoom-out/templates/zoom-out-report.template.md +20 -0
  482. package/build-multi-agent-system/AGENTS.md +0 -50
  483. package/build-multi-agent-system/README.md +0 -63
  484. package/build-multi-agent-system/SKILL.md +0 -68
  485. package/create-agent-launcher/SKILL.md +0 -48
  486. package/create-agent-launcher/guidelines/platform-gemini.md +0 -101
  487. package/create-agent-launcher/workflows/01-init.md +0 -22
  488. package/create-agent-launcher/workflows/02-analysis.md +0 -26
  489. package/create-agent-launcher/workflows/03-generation.md +0 -29
  490. package/create-agent-launcher/workflows/04-launcher.md +0 -20
  491. package/docs/workflows/build-multi-agent-system.md +0 -62
  492. package/docs/workflows/create-agent-launcher.md +0 -62
  493. package/eval-framework/behavioral-test.js +0 -105
  494. package/eval-framework/mechanism-test.js +0 -251
  495. package/harness-everything/scripts/todo-cli.js +0 -157
  496. package/skill-style/STYLE.md +0 -37
@@ -0,0 +1,147 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Verify a Harness installation against this package source.
4
+ *
5
+ * The install manifest records where Harness copied each skill. This command
6
+ * checks its package version, every recorded skill, and the complete file
7
+ * tree, so an old install is reported as stale instead of looking healthy.
8
+ */
9
+
10
+ const crypto = require('crypto');
11
+ const fs = require('fs');
12
+ const os = require('os');
13
+ const path = require('path');
14
+ const { getWorkspaceRoot } = require('./lib/workspace');
15
+ const manifest = require('./lib/manifest');
16
+
17
+ const sourceRoot = path.resolve(__dirname, '..');
18
+ const packageVersion = require(path.join(sourceRoot, 'package.json')).version;
19
+ const userHome = os.homedir();
20
+
21
+ function fileTreeHash(root) {
22
+ if (!fs.existsSync(root)) return null;
23
+ const files = [];
24
+ function walk(dir) {
25
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
26
+ const full = path.join(dir, entry.name);
27
+ if (entry.isDirectory()) walk(full);
28
+ else if (entry.isFile()) files.push(path.relative(root, full).replace(/\\/g, '/') + ':' + crypto.createHash('sha256').update(fs.readFileSync(full)).digest('hex'));
29
+ }
30
+ }
31
+ walk(root);
32
+ return crypto.createHash('sha256').update(files.sort().join('\n')).digest('hex');
33
+ }
34
+
35
+ function availableSkills() {
36
+ return new Set(fs.readdirSync(sourceRoot, { withFileTypes: true })
37
+ .filter(entry => entry.isDirectory() && fs.existsSync(path.join(sourceRoot, entry.name, 'SKILL.md')))
38
+ .map(entry => entry.name));
39
+ }
40
+
41
+ function isHarnessSkill(dir) {
42
+ const skillMd = path.join(dir, 'SKILL.md');
43
+ if (!fs.existsSync(skillMd)) return false;
44
+ const raw = fs.readFileSync(skillMd, 'utf8');
45
+ return /(?:^|\n)\s*author:\s*["']?Miya Daniel["']?/m.test(raw);
46
+ }
47
+
48
+ function verifyManifest(manifestPath, expectedSkillRoot) {
49
+ const failures = [];
50
+ if (!fs.existsSync(manifestPath)) {
51
+ const known = availableSkills();
52
+ const legacy = expectedSkillRoot && fs.existsSync(expectedSkillRoot)
53
+ ? fs.readdirSync(expectedSkillRoot, { withFileTypes: true })
54
+ .filter(entry => entry.isDirectory() && known.has(entry.name) && isHarnessSkill(path.join(expectedSkillRoot, entry.name)))
55
+ .map(entry => entry.name)
56
+ : [];
57
+ if (!legacy.length) return { checked: false, failures };
58
+ failures.push(`STALE untracked installation: ${legacy.length} Harness skill copy/copies have no manifest`);
59
+ for (const id of legacy) {
60
+ if (fileTreeHash(path.join(sourceRoot, id)) !== fileTreeHash(path.join(expectedSkillRoot, id))) {
61
+ failures.push(`STALE tree: ${id} differs from source`);
62
+ }
63
+ }
64
+ return { checked: true, failures };
65
+ }
66
+ const data = manifest.readManifest(manifestPath);
67
+ if (data.package !== manifest.PACKAGE_NAME) failures.push(`manifest package is ${data.package || '(missing)'}`);
68
+ if (data.version !== packageVersion) failures.push(`STALE version: installed ${data.version || '(missing)'}, source ${packageVersion}`);
69
+ const known = availableSkills();
70
+ const recordedPaths = new Set();
71
+ for (const entry of data.skills || []) {
72
+ const dir = entry.dirPath;
73
+ recordedPaths.add(path.resolve(dir || ''));
74
+ if (!entry.id || !known.has(entry.id)) {
75
+ failures.push(`unknown or removed skill in manifest: ${entry.id || '(missing id)'}`);
76
+ continue;
77
+ }
78
+ if (!dir || !fs.existsSync(dir)) {
79
+ failures.push(`missing installed skill: ${entry.id}`);
80
+ continue;
81
+ }
82
+ const sourceHash = fileTreeHash(path.join(sourceRoot, entry.id));
83
+ const installedHash = fileTreeHash(dir);
84
+ if (sourceHash !== installedHash) failures.push(`STALE tree: ${entry.id} differs from source`);
85
+ }
86
+ if (expectedSkillRoot && fs.existsSync(expectedSkillRoot)) {
87
+ for (const entry of fs.readdirSync(expectedSkillRoot, { withFileTypes: true })) {
88
+ const dir = path.join(expectedSkillRoot, entry.name);
89
+ if (entry.isDirectory() && isHarnessSkill(dir) && !recordedPaths.has(path.resolve(dir))) {
90
+ failures.push(`untracked Harness skill copy: ${entry.name}`);
91
+ }
92
+ }
93
+ }
94
+ return { checked: true, failures };
95
+ }
96
+
97
+ function parseArgs() {
98
+ const args = process.argv.slice(2);
99
+ const value = (name) => {
100
+ const i = args.indexOf(name);
101
+ return i === -1 ? undefined : args[i + 1];
102
+ };
103
+ return {
104
+ root: value('--root') ? path.resolve(value('--root')) : getWorkspaceRoot(),
105
+ manifestPath: value('--manifest') ? path.resolve(value('--manifest')) : undefined,
106
+ global: args.includes('--global'),
107
+ };
108
+ }
109
+
110
+ function main() {
111
+ const options = parseArgs();
112
+ const targets = options.manifestPath
113
+ ? [{ manifestPath: options.manifestPath, skillRoot: path.dirname(options.manifestPath).replace(/harness-everything$/, 'skills') }]
114
+ : options.global
115
+ ? [{ manifestPath: manifest.getManifestPath(path.join(userHome, '.agents')), skillRoot: path.join(userHome, '.agents', 'skills') }]
116
+ : [
117
+ ['.claude', '.claude/skills'], ['.cursor', '.cursor/skills'], ['.github', '.github/skills'],
118
+ ['.codex', '.codex/skills'], ['.continue', '.continue/skills'],
119
+ ].map(([home, skillsPath]) => ({
120
+ manifestPath: manifest.getManifestPath(path.join(options.root, home)),
121
+ skillRoot: path.join(options.root, skillsPath),
122
+ }));
123
+ let checked = 0;
124
+ let failures = 0;
125
+ for (const target of targets) {
126
+ const result = verifyManifest(target.manifestPath, target.skillRoot);
127
+ if (!result.checked) continue;
128
+ checked++;
129
+ console.log(`Checking ${path.relative(options.root, target.manifestPath) || target.manifestPath}...`);
130
+ if (result.failures.length) {
131
+ result.failures.forEach(failure => console.error(` FAIL ${failure}`));
132
+ failures += result.failures.length;
133
+ } else console.log(' PASS version and skill tree match source.');
134
+ }
135
+ if (!checked) {
136
+ console.error('No Harness installation manifest found. Install Harness before verifying it.');
137
+ process.exit(1);
138
+ }
139
+ if (failures) {
140
+ console.error(`INSTALL VERIFICATION FAILED: ${failures} problem(s).`);
141
+ process.exit(1);
142
+ }
143
+ console.log(`INSTALL VERIFICATION PASSED: ${checked} manifest(s).`);
144
+ }
145
+
146
+ if (require.main === module) main();
147
+ module.exports = { fileTreeHash, verifyManifest };
@@ -1,511 +1,50 @@
1
1
  ---
2
2
  name: security-review
3
- description: Use this skill when adding authentication, handling user input, working with secrets, creating API endpoints, or implementing payment/sensitive features. Provides comprehensive security checklist and patterns.
4
- author: Miya Daniel | Harness Core Team
5
- version: 0.2.0
3
+ description: Conducts STRIDE threat modeling, scans secrets via audit scripts, and hardens code against OWASP Top 10 risks with three-tier boundary controls. Use when implementing auth, handling input/uploads, managing secrets, or auditing code before deployment.
4
+ license: Apache-2.0
6
5
  metadata:
7
- origin: ECC
6
+ author: Miya Daniel
7
+ version: 0.3.4
8
8
  ---
9
9
 
10
- # Security Review Skill
10
+ # Security Review & Code Hardening
11
11
 
12
- ## 📋 Skill Contract
12
+ Hardens code against OWASP Top 10.
13
13
 
14
- | Component | Specification |
15
- | :--- | :--- |
16
- | **Trigger / Input** | Task involves Auth, API Endpoints, File Uploads, User Input, or Secrets. Input: Target code file. |
17
- | **Expected Output** | Security scan commands executed in terminal. Code modified to fix vulnerabilities. |
18
- | **State Mutations** | Codebase hardened against injection/XSS/IDOR. |
19
- | **Enforcement Gate** | You MUST use grep or standard security linters in the terminal to scan for secrets (`sk-`, `password`) or raw SQL interpolations BEFORE marking the security check as complete. |
20
-
21
- This skill ensures all code follows security best practices and identifies potential vulnerabilities.
22
-
23
- ## When to Activate
24
-
25
- - Implementing authentication or authorization
26
- - Handling user input or file uploads
27
- - Creating new API endpoints
28
- - Working with secrets or credentials
29
- - Implementing payment features
30
- - Storing or transmitting sensitive data
31
- - Integrating third-party APIs
32
-
33
- ## Security Checklist
34
-
35
- ### 1. Secrets Management
36
-
37
- #### FAIL: NEVER Do This
38
- ```typescript
39
- const apiKey = "sk-proj-xxxxx" // Hardcoded secret
40
- const dbPassword = "password123" // In source code
41
- ```
42
-
43
- #### PASS: ALWAYS Do This
44
- ```typescript
45
- const apiKey = process.env.OPENAI_API_KEY
46
- const dbUrl = process.env.DATABASE_URL
47
-
48
- // Verify secrets exist
49
- if (!apiKey) {
50
- throw new Error('OPENAI_API_KEY not configured')
51
- }
52
- ```
53
-
54
- #### Verification Steps
55
- - [ ] No hardcoded API keys, tokens, or passwords
56
- - [ ] All secrets in environment variables
57
- - [ ] `.env.local` in .gitignore
58
- - [ ] No secrets in git history
59
- - [ ] Production secrets in hosting platform (Vercel, Railway)
60
-
61
- ### 2. Input Validation
62
-
63
- #### Always Validate User Input
64
- ```typescript
65
- import { z } from 'zod'
66
-
67
- // Define validation schema
68
- const CreateUserSchema = z.object({
69
- email: z.string().email(),
70
- name: z.string().min(1).max(100),
71
- age: z.number().int().min(0).max(150)
72
- })
73
-
74
- // Validate before processing
75
- export async function createUser(input: unknown) {
76
- try {
77
- const validated = CreateUserSchema.parse(input)
78
- return await db.users.create(validated)
79
- } catch (error) {
80
- if (error instanceof z.ZodError) {
81
- return { success: false, errors: error.issues }
82
- }
83
- throw error
84
- }
85
- }
86
- ```
87
-
88
- #### File Upload Validation
89
- ```typescript
90
- function validateFileUpload(file: File) {
91
- // Size check (5MB max)
92
- const maxSize = 5 * 1024 * 1024
93
- if (file.size > maxSize) {
94
- throw new Error('File too large (max 5MB)')
95
- }
96
-
97
- // Type check
98
- const allowedTypes = ['image/jpeg', 'image/png', 'image/gif']
99
- if (!allowedTypes.includes(file.type)) {
100
- throw new Error('Invalid file type')
101
- }
102
-
103
- // Extension check
104
- const allowedExtensions = ['.jpg', '.jpeg', '.png', '.gif']
105
- const extension = file.name.toLowerCase().match(/\.[^.]+$/)?.[0]
106
- if (!extension || !allowedExtensions.includes(extension)) {
107
- throw new Error('Invalid file extension')
108
- }
109
-
110
- return true
111
- }
112
- ```
113
-
114
- #### Verification Steps
115
- - [ ] All user inputs validated with schemas
116
- - [ ] File uploads restricted (size, type, extension)
117
- - [ ] No direct use of user input in queries
118
- - [ ] Whitelist validation (not blacklist)
119
- - [ ] Error messages don't leak sensitive info
120
-
121
- ### 3. SQL Injection Prevention
122
-
123
- #### FAIL: NEVER Concatenate SQL
124
- ```typescript
125
- // DANGEROUS - SQL Injection vulnerability
126
- const query = `SELECT * FROM users WHERE email = '${userEmail}'`
127
- await db.query(query)
128
- ```
129
-
130
- #### PASS: ALWAYS Use Parameterized Queries
131
- ```typescript
132
- // Safe - parameterized query
133
- const { data } = await supabase
134
- .from('users')
135
- .select('*')
136
- .eq('email', userEmail)
137
-
138
- // Or with raw SQL
139
- await db.query(
140
- 'SELECT * FROM users WHERE email = $1',
141
- [userEmail]
142
- )
143
- ```
144
-
145
- #### Verification Steps
146
- - [ ] All database queries use parameterized queries
147
- - [ ] No string concatenation in SQL
148
- - [ ] ORM/query builder used correctly
149
- - [ ] Supabase queries properly sanitized
150
-
151
- ### 4. Authentication & Authorization
152
-
153
- #### JWT Token Handling
154
- ```typescript
155
- // FAIL: WRONG: localStorage (vulnerable to XSS)
156
- localStorage.setItem('token', token)
157
-
158
- // PASS: CORRECT: httpOnly cookies
159
- res.setHeader('Set-Cookie',
160
- `token=${token}; HttpOnly; Secure; SameSite=Strict; Max-Age=3600`)
161
- ```
162
-
163
- #### Authorization Checks
164
- ```typescript
165
- export async function deleteUser(userId: string, requesterId: string) {
166
- // ALWAYS verify authorization first
167
- const requester = await db.users.findUnique({
168
- where: { id: requesterId }
169
- })
170
-
171
- if (requester.role !== 'admin') {
172
- return NextResponse.json(
173
- { error: 'Unauthorized' },
174
- { status: 403 }
175
- )
176
- }
177
-
178
- // Proceed with deletion
179
- await db.users.delete({ where: { id: userId } })
180
- }
181
- ```
182
-
183
- #### Row Level Security (Supabase)
184
- ```sql
185
- -- Enable RLS on all tables
186
- ALTER TABLE users ENABLE ROW LEVEL SECURITY;
187
-
188
- -- Users can only view their own data
189
- CREATE POLICY "Users view own data"
190
- ON users FOR SELECT
191
- USING (auth.uid() = id);
192
-
193
- -- Users can only update their own data
194
- CREATE POLICY "Users update own data"
195
- ON users FOR UPDATE
196
- USING (auth.uid() = id);
197
- ```
198
-
199
- #### Verification Steps
200
- - [ ] Tokens stored in httpOnly cookies (not localStorage)
201
- - [ ] Authorization checks before sensitive operations
202
- - [ ] Row Level Security enabled in Supabase
203
- - [ ] Role-based access control implemented
204
- - [ ] Session management secure
205
-
206
- ### 5. XSS Prevention
207
-
208
- #### Sanitize HTML
209
- ```typescript
210
- import DOMPurify from 'isomorphic-dompurify'
211
-
212
- // ALWAYS sanitize user-provided HTML
213
- function renderUserContent(html: string) {
214
- const clean = DOMPurify.sanitize(html, {
215
- ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'p'],
216
- ALLOWED_ATTR: []
217
- })
218
- return <div dangerouslySetInnerHTML={{ __html: clean }} />
219
- }
220
- ```
221
-
222
- #### Content Security Policy
223
-
224
- Start strict and loosen only with a documented removal plan. Do not default to
225
- `'unsafe-inline'` or `'unsafe-eval'`; they neutralize much of CSP's protection
226
- and should be treated as temporary compatibility debt.
227
-
228
- ```typescript
229
- // next.config.js
230
- const securityHeaders = [
231
- {
232
- key: 'Content-Security-Policy',
233
- value: `
234
- default-src 'self';
235
- base-uri 'self';
236
- object-src 'none';
237
- frame-ancestors 'none';
238
- script-src 'self';
239
- style-src 'self';
240
- img-src 'self' data: https:;
241
- font-src 'self';
242
- connect-src 'self' https://api.example.com;
243
- `.replace(/\s{2,}/g, ' ').trim()
244
- }
245
- ]
246
- ```
247
-
248
- #### Verification Steps
249
- - [ ] User-provided HTML sanitized
250
- - [ ] CSP headers configured
251
- - [ ] No unvalidated dynamic content rendering
252
- - [ ] React's built-in XSS protection used
14
+ ## USE FOR:
15
+ - AuthN or authZ implementation
16
+ - User input, uploads, new API endpoints
17
+ - Secrets, credentials, payment features
18
+ - Security audit before production deploy
253
19
 
254
- ### 6. CSRF Protection
20
+ ## DO NOT USE FOR:
21
+ - Code review without security scope — instead use a standard pass
22
+ - Performance profiling
23
+ - Accessibility or UI styling fixes
255
24
 
256
- #### CSRF Tokens
257
- ```typescript
258
- import { csrf } from '@/lib/csrf'
25
+ ## Skill Contract
259
26
 
260
- export async function POST(request: Request) {
261
- const token = request.headers.get('X-CSRF-Token')
262
-
263
- if (!csrf.verify(token)) {
264
- return NextResponse.json(
265
- { error: 'Invalid CSRF token' },
266
- { status: 403 }
267
- )
268
- }
269
-
270
- // Process request
271
- }
272
- ```
273
-
274
- #### SameSite Cookies
275
- ```typescript
276
- res.setHeader('Set-Cookie',
277
- `session=${sessionId}; HttpOnly; Secure; SameSite=Strict`)
278
- ```
279
-
280
- #### Verification Steps
281
- - [ ] CSRF tokens on state-changing operations
282
- - [ ] SameSite=Strict on all cookies
283
- - [ ] Double-submit cookie pattern implemented
284
-
285
- ### 7. Rate Limiting
286
-
287
- #### API Rate Limiting
288
- ```typescript
289
- import rateLimit from 'express-rate-limit'
290
-
291
- const limiter = rateLimit({
292
- windowMs: 15 * 60 * 1000, // 15 minutes
293
- max: 100, // 100 requests per window
294
- message: 'Too many requests'
295
- })
296
-
297
- // Apply to routes
298
- app.use('/api/', limiter)
299
- ```
300
-
301
- #### Expensive Operations
302
- ```typescript
303
- // Aggressive rate limiting for searches
304
- const searchLimiter = rateLimit({
305
- windowMs: 60 * 1000, // 1 minute
306
- max: 10, // 10 requests per minute
307
- message: 'Too many search requests'
308
- })
309
-
310
- app.use('/api/search', searchLimiter)
311
- ```
312
-
313
- #### Verification Steps
314
- - [ ] Rate limiting on all API endpoints
315
- - [ ] Stricter limits on expensive operations
316
- - [ ] IP-based rate limiting
317
- - [ ] User-based rate limiting (authenticated)
318
-
319
- ### 8. Sensitive Data Exposure
320
-
321
- #### Logging
322
- ```typescript
323
- // FAIL: WRONG: Logging sensitive data
324
- console.log('User login:', { email, password })
325
- console.log('Payment:', { cardNumber, cvv })
326
-
327
- // PASS: CORRECT: Redact sensitive data
328
- console.log('User login:', { email, userId })
329
- console.log('Payment:', { last4: card.last4, userId })
330
- ```
331
-
332
- #### Error Messages
333
- ```typescript
334
- // FAIL: WRONG: Exposing internal details
335
- catch (error) {
336
- return NextResponse.json(
337
- { error: error.message, stack: error.stack },
338
- { status: 500 }
339
- )
340
- }
341
-
342
- // PASS: CORRECT: Generic error messages
343
- catch (error) {
344
- console.error('Internal error:', error)
345
- return NextResponse.json(
346
- { error: 'An error occurred. Please try again.' },
347
- { status: 500 }
348
- )
349
- }
350
- ```
351
-
352
- #### Verification Steps
353
- - [ ] No passwords, tokens, or secrets in logs
354
- - [ ] Error messages generic for users
355
- - [ ] Detailed errors only in server logs
356
- - [ ] No stack traces exposed to users
357
-
358
- ### 9. Blockchain Security (Solana)
359
-
360
- #### Wallet Verification
361
- ```typescript
362
- import { verify } from '@solana/web3.js'
363
-
364
- async function verifyWalletOwnership(
365
- publicKey: string,
366
- signature: string,
367
- message: string
368
- ) {
369
- try {
370
- const isValid = verify(
371
- Buffer.from(message),
372
- Buffer.from(signature, 'base64'),
373
- Buffer.from(publicKey, 'base64')
374
- )
375
- return isValid
376
- } catch (error) {
377
- return false
378
- }
379
- }
380
- ```
381
-
382
- #### Transaction Verification
383
- ```typescript
384
- async function verifyTransaction(transaction: Transaction) {
385
- // Verify recipient
386
- if (transaction.to !== expectedRecipient) {
387
- throw new Error('Invalid recipient')
388
- }
389
-
390
- // Verify amount
391
- if (transaction.amount > maxAmount) {
392
- throw new Error('Amount exceeds limit')
393
- }
394
-
395
- // Verify user has sufficient balance
396
- const balance = await getBalance(transaction.from)
397
- if (balance < transaction.amount) {
398
- throw new Error('Insufficient balance')
399
- }
400
-
401
- return true
402
- }
403
- ```
404
-
405
- #### Verification Steps
406
- - [ ] Wallet signatures verified
407
- - [ ] Transaction details validated
408
- - [ ] Balance checks before transactions
409
- - [ ] No blind transaction signing
410
-
411
- ### 10. Dependency Security
412
-
413
- #### Regular Updates
414
- ```bash
415
- # Check for vulnerabilities
416
- npm audit
417
-
418
- # Fix automatically fixable issues
419
- npm audit fix
420
-
421
- # Update dependencies
422
- npm update
423
-
424
- # Check for outdated packages
425
- npm outdated
426
- ```
427
-
428
- #### Lock Files
429
- ```bash
430
- # ALWAYS commit lock files
431
- git add package-lock.json
432
-
433
- # Use in CI/CD for reproducible builds
434
- npm ci # Instead of npm install
435
- ```
436
-
437
- #### Verification Steps
438
- - [ ] Dependencies up to date
439
- - [ ] No known vulnerabilities (npm audit clean)
440
- - [ ] Lock files committed
441
- - [ ] Dependabot enabled on GitHub
442
- - [ ] Regular security updates
443
-
444
- ## Security Testing
445
-
446
- ### Automated Security Tests
447
- ```typescript
448
- // Test authentication
449
- test('requires authentication', async () => {
450
- const response = await fetch('/api/protected')
451
- expect(response.status).toBe(401)
452
- })
453
-
454
- // Test authorization
455
- test('requires admin role', async () => {
456
- const response = await fetch('/api/admin', {
457
- headers: { Authorization: `Bearer ${userToken}` }
458
- })
459
- expect(response.status).toBe(403)
460
- })
461
-
462
- // Test input validation
463
- test('rejects invalid input', async () => {
464
- const response = await fetch('/api/users', {
465
- method: 'POST',
466
- body: JSON.stringify({ email: 'not-an-email' })
467
- })
468
- expect(response.status).toBe(400)
469
- })
470
-
471
- // Test rate limiting
472
- test('enforces rate limits', async () => {
473
- const requests = Array(101).fill(null).map(() =>
474
- fetch('/api/endpoint')
475
- )
476
-
477
- const responses = await Promise.all(requests)
478
- const tooManyRequests = responses.filter(r => r.status === 429)
479
-
480
- expect(tooManyRequests.length).toBeGreaterThan(0)
481
- })
482
- ```
27
+ | Component | Specification |
28
+ | :--- | :--- |
29
+ | **Trigger / Input** | Auth, endpoints, uploads, user input, secrets, audit requests. |
30
+ | **Expected Output** | Threat model, scan via `audit-secrets.js`, hardened code, audit report. |
31
+ | **State Mutations** | Codebase hardened against injection/XSS/IDOR; report to docs or platform dir. |
32
+ | **Enforcement Gate** | Secret scan via the script or grep before concluding review. |
483
33
 
484
- ## Pre-Deployment Security Checklist
34
+ ## Review Flow
485
35
 
486
- Before ANY production deployment:
36
+ 1. Threat-model (`STRIDE`) per security-review/guides/STRIDE-THREAT-MODEL.md; misuse-case every endpoint/input.
37
+ 2. Scan secrets and injection risks:
38
+ ```bash
39
+ node "<this-skill-dir>/scripts/audit-secrets.js"
40
+ ```
41
+ Fallback: grep scan.
42
+ 3. Fix findings per the boundary system; report to `docs/security-audit.md`, or `.github/harness-everything/security-audit.md` when docs/ is protected or absent.
487
43
 
488
- - [ ] **Secrets**: No hardcoded secrets, all in env vars
489
- - [ ] **Input Validation**: All user inputs validated
490
- - [ ] **SQL Injection**: All queries parameterized
491
- - [ ] **XSS**: User content sanitized
492
- - [ ] **CSRF**: Protection enabled
493
- - [ ] **Authentication**: Proper token handling
494
- - [ ] **Authorization**: Role checks in place
495
- - [ ] **Rate Limiting**: Enabled on all endpoints
496
- - [ ] **HTTPS**: Enforced in production
497
- - [ ] **Security Headers**: CSP, X-Frame-Options configured
498
- - [ ] **Error Handling**: No sensitive data in errors
499
- - [ ] **Logging**: No sensitive data logged
500
- - [ ] **Dependencies**: Up to date, no vulnerabilities
501
- - [ ] **Row Level Security**: Enabled in Supabase
502
- - [ ] **CORS**: Properly configured
503
- - [ ] **File Uploads**: Validated (size, type)
504
- - [ ] **Wallet Signatures**: Verified (if blockchain)
44
+ ## Three-Tier Boundary System
505
45
 
506
- ## Resources
46
+ - **Always Do**: parameterize SQL, Zod-validate inputs, httpOnly cookies, secrets to `process.env`.
47
+ - **Ask First**: CORS changes, auth/login flows, file uploads, rate limits.
48
+ - **Never Do**: commit hardcoded secrets (`sk-`), log passwords/tokens, use eval() or unescaped innerHTML.
507
49
 
508
- - [OWASP Top 10](https://owasp.org/www-project-top-ten/)
509
- - [Next.js Security](https://nextjs.org/docs/security)
510
- - [Supabase Security](https://supabase.com/docs/guides/auth)
511
- - [Web Security Academy](https://portswigger.net/web-security)
50
+ Deep dive: references/security-checklist.md + security-review/guides/OWASP-PATTERNS.md