harness-everything 0.39.0 → 0.41.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/harness-everything/project-docs.json +9 -0
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +50 -0
- package/benchmarks/results/f1-doc-path-baseline/1-source-clean.stderr.txt +0 -0
- package/benchmarks/results/f1-doc-path-baseline/1-source-clean.stdout.json +20 -0
- package/benchmarks/results/f1-doc-path-baseline/2-injected-architecture.md +229 -0
- package/benchmarks/results/f1-doc-path-baseline/2-source-injected.stderr.txt +0 -0
- package/benchmarks/results/f1-doc-path-baseline/2-source-injected.stdout.json +33 -0
- package/benchmarks/results/f1-doc-path-baseline/3-source-reverted.stderr.txt +0 -0
- package/benchmarks/results/f1-doc-path-baseline/3-source-reverted.stdout.json +20 -0
- package/benchmarks/results/f1-doc-path-baseline/4a-packaged-clean.stderr.txt +0 -0
- package/benchmarks/results/f1-doc-path-baseline/4a-packaged-clean.stdout.json +20 -0
- package/benchmarks/results/f1-doc-path-baseline/4b-packaged-injected.stderr.txt +0 -0
- package/benchmarks/results/f1-doc-path-baseline/4b-packaged-injected.stdout.json +33 -0
- package/benchmarks/results/f1-doc-path-baseline/5-source-missing-config.stderr.txt +0 -0
- package/benchmarks/results/f1-doc-path-baseline/5-source-missing-config.stdout.json +15 -0
- package/benchmarks/results/f1-doc-path-baseline/5b-packaged-missing-config.stderr.txt +0 -0
- package/benchmarks/results/f1-doc-path-baseline/5b-packaged-missing-config.stdout.json +15 -0
- package/benchmarks/results/f1-doc-path-baseline/README.md +54 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/1-source-clean.stderr.txt +0 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/1-source-clean.stdout.json +115 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/2-injected-document.md +328 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/2-source-injected.stderr.txt +0 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/2-source-injected.stdout.json +127 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/3-source-reverted.stderr.txt +0 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/3-source-reverted.stdout.json +115 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/4a-packaged-clean.stderr.txt +0 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/4a-packaged-clean.stdout.json +115 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/4b-packaged-injected.stderr.txt +0 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/4b-packaged-injected.stdout.json +127 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/5-source-missing-config.stderr.txt +0 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/5-source-missing-config.stdout.json +15 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/5b-packaged-missing-config.stderr.txt +0 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/5b-packaged-missing-config.stdout.json +15 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/6-supplementary-fixture-ok.input.md +8 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/6-supplementary-fixture-ok.stdout.json +16 -0
- package/benchmarks/results/f1-doc-path-baseline/before-fix/README.md +34 -0
- package/benchmarks/results/f1-doc-path-baseline/probe-31-docs/after.json +248 -0
- package/benchmarks/results/f1-doc-path-baseline/probe-31-docs/before.json +254 -0
- package/benchmarks/results/f1-doc-path-baseline/probe-31-docs/probe.js +26 -0
- package/benchmarks/results/f2-doc-craft-baseline/README.md +32 -0
- package/benchmarks/results/f2-doc-craft-baseline/arm-f1-report.md +84 -0
- package/benchmarks/results/f2-doc-craft-baseline/arm-f1-task.md +21 -0
- package/benchmarks/results/f2-doc-craft-baseline/arm-f1.diff +19 -0
- package/benchmarks/results/f2-doc-craft-baseline/arm-f2-report.md +110 -0
- package/benchmarks/results/f2-doc-craft-baseline/arm-f2-task.md +21 -0
- package/benchmarks/results/f2-doc-craft-baseline/arm-f2.diff +19 -0
- package/benchmarks/results/f3-derived-views-baseline/README.md +34 -0
- package/benchmarks/results/f3-derived-views-baseline/arm-f2-report.md +43 -0
- package/benchmarks/results/f3-derived-views-baseline/arm-f2-task.md +21 -0
- package/benchmarks/results/f3-derived-views-baseline/arm-f2.diff +21 -0
- package/benchmarks/results/f3-derived-views-baseline/arm-f3-report.md +57 -0
- package/benchmarks/results/f3-derived-views-baseline/arm-f3-task.md +21 -0
- package/benchmarks/results/f3-derived-views-baseline/arm-f3.diff +21 -0
- package/benchmarks/results/live-host/claude-325-3b-s2b/README.md +99 -0
- package/benchmarks/results/live-host/claude-325-3b-s2b/capture.sanitized.jsonl +26 -0
- package/ci/archive/325-prep/README.md +71 -0
- package/ci/{prep → archive/325-prep}/doc-reconciliation-red.js +9 -7
- package/ci/archive/325-prep/f4-expected-red.json +34 -0
- package/ci/archive/325-prep/historical-qualification.test.js +143 -0
- package/ci/fixtures/doc-obligations/reconciliation-prep/cases.json +17 -4
- package/ci/fixtures/doc-obligations/reconciliation-prep/pending-red.json +8 -56
- package/ci/fixtures/doc-obligations/reconciliation-prep/trust-contract.json +2 -2
- package/ci/fixtures/doc-obligations/reconciliation-s1/cases.json +17 -5
- package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/harness.js +415 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/off-handoff-golden.json +16 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/payload-post-tool-use-failure.json +11 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/payload-post-tool-use-success-minimal.json +9 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/payload-post-tool-use-success.json +13 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/payload-subagent-start.json +7 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/payload-subagent-stop-freetext-reject.json +11 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/payload-subagent-stop-reject.json +11 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/payload-subagent-stop.json +11 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/payload-task-result.json +19 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/corpus/off-capture-only.json +99 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/corpus/off-legacy.json +67 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/corpus/on-concurrent-writers.json +62 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/corpus/on-lookalikes-runtime-mutations.json +67 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/corpus/on-malformed.json +85 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/corpus/on-normal-session.json +74 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/corpus/on-runtime-drift-later-npm-test.json +58 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/corpus/on-valid-direct-quoted-review.json +85 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/f4/cases.json +2267 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/wiring/cases.json +1110 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2b/wiring/legacy-off-golden.json +674 -0
- package/ci/lib/doc-reconciliation-file-spy.js +23 -0
- package/ci/lib/doc-reconciliation-prep-fixtures.js +136 -10
- package/ci/lib/doc-reconciliation-qualification-preload.js +37 -0
- package/ci/lib/doc-reconciliation-replay.js +104 -0
- package/ci/lib/doc-reconciliation-staged-tree.js +102 -0
- package/ci/mechanism-2p-opencode-v2-entrypoint.test.js +179 -0
- package/ci/mechanism-325-3b-preparation.test.js +27 -101
- package/ci/mechanism-325-3b-s2b-capture.test.js +561 -0
- package/ci/mechanism-325-3b-s2b-wiring.test.js +668 -0
- package/ci/mechanism-325-f1-doc-check.test.js +674 -0
- package/ci/mechanism-325-f2-doc-craft.test.js +597 -0
- package/ci/mechanism-325-f3-derived-views.test.js +798 -0
- package/ci/mechanism-325-f4-invariants.test.js +606 -0
- package/ci/mechanism-325-f4-projections.test.js +382 -0
- package/ci/mechanism-325-f4-qualification.test.js +228 -0
- package/ci/mechanism-325-f4-trust-boundary.test.js +880 -0
- package/ci/mutation-check.js +26 -3
- package/code-review/SKILL.md +3 -3
- package/code-review/references/review-playbook.md +4 -0
- package/code-review/templates/finding.template.md +6 -0
- package/docs/architecture.md +5 -0
- package/docs/doc-workflow-reconciliation.md +331 -4
- package/docs/document-lifecycle.md +11 -0
- package/docs/governed-index.md +20 -0
- package/docs/platform-capabilities.md +22 -2
- package/evals/zoom-out/tasks/negative-first-edge-case-review.yaml +16 -0
- package/evals/zoom-out/tasks/positive-repair-loop.yaml +15 -0
- package/grill-with-docs/SKILL.md +1 -1
- package/grill-with-docs/references/session-playbook.md +4 -0
- package/harness-everything/SKILL.md +1 -1
- package/harness-everything/references/doc-check.md +186 -0
- package/harness-everything/references/documentation/_shared/maintenance.md +41 -0
- package/harness-everything/references/documentation/_shared/writing-craft.md +59 -0
- package/harness-everything/references/triage-and-tiers.md +4 -0
- package/harness-everything/scripts/doc-check.js +442 -0
- package/harness-everything/scripts/doc-lifecycle.js +3 -0
- package/harness-everything/scripts/routing-keywords.json +4 -0
- package/hooks/hooks.json +46 -0
- package/hooks/scripts/lib/doc-reconciliation-capture.sanitized.jsonl +26 -0
- package/hooks/scripts/lib/doc-reconciliation-pilot.js +171 -2
- package/hooks/scripts/lib/doc-reconciliation-provider.js +1059 -0
- package/hooks/scripts/lib/doc-reconciliation-qualification.json +34 -0
- package/hooks/scripts/lib/workflow-obligations.js +7 -0
- package/hooks/scripts/state-persist.js +78 -2
- package/hooks/scripts/workflow-stop-gate.js +7 -2
- package/opencode-plugin/README.md +15 -0
- package/opencode-plugin/index.mjs +77 -0
- package/opencode-plugin/plugin.json +1 -1
- package/package.json +2 -1
- package/plugins/harness-everything/.codex-plugin/plugin.json +1 -1
- package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-capture.sanitized.jsonl +26 -0
- package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-pilot.js +171 -2
- package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-provider.js +1059 -0
- package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-qualification.json +34 -0
- package/plugins/harness-everything/hooks/scripts/lib/workflow-obligations.js +7 -0
- package/plugins/harness-everything/hooks/scripts/state-persist.js +78 -2
- package/plugins/harness-everything/hooks/scripts/workflow-stop-gate.js +7 -2
- package/plugins/harness-everything/plugin.json +1 -1
- package/plugins/harness-everything/skills/code-review/SKILL.md +3 -3
- package/plugins/harness-everything/skills/code-review/references/review-playbook.md +4 -0
- package/plugins/harness-everything/skills/code-review/templates/finding.template.md +6 -0
- package/plugins/harness-everything/skills/grill-with-docs/SKILL.md +1 -1
- package/plugins/harness-everything/skills/grill-with-docs/references/session-playbook.md +4 -0
- package/plugins/harness-everything/skills/harness-everything/SKILL.md +1 -1
- package/plugins/harness-everything/skills/harness-everything/references/doc-check.md +186 -0
- package/plugins/harness-everything/skills/harness-everything/references/documentation/_shared/maintenance.md +41 -0
- package/plugins/harness-everything/skills/harness-everything/references/documentation/_shared/writing-craft.md +59 -0
- package/plugins/harness-everything/skills/harness-everything/references/triage-and-tiers.md +4 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/doc-check.js +442 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/doc-lifecycle.js +3 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/routing-keywords.json +4 -0
- package/plugins/harness-everything/skills/repo-docs/SKILL.md +1 -1
- package/plugins/harness-everything/skills/repo-docs/references/process-guide.md +4 -0
- package/plugins/harness-everything/skills/to-spec/SKILL.md +1 -1
- package/plugins/harness-everything/skills/to-spec/references/process.md +4 -0
- package/plugins/harness-everything/skills/to-tickets/SKILL.md +1 -1
- package/plugins/harness-everything/skills/to-tickets/references/publishing-and-templates.md +4 -0
- package/plugins/harness-everything/skills/zoom-out/SKILL.md +4 -3
- package/plugins/harness-everything/skills/zoom-out/references/circuit-breaker.md +7 -0
- package/plugins/harness-everything/skills/zoom-out/templates/zoom-out-report.template.md +4 -2
- package/repo-docs/SKILL.md +1 -1
- package/repo-docs/references/process-guide.md +4 -0
- package/sbom.cdx.json +7 -7
- package/scripts/errors-sync.js +90 -0
- package/to-spec/SKILL.md +1 -1
- package/to-spec/references/process.md +4 -0
- package/to-tickets/SKILL.md +1 -1
- package/to-tickets/references/publishing-and-templates.md +4 -0
- package/zoom-out/SKILL.md +4 -3
- package/zoom-out/references/circuit-breaker.md +7 -0
- package/zoom-out/templates/zoom-out-report.template.md +4 -2
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"governed": [
|
|
3
|
+
{ "path": "docs/architecture.md", "role": "reference" },
|
|
4
|
+
{ "path": "docs/doc-workflow-reconciliation.md", "role": "reference" }
|
|
5
|
+
],
|
|
6
|
+
"derived": [
|
|
7
|
+
{ "path": "docs/governed-index.md", "generator": "node harness-everything/scripts/doc-lifecycle.js index --workspace . --config .agents/harness-everything/project-docs.json --all" }
|
|
8
|
+
]
|
|
9
|
+
}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"name": "harness-everything",
|
|
11
11
|
"source": "./",
|
|
12
12
|
"description": "Harness OS: an orchestrated agent operating system — tier routing, circuit breaker guardrails, verification gates, WAL session memory, and self-evolving workspace rules.",
|
|
13
|
-
"version": "0.
|
|
13
|
+
"version": "0.41.0",
|
|
14
14
|
"author": {
|
|
15
15
|
"name": "Miya Daniel"
|
|
16
16
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "harness-everything",
|
|
3
3
|
"description": "Harness OS: an orchestrated agent operating system — tier routing, circuit breaker guardrails, verification gates, WAL session memory, and self-evolving workspace rules.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.41.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Miya Daniel"
|
|
7
7
|
},
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,50 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project are documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.41.0](https://github.com/dyphn1/Harness-everything/compare/v0.40.0...v0.41.0) (2026-10-23)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* **doc-lifecycle:** check derived views with regenerate-equals ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([a27f845](https://github.com/dyphn1/Harness-everything/commit/a27f845b6666f026f407f66d916bddeeb765adac))
|
|
10
|
+
* **doc-lifecycle:** credit doc-check evidence through the s2a chain ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([9cb57a8](https://github.com/dyphn1/Harness-everything/commit/9cb57a8742eca48c118318eecf5690dd6daabd55))
|
|
11
|
+
* **doc-lifecycle:** refuse self-authored doc reviews and qualify the live host ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([9a01d9d](https://github.com/dyphn1/Harness-everything/commit/9a01d9d1f7d8beab096774309f195c90289d863c))
|
|
12
|
+
* **doc-lifecycle:** share documentation craft across doc skills ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([3413ece](https://github.com/dyphn1/Harness-everything/commit/3413ecee5bdea91c36e65b20e6d22e819879c053))
|
|
13
|
+
* **doc-lifecycle:** wire the editorial doc check end to end ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([1d70dd3](https://github.com/dyphn1/Harness-everything/commit/1d70dd3b2818fbd80683f128596d6118511d0220))
|
|
14
|
+
* **errors:** close the candidate-overcapture episode ([a0b8c04](https://github.com/dyphn1/Harness-everything/commit/a0b8c0402aee84bd4204f974065e275a9495021c))
|
|
15
|
+
* **errors:** close the checker-identity episode on executed evidence ([fc37122](https://github.com/dyphn1/Harness-everything/commit/fc371220d466aa7fd4bfbd5f1c6963451b197728))
|
|
16
|
+
* **errors:** record round 3 and the projection-versus-trust lesson ([11c9c15](https://github.com/dyphn1/Harness-everything/commit/11c9c15552b117b0049d22b007dc392473024a8d))
|
|
17
|
+
* **errors:** record round 4 of the candidate-overcapture episode ([cdafc66](https://github.com/dyphn1/Harness-everything/commit/cdafc66dc78af2d6decf5284c6e2a71cdaabc8b0))
|
|
18
|
+
* **errors:** record the f4 repair rounds and close the review-format episode ([9a3da41](https://github.com/dyphn1/Harness-everything/commit/9a3da41e3682807b75a8ee3158f4553f0f42f631))
|
|
19
|
+
* **errors:** record the first ledger consult and seed four error classes ([07ce76e](https://github.com/dyphn1/Harness-everything/commit/07ce76ef43246c755592179e7bc8aeff540608ea))
|
|
20
|
+
|
|
21
|
+
### Bug Fixes
|
|
22
|
+
|
|
23
|
+
* **doc-check:** check links and images nested in link labels ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([3ba9efb](https://github.com/dyphn1/Harness-everything/commit/3ba9efb18f384eead8087bfbe3d9fb50a3254f86))
|
|
24
|
+
* **doc-check:** parse nested link labels and always emit usage json ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([f6660e1](https://github.com/dyphn1/Harness-everything/commit/f6660e1d035b21b46b86d74770d9a5714fb38e86))
|
|
25
|
+
* **doc-check:** scan nested link labels iteratively ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([c004713](https://github.com/dyphn1/Harness-everything/commit/c004713a0c78b9db992c2eff01c331da20037c6d))
|
|
26
|
+
* **doc-craft:** align maintenance summary with the lifecycle spec ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([ce4224d](https://github.com/dyphn1/Harness-everything/commit/ce4224d7e4b34d9a922ee3fb498e931ce82b2b7b))
|
|
27
|
+
* **doc-lifecycle:** accept windows short-name paths to the installed doc-check ([1770f48](https://github.com/dyphn1/Harness-everything/commit/1770f48e1c5bff5b37c43faac556ddf17d4e7492))
|
|
28
|
+
* **doc-lifecycle:** bind credit to the installed doc-check implementation ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([63ad692](https://github.com/dyphn1/Harness-everything/commit/63ad692ac3deb485ea6a65ccbc42c266061c1d96))
|
|
29
|
+
* **doc-lifecycle:** deny trust shortcuts to compound or checker-naming commands ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([f9b3e92](https://github.com/dyphn1/Harness-everything/commit/f9b3e92611a750c0e7e5c1fec67876d6b2ce5c90))
|
|
30
|
+
* **doc-lifecycle:** ignore doc-check paths inside shell comments ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([5466cfb](https://github.com/dyphn1/Harness-everything/commit/5466cfb51f1f1920f560f5db01504e76646ad127))
|
|
31
|
+
* **doc-lifecycle:** keep generic verification when doc evidence is withdrawn ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([0c7d9d1](https://github.com/dyphn1/Harness-everything/commit/0c7d9d1c7be3dc38b4969f5a6741b08a0d468947))
|
|
32
|
+
* **doc-lifecycle:** keep normal sessions creditable and verify timestamps pinned ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([4489376](https://github.com/dyphn1/Harness-everything/commit/44893769c44bb14186fd5f0768124db87307b54d))
|
|
33
|
+
* **doc-lifecycle:** pin the shipped doc-check digest in the provider ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([dc94b4d](https://github.com/dyphn1/Harness-everything/commit/dc94b4d9301c5ad1ce136fab84a25cf2d3129be5))
|
|
34
|
+
* **doc-lifecycle:** re-pin the shipped doc-check after the stack merge ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([c271249](https://github.com/dyphn1/Harness-everything/commit/c271249a8a99d7e0320288af8cb086bb03f8fa1a))
|
|
35
|
+
* **doc-lifecycle:** recognize windows paths to the installed doc-check ([dcd2092](https://github.com/dyphn1/Harness-everything/commit/dcd209248587af36f5e8a6d9a477b85cede9bb0a))
|
|
36
|
+
* **doc-lifecycle:** require explicit review verdicts in host capture ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([97243e5](https://github.com/dyphn1/Harness-everything/commit/97243e5054329ef2f8d20138f41cf9b6d6d1cfdd))
|
|
37
|
+
* **doc-lifecycle:** route quality review into the credit chain ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([38e8fc4](https://github.com/dyphn1/Harness-everything/commit/38e8fc4de9e1b85a8428a22b31a3204faff6c45d)), closes [#quality-review](https://github.com/dyphn1/Harness-everything/issues/quality-review)
|
|
38
|
+
* **doc-lifecycle:** split candidate scanning on executable newlines ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([a9a8807](https://github.com/dyphn1/Harness-everything/commit/a9a88077ade6fce882e443558ab810334b8c4489))
|
|
39
|
+
* **doc-lifecycle:** treat only explicit command targets as doc-check candidates ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([fd3833e](https://github.com/dyphn1/Harness-everything/commit/fd3833e23e931e8a07da6689317ec32af893c45e))
|
|
40
|
+
* **opencode:** default-export a v2 plugin definition so opencode 2 loads the adapter ([1a8595e](https://github.com/dyphn1/Harness-everything/commit/1a8595ed90c9777e0bb1b39f78b9b9593b7b4811)), closes [#362](https://github.com/dyphn1/Harness-everything/issues/362)
|
|
41
|
+
|
|
42
|
+
## [0.40.0](https://github.com/dyphn1/Harness-everything/compare/v0.39.0...v0.40.0) (2026-10-23)
|
|
43
|
+
|
|
44
|
+
### Features
|
|
45
|
+
|
|
46
|
+
* **errors:** add repository error ledger with generated index ([346716b](https://github.com/dyphn1/Harness-everything/commit/346716b14f2ac01c1968df9c3658db756fb86bf7)), closes [#325](https://github.com/dyphn1/Harness-everything/issues/325)
|
|
47
|
+
* **routing:** surface zoom-out for repair-loop cues ([7ff7d66](https://github.com/dyphn1/Harness-everything/commit/7ff7d6689d711a3bac9e9a25b6a42f1f30fcd3ae))
|
|
48
|
+
|
|
5
49
|
## [0.39.0](https://github.com/dyphn1/Harness-everything/compare/v0.38.0...v0.39.0) (2026-10-21)
|
|
6
50
|
|
|
7
51
|
### Features
|
|
@@ -32,6 +76,12 @@ All notable changes to this project are documented in this file.
|
|
|
32
76
|
|
|
33
77
|
## [Unreleased]
|
|
34
78
|
|
|
79
|
+
- Accept an interior `~` in unquoted installed doc-check path tokens, and reject `%VAR%` expansion before identity and digest checks.
|
|
80
|
+
|
|
81
|
+
- Preserve Windows path separators while classifying installed doc-check commands, and make the OpenCode workspace-key fixture match the plugin's Windows case normalization.
|
|
82
|
+
|
|
83
|
+
- Port the OpenCode adapter to the OpenCode 2 plugin contract: the module now default-exports `{ id: "harness.enforcement", setup(ctx) }` that registers `ctx.tool.hook("execute.before|after")` and `ctx.event.subscribe()` over the OpenCode 2 domains, while keeping the named V1 `HarnessEnforcement` factory for OpenCode 1.x hosts. OpenCode 2 fails to load named-export-only plugins with `Plugin must export a default definition with an id and an effect or setup function`; the V2 load was verified live on OpenCode 2.1.3 after a global-install reload.
|
|
84
|
+
|
|
35
85
|
- Reject root-level `__proto__` files in S2a snapshot capture and validation instead of silently dropping their document obligations (#353).
|
|
36
86
|
|
|
37
87
|
- Bind the S2a captured origin identity to the snapshot identity (workspace, session, workflow, revision, task), the captured plan and the selected active host, so a jointly substituted origin context and provider context cannot earn credit in either reconciliation mode; bind the captured config bytes to the captured inventory (#353).
|
|
File without changes
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lint": {
|
|
3
|
+
"exit": 0,
|
|
4
|
+
"evidence": {
|
|
5
|
+
"immutability": "observed"
|
|
6
|
+
},
|
|
7
|
+
"diagnostics": []
|
|
8
|
+
},
|
|
9
|
+
"links": {
|
|
10
|
+
"checked": 12,
|
|
11
|
+
"broken": []
|
|
12
|
+
},
|
|
13
|
+
"coverage": {
|
|
14
|
+
"unsupported": [
|
|
15
|
+
{
|
|
16
|
+
"reason": "no domains declared; bare <DOMAIN>-NNN references are not checked"
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
---
|
|
2
|
+
role: reference
|
|
3
|
+
status: bogus
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Harness Architecture
|
|
7
|
+
|
|
8
|
+
This document describes Harness runtime architecture and integration boundaries. Current host capability/evidence claims are centralized in [platform-capabilities.md](platform-capabilities.md); package wiring is not live-host proof.
|
|
9
|
+
|
|
10
|
+
## Architectural Overview
|
|
11
|
+
|
|
12
|
+
Harness is a **behavior and workflow observer/router**, not a universal fixed workflow or scheduler. The router chooses a useful topology; the model remains free to adapt execution.
|
|
13
|
+
|
|
14
|
+
The minimal kernel establishes:
|
|
15
|
+
|
|
16
|
+
- scope/tier before mutation,
|
|
17
|
+
- a selected workflow topology as a semantic execution contract when task evidence supports one,
|
|
18
|
+
- ordered requirement decomposition and step-scoped knowledge bindings,
|
|
19
|
+
- objective evidence before completion,
|
|
20
|
+
- bounded re-plan/recovery after repeated failure,
|
|
21
|
+
- explicit warnings/degraded/escape evidence instead of silent workflow deletion;
|
|
22
|
+
- one mandatory user-visible Harness Status protocol for non-trivial work, independent of execution topology.
|
|
23
|
+
|
|
24
|
+
> **Contract-first lifecycle; flexible reasoning/implementation and execution.**
|
|
25
|
+
>
|
|
26
|
+
> Active required bindings and selected-topology obligations are semantic MUSTs; keyword signals are planning inputs, and unrelated future bindings stay undisclosed.
|
|
27
|
+
|
|
28
|
+
This avoids both extremes: no universal Tier-2/Tier-3 pipeline and no maze of self-deadlocking cognitive gates.
|
|
29
|
+
|
|
30
|
+
```mermaid
|
|
31
|
+
flowchart TD
|
|
32
|
+
U([User Request]) --> B[Session bootstrap / environment]
|
|
33
|
+
B --> K[kernel-router.js]
|
|
34
|
+
K --> T[tier-router.js<br/>classification + task shape]
|
|
35
|
+
T --> P[Structured workflow plan]
|
|
36
|
+
P --> A{Strategy selected?}
|
|
37
|
+
A -- No / deferred --> D[Preserve invariants<br/>choose smallest justified workflow]
|
|
38
|
+
A -- Yes --> C[ACTIVE workflow contract]
|
|
39
|
+
C --> D[Decompose ordered requirements]
|
|
40
|
+
D --> B[Bind skills/references per step]
|
|
41
|
+
B --> X[Execute active step/stage]
|
|
42
|
+
X --> V{Required stage/check resolved?}
|
|
43
|
+
V -- Yes --> Done[Evidence-backed completion]
|
|
44
|
+
V -- No --> R[Diagnose / bounded re-plan]
|
|
45
|
+
R --> X
|
|
46
|
+
R -- topology cannot cover scope --> Esc[Evidence-backed escape<br/>uncovered scope only]
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Router responsibilities
|
|
50
|
+
|
|
51
|
+
`kernel-router.js` is the public runtime entry. It consumes the structured classifier contract and exposes:
|
|
52
|
+
|
|
53
|
+
- tier + rationale,
|
|
54
|
+
- selected/deferred execution strategy,
|
|
55
|
+
- required invariants,
|
|
56
|
+
- normalized knowledge signals for planning, not document selection,
|
|
57
|
+
- bindings only for the active step or dependency-ready Fable stage,
|
|
58
|
+
- the internal routing checkpoint,
|
|
59
|
+
- the semantic workflow contract.
|
|
60
|
+
|
|
61
|
+
The router does not tell the model *how* to solve each stage. It decides what lifecycle shape is required. `direct-single`, `iterative-single`, `fable-staged`, `fable-parallel`, and `fable-multi-agent-workspace` remain deliberately small, non-overlapping topology choices.
|
|
62
|
+
|
|
63
|
+
### User-visible status protocol
|
|
64
|
+
|
|
65
|
+
Non-trivial work MUST expose one stable, scannable Markdown progress shape to the user:
|
|
66
|
+
|
|
67
|
+
```md
|
|
68
|
+
### 🚦 Harness Status
|
|
69
|
+
|
|
70
|
+
- **Current:** <what is being done now>
|
|
71
|
+
- **Read / Evidence:**
|
|
72
|
+
- <important file/source/evidence read or confirmed>
|
|
73
|
+
- <another item when multiple evidence items improve scanability>
|
|
74
|
+
- **Next:** <next intended action>
|
|
75
|
+
- **Risk / Blocked:** <only when materially applicable; omit otherwise>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Use nested evidence bullets when multiple items would otherwise become one dense sentence. The agent emits the status before substantive execution, after major phases, on material direction changes, at meaningful long-running phase boundaries, and before final completion. The router checkpoint feeds this status as internal source state but is not a second user-facing template.
|
|
79
|
+
|
|
80
|
+
This is a semantic contract, not another cognitive lock. Hook-capable hosts may observe or remind about compliance; instruction-only hosts still receive the MUST contract without pretending they can mechanically enforce it.
|
|
81
|
+
|
|
82
|
+
### Step-scoped knowledge vs. topology execution
|
|
83
|
+
|
|
84
|
+
Keyword/domain matches are planning signals, not skill/reference paths. Requirement composition declares bindings on ordered steps; only active bindings are disclosed. A required skill binding MUST be read and its applicable core contract followed before the step passes. Unknown/unavailable paths remain visible and unresolved, while unrelated and future-step knowledge is not preloaded.
|
|
85
|
+
|
|
86
|
+
The selected topology is a semantic lifecycle contract, not a persistent execution lock. Required obligations MUST resolve; implementation tactics MAY adapt.
|
|
87
|
+
|
|
88
|
+
### Runtime workflow state
|
|
89
|
+
|
|
90
|
+
On host paths that can persist it, `kernel-router.js` records session-scoped `workflow-run.json` with the selected strategy and lifecycle state. Prompt text is not persisted; only a content hash is retained for correlation.
|
|
91
|
+
|
|
92
|
+
For selected Fable topologies on Claude:
|
|
93
|
+
|
|
94
|
+
- `workflow-gate.js` observes supported mutation/worktree/Fable state and emits reminders;
|
|
95
|
+
- Fable owns stage contracts, `dependsOn`/`writeSet`, validated execution batches, objective per-stage checks, synthesis, cold verification, and bounded re-plans;
|
|
96
|
+
- `workflow-stop-gate.js` reports unresolved stage/verification evidence without rejecting Stop;
|
|
97
|
+
- `workflow-disposition.js` records explicit lifecycle/audit decisions and active step/stage binding dispositions; numeric budgets are no longer authoritative control state.
|
|
98
|
+
|
|
99
|
+
Other topologies use their own applicable mechanisms: MAY-level loop-awareness planning hints, regular verification stop-gates, action gates, and task-specific skills. Mechanism coverage is not assumed identical across hosts.
|
|
100
|
+
|
|
101
|
+
### Scoped runtime advisories and capabilities
|
|
102
|
+
|
|
103
|
+
Two kernel mechanisms annotate plans without creating hard workflow enforcement:
|
|
104
|
+
|
|
105
|
+
- **Ensemble policy (`harness-everything/scripts/ensemble-policy.js`):** optional selection is a **MAY** capability, not a separate topology. It is selected only when uncertainty is high (or stakes are high) **and** the task asks for comparable outputs or preserves explicit disagreement **and** the selected strategy is already `fable-*`. Creative generation, mechanical bulk work, an explicit user prohibition, unavailable subagents, or a blocked base plan force exclusion. Once selected, preserving disagreement, using an independent verifier, and honoring the plan's ensemble invariants are **MUST** obligations. Covered by deterministic mechanism tests; no live-host effectiveness claim follows from the annotation alone.
|
|
106
|
+
- **Single-use memory capability (`kernel-router.js#issueMemoryCapability`):** when the selected plan permits memory writes, the router issues one capability token bound to `sessionId`/`workflowId` with a stored SHA-256 hash (`memoryAuthorization`, coordinator-only writer role, `usedAt` tracking). Plans with `memory.write === 'none'` receive no capability. This binds a memory write to the workflow that authorized it; it is not a general credential and proves nothing about a live host honoring the binding.
|
|
107
|
+
|
|
108
|
+
### PreToolUse guard trio and denied-mutation probes
|
|
109
|
+
|
|
110
|
+
On the Claude hook path, three narrowly scoped `PreToolUse` guards sit alongside the workflow/action gates. **All three are advisory and fail open — none of them can reject a tool call.** The mechanism that still performs real `exit(2)` hard blocking on this hook is `action-gate.js` (see "Claude Code" below), not this trio.
|
|
111
|
+
|
|
112
|
+
- `boundary-guard.js` (Grep/Glob/Read): warns about very large reads and noisy search roots; it fails open.
|
|
113
|
+
- `depth-guard.js` (Write): reminds when an existing file would be overwritten without prior inspection. The semantic obligation to establish current target state before destructive overwrite is a **MUST**; the hook itself stays fail-open. New files are unaffected.
|
|
114
|
+
- `context-compact.js`: estimates working-tree context pressure from `git status`/`git diff --numstat` so later stages can compact or halt before lost-in-the-middle degradation.
|
|
115
|
+
|
|
116
|
+
Shell mutation observation is best-effort evidence for reminders. The old mutation-probe reservation/lock subsystem, and the hard `exit(2)` blocking `boundary-guard.js`/`depth-guard.js` previously performed, were retired by [#190](https://github.com/dyphn1/Harness-everything/issues/190), which reclassified every Harness-owned *cognitive* workflow gate (this trio, plus `stop-gate.js`, `subagent-scope-guard.js`, `atomic-commit-check.js`, `workflow-gate.js`) as a non-blocking reminder. #190 explicitly kept user/host permission and explicit dangerous-action approval boundaries — i.e. `action-gate.js` — out of scope and still enforced.
|
|
117
|
+
|
|
118
|
+
## Integration Touchpoints
|
|
119
|
+
|
|
120
|
+
Harness aligns to each host's actual lifecycle/tool APIs. Shared skill text defines a contract; only supported host mechanisms can mechanically block or observe particular transitions.
|
|
121
|
+
|
|
122
|
+
### Runtime state vs. skill content
|
|
123
|
+
|
|
124
|
+
Runtime state includes hook metadata, workflow lifecycle, circuit-breaker counters, handoff/verification evidence, and WAL-style session state. Skill content is independently discoverable and remains useful on instruction-only surfaces.
|
|
125
|
+
|
|
126
|
+
### Claude Code — hook observation plus explicit safety boundaries
|
|
127
|
+
|
|
128
|
+
The installer configures native lifecycle hooks and project skills.
|
|
129
|
+
|
|
130
|
+
- `SessionStart`: bootstrap/restoration.
|
|
131
|
+
- `UserPromptSubmit`: kernel routing + semantic workflow contract.
|
|
132
|
+
- `PreToolUse`: workflow/boundary/depth/scope reminders (all advisory, fail-open), plus the separate `action-gate.js` permission boundary and the Rule-of-3 same-signature-failure boundary.
|
|
133
|
+
- `PostToolUse`: outcomes, state, repeated-failure evidence, stage checks.
|
|
134
|
+
- `Stop`: action-gate audit plus non-blocking workflow/verification reminders.
|
|
135
|
+
|
|
136
|
+
Cognitive workflow contracts (boundary/depth/scope/commit/workflow guards) are made observable, not hard-enforced — [#190](https://github.com/dyphn1/Harness-everything/issues/190) downgraded their `exit(2)` blocking to reminders. `action-gate.js` and the Rule-of-3 zoom-out boundary are the two mechanisms that still hard-block on this hook path; #190 explicitly scoped both out of that downgrade as user/host permission and dangerous-action safety boundaries.
|
|
137
|
+
|
|
138
|
+
### OpenCode — plugin enforcement, scoped live verification
|
|
139
|
+
|
|
140
|
+
The retained [OpenCode evidence](../benchmarks/results/live-host/opencode-2026-09-16/README.md) supports **project-scope `.js` loading and edit/verification state on OpenCode 1.18.31 (macOS)**. The final snapshot is **post-reset**. Hard-lock is an **interactive observation** with **no retained blocked-tool trace**; reflection was **operator-seeded** and then agent-rewritten. Global scope, npm-package installation, and other OpenCode versions remain unverified.
|
|
141
|
+
|
|
142
|
+
This evidence predates #190 and does not establish behavioral effectiveness of the current contract-first lifecycle.
|
|
143
|
+
|
|
144
|
+
### Cursor — skills plus advisory rules
|
|
145
|
+
|
|
146
|
+
Cursor receives project skills and advisory rules. The semantic workflow contract can be stated, but unsupported lifecycle transitions are not mechanically enforced.
|
|
147
|
+
|
|
148
|
+
### GitHub Copilot agent surfaces — skills plus advisory instructions
|
|
149
|
+
|
|
150
|
+
Copilot receives Agent Skills/repository instructions. No Harness-specific live hook-enforcement claim is made from repository text alone.
|
|
151
|
+
|
|
152
|
+
### Codex / local OpenAI plugin
|
|
153
|
+
|
|
154
|
+
Codex has multiple distinct Harness surfaces:
|
|
155
|
+
|
|
156
|
+
- The general `--codex` installer writes repo-scoped `.agents/skills/` plus `AGENTS.md`; when consumed only as instructions, the same semantic contract is instruction-delivered without a hard-enforcement claim.
|
|
157
|
+
- The **Codex / local OpenAI plugin** under `plugins/harness-everything/` packages canonical skills plus session/prompt/supported-tool/subagent/stop hooks. The package includes workflow-gate adapters, but this is mechanism/package evidence until a live Codex session proves loading/firing.
|
|
158
|
+
- The public OpenAI **Skills-only** artifact excludes local `.codex-plugin` lifecycle hooks; it carries reusable workflow knowledge, not local hard gates.
|
|
159
|
+
|
|
160
|
+
Do not infer Claude parity from package similarity.
|
|
161
|
+
|
|
162
|
+
### Continue.dev — rules documented, standalone discovery uncertain
|
|
163
|
+
|
|
164
|
+
Continue uses native rule files; standalone skill discovery remains separately bounded by the capability matrix.
|
|
165
|
+
|
|
166
|
+
### Hermes Agent — trusted skills plus advisory context
|
|
167
|
+
|
|
168
|
+
Hermes uses trusted project/global skill surfaces plus advisory context. Trust/loading and lifecycle enforcement remain host-specific.
|
|
169
|
+
|
|
170
|
+
## Fable Execution Architecture
|
|
171
|
+
|
|
172
|
+
Fable is the execution owner for selected `fable-*` topologies.
|
|
173
|
+
|
|
174
|
+
```mermaid
|
|
175
|
+
flowchart TD
|
|
176
|
+
P[Selected Fable plan] --> M[Stage map<br/>dependsOn + writeSet]
|
|
177
|
+
M --> B{Validated batch?}
|
|
178
|
+
B -- No --> Block[Blocked / re-plan]
|
|
179
|
+
B -- Yes --> W[Named workers]
|
|
180
|
+
W --> C[Objective stage checks]
|
|
181
|
+
C --> S[Synthesis barrier]
|
|
182
|
+
S --> V{Verification pass?}
|
|
183
|
+
V -- Yes --> D[Delivery evidence]
|
|
184
|
+
V -- No --> R{Re-plan budget remains?}
|
|
185
|
+
R -- Yes --> M
|
|
186
|
+
R -- No --> Block
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
The orchestrator coordinates lifecycle and evidence; scope drift is reported for review rather than turned into a cognitive deadlock.
|
|
190
|
+
|
|
191
|
+
## Cognitive OS and Skill Mesh
|
|
192
|
+
|
|
193
|
+
The Cognitive OS remains a reasoning policy:
|
|
194
|
+
|
|
195
|
+
```mermaid
|
|
196
|
+
flowchart LR
|
|
197
|
+
D[Discover] --> T[Think]
|
|
198
|
+
T --> Y[Try]
|
|
199
|
+
Y --> S[Summarize]
|
|
200
|
+
S --> R[Record]
|
|
201
|
+
S -- insufficient evidence --> T
|
|
202
|
+
Y -- same failure x3 --> Z[Zoom Out]
|
|
203
|
+
Z --> T
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
A domain skill may define RED/GREEN/REFACTOR or another local lifecycle. The selected Harness topology supplies the outer execution contract; domain skills supply tactics/stages when applicable.
|
|
207
|
+
|
|
208
|
+
## Security and Data Locality
|
|
209
|
+
|
|
210
|
+
1. **No Harness telemetry service:** project code/state is not uploaded by Harness runtime scripts.
|
|
211
|
+
2. **Credential protection:** credentials remain human/host controlled.
|
|
212
|
+
3. **Small mechanism surface:** hooks **SHOULD** remain fast and auditable.
|
|
213
|
+
4. **Explicit enforcement labels:** instruction, mechanism, and live evidence are distinct.
|
|
214
|
+
5. **Deterministic regression:** workflow/routing/hook contracts are executable CI gates.
|
|
215
|
+
6. **No silent widening:** workflow escape cannot widen authorization, permissions, or external side effects.
|
|
216
|
+
|
|
217
|
+
## Validation Boundary
|
|
218
|
+
|
|
219
|
+
Validation is layered:
|
|
220
|
+
|
|
221
|
+
- syntax/reference/package checks prove package integrity;
|
|
222
|
+
- routing tests prove plan and workflow-contract semantics;
|
|
223
|
+
- mechanism tests prove supported hook/plugin behavior;
|
|
224
|
+
- live-host evidence proves a specific host actually loaded/fired the mechanism;
|
|
225
|
+
- paired behavioral evaluation (#71) is required before claiming the new lifecycle improves outcomes.
|
|
226
|
+
|
|
227
|
+
The architecture diagrams are part of the contract. A runtime orchestration change must update these docs and tests in the same change.
|
|
228
|
+
|
|
229
|
+
See [missing](./does-not-exist.md).
|
|
File without changes
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lint": {
|
|
3
|
+
"exit": 1,
|
|
4
|
+
"evidence": {
|
|
5
|
+
"immutability": "observed"
|
|
6
|
+
},
|
|
7
|
+
"diagnostics": [
|
|
8
|
+
{
|
|
9
|
+
"code": "invalid-status",
|
|
10
|
+
"severity": "error",
|
|
11
|
+
"path": "docs/architecture.md",
|
|
12
|
+
"message": "status bogus is not valid for reference"
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"links": {
|
|
17
|
+
"checked": 13,
|
|
18
|
+
"broken": [
|
|
19
|
+
{
|
|
20
|
+
"path": "docs/architecture.md",
|
|
21
|
+
"line": 229,
|
|
22
|
+
"target": "./does-not-exist.md"
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
"coverage": {
|
|
27
|
+
"unsupported": [
|
|
28
|
+
{
|
|
29
|
+
"reason": "no domains declared; bare <DOMAIN>-NNN references are not checked"
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lint": {
|
|
3
|
+
"exit": 0,
|
|
4
|
+
"evidence": {
|
|
5
|
+
"immutability": "observed"
|
|
6
|
+
},
|
|
7
|
+
"diagnostics": []
|
|
8
|
+
},
|
|
9
|
+
"links": {
|
|
10
|
+
"checked": 12,
|
|
11
|
+
"broken": []
|
|
12
|
+
},
|
|
13
|
+
"coverage": {
|
|
14
|
+
"unsupported": [
|
|
15
|
+
{
|
|
16
|
+
"reason": "no domains declared; bare <DOMAIN>-NNN references are not checked"
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lint": {
|
|
3
|
+
"exit": 0,
|
|
4
|
+
"evidence": {
|
|
5
|
+
"immutability": "observed"
|
|
6
|
+
},
|
|
7
|
+
"diagnostics": []
|
|
8
|
+
},
|
|
9
|
+
"links": {
|
|
10
|
+
"checked": 12,
|
|
11
|
+
"broken": []
|
|
12
|
+
},
|
|
13
|
+
"coverage": {
|
|
14
|
+
"unsupported": [
|
|
15
|
+
{
|
|
16
|
+
"reason": "no domains declared; bare <DOMAIN>-NNN references are not checked"
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lint": {
|
|
3
|
+
"exit": 1,
|
|
4
|
+
"evidence": {
|
|
5
|
+
"immutability": "observed"
|
|
6
|
+
},
|
|
7
|
+
"diagnostics": [
|
|
8
|
+
{
|
|
9
|
+
"code": "invalid-status",
|
|
10
|
+
"severity": "error",
|
|
11
|
+
"path": "docs/architecture.md",
|
|
12
|
+
"message": "status bogus is not valid for reference"
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"links": {
|
|
17
|
+
"checked": 13,
|
|
18
|
+
"broken": [
|
|
19
|
+
{
|
|
20
|
+
"path": "docs/architecture.md",
|
|
21
|
+
"line": 229,
|
|
22
|
+
"target": "./does-not-exist.md"
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
"coverage": {
|
|
27
|
+
"unsupported": [
|
|
28
|
+
{
|
|
29
|
+
"reason": "no domains declared; bare <DOMAIN>-NNN references are not checked"
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lint": {
|
|
3
|
+
"exit": 2,
|
|
4
|
+
"error": "cannot read config: ENOENT: no such file or directory, open '<workspace>/.agents/harness-everything/does-not-exist.json'",
|
|
5
|
+
"diagnostics": []
|
|
6
|
+
},
|
|
7
|
+
"links": {
|
|
8
|
+
"checked": 0,
|
|
9
|
+
"broken": [],
|
|
10
|
+
"skipped": "lint-usage-error"
|
|
11
|
+
},
|
|
12
|
+
"coverage": {
|
|
13
|
+
"unsupported": []
|
|
14
|
+
}
|
|
15
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lint": {
|
|
3
|
+
"exit": 2,
|
|
4
|
+
"error": "cannot read config: ENOENT: no such file or directory, open '<workspace>/.agents/harness-everything/does-not-exist.json'",
|
|
5
|
+
"diagnostics": []
|
|
6
|
+
},
|
|
7
|
+
"links": {
|
|
8
|
+
"checked": 0,
|
|
9
|
+
"broken": [],
|
|
10
|
+
"skipped": "lint-usage-error"
|
|
11
|
+
},
|
|
12
|
+
"coverage": {
|
|
13
|
+
"unsupported": []
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# F1 doc-path baseline
|
|
2
|
+
|
|
3
|
+
Record of `harness-everything/scripts/doc-check.js check` on the two dogfood docs, run from a cwd outside the repo with absolute script paths. Base `--base b7136e4`. Dogfood set: `docs/architecture.md` and `docs/doc-workflow-reconciliation.md`, governed as `reference` in `.agents/harness-everything/project-docs.json`. Re-run on the final F1-W3 tree.
|
|
4
|
+
|
|
5
|
+
Wall time is the process wall clock on macOS, Node v24.14.1, including Node startup.
|
|
6
|
+
|
|
7
|
+
## Final tree (F1-W3)
|
|
8
|
+
|
|
9
|
+
Each row runs `node <script> check --workspace <worktree> --config .agents/harness-everything/project-docs.json --changed-path docs/architecture.md --changed-path docs/doc-workflow-reconciliation.md --base b7136e4`.
|
|
10
|
+
|
|
11
|
+
| Case | Script | Exit | Expected | Wall ms | Trimmed output |
|
|
12
|
+
|---|---|---|---|---|---|
|
|
13
|
+
| 1-source-clean | `harness-everything/scripts/doc-check.js` | **0** | 0 | 227 | lint exit 0, 0 diagnostics; links checked 12, broken 0; `coverage.unsupported`: `no domains declared; bare <DOMAIN>-NNN references are not checked` |
|
|
14
|
+
| 2-source-injected | same | 1 | 1 | 174 | lint `invalid-status` (`status: bogus`); links broken `./does-not-exist.md` at `docs/architecture.md:229`; links checked 13 |
|
|
15
|
+
| 3-source-reverted | same | **0** | 0 | 129 | byte-identical to the pre-injection copy (`cmp`); same output as case 1 |
|
|
16
|
+
| 4a-packaged-clean | `plugins/harness-everything/skills/harness-everything/scripts/doc-check.js` | 0 | = source | 190 | stdout byte-identical to 1-source-clean |
|
|
17
|
+
| 4b-packaged-injected | packaged | 1 | = source | 128 | stdout byte-identical to 2-source-injected |
|
|
18
|
+
| 5-source-missing-config (`--config .agents/harness-everything/does-not-exist.json`) | `harness-everything/scripts/doc-check.js` | 2 | 2 | 63 | lint exit 2, `cannot read config: ENOENT`; links `skipped: lint-usage-error` |
|
|
19
|
+
| 5b-packaged-missing-config | packaged | 2 | = source | 66 | stdout byte-identical to 5-source-missing-config |
|
|
20
|
+
|
|
21
|
+
Raw stdout and stderr for each case sit beside this file. The injected copy is `2-injected-architecture.md`.
|
|
22
|
+
|
|
23
|
+
- **executed:** The clean run exits 0 with partial coverage. The `no domains declared` note is the intended signal: this config cannot check bare ADR-style references.
|
|
24
|
+
|
|
25
|
+
## Shared derivation effect
|
|
26
|
+
|
|
27
|
+
- **executed (F1-R finding 3):** Removing the false `SHA-256` error flips `citedReqs[].resolution` from `analysis-error` to `resolved`, and the `requirement-sync` obligation scope gains `docs/prd/graph.md`. This is intended: the false error was the defect. The scan rule is shared by S1, S2a and 3a derivation, so the change reaches those paths too. The S1, S2a, 3a and 2ax suites stay green.
|
|
28
|
+
|
|
29
|
+
## Before fix (F1-W, preserved)
|
|
30
|
+
|
|
31
|
+
Earlier run with the dogfood doc `docs/document-lifecycle.md` governed. Kept in [before-fix/](before-fix/README.md) with its raw outputs. It exited 1 on the clean doc because bare tokens such as `SHA-256` and example IDs were treated as references. The fix changes that behaviour.
|
|
32
|
+
|
|
33
|
+
## Fix evidence: 31-doc probe (final tree)
|
|
34
|
+
|
|
35
|
+
Each `docs/*.md` governed alone as `reference`, run through lint with the `origin/main` script (before) and the fixed script (after). Both runs use the final tree's docs. Probe script and raw JSON are in [probe-31-docs/](probe-31-docs/).
|
|
36
|
+
|
|
37
|
+
| Measure | Before (origin/main) | After (final tree) |
|
|
38
|
+
|---|---|---|
|
|
39
|
+
| Docs probed | 31 | 31 |
|
|
40
|
+
| Docs with `unresolved-ref` or `missing-req` | 6 | 1 |
|
|
41
|
+
| Total diagnostics | 49 | 42 |
|
|
42
|
+
| `unresolved-ref` | 14 | 7 |
|
|
43
|
+
| `missing-req` | 6 | 6 |
|
|
44
|
+
| `missing-status` | 29 | 29 |
|
|
45
|
+
|
|
46
|
+
- **executed:** The 5 docs flagged only by a bare token (`architecture.md`, `codex-action-gate.md`, `system-one-corpus.md`, `system-one-routing.md`, `system-one-training.md`) now have no reference diagnostic.
|
|
47
|
+
- **executed:** The remaining reference diagnostic is in `document-lifecycle.md` (13 after, 15 before): 6 `missing-req` and 7 `unresolved-ref` for `REQ-`, `PRD-` and `legacy:` references, which the fix leaves unchanged. The `PRD-012` and `REQ-012` malformed refs match `origin/main`.
|
|
48
|
+
- `missing-status` 29 is a probe artifact: an ungoverned doc has no `status:` frontmatter, so it fails the reference role's status requirement. It is the same before and after.
|
|
49
|
+
|
|
50
|
+
### F1-W2 intermediate numbers (superseded)
|
|
51
|
+
|
|
52
|
+
The earlier F1-W2 run reported before 49 / after 43 with `unresolved-ref` 13 → 7, measured on an intermediate tree. Those figures are superseded by the table above and kept here only for traceability.
|
|
53
|
+
|
|
54
|
+
Local absolute paths in the missing-config outputs are redacted to `<workspace>`.
|
|
File without changes
|