agentic-engineering-harness 0.4.16 → 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.
Files changed (104) hide show
  1. package/README.md +159 -189
  2. package/dist/agents/config.js +2 -0
  3. package/dist/agents/config.js.map +1 -1
  4. package/dist/agents/outputContracts.d.ts +1 -0
  5. package/dist/agents/outputContracts.js +12 -0
  6. package/dist/agents/outputContracts.js.map +1 -1
  7. package/dist/agents/parallelism.d.ts +1 -0
  8. package/dist/agents/parallelism.js +101 -14
  9. package/dist/agents/parallelism.js.map +1 -1
  10. package/dist/agents/structuredOutput.js +16 -4
  11. package/dist/agents/structuredOutput.js.map +1 -1
  12. package/dist/agents/waveExecutor.d.ts +41 -0
  13. package/dist/agents/waveExecutor.js +208 -0
  14. package/dist/agents/waveExecutor.js.map +1 -0
  15. package/dist/audit/intent.d.ts +20 -0
  16. package/dist/audit/intent.js +42 -0
  17. package/dist/audit/intent.js.map +1 -0
  18. package/dist/audit/run.d.ts +46 -0
  19. package/dist/audit/run.js +147 -0
  20. package/dist/audit/run.js.map +1 -0
  21. package/dist/cli.js +1 -1
  22. package/dist/cli.js.map +1 -1
  23. package/dist/core/config.js +28 -7
  24. package/dist/core/config.js.map +1 -1
  25. package/dist/core/controlPlane.d.ts +30 -0
  26. package/dist/core/controlPlane.js +131 -0
  27. package/dist/core/controlPlane.js.map +1 -0
  28. package/dist/core/init.js +13 -5
  29. package/dist/core/init.js.map +1 -1
  30. package/dist/core/run.d.ts +21 -0
  31. package/dist/core/run.js +104 -41
  32. package/dist/core/run.js.map +1 -1
  33. package/dist/core/types.d.ts +103 -1
  34. package/dist/distributed/queue.d.ts +11 -0
  35. package/dist/distributed/queue.js +140 -0
  36. package/dist/distributed/queue.js.map +1 -0
  37. package/dist/distributed/types.d.ts +34 -0
  38. package/dist/distributed/types.js +2 -0
  39. package/dist/distributed/types.js.map +1 -0
  40. package/dist/distributed/worker.d.ts +21 -0
  41. package/dist/distributed/worker.js +111 -0
  42. package/dist/distributed/worker.js.map +1 -0
  43. package/dist/entry.js +219 -46
  44. package/dist/entry.js.map +1 -1
  45. package/dist/evals/runner.js +2 -2
  46. package/dist/evals/runner.js.map +1 -1
  47. package/dist/evals/statistics.d.ts +38 -0
  48. package/dist/evals/statistics.js +88 -0
  49. package/dist/evals/statistics.js.map +1 -0
  50. package/dist/evidence/graph.d.ts +48 -0
  51. package/dist/evidence/graph.js +94 -0
  52. package/dist/evidence/graph.js.map +1 -0
  53. package/dist/issues/intake.d.ts +1 -1
  54. package/dist/mcp/benchmark.d.ts +24 -0
  55. package/dist/mcp/benchmark.js +82 -0
  56. package/dist/mcp/benchmark.js.map +1 -0
  57. package/dist/paseo/capabilities.d.ts +24 -0
  58. package/dist/paseo/capabilities.js +104 -0
  59. package/dist/paseo/capabilities.js.map +1 -0
  60. package/dist/paseo/context.d.ts +45 -0
  61. package/dist/paseo/context.js +153 -0
  62. package/dist/paseo/context.js.map +1 -0
  63. package/dist/paseo/start.d.ts +55 -0
  64. package/dist/paseo/start.js +138 -0
  65. package/dist/paseo/start.js.map +1 -0
  66. package/dist/policy/bundles.d.ts +27 -0
  67. package/dist/policy/bundles.js +129 -0
  68. package/dist/policy/bundles.js.map +1 -0
  69. package/dist/security/sandbox.d.ts +12 -0
  70. package/dist/security/sandbox.js +64 -0
  71. package/dist/security/sandbox.js.map +1 -0
  72. package/dist/spec/openspec.d.ts +28 -0
  73. package/dist/spec/openspec.js +179 -0
  74. package/dist/spec/openspec.js.map +1 -0
  75. package/dist/toolchain/resolve.js +54 -90
  76. package/dist/toolchain/resolve.js.map +1 -1
  77. package/dist/utils/process.d.ts +1 -0
  78. package/dist/utils/process.js +6 -1
  79. package/dist/utils/process.js.map +1 -1
  80. package/dist/validators/graphify.js +28 -6
  81. package/dist/validators/graphify.js.map +1 -1
  82. package/dist/workers/agentPrompt.d.ts +6 -1
  83. package/dist/workers/agentPrompt.js +118 -34
  84. package/dist/workers/agentPrompt.js.map +1 -1
  85. package/dist/workers/paseo.js +53 -19
  86. package/dist/workers/paseo.js.map +1 -1
  87. package/dist/workers/podman.js +30 -8
  88. package/dist/workers/podman.js.map +1 -1
  89. package/docs/PASEO.md +56 -4
  90. package/docs/V0.5.1.md +129 -0
  91. package/docs/V0.5.2.md +180 -0
  92. package/docs/V0.5.md +116 -0
  93. package/docs/V0.6.md +148 -0
  94. package/package.json +3 -3
  95. package/presets/agents/orchestration.jsonc +37 -0
  96. package/schemas/project.schema.json +38 -8
  97. package/skills/engineering-workflow/SKILL.md +113 -81
  98. package/skills/openspec-authoring/SKILL.md +26 -0
  99. package/skills/paseo-orchestration/SKILL.md +38 -0
  100. package/templates/AGENTS.md +40 -15
  101. package/templates/agents.source.jsonc +1 -1
  102. package/templates/openspec-config.yaml +24 -0
  103. package/templates/project.yaml +79 -1
  104. package/templates/toolchain.yaml +19 -2
@@ -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,44 @@
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": {
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
+ } }
41
+ } },
25
42
  "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 } } }
43
+ "mcp": { "type": "object", "properties": {
44
+ "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" } } } },
45
+ "benchmark": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "resultsDir": { "type": "string" }, "repetitions": { "type": "integer", "minimum": 1 } } },
46
+ "packs": { "type": "object", "additionalProperties": { "type": "object", "required": ["servers"], "properties": { "servers": { "type": "array", "items": { "type": "string" } }, "enabled": { "type": "boolean" } } } }
31
47
  } },
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" }
48
+ "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 } } } } },
49
+ "memory": { "type": "object" },
50
+ "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 } } } } },
51
+ "evidence": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "outputDir": { "type": "string" }, "requireComplete": { "type": "boolean" } } },
52
+ "organization": { "type": "object", "properties": { "policyBundles": { "type": "object", "properties": { "cacheDir": { "type": "string" }, "required": { "type": "boolean" }, "sources": { "type": "array", "items": { "$ref": "#/$defs/policyBundleSource" } } } } } },
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" } } },
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" },
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" } } } },
57
+ "telemetry": { "type": "object" },
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 } } },
59
+ "provenance": { "type": "object" }
60
+ },
61
+ "$defs": {
62
+ "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 } } },
63
+ "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
64
  },
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
65
  "additionalProperties": false
36
66
  }
@@ -1,108 +1,140 @@
1
1
  ---
2
2
  name: engineering-workflow
3
- purpose: Turn a natural-language engineering request or existing GitHub issue into the correct Harness workflow while keeping the lead agent as semantic owner.
3
+ purpose: Turn natural-language engineering intent into Harness-governed audit/change execution while keeping the interactive lead thin and delegating operational work.
4
4
  ---
5
5
 
6
6
  # Engineering Workflow
7
7
 
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
-
10
- ## Entry protocol
11
-
12
- 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.
13
- 2. Establish environment readiness before delegation:
14
- - run `aeh doctor` when the project has already been initialized;
15
- - if doctor reports a reconciliable toolchain failure (missing/out-of-lock Codex, OpenCode, Paseo, Graphify, validator or managed project runtime), run `aeh setup` autonomously and then run `aeh doctor` again;
16
- - do not ask the user to install each managed dependency manually;
17
- - do not invoke sudo or silently install required host/system prerequisites. A truly unavailable host prerequisite or external credential becomes `BLOCKED_EXTERNAL`.
18
- 3. Run `aeh agents check` before delegation. If the topology remains invalid after normal generated-config reconciliation, report the deterministic failure.
19
- 4. If the user explicitly asks to implement an existing GitHub issue (`issue #123`, `#123`, or an issue URL), use the **Issue-driven path** below. Do not manually recreate the issue as a new SDD request first.
20
- 5. Otherwise inspect relevant code, Graphify structure when available, and advisory memory. Git/specs/tests remain authoritative.
21
- 6. Build triage evidence: bounded concrete file scope, affected domains, risk, and escalation flags.
22
- 7. Run `aeh triage "<request>" --file ... --domain ... --risk ...`.
23
- 8. Follow the Harness decision. Do not downgrade SPEC to QUICK manually.
24
-
25
- ## Toolchain policy
26
-
27
- Treat `.harness/toolchain.yaml` as desired engineering capability configuration and `.harness/toolchain.lock.json` as its resolved executable state.
28
-
29
- - `aeh setup --dry-run` is inspection only and must not mutate the repository/environment.
30
- - ordinary `aeh setup` reuses the existing lock and installs only missing/selected capabilities;
31
- - use `aeh setup --update-lock` only for an intentional toolchain upgrade, not as generic recovery;
32
- - project version authority such as `.node-version`, `.nvmrc`, .NET `global.json` and explicit project tool overrides must be respected;
33
- - `.harness/toolchain.state.json` and generated wrappers are machine-local and must not be treated as normative Git content;
34
- - do not run package-manager installs with unfrozen semantics when a lockfile/frozen mode is available;
35
- - use OCI validator alternatives only when configured/preferred and the container engine is available; absence of Podman should fall back to managed local tooling when the tool definition permits it.
36
-
37
- ## Issue-driven path
38
-
39
- For an existing GitHub issue, the issue is an **input source**, not mutable normative truth during execution.
40
-
41
- 1. Run `aeh issue inspect <number>` when you need to surface intake classification/evidence before execution.
42
- 2. Normally start the complete workflow with `aeh issue implement <number>` (equivalent entry: `aeh run --issue <number>`).
43
- 3. The Harness fetches the issue from the repository associated with the current project, freezes title/body into `.harness/issues/GH-<number>.json`, computes a SHA-256 content fingerprint, and rejects PR numbers masquerading as issues.
44
- 4. The Harness deterministically extracts labels, likely domains, concrete paths and acceptance statements. Non-trivial issues are normalized by the configured read-only planner against repository evidence. The planner may derive implementation details from the repository but must not invent product decisions.
45
- 5. The normalized intake is deterministically materialized as either:
46
- - a bounded QuickContract only when QUICK safety rules and concrete file scope are satisfied; or
47
- - a complete SDD/TaskContract with requirement IDs, design/tasks and acceptance traceability.
48
- 6. The generated TaskContract/SDD plus frozen issue snapshot are sealed. From this point they are normative for the run; later edits to the GitHub issue cannot silently change the active task.
49
- 7. The existing issue is seeded into the delivery record, so handoff must **reuse it**, never create a duplicate issue. If delivery is enabled, the Harness reuses/creates the issue-linked branch and Paseo worktree, materializes sealed context there, then runs the normal implementation/validation/review lifecycle.
50
- 8. Before every run of an issue-derived contract, the Harness re-fetches issue title/body and compares the content SHA. `ISSUE_DRIFT` blocks silent execution on changed requirements.
51
- 9. If `ISSUE_DRIFT` occurs before implementation, inspect the change and use `aeh issue import <number> --refresh` when the new issue text should become authoritative. If an active delivery workspace already exists, do not overwrite it casually; the Harness requires explicit `--force` for refresh.
52
- 10. After deterministic PASS, Final Quality Gate PASS and lead acceptance, deterministic Harness delivery may finalize the accepted issue branch when `delivery.github.finalizeOnAcceptance=true`: stage/commit the accepted work, push the exact issue branch without force, reuse an existing open PR or create a draft PR, and link it with `Closes #<issue>`.
53
- 11. Agents never receive `gitWrite` merely to perform this finalization. Commit/push/PR writes belong to the deterministic Harness control plane. A credential/push failure is `BLOCKED_EXTERNAL`; it must not be reported as successful delivery.
54
- 12. `SPEC_CONTRADICTION` and `REQUIRES_PRODUCT_DECISION` remain human-on-exception outcomes. Ordinary missing implementation detail should be resolved from repository evidence by planner/oracle rather than escalated to the user.
8
+ You are the engineering lead entrypoint. The user may be operating from Paseo mobile and should not need to know AEH commands, internal modes, tools or agents.
55
9
 
56
- ## QUICK path
10
+ ## Lead operating model
57
11
 
58
- Use QUICK only when the Harness returns QUICK.
12
+ The lead is a semantic orchestrator, not an interactive CI runner. Own:
59
13
 
60
- 1. Create a QuickContract with explicit **concrete** file scope and observable acceptance:
61
- `aeh quick new <id> --title "..." --request "..." --scope <paths...> --acceptance "..." --domain <domains...>`
62
- 2. Wildcard/repository-wide scope such as `**`, `src/**` or `src/*.ts` is not a bounded QUICK scope and must escalate to SPEC.
63
- 3. Run `aeh quick validate <id>`.
64
- 4. Run `aeh run <id>` with the desired profile.
65
- 5. Remain the lead; do not perform delegated implementation yourself unless recovery explicitly escalates to the lead.
66
- 6. Inspect the final deterministic report. Agent reviews are skipped for QUICK by default unless project policy enables them.
14
+ - the user's intent and explicit decisions;
15
+ - high-level workflow/risk choices;
16
+ - delegation and state transitions;
17
+ - true ambiguity/human-on-exception;
18
+ - final semantic acceptance.
67
19
 
68
- ## SPEC path
20
+ Delegate everything else to the narrowest bounded role:
69
21
 
70
- 1. Run `aeh sdd new <id> --title "..."`.
71
- 2. Complete proposal, spec, design, tasks and executable acceptance/Gherkin as appropriate.
72
- 3. Ensure stable requirement IDs and validator traceability.
73
- 4. Run `aeh sdd validate <id>`.
74
- 5. Run `aeh run <id>` with the appropriate profile.
75
- 6. The Harness owns delegation, deterministic validation, repair, quality convergence, reviewer waves, regression rollback, agent/model escalation, autonomous replanning and final lead acceptance.
22
+ - repository discovery -> `explorer`;
23
+ - environment/toolchain/Paseo recovery -> `environment-manager`;
24
+ - non-trivial triage/decomposition -> `planner`;
25
+ - SPEC authoring -> `spec-manager` using OpenSpec;
26
+ - implementation/validation/review -> Harness-selected workers.
76
27
 
77
- ## Quality convergence
28
+ Use the `paseo-orchestration` skill. Prefer injected Paseo tools (`create_agent`, `send_agent_prompt`, `get_agent_status`, `get_agent_activity`, lifecycle tools) and `/paseo-handoff` over shell orchestration when available. AEH's Paseo CLI adapter is the compatibility fallback. Do not create hand-written `paseo run` loops from the lead.
78
29
 
79
- Do not stop or ask the user because a remediation round count has been reached. Review remediation is governed by the Final Quality Gate, not a maximum number of rounds.
30
+ ## Persistent interactive entry
80
31
 
81
- Default quality weights use integer DebtPoints: critical=300, high=75, medium=24, low=3, note=1. Therefore three notes equal one low and DebtScore is DebtPoints/3. Final acceptance requires critical=0, high=0, medium=0, low<=3 and DebtScore<=3.
32
+ When the conversation was created by `aeh start`, its bootstrap is a standing instruction. Every engineering operation is automatically an engineering-workflow input, whether read-only or mutating. Only a purely informational question may bypass AEH.
82
33
 
83
- When quality is improving, continue autonomously. When it stagnates, regresses or cycles, allow the Harness to change strategy, escalate from the workhorse to stronger agents/models, diagnose root cause and replan. A remediation that worsens deterministic validation or review debt is rolled back before the next strategy is attempted.
34
+ A normal `aeh start` creates a fresh lead. `aeh start --resume` is the explicit compatibility/recovery path for reusing a lead. Do not assume old conversational context is normative; Git, sealed artifacts, AuditReports, run state and delivery state are the durable sources.
84
35
 
85
- ## Human-on-exception
36
+ The bootstrap may provide an exact AEH invocation. Use it whenever this skill writes `aeh`.
37
+
38
+ ## Context pressure before broad work
39
+
40
+ Do not wait for model compaction as the normal context lifecycle.
41
+
42
+ - below 70%: normal operation;
43
+ - 70–80%: pressure mode; stop exploratory shell work and increase delegation;
44
+ - >=80%: proactive handoff to a fresh lead;
45
+ - >=90%: mandatory handoff before additional engineering work.
46
+
47
+ Use Paseo's current status/tool data when it exposes context usage, otherwise use `aeh context guard --agent "$PASEO_AGENT_ID"`. When AEH writes a `.harness/paseo/handoffs/*.json` artifact, use `/paseo-handoff` (preferred) or a fresh `create_agent`, point the new lead at that artifact and stop continuing the workflow in the old lead. Deterministic artifacts, not a prose replay of the whole chat, carry state across the handoff.
48
+
49
+ ## Intent layer
50
+
51
+ Classify every request as:
52
+
53
+ - `INFORMATIONAL`: explanation/lookup only. May be answered directly and must remain non-mutating.
54
+ - `AUDIT`: read-only engineering review/validation/security/architecture/performance/quality/coverage/PR analysis. Must use `aeh audit`.
55
+ - `CHANGE`: implementation, fix, refactor, addition, removal, dependency/config update or other repository mutation. Must continue through deterministic QUICK/SPEC triage.
56
+
57
+ When not trivially informational, use `aeh intent` with compact evidence. Never use the informational exception for ad-hoc engineering assessment.
58
+
59
+ ## Environment readiness
60
+
61
+ `aeh start` owns initial managed-tool reconciliation. During a user turn, the lead must not personally perform long doctor/setup/npm/Paseo debugging sequences.
62
+
63
+ When readiness fails:
64
+
65
+ 1. delegate the failure plus exact deterministic message to `environment-manager`;
66
+ 2. environment-manager runs the bounded `aeh doctor`, `aeh setup`, `aeh agents check` and Paseo/toolchain recovery needed;
67
+ 3. receive only its compact outcome and relevant failure classification;
68
+ 4. retry the same sealed operation if readiness is restored;
69
+ 5. surface `BLOCKED_EXTERNAL` only for a genuinely unavailable host prerequisite, credential or service after bounded recovery.
70
+
71
+ Do not invoke sudo or silently install unmanaged host prerequisites.
72
+
73
+ ## AUDIT path
86
74
 
87
- Human intervention is the final exception path, not a routine review step. Request a human decision only when the Harness identifies one of these states:
75
+ 1. Invoke `aeh audit "<request>"`, passing concrete file/domain/risk hints when useful. Repository-wide scope is valid.
76
+ 2. AEH freezes the control plane, runs deterministic validators, classifies failures, invokes read-only reviewers, deduplicates findings and calculates quality debt.
77
+ 3. Validator failures remain evidence; do not reinterpret them as PASS.
78
+ 4. Persisted reports under `.harness/audits/` are durable input for later remediation.
79
+ 5. AUDIT never implements fixes. A later "fix these" is a new CHANGE using the AuditReport as evidence.
88
80
 
89
- - `SPEC_CONTRADICTION`: authoritative requirements cannot all be satisfied.
90
- - `REQUIRES_PRODUCT_DECISION`: the repository/spec/issue cannot determine a required business/product choice.
91
- - `BLOCKED_EXTERNAL`: a required host prerequisite, credential, account permission, push permission or external resource is unavailable to the Harness/agents.
92
- - `ISSUE_DRIFT`: a frozen issue's title/body changed after intake and accepting that new intent requires an explicit refresh decision once implementation state exists.
81
+ ## Issue-driven CHANGE path
93
82
 
94
- Missing managed toolchain components are not by themselves human exceptions: attempt `aeh setup` first. Implementation defects, review debt, regressions, cycles, invalid strategies and ordinary tool failures stay inside autonomous recovery/escalation whenever possible.
83
+ For an existing GitHub issue, use `aeh issue implement <number>` (or `aeh run --issue <number>`). AEH freezes issue content, creates/reuses the issue-linked delivery state, derives QUICK/SPEC artifacts and guards issue drift. Do not create a duplicate issue or manually restate the issue into an independent spec.
95
84
 
96
- ## Triage escalation rules
85
+ ## Non-issue CHANGE discovery and triage
97
86
 
98
- Treat architecture, authentication/authorization/security, tenant isolation, schema/migrations, public API compatibility, new dependencies, cross-module refactors, ambiguous requirements and medium/high risk as SPEC. A QuickContract must never be used to bypass these boundaries. QUICK scope must identify concrete files rather than broad wildcard patterns.
87
+ 1. Delegate repository discovery to `explorer`. Request only relevant files/symbols/tests/boundaries and evidence.
88
+ 2. For non-trivial work, delegate planning/triage evidence to `planner`. Planner remains read-only and does not run broad validation or author specs.
89
+ 3. Feed those compact outputs to deterministic `aeh triage`.
90
+ 4. Obey QUICK/SPEC without manual downgrade.
99
91
 
100
- If a QUICK implementation later reveals one of these conditions, stop the quick change and escalate to a new SPEC workflow rather than broadening the QuickContract.
92
+ Architecture, auth/security, tenant isolation, schema/migrations, public API compatibility, new dependencies, cross-module refactors, ambiguous requirements and medium/high risk are SPEC. QUICK requires explicit concrete files; if scope grows into a disallowed condition, escalate instead of broadening it.
101
93
 
102
- ## Mobile/Paseo behavior
94
+ ## QUICK path
95
+
96
+ For a CHANGE classified QUICK:
97
+
98
+ 1. Create a bounded QuickContract with explicit scope and observable acceptance.
99
+ 2. `aeh quick validate <id>`.
100
+ 3. `aeh run <id>`.
101
+ 4. Remain the parent lead; implementation and validation belong to AEH workers.
102
+
103
+ ## SPEC path — OpenSpec authoring
104
+
105
+ The lead must not write proposal/spec/design/tasks/Gherkin itself.
106
+
107
+ 1. Delegate SPEC ownership to `spec-manager` with user intent plus compact explorer/planner evidence.
108
+ 2. spec-manager runs `aeh spec prepare <taskId> --title "..."` and follows `openspec status` / `openspec instructions` to author proposal, specs, design and tasks.
109
+ 3. spec-manager runs strict OpenSpec validation, then `aeh spec compile <taskId> --title "..." --change <change>`.
110
+ 4. AEH deterministically compiles OpenSpec requirements/scenarios/tasks into native traceable SDD files, TaskContract and acceptance feature.
111
+ 5. spec-manager runs `aeh sdd validate <taskId>` and returns only compact requirement IDs, change name and unresolved decisions.
112
+ 6. The lead proceeds with normal seal/run/handoff. The compiled AEH artifacts and seal are normative during implementation; OpenSpec is authoring provenance before freeze.
113
+ 7. Do not use OpenSpec apply commands to implement product code. AEH owns implementation, validation, review convergence and delivery.
114
+
115
+ If OpenSpec cannot express a true product decision without guessing, return `REQUIRES_PRODUCT_DECISION`; otherwise author and validate autonomously.
116
+
117
+ ## Quality convergence and recovery
103
118
 
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.
119
+ After a sealed run starts, do not reimplement Harness state machines in the lead. AEH owns planner waves, deterministic barriers, repair packets, reviewer waves, regression rollback, quality convergence, stronger-agent/model escalation, oracle diagnosis, replanning, evidence and delivery.
120
+
121
+ Default acceptance remains: critical/high/medium = 0, low <= 3, DebtScore <= 3. Do not stop because an arbitrary remediation count elapsed.
122
+
123
+ If execution reports an environment/tool failure, delegate it to `environment-manager`; if it reports an implementation/review failure, let AEH's recovery/convergence path own it. The lead only intervenes when the state machine reaches a true semantic/exception boundary.
124
+
125
+ ## Human-on-exception
126
+
127
+ Request human input only for:
128
+
129
+ - `SPEC_CONTRADICTION`;
130
+ - `REQUIRES_PRODUCT_DECISION`;
131
+ - `BLOCKED_EXTERNAL` after bounded delegated recovery;
132
+ - `ISSUE_DRIFT` when changed intent must be explicitly accepted after implementation state exists.
105
133
 
106
134
  ## Self-modification
107
135
 
108
- If the repository being modified is the Harness itself or the task changes `.harness/agents.source.jsonc`, `.harness/toolchain.yaml`, skills, policies, validators or orchestration rules, the run is governed by the controller/topology/toolchain state that existed at run start. New control-plane rules become active only on a subsequent run after validation/merge.
136
+ If the repository is AEH itself or the task changes topology, toolchain, skills, policies, validators or orchestration, the active run remains governed by the frozen controller from run start. New rules activate only on a later run.
137
+
138
+ ## User-facing communication
139
+
140
+ Keep status concise. Do not narrate every shell command or subagent read. Surface meaningful transitions such as `AUDIT`, `QUICK`, `SPEC`, spec validated, run started, deterministic blocker, quality convergence state, handoff, final acceptance/delivery. The lead's context is reserved for decisions, not operational transcripts.
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: openspec-authoring
3
+ purpose: Author SPEC changes with OpenSpec, then compile them into sealed AEH normative artifacts without making the lead write specifications.
4
+ ---
5
+
6
+ # OpenSpec authoring for AEH
7
+
8
+ You are the bounded SPEC authoring agent. Do not implement product code.
9
+
10
+ 1. Receive a task id, title, user intent, planner evidence, affected areas, risks and explicit product decisions from the lead.
11
+ 2. Run `aeh spec prepare <taskId> --title "..."`. This creates or reuses the corresponding OpenSpec change using the configured schema.
12
+ 3. Use OpenSpec's agent-compatible workflow rather than inventing an independent document format:
13
+ - `openspec status --change <change> --json`;
14
+ - `openspec instructions <artifact> --change <change> --json`;
15
+ - write only the artifact requested by those instructions;
16
+ - continue until the artifacts required for the approved change are complete.
17
+ 4. Decide the behavior-spec boundary explicitly:
18
+ - if observable behavior changes, create the required delta specs with `### Requirement:` and `#### Scenario:` sections;
19
+ - if the change is a pure refactor/tooling/docs/internal-readability change whose observable behavior must remain identical, do **not** invent a fake delta spec. Set `skip_specs: true` in the change's `.openspec.yaml` and make the preservation boundary explicit in proposal/design/tasks;
20
+ - if later discovery shows behavior actually changes, remove `skip_specs: true` and author the real delta specs. Never keep both the skip marker and behavioral deltas.
21
+ 5. Keep scope and requirements grounded in user intent and repository/planner evidence. Record assumptions. Do not silently make product decisions that require a human.
22
+ 6. Run `openspec validate <change> --strict --json` until valid. Treat structural warnings/errors as authoring failures, not implementation failures.
23
+ 7. Run `aeh spec compile <taskId> --title "..." --change <change>`. AEH deterministically maps OpenSpec requirements/scenarios/tasks into traceable native SDD files, TaskContract and acceptance artifacts. For a valid `skip_specs` refactor, AEH generates the explicit behavior-preservation requirement needed by its evidence model.
24
+ 8. Run `aeh sdd validate <taskId>`. Return only the compact result, requirement IDs, OpenSpec change name and any unresolved human decision.
25
+
26
+ OpenSpec is the authoring source before freeze. The compiled AEH TaskContract/SDD plus seal are normative during implementation. Do not use `/opsx:apply` to implement code; AEH owns implementation, validation, review convergence and delivery.
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: paseo-orchestration
3
+ purpose: Keep AEH leads thin by delegating through Paseo native/MCP tools and orchestration skills instead of ad-hoc shell control.
4
+ ---
5
+
6
+ # Paseo orchestration
7
+
8
+ Use this skill whenever an AEH lead, planner or coordinator delegates work through Paseo.
9
+
10
+ ## Preferred control surface
11
+
12
+ When Paseo tools are injected into the current agent, prefer them over shell commands:
13
+
14
+ - `create_agent` for a bounded subagent;
15
+ - `send_agent_prompt` for follow-up work;
16
+ - `get_agent_status` and `get_agent_activity` for compact observation;
17
+ - `cancel_agent` / `archive_agent` for lifecycle cleanup;
18
+ - `update_agent` / `set_agent_mode` for supported runtime changes.
19
+
20
+ Load `/paseo` when the exact current Paseo surface is needed. Use `/paseo-handoff` when responsibility, not merely a subtask, should move to a fresh agent. `/paseo-committee` and `/paseo-advisor` are analysis-only escalation tools and must not replace deterministic AEH gates.
21
+
22
+ The Harness CLI/daemon adapter remains a deterministic fallback when native tools are unavailable. Do not hand-write `paseo run` shell loops from the lead unless AEH explicitly reports that it is using the CLI fallback.
23
+
24
+ ## Lead discipline
25
+
26
+ The lead owns intent, high-level routing, true ambiguity and final semantic acceptance. Delegate:
27
+
28
+ - repository discovery -> `explorer`;
29
+ - environment/toolchain/daemon recovery -> `environment-manager`;
30
+ - non-trivial decomposition -> `planner`;
31
+ - SPEC authoring -> `spec-manager`;
32
+ - implementation/review -> Harness-selected workers/reviewers.
33
+
34
+ Return compact structured summaries to the lead. Do not paste raw logs or entire source files unless they contain evidence needed for a decision.
35
+
36
+ ## Context pressure
37
+
38
+ Before broad engineering work, inspect the current agent status if Paseo exposes context usage. At the configured handoff threshold, create a deterministic AEH handoff artifact and use `/paseo-handoff` (preferred) or `create_agent` to continue in a fresh lead. Do not compact and continue as the normal path when AEH has declared `HANDOFF_REQUIRED` or `HARD_HANDOFF`.
@@ -1,22 +1,46 @@
1
1
  # Engineering Agent Contract
2
2
 
3
- ## Lead agent
3
+ ## Interactive entry
4
4
 
5
- The lead agent owns requirements interpretation, architecture, SDD artifacts, decomposition, review and final semantic acceptance. Prefer Codex for this role.
5
+ When a user is interacting through Paseo or another conversational coding-agent UI, every engineering operation must enter through the `engineering-workflow` Harness path, whether read-only or mutating. The user does not need to mention AEH, AUDIT, QUICK, SPEC, OpenSpec, SDD, TaskContracts or validators.
6
6
 
7
- Before delegating implementation:
7
+ Classify requests as:
8
8
 
9
- 1. Inspect current repository state and relevant structural context.
10
- 2. Recover historical memory only as advisory context.
11
- 3. Produce/update proposal, specification, design and executable acceptance criteria.
12
- 4. Create a TaskContract with explicit scope, invariants and deterministic validators.
13
- 5. Freeze the TaskContract before implementation begins.
9
+ - `INFORMATIONAL`: explanation or lookup only. These may be answered directly and must not mutate repository state.
10
+ - `AUDIT`: review, validation, bug discovery, architecture/security/performance/quality assessment, coverage analysis, PR/code review or similar read-only engineering work. These must run through the Harness audit pipeline.
11
+ - `CHANGE`: implementation, fixes, refactors, additions, removals, configuration or any repository mutation. These must continue through deterministic QUICK/SPEC triage and Harness execution.
14
12
 
15
- After the worker finishes, inspect the actual diff and deterministic validation report. Never accept work solely from a worker summary.
13
+ Do not use the informational exception for an ad-hoc engineering review. `aeh start` is the preferred Paseo entrypoint. A normal start creates a fresh lead; `aeh start --resume` is explicit reuse.
14
+
15
+ ## Lead agent — thin orchestrator
16
+
17
+ The lead owns user intent, high-level routing, true ambiguity and final semantic acceptance. It does **not** own routine repository exploration, environment repair, SDD authoring or implementation.
18
+
19
+ Delegate by default:
20
+
21
+ - repository discovery -> `explorer`;
22
+ - toolchain/doctor/Paseo recovery -> `environment-manager`;
23
+ - non-trivial decomposition/triage evidence -> `planner`;
24
+ - SPEC authoring -> `spec-manager` using OpenSpec;
25
+ - implementation/validation/review -> Harness-selected workers.
26
+
27
+ Prefer Paseo's injected orchestration tools and `/paseo-handoff` over hand-written shell orchestration when available. Preserve the lead context for decisions rather than raw logs and source dumps.
28
+
29
+ For engineering work:
30
+
31
+ 1. Check context pressure before broad work. Around 70% stop exploratory work; at 80% hand off proactively to a fresh lead using the deterministic `.harness/paseo/handoffs/` artifact; at 90% handoff is mandatory rather than normal compaction-and-continue.
32
+ 2. Classify `INFORMATIONAL | AUDIT | CHANGE` through AEH when not trivially informational.
33
+ 3. AUDIT -> `aeh audit`.
34
+ 4. CHANGE -> delegate discovery/planning, then obey deterministic QUICK/SPEC.
35
+ 5. QUICK -> bounded QuickContract and AEH run.
36
+ 6. SPEC -> delegate to `spec-manager`; the lead must not write proposal/spec/design/tasks itself. OpenSpec is the authoring source, then `aeh spec compile` produces the traceable native AEH SDD/TaskContract used for sealing/execution.
37
+ 7. Environment/tool failures -> delegate bounded recovery to `environment-manager`; do not personally execute long npm/git/Paseo diagnostic sequences.
38
+
39
+ After workers finish, use actual deterministic reports/evidence and the final semantic gate. Never accept work solely from a worker summary.
16
40
 
17
41
  ## Worker agent
18
42
 
19
- The worker implements an assigned frozen task. Prefer OpenCode with the configured workhorse model.
43
+ The worker implements an assigned frozen task. Prefer the configured workhorse model.
20
44
 
21
45
  The worker must not:
22
46
 
@@ -26,12 +50,13 @@ The worker must not:
26
50
  - weaken acceptance criteria or validators to make a task pass;
27
51
  - introduce new dependencies, schema changes or breaking APIs unless the TaskContract permits them.
28
52
 
29
- If the plan conflicts with reality, report the blocker to the lead agent instead of silently redesigning the system.
53
+ If the plan conflicts with reality, report the blocker instead of silently redesigning the system.
30
54
 
31
55
  ## Source-of-truth order
32
56
 
33
57
  1. Current Git-versioned code and schemas.
34
- 2. Frozen TaskContract and current SDD artifacts.
35
- 3. ADRs and project policy.
36
- 4. Executable acceptance criteria.
37
- 5. Memory backend as historical/advisory context only.
58
+ 2. Frozen TaskContract and compiled AEH SDD artifacts for CHANGE work; persisted AuditReport for prior AUDIT evidence.
59
+ 3. OpenSpec source artifacts as pre-freeze authoring provenance.
60
+ 4. ADRs and project policy.
61
+ 5. Executable acceptance criteria and deterministic validator evidence.
62
+ 6. Memory backend as historical/advisory context only.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "extends": ["aeh:default"],
3
+ "extends": ["aeh:orchestration"],
4
4
  "activeProfile": "balanced",
5
5
 
6
6
  // Override a built-in model alias once and every agent using it follows.
@@ -0,0 +1,24 @@
1
+ schema: spec-driven
2
+
3
+ context: |
4
+ This repository uses Agentic Engineering Harness (AEH) as the execution and validation control plane.
5
+ OpenSpec is the SPEC authoring source before freeze. After `aeh spec compile`, the compiled AEH SDD/TaskContract and SHA-256 seal are normative for implementation.
6
+ Keep requirements observable, preserve existing public behavior unless change is explicit, and ground design decisions in repository evidence supplied by the planner/explorer.
7
+ For pure refactors/tooling/docs/internal-readability changes with no observable behavior delta, declare `skip_specs: true` in the change `.openspec.yaml` instead of inventing a behavioral delta. If behavior changes, remove the marker and author real delta specs.
8
+
9
+ rules:
10
+ proposal:
11
+ - State the problem, desired outcome, scope and non-goals.
12
+ - Do not silently invent product decisions; record unresolved decisions explicitly.
13
+ - State explicitly whether externally observable behavior changes.
14
+ specs:
15
+ - Use explicit `### Requirement:` sections.
16
+ - Use `#### Scenario:` sections with GIVEN/WHEN/THEN bullets for observable behavior.
17
+ - Describe behavior, not implementation trivia.
18
+ - Do not create a spec delta for a pure no-behavior refactor; use the OpenSpec skip_specs marker instead.
19
+ design:
20
+ - Map the proposed approach to repository boundaries and risks.
21
+ - Call out API, schema, security and compatibility impact explicitly.
22
+ - For no-behavior refactors, document how behavior preservation will be proven deterministically.
23
+ tasks:
24
+ - Keep tasks bounded and dependency-aware so AEH can compile them into executable planner work.