@agentskit/harness 0.9.0 → 0.10.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/CHANGELOG.md CHANGED
@@ -1,5 +1,35 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.10.0] - 2026-09-12
4
+
5
+ Closes the gaps found comparing this harness against LangChain's "custom agent harness" article. The structural
6
+ difference stands: this harness orchestrates opaque external CLI agents, so a model/tool-loop middleware isn't
7
+ possible here — every item below targets the orchestration layer this loop actually controls (see ADR-0030).
8
+
9
+ - **Local event bus + orchestration lifecycle hooks**: `plugins.modules` (local `.mjs` files, empty by default)
10
+ loaded once per `tick`/`deliver`, each getting `src/loop/event-bus.ts`'s bus to subscribe to loop events live
11
+ and to `beforeDispatch`/`afterDispatch`/`beforeReview`/`afterReview`/`beforeMerge`/`afterMerge`/`onPause`/
12
+ `onEscalate` — a `before*` hook can return `{ block: true, reason }` to stop the action. `loop doctor` gained a
13
+ `plugins.modules` check.
14
+ - **PII/secret scanning**: `security.pii.enabled` (default false) scans issue text before it enters the
15
+ orchestrator prompt and the worker brief for PII-shaped patterns (email, common API-key prefixes, phone,
16
+ card-number-shaped digits); `security.pii.action` is `redact` (default when enabled), `warn`, or `block`.
17
+ - **Cost/time circuit breakers** for an in-flight dispatch, since the loop cannot count a worker CLI's own
18
+ model/tool calls: `delivery.maxDispatchMinutes` (hard wall-clock ceiling) and `resilience.maxUsageDeltaPercent`
19
+ (stops a dispatch whose provider's remaining Orca usage dropped past the threshold since it was sent out).
20
+ `dispatch.json` now records `initialRemainingPercent`. Either trip stops the issue like a stuck worker.
21
+ - **Human-approval merge gate**: `delivery.merge.requireHumanApproval` (default false) holds a clean, green-checks
22
+ PR until a human approves it on GitHub (`reviewDecision: 'APPROVED'`, already fetched with every PR snapshot).
23
+ - **MCP allowlist doctor check**: `loop doctor` validates the default-deny `mcp.allowTools` bridge wiring when
24
+ `mcp.enabled` — MCP stays adapter-only and read-only per ADR-0028, so this checks the allow/deny plumbing, not a
25
+ live connection to an MCP server.
26
+ - **Dynamic outcome progress**: the brief documents an optional `progress.json` convention
27
+ (`{"o1": "done", "o2": "in-progress"}`) a worker can write at its worktree root; `loop debrief` shows
28
+ `N/M outcome(s) done` per in-flight issue when present (`src/loop/progress.ts`, best-effort, never required).
29
+ - **Secret-shaped filename guardrail**: `delivery.secretFilePatterns` (default covers `.env`, `*.pem`, `*.key`,
30
+ `id_rsa`, `credentials.json`, …) extends the existing `selfEditPaths` hold — a PR touching a matching filename is
31
+ held, never reviewed or merged, in both the normal dispatch path and GitHub label intake.
32
+
3
33
  ## [0.9.0] - 2026-09-12
4
34
 
5
35
  - **Failure-classification fix**: `classifyProviderFailure` now recognises real Claude/Codex/Grok usage-limit phrasing ("You've hit your session limit", "usage limit reached", "credit balance is too low", "spend limit reached", "temporarily limiting requests", "Overloaded") as `quota` instead of falling through to `other`, and `extractResetsAt` parses a relative (`resets in 3h`) or clock-time (`resets 10:40pm`) reset out of the message. A code-review exit is classified the same way, marking the reviewer's provider (not the review-CLI transport id) cooling down instead of retrying every tick. Root cause of a 2026-09-11/12 pilot bug: 19 unclassified `contract.failed` retries across 4 issues and 12 incomplete reviews over 7h with no cooldown ever recorded.