harness-everything 0.3.6 → 0.4.0
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/ci.yml +23 -18
- package/.github/workflows/release.yml +53 -27
- package/.releaserc.json +113 -0
- package/AGENTS.md +34 -23
- package/BENCHMARK_SOP.md +38 -18
- package/CHANGELOG.md +194 -3
- package/CONTRIBUTING.md +17 -4
- package/PRIVACY.md +25 -0
- package/README.md +118 -87
- package/RELEASING.md +82 -0
- package/SUPPORT.md +27 -0
- package/TERMS.md +21 -0
- package/VERIFICATION.md +175 -286
- 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/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 +25 -0
- package/docs/routing.md +157 -44
- package/docs/security-audit.md +38 -0
- package/docs/troubleshooting.md +82 -46
- 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 +16 -3
- 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/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
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const fs = require('fs');
|
|
3
|
+
const path = require('path');
|
|
4
|
+
const {
|
|
5
|
+
getWorkspaceRoot,
|
|
6
|
+
getSessionId,
|
|
7
|
+
getSessionDir,
|
|
8
|
+
writeCurrentSession,
|
|
9
|
+
pruneStaleSessions,
|
|
10
|
+
} = require('../../hooks/scripts/lib/harness-state');
|
|
11
|
+
|
|
12
|
+
console.log("Bootstrapping Harness Skills OS...");
|
|
13
|
+
|
|
14
|
+
// SessionStart hooks receive a payload with session_id via stdin, same as
|
|
15
|
+
// every other hook. Read it synchronously up front - bootstrap has no
|
|
16
|
+
// tool-call latency to protect, so there's no fast-path tradeoff here - but
|
|
17
|
+
// skip entirely on an interactive TTY (manual run) where reading fd 0 would
|
|
18
|
+
// just hang waiting for input that's never coming.
|
|
19
|
+
let payload = null;
|
|
20
|
+
if (!process.stdin.isTTY) {
|
|
21
|
+
try {
|
|
22
|
+
const raw = fs.readFileSync(0, 'utf8');
|
|
23
|
+
payload = JSON.parse(raw);
|
|
24
|
+
} catch (err) {
|
|
25
|
+
// No payload piped in, or invalid JSON - fall back to 'default'.
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const sessionId = getSessionId(payload);
|
|
29
|
+
|
|
30
|
+
const root = getWorkspaceRoot(payload);
|
|
31
|
+
|
|
32
|
+
// Guard: only materialize state in a workspace that actually has Harness
|
|
33
|
+
// installed. Without this, running a Claude session in any random folder
|
|
34
|
+
// (or using the agent for non-engineering chat) would still create
|
|
35
|
+
// state directories and session files there. A workspace counts as
|
|
36
|
+
// managed when it is a git repo AND carries at least one Harness install
|
|
37
|
+
// marker - or IS the harness-everything source repo itself (so manual
|
|
38
|
+
// VERIFICATION.md runs keep working after a fresh clone).
|
|
39
|
+
function isManagedWorkspace(wsRoot) {
|
|
40
|
+
if (!fs.existsSync(path.join(wsRoot, '.git'))) return false;
|
|
41
|
+
if (fs.existsSync(path.join(wsRoot, 'harness-everything', 'scripts', 'bootstrap.js'))) return true;
|
|
42
|
+
const markers = [
|
|
43
|
+
path.join(wsRoot, '.claude', 'settings.json'),
|
|
44
|
+
path.join(wsRoot, '.cursorrules'),
|
|
45
|
+
path.join(wsRoot, '.github', 'copilot-instructions.md'),
|
|
46
|
+
path.join(wsRoot, 'AGENTS.md'),
|
|
47
|
+
path.join(wsRoot, '.continue', 'rules', 'harness.md'),
|
|
48
|
+
path.join(wsRoot, '.hermes.md'),
|
|
49
|
+
];
|
|
50
|
+
return markers.some(m => fs.existsSync(m));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (!isManagedWorkspace(root)) {
|
|
54
|
+
// Stay completely silent: hooks must never surprise the user with files
|
|
55
|
+
// or output in workspaces Harness was never installed into.
|
|
56
|
+
process.exit(0);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Nothing purges old session directories the way an OS temp dir would -
|
|
60
|
+
// drop ones untouched for a while so .claude/harness-everything/state/sessions/ doesn't
|
|
61
|
+
// grow forever.
|
|
62
|
+
pruneStaleSessions(root);
|
|
63
|
+
|
|
64
|
+
// The manual escape hatch (reset-circuit-breaker.js) and any CLI tool that
|
|
65
|
+
// can't see a session_id, resolve "current session" through
|
|
66
|
+
// this pointer.
|
|
67
|
+
writeCurrentSession(root, sessionId);
|
|
68
|
+
|
|
69
|
+
const harnessDir = getSessionDir(root, sessionId);
|
|
70
|
+
|
|
71
|
+
// The Rule of 3 circuit breaker (hooks/scripts/rule-of-3.js) locks all
|
|
72
|
+
// Bash/Edit/Write calls once tripped; the only in-session exits are a valid
|
|
73
|
+
// zoom-out reflection report or a human reset. A new SessionStart means the
|
|
74
|
+
// human has taken over (new session, /clear, /compact) and reviewed the
|
|
75
|
+
// situation, so it's safe to clear here. The stale reflection report goes
|
|
76
|
+
// with it - it belongs to the previous loop, not this session.
|
|
77
|
+
const circuitBreakerFile = path.join(harnessDir, 'rule-of-3-state.json');
|
|
78
|
+
if (fs.existsSync(circuitBreakerFile)) {
|
|
79
|
+
try {
|
|
80
|
+
fs.unlinkSync(circuitBreakerFile);
|
|
81
|
+
console.log("Rule of 3 circuit breaker state cleared for new session.");
|
|
82
|
+
} catch (err) {
|
|
83
|
+
// Ignore; worst case the breaker stays tripped until manually reset.
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const zoomOutReportFile = path.join(harnessDir, 'zoom-out-report.md');
|
|
87
|
+
if (fs.existsSync(zoomOutReportFile)) {
|
|
88
|
+
try {
|
|
89
|
+
fs.unlinkSync(zoomOutReportFile);
|
|
90
|
+
} catch (err) {
|
|
91
|
+
// Ignore; rule-of-3.js already rejects reports older than the last failure.
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Same reasoning: a stale subagent-scope baseline from a previous session
|
|
96
|
+
// would make the first Task burst of this session diff against the wrong
|
|
97
|
+
// starting point.
|
|
98
|
+
const subagentScopeFile = path.join(harnessDir, 'subagent-scope-state.json');
|
|
99
|
+
if (fs.existsSync(subagentScopeFile)) {
|
|
100
|
+
try {
|
|
101
|
+
fs.unlinkSync(subagentScopeFile);
|
|
102
|
+
} catch (err) {
|
|
103
|
+
// Ignore.
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Self-heal audit: report missing platform integration touchpoints so the
|
|
108
|
+
// model (per harness-everything SKILL.md) repairs them via self-heal.js.
|
|
109
|
+
// Audit-and-report only - bootstrap never writes these files itself, so a
|
|
110
|
+
// user who intentionally removed one isn't fought every session start.
|
|
111
|
+
try {
|
|
112
|
+
const MARKER = 'Harness OS Guidance (Advisory)';
|
|
113
|
+
const HOOK_ID = 'harness:pre:bootstrap';
|
|
114
|
+
const workspaceRoot = getWorkspaceRoot(payload);
|
|
115
|
+
const contains = (p, needle) => {
|
|
116
|
+
try { return fs.readFileSync(p, 'utf8').includes(needle); } catch (e) { return false; }
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const isClaudeEnv = process.env.CLAUDE_CODE === 'true' || process.env.SHELL?.includes('claude-code') || false;
|
|
120
|
+
const isCursorEnv = process.env.TERM_PROGRAM === 'cursor' || process.env.CURSOR_SANDBOX !== undefined || false;
|
|
121
|
+
const isCopilotEnv = process.env.GITHUB_COPILOT_CHAT === 'true' || process.env.COPILOT_AGENT === '1' || process.env.AI_AGENT?.includes('copilot') || process.env.TERM_PROGRAM === 'vscode' || process.env.VSCODE_PID !== undefined || false;
|
|
122
|
+
|
|
123
|
+
const hasClaude = fs.existsSync(path.join(workspaceRoot, '.claude'));
|
|
124
|
+
const hasCursor = fs.existsSync(path.join(workspaceRoot, '.cursorrules')) || fs.existsSync(path.join(workspaceRoot, '.cursor'));
|
|
125
|
+
const hasCopilot = fs.existsSync(path.join(workspaceRoot, '.github', 'copilot-instructions.md'));
|
|
126
|
+
const hasCodex = fs.existsSync(path.join(workspaceRoot, 'AGENTS.md'));
|
|
127
|
+
|
|
128
|
+
const activePlatforms = {
|
|
129
|
+
claude: isClaudeEnv || hasClaude,
|
|
130
|
+
cursor: isCursorEnv || hasCursor,
|
|
131
|
+
copilot: (!isClaudeEnv && !isCursorEnv && isCopilotEnv) || hasCopilot,
|
|
132
|
+
codex: hasCodex
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// If no platforms are active, fallback to current environment
|
|
136
|
+
const hasAnyActive = Object.values(activePlatforms).some(v => v);
|
|
137
|
+
if (!hasAnyActive) {
|
|
138
|
+
if (isClaudeEnv) {
|
|
139
|
+
activePlatforms.claude = true;
|
|
140
|
+
} else if (isCursorEnv) {
|
|
141
|
+
activePlatforms.cursor = true;
|
|
142
|
+
} else {
|
|
143
|
+
activePlatforms.copilot = true;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const missing = [];
|
|
148
|
+
if (activePlatforms.claude && !contains(path.join(workspaceRoot, '.claude', 'settings.json'), HOOK_ID)) {
|
|
149
|
+
missing.push('.claude/settings.json (Claude Code hooks)');
|
|
150
|
+
}
|
|
151
|
+
if (activePlatforms.cursor && !contains(path.join(workspaceRoot, '.cursorrules'), MARKER)) {
|
|
152
|
+
missing.push('.cursorrules (Cursor)');
|
|
153
|
+
}
|
|
154
|
+
if (activePlatforms.copilot && !contains(path.join(workspaceRoot, '.github', 'copilot-instructions.md'), MARKER)) {
|
|
155
|
+
missing.push('.github/copilot-instructions.md (Copilot)');
|
|
156
|
+
}
|
|
157
|
+
if (activePlatforms.codex && !contains(path.join(workspaceRoot, 'AGENTS.md'), MARKER)) {
|
|
158
|
+
missing.push('AGENTS.md (Codex)');
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Identity, not path: __dirname/../.. is the INSTALLED copy's root, so an
|
|
162
|
+
// npx/global install auditing the harness checkout itself compares two
|
|
163
|
+
// different paths and wrongly advises a repair that self-heal then skips
|
|
164
|
+
// (issue #40). Required lazily so a missing lib can never break session start.
|
|
165
|
+
const { isHarnessRepo } = require('../../scripts/lib/workspace');
|
|
166
|
+
const auditingSelf = isHarnessRepo(workspaceRoot)
|
|
167
|
+
|| path.resolve(workspaceRoot) === path.resolve(__dirname, '..', '..');
|
|
168
|
+
|
|
169
|
+
if (missing.length > 0 && !auditingSelf) {
|
|
170
|
+
console.log(`\n[Self-Heal] Missing integration touchpoints: ${missing.join(', ')}`);
|
|
171
|
+
console.log(`[Self-Heal] Repair (idempotent): node "${path.join(__dirname, 'self-heal.js')}"`);
|
|
172
|
+
}
|
|
173
|
+
} catch (err) {
|
|
174
|
+
// Audit is best-effort; never block session start.
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Check for handoff/state checkpoint from previous session
|
|
178
|
+
const handoffFile = path.join(harnessDir, 'handoff-state.json');
|
|
179
|
+
if (fs.existsSync(handoffFile)) {
|
|
180
|
+
try {
|
|
181
|
+
const handoff = JSON.parse(fs.readFileSync(handoffFile, 'utf8'));
|
|
182
|
+
if (handoff.status === 'failed') {
|
|
183
|
+
const exitStr = handoff.exitCode ? ` (exit code ${handoff.exitCode})` : '';
|
|
184
|
+
const border = "─".repeat(60);
|
|
185
|
+
console.log(`\n┌${border}┐`);
|
|
186
|
+
console.log(`│ Harness OS - Handoff Checkpoint │`);
|
|
187
|
+
console.log(`├${border}┤`);
|
|
188
|
+
console.log(`│ - Last active action failed${exitStr.padEnd(30)} │`);
|
|
189
|
+
console.log(`│ - Action: ${String(handoff.tool || 'unknown').padEnd(46)} │`);
|
|
190
|
+
console.log(`│ - Last error output snippet: │`);
|
|
191
|
+
|
|
192
|
+
const snippet = handoff.errorSummary || 'No snippet available';
|
|
193
|
+
const lines = snippet.split('\n').map(l => l.trim()).filter(Boolean).slice(-3);
|
|
194
|
+
if (lines.length > 0) {
|
|
195
|
+
lines.forEach(line => {
|
|
196
|
+
const paddedLine = line.slice(0, 54).padEnd(54);
|
|
197
|
+
console.log(`│ > ${paddedLine} │`);
|
|
198
|
+
});
|
|
199
|
+
} else {
|
|
200
|
+
console.log(`│ > None │`);
|
|
201
|
+
}
|
|
202
|
+
console.log(`├${border}┤`);
|
|
203
|
+
console.log(`│ Hint: Use this context to continue resolving the issue │`);
|
|
204
|
+
console.log(`│ efficiently or start on a new path. │`);
|
|
205
|
+
console.log(`└${border}┘\n`);
|
|
206
|
+
}
|
|
207
|
+
} catch (err) {
|
|
208
|
+
// Ignore malformed files
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
console.log("Harness OS initialized. Ready for user prompt.");
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ENSEMBLE_MAX_CANDIDATES = 3;
|
|
4
|
+
|
|
5
|
+
function unique(values) {
|
|
6
|
+
return [...new Set((values || []).filter(Boolean))];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function detectEnsembleTaskSignals(prompt) {
|
|
10
|
+
const text = String(prompt || '');
|
|
11
|
+
const comparableOutput = /\b(?:choice|choose|decision|decide|ranking|rank|ranked|verdict|recommendation|recommend|compare alternatives?|compare approaches?|which (?:option|approach|design)|select between|trade[- ]offs?)\b/i.test(text) ||
|
|
12
|
+
/(?:選擇|決策|排名|判定|建議|比較方案|比較方法|取捨)/.test(text);
|
|
13
|
+
const explicitDisagreement = /\b(?:disagreement|dissent|minority (?:view|position)|competing (?:answers|positions|approaches)|preserve disagreement)\b/i.test(text) ||
|
|
14
|
+
/(?:分歧|不同意見|少數意見|競爭方案)/.test(text);
|
|
15
|
+
const creativeGeneration = /\b(?:creative|brainstorm|story|poem|fiction|slogan|tagline|copywriting|marketing copy|logo|illustration|artwork|lyrics?|name ideas?|generate ideas?)\b/i.test(text) ||
|
|
16
|
+
/(?:創意|腦力激盪|故事|詩|標語|文案|插畫|歌詞|命名)/.test(text);
|
|
17
|
+
const mechanicalWork = /\b(?:mechanical|bulk rename|mass rename|rename all|replace all|reformat|format all|lint[- ]fix|sort imports?|codemod|repetitive edits?|generated files?|migrate all identifiers?)\b/i.test(text) ||
|
|
18
|
+
/(?:機械式|批次重新命名|全部取代|大量重複修改|格式化全部)/.test(text);
|
|
19
|
+
const highStakes = /\b(?:high[- ]stakes|safety[- ]critical|security[- ]critical|critical decision|material risk)\b/i.test(text) ||
|
|
20
|
+
/(?:高風險|高利害|關鍵決策)/.test(text);
|
|
21
|
+
return {
|
|
22
|
+
comparableOutput,
|
|
23
|
+
explicitDisagreement,
|
|
24
|
+
creativeGeneration,
|
|
25
|
+
mechanicalWork,
|
|
26
|
+
highStakes,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function applyEnsemblePolicy(contract, prompt) {
|
|
31
|
+
if (!contract || typeof contract !== 'object' || !contract.workflowPlan || !contract.taskShape) return contract;
|
|
32
|
+
const plan = contract.workflowPlan;
|
|
33
|
+
const shape = contract.taskShape;
|
|
34
|
+
const explicit = shape.explicitRequest || {};
|
|
35
|
+
const prohibitions = Array.isArray(explicit.prohibitions) ? explicit.prohibitions : [];
|
|
36
|
+
const signals = detectEnsembleTaskSignals(prompt);
|
|
37
|
+
const highUncertainty = shape.uncertainty === 'high';
|
|
38
|
+
const fableTopology = typeof plan.strategy === 'string' && plan.strategy.startsWith('fable-');
|
|
39
|
+
const comparable = signals.comparableOutput || signals.explicitDisagreement;
|
|
40
|
+
|
|
41
|
+
const reasonCodes = [];
|
|
42
|
+
if (highUncertainty) reasonCodes.push('high-uncertainty');
|
|
43
|
+
if (signals.highStakes) reasonCodes.push('high-stakes');
|
|
44
|
+
if (signals.comparableOutput) reasonCodes.push('comparable-output');
|
|
45
|
+
if (signals.explicitDisagreement) reasonCodes.push('explicit-disagreement');
|
|
46
|
+
|
|
47
|
+
let selected = (highUncertainty || signals.highStakes) && comparable && fableTopology;
|
|
48
|
+
if (signals.creativeGeneration) {
|
|
49
|
+
selected = false;
|
|
50
|
+
reasonCodes.push('ensemble-excluded-creative-generation');
|
|
51
|
+
}
|
|
52
|
+
if (signals.mechanicalWork) {
|
|
53
|
+
selected = false;
|
|
54
|
+
reasonCodes.push('ensemble-excluded-mechanical-work');
|
|
55
|
+
}
|
|
56
|
+
if (prohibitions.includes('ensemble')) {
|
|
57
|
+
selected = false;
|
|
58
|
+
reasonCodes.push('user-prohibited-ensemble');
|
|
59
|
+
}
|
|
60
|
+
if (shape.hostCapabilities && shape.hostCapabilities.subagents === 'unavailable') {
|
|
61
|
+
selected = false;
|
|
62
|
+
reasonCodes.push('ensemble-subagents-unavailable');
|
|
63
|
+
}
|
|
64
|
+
if (plan.fallback && plan.fallback.disposition === 'blocked') {
|
|
65
|
+
selected = false;
|
|
66
|
+
reasonCodes.push('ensemble-base-plan-blocked');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
plan.reasonCodes = unique([...(plan.reasonCodes || []), ...reasonCodes]);
|
|
70
|
+
if (!selected) {
|
|
71
|
+
plan.ensemble = null;
|
|
72
|
+
return contract;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const selectionReason = signals.explicitDisagreement
|
|
76
|
+
? 'ensemble-disagreement-deliverable'
|
|
77
|
+
: signals.highStakes
|
|
78
|
+
? 'ensemble-high-stakes-comparable-output'
|
|
79
|
+
: 'ensemble-high-uncertainty-comparable-output';
|
|
80
|
+
|
|
81
|
+
plan.ensemble = {
|
|
82
|
+
maxCandidates: ENSEMBLE_MAX_CANDIDATES,
|
|
83
|
+
diversity: ['model', 'prompt', 'evidence'],
|
|
84
|
+
synthesis: 'preserve-disagreement',
|
|
85
|
+
verifier: 'independent',
|
|
86
|
+
reasonCodes: unique([selectionReason, ...reasonCodes]),
|
|
87
|
+
};
|
|
88
|
+
plan.patterns = unique([...(plan.patterns || []), 'parallel-self-consistency']);
|
|
89
|
+
plan.requiredInvariants = unique([
|
|
90
|
+
...(plan.requiredInvariants || []),
|
|
91
|
+
'preserve-disagreement',
|
|
92
|
+
'independent-ensemble-verifier',
|
|
93
|
+
]);
|
|
94
|
+
plan.reasonCodes = unique([...(plan.reasonCodes || []), 'ensemble-review-selected']);
|
|
95
|
+
return contract;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
module.exports = {
|
|
99
|
+
ENSEMBLE_MAX_CANDIDATES,
|
|
100
|
+
applyEnsemblePolicy,
|
|
101
|
+
detectEnsembleTaskSignals,
|
|
102
|
+
};
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const crypto = require('crypto');
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const os = require('os');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const { spawnSync } = require('child_process');
|
|
7
|
+
const {
|
|
8
|
+
createDegradedRouterContract,
|
|
9
|
+
validateRouterContract,
|
|
10
|
+
} = require('./router-contract');
|
|
11
|
+
const { applyEnsemblePolicy } = require('./ensemble-policy');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Harness Kernel Router
|
|
15
|
+
*
|
|
16
|
+
* tier-router remains the human-readable classifier/guide detector. The
|
|
17
|
+
* kernel consumes its versioned side-channel JSON contract instead of
|
|
18
|
+
* scraping human-readable stdout. Phase 2 selects an execution topology, but
|
|
19
|
+
* the router still only emits a plan: executors retain responsibility for
|
|
20
|
+
* spawning agents, creating workspaces, running tools, and enforcing gates.
|
|
21
|
+
* Phase 4 attaches ensemble-review only as a post-selection modifier.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const INVARIANT_TEXT = {
|
|
25
|
+
'scope-lock': 'Route before execution: stay inside the authorized task/repository scope.',
|
|
26
|
+
'verify-before-claim': 'Verify before claim: completion claims require objective evidence appropriate to the change.',
|
|
27
|
+
'replan-after-repeated-failure': 'Re-plan on repetition: after 3 same-signature failures, stop micro-retrying and zoom out/re-diagnose.',
|
|
28
|
+
'loop-budget': 'Stop iterative-single when its explicit iteration budget is exhausted.',
|
|
29
|
+
'objective-verification': 'Use an objective check for iterative work; self-critique alone is not verification.',
|
|
30
|
+
'stage-contracts': 'Fable stages must have explicit stage contracts and pass conditions.',
|
|
31
|
+
'cold-verification': 'Fable delivery requires a cold/independent verifier where specified.',
|
|
32
|
+
'parallel-scope-contract': 'Parallel work requires declared independent scopes and non-overlapping/read-only writes.',
|
|
33
|
+
'synthesis-barrier': 'Do not claim parallel completion until all workstreams reach the synthesis barrier.',
|
|
34
|
+
'handoff-contracts': 'Multi-agent workspace work uses orchestrator-owned handoff contracts; workers do not form a peer mesh.',
|
|
35
|
+
'workspace-state': 'Durable workspace state remains scoped to the workspace and existing state conventions.',
|
|
36
|
+
'pre-action-approval': 'Irreversible/external side effects require approval before the exact payload executes.',
|
|
37
|
+
'preserve-disagreement': 'Ensemble synthesis must retain unresolved minority positions and evidence gaps.',
|
|
38
|
+
'independent-ensemble-verifier': 'Ensemble delivery requires a verifier independent from the candidate identities; agreement alone is not proof.',
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const SKILL_TEXT = {
|
|
42
|
+
'tdd': 'tdd: useful for behavioral changes where executable tests can drive the implementation.',
|
|
43
|
+
'verification-loop': 'verification-loop: useful for systematic build/lint/test/diff evidence before delivery.',
|
|
44
|
+
'fable-mode': 'fable-mode / fable-discipline: useful for macro planning or deliberate multi-agent decomposition.',
|
|
45
|
+
'fable-discipline': null,
|
|
46
|
+
'multi-agent-workspace': 'multi-agent-workspace: useful when durable bounded delegation, handoffs, or workspace memory are required.',
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
function sanitizeClassifierOutput(stdout) {
|
|
50
|
+
const lines = String(stdout || '').split(/\r?\n/);
|
|
51
|
+
const filtered = [];
|
|
52
|
+
let skipLegacyContinuation = false;
|
|
53
|
+
|
|
54
|
+
for (const line of lines) {
|
|
55
|
+
if (line.includes('=> BASE EXECUTION LOOP:')) {
|
|
56
|
+
skipLegacyContinuation = true;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (skipLegacyContinuation && line.includes('Track exactly ONE item in-progress')) {
|
|
60
|
+
skipLegacyContinuation = false;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
skipLegacyContinuation = false;
|
|
64
|
+
filtered.push(line);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return filtered.join('\n').replace(/\n{3,}/g, '\n\n').trimEnd();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function readStructuredContract(contractPath) {
|
|
71
|
+
try {
|
|
72
|
+
const parsed = JSON.parse(fs.readFileSync(contractPath, 'utf8'));
|
|
73
|
+
const validation = validateRouterContract(parsed);
|
|
74
|
+
if (!validation.valid) {
|
|
75
|
+
return createDegradedRouterContract(
|
|
76
|
+
'router-contract-invalid',
|
|
77
|
+
`Structured router contract failed validation: ${validation.errors.join('; ')}`,
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
return parsed;
|
|
81
|
+
} catch (err) {
|
|
82
|
+
return createDegradedRouterContract(
|
|
83
|
+
'router-contract-unavailable',
|
|
84
|
+
`Structured router contract unavailable: ${err.message}`,
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function resolvePrompt(prompt, stdinPayload) {
|
|
90
|
+
if (prompt) return prompt;
|
|
91
|
+
if (!stdinPayload) return '';
|
|
92
|
+
try {
|
|
93
|
+
const payload = JSON.parse(stdinPayload);
|
|
94
|
+
return typeof payload.prompt === 'string' ? payload.prompt : '';
|
|
95
|
+
} catch (_) {
|
|
96
|
+
return '';
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function printWorkflowPlan(plan) {
|
|
101
|
+
const visible = {
|
|
102
|
+
schemaVersion: plan.schemaVersion,
|
|
103
|
+
routingStatus: plan.routingStatus,
|
|
104
|
+
tier: plan.tier,
|
|
105
|
+
strategy: plan.strategy,
|
|
106
|
+
strategySelection: plan.strategySelection,
|
|
107
|
+
actionGate: plan.actionGate,
|
|
108
|
+
limits: plan.limits,
|
|
109
|
+
parallelism: plan.parallelism,
|
|
110
|
+
workspace: plan.workspace,
|
|
111
|
+
memory: plan.memory,
|
|
112
|
+
verification: plan.verification,
|
|
113
|
+
ensemble: plan.ensemble,
|
|
114
|
+
fallback: plan.fallback,
|
|
115
|
+
reasonCodes: plan.reasonCodes,
|
|
116
|
+
};
|
|
117
|
+
console.log(`\n=> ROUTER WORKFLOW PLAN (JSON): ${JSON.stringify(visible)}`);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function printKernelContract(plan) {
|
|
121
|
+
console.log('\n=> REQUIRED HARNESS INVARIANTS:');
|
|
122
|
+
for (const invariant of plan.requiredInvariants || []) {
|
|
123
|
+
console.log(` - ${invariant}: ${INVARIANT_TEXT[invariant] || 'Required by the selected workflow plan.'}`);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
console.log('\n=> SUGGESTED SKILLS (ADVISORY — no fixed workflow order):');
|
|
127
|
+
if (Array.isArray(plan.suggestedSkills) && plan.suggestedSkills.length > 0) {
|
|
128
|
+
const emitted = new Set();
|
|
129
|
+
for (const skill of plan.suggestedSkills) {
|
|
130
|
+
if (emitted.has(skill)) continue;
|
|
131
|
+
const text = Object.prototype.hasOwnProperty.call(SKILL_TEXT, skill) ? SKILL_TEXT[skill] : `${skill}: advisory for the selected topology.`;
|
|
132
|
+
if (text) console.log(` - ${text}`);
|
|
133
|
+
emitted.add(skill);
|
|
134
|
+
if (skill === 'fable-mode') emitted.add('fable-discipline');
|
|
135
|
+
}
|
|
136
|
+
if (plan.strategy && plan.strategy.startsWith('fable-')) {
|
|
137
|
+
console.log(' - Use these selectively; Tier 3/Fable does not create a universal skill pipeline.');
|
|
138
|
+
}
|
|
139
|
+
} else if (plan.strategy === 'direct-single') {
|
|
140
|
+
console.log(' - No mandatory domain skill. Prefer the bounded direct path and load a focused skill only when it adds value.');
|
|
141
|
+
} else if (plan.strategySelection === 'deferred') {
|
|
142
|
+
console.log(' - Strategy is deferred/unclassified. Do not infer triviality; choose the smallest justified approach from task evidence.');
|
|
143
|
+
} else {
|
|
144
|
+
console.log(' - No additional skill suggestion from the workflow plan.');
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (plan.ensemble) {
|
|
148
|
+
console.log(`\n=> ENSEMBLE REVIEW: bounded to ${plan.ensemble.maxCandidates} candidates; synthesis=${plan.ensemble.synthesis}; verifier=${plan.ensemble.verifier}. Preserve minority positions and do not claim improvement without paired evidence.`);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (plan.actionGate && plan.actionGate.required) {
|
|
152
|
+
console.log(`\n=> ACTION GATE REQUIRED: ${plan.actionGate.reasonCodes.join(', ')}; disposition=${plan.actionGate.disposition}. The router only declares this requirement; execution must not bypass approval.`);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (plan.fallback && plan.fallback.disposition !== 'none') {
|
|
156
|
+
console.log(`\n=> ROUTING FALLBACK: ${plan.fallback.disposition}/${plan.fallback.mode}; ${plan.fallback.reasonCodes.join(', ')}.`);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (plan.routingStatus === 'degraded') {
|
|
160
|
+
console.log('\n=> ROUTING DEGRADATION: Structured routing is degraded. Keep the strategy deferred unless independent evidence supports a route; do not silently downgrade to Tier 1/direct execution.');
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
console.log('\n=> ORCHESTRATION POLICY: Do not enforce workflow order. Enforce workflow invariants from the plan; suggested skills remain advisory. The router plans; execution components execute.');
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function run(prompt, stdinPayload) {
|
|
167
|
+
const classifierPath = path.join(__dirname, 'tier-router.js');
|
|
168
|
+
const contractPath = path.join(os.tmpdir(), `harness-router-${process.pid}-${crypto.randomUUID()}.json`);
|
|
169
|
+
const args = prompt ? [classifierPath, prompt] : [classifierPath];
|
|
170
|
+
const result = spawnSync(process.execPath, args, {
|
|
171
|
+
input: prompt ? undefined : stdinPayload,
|
|
172
|
+
encoding: 'utf8',
|
|
173
|
+
env: {
|
|
174
|
+
...process.env,
|
|
175
|
+
HARNESS_ROUTER_CONTRACT_PATH: contractPath,
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
if (result.error) {
|
|
180
|
+
console.error(`[Harness Kernel] Failed to execute tier-router.js: ${result.error.message}`);
|
|
181
|
+
process.exit(1);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const sanitized = sanitizeClassifierOutput(result.stdout);
|
|
185
|
+
if (sanitized) console.log(sanitized);
|
|
186
|
+
if (result.stderr) process.stderr.write(result.stderr);
|
|
187
|
+
|
|
188
|
+
const contract = readStructuredContract(contractPath);
|
|
189
|
+
applyEnsemblePolicy(contract, resolvePrompt(prompt, stdinPayload));
|
|
190
|
+
try {
|
|
191
|
+
fs.rmSync(contractPath, { force: true });
|
|
192
|
+
} catch (err) {
|
|
193
|
+
// Temporary contract cleanup is best effort only.
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
printWorkflowPlan(contract.workflowPlan);
|
|
197
|
+
printKernelContract(contract.workflowPlan);
|
|
198
|
+
|
|
199
|
+
if (result.status !== 0) process.exit(result.status === null ? 1 : result.status);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const prompt = process.argv.slice(2).join(' ');
|
|
203
|
+
if (prompt) {
|
|
204
|
+
run(prompt, null);
|
|
205
|
+
} else if (process.stdin.isTTY) {
|
|
206
|
+
run('', null);
|
|
207
|
+
} else {
|
|
208
|
+
let input = '';
|
|
209
|
+
process.stdin.setEncoding('utf8');
|
|
210
|
+
process.stdin.on('data', chunk => { input += chunk; });
|
|
211
|
+
process.stdin.on('end', () => run('', input));
|
|
212
|
+
}
|