harness-everything 0.3.6 → 0.4.1
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/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +8 -7
- package/.github/workflows/behavioral-evals.yml +3 -3
- package/.github/workflows/ci.yml +49 -28
- package/.github/workflows/release.yml +52 -27
- package/.nvmrc +1 -0
- package/.releaserc.json +113 -0
- package/AGENTS.md +44 -24
- package/BENCHMARK_SOP.md +38 -18
- package/CHANGELOG.md +196 -3
- package/CONTRIBUTING.md +37 -9
- package/Dockerfile +1 -1
- package/PRIVACY.md +25 -0
- package/README.md +126 -91
- package/RELEASING.md +93 -0
- package/SUPPORT.md +27 -0
- package/TERMS.md +21 -0
- package/VERIFICATION.md +192 -284
- package/behavioral-evals/README.md +21 -0
- package/behavioral-evals/case-validator.js +194 -0
- package/behavioral-evals/cases/baseline-environment-detection.yaml +21 -0
- package/behavioral-evals/cases/baseline-eval-harness.yaml +27 -0
- package/behavioral-evals/cases/baseline-fable-discipline.yaml +31 -0
- package/behavioral-evals/cases/baseline-find-skills-exposure.yaml +49 -0
- package/behavioral-evals/cases/baseline-find-skills.yaml +21 -0
- package/behavioral-evals/cases/baseline-git-commit.yaml +2 -2
- package/behavioral-evals/cases/baseline-install-cognitive-os.yaml +24 -0
- package/behavioral-evals/cases/baseline-multi-agent-workspace.yaml +28 -0
- package/behavioral-evals/cases/baseline-rewrite-commits.yaml +34 -0
- package/behavioral-evals/cases/baseline-self-evolve.yaml +31 -0
- package/behavioral-evals/cases/baseline-skill-creator.yaml +20 -0
- package/behavioral-evals/cases/baseline-skill-style.yaml +21 -0
- package/behavioral-evals/cases/baseline-to-spec.yaml +34 -0
- package/behavioral-evals/cases/baseline-to-tickets.yaml +24 -0
- package/behavioral-evals/cases/baseline-todo-driven-workflow.yaml +32 -0
- package/behavioral-evals/cases/baseline-using-git-worktrees.yaml +15 -0
- package/behavioral-evals/cases/breaker-zoom-out-after-3.yaml +2 -2
- package/behavioral-evals/cases/pressure-complexity-skip.yaml +2 -2
- package/behavioral-evals/cases/pressure-scope-bypass.yaml +7 -2
- package/behavioral-evals/cases/pressure-sunk-cost-retry.yaml +7 -4
- package/behavioral-evals/cases/scope-discipline.yaml +2 -1
- package/behavioral-evals/cases/verify-before-done.yaml +7 -5
- package/behavioral-evals/evidence/2026-09-07/baseline-debugging/case.yaml +31 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-debugging/historical-case.yaml +31 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-debugging/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-debugging/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-performance/case.yaml +34 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-performance/historical-case.yaml +34 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-performance/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-performance/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-security-review/case.yaml +28 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-security-review/historical-case.yaml +28 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-security-review/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-security-review/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/case.yaml +33 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/historical-case.yaml +33 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/case.yaml +28 -0
- package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/historical-case.yaml +18 -0
- package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/provenance.json +30 -0
- package/behavioral-evals/evidence/2026-09-07/live-run-blocker.md +16 -0
- package/behavioral-evals/evidence/2026-09-07/manifest.json +88 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/case.yaml +33 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/historical-case.yaml +28 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/provenance.json +30 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/case.yaml +50 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/historical-case.yaml +50 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/case.yaml +35 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/historical-case.yaml +35 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/case.yaml +43 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/historical-case.yaml +43 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/result.sanitized.json +24 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/case.yaml +43 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/historical-case.yaml +43 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/case.yaml +43 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/historical-case.yaml +43 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/result.sanitized.json +24 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/case.yaml +50 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/historical-case.yaml +47 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/result.sanitized.json +24 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/case.yaml +50 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/historical-case.yaml +47 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/case.yaml +50 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/historical-case.yaml +47 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/result.sanitized.json +24 -0
- package/behavioral-evals/evidence/2026-09-07/tdd-test-first/case.yaml +30 -0
- package/behavioral-evals/evidence/2026-09-07/tdd-test-first/historical-case.yaml +23 -0
- package/behavioral-evals/evidence/2026-09-07/tdd-test-first/provenance.json +30 -0
- package/behavioral-evals/evidence/2026-09-07/triage-matrix.json +426 -0
- package/behavioral-evals/evidence/2026-09-07/triage-matrix.md +24 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/case.yaml +19 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/historical-case.yaml +18 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/provenance.json +30 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done/case.yaml +33 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done/historical-case.yaml +31 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/case.yaml +33 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/historical-case.yaml +31 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/case.yaml +33 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/historical-case.yaml +31 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/result.sanitized.json +20 -0
- package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/case.yaml +33 -0
- package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/historical-case.yaml +33 -0
- package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/provenance.json +42 -0
- package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/result.sanitized.json +480 -0
- package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/transcript.sanitized.jsonl +95 -0
- package/behavioral-evals/evidence-tool.js +443 -0
- package/behavioral-evals/fixtures/claude-denied.jsonl +3 -0
- package/behavioral-evals/fixtures/claude-legacy.json +1 -0
- package/behavioral-evals/fixtures/claude-oral-only.jsonl +2 -0
- package/behavioral-evals/fixtures/claude-success.jsonl +5 -0
- package/behavioral-evals/fixtures/claude-truncated.jsonl +3 -0
- package/behavioral-evals/fixtures/opencode-success.jsonl +6 -0
- package/behavioral-evals/results/2026-08-31-baseline-add-feature.json +20 -0
- package/behavioral-evals/results/2026-09-03-baseline-environment-detection-pair.json +133 -0
- package/behavioral-evals/results/2026-09-03-baseline-eval-harness-pair.json +141 -0
- package/behavioral-evals/results/2026-09-03-baseline-fable-discipline-pair.json +149 -0
- package/behavioral-evals/results/2026-09-03-baseline-find-skills-exposure-pair.json +141 -0
- package/behavioral-evals/results/2026-09-03-baseline-find-skills-pair.json +141 -0
- package/behavioral-evals/results/2026-09-03-baseline-install-cognitive-os-pair.json +133 -0
- package/behavioral-evals/results/2026-09-03-baseline-multi-agent-workspace-pair.json +141 -0
- package/behavioral-evals/results/2026-09-03-baseline-rewrite-commits-pair.json +95 -0
- package/behavioral-evals/results/2026-09-03-baseline-self-evolve-pair.json +141 -0
- package/behavioral-evals/results/2026-09-03-baseline-skill-creator-pair.json +141 -0
- package/behavioral-evals/results/2026-09-03-baseline-skill-style-pair.json +133 -0
- package/behavioral-evals/results/2026-09-03-baseline-to-spec-pair.json +133 -0
- package/behavioral-evals/results/2026-09-03-baseline-to-tickets-pair.json +141 -0
- package/behavioral-evals/results/2026-09-03-baseline-todo-driven-workflow-pair.json +141 -0
- package/behavioral-evals/results/2026-09-03-baseline-using-git-worktrees-pair.json +133 -0
- package/behavioral-evals/results/2026-09-03-summary-both.json +41 -0
- package/behavioral-evals/results/2026-09-04-baseline-find-skills-pair.json +141 -0
- package/behavioral-evals/results/2026-09-04-baseline-self-evolve-treatment.json +80 -0
- package/behavioral-evals/results/2026-09-04-baseline-skill-creator-treatment.json +80 -0
- package/behavioral-evals/results/2026-09-04-summary-both.json +41 -0
- package/behavioral-evals/run-with-plugin.js +15 -31
- package/behavioral-evals/run.js +446 -105
- package/behavioral-evals/transcript-parser.js +591 -0
- package/bin/cli.js +24 -12
- package/ci/ab-test-cases/grill-me-adversarial.yaml +14 -4
- package/ci/ab-test-cases/tdd-test-first.yaml +13 -6
- package/ci/ab-test-cases/verification-loop-gates.yaml +20 -7
- package/ci/ab-test-cases/verify-before-claim-cites.yaml +7 -6
- package/ci/ab-test-harness.js +113 -38
- package/ci/action-gate-platform-doc.test.js +31 -0
- package/ci/action-gate.test.js +260 -0
- package/ci/cases/case2.json +2 -2
- package/ci/consistency-check.js +51 -5
- package/ci/description-collision.js +15 -6
- package/ci/disclosure-check.js +225 -0
- package/ci/doc-capability-consistency.test.js +180 -0
- package/ci/fixtures/phase4/parallel-disjoint.stages.json +32 -0
- package/ci/fixtures/phase4/parallel-read-only.stages.json +32 -0
- package/ci/installer-roundtrip.test.js +159 -0
- package/ci/invariant-routing.test.js +74 -0
- package/ci/issue99-runtime.test.js +218 -0
- package/ci/mechanism-2aa-codex-action-gate-policy.test.js +117 -0
- package/ci/mechanism-2ab-openai-plugin-sync-integrity.test.js +80 -0
- package/ci/mechanism-2j-behavioral-runner.test.js +43 -1
- package/ci/mechanism-2k-reference-check.test.js +57 -2
- package/ci/mechanism-2l-multi-agent-workspace.test.js +202 -6
- package/ci/mechanism-2m-self-repo-guard.test.js +65 -0
- package/ci/mechanism-2n-opencode-plugin.test.js +461 -0
- package/ci/mechanism-2o-state-home-isolation.test.js +183 -0
- package/ci/mechanism-2p-installer-links.test.js +183 -0
- package/ci/mechanism-2q-installer-global-shared-store.test.js +132 -0
- package/ci/mechanism-2r-uninstall-flags.test.js +148 -0
- package/ci/mechanism-2s-tdd-quality.test.js +203 -0
- package/ci/mechanism-2t-disclosure.test.js +90 -0
- package/ci/mechanism-2t-evidence-triage.test.js +200 -0
- package/ci/mechanism-2t-issue-20.test.js +75 -0
- package/ci/mechanism-2t-platform-skill-targets.test.js +164 -0
- package/ci/mechanism-2t-transcript-parser.test.js +179 -0
- package/ci/mechanism-2t-workspace-identity.test.js +200 -0
- package/ci/mechanism-2u-issue-42-regressions.test.js +239 -0
- package/ci/mechanism-2u-issue-44.test.js +35 -0
- package/ci/mechanism-2v-verifier-boundaries.test.js +138 -0
- package/ci/mechanism-2w-platform-compatibility.test.js +148 -0
- package/ci/mechanism-2x-release-automation.test.js +157 -0
- package/ci/mechanism-2x-release-commit-message.test.js +66 -0
- package/ci/mechanism-2y-release-tooling-compat.test.js +47 -0
- package/ci/mechanism-2z-claude-plugin-manifest.test.js +29 -0
- package/ci/mutation-check.js +53 -0
- package/ci/mutation-loader.js +57 -0
- package/ci/negative-controls.js +76 -46
- package/ci/openai-plugin-package.test.js +182 -0
- package/ci/openai-plugin-runtime.test.js +175 -0
- package/ci/openai-plugin-submission.test.js +101 -0
- package/ci/phase4-ensemble-memory.test.js +307 -0
- package/ci/reference-check.js +73 -25
- package/ci/release-consistency-check.js +24 -1
- package/ci/repository-contract.test.js +17 -0
- package/ci/router-phase2-safety.test.js +81 -0
- package/ci/router-workflow-plan.test.js +264 -0
- package/ci/routing-check.js +6 -5
- package/ci/runner.js +6 -5
- package/ci/skill-routing-check.js +48 -11
- package/ci/test-behavioral-case-validation.js +62 -0
- package/ci/test-helper.js +10 -0
- package/ci/workflow-plan-consumers-edge.test.js +72 -0
- package/ci/workflow-plan-consumers.test.js +276 -0
- package/docs/architecture.md +137 -57
- package/docs/audit.md +22 -20
- package/docs/codex-action-gate.md +90 -0
- package/docs/issue-20-rollup.md +47 -0
- package/docs/mechanism-first-skill-mesh.md +22 -20
- package/docs/openai-plugin.md +118 -0
- package/docs/philosophy.md +28 -17
- package/docs/platform-capabilities.md +73 -0
- package/docs/platform-compatibility.json +270 -0
- package/docs/reflection.md +37 -22
- package/docs/release-evidence.md +27 -0
- package/docs/repository-contract.md +27 -0
- package/docs/routing.md +157 -44
- package/docs/security-audit.md +38 -0
- package/docs/troubleshooting.md +94 -51
- package/docs/verifier-boundaries.md +45 -0
- package/docs/workflows/fable-mode.md +77 -21
- package/docs/workflows/find-skills.md +40 -0
- package/docs/workflows/grill-with-docs.md +2 -2
- package/docs/workflows/multi-agent-workspace.md +22 -10
- package/docs/workflows/self-evolve.md +33 -0
- package/docs/workflows/tdd.md +36 -0
- package/docs/workflows/todo-driven-workflow.md +33 -0
- package/environment-detection/SKILL.md +3 -3
- package/eval-harness/SKILL.md +7 -7
- package/eval-harness/scripts/evaluate.js +12 -10
- package/evals/evaluation-reports.md +14 -0
- package/evals/harness-everything/tasks/positive-tier1.yaml +1 -1
- package/evals/harness-everything/tasks/positive-tier2.yaml +1 -1
- package/evals/harness-everything/tasks/positive-tier3.yaml +1 -1
- package/evals/install-cognitive-os/tasks/positive-trigger.yaml +1 -1
- package/fable-discipline/SKILL.md +2 -2
- package/fable-mode/CONTRACT-FORMAT.md +147 -33
- package/fable-mode/SKILL.md +3 -3
- package/fable-mode/agents/fable-orchestrator.md +95 -35
- package/fable-mode/execution-guardrails/SKILL.md +2 -2
- package/fable-mode/fable-haiku/SKILL.md +3 -3
- package/fable-mode/fable-opus/SKILL.md +3 -3
- package/fable-mode/fable-sonnet/SKILL.md +3 -3
- package/fable-mode/scripts/ensemble-review.js +371 -0
- package/fable-mode/scripts/model-selector.js +134 -3
- package/fable-mode/scripts/workflow-plan-consumer.js +337 -0
- package/find-skills/SKILL.md +5 -5
- package/find-skills/references/discovery-flow.md +1 -1
- package/find-skills/scripts/use-skill.js +7 -1
- package/git-commit/SKILL.md +4 -11
- package/grill-me/SKILL.md +5 -5
- package/grill-with-docs/SKILL.md +7 -7
- package/grill-with-docs/references/session-playbook.md +6 -4
- package/harness-everything/SKILL.md +23 -22
- package/harness-everything/references/router-workflow-plan.md +128 -0
- package/harness-everything/references/triage-and-tiers.md +173 -96
- package/harness-everything/schemas/router-task-shape.schema.json +126 -0
- package/harness-everything/schemas/router-workflow-plan.schema.json +149 -0
- package/harness-everything/scripts/bootstrap.js +13 -4
- package/harness-everything/scripts/ensemble-policy.js +102 -0
- package/harness-everything/scripts/kernel-router.js +212 -0
- package/harness-everything/scripts/router-contract.js +612 -0
- package/harness-everything/scripts/self-heal.js +29 -20
- package/harness-everything/scripts/tier-router.js +346 -221
- package/hooks/hooks.json +60 -15
- package/hooks/scripts/action-gate-rules.json +77 -0
- package/hooks/scripts/action-gate.js +528 -0
- package/hooks/scripts/atomic-commit-check.js +5 -5
- package/hooks/scripts/codex-action-gate-post.js +46 -0
- package/hooks/scripts/codex-permission-request.js +140 -0
- package/hooks/scripts/context-compact.js +4 -3
- package/hooks/scripts/contract-test.js +118 -51
- package/hooks/scripts/lib/fable-contracts.js +121 -0
- package/hooks/scripts/lib/harness-state.js +164 -28
- package/hooks/scripts/lib/platforms/claude.js +45 -62
- package/hooks/scripts/lib/platforms/codex.js +35 -61
- package/hooks/scripts/lib/platforms/continue.js +7 -7
- package/hooks/scripts/lib/platforms/copilot.js +29 -53
- package/hooks/scripts/lib/platforms/hermes.js +71 -20
- package/hooks/scripts/openai-session-start.js +81 -0
- package/hooks/scripts/rule-of-3-tracker.js +9 -8
- package/hooks/scripts/rule-of-3.js +29 -21
- package/hooks/scripts/state-persist.js +5 -4
- package/hooks/scripts/stop-gate.js +2 -2
- package/hooks/scripts/subagent-scope-guard.js +144 -38
- package/hooks/scripts/subagent-start.js +19 -0
- package/hooks/scripts/subagent-stop.js +6 -0
- package/improve-codebase-architecture/SKILL.md +2 -4
- package/improve-codebase-architecture/references/README.md +16 -0
- package/install-cognitive-os/SKILL.md +28 -22
- package/multi-agent-workspace/SKILL.md +16 -15
- package/multi-agent-workspace/references/architecture-guide.md +13 -9
- package/multi-agent-workspace/references/orchestration.md +39 -22
- package/multi-agent-workspace/scripts/consume-workflow-plan.js +129 -0
- package/multi-agent-workspace/scripts/index_memory.js +79 -26
- package/multi-agent-workspace/scripts/path-boundary.js +59 -0
- package/multi-agent-workspace/scripts/project-docs-resolver.js +357 -0
- package/multi-agent-workspace/scripts/scaffold.js +258 -103
- package/multi-agent-workspace/templates/AGENTS.md +20 -0
- package/multi-agent-workspace/workflows/03-generation.md +8 -10
- package/multi-agent-workspace/workflows/04-launcher.md +5 -5
- package/opencode-plugin/README.md +114 -71
- package/opencode-plugin/hooks/verify.js +62 -12
- package/opencode-plugin/index.mjs +547 -0
- package/opencode-plugin/plugin.json +4 -12
- package/package.json +20 -4
- package/plugins/harness-everything/.codex-plugin/plugin.json +39 -0
- package/plugins/harness-everything/hooks/hooks.json +197 -0
- package/plugins/harness-everything/hooks/scripts/action-gate-rules.json +77 -0
- package/plugins/harness-everything/hooks/scripts/action-gate.js +528 -0
- package/plugins/harness-everything/hooks/scripts/atomic-commit-check.js +68 -0
- package/plugins/harness-everything/hooks/scripts/boundary-guard.js +55 -0
- package/plugins/harness-everything/hooks/scripts/codex-action-gate-post.js +46 -0
- package/plugins/harness-everything/hooks/scripts/codex-permission-request.js +140 -0
- package/plugins/harness-everything/hooks/scripts/context-compact.js +115 -0
- package/plugins/harness-everything/hooks/scripts/contract-test.js +146 -0
- package/plugins/harness-everything/hooks/scripts/depth-guard.js +65 -0
- package/plugins/harness-everything/hooks/scripts/lib/fable-contracts.js +121 -0
- package/plugins/harness-everything/hooks/scripts/lib/harness-state.js +275 -0
- package/plugins/harness-everything/hooks/scripts/lib/platforms/claude.js +168 -0
- package/plugins/harness-everything/hooks/scripts/lib/platforms/codex.js +88 -0
- package/plugins/harness-everything/hooks/scripts/lib/platforms/continue.js +91 -0
- package/plugins/harness-everything/hooks/scripts/lib/platforms/copilot.js +85 -0
- package/plugins/harness-everything/hooks/scripts/lib/platforms/cursor.js +89 -0
- package/plugins/harness-everything/hooks/scripts/lib/platforms/hermes.js +108 -0
- package/plugins/harness-everything/hooks/scripts/lib/platforms/index.js +17 -0
- package/plugins/harness-everything/hooks/scripts/lib/platforms/worktrees.js +20 -0
- package/plugins/harness-everything/hooks/scripts/lib/workspace.js +290 -0
- package/plugins/harness-everything/hooks/scripts/openai-session-start.js +81 -0
- package/plugins/harness-everything/hooks/scripts/reset-circuit-breaker.js +30 -0
- package/plugins/harness-everything/hooks/scripts/rule-of-3-tracker.js +125 -0
- package/plugins/harness-everything/hooks/scripts/rule-of-3.js +195 -0
- package/plugins/harness-everything/hooks/scripts/state-persist.js +100 -0
- package/plugins/harness-everything/hooks/scripts/stop-gate.js +80 -0
- package/plugins/harness-everything/hooks/scripts/subagent-scope-guard.js +194 -0
- package/plugins/harness-everything/hooks/scripts/subagent-start.js +19 -0
- package/plugins/harness-everything/hooks/scripts/subagent-stop.js +6 -0
- package/plugins/harness-everything/hooks/session-start.js +81 -0
- package/plugins/harness-everything/plugin.json +43 -0
- package/plugins/harness-everything/scripts/lib/advisory-text.js +174 -0
- package/plugins/harness-everything/skills/environment-detection/SKILL.md +41 -0
- package/plugins/harness-everything/skills/environment-detection/references/shell-syntax-rules.md +76 -0
- package/plugins/harness-everything/skills/environment-detection/scripts/preflight.js +103 -0
- package/plugins/harness-everything/skills/eval-harness/SKILL.md +42 -0
- package/plugins/harness-everything/skills/eval-harness/references/scoring-rubric.md +68 -0
- package/plugins/harness-everything/skills/eval-harness/scripts/evaluate.js +79 -0
- package/plugins/harness-everything/skills/fable-discipline/SKILL.md +41 -0
- package/plugins/harness-everything/skills/fable-discipline/references/discipline-rules.md +22 -0
- package/plugins/harness-everything/skills/fable-mode/CONTRACT-FORMAT.md +165 -0
- package/plugins/harness-everything/skills/fable-mode/SKILL.md +39 -0
- package/plugins/harness-everything/skills/fable-mode/agents/fable-orchestrator.md +159 -0
- package/plugins/harness-everything/skills/fable-mode/agents/fable-verifier.md +32 -0
- package/plugins/harness-everything/skills/fable-mode/agents/fable-worker-haiku.md +52 -0
- package/plugins/harness-everything/skills/fable-mode/agents/fable-worker-sonnet.md +53 -0
- package/plugins/harness-everything/skills/fable-mode/execution-guardrails/SKILL.md +43 -0
- package/plugins/harness-everything/skills/fable-mode/execution-guardrails/references/guardrail-rules.md +56 -0
- package/plugins/harness-everything/skills/fable-mode/fable-haiku/SKILL.md +36 -0
- package/plugins/harness-everything/skills/fable-mode/fable-haiku/references/routing-notes.md +26 -0
- package/plugins/harness-everything/skills/fable-mode/fable-opus/SKILL.md +36 -0
- package/plugins/harness-everything/skills/fable-mode/fable-sonnet/SKILL.md +36 -0
- package/plugins/harness-everything/skills/fable-mode/model-matrix.json +32 -0
- package/plugins/harness-everything/skills/fable-mode/references/execution-phases.md +37 -0
- package/plugins/harness-everything/skills/fable-mode/references/model-matrix.md +39 -0
- package/plugins/harness-everything/skills/fable-mode/scripts/ensemble-review.js +371 -0
- package/plugins/harness-everything/skills/fable-mode/scripts/model-selector.js +260 -0
- package/plugins/harness-everything/skills/fable-mode/scripts/workflow-plan-consumer.js +337 -0
- package/plugins/harness-everything/skills/find-skills/SKILL.md +48 -0
- package/plugins/harness-everything/skills/find-skills/references/discovery-flow.md +102 -0
- package/plugins/harness-everything/skills/find-skills/scripts/use-skill.js +112 -0
- package/plugins/harness-everything/skills/git-commit/SKILL.md +38 -0
- package/plugins/harness-everything/skills/git-commit/guides/ANGULAR_STYLE.md +61 -0
- package/plugins/harness-everything/skills/git-commit/guides/COMMIT_GENERATION.md +24 -0
- package/plugins/harness-everything/skills/git-commit/guides/LANGUAGE_DETECTION.md +16 -0
- package/plugins/harness-everything/skills/git-commit/guides/MAIN_REPO.md +15 -0
- package/plugins/harness-everything/skills/git-commit/guides/SUBMODULES.md +27 -0
- package/plugins/harness-everything/skills/git-commit/references/commit-flow.md +30 -0
- package/plugins/harness-everything/skills/grill-me/SKILL.md +43 -0
- package/plugins/harness-everything/skills/grill-me/references/grilling-playbook.md +38 -0
- package/plugins/harness-everything/skills/grill-with-docs/ADR-FORMAT.md +47 -0
- package/plugins/harness-everything/skills/grill-with-docs/CONTEXT-FORMAT.md +63 -0
- package/plugins/harness-everything/skills/grill-with-docs/SKILL.md +41 -0
- package/plugins/harness-everything/skills/grill-with-docs/references/session-playbook.md +99 -0
- package/plugins/harness-everything/skills/harness-everything/SKILL.md +43 -0
- package/plugins/harness-everything/skills/harness-everything/examples/README.md +9 -0
- package/plugins/harness-everything/skills/harness-everything/examples/todo-workflow.md +22 -0
- package/plugins/harness-everything/skills/harness-everything/references/router-workflow-plan.md +128 -0
- package/plugins/harness-everything/skills/harness-everything/references/skill-registry.md +39 -0
- package/plugins/harness-everything/skills/harness-everything/references/triage-and-tiers.md +193 -0
- package/plugins/harness-everything/skills/harness-everything/schemas/router-task-shape.schema.json +126 -0
- package/plugins/harness-everything/skills/harness-everything/schemas/router-workflow-plan.schema.json +149 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/bootstrap.js +212 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/ensemble-policy.js +102 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/kernel-router.js +212 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/router-contract.js +612 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/routing-keywords.json +320 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/self-heal.js +250 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/tier-router.js +459 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/verify-gate.js +100 -0
- package/plugins/harness-everything/skills/improve-codebase-architecture/SKILL.md +38 -0
- package/plugins/harness-everything/skills/improve-codebase-architecture/guides/DEEPENING.md +37 -0
- package/plugins/harness-everything/skills/improve-codebase-architecture/guides/HTML-REPORT.md +123 -0
- package/plugins/harness-everything/skills/improve-codebase-architecture/guides/INTERFACE-DESIGN.md +44 -0
- package/plugins/harness-everything/skills/improve-codebase-architecture/guides/LANGUAGE.md +53 -0
- package/plugins/harness-everything/skills/improve-codebase-architecture/guides/refactoring-workflow.md +59 -0
- package/plugins/harness-everything/skills/improve-codebase-architecture/references/README.md +16 -0
- package/plugins/harness-everything/skills/install-cognitive-os/SKILL.md +44 -0
- package/plugins/harness-everything/skills/install-cognitive-os/references/cognitive-loop.md +27 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/NOTICE-agency-agents.md +27 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/SKILL.md +38 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/examples/csharp-monorepo.md +123 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/examples/typescript-cli.md +126 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-claude.md +77 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-codex.md +146 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-continue.md +38 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-copilot.md +74 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-cursor.md +40 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-hermes.md +38 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/role-capabilities.md +108 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/references/agency-agents.md +31 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/references/architecture-guide.md +36 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/references/orchestration.md +65 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/scripts/agency-catalog.js +190 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/scripts/consume-workflow-plan.js +129 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/scripts/index_memory.js +104 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/scripts/path-boundary.js +59 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/scripts/project-docs-resolver.js +357 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/scripts/scaffold.js +408 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/AGENTS.md +20 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/README.md +17 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/agent-launcher.md +68 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-csharp.md +56 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-polyglot.md +62 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-ts.md +57 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/memory-keeper.md +37 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/requirement-analyzer.md +66 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/specialist-agent.md +34 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/task-verifier.md +56 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/templates/tool-maker.md +33 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/workflows/01-init.md +22 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/workflows/02-analysis.md +23 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/workflows/03-generation.md +25 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/workflows/04-launcher.md +16 -0
- package/plugins/harness-everything/skills/repo-docs/SKILL.md +42 -0
- package/plugins/harness-everything/skills/repo-docs/references/process-guide.md +60 -0
- package/plugins/harness-everything/skills/repo-docs/templates/agents-template.md +264 -0
- package/plugins/harness-everything/skills/repo-docs/templates/knowledge-agents-template.md +50 -0
- package/plugins/harness-everything/skills/repo-docs/templates/knowledge-readme-template.md +83 -0
- package/plugins/harness-everything/skills/repo-docs/templates/manual-recon.md +117 -0
- package/plugins/harness-everything/skills/repo-docs/templates/multi-skills-readme-template.md +72 -0
- package/plugins/harness-everything/skills/repo-docs/templates/product-agents-template.md +78 -0
- package/plugins/harness-everything/skills/repo-docs/templates/product-readme-template.md +95 -0
- package/plugins/harness-everything/skills/repo-docs/templates/readme-template.md +136 -0
- package/plugins/harness-everything/skills/repo-docs/templates/single-skill-readme-template.md +70 -0
- package/plugins/harness-everything/skills/repo-docs/templates/skills-agents-template.md +60 -0
- package/plugins/harness-everything/skills/rewrite-commits/SKILL.md +37 -0
- package/plugins/harness-everything/skills/rewrite-commits/references/workflow.md +18 -0
- package/plugins/harness-everything/skills/security-review/SKILL.md +47 -0
- package/plugins/harness-everything/skills/security-review/guides/OWASP-PATTERNS.md +31 -0
- package/plugins/harness-everything/skills/security-review/guides/STRIDE-THREAT-MODEL.md +21 -0
- package/plugins/harness-everything/skills/security-review/references/security-checklist.md +478 -0
- package/plugins/harness-everything/skills/security-review/scripts/audit-secrets.js +85 -0
- package/plugins/harness-everything/skills/self-evolve/SKILL.md +45 -0
- package/plugins/harness-everything/skills/self-evolve/references/memory-resolution.md +61 -0
- package/plugins/harness-everything/skills/self-evolve/scripts/persist-memory.js +272 -0
- package/plugins/harness-everything/skills/self-evolve/scripts/register-dynamic-skill.js +253 -0
- package/plugins/harness-everything/skills/self-evolve/scripts/self-regression.js +125 -0
- package/plugins/harness-everything/skills/skill-creator/SKILL.md +47 -0
- package/plugins/harness-everything/skills/skill-creator/references/authoring-workflow.md +14 -0
- package/plugins/harness-everything/skills/skill-creator/references/dynamic-generation-contract.md +21 -0
- package/plugins/harness-everything/skills/skill-creator/references/quality-checklist.md +16 -0
- package/plugins/harness-everything/skills/skill-creator/references/quality-principles.md +81 -0
- package/plugins/harness-everything/skills/skill-creator/references/testing-workflow.md +27 -0
- package/plugins/harness-everything/skills/skill-style/SKILL.md +42 -0
- package/plugins/harness-everything/skills/skill-style/references/style-guide.md +62 -0
- package/plugins/harness-everything/skills/tdd/SKILL.md +38 -0
- package/plugins/harness-everything/skills/tdd/fixtures/pass-evidence.json +100 -0
- package/plugins/harness-everything/skills/tdd/fixtures/quality-scenarios.json +20 -0
- package/plugins/harness-everything/skills/tdd/guides/deep-modules.md +33 -0
- package/plugins/harness-everything/skills/tdd/guides/interface-design.md +31 -0
- package/plugins/harness-everything/skills/tdd/guides/mocking.md +59 -0
- package/plugins/harness-everything/skills/tdd/guides/refactoring.md +10 -0
- package/plugins/harness-everything/skills/tdd/guides/tests.md +61 -0
- package/plugins/harness-everything/skills/tdd/references/core-discipline.md +51 -0
- package/plugins/harness-everything/skills/tdd/references/integration-testing.md +13 -0
- package/plugins/harness-everything/skills/tdd/references/quality-model.md +68 -0
- package/plugins/harness-everything/skills/tdd/references/unit-testing.md +15 -0
- package/plugins/harness-everything/skills/tdd/schemas/quality-evidence.schema.json +211 -0
- package/plugins/harness-everything/skills/tdd/schemas/quality-report.schema.json +110 -0
- package/plugins/harness-everything/skills/tdd/scripts/quality-gate.js +475 -0
- package/plugins/harness-everything/skills/to-spec/SKILL.md +40 -0
- package/plugins/harness-everything/skills/to-spec/references/process.md +77 -0
- package/plugins/harness-everything/skills/to-spec/scripts/check-project-docs.js +239 -0
- package/plugins/harness-everything/skills/to-spec/scripts/project-docs-resolver.js +111 -0
- package/plugins/harness-everything/skills/to-spec/templates/cli-reference.md +31 -0
- package/plugins/harness-everything/skills/to-spec/templates/dev-doc.md +27 -0
- package/plugins/harness-everything/skills/to-spec/templates/feature-spec.md +59 -0
- package/plugins/harness-everything/skills/to-spec/templates/schema-doc.md +31 -0
- package/plugins/harness-everything/skills/to-tickets/SKILL.md +42 -0
- package/plugins/harness-everything/skills/to-tickets/references/publishing-and-templates.md +97 -0
- package/plugins/harness-everything/skills/todo-driven-workflow/SKILL.md +42 -0
- package/plugins/harness-everything/skills/todo-driven-workflow/references/execution-guide.md +27 -0
- package/plugins/harness-everything/skills/using-git-worktrees/SKILL.md +49 -0
- package/plugins/harness-everything/skills/using-git-worktrees/references/workflow-details.md +108 -0
- package/plugins/harness-everything/skills/verification-loop/SKILL.md +46 -0
- package/plugins/harness-everything/skills/verification-loop/references/verification-phases.md +116 -0
- package/plugins/harness-everything/skills/verification-loop/templates/verification-report.template.md +15 -0
- package/plugins/harness-everything/skills/verify-before-claim/SKILL.md +43 -0
- package/plugins/harness-everything/skills/verify-before-claim/references/verification-guide.md +73 -0
- package/plugins/harness-everything/skills/zoom-out/SKILL.md +42 -0
- package/plugins/harness-everything/skills/zoom-out/references/circuit-breaker.md +66 -0
- package/plugins/harness-everything/skills/zoom-out/templates/zoom-out-report.template.md +20 -0
- package/repo-docs/SKILL.md +3 -7
- package/rewrite-commits/SKILL.md +2 -2
- package/scripts/build-openai-submission.js +158 -0
- package/scripts/installer.js +86 -11
- package/scripts/lib/advisory-text.js +25 -18
- package/scripts/lib/execution-contract.js +70 -0
- package/scripts/lib/manifest.js +34 -38
- package/scripts/lib/path-boundary.js +90 -0
- package/scripts/lib/skills.js +124 -70
- package/scripts/lib/workspace.js +269 -7
- package/scripts/repository-contract.js +213 -0
- package/scripts/sync-current-docs.js +12 -0
- package/scripts/sync-openai-plugin.js +91 -0
- package/scripts/sync-release-version.js +212 -0
- package/security-review/SKILL.md +4 -7
- package/security-review/scripts/audit-secrets.js +9 -8
- package/self-evolve/SKILL.md +9 -11
- package/self-evolve/references/memory-resolution.md +4 -1
- package/self-evolve/scripts/persist-memory.js +221 -88
- package/self-evolve/scripts/register-dynamic-skill.js +12 -10
- package/self-evolve/scripts/self-regression.js +23 -8
- package/skill-creator/SKILL.md +12 -14
- package/skill-creator/references/quality-checklist.md +1 -0
- package/skill-style/SKILL.md +4 -4
- package/skill-style/references/style-guide.md +29 -3
- package/submission/openai/README.md +67 -0
- package/submission/openai/listing.json +31 -0
- package/submission/openai/test-cases.json +61 -0
- package/tdd/SKILL.md +20 -26
- package/tdd/fixtures/pass-evidence.json +100 -0
- package/tdd/fixtures/quality-scenarios.json +20 -0
- package/tdd/references/core-discipline.md +2 -0
- package/tdd/references/integration-testing.md +13 -0
- package/tdd/references/quality-model.md +68 -0
- package/tdd/references/unit-testing.md +15 -0
- package/tdd/schemas/quality-evidence.schema.json +211 -0
- package/tdd/schemas/quality-report.schema.json +110 -0
- package/tdd/scripts/quality-gate.js +475 -0
- package/to-spec/SKILL.md +3 -5
- package/to-spec/scripts/check-project-docs.js +42 -62
- package/to-spec/scripts/project-docs-resolver.js +111 -0
- package/to-tickets/SKILL.md +4 -4
- package/todo-driven-workflow/SKILL.md +6 -4
- package/using-git-worktrees/SKILL.md +3 -3
- package/verification-loop/SKILL.md +4 -4
- package/verify-before-claim/SKILL.md +2 -2
- package/zoom-out/SKILL.md +4 -4
- package/ab-test-deep-analysis-2026-08-27.md +0 -383
- package/ab-test-results-2026-08-27.md +0 -152
- package/ab-test-statistical-analysis-31cases.md +0 -193
- package/opencode-plugin/hooks/circuit-breaker.js +0 -121
- package/opencode-plugin/hooks/compliance.js +0 -128
- package/opencode-plugin/hooks/post-edit.js +0 -62
- package/opencode-plugin/hooks/pre-complete.js +0 -65
- package/opencode-plugin/test-hook-firing.js +0 -198
|
@@ -1,139 +1,272 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const crypto = require('crypto');
|
|
2
5
|
const fs = require('fs');
|
|
3
6
|
const path = require('path');
|
|
7
|
+
let getWorkspaceRoot;
|
|
8
|
+
try {
|
|
9
|
+
({ getWorkspaceRoot } = require('../../scripts/lib/workspace'));
|
|
10
|
+
} catch (err) {
|
|
11
|
+
getWorkspaceRoot = () => null;
|
|
12
|
+
}
|
|
4
13
|
|
|
5
|
-
|
|
6
|
-
|
|
14
|
+
// NOTE: this script ships standalone - it is copied whole into every install
|
|
15
|
+
// target. When the canonical workspace resolver is not present, persistence
|
|
16
|
+
// fails closed rather than guessing a project root (issue #42).
|
|
7
17
|
|
|
8
|
-
|
|
9
|
-
|
|
18
|
+
const SECRET_PATTERNS = [
|
|
19
|
+
['github-token', /\bgh[pousr]_[A-Za-z0-9]{20,}\b/],
|
|
20
|
+
['openai-key', /\bsk-(?:proj-)?[A-Za-z0-9_-]{20,}\b/],
|
|
21
|
+
['aws-access-key', /\bAKIA[0-9A-Z]{16}\b/],
|
|
22
|
+
['private-key', /-----BEGIN (?:RSA |EC |OPENSSH |DSA )?PRIVATE KEY-----/],
|
|
23
|
+
['jwt', /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/],
|
|
24
|
+
['credential-assignment', /\b(?:api[_-]?key|access[_-]?token|auth[_-]?token|password|passwd|secret)\s*[:=]\s*["']?[A-Za-z0-9_./+=:-]{8,}/i],
|
|
25
|
+
];
|
|
10
26
|
|
|
11
|
-
|
|
27
|
+
const INJECTION_PATTERNS = [
|
|
28
|
+
['ignore-prior-instructions', /\bignore\s+(?:all\s+)?(?:previous|prior|above)\s+(?:instructions|messages|rules)\b/i],
|
|
29
|
+
['replace-instructions', /\b(?:follow|obey)\s+(?:these|the following)\s+instructions\s+instead\b/i],
|
|
30
|
+
['role-override', /\byou\s+are\s+now\b/i],
|
|
31
|
+
['instruction-override', /\boverride\s+(?:the\s+)?(?:system|developer|safety|previous|prior)\s+(?:instructions|message|prompt|rules)\b/i],
|
|
32
|
+
['system-prompt-exfiltration', /\b(?:reveal|print|show|expose)\s+(?:the\s+)?(?:system|developer)\s+prompt\b/i],
|
|
33
|
+
['role-token', /<\|(?:system|developer|assistant)\|>/i],
|
|
34
|
+
['jailbreak-marker', /\b(?:jailbreak|prompt[- ]injection)\b/i],
|
|
35
|
+
];
|
|
12
36
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
37
|
+
function parseArgs(argv) {
|
|
38
|
+
let memoryText = null;
|
|
39
|
+
let source = 'manual-unspecified';
|
|
40
|
+
for (let index = 0; index < argv.length; index++) {
|
|
41
|
+
const token = argv[index];
|
|
42
|
+
if (token === '--help' || token === '-h') return { help: true, memoryText: null, source };
|
|
43
|
+
if (token === '--source') {
|
|
44
|
+
if (index + 1 >= argv.length) throw new Error('--source requires a value');
|
|
45
|
+
source = argv[++index];
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (token.startsWith('--source=')) {
|
|
49
|
+
source = token.slice('--source='.length);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (token.startsWith('-')) throw new Error(`unknown option: ${token}`);
|
|
53
|
+
if (memoryText !== null) throw new Error('exactly one memory rule positional argument is allowed');
|
|
54
|
+
memoryText = token;
|
|
55
|
+
}
|
|
56
|
+
return { help: false, memoryText, source };
|
|
57
|
+
}
|
|
17
58
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
59
|
+
function normalizeSource(value) {
|
|
60
|
+
const source = String(value || 'manual-unspecified').trim();
|
|
61
|
+
if (!source) return 'manual-unspecified';
|
|
62
|
+
if (/[\r\n\0]/.test(source)) throw new Error('source provenance must be one line');
|
|
63
|
+
if (source.length > 240) throw new Error('source provenance exceeds 240 characters');
|
|
64
|
+
const secretReasons = detectReasonCodes(source, SECRET_PATTERNS);
|
|
65
|
+
if (secretReasons.length > 0) throw new Error(`source provenance rejected by secret screening: ${secretReasons.join(', ')}`);
|
|
66
|
+
return source;
|
|
23
67
|
}
|
|
24
68
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
69
|
+
function detectReasonCodes(text, patterns) {
|
|
70
|
+
const reasons = [];
|
|
71
|
+
for (const [reasonCode, pattern] of patterns) {
|
|
72
|
+
if (pattern.test(text)) reasons.push(reasonCode);
|
|
73
|
+
}
|
|
74
|
+
return reasons;
|
|
28
75
|
}
|
|
29
76
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
// Actionability: starts with verb, has clear instruction
|
|
40
|
-
if (/^(Always|Never|Check|Verify|Prefer|Avoid|Use|不要|總是|檢查|驗證|避免|使用)/i.test(ruleText)) score += 3;
|
|
41
|
-
if (/^(should|must|will|needs? to|ought|應該|必須|需要)/i.test(ruleText)) score += 2;
|
|
42
|
-
|
|
43
|
-
// Uniqueness: not already in RULES.md
|
|
44
|
-
const isDuplicate = existingRules.some(existing => {
|
|
45
|
-
const similarity = calculateSimilarity(ruleText, existing);
|
|
46
|
-
return similarity > 0.7; // 70% similarity threshold
|
|
47
|
-
});
|
|
48
|
-
if (!isDuplicate) score += 3;
|
|
49
|
-
|
|
50
|
-
// Length appropriateness (not too short, not too long)
|
|
51
|
-
if (ruleText.length > 20 && ruleText.length < 200) score += 1;
|
|
52
|
-
|
|
53
|
-
return Math.min(score, 10); // Cap at 10
|
|
77
|
+
function screenMemoryForPersistence(text) {
|
|
78
|
+
const value = String(text || '');
|
|
79
|
+
const secretReasonCodes = detectReasonCodes(value, SECRET_PATTERNS);
|
|
80
|
+
const injectionReasonCodes = detectReasonCodes(value, INJECTION_PATTERNS);
|
|
81
|
+
return {
|
|
82
|
+
allowed: secretReasonCodes.length === 0 && injectionReasonCodes.length === 0,
|
|
83
|
+
secretReasonCodes,
|
|
84
|
+
injectionReasonCodes,
|
|
85
|
+
};
|
|
54
86
|
}
|
|
55
87
|
|
|
56
|
-
// Simple text similarity calculation
|
|
57
88
|
function calculateSimilarity(text1, text2) {
|
|
58
89
|
const words1 = text1.toLowerCase().split(/\s+/);
|
|
59
90
|
const words2 = text2.toLowerCase().split(/\s+/);
|
|
60
|
-
|
|
61
91
|
const set1 = new Set(words1);
|
|
62
92
|
const set2 = new Set(words2);
|
|
63
|
-
|
|
64
93
|
let intersection = 0;
|
|
65
94
|
for (const word of set1) {
|
|
66
95
|
if (set2.has(word)) intersection++;
|
|
67
96
|
}
|
|
68
|
-
|
|
69
97
|
const union = set1.size + set2.size - intersection;
|
|
70
98
|
return union === 0 ? 0 : intersection / union;
|
|
71
99
|
}
|
|
72
100
|
|
|
73
|
-
|
|
101
|
+
function scoreRuleQuality(ruleText, existingRules = []) {
|
|
102
|
+
let score = 0;
|
|
103
|
+
if (/\.\w{2,4}/.test(ruleText)) score += 2;
|
|
104
|
+
if (/Error|Exception|Warning|錯誤|異常|警告/.test(ruleText)) score += 2;
|
|
105
|
+
if (/\b(test|lint|build|verify|check|測試|檢查)\b/i.test(ruleText)) score += 1;
|
|
106
|
+
if (/^(Always|Never|Check|Verify|Prefer|Avoid|Use|不要|總是|檢查|驗證|避免|使用)/i.test(ruleText)) score += 3;
|
|
107
|
+
if (/^(should|must|will|needs? to|ought|應該|必須|需要)/i.test(ruleText)) score += 2;
|
|
108
|
+
const isDuplicate = existingRules.some(existing => calculateSimilarity(ruleText, existing) > 0.7);
|
|
109
|
+
if (!isDuplicate) score += 3;
|
|
110
|
+
if (ruleText.length > 20 && ruleText.length < 200) score += 1;
|
|
111
|
+
return Math.min(score, 10);
|
|
112
|
+
}
|
|
113
|
+
|
|
74
114
|
function extractExistingRules(rulesFile) {
|
|
75
115
|
if (!fs.existsSync(rulesFile)) return [];
|
|
76
|
-
|
|
77
116
|
try {
|
|
78
117
|
const content = fs.readFileSync(rulesFile, 'utf8');
|
|
79
118
|
const ruleMatches = content.match(/^- .+$/gm) || [];
|
|
80
|
-
return ruleMatches.map(rule => rule.substring(2));
|
|
119
|
+
return ruleMatches.map(rule => rule.substring(2));
|
|
81
120
|
} catch (err) {
|
|
82
121
|
return [];
|
|
83
122
|
}
|
|
84
123
|
}
|
|
85
124
|
|
|
86
|
-
function
|
|
87
|
-
|
|
88
|
-
while (dir !== path.parse(dir).root) {
|
|
89
|
-
if (fs.existsSync(path.join(dir, '.git'))) return dir;
|
|
90
|
-
dir = path.dirname(dir);
|
|
91
|
-
}
|
|
92
|
-
return process.cwd();
|
|
125
|
+
function contentHash(text) {
|
|
126
|
+
return crypto.createHash('sha256').update(String(text), 'utf8').digest('hex');
|
|
93
127
|
}
|
|
94
128
|
|
|
95
|
-
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
const rulesFile = path.join(memoryDir, 'RULES.md');
|
|
129
|
+
function persistMemory({ memoryText, source = 'manual-unspecified' }) {
|
|
130
|
+
const ruleText = String(memoryText || '').trim();
|
|
131
|
+
if (!ruleText) return { ok: false, exitCode: 1, message: 'memory rule is required' };
|
|
99
132
|
|
|
100
|
-
|
|
101
|
-
if (!
|
|
102
|
-
|
|
133
|
+
const screening = screenMemoryForPersistence(ruleText);
|
|
134
|
+
if (!screening.allowed) {
|
|
135
|
+
const reasons = [...screening.secretReasonCodes, ...screening.injectionReasonCodes];
|
|
136
|
+
return {
|
|
137
|
+
ok: false,
|
|
138
|
+
exitCode: 2,
|
|
139
|
+
screening,
|
|
140
|
+
message: `memory rejected by persistence screening: ${reasons.join(', ')}`,
|
|
141
|
+
};
|
|
103
142
|
}
|
|
104
143
|
|
|
105
|
-
|
|
144
|
+
let provenance;
|
|
145
|
+
try {
|
|
146
|
+
provenance = normalizeSource(source);
|
|
147
|
+
} catch (err) {
|
|
148
|
+
return { ok: false, exitCode: 2, screening, message: err.message };
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const currentDir = getWorkspaceRoot();
|
|
152
|
+
if (!currentDir) {
|
|
153
|
+
return {
|
|
154
|
+
ok: false,
|
|
155
|
+
exitCode: 1,
|
|
156
|
+
screening,
|
|
157
|
+
message: 'Cannot persist project memory without a resolved git workspace.',
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const memoryDir = path.join(currentDir, 'memories', 'repo');
|
|
162
|
+
const rulesFile = path.join(memoryDir, 'RULES.md');
|
|
106
163
|
const existingRules = extractExistingRules(rulesFile);
|
|
107
|
-
|
|
108
|
-
// Score the rule quality
|
|
109
|
-
const qualityScore = scoreRuleQuality(memoryText, existingRules);
|
|
110
|
-
|
|
164
|
+
const qualityScore = scoreRuleQuality(ruleText, existingRules);
|
|
111
165
|
if (qualityScore < 5) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
166
|
+
return {
|
|
167
|
+
ok: false,
|
|
168
|
+
exitCode: 1,
|
|
169
|
+
screening,
|
|
170
|
+
qualityScore,
|
|
171
|
+
message: `Rule rejected - score ${qualityScore}/10 (minimum 5 required)`,
|
|
172
|
+
};
|
|
118
173
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
const isDuplicate = existingRules.some(existing => {
|
|
122
|
-
const similarity = calculateSimilarity(memoryText, existing);
|
|
123
|
-
return similarity > 0.7;
|
|
124
|
-
});
|
|
125
|
-
|
|
174
|
+
|
|
175
|
+
const isDuplicate = existingRules.some(existing => calculateSimilarity(ruleText, existing) > 0.7);
|
|
126
176
|
if (isDuplicate) {
|
|
127
|
-
|
|
128
|
-
|
|
177
|
+
return {
|
|
178
|
+
ok: false,
|
|
179
|
+
exitCode: 1,
|
|
180
|
+
screening,
|
|
181
|
+
qualityScore,
|
|
182
|
+
message: 'Rule rejected - similar rule already exists',
|
|
183
|
+
};
|
|
129
184
|
}
|
|
130
185
|
|
|
186
|
+
fs.mkdirSync(memoryDir, { recursive: true });
|
|
131
187
|
const timestamp = new Date().toISOString().split('T')[0];
|
|
132
|
-
const
|
|
133
|
-
|
|
188
|
+
const hash = contentHash(ruleText);
|
|
189
|
+
const formattedMemory = [
|
|
190
|
+
'',
|
|
191
|
+
`## [${timestamp}] Self-Evolution Insight (Quality: ${qualityScore}/10)`,
|
|
192
|
+
`Source: ${provenance}`,
|
|
193
|
+
`Content-SHA256: ${hash}`,
|
|
194
|
+
'Screening: secret=clear; prompt-injection=clear',
|
|
195
|
+
`- ${ruleText}`,
|
|
196
|
+
'',
|
|
197
|
+
].join('\n');
|
|
134
198
|
fs.appendFileSync(rulesFile, formattedMemory, 'utf8');
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
199
|
+
return {
|
|
200
|
+
ok: true,
|
|
201
|
+
exitCode: 0,
|
|
202
|
+
rulesFile,
|
|
203
|
+
qualityScore,
|
|
204
|
+
source: provenance,
|
|
205
|
+
contentSha256: hash,
|
|
206
|
+
screening,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function printHelp() {
|
|
211
|
+
console.log(`Append a short defensive rule to memories/repo/RULES.md.
|
|
212
|
+
|
|
213
|
+
Usage: node persist-memory.js "<insight to remember>" [--source <provenance>]
|
|
214
|
+
|
|
215
|
+
The rule must be universal and actionable. --source records where the lesson came
|
|
216
|
+
from (for example issue-85, verifier-stage-3, or manual-review); when omitted the
|
|
217
|
+
source is recorded as manual-unspecified.
|
|
218
|
+
|
|
219
|
+
Persistence gates:
|
|
220
|
+
- secret-like tokens and credential material are rejected before any write
|
|
221
|
+
- prompt-injection-shaped instructions are rejected before any write
|
|
222
|
+
- source provenance is recorded with a SHA-256 content fingerprint
|
|
223
|
+
- minimum quality score of 5/10 and similarity deduplication still apply`);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (require.main === module) {
|
|
227
|
+
let parsed;
|
|
228
|
+
try {
|
|
229
|
+
parsed = parseArgs(process.argv.slice(2));
|
|
230
|
+
} catch (err) {
|
|
231
|
+
console.error(`[self-evolve] ${err.message}`);
|
|
232
|
+
process.exit(1);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (parsed.help) {
|
|
236
|
+
printHelp();
|
|
237
|
+
process.exit(0);
|
|
238
|
+
}
|
|
239
|
+
if (!parsed.memoryText) {
|
|
240
|
+
console.error('Usage: node persist-memory.js "<insight to remember>" [--source <provenance>]');
|
|
241
|
+
process.exit(1);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
try {
|
|
245
|
+
const result = persistMemory(parsed);
|
|
246
|
+
if (!result.ok) {
|
|
247
|
+
const prefix = result.exitCode === 2 ? '[Persistence Screening]' : '[Quality Gate]';
|
|
248
|
+
console.error(`${prefix} ${result.message}`);
|
|
249
|
+
if (result.qualityScore !== undefined && result.qualityScore < 5) {
|
|
250
|
+
console.error('Suggestions to improve:');
|
|
251
|
+
console.error('- Be more specific (mention file types, error patterns)');
|
|
252
|
+
console.error('- Start with action verbs (Always, Never, Check, Verify)');
|
|
253
|
+
console.error('- Ensure the rule is actionable and not already captured');
|
|
254
|
+
}
|
|
255
|
+
process.exit(result.exitCode);
|
|
256
|
+
}
|
|
257
|
+
console.log(`[Success] Memory persisted to ${result.rulesFile} (Quality: ${result.qualityScore}/10, Source: ${result.source})`);
|
|
258
|
+
} catch (err) {
|
|
259
|
+
console.error(`[Error] Failed to write memory: ${err.message}`);
|
|
260
|
+
process.exit(1);
|
|
261
|
+
}
|
|
139
262
|
}
|
|
263
|
+
|
|
264
|
+
module.exports = {
|
|
265
|
+
calculateSimilarity,
|
|
266
|
+
contentHash,
|
|
267
|
+
extractExistingRules,
|
|
268
|
+
parseArgs,
|
|
269
|
+
persistMemory,
|
|
270
|
+
scoreRuleQuality,
|
|
271
|
+
screenMemoryForPersistence,
|
|
272
|
+
};
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
const fs = require('fs');
|
|
3
3
|
const path = require('path');
|
|
4
|
+
let getWorkspaceRoot;
|
|
5
|
+
try {
|
|
6
|
+
({ getWorkspaceRoot } = require('../../scripts/lib/workspace'));
|
|
7
|
+
} catch (err) {
|
|
8
|
+
getWorkspaceRoot = () => null;
|
|
9
|
+
}
|
|
4
10
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
dir = path.dirname(dir);
|
|
10
|
-
}
|
|
11
|
-
return process.cwd();
|
|
11
|
+
const workspaceRoot = getWorkspaceRoot();
|
|
12
|
+
if (!workspaceRoot) {
|
|
13
|
+
console.error('[self-evolve] Cannot register a dynamic skill without a resolved git workspace.');
|
|
14
|
+
process.exit(1);
|
|
12
15
|
}
|
|
13
16
|
|
|
14
17
|
function loadManifestHelper() {
|
|
@@ -16,8 +19,8 @@ function loadManifestHelper() {
|
|
|
16
19
|
path.join(__dirname, '../../scripts/lib/manifest'),
|
|
17
20
|
path.join(__dirname, '../scripts/lib/manifest'),
|
|
18
21
|
path.join(__dirname, '../../../scripts/lib/manifest'),
|
|
19
|
-
path.join(
|
|
20
|
-
path.join(
|
|
22
|
+
path.join(workspaceRoot, 'scripts/lib/manifest'),
|
|
23
|
+
path.join(workspaceRoot, 'harness-everything/scripts/lib/manifest'),
|
|
21
24
|
];
|
|
22
25
|
for (const cand of candidates) {
|
|
23
26
|
try {
|
|
@@ -33,7 +36,6 @@ const { getManifestPath, readManifest, writeManifest, recordGeneratedSkill } = l
|
|
|
33
36
|
|
|
34
37
|
// Find user home folder
|
|
35
38
|
const userHome = process.env.HOME || process.env.USERPROFILE || '';
|
|
36
|
-
const workspaceRoot = getWorkspaceRoot();
|
|
37
39
|
|
|
38
40
|
// List of all possible manifest.json home paths
|
|
39
41
|
const manifestHomes = [
|
|
@@ -13,6 +13,15 @@ const fs = require('fs');
|
|
|
13
13
|
const projectRoot = path.resolve(__dirname, '..', '..');
|
|
14
14
|
let hasErrors = false;
|
|
15
15
|
|
|
16
|
+
let pkgName = null;
|
|
17
|
+
try {
|
|
18
|
+
pkgName = JSON.parse(fs.readFileSync(path.join(projectRoot, 'package.json'), 'utf8')).name;
|
|
19
|
+
} catch (e) {}
|
|
20
|
+
if (pkgName !== 'harness-everything') {
|
|
21
|
+
console.log('self-regression.js validates the Harness-everything repo\'s own CI; this workspace is not that repo, so there is nothing to check here. Skipping.');
|
|
22
|
+
process.exit(0);
|
|
23
|
+
}
|
|
24
|
+
|
|
16
25
|
console.log('=================================================');
|
|
17
26
|
console.log(' Harness OS - Self-Regression Test Suite ');
|
|
18
27
|
console.log('=================================================');
|
|
@@ -32,9 +41,8 @@ function runNode(label, script, args = [], options = {}) {
|
|
|
32
41
|
return result;
|
|
33
42
|
}
|
|
34
43
|
|
|
35
|
-
// 1. Syntax-check every shipped JavaScript file.
|
|
36
44
|
console.log('\n[Phase 1] Static Syntax Check...');
|
|
37
|
-
const foldersToScan = ['harness-everything', 'hooks', 'environment-detection', 'self-evolve', 'ci', 'eval-harness', 'scripts', 'bin', 'to-spec', 'to-tickets', 'find-skills', 'fable-mode'];
|
|
45
|
+
const foldersToScan = ['harness-everything', 'hooks', 'environment-detection', 'self-evolve', 'ci', 'eval-harness', 'scripts', 'bin', 'to-spec', 'to-tickets', 'find-skills', 'fable-mode', 'multi-agent-workspace'];
|
|
38
46
|
const jsFiles = [];
|
|
39
47
|
function walkDir(dir) {
|
|
40
48
|
if (!fs.existsSync(dir)) return;
|
|
@@ -55,14 +63,16 @@ for (const file of jsFiles) {
|
|
|
55
63
|
}
|
|
56
64
|
console.log(` PASS syntax: ${jsFiles.length} JavaScript file(s)`);
|
|
57
65
|
|
|
58
|
-
// 1b. Smoke-test the public CLI wrappers.
|
|
59
66
|
console.log('\n[Phase 1b] CLI Command Smoke Test...');
|
|
60
67
|
const cliPath = path.join(projectRoot, 'bin', 'cli.js');
|
|
61
68
|
const nextCheck = spawnSync('node', [cliPath, 'next', 'add a new login endpoint with tests'], { cwd: projectRoot });
|
|
62
69
|
if (nextCheck.status !== 0 || !nextCheck.stdout.toString().includes('RECOMMENDED TIER')) {
|
|
63
70
|
console.error(' FAIL `harness next` did not produce a routing recommendation.');
|
|
64
71
|
hasErrors = true;
|
|
65
|
-
} else
|
|
72
|
+
} else if (!nextCheck.stdout.toString().includes('REQUIRED HARNESS INVARIANTS')) {
|
|
73
|
+
console.error(' FAIL `harness next` did not establish the invariant-first kernel contract.');
|
|
74
|
+
hasErrors = true;
|
|
75
|
+
} else console.log(' PASS `harness next` produced routing + invariant contract.');
|
|
66
76
|
const verifyCheck = spawnSync('node', [cliPath, 'verify'], {
|
|
67
77
|
cwd: projectRoot,
|
|
68
78
|
env: { ...process.env, HARNESS_SKIP_PROJECT_CHECKS: '1' },
|
|
@@ -72,16 +82,22 @@ if (verifyCheck.status !== 0) {
|
|
|
72
82
|
hasErrors = true;
|
|
73
83
|
} else console.log(' PASS `harness verify` exited 0 on a skipped check.');
|
|
74
84
|
|
|
75
|
-
// 2. Deterministic routing matrix.
|
|
76
85
|
console.log('\n[Phase 2] Routing Verification Check...');
|
|
77
86
|
runNode('routing matrix', path.join(projectRoot, 'ci', 'runner.js'));
|
|
78
87
|
runNode('skill route coverage', path.join(projectRoot, 'ci', 'skill-routing-check.js'));
|
|
88
|
+
runNode('invariant-first routing contract', path.join(projectRoot, 'ci', 'invariant-routing.test.js'));
|
|
89
|
+
runNode('workflow-plan structured contract', path.join(projectRoot, 'ci', 'router-workflow-plan.test.js'));
|
|
90
|
+
runNode('explicit parallel safety contract', path.join(projectRoot, 'ci', 'router-phase2-safety.test.js'));
|
|
91
|
+
runNode('workflow-plan consumers', path.join(projectRoot, 'ci', 'workflow-plan-consumers.test.js'));
|
|
92
|
+
runNode('workflow-plan consumer edge contracts', path.join(projectRoot, 'ci', 'workflow-plan-consumers-edge.test.js'));
|
|
93
|
+
runNode('phase 4 ensemble/memory evidence', path.join(projectRoot, 'ci', 'phase4-ensemble-memory.test.js'));
|
|
94
|
+
runNode('phase 5 pre-action gate', path.join(projectRoot, 'ci', 'action-gate.test.js'));
|
|
95
|
+
runNode('phase 5 platform evidence boundary', path.join(projectRoot, 'ci', 'action-gate-platform-doc.test.js'));
|
|
96
|
+
runNode('issue #99 runtime correctness', path.join(projectRoot, 'ci', 'issue99-runtime.test.js'));
|
|
79
97
|
|
|
80
|
-
// 3. Static integrity gates; behavioral evals are validated, not executed.
|
|
81
98
|
console.log('\n[Phase 3] Skill Reference and Behavioral Case Checks...');
|
|
82
99
|
runNode('skill reference check', path.join(projectRoot, 'ci', 'reference-check.js'));
|
|
83
100
|
runNode('behavioral case validation', path.join(projectRoot, 'behavioral-evals', 'run.js'), ['validate']);
|
|
84
|
-
// 3b. Run Fable model mode contract tests (selector + router separation)
|
|
85
101
|
console.log('\n[Phase 3b] Fable Model Mode Contract Tests...');
|
|
86
102
|
const fableModeTestPath = path.join(projectRoot, 'ci', 'fable-mode-test.js');
|
|
87
103
|
if (fs.existsSync(fableModeTestPath)) {
|
|
@@ -96,7 +112,6 @@ if (fs.existsSync(fableModeTestPath)) {
|
|
|
96
112
|
console.warn(" ⚠️ ci/fable-mode-test.js not found. Skipping Phase 3.");
|
|
97
113
|
}
|
|
98
114
|
|
|
99
|
-
// 4. Hook/mechanism checks.
|
|
100
115
|
console.log('\n[Phase 4] Mechanism Test Suite (Claude Code hooks)...');
|
|
101
116
|
runNode('mechanism suite', path.join(projectRoot, 'ci', 'mechanism-test.js'));
|
|
102
117
|
|
package/skill-creator/SKILL.md
CHANGED
|
@@ -4,20 +4,18 @@ description: Author, audit, and refactor SKILL.md files against one quality bar
|
|
|
4
4
|
license: Apache-2.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: Miya Daniel
|
|
7
|
-
version: 0.
|
|
7
|
+
version: 0.4.0
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# Skill Creator
|
|
11
11
|
|
|
12
|
-
SKILL.md authoring and audit.
|
|
13
|
-
|
|
14
12
|
## USE FOR:
|
|
15
13
|
- Create a skill from scratch
|
|
16
14
|
- Audit/refactor a SKILL.md; check overlap between skills
|
|
17
|
-
- Packaging a session insight as a dynamic skill
|
|
15
|
+
- Packaging a session insight as a dynamic skill
|
|
18
16
|
|
|
19
17
|
## DO NOT USE FOR:
|
|
20
|
-
-
|
|
18
|
+
- Non-skill project docs — use `repo-docs`/`to-spec`
|
|
21
19
|
- Third-party skill installs (find-skills)
|
|
22
20
|
- Code style outside SKILL.md files
|
|
23
21
|
|
|
@@ -28,22 +26,22 @@ SKILL.md authoring and audit.
|
|
|
28
26
|
| **Trigger / Input** | New skill; SKILL.md audit; self-evolve packaging. |
|
|
29
27
|
| **Expected Output** | SKILL.md passing the Quality Checklist. |
|
|
30
28
|
| **State Mutations** | Writes `<skill>/SKILL.md`; updates registry/generated folder. |
|
|
31
|
-
| **Enforcement Gate** | Quality Checklist
|
|
29
|
+
| **Enforcement Gate** | Quality Checklist before registering, incl. USE FOR/DO NOT USE FOR (`<skills-repo-root>/ci/consistency-check.js`). |
|
|
32
30
|
|
|
33
31
|
## Authoring Workflow
|
|
34
32
|
|
|
35
|
-
1. Grep the registry for near-duplicates; the when-to-fire sentence becomes the
|
|
36
|
-
2. Draft the Contract table first (forces the Enforcement Gate), then steps/flat reference; push branch-only detail to references/.
|
|
33
|
+
1. Grep the registry for near-duplicates; the when-to-fire sentence becomes the description.
|
|
34
|
+
2. Draft the Contract table first (forces the Enforcement Gate), then `## USE FOR:`/`## DO NOT USE FOR:`, then steps/flat reference; push branch-only detail to references/.
|
|
37
35
|
3. A/B-test via `multi-agent-workspace` subagents; read both transcripts.
|
|
38
|
-
4. Run the Quality Checklist; register (static
|
|
36
|
+
4. Run the Quality Checklist; register (static quotes the description; dynamic below).
|
|
39
37
|
|
|
40
38
|
## Dynamic Skill Generation Contract
|
|
41
39
|
|
|
42
|
-
Only generalizable
|
|
40
|
+
Only generalizable procedures/enforcement contracts qualify; simple constraints go to `<workspace>/memories/repo/RULES.md`.
|
|
43
41
|
|
|
44
|
-
- Location:
|
|
45
|
-
- Frontmatter
|
|
42
|
+
- Location: `<workspace>/.claude/harness-everything/skills/generated/<kebab-case-name>/SKILL.md`
|
|
43
|
+
- Frontmatter: triggers (3-6 keywords), metadata type/generated/source/status: draft.
|
|
46
44
|
- Gate: Quality Checklist first.
|
|
47
|
-
- Lifecycle: draft → active after firing
|
|
45
|
+
- Lifecycle: draft → active after firing elsewhere; deprecate, don't delete; promote once proven general.
|
|
48
46
|
|
|
49
|
-
Deep dive: references/
|
|
47
|
+
Deep dive: <this-skill-dir>/references/quality-checklist.md
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
A skill isn't done until every line here is true. This is deliberately a flat checklist, not steps — check them in any order, but check all of them.
|
|
6
6
|
|
|
7
7
|
- [ ] **Skill Contract table present and accurate** — all four rows; Enforcement Gate names a real script/exit-code or an explicit "None" if the skill is pure reference.
|
|
8
|
+
- [ ] **`## USE FOR:` and `## DO NOT USE FOR:` sections present**, each a flat bullet list starting on its own line (`^## USE FOR:` / `^## DO NOT USE FOR:`). Required by `<skills-repo-root>/ci/consistency-check.js` (`npm run test:consistency`) — missing either fails the repo's own consistency gate, not just this checklist.
|
|
8
9
|
- [ ] **Single source of truth**: the frontmatter `description` is the *only* place this skill's purpose is originally written. The registry row and any `tier-router.js` line quote or tightly paraphrase it — they don't independently re-describe the skill.
|
|
9
10
|
- [ ] **No block over ~5 lines duplicated verbatim elsewhere** — in this file or in another always/near-always-loaded skill. (`install-cognitive-os` vs. `harness-everything`'s 33-line ADHD-output block, flagged in the audit report, is the canonical counter-example — don't add a second one.)
|
|
10
11
|
- [ ] **Every `MUST`/`MUST NOT`/`PROHIBITED` has a real gate behind it**, or is rewritten as a positive statement of the target behavior. A prohibition with no gate and no "why" sentence next to it is a smell, not a strength.
|
package/skill-style/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: Apply Harness style guidelines when writing or refactoring SKILL.md
|
|
|
4
4
|
license: Apache-2.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: Miya Daniel
|
|
7
|
-
version: 0.
|
|
7
|
+
version: 0.4.0
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# Skill Style
|
|
@@ -27,7 +27,7 @@ Apply the Harness writing standard when creating or refactoring `SKILL.md` files
|
|
|
27
27
|
- Checking whether a skill overlaps an existing OS/domain skill
|
|
28
28
|
|
|
29
29
|
## DO NOT USE FOR:
|
|
30
|
-
- Interviewing intent, drafting, or testing a skill against real prompts (load
|
|
30
|
+
- Interviewing intent, drafting, or testing a skill against real prompts (load `<skills-repo-root>/skill-creator/SKILL.md`)
|
|
31
31
|
- Routing rules for dynamically generated mid-session skills owned by `self-evolve`
|
|
32
32
|
- Non-Harness skill formats outside `harness-everything`
|
|
33
33
|
|
|
@@ -37,6 +37,6 @@ Apply the Harness writing standard when creating or refactoring `SKILL.md` files
|
|
|
37
37
|
2. MUST include, in order: title, introduction, Skill Contract, usage, and actionable rules.
|
|
38
38
|
3. MUST use imperative language and name the enforcing command or gate.
|
|
39
39
|
4. MUST avoid overlap with OS-layer routing or domain expertise.
|
|
40
|
-
5. For intent interviews, drafting, and prompt tests, load
|
|
40
|
+
5. For intent interviews, drafting, and prompt tests, load `<skills-repo-root>/skill-creator/SKILL.md`.
|
|
41
41
|
|
|
42
|
-
Deep dive:
|
|
42
|
+
Deep dive: `<this-skill-dir>/references/style-guide.md`
|
|
@@ -27,10 +27,36 @@ Every SKILL.md MUST include this table exactly:
|
|
|
27
27
|
## 2. Tone & Voice
|
|
28
28
|
- **Anti-Linear / Anti-Prose**: Do not write long paragraphs. Map actions to specific `run_in_terminal` commands.
|
|
29
29
|
- **Absolute Imperatives**: Use "MUST", "MUST NOT", "ALWAYS". Do not use "suggest".
|
|
30
|
-
- **Script-Driven Enforcement**: Do not write "You should check your code". Write "You MUST run `node harness-everything/scripts/verify-gate.js`. If Exit Code 1, you MUST reflect and retry."
|
|
30
|
+
- **Script-Driven Enforcement**: Do not write "You should check your code". Write "You MUST run `node <skills-repo-root>/harness-everything/scripts/verify-gate.js`. If Exit Code 1, you MUST reflect and retry."
|
|
31
31
|
|
|
32
|
-
## 3.
|
|
32
|
+
## 3. Path Notation
|
|
33
|
+
Every path a `SKILL.md` names is checked by `node <skills-repo-root>/ci/reference-check.js`. Every checked path MUST name its base explicitly: use `<this-skill-dir>/` for the skill that names it, `<skills-repo-root>/` for this package, and `<workspace>/` for the user's project.
|
|
34
|
+
|
|
35
|
+
| Form | Base | Checked? |
|
|
36
|
+
| :--- | :--- | :--- |
|
|
37
|
+
| `<this-skill-dir>/references/x.md`, `<this-skill-dir>/../x.md` | this skill's own directory | yes |
|
|
38
|
+
| `<skills-repo-root>/skill-creator/SKILL.md` | another skill in this package | yes |
|
|
39
|
+
| `<skills-repo-root>/hooks/x.js` | the root of this package | yes |
|
|
40
|
+
| `<workspace>/anywhere/x.md` | a path in the USER's project | no - recorded as intentional |
|
|
41
|
+
|
|
42
|
+
- **MUST** use one of the three markers. Bare `references/x.md`, `../x.md`, or `ci/x.js` is a hard failure, not a guess.
|
|
43
|
+
- **MUST NOT** invent a new placeholder. An unrecognised one is a hard failure, not a skip - a typo like `<this_folder>/` would otherwise make every path in the file invisible to the gate. Register a genuinely new one in `<skills-repo-root>/ci/reference-check.js`.
|
|
44
|
+
- Use `<workspace>/` for every user-project path. It always wins over any package rule.
|
|
45
|
+
- Markers cost words, but explicit bases prevent a top-level directory from silently changing a path's meaning. Keep the top-level body short and put explanation in the workflow or references rung.
|
|
46
|
+
- A bare filename with no directory (`CONTEXT.md`, `package.json`) is prose and stays unchecked. Give it a directory when you mean a specific file.
|
|
47
|
+
|
|
48
|
+
## 4. Progressive Disclosure
|
|
49
|
+
|
|
50
|
+
Keep each skill in three clear rungs:
|
|
51
|
+
|
|
52
|
+
1. `SKILL.md` contains the trigger, contract, short imperative workflow, `USE FOR`/`DO NOT USE FOR`, and one valid `Deep dive:` entry point. Keep its body at or below 330 words, the local proxy for waza's 500-token limit.
|
|
53
|
+
2. `docs/workflows/<skill>.md` explains the same workflow in plain language. It must contain at least one meaningful Mermaid diagram showing a real sequence, state change, or decision. Complex workflows need separate diagrams for distinct branches; repeated decorative graphs do not count.
|
|
54
|
+
3. `references/` or `guides/` holds detailed procedures, examples, and checklists. Load these files only when the task reaches that detail.
|
|
55
|
+
|
|
56
|
+
Do not put Mermaid source in `SKILL.md`, copy a full guide into the top-level file, or change a `description:` during a content-only rewrite. The description is a routing API and must remain byte-identical unless a routing change is intentional.
|
|
57
|
+
|
|
58
|
+
## 5. Avoid Functional Overlap
|
|
33
59
|
- **OS Skills vs. Domain Skills**: Distinguish between the OS layer (which routes and constrains behavior) and the Domain layer (which provides deep technical expertise).
|
|
34
60
|
|
|
35
|
-
##
|
|
61
|
+
## 6. For the fuller authoring & quality workflow, see `skill-creator`
|
|
36
62
|
This document is the terse format spec — the Skill Contract table shape and the tone rules. For interviewing intent, drafting, testing a skill against real prompts, pruning duplication/no-op/sprawl, and the rules for skills `self-evolve` generates dynamically mid-session, load `skill-creator/SKILL.md` instead. It builds on this spec rather than replacing it.
|