harness-everything 0.45.0 → 0.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/harness-everything/project-docs.json +3 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +24 -0
- package/benchmarks/results/live-host/claude-341-outline-dispatch-2026-10-28/README.md +75 -0
- package/benchmarks/results/live-host/claude-341-outline-dispatch-2026-10-28/capture.sanitized.jsonl +32 -0
- package/ci/fixtures/doc-obligations/read-boundary/boundary-policy.json +2 -2
- package/ci/mechanism-2ax-doc-lifecycle.test.js +2 -1
- package/ci/mechanism-325-3b-s2b-capture.test.js +6 -1
- package/ci/mechanism-325-f4-projections.test.js +11 -1
- package/ci/mechanism-prb-outline-review.test.js +1449 -0
- package/docs/adr/DOCS-001-project-docs-config.md +32 -0
- package/docs/adr/DOCS-002-adr-identity-supersession-index.md +34 -0
- package/docs/adr/DOCS-003-prd-revision-contract.md +29 -0
- package/docs/adr/DOCS-004-doc-change-step-type.md +28 -0
- package/docs/adr/DOCS-005-doc-obligations-evidence-producer.md +29 -0
- package/docs/adr/DOCS-006-reconciliation-pilot.md +50 -0
- package/docs/adr/DOCS-007-shared-doc-craft-derived-views.md +31 -0
- package/docs/adr/DOCS-008-obligation-abstraction-bounded-consumer.md +30 -0
- package/docs/doc-workflow-reconciliation.md +47 -1
- package/docs/governed-index.md +8 -0
- package/docs/platform-capabilities.md +2 -0
- package/harness-everything/SKILL.md +1 -1
- package/harness-everything/scripts/doc-evidence.js +55 -0
- package/hooks/hooks.json +1 -1
- package/hooks/scripts/lib/doc-reconciliation-events.js +121 -9
- package/hooks/scripts/lib/doc-reconciliation-pilot.js +128 -15
- package/hooks/scripts/lib/doc-reconciliation-provider.js +976 -8
- package/hooks/scripts/state-persist.js +10 -0
- package/opencode-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/plugins/harness-everything/.codex-plugin/plugin.json +1 -1
- package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-events.js +121 -9
- package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-pilot.js +128 -15
- package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-provider.js +976 -8
- package/plugins/harness-everything/hooks/scripts/state-persist.js +10 -0
- package/plugins/harness-everything/plugin.json +1 -1
- package/plugins/harness-everything/skills/harness-everything/SKILL.md +1 -1
- package/plugins/harness-everything/skills/harness-everything/scripts/doc-evidence.js +55 -0
- package/sbom.cdx.json +7 -7
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"governed": [
|
|
3
3
|
{ "path": "docs/architecture.md", "role": "reference" },
|
|
4
|
-
{ "path": "docs/doc-workflow-reconciliation.md", "role": "reference" }
|
|
4
|
+
{ "path": "docs/doc-workflow-reconciliation.md", "role": "reference" },
|
|
5
|
+
{ "path": "docs/adr/*.md", "role": "adr" }
|
|
5
6
|
],
|
|
7
|
+
"domains": ["ROUTE", "GATE", "EVID", "SONE", "DOCS", "DIST"],
|
|
6
8
|
"derived": [
|
|
7
9
|
{ "path": "docs/governed-index.md", "generator": "node harness-everything/scripts/doc-lifecycle.js index --workspace . --config .agents/harness-everything/project-docs.json --all" }
|
|
8
10
|
]
|
|
@@ -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.46.1",
|
|
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.46.1",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Miya Daniel"
|
|
7
7
|
},
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project are documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.46.1](https://github.com/dyphn1/Harness-everything/compare/v0.46.0...v0.46.1) (2026-10-28)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
* **doc-reconciliation:** correlate outline dispatch by observed agent result ([c63e1ef](https://github.com/dyphn1/Harness-everything/commit/c63e1efa299496283bffb1019983b0dd54595f64))
|
|
10
|
+
|
|
11
|
+
## [0.46.0](https://github.com/dyphn1/Harness-everything/compare/v0.45.0...v0.46.0) (2026-10-28)
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
* **doc-reconciliation:** add pre-draft outline review evidence lane ([ac41562](https://github.com/dyphn1/Harness-everything/commit/ac415627369fa0ecadcb19c265d7fe1052d291e1)), closes [#325](https://github.com/dyphn1/Harness-everything/issues/325)
|
|
16
|
+
|
|
17
|
+
### Bug Fixes
|
|
18
|
+
|
|
19
|
+
* **doc-reconciliation:** canonicalize outline roots for windows short paths ([c508e43](https://github.com/dyphn1/Harness-everything/commit/c508e43141c684e70ee94f4c359e427706a85320))
|
|
20
|
+
* **doc-reconciliation:** keep legacy session-dir keying on the raw workspace root ([f39f533](https://github.com/dyphn1/Harness-everything/commit/f39f53332435e58beb2bb5b01fff3e1707dd18a2))
|
|
21
|
+
* **doc-reconciliation:** observe file-tool writers and deny seal-only retries ([9cbe0ea](https://github.com/dyphn1/Harness-everything/commit/9cbe0ea6b1af7bfadc2be954a6f8337be11eac0c)), closes [#325](https://github.com/dyphn1/Harness-everything/issues/325)
|
|
22
|
+
|
|
5
23
|
## [0.45.0](https://github.com/dyphn1/Harness-everything/compare/v0.44.0...v0.45.0) (2026-10-27)
|
|
6
24
|
|
|
7
25
|
### Features
|
|
@@ -22,12 +40,18 @@ All notable changes to this project are documented in this file.
|
|
|
22
40
|
|
|
23
41
|
## [Unreleased]
|
|
24
42
|
|
|
43
|
+
### Added
|
|
44
|
+
|
|
45
|
+
- **doc-governance:** declare six ADR domains (ROUTE, GATE, EVID, SONE, DOCS, DIST) and record the eight DOCS ADRs (DOCS-001 to DOCS-008) for already-in-effect document-lifecycle mechanisms.
|
|
46
|
+
|
|
25
47
|
### Features
|
|
26
48
|
|
|
27
49
|
* **doc-lifecycle:** add complete full-corpus conflict-check evidence with snapshot-bound scope and corpus identity.
|
|
50
|
+
* **doc-reconciliation:** add a dedicated pre-draft outline review lane bound to the pinned inventory and exact O→D Git cycle; positive live-host credit remains gated.
|
|
28
51
|
|
|
29
52
|
### Fixed
|
|
30
53
|
|
|
54
|
+
- **doc-reconciliation:** correlate outline dispatches through completed Agent/Task results and unique worker start/stop events while keeping live credit gated.
|
|
31
55
|
- **doc-governance:** allow regular governed-content revisions and expand base-owned governed/derived globs against Git trees, while retaining review for membership, structural, policy, trust-surface, fixture, and derived-output changes; run the guard in its own CI job.
|
|
32
56
|
|
|
33
57
|
## [0.43.0](https://github.com/dyphn1/Harness-everything/compare/v0.42.2...v0.43.0) (2026-10-27)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Live-host capture: claude-341-outline-dispatch (2026-10-28)
|
|
2
|
+
|
|
3
|
+
**Verdict: the outline live gate stays UNMET.** Claude Code 2.1.312 carries the `HARNESS_OUTLINE_DISPATCH_V1` prompt, the coordinator `session_id` and a synchronous PreToolUse boundary. It does not carry two fields that `outlineCaptureMappingValid` requires: `SubagentStart.parent_tool_use_id` and an `interrupted` field on the Agent PostToolUse. This is field-availability evidence, not live-host credit. `hooks/scripts/lib/doc-reconciliation-qualification.json` is unchanged, so positive outline credit stays disabled.
|
|
4
|
+
|
|
5
|
+
## What was captured
|
|
6
|
+
|
|
7
|
+
```mermaid
|
|
8
|
+
sequenceDiagram
|
|
9
|
+
participant C as Coordinator (session_id)
|
|
10
|
+
participant H as PreToolUse hook (held 2 s)
|
|
11
|
+
participant W as Worker (agent_id)
|
|
12
|
+
C->>H: PreToolUse Agent, tool_input.prompt = marker
|
|
13
|
+
H-->>C: hook ends (+2000 ms)
|
|
14
|
+
C->>W: SubagentStart (+30–100 ms after hook end)<br/>no parent_tool_use_id
|
|
15
|
+
W-->>C: SubagentStop
|
|
16
|
+
C->>C: PostToolUse Agent, tool_use_id matches Pre<br/>agent id only in tool_response.agentId, no interrupted
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Pins
|
|
20
|
+
|
|
21
|
+
| Item | Value |
|
|
22
|
+
|---|---|
|
|
23
|
+
| Harness HEAD (staged) | `f1e6ab4e45fefa908c06f4f6fe96750b731987f9` (main after #387), clean tree |
|
|
24
|
+
| Staging | `node scripts/stage-claude-plugin.js <scratch>/plugin` (1788 tracked files) |
|
|
25
|
+
| Host | Claude Code `2.1.312`, macOS (darwin 25.6.0), zsh, `--model haiku` |
|
|
26
|
+
| Pilot | `HARNESS_DOC_RECONCILIATION_PILOT=1`, fresh `HARNESS_STATE_HOME` per run |
|
|
27
|
+
|
|
28
|
+
| File | sha256 |
|
|
29
|
+
|---|---|
|
|
30
|
+
| `capture.sanitized.jsonl` (this dir) | `cf1ea56c3d329edcb0a18fc6437af9d9aedf56c76a829f3949de382d07c5a657` |
|
|
31
|
+
| `capture-settings.json` (session `--settings`: PreToolUse/PostToolUse `Agent\|Task`, SubagentStart, SubagentStop) | `1c3081a86a0b1e0aa894f2f09a7884ca9bf5dbf55a08ab84074d8a318bd9c587` |
|
|
32
|
+
| `wrapper.js` (log-only, holds PreToolUse 2 s, runs no Harness hook) | `9071ab6b482fc31b1753df242fcf5983f1dd75ce6c5acf8ba78b1a5921f6b2fe` |
|
|
33
|
+
| staged `hooks/hooks.json` | `aca70167da0fa792e34fb55e2904e2935c83f8f087de9e3cd130dd536b01eafd` |
|
|
34
|
+
| staged `hooks/scripts/lib/doc-reconciliation-provider.js` | `1e0a9cc6fd040c074d96a79ec6445c328957951a7c0074427687d0a22179ec3b` |
|
|
35
|
+
|
|
36
|
+
## Command (sanitized)
|
|
37
|
+
|
|
38
|
+
```text
|
|
39
|
+
cd <scratch>/project # fresh git repo, one commit
|
|
40
|
+
HARNESS_DOC_RECONCILIATION_PILOT=1 HARNESS_STATE_HOME=<scratch>/state \
|
|
41
|
+
claude -p "<fixed prompt: dispatch outline-worker twice via Agent; 1 = no isolation, 2 = isolation worktree; each prompt = marker line + 'Reply with: worker done'>" \
|
|
42
|
+
--model haiku --plugin-dir <scratch>/plugin --settings <scratch>/capture-settings.json \
|
|
43
|
+
--agents '{"outline-worker":{"description":"Capture worker that replies once and uses no tools","prompt":"Use no tools. Reply exactly: worker done"}}' \
|
|
44
|
+
--allowedTools Agent Task --session-id <fresh UUID> --setting-sources project,local \
|
|
45
|
+
--output-format stream-json --verbose
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
No bypass flag. Marker: `HARNESS_OUTLINE_DISPATCH_V1 taskId=<id> attemptId=a1 token=<token-n> workerRoot=<scratch>/project`. Both runs exited `0`.
|
|
49
|
+
|
|
50
|
+
- **Run 1** used `taskId=cap-00N`. The plugin rejected it as `dispatch-marker-invalid`, because task ids must match `task-*`. This was a fixture error. The raw host payloads are still valid field evidence.
|
|
51
|
+
- **Run 2** used `taskId=task-cap-00N`. The plugin parsed the marker and recorded `workflow-task-binding-invalid`. That rejection is expected, since no accepted review, handoff or lease exists in this bounded fixture.
|
|
52
|
+
|
|
53
|
+
## Must-report table (mapping in `outlineCaptureMappingValid`)
|
|
54
|
+
|
|
55
|
+
| Mapping clause | 2.1.312 observed | Evidence |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| `promptField: tool_input.prompt` | **yes**, verbatim marker | PreToolUse Agent `tool_input.prompt`, 4/4 dispatches |
|
|
58
|
+
| `coordinatorPrincipalField: session_id` | **yes**, but the worker's SubagentStart/Stop carry the **same** `session_id` | Coordinator and worker differ only by `agent_id` presence |
|
|
59
|
+
| `synchronousPreToolUse` | **yes** | 4/4: SubagentStart 30–100 ms after the 2 s PreToolUse hold ended |
|
|
60
|
+
| `workerStartDispatchField: parent_tool_use_id` | **no**, the field is absent | 0/4 SubagentStart payloads. Only `session_id`, `prompt_id` (shared by both dispatches), `agent_id`, `agent_type`, `cwd` |
|
|
61
|
+
| `workerStartRootField: cwd` | **partial** | No isolation: `cwd` = coordinator cwd. `isolation: worktree`: `cwd` = `<project>/.claude/worktrees/agent-<agent_id>`, which is unknown before dispatch, so it cannot equal the marker's `workerRoot` |
|
|
62
|
+
| `taskResultDispatchField: tool_use_id` | **yes** | PostToolUse `tool_use_id` equals the Pre's, 4/4 |
|
|
63
|
+
| Result `agent_id` + `interrupted === false` | **no** | No top-level `agent_id` (the plugin journal lifts `tool_response.agentId`). No `interrupted` field on the Agent result at all |
|
|
64
|
+
|
|
65
|
+
## Extra finding: async launch
|
|
66
|
+
|
|
67
|
+
In Run 2 dispatch 1 the model omitted `run_in_background`. The host launched the worker asynchronously: PostToolUse `status: async_launched`, `isAsync: true`, and it fired **before** SubagentStop (+2040 ms vs +3490 ms). A PostToolUse is therefore not proof that the worker finished. Any result correlation must require `status: completed` or an explicit `run_in_background: false`.
|
|
68
|
+
|
|
69
|
+
## What would unblock the gate (owner/advisor decision, not done here)
|
|
70
|
+
|
|
71
|
+
- Correlate worker start without `parent_tool_use_id`: for example, by the order of Pre end → next SubagentStart within the same `session_id` while one dispatch is in flight, or by `tool_response.agentId` ↔ SubagentStart `agent_id` after the fact.
|
|
72
|
+
- Replace `interrupted === false` with `tool_response.status === 'completed'`.
|
|
73
|
+
- Define worker-root for isolation worktrees, where the path is derived from `agent_id`, not predeclared.
|
|
74
|
+
|
|
75
|
+
Each of these changes the mapping in `doc-reconciliation-provider.js`, so it needs advisor adjudication against answer-10 item 2/3 before any implementation.
|
package/benchmarks/results/live-host/claude-341-outline-dispatch-2026-10-28/capture.sanitized.jsonl
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{"run":"run1","phase":"start","ms":0,"event":"PreToolUse","payload":{"session_id":"<session-1>","cwd":"<scratch>/project","prompt_id":"<prompt-1>","permission_mode":"default","effort":{"level":"medium"},"hook_event_name":"PreToolUse","tool_name":"Agent","tool_input":{"description":"Outline capture worker dispatch 1","prompt":"HARNESS_OUTLINE_DISPATCH_V1 taskId=cap-001 attemptId=a1 token=<token-1> workerRoot=<scratch>/project\nReply with: worker done","subagent_type":"outline-worker","run_in_background":false},"tool_use_id":"<tool-use-1>"}}
|
|
2
|
+
{"run":"run1","phase":"end","ms":2002,"event":"PreToolUse","tool_use_id":"<tool-use-1>"}
|
|
3
|
+
{"run":"run1","phase":"start","ms":2032,"event":"SubagentStart","payload":{"session_id":"<session-1>","cwd":"<scratch>/project","prompt_id":"<prompt-1>","agent_id":"<agent-1>","agent_type":"outline-worker","hook_event_name":"SubagentStart"}}
|
|
4
|
+
{"run":"run1","phase":"end","ms":2033,"event":"SubagentStart","tool_use_id":null}
|
|
5
|
+
{"run":"run1","phase":"start","ms":3307,"event":"SubagentStop","payload":{"session_id":"<session-1>","cwd":"<scratch>/project","prompt_id":"<prompt-1>","permission_mode":"default","agent_id":"<agent-1>","agent_type":"outline-worker","effort":{"level":"medium"},"hook_event_name":"SubagentStop","stop_hook_active":false,"last_assistant_message":"worker done","background_tasks":[],"session_crons":[]}}
|
|
6
|
+
{"run":"run1","phase":"end","ms":3308,"event":"SubagentStop","tool_use_id":null}
|
|
7
|
+
{"run":"run1","phase":"start","ms":3360,"event":"PostToolUse","payload":{"session_id":"<session-1>","cwd":"<scratch>/project","prompt_id":"<prompt-1>","permission_mode":"default","effort":{"level":"medium"},"hook_event_name":"PostToolUse","tool_name":"Agent","tool_input":{"description":"Outline capture worker dispatch 1","prompt":"HARNESS_OUTLINE_DISPATCH_V1 taskId=cap-001 attemptId=a1 token=<token-1> workerRoot=<scratch>/project\nReply with: worker done","subagent_type":"outline-worker","run_in_background":false},"tool_response":{"keys":["agentId","agentType","canContinueAgent","content","harnessNoteCount","harnessSectionHash","harnessTailCount","prompt","resolvedModel","status","totalDurationMs","totalTokens","totalToolUseCount","usage"],"status":"completed","agentId":"<agent-1>"},"tool_use_id":"<tool-use-1>","duration_ms":1327}}
|
|
8
|
+
{"run":"run1","phase":"end","ms":3361,"event":"PostToolUse","tool_use_id":"<tool-use-1>"}
|
|
9
|
+
{"run":"run1","phase":"start","ms":6198,"event":"PreToolUse","payload":{"session_id":"<session-1>","cwd":"<scratch>/project","prompt_id":"<prompt-1>","permission_mode":"default","effort":{"level":"medium"},"hook_event_name":"PreToolUse","tool_name":"Agent","tool_input":{"description":"Outline capture worker dispatch 2","prompt":"HARNESS_OUTLINE_DISPATCH_V1 taskId=cap-002 attemptId=a1 token=<token-2> workerRoot=<scratch>/project\nReply with: worker done","subagent_type":"outline-worker","run_in_background":false,"isolation":"worktree"},"tool_use_id":"<tool-use-2>"}}
|
|
10
|
+
{"run":"run1","phase":"end","ms":8199,"event":"PreToolUse","tool_use_id":"<tool-use-2>"}
|
|
11
|
+
{"run":"run1","phase":"start","ms":8299,"event":"SubagentStart","payload":{"session_id":"<session-1>","cwd":"<scratch>/project/.claude/worktrees/agent-<agent-2>","prompt_id":"<prompt-1>","agent_id":"<agent-2>","agent_type":"outline-worker","hook_event_name":"SubagentStart"}}
|
|
12
|
+
{"run":"run1","phase":"end","ms":8300,"event":"SubagentStart","tool_use_id":null}
|
|
13
|
+
{"run":"run1","phase":"start","ms":9757,"event":"SubagentStop","payload":{"session_id":"<session-1>","cwd":"<scratch>/project/.claude/worktrees/agent-<agent-2>","prompt_id":"<prompt-1>","permission_mode":"default","agent_id":"<agent-2>","agent_type":"outline-worker","effort":{"level":"medium"},"hook_event_name":"SubagentStop","stop_hook_active":false,"last_assistant_message":"worker done","background_tasks":[],"session_crons":[]}}
|
|
14
|
+
{"run":"run1","phase":"end","ms":9758,"event":"SubagentStop","tool_use_id":null}
|
|
15
|
+
{"run":"run1","phase":"start","ms":9864,"event":"PostToolUse","payload":{"session_id":"<session-1>","cwd":"<scratch>/project","prompt_id":"<prompt-1>","permission_mode":"default","effort":{"level":"medium"},"hook_event_name":"PostToolUse","tool_name":"Agent","tool_input":{"description":"Outline capture worker dispatch 2","prompt":"HARNESS_OUTLINE_DISPATCH_V1 taskId=cap-002 attemptId=a1 token=<token-2> workerRoot=<scratch>/project\nReply with: worker done","subagent_type":"outline-worker","run_in_background":false,"isolation":"worktree"},"tool_response":{"keys":["agentId","agentType","canContinueAgent","content","harnessNoteCount","harnessSectionHash","harnessTailCount","prompt","resolvedModel","status","totalDurationMs","totalTokens","totalToolUseCount","usage"],"status":"completed","agentId":"<agent-2>"},"tool_use_id":"<tool-use-2>","duration_ms":1635}}
|
|
16
|
+
{"run":"run1","phase":"end","ms":9865,"event":"PostToolUse","tool_use_id":"<tool-use-2>"}
|
|
17
|
+
{"run":"run2","phase":"start","ms":0,"event":"PreToolUse","payload":{"session_id":"<session-2>","cwd":"<scratch>/project","prompt_id":"<prompt-2>","permission_mode":"default","effort":{"level":"medium"},"hook_event_name":"PreToolUse","tool_name":"Agent","tool_input":{"description":"Outline capture dispatch task-cap-001","prompt":"HARNESS_OUTLINE_DISPATCH_V1 taskId=task-cap-001 attemptId=a1 token=<token-3> workerRoot=<scratch>/project","subagent_type":"outline-worker"},"tool_use_id":"<tool-use-3>"}}
|
|
18
|
+
{"run":"run2","phase":"end","ms":2001,"event":"PreToolUse","tool_use_id":"<tool-use-3>"}
|
|
19
|
+
{"run":"run2","phase":"start","ms":2039,"event":"SubagentStart","payload":{"session_id":"<session-2>","cwd":"<scratch>/project","prompt_id":"<prompt-2>","agent_id":"<agent-3>","agent_type":"outline-worker","hook_event_name":"SubagentStart"}}
|
|
20
|
+
{"run":"run2","phase":"start","ms":2040,"event":"PostToolUse","payload":{"session_id":"<session-2>","cwd":"<scratch>/project","prompt_id":"<prompt-2>","permission_mode":"default","effort":{"level":"medium"},"hook_event_name":"PostToolUse","tool_name":"Agent","tool_input":{"description":"Outline capture dispatch task-cap-001","prompt":"HARNESS_OUTLINE_DISPATCH_V1 taskId=task-cap-001 attemptId=a1 token=<token-3> workerRoot=<scratch>/project","subagent_type":"outline-worker"},"tool_response":{"keys":["agentId","canContinueAgent","canReadOutputFile","description","isAsync","outputFile","prompt","resolvedModel","status"],"status":"async_launched","isAsync":true,"agentId":"<agent-3>"},"tool_use_id":"<tool-use-3>","duration_ms":3}}
|
|
21
|
+
{"run":"run2","phase":"end","ms":2041,"event":"SubagentStart","tool_use_id":null}
|
|
22
|
+
{"run":"run2","phase":"end","ms":2042,"event":"PostToolUse","tool_use_id":"<tool-use-3>"}
|
|
23
|
+
{"run":"run2","phase":"start","ms":3490,"event":"SubagentStop","payload":{"session_id":"<session-2>","cwd":"<scratch>/project","prompt_id":"<prompt-2>","permission_mode":"default","agent_id":"<agent-3>","agent_type":"outline-worker","effort":{"level":"medium"},"hook_event_name":"SubagentStop","stop_hook_active":false,"last_assistant_message":"worker done","background_tasks":[{"id":"<agent-3>","type":"subagent","status":"running","description":"Outline capture dispatch task-cap-001","agent_type":"outline-worker"}],"session_crons":[]}}
|
|
24
|
+
{"run":"run2","phase":"end","ms":3492,"event":"SubagentStop","tool_use_id":null}
|
|
25
|
+
{"run":"run2","phase":"start","ms":7846,"event":"PreToolUse","payload":{"session_id":"<session-2>","cwd":"<scratch>/project","prompt_id":"<prompt-3>","permission_mode":"default","effort":{"level":"medium"},"hook_event_name":"PreToolUse","tool_name":"Agent","tool_input":{"description":"Outline capture dispatch task-cap-002","prompt":"HARNESS_OUTLINE_DISPATCH_V1 taskId=task-cap-002 attemptId=a1 token=<token-4> workerRoot=<scratch>/project","subagent_type":"outline-worker","run_in_background":false,"isolation":"worktree"},"tool_use_id":"<tool-use-4>"}}
|
|
26
|
+
{"run":"run2","phase":"end","ms":9848,"event":"PreToolUse","tool_use_id":"<tool-use-4>"}
|
|
27
|
+
{"run":"run2","phase":"start","ms":9942,"event":"SubagentStart","payload":{"session_id":"<session-2>","cwd":"<scratch>/project/.claude/worktrees/agent-<agent-4>","prompt_id":"<prompt-3>","agent_id":"<agent-4>","agent_type":"outline-worker","hook_event_name":"SubagentStart"}}
|
|
28
|
+
{"run":"run2","phase":"end","ms":9943,"event":"SubagentStart","tool_use_id":null}
|
|
29
|
+
{"run":"run2","phase":"start","ms":11161,"event":"SubagentStop","payload":{"session_id":"<session-2>","cwd":"<scratch>/project/.claude/worktrees/agent-<agent-4>","prompt_id":"<prompt-3>","permission_mode":"default","agent_id":"<agent-4>","agent_type":"outline-worker","effort":{"level":"medium"},"hook_event_name":"SubagentStop","stop_hook_active":false,"last_assistant_message":"worker done","background_tasks":[],"session_crons":[]}}
|
|
30
|
+
{"run":"run2","phase":"end","ms":11162,"event":"SubagentStop","tool_use_id":null}
|
|
31
|
+
{"run":"run2","phase":"start","ms":11263,"event":"PostToolUse","payload":{"session_id":"<session-2>","cwd":"<scratch>/project","prompt_id":"<prompt-3>","permission_mode":"default","effort":{"level":"medium"},"hook_event_name":"PostToolUse","tool_name":"Agent","tool_input":{"description":"Outline capture dispatch task-cap-002","prompt":"HARNESS_OUTLINE_DISPATCH_V1 taskId=task-cap-002 attemptId=a1 token=<token-4> workerRoot=<scratch>/project","subagent_type":"outline-worker","run_in_background":false,"isolation":"worktree"},"tool_response":{"keys":["agentId","agentType","canContinueAgent","content","harnessNoteCount","harnessSectionHash","harnessTailCount","prompt","resolvedModel","status","totalDurationMs","totalTokens","totalToolUseCount","usage"],"status":"completed","agentId":"<agent-4>"},"tool_use_id":"<tool-use-4>","duration_ms":1388}}
|
|
32
|
+
{"run":"run2","phase":"end","ms":11264,"event":"PostToolUse","tool_use_id":"<tool-use-4>"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
},
|
|
12
12
|
"canonicalization": "estree-alpha-target-v2",
|
|
13
13
|
"moduleFingerprints": {
|
|
14
|
-
"evaluator": "
|
|
14
|
+
"evaluator": "d2097839b602b1266f02f31168e1f72e6dab2d88f796d1dc64df21e2cf3afded",
|
|
15
15
|
"capture": "95d0ca61505914e6c7cfc4603556f028208bd44203167397896ce0bf4ec58ef7"
|
|
16
16
|
},
|
|
17
17
|
"targets": [
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"module": "evaluator",
|
|
26
26
|
"name": "evaluateObligation",
|
|
27
27
|
"ruleIds": ["CAPTURE_CALL_SITES"],
|
|
28
|
-
"fingerprint": "
|
|
28
|
+
"fingerprint": "643127bd802817a0236b753516641de062b5af995969895cfca909a387dfd2b4"
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"module": "evaluator",
|
|
@@ -1694,7 +1694,8 @@ checkCase('2ax. frozen Git-object guard with bootstrap and tamper controls', ()
|
|
|
1694
1694
|
path.join(root, 'ci/fixtures/doc-lifecycle/scenarios')
|
|
1695
1695
|
);
|
|
1696
1696
|
const policy = JSON.parse(fs.readFileSync(path.join(REPOSITORY_ROOT, '.agents/harness-everything/project-docs.json'), 'utf8'));
|
|
1697
|
-
|
|
1697
|
+
// glob records (e.g. docs/adr/*.md) are policy patterns, not files; '*' is not a valid Windows filename
|
|
1698
|
+
for (const record of [...policy.governed, ...policy.derived]) if (!record.path.includes('*')) writeRelative(root, record.path, `baseline ${record.path}\n`);
|
|
1698
1699
|
writeRelative(root, 'docs/ordinary.md', 'baseline ordinary document\n');
|
|
1699
1700
|
return { root, base: commitFixture(root, 'fixture baseline') };
|
|
1700
1701
|
}
|
|
@@ -282,6 +282,11 @@ function isolatedRunProvider(leg, input, reference) {
|
|
|
282
282
|
const lib = path.join(dir, 'hooks', 'scripts', 'lib');
|
|
283
283
|
fs.mkdirSync(lib, { recursive: true });
|
|
284
284
|
fs.copyFileSync(path.join(leg.lib, 'doc-reconciliation-provider.js'), path.join(lib, 'doc-reconciliation-provider.js'));
|
|
285
|
+
fs.copyFileSync(path.join(leg.lib, 'workflow-isolation.js'), path.join(lib, 'workflow-isolation.js'));
|
|
286
|
+
const sharedScriptsLib = path.join(dir, 'scripts', 'lib');
|
|
287
|
+
fs.mkdirSync(sharedScriptsLib, { recursive: true });
|
|
288
|
+
fs.copyFileSync(path.resolve(leg.lib, '../../../scripts/lib/verification-contract.js'),
|
|
289
|
+
path.join(sharedScriptsLib, 'verification-contract.js'));
|
|
285
290
|
const provider = require(path.join(lib, 'doc-reconciliation-provider.js')).createClaudeOriginProvider(H.providerInput(input));
|
|
286
291
|
const response = provider.resolveEvent({ reference, identity: H.providerIdentity() });
|
|
287
292
|
const context = provider.resolveContext({ workspaceRoot: H.FIXED.workspaceRoot, workflowId: H.FIXED.workflowId, sessionId: H.FIXED.sessionId });
|
|
@@ -523,7 +528,7 @@ runner.run('R2C1-MANIFEST-SUBAGENT-HOOKS', [], (_mods, leg) => {
|
|
|
523
528
|
const hasStatePersist = group => ((group && group.hooks) || []).some(handler =>
|
|
524
529
|
handler.type === 'command' && /state-persist\.js/.test(handler.command || ''));
|
|
525
530
|
for (const route of [
|
|
526
|
-
{ event: 'PreToolUse', matcher: 'Bash|PowerShell|Task|Agent' },
|
|
531
|
+
{ event: 'PreToolUse', matcher: 'Bash|PowerShell|Task|Agent|Write|Edit|apply_patch' },
|
|
527
532
|
{ event: 'PostToolUse', matcher: 'Task|Agent' },
|
|
528
533
|
{ event: 'SubagentStart' },
|
|
529
534
|
{ event: 'SubagentStop' },
|
|
@@ -267,6 +267,11 @@ function partB() {
|
|
|
267
267
|
const copy = path.join(tmp, 'hooks', 'scripts', 'lib');
|
|
268
268
|
fs.mkdirSync(copy, { recursive: true });
|
|
269
269
|
fs.copyFileSync(path.join(leg.lib, 'doc-reconciliation-provider.js'), path.join(copy, 'doc-reconciliation-provider.js'));
|
|
270
|
+
fs.copyFileSync(path.join(leg.lib, 'workflow-isolation.js'), path.join(copy, 'workflow-isolation.js'));
|
|
271
|
+
const sharedScriptsLib = path.join(tmp, 'scripts', 'lib');
|
|
272
|
+
fs.mkdirSync(sharedScriptsLib, { recursive: true });
|
|
273
|
+
fs.copyFileSync(path.resolve(leg.lib, '../../../scripts/lib/verification-contract.js'),
|
|
274
|
+
path.join(sharedScriptsLib, 'verification-contract.js'));
|
|
270
275
|
const live = path.join(tmp, LIVE_REL);
|
|
271
276
|
fs.mkdirSync(live, { recursive: true });
|
|
272
277
|
fs.writeFileSync(path.join(live, 'README.md'), 'garbage\n');
|
|
@@ -301,9 +306,14 @@ const RED_LIVE_GATE = 'missing-implementation: the retained live gate accepts an
|
|
|
301
306
|
function partBPreloadBoundary(leg) {
|
|
302
307
|
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'f4-preload-'));
|
|
303
308
|
try {
|
|
304
|
-
const entry = path.join(tmp, '
|
|
309
|
+
const entry = path.join(tmp, 'hooks', 'scripts');
|
|
305
310
|
fs.mkdirSync(path.join(entry, 'lib'), { recursive: true });
|
|
306
311
|
fs.copyFileSync(path.join(leg.lib, 'doc-reconciliation-provider.js'), path.join(entry, 'lib', 'doc-reconciliation-provider.js'));
|
|
312
|
+
fs.copyFileSync(path.join(leg.lib, 'workflow-isolation.js'), path.join(entry, 'lib', 'workflow-isolation.js'));
|
|
313
|
+
const sharedScriptsLib = path.join(tmp, 'scripts', 'lib');
|
|
314
|
+
fs.mkdirSync(sharedScriptsLib, { recursive: true });
|
|
315
|
+
fs.copyFileSync(path.resolve(leg.lib, '../../../scripts/lib/verification-contract.js'),
|
|
316
|
+
path.join(sharedScriptsLib, 'verification-contract.js'));
|
|
307
317
|
const probe = path.join(entry, 'probe.js');
|
|
308
318
|
fs.writeFileSync(probe, [
|
|
309
319
|
"const provider = require('./lib/doc-reconciliation-provider.js');",
|