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.
- package/README.md +34 -5
- package/dist/agents/outputContracts.d.ts +1 -0
- package/dist/agents/outputContracts.js +12 -0
- package/dist/agents/outputContracts.js.map +1 -1
- package/dist/agents/parallelism.d.ts +1 -0
- package/dist/agents/parallelism.js +101 -14
- package/dist/agents/parallelism.js.map +1 -1
- package/dist/agents/structuredOutput.js +16 -4
- package/dist/agents/structuredOutput.js.map +1 -1
- package/dist/agents/waveExecutor.d.ts +41 -0
- package/dist/agents/waveExecutor.js +208 -0
- package/dist/agents/waveExecutor.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/config.js +23 -6
- package/dist/core/config.js.map +1 -1
- package/dist/core/controlPlane.d.ts +30 -0
- package/dist/core/controlPlane.js +131 -0
- package/dist/core/controlPlane.js.map +1 -0
- package/dist/core/init.js +12 -4
- package/dist/core/init.js.map +1 -1
- package/dist/core/run.d.ts +21 -0
- package/dist/core/run.js +104 -41
- package/dist/core/run.js.map +1 -1
- package/dist/core/types.d.ts +83 -1
- package/dist/distributed/queue.d.ts +11 -0
- package/dist/distributed/queue.js +140 -0
- package/dist/distributed/queue.js.map +1 -0
- package/dist/distributed/types.d.ts +34 -0
- package/dist/distributed/types.js +2 -0
- package/dist/distributed/types.js.map +1 -0
- package/dist/distributed/worker.d.ts +21 -0
- package/dist/distributed/worker.js +111 -0
- package/dist/distributed/worker.js.map +1 -0
- package/dist/entry.js +110 -46
- package/dist/entry.js.map +1 -1
- package/dist/evals/runner.js +2 -2
- package/dist/evals/runner.js.map +1 -1
- package/dist/evals/statistics.d.ts +38 -0
- package/dist/evals/statistics.js +88 -0
- package/dist/evals/statistics.js.map +1 -0
- package/dist/evidence/graph.d.ts +48 -0
- package/dist/evidence/graph.js +94 -0
- package/dist/evidence/graph.js.map +1 -0
- package/dist/mcp/benchmark.d.ts +24 -0
- package/dist/mcp/benchmark.js +82 -0
- package/dist/mcp/benchmark.js.map +1 -0
- package/dist/paseo/start.d.ts +47 -0
- package/dist/paseo/start.js +155 -0
- package/dist/paseo/start.js.map +1 -0
- package/dist/policy/bundles.d.ts +27 -0
- package/dist/policy/bundles.js +129 -0
- package/dist/policy/bundles.js.map +1 -0
- package/dist/security/sandbox.d.ts +12 -0
- package/dist/security/sandbox.js +64 -0
- package/dist/security/sandbox.js.map +1 -0
- package/dist/toolchain/resolve.js +51 -90
- package/dist/toolchain/resolve.js.map +1 -1
- package/dist/utils/process.d.ts +1 -0
- package/dist/utils/process.js +6 -1
- package/dist/utils/process.js.map +1 -1
- package/dist/validators/graphify.js +28 -6
- package/dist/validators/graphify.js.map +1 -1
- package/dist/workers/agentPrompt.d.ts +6 -1
- package/dist/workers/agentPrompt.js +118 -34
- package/dist/workers/agentPrompt.js.map +1 -1
- package/dist/workers/podman.js +30 -8
- package/dist/workers/podman.js.map +1 -1
- package/docs/V0.5.1.md +129 -0
- package/docs/V0.5.md +116 -0
- package/package.json +2 -2
- package/schemas/project.schema.json +27 -8
- package/skills/engineering-workflow/SKILL.md +9 -1
- package/templates/AGENTS.md +6 -0
- package/templates/project.yaml +70 -1
- 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.
|
|
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": {
|
|
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": {
|
|
27
|
-
|
|
28
|
-
"
|
|
29
|
-
"
|
|
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
|
-
"
|
|
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
|
|
package/templates/AGENTS.md
CHANGED
|
@@ -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.
|
package/templates/project.yaml
CHANGED
|
@@ -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.
|
|
265
|
+
buildType: https://github.com/JamesMorales04/agentic-engineering-harness/v0.5
|
package/templates/toolchain.yaml
CHANGED
|
@@ -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
|