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.
- package/.claude-plugin/marketplace.json +27 -0
- package/.claude-plugin/plugin.json +51 -0
- package/.gitattributes +1 -0
- package/.github/workflows/behavioral-evals.yml +36 -0
- package/.github/workflows/ci.yml +117 -0
- package/.github/workflows/release.yml +45 -0
- package/.husky/commit-msg +1 -0
- package/.waza.yaml +22 -0
- package/AGENTS.md +60 -2
- package/BENCHMARK_SOP.md +62 -62
- package/CHANGELOG.md +297 -114
- package/CODE_OF_CONDUCT.md +24 -0
- package/CONTRIBUTING.md +47 -0
- package/Dockerfile +18 -18
- package/LICENSE +201 -201
- package/README.md +279 -197
- package/SECURITY.md +33 -0
- package/VERIFICATION.md +394 -347
- package/ab-test-deep-analysis-2026-08-27.md +383 -0
- package/ab-test-results-2026-08-27.md +152 -0
- package/ab-test-statistical-analysis-31cases.md +193 -0
- package/behavioral-evals/README.md +85 -0
- package/behavioral-evals/analyze-plugin-results.js +110 -0
- package/behavioral-evals/cases/baseline-add-feature.yaml +34 -0
- package/behavioral-evals/cases/baseline-api-design.yaml +32 -0
- package/behavioral-evals/cases/baseline-debugging.yaml +31 -0
- package/behavioral-evals/cases/baseline-dependency.yaml +24 -0
- package/behavioral-evals/cases/baseline-documentation.yaml +34 -0
- package/behavioral-evals/cases/baseline-error-handling.yaml +31 -0
- package/behavioral-evals/cases/baseline-git-commit.yaml +33 -0
- package/behavioral-evals/cases/baseline-performance-monitoring.yaml +28 -0
- package/behavioral-evals/cases/baseline-performance.yaml +34 -0
- package/behavioral-evals/cases/baseline-refactor-with-tests.yaml +35 -0
- package/behavioral-evals/cases/baseline-refactor.yaml +27 -0
- package/behavioral-evals/cases/baseline-security-review.yaml +28 -0
- package/behavioral-evals/cases/baseline-simple-bugfix.yaml +33 -0
- package/behavioral-evals/cases/baseline-tdd-workflow.yaml +28 -0
- package/behavioral-evals/cases/breaker-zoom-out-after-3.yaml +50 -0
- package/behavioral-evals/cases/pressure-budget-skip-review.yaml +27 -0
- package/behavioral-evals/cases/pressure-bypass-review.yaml +27 -0
- package/behavioral-evals/cases/pressure-complexity-skip.yaml +37 -0
- package/behavioral-evals/cases/pressure-expert-skip-testing.yaml +31 -0
- package/behavioral-evals/cases/pressure-fatigue-skip.yaml +33 -0
- package/behavioral-evals/cases/pressure-management-skip-all.yaml +28 -0
- package/behavioral-evals/cases/pressure-scope-bypass.yaml +28 -0
- package/behavioral-evals/cases/pressure-skip-docs.yaml +50 -0
- package/behavioral-evals/cases/pressure-skip-error-handling.yaml +35 -0
- package/behavioral-evals/cases/pressure-skip-security.yaml +32 -0
- package/behavioral-evals/cases/pressure-skip-tests.yaml +27 -0
- package/behavioral-evals/cases/pressure-skip-verification.yaml +43 -0
- package/behavioral-evals/cases/pressure-social-skip-review.yaml +28 -0
- package/behavioral-evals/cases/pressure-sunk-cost-retry.yaml +47 -0
- package/behavioral-evals/cases/scope-discipline.yaml +32 -0
- package/behavioral-evals/cases/tier1-no-overplan.yaml +26 -0
- package/behavioral-evals/cases/verify-before-done.yaml +31 -0
- package/behavioral-evals/results/.gitkeep +0 -0
- package/behavioral-evals/results/2026-08-23-breaker-zoom-out-after-3.json +20 -0
- package/behavioral-evals/results/2026-08-23-pressure-skip-verification.json +20 -0
- package/behavioral-evals/results/2026-08-23-pressure-sunk-cost-retry.json +20 -0
- package/behavioral-evals/results/2026-08-23-scope-discipline.json +16 -0
- package/behavioral-evals/results/2026-08-23-tier1-no-overplan.json +20 -0
- package/behavioral-evals/results/2026-08-23-verify-before-done.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-add-feature.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-api-design.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-debugging.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-dependency.json +16 -0
- package/behavioral-evals/results/2026-08-27-baseline-documentation.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-error-handling.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-git-commit.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-performance-monitoring.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-performance.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-refactor-with-tests.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-refactor.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-security-review.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-simple-bugfix.json +20 -0
- package/behavioral-evals/results/2026-08-27-baseline-tdd-workflow.json +24 -0
- package/behavioral-evals/results/2026-08-27-breaker-zoom-out-after-3.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-budget-skip-review.json +16 -0
- package/behavioral-evals/results/2026-08-27-pressure-bypass-review.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-complexity-skip.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-expert-skip-testing.json +16 -0
- package/behavioral-evals/results/2026-08-27-pressure-fatigue-skip.json +16 -0
- package/behavioral-evals/results/2026-08-27-pressure-management-skip-all.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-skip-docs.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-skip-error-handling.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-skip-security.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-skip-tests.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-skip-verification.json +24 -0
- package/behavioral-evals/results/2026-08-27-pressure-social-skip-review.json +20 -0
- package/behavioral-evals/results/2026-08-27-pressure-sunk-cost-retry.json +24 -0
- package/behavioral-evals/results/2026-08-27-scope-discipline.json +16 -0
- package/behavioral-evals/results/2026-08-27-tier1-no-overplan.json +20 -0
- package/behavioral-evals/results/2026-08-27-verify-before-done.json +20 -0
- package/behavioral-evals/results/run-20260827-115509.log +287 -0
- package/behavioral-evals/run-with-plugin.js +316 -0
- package/behavioral-evals/run.js +587 -0
- package/benchmarks/README.md +63 -0
- package/benchmarks/ab-test-2026-08-26/results.json +55 -0
- package/benchmarks/results/logs/.gitkeep +0 -0
- package/benchmarks/results/logs/test-a-harness.md +31 -0
- package/benchmarks/results/logs/test-a-vanilla.md +28 -0
- package/benchmarks/results/logs/test-b-micro-loop-harness.md +48 -0
- package/benchmarks/results/logs/test-b-micro-loop-vanilla.md +36 -0
- package/benchmarks/results/logs/test-c-attention-loss-harness.md +40 -0
- package/benchmarks/results/logs/test-c-attention-loss-vanilla.md +63 -0
- package/benchmarks/results/logs/test-d-knowledge-boundary-harness.md +24 -0
- package/benchmarks/results/logs/test-d-knowledge-boundary-vanilla.md +29 -0
- package/benchmarks/results/logs/test-e-shell-awareness-harness.md +20 -0
- package/benchmarks/results/logs/test-e-shell-awareness-vanilla.md +20 -0
- package/benchmarks/results/logs/test-f-fact-audit-harness.md +16 -0
- package/benchmarks/results/logs/test-f-fact-audit-vanilla.md +16 -0
- package/benchmarks/results/results.json +158 -0
- package/benchmarks/run.js +220 -0
- package/benchmarks/schema.json +44 -0
- package/bin/cli.js +152 -97
- package/ci/ab-test-cases/grill-me-adversarial.yaml +18 -0
- package/ci/ab-test-cases/tdd-test-first.yaml +23 -0
- package/ci/ab-test-cases/verification-loop-gates.yaml +25 -0
- package/ci/ab-test-cases/verify-before-claim-cites.yaml +18 -0
- package/ci/ab-test-harness.js +410 -0
- package/{eval-framework → ci}/cases/case1.json +5 -5
- package/ci/cases/case10-small-feature.json +5 -0
- package/ci/cases/case11-readme-typo-update.json +5 -0
- package/ci/cases/case12-chinese-macro-audit.json +5 -0
- package/{eval-framework → ci}/cases/case2.json +5 -5
- package/{eval-framework → ci}/cases/case3.json +5 -5
- package/{eval-framework → ci}/cases/case4-zh-tier2.json +5 -5
- package/{eval-framework → ci}/cases/case5-zh-tier3.json +5 -5
- package/ci/cases/case6-macro-skill-audit.json +5 -0
- package/ci/cases/case7-macro-reference-audit.json +5 -0
- package/ci/cases/case8-controlled-ab-benchmark.json +5 -0
- package/ci/cases/case9-four-issue-audit.json +5 -0
- package/ci/consistency-check.js +347 -0
- package/ci/description-collision.js +109 -0
- package/ci/fable-mode-test.js +120 -0
- package/ci/fixtures/agency-agents/divisions.json +6 -0
- package/ci/fixtures/agency-agents/engineering/code-reviewer.md +11 -0
- package/ci/fixtures/agency-agents/testing/reality-checker.md +11 -0
- package/ci/fixtures/bad-frontmatter-colon/SKILL.md +16 -0
- package/ci/fixtures/duplicate-description/skill-a/SKILL.md +16 -0
- package/ci/fixtures/duplicate-description/skill-b/SKILL.md +16 -0
- package/ci/mechanism-2a-rule-of-3.test.js +46 -0
- package/ci/mechanism-2b-boundary-guard.test.js +16 -0
- package/ci/mechanism-2c-state-persist.test.js +29 -0
- package/ci/mechanism-2d-fact-audit.test.js +18 -0
- package/ci/mechanism-2e-scope-guard.test.js +24 -0
- package/ci/mechanism-2f-stop-gate.test.js +23 -0
- package/ci/mechanism-2g-platform-ignore.test.js +88 -0
- package/ci/mechanism-2h-installer-manifest.test.js +147 -0
- package/ci/mechanism-2i-crlf-frontmatter.test.js +145 -0
- package/ci/mechanism-2i-install-verification.test.js +34 -0
- package/ci/mechanism-2j-behavioral-runner.test.js +20 -0
- package/ci/mechanism-2k-reference-check.test.js +20 -0
- package/ci/mechanism-2l-multi-agent-workspace.test.js +105 -0
- package/ci/mechanism-test.js +71 -0
- package/ci/negative-controls.js +84 -0
- package/ci/reference-check.js +112 -0
- package/ci/release-consistency-check.js +123 -0
- package/ci/routing-check.js +90 -0
- package/{eval-framework → ci}/runner.js +56 -56
- package/ci/skill-routing-check.js +98 -0
- package/ci/test-helper.js +104 -0
- package/ci/test-negative-controls.js +148 -0
- package/commitlint.config.js +25 -0
- package/docker-verify.sh +266 -266
- package/docs/architecture.md +99 -95
- package/docs/audit.md +53 -0
- package/docs/mechanism-first-skill-mesh.md +163 -0
- package/docs/philosophy.md +47 -45
- package/docs/reflection.md +48 -34
- package/docs/routing.md +58 -45
- package/docs/troubleshooting.md +284 -0
- package/docs/workflows/environment-detection.md +10 -10
- package/docs/workflows/eval-harness.md +13 -6
- package/docs/workflows/fable-discipline.md +9 -9
- package/docs/workflows/fable-mode.md +29 -32
- package/docs/workflows/find-skills.md +36 -0
- package/docs/workflows/git-commit.md +18 -9
- package/docs/workflows/grill-me.md +11 -11
- package/docs/workflows/grill-with-docs.md +14 -7
- package/docs/workflows/harness-everything.md +95 -92
- package/docs/workflows/improve-codebase-architecture.md +15 -7
- package/docs/workflows/install-cognitive-os.md +60 -60
- package/docs/workflows/multi-agent-workspace.md +42 -0
- package/docs/workflows/repo-docs.md +12 -7
- package/docs/workflows/security-review.md +26 -7
- package/docs/workflows/self-evolve.md +27 -44
- package/docs/workflows/skill-creator.md +80 -75
- package/docs/workflows/skill-style.md +64 -64
- package/docs/workflows/tdd.md +42 -39
- package/docs/workflows/to-spec.md +83 -0
- package/docs/workflows/to-tickets.md +80 -0
- package/docs/workflows/todo-driven-workflow.md +34 -36
- package/docs/workflows/using-git-worktrees.md +12 -8
- package/docs/workflows/verification-loop.md +16 -14
- package/docs/workflows/verify-before-claim.md +12 -8
- package/docs/workflows/zoom-out.md +22 -10
- package/environment-detection/SKILL.md +25 -61
- package/environment-detection/references/shell-syntax-rules.md +76 -0
- package/environment-detection/scripts/preflight.js +103 -93
- package/eval-framework/fixtures/bad-frontmatter-colon/SKILL.md +14 -0
- package/eval-framework/fixtures/duplicate-desc-skill-a/SKILL.md +14 -0
- package/eval-framework/fixtures/duplicate-desc-skill-b/SKILL.md +14 -0
- package/eval-framework/fixtures/missing-delimiter/SKILL.md +13 -0
- package/eval-framework/fixtures/over-budget-skill/SKILL.md +36 -0
- package/eval-harness/SKILL.md +34 -51
- package/eval-harness/references/scoring-rubric.md +68 -0
- package/eval-harness/scripts/evaluate.js +77 -61
- package/evals/environment-detection/eval.yaml +26 -0
- package/evals/environment-detection/tasks/negative-trigger.yaml +16 -0
- package/evals/environment-detection/tasks/positive-trigger.yaml +15 -0
- package/evals/eval-harness/eval.yaml +26 -0
- package/evals/eval-harness/tasks/negative-trigger.yaml +16 -0
- package/evals/eval-harness/tasks/positive-trigger.yaml +15 -0
- package/evals/fable-discipline/eval.yaml +26 -0
- package/evals/fable-discipline/tasks/negative-trigger.yaml +16 -0
- package/evals/fable-discipline/tasks/positive-trigger.yaml +15 -0
- package/evals/fable-mode/eval.yaml +26 -0
- package/evals/fable-mode/tasks/negative-tier2-no-model.yaml +18 -0
- package/evals/fable-mode/tasks/negative-trigger.yaml +16 -0
- package/evals/fable-mode/tasks/positive-haiku-mode.yaml +16 -0
- package/evals/fable-mode/tasks/positive-opus-mode.yaml +16 -0
- package/evals/fable-mode/tasks/positive-sonnet-mode.yaml +16 -0
- package/evals/fable-mode/tasks/positive-trigger.yaml +15 -0
- package/evals/find-skills/eval.yaml +26 -0
- package/evals/find-skills/tasks/negative-trigger.yaml +16 -0
- package/evals/find-skills/tasks/positive-trigger.yaml +15 -0
- package/evals/git-commit/eval.yaml +26 -0
- package/evals/git-commit/tasks/negative-trigger.yaml +16 -0
- package/evals/git-commit/tasks/positive-trigger.yaml +15 -0
- package/evals/grill-me/eval.yaml +26 -0
- package/evals/grill-me/tasks/negative-trigger.yaml +16 -0
- package/evals/grill-me/tasks/positive-trigger.yaml +15 -0
- package/evals/grill-with-docs/eval.yaml +26 -0
- package/evals/grill-with-docs/tasks/negative-trigger.yaml +16 -0
- package/evals/grill-with-docs/tasks/positive-trigger.yaml +15 -0
- package/evals/harness-everything/eval.yaml +26 -0
- package/evals/harness-everything/tasks/negative-non-software.yaml +16 -0
- package/evals/harness-everything/tasks/negative-skill-indicated.yaml +15 -0
- package/evals/harness-everything/tasks/positive-tier1.yaml +16 -0
- package/evals/harness-everything/tasks/positive-tier2.yaml +16 -0
- package/evals/harness-everything/tasks/positive-tier3.yaml +16 -0
- package/evals/improve-codebase-architecture/eval.yaml +26 -0
- package/evals/improve-codebase-architecture/tasks/negative-trigger.yaml +16 -0
- package/evals/improve-codebase-architecture/tasks/positive-trigger.yaml +15 -0
- package/evals/install-cognitive-os/eval.yaml +26 -0
- package/evals/install-cognitive-os/tasks/negative-trigger.yaml +16 -0
- package/evals/install-cognitive-os/tasks/positive-trigger.yaml +15 -0
- package/evals/multi-agent-workspace/eval.yaml +26 -0
- package/evals/multi-agent-workspace/tasks/negative-trigger.yaml +15 -0
- package/evals/multi-agent-workspace/tasks/positive-trigger.yaml +15 -0
- package/evals/repo-docs/eval.yaml +26 -0
- package/evals/repo-docs/tasks/negative-trigger.yaml +16 -0
- package/evals/repo-docs/tasks/positive-trigger.yaml +15 -0
- package/evals/rewrite-commits/eval.yaml +26 -0
- package/evals/rewrite-commits/tasks/negative-trigger.yaml +16 -0
- package/evals/rewrite-commits/tasks/positive-trigger.yaml +15 -0
- package/evals/security-review/eval.yaml +26 -0
- package/evals/security-review/tasks/negative-trigger.yaml +16 -0
- package/evals/security-review/tasks/positive-trigger.yaml +15 -0
- package/evals/self-evolve/eval.yaml +26 -0
- package/evals/self-evolve/tasks/negative-trigger.yaml +16 -0
- package/evals/self-evolve/tasks/positive-trigger.yaml +15 -0
- package/evals/skill-creator/eval.yaml +26 -0
- package/evals/skill-creator/tasks/negative-trigger.yaml +16 -0
- package/evals/skill-creator/tasks/positive-trigger.yaml +15 -0
- package/evals/skill-style/eval.yaml +26 -0
- package/evals/skill-style/tasks/negative-trigger.yaml +16 -0
- package/evals/skill-style/tasks/positive-trigger.yaml +15 -0
- package/evals/tdd/eval.yaml +26 -0
- package/evals/tdd/tasks/negative-trivia.yaml +16 -0
- package/evals/tdd/tasks/positive-bugfix.yaml +15 -0
- package/evals/tdd/tasks/positive-feature.yaml +16 -0
- package/evals/tdd/tasks/positive-refactor.yaml +15 -0
- package/evals/to-spec/eval.yaml +26 -0
- package/evals/to-spec/tasks/negative-trigger.yaml +16 -0
- package/evals/to-spec/tasks/positive-trigger.yaml +15 -0
- package/evals/to-tickets/eval.yaml +26 -0
- package/evals/to-tickets/tasks/negative-trigger.yaml +15 -0
- package/evals/to-tickets/tasks/positive-trigger.yaml +15 -0
- package/evals/todo-driven-workflow/eval.yaml +26 -0
- package/evals/todo-driven-workflow/tasks/negative-single-edit.yaml +16 -0
- package/evals/todo-driven-workflow/tasks/positive-multi-step.yaml +15 -0
- package/evals/todo-driven-workflow/tasks/positive-refactor-flow.yaml +15 -0
- package/evals/using-git-worktrees/eval.yaml +26 -0
- package/evals/using-git-worktrees/tasks/negative-trigger.yaml +15 -0
- package/evals/using-git-worktrees/tasks/positive-trigger.yaml +15 -0
- package/evals/verification-loop/eval.yaml +26 -0
- package/evals/verification-loop/tasks/negative-discussion.yaml +16 -0
- package/evals/verification-loop/tasks/positive-pre-ship.yaml +15 -0
- package/evals/verify-before-claim/eval.yaml +26 -0
- package/evals/verify-before-claim/tasks/negative-trigger.yaml +16 -0
- package/evals/verify-before-claim/tasks/positive-trigger.yaml +15 -0
- package/evals/zoom-out/eval.yaml +26 -0
- package/evals/zoom-out/tasks/negative-trivial-edit.yaml +16 -0
- package/evals/zoom-out/tasks/positive-repeated-failure.yaml +15 -0
- package/fable-discipline/SKILL.md +31 -28
- package/fable-discipline/references/discipline-rules.md +22 -0
- package/fable-mode/CONTRACT-FORMAT.md +51 -51
- package/fable-mode/SKILL.md +31 -43
- package/fable-mode/agents/fable-orchestrator.md +99 -92
- package/fable-mode/agents/fable-verifier.md +32 -32
- package/fable-mode/agents/fable-worker-haiku.md +52 -48
- package/fable-mode/agents/fable-worker-sonnet.md +53 -49
- package/fable-mode/execution-guardrails/SKILL.md +43 -87
- package/fable-mode/execution-guardrails/references/guardrail-rules.md +56 -0
- package/fable-mode/fable-haiku/SKILL.md +36 -48
- package/fable-mode/fable-haiku/references/routing-notes.md +26 -0
- package/fable-mode/fable-opus/SKILL.md +36 -0
- package/fable-mode/fable-sonnet/SKILL.md +36 -0
- package/fable-mode/model-matrix.json +32 -0
- package/fable-mode/references/execution-phases.md +37 -0
- package/fable-mode/references/model-matrix.md +39 -0
- package/fable-mode/scripts/model-selector.js +129 -0
- package/find-skills/SKILL.md +48 -0
- package/find-skills/references/discovery-flow.md +102 -0
- package/find-skills/scripts/use-skill.js +106 -0
- package/git-commit/SKILL.md +35 -45
- package/git-commit/guides/ANGULAR_STYLE.md +60 -60
- package/git-commit/guides/COMMIT_GENERATION.md +23 -23
- package/git-commit/guides/LANGUAGE_DETECTION.md +16 -16
- package/git-commit/guides/MAIN_REPO.md +14 -14
- package/git-commit/guides/SUBMODULES.md +27 -27
- package/git-commit/references/commit-flow.md +30 -0
- package/grill-me/SKILL.md +34 -27
- package/grill-me/references/grilling-playbook.md +38 -0
- package/grill-with-docs/ADR-FORMAT.md +47 -47
- package/grill-with-docs/CONTEXT-FORMAT.md +63 -63
- package/grill-with-docs/SKILL.md +33 -91
- package/grill-with-docs/references/session-playbook.md +97 -0
- package/harness-everything/SKILL.md +29 -128
- package/harness-everything/examples/README.md +9 -9
- package/harness-everything/examples/todo-workflow.md +22 -22
- package/harness-everything/references/skill-registry.md +39 -0
- package/harness-everything/references/triage-and-tiers.md +116 -0
- package/harness-everything/scripts/bootstrap.js +203 -140
- package/harness-everything/scripts/routing-keywords.json +320 -0
- package/harness-everything/scripts/self-heal.js +241 -189
- package/harness-everything/scripts/tier-router.js +334 -219
- package/harness-everything/scripts/verify-gate.js +100 -31
- package/hooks/hooks.json +155 -155
- package/hooks/scripts/atomic-commit-check.js +68 -68
- package/hooks/scripts/boundary-guard.js +55 -55
- package/hooks/scripts/context-compact.js +114 -114
- package/hooks/scripts/contract-test.js +79 -79
- package/hooks/scripts/depth-guard.js +65 -65
- package/hooks/scripts/lib/harness-state.js +139 -228
- package/hooks/scripts/lib/platforms/claude.js +72 -19
- package/hooks/scripts/lib/platforms/codex.js +24 -6
- package/hooks/scripts/lib/platforms/continue.js +23 -5
- package/hooks/scripts/lib/platforms/copilot.js +23 -5
- package/hooks/scripts/lib/platforms/cursor.js +23 -5
- package/hooks/scripts/lib/platforms/hermes.js +57 -57
- package/hooks/scripts/lib/platforms/index.js +17 -17
- package/hooks/scripts/lib/platforms/worktrees.js +20 -20
- package/hooks/scripts/reset-circuit-breaker.js +30 -30
- package/hooks/scripts/rule-of-3-tracker.js +124 -91
- package/hooks/scripts/rule-of-3.js +187 -176
- package/hooks/scripts/state-persist.js +99 -99
- package/hooks/scripts/stop-gate.js +80 -80
- package/hooks/scripts/subagent-scope-guard.js +88 -88
- package/improve-codebase-architecture/SKILL.md +31 -35
- package/improve-codebase-architecture/guides/DEEPENING.md +37 -37
- package/improve-codebase-architecture/guides/HTML-REPORT.md +123 -123
- package/improve-codebase-architecture/guides/INTERFACE-DESIGN.md +44 -44
- package/improve-codebase-architecture/guides/LANGUAGE.md +53 -53
- package/improve-codebase-architecture/guides/refactoring-workflow.md +59 -0
- package/install-cognitive-os/SKILL.md +23 -80
- package/install-cognitive-os/references/cognitive-loop.md +27 -0
- package/multi-agent-workspace/NOTICE-agency-agents.md +27 -0
- package/multi-agent-workspace/SKILL.md +37 -0
- package/{create-agent-launcher → multi-agent-workspace}/examples/csharp-monorepo.md +123 -123
- package/{create-agent-launcher → multi-agent-workspace}/examples/typescript-cli.md +126 -126
- package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-claude.md +77 -77
- package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-codex.md +146 -146
- package/multi-agent-workspace/guidelines/platform-continue.md +38 -0
- package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-copilot.md +74 -74
- package/multi-agent-workspace/guidelines/platform-cursor.md +40 -0
- package/multi-agent-workspace/guidelines/platform-hermes.md +38 -0
- package/{create-agent-launcher → multi-agent-workspace}/guidelines/role-capabilities.md +108 -108
- package/multi-agent-workspace/references/agency-agents.md +31 -0
- package/multi-agent-workspace/references/architecture-guide.md +32 -0
- package/multi-agent-workspace/references/orchestration.md +48 -0
- package/multi-agent-workspace/scripts/agency-catalog.js +190 -0
- package/multi-agent-workspace/scripts/index_memory.js +51 -0
- package/multi-agent-workspace/scripts/scaffold.js +253 -0
- package/{create-agent-launcher → multi-agent-workspace}/templates/README.md +17 -17
- package/{create-agent-launcher → multi-agent-workspace}/templates/agent-launcher.md +67 -67
- package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-csharp.md +55 -55
- package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-polyglot.md +61 -61
- package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-ts.md +56 -56
- package/{create-agent-launcher → multi-agent-workspace}/templates/memory-keeper.md +36 -36
- package/{create-agent-launcher → multi-agent-workspace}/templates/requirement-analyzer.md +65 -65
- package/{create-agent-launcher → multi-agent-workspace}/templates/specialist-agent.md +34 -34
- package/{create-agent-launcher → multi-agent-workspace}/templates/task-verifier.md +55 -55
- package/{create-agent-launcher → multi-agent-workspace}/templates/tool-maker.md +32 -32
- package/multi-agent-workspace/workflows/01-init.md +22 -0
- package/multi-agent-workspace/workflows/02-analysis.md +23 -0
- package/multi-agent-workspace/workflows/03-generation.md +27 -0
- package/multi-agent-workspace/workflows/04-launcher.md +16 -0
- package/opencode-plugin/README.md +94 -0
- package/opencode-plugin/hooks/circuit-breaker.js +121 -0
- package/opencode-plugin/hooks/compliance.js +128 -0
- package/opencode-plugin/hooks/post-edit.js +62 -0
- package/opencode-plugin/hooks/pre-complete.js +65 -0
- package/opencode-plugin/hooks/verify.js +140 -0
- package/opencode-plugin/plugin.json +17 -0
- package/opencode-plugin/test-hook-firing.js +198 -0
- package/package.json +50 -22
- package/references/definition-of-done.md +67 -0
- package/references/performance-checklist.md +153 -0
- package/references/platform-advisory-template.md +58 -0
- package/references/security-checklist.md +205 -0
- package/repo-docs/SKILL.md +38 -37
- package/repo-docs/references/process-guide.md +60 -0
- package/repo-docs/templates/agents-template.md +264 -264
- package/repo-docs/templates/knowledge-agents-template.md +50 -50
- package/repo-docs/templates/knowledge-readme-template.md +83 -83
- package/repo-docs/templates/manual-recon.md +117 -117
- package/repo-docs/templates/multi-skills-readme-template.md +72 -72
- package/repo-docs/templates/product-agents-template.md +78 -78
- package/repo-docs/templates/product-readme-template.md +95 -95
- package/repo-docs/templates/readme-template.md +136 -136
- package/repo-docs/templates/single-skill-readme-template.md +70 -70
- package/repo-docs/templates/skills-agents-template.md +60 -60
- package/rewrite-commits/SKILL.md +22 -17
- package/rewrite-commits/references/workflow.md +18 -0
- package/scripts/installer.js +546 -506
- package/scripts/lib/advisory-text.js +8 -4
- package/scripts/lib/claude-hooks.js +18 -5
- package/scripts/lib/gitignore.js +199 -80
- package/scripts/lib/manifest.js +68 -4
- package/scripts/lib/prompts.js +1 -1
- package/scripts/lib/skills.js +87 -1
- package/scripts/verify-install.js +147 -0
- package/security-review/SKILL.md +35 -496
- package/security-review/guides/OWASP-PATTERNS.md +31 -0
- package/security-review/guides/STRIDE-THREAT-MODEL.md +21 -0
- package/security-review/references/security-checklist.md +478 -0
- package/security-review/scripts/audit-secrets.js +84 -0
- package/self-evolve/SKILL.md +38 -45
- package/self-evolve/references/memory-resolution.md +58 -0
- package/self-evolve/scripts/persist-memory.js +139 -40
- package/self-evolve/scripts/register-dynamic-skill.js +251 -0
- package/self-evolve/scripts/self-regression.js +110 -113
- package/skill-creator/SKILL.md +34 -76
- package/skill-creator/references/authoring-workflow.md +14 -0
- package/skill-creator/references/dynamic-generation-contract.md +21 -0
- package/skill-creator/references/quality-checklist.md +15 -0
- package/skill-creator/references/quality-principles.md +81 -81
- package/skill-creator/references/testing-workflow.md +27 -32
- package/skill-style/SKILL.md +33 -39
- package/skill-style/references/style-guide.md +36 -0
- package/tdd/SKILL.md +34 -43
- package/tdd/guides/deep-modules.md +33 -33
- package/tdd/guides/interface-design.md +31 -31
- package/tdd/guides/mocking.md +59 -59
- package/tdd/guides/refactoring.md +10 -10
- package/tdd/guides/tests.md +61 -61
- package/tdd/references/core-discipline.md +49 -0
- package/to-spec/SKILL.md +42 -0
- package/to-spec/references/process.md +77 -0
- package/to-spec/scripts/check-project-docs.js +259 -0
- package/to-spec/templates/cli-reference.md +31 -0
- package/to-spec/templates/dev-doc.md +27 -0
- package/to-spec/templates/feature-spec.md +59 -0
- package/to-spec/templates/schema-doc.md +31 -0
- package/to-tickets/SKILL.md +42 -0
- package/to-tickets/references/publishing-and-templates.md +97 -0
- package/todo-driven-workflow/SKILL.md +27 -41
- package/todo-driven-workflow/references/execution-guide.md +27 -0
- package/using-git-worktrees/SKILL.md +29 -141
- package/using-git-worktrees/references/workflow-details.md +108 -0
- package/verification-loop/SKILL.md +29 -121
- package/verification-loop/references/verification-phases.md +116 -0
- package/verification-loop/templates/verification-report.template.md +15 -0
- package/verify-before-claim/SKILL.md +27 -70
- package/verify-before-claim/references/verification-guide.md +73 -0
- package/zoom-out/SKILL.md +28 -76
- package/zoom-out/references/circuit-breaker.md +66 -0
- package/zoom-out/templates/zoom-out-report.template.md +20 -0
- package/build-multi-agent-system/AGENTS.md +0 -50
- package/build-multi-agent-system/README.md +0 -63
- package/build-multi-agent-system/SKILL.md +0 -68
- package/create-agent-launcher/SKILL.md +0 -48
- package/create-agent-launcher/guidelines/platform-gemini.md +0 -101
- package/create-agent-launcher/workflows/01-init.md +0 -22
- package/create-agent-launcher/workflows/02-analysis.md +0 -26
- package/create-agent-launcher/workflows/03-generation.md +0 -29
- package/create-agent-launcher/workflows/04-launcher.md +0 -20
- package/docs/workflows/build-multi-agent-system.md +0 -62
- package/docs/workflows/create-agent-launcher.md +0 -62
- package/eval-framework/behavioral-test.js +0 -105
- package/eval-framework/mechanism-test.js +0 -251
- package/harness-everything/scripts/todo-cli.js +0 -157
- package/skill-style/STYLE.md +0 -37
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Post-Edit Verification Hook
|
|
4
|
+
*
|
|
5
|
+
* Enforces verification after file edits in opencode.
|
|
6
|
+
* This hook runs after every Edit or Write tool use and:
|
|
7
|
+
* 1. Records that an edit occurred
|
|
8
|
+
* 2. Blocks completion until verification runs
|
|
9
|
+
* 3. Logs compliance status
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
|
|
15
|
+
const STATE_DIR = path.join(process.env.HOME || process.env.USERPROFILE, '.harness-state');
|
|
16
|
+
const STATE_FILE = path.join(STATE_DIR, 'edit-state.json');
|
|
17
|
+
|
|
18
|
+
// Ensure state directory exists
|
|
19
|
+
if (!fs.existsSync(STATE_DIR)) {
|
|
20
|
+
fs.mkdirSync(STATE_DIR, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function loadState() {
|
|
24
|
+
try {
|
|
25
|
+
if (fs.existsSync(STATE_FILE)) {
|
|
26
|
+
return JSON.parse(fs.readFileSync(STATE_FILE, 'utf8'));
|
|
27
|
+
}
|
|
28
|
+
} catch (e) {
|
|
29
|
+
// Ignore parse errors
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
lastEditTime: null,
|
|
33
|
+
verificationPending: false,
|
|
34
|
+
editsSinceVerification: 0,
|
|
35
|
+
sessionStart: Date.now()
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function saveState(state) {
|
|
40
|
+
fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function main() {
|
|
44
|
+
const state = loadState();
|
|
45
|
+
|
|
46
|
+
// Record edit
|
|
47
|
+
state.lastEditTime = Date.now();
|
|
48
|
+
state.verificationPending = true;
|
|
49
|
+
state.editsSinceVerification++;
|
|
50
|
+
|
|
51
|
+
saveState(state);
|
|
52
|
+
|
|
53
|
+
// Output enforcement message
|
|
54
|
+
console.log(JSON.stringify({
|
|
55
|
+
hook: 'post-edit-verification',
|
|
56
|
+
action: 'record',
|
|
57
|
+
editsSinceVerification: state.editsSinceVerification,
|
|
58
|
+
message: `Edit recorded. ${state.editsSinceVerification} edit(s) since last verification. Run verification before completing.`
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
main();
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Pre-Complete Verification Gate
|
|
4
|
+
*
|
|
5
|
+
* Blocks completion until verification runs after edits.
|
|
6
|
+
* This hook runs before the agent claims work is done and:
|
|
7
|
+
* 1. Checks if verification is pending
|
|
8
|
+
* 2. Blocks completion if verification hasn't run
|
|
9
|
+
* 3. Allows completion if verification passed or no edits occurred
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
|
|
15
|
+
const STATE_DIR = path.join(process.env.HOME || process.env.USERPROFILE, '.harness-state');
|
|
16
|
+
const STATE_FILE = path.join(STATE_DIR, 'edit-state.json');
|
|
17
|
+
|
|
18
|
+
function loadState() {
|
|
19
|
+
try {
|
|
20
|
+
if (fs.existsSync(STATE_FILE)) {
|
|
21
|
+
return JSON.parse(fs.readFileSync(STATE_FILE, 'utf8'));
|
|
22
|
+
}
|
|
23
|
+
} catch (e) {
|
|
24
|
+
// Ignore parse errors
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
lastEditTime: null,
|
|
28
|
+
verificationPending: false,
|
|
29
|
+
editsSinceVerification: 0,
|
|
30
|
+
sessionStart: Date.now()
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function saveState(state) {
|
|
35
|
+
fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function main() {
|
|
39
|
+
const state = loadState();
|
|
40
|
+
|
|
41
|
+
// Check if verification is pending
|
|
42
|
+
if (state.verificationPending && state.editsSinceVerification > 0) {
|
|
43
|
+
// Block completion
|
|
44
|
+
console.log(JSON.stringify({
|
|
45
|
+
hook: 'pre-complete-verification',
|
|
46
|
+
action: 'block',
|
|
47
|
+
reason: 'verification_pending',
|
|
48
|
+
editsSinceVerification: state.editsSinceVerification,
|
|
49
|
+
message: `Cannot complete: ${state.editsSinceVerification} edit(s) since last verification. Run verification first.`,
|
|
50
|
+
instructions: 'Run verification: node .harness-src/opencode-plugin/hooks/verify.js'
|
|
51
|
+
}));
|
|
52
|
+
|
|
53
|
+
// Exit with non-zero to block
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Allow completion
|
|
58
|
+
console.log(JSON.stringify({
|
|
59
|
+
hook: 'pre-complete-verification',
|
|
60
|
+
action: 'allow',
|
|
61
|
+
message: 'Verification complete or no edits pending.'
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
main();
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Verification Runner Hook
|
|
4
|
+
*
|
|
5
|
+
* Runs verification commands and updates state.
|
|
6
|
+
* This hook runs available verification commands (npm test, lint, build) and:
|
|
7
|
+
* 1. Detects available scripts from package.json
|
|
8
|
+
* 2. Executes only available verification commands
|
|
9
|
+
* 3. Updates state to reflect verification status
|
|
10
|
+
* 4. Logs verification results
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const fs = require('fs');
|
|
14
|
+
const path = require('path');
|
|
15
|
+
const { execSync } = require('child_process');
|
|
16
|
+
|
|
17
|
+
const STATE_DIR = path.join(process.env.HOME || process.env.USERPROFILE, '.harness-state');
|
|
18
|
+
const STATE_FILE = path.join(STATE_DIR, 'edit-state.json');
|
|
19
|
+
|
|
20
|
+
// Ensure state directory exists
|
|
21
|
+
if (!fs.existsSync(STATE_DIR)) {
|
|
22
|
+
fs.mkdirSync(STATE_DIR, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function loadState() {
|
|
26
|
+
try {
|
|
27
|
+
if (fs.existsSync(STATE_FILE)) {
|
|
28
|
+
return JSON.parse(fs.readFileSync(STATE_FILE, 'utf8'));
|
|
29
|
+
}
|
|
30
|
+
} catch (e) {
|
|
31
|
+
// Ignore parse errors
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
lastEditTime: null,
|
|
35
|
+
verificationPending: false,
|
|
36
|
+
editsSinceVerification: 0,
|
|
37
|
+
sessionStart: Date.now()
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function saveState(state) {
|
|
42
|
+
fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function getAvailableScripts() {
|
|
46
|
+
const pkgPath = path.join(process.cwd(), 'package.json');
|
|
47
|
+
if (!fs.existsSync(pkgPath)) {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
52
|
+
return pkg.scripts || {};
|
|
53
|
+
} catch {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function runVerification(command) {
|
|
59
|
+
try {
|
|
60
|
+
execSync(command, {
|
|
61
|
+
stdio: 'pipe',
|
|
62
|
+
timeout: 60000 // 60 second timeout
|
|
63
|
+
});
|
|
64
|
+
return { success: true, command };
|
|
65
|
+
} catch (e) {
|
|
66
|
+
return {
|
|
67
|
+
success: false,
|
|
68
|
+
command,
|
|
69
|
+
error: e.message.slice(0, 200)
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function main() {
|
|
75
|
+
const state = loadState();
|
|
76
|
+
|
|
77
|
+
// Get available scripts from package.json
|
|
78
|
+
const scripts = getAvailableScripts();
|
|
79
|
+
|
|
80
|
+
// Verification commands to try (only if script exists)
|
|
81
|
+
const possibleCommands = [
|
|
82
|
+
{ cmd: 'npm test', script: 'test' },
|
|
83
|
+
{ cmd: 'npm run lint', script: 'lint' },
|
|
84
|
+
{ cmd: 'npm run build', script: 'build' }
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
const commands = possibleCommands
|
|
88
|
+
.filter(c => scripts[c.script])
|
|
89
|
+
.map(c => c.cmd);
|
|
90
|
+
|
|
91
|
+
// If no verification scripts available, check if we should skip
|
|
92
|
+
if (commands.length === 0) {
|
|
93
|
+
// No npm verification available - check if this is a non-code task
|
|
94
|
+
// Allow completion without npm verification for doc-only tasks
|
|
95
|
+
console.log(JSON.stringify({
|
|
96
|
+
hook: 'verification-runner',
|
|
97
|
+
action: 'verify',
|
|
98
|
+
allPassed: true,
|
|
99
|
+
results: [],
|
|
100
|
+
message: 'No npm verification scripts available. Skipping npm verification (non-code task assumed).',
|
|
101
|
+
skipped: true
|
|
102
|
+
}));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const results = [];
|
|
107
|
+
let allPassed = true;
|
|
108
|
+
|
|
109
|
+
for (const cmd of commands) {
|
|
110
|
+
const result = runVerification(cmd);
|
|
111
|
+
results.push(result);
|
|
112
|
+
if (!result.success) {
|
|
113
|
+
allPassed = false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Update state
|
|
118
|
+
state.verificationPending = !allPassed;
|
|
119
|
+
state.editsSinceVerification = allPassed ? 0 : state.editsSinceVerification;
|
|
120
|
+
state.lastVerificationTime = Date.now();
|
|
121
|
+
state.verificationResults = results;
|
|
122
|
+
|
|
123
|
+
saveState(state);
|
|
124
|
+
|
|
125
|
+
// Output results
|
|
126
|
+
console.log(JSON.stringify({
|
|
127
|
+
hook: 'verification-runner',
|
|
128
|
+
action: 'verify',
|
|
129
|
+
allPassed,
|
|
130
|
+
results: results.map(r => ({
|
|
131
|
+
command: r.command,
|
|
132
|
+
success: r.success
|
|
133
|
+
})),
|
|
134
|
+
message: allPassed
|
|
135
|
+
? 'All available verification passed. You can now complete.'
|
|
136
|
+
: 'Some verification failed. Fix issues before completing.'
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
main();
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "harness-enforcement",
|
|
3
|
+
"description": "Enforcement plugin for Harness skills - adds hard gates for verification and circuit breaker in opencode",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"author": "Miya Daniel",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"hooks": {
|
|
8
|
+
"postEdit": "hooks/post-edit.js",
|
|
9
|
+
"preComplete": "hooks/pre-complete.js"
|
|
10
|
+
},
|
|
11
|
+
"config": {
|
|
12
|
+
"verificationRequired": true,
|
|
13
|
+
"circuitBreakerEnabled": true,
|
|
14
|
+
"maxRetries": 3,
|
|
15
|
+
"verificationCommands": ["npm test", "npm run lint", "npm run build"]
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Hook Firing Verification Test
|
|
4
|
+
*
|
|
5
|
+
* Tests that each opencode plugin hook fires correctly by:
|
|
6
|
+
* 1. Directly invoking each hook with test inputs
|
|
7
|
+
* 2. Verifying expected outputs and state changes
|
|
8
|
+
* 3. Reporting hook fire rate
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
const { spawn } = require('child_process');
|
|
14
|
+
|
|
15
|
+
const HOOKS_DIR = path.join(__dirname, 'hooks');
|
|
16
|
+
const STATE_DIR = path.join(process.env.HOME || process.env.USERPROFILE, '.harness-state');
|
|
17
|
+
|
|
18
|
+
const HOOKS = [
|
|
19
|
+
{ name: 'post-edit', file: 'post-edit.js', input: null },
|
|
20
|
+
{ name: 'pre-complete', file: 'pre-complete.js', input: null },
|
|
21
|
+
{ name: 'circuit-breaker', file: 'circuit-breaker.js', input: 'Error: test failure signature' },
|
|
22
|
+
{ name: 'compliance', file: 'compliance.js', input: JSON.stringify({ hook: 'post-edit-verification' }) },
|
|
23
|
+
{ name: 'verify', file: 'verify.js', input: null }
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
function cleanState() {
|
|
27
|
+
const files = ['edit-state.json', 'circuit-breaker.json', 'compliance.json'];
|
|
28
|
+
for (const f of files) {
|
|
29
|
+
const p = path.join(STATE_DIR, f);
|
|
30
|
+
if (fs.existsSync(p)) fs.unlinkSync(p);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function runHook(hook, testInput) {
|
|
35
|
+
return new Promise((resolve) => {
|
|
36
|
+
const hookPath = path.join(HOOKS_DIR, hook.file);
|
|
37
|
+
const child = spawn('node', [hookPath], {
|
|
38
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
39
|
+
env: { ...process.env, NODE_ENV: 'test' }
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
let stdout = '';
|
|
43
|
+
let stderr = '';
|
|
44
|
+
|
|
45
|
+
if (testInput) {
|
|
46
|
+
child.stdin.write(testInput);
|
|
47
|
+
child.stdin.end();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
child.stdout.on('data', (data) => stdout += data);
|
|
51
|
+
child.stderr.on('data', (data) => stderr += data);
|
|
52
|
+
|
|
53
|
+
child.on('close', (code) => {
|
|
54
|
+
resolve({ code, stdout: stdout.trim(), stderr: stderr.trim() });
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
child.on('error', (err) => {
|
|
58
|
+
resolve({ code: -1, stdout: '', stderr: err.message });
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function parseOutput(output) {
|
|
64
|
+
try {
|
|
65
|
+
return JSON.parse(output);
|
|
66
|
+
} catch {
|
|
67
|
+
return { raw: output };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function testHookFiring() {
|
|
72
|
+
console.log('=== Hook Firing Verification Test ===\n');
|
|
73
|
+
|
|
74
|
+
// Clean state before each test
|
|
75
|
+
cleanState();
|
|
76
|
+
|
|
77
|
+
let passed = 0;
|
|
78
|
+
let total = 0;
|
|
79
|
+
|
|
80
|
+
for (const hook of HOOKS) {
|
|
81
|
+
total++;
|
|
82
|
+
console.log(`Testing ${hook.name}...`);
|
|
83
|
+
|
|
84
|
+
const result = await runHook(hook, hook.input);
|
|
85
|
+
const parsed = parseOutput(result.stdout);
|
|
86
|
+
|
|
87
|
+
const success = result.code === 0 || result.code === 1 || result.code === 2;
|
|
88
|
+
const hasHookField = parsed.hook !== undefined;
|
|
89
|
+
|
|
90
|
+
if (success && hasHookField) {
|
|
91
|
+
console.log(` ✅ PASS - Hook fired (exit=${result.code}, hook=${parsed.hook})`);
|
|
92
|
+
passed++;
|
|
93
|
+
} else {
|
|
94
|
+
console.log(` ❌ FAIL - Hook did not fire properly`);
|
|
95
|
+
console.log(` Exit code: ${result.code}`);
|
|
96
|
+
console.log(` Stdout: ${result.stdout}`);
|
|
97
|
+
console.log(` Stderr: ${result.stderr}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Test circuit breaker trip sequence
|
|
102
|
+
console.log('\n--- Circuit Breaker Sequence Test ---');
|
|
103
|
+
cleanState();
|
|
104
|
+
|
|
105
|
+
let cbTrips = 0;
|
|
106
|
+
for (let i = 1; i <= 4; i++) {
|
|
107
|
+
const result = await runHook(HOOKS[2], 'Error: repeated failure signature');
|
|
108
|
+
const parsed = parseOutput(result.stdout);
|
|
109
|
+
|
|
110
|
+
if (result.code === 2) {
|
|
111
|
+
cbTrips++;
|
|
112
|
+
console.log(` Trip ${i}: ${parsed.action} (${parsed.reason || 'N/A'}) count=${parsed.count}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Now simulate reflection and test hard lock
|
|
117
|
+
const breakerFile = path.join(STATE_DIR, 'circuit-breaker.json');
|
|
118
|
+
if (fs.existsSync(breakerFile)) {
|
|
119
|
+
const breakerState = JSON.parse(fs.readFileSync(breakerFile, 'utf8'));
|
|
120
|
+
// Set lastReflection to simulate zoom-out reflection
|
|
121
|
+
breakerState.lastReflection = Date.now();
|
|
122
|
+
fs.writeFileSync(breakerFile, JSON.stringify(breakerState, null, 2));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// 5th trip should hard lock
|
|
126
|
+
const hardLockResult = await runHook(HOOKS[2], 'Error: repeated failure signature');
|
|
127
|
+
const hardLockParsed = parseOutput(hardLockResult.stdout);
|
|
128
|
+
console.log(` Trip 5 (after reflection): ${hardLockParsed.action} (${hardLockParsed.reason || 'N/A'})`);
|
|
129
|
+
|
|
130
|
+
if (hardLockResult.code === 2 && hardLockParsed.action === 'hard_lock') {
|
|
131
|
+
console.log(' ✅ Circuit breaker hard-locks after reflection');
|
|
132
|
+
passed++;
|
|
133
|
+
} else {
|
|
134
|
+
console.log(' ❌ Circuit breaker did not hard-lock after reflection');
|
|
135
|
+
}
|
|
136
|
+
total++;
|
|
137
|
+
|
|
138
|
+
// Test compliance aggregation
|
|
139
|
+
console.log('\n--- Compliance Aggregation Test ---');
|
|
140
|
+
cleanState();
|
|
141
|
+
|
|
142
|
+
// Simulate a few events
|
|
143
|
+
await runHook(HOOKS[3], JSON.stringify({ hook: 'post-edit-verification' }));
|
|
144
|
+
await runHook(HOOKS[3], JSON.stringify({ hook: 'pre-complete-verification', action: 'block' }));
|
|
145
|
+
await runHook(HOOKS[3], JSON.stringify({ hook: 'verification-runner', allPassed: true }));
|
|
146
|
+
|
|
147
|
+
const compResult = await runHook(HOOKS[3], JSON.stringify({ hook: 'circuit-breaker', action: 'force_reflection' }));
|
|
148
|
+
const compParsed = parseOutput(compResult.stdout);
|
|
149
|
+
|
|
150
|
+
if (compParsed.metrics && compParsed.metrics.totalEdits > 0) {
|
|
151
|
+
console.log(' ✅ Compliance tracking works');
|
|
152
|
+
console.log(` ${compParsed.message}`);
|
|
153
|
+
passed++;
|
|
154
|
+
} else {
|
|
155
|
+
console.log(' ❌ Compliance tracking failed');
|
|
156
|
+
console.log(` Output: ${compResult.stdout}`);
|
|
157
|
+
}
|
|
158
|
+
total++;
|
|
159
|
+
|
|
160
|
+
// Test verification runner
|
|
161
|
+
console.log('\n--- Verification Runner Test ---');
|
|
162
|
+
cleanState();
|
|
163
|
+
// First do an edit to set pending state
|
|
164
|
+
await runHook(HOOKS[0]);
|
|
165
|
+
// Then run verification
|
|
166
|
+
const verifyResult = await runHook(HOOKS[4]);
|
|
167
|
+
const verifyParsed = parseOutput(verifyResult.stdout);
|
|
168
|
+
|
|
169
|
+
if (verifyParsed.hook === 'verification-runner') {
|
|
170
|
+
console.log(' ✅ Verification runner fires');
|
|
171
|
+
console.log(` Result: ${verifyParsed.message}`);
|
|
172
|
+
passed++;
|
|
173
|
+
} else {
|
|
174
|
+
console.log(' ❌ Verification runner failed');
|
|
175
|
+
console.log(` Output: ${verifyResult.stdout}`);
|
|
176
|
+
}
|
|
177
|
+
total++;
|
|
178
|
+
|
|
179
|
+
// Summary
|
|
180
|
+
const rate = (passed / total * 100).toFixed(1);
|
|
181
|
+
console.log(`\n=== SUMMARY ===`);
|
|
182
|
+
console.log(`Hooks tested: ${total}`);
|
|
183
|
+
console.log(`Passed: ${passed}`);
|
|
184
|
+
console.log(`Fire rate: ${rate}%`);
|
|
185
|
+
|
|
186
|
+
if (rate >= 95) {
|
|
187
|
+
console.log('\n🎉 HOOK FIRING VERIFICATION PASSED (≥95%)');
|
|
188
|
+
process.exit(0);
|
|
189
|
+
} else {
|
|
190
|
+
console.log('\n❌ HOOK FIRING VERIFICATION FAILED (<95%)');
|
|
191
|
+
process.exit(1);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
testHookFiring().catch(err => {
|
|
196
|
+
console.error('Test error:', err);
|
|
197
|
+
process.exit(1);
|
|
198
|
+
});
|
package/package.json
CHANGED
|
@@ -1,22 +1,50 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "harness-everything",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Harness OS: An Orchestrated Agent Operating System for AI-driven Development",
|
|
5
|
-
"main": "harness-everything/scripts/bootstrap.js",
|
|
6
|
-
"bin": {
|
|
7
|
-
"harness": "./bin/cli.js"
|
|
8
|
-
},
|
|
9
|
-
"scripts": {
|
|
10
|
-
"test": "node self-evolve/scripts/self-regression.js",
|
|
11
|
-
"self-regression": "node self-evolve/scripts/self-regression.js",
|
|
12
|
-
"test:mechanism": "node
|
|
13
|
-
"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "harness-everything",
|
|
3
|
+
"version": "0.3.6",
|
|
4
|
+
"description": "Harness OS: An Orchestrated Agent Operating System for AI-driven Development",
|
|
5
|
+
"main": "harness-everything/scripts/bootstrap.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"harness": "./bin/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "node self-evolve/scripts/self-regression.js",
|
|
11
|
+
"self-regression": "node self-evolve/scripts/self-regression.js",
|
|
12
|
+
"test:mechanism": "node ci/mechanism-test.js",
|
|
13
|
+
"test:consistency": "node ci/consistency-check.js",
|
|
14
|
+
"test:references": "node ci/reference-check.js",
|
|
15
|
+
"test:release": "node ci/release-consistency-check.js --tag v0.3.3-beta",
|
|
16
|
+
"test:install": "node scripts/verify-install.js",
|
|
17
|
+
"test:collision": "node ci/description-collision.js",
|
|
18
|
+
"test:routing:skills": "node ci/skill-routing-check.js",
|
|
19
|
+
"test:routing": "node ci/routing-check.js",
|
|
20
|
+
"benchmark:scaffold": "node benchmarks/run.js scaffold",
|
|
21
|
+
"benchmark:status": "node benchmarks/run.js status",
|
|
22
|
+
"eval:behavioral": "node behavioral-evals/run.js run",
|
|
23
|
+
"eval:behavioral:validate": "node behavioral-evals/run.js validate",
|
|
24
|
+
"eval:behavioral:plugin": "node behavioral-evals/run-with-plugin.js run",
|
|
25
|
+
"test:ab": "node ci/ab-test-harness.js validate",
|
|
26
|
+
"test:ab:run": "node ci/ab-test-harness.js run",
|
|
27
|
+
"harness:reset": "node hooks/scripts/reset-circuit-breaker.js",
|
|
28
|
+
"prepare": "husky install",
|
|
29
|
+
"commitlint": "commitlint --edit"
|
|
30
|
+
},
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=18"
|
|
33
|
+
},
|
|
34
|
+
"author": "Miya Daniel",
|
|
35
|
+
"license": "Apache-2.0",
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "git+https://github.com/dyphn1/Harness-everything.git"
|
|
39
|
+
},
|
|
40
|
+
"homepage": "https://github.com/dyphn1/Harness-everything#readme",
|
|
41
|
+
"bugs": {
|
|
42
|
+
"url": "https://github.com/dyphn1/Harness-everything/issues"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"js-yaml": "^5.4.1",
|
|
46
|
+
"@commitlint/cli": "^19.0.0",
|
|
47
|
+
"@commitlint/config-conventional": "^19.0.0",
|
|
48
|
+
"husky": "^9.0.0"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Definition of Done
|
|
2
|
+
|
|
3
|
+
A standing, project-wide bar that every change must clear before it counts as done. Unlike acceptance criteria, which vary per task and answer "did we build the right thing?", the Definition of Done is the same every time and answers "is this finished to our standard?". Use it as the final gate in `planning-and-task-breakdown`, `incremental-implementation`, and `shipping-and-launch`.
|
|
4
|
+
|
|
5
|
+
## Definition of Done vs. Acceptance Criteria
|
|
6
|
+
|
|
7
|
+
| | Acceptance Criteria | Definition of Done |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| Scope | Specific to one task or spec | Applies to every increment |
|
|
10
|
+
| Changes | Different for each item | Fixed and reused |
|
|
11
|
+
| Answers | "Did we build *this thing*?" | "Is it *ready*?" |
|
|
12
|
+
| Owner | Defined when planning the task | Defined once for the project |
|
|
13
|
+
| Example | "User can reset password via email link" | "Tests pass, no regressions, docs updated" |
|
|
14
|
+
|
|
15
|
+
The two are complementary. A task is done only when **its** acceptance criteria are met **and** the standing Definition of Done is satisfied. Skipping either leaves work that looks finished but is not.
|
|
16
|
+
|
|
17
|
+
## The Standing Checklist
|
|
18
|
+
|
|
19
|
+
Apply this to every change before declaring it done.
|
|
20
|
+
|
|
21
|
+
### Correctness
|
|
22
|
+
- [ ] All acceptance criteria for the task are met
|
|
23
|
+
- [ ] Code runs and behaves as intended, verified at runtime, not just compiled or typechecked
|
|
24
|
+
- [ ] New behavior is covered by tests that fail without the change and pass with it
|
|
25
|
+
- [ ] Existing tests still pass; no regressions introduced
|
|
26
|
+
- [ ] Edge cases and error paths are handled, not just the happy path
|
|
27
|
+
|
|
28
|
+
### Quality
|
|
29
|
+
- [ ] Code reveals intent through naming and structure; no comments needed to explain *what* it does
|
|
30
|
+
- [ ] No duplicated business logic
|
|
31
|
+
- [ ] No dead code, debug output, or commented-out blocks left behind
|
|
32
|
+
- [ ] Changes are scoped to the task; no unrelated refactors snuck in
|
|
33
|
+
- [ ] Linting and formatting pass
|
|
34
|
+
|
|
35
|
+
The depth behind these items lives in `code-review-and-quality` (the five-axis review) and `code-simplification` (reducing complexity without changing behavior).
|
|
36
|
+
|
|
37
|
+
### Integration
|
|
38
|
+
- [ ] Change works with the rest of the system, not just in isolation
|
|
39
|
+
- [ ] Database migrations, config changes, and feature flags are accounted for
|
|
40
|
+
- [ ] Backward compatibility considered for any public interface or API change
|
|
41
|
+
|
|
42
|
+
### Documentation
|
|
43
|
+
- [ ] Public interfaces, APIs, and user-facing behavior are documented
|
|
44
|
+
- [ ] Architectural decisions worth preserving are recorded (see `documentation-and-adrs`)
|
|
45
|
+
- [ ] Documentation describes the current state in timeless language, not the change history
|
|
46
|
+
|
|
47
|
+
### Ship-readiness
|
|
48
|
+
- [ ] Security implications reviewed for any untrusted input, auth, or data handling (see `security-and-hardening`)
|
|
49
|
+
- [ ] Observability in place for new critical paths (logs, metrics, traces) (see `observability-and-instrumentation`)
|
|
50
|
+
- [ ] Rollback path exists for anything risky (see `shipping-and-launch`)
|
|
51
|
+
- [ ] The human has reviewed and approved before merge or deploy
|
|
52
|
+
|
|
53
|
+
## How to Apply
|
|
54
|
+
|
|
55
|
+
- **Per task**: confirm the Correctness and Quality sections before checking the task off.
|
|
56
|
+
- **Per feature**: confirm Integration and Documentation before considering the feature complete.
|
|
57
|
+
- **Per release**: the full checklist is the floor; `shipping-and-launch` adds the deploy-specific gates on top.
|
|
58
|
+
|
|
59
|
+
Tailor the list to the project once, then reuse it unchanged. A Definition of Done that is renegotiated every sprint is not a Definition of Done.
|
|
60
|
+
|
|
61
|
+
## Red Flags
|
|
62
|
+
|
|
63
|
+
- "It's done, I just haven't run it yet": unverified work is not done.
|
|
64
|
+
- "Tests pass" used as a synonym for done while docs, regressions, or runtime verification are skipped.
|
|
65
|
+
- A different bar applied depending on deadline pressure.
|
|
66
|
+
- Acceptance criteria treated as the whole bar, with no standing quality floor.
|
|
67
|
+
- "Done" declared before human review on changes that need it.
|