agentic-engineering-harness 0.4.16 → 0.5.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.
Files changed (76) hide show
  1. package/README.md +34 -5
  2. package/dist/agents/outputContracts.d.ts +1 -0
  3. package/dist/agents/outputContracts.js +12 -0
  4. package/dist/agents/outputContracts.js.map +1 -1
  5. package/dist/agents/parallelism.d.ts +1 -0
  6. package/dist/agents/parallelism.js +101 -14
  7. package/dist/agents/parallelism.js.map +1 -1
  8. package/dist/agents/structuredOutput.js +16 -4
  9. package/dist/agents/structuredOutput.js.map +1 -1
  10. package/dist/agents/waveExecutor.d.ts +41 -0
  11. package/dist/agents/waveExecutor.js +208 -0
  12. package/dist/agents/waveExecutor.js.map +1 -0
  13. package/dist/cli.js +1 -1
  14. package/dist/cli.js.map +1 -1
  15. package/dist/core/config.js +23 -6
  16. package/dist/core/config.js.map +1 -1
  17. package/dist/core/controlPlane.d.ts +30 -0
  18. package/dist/core/controlPlane.js +131 -0
  19. package/dist/core/controlPlane.js.map +1 -0
  20. package/dist/core/init.js +12 -4
  21. package/dist/core/init.js.map +1 -1
  22. package/dist/core/run.d.ts +21 -0
  23. package/dist/core/run.js +104 -41
  24. package/dist/core/run.js.map +1 -1
  25. package/dist/core/types.d.ts +83 -1
  26. package/dist/distributed/queue.d.ts +11 -0
  27. package/dist/distributed/queue.js +140 -0
  28. package/dist/distributed/queue.js.map +1 -0
  29. package/dist/distributed/types.d.ts +34 -0
  30. package/dist/distributed/types.js +2 -0
  31. package/dist/distributed/types.js.map +1 -0
  32. package/dist/distributed/worker.d.ts +21 -0
  33. package/dist/distributed/worker.js +111 -0
  34. package/dist/distributed/worker.js.map +1 -0
  35. package/dist/entry.js +110 -46
  36. package/dist/entry.js.map +1 -1
  37. package/dist/evals/runner.js +2 -2
  38. package/dist/evals/runner.js.map +1 -1
  39. package/dist/evals/statistics.d.ts +38 -0
  40. package/dist/evals/statistics.js +88 -0
  41. package/dist/evals/statistics.js.map +1 -0
  42. package/dist/evidence/graph.d.ts +48 -0
  43. package/dist/evidence/graph.js +94 -0
  44. package/dist/evidence/graph.js.map +1 -0
  45. package/dist/mcp/benchmark.d.ts +24 -0
  46. package/dist/mcp/benchmark.js +82 -0
  47. package/dist/mcp/benchmark.js.map +1 -0
  48. package/dist/paseo/start.d.ts +47 -0
  49. package/dist/paseo/start.js +155 -0
  50. package/dist/paseo/start.js.map +1 -0
  51. package/dist/policy/bundles.d.ts +27 -0
  52. package/dist/policy/bundles.js +129 -0
  53. package/dist/policy/bundles.js.map +1 -0
  54. package/dist/security/sandbox.d.ts +12 -0
  55. package/dist/security/sandbox.js +64 -0
  56. package/dist/security/sandbox.js.map +1 -0
  57. package/dist/toolchain/resolve.js +51 -90
  58. package/dist/toolchain/resolve.js.map +1 -1
  59. package/dist/utils/process.d.ts +1 -0
  60. package/dist/utils/process.js +6 -1
  61. package/dist/utils/process.js.map +1 -1
  62. package/dist/validators/graphify.js +28 -6
  63. package/dist/validators/graphify.js.map +1 -1
  64. package/dist/workers/agentPrompt.d.ts +6 -1
  65. package/dist/workers/agentPrompt.js +118 -34
  66. package/dist/workers/agentPrompt.js.map +1 -1
  67. package/dist/workers/podman.js +30 -8
  68. package/dist/workers/podman.js.map +1 -1
  69. package/docs/V0.5.1.md +129 -0
  70. package/docs/V0.5.md +116 -0
  71. package/package.json +2 -2
  72. package/schemas/project.schema.json +27 -8
  73. package/skills/engineering-workflow/SKILL.md +9 -1
  74. package/templates/AGENTS.md +6 -0
  75. package/templates/project.yaml +70 -1
  76. package/templates/toolchain.yaml +8 -1
package/docs/V0.5.1.md ADDED
@@ -0,0 +1,129 @@
1
+ # v0.5.1 — Zero-friction Paseo entrypoint
2
+
3
+ v0.5.1 makes `aeh start` the interactive product entrypoint for a Harness-enabled repository. After startup, the user can work from Paseo by writing normal engineering requests; repository-changing prompts are automatically routed through the Harness instead of requiring the user to invoke triage, QUICK, SPEC, SDD, TaskContracts, workers, validators or reviewers manually.
4
+
5
+ ## Start
6
+
7
+ With AEH installed in the project:
8
+
9
+ ```bash
10
+ aeh start
11
+ ```
12
+
13
+ Equivalent package-manager invocations include:
14
+
15
+ ```bash
16
+ npx aeh start
17
+ npm exec aeh -- start
18
+ ```
19
+
20
+ `npm aeh start` is not the canonical npm bin syntax. Use `npm exec aeh -- start` when invoking the locally installed package through npm.
21
+
22
+ By default `aeh start`:
23
+
24
+ 1. loads `.harness/project.yaml` and the resolved agent topology;
25
+ 2. selects the configured interactive lead, normally `lead`/Codex;
26
+ 3. verifies that Paseo and the lead runtime are available;
27
+ 4. reconciles managed toolchain dependencies automatically when they are missing;
28
+ 5. starts `paseo daemon start --web-ui` only when the daemon is not already running;
29
+ 6. creates a persistent Paseo session for the project or reuses the compatible prior session;
30
+ 7. bootstraps that lead with the `engineering-workflow` invariant;
31
+ 8. waits until initialization reaches `AEH READY` before reporting the session ready.
32
+
33
+ State is machine-local and gitignored under:
34
+
35
+ ```text
36
+ .harness/paseo/lead-session.json
37
+ .harness/paseo/lead-bootstrap.md
38
+ ```
39
+
40
+ The command deliberately does not rewrite the user's global `~/.paseo/config.json`.
41
+
42
+ ## Prompt semantics
43
+
44
+ Once the generated lead is open in Paseo, a normal prompt such as:
45
+
46
+ ```text
47
+ Add rate limiting to the public authentication endpoints and cover it with tests.
48
+ ```
49
+
50
+ is interpreted as:
51
+
52
+ ```text
53
+ natural-language prompt
54
+ ↓
55
+ repository inspection
56
+ ↓
57
+ automatic triage evidence
58
+ ↓
59
+ QUICK or SPEC
60
+ ↓
61
+ QuickContract or SDD/TaskContract
62
+ ↓
63
+ seal
64
+ ↓
65
+ Harness execution
66
+ ↓
67
+ planner DAG / worker waves
68
+ ↓
69
+ deterministic validators + evidence
70
+ ↓
71
+ review quality convergence
72
+ ↓
73
+ lead semantic acceptance
74
+ ↓
75
+ configured deterministic delivery
76
+ ```
77
+
78
+ The parent Paseo lead must not implement a repository-changing prompt directly as a shortcut around this pipeline.
79
+
80
+ Read-only questions may be answered directly when they do not mutate repository state. Existing GitHub issue requests enter the issue-driven path automatically. If a task initially appears QUICK but implementation reveals architecture, security, schema, public API, cross-module or otherwise unsafe scope, the lead escalates it to SPEC rather than widening the QuickContract.
81
+
82
+ ## Session reuse
83
+
84
+ `aeh start` reuses `.harness/paseo/lead-session.json` when the previous session still exists and its bootstrap version, project root, selected lead, provider, model and title remain compatible.
85
+
86
+ Create a clean lead explicitly with:
87
+
88
+ ```bash
89
+ aeh start --new
90
+ ```
91
+
92
+ Other startup controls:
93
+
94
+ ```bash
95
+ aeh start --no-web-ui
96
+ aeh start --no-setup
97
+ aeh start --lead lead
98
+ aeh start --title "AEH Lead"
99
+ aeh start /path/to/repository
100
+ ```
101
+
102
+ `--no-setup` disables automatic toolchain reconciliation. If Paseo or the selected lead runtime is unavailable in that mode, startup fails instead of silently falling back to a different agent/runtime.
103
+
104
+ ## Configuration
105
+
106
+ New projects receive:
107
+
108
+ ```yaml
109
+ orchestration:
110
+ provider: paseo
111
+ interactive:
112
+ autoSetup: true
113
+ webUi: true
114
+ leadAgent: lead
115
+ reuseSession: true
116
+ stateDir: .harness/paseo
117
+ title: AEH Lead
118
+ ```
119
+
120
+ The lead is resolved from the active topology; the start implementation does not hard-code Codex. Projects can therefore replace the logical lead while preserving the same Harness entry semantics.
121
+
122
+ ## Defense in depth
123
+
124
+ The automatic path is enforced at two conversational layers:
125
+
126
+ - the persistent `aeh start` bootstrap makes the rule part of the Paseo lead conversation;
127
+ - generated `AGENTS.md` independently states that repository-changing conversational prompts must enter `engineering-workflow`.
128
+
129
+ The deterministic Harness remains the acceptance authority. Paseo and the lead decide how to interpret and route the prompt, but do not replace sealing, scope enforcement, validators, evidence, review convergence or final acceptance gates.
package/docs/V0.5.md ADDED
@@ -0,0 +1,116 @@
1
+ # v0.5 — Architecture Close, Scale and Organization Governance
2
+
3
+ v0.5 closes the original single-host architecture and adds the first scale/governance layer. The deterministic Harness remains the only acceptance authority: planner/reviewer/remote-worker output is evidence or proposed change, never an acceptance decision.
4
+
5
+ ## v0.4.17 — Control-Plane Snapshot & Hard Freeze
6
+
7
+ Every run materializes `.harness/controller/<task>/files` plus a manifest containing per-file SHA-256, a composite SHA-256, AEH version and controller Git SHA when available. The snapshot includes project config, agent topology, generated topology, toolchain source/lock, policy directories, schemas and skills. When AEH modifies itself, controller source modules are frozen as well.
8
+
9
+ Agent skill text is loaded from the snapshot. OPA reads policies through the frozen policy root. If live controller files change during the run, the run records controller drift but continues to use the old snapshot. The changed controller becomes eligible only on the next run.
10
+
11
+ ## v0.4.18 — Executable Multi-Worker Planner Waves
12
+
13
+ SPEC tasks with planning enabled are decomposed by the configured planner into a typed task DAG. The plan is rejected unless task IDs/dependencies/agents/scopes are valid and every TaskContract requirement is assigned to at least one implementation task.
14
+
15
+ Each local delegation executes in its own detached Git worktree. Accepted earlier-wave patches are materialized first, the frozen task/controller context is copied, and a baseline commit is created. The worker returns a binary patch. Within each wave the coordinator checks every patch before applying any patch, then applies all accepted patches and runs a deterministic barrier. Only a PASS barrier unlocks the next wave.
16
+
17
+ Graphify is conservative scheduling evidence: scope overlap, shared structural nodes, communities, graph distance and high-centrality nodes can serialize tasks. Graphify cannot override the explicit dependency DAG or redefine desired architecture.
18
+
19
+ ## v0.4.19 — Requirement Evidence Graph
20
+
21
+ `.harness/evidence/<task>.json` records nodes for requirements, planner tasks, changed files, deterministic checks, review findings, agent sessions, commit and pull request. Requirement coverage requires both:
22
+
23
+ 1. a task assigned to the requirement that produced a concrete changed file; and
24
+ 2. PASS results for all validators declared by the requirement.
25
+
26
+ When `evidence.requireComplete=true`, incomplete coverage is a deterministic failure and enters the normal autonomous remediation/escalation lifecycle.
27
+
28
+ ## v0.4.20 — Worker Sandbox Hardening
29
+
30
+ Podman remains optional globally but can be required by policy or task risk. Supported OpenCode sandbox runs default to a read-only container root, rootless user namespace, `cap-drop=ALL`, no-new-privileges, PID limits, ephemeral HOME and tmpfs. Network is denied when project policy or the logical agent denies network. CPU/RAM/tmpfs and immutable image digests are configurable. Only explicitly allowlisted environment/credential variables cross the boundary; SSH agents, host sockets and credentials are not projected implicitly.
31
+
32
+ Both the logical-agent prompt path and the legacy Podman worker executor use the hardened policy.
33
+
34
+ ## Scale and organization governance
35
+
36
+ ### Distributed workers
37
+
38
+ The distributed protocol has filesystem and HTTP queue transports. Jobs are leased with expiry/reclaim semantics. A remote worker clones the frozen base ref, materializes accepted prior-wave patches, executes one delegated task and returns a binary patch plus session metadata. The coordinator rechecks scope and patch applicability and runs all deterministic barriers.
39
+
40
+ Remote workers are deliberately **untrusted patch producers**. They do not become validation or normative authorities. Git credentials remain on worker nodes and are not serialized into jobs.
41
+
42
+ Commands:
43
+
44
+ ```bash
45
+ aeh worker serve . --port 8787 --host 0.0.0.0
46
+ aeh worker run . --worker-id node-01
47
+ ```
48
+
49
+ For remote HTTP workers set `distributed.provider: http`, `distributed.endpoint` and optionally `distributed.tokenEnv` on worker/coordinator configs as appropriate.
50
+
51
+ ### Organization policy bundles
52
+
53
+ Organization bundles contain `bundle.json`, file hashes, optional inheritance and policy directories. Sources may be local or remote and can pin the manifest SHA-256. Optional Cosign blob verification can require a configured public key and signature. Resolved bundles are cached under `.harness/policy-bundles` and frozen into the active controller snapshot before execution.
54
+
55
+ ```bash
56
+ aeh policy sync
57
+ ```
58
+
59
+ ### Statistical eval dashboards
60
+
61
+ Repeated evals compute pass-rate Wilson intervals plus mean/median/standard deviation/confidence intervals for score, duration, tokens, cost, repairs and human interventions.
62
+
63
+ ```bash
64
+ aeh eval repeat EVAL-001 --variant balanced --runs 10
65
+ aeh eval dashboard EVAL-001
66
+ ```
67
+
68
+ ### Native structured runtime adapters and resume
69
+
70
+ The agent contract layer exposes JSON Schemas in addition to Zod schemas. Runtimes that support native output schemas receive them; Zod remains the final parser/validator. Codex and OpenCode direct sessions expose resume/session primitives, while Paseo sessions resume through `send/wait/logs`. Ephemeral Podman sessions intentionally do not pretend they can resume host sessions without an explicit persisted session volume.
71
+
72
+ ### MCP benchmark and packs
73
+
74
+ The MCP benchmark records a baseline serialized-config token estimate, local/remote reachability latency, permission-surface heuristic and stale-data risk. This is intentionally not yet a claim about exact runtime tool-schema tokens; runtime-native introspection is the next benchmark refinement.
75
+
76
+ ```bash
77
+ aeh mcp benchmark
78
+ ```
79
+
80
+ Default named packs remain least-privilege: research, browser and GitHub read-only are enabled as catalog groupings; observability stays opt-in.
81
+
82
+ ## Default execution flow
83
+
84
+ ```text
85
+ Intent / GitHub Issue
86
+ ↓
87
+ Toolchain doctor/setup
88
+ ↓
89
+ QUICK or SPEC
90
+ ↓
91
+ Seal normative task inputs
92
+ ↓
93
+ Resolve org policies + topology
94
+ ↓
95
+ Freeze control plane
96
+ ↓
97
+ Planner DAG
98
+ ↓
99
+ Isolated local/remote worker waves
100
+ ↓
101
+ Deterministic barriers
102
+ ↓
103
+ Requirement evidence gate
104
+ ↓
105
+ Reviewer quality convergence
106
+ ↓
107
+ Regression rollback / model escalation / replan as needed
108
+ ↓
109
+ Final quality gate + lead acceptance
110
+ ↓
111
+ Deterministic delivery
112
+ ↓
113
+ Final evidence graph + controller drift record
114
+ ```
115
+
116
+ The user remains human-on-exception: product decisions, contradictory normative requirements and genuinely unavailable external resources are escalation states; implementation defects, review debt, worker failures and strategy churn remain autonomous recovery concerns.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-engineering-harness",
3
- "version": "0.4.16",
3
+ "version": "0.5.1",
4
4
  "description": "OSS-first engineering harness for deterministic, spec-driven and issue-driven multi-agent software delivery.",
5
5
  "type": "module",
6
6
  "bin": { "engineering-harness": "./dist/entry.js", "aeh": "./dist/entry.js" },
@@ -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", "quality-convergence", "toolchain", "mise", "bootstrap", "human-on-exception", "deterministic-validation", "engineering-harness", "slsa", "opentelemetry"]
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"]
18
18
  }
@@ -8,9 +8,11 @@
8
8
  "version": { "const": 1 },
9
9
  "project": { "type": "object", "required": ["name"], "properties": { "name": { "type": "string", "minLength": 1 } } },
10
10
  "agents": { "type": "object", "properties": { "configPath": { "type": "string" }, "generatedPath": { "type": "string" }, "activeProfile": { "type": "string" }, "required": { "type": "boolean" }, "findingsDir": { "type": "string" } } },
11
+ "controlPlane": { "type": "object", "properties": { "snapshotDir": { "type": "string" }, "include": { "type": "array", "items": { "type": "string" } }, "required": { "type": "boolean" } } },
11
12
  "workflow": { "type": "object", "properties": {
12
13
  "quick": { "type": "object", "properties": { "maxFiles": { "type": "integer", "minimum": 1 }, "disallowedDomains": { "type": "array", "items": { "type": "string" } } } },
13
14
  "issueIntake": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "snapshotDir": { "type": "string" }, "verifyDriftOnRun": { "type": "boolean" }, "requireOpen": { "type": "boolean" }, "plannerAgent": { "type": "string", "minLength": 1 }, "autoHandoff": { "type": "boolean" } } },
15
+ "planning": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "plannerAgent": { "type": "string" }, "worktreeIsolation": { "type": "boolean" }, "barrierValidation": { "type": "boolean" }, "maxWaveConcurrency": { "type": "integer", "minimum": 1 }, "distributed": { "type": "boolean" } } },
14
16
  "reviews": { "type": "object", "properties": {
15
17
  "enabled": { "type": "boolean" }, "reviewQuick": { "type": "boolean" }, "leadAcceptance": { "type": "boolean" }, "leadAcceptanceQuick": { "type": "boolean" },
16
18
  "maxRemediationRounds": { "type": "integer", "minimum": 0, "deprecated": true },
@@ -21,16 +23,33 @@
21
23
  "escalation": { "type": "object", "properties": { "criticalStartStage": { "type": "integer", "minimum": 0 }, "replanResumeStage": { "type": "integer", "minimum": 0 }, "stages": { "type": "array", "items": { "type": "object", "required": ["name"], "properties": { "name": { "type": "string", "minLength": 1 }, "action": { "enum": ["remediate", "diagnose", "replan"] }, "agent": { "type": "string", "minLength": 1 }, "model": { "type": "string", "minLength": 1 } } } } } }
22
24
  } }
23
25
  } },
24
- "orchestration": { "type": "object", "properties": { "provider": { "type": "string" }, "required": { "type": "boolean" }, "worker": { "type": "object", "properties": { "provider": { "type": "string" }, "model": { "type": "string" }, "maxRepairAttempts": { "type": "integer", "minimum": 0 }, "timeoutSeconds": { "type": "integer", "minimum": 1 }, "titlePrefix": { "type": "string" } } } } },
26
+ "orchestration": { "type": "object", "properties": {
27
+ "provider": { "type": "string" },
28
+ "required": { "type": "boolean" },
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": { "autoSetup": { "type": "boolean" }, "webUi": { "type": "boolean" }, "leadAgent": { "type": "string", "minLength": 1 }, "reuseSession": { "type": "boolean" }, "stateDir": { "type": "string", "minLength": 1 }, "title": { "type": "string", "minLength": 1 } } }
31
+ } },
25
32
  "toolchain": { "type": "object", "properties": { "configPath": { "type": "string" }, "lockPath": { "type": "string" }, "statePath": { "type": "string" }, "generatedMisePath": { "type": "string" } } },
26
- "mcp": { "type": "object", "properties": { "servers": { "type": "object", "additionalProperties": { "type": "object", "required": ["type"], "properties": { "description": { "type": "string" }, "type": { "enum": ["local", "remote"] }, "command": { "type": "array", "items": { "type": "string" }, "minItems": 1 }, "url": { "type": "string", "format": "uri" }, "environment": { "type": "object", "additionalProperties": { "type": "string" } }, "headers": { "type": "object", "additionalProperties": { "type": "string" } }, "oauth": { "type": "boolean" }, "enabled": { "type": "boolean" }, "timeoutMs": { "type": "integer", "minimum": 1 }, "codemode": { "type": "boolean" } } } } } },
27
- "delivery": { "type": "object", "properties": {
28
- "stateDir": { "type": "string" },
29
- "github": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "tokenEnv": { "type": "string", "minLength": 1 }, "repository": { "type": "string", "pattern": "^[^/]+/[^/]+$" }, "apiBaseUrl": { "type": "string", "format": "uri" }, "assignTokenOwner": { "type": "boolean" }, "labels": { "type": "array", "items": { "type": "string" } }, "branchPattern": { "type": "string", "minLength": 1 }, "finalizeOnAcceptance": { "type": "boolean" }, "pullRequestDraft": { "type": "boolean" } } },
30
- "paseo": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "createWorkspace": { "type": "boolean" }, "autoUseWorkspace": { "type": "boolean" }, "worktreeSlugPattern": { "type": "string", "minLength": 1 } } }
33
+ "mcp": { "type": "object", "properties": {
34
+ "servers": { "type": "object", "additionalProperties": { "type": "object", "required": ["type"], "properties": { "description": { "type": "string" }, "type": { "enum": ["local", "remote"] }, "command": { "type": "array", "items": { "type": "string" }, "minItems": 1 }, "url": { "type": "string", "format": "uri" }, "environment": { "type": "object", "additionalProperties": { "type": "string" } }, "headers": { "type": "object", "additionalProperties": { "type": "string" } }, "oauth": { "type": "boolean" }, "enabled": { "type": "boolean" }, "timeoutMs": { "type": "integer", "minimum": 1 }, "codemode": { "type": "boolean" } } } },
35
+ "benchmark": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "resultsDir": { "type": "string" }, "repetitions": { "type": "integer", "minimum": 1 } } },
36
+ "packs": { "type": "object", "additionalProperties": { "type": "object", "required": ["servers"], "properties": { "servers": { "type": "array", "items": { "type": "string" } }, "enabled": { "type": "boolean" } } } }
31
37
  } },
32
- "memory": { "type": "object" }, "codeIntelligence": { "type": "object" }, "sdd": { "type": "object" }, "validation": { "type": "object" }, "security": { "type": "object" }, "telemetry": { "type": "object" }, "evals": { "type": "object" }, "provenance": { "type": "object" }
38
+ "delivery": { "type": "object", "properties": { "stateDir": { "type": "string" }, "github": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "tokenEnv": { "type": "string", "minLength": 1 }, "repository": { "type": "string", "pattern": "^[^/]+/[^/]+$" }, "apiBaseUrl": { "type": "string", "format": "uri" }, "assignTokenOwner": { "type": "boolean" }, "labels": { "type": "array", "items": { "type": "string" } }, "branchPattern": { "type": "string", "minLength": 1 }, "finalizeOnAcceptance": { "type": "boolean" }, "pullRequestDraft": { "type": "boolean" } } }, "paseo": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "createWorkspace": { "type": "boolean" }, "autoUseWorkspace": { "type": "boolean" }, "worktreeSlugPattern": { "type": "string", "minLength": 1 } } } } },
39
+ "memory": { "type": "object" },
40
+ "codeIntelligence": { "type": "object", "properties": { "provider": { "type": "string" }, "required": { "type": "boolean" }, "graphPath": { "type": "string" }, "snapshotDir": { "type": "string" }, "refreshCommand": { "type": "string" }, "scheduling": { "type": "object", "properties": { "useEdges": { "type": "boolean" }, "maxGraphHops": { "type": "integer", "minimum": 1 }, "maxSharedNodes": { "type": "integer", "minimum": 0 }, "centralityConflictThreshold": { "type": "number", "minimum": 0 } } } } },
41
+ "evidence": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "outputDir": { "type": "string" }, "requireComplete": { "type": "boolean" } } },
42
+ "organization": { "type": "object", "properties": { "policyBundles": { "type": "object", "properties": { "cacheDir": { "type": "string" }, "required": { "type": "boolean" }, "sources": { "type": "array", "items": { "$ref": "#/$defs/policyBundleSource" } } } } } },
43
+ "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" }, "validation": { "type": "object" },
45
+ "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
+ "telemetry": { "type": "object" },
47
+ "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 } } },
48
+ "provenance": { "type": "object" }
49
+ },
50
+ "$defs": {
51
+ "severityNumbers": { "type": "object", "properties": { "critical": { "type": "integer", "minimum": 0 }, "high": { "type": "integer", "minimum": 0 }, "medium": { "type": "integer", "minimum": 0 }, "low": { "type": "integer", "minimum": 0 }, "note": { "type": "integer", "minimum": 0 } } },
52
+ "policyBundleSource": { "type": "object", "required": ["name"], "properties": { "name": { "type": "string", "minLength": 1 }, "path": { "type": "string" }, "url": { "type": "string", "format": "uri" }, "sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, "required": { "type": "boolean" }, "publicKey": { "type": "string" }, "signature": { "type": "string" } } }
33
53
  },
34
- "$defs": { "severityNumbers": { "type": "object", "properties": { "critical": { "type": "integer", "minimum": 0 }, "high": { "type": "integer", "minimum": 0 }, "medium": { "type": "integer", "minimum": 0 }, "low": { "type": "integer", "minimum": 0 }, "note": { "type": "integer", "minimum": 0 } } } },
35
54
  "additionalProperties": false
36
55
  }
@@ -7,6 +7,14 @@ purpose: Turn a natural-language engineering request or existing GitHub issue in
7
7
 
8
8
  You are the engineering lead entrypoint. The user may be operating from Paseo mobile and should not need to know Harness commands or manually provision engineering dependencies.
9
9
 
10
+ ## Persistent interactive entry
11
+
12
+ When the current Paseo conversation was created by `aeh start`, its bootstrap is a standing instruction for the entire session. Every later user request that can mutate the repository is automatically an engineering-workflow input. The user must not need to say `aeh`, request triage, choose QUICK/SPEC, create an SDD, or name internal agents. Build the evidence and make those decisions through the Harness yourself.
13
+
14
+ The bootstrap may provide an exact local AEH invocation instead of the literal `aeh` executable. Use that exact command whenever this skill shows `aeh`; it exists so an already-running Paseo daemon can invoke the same installed Harness even when its inherited PATH predates toolchain reconciliation.
15
+
16
+ Read-only questions may be answered directly if they perform no repository mutation. Never use that exception to make an unsealed change. Do not bypass the Harness by implementing a mutating request directly in the parent Paseo lead.
17
+
10
18
  ## Entry protocol
11
19
 
12
20
  1. Identify the repository root and read `AGENTS.md`, `.harness/project.yaml`, `.harness/agents.source.jsonc`, `.harness/toolchain.yaml` when present, relevant architecture docs and current Git state.
@@ -101,7 +109,7 @@ If a QUICK implementation later reveals one of these conditions, stop the quick
101
109
 
102
110
  ## Mobile/Paseo behavior
103
111
 
104
- When started as a Codex lead inside Paseo, remain the parent session. Use the Harness as the control layer and allow it to spawn routed OpenCode/Codex work through the configured transports. Before delegation, reconcile the toolchain autonomously when needed. For `implement issue #X`, prefer `aeh issue implement X`; that command owns intake, freeze, optional handoff/worktree, execution and configured accepted-delivery finalization. Surface only meaningful status, deterministic failures that cannot self-recover, permission requests, true human-on-exception states, final acceptance and resulting PR/delivery state to the user. Do not surface every remediation or provisioning step as a request for approval.
112
+ When started as a Codex lead inside Paseo, remain the parent session. When that session was created by `aeh start`, treat every later repository-changing prompt as automatically invoking this skill; never ask the user to select the Harness workflow first. Use the Harness as the control layer and allow it to spawn routed OpenCode/Codex work through the configured transports. Before delegation, reconcile the toolchain autonomously when needed. For `implement issue #X`, prefer `aeh issue implement X`; that command owns intake, freeze, optional handoff/worktree, execution and configured accepted-delivery finalization. Surface only meaningful status, deterministic failures that cannot self-recover, permission requests, true human-on-exception states, final acceptance and resulting PR/delivery state to the user. Do not surface every remediation or provisioning step as a request for approval.
105
113
 
106
114
  ## Self-modification
107
115
 
@@ -1,5 +1,11 @@
1
1
  # Engineering Agent Contract
2
2
 
3
+ ## Interactive entry
4
+
5
+ When a user is interacting through Paseo or another conversational coding-agent UI, every natural-language request that could mutate this repository must enter through the `engineering-workflow` Harness path. The user does not need to mention AEH, QUICK, SPEC, SDD, TaskContracts or validators. Build triage evidence automatically, obey the deterministic QUICK/SPEC result and invoke the Harness rather than editing directly as a shortcut. Read-only questions may be answered directly when they do not mutate repository state.
6
+
7
+ `aeh start` is the preferred Paseo entrypoint. It creates or reuses a persistent top-level Harness lead whose conversation is bootstrapped with this rule.
8
+
3
9
  ## Lead agent
4
10
 
5
11
  The lead agent owns requirements interpretation, architecture, SDD artifacts, decomposition, review and final semantic acceptance. Prefer Codex for this role.
@@ -10,6 +10,11 @@ agents:
10
10
  required: true
11
11
  findingsDir: .harness/findings
12
12
 
13
+ controlPlane:
14
+ snapshotDir: .harness/controller
15
+ required: true
16
+ include: []
17
+
13
18
  workflow:
14
19
  quick:
15
20
  maxFiles: 5
@@ -30,6 +35,13 @@ workflow:
30
35
  requireOpen: true
31
36
  plannerAgent: planner
32
37
  autoHandoff: true
38
+ planning:
39
+ enabled: true
40
+ plannerAgent: planner
41
+ worktreeIsolation: true
42
+ barrierValidation: true
43
+ maxWaveConcurrency: 4
44
+ distributed: false
33
45
  reviews:
34
46
  enabled: true
35
47
  reviewQuick: false
@@ -82,6 +94,13 @@ orchestration:
82
94
  worker:
83
95
  provider: opencode
84
96
  maxRepairAttempts: 2
97
+ interactive:
98
+ autoSetup: true
99
+ webUi: true
100
+ leadAgent: lead
101
+ reuseSession: true
102
+ stateDir: .harness/paseo
103
+ title: AEH Lead
85
104
 
86
105
  toolchain:
87
106
  configPath: .harness/toolchain.yaml
@@ -119,6 +138,23 @@ mcp:
119
138
  url: https://mcp.sentry.dev/mcp
120
139
  enabled: false
121
140
  timeoutMs: 10000
141
+ benchmark:
142
+ enabled: false
143
+ resultsDir: .harness/mcp-benchmarks
144
+ repetitions: 3
145
+ packs:
146
+ research:
147
+ servers: [context7]
148
+ enabled: true
149
+ browser:
150
+ servers: [playwright, context7]
151
+ enabled: true
152
+ github-readonly:
153
+ servers: [github]
154
+ enabled: true
155
+ observability:
156
+ servers: [sentry]
157
+ enabled: false
122
158
 
123
159
  delivery:
124
160
  stateDir: .harness/delivery
@@ -149,6 +185,29 @@ codeIntelligence:
149
185
  required: false
150
186
  graphPath: graphify-out/graph.json
151
187
  snapshotDir: .harness/graphify
188
+ scheduling:
189
+ useEdges: true
190
+ maxGraphHops: 1
191
+ maxSharedNodes: 0
192
+ centralityConflictThreshold: 0.35
193
+
194
+ evidence:
195
+ enabled: true
196
+ outputDir: .harness/evidence
197
+ requireComplete: true
198
+
199
+ organization:
200
+ policyBundles:
201
+ cacheDir: .harness/policy-bundles
202
+ required: false
203
+ sources: []
204
+
205
+ distributed:
206
+ enabled: false
207
+ provider: filesystem
208
+ queueDir: .harness/distributed
209
+ pollIntervalMs: 1000
210
+ leaseSeconds: 1800
152
211
 
153
212
  sdd:
154
213
  specsDir: specs
@@ -175,6 +234,14 @@ security:
175
234
  sandbox:
176
235
  provider: podman
177
236
  required: false
237
+ readOnlyRoot: true
238
+ ephemeralHome: true
239
+ noNewPrivileges: true
240
+ capDropAll: true
241
+ pidsLimit: 512
242
+ forceForRisks: []
243
+ environmentAllowlist: []
244
+ credentialEnvAllowlist: []
178
245
  tools:
179
246
  - opengrep
180
247
  - trivy
@@ -190,7 +257,9 @@ evals:
190
257
  corpusDir: evals/corpus
191
258
  resultsDir: .harness/evals/results
192
259
  workspacesDir: .harness/evals/workspaces
260
+ defaultRuns: 5
261
+ confidenceLevel: 0.95
193
262
 
194
263
  provenance:
195
264
  outputDir: .harness/provenance
196
- buildType: https://github.com/JamesMorales04/agentic-engineering-harness/v0.4
265
+ buildType: https://github.com/JamesMorales04/agentic-engineering-harness/v0.5
@@ -22,7 +22,7 @@ profiles:
22
22
  tools: [uv, graphify]
23
23
  validation:
24
24
  extends: [core]
25
- tools: [opa, opengrep, trivy]
25
+ tools: [opa, opengrep, trivy, cosign]
26
26
  full:
27
27
  extends: [agents, intelligence, validation]
28
28
  tools: [podman, dotnet, bun]
@@ -117,6 +117,13 @@ tools:
117
117
  container:
118
118
  image: ghcr.io/aquasecurity/trivy:latest
119
119
 
120
+ cosign:
121
+ kind: mise
122
+ command: cosign
123
+ source: "aqua:sigstore/cosign"
124
+ version: latest
125
+ activateWhen: [organization:signed-policy]
126
+
120
127
  podman:
121
128
  kind: system
122
129
  command: podman