agentic-engineering-harness 0.4.16
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/LICENSE +201 -0
- package/README.md +273 -0
- package/dist/agents/audit.d.ts +12 -0
- package/dist/agents/audit.js +14 -0
- package/dist/agents/audit.js.map +1 -0
- package/dist/agents/compiler.d.ts +8 -0
- package/dist/agents/compiler.js +103 -0
- package/dist/agents/compiler.js.map +1 -0
- package/dist/agents/config.d.ts +6 -0
- package/dist/agents/config.js +161 -0
- package/dist/agents/config.js.map +1 -0
- package/dist/agents/escalation.d.ts +9 -0
- package/dist/agents/escalation.js +75 -0
- package/dist/agents/escalation.js.map +1 -0
- package/dist/agents/exceptionDetection.d.ts +24 -0
- package/dist/agents/exceptionDetection.js +42 -0
- package/dist/agents/exceptionDetection.js.map +1 -0
- package/dist/agents/findings.d.ts +14 -0
- package/dist/agents/findings.js +40 -0
- package/dist/agents/findings.js.map +1 -0
- package/dist/agents/gitCheckpoint.d.ts +6 -0
- package/dist/agents/gitCheckpoint.js +61 -0
- package/dist/agents/gitCheckpoint.js.map +1 -0
- package/dist/agents/jsonc.d.ts +1 -0
- package/dist/agents/jsonc.js +42 -0
- package/dist/agents/jsonc.js.map +1 -0
- package/dist/agents/outputContracts.d.ts +161 -0
- package/dist/agents/outputContracts.js +16 -0
- package/dist/agents/outputContracts.js.map +1 -0
- package/dist/agents/parallelism.d.ts +14 -0
- package/dist/agents/parallelism.js +54 -0
- package/dist/agents/parallelism.js.map +1 -0
- package/dist/agents/permissions.d.ts +5 -0
- package/dist/agents/permissions.js +30 -0
- package/dist/agents/permissions.js.map +1 -0
- package/dist/agents/qualityConvergence.d.ts +44 -0
- package/dist/agents/qualityConvergence.js +77 -0
- package/dist/agents/qualityConvergence.js.map +1 -0
- package/dist/agents/recovery.d.ts +13 -0
- package/dist/agents/recovery.js +35 -0
- package/dist/agents/recovery.js.map +1 -0
- package/dist/agents/reviewLifecycle.d.ts +30 -0
- package/dist/agents/reviewLifecycle.js +233 -0
- package/dist/agents/reviewLifecycle.js.map +1 -0
- package/dist/agents/routing.d.ts +9 -0
- package/dist/agents/routing.js +37 -0
- package/dist/agents/routing.js.map +1 -0
- package/dist/agents/structuredOutput.d.ts +1 -0
- package/dist/agents/structuredOutput.js +54 -0
- package/dist/agents/structuredOutput.js.map +1 -0
- package/dist/agents/types.d.ts +207 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +221 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/config.d.ts +3 -0
- package/dist/core/config.js +59 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/doctor.d.ts +8 -0
- package/dist/core/doctor.js +59 -0
- package/dist/core/doctor.js.map +1 -0
- package/dist/core/git.d.ts +8 -0
- package/dist/core/git.js +47 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/init.d.ts +1 -0
- package/dist/core/init.js +52 -0
- package/dist/core/init.js.map +1 -0
- package/dist/core/quick.d.ts +20 -0
- package/dist/core/quick.js +49 -0
- package/dist/core/quick.js.map +1 -0
- package/dist/core/repair.d.ts +8 -0
- package/dist/core/repair.js +7 -0
- package/dist/core/repair.js.map +1 -0
- package/dist/core/run.d.ts +38 -0
- package/dist/core/run.js +165 -0
- package/dist/core/run.js.map +1 -0
- package/dist/core/sdd.d.ts +10 -0
- package/dist/core/sdd.js +88 -0
- package/dist/core/sdd.js.map +1 -0
- package/dist/core/seal.d.ts +3 -0
- package/dist/core/seal.js +74 -0
- package/dist/core/seal.js.map +1 -0
- package/dist/core/triage.d.ts +22 -0
- package/dist/core/triage.js +38 -0
- package/dist/core/triage.js.map +1 -0
- package/dist/core/types.d.ts +354 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/verify.d.ts +6 -0
- package/dist/core/verify.js +51 -0
- package/dist/core/verify.js.map +1 -0
- package/dist/delivery/finalize.d.ts +17 -0
- package/dist/delivery/finalize.js +71 -0
- package/dist/delivery/finalize.js.map +1 -0
- package/dist/delivery/handoff.d.ts +39 -0
- package/dist/delivery/handoff.js +250 -0
- package/dist/delivery/handoff.js.map +1 -0
- package/dist/entry.d.ts +2 -0
- package/dist/entry.js +112 -0
- package/dist/entry.js.map +1 -0
- package/dist/evals/runner.d.ts +4 -0
- package/dist/evals/runner.js +112 -0
- package/dist/evals/runner.js.map +1 -0
- package/dist/evals/scoring.d.ts +3 -0
- package/dist/evals/scoring.js +41 -0
- package/dist/evals/scoring.js.map +1 -0
- package/dist/evals/types.d.ts +46 -0
- package/dist/evals/types.js +2 -0
- package/dist/evals/types.js.map +1 -0
- package/dist/issues/intake.d.ts +114 -0
- package/dist/issues/intake.js +213 -0
- package/dist/issues/intake.js.map +1 -0
- package/dist/memory/benchmark.d.ts +33 -0
- package/dist/memory/benchmark.js +69 -0
- package/dist/memory/benchmark.js.map +1 -0
- package/dist/metrics/runMetrics.d.ts +9 -0
- package/dist/metrics/runMetrics.js +34 -0
- package/dist/metrics/runMetrics.js.map +1 -0
- package/dist/metrics/usage.d.ts +3 -0
- package/dist/metrics/usage.js +53 -0
- package/dist/metrics/usage.js.map +1 -0
- package/dist/provenance/generate.d.ts +30 -0
- package/dist/provenance/generate.js +96 -0
- package/dist/provenance/generate.js.map +1 -0
- package/dist/providers/engram.d.ts +8 -0
- package/dist/providers/engram.js +14 -0
- package/dist/providers/engram.js.map +1 -0
- package/dist/providers/graphify.d.ts +9 -0
- package/dist/providers/graphify.js +28 -0
- package/dist/providers/graphify.js.map +1 -0
- package/dist/providers/paseo.d.ts +8 -0
- package/dist/providers/paseo.js +14 -0
- package/dist/providers/paseo.js.map +1 -0
- package/dist/providers/types.d.ts +41 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/telemetry/events.d.ts +2 -0
- package/dist/telemetry/events.js +29 -0
- package/dist/telemetry/events.js.map +1 -0
- package/dist/telemetry/otlp.d.ts +3 -0
- package/dist/telemetry/otlp.js +57 -0
- package/dist/telemetry/otlp.js.map +1 -0
- package/dist/toolchain/config.d.ts +10 -0
- package/dist/toolchain/config.js +54 -0
- package/dist/toolchain/config.js.map +1 -0
- package/dist/toolchain/doctor.d.ts +8 -0
- package/dist/toolchain/doctor.js +56 -0
- package/dist/toolchain/doctor.js.map +1 -0
- package/dist/toolchain/mise.d.ts +10 -0
- package/dist/toolchain/mise.js +61 -0
- package/dist/toolchain/mise.js.map +1 -0
- package/dist/toolchain/resolve.d.ts +8 -0
- package/dist/toolchain/resolve.js +159 -0
- package/dist/toolchain/resolve.js.map +1 -0
- package/dist/toolchain/setup.d.ts +7 -0
- package/dist/toolchain/setup.js +141 -0
- package/dist/toolchain/setup.js.map +1 -0
- package/dist/toolchain/types.d.ts +95 -0
- package/dist/toolchain/types.js +2 -0
- package/dist/toolchain/types.js.map +1 -0
- package/dist/utils/process.d.ts +15 -0
- package/dist/utils/process.js +94 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/validators/commands.d.ts +2 -0
- package/dist/validators/commands.js +28 -0
- package/dist/validators/commands.js.map +1 -0
- package/dist/validators/constraints.d.ts +6 -0
- package/dist/validators/constraints.js +30 -0
- package/dist/validators/constraints.js.map +1 -0
- package/dist/validators/diffScope.d.ts +2 -0
- package/dist/validators/diffScope.js +36 -0
- package/dist/validators/diffScope.js.map +1 -0
- package/dist/validators/evidence.d.ts +6 -0
- package/dist/validators/evidence.js +8 -0
- package/dist/validators/evidence.js.map +1 -0
- package/dist/validators/external.d.ts +3 -0
- package/dist/validators/external.js +22 -0
- package/dist/validators/external.js.map +1 -0
- package/dist/validators/gherkin.d.ts +3 -0
- package/dist/validators/gherkin.js +59 -0
- package/dist/validators/gherkin.js.map +1 -0
- package/dist/validators/graphify.d.ts +4 -0
- package/dist/validators/graphify.js +108 -0
- package/dist/validators/graphify.js.map +1 -0
- package/dist/validators/opa.d.ts +3 -0
- package/dist/validators/opa.js +43 -0
- package/dist/validators/opa.js.map +1 -0
- package/dist/validators/openapi.d.ts +25 -0
- package/dist/validators/openapi.js +98 -0
- package/dist/validators/openapi.js.map +1 -0
- package/dist/validators/registry.d.ts +2 -0
- package/dist/validators/registry.js +36 -0
- package/dist/validators/registry.js.map +1 -0
- package/dist/validators/toolCommand.d.ts +5 -0
- package/dist/validators/toolCommand.js +33 -0
- package/dist/validators/toolCommand.js.map +1 -0
- package/dist/validators/types.d.ts +13 -0
- package/dist/validators/types.js +2 -0
- package/dist/validators/types.js.map +1 -0
- package/dist/workers/agentPrompt.d.ts +3 -0
- package/dist/workers/agentPrompt.js +84 -0
- package/dist/workers/agentPrompt.js.map +1 -0
- package/dist/workers/direct.d.ts +13 -0
- package/dist/workers/direct.js +30 -0
- package/dist/workers/direct.js.map +1 -0
- package/dist/workers/factory.d.ts +4 -0
- package/dist/workers/factory.js +10 -0
- package/dist/workers/factory.js.map +1 -0
- package/dist/workers/paseo.d.ts +14 -0
- package/dist/workers/paseo.js +29 -0
- package/dist/workers/paseo.js.map +1 -0
- package/dist/workers/podman.d.ts +13 -0
- package/dist/workers/podman.js +22 -0
- package/dist/workers/podman.js.map +1 -0
- package/dist/workers/prompt.d.ts +4 -0
- package/dist/workers/prompt.js +4 -0
- package/dist/workers/prompt.js.map +1 -0
- package/dist/workers/types.d.ts +11 -0
- package/dist/workers/types.js +2 -0
- package/dist/workers/types.js.map +1 -0
- package/docs/ARCHITECTURE.md +47 -0
- package/docs/EVALS.md +28 -0
- package/docs/MEMORY.md +28 -0
- package/docs/OBSERVABILITY.md +18 -0
- package/docs/OSS_STACK.md +27 -0
- package/docs/PASEO.md +9 -0
- package/docs/PUBLISHING.md +110 -0
- package/docs/SDD.md +35 -0
- package/docs/SECURITY.md +21 -0
- package/docs/V0.2.md +42 -0
- package/docs/V0.3.md +40 -0
- package/docs/V0.4.11.md +30 -0
- package/docs/V0.4.12.md +88 -0
- package/docs/V0.4.13.md +203 -0
- package/docs/V0.4.14.md +209 -0
- package/docs/V0.4.15.md +365 -0
- package/docs/V0.4.16.md +229 -0
- package/docs/V0.4.md +28 -0
- package/docs/VALIDATION.md +23 -0
- package/package.json +18 -0
- package/policies/core/dependency-policy.rego +12 -0
- package/policies/core/schema-policy.rego +12 -0
- package/policies/core/trust-boundary.rego +17 -0
- package/presets/agents/default.jsonc +80 -0
- package/presets/docker.yaml +4 -0
- package/presets/dotnet.yaml +12 -0
- package/presets/expo.yaml +6 -0
- package/presets/generic.yaml +3 -0
- package/presets/nextjs.yaml +8 -0
- package/presets/node.yaml +6 -0
- package/presets/pnpm.yaml +6 -0
- package/presets/postgres.yaml +4 -0
- package/schemas/agent-output-planner.schema.json +1 -0
- package/schemas/agent-topology.schema.json +37 -0
- package/schemas/project.schema.json +36 -0
- package/schemas/quick-contract.schema.json +17 -0
- package/schemas/task-contract.schema.json +18 -0
- package/schemas/toolchain.schema.json +70 -0
- package/schemas/validation-report.schema.json +15 -0
- package/skills/acceptance-traceability/SKILL.md +13 -0
- package/skills/deterministic-validation/SKILL.md +15 -0
- package/skills/engineering-workflow/SKILL.md +108 -0
- package/skills/finding-dedup/SKILL.md +12 -0
- package/skills/github-delivery-lifecycle/SKILL.md +16 -0
- package/skills/implementation-worker/SKILL.md +17 -0
- package/skills/lead-engineer/SKILL.md +30 -0
- package/skills/memory-hygiene/SKILL.md +22 -0
- package/skills/prompt-drift-audit/SKILL.md +10 -0
- package/skills/recovery-classifier/SKILL.md +13 -0
- package/skills/routing-normalizer/SKILL.md +17 -0
- package/skills/sdd/SKILL.md +21 -0
- package/skills/simplify/SKILL.md +16 -0
- package/skills/verification-planning/SKILL.md +17 -0
- package/skills/worktree-lifecycle/SKILL.md +18 -0
- package/templates/AGENTS.md +37 -0
- package/templates/agents.source.jsonc +39 -0
- package/templates/otel-collector.yaml +21 -0
- package/templates/project.yaml +196 -0
- package/templates/toolchain.yaml +127 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
package harness.trust_boundary
|
|
2
|
+
|
|
3
|
+
# Input shape expected from the harness policy adapter:
|
|
4
|
+
# {
|
|
5
|
+
# "changedFiles": [...],
|
|
6
|
+
# "frozenPatterns": [...],
|
|
7
|
+
# "workerRole": "implementation-worker"
|
|
8
|
+
# }
|
|
9
|
+
#
|
|
10
|
+
# Pattern expansion is intentionally performed by the harness before OPA.
|
|
11
|
+
|
|
12
|
+
default allow := true
|
|
13
|
+
|
|
14
|
+
deny contains "implementation worker changed a frozen artifact" if {
|
|
15
|
+
input.workerRole == "implementation-worker"
|
|
16
|
+
count(input.frozenChangedFiles) > 0
|
|
17
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"activeProfile": "balanced",
|
|
4
|
+
"skillRoots": [".harness/skills", ".agents/skills", ".opencode/skills"],
|
|
5
|
+
"runtimes": {
|
|
6
|
+
"codex": { "adapter": "codex", "paseoProvider": "codex", "command": "codex", "capabilities": { "nativeAgent": false, "nativeAgentViaPaseo": false, "modelSelection": true, "variantSelection": true, "sessions": true } },
|
|
7
|
+
"opencode": { "adapter": "opencode", "paseoProvider": "opencode", "command": "opencode", "capabilities": { "nativeAgent": true, "nativeAgentViaPaseo": false, "modelSelection": true, "variantSelection": true, "sessions": true, "structuredOutput": true } }
|
|
8
|
+
},
|
|
9
|
+
"models": {
|
|
10
|
+
"brain": { "runtime": "codex", "provider": "openai", "model": "gpt-5.6-luna", "variant": "max" },
|
|
11
|
+
"workhorse": { "runtime": "opencode", "provider": "opencode-go", "model": "deepseek-v4-flash" }
|
|
12
|
+
},
|
|
13
|
+
"agents": {
|
|
14
|
+
"lead": { "role": "orchestrator", "domains": ["*"], "description": "Own intent, decomposition, dependency ordering, risk decisions and final semantic acceptance. Delegate repository work to the narrowest specialist; do not perform implementation edits. Preserve sealed requirements and use human-on-exception only when the answer cannot be derived from repository evidence or normative artifacts.", "execution": { "model": "@brain" }, "skills": ["engineering-workflow", "lead-engineer", "verification-planning", "worktree-lifecycle"], "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "ask", "delegate": "allow", "review": "allow", "validate": "deny", "gitWrite": "deny" }, "outputContract": "orchestrator" },
|
|
15
|
+
"planner": { "role": "planner", "domains": ["*"], "description": "Produce bounded delegation plans from requirements, changed areas, dependencies, findings and validation evidence. Remain read-only, identify parallelizable work, required reviewers and validation gates, and never silently change normative scope.", "execution": { "model": "@brain" }, "skills": ["routing-normalizer", "verification-planning", "acceptance-traceability"], "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "deny", "delegate": "allow", "review": "allow", "validate": "deny", "gitWrite": "deny" }, "outputContract": "planner" },
|
|
16
|
+
"oracle": { "role": "escalation", "domains": ["*"], "description": "Diagnose persistent, ambiguous, cycling or cross-cutting failures using repository evidence and sealed requirements. Distinguish implementation defects from spec contradictions, missing product decisions and unavailable external resources. Do not edit files.", "execution": { "model": "@brain" }, "skills": ["recovery-classifier", "simplify"], "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "ask", "delegate": "deny", "review": "allow", "validate": "allow", "gitWrite": "deny" }, "outputContract": "recovery" },
|
|
17
|
+
"explorer": { "role": "explorer", "domains": ["*"], "description": "Perform fast repository discovery: locate relevant files, symbols, tests, ownership boundaries and nearby patterns. Return evidence and paths rather than speculative redesigns. Remain read-only.", "execution": { "model": "@workhorse" }, "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "deny", "delegate": "deny", "review": "deny", "validate": "deny", "gitWrite": "deny" } },
|
|
18
|
+
"librarian": { "role": "librarian", "domains": ["*"], "description": "Research authoritative documentation and project-local knowledge needed by another agent. Prefer primary sources and report exact constraints, versions and citations; do not modify repository files.", "execution": { "model": "@workhorse" }, "mcps": ["context7"], "permissions": { "read": "allow", "write": "deny", "shell": "deny", "network": "allow", "delegate": "deny", "review": "deny", "validate": "deny", "gitWrite": "deny" } },
|
|
19
|
+
"designer": { "role": "reviewer", "domains": ["design", "ui", "ux", "frontend"], "description": "Review user-facing interface structure, interaction clarity, accessibility implications and consistency with the repository design system. Use browser evidence when useful, but do not mutate source or replace deterministic UI tests.", "execution": { "model": "@workhorse" }, "mcps": ["playwright", "context7"], "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "ask", "review": "allow", "gitWrite": "deny" }, "outputContract": "reviewer" },
|
|
20
|
+
"github-manager": { "role": "coordinator", "domains": ["github", "delivery", "repository"], "description": "Inspect GitHub issues, pull requests, actions and repository metadata and perform first-pass delivery triage. GitHub MCP access is intentionally read-only by default; deterministic Harness delivery code owns issue and branch writes.", "execution": { "model": "@workhorse" }, "skills": ["github-delivery-lifecycle", "worktree-lifecycle"], "mcps": ["github"], "permissions": { "read": "allow", "write": "deny", "shell": "deny", "network": "allow", "delegate": "deny", "review": "allow", "gitWrite": "deny" } },
|
|
21
|
+
|
|
22
|
+
"implementation-worker": { "role": "implementer", "domains": ["*"], "description": "Implement bounded tasks that do not require a narrower domain specialist. Make the smallest coherent change, preserve public contracts unless explicitly authorized, add focused tests and report concrete validation evidence.", "execution": { "model": "@workhorse" }, "skills": ["implementation-worker", "verification-planning"], "permissions": { "read": "allow", "write": "allow", "shell": "allow", "network": "ask", "delegate": "deny", "gitWrite": "deny" }, "outputContract": "implementer" },
|
|
23
|
+
"backend-implementer": { "role": "implementer", "domains": ["backend", "server", "services", "api"], "description": "Implement server-side behavior, domain/application services, API handlers and integration boundaries. Preserve architecture and API contracts, enforce authorization at the correct boundary, and add unit/integration coverage for changed behavior.", "execution": { "model": "@workhorse" }, "skills": ["verification-planning"], "mcps": ["context7"], "permissions": { "read": "allow", "write": "allow", "shell": "allow", "network": "ask", "delegate": "deny", "gitWrite": "deny" }, "outputContract": "implementer" },
|
|
24
|
+
"frontend-implementer": { "role": "implementer", "domains": ["frontend", "web", "ui", "ux"], "description": "Implement web UI, routing, client state, forms and service integration while preserving accessibility, responsive behavior and existing design-system conventions. Add focused component or browser coverage where useful.", "execution": { "model": "@workhorse" }, "skills": ["verification-planning"], "mcps": ["context7"], "permissions": { "read": "allow", "write": "allow", "shell": "allow", "network": "ask", "delegate": "deny", "gitWrite": "deny" }, "outputContract": "implementer" },
|
|
25
|
+
"data-implementer": { "role": "implementer", "domains": ["data", "database", "schema", "migration", "persistence"], "description": "Implement persistence, schema and migration changes with explicit compatibility and rollback awareness. Preserve data invariants, avoid destructive migration shortcuts and update repository/integration tests for changed persistence behavior.", "execution": { "model": "@workhorse" }, "skills": ["verification-planning"], "mcps": ["context7"], "permissions": { "read": "allow", "write": "allow", "shell": "allow", "network": "ask", "delegate": "deny", "gitWrite": "deny" }, "outputContract": "implementer" },
|
|
26
|
+
"mobile-implementer": { "role": "implementer", "domains": ["mobile", "ios", "android", "react-native"], "description": "Implement mobile flows, platform integration, navigation, state and native-facing behavior while preserving platform conventions, offline/error behavior and shared API contracts. Add focused mobile tests where the stack supports them.", "execution": { "model": "@workhorse" }, "skills": ["verification-planning"], "mcps": ["context7"], "permissions": { "read": "allow", "write": "allow", "shell": "allow", "network": "ask", "delegate": "deny", "gitWrite": "deny" }, "outputContract": "implementer" },
|
|
27
|
+
"test-implementer": { "role": "implementer", "domains": ["test", "tests", "testing", "e2e"], "description": "Create or repair tests that prove observable requirements rather than implementation trivia. Prefer deterministic fixtures, cover regressions and edge cases, and never weaken assertions merely to make a run pass.", "execution": { "model": "@workhorse" }, "skills": ["verification-planning", "acceptance-traceability"], "mcps": ["context7"], "permissions": { "read": "allow", "write": "allow", "shell": "allow", "network": "ask", "delegate": "deny", "gitWrite": "deny" }, "outputContract": "implementer" },
|
|
28
|
+
"docs-implementer": { "role": "implementer", "domains": ["docs", "documentation"], "description": "Update developer/user documentation to match implemented behavior, commands, configuration and operational constraints. Keep examples executable and avoid documenting behavior that is not present in code.", "execution": { "model": "@workhorse" }, "skills": ["prompt-drift-audit"], "mcps": ["context7"], "permissions": { "read": "allow", "write": "allow", "shell": "allow", "network": "ask", "delegate": "deny", "gitWrite": "deny" }, "outputContract": "implementer" },
|
|
29
|
+
"ops-implementer": { "role": "implementer", "domains": ["ops", "devops", "ci", "cd", "docker", "deployment", "infrastructure", "delivery"], "description": "Implement CI/CD, container, build and operational configuration changes conservatively. Preserve reproducibility, least privilege and local developer workflows; validate commands/configuration rather than relying on textual inspection alone.", "execution": { "model": "@workhorse" }, "skills": ["github-delivery-lifecycle", "worktree-lifecycle", "verification-planning"], "mcps": ["context7"], "permissions": { "read": "allow", "write": "allow", "shell": "allow", "network": "ask", "delegate": "deny", "gitWrite": "deny" }, "outputContract": "implementer" },
|
|
30
|
+
"quality-implementer": { "role": "implementer", "domains": ["*"], "description": "Perform targeted remediation of normalized review findings. Resolve mandatory findings first, reduce aggregate quality debt without broadening scope, avoid churn on subjective low-value issues and preserve deterministic behavior.", "execution": { "model": "@workhorse" }, "skills": ["finding-dedup", "simplify"], "permissions": { "read": "allow", "write": "allow", "shell": "allow", "network": "ask", "delegate": "deny", "gitWrite": "deny" }, "outputContract": "implementer" },
|
|
31
|
+
"senior-implementer": { "role": "implementer", "domains": ["*"], "description": "Handle high-risk or persistent remediation that defeated cheaper workers. Re-evaluate local design assumptions against sealed requirements, make the smallest architecture-consistent correction and leave a clear validation trail.", "execution": { "model": "@brain" }, "skills": ["verification-planning", "simplify", "recovery-classifier"], "permissions": { "read": "allow", "write": "allow", "shell": "allow", "network": "ask", "delegate": "deny", "gitWrite": "deny" }, "outputContract": "implementer" },
|
|
32
|
+
|
|
33
|
+
"code-quality-reviewer": { "role": "reviewer", "domains": ["*"], "description": "Review the diff for correctness, maintainability, unnecessary complexity, error handling and regression risk. Findings must be concrete, evidenced and actionable; avoid style-only noise already enforced by deterministic tooling.", "execution": { "model": "@workhorse" }, "skills": ["finding-dedup", "simplify"], "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "deny", "review": "allow", "gitWrite": "deny" }, "outputContract": "reviewer" },
|
|
34
|
+
"requirements-reviewer": { "role": "reviewer", "domains": ["requirements", "acceptance", "*"], "description": "Trace implemented behavior back to sealed requirements and acceptance criteria. Flag missing, partial or contradictory coverage and distinguish product ambiguity from ordinary implementation defects.", "execution": { "model": "@brain" }, "skills": ["acceptance-traceability"], "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "deny", "review": "allow", "gitWrite": "deny" }, "outputContract": "reviewer" },
|
|
35
|
+
"architecture-reviewer": { "role": "reviewer", "domains": ["architecture"], "description": "Review dependency direction, module boundaries, coupling, layering and architectural invariants. Use actual structural evidence; do not invent a redesign when the requested change is consistent with existing architecture.", "execution": { "model": "@brain" }, "skills": ["acceptance-traceability"], "mcps": ["context7"], "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "ask", "review": "allow", "gitWrite": "deny" }, "outputContract": "reviewer" },
|
|
36
|
+
"security-reviewer": { "role": "reviewer", "domains": ["security", "authentication", "authorization", "auth"], "description": "Review trust boundaries, authentication/authorization, tenant or resource isolation, secrets, injection, unsafe deserialization and privilege changes. Prioritize exploitable evidence and concrete attack paths over speculative checklists.", "execution": { "model": "@brain" }, "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "deny", "review": "allow", "gitWrite": "deny" }, "outputContract": "reviewer" },
|
|
37
|
+
"api-reviewer": { "role": "reviewer", "domains": ["api", "contract"], "description": "Review API compatibility, request/response semantics, validation, error models, versioning and contract drift. Flag undocumented breaking changes and mismatches between implementation, generated schemas and consumers.", "execution": { "model": "@workhorse" }, "mcps": ["context7"], "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "ask", "review": "allow", "gitWrite": "deny" }, "outputContract": "reviewer" },
|
|
38
|
+
"backend-reviewer": { "role": "reviewer", "domains": ["backend", "server", "services"], "description": "Review server-side correctness, domain boundaries, transactions, concurrency, error handling and integration behavior. Require evidence tied to changed code and tests.", "execution": { "model": "@workhorse" }, "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "deny", "review": "allow", "gitWrite": "deny" }, "outputContract": "reviewer" },
|
|
39
|
+
"frontend-reviewer": { "role": "reviewer", "domains": ["frontend", "web", "ui", "ux"], "description": "Review user-visible behavior, state consistency, loading/error paths, accessibility, routing and client/API integration. Prefer reproducible UI or browser evidence for behavioral findings.", "execution": { "model": "@workhorse" }, "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "deny", "review": "allow", "gitWrite": "deny" }, "outputContract": "reviewer" },
|
|
40
|
+
"data-reviewer": { "role": "reviewer", "domains": ["data", "database", "schema", "migration", "persistence"], "description": "Review schema safety, migration ordering, data invariants, query behavior, indexing implications and transactional consistency. Treat irreversible/destructive migration risk explicitly.", "execution": { "model": "@workhorse" }, "mcps": ["context7"], "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "ask", "review": "allow", "gitWrite": "deny" }, "outputContract": "reviewer" },
|
|
41
|
+
"mobile-reviewer": { "role": "reviewer", "domains": ["mobile", "ios", "android", "react-native"], "description": "Review mobile navigation, platform behavior, lifecycle/state, offline/error paths, accessibility and API integration. Account for platform-specific regressions rather than treating mobile as a web viewport.", "execution": { "model": "@workhorse" }, "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "deny", "review": "allow", "gitWrite": "deny" }, "outputContract": "reviewer" },
|
|
42
|
+
"test-reviewer": { "role": "reviewer", "domains": ["test", "tests", "testing", "e2e"], "description": "Review whether tests prove the intended behavior, catch the regression, cover meaningful edges and avoid brittle implementation coupling. Flag missing validation, vacuous assertions and false-positive test structure.", "execution": { "model": "@workhorse" }, "skills": ["acceptance-traceability", "verification-planning"], "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "deny", "review": "allow", "validate": "allow", "gitWrite": "deny" }, "outputContract": "reviewer" },
|
|
43
|
+
"docs-reviewer": { "role": "reviewer", "domains": ["docs", "documentation"], "description": "Review documentation for factual consistency with the resulting code, commands and configuration. Flag stale examples, missing operational caveats and misleading migration guidance.", "execution": { "model": "@workhorse" }, "skills": ["prompt-drift-audit"], "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "deny", "review": "allow", "gitWrite": "deny" }, "outputContract": "reviewer" },
|
|
44
|
+
"ops-reviewer": { "role": "reviewer", "domains": ["ops", "devops", "ci", "cd", "docker", "deployment", "infrastructure", "delivery"], "description": "Review build, CI/CD, deployment and container changes for reproducibility, least privilege, secret handling, caching correctness and rollback/operability risk.", "execution": { "model": "@workhorse" }, "skills": ["github-delivery-lifecycle", "worktree-lifecycle"], "mcps": ["context7"], "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "ask", "review": "allow", "gitWrite": "deny" }, "outputContract": "reviewer" },
|
|
45
|
+
|
|
46
|
+
"validator": { "role": "validator", "domains": ["*"], "description": "Execute or interpret deterministic project validation without modifying source. Report exact commands, exit codes and evidence; never convert a failed deterministic gate into a semantic pass.", "execution": { "model": "@workhorse" }, "skills": ["deterministic-validation", "verification-planning"], "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "deny", "validate": "allow", "gitWrite": "deny" }, "outputContract": "validator" },
|
|
47
|
+
"integration-validator": { "role": "validator", "domains": ["integration"], "description": "Validate the integrated change after implementation streams converge. Check cross-module/API/data interactions, disclose command evidence and identify the owning remediation agent for any actionable integration failure.", "execution": { "model": "@workhorse" }, "skills": ["acceptance-traceability", "finding-dedup", "prompt-drift-audit", "verification-planning"], "mcps": ["context7"], "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "ask", "validate": "allow", "review": "allow", "gitWrite": "deny" }, "outputContract": "validator" },
|
|
48
|
+
"e2e-validator": { "role": "validator", "domains": ["e2e", "browser", "journey"], "description": "Validate end-to-end behavior through the project's actual E2E tooling. Focus on observable user/system journeys, capture failing evidence and avoid substituting manual reasoning for runnable checks.", "execution": { "model": "@workhorse" }, "skills": ["verification-planning", "acceptance-traceability"], "mcps": ["playwright"], "permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "ask", "validate": "allow", "review": "allow", "gitWrite": "deny" }, "outputContract": "validator" }
|
|
49
|
+
},
|
|
50
|
+
"profiles": {
|
|
51
|
+
"economy": { "description": "Use the workhorse aggressively; keep only control/escalation roles on the brain model.", "agents": { "*-reviewer": { "execution": { "model": "@workhorse" } }, "lead": { "execution": { "model": "@brain" } }, "planner": { "execution": { "model": "@brain" } }, "oracle": { "execution": { "model": "@brain" } }, "senior-implementer": { "execution": { "model": "@brain" } } } },
|
|
52
|
+
"balanced": { "description": "Use the workhorse for bounded work/review and the brain for planning, architecture, security, requirements and escalation.", "agents": { "*-reviewer": { "execution": { "model": "@workhorse" } }, "architecture-reviewer": { "execution": { "model": "@brain" } }, "security-reviewer": { "execution": { "model": "@brain" } }, "requirements-reviewer": { "execution": { "model": "@brain" } }, "lead": { "execution": { "model": "@brain" } }, "planner": { "execution": { "model": "@brain" } }, "oracle": { "execution": { "model": "@brain" } }, "senior-implementer": { "execution": { "model": "@brain" } } } },
|
|
53
|
+
"maximum-quality": { "description": "Run all semantic reviewers on the brain while bounded implementation remains on the workhorse until escalation is needed.", "agents": { "*-reviewer": { "execution": { "model": "@brain" } }, "designer": { "execution": { "model": "@brain" } }, "lead": { "execution": { "model": "@brain" } }, "planner": { "execution": { "model": "@brain" } }, "oracle": { "execution": { "model": "@brain" } }, "senior-implementer": { "execution": { "model": "@brain" } } } }
|
|
54
|
+
},
|
|
55
|
+
"routing": [
|
|
56
|
+
{ "id": "backend", "priority": 60, "when": { "intent": "implement", "domains": ["backend", "server", "services"] }, "use": "backend-implementer", "reviewers": ["backend-reviewer"] },
|
|
57
|
+
{ "id": "frontend", "priority": 60, "when": { "intent": "implement", "domains": ["frontend", "web", "ui", "ux"] }, "use": "frontend-implementer", "reviewers": ["frontend-reviewer"] },
|
|
58
|
+
{ "id": "design-review", "priority": 48, "when": { "intent": "implement", "domains": ["ui", "ux", "design"] }, "reviewers": ["designer"] },
|
|
59
|
+
{ "id": "data", "priority": 60, "when": { "intent": "implement", "domains": ["data", "database", "schema", "migration", "persistence"] }, "use": "data-implementer", "reviewers": ["data-reviewer"] },
|
|
60
|
+
{ "id": "mobile", "priority": 60, "when": { "intent": "implement", "domains": ["mobile", "ios", "android", "react-native"] }, "use": "mobile-implementer", "reviewers": ["mobile-reviewer"] },
|
|
61
|
+
{ "id": "tests", "priority": 60, "when": { "intent": "implement", "domains": ["test", "tests", "testing", "e2e"] }, "use": "test-implementer", "reviewers": ["test-reviewer"] },
|
|
62
|
+
{ "id": "docs", "priority": 60, "when": { "intent": "implement", "domains": ["docs", "documentation"] }, "use": "docs-implementer", "reviewers": ["docs-reviewer"] },
|
|
63
|
+
{ "id": "ops", "priority": 60, "when": { "intent": "implement", "domains": ["ops", "devops", "ci", "cd", "docker", "deployment", "infrastructure", "delivery"] }, "use": "ops-implementer", "reviewers": ["ops-reviewer"] },
|
|
64
|
+
{ "id": "api-review", "priority": 45, "when": { "intent": "implement", "domains": ["api", "contract"] }, "reviewers": ["api-reviewer"] },
|
|
65
|
+
{ "id": "security-review", "priority": 50, "when": { "intent": "implement", "domains": ["security", "authentication", "authorization", "auth"] }, "reviewers": ["security-reviewer"] },
|
|
66
|
+
{ "id": "architecture-review", "priority": 40, "when": { "intent": "implement", "domains": ["architecture"] }, "reviewers": ["architecture-reviewer"] },
|
|
67
|
+
{ "id": "high-risk-review", "priority": 35, "when": { "intent": "implement", "risk": "high" }, "reviewers": ["architecture-reviewer", "requirements-reviewer"] },
|
|
68
|
+
{ "id": "default-implementation", "priority": 0, "when": { "intent": "implement" }, "use": "implementation-worker", "reviewers": ["code-quality-reviewer", "requirements-reviewer"], "validators": ["validator"] }
|
|
69
|
+
],
|
|
70
|
+
"recovery": {
|
|
71
|
+
"PATCH_CONTEXT_MISMATCH": [{ "action": "same-agent" }, { "action": "agent", "agent": "quality-implementer" }, { "action": "lead" }],
|
|
72
|
+
"TOOL_FAILURE": [{ "action": "same-agent" }, { "action": "agent", "agent": "quality-implementer" }, { "action": "lead" }],
|
|
73
|
+
"MISSING_CONTEXT": [{ "action": "same-agent" }, { "action": "lead" }],
|
|
74
|
+
"WRONG_AGENT": [{ "action": "reroute" }, { "action": "lead" }],
|
|
75
|
+
"VALIDATION_FAILURE": [{ "action": "same-agent" }, { "action": "agent", "agent": "quality-implementer" }, { "action": "agent", "agent": "senior-implementer" }],
|
|
76
|
+
"REVIEW_FAILURE": [{ "action": "agent", "agent": "quality-implementer" }, { "action": "agent", "agent": "senior-implementer" }, { "action": "lead" }],
|
|
77
|
+
"AMBIGUOUS_OUTPUT": [{ "action": "same-agent" }, { "action": "lead" }],
|
|
78
|
+
"CONFLICTING_RESULTS": [{ "action": "agent", "agent": "oracle" }, { "action": "lead" }]
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"Planner output","type":"object","required":["tasks"],"properties":{"tasks":{"type":"array","items":{"type":"object","required":["id","summary","agent","scope","dependencies","acceptance","risk"],"properties":{"id":{"type":"string"},"summary":{"type":"string"},"agent":{"type":"string"},"scope":{"type":"array","items":{"type":"string"}},"dependencies":{"type":"array","items":{"type":"string"}},"acceptance":{"type":"array","minItems":1,"items":{"type":"string"}},"risk":{"enum":["low","medium","high"]}}}}}}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/JamesMorales04/agentic-engineering-harness/schemas/agent-topology.schema.json",
|
|
4
|
+
"title": "Agentic Engineering Harness Agent Topology Layer",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["version"],
|
|
7
|
+
"anyOf": [
|
|
8
|
+
{ "required": ["extends"] },
|
|
9
|
+
{ "required": ["runtimes", "models", "agents"] }
|
|
10
|
+
],
|
|
11
|
+
"properties": {
|
|
12
|
+
"version": { "const": 1 },
|
|
13
|
+
"extends": { "type": "array", "items": { "type": "string", "minLength": 1 } },
|
|
14
|
+
"activeProfile": { "type": "string" },
|
|
15
|
+
"skillRoots": { "type": "array", "items": { "type": "string" } },
|
|
16
|
+
"runtimes": { "type": "object", "additionalProperties": { "type": "object" } },
|
|
17
|
+
"models": { "type": "object", "additionalProperties": { "type": "object" } },
|
|
18
|
+
"agents": { "type": "object", "additionalProperties": { "type": "object" } },
|
|
19
|
+
"profiles": { "type": "object" },
|
|
20
|
+
"routing": { "type": "array", "items": { "type": "object", "required": ["id", "when"] } },
|
|
21
|
+
"recovery": { "type": "object" },
|
|
22
|
+
"councils": { "type": "object" },
|
|
23
|
+
"remove": {
|
|
24
|
+
"type": "object",
|
|
25
|
+
"properties": {
|
|
26
|
+
"runtimes": { "type": "array", "items": { "type": "string" } },
|
|
27
|
+
"models": { "type": "array", "items": { "type": "string" } },
|
|
28
|
+
"agents": { "type": "array", "items": { "type": "string" } },
|
|
29
|
+
"profiles": { "type": "array", "items": { "type": "string" } },
|
|
30
|
+
"routing": { "type": "array", "items": { "type": "string" } },
|
|
31
|
+
"councils": { "type": "array", "items": { "type": "string" } }
|
|
32
|
+
},
|
|
33
|
+
"additionalProperties": false
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"additionalProperties": false
|
|
37
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/JamesMorales04/agentic-engineering-harness/schemas/project.schema.json",
|
|
4
|
+
"title": "Agentic Engineering Harness project configuration",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["version", "project"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"version": { "const": 1 },
|
|
9
|
+
"project": { "type": "object", "required": ["name"], "properties": { "name": { "type": "string", "minLength": 1 } } },
|
|
10
|
+
"agents": { "type": "object", "properties": { "configPath": { "type": "string" }, "generatedPath": { "type": "string" }, "activeProfile": { "type": "string" }, "required": { "type": "boolean" }, "findingsDir": { "type": "string" } } },
|
|
11
|
+
"workflow": { "type": "object", "properties": {
|
|
12
|
+
"quick": { "type": "object", "properties": { "maxFiles": { "type": "integer", "minimum": 1 }, "disallowedDomains": { "type": "array", "items": { "type": "string" } } } },
|
|
13
|
+
"issueIntake": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "snapshotDir": { "type": "string" }, "verifyDriftOnRun": { "type": "boolean" }, "requireOpen": { "type": "boolean" }, "plannerAgent": { "type": "string", "minLength": 1 }, "autoHandoff": { "type": "boolean" } } },
|
|
14
|
+
"reviews": { "type": "object", "properties": {
|
|
15
|
+
"enabled": { "type": "boolean" }, "reviewQuick": { "type": "boolean" }, "leadAcceptance": { "type": "boolean" }, "leadAcceptanceQuick": { "type": "boolean" },
|
|
16
|
+
"maxRemediationRounds": { "type": "integer", "minimum": 0, "deprecated": true },
|
|
17
|
+
"blockingSeverities": { "type": "array", "deprecated": true, "items": { "enum": ["critical", "high", "medium", "low", "note"] } },
|
|
18
|
+
"quality": { "type": "object", "properties": { "severityPoints": { "$ref": "#/$defs/severityNumbers" } } },
|
|
19
|
+
"convergence": { "type": "object", "properties": { "minimumDebtPointImprovement": { "type": "integer", "minimum": 0 }, "stagnationWindow": { "type": "integer", "minimum": 1 }, "cycleDetection": { "type": "boolean" }, "regressionDetection": { "type": "boolean" } } },
|
|
20
|
+
"finalQualityGate": { "type": "object", "properties": { "maxBySeverity": { "$ref": "#/$defs/severityNumbers" }, "maxDebtPoints": { "type": "integer", "minimum": 0 } } },
|
|
21
|
+
"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
|
+
} }
|
|
23
|
+
} },
|
|
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" } } } } },
|
|
25
|
+
"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 } } }
|
|
31
|
+
} },
|
|
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" }
|
|
33
|
+
},
|
|
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
|
+
"additionalProperties": false
|
|
36
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "Agentic Engineering Harness QuickContract",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"required": ["version", "mode", "task", "quick", "scope", "routing", "constraints"],
|
|
6
|
+
"properties": {
|
|
7
|
+
"version": { "const": 1 },
|
|
8
|
+
"mode": { "const": "quick" },
|
|
9
|
+
"task": { "type": "object", "required": ["id", "title"], "properties": { "id": { "type": "string", "minLength": 1 }, "title": { "type": "string", "minLength": 1 } } },
|
|
10
|
+
"quick": { "type": "object", "required": ["request", "acceptance", "triage"], "properties": { "request": { "type": "string", "minLength": 1 }, "acceptance": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }, "triage": { "type": "object" } } },
|
|
11
|
+
"scope": { "type": "object", "required": ["allowed"], "properties": { "allowed": { "type": "array", "minItems": 1, "items": { "type": "string" } }, "forbidden": { "type": "array", "items": { "type": "string" } }, "frozen": { "type": "array", "items": { "type": "string" } } } },
|
|
12
|
+
"routing": { "type": "object" },
|
|
13
|
+
"constraints": { "type": "object", "properties": { "breakingApiChanges": { "const": false }, "newDependencies": { "const": false }, "schemaChanges": { "const": false } } },
|
|
14
|
+
"repair": { "type": "object" },
|
|
15
|
+
"verification": { "type": "object" }
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "Agentic Engineering Harness TaskContract",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"required": ["version", "task"],
|
|
6
|
+
"properties": {
|
|
7
|
+
"version": { "const": 1 },
|
|
8
|
+
"mode": { "enum": ["spec", "quick"] },
|
|
9
|
+
"task": { "type": "object", "required": ["id", "title"], "properties": { "id": { "type": "string" }, "title": { "type": "string" } } },
|
|
10
|
+
"quick": { "type": "object", "properties": { "request": { "type": "string" }, "acceptance": { "type": "array", "items": { "type": "string" } }, "triage": { "type": "object" } } },
|
|
11
|
+
"source": { "type": "object", "properties": { "proposal": { "type": "string" }, "spec": { "type": "string" }, "design": { "type": "string" }, "tasks": { "type": "string" }, "acceptance": { "type": "string" }, "issue": { "type": "string" } } },
|
|
12
|
+
"issue": { "type": "object", "required": ["provider", "repository", "number", "url", "state", "fetchedAt", "updatedAt", "contentSha256", "snapshotPath"], "properties": { "provider": { "const": "github" }, "repository": { "type": "string", "pattern": "^[^/]+/[^/]+$" }, "number": { "type": "integer", "minimum": 1 }, "url": { "type": "string", "format": "uri" }, "state": { "type": "string" }, "fetchedAt": { "type": "string" }, "updatedAt": { "type": "string" }, "contentSha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, "snapshotPath": { "type": "string" } } },
|
|
13
|
+
"git": { "type": "object", "properties": { "baseRef": { "type": "string" }, "originatingBranch": { "type": "string" } } },
|
|
14
|
+
"scope": { "type": "object" },
|
|
15
|
+
"routing": { "type": "object", "properties": { "intent": { "type": "string" }, "domains": { "type": "array", "items": { "type": "string" } }, "risk": { "enum": ["low", "medium", "high"] }, "agent": { "type": "string" }, "reviewers": { "type": "array", "items": { "type": "string" } }, "profile": { "type": "string" } } },
|
|
16
|
+
"requirements": { "type": "array" }, "constraints": { "type": "object" }, "impact": { "type": "object" }, "repair": { "type": "object" }, "verification": { "type": "object" }
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/JamesMorales04/agentic-engineering-harness/schemas/toolchain.schema.json",
|
|
4
|
+
"title": "Agentic Engineering Harness toolchain",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["version", "manager", "tools"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"version": { "const": 1 },
|
|
9
|
+
"manager": {
|
|
10
|
+
"type": "object",
|
|
11
|
+
"required": ["provider"],
|
|
12
|
+
"properties": {
|
|
13
|
+
"provider": { "type": "string", "minLength": 1 },
|
|
14
|
+
"generatedConfig": { "type": "string" },
|
|
15
|
+
"lockFile": { "type": "string" },
|
|
16
|
+
"stateFile": { "type": "string" },
|
|
17
|
+
"minimumVersion": { "type": "string" }
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"strategy": {
|
|
21
|
+
"type": "object",
|
|
22
|
+
"properties": {
|
|
23
|
+
"validators": { "enum": ["local", "prefer-container"] },
|
|
24
|
+
"containerEngine": { "type": "string", "minLength": 1 }
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"profiles": {
|
|
28
|
+
"type": "object",
|
|
29
|
+
"additionalProperties": {
|
|
30
|
+
"type": "object",
|
|
31
|
+
"properties": {
|
|
32
|
+
"extends": { "type": "array", "items": { "type": "string" } },
|
|
33
|
+
"tools": { "type": "array", "items": { "type": "string" } }
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"tools": {
|
|
38
|
+
"type": "object",
|
|
39
|
+
"additionalProperties": {
|
|
40
|
+
"type": "object",
|
|
41
|
+
"required": ["kind", "command"],
|
|
42
|
+
"properties": {
|
|
43
|
+
"kind": { "enum": ["system", "mise"] },
|
|
44
|
+
"command": { "type": "string", "minLength": 1 },
|
|
45
|
+
"source": { "type": "string", "minLength": 1 },
|
|
46
|
+
"version": { "type": "string", "minLength": 1 },
|
|
47
|
+
"required": { "type": "boolean" },
|
|
48
|
+
"dependsOn": { "type": "array", "items": { "type": "string" } },
|
|
49
|
+
"activateWhen": { "type": "array", "items": { "type": "string" } },
|
|
50
|
+
"container": {
|
|
51
|
+
"type": "object",
|
|
52
|
+
"required": ["image"],
|
|
53
|
+
"properties": {
|
|
54
|
+
"image": { "type": "string", "minLength": 1 },
|
|
55
|
+
"engine": { "type": "string", "minLength": 1 }
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"projectDependencies": {
|
|
62
|
+
"type": "object",
|
|
63
|
+
"properties": {
|
|
64
|
+
"autoDetect": { "type": "boolean" },
|
|
65
|
+
"commands": { "type": "array", "items": { "type": "string", "minLength": 1 } }
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"additionalProperties": false
|
|
70
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://example.local/schemas/validation-report.schema.json",
|
|
4
|
+
"title": "Deterministic Validation Report",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["version", "taskId", "status", "checks", "changedFiles"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"version": { "const": 1 },
|
|
9
|
+
"taskId": { "type": "string" },
|
|
10
|
+
"status": { "enum": ["PASS", "FAIL"] },
|
|
11
|
+
"checks": { "type": "array" },
|
|
12
|
+
"changedFiles": { "type": "array", "items": { "type": "string" } }
|
|
13
|
+
},
|
|
14
|
+
"additionalProperties": true
|
|
15
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: acceptance-traceability
|
|
3
|
+
description: Trace sealed acceptance criteria to implementation and executable evidence.
|
|
4
|
+
license: Apache-2.0
|
|
5
|
+
---
|
|
6
|
+
# Acceptance Traceability
|
|
7
|
+
|
|
8
|
+
For every requirement/criterion, locate:
|
|
9
|
+
1. implementation evidence,
|
|
10
|
+
2. test/validator evidence,
|
|
11
|
+
3. runtime or contract evidence when applicable.
|
|
12
|
+
|
|
13
|
+
Classify each criterion as COVERED, PARTIALLY_COVERED, NOT_VALIDATED or NOT_COVERED. Cite files/commands rather than relying on summaries. A passing unrelated test does not satisfy traceability. Never rewrite the criterion from implementation behavior.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deterministic-validation
|
|
3
|
+
purpose: Treat executable gates as authoritative over LLM self-assessment.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Deterministic Validation
|
|
7
|
+
|
|
8
|
+
Run `engineering-harness verify <TASK-ID>` after implementation.
|
|
9
|
+
|
|
10
|
+
Interpretation:
|
|
11
|
+
|
|
12
|
+
- Any `FAIL` blocks acceptance.
|
|
13
|
+
- `WARN` requires lead-agent consideration but does not automatically block.
|
|
14
|
+
- A worker's claim that tests pass is not evidence; the generated validation report is evidence.
|
|
15
|
+
- Never weaken frozen validation artifacts to turn a failing result into PASS.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
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.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Engineering Workflow
|
|
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.
|
|
55
|
+
|
|
56
|
+
## QUICK path
|
|
57
|
+
|
|
58
|
+
Use QUICK only when the Harness returns QUICK.
|
|
59
|
+
|
|
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.
|
|
67
|
+
|
|
68
|
+
## SPEC path
|
|
69
|
+
|
|
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.
|
|
76
|
+
|
|
77
|
+
## Quality convergence
|
|
78
|
+
|
|
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.
|
|
80
|
+
|
|
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.
|
|
82
|
+
|
|
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.
|
|
84
|
+
|
|
85
|
+
## Human-on-exception
|
|
86
|
+
|
|
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:
|
|
88
|
+
|
|
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.
|
|
93
|
+
|
|
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.
|
|
95
|
+
|
|
96
|
+
## Triage escalation rules
|
|
97
|
+
|
|
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.
|
|
99
|
+
|
|
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.
|
|
101
|
+
|
|
102
|
+
## Mobile/Paseo behavior
|
|
103
|
+
|
|
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.
|
|
105
|
+
|
|
106
|
+
## Self-modification
|
|
107
|
+
|
|
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.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: finding-dedup
|
|
3
|
+
description: Normalize and consolidate reviewer findings before remediation.
|
|
4
|
+
license: Apache-2.0
|
|
5
|
+
---
|
|
6
|
+
# Finding Deduplication
|
|
7
|
+
|
|
8
|
+
Represent findings with severity, category, location, evidence, impact, recommended fix and owning agent.
|
|
9
|
+
|
|
10
|
+
Treat findings as likely duplicates when they target the same path, overlapping lines/behavior, category and remediation. Preserve the strongest evidence/severity and union useful context. Keep distinct findings separate when their root cause or fix differs.
|
|
11
|
+
|
|
12
|
+
Do not discard a finding merely because another reviewer did not mention it.
|