agentic-engineering-harness 0.5.1 → 0.6.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/README.md +157 -216
- package/dist/agents/config.js +2 -0
- package/dist/agents/config.js.map +1 -1
- package/dist/audit/intent.d.ts +20 -0
- package/dist/audit/intent.js +42 -0
- package/dist/audit/intent.js.map +1 -0
- package/dist/audit/run.d.ts +46 -0
- package/dist/audit/run.js +147 -0
- package/dist/audit/run.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/core/config.js +6 -2
- package/dist/core/config.js.map +1 -1
- package/dist/core/controlPlane.js +1 -1
- package/dist/core/controlPlane.js.map +1 -1
- package/dist/core/init.js +3 -3
- package/dist/core/init.js.map +1 -1
- package/dist/core/types.d.ts +20 -0
- package/dist/entry.js +112 -3
- package/dist/entry.js.map +1 -1
- package/dist/issues/intake.d.ts +1 -1
- package/dist/paseo/capabilities.d.ts +24 -0
- package/dist/paseo/capabilities.js +104 -0
- package/dist/paseo/capabilities.js.map +1 -0
- package/dist/paseo/context.d.ts +45 -0
- package/dist/paseo/context.js +153 -0
- package/dist/paseo/context.js.map +1 -0
- package/dist/paseo/start.d.ts +10 -2
- package/dist/paseo/start.js +56 -73
- package/dist/paseo/start.js.map +1 -1
- package/dist/spec/openspec.d.ts +28 -0
- package/dist/spec/openspec.js +179 -0
- package/dist/spec/openspec.js.map +1 -0
- package/dist/toolchain/resolve.js +3 -0
- package/dist/toolchain/resolve.js.map +1 -1
- package/dist/workers/paseo.js +53 -19
- package/dist/workers/paseo.js.map +1 -1
- package/docs/PASEO.md +56 -4
- package/docs/V0.5.2.md +180 -0
- package/docs/V0.6.md +148 -0
- package/package.json +3 -3
- package/presets/agents/orchestration.jsonc +37 -0
- package/schemas/project.schema.json +13 -2
- package/skills/engineering-workflow/SKILL.md +110 -86
- package/skills/openspec-authoring/SKILL.md +26 -0
- package/skills/paseo-orchestration/SKILL.md +38 -0
- package/templates/AGENTS.md +36 -17
- package/templates/agents.source.jsonc +1 -1
- package/templates/openspec-config.yaml +24 -0
- package/templates/project.yaml +11 -2
- package/templates/toolchain.yaml +11 -1
package/dist/workers/paseo.js
CHANGED
|
@@ -1,29 +1,63 @@
|
|
|
1
1
|
import { validateExecutionCapabilities } from "../agents/permissions.js";
|
|
2
2
|
import { deliveryWorkspaceId } from "../delivery/handoff.js";
|
|
3
|
+
import { detectPaseoCapabilities, buildPaseoBackgroundRunCommand, extractPaseoAgentId } from "../paseo/capabilities.js";
|
|
3
4
|
import { commandExists, runProcess } from "../utils/process.js";
|
|
4
5
|
import { buildRepairPrompt, buildWorkerPrompt } from "./prompt.js";
|
|
5
6
|
export class PaseoWorkerExecutor {
|
|
6
7
|
name = "paseo";
|
|
7
|
-
async doctor(root, _config, selection) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
async doctor(root, _config, selection) {
|
|
9
|
+
const ok = await commandExists("paseo", root);
|
|
10
|
+
if (!ok)
|
|
11
|
+
return { ok: false, message: "Paseo CLI not found." };
|
|
12
|
+
if (selection) {
|
|
13
|
+
const issues = validateExecutionCapabilities(selection, "paseo");
|
|
14
|
+
if (issues.length)
|
|
15
|
+
return { ok: false, message: issues.join("; ") };
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const caps = await detectPaseoCapabilities(root);
|
|
19
|
+
if (!caps.background)
|
|
20
|
+
return { ok: false, message: `Installed Paseo${caps.version ? ` ${caps.version}` : ""} does not advertise background runs required by the CLI fallback.` };
|
|
21
|
+
return { ok: true, message: `Paseo CLI detected${caps.version ? ` (${caps.version})` : ""}; launch flags negotiated dynamically.` };
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
return { ok: false, message: `Paseo capability probe failed: ${String(error)}` };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
13
27
|
async start(root, config, contract, selection) { return this.launch(root, config, contract, buildWorkerPrompt(contract, selection), selection); }
|
|
14
|
-
async repair(root, config, contract, session, packet, selection) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
async repair(root, config, contract, session, packet, selection) {
|
|
29
|
+
if (session.id && (!selection || session.logicalAgent === selection.logicalAgent)) {
|
|
30
|
+
const send = await runProcess(`paseo send ${quote(session.id)} --no-wait ${quote(buildRepairPrompt(packet))}`, { cwd: root, timeoutMs: 60_000 });
|
|
31
|
+
if (send.exitCode !== 0)
|
|
32
|
+
throw new Error(`Paseo failed to send repair prompt: ${send.stderr || send.stdout}`);
|
|
33
|
+
return this.waitAndCollect(root, config, session);
|
|
34
|
+
}
|
|
35
|
+
return this.launch(root, config, contract, `${buildWorkerPrompt(contract, selection)}\n\n${buildRepairPrompt(packet)}`, selection);
|
|
36
|
+
}
|
|
37
|
+
async launch(root, config, contract, prompt, selection) {
|
|
38
|
+
const worker = config.orchestration?.worker;
|
|
39
|
+
const provider = selection?.paseoProvider ?? worker?.provider ?? "opencode";
|
|
40
|
+
const model = selection ? (selection.runtimeAdapter === "codex" ? selection.modelName : selection.modelId) : worker?.model;
|
|
41
|
+
const title = `${worker?.titlePrefix ?? "aeh"}-${contract.task.id}-${selection?.logicalAgent ?? "worker"}`;
|
|
42
|
+
const workspaceId = await deliveryWorkspaceId(root, config, contract.task.id);
|
|
43
|
+
const capabilities = await detectPaseoCapabilities(root);
|
|
44
|
+
const command = buildPaseoBackgroundRunCommand({ title, provider, model, workspaceId, prompt }, capabilities);
|
|
45
|
+
const launch = await runProcess(command, { cwd: root, timeoutMs: 60_000 });
|
|
46
|
+
if (launch.exitCode !== 0)
|
|
47
|
+
throw new Error(`Paseo failed to launch worker${capabilities.version ? ` with ${capabilities.version}` : ""}: ${launch.stderr || launch.stdout}`);
|
|
48
|
+
const id = extractPaseoAgentId(launch.stdout);
|
|
49
|
+
if (!id)
|
|
50
|
+
throw new Error("Paseo returned no parseable agent id for the background worker.");
|
|
51
|
+
return this.waitAndCollect(root, config, { id, provider, model, logicalAgent: selection?.logicalAgent, nativeAgent: selection?.nativeAgent, runtime: selection?.runtimeName, profile: selection?.profile, exitCode: 0, stdout: launch.stdout, stderr: "" });
|
|
52
|
+
}
|
|
53
|
+
async waitAndCollect(root, config, session) {
|
|
54
|
+
const timeout = config.orchestration?.worker?.timeoutSeconds ?? 1800;
|
|
55
|
+
const wait = await runProcess(`paseo wait ${quote(session.id)} --timeout ${timeout}`, { cwd: root, timeoutMs: (timeout + 30) * 1000 });
|
|
56
|
+
if (wait.exitCode !== 0)
|
|
57
|
+
return { ...session, exitCode: wait.exitCode, stderr: wait.stderr || wait.stdout };
|
|
58
|
+
const logs = await runProcess(`paseo logs ${quote(session.id)} --tail 30`, { cwd: root, timeoutMs: 60_000 });
|
|
59
|
+
return { ...session, exitCode: 0, stdout: logs.stdout || wait.stdout || session.stdout, stderr: [session.stderr, wait.stderr, logs.stderr].filter(Boolean).join("\n") };
|
|
60
|
+
}
|
|
27
61
|
}
|
|
28
62
|
function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
|
|
29
63
|
//# sourceMappingURL=paseo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paseo.js","sourceRoot":"","sources":["../../src/workers/paseo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAEzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"paseo.js","sourceRoot":"","sources":["../../src/workers/paseo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAEzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACxH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGnE,MAAM,OAAO,mBAAmB;IACrB,IAAI,GAAG,OAAO,CAAC;IACxB,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,OAA6B,EAAE,SAAmC;QAC3F,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;QAC9G,IAAI,SAAS,EAAE,CAAC;YAAC,MAAM,MAAM,GAAG,6BAA6B,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAAC,IAAI,MAAM,CAAC,MAAM;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAAC,CAAC;QACzJ,IAAI,CAAC;YAAC,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,mEAAmE,EAAE,CAAC;YAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,qBAAqB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,wCAAwC,EAAE,CAAC;QAAC,CAAC;QAChX,OAAO,KAAK,EAAE,CAAC;YAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,kCAAkC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QAAC,CAAC;IACrG,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,MAA4B,EAAE,QAAsB,EAAE,SAAmC,IAA4B,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC/O,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,MAA4B,EAAE,QAAsB,EAAE,OAAsB,EAAE,MAAoB,EAAE,SAAmC;QAChK,IAAI,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;YAClF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,cAAc,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;YACjJ,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9G,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO,iBAAiB,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACrI,CAAC;IACO,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,MAA4B,EAAE,QAAsB,EAAE,MAAc,EAAE,SAAmC;QAC1I,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC;QAC5C,MAAM,QAAQ,GAAG,SAAS,EAAE,aAAa,IAAI,MAAM,EAAE,QAAQ,IAAI,UAAU,CAAC;QAC5E,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC;QAC3H,MAAM,KAAK,GAAG,GAAG,MAAM,EAAE,WAAW,IAAI,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,SAAS,EAAE,YAAY,IAAI,QAAQ,EAAE,CAAC;QAC3G,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9E,MAAM,YAAY,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,8BAA8B,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC;QAC9G,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3E,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7K,MAAM,EAAE,GAAG,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QAC5F,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9P,CAAC;IACO,KAAK,CAAC,cAAc,CAAC,IAAY,EAAE,MAA4B,EAAE,OAAsB;QAC7F,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,cAAc,IAAI,IAAI,CAAC;QACrE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,cAAc,KAAK,CAAC,OAAO,CAAC,EAAG,CAAC,cAAc,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACxI,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC;YAAE,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5G,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,cAAc,KAAK,CAAC,OAAO,CAAC,EAAG,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9G,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1K,CAAC;CACF;AACD,SAAS,KAAK,CAAC,KAAa,IAAY,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC"}
|
package/docs/PASEO.md
CHANGED
|
@@ -1,9 +1,61 @@
|
|
|
1
1
|
# Paseo Integration
|
|
2
2
|
|
|
3
|
-
Paseo is
|
|
3
|
+
Paseo is AEH's default interactive orchestration surface. In v0.6 the design intentionally separates **agent-local orchestration** from the **external deterministic Harness adapter**.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Conversational lead
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
When the lead is running inside Paseo and Paseo exposes its orchestration tools, prefer the native/MCP control surface:
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
- create a bounded agent;
|
|
10
|
+
- send follow-up prompts;
|
|
11
|
+
- inspect agent status/activity;
|
|
12
|
+
- cancel/archive/update agent lifecycle;
|
|
13
|
+
- use `/paseo` for the current tool reference;
|
|
14
|
+
- use `/paseo-handoff` when responsibility moves to a fresh agent.
|
|
15
|
+
|
|
16
|
+
This keeps the lead as an orchestrator and avoids filling its context with hand-written shell control loops. Committee/advisor skills are advisory reasoning only; deterministic AEH validation remains authoritative.
|
|
17
|
+
|
|
18
|
+
## External AEH fallback
|
|
19
|
+
|
|
20
|
+
AEH itself is an external Node control-plane process and cannot assume access to tools injected only into an agent conversation. Therefore it retains a CLI adapter for deterministic launches, waits, logs and repair prompts.
|
|
21
|
+
|
|
22
|
+
The adapter no longer hard-codes a specific Paseo CLI surface. Before launch it probes:
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
paseo --version
|
|
26
|
+
paseo run --help
|
|
27
|
+
paseo daemon status --help
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
and conditionally uses JSON/quiet/background flags only when supported. This permits older Paseo installations to fail with a precise capability error rather than because AEH blindly passed a newer flag.
|
|
31
|
+
|
|
32
|
+
Recognized stale/unreachable daemon states are recovered by stop/start + readiness verification before launching a lead/worker.
|
|
33
|
+
|
|
34
|
+
## Session policy
|
|
35
|
+
|
|
36
|
+
Default:
|
|
37
|
+
|
|
38
|
+
```yaml
|
|
39
|
+
orchestration:
|
|
40
|
+
interactive:
|
|
41
|
+
sessionPolicy: fresh-on-start
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
aeh start # fresh lead
|
|
46
|
+
aeh start --resume # explicit compatible reuse
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Workspaces and durable AEH state remain reusable even though normal conversational context starts clean.
|
|
50
|
+
|
|
51
|
+
## Context rotation
|
|
52
|
+
|
|
53
|
+
Default pressure policy is 70/80/90 percent. `aeh context guard` consumes a context ratio only when Paseo exposes a usable field; AEH does not guess.
|
|
54
|
+
|
|
55
|
+
At the handoff threshold it writes a deterministic `.harness/paseo/handoffs/*.json` artifact. From a managed Paseo lead it also creates the replacement lead automatically and bootstraps it from the handoff artifact and referenced sealed/run/audit/delivery state. The old lead stops engineering work rather than compacting and continuing normally.
|
|
56
|
+
|
|
57
|
+
## Trust boundary
|
|
58
|
+
|
|
59
|
+
Paseo owns communication/process/session lifecycle. It is not normative engineering truth. AEH TaskContracts, seals, deterministic reports, evidence graphs and quality gates continue to decide acceptance.
|
|
60
|
+
|
|
61
|
+
For stronger direct process isolation configure Podman sandboxing where appropriate; Paseo orchestration and worker sandboxing remain separate policy axes.
|
package/docs/V0.5.2.md
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# v0.5.2 — Harness-governed engineering audits
|
|
2
|
+
|
|
3
|
+
v0.5.2 closes the read-only escape that existed in v0.5.1. A request no longer bypasses AEH merely because it does not mutate files. The interactive entrypoint now distinguishes a purely informational question from a read-only engineering operation.
|
|
4
|
+
|
|
5
|
+
## Intent model
|
|
6
|
+
|
|
7
|
+
Every conversational request is classified at the top level as:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
prompt
|
|
11
|
+
|
|
|
12
|
+
v
|
|
13
|
+
engineering intent
|
|
14
|
+
|-- INFORMATIONAL -> direct answer, no mutation
|
|
15
|
+
|-- AUDIT -> Harness read-only audit pipeline
|
|
16
|
+
`-- CHANGE -> deterministic QUICK | SPEC triage
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
`AUDIT` is deliberately not a subtype of QUICK. A repository-wide review is valid audit scope even though it would be invalid QUICK scope, and it does not need artificial SDD artifacts merely to run a code review.
|
|
20
|
+
|
|
21
|
+
Examples:
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
"What does src/core/run.ts do?"
|
|
25
|
+
-> INFORMATIONAL
|
|
26
|
+
|
|
27
|
+
"review the repo and validate the code for improvements"
|
|
28
|
+
-> AUDIT
|
|
29
|
+
|
|
30
|
+
"find bugs and security risks"
|
|
31
|
+
-> AUDIT
|
|
32
|
+
|
|
33
|
+
"review this module and fix every bug you find"
|
|
34
|
+
-> CHANGE -> QUICK | SPEC
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
The public classifier is:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
aeh intent "review the repo and validate the code for improvements"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Audit workflow
|
|
44
|
+
|
|
45
|
+
Run an audit explicitly with:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
aeh audit "review the repo and validate the code for improvements"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Optional hints include repeated `--file`, `--domain`, `--reviewer` and `--risk low|medium|high` values.
|
|
52
|
+
|
|
53
|
+
The pipeline is:
|
|
54
|
+
|
|
55
|
+
```text
|
|
56
|
+
AUDIT request
|
|
57
|
+
|
|
|
58
|
+
v
|
|
59
|
+
worktree checkpoint
|
|
60
|
+
|
|
|
61
|
+
v
|
|
62
|
+
transient TaskContract + SHA-256 seal
|
|
63
|
+
|
|
|
64
|
+
v
|
|
65
|
+
hard-frozen control plane
|
|
66
|
+
|
|
|
67
|
+
v
|
|
68
|
+
configured deterministic validators
|
|
69
|
+
|
|
|
70
|
+
v
|
|
71
|
+
failure classification
|
|
72
|
+
|
|
|
73
|
+
v
|
|
74
|
+
read-only reviewer wave
|
|
75
|
+
|
|
|
76
|
+
v
|
|
77
|
+
finding normalization + deduplication
|
|
78
|
+
|
|
|
79
|
+
v
|
|
80
|
+
severity counts + DebtScore + Quality Gate evaluation
|
|
81
|
+
|
|
|
82
|
+
v
|
|
83
|
+
AuditReport
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Reviewer sessions are clamped to `write=deny`, `gitWrite=deny` and `delegate=deny`. The worktree is also checkpointed before the audit and rolled back afterward, so an accidental tracked mutation by a reviewer or tool does not survive. Any dirty paths that existed before the audit are restored to their exact prior contents.
|
|
87
|
+
|
|
88
|
+
The transient contract and seal make the audit compatible with the same direct, Paseo and supported Podman execution boundaries used elsewhere in AEH.
|
|
89
|
+
|
|
90
|
+
## Deterministic failures are evidence
|
|
91
|
+
|
|
92
|
+
The lead must not silently reinterpret a failing validator as harmless environment noise. Audit reports classify failed checks when possible as:
|
|
93
|
+
|
|
94
|
+
```text
|
|
95
|
+
ASSERTION_FAILURE
|
|
96
|
+
ENVIRONMENT_FAILURE
|
|
97
|
+
SANDBOX_DENIAL
|
|
98
|
+
MISSING_DEPENDENCY
|
|
99
|
+
TOOL_FAILURE
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
For example:
|
|
103
|
+
|
|
104
|
+
```text
|
|
105
|
+
spawnSync git EPERM: operation not permitted
|
|
106
|
+
-> SANDBOX_DENIAL
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
That classification does not pretend the affected test passed. The audit remains `DEGRADED` and `productionSafe=false` when a deterministic failure prevents establishing correctness.
|
|
110
|
+
|
|
111
|
+
## AuditReport
|
|
112
|
+
|
|
113
|
+
Reports are machine-readable local artifacts:
|
|
114
|
+
|
|
115
|
+
```text
|
|
116
|
+
.harness/audits/<auditId>.json
|
|
117
|
+
.harness/audits/latest.json
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
An AuditReport contains:
|
|
121
|
+
|
|
122
|
+
- frozen controller SHA;
|
|
123
|
+
- audited commit/base ref and pre-existing dirty paths;
|
|
124
|
+
- deterministic checks plus failure classes;
|
|
125
|
+
- reviewer sessions;
|
|
126
|
+
- normalized/deduplicated findings;
|
|
127
|
+
- severity counts;
|
|
128
|
+
- integer DebtPoints and displayed DebtScore;
|
|
129
|
+
- Final Quality Gate evaluation;
|
|
130
|
+
- conservative `productionSafe` status;
|
|
131
|
+
- any paths restored by the read-only rollback boundary.
|
|
132
|
+
|
|
133
|
+
Audit artifacts are generated state and are gitignored by `aeh init`.
|
|
134
|
+
|
|
135
|
+
## Audit to remediation
|
|
136
|
+
|
|
137
|
+
AUDIT itself does not edit files or auto-remediate. If the user later says:
|
|
138
|
+
|
|
139
|
+
```text
|
|
140
|
+
fix these
|
|
141
|
+
fix all findings
|
|
142
|
+
implement the audit recommendations
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
the persistent lead reads `.harness/audits/latest.json` and the referenced report, reuses the normalized findings as evidence for a new `CHANGE`, and performs normal deterministic change triage.
|
|
146
|
+
|
|
147
|
+
```text
|
|
148
|
+
AuditReport
|
|
149
|
+
|
|
|
150
|
+
v
|
|
151
|
+
new CHANGE request
|
|
152
|
+
|
|
|
153
|
+
v
|
|
154
|
+
QUICK | SPEC
|
|
155
|
+
|
|
|
156
|
+
v
|
|
157
|
+
sealed implementation workflow
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
The audit result does not override safety policy. Security, architecture, schema, public API, cross-module or otherwise unsafe findings still force SPEC when normal change triage requires it.
|
|
161
|
+
|
|
162
|
+
## Paseo behavior
|
|
163
|
+
|
|
164
|
+
`aeh start` now writes bootstrap version 2. Existing v0.5.1 lead sessions are intentionally incompatible and are recreated/replaced on the next start so the old broad read-only bypass cannot persist.
|
|
165
|
+
|
|
166
|
+
The standing interactive invariant is now:
|
|
167
|
+
|
|
168
|
+
> Every engineering operation must enter through the Harness, whether read-only or mutating. Only purely informational questions may bypass AEH.
|
|
169
|
+
|
|
170
|
+
Consequently this prompt:
|
|
171
|
+
|
|
172
|
+
```text
|
|
173
|
+
review the repo and validate the code for improvements
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
must route to `aeh audit`; the lead must not answer that it skipped AEH because the work is read-only.
|
|
177
|
+
|
|
178
|
+
## Control-plane freeze
|
|
179
|
+
|
|
180
|
+
Self-hosted AEH snapshots now explicitly include `src/audit` and `src/paseo` in the controller trust boundary. Audit policy and the interactive routing code therefore cannot modify themselves and take effect inside the same active audit/run; changes govern only a later invocation after validation.
|
package/docs/V0.6.md
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# v0.6 — Orchestration & Context Architecture
|
|
2
|
+
|
|
3
|
+
v0.6 changes the interactive model from a persistent lead that personally performs setup, discovery and specification authoring into a thin semantic orchestrator backed by bounded agents and durable Harness state.
|
|
4
|
+
|
|
5
|
+
## Thin lead
|
|
6
|
+
|
|
7
|
+
The interactive lead owns user intent, high-level routing, true ambiguity and final semantic acceptance. It delegates operational work:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
User
|
|
11
|
+
|
|
|
12
|
+
v
|
|
13
|
+
AEH Lead
|
|
14
|
+
|-- explorer repository discovery
|
|
15
|
+
|-- environment-manager doctor/setup/Paseo recovery
|
|
16
|
+
|-- planner decomposition + triage evidence
|
|
17
|
+
|-- spec-manager OpenSpec authoring
|
|
18
|
+
`-- AEH implementation/validation/review/delivery
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
The lead should receive compact structured outcomes instead of retaining raw shell logs, full source files or long environment-repair transcripts.
|
|
22
|
+
|
|
23
|
+
## Paseo-native orchestration first
|
|
24
|
+
|
|
25
|
+
When the current Paseo agent exposes its orchestration tools, the lead prefers `create_agent`, `send_agent_prompt`, `get_agent_status`, `get_agent_activity` and lifecycle controls, and uses `/paseo-handoff` for responsibility transfer. `/paseo-committee` and `/paseo-advisor` may provide advisory reasoning but never override deterministic AEH gates.
|
|
26
|
+
|
|
27
|
+
AEH still contains a CLI-based Paseo adapter because an external Node control-plane process cannot invoke tools local to the conversational agent. That adapter is now a compatibility fallback rather than the lead's normal orchestration mechanism.
|
|
28
|
+
|
|
29
|
+
The fallback negotiates the installed Paseo surface at runtime with `paseo --version` and help output. It does not assume `--quiet`, JSON output or daemon JSON support. This specifically avoids the failure mode where an older Paseo such as 0.3.1 rejects a flag expected by a newer CLI.
|
|
30
|
+
|
|
31
|
+
Recoverable daemon states such as stale PID, unreachable daemon or connection refused are stopped/restarted and verified before lead/worker launch.
|
|
32
|
+
|
|
33
|
+
## Fresh lead sessions
|
|
34
|
+
|
|
35
|
+
`aeh start` now creates a fresh lead by default:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
aeh start
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Explicit reuse is:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
aeh start --resume
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
This prevents a new invocation from inheriting stale conversational assumptions, obsolete bootstrap instructions or unnecessary historical context. Durable Git/TaskContract/seal/run/audit/delivery state remains reusable even when the conversation is fresh.
|
|
48
|
+
|
|
49
|
+
## Context pressure and automatic lead rotation
|
|
50
|
+
|
|
51
|
+
Default policy:
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
<70% normal
|
|
55
|
+
70-80% PRESSURE: stop exploratory work and increase delegation
|
|
56
|
+
>=80% HANDOFF_REQUIRED: write handoff and rotate to a fresh lead
|
|
57
|
+
>=90% HARD_HANDOFF: no further engineering work in the old lead
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The public check is:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
aeh context guard --agent "$PASEO_AGENT_ID"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
When Paseo exposes a usable context ratio and the guard runs inside a managed Paseo lead, AEH writes:
|
|
67
|
+
|
|
68
|
+
```text
|
|
69
|
+
.harness/paseo/handoffs/lead-<timestamp>.json
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
and automatically creates a fresh lead. The artifact records prior/new lead IDs, context usage, branch, latest run/audit/delivery references, and an optional semantic brief. The fresh lead is bootstrapped from this deterministic artifact and its referenced sealed state. Normal compaction-and-continue is not the preferred path once the handoff threshold is crossed.
|
|
73
|
+
|
|
74
|
+
If the installed Paseo version does not expose a stable context ratio, AEH returns `UNKNOWN`; it does not fabricate token usage. Fresh-on-start and delegation-first behavior still reduce accumulation.
|
|
75
|
+
|
|
76
|
+
## OpenSpec as SPEC authoring backend
|
|
77
|
+
|
|
78
|
+
For non-QUICK changes, the lead no longer writes proposal/spec/design/tasks itself. `spec-manager` owns SPEC authoring with OpenSpec.
|
|
79
|
+
|
|
80
|
+
```text
|
|
81
|
+
CHANGE
|
|
82
|
+
|
|
|
83
|
+
v
|
|
84
|
+
SPEC
|
|
85
|
+
|
|
|
86
|
+
v
|
|
87
|
+
spec-manager
|
|
88
|
+
|
|
|
89
|
+
|-- aeh spec prepare
|
|
90
|
+
|-- openspec status / instructions
|
|
91
|
+
|-- proposal/specs/design/tasks
|
|
92
|
+
|-- openspec validate --strict
|
|
93
|
+
`-- aeh spec compile
|
|
94
|
+
|
|
|
95
|
+
v
|
|
96
|
+
AEH proposal/spec/design/tasks/Gherkin
|
|
97
|
+
+ TaskContract
|
|
98
|
+
+ stable requirement IDs
|
|
99
|
+
+ validator traceability
|
|
100
|
+
|
|
|
101
|
+
v
|
|
102
|
+
seal
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Commands:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
aeh spec prepare READABILITY-001 --title "Improve readability"
|
|
109
|
+
aeh spec compile READABILITY-001 --title "Improve readability"
|
|
110
|
+
aeh sdd validate READABILITY-001
|
|
111
|
+
aeh seal READABILITY-001
|
|
112
|
+
aeh run READABILITY-001
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
OpenSpec is an **authoring source before freeze**. The compiled native AEH SDD/TaskContract and seal remain normative during implementation. OpenSpec apply commands do not replace AEH's worker, validation, review-convergence or delivery lifecycle.
|
|
116
|
+
|
|
117
|
+
The compiler records `authoring.provider=openspec`, change name and SHA-256 provenance. It maps OpenSpec `### Requirement:` / `#### Scenario:` content into stable AEH requirement IDs and Gherkin acceptance. Refactor/tooling changes without a delta spec receive an explicit behavior-preservation requirement.
|
|
118
|
+
|
|
119
|
+
A requirement validator may not be invented. AEH uses configured deterministic validators first, otherwise derives a project test/typecheck/build command from known project metadata. If it cannot establish executable requirement evidence, SPEC compilation fails instead of emitting a phantom validator.
|
|
120
|
+
|
|
121
|
+
## Built-in orchestration preset
|
|
122
|
+
|
|
123
|
+
New projects extend:
|
|
124
|
+
|
|
125
|
+
```jsonc
|
|
126
|
+
{
|
|
127
|
+
"extends": ["aeh:orchestration"]
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
This extends `aeh:default`, makes lead/planner delegation-first, and adds:
|
|
132
|
+
|
|
133
|
+
- `environment-manager`;
|
|
134
|
+
- `spec-manager`.
|
|
135
|
+
|
|
136
|
+
OpenSpec is included in the declarative toolchain and automatically selected when `sdd.authoring.provider: openspec` is active.
|
|
137
|
+
|
|
138
|
+
## Trust boundary
|
|
139
|
+
|
|
140
|
+
The authority order remains unchanged:
|
|
141
|
+
|
|
142
|
+
1. user intent / true product decisions;
|
|
143
|
+
2. sealed compiled AEH SDD + TaskContract;
|
|
144
|
+
3. deterministic validators/evidence;
|
|
145
|
+
4. quality/review gates;
|
|
146
|
+
5. LLM summaries and advisory tools.
|
|
147
|
+
|
|
148
|
+
Paseo skills improve communication and lifecycle control; they do not become gate authority. OpenSpec improves specification authoring; it does not become mutable execution truth after the AEH seal.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentic-engineering-harness",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "OSS-first engineering harness for deterministic, spec-driven
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"description": "OSS-first engineering harness for deterministic, spec-driven, issue-driven, audit-governed and orchestration-first multi-agent software delivery.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": { "engineering-harness": "./dist/entry.js", "aeh": "./dist/entry.js" },
|
|
7
7
|
"files": ["dist", "templates", "presets", "policies", "schemas", "skills", "docs"],
|
|
@@ -14,5 +14,5 @@
|
|
|
14
14
|
"bugs": { "url": "https://github.com/JamesMorales04/agentic-engineering-harness/issues" },
|
|
15
15
|
"publishConfig": { "access": "public" },
|
|
16
16
|
"license": "Apache-2.0",
|
|
17
|
-
"keywords": ["ai-agents", "codex", "opencode", "paseo", "sdd", "github-issues", "issue-driven-development", "quick-contract", "gherkin", "agent-routing", "agent-presets", "mcp", "github-delivery", "worktrees", "multi-model", "multi-worker", "distributed-workers", "quality-convergence", "evidence-graph", "policy-bundles", "sandbox", "toolchain", "mise", "bootstrap", "human-on-exception", "deterministic-validation", "engineering-harness", "slsa", "opentelemetry"]
|
|
17
|
+
"keywords": ["ai-agents", "codex", "opencode", "paseo", "openspec", "sdd", "audit", "code-review", "github-issues", "issue-driven-development", "quick-contract", "gherkin", "agent-routing", "agent-presets", "orchestration", "context-handoff", "mcp", "github-delivery", "worktrees", "multi-model", "multi-worker", "distributed-workers", "quality-convergence", "evidence-graph", "policy-bundles", "sandbox", "toolchain", "mise", "bootstrap", "human-on-exception", "deterministic-validation", "engineering-harness", "slsa", "opentelemetry"]
|
|
18
18
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"extends": ["aeh:default"],
|
|
4
|
+
"agents": {
|
|
5
|
+
"lead": {
|
|
6
|
+
"description": "Own user intent, semantic decisions, exception handling and final acceptance. Operate as a thin orchestrator: delegate repository discovery, environment repair, specification authoring, planning, implementation and review. Prefer Paseo native/MCP orchestration tools and handoff skills over direct shell orchestration. Do not author SDD/OpenSpec artifacts or debug tooling interactively when a specialist can own that bounded operation.",
|
|
7
|
+
"skills": ["engineering-workflow", "lead-engineer", "paseo-orchestration", "verification-planning", "worktree-lifecycle"],
|
|
8
|
+
"permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "ask", "delegate": "allow", "review": "allow", "validate": "deny", "gitWrite": "deny" }
|
|
9
|
+
},
|
|
10
|
+
"planner": {
|
|
11
|
+
"description": "Produce a read-only delegation DAG and triage evidence. Use explorer/Graphify evidence supplied to you; do not implement, author specifications, repair the environment, or run broad validation. Return bounded scope, dependencies, risks, reviewers and validators to the lead/Harness.",
|
|
12
|
+
"permissions": { "read": "allow", "write": "deny", "shell": "deny", "network": "deny", "delegate": "allow", "review": "allow", "validate": "deny", "gitWrite": "deny" }
|
|
13
|
+
},
|
|
14
|
+
"environment-manager": {
|
|
15
|
+
"role": "coordinator",
|
|
16
|
+
"domains": ["environment", "toolchain", "paseo", "build-system"],
|
|
17
|
+
"description": "Own deterministic environment readiness and recovery delegated by the lead. Run AEH setup/doctor/agents checks, diagnose package-manager and Paseo daemon/provider failures, and return a compact structured outcome. Never implement product code or change normative requirements.",
|
|
18
|
+
"execution": { "model": "@workhorse" },
|
|
19
|
+
"skills": ["paseo-orchestration", "recovery-classifier"],
|
|
20
|
+
"permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "ask", "delegate": "deny", "review": "deny", "validate": "allow", "gitWrite": "deny" },
|
|
21
|
+
"outputContract": "recovery"
|
|
22
|
+
},
|
|
23
|
+
"spec-manager": {
|
|
24
|
+
"role": "planner",
|
|
25
|
+
"domains": ["requirements", "specification", "sdd", "openspec"],
|
|
26
|
+
"description": "Own SPEC authoring only. Use OpenSpec to create/iterate proposal, delta specs, design and tasks from the user's intent plus repository/planner evidence. Validate OpenSpec strictly, then compile it through AEH into traceable TaskContract/Gherkin artifacts. Do not implement code, run broad validation, perform GitHub delivery or redefine user intent silently.",
|
|
27
|
+
"execution": { "model": "@brain" },
|
|
28
|
+
"skills": ["openspec-authoring", "acceptance-traceability", "verification-planning"],
|
|
29
|
+
"permissions": { "read": "allow", "write": "allow", "shell": "allow", "network": "deny", "delegate": "allow", "review": "deny", "validate": "deny", "gitWrite": "deny" },
|
|
30
|
+
"outputContract": "planner"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"routing": [
|
|
34
|
+
{ "id": "environment-readiness", "priority": 100, "when": { "intent": ["environment", "toolchain", "recover-environment"] }, "use": "environment-manager" },
|
|
35
|
+
{ "id": "spec-authoring", "priority": 100, "when": { "intent": ["spec-authoring", "openspec"] }, "use": "spec-manager" }
|
|
36
|
+
]
|
|
37
|
+
}
|
|
@@ -27,7 +27,17 @@
|
|
|
27
27
|
"provider": { "type": "string" },
|
|
28
28
|
"required": { "type": "boolean" },
|
|
29
29
|
"worker": { "type": "object", "properties": { "provider": { "type": "string" }, "model": { "type": "string" }, "maxRepairAttempts": { "type": "integer", "minimum": 0 }, "timeoutSeconds": { "type": "integer", "minimum": 1 }, "titlePrefix": { "type": "string" } } },
|
|
30
|
-
"interactive": { "type": "object", "properties": {
|
|
30
|
+
"interactive": { "type": "object", "properties": {
|
|
31
|
+
"autoSetup": { "type": "boolean" },
|
|
32
|
+
"webUi": { "type": "boolean" },
|
|
33
|
+
"leadAgent": { "type": "string", "minLength": 1 },
|
|
34
|
+
"reuseSession": { "type": "boolean", "deprecated": true },
|
|
35
|
+
"sessionPolicy": { "enum": ["fresh-on-start", "reuse-compatible", "resume-explicit"] },
|
|
36
|
+
"usePaseoTools": { "type": "boolean" },
|
|
37
|
+
"context": { "type": "object", "properties": { "pressureThreshold": { "type": "number", "minimum": 0, "maximum": 1 }, "handoffThreshold": { "type": "number", "minimum": 0, "maximum": 1 }, "hardHandoffThreshold": { "type": "number", "minimum": 0, "maximum": 1 } } },
|
|
38
|
+
"stateDir": { "type": "string", "minLength": 1 },
|
|
39
|
+
"title": { "type": "string", "minLength": 1 }
|
|
40
|
+
} }
|
|
31
41
|
} },
|
|
32
42
|
"toolchain": { "type": "object", "properties": { "configPath": { "type": "string" }, "lockPath": { "type": "string" }, "statePath": { "type": "string" }, "generatedMisePath": { "type": "string" } } },
|
|
33
43
|
"mcp": { "type": "object", "properties": {
|
|
@@ -41,7 +51,8 @@
|
|
|
41
51
|
"evidence": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "outputDir": { "type": "string" }, "requireComplete": { "type": "boolean" } } },
|
|
42
52
|
"organization": { "type": "object", "properties": { "policyBundles": { "type": "object", "properties": { "cacheDir": { "type": "string" }, "required": { "type": "boolean" }, "sources": { "type": "array", "items": { "$ref": "#/$defs/policyBundleSource" } } } } } },
|
|
43
53
|
"distributed": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "provider": { "type": "string" }, "queueDir": { "type": "string" }, "endpoint": { "type": "string", "format": "uri" }, "tokenEnv": { "type": "string" }, "pollIntervalMs": { "type": "integer", "minimum": 1 }, "leaseSeconds": { "type": "integer", "minimum": 1 }, "workerId": { "type": "string" } } },
|
|
44
|
-
"sdd": { "type": "object" }, "
|
|
54
|
+
"sdd": { "type": "object", "properties": { "specsDir": { "type": "string" }, "contractsDir": { "type": "string" }, "reportsDir": { "type": "string" }, "repairsDir": { "type": "string" }, "runsDir": { "type": "string" }, "authoring": { "type": "object", "properties": { "provider": { "type": "string", "minLength": 1 }, "schema": { "type": "string", "minLength": 1 }, "managerAgent": { "type": "string", "minLength": 1 } } } } },
|
|
55
|
+
"validation": { "type": "object" },
|
|
45
56
|
"security": { "type": "object", "properties": { "sandbox": { "type": "object", "properties": { "provider": { "type": "string" }, "required": { "type": "boolean" }, "image": { "type": "string" }, "imageDigest": { "type": "string" }, "network": { "type": "boolean" }, "extraArgs": { "type": "array", "items": { "type": "string" } }, "readOnlyRoot": { "type": "boolean" }, "ephemeralHome": { "type": "boolean" }, "noNewPrivileges": { "type": "boolean" }, "capDropAll": { "type": "boolean" }, "pidsLimit": { "type": "integer", "minimum": 1 }, "memory": { "type": "string" }, "cpus": { "type": "number", "exclusiveMinimum": 0 }, "tmpfs": { "type": "array", "items": { "type": "string" } }, "forceForRisks": { "type": "array", "items": { "enum": ["low", "medium", "high"] } }, "environmentAllowlist": { "type": "array", "items": { "type": "string" } }, "credentialEnvAllowlist": { "type": "array", "items": { "type": "string" } } } }, "tools": { "type": "array", "items": { "type": "string" } } } },
|
|
46
57
|
"telemetry": { "type": "object" },
|
|
47
58
|
"evals": { "type": "object", "properties": { "corpusDir": { "type": "string" }, "resultsDir": { "type": "string" }, "workspacesDir": { "type": "string" }, "defaultRuns": { "type": "integer", "minimum": 1 }, "confidenceLevel": { "type": "number", "exclusiveMinimum": 0, "exclusiveMaximum": 1 } } },
|