From 4576a03c5ac54a09fb2dd6cf002759ef51750ee8 Mon Sep 17 00:00:00 2001 From: Sebastian Spicker Date: Sun, 9 Aug 2026 17:55:16 +0200 Subject: [PATCH 1/3] chore: capture imported working state --- .stylelintrc.json | 22 + AGENTS.md | 78 ++ DESIGN.md | 19 + PRODUCT.md | 34 + README.md | 85 +- RELEASE_STATUS.md | 184 ++-- SECURITY.md | 55 +- TESTING.md | 36 +- docs/INDEX.md | 6 +- .../diagrams/diamond-versus-pipeline.svg | 15 + .../diagrams/graph-edge-classification.svg | 18 + .../human-activated-workflow-lifecycle.svg | 13 + docs/assets/diagrams/routing-and-quorum.svg | 14 + .../assets/diagrams/until-dry-convergence.svg | 12 + docs/assets/screenshots/rae-agent-safety.svg | 82 +- docs/assets/screenshots/rae-cli.svg | 88 +- docs/how-to/deploy-experimental-platform.md | 69 ++ docs/how-to/hosted-api.md | 79 ++ docs/how-to/recover-workflow-v2.2-wait.md | 43 + docs/how-to/run-workflow-v2.2-wait.md | 66 ++ .../test-experimental-hosted-platform.md | 46 + .../experimental-hosted-platform.md | 81 ++ .../reference/architecture/system-overview.md | 9 + docs/reference/claims/bibliography.md | 85 +- docs/reference/claims/claims-ledger.md | 3 + docs/reference/claims/evidence-index.md | 15 + docs/reference/cli/umbrella.md | 92 +- docs/reference/contracts/artifact-schemas.md | 16 + .../contracts/execution-profile-v3.md | 79 ++ docs/reference/contracts/graph-memory.md | 188 ++++ docs/reference/contracts/workflow-v2.2.md | 65 ++ docs/reference/terminology.md | 16 +- docs/tutorials/autonomous-code-change.md | 7 + docs/tutorials/graph-engineering-with-rae.md | 305 +++++++ evals/README.md | 8 + .../autonomous-policy-improvement.v2.json | 63 ++ .../autonomous-policy.experimental.json | 5 + evals/datasets/graph-context/README.md | 24 + .../graph-context/graph-context-held-out.json | 59 ++ evals/harness/run-local.sh | 5 + .../schemas/improvement-campaign.schema.json | 18 + evals/scripts/improve_harness.py | 26 + evals/scripts/lib/outcome_eval.py | 5 + .../lib/policy_improvement_campaign.py | 31 + evals/scripts/lib/policy_optimizer.py | 124 ++- evals/scripts/lib/policy_optimizer_policy.py | 39 +- evals/scripts/lib/release_gate_core.py | 484 ++-------- evals/scripts/lib/release_gate_evidence.py | 345 +++++++ evals/scripts/lib/release_gate_resources.py | 77 ++ evals/scripts/lib/run_benchmark_artifacts.py | 288 ++++++ evals/scripts/lib/run_benchmark_report.py | 382 ++------ evals/scripts/optimize_harness.py | 1 + evals/tests/outcome_optimizer_helpers.py | 1 + .../tests/test_benchmark_contracts_core_d.py | 32 + .../tests/test_policy_optimizer_contracts.py | 116 +++ mkdocs.yml | 10 + packages/loops/ralph/scripts/ralph_fs_txn.py | 40 +- packages/orchestration/README.md | 137 ++- .../artifacts/execution-trace.schema.json | 35 +- .../contracts/graph/graph-context.schema.json | 20 + .../contracts/graph/graph-edge.schema.json | 27 + .../graph/graph-manifest.schema.json | 23 + .../contracts/graph/graph-node.schema.json | 25 + .../graph/memory-decision.schema.json | 19 + .../execution-profile-v1.schema.json | 30 + .../execution-profile-v2.schema.json | 92 ++ .../execution-profile-v3.schema.json | 69 ++ .../workflows/node-envelope-v2.1.schema.json | 35 + .../workflows/node-envelope-v2.2.schema.json | 42 + .../workflows/node-envelope-v2.schema.json | 26 + .../workflows/workflow-v2.1.schema.json | 122 +++ .../workflows/workflow-v2.2.schema.json | 69 ++ .../workflows/workflow-v2.schema.json | 75 ++ packages/orchestration/docs/ROADMAP.md | 18 +- packages/orchestration/operator/README.md | 86 +- .../screenshots/evidence-dossier-desktop.png | Bin 166736 -> 228916 bytes .../screenshots/evidence-dossier-mobile.png | Bin 96701 -> 83272 bytes .../orchestration/operator/lib/control.mjs | 13 +- .../orchestration/operator/lib/profiles.mjs | 86 ++ .../orchestration/operator/lib/proposals.mjs | 135 +++ .../orchestration/operator/lib/remote.mjs | 324 +++++++ packages/orchestration/operator/lib/runs.mjs | 101 ++ .../orchestration/operator/lib/workflows.mjs | 79 ++ .../scripts/capture-docs-screenshots.mjs | 387 ++++++++ packages/orchestration/operator/server.mjs | 272 +++++- packages/orchestration/operator/static/app.js | 2 + .../operator/static/css/shell.css | 16 + .../operator/static/css/workflows.css | 46 + .../orchestration/operator/static/index.html | 85 +- .../orchestration/operator/static/js/data.js | 27 + .../operator/static/js/handlers.js | 8 +- .../orchestration/operator/static/js/state.js | 69 ++ .../operator/static/js/workflows.js | 864 ++++++++++++++++++ .../orchestration/operator/static/styles.css | 1 + .../operator/tests/control.test.mjs | 33 + .../operator/tests/proposals.test.mjs | 37 + .../operator/tests/remote.test.mjs | 192 ++++ .../operator/tests/runs.test.mjs | 60 ++ .../operator/tests/server.test.mjs | 378 +++++++- .../operator/tests/ui-contract.test.mjs | 65 ++ packages/orchestration/package-lock.json | 12 +- packages/orchestration/package.json | 5 +- packages/orchestration/platform/Dockerfile | 16 + packages/orchestration/platform/README.md | 79 ++ .../platform/bin/rae-platform-worker.mjs | 53 ++ .../platform/bin/rae-platform.mjs | 92 ++ packages/orchestration/platform/compose.yaml | 45 + .../orchestration/platform/dev/platform.toml | 21 + .../platform/dev/projects.toml.example | 4 + .../platform/migrations/001_initial.sql | 100 ++ .../migrations/002_artifact_fencing.sql | 3 + .../platform/migrations/003_hosted_v2.sql | 22 + packages/orchestration/platform/package.json | 31 + .../orchestration/platform/src/artifacts.mjs | 120 +++ packages/orchestration/platform/src/auth.mjs | 58 ++ .../platform/src/authorization.mjs | 38 + .../orchestration/platform/src/config.mjs | 115 +++ packages/orchestration/platform/src/http.mjs | 396 ++++++++ .../platform/src/local-executor.mjs | 184 ++++ packages/orchestration/platform/src/mcp.mjs | 157 ++++ .../platform/src/observability.mjs | 100 ++ .../platform/src/project-map.mjs | 78 ++ packages/orchestration/platform/src/store.mjs | 862 +++++++++++++++++ .../orchestration/platform/src/worker.mjs | 147 +++ .../platform/test/platform.test.mjs | 356 ++++++++ .../scripts/eval/graph-context-benchmark.mjs | 221 +++++ .../eval/workflow-topology-benchmark.mjs | 89 ++ .../scripts/pipeline/autonomous.mjs | 83 +- .../scripts/pipeline/graph-cli.mjs | 379 ++++++++ .../scripts/pipeline/lib/agent-executor.mjs | 207 ++++- .../scripts/pipeline/lib/artifacts.mjs | 119 ++- .../pipeline/lib/autonomous-actions.mjs | 593 ++++++++---- .../scripts/pipeline/lib/autonomous-git.mjs | 77 +- .../pipeline/lib/autonomous-lifecycle.mjs | 281 +++++- .../lib/autonomous-phase-contract.mjs | 13 +- .../pipeline/lib/codex-capabilities.mjs | 196 ++++ .../scripts/pipeline/lib/commands.mjs | 129 +-- .../pipeline/lib/execution-profile.mjs | 209 +++++ .../scripts/pipeline/lib/gates.mjs | 229 +++-- .../scripts/pipeline/lib/graph.mjs | 19 + .../scripts/pipeline/lib/graph/artifacts.mjs | 603 ++++++++++++ .../scripts/pipeline/lib/graph/core.mjs | 325 +++++++ .../scripts/pipeline/lib/graph/memory.mjs | 392 ++++++++ .../scripts/pipeline/lib/graph/projection.mjs | 124 +++ .../scripts/pipeline/lib/graph/query.mjs | 425 +++++++++ .../scripts/pipeline/lib/graph/repository.mjs | 282 ++++++ .../scripts/pipeline/lib/graph/validation.mjs | 132 +++ .../scripts/pipeline/lib/opencode-adapter.mjs | 693 ++++++++++++++ .../scripts/pipeline/lib/phase-executor.mjs | 100 +- .../pipeline/lib/run-report-writer.mjs | 72 +- .../scripts/pipeline/lib/runner-helpers-b.mjs | 278 +++--- .../pipeline/lib/runtime-state-guard.mjs | 112 ++- .../pipeline/lib/traceability-coverage.mjs | 252 +++++ .../scripts/pipeline/lib/traceability.mjs | 470 +++------- .../pipeline/lib/verification-broker.mjs | 288 ++++++ .../pipeline/lib/workflow-context-v22.mjs | 272 ++++++ .../pipeline/lib/workflow-contract.mjs | 593 ++++++++++++ .../pipeline/lib/workflow-designer.mjs | 693 ++++++++++++++ .../pipeline/lib/workflow-envelope.mjs | 31 + .../pipeline/lib/workflow-proposal.mjs | 196 ++++ .../pipeline/lib/workflow-registry.mjs | 361 ++++++++ .../scripts/pipeline/lib/workflow-runtime.mjs | 442 +++++++++ .../lib/workflow-scheduler-v21-support.mjs | 100 ++ .../pipeline/lib/workflow-scheduler-v21.mjs | 519 +++++++++++ .../pipeline/lib/workflow-scheduler-v22.mjs | 391 ++++++++ .../pipeline/lib/workflow-scheduler.mjs | 391 ++++++++ .../pipeline/lib/workflow-transforms.mjs | 110 +++ .../pipeline/lib/workflow-v22-reducer.mjs | 201 ++++ .../pipeline/tests/agent-executor.test.mjs | 162 +++- .../tests/autonomous-core-scenarios.test.mjs | 68 +- .../pipeline/tests/autonomous-git.test.mjs | 124 +++ .../tests/execution-profile-v3.test.mjs | 76 ++ .../tests/fixtures/fake-workflow-agent.mjs | 10 + .../scripts/pipeline/tests/graph.test.mjs | 378 ++++++++ .../pipeline/tests/opencode-adapter.test.mjs | 201 ++++ .../tests/verification-broker.test.mjs | 107 +++ .../pipeline/tests/workflow-designer.test.mjs | 103 +++ .../workflow-topology-benchmark.test.mjs | 69 ++ .../pipeline/tests/workflow-v2.test.mjs | 286 ++++++ .../pipeline/tests/workflow-v21.test.mjs | 573 ++++++++++++ .../pipeline/tests/workflow-v22.test.mjs | 477 ++++++++++ .../pipeline/workflow-agent-worker.mjs | 13 + .../src/lib/drift-sections.ts | 186 ++-- .../multi-model-review/src/lib/drift.ts | 208 +---- .../quality-gate/src/lib/criteria.ts | 137 +-- .../trace-collector/src/lib/trace.ts | 242 ++--- .../graph-native-default.workflow.json | 120 +++ .../recipes/adversarial-review.workflow.json | 27 + .../recipes/cited-research.workflow.json | 25 + .../recipes/ecosystem-scan.workflow.json | 22 + .../recipes/module-migration.workflow.json | 26 + .../recipes/route-audit.workflow.json | 20 + .../unknown-size-discovery.workflow.json | 21 + scripts/codacy-local.sh | 4 +- scripts/provision-codacy-tools.sh | 8 +- scripts/rae.sh | 15 +- scripts/verify_repo.py | 20 + tests/test_verify_repo.py | 101 ++ uv.lock | 3 + 199 files changed, 24554 insertions(+), 2502 deletions(-) create mode 100644 .stylelintrc.json create mode 100644 DESIGN.md create mode 100644 PRODUCT.md create mode 100644 docs/assets/diagrams/diamond-versus-pipeline.svg create mode 100644 docs/assets/diagrams/graph-edge-classification.svg create mode 100644 docs/assets/diagrams/human-activated-workflow-lifecycle.svg create mode 100644 docs/assets/diagrams/routing-and-quorum.svg create mode 100644 docs/assets/diagrams/until-dry-convergence.svg create mode 100644 docs/how-to/deploy-experimental-platform.md create mode 100644 docs/how-to/hosted-api.md create mode 100644 docs/how-to/recover-workflow-v2.2-wait.md create mode 100644 docs/how-to/run-workflow-v2.2-wait.md create mode 100644 docs/how-to/test-experimental-hosted-platform.md create mode 100644 docs/reference/architecture/experimental-hosted-platform.md create mode 100644 docs/reference/contracts/execution-profile-v3.md create mode 100644 docs/reference/contracts/graph-memory.md create mode 100644 docs/reference/contracts/workflow-v2.2.md create mode 100644 docs/tutorials/graph-engineering-with-rae.md create mode 100644 evals/campaigns/autonomous-policy-improvement.v2.json create mode 100644 evals/datasets/graph-context/README.md create mode 100644 evals/datasets/graph-context/graph-context-held-out.json create mode 100644 evals/schemas/improvement-campaign.schema.json create mode 100644 evals/scripts/improve_harness.py create mode 100644 evals/scripts/lib/policy_improvement_campaign.py create mode 100644 evals/scripts/lib/release_gate_evidence.py create mode 100644 evals/scripts/lib/release_gate_resources.py create mode 100644 evals/scripts/lib/run_benchmark_artifacts.py create mode 100644 packages/orchestration/contracts/graph/graph-context.schema.json create mode 100644 packages/orchestration/contracts/graph/graph-edge.schema.json create mode 100644 packages/orchestration/contracts/graph/graph-manifest.schema.json create mode 100644 packages/orchestration/contracts/graph/graph-node.schema.json create mode 100644 packages/orchestration/contracts/graph/memory-decision.schema.json create mode 100644 packages/orchestration/contracts/workflows/execution-profile-v1.schema.json create mode 100644 packages/orchestration/contracts/workflows/execution-profile-v2.schema.json create mode 100644 packages/orchestration/contracts/workflows/execution-profile-v3.schema.json create mode 100644 packages/orchestration/contracts/workflows/node-envelope-v2.1.schema.json create mode 100644 packages/orchestration/contracts/workflows/node-envelope-v2.2.schema.json create mode 100644 packages/orchestration/contracts/workflows/node-envelope-v2.schema.json create mode 100644 packages/orchestration/contracts/workflows/workflow-v2.1.schema.json create mode 100644 packages/orchestration/contracts/workflows/workflow-v2.2.schema.json create mode 100644 packages/orchestration/contracts/workflows/workflow-v2.schema.json create mode 100644 packages/orchestration/operator/lib/profiles.mjs create mode 100644 packages/orchestration/operator/lib/proposals.mjs create mode 100644 packages/orchestration/operator/lib/remote.mjs create mode 100644 packages/orchestration/operator/lib/workflows.mjs create mode 100644 packages/orchestration/operator/scripts/capture-docs-screenshots.mjs create mode 100644 packages/orchestration/operator/static/css/workflows.css create mode 100644 packages/orchestration/operator/static/js/workflows.js create mode 100644 packages/orchestration/operator/tests/proposals.test.mjs create mode 100644 packages/orchestration/operator/tests/remote.test.mjs create mode 100644 packages/orchestration/platform/Dockerfile create mode 100644 packages/orchestration/platform/README.md create mode 100644 packages/orchestration/platform/bin/rae-platform-worker.mjs create mode 100644 packages/orchestration/platform/bin/rae-platform.mjs create mode 100644 packages/orchestration/platform/compose.yaml create mode 100644 packages/orchestration/platform/dev/platform.toml create mode 100644 packages/orchestration/platform/dev/projects.toml.example create mode 100644 packages/orchestration/platform/migrations/001_initial.sql create mode 100644 packages/orchestration/platform/migrations/002_artifact_fencing.sql create mode 100644 packages/orchestration/platform/migrations/003_hosted_v2.sql create mode 100644 packages/orchestration/platform/package.json create mode 100644 packages/orchestration/platform/src/artifacts.mjs create mode 100644 packages/orchestration/platform/src/auth.mjs create mode 100644 packages/orchestration/platform/src/authorization.mjs create mode 100644 packages/orchestration/platform/src/config.mjs create mode 100644 packages/orchestration/platform/src/http.mjs create mode 100644 packages/orchestration/platform/src/local-executor.mjs create mode 100644 packages/orchestration/platform/src/mcp.mjs create mode 100644 packages/orchestration/platform/src/observability.mjs create mode 100644 packages/orchestration/platform/src/project-map.mjs create mode 100644 packages/orchestration/platform/src/store.mjs create mode 100644 packages/orchestration/platform/src/worker.mjs create mode 100644 packages/orchestration/platform/test/platform.test.mjs create mode 100644 packages/orchestration/scripts/eval/graph-context-benchmark.mjs create mode 100644 packages/orchestration/scripts/eval/workflow-topology-benchmark.mjs create mode 100644 packages/orchestration/scripts/pipeline/graph-cli.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/codex-capabilities.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/execution-profile.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/graph.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/graph/artifacts.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/graph/core.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/graph/memory.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/graph/projection.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/graph/query.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/graph/repository.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/graph/validation.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/opencode-adapter.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/traceability-coverage.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/verification-broker.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/workflow-context-v22.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/workflow-contract.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/workflow-designer.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/workflow-envelope.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/workflow-proposal.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/workflow-registry.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/workflow-runtime.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/workflow-scheduler-v21-support.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/workflow-scheduler-v21.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/workflow-scheduler-v22.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/workflow-scheduler.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/workflow-transforms.mjs create mode 100644 packages/orchestration/scripts/pipeline/lib/workflow-v22-reducer.mjs create mode 100644 packages/orchestration/scripts/pipeline/tests/autonomous-git.test.mjs create mode 100644 packages/orchestration/scripts/pipeline/tests/execution-profile-v3.test.mjs create mode 100644 packages/orchestration/scripts/pipeline/tests/fixtures/fake-workflow-agent.mjs create mode 100644 packages/orchestration/scripts/pipeline/tests/graph.test.mjs create mode 100644 packages/orchestration/scripts/pipeline/tests/opencode-adapter.test.mjs create mode 100644 packages/orchestration/scripts/pipeline/tests/verification-broker.test.mjs create mode 100644 packages/orchestration/scripts/pipeline/tests/workflow-designer.test.mjs create mode 100644 packages/orchestration/scripts/pipeline/tests/workflow-topology-benchmark.test.mjs create mode 100644 packages/orchestration/scripts/pipeline/tests/workflow-v2.test.mjs create mode 100644 packages/orchestration/scripts/pipeline/tests/workflow-v21.test.mjs create mode 100644 packages/orchestration/scripts/pipeline/tests/workflow-v22.test.mjs create mode 100644 packages/orchestration/scripts/pipeline/workflow-agent-worker.mjs create mode 100644 packages/orchestration/workflows/graph-native-default.workflow.json create mode 100644 packages/orchestration/workflows/recipes/adversarial-review.workflow.json create mode 100644 packages/orchestration/workflows/recipes/cited-research.workflow.json create mode 100644 packages/orchestration/workflows/recipes/ecosystem-scan.workflow.json create mode 100644 packages/orchestration/workflows/recipes/module-migration.workflow.json create mode 100644 packages/orchestration/workflows/recipes/route-audit.workflow.json create mode 100644 packages/orchestration/workflows/recipes/unknown-size-discovery.workflow.json create mode 100644 uv.lock diff --git a/.stylelintrc.json b/.stylelintrc.json new file mode 100644 index 0000000..8a72580 --- /dev/null +++ b/.stylelintrc.json @@ -0,0 +1,22 @@ +{ + "rules": { + "at-rule-property-required-list": null, + "declaration-no-important": null, + "declaration-property-value-disallowed-list": null, + "function-disallowed-list": null, + "function-url-scheme-allowed-list": null, + "function-url-scheme-disallowed-list": null, + "media-feature-name-allowed-list": null, + "media-feature-name-value-allowed-list": null, + "property-disallowed-list": null, + "selector-attribute-name-disallowed-list": null, + "selector-disallowed-list": null, + "selector-max-compound-selectors": null, + "selector-max-id": null, + "selector-max-specificity": null, + "selector-max-universal": null, + "selector-not-notation": "complex", + "time-min-milliseconds": null, + "unit-allowed-list": null + } +} diff --git a/AGENTS.md b/AGENTS.md index fcf1ccc..1da0d98 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -47,3 +47,81 @@ Keep autonomous changes inside their approved worktree and plan-owned paths. Evaluator fixtures, judge code, policies, Git history, remotes, secrets, and publication surfaces remain outside model-controlled mutation. Follow `SECURITY.md` for private vulnerability reporting. + + +## Codebase Intelligence for rae (Repowise) + +Indexed by [Repowise](https://repowise.dev). Last indexed: 2026-08-03 (commit 3d4982e). Confidence: 100%. +The MCP tools below serve pre-verified docs, symbols, history, and health from that index. Every response carries `_meta` freshness fields; a `stale_warning` appears only when a file the response actually serves changed after indexing, so silence means current. + +### How to work in this repo + +- **Pre-edit phase** (locate, understand, assess) is where these tools win: `get_answer` for how/where/why, `search_codebase` to find, `get_context` for a file's map, `get_risk` before touching a hotspot. +- **Edit phase**: reading a file before you edit it is correct and expected. Use these tools to decide *which* files to read and edit, not to replace that read. +- **Noisy commands** (tests, builds, `git log`/`diff`, searches, listings): prefer `repowise distill `, the same command with its exit code preserved and errors-first compact output. A `[repowise#: N lines omitted]` marker is fully recoverable via `repowise expand ` (add `-q ` to filter); never re-run the command to see omitted output. + +### Trust protocol + +- `verified: true` means the served bytes were checked against the live tree. Never follow it with a re-read of the same lines. +- `get_answer` at `confidence: "high"` or `grounding: "extracted"` is content-grounded: cite it directly. `symbol_bodies`, `quotes`, and `code_rationale` entries are live source, so use them instead of opening the file. +- The **only** re-read triggers: `bounds: "approximate"`, `_meta.stale_warning`, `search_method: "bm25"`, `confidence: "low"`. `index_behind: true` alone is informational; the served content is unaffected by the drift. +- Not valid reasons to re-read: "just to be safe", "to see full context" (use the skeleton or a range read), "the file might have changed" (`verified` already checked). +- For exhaustive literal sweeps (rename every call site) plain text search is unbeatable, so use it. Reach for `get_context(include=["callers"])` when you need the `callers_total`/`callers_truncated` honesty signal instead of a maybe-incomplete grep. + +### Tools + +| Tool | When and why | +|------|--------------| +| `get_answer(question)` | First call for any how / where / why question. `confidence: "high"` or `grounding: "extracted"` is content-grounded — cite it directly. When the question names an indexed symbol, `symbol_bodies` carries its full live body (skip the `get_symbol` follow-up). Low confidence returns `best_guesses` with one-line justifications plus `code_rationale` (rationale comments mined live from candidate source). | +| `get_context(targets=[...])` | Triage card for files/modules/symbols: summary, signatures, `symbol_id`s, `hotspot` bit. File targets auto-serve a `verified` skeleton (every signature at a fraction of a full Read); `mostly_full` marks files where Read costs little more. Batch targets in one call. Opt-in blocks: `include=["callers"|"callees"|"ownership"|"decisions"|"metrics"]`. | +| `get_symbol(id)` | One verified body: `"path.py::Name"` (indexed symbol), `"path.py:140-180"` (live range read), or `"repowise#"` (omission ref). Source arrives in Read's numbered format — treat it as an already-performed Read. `truncated` responses carry a `continuation` naming the exact next range; ambiguous ids return every match in `candidates`. Index misses fall back to live-grep `fallback_lines`. | +| `search_codebase(query)` | Hybrid search, auto-routed by query shape: identifier → symbol hits (pipe `symbol_id` into `get_symbol`), path → file pages, prose → wiki-semantic. Force with `mode=symbol|path|concept|hybrid`. Concept hits carry a `sources` list; a hit whose sources are `[fts]` only is a keyword match with no semantic agreement — verify it. | +| `get_why(query, targets?)` | Why the code is shaped this way: decision records with evidence and supersession lineage, falling back to git archaeology and `code_rationale` comments. Call before refactors or pattern divergences. | +| `get_risk(targets, changed_files?)` | What history says about touching these files: churn, owners, co-change partners, blast radius. PR mode (`changed_files`) leads with a `directive` block — read `will_break` / `missing_cochanges` / `missing_tests` / `tests_to_run` first. `tests_to_run` is coverage-backed (the tests the per-test map proves exercise the changed files); empty means unknown, never no tests. To score a whole commit or diff range instead, use `get_change_risk`. | +| `get_change_risk(revspec, extensions?, exclude_patterns?)` | Pre-merge defect score for a whole commit or `base..head` range, computed from its diff shape on the live checkout (no index, no LLM). Lead with `risk_percentile` (this change ranked against sampled recent commits), summarized by `review_priority` and `classification`; `score` / `probability` / `level` are the corpus-calibrated fallback. Distinct from `get_risk`, which scores indexed files by path. A `warning` field flags an empty diff (bad revspec or over-tight extension / exclusion filters). | +| `get_health(targets?, include?)` | Health scores + findings on three dimensions (defect / maintainability / performance). Self-check the files you touched before finishing; `include=["biomarkers"|"refactoring"|"signals"]` for depth. | +| `get_dead_code()` | Confidence-tiered unreachable files / unused exports / zombie packages. For cleanup sweeps, not targeted fixes. | +| `get_overview()` | Architecture map + tool recipes. Call once, first, in an unfamiliar repo; skip it after that. | + +**Compose them:** low-confidence `get_answer` then read `best_guesses[0].file`; `get_context` shows `hotspot: true` then `get_risk` before editing; `decision_records` titles then `get_why(targets=[...])`; PR review then `get_risk(targets, changed_files)` and read `directive` first. A `tombstone` error means the file moved, so follow `successor_paths`. + +### Architecture +I’m using the RepoWise codebase-exploration workflow to ground the overview in the indexed architecture, then I’ll verify the maintained entry-point documentation and source contracts. RepoWise’s indexed overview call was unavailable in this session, so I’m falling back to the repository’s maintained documentation and narrowly scoped source reads, as the exploration workflow prescribes. RAE consumes repository-change tasks, committed Git state, validated workflow and policy definitions, and optional local graph context; processes them through isolated-worktree orchestration, typed agent and control nodes, schema gates, human checkpoints, verification, and bounded repair; and produces repository changes, immutable run artifacts, traces, benchmark evidence, and release-readiness reports for human review. RAE, or Reliable Agentic Engineering, is a source-distributed toolkit for controlled repository maintenance, autonomous code changes, audit and repair loops, and evaluation. + +### Key modules +- `packages/orchestration/scripts/pipeline/lib` — The pipeline execution-services layer consumes validated workflow contracts, configured agent invocations, autonomous runtime actions, and… +- `evals/scripts/lib` — The outcome-evaluation layer consumes trusted judge cases, candidate-runner argument vectors, trace resources, RAE execution evidence… +- `packages/orchestration/operator` — The Pipeline Operator Console is the local operator-facing application layer: it consumes authenticated requests, project and run data… +- `packages/orchestration/skills/dev-tools/multi-model-review/src` — The multi-model review orchestration layer consumes validated tool input and normalized findings from review-model adapters, then produces… +- `packages/orchestration/scripts` — The validation and evaluation support layer consumes runner manifests, command-line arguments, evaluation task sets, autonomous policy… +- `packages/orchestration/scripts/pipeline` — The autonomous pipeline control layer consumes pipeline invocations, workflow contracts and proposals, repository and artifact evidence… +- `packages/orchestration/skills/dev-tools/quality-gate/src` — The quality-gate evaluation layer is a deterministic decision boundary: it consumes tool input, artifacts, workspace-contained schemas, and… +- `packages/orchestration/skills/dev-tools/trace-collector/src` — The trace collection and profiling boundary consumes validated trace requests, pipeline event data, profile mutations, and repository… +- `evals/scripts` — The evaluation-harness operations layer consumes umbrella task specifications, sealed evidence, benchmark inputs, judge-calibration data… +- `packages/orchestration/skills/dev-tools/_shared/src` — The Safe Developer Tool Runtime is the shared execution boundary for development tools: it consumes schema-governed input and… + +### Entry points +- `packages/orchestration/operator/server.mjs` +- `packages/orchestration/operator/static/app.js` + +### Files that need care (bug-fix history first, then churn — check `get_risk` before editing) +- `evals/tests/test_benchmark_contracts_core_d.py` — 4 bug fixes, last fix 5 days ago (bug magnet); 7 commits/90d +- `evals/scripts/common.py` — 4 bug fixes, last fix 5 days ago (bug magnet); 7 commits/90d +- `packages/orchestration/skills/dev-tools/_shared/src/path-safety-helpers.ts` — 4 bug fixes, last fix 5 days ago (bug magnet); 4 commits/90d +- `packages/orchestration/skills/dev-tools/trace-collector/tests/unit/trace.test.ts` — 4 bug fixes, last fix 5 days ago (bug magnet); 5 commits/90d +- `evals/scripts/lib/release_gate_core.py` — 4 bug fixes, last fix 5 days ago (bug magnet); 5 commits/90d + +### Code health +Three co-equal signals: defect risk 8.74/10 avg, hotspot health 6.55/10 (stable), worst `packages/orchestration/scripts/pipeline/lib/runtime-state-guard.mjs` at 3.74/10 · maintainability 9.41/10 · performance risk 195 open static I/O-in-loop / N+1 findings. Detail: `get_health()`. + +Critical files: +- `packages/orchestration/scripts/verify.sh` — change entropy — impact −2.6 +- `evals/tests/test_benchmark_contracts_core_b.py` — prior defect — impact −2.0 +- `evals/tests/test_benchmark_contracts_core_c.py` — prior defect — impact −2.0 +- `packages/orchestration/scripts/lib/argv.mjs` — prior defect — impact −2.0 +- `packages/orchestration/scripts/pipeline/lib/commands.mjs` — prior defect — impact −2.0 + +### Commands +- Lint: `ruff check .` + + diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 0000000..903661e --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,19 @@ +# Visual system register + +The operator console uses the existing RAE evidence-dossier system: square geometry, restrained blue and teal evidence accents, neutral paper-like surfaces, compact system typography, tabular identifiers, thin rules, and explicit text labels beside status color. + +The workflow editor extends that system as a visual systems map: + +- a registry rail for workflow identity, revisions, and activation state +- a spatial SVG projection for topology and execution relationships +- a synchronized structured node and edge list for complete non-canvas operation +- a property inspector using native form controls +- a validation ledger, revision diff, budget display, and activation history + +Canvas dragging is optional and never the only authoring path. Standard controls retain native keyboard behavior. Focus indicators remain visible, status is communicated with words and symbols as well as color, and motion is removed when the user requests reduced motion. Responsive layouts preserve the registry, editor, and validation order at narrow widths. + +This register describes the implemented design intent. It makes no formal accessibility-conformance claim. + +The experimental hosted platform has no implemented public console or hosted +product interface. Its current surface is a JSON HTTP and MCP compatibility +boundary; it does not extend the operator console's visual system. diff --git a/PRODUCT.md b/PRODUCT.md new file mode 100644 index 0000000..7f7f013 --- /dev/null +++ b/PRODUCT.md @@ -0,0 +1,34 @@ +# Product register + +RAE is a source-distributed toolkit for bounded repository change, repair, and +evaluation. Codex is the default autonomous executor. OpenCode is available +only through an explicit route and the documented macOS containment backend. +RAE operates on a committed Git repository in an isolated worktree by default +and does not commit, push, publish, deploy, or promote workflow revisions. + +The graph-native runtime treats a versioned workflow as executable policy. Requirements, design criticism, planning, alignment, mutation, verification, and repair are arbitrary typed nodes rather than a fixed phase list. Each run owns an immutable workflow snapshot, node guidance, payload contracts, attempt envelopes, trace order, and evidence references. Existing v1 run requests remain linear when resumed. + +The operator is a loopback-only, bearer-authenticated local console. It is used to inspect runs, resolve checkpoints, stop or resume owned work, and author future workflow revisions. Active runs cannot be edited. Workflow activation is an attributed human decision that affects future runs only. + +The improvement campaign is evaluator-owned. It compares bounded workflow policy and topology candidates against frozen development and held-out matrices, records append-only lineage, and emits a recommendation. It never activates a candidate. + +The experimental hosted-platform source is a separate control-plane and worker +slice. It stores control-plane state in PostgreSQL, protects routes with OIDC, +uses fenced worker leases, and can verify S3-compatible artifacts. The local +operator can proxy allowlisted remote routes, but the platform is not wired to +the umbrella CLI and it has no production +deployment or external integration evidence. Workflow 2.2 is likewise an +experimental local wait-and-signal contract. Its bounded context assembly does +not support a context-efficiency claim until the required 25 percent comparison +is recorded. + +Primary users are maintainers who need inspectable repository automation, explicit ownership, conservative mutation, reproducible evidence, and human control over publication and policy changes. + +Product boundaries: + +- Runtime code, judges, fixtures, safety invariants, provider selection, model selection, tools, commands, and promotion rules are not candidate-editable. +- Context graph memory is separately opt-in with `--graph-memory` and cannot authorize mutation. +- OpenCode writes require the macOS Seatbelt backend and an isolated worktree. + Codex retains its documented workspace sandbox requirements. Unsupported + hosts fail closed where the selected boundary applies. +- Local evidence is not publication or release evidence. diff --git a/README.md b/README.md index 70fb5bc..690d768 100644 --- a/README.md +++ b/README.md @@ -12,31 +12,39 @@ [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/sebastianspicker/rae/badge)](https://scorecard.dev/viewer/?uri=github.com/sebastianspicker/rae) [![License: MIT](https://img.shields.io/github/license/sebastianspicker/rae)](LICENSE) -RAE is a source-distributed toolkit for staged repository changes, bounded -audit and repair loops, repository maintenance, and evaluation. It combines a -thin command dispatcher with package-owned runtimes, JSON contracts, -verification scripts, benchmark fixtures, and evidence-oriented documentation. +RAE is a source-distributed toolkit for controlled repository changes. It +combines graph workflows, isolated Git worktrees, schema-validated artifacts, +human checkpoints, verification gates, and local run evidence. The repository is an alpha candidate. It does not publish a package, container, -hosted service, or stable API. See [Release Status](RELEASE_STATUS.md) for the -current release evidence. +hosted service, or stable API. An experimental hosted-platform source slice is +present and the local operator can proxy allowlisted run routes in remote mode; +it is not wired into the umbrella CLI. See [Release +Status](RELEASE_STATUS.md) for the current release evidence. ## Capabilities and limitations RAE currently provides: -- a ten-stage orchestration runtime with typed artifacts and pass/fail gates +- a graph-native orchestration runtime with typed nodes, joins, bounded repair loops, and immutable evidence envelopes - isolated Git worktrees for autonomous repository changes -- a loopback-only operator console for run status, checkpoints, resume, and stop +- a loopback-only operator console with synchronized Loop, Graph, Analyze, and JSON workflow views +- explicit Codex and OpenCode execution routes through operator-owned profiles - Ralph audit, linting, and story-scoped fixing modes - benchmark validation, execution, comparison, calibration, and release gates +- opt-in local repository, workflow, evidence, and temporal-memory graph projections +- an experimental hosted control-plane and self-hosted worker source slice - a transactional Git co-author trailer cleaner - sanitized environment-profile templates and installers The following limits are part of the current implementation: -- autonomous execution supports the installed Codex CLI; other committed - adapters are guidance, not executable provider integrations +- Codex remains the default autonomous executor; OpenCode must be selected + explicitly and is never selected by `auto` +- OpenCode mutation is supported only on macOS, in an isolated RAE worktree, + under the system `sandbox-exec` boundary; OpenCode rejects `--in-place` +- OpenRouter models are supported only through OpenCode configuration; RAE does + not call the OpenRouter API directly - the custom command provider is an unsandboxed test surface and always fails `agent doctor` - RAE does not commit, push, publish, or deploy target-repository changes @@ -56,7 +64,9 @@ The following limits are part of the current implementation: - `git`, `jq`, `rg`, and `shellcheck` - Python dependencies from `requirements-ci.txt` or `requirements-macos.txt` -- Codex CLI only for provider-backed autonomous and Ralph runs +- Codex CLI for Codex-backed autonomous runs and Ralph +- OpenCode CLI only for explicitly selected OpenCode autonomous routes on + macOS - `git-filter-repo` only for the co-author trailer cleaner `./scripts/rae.sh doctor` checks the required runtime versions and executable @@ -97,6 +107,8 @@ The umbrella command forwards arguments to the runtime that owns them: Use `--policy ` to select a validated orchestration policy. Use `--checkpoint-policy before-mutation` or `before-mutation-and-ship` to require operator approval at those boundaries. +Use `--graph-memory read` or `read-write` only when local graph retrieval is +required. Graph memory is `off` by default. Ralph accepts command flags and `RALPH_*` environment variables documented in its package README. @@ -127,6 +139,34 @@ Run a task in an isolated worktree: --task "Add a tested health endpoint and document its behavior" ``` +New runs use the committed graph-native workflow by default. Select a validated +workflow with `--workflow`, stop at a node with `--through`, or temporarily +start the v1 engine with `--legacy-linear`. Existing v1 requests always resume +through the linear engine. + +Inspect future workflow revisions with `graph workflow list|validate|show|diff` +and activate a reviewed revision with `graph workflow activate`. Activation +requires an attributed rationale and exact digest confirmation, and affects +future runs only. + +Workflow schema 2.1 supports bounded data-driven fan-out, item streams, +deterministic transforms, threshold joins, until-dry discovery, and logical +execution tiers. Execution profile 3.0 maps those tiers and optional node +overrides to explicit Codex or OpenCode routes. Use `graph workflow analyze` +for static topology and bound diagnostics. Use `graph workflow propose +--preview` for a validated, unsaved candidate. Proposals, saved revisions, and +exact-digest activation remain separate operations. + +The operator console presents the same workflow as four synchronized views. +Its guided editor targets workflow 2.1. Existing workflow 2.0 and experimental +2.2 revisions remain available through the JSON view. See [Graph Engineering +with RAE](docs/tutorials/graph-engineering-with-rae.md) and [Execution +Profile 3.0](docs/reference/contracts/execution-profile-v3.md). + +Workflow 2.2 is an experimental local wait-and-signal contract. It adds typed +wait signals and bounded context manifests without changing existing 2.0 or 2.1 +runs. See [Workflow 2.2 Contract](docs/reference/contracts/workflow-v2.2.md). + Use `--through plan` to stop before repository mutation. The default worktree is stored under the target repository's Git metadata at `.git/rae-worktrees/`. The final output identifies the worktree and @@ -136,7 +176,8 @@ Serve the local operator console for explicitly allowlisted repositories: ```bash ./scripts/rae.sh operator serve \ - --project /canonical/path/to/target-repository + --project /canonical/path/to/target-repository \ + --execution-profile /absolute/path/to/execution-profile.json ``` Run Ralph health checks or an audit: @@ -167,6 +208,18 @@ Run one benchmark split: --output-dir evals/results/local-dev ``` +Evaluate a sealed workflow-improvement campaign without activation: + +```bash +./scripts/rae.sh eval improve \ + --campaign evals/campaigns/autonomous-policy-improvement.v2.json \ + --baseline-evaluation evals/results/local/baseline-development.json \ + --candidate-policy evals/results/local/candidate-policy.json \ + --candidate-evaluation evals/results/local/candidate-development.json \ + --sealed-evaluation evals/results/local/candidate-held-out.json \ + --output-dir evals/results/local/improvement-campaign +``` + Local outputs under `evals/results/local*`, `.pipeline/`, and package runtime directories are intentionally ignored. @@ -245,14 +298,16 @@ gate is: ``` A release consists of a reviewed source tag and optional source archive. The -repository contains no application deployment configuration. +repository contains no production application deployment configuration. The +experimental local development compose file is not a deployment artifact. ## Troubleshooting - `rae.sh doctor` reports the installed version and path for each required command. Install the missing command or select Python with `PYTHON_BIN`. -- `agent doctor` fails when the installed Codex CLI is unauthenticated or lacks - sandbox, JSON-schema output, event streaming, or ephemeral-session support. +- `agent doctor` without provider options checks Codex. For OpenCode, pass + `--provider opencode --model `; the diagnostic also verifies + the macOS sandbox and effective denied-by-default tool configuration. - A failed autonomous phase names its gate and run report. Correct the reported dependency or target issue, then use `agent resume` with the printed run ID and worktree path. diff --git a/RELEASE_STATUS.md b/RELEASE_STATUS.md index 54ddf33..9dd5843 100644 --- a/RELEASE_STATUS.md +++ b/RELEASE_STATUS.md @@ -1,112 +1,96 @@ # Release Status -Evidence cutoff: 2026-07-24 +Evidence cutoff: 2026-08-04 -Verdict: DOCUMENTATION AND AVAILABLE FOCUSED GATES PASS; NOT READY TO PUBLISH +Verdict: LOCAL IMPLEMENTATION GATES PASS; NOT READY TO PUBLISH -## Candidate identity +## Candidate scope - Proposed version: `v0.1.0-alpha.1` -- Branch: `docs-security-badges` -- Baseline HEAD: `b3a5b635032b996f943749583e93d714dc8e0ae3` -- Components: Ralph `0.3.0`; coauthor trailer cleaner `3.0.0` -- Candidate state: 309 modified, 27 deleted, and 154 untracked paths; - zero staged files; untagged, uncommitted, and unpublished -- Branch state: the configured upstream is gone; the cached `origin/main` is - 14 commits ahead of this baseline +- Distribution: reviewed source tag and optional source archive +- Published package, container, hosted service, or stable API: none +- Current working tree: uncommitted and unsuitable as a release artifact + +The candidate scope is the local source toolkit: graph-native repository +workflows, isolated worktrees, the loopback operator, evaluation tools, Ralph, +and repository-maintenance utilities. The hosted-platform package and workflow +2.2 remain experimental. + +## Implemented local surface + +- Workflow 2.1 supports typed nodes and edges, bounded fan-out, deterministic + transforms, first-success and quorum joins, checkpoints, and bounded cycles. +- The loopback operator provides synchronized Loop, Graph, Analyze, and JSON + views. Five guided templates compile directly to workflow 2.1. +- Workflow analysis reports schema and topology diagnostics, unreachable nodes, + writer and verification paths, bounded attempts and dynamic instances, + concurrency, and resolved execution routes. +- Execution profile 3.0 maps logical tiers and optional node overrides to named + Codex or OpenCode routes without adding provider configuration to workflows. +- Workflow proposals remain drafts. Preview, revision saving, validation, diff, + and exact-digest activation are separate operator actions. Activation affects + future runs only. +- OpenCode is explicit, never selected by `auto`, and supported only through the + documented macOS containment backend. OpenCode writes require an isolated RAE + worktree and reject `--in-place`. ## Verified local evidence -- `python3 -B scripts/verify_repo.py --skip-mkdocs` passes source headers, - obsolete-artifact checks, deterministic screenshots, brand assets, - frontmatter, local link paths, citation density, and evaluation metadata. -- `pyright --project pyrightconfig.json` reports zero errors, warnings, or - informational diagnostics. -- Existing candidate Bash entrypoints pass syntax checking and ShellCheck. - Candidate Python files compile with bytecode redirected outside the - repository. -- Ralph passes 63 of 63 tests in the current working tree. Its transaction tests - cover protected metadata placement, real Codex sandbox denial, native - no-clobber promotion and recovery, concurrent-entry preservation, read-only - directory subtrees, crash checkpoints, retained conflict evidence, - idempotent recovery, and partial terminal cleanup. -- The coauthor trailer cleaner passes 65 of 65 tests. The public profile - transaction suite, root runtime contract, and evaluation metadata validator - pass. -- The authenticated loopback operator console passes 25 of 25 control, - security, server, recovery, and UI-contract tests. -- Focused adversarial regressions reproduce the orchestration recovery race and - Ralph transaction overwrite and cleanup cases, and those regressions pass. - The remaining boundaries are documented in `SECURITY.md` and the package - security files. -- Orchestration's dependency-free skill validation, stale-reference check, - hygiene check, 11-file strict link check, adapter synchronization, package - integrity, operator suite, and JavaScript syntax checks pass. -- All 107 candidate JSON files and 18 YAML/CFF files parse. Every referenced - `src-*` bibliography key has a matching explicit bibliography anchor. All - versioned root-lock `node_modules` entries include `resolved` and `integrity`. -- The two deterministic SVG command captures are current, reproducible, and - free of private paths. The 1280 by 640 social preview is visually legible and - contains no slogan, credential, or private machine content. -- `./scripts/rae.sh doctor` passes with GNU Bash `5.3.15`, Python `3.14.6`, - Node.js `22.23.1`, Git, `rg`, npm, `jq`, ShellCheck, and git-filter-repo. - `./scripts/rae.sh agent doctor` confirms the installed Codex path is - authenticated and exposes the required sandbox, structured-output, event, - and ephemeral-session capabilities. - -## Verification limits and publication blockers - -- `./scripts/verify.sh --skip-install` stops because `ruff` is not installed. - The current environment also lacks `pytest`, `mkdocs`, and `lizard`, so the - complete Python suite, strict MkDocs build, complexity gate, and umbrella - verifier are not available. No dependency installation was authorized. -- `packages/orchestration/scripts/verify.sh --skip-install` passes its first six - dependency-free gates, then the `_shared` TypeScript build stops because the - local installation lacks `ajv`, `ajv-formats`, and Node type declarations. - `npm run test:runner` cannot find the local Vitest executable. A clean - `npm ci`, package build, and full package test lane remain required. -- The in-app browser has no available browser, and no Playwright installation - is present. The operator console therefore has contract-test coverage but no - final live render, console inspection, viewport review, interaction smoke, - or sanitized operator screenshot. -- No clean isolated installation, disposable real-provider outcome run, sealed - held-out evaluation, optimizer recommendation, or live release-candidate - browser smoke was performed. -- The project still lacks a private conduct-reporting address. GitHub's content - reporting controls cover conduct on GitHub, but a project-specific private - route is required before publication. -- The working-tree secret scan found only a synthetic operator test match. No - Gitleaks configuration or history scan is present, so this is working-tree - evidence rather than a complete secret-history audit. -- `python3 -B scripts/verify_repo.py --release-candidate` correctly rejects the - dirty worktree. GitHub CI, CodeQL, Scorecard, badges, external links, and the - public release page cannot be confirmed until an approved candidate commit - exists. -- The recorded test results describe this mutable working tree, not an immutable - release artifact. The final candidate commit and hosted checks must anchor the - publication evidence. -- The candidate must be reconciled onto refreshed `main`; the current branch - upstream is gone and cached `origin/main` is ahead. - -## Accepted alpha boundaries - -This source candidate implements local, experimental autonomous workflows. It -does not claim a stable API, remote operation, unsandboxed safety, universal -agent reliability, or provider-backed performance. The custom command provider -is an explicitly unsafe test surface. Ralph multi-path promotion is recoverable -but not globally atomic, and its concurrent-entry guarantee assumes stable -parent directories. These limits are acceptable only when they remain visible -in the alpha documentation and release notes. - -No file was staged, committed, tagged, pushed, released, or published during -this preparation pass. +- `packages/orchestration/scripts/verify.sh --skip-install` passes the package + builds, lint and format checks, runner, operator, shared-runtime, + quality-gate, review, and trace-collector suites. +- The pipeline runner passes 396 tests. The operator passes 42 tests. +- `python -m pytest evals/tests tests` passes 74 tests under Python 3.14.6. +- Ruff, Pyright, Lizard, the root runtime contract, evaluation validation, + profile installation, Ralph's 63 tests, and the co-author cleaner's 65 tests + pass in the current working tree. +- OpenCode doctor passes locally with OpenCode 1.18.11 and verifies the exact + denied-by-default tool surface under macOS Seatbelt. +- Real Seatbelt checks deny read-node writes and deny write-node access outside + the isolated workspace, including `.pipeline`. The verification broker runs + its approved Git check under a nested no-network sandbox. +- `git diff --check` passes. + +These results apply to the current mutable checkout. They are not evidence for +an immutable tag, hosted deployment, arbitrary repository, or provider-backed +task outcome. + +## Publication blockers + +- The root `./scripts/verify.sh --skip-install` gate stops at repository + validation because `docs/assets/screenshots/rae-agent-safety.svg` is stale + relative to its deterministic generator. The complete root gate therefore + does not pass. +- No authenticated OpenCode proposal or write run has captured a real provider + event stream and completed the full designer-to-activation acceptance path. +- No final browser render, responsive interaction, console, or screenshot smoke + was performed. The in-app browser was unavailable and Playwright is not + installed in the current environment. +- The working tree contains extensive uncommitted changes. Release-candidate + verification requires a reviewed, committed candidate with current hosted CI + and security checks. +- The project still needs a private conduct-reporting address before + publication. + +## Experimental boundaries + +The hosted control-plane and worker package is not deployed. Source-unit tests +do not establish PostgreSQL migration and reconciliation, OIDC issuer +interoperability, object-storage transfer, remote worker isolation, secret +handling, hosted recovery, or production operations. + +Workflow 2.2 implements local durable waits, typed signals, and bounded context +assembly. It has no context-efficiency result. A frozen comparison with the +predefined threshold remains required before making such a claim. + +OpenRouter models are supported only through OpenCode provider configuration. +RAE does not call the OpenRouter API directly. The OpenCode adapter is macOS +only in this candidate. ## Next gate -Before publication, provide a private conduct-reporting route, restore the -pinned Python and Node dependencies in an authorized isolated environment, and -run the complete commands in `RELEASING.md`. Then perform the browser and -provider smoke lanes, reconcile the reviewed candidate onto refreshed `main`, -create the approved candidate commit, run -`./scripts/verify.sh --release-candidate`, and confirm the hosted workflows. -Only then should the maintainer create `v0.1.0-alpha.1` and its release. +Regenerate and review the stale deterministic screenshot, complete the root +verification gate, and run the authenticated OpenCode and browser acceptance +lanes. Then review and commit the candidate, run +`./scripts/verify.sh --release-candidate`, and confirm the hosted checks against +that exact commit before creating a tag or release. diff --git a/SECURITY.md b/SECURITY.md index c986826..2ac291c 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -56,8 +56,8 @@ Do not publish: ### Autonomous orchestration -- The supported Codex path requires workspace sandboxing, structured output, - JSON event streaming, and a fresh session for each phase. +- The Codex path requires workspace sandboxing, structured output, JSON event + streaming, and a fresh session for each phase. - Provider requests contain the task, phase guidance, and selected predecessor artifacts. Absolute POSIX, Windows, UNC, and `file:` URL path tokens are sanitized before request construction; the local Codex process still receives @@ -84,6 +84,37 @@ Do not publish: resume. A same-user command can escape RAE's filesystem controls or leave detached descendants. +#### OpenCode execution + +- OpenCode must be selected explicitly. `auto` never selects it. The current + adapter is supported only on macOS and requires a root-owned, non-symlink + `/usr/bin/sandbox-exec`. +- OpenCode write routes require RAE's isolated worktree and reject + `--in-place`. The Seatbelt profile denies writes to Git metadata, + `.pipeline`, the source checkout, home directories, workflow registries, + evaluator-owned paths, and other external locations. Read routes receive no + workspace write permission. +- Each attempt uses `--pure`, JSON event output, a fresh session directory, and + an inline denied-by-default permission configuration. RAE checks the merged + configuration before execution and rejects unknown tools, additional MCP + servers, project extensions, shell, web, external-directory, subagent, + skill, question, and plugin access. +- Verification runs through a RAE-owned broker that accepts opaque allowlisted + IDs. It executes fixed argument vectors without a shell under a nested + no-network sandbox and records bounded, redacted evidence independently of + model output. +- The pinned OpenCode process can read the configured OpenCode credential store + needed for provider authentication. RAE records only provider and source + metadata, not credential values or store contents. The operator profile API + never returns credential paths, environment values, or raw provider traces. +- Provider inference still requires outbound network access from the OpenCode + process. Denying web and MCP tools prevents model-directed network tools; it + does not make the provider process itself offline. RAE makes no provider-side + storage or retention claim. +- Resume requires the recorded workflow and execution-profile digests, resolved + routes, models, variants, OpenCode version, and executable digest. Drift fails + before provider execution. + ### Ralph fixing mode - Audit and linting modes are read-only. @@ -120,6 +151,26 @@ Do not publish: from jsDelivr. Building the documentation is local, but viewing pages that use that script makes a request to that third-party CDN. +### Experimental hosted platform + +- `packages/orchestration/platform/` is not a deployed service. The loopback + operator can proxy only allowlisted remote routes and keeps the upstream + token out of browser code. Insecure authentication and cleartext HTTP require + explicit development flags. +- Hosted configuration requires OIDC validation of exact issuer, audience, + JWKS URL, token type, bounded issue time, allowed asymmetric signing + algorithms, subject, and unexpired expiration. Route scopes and + project claims are enforced per request; worker identifiers must match token + subjects. +- Worker reports, heartbeats, and artifact finalization require an active + lease with the matching worker and fence value. Artifact verification hashes + the object and quarantines a mismatched upload. +- The checked-in compose file contains development credentials and cleartext + loopback ports. It is not production deployment configuration. HTTPS, + identity-provider interoperability, database and object-store operations, + worker isolation, secret handling, and incident recovery remain deployment + responsibilities without current integration evidence. + ### Repository and evaluation data - Public agent profiles must remain machine-agnostic. diff --git a/TESTING.md b/TESTING.md index f2a04b3..28f94ba 100644 --- a/TESTING.md +++ b/TESTING.md @@ -29,7 +29,7 @@ The root gate runs: ## Test inventory -The current tree contains 128 executable test source files and 11 referenced +The current tree contains 146 executable test source files and 12 referenced runner, helper, fixture, or configuration files. | Classification | Paths | Count | Runner or owner | @@ -41,10 +41,11 @@ runner, helper, fixture, or configuration files. | Experimental | `evals/fixtures/autonomous-outcomes/*/tests/test_*.py` | 3 | Outcome evaluator fixture manifests | | Active | `packages/loops/ralph/tests/ralph_*_test.sh` | 63 | `packages/loops/ralph/scripts/run_tests.sh` | | Active support | Ralph test runner and `tests/lib/test_helpers.sh` | 2 | Ralph shell suite | -| Active | `packages/orchestration/operator/tests/*.test.mjs` | 5 | Node test runner | -| Active | `packages/orchestration/scripts/pipeline/tests/*.test.mjs` | 25 | Vitest | -| Active support | Pipeline Vitest config, test helper, and two fixture modules | 4 | Pipeline Vitest suite | -| Active | `packages/orchestration/skills/dev-tools/*/tests/unit/*.test.ts` | 17 | Package-local Vitest commands | +| Active | `packages/orchestration/operator/tests/*.test.mjs` | 7 | Node test runner | +| Active | `packages/orchestration/scripts/pipeline/tests/*.test.mjs` | 38 | Vitest | +| Experimental source unit | `packages/orchestration/platform/test/platform.test.mjs` | 1 | `npm --prefix packages/orchestration/platform test` | +| Active support | Pipeline Vitest config, test helper, and three fixture modules | 5 | Pipeline Vitest suite | +| Active | `packages/orchestration/skills/dev-tools/*/tests/unit/*.test.ts` | 19 | Package-local Vitest commands | | Active support | `trace-test-helpers.ts` | 1 | Trace collector tests | | Active | `profiles/agent-environments/tests/profile-installation.sh` | 1 | Root verifier | | Active | `tools/repo-hygiene/coauthor-trailer-cleaner/tests/test-*.sh` | 2 | Tool test runner | @@ -80,8 +81,33 @@ Orchestration: npm --prefix packages/orchestration run test:operator npm --prefix packages/orchestration run test:runner npm --prefix packages/orchestration run verify +npm --prefix packages/orchestration run benchmark:workflow-topology +npm --prefix packages/orchestration/platform test ``` +Workflow Designer, execution-profile, and OpenCode boundaries: + +```bash +npm --prefix packages/orchestration run test:runner -- --run \ + tests/workflow-designer.test.mjs \ + tests/execution-profile-v3.test.mjs \ + tests/opencode-adapter.test.mjs \ + tests/verification-broker.test.mjs +``` + +These tests use controlled executables for event parsing, malformed output, +timeouts, route selection, and resume drift. The macOS integration cases also +exercise the real Seatbelt and broker boundaries. They do not replace an +authenticated provider run against a specific OpenCode version and account. + +The topology benchmark is a deterministic scheduler fixture for event order, +critical path, and barrier idle time. It does not measure model quality. + +The platform source-unit suite uses the in-memory store. Docker, PostgreSQL, +OIDC, S3-compatible storage, and remote-worker integration remain separate +unrun evidence lanes. The workflow 2.2 Vitest coverage is local scheduler +evidence and does not establish hosted workflow execution. + Ralph: ```bash diff --git a/docs/INDEX.md b/docs/INDEX.md index 549b02f..8d68c03 100644 --- a/docs/INDEX.md +++ b/docs/INDEX.md @@ -1,7 +1,7 @@ --- status: stable owner: core -last_reviewed: 2026-07-24 +last_reviewed: 2026-08-04 source_of_truth: README.md evidence_links: reference/claims/evidence-index.md --- @@ -21,6 +21,7 @@ common commands, repository structure, and current limitations. ## Tutorials +- [Graph engineering with RAE](tutorials/graph-engineering-with-rae.md) - [First pipeline](tutorials/first-pipeline.md) - [Autonomous code change](tutorials/autonomous-code-change.md) - [First Ralph run](tutorials/first-ralph-run.md) @@ -42,6 +43,9 @@ common commands, repository structure, and current limitations. - [Repository hygiene CLI](reference/cli/repo-hygiene.md) - [Module boundaries](reference/architecture/module-boundaries.md) - [Artifact schemas](reference/contracts/artifact-schemas.md) +- [Execution profile 3.0](reference/contracts/execution-profile-v3.md) +- [Local graph and memory](reference/contracts/graph-memory.md) +- [Workflow 2.2](reference/contracts/workflow-v2.2.md) - [Quality gates](reference/contracts/quality-gates.md) - [Task specifications](reference/contracts/task-specs.md) - [Safety boundaries](reference/invariants/safety-boundaries.md) diff --git a/docs/assets/diagrams/diamond-versus-pipeline.svg b/docs/assets/diagrams/diamond-versus-pipeline.svg new file mode 100644 index 0000000..4512d16 --- /dev/null +++ b/docs/assets/diagrams/diamond-versus-pipeline.svg @@ -0,0 +1,15 @@ + + RAE diamond barrier compared with a streaming pipeline + A diamond waits for all parallel reviewers before reduction, while a streaming pipeline advances each mapped item independently. + + Barrier diamondStreaming pipeline + + InputLens ALens BReduce + + all join forms a declared barrier + + Map A1Map B1Map A2Map B2Map A3Map B3 + + each item advances when its predecessor settles + + diff --git a/docs/assets/diagrams/graph-edge-classification.svg b/docs/assets/diagrams/graph-edge-classification.svg new file mode 100644 index 0000000..bc9390d --- /dev/null +++ b/docs/assets/diagrams/graph-edge-classification.svg @@ -0,0 +1,18 @@ + + RAE graph edge classification + Four labeled edge types connect contract-bound workflow nodes: artifact data, item stream, condition, and loop-back. + + RAE edge contracts + + Typed artifact + artifact + Consumer + Map item + stream + Mapped stage + Decision + condition + Route + bounded loop-back + + diff --git a/docs/assets/diagrams/human-activated-workflow-lifecycle.svg b/docs/assets/diagrams/human-activated-workflow-lifecycle.svg new file mode 100644 index 0000000..1e962cb --- /dev/null +++ b/docs/assets/diagrams/human-activated-workflow-lifecycle.svg @@ -0,0 +1,13 @@ + + RAE human-activated workflow lifecycle + Codex proposes a read-only draft, RAE validates and stores it, a human confirms the digest and activates it, then a future run executes the immutable snapshot and records evidence. + + Drafts do not execute + + Codex proposesread-onlyRAE validatesand draftsHuman reviewstyped digestFuture runsnapshotsExecute andrecord evidence + + activation boundary + + A proposal never activates itself, edits concrete model mappings, or changes an active run. + + diff --git a/docs/assets/diagrams/routing-and-quorum.svg b/docs/assets/diagrams/routing-and-quorum.svg new file mode 100644 index 0000000..176e1f6 --- /dev/null +++ b/docs/assets/diagrams/routing-and-quorum.svg @@ -0,0 +1,14 @@ + + RAE conditional routing and diverse-lens quorum + A router selects bounded specialist paths whose independent results enter a three-of-four quorum before verification. + + Route, inspect, verify + Route + + Contract lensSafety lensTesting lensScope lens + + 3 of 4quorum + + Conditional edges choose work. Quorum edges define evidence sufficiency. + + diff --git a/docs/assets/diagrams/until-dry-convergence.svg b/docs/assets/diagrams/until-dry-convergence.svg new file mode 100644 index 0000000..5a9f381 --- /dev/null +++ b/docs/assets/diagrams/until-dry-convergence.svg @@ -0,0 +1,12 @@ + + RAE until-dry discovery convergence + Discovery rounds admit only unseen stable keys, record accepted and rejected keys in the seen set, and stop when a round yields no new item. + + Until-dry means globally unseen + + Round 1: A, B, Cfresh: A, B, CRound 2: B, Dfresh: DRound 3: A, Dfresh: none + + seen keys after every decision: A, B, C, Dno fresh key means converged + Rejected findings remain seen, so the loop cannot rediscover them indefinitely. + + diff --git a/docs/assets/screenshots/rae-agent-safety.svg b/docs/assets/screenshots/rae-agent-safety.svg index b310569..e57a380 100644 --- a/docs/assets/screenshots/rae-agent-safety.svg +++ b/docs/assets/screenshots/rae-agent-safety.svg @@ -1,12 +1,12 @@ - + RAE autonomous agent safety defaults Deterministic terminal capture generated from the live RAE CLI. - - + + @@ -16,41 +16,51 @@ RAE autonomous coding-agent orchestrator Usage: - node scripts/pipeline/autonomous.mjs doctor [--provider codex] + node scripts/pipeline/autonomous.mjs doctor [--provider codex|opencode] [--model <provider/model>] node scripts/pipeline/autonomous.mjs run --task <text> [options] node scripts/pipeline/autonomous.mjs resume --run-id <id> [options] node scripts/pipeline/autonomous.mjs status --project-root <workspace> --run-id <id> [--json] node scripts/pipeline/autonomous.mjs stop --project-root <workspace> --run-id <id> [--json] - node scripts/pipeline/autonomous.mjs resolve-checkpoint --project-root <workspace> --run-id <id> - --checkpoint-id <id> --decision <approved|rejected|escalated> - --decision-id <id> --actor <label> --rationale <text> [--json] - node scripts/pipeline/autonomous.mjs events --project-root <workspace> --run-id <id> - [--after-seq <n>] [--limit <1..1000>] [--json] - - Run options: - --project-root <path> Target Git repository (default: current directory) - --task <text> Work request - --task-file <path> Read a relative, non-symlink .md or .txt file under the project root - --provider <name> auto or codex (command is test-integration only) - --model <id> Optional Codex model override - --reasoning-effort <level> low, medium, high, or xhigh - --timeout-seconds <n> Per-phase timeout (default: 1800) - --policy <path> Validated data-only autonomous policy JSON - --checkpoint-policy <mode> Human pause mode: none, before-mutation, or before-mutation-and-ship - --in-place Modify a clean target checkout directly - --through <phase> Stop after one named phase (default: release-readiness) - --run-id <id> Resume an existing run (resume command only) - --json Emit the final result as JSON - - Custom command-provider options: - --agent-command <path> Executable implementing the rae-agent-v1 stdin/stdout protocol - --agent-arg <value> Argument for the command; repeat as needed - --allow-unsafe-command-provider - Explicitly enable the unsandboxed test-integration provider - - Safety defaults: - - run creates an isolated Git worktree unless --in-place is explicit - - Codex phases use read-only or workspace-write sandbox modes as appropriate - - agents may not commit, push, publish, install dependencies, or use network infrastructure - - the custom command provider always fails doctor and cannot run without an unsafe opt-in + node scripts/pipeline/autonomous.mjs signal --project-root <workspace> --run-id <id> + --node-id <wait-node> --signal <name> --idempotency-key <key> [--payload-json <json>] [--json] + node scripts/pipeline/autonomous.mjs resolve-checkpoint --project-root <workspace> --run-id <id> + --checkpoint-id <id> --decision <approved|rejected|escalated> + --decision-id <id> --actor <label> --rationale <text> [--json] + node scripts/pipeline/autonomous.mjs events --project-root <workspace> --run-id <id> + [--after-seq <n>] [--limit <1..1000>] [--json] + + Run options: + --project-root <path> Target Git repository (default: current directory) + --task <text> Work request + --task-file <path> Read a relative, non-symlink .md or .txt file under the project root + --provider <name> auto, codex, or explicit opencode (command is test-integration only) + --model <id> Optional Codex model or required OpenCode provider/model + --reasoning-effort <level> Codex low, medium, high, or xhigh + --variant <name> Optional OpenCode model variant + --execution-profile <file> Operator-owned logical tiers and provider routes + --timeout-seconds <n> Per-phase timeout (default: 1800) + --policy <path> Validated data-only autonomous policy JSON + --workflow <path> Explicit graph-native workflow JSON for a new run + --legacy-linear Start a temporary v1 ten-phase run + --checkpoint-policy <mode> Human pause mode: none, before-mutation, or before-mutation-and-ship + --graph-memory <mode> Local graph mode: off, read, or read-write (default: off) + --in-place Modify a clean target checkout directly + --through <node-id> Stop after one workflow node + --max-concurrency <n> Concurrent readers, from 1 to 4 (default: 4) + --max-repair-rounds <n> Repair iterations, from 1 to 5 (default: 5) + --run-id <id> Resume an existing run (resume command only) + --json Emit the final result as JSON + + Custom command-provider options: + --agent-command <path> Executable implementing the rae-agent-v1 stdin/stdout protocol + --agent-arg <value> Argument for the command; repeat as needed + --allow-unsafe-command-provider + Explicitly enable the unsandboxed test-integration provider + + Safety defaults: + - run creates an isolated Git worktree unless --in-place is explicit + - Codex phases use read-only or workspace-write sandbox modes as appropriate + - OpenCode is explicit, macOS-contained, and never selected by auto + - agents may not commit, push, publish, install dependencies, or use network infrastructure + - the custom command provider always fails doctor and cannot run without an unsafe opt-in diff --git a/docs/assets/screenshots/rae-cli.svg b/docs/assets/screenshots/rae-cli.svg index 417679c..8f48953 100644 --- a/docs/assets/screenshots/rae-cli.svg +++ b/docs/assets/screenshots/rae-cli.svg @@ -1,11 +1,11 @@ - + RAE command map Deterministic terminal capture generated from the live RAE CLI. - + @@ -22,45 +22,47 @@ Run umbrella verification doctor Check runtime prerequisites and entrypoints agent <subcommand> [args] Run the autonomous coding-agent orchestrator - operator serve [args] Serve the authenticated loopback operator console - task route [args] Route a task spec and emit a planned run card - checkpoint <subcommand> [args] Create or resolve human checkpoint cards - orchestrate <subcommand> [args] Run the phased orchestration package - worktree <subcommand> [args] Run worktree-native orchestration aliases - ralph <subcommand> [args] Run Ralph or bootstrap its embedded template - hygiene <tool> [args] Run narrow maintenance tooling - eval <subcommand> [args] Run eval metadata harness commands - release-gate [args] Evaluate release-blocking benchmark gates - workflow <family> [args] Run umbrella workflow aliases - help Show this help - - Examples: - ./scripts/rae.sh doctor - ./scripts/rae.sh agent doctor - ./scripts/rae.sh agent run --task "Add a tested health endpoint and document it" - ./scripts/rae.sh operator serve --project /absolute/path/to/repository - ./scripts/rae.sh task route --task-spec evals/datasets/tool-selection/tool-selection-core.task-specs.json --task-id - tool-selection-dev-orchestration --output evals/results/planned.json - ./scripts/rae.sh orchestrate init - ./scripts/rae.sh orchestrate run-stage --run-id <id> --phase arm - ./scripts/rae.sh orchestrate record-review-state --run-id <id> --state explain --status completed - ./scripts/rae.sh orchestrate summarize-progress --run-id <id> - ./scripts/rae.sh ralph --status - ./scripts/rae.sh ralph bootstrap-template /tmp/demo-repo - ./scripts/rae.sh hygiene coauthor-cleaner --help - ./scripts/rae.sh checkpoint create --output evals/results/checkpoint.json --run-id demo --task-id task --gate-id - review --title "Review" - ./scripts/rae.sh eval validate - ./scripts/rae.sh eval run --benchmark-card evals/benchmarks/tool-selection-core.benchmark-card.json --split dev - --output-dir evals/results/tmp - ./scripts/rae.sh eval outcome --task-bundle evals/datasets/autonomous-outcomes/core.task-bundle.json --fixture-root - evals/fixtures/autonomous-outcomes --policy packages/orchestration/policies/default.autonomous-policy.json --split - dev --repeats 2 --output-dir evals/results/outcomes/dev --acknowledge-provider-usage - ./scripts/rae.sh release-gate --benchmark-card evals/benchmarks/tool-selection-core.benchmark-card.json --run-card - evals/results/tmp/run-card.json --regression-report evals/results/tmp/regression.json --ledger - evals/results/tmp/result-ledger.jsonl --output evals/results/tmp/release-gate.json - ./scripts/rae.sh worktree init . - ./scripts/rae.sh worktree summary --run-id <id> - ./scripts/rae.sh workflow repo-audit bootstrap /tmp/demo-repo - ./scripts/rae.sh workflow long-horizon init + graph <subcommand> [args] Build and query local graph projections and memory + operator serve [args] Serve the authenticated loopback operator console + task route [args] Route a task spec and emit a planned run card + checkpoint <subcommand> [args] Create or resolve human checkpoint cards + orchestrate <subcommand> [args] Run the phased orchestration package + worktree <subcommand> [args] Run worktree-native orchestration aliases + ralph <subcommand> [args] Run Ralph or bootstrap its embedded template + hygiene <tool> [args] Run narrow maintenance tooling + eval <subcommand> [args] Run eval metadata harness commands + release-gate [args] Evaluate release-blocking benchmark gates + workflow <family> [args] Run umbrella workflow aliases + help Show this help + + Examples: + ./scripts/rae.sh doctor + ./scripts/rae.sh agent doctor + ./scripts/rae.sh agent run --task "Add a tested health endpoint and document it" + ./scripts/rae.sh graph build --project-root /absolute/path/to/repository + ./scripts/rae.sh operator serve --project /absolute/path/to/repository + ./scripts/rae.sh task route --task-spec evals/datasets/tool-selection/tool-selection-core.task-specs.json --task-id + tool-selection-dev-orchestration --output evals/results/planned.json + ./scripts/rae.sh orchestrate init + ./scripts/rae.sh orchestrate run-stage --run-id <id> --phase arm + ./scripts/rae.sh orchestrate record-review-state --run-id <id> --state explain --status completed + ./scripts/rae.sh orchestrate summarize-progress --run-id <id> + ./scripts/rae.sh ralph --status + ./scripts/rae.sh ralph bootstrap-template /tmp/demo-repo + ./scripts/rae.sh hygiene coauthor-cleaner --help + ./scripts/rae.sh checkpoint create --output evals/results/checkpoint.json --run-id demo --task-id task --gate-id + review --title "Review" + ./scripts/rae.sh eval validate + ./scripts/rae.sh eval run --benchmark-card evals/benchmarks/tool-selection-core.benchmark-card.json --split dev + --output-dir evals/results/tmp + ./scripts/rae.sh eval outcome --task-bundle evals/datasets/autonomous-outcomes/core.task-bundle.json --fixture-root + evals/fixtures/autonomous-outcomes --policy packages/orchestration/policies/default.autonomous-policy.json --split + dev --repeats 2 --output-dir evals/results/outcomes/dev --acknowledge-provider-usage + ./scripts/rae.sh release-gate --benchmark-card evals/benchmarks/tool-selection-core.benchmark-card.json --run-card + evals/results/tmp/run-card.json --regression-report evals/results/tmp/regression.json --ledger + evals/results/tmp/result-ledger.jsonl --output evals/results/tmp/release-gate.json + ./scripts/rae.sh worktree init . + ./scripts/rae.sh worktree summary --run-id <id> + ./scripts/rae.sh workflow repo-audit bootstrap /tmp/demo-repo + ./scripts/rae.sh workflow long-horizon init diff --git a/docs/how-to/deploy-experimental-platform.md b/docs/how-to/deploy-experimental-platform.md new file mode 100644 index 0000000..98104cc --- /dev/null +++ b/docs/how-to/deploy-experimental-platform.md @@ -0,0 +1,69 @@ +--- +status: experimental +owner: orchestration +last_reviewed: 2026-08-04 +source_of_truth: packages/orchestration/platform +evidence_links: ../reference/claims/claims-ledger.md +--- + +# Deploy the Experimental Platform + +This is a local development procedure, not production deployment guidance. The +checked-in compose file deliberately uses loopback cleartext PostgreSQL and +MinIO ports plus development credentials. Do not publish it, expose it, or +reuse its credentials. + +## Prepare configuration + +Set `RAE_PLATFORM_CONFIG` to a TOML file containing at least a database URL. +For a local experiment, set `platform.development = true` before enabling +`platform.allowInsecureAuth` or `platform.allowInsecureHttp`. The checked-in +Compose file publishes those development services on loopback only. + +For any hosted experiment, omit `allowInsecureAuth` and configure `oidc` with +an exact issuer, audience, JWKS URL, and allowed asymmetric JWS algorithms. Put +the service behind HTTPS. +If artifacts are needed, configure an S3-compatible bucket, region, optional +endpoint, and optional path-style addressing. + +## Start the local development stack + +From `packages/orchestration/platform/`, review the checked-in development-only +`dev/platform.toml` configuration, set `RAE_DEV_MINIO_ACCESS_KEY` and +`RAE_DEV_MINIO_SECRET_KEY` to disposable local values, then run: + +```bash +docker compose -f compose.yaml up --build migrate control +``` + +The control process never applies migrations automatically. Verify that all +migrations completed before serving work: + +```bash +curl http://127.0.0.1:8080/readyz +``` + +The expected response is `{"status":"ready"}`. `GET /healthz` only proves +that the HTTP process answered. It does not prove schema readiness, OIDC, +object storage, or worker execution. + +## Required external evidence + +No current repository evidence proves a container deployment, PostgreSQL +integration, OIDC issuer interoperability, S3-compatible upload and +verification, worker execution, or operational recovery. A hosted trial must +record those results separately, including HTTPS termination, secret handling, +database backup and restore, object retention and quarantine handling, and +worker loss recovery. + +See [Use the Experimental Hosted API](hosted-api.md) for the route contract. + +## Source note + +- [NIST GenAI Profile](../reference/claims/bibliography.md#src-nist-genai-profile) +- [Model Cards](../reference/claims/bibliography.md#src-model-cards) +- [Datasheets](../reference/claims/bibliography.md#src-datasheets) +- [OpenAI evals guidance](../reference/claims/bibliography.md#src-openai-evals) +- [PaperBench](../reference/claims/bibliography.md#src-openai-paperbench) +- [IEEE 1012](../reference/claims/bibliography.md#src-ieee-1012) +- [Diataxis](../reference/claims/bibliography.md#src-diataxis) diff --git a/docs/how-to/hosted-api.md b/docs/how-to/hosted-api.md new file mode 100644 index 0000000..859a4a6 --- /dev/null +++ b/docs/how-to/hosted-api.md @@ -0,0 +1,79 @@ +--- +status: experimental +owner: orchestration +last_reviewed: 2026-08-04 +source_of_truth: packages/orchestration/platform/src/http.mjs +evidence_links: ../reference/claims/claims-ledger.md +--- + +# Use the Experimental Hosted API + +This API is an experimental control-plane surface. The loopback operator can +proxy its allowlisted run routes in remote mode, but it does not provide a +production service and must not be exposed with local insecure authentication. + +## Prerequisites + +Configure the control process with `RAE_PLATFORM_CONFIG` and apply migrations +before serving. Hosted callers need a bearer token accepted by the configured +OIDC issuer, audience, and signing-algorithm policy. The token must contain an +unexpired `exp`, a bounded `iat`, a subject, the required `rae.*` scope, and an authorized +`projects` or `project_ids` claim. + +The control process exposes unauthenticated `GET /healthz`, `GET /readyz`, and +`GET /metrics`. `GET /readyz` returns `503` until every checked-in migration is +recorded. `GET /.well-known/oauth-protected-resource` describes the MCP +resource when OIDC is configured. + +## Route groups + +| Route | Required scope | Notes | +| --- | --- | --- | +| `POST /api/v2/revisions`, activate, or diff | `rae.policy.write` | Uploads, validates, compares, or activates an exact immutable revision. Activation requires `Idempotency-Key`. | +| `POST /api/v2/runs` | `rae.run.submit` | Requires `Idempotency-Key`; the run envelope is limited to 256 KiB. | +| `GET /api/v2/runs/` and `/events` | `rae.run.read` | Reads an authorized run or its events; `?stream=true&from=` opens bounded SSE. | +| `POST /api/v2/runs//cancel` | `rae.run.cancel` | Requires `Idempotency-Key`. | +| `POST /api/v2/runs//signals` | `rae.run.signal` | Requires `Idempotency-Key`. | +| `POST /api/v2/runs//rebind` | `rae.run.cancel` | Requires `Idempotency-Key`, an operator decision, and matching digests. | +| Worker register, claim, and heartbeat | `rae.work.claim` | Worker subject must equal the supplied stable worker identifier. | +| Worker report, failure, and artifact upload | `rae.work.report` | Reports require the current fenced lease. | +| Artifact download | `rae.run.read` | Available only for authorized projects when storage is configured. | +| `POST /mcp` | Per-tool `rae.run.*` scope | Stateless Streamable HTTP MCP compatibility surface. | + +All listed routes are implementation references, not a stability commitment. +The request parser accepts JSON bodies up to 1,050,000 bytes. Mutating run +operations named above enforce `Idempotency-Key`; callers must provide one for +every mutation. Revision upload also computes and verifies the supplied digest. + +## Worker protocol + +Register first, then claim work. A worker uses HTTPS, long-polls for up to 25 +seconds, sends a heartbeat every 20 seconds, and reports success or failure +with the claim's node identifier and fence value. A lost heartbeat aborts the +current worker operation rather than reporting a stale result. + +The worker resolves the claim's logical project ID through its private +`RAE_PROJECT_MAP_FILE`, verifies the claim's profile digest against the local +execution-profile v2 snapshot, replaces all filesystem paths locally, and +runs the existing sandboxed workflow-agent child. The map must be an +owner-only regular file and each root must be a canonical Git top level. + +Each provider-node payload must contain `prompt`, `outputSchema`, +`profileDigest`, and a logical `tier`; it may contain a bounded +`timeoutSeconds`. The control plane supplies only the logical project, run, +attempt, and node identities plus read/write access. The worker derives the +workspace root, output paths, Codex model, reasoning effort, credentials, and +MCP allowlist from its local map and matching profile snapshot. + +For the deployment boundary, see +[Deploy the Experimental Platform](deploy-experimental-platform.md). + +## Source note + +- [NIST GenAI Profile](../reference/claims/bibliography.md#src-nist-genai-profile) +- [Model Cards](../reference/claims/bibliography.md#src-model-cards) +- [Datasheets](../reference/claims/bibliography.md#src-datasheets) +- [OpenAI evals guidance](../reference/claims/bibliography.md#src-openai-evals) +- [PaperBench](../reference/claims/bibliography.md#src-openai-paperbench) +- [IEEE 1012](../reference/claims/bibliography.md#src-ieee-1012) +- [Diataxis](../reference/claims/bibliography.md#src-diataxis) diff --git a/docs/how-to/recover-workflow-v2.2-wait.md b/docs/how-to/recover-workflow-v2.2-wait.md new file mode 100644 index 0000000..988cbab --- /dev/null +++ b/docs/how-to/recover-workflow-v2.2-wait.md @@ -0,0 +1,43 @@ +--- +status: experimental +owner: orchestration +last_reviewed: 2026-08-04 +source_of_truth: packages/orchestration/scripts/pipeline/lib/workflow-v22-reducer.mjs +evidence_links: ../reference/claims/claims-ledger.md +--- + +# Recover a Workflow 2.2 Wait + +Workflow 2.2 recovery is local and applies only to its durable wait state. It +does not recover a hosted worker, PostgreSQL lease, or object-store transfer. + +1. Keep the original workspace and run directory intact. The wait state is at + `.pipeline/runs//workflow/wait-state.json`. +2. Use the original run ID, workspace root, wait-node name, signal name, and + idempotency key when retrying a signal. Replaying the same node and key is a + no-op. +3. Resume the run with `./scripts/rae.sh agent resume --project-root + --run-id `. +4. Inspect the wait state and immutable node envelopes before another signal or + a retry. The scheduler only consumes accepted signals recorded on or before + the wait deadline. + +If the deadline passed, the resumed scheduler creates a failed wait envelope. +Recovery then follows the workflow's failure edges, if any. Do not edit the +wait-state file to force progress. The reducer checks the run and workflow +digest against the immutable snapshot and fails when the state is busy or does +not match. + +The tested recovery case is a local signal and resume flow. Container restart, +PostgreSQL failover, OIDC token refresh, S3 transfer recovery, and remote worker +recovery remain unverified integration work. + +## Source note + +- [NIST GenAI Profile](../reference/claims/bibliography.md#src-nist-genai-profile) +- [Model Cards](../reference/claims/bibliography.md#src-model-cards) +- [Datasheets](../reference/claims/bibliography.md#src-datasheets) +- [OpenAI evals guidance](../reference/claims/bibliography.md#src-openai-evals) +- [PaperBench](../reference/claims/bibliography.md#src-openai-paperbench) +- [IEEE 1012](../reference/claims/bibliography.md#src-ieee-1012) +- [Diataxis](../reference/claims/bibliography.md#src-diataxis) diff --git a/docs/how-to/run-workflow-v2.2-wait.md b/docs/how-to/run-workflow-v2.2-wait.md new file mode 100644 index 0000000..9409c5e --- /dev/null +++ b/docs/how-to/run-workflow-v2.2-wait.md @@ -0,0 +1,66 @@ +--- +status: experimental +owner: orchestration +last_reviewed: 2026-08-04 +source_of_truth: packages/orchestration/scripts/pipeline/autonomous.mjs +evidence_links: ../reference/claims/claims-ledger.md +--- + +# Run a Workflow 2.2 Wait + +Use this procedure only with a validated local workflow whose +`schema_version` is `2.2.0` and that defines a `wait` node and matching signal +contract. Workflow 2.2 is experimental and remains a local orchestration +surface. + +Start a run with the workflow path: + +```bash +./scripts/rae.sh agent run \ + --project-root /path/to/target-repository \ + --task "Perform the approved task" \ + --workflow /path/to/workflow-v2.2.json +``` + +When execution reaches a wait node, the scheduler persists state under +`.pipeline/runs//workflow/wait-state.json` and returns a waiting +result. No provider call is made for the open wait itself. + +Record an accepted signal with a stable retry key and a JSON payload matching +the workflow's signal contract: + +```bash +node packages/orchestration/scripts/pipeline/autonomous.mjs signal \ + --project-root /path/from/run-output \ + --run-id \ + --node-id \ + --signal \ + --idempotency-key \ + --payload-json '{"decision":"approve"}' \ + --json +``` + +Resume the same run using the workspace root printed by the original command: + +```bash +./scripts/rae.sh agent resume \ + --project-root /path/from/run-output \ + --run-id +``` + +The reducer consumes the earliest accepted unconsumed signal at or before the +deadline. A timeout writes a failed wait envelope, so define failure edges when +the workflow needs a controlled timeout path. + +This procedure does not activate a workflow revision, publish a change, or +connect the local run to the experimental hosted platform. + +## Source note + +- [NIST GenAI Profile](../reference/claims/bibliography.md#src-nist-genai-profile) +- [Model Cards](../reference/claims/bibliography.md#src-model-cards) +- [Datasheets](../reference/claims/bibliography.md#src-datasheets) +- [OpenAI evals guidance](../reference/claims/bibliography.md#src-openai-evals) +- [PaperBench](../reference/claims/bibliography.md#src-openai-paperbench) +- [IEEE 1012](../reference/claims/bibliography.md#src-ieee-1012) +- [Diataxis](../reference/claims/bibliography.md#src-diataxis) diff --git a/docs/how-to/test-experimental-hosted-platform.md b/docs/how-to/test-experimental-hosted-platform.md new file mode 100644 index 0000000..685d72a --- /dev/null +++ b/docs/how-to/test-experimental-hosted-platform.md @@ -0,0 +1,46 @@ +--- +status: experimental +owner: orchestration +last_reviewed: 2026-08-04 +source_of_truth: packages/orchestration/platform/test/platform.test.mjs +evidence_links: ../reference/claims/claims-ledger.md +--- + +# Test the Experimental Hosted Platform + +Run the focused source-unit suite from the platform package: + +```bash +npm --prefix packages/orchestration/platform test +``` + +The current suite uses the in-memory store. It verifies canonical revision +digests, digest mismatch rejection, idempotent run submission, the 256 KiB run +envelope limit, four-reader writer exclusion, authorization failure, and +traceparent format. + +Run the workflow 2.2 contract suite separately: + +```bash +npm --prefix packages/orchestration run test:runner -- workflow-v22.test.mjs +``` + +That suite covers bounded and ordered context, artifact references instead of +partial predecessor objects, fail-closed context overflow, idempotent signals, +local resume, and timeout routing. + +The focused tests do not start Docker, PostgreSQL, MinIO or another S3 service, +an OIDC issuer, or a remote worker. They do not prove hosted deployment, +database migration behavior, token interoperability, presigned URL transfer, +or end-to-end worker recovery. Record those as integration evidence before +describing the platform as deployable. + +## Source note + +- [NIST GenAI Profile](../reference/claims/bibliography.md#src-nist-genai-profile) +- [Model Cards](../reference/claims/bibliography.md#src-model-cards) +- [Datasheets](../reference/claims/bibliography.md#src-datasheets) +- [OpenAI evals guidance](../reference/claims/bibliography.md#src-openai-evals) +- [PaperBench](../reference/claims/bibliography.md#src-openai-paperbench) +- [IEEE 1012](../reference/claims/bibliography.md#src-ieee-1012) +- [Diataxis](../reference/claims/bibliography.md#src-diataxis) diff --git a/docs/reference/architecture/experimental-hosted-platform.md b/docs/reference/architecture/experimental-hosted-platform.md new file mode 100644 index 0000000..1dcccb9 --- /dev/null +++ b/docs/reference/architecture/experimental-hosted-platform.md @@ -0,0 +1,81 @@ +--- +status: experimental +owner: orchestration +last_reviewed: 2026-08-04 +source_of_truth: packages/orchestration/platform +evidence_links: ../claims/claims-ledger.md +--- + +# Experimental Hosted Platform + +The hosted platform is an experimental control-plane and worker boundary under +`packages/orchestration/platform/`. The loopback operator can proxy allowlisted +run routes in remote mode, but it is not a production deployment. + +## Components + +The control process loads TOML configuration, requires explicit database +migrations, checks readiness, and serves a raw Node HTTP surface. PostgreSQL +stores revisions, runs, nodes, leases, attempts, events, an outbox, workers, +and artifact metadata. The worker polls the control plane over HTTPS, renews +its lease, maps logical projects to private canonical Git roots, verifies +local profile digests, runs the sandboxed Codex child, and reports its result. + +Optional S3-compatible storage reserves immutable objects by SHA-256 key, +issues five-minute upload and download URLs, and verifies the object digest and +size before marking it verified. A checksum mismatch is copied to a quarantine +key and rejected. + +The platform also exposes a stateless Streamable HTTP MCP endpoint. It can +submit, read, signal, or cancel project-authorized runs and read run events. It +does not expose an arbitrary command, Git publication, or deployment action. + +## Execution and recovery boundaries + +Workers receive 60-second fenced leases and send heartbeats every 20 seconds. +The store accepts heartbeat, report, and artifact finalization only while the +lease is active and its worker and fence match. Expired leases are reconciled +back to queued state. Read nodes may run four-wide; a write node excludes other +active nodes in both the PostgreSQL and in-memory implementations. + +Run pinning and explicit rebind require matching repository and worktree +digests from the run and worker. This is an implementation boundary, not proof +that a worker is otherwise isolated or trusted. + +## Security boundary + +Hosted configuration requires OIDC unless explicit development, insecure-auth, +and insecure-HTTP flags are all set. OIDC validation checks an exact issuer, +audience, JWKS URL, configured asymmetric signing algorithms and token type, +subject, bounded issue time, and unexpired expiration. Routes also require a +named `rae.*` scope and a project claim. Worker identifiers must equal the +token subject. + +The development compose file is intentionally not a hosted deployment +configuration. It uses loopback cleartext ports and development credentials +for PostgreSQL and MinIO. The checked-in image runs as `node`, uses a read-only +application filesystem at runtime, and still requires deployment-specific +network, identity, database, object-store, and operational controls. + +## Evidence status + +Source-unit tests cover canonical revision digests, request idempotency and the +256 KiB run-envelope bound, reader and writer exclusion, fenced completion, +authorization failure, traceparent construction, worker URL validation, and +the two-failed-heartbeat stop rule. They do not prove PostgreSQL migrations, +container startup, OIDC issuer interoperability, S3 compatibility, worker +execution, or a complete hosted recovery path. + +See [Hosted API](../../how-to/hosted-api.md), +[experimental deployment](../../how-to/deploy-experimental-platform.md), and +[experimental platform testing](../../how-to/test-experimental-hosted-platform.md). + +## Source note + +- [NIST GenAI Profile](../claims/bibliography.md#src-nist-genai-profile) +- [Model Cards](../claims/bibliography.md#src-model-cards) +- [Datasheets](../claims/bibliography.md#src-datasheets) +- [OpenAI evals guidance](../claims/bibliography.md#src-openai-evals) +- [PaperBench](../claims/bibliography.md#src-openai-paperbench) +- [IEEE 1012](../claims/bibliography.md#src-ieee-1012) +- [Diataxis](../claims/bibliography.md#src-diataxis) diff --git a/docs/reference/architecture/system-overview.md b/docs/reference/architecture/system-overview.md index e55a1ca..efd8700 100644 --- a/docs/reference/architecture/system-overview.md +++ b/docs/reference/architecture/system-overview.md @@ -45,6 +45,10 @@ flowchart LR environments. The current committed surface defines policy and boundaries; sanitized payloads land here only after extraction. Manifest v2 uses no-follow filesystem operations and retained recovery evidence. +7. `packages/orchestration/platform/` + Experimental hosted control-plane and worker source. It is separate from + the loopback operator and umbrella CLI, and has no production deployment + evidence. ## Integration rule @@ -84,6 +88,9 @@ work is reliable. The important artifact families are: gate reports, and result ledgers. - `profiles/agent-environments/` Sanitized operator profile material and installation regression fixtures. +- `packages/orchestration/platform/` + Experimental PostgreSQL state, OIDC route checks, fenced worker leases, + S3-compatible artifact handling, and Streamable HTTP MCP compatibility. New code should either produce one of these artifacts, validate one of these artifacts, or stay inside the package-local runtime that owns the behavior. @@ -103,6 +110,8 @@ explicitly separated modules, shared publication doctrine, and traceable claims. - this diagram is explanatory architecture, not empirical proof of universal superiority over other designs +- the hosted-platform source is not evidence of a deployed service or external + integration ## Source note diff --git a/docs/reference/claims/bibliography.md b/docs/reference/claims/bibliography.md index b61eee9..9fd0000 100644 --- a/docs/reference/claims/bibliography.md +++ b/docs/reference/claims/bibliography.md @@ -1,7 +1,7 @@ --- status: stable owner: science -last_reviewed: 2026-04-17 +last_reviewed: 2026-08-04 source_of_truth: editorial evidence_links: evidence-index.md --- @@ -228,6 +228,89 @@ https://doi.org/10.1518/001872095779049543 Kahneman. "Thinking, Fast and Slow." 2011. https://us.macmillan.com/books/9780374533557/thinkingfastandslow +## Graph retrieval and memory sources + +### SRC-W3C-PROV-O { #src-w3c-prov-o } + +W3C. "PROV-O: The PROV Ontology." April 30, 2013. +https://www.w3.org/TR/prov-o/ + +### SRC-GRAPHRAG-BENCH { #src-graphrag-bench } + +GraphRAG-Bench. "GraphRAG-Bench." Accessed July 29, 2026. +https://graphrag-bench.github.io/ + +### SRC-CODEXGRAPH { #src-codexgraph } + +CodexGraph. "Bridging Large Language Models and Code Repositories via Code +Graph Databases." NAACL 2025. +https://aclanthology.org/2025.naacl-long.7/ + +### SRC-REPOGRAPH { #src-repograph } + +RepoGraph. "Enhancing AI Software Engineering with Repository-level Code +Graph." 2024. +https://arxiv.org/abs/2410.14684 + +### SRC-DOES-MEMORY-NEED-GRAPHS { #src-does-memory-need-graphs } + +"Does Memory Need Graphs?" ACL 2026. +https://aclanthology.org/2026.acl-long.1232/ + +### SRC-GRAPHITI { #src-graphiti } + +"Zep: A Temporal Knowledge Graph Architecture for Agent Memory." 2025. +https://arxiv.org/abs/2501.13956 + +### SRC-GRAPHRAG-UNDER-FIRE { #src-graphrag-under-fire } + +"GraphRAG under Fire: Probing Robustness of Graph-Based Retrieval-Augmented +Generation." 2025. +https://arxiv.org/abs/2501.14050 + +### SRC-LONGMEMEVAL-V2 { #src-longmemeval-v2 } + +"LongMemEval-V2: Benchmarking Memory-Augmented Agents in Long-Horizon +Interactive Environments." 2026. +https://arxiv.org/abs/2605.12493 + +## Execution and containment sources + +### SRC-OPENCODE-CLI { #src-opencode-cli } + +OpenCode. "CLI." Accessed August 4, 2026. +https://dev.opencode.ai/docs/cli/ + +### SRC-OPENCODE-CONFIG { #src-opencode-config } + +OpenCode. "Config." Accessed August 4, 2026. +https://dev.opencode.ai/docs/config + +### SRC-OPENCODE-PERMISSIONS { #src-opencode-permissions } + +OpenCode. "Permissions." Accessed August 4, 2026. +https://dev.opencode.ai/docs/permissions/ + +### SRC-OPENCODE-TOOLS { #src-opencode-tools } + +OpenCode. "Tools." Accessed August 4, 2026. +https://dev.opencode.ai/docs/tools/ + +### SRC-OPENCODE-PROVIDERS { #src-opencode-providers } + +OpenCode. "Providers." Accessed August 4, 2026. +https://opencode.ai/docs/providers + +### SRC-JSON-SCHEMA-2020-12 { #src-json-schema-2020-12 } + +JSON Schema. "JSON Schema Draft 2020-12." Accessed August 4, 2026. +https://json-schema.org/draft/2020-12 + +### SRC-APPLE-APP-SANDBOX { #src-apple-app-sandbox } + +Apple. "Accessing files from the macOS App Sandbox." Accessed August 4, 2026. +https://developer.apple.com/documentation/security/accessing-files-from-the-macos-app-sandbox + ## Coverage note The bibliography is also a thesis-support surface for the documentation corpus. diff --git a/docs/reference/claims/claims-ledger.md b/docs/reference/claims/claims-ledger.md index 0df362a..8080b5c 100644 --- a/docs/reference/claims/claims-ledger.md +++ b/docs/reference/claims/claims-ledger.md @@ -46,6 +46,9 @@ evidence_links: evidence-index.md | CLM-019 | Reliability and benchmark claims require explicit threats-to-validity, contamination, and uncertainty analysis before publication-strength interpretation. | governance_rule | adopted | [Evidence Index](evidence-index.md#clm-019) | [Dossier](dossiers/clm-019-validity-doctrine.md) | | CLM-020 | Failure analysis is more diagnostic when representation, inference, coordination, and governance failures are separated instead of collapsed into one label. | engineering_heuristic | adopted | [Evidence Index](evidence-index.md#clm-020) | [Dossier](dossiers/clm-020-layered-failure-model.md) | | CLM-021 | Negative results should be preserved as first-class evidence when they constrain interpretation, calibration, or future design. | governance_rule | adopted | [Evidence Index](evidence-index.md#clm-021) | [Dossier](dossiers/clm-021-negative-results.md) | +| CLM-022 | Graph-informed repository context should remain experimental until it improves localization or reduces context under frozen held-out evaluation without reducing task passes or crossing repository and protected-path boundaries. | governance_rule | adopted | [Evidence Index](evidence-index.md#clm-022) | [Graph Contract](../contracts/graph-memory.md#experimental-status) | +| CLM-023 | The experimental hosted platform and local workflow 2.2 surfaces have implementation contracts, but require external integration and comparative evaluation before operational or context-efficiency claims. A predefined 25 percent comparison threshold remains required for any context-efficiency claim. | implementation_reference | provisional | `packages/orchestration/platform/`, `packages/orchestration/contracts/workflows/workflow-v2.2.schema.json` | None | +| CLM-024 | Workflow 2.1 remains provider-neutral while execution profile 3.0 resolves explicit Codex and OpenCode routes locally; OpenCode mutation requires an isolated worktree, an exact denied-by-default tool surface, and the macOS containment backend. | implementation_reference | provisional | `packages/orchestration/contracts/workflows/execution-profile-v3.schema.json`, `packages/orchestration/scripts/pipeline/lib/opencode-adapter.mjs` | [Execution Profile 3.0](../contracts/execution-profile-v3.md) | ## Status meanings diff --git a/docs/reference/claims/evidence-index.md b/docs/reference/claims/evidence-index.md index 22fa113..8f4b019 100644 --- a/docs/reference/claims/evidence-index.md +++ b/docs/reference/claims/evidence-index.md @@ -61,6 +61,8 @@ evidence_links: bibliography.md - Dossier: [CLM-008 coordination topology](dossiers/clm-008-coordination-topology.md) - Internal anchor: `docs/explanation/science/coordination-cost.md` - Internal anchor: `packages/orchestration/docs/ORCHESTRATION_POLICY.md` +- Internal anchor: `docs/tutorials/graph-engineering-with-rae.md` +- Internal anchor: `packages/orchestration/scripts/pipeline/lib/workflow-scheduler-v21.mjs` - External anchor: [Amdahl 1967](bibliography.md#src-amdahl-1967) - External anchor: [Conway 1968](bibliography.md#src-conway-1968) - External anchor: [Cataldo et al.](bibliography.md#src-cataldo-congruence) @@ -108,6 +110,8 @@ evidence_links: bibliography.md - Dossier: [CLM-016 cognitive tiering](dossiers/clm-016-cognitive-tiering.md) - Internal anchor: `docs/explanation/science/cognitive-tiering.md` - Internal anchor: `docs/explanation/supplementary/design-axioms.md` +- Internal anchor: `packages/orchestration/contracts/workflows/execution-profile-v1.schema.json` +- Internal anchor: `docs/tutorials/graph-engineering-with-rae.md` - External anchor: [Kahneman](bibliography.md#src-kahneman-fast-slow) - External anchor: [Bainbridge automation](bibliography.md#src-bainbridge-automation) - External anchor: [Parasuraman and Riley](bibliography.md#src-parasuraman-riley) @@ -150,6 +154,17 @@ evidence_links: bibliography.md - External anchor: [Pineau reproducibility report](bibliography.md#src-pineau-reproducibility) - External anchor: [Smaldino bad science](bibliography.md#src-smaldino-bad-science) +### CLM-022 + +- Internal anchor: `docs/reference/contracts/graph-memory.md` +- Internal anchor: `packages/orchestration/contracts/graph/` +- Internal anchor: `packages/orchestration/contracts/workflows/workflow-v2.1.schema.json` +- Regression evidence: `packages/orchestration/scripts/pipeline/tests/graph.test.mjs` +- External anchor: [GraphRAG-Bench](https://graphrag-bench.github.io/) +- External anchor: [Does Memory Need Graphs?](https://aclanthology.org/2026.acl-long.1232/) +- External anchor: [CodexGraph](https://aclanthology.org/2025.naacl-long.7/) +- External anchor: [LongMemEval-V2](https://arxiv.org/abs/2605.12493) + ### CLM-011 - Dossier: [CLM-011 explicit routing](dossiers/clm-011-explicit-routing.md) diff --git a/docs/reference/cli/umbrella.md b/docs/reference/cli/umbrella.md index 8c327ae..6835222 100644 --- a/docs/reference/cli/umbrella.md +++ b/docs/reference/cli/umbrella.md @@ -1,7 +1,7 @@ --- status: stable owner: core -last_reviewed: 2026-07-24 +last_reviewed: 2026-08-04 source_of_truth: scripts/rae.sh evidence_links: ../claims/evidence-index.md --- @@ -18,6 +18,7 @@ before dispatching to the package that owns each command. | `verify` | `scripts/verify.sh` | Run repository verification | | `doctor` | `scripts/rae.sh` | Check runtime versions, tools, and entrypoints | | `agent` | orchestration autonomous CLI | Run, inspect, stop, or resume an autonomous workflow | +| `graph` | orchestration graph CLI | Build and query local projections or manage cross-run memory | | `operator serve` | orchestration operator console | Serve the loopback console for allowlisted repositories | | `task route` | evaluation router | Select a runtime for one task specification | | `checkpoint` | evaluation checkpoint CLI | Create or resolve an operator checkpoint | @@ -39,6 +40,7 @@ Subcommand options are owned by the selected runtime: ```bash ./scripts/rae.sh agent --help +./scripts/rae.sh graph --help ./scripts/rae.sh orchestrate --help ./scripts/rae.sh ralph --help ./scripts/rae.sh eval --help @@ -67,8 +69,11 @@ Provider-backed autonomous work has a separate diagnostic: ./scripts/rae.sh agent doctor ``` -It requires authentication, workspace sandboxing, JSON-schema output, event -streaming, and ephemeral sessions. +Without provider options, the command checks Codex authentication, workspace +sandboxing, JSON-schema output, event streaming, and ephemeral sessions. Use +`agent doctor --provider opencode --model ` to check the exact +OpenCode binary, merged permission configuration, credential-store presence, +and macOS containment backend. ## Autonomous run @@ -94,11 +99,90 @@ Resume after correcting an environmental failure: RAE does not expose commit, push, publish, or deploy actions. Supported runs reject protected Git-state changes. +Graph retrieval is disabled by default. Enable current, trusted local retrieval +for one run with `--graph-memory read`, or admit verified outcomes and +quarantine model-proposed candidates with `--graph-memory read-write`. The mode +is immutable on resume. + +Use an operator-owned execution profile when workflow nodes declare logical +tiers: + +```bash +./scripts/rae.sh agent run \ + --project-root /path/to/target-repository \ + --execution-profile /absolute/path/to/execution-profile.json \ + --task "Implement and verify the requested change" +``` + +`--execution-profile` is mutually exclusive with `--provider`, `--model`, +`--reasoning-effort`, and `--variant`. Execution profile 3.0 resolves logical +tiers and optional per-node overrides to named Codex or OpenCode routes. The +validated profile, canonical digest, resolved node routes, models, and exact +executor versions are stored in the run request and remain immutable on +resume. + +OpenCode is explicit: + +```bash +./scripts/rae.sh agent doctor \ + --provider opencode \ + --model opencode/example-model + +./scripts/rae.sh agent run \ + --project-root /path/to/target-repository \ + --provider opencode \ + --model openrouter/example-model \ + --task "Implement and verify the requested change" +``` + +OpenCode writes require the isolated macOS worktree backend and reject +`--in-place`. `auto` never selects OpenCode. + +## Local graph and memory + +```bash +./scripts/rae.sh graph build --project-root /path/to/target-repository +./scripts/rae.sh graph status --project-root /path/to/target-repository +./scripts/rae.sh graph query --project-root /path/to/target-repository \ + --seed 'File:src/main.js' +``` + +The graph is local, rebuildable, and advisory. It cannot modify gates, +checkpoints, policies, evaluators, Git state, publication state, or plan +ownership. See the [graph and memory contract](../contracts/graph-memory.md). + +Workflow revisions use the same graph command family: + +```bash +./scripts/rae.sh graph workflow list --project-root /path/to/target-repository +./scripts/rae.sh graph workflow validate --project-root /path/to/target-repository \ + --workflow-file /absolute/path/to/workflow.json +./scripts/rae.sh graph workflow analyze \ + --workflow-file /absolute/path/to/workflow.json \ + --execution-profile /absolute/path/to/execution-profile.json +./scripts/rae.sh graph workflow propose --project-root /path/to/target-repository \ + --task "Design a bounded topology" --base-workflow graph-native-default \ + --actor "operator-name" --rationale "Draft for review" \ + --execution-profile /absolute/path/to/execution-profile.json --preview +``` + +`analyze` reports schema and topology errors, unreachable nodes, writer and +verification paths, bounded attempts and instances, concurrency, and resolved +routes. It reports monetary cost as unavailable when provider usage data is not +present. + +`propose` starts one read-only, ephemeral structured-output session and permits +one correction after local validation. `--preview` returns a validated candidate +without saving it; omitting `--preview` stores a valid attributed draft. An +execution profile supplies the `judgment` route. Neither mode activates or +executes the result. + ## Operator console ```bash ./scripts/rae.sh operator serve \ - --project /canonical/path/to/target-repository + --project /canonical/path/to/target-repository \ + --execution-profile /absolute/path/to/execution-profile.json ``` Repeat `--project` for additional allowlisted roots. The server binds to diff --git a/docs/reference/contracts/artifact-schemas.md b/docs/reference/contracts/artifact-schemas.md index e03ec37..da32d94 100644 --- a/docs/reference/contracts/artifact-schemas.md +++ b/docs/reference/contracts/artifact-schemas.md @@ -28,6 +28,22 @@ Current imported schema set includes: - quality report - release readiness - execution trace +- graph manifest, node, edge, context bundle, and memory decision +- graph-native workflow 2.0 and immutable node-result envelope 2.0 +- graph-native workflow and node-instance envelope 2.1 +- operator-owned execution profile with economy, standard, and judgment tiers +- graph-native workflow and immutable node-result envelope 2.2 + +Version 2.1 adds bounded maps, item streams, allowlisted transforms, threshold +joins, typed failure collection, until-dry convergence, and immutable instance +identity. Version 2.0 remains a separate accepted contract for existing run +snapshots and locally activated revisions. RAE does not rewrite private +registries or migrate stored runs automatically. + +Version 2.2 adds local durable wait nodes, typed signal contracts, bounded +context manifests, and immutable references for predecessor records that do +not fit inline. It is experimental and does not connect the local scheduler to +the hosted platform. See [Workflow 2.2 Contract](workflow-v2.2.md). Umbrella eval/runtime schemas additionally include: diff --git a/docs/reference/contracts/execution-profile-v3.md b/docs/reference/contracts/execution-profile-v3.md new file mode 100644 index 0000000..0aef780 --- /dev/null +++ b/docs/reference/contracts/execution-profile-v3.md @@ -0,0 +1,79 @@ +--- +status: experimental +owner: orchestration +last_reviewed: 2026-08-04 +source_of_truth: packages/orchestration/contracts/workflows/execution-profile-v3.schema.json +evidence_links: ../claims/claims-ledger.md +--- + +# Execution profile 3.0 + +Execution profile schema `3.0.0` maps logical workflow tiers to named provider +routes. Workflow 2.1 remains provider-neutral. Provider selection is local run +configuration and is not stored in the workflow revision. + +Each route declares an `executor` and `model`. Codex routes declare +`reasoning_effort`; OpenCode routes may declare `variant`. The `tiers` object +maps `economy`, `standard`, and `judgment` to route IDs. `node_routes` may +override a route for a specific provider-backed workflow node. + +```json +{ + "schema_version": "3.0.0", + "profile_id": "local-mixed", + "routes": { + "routine": { + "executor": "codex", + "model": "gpt-5.6-terra", + "reasoning_effort": "medium" + }, + "review": { + "executor": "opencode", + "model": "openrouter/example-model", + "variant": "high" + } + }, + "tiers": { + "economy": "routine", + "standard": "routine", + "judgment": "review" + }, + "node_routes": { + "security-review": "review" + } +} +``` + +Profiles cannot contain credentials, commands, executable paths, tool grants, +or remote configuration references. RAE snapshots the canonical profile +digest and the resolved route, model, executor version, and executable digest +for every provider-backed node. Resume fails when this provenance drifts. + +OpenCode is explicit and is never selected by `--provider auto`. OpenCode write +routes require an isolated RAE worktree and the macOS `sandbox-exec` backend. +The launcher verifies OpenCode's merged configuration before execution and +admits only read, glob, grep, workspace edit when required, and RAE's opaque +verification broker. Shell, web, external-directory, subagent, skill, plugin, +question, and unapproved MCP access remain denied. + +The first OpenCode release supports provider models configured in OpenCode, +including `opencode/...` and `openrouter/...`. RAE does not call OpenRouter +directly. + +## Interpretation limits + +- the workflow remains provider-neutral, but selected prompts and repository + context still cross the configured provider boundary +- local doctor and containment checks do not prove provider-side storage, + retention, availability, or model behavior +- the current OpenCode adapter is a macOS-only execution surface + +## Source note + +- [OpenCode CLI](../claims/bibliography.md#src-opencode-cli) +- [OpenCode configuration](../claims/bibliography.md#src-opencode-config) +- [OpenCode permissions](../claims/bibliography.md#src-opencode-permissions) +- [OpenCode tools](../claims/bibliography.md#src-opencode-tools) +- [OpenCode providers](../claims/bibliography.md#src-opencode-providers) +- [JSON Schema 2020-12](../claims/bibliography.md#src-json-schema-2020-12) +- [Apple App Sandbox file access](../claims/bibliography.md#src-apple-app-sandbox) diff --git a/docs/reference/contracts/graph-memory.md b/docs/reference/contracts/graph-memory.md new file mode 100644 index 0000000..12a8f34 --- /dev/null +++ b/docs/reference/contracts/graph-memory.md @@ -0,0 +1,188 @@ +--- +status: experimental +owner: orchestration +last_reviewed: 2026-07-29 +source_of_truth: packages/orchestration/contracts/graph +evidence_links: ../claims/evidence-index.md +--- + +# Local Graph and Memory Contracts + +RAE can build four local graph projections: repository structure, workflow +state, run evidence, and cross-run memory. The feature is optional. Autonomous +runs use `--graph-memory off` unless an operator explicitly selects `read` or +`read-write`. + +The graph augments retrieval and explanations. It does not replace artifacts, +`trace.jsonl`, gates, checkpoints, policies, evaluator code, Git state, or plan +ownership. + +## Storage + +One run projection is stored under: + +```text +.pipeline/runs//graph/ + manifest.json + nodes.jsonl + edges.jsonl + contexts/.json +``` + +Repository-only builds use a stable synthetic run ID derived from the current +snapshot. Cross-run memory is stored outside the public worktree in the target +repository's Git common directory at `/rae-memory/v1/`. + +Graph and memory files use owner-only permissions, atomic replacement, and an +exclusive memory lock. Human promotion, rejection, supersession, and +invalidation records are append-only. Projections and admitted facts are +rebuildable from source artifacts. + +Repository identity is the SHA-256 digest of the canonical Git common +directory. Snapshot identity combines the `HEAD` tree digest with a digest of +the dirty overlay. Runtime files under `.pipeline/` do not affect that overlay. + +## Record model + +Node, edge, manifest, context, and memory-decision schemas live under +`packages/orchestration/contracts/graph/`. Every node and edge records its +graph family, repository and run namespace, stable logical ID, +content-addressed version ID, source reference and digest, projector version, +transaction time, validity interval, and trust class. + +Trust classes are enforced as filters: + +- `authoritative` covers repository-owned contracts, Git identity, captured + commands, gates, and human decisions +- `verified-derived` covers deterministic relations reconstructed from those + sources +- `model-proposed` covers relations extracted from model-authored artifacts +- `untrusted` covers quarantined or conflicting memory candidates + +The provenance fields are a compact JSON profile informed by +[W3C PROV-O](https://www.w3.org/TR/prov-o/). RAE does not add RDF storage or an +external graph service. + +## Repository projection + +The projector reads tracked regular files and plan-owned changed or new files. +It excludes symlinks, submodules, binaries, credential-like paths, `.pipeline` +state, files outside the canonical repository, and files larger than 1 MiB. + +Dependency-free extractors record exact literal path relationships for JSON, +TOML, JavaScript module syntax, CommonJS, shell sourcing, and Markdown links. +Python imports are parsed with the required Python runtime's standard `ast` +module. Unsupported languages retain file and exact-reference relationships. +The projector does not infer authoritative symbol, call, or data-flow edges. + +Builds fail closed for orphan edges, duplicate IDs, unresolved sources, digest +mismatches, invalid validity intervals, cross-repository records, malformed +JSONL, or configured size bounds. Completed-run projections additionally +require every MUST requirement to reach a plan task, test case, captured +command, and gate decision. + +## Retrieval + +Queries rank exact paths and identifiers first, then lexical overlap, then +bounded graph distance. Trust and current-source validity are hard filters. +Each result includes its source reference, digest, selection reason, traversal +path, score components, staleness status, and source snippet. + +Traversal depth is limited to four, output is limited to 200 records, source +files are limited to 1 MiB, and projections are limited to 250,000 nodes and +1,000,000 edges. Autonomous phase retrieval currently requests at most 50 run +records and 50 admitted memory records. A limit or validation failure stops the +opted-in graph operation. The default non-graph workflow remains available. + +## Temporal memory + +`read` retrieves only current `authoritative` and `verified-derived` facts from +the same repository identity. `read-write` also imports successful recorded +outcomes and quarantines model-proposed candidates after run completion. + +Changed facts are superseded rather than overwritten. Retrieval excludes +rejected, superseded, invalidated, stale, conflicting, and cross-repository +facts. Promotion requires a candidate ID, actor, rationale, and a safe +repository-relative corroborating source. Rejection preserves the candidate +and decision. + +Memory does not broaden plan ownership, provider access, mutation scope, or +publication authority. + +## CLI + +```bash +./scripts/rae.sh graph build --project-root /path/to/repository +./scripts/rae.sh graph status --project-root /path/to/repository +./scripts/rae.sh graph query --project-root /path/to/repository \ + --seed 'File:src/main.js' +./scripts/rae.sh graph explain --project-root /path/to/repository \ + --run-id --node 'Requirement:REQ-001' +./scripts/rae.sh graph memory list --project-root /path/to/repository +``` + +Use `--json` for the contract-defined representation. Human-readable key/value +output is the default. + +## Threat model + +The primary risks are prompt injection in source text, memory poisoning, stale +facts, high-degree hub manipulation, topology fabricated by a model, protected +path ingestion, and cross-project leakage. RAE limits these risks through exact +extractors, source digests, repository namespaces, hard trust filters, +quarantine, bounded traversal, credential-path exclusion, and source snippets. + +Graph text remains untrusted input to a provider. Operators must not treat a +relationship or summary as authorization. Raw prompts, provider metadata, +absolute paths, untrusted memory text, and unrestricted queries are excluded +from the operator API. The operator receives only health counts. + +## Experimental status + +The projection and safety contracts have deterministic local tests. Graph- +informed execution remains experimental until the frozen retrieval benchmark +shows one of these outcomes without reducing held-out task passes: + +- Recall@10 improves by at least 10 percentage points +- recall is preserved while context tokens fall by at least 25 percent + +It must also show zero cross-project or protected-path leakage, p95 query +latency no greater than 250 ms on the 100,000-node fixture, and projection time +no greater than 30 seconds on the 10,000-file fixture. No such result is +claimed by this contract page. + +The checked-in 50-task retrieval set and local comparison runner live under +`evals/datasets/graph-context/` and +`packages/orchestration/scripts/eval/graph-context-benchmark.mjs`. The runner +does not execute a provider, so task pass count remains unresolved and its +result cannot satisfy the experimental exit criteria by itself. + +The design is informed by evidence that graph retrieval is useful for +relational and repository-structure questions but is not uniformly better than +strong flat retrieval. See [GraphRAG-Bench](https://graphrag-bench.github.io/), +[CodexGraph](https://aclanthology.org/2025.naacl-long.7/), +[RepoGraph](https://arxiv.org/abs/2410.14684), and +[Does Memory Need Graphs?](https://aclanthology.org/2026.acl-long.1232/). +Temporal and security boundaries are informed by +[Graphiti](https://arxiv.org/abs/2501.13956), +[GraphRAG under Fire](https://arxiv.org/abs/2501.14050), and +[LongMemEval-V2](https://arxiv.org/abs/2605.12493). + +## Current limitations + +- Rich language-specific symbol and call graphs require a future adapter. +- Memory promotion is a local CLI operation, not an operator-console control. +- The operator exposes health counts but no unrestricted graph browser. +- Benchmark thresholds must be satisfied before graph execution can leave + experimental status. + +## Source note + +- [W3C PROV-O](../claims/bibliography.md#src-w3c-prov-o) +- [GraphRAG-Bench](../claims/bibliography.md#src-graphrag-bench) +- [CodexGraph](../claims/bibliography.md#src-codexgraph) +- [RepoGraph](../claims/bibliography.md#src-repograph) +- [Does Memory Need Graphs?](../claims/bibliography.md#src-does-memory-need-graphs) +- [Graphiti](../claims/bibliography.md#src-graphiti) +- [GraphRAG under Fire](../claims/bibliography.md#src-graphrag-under-fire) +- [LongMemEval-V2](../claims/bibliography.md#src-longmemeval-v2) diff --git a/docs/reference/contracts/workflow-v2.2.md b/docs/reference/contracts/workflow-v2.2.md new file mode 100644 index 0000000..130ce75 --- /dev/null +++ b/docs/reference/contracts/workflow-v2.2.md @@ -0,0 +1,65 @@ +--- +status: experimental +owner: orchestration +last_reviewed: 2026-08-04 +source_of_truth: packages/orchestration/contracts/workflows/workflow-v2.2.schema.json +evidence_links: ../claims/claims-ledger.md +--- + +# Workflow 2.2 Contract + +Workflow 2.2 is an experimental local scheduler contract for durable waits and +operator signals. It is separate from the experimental hosted platform. The +local scheduler requires a durable run directory and is selected only for a +workflow whose `schema_version` is `2.2.0`. + +## Schema shape + +A workflow declares an identifier, revision, entry and terminal nodes, nodes, +edges, and at least one signal contract. Nodes may be `agent`, `join`, `gate`, +`checkpoint`, `wait`, or `terminal`. A wait node declares a timeout from 60 +seconds through 30 days, its accepted signal names, and the signal contract +that validates a recorded payload. + +Budgets constrain concurrency to 1 through 4, attempts per node to 1 through +3, and context to 16 KiB through 256 KiB. The default context cap is 128 KiB. +The immutable node envelope records input and output digests, an execution +tier, evidence fields, and a context manifest with included, omitted, inline, +and referenced inputs. + +## Context assembly + +The scheduler orders mandatory context as task, node guidance, mapped item, +and predecessor records. It either includes a complete predecessor object or +an immutable artifact reference. If mandatory material cannot fit, scheduling +fails before a provider call. Operational evidence, verified graph records, +and admitted memory are optional and require explicit policy permission and +budget. + +This is a bounded-context implementation property. It does not establish a +context-efficiency benefit. A frozen comparison with a predefined 25 percent +threshold remains required before any efficiency claim can be made. + +## Wait state + +Wait signals are persisted under +`.pipeline/runs//workflow/wait-state.json`. Signal recording is +idempotent per wait node and idempotency key. On resume, the reducer consumes +the earliest accepted unconsumed signal at or before the wait deadline. A wait +does not invoke a provider while it is open. A timed-out wait creates a failed +node envelope and follows failure edges when the workflow defines them. + +Workflow 2.2 does not migrate stored 2.0 or 2.1 runs or private registries. +Use [Run a Workflow 2.2 Wait](../../how-to/run-workflow-v2.2-wait.md) and +[Recover a Workflow 2.2 Wait](../../how-to/recover-workflow-v2.2-wait.md) for +local operations. + +## Source note + +- [NIST GenAI Profile](../claims/bibliography.md#src-nist-genai-profile) +- [Model Cards](../claims/bibliography.md#src-model-cards) +- [Datasheets](../claims/bibliography.md#src-datasheets) +- [OpenAI evals guidance](../claims/bibliography.md#src-openai-evals) +- [PaperBench](../claims/bibliography.md#src-openai-paperbench) +- [IEEE 1012](../claims/bibliography.md#src-ieee-1012) +- [Diataxis](../claims/bibliography.md#src-diataxis) diff --git a/docs/reference/terminology.md b/docs/reference/terminology.md index e7361b7..1f0eab0 100644 --- a/docs/reference/terminology.md +++ b/docs/reference/terminology.md @@ -1,7 +1,7 @@ --- status: stable owner: core -last_reviewed: 2026-04-12 +last_reviewed: 2026-08-04 source_of_truth: editorial evidence_links: claims/claims-ledger.md --- @@ -35,6 +35,20 @@ evidence_links: claims/claims-ledger.md - `orchestration` A staged workflow that separates intake, design, build, and verification into bounded phases. +- `Codex subagent` + A delegated collaborator inside one native Codex task. It is distinct from a + RAE node, which starts a fresh durable `codex exec` session. +- `node instance` + One immutable execution of a logical workflow node, optionally bound to a + stable mapped-item key. +- `execution tier` + A workflow-owned logical request for economy, standard, or judgment work. An + operator-owned execution profile resolves it to a named Codex or OpenCode + route without placing provider configuration in the workflow. +- `execution route` + An operator-owned executor and model mapping selected by a logical tier or a + node-specific override. Routes are stored in execution profile 3.0, not in + workflow revisions. ## Thesis validation diff --git a/docs/tutorials/autonomous-code-change.md b/docs/tutorials/autonomous-code-change.md index 6207261..ffdfa6a 100644 --- a/docs/tutorials/autonomous-code-change.md +++ b/docs/tutorials/autonomous-code-change.md @@ -38,6 +38,7 @@ deterministic tools and benchmarks can run without one. ./scripts/rae.sh agent run \ --project-root /path/to/target-repo \ --checkpoint-policy before-mutation-and-ship \ + --graph-memory off \ --task "Add a tested health endpoint and document its response contract" ``` @@ -71,6 +72,12 @@ publish, or deploy action, and supported Codex runs reject protected Git-state changes after every phase. A completed run therefore ends in `implemented-awaiting-human-release-review`. +Graph retrieval is explicitly optional. `--graph-memory read` adds bounded, +source-backed repository and admitted memory context. `read-write` also records +verified completed-run outcomes and quarantines model-proposed candidates. The +default `off` mode performs no graph read or memory write. Graph context cannot +broaden the plan's owned paths or change a gate or checkpoint. + ![Deterministic output from `rae.sh agent --help` showing the isolated-worktree default, sandbox modes, prohibited actions, and command-provider opt-in.](../assets/screenshots/rae-agent-safety.svg) diff --git a/docs/tutorials/graph-engineering-with-rae.md b/docs/tutorials/graph-engineering-with-rae.md new file mode 100644 index 0000000..9a250f5 --- /dev/null +++ b/docs/tutorials/graph-engineering-with-rae.md @@ -0,0 +1,305 @@ +--- +status: experimental +owner: orchestration +last_reviewed: 2026-08-04 +source_of_truth: packages/orchestration/contracts/workflows/workflow-v2.1.schema.json +evidence_links: ../reference/claims/evidence-index.md +--- + +# Graph Engineering with RAE + +This course has two layers. The topology layer explains what work can proceed +and what must wait. The contract layer names the workflow fields that make that +decision durable and reviewable. + +RAE workflows are provider-neutral. Native Codex +[subagents](https://learn.chatgpt.com/docs/agent-configuration/subagents) are +collaborators inside one Codex task. A RAE agent node is a durable workflow +unit whose provider route is selected by the operator. Codex and OpenCode +attempts both start fresh sessions and persist only validated workflow output +and sanitized execution evidence. Writer runs use isolated Git +[worktrees](https://learn.chatgpt.com/docs/environments/git-worktrees). Nodes do +not share a model conversation. + +Every agent or mapped agent instance consumes model tokens. Scheduling, joins, +condition evaluation, and allowlisted transforms do not call a model. A wider +graph can therefore increase cost even when its critical path is shorter. + +## 1. Data and control edges + +![Artifact, stream, condition, and loop-back edge contracts](../assets/diagrams/graph-edge-classification.svg) + +Topology layer: an artifact edge carries one completed envelope. A stream edge +opens the matching mapped successor as soon as one item succeeds. A condition +edge selects a route. A loop-back edge stays inside a bounded loop. + +Contract layer: `edges[].type` is one of `sequence`, `artifact`, `stream`, +`condition`, or `loop-back`. Conditions are fixed vocabulary. Workflow JSON +cannot contain an expression evaluator. + +## 2. Contract-bound nodes + +An agent node has guidance and an optional payload contract. The runtime passes +only typed predecessor envelopes and the mapped item, when present. A node can +request a logical `economy`, `standard`, or `judgment` tier. It cannot name a +provider, model, tool, command, environment value, or reasoning effort. + +The operator owns concrete provider and model selection in execution profile +3.0: + +```json +{ + "schema_version": "3.0.0", + "profile_id": "local-routing", + "routes": { + "routine": { + "executor": "codex", + "model": "operator-codex-model", + "reasoning_effort": "medium" + }, + "review": { + "executor": "opencode", + "model": "opencode/example-model", + "variant": "high" + } + }, + "tiers": { + "economy": "routine", + "standard": "routine", + "judgment": "review" + } +} +``` + +Replace the model identifiers with models available through the selected local +executors. The profile is validated and snapshotted by digest. +`--execution-profile` cannot be combined with global provider, model, +reasoning-effort, or variant overrides. Resume requires the stored profile, +resolved routes, models, and exact executor versions. See [Execution Profile +3.0](../reference/contracts/execution-profile-v3.md) for the full contract and +OpenCode platform limits. + +## 3. Diamonds and deterministic reduction + +![Barrier diamond compared with an item streaming pipeline](../assets/diagrams/diamond-versus-pipeline.svg) + +A diamond fans one artifact into independent lenses and reduces their outputs. +Use `all` when every lens is mandatory, first-success `any` when one sufficient +answer is enough, and `quorum` when a declared threshold is the evidence rule. +Already-started branches continue to settle after `any` chooses a winner, so +the evidence trace does not hide late failures. + +Use a transform node for mechanical reduction. The allowlist is `select`, +`flatten`, `deduplicate`, `sort`, `limit`, `group`, and bounded `cartesian`. +Transforms operate on JSON values only. + +## 4. Barriers and streaming pipelines + +A normal artifact edge is a barrier at the logical-node boundary. A `stream` +edge lets one mapped successor start per successful predecessor instance. One +mapped stage can have only one stream predecessor. Map size is at most 32, +stream depth is at most four, concurrency is at most four, and a run is capped +at 128 dynamic instances or provider attempts. + +Stable fan-out identity comes from an RFC 6901 pointer into each item. The +runtime records the stable key and item digest separately. Resume recreates +missing instances without repeating completed identities. + +## 5. Conditional routing and diverse-lens quorum + +![Conditional routes entering a diverse-lens quorum](../assets/diagrams/routing-and-quorum.svg) + +Routing decides relevance. Quorum decides sufficiency. Keep those policies in +separate nodes so an omitted route cannot silently lower the verification +threshold. Grouped quorum can require representation from named lens groups in +addition to an overall threshold. + +`collect` failure handling is valid only for read or control work that feeds an +explicit threshold join. Writers and unhandled failures remain fail-closed. A +quorum fails as soon as its remaining inputs cannot satisfy the threshold. + +## 6. Retry and failure containment + +Each provider attempt has a fresh session identifier and a typed envelope. +After retry exhaustion, the failed envelope remains in the trace. A workflow +does not convert an exception into success. Writer nodes remain globally +serialized in the isolated worktree, and a writer waits for active readers to +drain. + +## 7. Bounded and until-dry cycles + +![Until-dry convergence across all previously seen keys](../assets/diagrams/until-dry-convergence.svg) + +A bounded loop stops after at most five rounds. An `until-dry` loop also stops +when a round yields no globally unseen stable key. The seen set includes every +previous decision, including rejected findings. This prevents a rejected item +from being rediscovered forever under a different round. + +## 8. Design, analyze, propose, and activate + +![Human-activated workflow lifecycle](../assets/diagrams/human-activated-workflow-lifecycle.svg) + +Start the loopback operator to use the synchronized Loop, Graph, Analyze, and +JSON views: + +```bash +./scripts/rae.sh operator serve \ + --project /path/to/target-repository \ + --execution-profile /absolute/path/to/execution-profile.json +``` + +The guided editor provides single-agent verification, maker-checker repair, +parallel review with quorum, mapped work, and bounded until-dry templates. Each +template compiles to workflow 2.1. Node and edge controls are keyboard +operable; JSON remains available for existing workflow 2.0 and experimental +2.2 revisions. + +Analyze a workflow file without saving it: + +```bash +./scripts/rae.sh graph workflow analyze \ + --workflow-file /absolute/path/to/workflow.json \ + --execution-profile /absolute/path/to/execution-profile.json +``` + +The analyzer reports schema and topology diagnostics, unreachable nodes, +writer and verification paths, bounded attempt and instance estimates, +concurrency bounds, and resolved execution routes. It does not invent a cost +estimate when provider usage data is unavailable. + +Generate a validated candidate without saving it: + +```bash +./scripts/rae.sh graph workflow propose \ + --project-root /path/to/target-repository \ + --task "Design a bounded review topology for this repository" \ + --base-workflow graph-native-default \ + --actor "operator-name" \ + --rationale "Draft for topology review" \ + --execution-profile /absolute/path/to/execution-profile.json \ + --preview +``` + +The proposal session is read-only and ephemeral. RAE permits one correction +attempt after local validation. `--preview` returns the candidate without +saving it; omitting `--preview` stores a valid optimistic-lock draft. Neither +mode activates or executes the result. + +Review and activate an exact revision: + +```bash +./scripts/rae.sh graph workflow validate \ + --project-root /path/to/target-repository \ + --workflow graph-native-default --revision 2 + +./scripts/rae.sh graph workflow diff \ + --project-root /path/to/target-repository \ + --workflow graph-native-default --from 1 --to 2 + +./scripts/rae.sh graph workflow activate \ + --project-root /path/to/target-repository \ + --workflow graph-native-default --revision 2 \ + --digest \ + --actor "operator-name" \ + --rationale "Reviewed contracts, bounds, and writer path" +``` + +Activation affects future runs only. Existing runs keep their immutable 2.0 or +2.1 snapshot. + +## Six topology recipes + +The maintained recipe files are under +`packages/orchestration/workflows/recipes/`. Validate a recipe before using it, +then pass the same file to `agent run`. + +### Route auditing + +`route-audit.workflow.json` maps a bounded route inventory, applies specialist +checks, and joins all results before verification. + +```bash +./scripts/rae.sh graph workflow validate --project-root "$PWD" \ + --workflow-file packages/orchestration/workflows/recipes/route-audit.workflow.json +./scripts/rae.sh agent run --project-root /path/to/target \ + --workflow "$PWD/packages/orchestration/workflows/recipes/route-audit.workflow.json" \ + --task "Audit declared routes against handlers, authorization, and tests" +``` + +### Cited research + +`cited-research.workflow.json` separates claim collection, source checking, and +quorum synthesis. Citations remain payload data, not executable references. + +```bash +./scripts/rae.sh agent run --project-root /path/to/target \ + --workflow "$PWD/packages/orchestration/workflows/recipes/cited-research.workflow.json" \ + --execution-profile /absolute/path/to/operator-profile.json \ + --task "Research the requested change and return source-backed constraints" +``` + +### Module migration + +`module-migration.workflow.json` maps read-only module analysis, forms an +ownership plan, crosses a mutation checkpoint, and uses one serialized writer. + +```bash +./scripts/rae.sh agent run --project-root /path/to/target \ + --workflow "$PWD/packages/orchestration/workflows/recipes/module-migration.workflow.json" \ + --checkpoint-policy before-mutation \ + --task "Migrate the selected modules while preserving their public contracts" +``` + +### Adversarial review + +`adversarial-review.workflow.json` uses independent safety, contract, test, and +scope lenses with a three-of-four quorum. + +```bash +./scripts/rae.sh agent run --project-root /path/to/target \ + --workflow "$PWD/packages/orchestration/workflows/recipes/adversarial-review.workflow.json" \ + --task "Review the proposed design for blocking risks" +``` + +### Scheduled ecosystem scanning + +`ecosystem-scan.workflow.json` maps a bounded package inventory and performs a +deterministic deduplication before verification. Scheduling belongs to the +operator's local scheduler; RAE itself does not install a timer. + +```bash +./scripts/rae.sh agent run --project-root /path/to/target \ + --workflow "$PWD/packages/orchestration/workflows/recipes/ecosystem-scan.workflow.json" \ + --task "Scan the declared ecosystem snapshot for actionable compatibility changes" +``` + +### Unknown-size discovery + +`unknown-size-discovery.workflow.json` uses an until-dry loop with a 32-item +round bound and five-round ceiling. + +```bash +./scripts/rae.sh agent run --project-root /path/to/target \ + --workflow "$PWD/packages/orchestration/workflows/recipes/unknown-size-discovery.workflow.json" \ + --task "Discover and inspect all previously unseen integration points" +``` + +## Evidence limits + +The deterministic topology benchmark measures event order, fixture critical +path, and barrier idle time. It does not establish model quality or a universal +speed advantage. Provider results, hardware, repository shape, and task +difficulty remain outside that fixture's claim. + +## Source note + +- [Codex subagents](https://learn.chatgpt.com/docs/agent-configuration/subagents) +- [Codex non-interactive mode](https://learn.chatgpt.com/docs/non-interactive-mode) +- [Codex Git worktrees](https://learn.chatgpt.com/docs/environments/git-worktrees) +- [NIST GenAI Profile](../reference/claims/bibliography.md#src-nist-genai-profile) +- [OpenAI evals guidance](../reference/claims/bibliography.md#src-openai-evals) +- [PaperBench](../reference/claims/bibliography.md#src-openai-paperbench) +- [IEEE 1012](../reference/claims/bibliography.md#src-ieee-1012) +- [Model Cards](../reference/claims/bibliography.md#src-model-cards) +- [Datasheets](../reference/claims/bibliography.md#src-datasheets) +- [Amdahl 1967](../reference/claims/bibliography.md#src-amdahl-1967) diff --git a/evals/README.md b/evals/README.md index 4b76ac2..46a108c 100644 --- a/evals/README.md +++ b/evals/README.md @@ -30,6 +30,7 @@ This directory is the umbrella’s measurement layer. - `./scripts/rae.sh eval outcome --task-bundle ... --fixture-root ... --policy ... --split ... --output-dir ... --acknowledge-provider-usage` - `./scripts/rae.sh eval compare-outcomes --baseline ... --challenger ... --output ...` - `./scripts/rae.sh eval optimize --campaign ... --baseline-evaluation ... --candidate-policy ... --candidate-evaluation ... --sealed-evaluation ... --output-dir ...` +- `./scripts/rae.sh eval improve --campaign evals/campaigns/autonomous-policy-improvement.v2.json ...` - `./scripts/rae.sh release-gate --benchmark-card ... --run-card ... --regression-report ... --ledger ... --output ...` - `./evals/harness/run-local.sh validate` - `./evals/harness/run-local.sh suite ` @@ -71,3 +72,10 @@ aggregates and pairs raw challenger reports against the actual incumbent, requires an exact evaluator manifest, retains every decision, requires identical development task matrices plus a distinct held-out task-matrix digest, and cannot promote a policy automatically. + +`eval improve` is the v2 evaluator-owned wrapper around that bounded campaign. +It permits at most ten candidates, freezes task matrices, evaluator and judge +code, runtime envelope, payload contracts, and the trusted manifest. Candidate +policies remain data-only and may vary only the declared roles, guidance, safe +topology nodes and edges, joins, or loop bounds. A recommendation is an +append-only lineage artifact, never an activation. diff --git a/evals/campaigns/autonomous-policy-improvement.v2.json b/evals/campaigns/autonomous-policy-improvement.v2.json new file mode 100644 index 0000000..dad987e --- /dev/null +++ b/evals/campaigns/autonomous-policy-improvement.v2.json @@ -0,0 +1,63 @@ +{ + "campaign_id": "autonomous-policy-improvement-v2", + "campaign_version": 2, + "status": "experimental", + "max_iterations": 10, + "baseline_policy_path": "packages/orchestration/policies/default.autonomous-policy.json", + "frozen_surfaces": [ + "task_matrices", + "evaluator_and_judges", + "runtime_envelope", + "payload_contracts", + "trusted_manifest" + ], + "candidate_change_allowlist": [ + "roles", + "guidance", + "safe_nodes", + "edges", + "joins", + "loop_bounds" + ], + "trusted_paths": [ + "evals/schemas/outcome-task-spec.schema.json", + "evals/schemas/outcome-task-bundle.schema.json", + "evals/schemas/outcome-report.schema.json", + "evals/schemas/outcome-comparison.schema.json", + "evals/scripts/lib/outcome_eval.py", + "evals/scripts/lib/outcome_comparison.py", + "evals/scripts/lib/outcome_rae.py", + "evals/scripts/lib/outcome_resources.py", + "evals/scripts/lib/policy_optimizer.py", + "evals/scripts/lib/policy_optimizer_evidence.py", + "evals/scripts/lib/policy_optimizer_policy.py", + "evals/scripts/lib/policy_improvement_campaign.py", + "evals/scripts/run_outcome_benchmark.py", + "evals/scripts/compare_outcome_reports.py", + "evals/scripts/optimize_harness.py", + "evals/scripts/improve_harness.py", + "evals/schemas/improvement-campaign.schema.json", + "packages/orchestration/contracts/autonomous-policy.schema.json", + "packages/orchestration/contracts/workflows/workflow-v2.schema.json", + "packages/orchestration/contracts/workflows/node-envelope-v2.schema.json", + "packages/orchestration/workflows/graph-native-default.workflow.json", + "packages/orchestration/scripts/pipeline/lib/workflow-contract.mjs", + "packages/orchestration/scripts/pipeline/lib/workflow-scheduler.mjs", + "scripts/lib/runtime.sh", + "evals/datasets/autonomous-outcomes/core.task-bundle.json", + "evals/fixtures/autonomous-outcomes/compile-repair/README.md", + "evals/fixtures/autonomous-outcomes/compile-repair/app.py", + "evals/fixtures/autonomous-outcomes/compile-repair/tests/test_app.py", + "evals/fixtures/autonomous-outcomes/logic-regression/README.md", + "evals/fixtures/autonomous-outcomes/logic-regression/calculator.py", + "evals/fixtures/autonomous-outcomes/logic-regression/tests/test_calculator.py", + "evals/fixtures/autonomous-outcomes/scope-stress/README.md", + "evals/fixtures/autonomous-outcomes/scope-stress/normalizer.py", + "evals/fixtures/autonomous-outcomes/scope-stress/tests/test_normalizer.py" + ], + "resource_budget": { + "max_agent_duration_seconds": 7200, + "max_total_tokens": 1000000, + "max_agent_calls": 80 + } +} diff --git a/evals/campaigns/autonomous-policy.experimental.json b/evals/campaigns/autonomous-policy.experimental.json index 275aead..6cabfb1 100644 --- a/evals/campaigns/autonomous-policy.experimental.json +++ b/evals/campaigns/autonomous-policy.experimental.json @@ -15,9 +15,14 @@ "evals/scripts/lib/policy_optimizer.py", "evals/scripts/lib/policy_optimizer_evidence.py", "evals/scripts/lib/policy_optimizer_policy.py", + "evals/scripts/lib/policy_improvement_campaign.py", "evals/scripts/run_outcome_benchmark.py", "evals/scripts/compare_outcome_reports.py", "evals/scripts/optimize_harness.py", + "evals/scripts/improve_harness.py", + "evals/schemas/improvement-campaign.schema.json", + "packages/orchestration/contracts/autonomous-policy.schema.json", + "scripts/lib/runtime.sh", "evals/datasets/autonomous-outcomes/core.task-bundle.json", "evals/fixtures/autonomous-outcomes/compile-repair/README.md", "evals/fixtures/autonomous-outcomes/compile-repair/app.py", diff --git a/evals/datasets/graph-context/README.md b/evals/datasets/graph-context/README.md new file mode 100644 index 0000000..ec8faac --- /dev/null +++ b/evals/datasets/graph-context/README.md @@ -0,0 +1,24 @@ +# Frozen graph-context retrieval tasks + +`graph-context-held-out.json` contains 50 repository-localization tasks frozen +on 2026-07-29. Each task has a natural-language query and one or more expected +repository paths. + +Run the dependency-free comparison from the repository root: + +```bash +npm --prefix packages/orchestration run benchmark:graph-context -- \ + --project-root "$PWD" \ + --output /tmp/rae-graph-context-result.json +``` + +The runner compares path-only current context, lexical retrieval, lexical plus +the repository/evidence graph, and graph retrieval plus promoted memory. It +records Recall@10, estimated context tokens, retrieval latency, projection +time, stale-context rate, leakage, agent calls, and cost. + +This retrieval-only task set does not execute a provider and therefore cannot +measure held-out task pass count. The result keeps that field `null` and cannot +move graph execution out of experimental status. Provider-backed task success, +100,000-node latency, and 10,000-file projection fixtures remain separate +release evidence requirements. diff --git a/evals/datasets/graph-context/graph-context-held-out.json b/evals/datasets/graph-context/graph-context-held-out.json new file mode 100644 index 0000000..91c5412 --- /dev/null +++ b/evals/datasets/graph-context/graph-context-held-out.json @@ -0,0 +1,59 @@ +{ + "schema_version": "1.0.0", + "dataset_id": "graph-context-held-out-v1", + "split": "held-out", + "frozen_at": "2026-07-29", + "task_count": 50, + "tasks": [ + { "id": "GC-001", "query": "umbrella CLI command dispatch and runtime checks", "expected_paths": ["scripts/rae.sh"] }, + { "id": "GC-002", "query": "autonomous command option parsing and help", "expected_paths": ["packages/orchestration/scripts/pipeline/autonomous.mjs"] }, + { "id": "GC-003", "query": "phase execution provider artifact persistence", "expected_paths": ["packages/orchestration/scripts/pipeline/lib/phase-executor.mjs"] }, + { "id": "GC-004", "query": "autonomous run lifecycle request resume lock", "expected_paths": ["packages/orchestration/scripts/pipeline/lib/autonomous-lifecycle.mjs"] }, + { "id": "GC-005", "query": "autonomous workflow actions checkpoints completion", "expected_paths": ["packages/orchestration/scripts/pipeline/lib/autonomous-actions.mjs"] }, + { "id": "GC-006", "query": "phase prompt schemas ownership gate contract", "expected_paths": ["packages/orchestration/scripts/pipeline/lib/autonomous-phase-contract.mjs"] }, + { "id": "GC-007", "query": "append bounded trace events operator projection", "expected_paths": ["packages/orchestration/scripts/pipeline/lib/trace.mjs"] }, + { "id": "GC-008", "query": "must requirement traceability coverage ledger", "expected_paths": ["packages/orchestration/scripts/pipeline/lib/traceability.mjs"] }, + { "id": "GC-009", "query": "quality gate recording phase decision", "expected_paths": ["packages/orchestration/scripts/pipeline/lib/gates.mjs"] }, + { "id": "GC-010", "query": "atomic pipeline JSON state path containment", "expected_paths": ["packages/orchestration/scripts/pipeline/lib/state.mjs"] }, + { "id": "GC-011", "query": "operator durable run discovery public projection", "expected_paths": ["packages/orchestration/operator/lib/runs.mjs"] }, + { "id": "GC-012", "query": "operator loopback HTTP API routing", "expected_paths": ["packages/orchestration/operator/server.mjs"] }, + { "id": "GC-013", "query": "operator bearer origin host security", "expected_paths": ["packages/orchestration/operator/lib/security.mjs"] }, + { "id": "GC-014", "query": "operator child process start resume interrupt", "expected_paths": ["packages/orchestration/operator/lib/control.mjs"] }, + { "id": "GC-015", "query": "brief requirements constraints JSON schema", "expected_paths": ["packages/orchestration/contracts/artifacts/brief.schema.json"] }, + { "id": "GC-016", "query": "execution plan tasks file ownership verification commands schema", "expected_paths": ["packages/orchestration/contracts/artifacts/execution-plan.schema.json"] }, + { "id": "GC-017", "query": "build report outputs coverage schema", "expected_paths": ["packages/orchestration/contracts/artifacts/build-report.schema.json"] }, + { "id": "GC-018", "query": "quality report evidence bundle violations schema", "expected_paths": ["packages/orchestration/contracts/artifacts/quality-report.schema.json"] }, + { "id": "GC-019", "query": "release readiness conditions approvals schema", "expected_paths": ["packages/orchestration/contracts/artifacts/release-readiness.schema.json"] }, + { "id": "GC-020", "query": "execution trace event JSONL contract", "expected_paths": ["packages/orchestration/contracts/artifacts/execution-trace.schema.json"] }, + { "id": "GC-021", "query": "autonomous policy data phase guidance schema", "expected_paths": ["packages/orchestration/contracts/autonomous-policy.schema.json"] }, + { "id": "GC-022", "query": "quality gate contract criteria blocking failures", "expected_paths": ["packages/orchestration/contracts/quality-gate.schema.json"] }, + { "id": "GC-023", "query": "operator console API documentation", "expected_paths": ["packages/orchestration/operator/README.md"] }, + { "id": "GC-024", "query": "orchestration execution model ten stages", "expected_paths": ["packages/orchestration/README.md"] }, + { "id": "GC-025", "query": "repository architecture system overview", "expected_paths": ["docs/reference/architecture/system-overview.md"] }, + { "id": "GC-026", "query": "repository module ownership boundaries", "expected_paths": ["docs/reference/architecture/module-boundaries.md"] }, + { "id": "GC-027", "query": "umbrella CLI reference commands", "expected_paths": ["docs/reference/cli/umbrella.md"] }, + { "id": "GC-028", "query": "orchestration CLI reference stages", "expected_paths": ["docs/reference/cli/orchestration.md"] }, + { "id": "GC-029", "query": "artifact schemas contract documentation", "expected_paths": ["docs/reference/contracts/artifact-schemas.md"] }, + { "id": "GC-030", "query": "human checkpoint decision contract", "expected_paths": ["docs/reference/contracts/human-checkpoints.md"] }, + { "id": "GC-031", "query": "quality gate reference contract", "expected_paths": ["docs/reference/contracts/quality-gates.md"] }, + { "id": "GC-032", "query": "provenance evidence requirements invariant", "expected_paths": ["docs/reference/invariants/provenance-requirements.md"] }, + { "id": "GC-033", "query": "deterministic reproducibility contracts invariant", "expected_paths": ["docs/reference/invariants/determinism-contracts.md"] }, + { "id": "GC-034", "query": "security safety boundaries invariant", "expected_paths": ["docs/reference/invariants/safety-boundaries.md"] }, + { "id": "GC-035", "query": "claims ledger publication evidence", "expected_paths": ["docs/reference/claims/claims-ledger.md"] }, + { "id": "GC-036", "query": "claims evidence index mappings", "expected_paths": ["docs/reference/claims/evidence-index.md"] }, + { "id": "GC-037", "query": "benchmark contamination assumptions register", "expected_paths": ["docs/reference/claims/assumptions-register.md"] }, + { "id": "GC-038", "query": "research source bibliography", "expected_paths": ["docs/reference/claims/bibliography.md"] }, + { "id": "GC-039", "query": "repo audit benchmark card", "expected_paths": ["evals/benchmarks/repo-audit-core.benchmark-card.json"] }, + { "id": "GC-040", "query": "tool selection benchmark card", "expected_paths": ["evals/benchmarks/tool-selection-core.benchmark-card.json"] }, + { "id": "GC-041", "query": "long horizon task specifications", "expected_paths": ["evals/datasets/long-horizon/long-horizon-core.task-specs.json"] }, + { "id": "GC-042", "query": "scoped fix task specifications", "expected_paths": ["evals/datasets/scoped-fix/scoped-fix-core.task-specs.json"] }, + { "id": "GC-043", "query": "autonomous outcomes task bundle", "expected_paths": ["evals/datasets/autonomous-outcomes/core.task-bundle.json"] }, + { "id": "GC-044", "query": "compile repair evaluation fixture", "expected_paths": ["evals/fixtures/autonomous-outcomes/compile-repair/app.py"] }, + { "id": "GC-045", "query": "logic regression calculator fixture", "expected_paths": ["evals/fixtures/autonomous-outcomes/logic-regression/calculator.py"] }, + { "id": "GC-046", "query": "scope stress normalizer fixture", "expected_paths": ["evals/fixtures/autonomous-outcomes/scope-stress/normalizer.py"] }, + { "id": "GC-047", "query": "evaluation local harness commands", "expected_paths": ["evals/harness/run-local.sh"] }, + { "id": "GC-048", "query": "frozen evaluation suite harness", "expected_paths": ["evals/harness/run-frozen-suite.sh"] }, + { "id": "GC-049", "query": "programmatic router judge", "expected_paths": ["evals/judges/programmatic-router-judge.json"] }, + { "id": "GC-050", "query": "repository map package ownership", "expected_paths": ["docs/reference/repo-map.md"] } + ] +} diff --git a/evals/harness/run-local.sh b/evals/harness/run-local.sh index 768c95b..a90cf59 100755 --- a/evals/harness/run-local.sh +++ b/evals/harness/run-local.sh @@ -23,6 +23,7 @@ Commands: compare-outcomes Compare paired outcome reports for optimizer evidence optimize Evaluate a bounded experimental policy campaign from precomputed evidence + improve Evaluate a sealed evaluator-owned RAE v2 improvement campaign suite Execute all frozen benchmark families for dev and held-out splits under evals/results calibrate Run judge calibration release-gate Evaluate release-blocking gates for a run card @@ -73,6 +74,7 @@ run_doctor() { check_file "outcome-runner" "$ROOT_DIR/evals/scripts/run_outcome_benchmark.py" || failed=1 check_file "outcome-compare" "$ROOT_DIR/evals/scripts/compare_outcome_reports.py" || failed=1 check_file "policy-optimizer" "$ROOT_DIR/evals/scripts/optimize_harness.py" || failed=1 + check_file "policy-improvement" "$ROOT_DIR/evals/scripts/improve_harness.py" || failed=1 check_file "release-gate" "$ROOT_DIR/evals/scripts/release_gate.py" || failed=1 if [[ "$failed" -ne 0 ]]; then @@ -109,6 +111,9 @@ main() { optimize) "$PYTHON_BIN" "$ROOT_DIR/evals/scripts/optimize_harness.py" "$@" ;; + improve) + "$PYTHON_BIN" "$ROOT_DIR/evals/scripts/improve_harness.py" "$@" + ;; suite) "$BASH_BIN" "$ROOT_DIR/evals/harness/run-frozen-suite.sh" "$@" ;; diff --git a/evals/schemas/improvement-campaign.schema.json b/evals/schemas/improvement-campaign.schema.json new file mode 100644 index 0000000..f87da8a --- /dev/null +++ b/evals/schemas/improvement-campaign.schema.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "EvaluatorOwnedImprovementCampaignV2", + "type": "object", + "required": ["campaign_id", "campaign_version", "status", "max_iterations", "baseline_policy_path", "frozen_surfaces", "candidate_change_allowlist", "trusted_paths"], + "properties": { + "campaign_id": {"type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$"}, + "campaign_version": {"const": 2}, + "status": {"const": "experimental"}, + "max_iterations": {"type": "integer", "minimum": 1, "maximum": 10}, + "baseline_policy_path": {"type": "string", "minLength": 1}, + "frozen_surfaces": {"type": "array", "uniqueItems": true, "minItems": 5, "maxItems": 5, "items": {"enum": ["task_matrices", "evaluator_and_judges", "runtime_envelope", "payload_contracts", "trusted_manifest"]}}, + "candidate_change_allowlist": {"type": "array", "uniqueItems": true, "minItems": 6, "maxItems": 6, "items": {"enum": ["roles", "guidance", "safe_nodes", "edges", "joins", "loop_bounds"]}}, + "trusted_paths": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "minLength": 1}}, + "resource_budget": {"type": "object"} + }, + "additionalProperties": false +} diff --git a/evals/scripts/improve_harness.py b/evals/scripts/improve_harness.py new file mode 100644 index 0000000..b68b9ff --- /dev/null +++ b/evals/scripts/improve_harness.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +"""Run a bounded evaluator-owned RAE v2 improvement campaign from sealed evidence.""" + +from __future__ import annotations + +import argparse + +from common import load_json +from lib.policy_improvement_campaign import validate_improvement_campaign +from optimize_harness import _path +from optimize_harness import main as optimize_main + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--campaign", required=True) + args, _unknown = parser.parse_known_args() + try: + validate_improvement_campaign(load_json(_path(args.campaign, "campaign"))) + except ValueError as exc: + raise SystemExit(f"invalid improvement campaign: {exc}") from exc + return optimize_main() + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/evals/scripts/lib/outcome_eval.py b/evals/scripts/lib/outcome_eval.py index 8310f65..46a1504 100644 --- a/evals/scripts/lib/outcome_eval.py +++ b/evals/scripts/lib/outcome_eval.py @@ -85,9 +85,14 @@ def _python_unittest(workspace: pathlib.Path, _task: dict[str, Any]) -> list[str "evals/scripts/lib/policy_optimizer.py", "evals/scripts/lib/policy_optimizer_evidence.py", "evals/scripts/lib/policy_optimizer_policy.py", + "evals/scripts/lib/policy_improvement_campaign.py", "evals/scripts/run_outcome_benchmark.py", "evals/scripts/compare_outcome_reports.py", "evals/scripts/optimize_harness.py", + "evals/scripts/improve_harness.py", + "evals/schemas/improvement-campaign.schema.json", + "packages/orchestration/contracts/autonomous-policy.schema.json", + "scripts/lib/runtime.sh", ) diff --git a/evals/scripts/lib/policy_improvement_campaign.py b/evals/scripts/lib/policy_improvement_campaign.py new file mode 100644 index 0000000..44723cf --- /dev/null +++ b/evals/scripts/lib/policy_improvement_campaign.py @@ -0,0 +1,31 @@ +"""Validation for the evaluator-owned RAE v2 improvement campaign.""" + +from __future__ import annotations + +from typing import Any + +from lib.policy_optimizer_policy import IMPROVEMENT_CHANGE_ALLOWLIST, validate_campaign + +_FROZEN_SURFACES = frozenset( + { + "task_matrices", + "evaluator_and_judges", + "runtime_envelope", + "payload_contracts", + "trusted_manifest", + } +) + + +def validate_improvement_campaign(campaign: object) -> dict[str, Any]: + """Require the complete v2 freeze contract before offline optimization.""" + validated = validate_campaign(campaign) + if validated.get("campaign_version") != 2: + raise ValueError("improvement campaign_version must be 2") + if frozenset(validated.get("frozen_surfaces", ())) != _FROZEN_SURFACES: + raise ValueError("improvement campaign must freeze every evaluator-owned surface") + if frozenset(validated.get("candidate_change_allowlist", ())) != IMPROVEMENT_CHANGE_ALLOWLIST: + raise ValueError( + "improvement campaign candidate changes exceed the evaluator-owned allowlist" + ) + return validated diff --git a/evals/scripts/lib/policy_optimizer.py b/evals/scripts/lib/policy_optimizer.py index 8265912..b711fa0 100644 --- a/evals/scripts/lib/policy_optimizer.py +++ b/evals/scripts/lib/policy_optimizer.py @@ -6,8 +6,10 @@ from __future__ import annotations +import json import pathlib -from typing import Any +from dataclasses import dataclass +from typing import Any, cast from common import append_jsonl, dump_json, iso_timestamp @@ -25,10 +27,59 @@ policy_digest, trusted_manifest, validate_campaign, + validate_candidate_policy_change, validate_policy, ) +@dataclass(frozen=True) +class _CampaignRun: + """Keep campaign controls together after the public keyword boundary.""" + + proposer: Proposer + evaluator: Evaluator + trusted_paths: list[pathlib.Path] + output_dir: pathlib.Path + max_iterations: int + resource_budget: dict[str, float] | None + sealed_evaluator: Evaluator | None + candidate_change_allowlist: object + + +def _campaign_run( + proposer: Proposer, + evaluator: Evaluator, + trusted_paths: list[pathlib.Path], + output_dir: pathlib.Path, + controls: dict[str, object], +) -> _CampaignRun: + expected_controls = { + "max_iterations", + "resource_budget", + "sealed_evaluator", + "candidate_change_allowlist", + } + unexpected_controls = sorted(set(controls) - expected_controls) + if unexpected_controls: + raise TypeError( + f"optimize_campaign() got an unexpected keyword argument {unexpected_controls[0]!r}" + ) + if "max_iterations" not in controls: + raise TypeError( + "optimize_campaign() missing 1 required keyword-only argument: 'max_iterations'" + ) + return _CampaignRun( + proposer=proposer, + evaluator=evaluator, + trusted_paths=trusted_paths, + output_dir=output_dir, + max_iterations=cast(int, controls["max_iterations"]), + resource_budget=cast(dict[str, float] | None, controls.get("resource_budget")), + sealed_evaluator=cast(Evaluator | None, controls.get("sealed_evaluator")), + candidate_change_allowlist=controls.get("candidate_change_allowlist"), + ) + + def _record_event( lineage: list[dict[str, Any]], lineage_path: pathlib.Path, event: dict[str, Any] ) -> None: @@ -36,6 +87,22 @@ def _record_event( append_jsonl(lineage_path, event) +def recover_lineage(lineage_path: pathlib.Path) -> list[dict[str, Any]]: + """Read append-only lineage without treating a partial record as evidence.""" + if not lineage_path.exists(): + return [] + recovered: list[dict[str, Any]] = [] + for line_number, line in enumerate(lineage_path.read_text(encoding="utf-8").splitlines(), 1): + try: + event = json.loads(line) + except json.JSONDecodeError as exc: + raise ValueError(f"lineage recovery failed at line {line_number}") from exc + if not isinstance(event, dict): + raise ValueError(f"lineage recovery found a non-object event at line {line_number}") + recovered.append(event) + return recovered + + def _campaign_baseline( baseline_policy: Policy, evaluator: Evaluator, @@ -59,11 +126,13 @@ def _candidate_or_rejection( lineage: list[dict[str, Any]], iteration: int, lineage_path: pathlib.Path, + candidate_change_allowlist: object, ) -> tuple[Policy | None, str]: candidate = proposer(incumbent, lineage) candidate_id = f"candidate-{iteration:02d}" try: validate_policy(candidate) + validate_candidate_policy_change(incumbent, candidate, candidate_change_allowlist) except ValueError as exc: _record_event( lineage, @@ -261,25 +330,25 @@ def optimize_campaign( evaluator: Evaluator, trusted_paths: list[pathlib.Path], output_dir: pathlib.Path, - max_iterations: int, - resource_budget: dict[str, float] | None = None, - sealed_evaluator: Evaluator | None = None, + **controls: object, ) -> dict[str, Any]: """Run a bounded single-challenger campaign with fully retained lineage.""" + campaign = _campaign_run(proposer, evaluator, trusted_paths, output_dir, controls) state, lineage_path = _start_campaign( - baseline_policy, evaluator, trusted_paths, output_dir, max_iterations + baseline_policy, + campaign.evaluator, + campaign.trusted_paths, + campaign.output_dir, + campaign.max_iterations, ) - _run_iterations( + _run_iterations(state, lineage_path, campaign) + return _finish_campaign( + baseline_policy, state, - lineage_path, - proposer, - evaluator, - resource_budget, - output_dir, - max_iterations, - trusted_paths, + campaign.trusted_paths, + campaign.output_dir, + campaign.sealed_evaluator, ) - return _finish_campaign(baseline_policy, state, trusted_paths, output_dir, sealed_evaluator) def _start_campaign( @@ -312,15 +381,10 @@ def _start_campaign( def _run_iterations( state: dict[str, Any], lineage_path: pathlib.Path, - proposer: Proposer, - evaluator: Evaluator, - resource_budget: dict[str, float] | None, - output_dir: pathlib.Path, - max_iterations: int, - trusted_paths: list[pathlib.Path], + campaign: _CampaignRun, ) -> None: - for iteration in range(1, max_iterations + 1): - if trusted_manifest(trusted_paths) != state["initial_manifest"]: + for iteration in range(1, campaign.max_iterations + 1): + if trusted_manifest(campaign.trusted_paths) != state["initial_manifest"]: _record_event( state["lineage"], lineage_path, @@ -332,13 +396,18 @@ def _run_iterations( ) break candidate, candidate_id = _candidate_or_rejection( - proposer, state["incumbent"], state["lineage"], iteration, lineage_path + campaign.proposer, + state["incumbent"], + state["lineage"], + iteration, + lineage_path, + campaign.candidate_change_allowlist, ) if candidate is None: continue - dump_json(output_dir / "candidates" / f"{candidate_id}.policy.json", candidate) + dump_json(campaign.output_dir / "candidates" / f"{candidate_id}.policy.json", candidate) budget_blocked, evaluation, decision = _evaluate_iteration( - state, candidate, evaluator, resource_budget + state, candidate, campaign.evaluator, campaign.resource_budget ) if budget_blocked: _record_event( @@ -351,7 +420,7 @@ def _run_iterations( "reason": "budget-exceeded-or-incomplete-measurement", }, ) - dump_json(output_dir / "evaluations" / f"{candidate_id}.json", evaluation) + dump_json(campaign.output_dir / "evaluations" / f"{candidate_id}.json", evaluation) break if decision is None: raise RuntimeError("policy search did not produce a decision") @@ -363,13 +432,14 @@ def _run_iterations( candidate, evaluation, decision, - output_dir, + campaign.output_dir, ) __all__ = [ "optimize_campaign", "policy_digest", + "recover_lineage", "trusted_manifest", "validate_campaign", "validate_policy", diff --git a/evals/scripts/lib/policy_optimizer_policy.py b/evals/scripts/lib/policy_optimizer_policy.py index 67f1289..83ca448 100644 --- a/evals/scripts/lib/policy_optimizer_policy.py +++ b/evals/scripts/lib/policy_optimizer_policy.py @@ -6,7 +6,7 @@ import json import pathlib import re -from collections.abc import Callable +from collections.abc import Callable, Iterable from typing import Any from common import ROOT, is_within_directory @@ -90,6 +90,9 @@ MAX_TASK_ATTEMPTS = 12 MIN_PAIRED_WINS = 2 MIN_IMPROVEMENT = 0.05 +IMPROVEMENT_CHANGE_ALLOWLIST = frozenset( + {"roles", "guidance", "safe_nodes", "edges", "joins", "loop_bounds"} +) def sha256_file(path: pathlib.Path) -> str: @@ -163,6 +166,33 @@ def validate_policy(policy: Policy) -> None: _validate_policy_inputs(inputs) +def validate_candidate_policy_change( + incumbent: Policy, candidate: Policy, allowed_changes: object = None +) -> None: + """Keep experimental candidates inside the data-only policy surface. + + The current autonomous-policy schema exposes guidance and safe artifact + topology only. The v2 campaign labels that bounded surface with the + broader vocabulary used by future evaluator-owned policy adapters; it + cannot alter runtime commands, judges, evaluator code, or activation. + """ + if allowed_changes is None: + allowlist = IMPROVEMENT_CHANGE_ALLOWLIST + elif isinstance(allowed_changes, Iterable): + allowlist = frozenset(allowed_changes) + else: + raise ValueError("candidate change allowlist must be an iterable") + if allowlist != IMPROVEMENT_CHANGE_ALLOWLIST: + raise ValueError( + "candidate change allowlist must exactly match the evaluator-owned allowlist" + ) + validate_policy(incumbent) + validate_policy(candidate) + changed = {key for key in _POLICY_KEYS if incumbent.get(key) != candidate.get(key)} + if changed - {"policy_id", "phase_guidance", "phase_inputs"}: + raise ValueError("candidate changes an evaluator-forbidden policy field") + + def _validate_campaign_header(campaign: object) -> dict[str, Any]: if not isinstance(campaign, dict): raise ValueError("campaign must be a JSON object") @@ -173,7 +203,12 @@ def _validate_campaign_header(campaign: object) -> dict[str, Any]: "baseline_policy_path", "trusted_paths", } - allowed = required | {"resource_budget"} + allowed = required | { + "resource_budget", + "campaign_version", + "frozen_surfaces", + "candidate_change_allowlist", + } if not _has_campaign_fields(campaign, required, allowed): raise ValueError("campaign fields do not match the optimizer campaign contract") campaign_id = campaign["campaign_id"] diff --git a/evals/scripts/lib/release_gate_core.py b/evals/scripts/lib/release_gate_core.py index dfe9edd..ea0a054 100644 --- a/evals/scripts/lib/release_gate_core.py +++ b/evals/scripts/lib/release_gate_core.py @@ -1,191 +1,79 @@ #!/usr/bin/env python3 -"""Release gate CLI and core checks.""" +"""Compose release-gate contract checks and retain their stable import surface.""" -import json import pathlib -from typing import Any, cast - -from common import ( - RESULTS_ROOT, - iso_timestamp, - load_json, - load_json_object, - path_exists, - repo_relpath, - resolve_metadata_path, +from typing import Any + +from common import iso_timestamp, path_exists, repo_relpath + +from lib.release_gate_evidence import ( + _ARTIFACT_READ_ERRORS, + REQUIRED_RUN_FIELDS, + _benchmark_reference_issues, + _calibration_issues, + _candidate_matches, + _checkpoint_gate_issues, + _declared_input_issues, + _ledger_registration_issues, + _load_ledger_entries, + _load_object, + _prior_gate_report_issues, + _provided_evidence_issues, + _provided_types_match, + _regression_status_issues, + _required_field_issues, + _result_artifact_issues, + _result_payload_issues, + _summary_evidence_issues, + cross_split_evidence_issues, + discover_release_gated_evidence, + verification_evidence_issues, ) - -from lib.release_gate_helpers import ( - path_under_results, - path_within_run_scope, - resolve_declared_results_path, - same_repo_path, - validate_checkpoint_statuses, - validate_verification_evidence_entry, +from lib.release_gate_helpers import path_under_results +from lib.release_gate_resources import ( + _resource_policy_has_limit, + _resource_usage_issues, + _resource_usage_state_issues, + _scalar_resource_issues, + _total_token_issues, ) -REQUIRED_RUN_FIELDS = ( - "benchmark_id", - "benchmark_version", - "split", - "judge_version", - "command", - "result_path", - "judge_calibration_report_path", - "ledger_path", - "regression_report_path", - "cost_usd", - "latency_seconds", +__all__ = ( + "REQUIRED_RUN_FIELDS", + "_ARTIFACT_READ_ERRORS", + "_benchmark_reference_issues", + "_build_gate_report", + "_calibration_issues", + "_candidate_matches", + "_checkpoint_gate_issues", + "_claim_link_issues", + "_declared_input_issues", + "_ledger_registration_issues", + "_load_ledger_entries", + "_load_object", + "_numeric_field_issues", + "_prior_gate_report_issues", + "_provided_evidence_issues", + "_provided_types_match", + "_regression_status_issues", + "_required_field_issues", + "_required_split_issues", + "_resource_policy_has_limit", + "_resource_usage_issues", + "_resource_usage_state_issues", + "_result_artifact_issues", + "_result_payload_issues", + "_scalar_resource_issues", + "_summary_evidence_issues", + "_total_token_issues", + "cross_split_evidence_issues", + "discover_release_gated_evidence", + "path_under_results", + "validate_run_card_contract", + "verification_evidence_issues", ) -def _load_object(path: pathlib.Path) -> dict[str, Any]: - return cast(dict[str, Any], load_json_object(path)) - - -def _required_field_issues(run_card: dict[str, Any]) -> list[str]: - return [ - f"run card missing required field: {field}" - for field in REQUIRED_RUN_FIELDS - if run_card.get(field) in (None, "") - ] - - -def _benchmark_reference_issues(benchmark: dict[str, Any], run_card: dict[str, Any]) -> list[str]: - issues: list[str] = [] - if run_card.get("benchmark_id") not in (None, benchmark["benchmark_id"]): - issues.append("run card benchmark_id does not match benchmark card") - if run_card.get("benchmark_version") not in (None, benchmark["version"]): - issues.append("run card benchmark_version does not match benchmark card") - return issues - - -def _checkpoint_gate_issues( - benchmark: dict[str, Any], - run_card: dict[str, Any], - run_card_path: pathlib.Path, -) -> list[str]: - states, issues = validate_checkpoint_statuses(run_card, run_card_path) - block_pending = benchmark.get("release_gate", {}).get("block_on_pending_checkpoints", True) - if block_pending: - issues.extend( - f"checkpoint not approved: {state}" for state in states if state != "approved" - ) - return issues - - -def _load_ledger_entries(path: pathlib.Path) -> list[dict[str, Any]]: - entries: list[dict[str, Any]] = [] - with path.open("r", encoding="utf-8") as handle: - for line in handle: - if not line.strip(): - continue - entry = json.loads(line) - if isinstance(entry, dict): - entries.append(cast(dict[str, Any], entry)) - return entries - - -def _ledger_registration_issues(ledger_path: pathlib.Path, run_id: object) -> list[str]: - try: - entries = _load_ledger_entries(ledger_path) - except Exception: - return ["result ledger could not be read"] - if not any(entry.get("run_id") == run_id for entry in entries): - return ["run_id missing from result ledger"] - return [] - - -def _regression_status_issues(path: pathlib.Path) -> list[str]: - try: - regression = _load_object(path) - except Exception: - return ["regression report could not be read"] - if regression.get("status") != "pass": - return ["regression report is not pass"] - return [] - - -def _prior_gate_report_issues(run_card: dict[str, Any]) -> list[str]: - if run_card.get("release_gate_status") is None: - return [] - gate_path, issues = resolve_declared_results_path( - run_card, "release_gate_report_path", "release gate report" - ) - if gate_path is None: - return issues - try: - gate_report = _load_object(gate_path) - except Exception: - return [*issues, "release gate report could not be read"] - if gate_report.get("run_id") != run_card.get("run_id"): - issues.append("release gate report run_id mismatch") - return issues - - -def cross_split_evidence_issues( - benchmark: dict[str, Any], - run_card: dict[str, Any], - run_card_path: pathlib.Path, -) -> list[str]: - """Validate non-circular evidence for an earlier required split.""" - regression_path, regression_issues = resolve_declared_results_path( - run_card, "regression_report_path", "regression report" - ) - ledger_path, ledger_issues = resolve_declared_results_path( - run_card, "ledger_path", "result ledger" - ) - issues = [*regression_issues, *ledger_issues] - if regression_path is None or ledger_path is None: - return issues - issues.extend(_required_field_issues(run_card)) - issues.extend(_benchmark_reference_issues(benchmark, run_card)) - issues.extend(_regression_status_issues(regression_path)) - issues.extend(verification_evidence_issues(run_card, run_card_path)) - issues.extend(_checkpoint_gate_issues(benchmark, run_card, run_card_path)) - issues.extend(_ledger_registration_issues(ledger_path, run_card.get("run_id"))) - issues.extend(_prior_gate_report_issues(run_card)) - return issues - - -def _candidate_matches( - candidate: dict[str, Any], - benchmark_id: str, - benchmark_version: str, - required_split: str, -) -> bool: - return all( - ( - candidate.get("evidence_type", "benchmark-run") == "benchmark-run", - candidate.get("benchmark_id") == benchmark_id, - candidate.get("benchmark_version") == benchmark_version, - candidate.get("split") == required_split, - ) - ) - - -def discover_release_gated_evidence( - benchmark: dict[str, Any], - benchmark_id: str, - benchmark_version: str, - required_split: str, - current_run_card: dict[str, Any], - current_run_contract_ok: bool, -) -> bool: - if current_run_card.get("split") == required_split and current_run_contract_ok: - return True - for path in RESULTS_ROOT.rglob("run-card-*.json"): - try: - candidate = _load_object(path) - except (json.JSONDecodeError, ValueError): - continue - if not _candidate_matches(candidate, benchmark_id, benchmark_version, required_split): - continue - if not cross_split_evidence_issues(benchmark, candidate, path): - return True - return False - - def _numeric_field_issues(run_card: dict[str, Any]) -> list[str]: issues: list[str] = [] for field in ("cost_usd", "latency_seconds"): @@ -195,177 +83,6 @@ def _numeric_field_issues(run_card: dict[str, Any]) -> list[str]: return issues -def _resource_policy_has_limit(policy: dict[str, Any]) -> bool: - """Report whether a policy needs a resource-usage payload to enforce a limit.""" - return any( - policy.get(field) is not None - for field in ( - "max_agent_duration_seconds", - "max_agent_calls", - "max_parallelism", - "max_total_tokens", - ) - ) - - -def _scalar_resource_issues(policy: dict[str, Any], usage: dict[str, Any]) -> list[str]: - """Compare independently measured scalar resources with their policy limits.""" - limits = ( - ("max_agent_duration_seconds", "agent_duration_seconds"), - ("max_agent_calls", "agent_calls"), - ("max_parallelism", "max_parallelism"), - ) - issues: list[str] = [] - for policy_field, usage_field in limits: - limit = policy.get(policy_field) - value = usage.get(usage_field) - if limit is not None and (not isinstance(value, (int, float)) or value > limit): - issues.append(f"run card exceeds resource policy {policy_field}") - return issues - - -def _total_token_issues(policy: dict[str, Any], usage: dict[str, Any]) -> list[str]: - """Require both token counters before enforcing a combined token limit.""" - total_limit = policy.get("max_total_tokens") - if total_limit is None: - return [] - input_tokens = usage.get("input_tokens") - output_tokens = usage.get("output_tokens") - if not isinstance(input_tokens, int) or not isinstance(output_tokens, int): - return ["run card lacks total-token measurement"] - if input_tokens + output_tokens > total_limit: - return ["run card exceeds resource policy max_total_tokens"] - return [] - - -def _resource_usage_state_issues(policy: dict[str, Any], usage: object) -> list[str]: - if not isinstance(usage, dict): - return ( - ["run card missing resource_usage"] - if policy.get("require_measurement") or _resource_policy_has_limit(policy) - else [] - ) - status = usage.get("measurement_status") - if status not in {"complete", "partial", "unavailable"}: - return ["run card has invalid resource_usage.measurement_status"] - if policy.get("require_measurement") and status != "complete": - return ["run card resource measurement is not complete"] - return [] - - -def _resource_usage_issues(benchmark: dict[str, Any], run_card: dict[str, Any]) -> list[str]: - """Enforce an optional resource policy without treating unknown usage as zero.""" - policy = benchmark.get("resource_policy") - if policy is None: - return [] - if not isinstance(policy, dict): - return ["benchmark resource_policy must be an object"] - usage = run_card.get("resource_usage") - issues = _resource_usage_state_issues(policy, usage) - if not isinstance(usage, dict): - return issues - issues.extend(_scalar_resource_issues(policy, usage)) - issues.extend(_total_token_issues(policy, usage)) - return issues - - -def _result_payload_issues( - result: object, - benchmark: dict[str, Any], - run_card: dict[str, Any], -) -> list[str]: - if not isinstance(result, dict): - return ["benchmark result must be a JSON object"] - checks = ( - ("run_id", run_card.get("run_id"), "benchmark result run_id mismatch"), - ( - "benchmark_id", - benchmark["benchmark_id"], - "benchmark result benchmark_id mismatch", - ), - ( - "benchmark_version", - benchmark["version"], - "benchmark result benchmark_version mismatch", - ), - ("split", run_card.get("split"), "benchmark result split mismatch"), - ) - for field, expected, message in checks: - if result.get(field) != expected: - return [message] - if "fail_count" not in result or "task_count" not in result: - return ["benchmark result missing failure summary"] - if "aggregate_metrics" not in result: - return ["benchmark result missing aggregate_metrics"] - return [] - - -def _result_artifact_issues( - benchmark: dict[str, Any], - run_card: dict[str, Any], - run_card_path: pathlib.Path, -) -> list[str]: - result_ref = run_card.get("result_path") - if not result_ref: - return [] - try: - result_path = resolve_metadata_path( - result_ref, label="run card result_path", contained_by=RESULTS_ROOT - ) - except ValueError as exc: - return [str(exc)] - if not path_within_run_scope(result_path, run_card_path): - return ["run card result_path is outside current run scope"] - if not result_path.exists(): - return ["benchmark result artifact missing"] - return _result_payload_issues(load_json(result_path), benchmark, run_card) - - -def _calibration_issues(run_card: dict[str, Any]) -> list[str]: - calibration_ref = run_card.get("judge_calibration_report_path") - if not calibration_ref: - return [] - try: - path = resolve_metadata_path( - calibration_ref, - label="judge calibration report", - contained_by=RESULTS_ROOT, - ) - except ValueError as exc: - return [str(exc)] - if not path.exists(): - return ["judge calibration report missing"] - calibration = load_json(path) - if not isinstance(calibration, dict): - return ["judge calibration report must be a JSON object"] - if calibration.get("calibration_case_count", 0) <= 0: - return ["judge calibration report has no calibration cases"] - rate = calibration.get("agreement_rate") - if not isinstance(rate, (int, float)): - return ["judge calibration report missing agreement_rate"] - if rate < 1.0: - return ["judge calibration agreement_rate is below required threshold"] - return [] - - -def _declared_input_issues( - run_card: dict[str, Any], - field: str, - provided_path: pathlib.Path, - mismatch_message: str, -) -> list[str]: - path_ref = run_card.get(field) - if not path_ref: - return [] - try: - declared = resolve_metadata_path( - path_ref, label=f"run card {field}", contained_by=RESULTS_ROOT - ) - except ValueError as exc: - return [str(exc)] - return [] if same_repo_path(declared, provided_path) else [mismatch_message] - - def validate_run_card_contract( benchmark: dict[str, Any], run_card: dict[str, Any], @@ -406,73 +123,6 @@ def validate_run_card_contract( return issues -def _summary_evidence_issues(summary: dict[str, Any]) -> list[str]: - issues: list[str] = [] - status = summary.get("status") - if status in {"partial", "missing"}: - issues.append(f"verification evidence incomplete: {status}") - missing_types = summary.get("missing_types", []) - if isinstance(missing_types, list): - issues.extend( - f"missing required verification evidence type: {evidence_type}" - for evidence_type in missing_types - if isinstance(evidence_type, str) and evidence_type - ) - return issues - - -def _provided_evidence_issues( - provided: list[object], - run_card: dict[str, Any], - run_card_path: pathlib.Path, -) -> tuple[list[str], set[str]]: - issues: list[str] = [] - validated_types: set[str] = set() - for index, entry in enumerate(provided): - if not isinstance(entry, dict): - issues.append(f"verification_evidence.provided[{index}] must be an object") - continue - entry_type = entry.get("type") - if isinstance(entry_type, str) and entry_type: - validated_types.add(entry_type) - issues.extend( - validate_verification_evidence_entry( - entry, index=index, run_card=run_card, run_card_path=run_card_path - ) - ) - return issues, validated_types - - -def _provided_types_match(summary: dict[str, Any], validated_types: set[str]) -> bool: - declared = summary.get("provided_types") - if not isinstance(declared, list): - return True - declared_types = {entry for entry in declared if isinstance(entry, str) and entry} - return declared_types == validated_types - - -def verification_evidence_issues( - run_card: dict[str, Any], run_card_path: pathlib.Path -) -> list[str]: - evidence = run_card.get("verification_evidence") - if evidence is None: - return [] - if not isinstance(evidence, dict): - return ["verification_evidence must be an object when present"] - summary = evidence.get("summary") - if not isinstance(summary, dict): - return ["verification_evidence.summary missing"] - issues = _summary_evidence_issues(summary) - provided = evidence.get("provided") - if not isinstance(provided, list): - return [*issues, "verification_evidence.provided missing"] - provided_issues, validated_types = _provided_evidence_issues(provided, run_card, run_card_path) - issues.extend(provided_issues) - if not _provided_types_match(summary, validated_types): - issues.append("verification evidence provided_types does not match provided entries") - return issues - - def _claim_link_issues(benchmark: dict[str, Any]) -> tuple[list[str], list[Any]]: claim_links = benchmark.get("claim_links", []) required = benchmark.get("release_gate", {}).get("required_claim_links", claim_links) diff --git a/evals/scripts/lib/release_gate_evidence.py b/evals/scripts/lib/release_gate_evidence.py new file mode 100644 index 0000000..48cd5be --- /dev/null +++ b/evals/scripts/lib/release_gate_evidence.py @@ -0,0 +1,345 @@ +"""Evidence and artifact validation for release-gated benchmark runs.""" + +import json +import pathlib +from typing import Any, cast + +from common import RESULTS_ROOT, load_json, load_json_object, resolve_metadata_path + +from lib.release_gate_helpers import ( + path_within_run_scope, + resolve_declared_results_path, + same_repo_path, + validate_checkpoint_statuses, + validate_verification_evidence_entry, +) + +REQUIRED_RUN_FIELDS = ( + "benchmark_id", + "benchmark_version", + "split", + "judge_version", + "command", + "result_path", + "judge_calibration_report_path", + "ledger_path", + "regression_report_path", + "cost_usd", + "latency_seconds", +) + +# Artifact parsing may fail because a run produced unreadable or malformed +# evidence. Preserve those gate failures while allowing implementation bugs +# to surface instead of being misreported as missing evidence. +_ARTIFACT_READ_ERRORS = (OSError, UnicodeDecodeError, ValueError) + + +def _load_object(path: pathlib.Path) -> dict[str, Any]: + return cast(dict[str, Any], load_json_object(path)) + + +def _required_field_issues(run_card: dict[str, Any]) -> list[str]: + return [ + f"run card missing required field: {field}" + for field in REQUIRED_RUN_FIELDS + if run_card.get(field) in (None, "") + ] + + +def _benchmark_reference_issues(benchmark: dict[str, Any], run_card: dict[str, Any]) -> list[str]: + issues: list[str] = [] + if run_card.get("benchmark_id") not in (None, benchmark["benchmark_id"]): + issues.append("run card benchmark_id does not match benchmark card") + if run_card.get("benchmark_version") not in (None, benchmark["version"]): + issues.append("run card benchmark_version does not match benchmark card") + return issues + + +def _checkpoint_gate_issues( + benchmark: dict[str, Any], + run_card: dict[str, Any], + run_card_path: pathlib.Path, +) -> list[str]: + states, issues = validate_checkpoint_statuses(run_card, run_card_path) + block_pending = benchmark.get("release_gate", {}).get("block_on_pending_checkpoints", True) + if block_pending: + issues.extend( + f"checkpoint not approved: {state}" for state in states if state != "approved" + ) + return issues + + +def _load_ledger_entries(path: pathlib.Path) -> list[dict[str, Any]]: + entries: list[dict[str, Any]] = [] + with path.open("r", encoding="utf-8") as handle: + for line in handle: + if not line.strip(): + continue + entry = json.loads(line) + if isinstance(entry, dict): + entries.append(cast(dict[str, Any], entry)) + return entries + + +def _ledger_registration_issues(ledger_path: pathlib.Path, run_id: object) -> list[str]: + try: + entries = _load_ledger_entries(ledger_path) + except _ARTIFACT_READ_ERRORS: + return ["result ledger could not be read"] + if not any(entry.get("run_id") == run_id for entry in entries): + return ["run_id missing from result ledger"] + return [] + + +def _regression_status_issues(path: pathlib.Path) -> list[str]: + try: + regression = _load_object(path) + except _ARTIFACT_READ_ERRORS: + return ["regression report could not be read"] + if regression.get("status") != "pass": + return ["regression report is not pass"] + return [] + + +def _prior_gate_report_issues(run_card: dict[str, Any]) -> list[str]: + if run_card.get("release_gate_status") is None: + return [] + gate_path, issues = resolve_declared_results_path( + run_card, "release_gate_report_path", "release gate report" + ) + if gate_path is None: + return issues + try: + gate_report = _load_object(gate_path) + except _ARTIFACT_READ_ERRORS: + return [*issues, "release gate report could not be read"] + if gate_report.get("run_id") != run_card.get("run_id"): + issues.append("release gate report run_id mismatch") + return issues + + +def _summary_evidence_issues(summary: dict[str, Any]) -> list[str]: + issues: list[str] = [] + status = summary.get("status") + if status in {"partial", "missing"}: + issues.append(f"verification evidence incomplete: {status}") + missing_types = summary.get("missing_types", []) + if isinstance(missing_types, list): + issues.extend( + f"missing required verification evidence type: {evidence_type}" + for evidence_type in missing_types + if isinstance(evidence_type, str) and evidence_type + ) + return issues + + +def _provided_evidence_issues( + provided: list[object], + run_card: dict[str, Any], + run_card_path: pathlib.Path, +) -> tuple[list[str], set[str]]: + issues: list[str] = [] + validated_types: set[str] = set() + for index, entry in enumerate(provided): + if not isinstance(entry, dict): + issues.append(f"verification_evidence.provided[{index}] must be an object") + continue + entry_type = entry.get("type") + if isinstance(entry_type, str) and entry_type: + validated_types.add(entry_type) + issues.extend( + validate_verification_evidence_entry( + entry, index=index, run_card=run_card, run_card_path=run_card_path + ) + ) + return issues, validated_types + + +def _provided_types_match(summary: dict[str, Any], validated_types: set[str]) -> bool: + declared = summary.get("provided_types") + if not isinstance(declared, list): + return True + declared_types = {entry for entry in declared if isinstance(entry, str) and entry} + return declared_types == validated_types + + +def verification_evidence_issues( + run_card: dict[str, Any], run_card_path: pathlib.Path +) -> list[str]: + evidence = run_card.get("verification_evidence") + if evidence is None: + return [] + if not isinstance(evidence, dict): + return ["verification_evidence must be an object when present"] + summary = evidence.get("summary") + if not isinstance(summary, dict): + return ["verification_evidence.summary missing"] + issues = _summary_evidence_issues(summary) + provided = evidence.get("provided") + if not isinstance(provided, list): + return [*issues, "verification_evidence.provided missing"] + provided_issues, validated_types = _provided_evidence_issues(provided, run_card, run_card_path) + issues.extend(provided_issues) + if not _provided_types_match(summary, validated_types): + issues.append("verification evidence provided_types does not match provided entries") + return issues + + +def cross_split_evidence_issues( + benchmark: dict[str, Any], + run_card: dict[str, Any], + run_card_path: pathlib.Path, +) -> list[str]: + """Validate non-circular evidence for an earlier required split.""" + regression_path, regression_issues = resolve_declared_results_path( + run_card, "regression_report_path", "regression report" + ) + ledger_path, ledger_issues = resolve_declared_results_path( + run_card, "ledger_path", "result ledger" + ) + issues = [*regression_issues, *ledger_issues] + if regression_path is None or ledger_path is None: + return issues + issues.extend(_required_field_issues(run_card)) + issues.extend(_benchmark_reference_issues(benchmark, run_card)) + issues.extend(_regression_status_issues(regression_path)) + issues.extend(verification_evidence_issues(run_card, run_card_path)) + issues.extend(_checkpoint_gate_issues(benchmark, run_card, run_card_path)) + issues.extend(_ledger_registration_issues(ledger_path, run_card.get("run_id"))) + issues.extend(_prior_gate_report_issues(run_card)) + return issues + + +def _candidate_matches( + candidate: dict[str, Any], + benchmark_id: str, + benchmark_version: str, + required_split: str, +) -> bool: + return all( + ( + candidate.get("evidence_type", "benchmark-run") == "benchmark-run", + candidate.get("benchmark_id") == benchmark_id, + candidate.get("benchmark_version") == benchmark_version, + candidate.get("split") == required_split, + ) + ) + + +def discover_release_gated_evidence( + benchmark: dict[str, Any], + benchmark_id: str, + benchmark_version: str, + required_split: str, + current_run_card: dict[str, Any], + current_run_contract_ok: bool, +) -> bool: + if current_run_card.get("split") == required_split and current_run_contract_ok: + return True + for path in RESULTS_ROOT.rglob("run-card-*.json"): + try: + candidate = _load_object(path) + except (json.JSONDecodeError, ValueError): + continue + if not _candidate_matches(candidate, benchmark_id, benchmark_version, required_split): + continue + if not cross_split_evidence_issues(benchmark, candidate, path): + return True + return False + + +def _result_payload_issues( + result: object, + benchmark: dict[str, Any], + run_card: dict[str, Any], +) -> list[str]: + if not isinstance(result, dict): + return ["benchmark result must be a JSON object"] + checks = ( + ("run_id", run_card.get("run_id"), "benchmark result run_id mismatch"), + ( + "benchmark_id", + benchmark["benchmark_id"], + "benchmark result benchmark_id mismatch", + ), + ( + "benchmark_version", + benchmark["version"], + "benchmark result benchmark_version mismatch", + ), + ("split", run_card.get("split"), "benchmark result split mismatch"), + ) + for field, expected, message in checks: + if result.get(field) != expected: + return [message] + if "fail_count" not in result or "task_count" not in result: + return ["benchmark result missing failure summary"] + if "aggregate_metrics" not in result: + return ["benchmark result missing aggregate_metrics"] + return [] + + +def _result_artifact_issues( + benchmark: dict[str, Any], + run_card: dict[str, Any], + run_card_path: pathlib.Path, +) -> list[str]: + result_ref = run_card.get("result_path") + if not result_ref: + return [] + try: + result_path = resolve_metadata_path( + result_ref, label="run card result_path", contained_by=RESULTS_ROOT + ) + except ValueError as exc: + return [str(exc)] + if not path_within_run_scope(result_path, run_card_path): + return ["run card result_path is outside current run scope"] + if not result_path.exists(): + return ["benchmark result artifact missing"] + return _result_payload_issues(load_json(result_path), benchmark, run_card) + + +def _calibration_issues(run_card: dict[str, Any]) -> list[str]: + calibration_ref = run_card.get("judge_calibration_report_path") + if not calibration_ref: + return [] + try: + path = resolve_metadata_path( + calibration_ref, + label="judge calibration report", + contained_by=RESULTS_ROOT, + ) + except ValueError as exc: + return [str(exc)] + if not path.exists(): + return ["judge calibration report missing"] + calibration = load_json(path) + if not isinstance(calibration, dict): + return ["judge calibration report must be a JSON object"] + if calibration.get("calibration_case_count", 0) <= 0: + return ["judge calibration report has no calibration cases"] + rate = calibration.get("agreement_rate") + if not isinstance(rate, (int, float)): + return ["judge calibration report missing agreement_rate"] + if rate < 1.0: + return ["judge calibration agreement_rate is below required threshold"] + return [] + + +def _declared_input_issues( + run_card: dict[str, Any], + field: str, + provided_path: pathlib.Path, + mismatch_message: str, +) -> list[str]: + path_ref = run_card.get(field) + if not path_ref: + return [] + try: + declared = resolve_metadata_path( + path_ref, label=f"run card {field}", contained_by=RESULTS_ROOT + ) + except ValueError as exc: + return [str(exc)] + return [] if same_repo_path(declared, provided_path) else [mismatch_message] diff --git a/evals/scripts/lib/release_gate_resources.py b/evals/scripts/lib/release_gate_resources.py new file mode 100644 index 0000000..aed5064 --- /dev/null +++ b/evals/scripts/lib/release_gate_resources.py @@ -0,0 +1,77 @@ +"""Resource-policy validation for release-gated benchmark runs.""" + +from typing import Any + + +def _resource_policy_has_limit(policy: dict[str, Any]) -> bool: + """Report whether a policy needs a resource-usage payload to enforce a limit.""" + return any( + policy.get(field) is not None + for field in ( + "max_agent_duration_seconds", + "max_agent_calls", + "max_parallelism", + "max_total_tokens", + ) + ) + + +def _scalar_resource_issues(policy: dict[str, Any], usage: dict[str, Any]) -> list[str]: + """Compare independently measured scalar resources with their policy limits.""" + limits = ( + ("max_agent_duration_seconds", "agent_duration_seconds"), + ("max_agent_calls", "agent_calls"), + ("max_parallelism", "max_parallelism"), + ) + issues: list[str] = [] + for policy_field, usage_field in limits: + limit = policy.get(policy_field) + value = usage.get(usage_field) + if limit is not None and (not isinstance(value, (int, float)) or value > limit): + issues.append(f"run card exceeds resource policy {policy_field}") + return issues + + +def _total_token_issues(policy: dict[str, Any], usage: dict[str, Any]) -> list[str]: + """Require both token counters before enforcing a combined token limit.""" + total_limit = policy.get("max_total_tokens") + if total_limit is None: + return [] + input_tokens = usage.get("input_tokens") + output_tokens = usage.get("output_tokens") + if not isinstance(input_tokens, int) or not isinstance(output_tokens, int): + return ["run card lacks total-token measurement"] + if input_tokens + output_tokens > total_limit: + return ["run card exceeds resource policy max_total_tokens"] + return [] + + +def _resource_usage_state_issues(policy: dict[str, Any], usage: object) -> list[str]: + if not isinstance(usage, dict): + return ( + ["run card missing resource_usage"] + if policy.get("require_measurement") or _resource_policy_has_limit(policy) + else [] + ) + status = usage.get("measurement_status") + if status not in {"complete", "partial", "unavailable"}: + return ["run card has invalid resource_usage.measurement_status"] + if policy.get("require_measurement") and status != "complete": + return ["run card resource measurement is not complete"] + return [] + + +def _resource_usage_issues(benchmark: dict[str, Any], run_card: dict[str, Any]) -> list[str]: + """Enforce an optional resource policy without treating unknown usage as zero.""" + policy = benchmark.get("resource_policy") + if policy is None: + return [] + if not isinstance(policy, dict): + return ["benchmark resource_policy must be an object"] + usage = run_card.get("resource_usage") + issues = _resource_usage_state_issues(policy, usage) + if not isinstance(usage, dict): + return issues + issues.extend(_scalar_resource_issues(policy, usage)) + issues.extend(_total_token_issues(policy, usage)) + return issues diff --git a/evals/scripts/lib/run_benchmark_artifacts.py b/evals/scripts/lib/run_benchmark_artifacts.py new file mode 100644 index 0000000..e8e247b --- /dev/null +++ b/evals/scripts/lib/run_benchmark_artifacts.py @@ -0,0 +1,288 @@ +"""Build benchmark evidence artifacts and finish release-gate reporting.""" + +import pathlib +import sys +from collections.abc import Callable +from dataclasses import dataclass +from typing import Any + +from common import ( + RESULTS_ROOT, + append_jsonl, + default_system_metadata, + dump_json, + iso_timestamp, + load_json, + metric_ratio, + repo_relpath, + today_iso, +) +from router import ROUTER_VERSION + +from lib.run_benchmark_evidence import aggregate_verification_evidence + + +@dataclass(frozen=True) +class BenchmarkRun: + """Result data shared by the benchmark evidence-writing stages.""" + + benchmark: dict[str, Any] + split: str + run_id: str + task_results: list[dict[str, Any]] + metrics: dict[str, float] + result_path: pathlib.Path + output_dir: pathlib.Path + + +@dataclass(frozen=True) +class BenchmarkArtifacts: + """Evidence paths consumed by the final release-gate stage.""" + + run_card_path: pathlib.Path + regression_path: pathlib.Path + ledger_path: pathlib.Path + calibration_path: pathlib.Path + + +def _count_passes(task_results: list[dict[str, Any]]) -> int: + return sum(1 for result in task_results if result["judge"]["verdict"] == "pass") + + +def _count_judge_successes(task_results: list[dict[str, Any]], field: str) -> int: + return sum(1 for result in task_results if result["judge"][field]) + + +def _count_checkpoint_tasks(task_results: list[dict[str, Any]]) -> int: + return sum(1 for result in task_results if result["checkpoint_paths"]) + + +def _count_approved_checkpoint_tasks( + task_results: list[dict[str, Any]], +) -> int: + return sum( + 1 + for result in task_results + if result["checkpoint_paths"] and result["judge"]["checkpoint_ok"] + ) + + +def aggregate_results(task_results: list[dict[str, Any]]) -> dict[str, float]: + """Aggregate task-level benchmark results into release-gate metrics.""" + total = len(task_results) + return { + "success_rate": metric_ratio(_count_passes(task_results), total), + "route_accuracy": metric_ratio(_count_judge_successes(task_results, "route_ok"), total), + "artifact_completeness": metric_ratio( + _count_judge_successes(task_results, "artifacts_ok"), total + ), + "checkpoint_compliance": metric_ratio( + _count_approved_checkpoint_tasks(task_results), + _count_checkpoint_tasks(task_results), + ), + } + + +def _regression_issues( + metrics: dict[str, float], + baseline_metrics: dict[str, Any], + minimum_metrics: dict[str, Any], + max_negative_delta: float, +) -> list[str]: + issues: list[str] = [] + for metric, value in metrics.items(): + baseline_value = float(baseline_metrics.get(metric, value)) + if value + max_negative_delta < baseline_value: + issues.append(f"{metric} regressed below baseline") + if metric in minimum_metrics and value < float(minimum_metrics[metric]): + issues.append(f"{metric} below minimum") + return issues + + +def write_regression_report( + run: BenchmarkRun, + *, + resolve_repo_child_path: Callable[[Any, pathlib.Path, str], pathlib.Path], +) -> pathlib.Path: + """Write the regression comparison for one completed benchmark run.""" + regression_policy = run.benchmark.get("regression_policy", {}) + baselines = regression_policy.get("baseline_results", {}) + baseline_value = baselines.get(run.split, "") + baseline_path = ( + resolve_repo_child_path(baseline_value, RESULTS_ROOT, "baseline result path") + if baseline_value + else None + ) + if baseline_path is not None and baseline_path.exists(): + baseline = load_json(baseline_path) + baseline_metrics = baseline.get("aggregate_metrics", {}) + else: + baseline_metrics = {} + max_negative_delta = float(regression_policy.get("max_negative_delta", 0.0)) + minimum_metrics = regression_policy.get("minimum_metrics", {}) + regressions = _regression_issues( + run.metrics, baseline_metrics, minimum_metrics, max_negative_delta + ) + + report = { + "report_id": f"regression-{run.run_id}", + "benchmark_id": run.benchmark["benchmark_id"], + "split": run.split, + "generated_at": iso_timestamp(), + "status": "pass" if not regressions else "fail", + "baseline_result_path": repo_relpath(baseline_path) + if baseline_path is not None and baseline_path.exists() + else "", + "aggregate_metrics": run.metrics, + "baseline_metrics": baseline_metrics, + "issues": regressions, + } + output_path = run.output_dir / ( + f"regression-{run.benchmark['benchmark_id']}-{run.split}-{run.run_id}.json" + ) + dump_json(output_path, report) + return output_path + + +def write_result_ledger(run: BenchmarkRun, ledger_path: pathlib.Path) -> None: + """Append aggregate and task-result entries for one benchmark run.""" + aggregate_entry = { + "entry_id": f"{run.run_id}-aggregate", + "kind": "benchmark-run", + "timestamp": iso_timestamp(), + "benchmark_id": run.benchmark["benchmark_id"], + "run_id": run.run_id, + "split": run.split, + "result_path": repo_relpath(run.result_path), + "claim_links": run.benchmark.get("claim_links", []), + "aggregate_metrics": run.metrics, + } + append_jsonl(ledger_path, aggregate_entry) + for result in run.task_results: + append_jsonl( + ledger_path, + { + "entry_id": f"{run.run_id}-{result['task_id']}", + "kind": "task-result", + "timestamp": iso_timestamp(), + "benchmark_id": run.benchmark["benchmark_id"], + "run_id": run.run_id, + "task_id": result["task_id"], + "split": result["split"], + "routed_runtime": result["routed_runtime"], + "trace_paths": result["trace_paths"], + "artifact_paths": result["artifact_paths"], + "checkpoint_paths": result["checkpoint_paths"], + "claim_links": result["claim_links"], + "judge_verdict": result["judge"]["verdict"], + }, + ) + + +def _unique_result_paths(task_results: list[dict[str, Any]], field: str) -> list[str]: + paths: set[str] = set() + for result in task_results: + paths.update(result[field]) + return sorted(paths) + + +def _all_result_paths(task_results: list[dict[str, Any]], field: str) -> list[str]: + paths: list[str] = [] + for result in task_results: + paths.extend(result[field]) + return paths + + +def _all_tasks_passed(task_results: list[dict[str, Any]]) -> bool: + return all(result["judge"]["verdict"] == "pass" for result in task_results) + + +def _run_card_aggregate_fields( + task_results: list[dict[str, Any]], +) -> dict[str, Any]: + duration = round( + sum(result["command_result"]["duration_seconds"] for result in task_results), 4 + ) + return { + "status": "pass" if _all_tasks_passed(task_results) else "fail", + "trace_paths": _unique_result_paths(task_results, "trace_paths"), + "artifact_paths": _unique_result_paths(task_results, "artifact_paths"), + "checkpoint_paths": _all_result_paths(task_results, "checkpoint_paths"), + "latency_seconds": duration, + } + + +def _build_run_card(run: BenchmarkRun, artifacts: BenchmarkArtifacts) -> dict[str, Any]: + aggregate_fields = _run_card_aggregate_fields(run.task_results) + return { + "run_id": run.run_id, + "evidence_type": "benchmark-run", + "benchmark_id": run.benchmark["benchmark_id"], + "benchmark_version": run.benchmark["version"], + "date": today_iso(), + "split": run.split, + "system": default_system_metadata("umbrella-benchmark-runner"), + "judge_version": run.benchmark["judge_version"], + "command": "python3 evals/scripts/run_benchmark.py", + "result_path": repo_relpath(run.result_path), + "status": aggregate_fields["status"], + "task_spec_path": run.benchmark["task_specs_path"], + "routed_runtime": "mixed", + "router": {"version": ROUTER_VERSION, "decision_mode": "per-task"}, + "trace_paths": aggregate_fields["trace_paths"], + "artifact_paths": aggregate_fields["artifact_paths"], + "checkpoint_paths": aggregate_fields["checkpoint_paths"], + "verification_evidence": aggregate_verification_evidence(run.task_results), + "claim_links": run.benchmark.get("claim_links", []), + "ledger_path": repo_relpath(artifacts.ledger_path), + "regression_report_path": repo_relpath(artifacts.regression_path), + "judge_calibration_report_path": repo_relpath(artifacts.calibration_path), + "cost_usd": 0.0, + "latency_seconds": aggregate_fields["latency_seconds"], + "notes": f"Executed {len(run.task_results)} task(s) for split {run.split}.", + } + + +def _write_run_artifacts( + run: BenchmarkRun, + calibration_path: pathlib.Path, + *, + resolve_repo_child_path: Callable[[Any, pathlib.Path, str], pathlib.Path], +) -> BenchmarkArtifacts: + regression_path = write_regression_report(run, resolve_repo_child_path=resolve_repo_child_path) + ledger_path = run.output_dir / "result-ledger.jsonl" + write_result_ledger(run, ledger_path) + run_card_path = run.output_dir / ( + f"run-card-{run.benchmark['benchmark_id']}-{run.split}-{run.run_id}.json" + ) + artifacts = BenchmarkArtifacts( + run_card_path=run_card_path, + regression_path=regression_path, + ledger_path=ledger_path, + calibration_path=calibration_path, + ) + dump_json(run_card_path, _build_run_card(run, artifacts)) + return artifacts + + +def _finish_release_gate( + benchmark_path: pathlib.Path, + run: BenchmarkRun, + artifacts: BenchmarkArtifacts, + *, + run_release_gate: Callable[[pathlib.Path, BenchmarkArtifacts, pathlib.Path], dict[str, Any]], + failure_report_message: Callable[[pathlib.Path | None], str], + report_child_failure: Callable[..., int], +) -> int: + output = run.output_dir / ( + f"release-gate-{run.benchmark['benchmark_id']}-{run.split}-{run.run_id}.json" + ) + result = run_release_gate(benchmark_path, artifacts, output) + if result["returncode"] != 0: + report_message = failure_report_message(output) + if report_message: + print(report_message, file=sys.stderr) + return result["returncode"] + return report_child_failure(result, fallback="release gate failed", report_path=output) + print(repo_relpath(artifacts.run_card_path)) + return 0 diff --git a/evals/scripts/lib/run_benchmark_report.py b/evals/scripts/lib/run_benchmark_report.py index 06be876..d72f49a 100644 --- a/evals/scripts/lib/run_benchmark_report.py +++ b/evals/scripts/lib/run_benchmark_report.py @@ -4,27 +4,29 @@ import pathlib import re import sys +from dataclasses import dataclass from typing import Any from common import ( RESULTS_ROOT, ROOT, - append_jsonl, - default_system_metadata, dump_json, is_within_directory, iso_timestamp, load_json, - metric_ratio, new_run_id, repo_relpath, run_command, - today_iso, ) -from router import ROUTER_VERSION +from lib.run_benchmark_artifacts import ( + BenchmarkArtifacts, + BenchmarkRun, + _finish_release_gate, + _write_run_artifacts, + aggregate_results, +) from lib.run_benchmark_evidence import ( - aggregate_verification_evidence, load_optional_json_artifact, validate_artifact_id, ) @@ -33,6 +35,17 @@ REPO_RELATIVE_PATH_RE = re.compile(r"^[A-Za-z0-9._/-]+$") +@dataclass(frozen=True) +class BenchmarkExecutionRequest: + """Inputs required to execute one benchmark split.""" + + benchmark: dict[str, Any] + tasks: list[dict[str, Any]] + split: str + output_dir: pathlib.Path + checkpoint_mode: str + + def resolve_repo_child_path(path_str: Any, base: pathlib.Path, label: str) -> pathlib.Path: """Reject paths that could make a benchmark read or write outside its allowed root.""" if not isinstance(path_str, str) or not path_str: @@ -82,146 +95,6 @@ def validate_benchmark_inputs(benchmark: dict[str, Any], task_bundle: dict[str, _validate_task_entries(task_bundle) -def _count_passes(task_results: list[dict[str, Any]]) -> int: - return sum(1 for result in task_results if result["judge"]["verdict"] == "pass") - - -def _count_judge_successes(task_results: list[dict[str, Any]], field: str) -> int: - return sum(1 for result in task_results if result["judge"][field]) - - -def _count_checkpoint_tasks(task_results: list[dict[str, Any]]) -> int: - return sum(1 for result in task_results if result["checkpoint_paths"]) - - -def _count_approved_checkpoint_tasks( - task_results: list[dict[str, Any]], -) -> int: - return sum( - 1 - for result in task_results - if result["checkpoint_paths"] and result["judge"]["checkpoint_ok"] - ) - - -def aggregate_results(task_results: list[dict[str, Any]]) -> dict[str, float]: - total = len(task_results) - return { - "success_rate": metric_ratio(_count_passes(task_results), total), - "route_accuracy": metric_ratio(_count_judge_successes(task_results, "route_ok"), total), - "artifact_completeness": metric_ratio( - _count_judge_successes(task_results, "artifacts_ok"), total - ), - "checkpoint_compliance": metric_ratio( - _count_approved_checkpoint_tasks(task_results), - _count_checkpoint_tasks(task_results), - ), - } - - -def _regression_issues( - metrics: dict[str, float], - baseline_metrics: dict[str, Any], - minimum_metrics: dict[str, Any], - max_negative_delta: float, -) -> list[str]: - issues: list[str] = [] - for metric, value in metrics.items(): - baseline_value = float(baseline_metrics.get(metric, value)) - if value + max_negative_delta < baseline_value: - issues.append(f"{metric} regressed below baseline") - if metric in minimum_metrics and value < float(minimum_metrics[metric]): - issues.append(f"{metric} below minimum") - return issues - - -def write_regression_report( - benchmark: dict[str, Any], - split: str, - aggregate_metrics: dict[str, float], - output_dir: pathlib.Path, - run_id: str, -) -> pathlib.Path: - regression_policy = benchmark.get("regression_policy", {}) - baselines = regression_policy.get("baseline_results", {}) - baseline_value = baselines.get(split, "") - baseline_path = ( - resolve_repo_child_path(baseline_value, RESULTS_ROOT, "baseline result path") - if baseline_value - else None - ) - if baseline_path is not None and baseline_path.exists(): - baseline = load_json(baseline_path) - baseline_metrics = baseline.get("aggregate_metrics", {}) - else: - baseline = {} - baseline_metrics = {} - max_negative_delta = float(regression_policy.get("max_negative_delta", 0.0)) - minimum_metrics = regression_policy.get("minimum_metrics", {}) - regressions = _regression_issues( - aggregate_metrics, baseline_metrics, minimum_metrics, max_negative_delta - ) - - report = { - "report_id": f"regression-{run_id}", - "benchmark_id": benchmark["benchmark_id"], - "split": split, - "generated_at": iso_timestamp(), - "status": "pass" if not regressions else "fail", - "baseline_result_path": repo_relpath(baseline_path) - if baseline_path is not None and baseline_path.exists() - else "", - "aggregate_metrics": aggregate_metrics, - "baseline_metrics": baseline_metrics, - "issues": regressions, - } - output_path = output_dir / f"regression-{benchmark['benchmark_id']}-{split}-{run_id}.json" - dump_json(output_path, report) - return output_path - - -def write_result_ledger( - benchmark: dict[str, Any], - run_id: str, - split: str, - task_results: list[dict[str, Any]], - aggregate_metrics: dict[str, float], - result_path: pathlib.Path, - ledger_path: pathlib.Path, -) -> None: - aggregate_entry = { - "entry_id": f"{run_id}-aggregate", - "kind": "benchmark-run", - "timestamp": iso_timestamp(), - "benchmark_id": benchmark["benchmark_id"], - "run_id": run_id, - "split": split, - "result_path": repo_relpath(result_path), - "claim_links": benchmark.get("claim_links", []), - "aggregate_metrics": aggregate_metrics, - } - append_jsonl(ledger_path, aggregate_entry) - for result in task_results: - append_jsonl( - ledger_path, - { - "entry_id": f"{run_id}-{result['task_id']}", - "kind": "task-result", - "timestamp": iso_timestamp(), - "benchmark_id": benchmark["benchmark_id"], - "run_id": run_id, - "task_id": result["task_id"], - "split": result["split"], - "routed_runtime": result["routed_runtime"], - "trace_paths": result["trace_paths"], - "artifact_paths": result["artifact_paths"], - "checkpoint_paths": result["checkpoint_paths"], - "claim_links": result["claim_links"], - "judge_verdict": result["judge"]["verdict"], - }, - ) - - def _parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( description="Run a benchmark split through the umbrella harness." @@ -259,23 +132,24 @@ def _load_run_context( return benchmark_card_path, benchmark, tasks, output_dir -def _execute_benchmark( - benchmark: dict[str, Any], - tasks: list[dict[str, Any]], - split: str, - output_dir: pathlib.Path, - checkpoint_mode: str, -) -> tuple[str, list[dict[str, Any]], dict[str, float], pathlib.Path]: - run_id = new_run_id(f"{benchmark['benchmark_id']}-{split}") +def _execute_benchmark(request: BenchmarkExecutionRequest) -> BenchmarkRun: + run_id = new_run_id(f"{request.benchmark['benchmark_id']}-{request.split}") task_results = [ - execute_task(task, output_dir, run_id, checkpoint_mode, benchmark) for task in tasks + execute_task( + task, + request.output_dir, + run_id, + request.checkpoint_mode, + request.benchmark, + ) + for task in request.tasks ] aggregate_metrics = aggregate_results(task_results) result = { "run_id": run_id, - "benchmark_id": benchmark["benchmark_id"], - "benchmark_version": benchmark["version"], - "split": split, + "benchmark_id": request.benchmark["benchmark_id"], + "benchmark_version": request.benchmark["version"], + "split": request.split, "executed_at": iso_timestamp(), "task_count": len(task_results), "pass_count": sum(1 for result in task_results if result["judge"]["verdict"] == "pass"), @@ -283,21 +157,31 @@ def _execute_benchmark( "aggregate_metrics": aggregate_metrics, "task_results": task_results, } - result_path = output_dir / f"result-{benchmark['benchmark_id']}-{split}-{run_id}.json" + result_path = request.output_dir / ( + f"result-{request.benchmark['benchmark_id']}-{request.split}-{run_id}.json" + ) dump_json(result_path, result) - return run_id, task_results, aggregate_metrics, result_path + return BenchmarkRun( + benchmark=request.benchmark, + split=request.split, + run_id=run_id, + task_results=task_results, + metrics=aggregate_metrics, + result_path=result_path, + output_dir=request.output_dir, + ) -def _run_calibration( - benchmark: dict[str, Any], output_dir: pathlib.Path, run_id: str -) -> tuple[pathlib.Path, dict[str, Any]]: - calibration_path = output_dir / f"judge-calibration-{benchmark['benchmark_id']}-{run_id}.json" +def _run_calibration(run: BenchmarkRun) -> tuple[pathlib.Path, dict[str, Any]]: + calibration_path = run.output_dir / ( + f"judge-calibration-{run.benchmark['benchmark_id']}-{run.run_id}.json" + ) result = run_command( [ sys.executable, str(ROOT / "evals/scripts/judge_calibration.py"), "--judge-config", - str(ROOT / benchmark["judge_path"]), + str(ROOT / run.benchmark["judge_path"]), "--output", str(calibration_path), ] @@ -305,84 +189,9 @@ def _run_calibration( return calibration_path, result -def _unique_result_paths(task_results: list[dict[str, Any]], field: str) -> list[str]: - paths: set[str] = set() - for result in task_results: - paths.update(result[field]) - return sorted(paths) - - -def _all_result_paths(task_results: list[dict[str, Any]], field: str) -> list[str]: - paths: list[str] = [] - for result in task_results: - paths.extend(result[field]) - return paths - - -def _all_tasks_passed(task_results: list[dict[str, Any]]) -> bool: - return all(result["judge"]["verdict"] == "pass" for result in task_results) - - -def _run_card_aggregate_fields( - task_results: list[dict[str, Any]], -) -> dict[str, Any]: - duration = round( - sum(result["command_result"]["duration_seconds"] for result in task_results), 4 - ) - return { - "status": "pass" if _all_tasks_passed(task_results) else "fail", - "trace_paths": _unique_result_paths(task_results, "trace_paths"), - "artifact_paths": _unique_result_paths(task_results, "artifact_paths"), - "checkpoint_paths": _all_result_paths(task_results, "checkpoint_paths"), - "latency_seconds": duration, - } - - -def _build_run_card( - benchmark: dict[str, Any], - split: str, - task_results: list[dict[str, Any]], - run_id: str, - result_path: pathlib.Path, - ledger_path: pathlib.Path, - regression_path: pathlib.Path, - calibration_path: pathlib.Path, -) -> dict[str, Any]: - aggregate_fields = _run_card_aggregate_fields(task_results) - return { - "run_id": run_id, - "evidence_type": "benchmark-run", - "benchmark_id": benchmark["benchmark_id"], - "benchmark_version": benchmark["version"], - "date": today_iso(), - "split": split, - "system": default_system_metadata("umbrella-benchmark-runner"), - "judge_version": benchmark["judge_version"], - "command": "python3 evals/scripts/run_benchmark.py", - "result_path": repo_relpath(result_path), - "status": aggregate_fields["status"], - "task_spec_path": benchmark["task_specs_path"], - "routed_runtime": "mixed", - "router": {"version": ROUTER_VERSION, "decision_mode": "per-task"}, - "trace_paths": aggregate_fields["trace_paths"], - "artifact_paths": aggregate_fields["artifact_paths"], - "checkpoint_paths": aggregate_fields["checkpoint_paths"], - "verification_evidence": aggregate_verification_evidence(task_results), - "claim_links": benchmark.get("claim_links", []), - "ledger_path": repo_relpath(ledger_path), - "regression_report_path": repo_relpath(regression_path), - "judge_calibration_report_path": repo_relpath(calibration_path), - "cost_usd": 0.0, - "latency_seconds": aggregate_fields["latency_seconds"], - "notes": f"Executed {len(task_results)} task(s) for split {split}.", - } - - def _run_release_gate( benchmark_card_path: pathlib.Path, - run_card_path: pathlib.Path, - regression_path: pathlib.Path, - ledger_path: pathlib.Path, + artifacts: BenchmarkArtifacts, output_path: pathlib.Path, ) -> dict[str, Any]: return run_command( @@ -392,11 +201,11 @@ def _run_release_gate( "--benchmark-card", str(benchmark_card_path), "--run-card", - str(run_card_path), + str(artifacts.run_card_path), "--regression-report", - str(regression_path), + str(artifacts.regression_path), "--ledger", - str(ledger_path), + str(artifacts.ledger_path), "--output", str(output_path), ] @@ -426,84 +235,33 @@ def _failure_report_message(report_path: pathlib.Path | None) -> str: return "\n".join(str(issue) for issue in issues) -def _write_run_artifacts( - benchmark: dict[str, Any], - split: str, - task_results: list[dict[str, Any]], - run_id: str, - metrics: dict[str, float], - result_path: pathlib.Path, - output_dir: pathlib.Path, - calibration_path: pathlib.Path, -) -> tuple[pathlib.Path, pathlib.Path, pathlib.Path]: - regression_path = write_regression_report(benchmark, split, metrics, output_dir, run_id) - ledger_path = output_dir / "result-ledger.jsonl" - write_result_ledger(benchmark, run_id, split, task_results, metrics, result_path, ledger_path) - run_card = _build_run_card( - benchmark, - split, - task_results, - run_id, - result_path, - ledger_path, - regression_path, - calibration_path, - ) - run_card_path = output_dir / f"run-card-{benchmark['benchmark_id']}-{split}-{run_id}.json" - dump_json(run_card_path, run_card) - return run_card_path, regression_path, ledger_path - - -def _finish_release_gate( - benchmark_path: pathlib.Path, - benchmark: dict[str, Any], - split: str, - run_id: str, - output_dir: pathlib.Path, - run_card_path: pathlib.Path, - regression_path: pathlib.Path, - ledger_path: pathlib.Path, -) -> int: - output = output_dir / f"release-gate-{benchmark['benchmark_id']}-{split}-{run_id}.json" - result = _run_release_gate(benchmark_path, run_card_path, regression_path, ledger_path, output) - if result["returncode"] != 0: - report_message = _failure_report_message(output) - if report_message: - print(report_message, file=sys.stderr) - return result["returncode"] - return _report_child_failure(result, fallback="release gate failed", report_path=output) - print(repo_relpath(run_card_path)) - return 0 - - def main() -> int: args = _parse_args() benchmark_path, benchmark, tasks, output_dir = _load_run_context(args) - run_id, task_results, metrics, result_path = _execute_benchmark( - benchmark, tasks, args.split, output_dir, args.checkpoint_mode + run = _execute_benchmark( + BenchmarkExecutionRequest( + benchmark=benchmark, + tasks=tasks, + split=args.split, + output_dir=output_dir, + checkpoint_mode=args.checkpoint_mode, + ) ) - calibration_path, calibration_result = _run_calibration(benchmark, output_dir, run_id) + calibration_path, calibration_result = _run_calibration(run) if calibration_result["returncode"] != 0 or not calibration_path.exists(): return _report_child_failure(calibration_result, fallback="judge calibration failed") - run_card_path, regression_path, ledger_path = _write_run_artifacts( - benchmark, - args.split, - task_results, - run_id, - metrics, - result_path, - output_dir, + artifacts = _write_run_artifacts( + run, calibration_path, + resolve_repo_child_path=resolve_repo_child_path, ) return _finish_release_gate( benchmark_path, - benchmark, - args.split, - run_id, - output_dir, - run_card_path, - regression_path, - ledger_path, + run, + artifacts, + run_release_gate=_run_release_gate, + failure_report_message=_failure_report_message, + report_child_failure=_report_child_failure, ) diff --git a/evals/scripts/optimize_harness.py b/evals/scripts/optimize_harness.py index 6a78ca9..900ea02 100644 --- a/evals/scripts/optimize_harness.py +++ b/evals/scripts/optimize_harness.py @@ -136,6 +136,7 @@ def evaluate(policy: dict) -> dict: output_dir=output_dir, max_iterations=int(campaign["max_iterations"]), resource_budget=campaign.get("resource_budget"), + candidate_change_allowlist=campaign.get("candidate_change_allowlist"), ) diff --git a/evals/tests/outcome_optimizer_helpers.py b/evals/tests/outcome_optimizer_helpers.py index d9faaf6..ca955d2 100644 --- a/evals/tests/outcome_optimizer_helpers.py +++ b/evals/tests/outcome_optimizer_helpers.py @@ -35,6 +35,7 @@ task_matrix_digest = outcome_eval.task_matrix_digest trusted_judge_argv = outcome_eval.trusted_judge_argv optimize_campaign = policy_optimizer.optimize_campaign +recover_lineage = policy_optimizer.recover_lineage policy_digest = policy_optimizer.policy_digest trusted_manifest = policy_optimizer.trusted_manifest resource_usage_issues = release_gate_core._resource_usage_issues diff --git a/evals/tests/test_benchmark_contracts_core_d.py b/evals/tests/test_benchmark_contracts_core_d.py index f1b3aeb..3e2181f 100644 --- a/evals/tests/test_benchmark_contracts_core_d.py +++ b/evals/tests/test_benchmark_contracts_core_d.py @@ -120,6 +120,38 @@ def test_release_gate_fails_when_calibration_report_is_missing() -> None: assert "judge calibration report missing" in gate_report["issues"] +def test_release_gate_fails_when_result_ledger_is_malformed() -> None: + benchmark_path = ROOT / "evals/benchmarks/tool-selection-core.benchmark-card.json" + benchmark = json.loads(benchmark_path.read_text(encoding="utf-8")) + with tempfile.TemporaryDirectory(dir=RESULTS_ROOT, prefix="release-gate-bad-ledger-") as tmp: + output_dir = pathlib.Path(tmp) + _, regression_path, ledger_path, _, run_card_path = write_release_gate_fixture( + output_dir, + split="dev", + run_id="tool-selection-core-dev-malformed-ledger", + benchmark=benchmark, + calibration_payload=calibration_payload(), + ) + ledger_path.write_text("{not-json}\n", encoding="utf-8") + write_release_gate_fixture( + output_dir / "held-out-pass", + split="held-out", + run_id="tool-selection-core-held-out-malformed-ledger", + benchmark=benchmark, + calibration_payload=calibration_payload(), + release_gate_status="pass", + ) + gate_output_path = output_dir / "release-gate-tool-selection-core-dev-malformed-ledger.json" + + completed = run_release_gate( + benchmark_path, run_card_path, regression_path, ledger_path, gate_output_path + ) + + assert completed.returncode != 0 + gate_report = json.loads(gate_output_path.read_text(encoding="utf-8")) + assert "result ledger could not be read" in gate_report["issues"] + + def test_validate_eval_metadata_rejects_invalid_workflow_verb_in_task_bundle() -> None: with tempfile.TemporaryDirectory( dir=RESULTS_ROOT, prefix="validate-invalid-workflow-verb-" diff --git a/evals/tests/test_policy_optimizer_contracts.py b/evals/tests/test_policy_optimizer_contracts.py index 90f91fa..8b8ce7d 100644 --- a/evals/tests/test_policy_optimizer_contracts.py +++ b/evals/tests/test_policy_optimizer_contracts.py @@ -14,10 +14,16 @@ evaluation, optimize_campaign, policy, + recover_lineage, resource_usage_issues, ) +def require(condition: bool, message: str) -> None: + if not condition: + raise AssertionError(message) + + def test_optimizer_accepts_only_measurable_improvement_without_auto_promotion() -> None: baseline = policy() candidate = policy("candidate") @@ -186,3 +192,113 @@ def test_optimizer_rejects_out_of_range_reports_and_standalone_comparisons() -> assert "evidence_type is not accepted" in str(exc) else: raise AssertionError("standalone comparison evidence was accepted") + + +def test_improvement_campaign_hill_climbs_ten_candidates_with_paired_wins_and_held_out_seal() -> ( + None +): + baseline = policy() + candidates = [policy(f"candidate-{index}") for index in range(10)] + for index, candidate in enumerate(candidates): + candidate["phase_guidance"]["plan"] = f"bounded guidance {index}" + + def evaluator(evaluated: dict[str, Any]) -> dict[str, Any]: + score = 0.5 if evaluated["policy_id"] == "baseline" else 1.0 + return evaluation(evaluated, score, evidence_type=OUTCOME_REPORT_TYPE) + + with tempfile.TemporaryDirectory(dir=RESULTS_ROOT, prefix="rae-improve-ten-") as tmp: + output = pathlib.Path(tmp) + report = optimize_campaign( + baseline_policy=baseline, + proposer=lambda _incumbent, lineage: candidates[len(lineage)], + evaluator=evaluator, + trusted_paths=[TRUSTED_EVALUATOR_PATH], + output_dir=output, + max_iterations=10, + candidate_change_allowlist=[ + "roles", + "guidance", + "safe_nodes", + "edges", + "joins", + "loop_bounds", + ], + sealed_evaluator=lambda evaluated: evaluation( + evaluated, 1.0, split="held-out", evidence_type=OUTCOME_REPORT_TYPE + ), + ) + lineage = recover_lineage(output / "lineage.jsonl") + require(len(lineage) == 10, "campaign did not retain ten lineage events") + require(lineage[0]["decision"] == "accepted", "first improvement candidate was not accepted") + require( + all(event["decision"] in {"accepted", "rejected"} for event in lineage), + "lineage contains an unexpected decision", + ) + require(report["recommendation_status"] == "recommended", "campaign was not recommended") + require(report["automatic_promotion"] is False, "campaign promoted a policy automatically") + + +def test_improvement_candidate_forbidden_change_is_retained_as_rejection() -> None: + baseline, candidate = policy(), policy("candidate") + candidate["unexpected_runtime"] = "activate" + with tempfile.TemporaryDirectory(dir=RESULTS_ROOT, prefix="rae-improve-forbidden-") as tmp: + output = pathlib.Path(tmp) + optimize_campaign( + baseline_policy=baseline, + proposer=lambda _incumbent, _lineage: candidate, + evaluator=lambda evaluated: evaluation( + evaluated, 0.5, evidence_type=OUTCOME_REPORT_TYPE + ), + trusted_paths=[TRUSTED_EVALUATOR_PATH], + output_dir=output, + max_iterations=1, + ) + lineage = recover_lineage(output / "lineage.jsonl") + require(lineage[0]["decision"] == "rejected", "forbidden candidate was accepted") + require("policy" in lineage[0]["reason"], "rejection did not report the policy violation") + + +def test_improvement_lineage_recovery_rejects_partial_records() -> None: + with tempfile.TemporaryDirectory(dir=RESULTS_ROOT, prefix="rae-improve-recover-") as tmp: + lineage_path = pathlib.Path(tmp) / "lineage.jsonl" + lineage_path.write_text('{"iteration":1}\n{', encoding="utf-8") + try: + recover_lineage(lineage_path) + except ValueError as exc: + require("lineage recovery failed" in str(exc), "partial lineage error was unclear") + else: + raise AssertionError("partial lineage record was accepted") + + +def test_improvement_rejects_resource_regression_even_with_paired_wins() -> None: + baseline, candidate = policy(), policy("candidate") + candidate["phase_guidance"]["plan"] = "bounded guidance" + + def evaluator(evaluated: dict[str, Any]) -> dict[str, Any]: + score = 0.5 if evaluated["policy_id"] == "baseline" else 1.0 + report = evaluation(evaluated, score, evidence_type=OUTCOME_REPORT_TYPE) + if evaluated["policy_id"] == "candidate": + for result in report["repeats"][0]: + result["resource_usage"] = { + **result["resource_usage"], + "agent_duration_seconds": 100.0, + } + report["aggregate"] = aggregate_repeats(report["repeats"]) + return report + + with tempfile.TemporaryDirectory(dir=RESULTS_ROOT, prefix="rae-improve-resource-") as tmp: + output = pathlib.Path(tmp) + optimize_campaign( + baseline_policy=baseline, + proposer=lambda _incumbent, _lineage: candidate, + evaluator=evaluator, + trusted_paths=[TRUSTED_EVALUATOR_PATH], + output_dir=output, + max_iterations=1, + ) + lineage = recover_lineage(output / "lineage.jsonl") + require(lineage[0]["decision"] == "rejected", "resource regression was accepted") + require( + lineage[0]["reason"] == "challenger-hard-failure", + "resource regression was not classified as a hard failure", + ) diff --git a/mkdocs.yml b/mkdocs.yml index 3aa60b0..4c063a9 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -41,6 +41,7 @@ exclude_docs: | nav: - Home: INDEX.md - Tutorials: + - Graph Engineering with RAE: tutorials/graph-engineering-with-rae.md - Autonomous Code Change: tutorials/autonomous-code-change.md - First Pipeline: tutorials/first-pipeline.md - First Ralph Run: tutorials/first-ralph-run.md @@ -52,6 +53,11 @@ nav: - Add a Tool: how-to/add-a-tool.md - Publish a Sanitized Profile: how-to/publish-a-sanitized-profile.md - Reproduce a Result: how-to/reproduce-a-result.md + - Use the Experimental Hosted API: how-to/hosted-api.md + - Run a Workflow 2.2 Wait: how-to/run-workflow-v2.2-wait.md + - Deploy the Experimental Platform: how-to/deploy-experimental-platform.md + - Recover a Workflow 2.2 Wait: how-to/recover-workflow-v2.2-wait.md + - Test the Experimental Hosted Platform: how-to/test-experimental-hosted-platform.md - Reference: - Workflow Rubric: reference/workflow-rubric.md - Repo Map: reference/repo-map.md @@ -59,13 +65,17 @@ nav: - Architecture: - System Overview: reference/architecture/system-overview.md - Module Boundaries: reference/architecture/module-boundaries.md + - Experimental Hosted Platform: reference/architecture/experimental-hosted-platform.md - Contracts: - Artifact Schemas: reference/contracts/artifact-schemas.md + - Execution Profile 3.0: reference/contracts/execution-profile-v3.md - Task Specs: reference/contracts/task-specs.md - Human Checkpoints: reference/contracts/human-checkpoints.md - Result Ledger: reference/contracts/result-ledger.md - Quality Gates: reference/contracts/quality-gates.md - Report Types: reference/contracts/report-types.md + - Local Graph and Memory: reference/contracts/graph-memory.md + - Workflow 2.2: reference/contracts/workflow-v2.2.md - CLI: - Umbrella CLI: reference/cli/umbrella.md - Orchestration CLI: reference/cli/orchestration.md diff --git a/packages/loops/ralph/scripts/ralph_fs_txn.py b/packages/loops/ralph/scripts/ralph_fs_txn.py index 52cd3bb..aa8e8de 100644 --- a/packages/loops/ralph/scripts/ralph_fs_txn.py +++ b/packages/loops/ralph/scripts/ralph_fs_txn.py @@ -882,10 +882,26 @@ def prepared_change_unit( if encoded in changed: return True before, after = baseline.get(encoded), prepared.get(encoded) - if before is None or after is None or before["kind"] != "dir" or after["kind"] != "dir": + if not prepared_directory_pair(before, after): return False - rel = decode_path(encoded) - return any(decode_path(item) != rel and path_under(decode_path(item), rel) for item in changed) + return changed_descendant(encoded, changed) + + +def prepared_directory_pair(before: dict[str, Any] | None, after: dict[str, Any] | None) -> bool: + if before is None or after is None: + return False + return before["kind"] == "dir" and after["kind"] == "dir" + + +def changed_descendant(encoded: str, changed: list[str]) -> bool: + relative = decode_path(encoded) + for item in changed: + child = decode_path(item) + if child == relative: + continue + if path_under(child, relative): + return True + return False def remove_tree(path: str | bytes | Path) -> None: @@ -2182,11 +2198,7 @@ def restore_directory( "recovery directory restoration", subtree, ) - elif ( - subtree - and current["kind"] == "dir" - and subtree_manifest(root, encoded) == manifest_subtree(journal["prepared"] or [], encoded) - ): + elif current_matches_prepared_subtree(journal, root, encoded, current, subtree): replace_recovery_subtree(path, journal, root, context["baseline_store"], entry, current) elif current["kind"] == "dir" and current in directory_prepared_entries( context["prepared"], encoded @@ -2198,6 +2210,18 @@ def restore_directory( raise TransactionConflict(conflict_message(encoded, "recovery directory restoration")) +def current_matches_prepared_subtree( + journal: dict[str, Any], + root: bytes, + encoded: str, + current: dict[str, Any], + subtree: bool, +) -> bool: + if not subtree or current["kind"] != "dir": + return False + return subtree_manifest(root, encoded) == manifest_subtree(journal["prepared"] or [], encoded) + + def replace_recovery_subtree( path: Path, journal: dict[str, Any], diff --git a/packages/orchestration/README.md b/packages/orchestration/README.md index 6ae0a50..7d77a11 100644 --- a/packages/orchestration/README.md +++ b/packages/orchestration/README.md @@ -1,11 +1,28 @@ # Phased orchestration -This package implements RAE's staged repository workflow, autonomous executor, +This package implements RAE's graph-native repository workflow, autonomous executor, operator console, artifact contracts, policy validation, and deterministic gates. ## Execution model +New autonomous runs resolve a workflow in this order: explicit `--workflow`, +the locally activated workflow, then the committed +`workflows/graph-native-default.workflow.json`. The resolved workflow, node +guidance, payload contracts, and canonical digest are copied into the run and +remain immutable on resume. + +The default graph includes requirements and design agents, four parallel design +critics, deterministic collection and adjudication, planning, two alignment +extractors, one exclusive build writer, and a five-round repair loop. Read-only +nodes run up to four-wide. Shared command resources serialize, and a writer +drains readers before running alone. Every attempt uses a fresh provider session +and an immutable result envelope. + +The ten ordered stages below are the v1 compatibility engine. Use +`--legacy-linear` only for a temporary new v1 run. Existing v1 request files +select it automatically on resume. + The runtime uses ten ordered stages: | Stage | Responsibility | Primary artifact | @@ -33,7 +50,9 @@ report. - Node.js `>=20.19.0 <21`, `>=22.12.0 <23`, or `>=24.0.0` - npm - `git` and `rg` -- Codex CLI for provider-backed autonomous runs +- Codex CLI for Codex-backed autonomous runs +- OpenCode CLI for explicit OpenCode routes on the supported macOS containment + backend - a target Git repository with at least one commit and usable `HEAD` and current-branch reflogs @@ -78,8 +97,15 @@ and verification evidence. Useful options: -- `--through ` stops after the selected stage; `--through plan` avoids - repository mutation +- `--workflow ` selects a validated graph-native workflow for a new run +- `--execution-profile ` snapshots an operator-owned mapping from logical + economy, standard, and judgment tiers to named Codex or OpenCode routes; it is + mutually exclusive with global provider, model, reasoning, and variant + overrides +- `--through ` stops after the selected workflow node +- `--max-concurrency <1..4>` caps concurrent read-only nodes +- `--max-repair-rounds <1..5>` tightens the workflow repair bound +- `--legacy-linear` starts the v1 ten-stage engine - `--checkpoint-policy before-mutation` pauses before the first writable stage - `--checkpoint-policy before-mutation-and-ship` also pauses before the final release decision @@ -89,6 +115,8 @@ Useful options: - `--in-place` uses an explicitly clean target checkout instead of an isolated worktree - `--json` emits machine-readable command output +- `--graph-memory off|read|read-write` controls opt-in local graph retrieval; + the default is `off` and the selected mode is immutable on resume Run `npm run agent -- --help` for the complete option reference. @@ -108,7 +136,7 @@ It has no filesystem or network sandbox, always fails `agent doctor`, and requires `--allow-unsafe-command-provider` on every run and resume. Do not use it as an operational backend. -## Operator console +## Operator console and workflow designer From the repository root: @@ -119,12 +147,76 @@ From the repository root: Repeat `--project` to allowlist more than one Git root. The console binds only to loopback and prints a URL with an ephemeral bearer token in the fragment. +Repeat `--execution-profile` to preload server-owned profile files. The browser +receives only profile IDs, route metadata, models, and readiness. It never +receives profile paths, credentials, environment values, or raw provider +events. It exposes status, projected events, stop, interrupt, resume, checkpoint, and fail-closed cleanup controls. It does not expose in-place execution, arbitrary commands, environment overrides, Git publication, or deployment. +The workflow workspace keeps Loop, Graph, Analyze, and JSON views synchronized. +Five guided templates compile directly to workflow 2.1. Structured node and +edge controls remain keyboard operable, while the JSON view retains access to +existing 2.0 and experimental 2.2 revisions. Analysis and proposal results stay +unsaved until an operator creates a revision. Activation remains a separate, +exact-digest action. + See [`operator/README.md`](operator/README.md) for the HTTP and event contract. +## Local graph projections + +Use the umbrella `graph` command to build, inspect, query, explain, or manage +local graph memory: + +```bash +./scripts/rae.sh graph build --project-root /path/to/target-repository +./scripts/rae.sh graph query --project-root /path/to/target-repository \ + --seed 'File:src/main.js' +``` + +Run projections remain under `.pipeline/runs//graph/`. Cross-run +memory remains owner-only under the target repository's Git common directory +at `rae-memory/v1/`. The graph augments context and explanation only. Raw +artifacts, traces, gates, checkpoints, policies, Git state, and human release +decisions remain authoritative. + +Workflow drafts and activation records live under the target Git common +directory at `rae-workflows/v2/`. The owner-only registry uses atomic writes, +an exclusive lock, optimistic revisions, canonical digests, and attributed +activation decisions. The operator editor uses the same registry and rejects +changes while a run is active. + +Workflow schema 2.1 adds bounded map and stream instances, deterministic +transforms, first-success and quorum joins, typed failure collection, +until-dry convergence, and logical execution tiers. Stored 2.0 runs and active +2.0 registry revisions keep their original executor. RAE does not migrate a +private registry automatically. + +Workflow 2.2 is an experimental local scheduler for durable wait nodes and +typed signals. It writes wait state under +`.pipeline/runs//workflow/wait-state.json`, consumes accepted signals +idempotently on resume, and fails a wait on timeout. Its bounded context +assembly is not a context-efficiency result. Existing 2.0 and 2.1 runs remain +on their original schedulers. See +[`docs/reference/contracts/workflow-v2.2.md`](../../docs/reference/contracts/workflow-v2.2.md). + +Create a proposal with: + +```bash +./scripts/rae.sh graph workflow propose \ + --project-root /path/to/target-repository \ + --task "Design a bounded topology" \ + --base-workflow graph-native-default \ + --actor "operator-name" \ + --rationale "Draft for review" +``` + +Without `--preview`, the command stores a validated draft revision. Add +`--preview` to return a validated candidate without saving it. When an +execution profile is supplied, proposal generation uses its `judgment` route. +Neither mode activates or executes the result. + ## Low-level pipeline API Create local pipeline state: @@ -182,9 +274,10 @@ python3 scripts/adapters/generate_adapters.py python3 scripts/adapters/generate_adapters.py --check ``` -Committed adapters exist for Codex, Cursor, Claude, Gemini, and Kilo. Only -Codex currently has a supported autonomous CLI executor. The other adapters -are portable guidance and must not be interpreted as executable integrations. +Committed guidance adapters exist for Codex, Cursor, Claude, Gemini, and Kilo. +The autonomous runtime has executable adapters for Codex and explicit OpenCode +routes. The other adapters are portable guidance and must not be interpreted +as executable integrations. ## Repository structure @@ -199,6 +292,7 @@ are portable guidance and must not be interpreted as executable integrations. | `orchestrators/` | Stage instructions consumed by the runtime | | `skills/dev-tools/` | Quality-gate, review, and trace packages | | `docs/` | Package runbook, platform notes, policy, and repository map | +| `platform/` | Experimental PostgreSQL control plane, OIDC API, fenced worker lease, artifact, and MCP source | ## Security and data handling @@ -220,6 +314,13 @@ The runner: roots during writable stages - rejects protected Git-state changes on supported provider runs +OpenCode write routes add a macOS Seatbelt boundary around the isolated +worktree. RAE verifies the effective OpenCode configuration before execution, +denies shell, web, external-directory, plugin, skill, subagent, question, and +unapproved MCP access, and exposes only an opaque allowlisted verification +broker. The pinned OpenCode process can read its configured credential store; +credential contents are not copied into run artifacts or operator responses. + The provider process still receives the working directory and schema paths needed for execution. Consult the provider's data controls for storage and retention behavior. @@ -241,6 +342,16 @@ For changed packages only: ./scripts/verify.sh --changed-only ``` +Run the deterministic workflow-topology fixture separately when scheduler +ordering changes: + +```bash +npm run benchmark:workflow-topology +``` + +It reports fixture event order, critical path, and barrier idle time. It makes +no model-quality or universal speed claim. + The package verifier checks adapters, schemas, stale references, Markdown links, repository hygiene, TypeScript builds, Biome, and Vitest suites. The root repository gate remains: @@ -253,6 +364,12 @@ Operational recovery and troubleshooting are documented in [`docs/RUNBOOK.md`](docs/RUNBOOK.md). Platform support is documented in [`docs/PLATFORMS.md`](docs/PLATFORMS.md). +The `platform/` package is an experimental vertical slice connected to the +operator only through remote-mode proxy routes. Its source-unit test can be +run with `npm --prefix platform test` from this directory. PostgreSQL, +container, OIDC, S3-compatible storage, and remote worker execution remain +integration evidence lanes. + ## Limitations - Worktree isolation depends on Git reflogs and repository identity checks. @@ -260,6 +377,10 @@ Operational recovery and troubleshooting are documented in creates a new POSIX session. - Guard recovery fails closed while ownership or repository identity is uncertain. +- OpenCode write routes are supported only on macOS, require the isolated + worktree, and reject `--in-place`. +- A real provider run is still required before treating fake-executable event + tests as evidence for a specific OpenCode release or provider account. - Deterministic fixtures and committed baselines are test evidence, not proof of behavior on arbitrary repositories. - The low-level stage runner validates pipeline contracts; it is not a diff --git a/packages/orchestration/contracts/artifacts/execution-trace.schema.json b/packages/orchestration/contracts/artifacts/execution-trace.schema.json index f9c4091..3962e28 100644 --- a/packages/orchestration/contracts/artifacts/execution-trace.schema.json +++ b/packages/orchestration/contracts/artifacts/execution-trace.schema.json @@ -16,9 +16,21 @@ }, "seq": { "type": "integer", "minimum": 1 }, "event_id": { "type": "string", "minLength": 1 }, + "parent_event_id": { "type": "string", "minLength": 1 }, + "input_digests": { + "type": "array", + "items": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "uniqueItems": true + }, + "output_digests": { + "type": "array", + "items": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "uniqueItems": true + }, "event": { - "type": "string", - "enum": [ + "anyOf": [ + { "type": "string", "pattern": "^workflow_[a-z][a-z0-9_]{1,95}$" }, + { "type": "string", "enum": [ "run_start", "phase_start", "phase_end", @@ -41,27 +53,12 @@ "run_interrupted", "run_blocked", "run_completed" + ] } ] }, "phase": { "type": "string", - "enum": [ - "arm", - "design", - "adversarial-review", - "plan", - "pmatch", - "build", - "quality-static", - "quality-tests", - "denoise", - "quality-frontend", - "quality-backend", - "quality-docs", - "security-review", - "release-readiness", - "post-build" - ] + "pattern": "^[a-z][a-z0-9._-]{0,63}$" }, "status": { "type": "string", diff --git a/packages/orchestration/contracts/graph/graph-context.schema.json b/packages/orchestration/contracts/graph/graph-context.schema.json new file mode 100644 index 0000000..4623795 --- /dev/null +++ b/packages/orchestration/contracts/graph/graph-context.schema.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://rae.local/contracts/graph/graph-context.schema.json", + "title": "RAE bounded graph context bundle", + "type": "object", + "additionalProperties": false, + "required": ["schema_version", "repository_id", "snapshot_id", "run_id", "phase", "query_id", "seed", "generated_at", "limits", "records"], + "properties": { + "schema_version": { "const": "1.0.0" }, + "repository_id": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "snapshot_id": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "run_id": { "type": ["string", "null"] }, + "phase": { "type": "string" }, + "query_id": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "seed": { "type": "string" }, + "generated_at": { "type": "string", "format": "date-time" }, + "limits": { "type": "object", "additionalProperties": false, "required": ["max_depth", "max_records"], "properties": { "max_depth": { "type": "integer", "maximum": 4 }, "max_records": { "type": "integer", "maximum": 200 } } }, + "records": { "type": "array", "maxItems": 200, "items": { "type": "object", "additionalProperties": false, "required": ["node_id", "kind", "selection_reason", "traversal_path", "trust_class", "source_ref", "source_digest", "staleness", "score", "snippet"], "properties": { "node_id": { "type": "string" }, "kind": { "type": "string" }, "selection_reason": { "type": "string" }, "traversal_path": { "type": "array", "maxItems": 5, "items": { "type": "string" } }, "trust_class": { "type": "string" }, "source_ref": { "type": "string" }, "source_digest": { "type": "string" }, "staleness": { "enum": ["current", "historical", "stale", "conflicting"] }, "score": { "type": "object", "additionalProperties": false, "required": ["exact", "lexical", "distance", "total"], "properties": { "exact": { "type": "number" }, "lexical": { "type": "number" }, "distance": { "type": "number" }, "total": { "type": "number" } } }, "snippet": { "type": "string", "maxLength": 2000 } } } } + } +} diff --git a/packages/orchestration/contracts/graph/graph-edge.schema.json b/packages/orchestration/contracts/graph/graph-edge.schema.json new file mode 100644 index 0000000..2435143 --- /dev/null +++ b/packages/orchestration/contracts/graph/graph-edge.schema.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://rae.local/contracts/graph/graph-edge.schema.json", + "title": "RAE graph edge", + "type": "object", + "additionalProperties": false, + "required": ["record_type", "graph_family", "repository_id", "run_id", "kind", "logical_id", "version_id", "from", "to", "source_ref", "source_digest", "projector", "transaction_time", "trust_class", "attributes"], + "properties": { + "record_type": { "const": "edge" }, + "graph_family": { "enum": ["evidence", "workflow", "repository", "memory"] }, + "repository_id": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "run_id": { "type": ["string", "null"] }, + "kind": { "enum": ["CONTAINS", "DEPENDS_ON", "REFERENCES", "READS", "WRITES", "DERIVED_FROM", "COVERS", "VERIFIES", "EVALUATES", "AUTHORIZED_BY", "SUPPORTS_CLAIM", "SUPERSEDES", "INVALIDATES", "INSTANCE_OF", "NEXT", "SELECTS", "RECOMMENDS"] }, + "logical_id": { "type": "string", "minLength": 1 }, + "version_id": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "from": { "type": "string", "minLength": 1 }, + "to": { "type": "string", "minLength": 1 }, + "source_ref": { "type": "string", "minLength": 1 }, + "source_digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "projector": { "type": "string", "minLength": 1 }, + "transaction_time": { "type": "string", "format": "date-time" }, + "valid_from": { "type": ["string", "null"], "format": "date-time" }, + "valid_to": { "type": ["string", "null"], "format": "date-time" }, + "trust_class": { "enum": ["authoritative", "verified-derived", "model-proposed", "untrusted"] }, + "attributes": { "type": "object" } + } +} diff --git a/packages/orchestration/contracts/graph/graph-manifest.schema.json b/packages/orchestration/contracts/graph/graph-manifest.schema.json new file mode 100644 index 0000000..b71bdc1 --- /dev/null +++ b/packages/orchestration/contracts/graph/graph-manifest.schema.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://rae.local/contracts/graph/graph-manifest.schema.json", + "title": "RAE graph manifest", + "type": "object", + "additionalProperties": false, + "required": ["schema_version", "projector", "repository_id", "snapshot_id", "run_id", "transaction_time", "node_count", "edge_count", "nodes_digest", "edges_digest", "canonical_digest", "limits", "validation"], + "properties": { + "schema_version": { "const": "1.0.0" }, + "projector": { "type": "string" }, + "repository_id": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "snapshot_id": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "run_id": { "type": ["string", "null"] }, + "transaction_time": { "type": "string", "format": "date-time" }, + "node_count": { "type": "integer", "minimum": 0, "maximum": 250000 }, + "edge_count": { "type": "integer", "minimum": 0, "maximum": 1000000 }, + "nodes_digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "edges_digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "canonical_digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "limits": { "type": "object", "additionalProperties": false, "required": ["max_nodes", "max_edges", "max_file_bytes"], "properties": { "max_nodes": { "const": 250000 }, "max_edges": { "const": 1000000 }, "max_file_bytes": { "const": 1048576 } } }, + "validation": { "type": "object", "additionalProperties": false, "required": ["valid", "issues"], "properties": { "valid": { "type": "boolean" }, "issues": { "type": "array", "items": { "type": "string" } } } } + } +} diff --git a/packages/orchestration/contracts/graph/graph-node.schema.json b/packages/orchestration/contracts/graph/graph-node.schema.json new file mode 100644 index 0000000..cc5a330 --- /dev/null +++ b/packages/orchestration/contracts/graph/graph-node.schema.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://rae.local/contracts/graph/graph-node.schema.json", + "title": "RAE graph node", + "type": "object", + "additionalProperties": false, + "required": ["record_type", "graph_family", "repository_id", "run_id", "kind", "logical_id", "version_id", "source_ref", "source_digest", "projector", "transaction_time", "trust_class", "attributes"], + "properties": { + "record_type": { "const": "node" }, + "graph_family": { "enum": ["evidence", "workflow", "repository", "memory"] }, + "repository_id": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "run_id": { "type": ["string", "null"] }, + "kind": { "enum": ["Repository", "ProjectSnapshot", "Run", "PhaseAttempt", "WorkflowRevision", "AgentNode", "NodeAttempt", "Join", "LoopIteration", "Candidate", "Evaluation", "Recommendation", "ActivationDecision", "Requirement", "Constraint", "PlanTask", "TestCase", "File", "ArtifactVersion", "CommandExecution", "GateDecision", "CheckpointDecision", "Finding", "Claim", "SourceDocument"] }, + "logical_id": { "type": "string", "minLength": 1 }, + "version_id": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "source_ref": { "type": "string", "minLength": 1 }, + "source_digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "projector": { "type": "string", "minLength": 1 }, + "transaction_time": { "type": "string", "format": "date-time" }, + "valid_from": { "type": ["string", "null"], "format": "date-time" }, + "valid_to": { "type": ["string", "null"], "format": "date-time" }, + "trust_class": { "enum": ["authoritative", "verified-derived", "model-proposed", "untrusted"] }, + "attributes": { "type": "object" } + } +} diff --git a/packages/orchestration/contracts/graph/memory-decision.schema.json b/packages/orchestration/contracts/graph/memory-decision.schema.json new file mode 100644 index 0000000..fc43769 --- /dev/null +++ b/packages/orchestration/contracts/graph/memory-decision.schema.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://rae.local/contracts/graph/memory-decision.schema.json", + "title": "RAE graph memory decision", + "type": "object", + "additionalProperties": false, + "required": ["schema_version", "decision_id", "candidate_id", "decision", "actor", "rationale", "source_ref", "source_digest", "recorded_at"], + "properties": { + "schema_version": { "const": "1.0.0" }, + "decision_id": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "candidate_id": { "type": "string", "minLength": 1 }, + "decision": { "enum": ["promoted", "rejected", "superseded", "invalidated"] }, + "actor": { "type": "string", "minLength": 1 }, + "rationale": { "type": "string", "minLength": 1 }, + "source_ref": { "type": "string", "minLength": 1 }, + "source_digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "recorded_at": { "type": "string", "format": "date-time" } + } +} diff --git a/packages/orchestration/contracts/workflows/execution-profile-v1.schema.json b/packages/orchestration/contracts/workflows/execution-profile-v1.schema.json new file mode 100644 index 0000000..a935d8f --- /dev/null +++ b/packages/orchestration/contracts/workflows/execution-profile-v1.schema.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://rae.local/contracts/workflows/execution-profile-v1.schema.json", + "title": "RAE operator-owned Codex execution profile", + "type": "object", + "additionalProperties": false, + "required": ["schema_version", "profile_id", "tiers"], + "properties": { + "schema_version": { "const": "1.0.0" }, + "profile_id": { "type": "string", "pattern": "^[a-z][a-z0-9-]{2,63}$" }, + "tiers": { + "type": "object", "additionalProperties": false, + "required": ["economy", "standard", "judgment"], + "properties": { + "economy": { "$ref": "#/$defs/mapping" }, + "standard": { "$ref": "#/$defs/mapping" }, + "judgment": { "$ref": "#/$defs/mapping" } + } + } + }, + "$defs": { + "mapping": { + "type": "object", "additionalProperties": false, "required": ["model", "reasoning_effort"], + "properties": { + "model": { "type": "string", "minLength": 1, "maxLength": 128 }, + "reasoning_effort": { "enum": ["low", "medium", "high", "xhigh"] } + } + } + } +} diff --git a/packages/orchestration/contracts/workflows/execution-profile-v2.schema.json b/packages/orchestration/contracts/workflows/execution-profile-v2.schema.json new file mode 100644 index 0000000..02a8f0b --- /dev/null +++ b/packages/orchestration/contracts/workflows/execution-profile-v2.schema.json @@ -0,0 +1,92 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://rae.local/contracts/workflows/execution-profile-v2.schema.json", + "title": "RAE operator-owned Codex execution and capability profile", + "type": "object", + "additionalProperties": false, + "required": [ + "schema_version", + "profile_id", + "tiers", + "capability_sets", + "default_capability_set", + "node_capability_sets" + ], + "properties": { + "schema_version": { "const": "2.0.0" }, + "profile_id": { "type": "string", "pattern": "^[a-z][a-z0-9-]{2,63}$" }, + "tiers": { + "type": "object", + "additionalProperties": false, + "required": ["economy", "standard", "judgment"], + "properties": { + "economy": { "$ref": "#/$defs/model_mapping" }, + "standard": { "$ref": "#/$defs/model_mapping" }, + "judgment": { "$ref": "#/$defs/model_mapping" } + } + }, + "capability_sets": { + "type": "object", + "minProperties": 1, + "propertyNames": { "$ref": "#/$defs/name" }, + "additionalProperties": { "$ref": "#/$defs/capability_set" } + }, + "default_capability_set": { "$ref": "#/$defs/name" }, + "node_capability_sets": { + "type": "object", + "minProperties": 1, + "propertyNames": { "$ref": "#/$defs/node_id" }, + "additionalProperties": { "$ref": "#/$defs/name" } + } + }, + "$defs": { + "name": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,63}$" }, + "node_id": { "type": "string", "pattern": "^[a-z][a-z0-9-]{0,63}$" }, + "model_mapping": { + "type": "object", + "additionalProperties": false, + "required": ["model", "reasoning_effort"], + "properties": { + "model": { "type": "string", "minLength": 1, "maxLength": 128 }, + "reasoning_effort": { "enum": ["low", "medium", "high", "xhigh"] } + } + }, + "capability_set": { + "type": "object", + "additionalProperties": false, + "required": ["web_search", "mcp_servers", "credential_env_vars"], + "properties": { + "web_search": { "const": "disabled" }, + "mcp_servers": { + "type": "array", + "maxItems": 16, + "items": { "$ref": "#/$defs/mcp_server" } + }, + "credential_env_vars": { + "type": "array", + "maxItems": 32, + "uniqueItems": true, + "items": { "type": "string", "pattern": "^[A-Z][A-Z0-9_]{1,127}$" } + } + } + }, + "mcp_server": { + "type": "object", + "additionalProperties": false, + "required": ["name", "transport", "url", "enabled_tools", "token_env_var"], + "properties": { + "name": { "$ref": "#/$defs/name" }, + "transport": { "const": "streamable-http" }, + "url": { "type": "string", "format": "uri", "pattern": "^https://" }, + "enabled_tools": { + "type": "array", + "minItems": 1, + "maxItems": 128, + "uniqueItems": true, + "items": { "type": "string", "minLength": 1, "maxLength": 128 } + }, + "token_env_var": { "type": "string", "pattern": "^[A-Z][A-Z0-9_]{1,127}$" } + } + } + } +} diff --git a/packages/orchestration/contracts/workflows/execution-profile-v3.schema.json b/packages/orchestration/contracts/workflows/execution-profile-v3.schema.json new file mode 100644 index 0000000..022ead6 --- /dev/null +++ b/packages/orchestration/contracts/workflows/execution-profile-v3.schema.json @@ -0,0 +1,69 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://rae.local/contracts/workflows/execution-profile-v3.schema.json", + "title": "RAE provider-neutral execution route profile", + "type": "object", + "additionalProperties": false, + "required": ["schema_version", "profile_id", "routes", "tiers"], + "properties": { + "schema_version": { "const": "3.0.0" }, + "profile_id": { "type": "string", "pattern": "^[a-z][a-z0-9-]{2,63}$" }, + "routes": { + "type": "object", + "minProperties": 1, + "maxProperties": 32, + "propertyNames": { "$ref": "#/$defs/route_id" }, + "additionalProperties": { "$ref": "#/$defs/route" } + }, + "tiers": { + "type": "object", + "additionalProperties": false, + "required": ["economy", "standard", "judgment"], + "properties": { + "economy": { "$ref": "#/$defs/route_id" }, + "standard": { "$ref": "#/$defs/route_id" }, + "judgment": { "$ref": "#/$defs/route_id" } + } + }, + "node_routes": { + "type": "object", + "maxProperties": 64, + "propertyNames": { "$ref": "#/$defs/node_id" }, + "additionalProperties": { "$ref": "#/$defs/route_id" } + } + }, + "$defs": { + "route_id": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,63}$" }, + "node_id": { "type": "string", "pattern": "^[a-z][a-z0-9._-]{0,63}$" }, + "model": { + "type": "string", + "minLength": 3, + "maxLength": 160, + "pattern": "^[A-Za-z0-9][A-Za-z0-9._/-]*$" + }, + "route": { + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "required": ["executor", "model", "reasoning_effort"], + "properties": { + "executor": { "const": "codex" }, + "model": { "$ref": "#/$defs/model" }, + "reasoning_effort": { "enum": ["low", "medium", "high", "xhigh"] } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": ["executor", "model"], + "properties": { + "executor": { "const": "opencode" }, + "model": { "$ref": "#/$defs/model" }, + "variant": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$" } + } + } + ] + } + } +} diff --git a/packages/orchestration/contracts/workflows/node-envelope-v2.1.schema.json b/packages/orchestration/contracts/workflows/node-envelope-v2.1.schema.json new file mode 100644 index 0000000..09a02f4 --- /dev/null +++ b/packages/orchestration/contracts/workflows/node-envelope-v2.1.schema.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://rae.local/contracts/workflows/node-envelope-v2.1.schema.json", + "title": "Immutable workflow node-instance result envelope v2.1", + "type": "object", + "additionalProperties": false, + "required": ["schema_version", "run_id", "workflow_digest", "node_id", "instance_id", "attempt", "status", "payload", "findings", "evidence_refs", "ownership", "changed_paths", "command_evidence", "resource_usage", "input_digest", "output_digest", "execution_tier"], + "properties": { + "schema_version": { "const": "2.1.0" }, + "run_id": { "type": "string", "minLength": 1 }, + "workflow_digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "node_id": { "type": "string", "minLength": 1 }, + "instance_id": { "type": "string", "pattern": "^[a-zA-Z0-9._:-]{1,192}$" }, + "parent_node": { "type": ["string", "null"] }, + "item_key": { "type": ["string", "null"], "maxLength": 512 }, + "item_digest": { "type": ["string", "null"], "pattern": "^(?:[a-f0-9]{64})?$" }, + "attempt": { "type": "integer", "minimum": 1, "maximum": 3 }, + "loop_iteration": { "type": "integer", "minimum": 1, "maximum": 5 }, + "status": { "enum": ["passed", "failed", "blocked", "stopped", "skipped", "collected"] }, + "failure": { "type": ["object", "null"] }, + "payload": {}, + "findings": { "type": "array", "maxItems": 1024, "items": { "type": "object" } }, + "evidence_refs": { "type": "array", "maxItems": 1024, "items": { "type": "string" } }, + "ownership": { "type": "object" }, + "changed_paths": { "type": "array", "maxItems": 4096, "uniqueItems": true, "items": { "type": "string" } }, + "command_evidence": { "type": "array", "maxItems": 1024, "items": { "type": "object" } }, + "resource_usage": { "type": "object" }, + "input_digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "output_digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "execution_tier": { "enum": ["economy", "standard", "judgment", "runtime"] }, + "selection": { "type": ["object", "null"] }, + "quorum": { "type": ["object", "null"] }, + "convergence": { "type": ["object", "null"] } + } +} diff --git a/packages/orchestration/contracts/workflows/node-envelope-v2.2.schema.json b/packages/orchestration/contracts/workflows/node-envelope-v2.2.schema.json new file mode 100644 index 0000000..aff38fb --- /dev/null +++ b/packages/orchestration/contracts/workflows/node-envelope-v2.2.schema.json @@ -0,0 +1,42 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://rae.local/contracts/workflows/node-envelope-v2.2.schema.json", + "title": "Immutable workflow node result envelope v2.2", + "type": "object", + "additionalProperties": false, + "required": ["schema_version", "run_id", "workflow_digest", "node_id", "instance_id", "attempt", "status", "payload", "findings", "evidence_refs", "ownership", "changed_paths", "command_evidence", "resource_usage", "input_digest", "output_digest", "execution_tier", "context_manifest"], + "properties": { + "schema_version": { "const": "2.2.0" }, + "run_id": { "type": "string", "minLength": 1 }, + "workflow_digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "node_id": { "type": "string", "minLength": 1 }, + "instance_id": { "type": "string", "pattern": "^[a-zA-Z0-9._:-]{1,192}$" }, + "attempt": { "type": "integer", "minimum": 1, "maximum": 3 }, + "status": { "enum": ["passed", "failed", "blocked", "stopped", "skipped"] }, + "failure": { "type": ["object", "null"] }, + "payload": {}, + "findings": { "type": "array", "maxItems": 1024, "items": { "type": "object" } }, + "evidence_refs": { "type": "array", "maxItems": 1024, "items": { "type": "string" } }, + "ownership": { "type": "object" }, + "changed_paths": { "type": "array", "maxItems": 4096, "uniqueItems": true, "items": { "type": "string" } }, + "command_evidence": { "type": "array", "maxItems": 1024, "items": { "type": "object" } }, + "resource_usage": { "type": "object" }, + "input_digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "output_digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "execution_tier": { "enum": ["economy", "standard", "judgment", "runtime"] }, + "context_manifest": { + "type": "object", "additionalProperties": false, + "required": ["cap_bytes", "assembled_bytes", "artifact_refs", "inline_artifacts", "mandatory_budget_bytes", "optional_budget_bytes", "included", "omitted"], + "properties": { + "cap_bytes": { "type": "integer", "minimum": 16384, "maximum": 262144 }, + "assembled_bytes": { "type": "integer", "minimum": 0, "maximum": 262144 }, + "mandatory_budget_bytes": { "type": "integer", "minimum": 16384, "maximum": 262144 }, + "optional_budget_bytes": { "type": "integer", "minimum": 0, "maximum": 262144 }, + "included": { "type": "array", "items": { "type": "object" } }, + "omitted": { "type": "array", "items": { "type": "object" } }, + "artifact_refs": { "type": "array", "items": { "type": "object" } }, + "inline_artifacts": { "type": "array", "items": { "type": "object" } } + } + } + } +} diff --git a/packages/orchestration/contracts/workflows/node-envelope-v2.schema.json b/packages/orchestration/contracts/workflows/node-envelope-v2.schema.json new file mode 100644 index 0000000..c56e1a2 --- /dev/null +++ b/packages/orchestration/contracts/workflows/node-envelope-v2.schema.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://rae.local/contracts/workflows/node-envelope-v2.schema.json", + "title": "Immutable workflow node result envelope", + "type": "object", + "additionalProperties": false, + "required": ["schema_version", "run_id", "workflow_digest", "node_id", "attempt", "status", "payload", "findings", "evidence_refs", "ownership", "changed_paths", "command_evidence", "resource_usage", "input_digest", "output_digest"], + "properties": { + "schema_version": { "const": "2.0.0" }, + "run_id": { "type": "string", "minLength": 1 }, + "workflow_digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "node_id": { "type": "string", "minLength": 1 }, + "attempt": { "type": "integer", "minimum": 1, "maximum": 3 }, + "loop_iteration": { "type": "integer", "minimum": 1, "maximum": 5 }, + "status": { "enum": ["passed", "failed", "blocked", "stopped", "skipped"] }, + "payload": {}, + "findings": { "type": "array", "maxItems": 1024, "items": { "type": "object" } }, + "evidence_refs": { "type": "array", "maxItems": 1024, "items": { "type": "string" } }, + "ownership": { "type": "object" }, + "changed_paths": { "type": "array", "maxItems": 4096, "uniqueItems": true, "items": { "type": "string" } }, + "command_evidence": { "type": "array", "maxItems": 1024, "items": { "type": "object" } }, + "resource_usage": { "type": "object" }, + "input_digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, + "output_digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" } + } +} diff --git a/packages/orchestration/contracts/workflows/workflow-v2.1.schema.json b/packages/orchestration/contracts/workflows/workflow-v2.1.schema.json new file mode 100644 index 0000000..d13094d --- /dev/null +++ b/packages/orchestration/contracts/workflows/workflow-v2.1.schema.json @@ -0,0 +1,122 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://rae.local/contracts/workflows/workflow-v2.1.schema.json", + "title": "RAE graph-native workflow v2.1", + "type": "object", + "additionalProperties": false, + "required": ["schema_version", "workflow_id", "revision", "entry_node", "terminal_node", "nodes", "edges"], + "properties": { + "schema_version": { "const": "2.1.0" }, + "workflow_id": { "type": "string", "pattern": "^[a-z][a-z0-9-]{2,63}$" }, + "revision": { "type": "integer", "minimum": 1 }, + "title": { "type": "string", "minLength": 1, "maxLength": 160 }, + "entry_node": { "$ref": "#/$defs/nodeId" }, + "terminal_node": { "$ref": "#/$defs/nodeId" }, + "nodes": { "type": "array", "minItems": 2, "maxItems": 64, "items": { "$ref": "#/$defs/node" } }, + "edges": { "type": "array", "minItems": 1, "maxItems": 256, "items": { "$ref": "#/$defs/edge" } }, + "payload_contracts": { "type": "object", "maxProperties": 64, "additionalProperties": { "type": "object" } }, + "budgets": { + "type": "object", "additionalProperties": false, + "properties": { + "max_concurrency": { "type": "integer", "minimum": 1, "maximum": 4 }, + "max_repair_rounds": { "type": "integer", "minimum": 0, "maximum": 5 }, + "max_attempts_per_node": { "type": "integer", "minimum": 1, "maximum": 3 }, + "max_dynamic_instances": { "type": "integer", "minimum": 1, "maximum": 128 }, + "max_pipeline_depth": { "type": "integer", "minimum": 1, "maximum": 4 }, + "max_map_items": { "type": "integer", "minimum": 1, "maximum": 32 } + } + } + }, + "$defs": { + "nodeId": { "type": "string", "pattern": "^[a-z][a-z0-9._-]{0,63}$" }, + "pointer": { "type": "string", "pattern": "^(|/(?:[^~/]|~[01])*)$", "maxLength": 512 }, + "failure": { + "type": "object", "additionalProperties": false, "required": ["mode"], + "properties": { + "mode": { "enum": ["fail-workflow", "collect"] }, + "max_failures": { "type": "integer", "minimum": 0, "maximum": 31 }, + "minimum_successes": { "type": "integer", "minimum": 1, "maximum": 32 } + } + }, + "map": { + "type": "object", "additionalProperties": false, + "required": ["source_pointer", "stable_key_pointer"], + "properties": { + "source_pointer": { "$ref": "#/$defs/pointer" }, + "stable_key_pointer": { "$ref": "#/$defs/pointer" }, + "max_items": { "type": "integer", "minimum": 1, "maximum": 32 } + } + }, + "transform": { + "type": "object", "additionalProperties": false, "required": ["operation"], + "properties": { + "operation": { "enum": ["select", "flatten", "deduplicate", "sort", "limit", "group", "cartesian"] }, + "source_pointer": { "$ref": "#/$defs/pointer" }, + "value_pointer": { "$ref": "#/$defs/pointer" }, + "key_pointer": { "$ref": "#/$defs/pointer" }, + "pointers": { "type": "array", "minItems": 2, "maxItems": 4, "uniqueItems": true, "items": { "$ref": "#/$defs/pointer" } }, + "limit": { "type": "integer", "minimum": 1, "maximum": 128 }, + "descending": { "type": "boolean" } + } + }, + "quorum": { + "type": "object", "additionalProperties": false, "required": ["threshold"], + "properties": { + "threshold": { "type": "integer", "minimum": 1, "maximum": 64 }, + "groups": { + "type": "array", "minItems": 1, "maxItems": 16, + "items": { + "type": "object", "additionalProperties": false, "required": ["id", "members", "threshold"], + "properties": { + "id": { "type": "string", "pattern": "^[a-z][a-z0-9-]{0,31}$" }, + "members": { "type": "array", "minItems": 1, "maxItems": 32, "uniqueItems": true, "items": { "$ref": "#/$defs/nodeId" } }, + "threshold": { "type": "integer", "minimum": 1, "maximum": 32 } + } + } + } + } + }, + "loop": { + "type": "object", "additionalProperties": false, "required": ["max_iterations", "members"], + "properties": { + "mode": { "enum": ["bounded", "until-dry"] }, + "max_iterations": { "type": "integer", "minimum": 1, "maximum": 5 }, + "members": { "type": "array", "minItems": 1, "maxItems": 32, "uniqueItems": true, "items": { "$ref": "#/$defs/nodeId" } }, + "source_pointer": { "$ref": "#/$defs/pointer" }, + "stable_key_pointer": { "$ref": "#/$defs/pointer" } + } + }, + "node": { + "type": "object", "additionalProperties": false, "required": ["id", "kind", "access", "guidance"], + "properties": { + "id": { "$ref": "#/$defs/nodeId" }, + "kind": { "enum": ["agent", "map", "transform", "join", "gate", "checkpoint", "loop", "terminal"] }, + "access": { "enum": ["read", "write", "control"] }, + "guidance": { "type": "string", "minLength": 1, "maxLength": 12000 }, + "role": { "type": "string", "maxLength": 128 }, + "payload_contract": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,63}$" }, + "tier": { "enum": ["economy", "standard", "judgment"] }, + "join": { "enum": ["all", "any", "quorum"] }, + "quorum": { "$ref": "#/$defs/quorum" }, + "map": { "$ref": "#/$defs/map" }, + "transform": { "$ref": "#/$defs/transform" }, + "failure_handling": { "$ref": "#/$defs/failure" }, + "resource": { "type": "string", "maxLength": 128 }, + "ownership_plan": { "type": "boolean" }, + "mutation_checkpoint": { "type": "boolean" }, + "verification": { "type": "boolean" }, + "loop": { "$ref": "#/$defs/loop" } + } + }, + "edge": { + "type": "object", "additionalProperties": false, "required": ["from", "to", "type"], + "properties": { + "from": { "$ref": "#/$defs/nodeId" }, + "to": { "$ref": "#/$defs/nodeId" }, + "type": { "enum": ["sequence", "artifact", "stream", "condition", "loop-back"] }, + "artifact": { "type": "string", "maxLength": 128 }, + "condition": { "enum": ["success", "failure", "blocking-findings", "budget-available"] } + } + } + } +} diff --git a/packages/orchestration/contracts/workflows/workflow-v2.2.schema.json b/packages/orchestration/contracts/workflows/workflow-v2.2.schema.json new file mode 100644 index 0000000..6d7ba3f --- /dev/null +++ b/packages/orchestration/contracts/workflows/workflow-v2.2.schema.json @@ -0,0 +1,69 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://rae.local/contracts/workflows/workflow-v2.2.schema.json", + "title": "RAE graph-native workflow v2.2", + "type": "object", + "additionalProperties": false, + "required": ["schema_version", "workflow_id", "revision", "entry_node", "terminal_node", "nodes", "edges", "signal_contracts"], + "properties": { + "schema_version": { "const": "2.2.0" }, + "workflow_id": { "type": "string", "pattern": "^[a-z][a-z0-9-]{2,63}$" }, + "revision": { "type": "integer", "minimum": 1 }, + "title": { "type": "string", "minLength": 1, "maxLength": 160 }, + "entry_node": { "$ref": "#/$defs/nodeId" }, + "terminal_node": { "$ref": "#/$defs/nodeId" }, + "nodes": { "type": "array", "minItems": 2, "maxItems": 64, "items": { "$ref": "#/$defs/node" } }, + "edges": { "type": "array", "minItems": 1, "maxItems": 256, "items": { "$ref": "#/$defs/edge" } }, + "payload_contracts": { "type": "object", "maxProperties": 64, "additionalProperties": { "type": "object" } }, + "signal_contracts": { "type": "object", "minProperties": 1, "maxProperties": 32, "additionalProperties": { "type": "object" } }, + "budgets": { + "type": "object", "additionalProperties": false, + "properties": { + "max_concurrency": { "type": "integer", "minimum": 1, "maximum": 4 }, + "max_attempts_per_node": { "type": "integer", "minimum": 1, "maximum": 3 }, + "max_context_bytes": { "type": "integer", "minimum": 16384, "maximum": 262144 } + } + } + }, + "$defs": { + "nodeId": { "type": "string", "pattern": "^[a-z][a-z0-9._-]{0,63}$" }, + "signalName": { "type": "string", "pattern": "^[a-z][a-z0-9._-]{0,63}$" }, + "wait": { + "type": "object", "additionalProperties": false, "required": ["timeout_seconds", "signals", "signal_contract"], + "properties": { + "timeout_seconds": { "type": "integer", "minimum": 60, "maximum": 2592000 }, + "signals": { "type": "array", "minItems": 1, "maxItems": 32, "uniqueItems": true, "items": { "$ref": "#/$defs/signalName" } }, + "signal_contract": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,63}$" } + } + }, + "node": { + "type": "object", "additionalProperties": false, "required": ["id", "kind", "access", "guidance"], + "properties": { + "id": { "$ref": "#/$defs/nodeId" }, + "kind": { "enum": ["agent", "join", "gate", "checkpoint", "wait", "terminal"] }, + "access": { "enum": ["read", "write", "control"] }, + "guidance": { "type": "string", "minLength": 1, "maxLength": 12000 }, + "role": { "type": "string", "maxLength": 128 }, + "payload_contract": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,63}$" }, + "tier": { "enum": ["economy", "standard", "judgment"] }, + "join": { "enum": ["all", "any"] }, + "resource": { "type": "string", "maxLength": 128 }, + "ownership_plan": { "type": "boolean" }, + "mutation_checkpoint": { "type": "boolean" }, + "verification": { "type": "boolean" }, + "context": { "type": "object", "additionalProperties": false, "properties": { "include_operational_evidence": { "type": "boolean" } } }, + "wait": { "$ref": "#/$defs/wait" } + } + }, + "edge": { + "type": "object", "additionalProperties": false, "required": ["from", "to", "type"], + "properties": { + "from": { "$ref": "#/$defs/nodeId" }, + "to": { "$ref": "#/$defs/nodeId" }, + "type": { "enum": ["sequence", "artifact", "condition"] }, + "artifact": { "type": "string", "maxLength": 128 }, + "condition": { "enum": ["success", "failure", "blocking-findings", "budget-available"] } + } + } + } +} diff --git a/packages/orchestration/contracts/workflows/workflow-v2.schema.json b/packages/orchestration/contracts/workflows/workflow-v2.schema.json new file mode 100644 index 0000000..7a50ca6 --- /dev/null +++ b/packages/orchestration/contracts/workflows/workflow-v2.schema.json @@ -0,0 +1,75 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://rae.local/contracts/workflows/workflow-v2.schema.json", + "title": "RAE graph-native workflow", + "type": "object", + "additionalProperties": false, + "required": ["schema_version", "workflow_id", "revision", "entry_node", "terminal_node", "nodes", "edges"], + "properties": { + "schema_version": { "const": "2.0.0" }, + "workflow_id": { "type": "string", "pattern": "^[a-z][a-z0-9-]{2,63}$" }, + "revision": { "type": "integer", "minimum": 1 }, + "title": { "type": "string", "minLength": 1, "maxLength": 160 }, + "entry_node": { "$ref": "#/$defs/nodeId" }, + "terminal_node": { "$ref": "#/$defs/nodeId" }, + "nodes": { + "type": "array", "minItems": 2, "maxItems": 64, + "items": { "$ref": "#/$defs/node" } + }, + "edges": { + "type": "array", "minItems": 1, "maxItems": 256, + "items": { "$ref": "#/$defs/edge" } + }, + "payload_contracts": { + "type": "object", "maxProperties": 64, + "additionalProperties": { "type": "object" } + }, + "budgets": { + "type": "object", "additionalProperties": false, + "properties": { + "max_concurrency": { "type": "integer", "minimum": 1, "maximum": 4 }, + "max_repair_rounds": { "type": "integer", "minimum": 0, "maximum": 5 }, + "max_attempts_per_node": { "type": "integer", "minimum": 1, "maximum": 3 } + } + } + }, + "$defs": { + "nodeId": { "type": "string", "pattern": "^[a-z][a-z0-9._-]{0,63}$" }, + "node": { + "type": "object", "additionalProperties": false, + "required": ["id", "kind", "access", "guidance"], + "properties": { + "id": { "$ref": "#/$defs/nodeId" }, + "kind": { "enum": ["agent", "join", "gate", "checkpoint", "loop", "terminal"] }, + "access": { "enum": ["read", "write", "control"] }, + "guidance": { "type": "string", "minLength": 1, "maxLength": 12000 }, + "role": { "type": "string", "maxLength": 128 }, + "payload_contract": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,63}$" }, + "join": { "enum": ["all", "any"] }, + "resource": { "type": "string", "maxLength": 128 }, + "ownership_plan": { "type": "boolean" }, + "mutation_checkpoint": { "type": "boolean" }, + "verification": { "type": "boolean" }, + "loop": { + "type": "object", "additionalProperties": false, + "required": ["max_iterations", "members"], + "properties": { + "max_iterations": { "type": "integer", "minimum": 1, "maximum": 5 }, + "members": { "type": "array", "minItems": 1, "maxItems": 32, "uniqueItems": true, "items": { "$ref": "#/$defs/nodeId" } } + } + } + } + }, + "edge": { + "type": "object", "additionalProperties": false, + "required": ["from", "to", "type"], + "properties": { + "from": { "$ref": "#/$defs/nodeId" }, + "to": { "$ref": "#/$defs/nodeId" }, + "type": { "enum": ["sequence", "artifact", "condition", "loop-back"] }, + "artifact": { "type": "string", "maxLength": 128 }, + "condition": { "enum": ["success", "failure", "blocking-findings", "budget-available"] } + } + } + } +} diff --git a/packages/orchestration/docs/ROADMAP.md b/packages/orchestration/docs/ROADMAP.md index a923c43..89d0409 100644 --- a/packages/orchestration/docs/ROADMAP.md +++ b/packages/orchestration/docs/ROADMAP.md @@ -5,16 +5,32 @@ It is not a release schedule. ## Provider execution -- Codex is the only supported autonomous CLI integration. +- Codex remains the default autonomous CLI integration. +- OpenCode is supported only when selected explicitly. The current adapter + requires macOS Seatbelt containment, an isolated RAE worktree for writes, and + rejects `--in-place`. - Cursor, Claude, Gemini, and Kilo have synchronized guidance adapters but no autonomous executor. - The command provider remains an unsandboxed test interface and cannot pass operational diagnostics. +Remaining provider work includes a containment backend for other operating +systems, an authenticated OpenCode acceptance run against a real provider event +stream, and broader provider-version coverage. Direct OpenRouter API execution +is not implemented; OpenRouter models are available only through OpenCode +configuration. + Any additional executor must provide workspace isolation, structured artifact output, event streaming, fresh sessions, child-environment filtering, deadline handling, and protected Git-state enforcement before it can be supported. +## Workflow designer + +The loopback operator implements synchronized Loop, Graph, Analyze, and JSON +views for workflow 2.1. Remaining acceptance work is a rendered browser smoke +and one authenticated proposal-to-activation run. Workflow 2.0 and experimental +2.2 remain expert JSON surfaces rather than guided-editor targets. + ## Process containment The operator console uses POSIX process groups for interruption. It cannot prove diff --git a/packages/orchestration/operator/README.md b/packages/orchestration/operator/README.md index a2aa60d..c02c9c2 100644 --- a/packages/orchestration/operator/README.md +++ b/packages/orchestration/operator/README.md @@ -15,6 +15,16 @@ evidence from a real run: ![Evidence Dossier mobile](docs/screenshots/evidence-dossier-mobile.png) +Regenerate both captures from the current operator UI and the sanitized graph +fixture: + +```bash +node packages/orchestration/operator/scripts/capture-docs-screenshots.mjs +``` + +The capture script requires a local Chrome or Chromium installation. It starts +an ephemeral loopback fixture server and does not read repository run state. + Start it with one or more canonical Git roots: ```bash @@ -28,16 +38,50 @@ The supported umbrella form is: ./scripts/rae.sh operator serve --project /absolute/path/to/repository ``` +Preload one or more server-owned execution profiles with repeatable +`--execution-profile ` arguments. Profile paths and credentials stay on +the server. The browser receives only sanitized IDs, routes, models, and +readiness. + The server prints one URL. Its 256-bit session token appears only in the URL fragment. The app removes the fragment from browser history and keeps the token in memory for bearer-authenticated API and event-stream requests. +## Remote upstream mode + +To use the same local console with a separately hosted operator API, keep the +browser session on loopback and configure an upstream origin and an owner-only +credential file: + +```bash +./scripts/rae.sh operator serve \ + --remote-url https://operator.example \ + --token-file /absolute/path/to/operator-token +``` + +Remote mode cannot be combined with `--project`. The browser still reaches only +the ephemeral local URL and sends only its local session bearer. The server +reads the upstream bearer token from `--token-file` for every forwarded request; +it is never included in browser JavaScript, local API responses, or errors. + +`--remote-url` must be an origin-only HTTPS URL. HTTP is accepted only for an +explicit loopback development origin. The token file must be a regular file +owned by the current user, with no group or world permissions; symlinks and +unsafe files are rejected. Token rotation therefore takes effect on the next +request without restarting the console. + +Remote mode is a fixed API relay, not a general proxy. It rejects redirects and +forwards only the `/api/v1` methods used by this console, including the listed +run, event, control, and workflow-editor routes. Request bodies are limited to +64 KiB and upstream responses to 1 MiB. + ## API All `/api/v1` requests require the session bearer token and an exact loopback `Host`. State-changing requests also require the exact loopback `Origin`. - `GET /api/v1/projects` +- `GET /api/v1/projects/:projectId/execution-profiles` - `GET|POST /api/v1/projects/:projectId/runs` - `GET /api/v1/projects/:projectId/runs/:runId` - `GET /api/v1/projects/:projectId/runs/:runId/events` @@ -47,18 +91,48 @@ All `/api/v1` requests require the session bearer token and an exact loopback - `POST .../:runId/interrupt` - `POST .../:runId/checkpoint-decision` - `POST .../:runId/cleanup` - -Start accepts only `task` and `checkpoint_policy`. Interrupt and cleanup require -`confirm_run_id` to exactly match the selected run. A checkpoint decision -requires its opaque `checkpoint_id`, an opaque `decision_id`, one of `approve`, -`reject`, or `escalate`, and a non-empty `rationale`. The server records the -actor as `rae-loopback-operator`. +- `GET /api/v1/projects/:projectId/workflows` +- `GET /api/v1/projects/:projectId/workflows/:workflowId` +- `GET|POST /api/v1/projects/:projectId/workflows/templates` +- `POST /api/v1/projects/:projectId/workflows/:workflowId/analysis` +- `POST /api/v1/projects/:projectId/workflows/:workflowId/proposals` +- `GET /api/v1/projects/:projectId/workflows/:workflowId/proposals/:jobId` +- `POST /api/v1/projects/:projectId/workflows/:workflowId/drafts` +- `GET /api/v1/projects/:projectId/workflows/:workflowId/diff` +- `POST /api/v1/projects/:projectId/workflows/:workflowId/revisions/:revision/validate` +- `POST /api/v1/projects/:projectId/workflows/:workflowId/revisions/:revision/activate` + +Start accepts `task`, `checkpoint_policy`, and an optional preloaded +`execution_profile_id`. It never accepts a profile path. Interrupt and cleanup +require `confirm_run_id` to exactly match the selected run. A checkpoint +decision requires its opaque `checkpoint_id`, an opaque `decision_id`, one of +`approve`, `reject`, or `escalate`, and a non-empty `rationale`. The server +records the actor as `rae-loopback-operator`. The console never accepts in-place execution, command providers, environment overrides, raw trace access, forced cleanup, commit, push, or publish controls. Cleanup delegates to the pipeline's ownership- and dirty-state-validating worktree cleanup operation. +The workflow editor provides synchronized Loop, Graph, Analyze, and JSON views. +It compiles five guided templates to workflow 2.1, exposes keyboard-operable +node and edge controls, analyzes unsaved revisions, and loads validated proposal +jobs into the unsaved editor. Saving a revision and activating its exact digest +remain separate human actions. Workflow 2.0 and experimental 2.2 stay available +through the expert JSON view. Registry mutations are rejected while any +allowlisted project run is active. + +Proposal creation is asynchronous. A request accepts only `task`, optional +`base_revision`, and optional `execution_profile_id`; task text is limited to +32 KiB and the in-memory queue holds at most 12 jobs. The result is validated +before it is returned to the editor. The proposal endpoint does not save a +revision, activate a digest, or start a run. + +Run projections include bounded graph health counts when a projection exists: +availability, validation state, node and edge counts, stale-source count, and +stale-memory and unresolved-conflict counts. The API does not expose raw graph +records, absolute paths, prompts, provider metadata, or untrusted memory text. + Only one process started by a server instance may be active at once. Interrupt signals that owned process group, records `interrupted` after it exits, and removes an autonomous lock only when its recorded PID matches the owned child. diff --git a/packages/orchestration/operator/docs/screenshots/evidence-dossier-desktop.png b/packages/orchestration/operator/docs/screenshots/evidence-dossier-desktop.png index ae8b9b39028f7f66d7b70299bd7b47fdd57a240a..b9cd967475666efbe48844912b519f36e22cfa85 100644 GIT binary patch literal 228916 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

5?*` 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 literal 166736 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

mt+SEgUwf#>7RLe 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 z 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 STHk|zZYVremMwi^ run.id)); this.#spawn( project, @@ -214,6 +218,7 @@ export class RunController { "codex", "--checkpoint-policy", checkpointPolicy, + ...(executionProfile ? ["--execution-profile", executionProfile.source] : []), "--json", ], baselineIds, diff --git a/packages/orchestration/operator/lib/profiles.mjs b/packages/orchestration/operator/lib/profiles.mjs new file mode 100644 index 0000000..446401a --- /dev/null +++ b/packages/orchestration/operator/lib/profiles.mjs @@ -0,0 +1,86 @@ +/** Keeps execution-profile files server-side and exposes a deliberately small public projection. */ +import { existsSync } from "node:fs"; +import { pathToFileURL } from "node:url"; +import { resolve } from "node:path"; + +const executionProfilePath = resolve( + import.meta.dirname, + "../../scripts/pipeline/lib/execution-profile.mjs", +); + +function unavailable(message) { + throw Object.assign(new Error(message), { status: 503 }); +} + +function publicProfile({ profile }) { + const routeRecords = + profile.schema_version === "3.0.0" + ? Object.entries(profile.routes).map(([id, route]) => ({ id, ...route })) + : Object.entries(profile.tiers ?? {}).map(([id, route]) => ({ + id, + executor: "codex", + ...route, + })); + const models = + profile.schema_version === "3.0.0" + ? Object.fromEntries( + Object.entries(profile.tiers).map(([tier, routeId]) => [ + tier, + profile.routes[routeId].model, + ]), + ) + : Object.fromEntries( + Object.entries(profile.tiers ?? {}).map(([tier, mapping]) => [tier, mapping.model]), + ); + return Object.freeze({ + id: profile.profile_id, + routes: routeRecords.sort((left, right) => left.id.localeCompare(right.id)), + models, + readiness: "loaded", + }); +} + +/** + * Loads each explicitly supplied profile once at server startup. Source paths, + * environment names, capabilities, and profile contents never leave this map. + */ +export async function loadOperatorProfiles(paths = []) { + if (!Array.isArray(paths)) throw new Error("execution profiles must be an array"); + if (paths.length > 16) throw new Error("at most 16 execution profiles may be loaded"); + if (paths.length === 0) return new OperatorProfiles(); + if (!existsSync(executionProfilePath)) unavailable("execution profile support is unavailable"); + const module = await import(pathToFileURL(executionProfilePath).href); + if (typeof module.loadExecutionProfile !== "function") { + unavailable("execution profile support is unavailable"); + } + const loaded = paths.map((pathValue) => module.loadExecutionProfile(pathValue)); + return new OperatorProfiles(loaded); +} + +export class OperatorProfiles { + constructor(loaded = []) { + this.records = new Map(); + for (const record of loaded) { + const id = record?.profile?.profile_id; + if (typeof id !== "string" || !id) throw new Error("invalid execution profile"); + if (this.records.has(id)) throw new Error(`duplicate execution profile id: ${id}`); + this.records.set(id, Object.freeze(record)); + } + } + + list() { + return [...this.records.values()] + .map(publicProfile) + .sort((left, right) => left.id.localeCompare(right.id)); + } + + resolve(id) { + if (id === undefined || id === null || id === "") return null; + if (typeof id !== "string" || !/^[a-z][a-z0-9-]{2,63}$/.test(id)) { + throw Object.assign(new Error("invalid execution_profile_id"), { status: 400 }); + } + const record = this.records.get(id); + if (!record) throw Object.assign(new Error("unknown execution_profile_id"), { status: 400 }); + return record; + } +} diff --git a/packages/orchestration/operator/lib/proposals.mjs b/packages/orchestration/operator/lib/proposals.mjs new file mode 100644 index 0000000..b62ccf8 --- /dev/null +++ b/packages/orchestration/operator/lib/proposals.mjs @@ -0,0 +1,135 @@ +/** Bounded, ephemeral workflow-proposal jobs. Candidates are never saved or activated here. */ +import { randomUUID } from "node:crypto"; +import { existsSync } from "node:fs"; +import { resolve } from "node:path"; +import { pathToFileURL } from "node:url"; + +const proposalPath = resolve( + import.meta.dirname, + "../../scripts/pipeline/lib/workflow-proposal.mjs", +); +const workflowContractPath = resolve( + import.meta.dirname, + "../../scripts/pipeline/lib/workflow-contract.mjs", +); +const MAX_JOBS = 12; +const MAX_TASK_BYTES = 32 * 1024; +const PROPOSAL_FIELDS = new Set(["task", "base_revision", "execution_profile_id"]); + +function httpError(status, message) { + return Object.assign(new Error(message), { status }); +} + +/** Validates the enclosing proposal object before field-specific checks. */ +export function validateProposalBody(body) { + if (!body || typeof body !== "object" || Array.isArray(body)) + throw httpError(400, "proposal body is required"); + for (const key of Object.keys(body)) + if (!PROPOSAL_FIELDS.has(key)) throw httpError(400, `unsupported proposal field: ${key}`); + return body; +} + +/** Validates and normalizes the proposal fields accepted by the job queue. */ +export function validateProposalFields(body) { + if (typeof body.task !== "string" || body.task.trim().length === 0) + throw httpError(400, "proposal task is required"); + if (Buffer.byteLength(body.task, "utf8") > MAX_TASK_BYTES) + throw httpError(413, "proposal task exceeds 32768 bytes"); + if (body.base_revision !== undefined && !/^[0-9]{1,9}$/.test(String(body.base_revision))) { + throw httpError(400, "invalid base_revision"); + } + return { + task: body.task.trim(), + baseRevision: body.base_revision ?? null, + executionProfileId: body.execution_profile_id ?? null, + }; +} + +function requestInput(body) { + return validateProposalFields(validateProposalBody(body)); +} + +async function defaultCandidateRunner(input) { + if (!existsSync(proposalPath)) throw httpError(503, "workflow proposal support is unavailable"); + const module = await import(pathToFileURL(proposalPath).href); + // The legacy `proposeWorkflow` persists a draft and is deliberately never called. + if (typeof module.proposeWorkflowCandidate !== "function") { + throw httpError(503, "unsaved workflow proposal support is unavailable"); + } + return module.proposeWorkflowCandidate(input); +} + +async function validateCandidate(candidate) { + if (!existsSync(workflowContractPath)) + throw httpError(503, "workflow validation support is unavailable"); + const module = await import(pathToFileURL(workflowContractPath).href); + if (typeof module.validateWorkflow !== "function") { + throw httpError(503, "workflow validation support is unavailable"); + } + return module.validateWorkflow(candidate); +} + +function publicJob(job) { + return { + id: job.id, + workflow_id: job.workflowId, + state: job.state, + created_at: job.createdAt, + completed_at: job.completedAt ?? null, + ...(job.error ? { error: job.error } : {}), + ...(job.candidate ? { candidate: job.candidate } : {}), + }; +} + +export class WorkflowProposalJobs { + constructor({ candidateRunner = defaultCandidateRunner, maxJobs = MAX_JOBS } = {}) { + this.candidateRunner = candidateRunner; + this.maxJobs = maxJobs; + this.jobs = new Map(); + } + + submit({ project, workflowId, body, executionProfile = null }) { + const input = requestInput(body); + if (input.executionProfileId && !executionProfile?.source) { + throw httpError(400, "execution_profile_id must name a preloaded execution profile"); + } + if (this.jobs.size >= this.maxJobs) throw httpError(429, "workflow proposal queue is full"); + const job = { + id: `proposal-${randomUUID()}`, + workflowId, + state: "queued", + createdAt: new Date().toISOString(), + }; + this.jobs.set(job.id, job); + queueMicrotask(async () => { + job.state = "running"; + try { + const candidate = await this.candidateRunner({ + projectRoot: project.root, + workflowId, + task: input.task, + baseRevision: input.baseRevision, + ...(executionProfile ? { executionProfile: executionProfile.source } : {}), + }); + if (!candidate || typeof candidate !== "object" || Array.isArray(candidate)) { + throw new Error("proposal runner returned no workflow candidate"); + } + job.candidate = structuredClone(await validateCandidate(candidate)); + job.state = "completed"; + } catch (error) { + job.error = error?.status >= 500 ? error.message : "proposal could not be generated"; + job.state = "failed"; + } finally { + job.completedAt = new Date().toISOString(); + } + }); + return publicJob(job); + } + + get(id, workflowId = null) { + const job = this.jobs.get(id); + if (!job) throw httpError(404, "proposal job not found"); + if (workflowId && job.workflowId !== workflowId) throw httpError(404, "proposal job not found"); + return publicJob(job); + } +} diff --git a/packages/orchestration/operator/lib/remote.mjs b/packages/orchestration/operator/lib/remote.mjs new file mode 100644 index 0000000..956f109 --- /dev/null +++ b/packages/orchestration/operator/lib/remote.mjs @@ -0,0 +1,324 @@ +/** Constrains remote operator API forwarding to the console's known REST surface. */ +import { closeSync, constants, fstatSync, lstatSync, openSync, readFileSync } from "node:fs"; + +export const MAX_REMOTE_RESPONSE_BYTES = 1024 * 1024; +const MAX_REQUEST_BYTES = 64 * 1024; +const SAFE_PROJECT_ID = /^[A-Za-z0-9_-]{8,64}$/; +const SAFE_RUN_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/; +const SAFE_WORKFLOW_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/; +const SAFE_REVISION = /^[1-9][0-9]{0,8}$/; +const SAFE_PROPOSAL_JOB_ID = /^proposal-[a-f0-9-]{36}$/; +const SAFE_QUERY_VALUE = /^[A-Za-z0-9._-]{1,128}$/; + +const SEGMENTS = Object.freeze({ + projectId: SAFE_PROJECT_ID, + proposalJobId: SAFE_PROPOSAL_JOB_ID, + revision: SAFE_REVISION, + runId: SAFE_RUN_ID, + workflowId: SAFE_WORKFLOW_ID, +}); + +/** + * Fixed remote API contract. Keep each reachable console route explicit so an + * upstream credential cannot become a general-purpose proxy capability. + */ +const REMOTE_ROUTE_SPECS = Object.freeze([ + { method: "GET", path: ["api", "v1", "projects"], query: [] }, + { + method: "GET", + path: ["api", "v1", "projects", SEGMENTS.projectId, "execution-profiles"], + query: [], + }, + { + method: "GET", + path: ["api", "v1", "projects", SEGMENTS.projectId, "runs"], + query: ["cursor", "limit"], + }, + { + method: "POST", + path: ["api", "v1", "projects", SEGMENTS.projectId, "runs"], + query: ["cursor", "limit"], + }, + { + method: "GET", + path: ["api", "v1", "projects", SEGMENTS.projectId, "runs", SEGMENTS.runId], + query: [], + }, + { + method: "GET", + path: ["api", "v1", "projects", SEGMENTS.projectId, "runs", SEGMENTS.runId, "events"], + query: ["after", "limit"], + }, + { + method: "GET", + path: ["api", "v1", "projects", SEGMENTS.projectId, "runs", SEGMENTS.runId, "events", "stream"], + query: ["after"], + }, + ...["stop", "resume", "interrupt", "checkpoint-decision", "cleanup"].map((action) => ({ + method: "POST", + path: ["api", "v1", "projects", SEGMENTS.projectId, "runs", SEGMENTS.runId, action], + query: [], + })), + { method: "GET", path: ["api", "v1", "projects", SEGMENTS.projectId, "workflows"], query: [] }, + { + method: "GET", + path: ["api", "v1", "projects", SEGMENTS.projectId, "workflows", "templates"], + query: [], + }, + { + method: "POST", + path: ["api", "v1", "projects", SEGMENTS.projectId, "workflows", "templates"], + query: [], + }, + { + method: "GET", + path: ["api", "v1", "projects", SEGMENTS.projectId, "workflows", SEGMENTS.workflowId], + query: [], + }, + { + method: "POST", + path: [ + "api", + "v1", + "projects", + SEGMENTS.projectId, + "workflows", + SEGMENTS.workflowId, + "analysis", + ], + query: [], + }, + { + method: "POST", + path: [ + "api", + "v1", + "projects", + SEGMENTS.projectId, + "workflows", + SEGMENTS.workflowId, + "proposals", + ], + query: [], + }, + { + method: "GET", + path: [ + "api", + "v1", + "projects", + SEGMENTS.projectId, + "workflows", + SEGMENTS.workflowId, + "proposals", + SEGMENTS.proposalJobId, + ], + query: [], + }, + { + method: "POST", + path: ["api", "v1", "projects", SEGMENTS.projectId, "workflows", SEGMENTS.workflowId, "drafts"], + query: [], + }, + { + method: "GET", + path: ["api", "v1", "projects", SEGMENTS.projectId, "workflows", SEGMENTS.workflowId, "diff"], + query: ["from", "to"], + }, + ...["validate", "activate"].map((action) => ({ + method: "POST", + path: [ + "api", + "v1", + "projects", + SEGMENTS.projectId, + "workflows", + SEGMENTS.workflowId, + "revisions", + SEGMENTS.revision, + action, + ], + query: [], + })), +]); + +function remoteError(message, status = 502) { + return Object.assign(new Error(message), { status }); +} + +function isLoopbackHost(hostname) { + return hostname === "127.0.0.1" || hostname === "::1"; +} + +/** Validates the single upstream origin permitted for a remote console session. */ +export function parseRemoteUrl(value) { + let url; + try { + url = new URL(value); + } catch { + throw new Error("--remote-url must be an absolute HTTPS URL"); + } + if (url.username || url.password || url.search || url.hash || url.pathname !== "/") { + throw new Error("--remote-url must contain only an origin"); + } + if (url.protocol !== "https:" && !(url.protocol === "http:" && isLoopbackHost(url.hostname))) { + throw new Error("--remote-url must use HTTPS (HTTP is limited to loopback development)"); + } + return url; +} + +function validateTokenFileStat(stat) { + if (!stat.isFile() || stat.isSymbolicLink() || (stat.mode & 0o077) !== 0) { + throw remoteError("upstream token file is unsafe"); + } + if (typeof process.getuid === "function" && stat.uid !== process.getuid()) { + throw remoteError("upstream token file is unsafe"); + } +} + +/** Reads one owner-only bearer token without following a symlink. */ +export function readRemoteTokenFile(tokenFile) { + let descriptor; + try { + validateTokenFileStat(lstatSync(tokenFile)); + const noFollow = constants.O_NOFOLLOW ?? 0; + descriptor = openSync(tokenFile, constants.O_RDONLY | noFollow); + validateTokenFileStat(fstatSync(descriptor)); + const token = readFileSync(descriptor, "utf8").trim(); + if (!/^[\x21-\x7e]{1,8192}$/.test(token)) throw remoteError("upstream token file is invalid"); + return token; + } catch (error) { + if (error?.status) throw error; + throw remoteError("upstream token file is unavailable"); + } finally { + if (descriptor !== undefined) closeSync(descriptor); + } +} + +function decodeParts(pathname) { + try { + return pathname + .split("/") + .filter(Boolean) + .map((part) => decodeURIComponent(part)); + } catch { + throw remoteError("remote operator path is not allowed", 404); + } +} + +function hasAllowedQuery(searchParams, allowed) { + const seen = new Set(); + for (const [key, value] of searchParams) { + if (!allowed.has(key) || seen.has(key) || !SAFE_QUERY_VALUE.test(value)) { + return false; + } + seen.add(key); + } + return true; +} + +function matchesRoutePart(expected, actual) { + return typeof expected === "string" ? expected === actual : expected.test(actual); +} + +function matchesRoute(spec, method, parts, searchParams) { + return ( + spec.method === method && + spec.path.length === parts.length && + spec.path.every((expected, index) => matchesRoutePart(expected, parts[index])) && + hasAllowedQuery(searchParams, new Set(spec.query)) + ); +} + +/** Returns true only for routes implemented by the local console UI. */ +export function isAllowedRemoteRequest(method, pathname, searchParams) { + const parts = decodeParts(pathname); + return REMOTE_ROUTE_SPECS.some((spec) => matchesRoute(spec, method, parts, searchParams)); +} + +async function readRequestBody(req) { + const declared = Number(req.headers["content-length"] ?? 0); + if (!Number.isFinite(declared) || declared < 0 || declared > MAX_REQUEST_BYTES) { + throw remoteError("request body exceeds 65536 bytes", 413); + } + let size = 0; + const chunks = []; + for await (const chunk of req) { + size += chunk.length; + if (size > MAX_REQUEST_BYTES) throw remoteError("request body exceeds 65536 bytes", 413); + chunks.push(chunk); + } + return Buffer.concat(chunks); +} + +async function readResponseBody(response) { + assertResponseLength(response); + const reader = response.body?.getReader(); + if (!reader) return Buffer.alloc(0); + let size = 0; + const chunks = []; + for (;;) { + const { value, done } = await reader.read(); + if (done) break; + size += value.byteLength; + if (size > MAX_REMOTE_RESPONSE_BYTES) { + await reader.cancel(); + throw remoteError("remote operator response exceeds size limit"); + } + chunks.push(Buffer.from(value)); + } + return Buffer.concat(chunks); +} + +function assertResponseLength(response) { + const declared = Number(response.headers.get("content-length") ?? 0); + if (!Number.isFinite(declared) || declared < 0 || declared > MAX_REMOTE_RESPONSE_BYTES) { + throw remoteError("remote operator response exceeds size limit"); + } +} + +/** Creates the server-side-only upstream credential and strict REST forwarder. */ +export function createRemoteOperatorProxy({ remoteUrl, tokenFile, fetchImpl = globalThis.fetch }) { + if (typeof tokenFile !== "string" || tokenFile.length === 0) { + throw new Error("--token-file is required with --remote-url"); + } + if (typeof fetchImpl !== "function") throw new Error("remote fetch is unavailable"); + const upstream = parseRemoteUrl(remoteUrl); + return { + async forward(req, url) { + if (!isAllowedRemoteRequest(req.method, url.pathname, url.searchParams)) { + throw remoteError("remote operator path is not allowed", 404); + } + const target = new URL(`${url.pathname}${url.search}`, upstream); + if (target.origin !== upstream.origin) + throw remoteError("remote operator path is not allowed", 404); + const body = ["POST", "PUT", "PATCH"].includes(req.method) + ? await readRequestBody(req) + : null; + const response = await fetchImpl(target, { + method: req.method, + headers: { + authorization: `Bearer ${readRemoteTokenFile(tokenFile)}`, + ...(body ? { "content-type": "application/json" } : {}), + }, + body: body?.length ? body : undefined, + redirect: "manual", + signal: AbortSignal.timeout(15_000), + }); + if (response.status >= 300 && response.status < 400) { + throw remoteError("remote operator redirect rejected"); + } + const contentType = response.headers.get("content-type") ?? "application/octet-stream"; + if (url.pathname.endsWith("/events/stream")) { + assertResponseLength(response); + return { status: response.status, contentType, stream: response.body }; + } + const responseBody = await readResponseBody(response); + return { + status: response.status, + contentType, + body: responseBody, + }; + }, + }; +} diff --git a/packages/orchestration/operator/lib/runs.mjs b/packages/orchestration/operator/lib/runs.mjs index 4a1f508..f6f3561 100644 --- a/packages/orchestration/operator/lib/runs.mjs +++ b/packages/orchestration/operator/lib/runs.mjs @@ -12,6 +12,7 @@ import { inspectRuntimeStateGuard, } from "../../scripts/pipeline/lib/runtime-state-guard.mjs"; import { validateRunId } from "./security.mjs"; +import { graphStatus, memoryStatus } from "../../scripts/pipeline/lib/graph.mjs"; const PHASES = [ "arm", @@ -212,6 +213,7 @@ function summarizeRun(project, run) { const { startedAt, updatedAt } = runTiming(request, events, runDir); const projectedArtifacts = events.filter((event) => event.event === "artifact_write"); const checkpointRows = checkpoints(runDir); + const workflow = workflowProjection(request, runDir); return { id: run.id, project_id: project.id, @@ -225,10 +227,109 @@ function summarizeRun(project, run) { evidence: { present: projectedArtifacts.length }, resources: runResources(progress, events), checkpoints: checkpointRows, + workflow, + graph_health: publicGraphHealth(run.workspaceRoot, run.id), workspaceRoot: run.workspaceRoot, }; } +function workflowProjection(request, runDir) { + if (request.workflow?.mode !== "graph-native") return null; + return { + workflow_id: request.workflow.workflow_id, + schema_version: request.workflow.snapshot?.schema_version ?? request.schema_version, + digest: request.workflow.digest, + revision: request.workflow.revision, + budgets: request.workflow.snapshot?.budgets ?? {}, + instances: workflowInstances(runDir), + }; +} + +function workflowInstances(runDir) { + const root = join(runDir, "workflow", "attempts"); + if (!existsSync(root)) return []; + const latest = new Map(); + for (const nodeEntry of readdirSync(root, { withFileTypes: true })) { + if (!nodeEntry.isDirectory()) continue; + collectLatestInstances(latest, join(root, nodeEntry.name)); + } + return [...latest.values()].sort(compareInstances); +} + +function collectLatestInstances(latest, directory) { + for (const name of readdirSync(directory).filter((entry) => entry.endsWith(".json"))) { + addLatestInstance(latest, readJson(join(directory, name))); + } +} + +function addLatestInstance(latest, envelope) { + if (!envelope || envelope.workflow_digest === undefined) return; + const instanceId = envelope.instance_id ?? envelope.node_id; + const prior = latest.get(instanceId); + if (!prior || envelope.attempt >= prior.attempt) + latest.set(instanceId, publicInstance(envelope, instanceId)); +} + +function publicInstance(envelope, instanceId) { + return { + instance_id: instanceId, + node_id: envelope.node_id, + parent_node: nullableProperty(envelope, "parent_node"), + item_key: nullableProperty(envelope, "item_key"), + item_digest: nullableProperty(envelope, "item_digest"), + status: envelope.status, + attempt: envelope.attempt, + execution_tier: propertyOr(envelope, "execution_tier", "runtime"), + selection: nullableProperty(envelope, "selection"), + quorum: nullableProperty(envelope, "quorum"), + convergence: nullableProperty(envelope, "convergence"), + }; +} + +function nullableProperty(record, key) { + return propertyOr(record, key, null); +} + +function propertyOr(record, key, fallback) { + return record[key] ?? fallback; +} + +function compareInstances(left, right) { + return left.instance_id.localeCompare(right.instance_id); +} + +function publicGraphHealth(workspaceRoot, runId) { + const status = graphStatus({ projectRoot: workspaceRoot, runId }); + const memory = graphMemoryHealth(workspaceRoot); + return { + ...publicGraphStatus(status), + stale_memory: memory.stale_facts ?? 0, + unresolved_conflicts: graphConflicts(status, memory), + }; +} + +function graphMemoryHealth(workspaceRoot) { + try { + return memoryStatus(workspaceRoot); + } catch { + return { stale_facts: 0, unresolved_conflicts: 1 }; + } +} + +function publicGraphStatus(status) { + return { + available: status.available, + valid: status.valid, + node_count: status.node_count ?? 0, + edge_count: status.edge_count ?? 0, + stale_sources: status.stale_sources ?? 0, + }; +} + +function graphConflicts(status, memory) { + return (status.unresolved_conflicts ?? 0) + (memory.unresolved_conflicts ?? 0); +} + function runIdentity(request, control, events, run) { return { task: runTask(request, run.id), diff --git a/packages/orchestration/operator/lib/workflows.mjs b/packages/orchestration/operator/lib/workflows.mjs new file mode 100644 index 0000000..a37c49d --- /dev/null +++ b/packages/orchestration/operator/lib/workflows.mjs @@ -0,0 +1,79 @@ +/** Bridges the operator HTTP surface to the pipeline-owned workflow registry. */ +import { existsSync } from "node:fs"; +import { pathToFileURL } from "node:url"; +import { resolve } from "node:path"; + +const registryPath = resolve( + import.meta.dirname, + "../../scripts/pipeline/lib/workflow-registry.mjs", +); +const workflowDesignerPath = resolve( + import.meta.dirname, + "../../scripts/pipeline/lib/workflow-designer.mjs", +); + +function unavailable() { + throw Object.assign(new Error("workflow registry is unavailable"), { status: 503 }); +} + +/** + * Loads the pipeline registry lazily so the console remains usable while an + * older checkout is upgraded. The registry module must export + * `createWorkflowRegistry(projectRoot)`, returning `{ list, show, draft, + * validate, diff, activate }`. Methods receive the workflow id first and + * accept a plain JSON request object where applicable. + */ +export async function workflowRegistryFor(project) { + if (!existsSync(registryPath)) + return Object.freeze({ + list: unavailable, + show: unavailable, + draft: unavailable, + validate: unavailable, + diff: unavailable, + activate: unavailable, + }); + const module = await import(pathToFileURL(registryPath).href); + if (typeof module.createWorkflowRegistry !== "function") + return Object.freeze({ + list: unavailable, + show: unavailable, + draft: unavailable, + validate: unavailable, + diff: unavailable, + activate: unavailable, + }); + return module.createWorkflowRegistry(project.root); +} + +export function assertRegistryMethod(registry, name) { + if (!registry || typeof registry[name] !== "function") unavailable(); + return registry[name].bind(registry); +} + +/** Returns pipeline-owned static workflow analysis when that optional export exists. */ +export async function analyzeWorkflowFor(workflow) { + if (!existsSync(workflowDesignerPath)) + return { available: false, reason: "workflow analysis is unavailable" }; + const module = await import(pathToFileURL(workflowDesignerPath).href); + if (typeof module.analyzeWorkflow !== "function") { + return { available: false, reason: "workflow analysis is unavailable" }; + } + return { available: true, analysis: await module.analyzeWorkflow(workflow) }; +} + +/** Lists the pipeline-owned v2.1 guided templates. */ +export async function workflowTemplates() { + if (!existsSync(workflowDesignerPath)) unavailable(); + const module = await import(pathToFileURL(workflowDesignerPath).href); + if (typeof module.listWorkflowTemplates !== "function") unavailable(); + return module.listWorkflowTemplates(); +} + +/** Compiles a guided template to the unchanged workflow v2.1 contract. */ +export async function compileWorkflowTemplateFor(templateId, options) { + if (!existsSync(workflowDesignerPath)) unavailable(); + const module = await import(pathToFileURL(workflowDesignerPath).href); + if (typeof module.compileWorkflowTemplate !== "function") unavailable(); + return module.compileWorkflowTemplate(templateId, options); +} diff --git a/packages/orchestration/operator/scripts/capture-docs-screenshots.mjs b/packages/orchestration/operator/scripts/capture-docs-screenshots.mjs new file mode 100644 index 0000000..cc1f7b8 --- /dev/null +++ b/packages/orchestration/operator/scripts/capture-docs-screenshots.mjs @@ -0,0 +1,387 @@ +/** Captures operator documentation screenshots from current UI code and sanitized fixtures. */ +import { spawn } from "node:child_process"; +import { createServer } from "node:http"; +import { existsSync, readFileSync } from "node:fs"; +import { extname, resolve, sep } from "node:path"; + +import { + compileWorkflowTemplate, + listWorkflowTemplates, +} from "../../scripts/pipeline/lib/workflow-designer.mjs"; +import { workflowDigest } from "../../scripts/pipeline/lib/workflow-contract.mjs"; + +const OPERATOR_ROOT = resolve(import.meta.dirname, ".."); +const STATIC_ROOT = resolve(OPERATOR_ROOT, "static"); +const SCREENSHOT_ROOT = resolve(OPERATOR_ROOT, "docs", "screenshots"); +const TOKEN = "rae-docs-capture-token"; +const PROJECT_ID = "project_docs_fixture"; +const WORKFLOW = compileWorkflowTemplate("bounded-until-dry-loop", { + workflow_id: "release-discovery", + revision: 3, + title: "Bounded release discovery", + max_repair_rounds: 3, +}); +const WORKFLOW_DIGEST = workflowDigest(WORKFLOW); + +const RUN = Object.freeze({ + id: "run-2026-08-05-graph", + task: "Update the operator graph designer and verify the public documentation.", + branch: "pipeline/operator-graph-docs", + workspace_mode: "isolated-worktree", + workspace_label: "rae-worktree", + status: "completed", + runtime_active: false, + current_phase: "release-readiness", + phase_order: ["arm", "plan", "build", "quality-tests", "release-readiness"], + completed_gates: ["arm-gate", "plan-gate", "build-gate", "quality-tests-gate"], + started_at: "2026-08-05T08:32:00.000Z", + updated_at: "2026-08-05T08:47:00.000Z", + controls: { stop: false, interrupt: false, resume: false, cleanup: true }, + checkpoints: [], + gates: [ + { gate_id: "arm-gate", phase: "arm", status: "pass", artifact_ref: "brief.json" }, + { gate_id: "plan-gate", phase: "plan", status: "pass", artifact_ref: "plan.json" }, + { gate_id: "build-gate", phase: "build", status: "pass", artifact_ref: "changes.json" }, + { + gate_id: "quality-tests-gate", + phase: "quality-tests", + status: "pass", + artifact_ref: "verification.json", + }, + { + gate_id: "release-readiness-gate", + phase: "release-readiness", + status: "pass", + artifact_ref: "release.json", + }, + ], + evidence: { present: 12 }, + resources: { agent_calls: 8, input: 42816, output: 9312, cost: null }, + graph_health: { + available: true, + valid: true, + node_count: WORKFLOW.nodes.length, + edge_count: WORKFLOW.edges.length, + stale_sources: 0, + stale_memory: 0, + unresolved_conflicts: 0, + }, + workflow: { + workflow_id: WORKFLOW.workflow_id, + revision: WORKFLOW.revision, + digest: WORKFLOW_DIGEST, + budgets: WORKFLOW.budgets, + instances: [ + instance("discovery-loop", "passed", 2, "control", { convergence: { dry: true } }), + instance("discover", "passed", 2, "economy"), + instance("assess", "passed", 2, "judgment"), + instance("verify", "passed", 1, "control"), + instance("complete", "passed", 1, "control"), + ], + }, +}); + +const EVENTS = Object.freeze([ + event(1, "plan", "artifact_validated", "pass", "plan.json"), + event(2, "build", "workspace_changed", "pass", "changes.json"), + event(3, "quality-tests", "verification_completed", "pass", "verification.json"), + event(4, "release-readiness", "workflow_completed", "pass", "release.json"), +]); + +const CAPTURE_STYLE = ` + +`; +const CAPTURE_PROBE = ` + +`; + +const MIME_TYPES = new Map([ + [".css", "text/css; charset=utf-8"], + [".html", "text/html; charset=utf-8"], + [".js", "text/javascript; charset=utf-8"], + [".svg", "image/svg+xml"], +]); + +function instance(nodeId, status, attempt, executionTier, extra = {}) { + return { + instance_id: nodeId, + node_id: nodeId, + parent_node: null, + item_key: null, + item_digest: null, + status, + attempt, + execution_tier: executionTier, + selection: null, + quorum: null, + convergence: null, + ...extra, + }; +} + +function event(seq, phase, name, status, artifactRef) { + return { + seq, + event: name, + phase, + status, + artifact_ref: artifactRef, + ts: `2026-08-05T08:${String(35 + seq * 3).padStart(2, "0")}:00.000Z`, + }; +} + +function json(response, value, status = 200) { + response.writeHead(status, { + "cache-control": "no-store", + "content-type": "application/json; charset=utf-8", + }); + response.end(`${JSON.stringify(value)}\n`); +} + +function workflowRecord() { + return { + workflow_id: WORKFLOW.workflow_id, + active: { + workflow_id: WORKFLOW.workflow_id, + revision: WORKFLOW.revision, + digest: WORKFLOW_DIGEST, + }, + revisions: [ + { + revision: WORKFLOW.revision, + digest: WORKFLOW_DIGEST, + workflow: WORKFLOW, + }, + ], + workflow: WORKFLOW, + digest: WORKFLOW_DIGEST, + activation_history: [{ revision: WORKFLOW.revision, activated_at: "2026-08-05T08:31:00.000Z" }], + }; +} + +function apiResponse(pathname) { + if (pathname === "/api/v1/projects") { + return { projects: [{ id: PROJECT_ID, label: "sebastianspicker/rae" }] }; + } + if (pathname === `/api/v1/projects/${PROJECT_ID}/execution-profiles`) { + return { + profiles: [ + { + id: "local-mixed", + readiness: "ready", + models: { + economy: "openrouter/qwen3-coder", + standard: "opencode/gpt-5.2-codex", + judgment: "gpt-5.3-codex", + }, + }, + ], + }; + } + if (pathname === `/api/v1/projects/${PROJECT_ID}/runs`) return { runs: [RUN] }; + if (pathname.endsWith(`/runs/${RUN.id}/events`)) { + return { events: EVENTS, next_after: EVENTS.at(-1).seq }; + } + if (pathname === `/api/v1/projects/${PROJECT_ID}/workflows`) { + return { + workflows: [ + { + workflow_id: WORKFLOW.workflow_id, + latest_revision: WORKFLOW.revision, + latest_digest: WORKFLOW_DIGEST, + active: true, + }, + ], + }; + } + if (pathname === `/api/v1/projects/${PROJECT_ID}/workflows/templates`) { + return { templates: listWorkflowTemplates() }; + } + if (pathname === `/api/v1/projects/${PROJECT_ID}/workflows/${WORKFLOW.workflow_id}`) { + return { workflow: workflowRecord() }; + } + return null; +} + +function staticResponse(pathname) { + const relative = pathname === "/" ? "index.html" : pathname.slice(1); + const target = resolve(STATIC_ROOT, relative); + if (target !== STATIC_ROOT && !target.startsWith(`${STATIC_ROOT}${sep}`)) return null; + if (!existsSync(target)) return null; + const contentType = MIME_TYPES.get(extname(target)) ?? "application/octet-stream"; + let body = readFileSync(target); + if (target === resolve(STATIC_ROOT, "index.html")) { + body = Buffer.from( + body.toString("utf8").replace("", `${CAPTURE_STYLE}${CAPTURE_PROBE}`), + ); + } + return { body, contentType }; +} + +function createFixtureServer() { + return createServer((request, response) => { + const url = new URL(request.url ?? "/", "http://127.0.0.1"); + if (url.pathname.startsWith("/api/v1/")) { + if (request.headers.authorization !== `Bearer ${TOKEN}`) { + json(response, { error: { message: "unauthorized" } }, 401); + return; + } + if (url.pathname.endsWith("/events/stream")) { + response.writeHead(200, { + "cache-control": "no-store", + "content-type": "text/event-stream; charset=utf-8", + }); + response.end(); + return; + } + const value = apiResponse(url.pathname); + if (value) json(response, value); + else json(response, { error: { message: "fixture route not found" } }, 404); + return; + } + const file = staticResponse(url.pathname); + if (!file) { + response.writeHead(404).end("Not found\n"); + return; + } + response.writeHead(200, { + "cache-control": "no-store", + "content-type": file.contentType, + }); + response.end(file.body); + }); +} + +function browserPath() { + const candidates = [ + "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", + "/Applications/Chromium.app/Contents/MacOS/Chromium", + "/usr/bin/google-chrome", + "/usr/bin/chromium", + "/usr/bin/chromium-browser", + ]; + const found = candidates.find((candidate) => existsSync(candidate)); + if (!found) throw new Error("Chrome or Chromium is required to capture operator screenshots"); + return found; +} + +function capture(browser, url, filename, width, height) { + return new Promise((resolvePromise, reject) => { + const child = spawn( + browser, + [ + "--headless=new", + "--disable-gpu", + "--hide-scrollbars", + "--no-first-run", + "--no-default-browser-check", + "--force-device-scale-factor=1", + "--run-all-compositor-stages-before-draw", + "--virtual-time-budget=1800", + `--window-size=${width},${height}`, + `--screenshot=${resolve(SCREENSHOT_ROOT, filename)}`, + url, + ], + { stdio: ["ignore", "ignore", "pipe"] }, + ); + let errorOutput = ""; + child.stderr.setEncoding("utf8"); + child.stderr.on("data", (chunk) => { + errorOutput += chunk; + }); + child.on("error", reject); + child.on("exit", (code) => { + if (code === 0) resolvePromise(); + else reject(new Error(`browser capture failed (${code}): ${errorOutput.trim()}`)); + }); + }); +} + +function probe(browser, url) { + return new Promise((resolvePromise, reject) => { + const child = spawn( + browser, + [ + "--headless=new", + "--disable-gpu", + "--no-first-run", + "--no-default-browser-check", + "--run-all-compositor-stages-before-draw", + "--virtual-time-budget=1800", + "--dump-dom", + url, + ], + { stdio: ["ignore", "pipe", "pipe"] }, + ); + let output = ""; + let errorOutput = ""; + child.stdout.setEncoding("utf8"); + child.stderr.setEncoding("utf8"); + child.stdout.on("data", (chunk) => { + output += chunk; + }); + child.stderr.on("data", (chunk) => { + errorOutput += chunk; + }); + child.on("error", reject); + child.on("exit", (code) => { + if (code !== 0) { + reject(new Error(`browser probe failed (${code}): ${errorOutput.trim()}`)); + return; + } + if (!output.includes('data-capture-ready="true"')) { + reject(new Error("operator fixture did not reach the connected Graph view")); + return; + } + if (output.includes("data-capture-error=")) { + reject(new Error("operator fixture reported a browser error")); + return; + } + resolvePromise(); + }); + }); +} + +async function main() { + const server = createFixtureServer(); + await new Promise((resolvePromise, reject) => { + server.once("error", reject); + server.listen(0, "127.0.0.1", resolvePromise); + }); + try { + const address = server.address(); + const url = `http://127.0.0.1:${address.port}/#token=${TOKEN}`; + const browser = browserPath(); + await probe(browser, url); + await capture(browser, url, "evidence-dossier-desktop.png", 1360, 1600); + await capture(browser, url, "evidence-dossier-mobile.png", 390, 1400); + } finally { + await new Promise((resolvePromise) => server.close(resolvePromise)); + } +} + +await main(); diff --git a/packages/orchestration/operator/server.mjs b/packages/orchestration/operator/server.mjs index 6744f66..ec4b105 100644 --- a/packages/orchestration/operator/server.mjs +++ b/packages/orchestration/operator/server.mjs @@ -16,6 +16,16 @@ import { validateRunId, } from "./lib/security.mjs"; import { discoverRuns, locateRun, paginatedEvents, publicRun } from "./lib/runs.mjs"; +import { + analyzeWorkflowFor, + assertRegistryMethod, + compileWorkflowTemplateFor, + workflowRegistryFor, + workflowTemplates, +} from "./lib/workflows.mjs"; +import { OperatorProfiles, loadOperatorProfiles } from "./lib/profiles.mjs"; +import { WorkflowProposalJobs } from "./lib/proposals.mjs"; +import { createRemoteOperatorProxy, MAX_REMOTE_RESPONSE_BYTES } from "./lib/remote.mjs"; import { assertSupportedNodeRuntime } from "../scripts/lib/node-runtime.mjs"; assertSupportedNodeRuntime(); @@ -54,6 +64,42 @@ function sendJson(res, status, value) { res.end(`${JSON.stringify(value)}\n`); } +async function sendRemoteResponse(req, res, upstream) { + res.writeHead(upstream.status, { + ...securityHeaders(), + "content-type": upstream.contentType, + ...(upstream.body ? { "content-length": upstream.body.length } : {}), + }); + if (!upstream.stream) { + res.end(upstream.body); + return; + } + const reader = upstream.stream.getReader(); + let size = 0; + let closed = false; + const finish = async () => { + if (closed) return; + closed = true; + await reader.cancel().catch(() => {}); + res.end(); + }; + const timeout = setTimeout(() => void finish(), 15_000); + timeout.unref?.(); + req.once("close", () => void finish()); + try { + while (!closed) { + const { value, done } = await reader.read(); + if (done) break; + size += value.byteLength; + if (size > MAX_REMOTE_RESPONSE_BYTES) break; + res.write(Buffer.from(value)); + } + } finally { + clearTimeout(timeout); + await finish(); + } +} + function errorResponse(res, error) { const status = Number.isInteger(error?.status) ? error.status : 500; const message = status >= 500 ? "internal server error" : error.message; @@ -148,7 +194,7 @@ function streamEvents(req, res, run, after) { } async function routeApi(req, res, url, context) { - const { projects, token, controller, host, origin } = context; + const { projects, token, controller, host, origin, remote } = context; const loopback = validateLoopbackRequest(req, { host, origin, @@ -162,6 +208,11 @@ async function routeApi(req, res, url, context) { sendJson(res, 401, { error: { status: 401, message: "bearer authentication required" } }); return; } + if (remote) { + const upstream = await remote.forward(req, url); + await sendRemoteResponse(req, res, upstream); + return; + } const parts = splitPath(url.pathname); if (parts[0] !== "api" || parts[1] !== "v1") @@ -178,6 +229,15 @@ async function routeApi(req, res, url, context) { throw Object.assign(new Error("not found"), { status: 404 }); const project = findProject(projects, parts[3]); if (!project) throw Object.assign(new Error("project not found"), { status: 404 }); + if (parts[4] === "execution-profiles" && parts.length === 5) { + requireMethod(req, "GET"); + sendJson(res, 200, { profiles: (context.profiles ?? new OperatorProfiles()).list() }); + return; + } + if (parts[4] === "workflows") { + await routeWorkflows(req, res, url, context, project, parts.slice(5)); + return; + } if (parts[4] !== "runs") throw Object.assign(new Error("not found"), { status: 404 }); if (parts.length === 5) { @@ -196,7 +256,11 @@ async function routeApi(req, res, url, context) { return; } requireMethod(req, "POST"); - sendJson(res, 202, controller.start(project, await readJsonBody(req))); + const body = await readJsonBody(req); + const executionProfile = (context.profiles ?? new OperatorProfiles()).resolve( + body.execution_profile_id, + ); + sendJson(res, 202, controller.start(project, body, executionProfile)); return; } @@ -240,6 +304,154 @@ async function routeApi(req, res, url, context) { } } +function projectHasActiveRun(project) { + try { + return discoverRuns(project).some( + (run) => run.runtime_active || ["running", "waiting", "stop-requested"].includes(run.status), + ); + } catch { + // A missing or unreadable runtime directory is not an active execution. + return false; + } +} + +function workflowMutationAllowed(project, controller) { + controller.refreshOwnership(); + if (controller.ownedRunId || projectHasActiveRun(project)) { + throw Object.assign(new Error("workflow revisions are immutable while a run is active"), { + status: 409, + }); + } +} + +async function routeWorkflows(req, res, url, context, project, tail) { + const registry = context.workflowRegistry ?? (await workflowRegistryFor(project)); + if (tail.length === 0) { + requireMethod(req, "GET"); + sendJson(res, 200, { workflows: await assertRegistryMethod(registry, "list")() }); + return; + } + if (tail[0] === "templates" && tail.length === 1) { + if (req.method === "GET") { + sendJson(res, 200, { templates: await workflowTemplates() }); + return; + } + requireMethod(req, "POST"); + const body = await readJsonBody(req); + const allowed = new Set(["template_id", "workflow_id", "revision", "title"]); + if ( + !body || + typeof body !== "object" || + Array.isArray(body) || + Object.keys(body).some((key) => !allowed.has(key)) + ) { + throw Object.assign(new Error("invalid workflow template request"), { status: 400 }); + } + sendJson(res, 200, { + workflow: await compileWorkflowTemplateFor(body.template_id, { + workflow_id: body.workflow_id, + revision: body.revision, + ...(body.title ? { title: body.title } : {}), + }), + }); + return; + } + const workflowId = tail[0]; + if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(workflowId)) { + throw Object.assign(new Error("invalid workflow id"), { status: 400 }); + } + if (tail.length === 1) { + requireMethod(req, "GET"); + sendJson(res, 200, { workflow: await assertRegistryMethod(registry, "show")(workflowId) }); + return; + } + if (tail[1] === "analysis" && tail.length === 2) { + requireMethod(req, "POST"); + const body = await readJsonBody(req); + if ( + !body || + typeof body !== "object" || + Array.isArray(body) || + Object.keys(body).some((key) => key !== "workflow") + ) { + throw Object.assign(new Error("analysis accepts only a workflow object"), { status: 400 }); + } + sendJson(res, 200, await analyzeWorkflowFor(body.workflow)); + return; + } + if (tail[1] === "proposals" && tail.length === 2) { + requireMethod(req, "POST"); + const body = await readJsonBody(req); + const executionProfile = (context.profiles ?? new OperatorProfiles()).resolve( + body.execution_profile_id, + ); + sendJson( + res, + 202, + (context.proposalJobs ?? new WorkflowProposalJobs()).submit({ + project, + workflowId, + body, + executionProfile, + }), + ); + return; + } + if (tail[1] === "proposals" && tail.length === 3) { + requireMethod(req, "GET"); + if (!/^proposal-[a-f0-9-]{36}$/.test(tail[2])) { + throw Object.assign(new Error("invalid proposal job id"), { status: 400 }); + } + sendJson(res, 200, { + proposal: (context.proposalJobs ?? new WorkflowProposalJobs()).get(tail[2], workflowId), + }); + return; + } + if (tail[1] === "drafts" && tail.length === 2) { + requireMethod(req, "POST"); + workflowMutationAllowed(project, context.controller); + sendJson(res, 201, { + revision: await assertRegistryMethod(registry, "draft")(workflowId, await readJsonBody(req)), + }); + return; + } + if (tail[1] === "diff" && tail.length === 2) { + requireMethod(req, "GET"); + sendJson(res, 200, { + diff: await assertRegistryMethod(registry, "diff")( + workflowId, + Object.fromEntries(url.searchParams), + ), + }); + return; + } + if (tail[1] === "revisions" && tail[3] === "validate" && tail.length === 4) { + requireMethod(req, "POST"); + workflowMutationAllowed(project, context.controller); + sendJson(res, 200, { + validation: await assertRegistryMethod(registry, "validate")( + workflowId, + tail[2], + await readJsonBody(req), + ), + }); + return; + } + if (tail[1] === "revisions" && tail[3] === "activate" && tail.length === 4) { + requireMethod(req, "POST"); + workflowMutationAllowed(project, context.controller); + sendJson(res, 200, { + activation: await assertRegistryMethod(registry, "activate")( + workflowId, + tail[2], + await readJsonBody(req), + ), + }); + return; + } + throw Object.assign(new Error("not found"), { status: 404 }); +} + export async function handleOperatorRequest(req, res, context) { try { const url = new URL(req.url, context.origin); @@ -260,11 +472,26 @@ export async function handleOperatorRequest(req, res, context) { } export function createOperatorServer({ - projects, + projects = [], token = createSessionToken(), controller = new RunController(), + remoteUrl = null, + tokenFile = null, + fetchImpl, + profiles = new OperatorProfiles(), + proposalJobs = new WorkflowProposalJobs(), }) { - if (!Array.isArray(projects) || projects.length === 0) throw new Error("projects are required"); + if (!Array.isArray(projects)) throw new Error("projects must be an array"); + if (remoteUrl && projects.length) + throw new Error("--remote-url cannot be combined with --project"); + if (!remoteUrl && tokenFile) throw new Error("--token-file requires --remote-url"); + if (!remoteUrl && projects.length === 0) throw new Error("projects are required"); + if (!profiles || typeof profiles.list !== "function" || typeof profiles.resolve !== "function") { + throw new Error("profiles must be an OperatorProfiles instance"); + } + const remote = remoteUrl + ? createRemoteOperatorProxy({ remoteUrl, tokenFile, ...(fetchImpl ? { fetchImpl } : {}) }) + : null; const server = createServer(async (req, res) => { const address = server.address(); if (!address || typeof address === "string") { @@ -276,6 +503,9 @@ export function createOperatorServer({ projects, token, controller, + profiles, + proposalJobs, + remote, host, origin: `http://${host}`, }); @@ -286,6 +516,9 @@ export function createOperatorServer({ function parseCli(argv) { const paths = []; let port = 0; + let remoteUrl = null; + let tokenFile = null; + const executionProfiles = []; for (let index = 0; index < argv.length; index += 1) { const arg = argv[index]; if (arg === "--project") { @@ -297,22 +530,47 @@ function parseCli(argv) { port = Number(argv[index + 1]); if (!Number.isInteger(port) || port < 0 || port > 65535) throw new Error("invalid --port"); index += 1; + } else if (arg === "--remote-url") { + const value = argv[index + 1]; + if (!value) throw new Error("--remote-url requires a URL"); + remoteUrl = value; + index += 1; + } else if (arg === "--token-file") { + const value = argv[index + 1]; + if (!value) throw new Error("--token-file requires a path"); + tokenFile = value; + index += 1; + } else if (arg === "--execution-profile") { + const value = argv[index + 1]; + if (!value) throw new Error("--execution-profile requires a path"); + executionProfiles.push(value); + index += 1; } else if (arg === "--help" || arg === "-h") { process.stdout.write( - "Usage: node operator/server.mjs --project [--project ] [--port 0]\n", + "Usage: node operator/server.mjs (--project [--project ] | --remote-url --token-file ) [--execution-profile ] [--port 0]\n", ); return null; } else { throw new Error(`unknown argument: ${arg}`); } } - return { projects: createProjectRegistry(paths), port }; + if (remoteUrl && paths.length) throw new Error("--remote-url cannot be combined with --project"); + if (remoteUrl && !tokenFile) throw new Error("--token-file is required with --remote-url"); + if (!remoteUrl && tokenFile) throw new Error("--token-file requires --remote-url"); + return { + projects: remoteUrl ? [] : createProjectRegistry(paths), + port, + remoteUrl, + tokenFile, + executionProfiles, + }; } async function main() { const options = parseCli(process.argv.slice(2)); if (!options) return; - const instance = createOperatorServer({ projects: options.projects }); + const profiles = await loadOperatorProfiles(options.executionProfiles); + const instance = createOperatorServer({ ...options, profiles }); await new Promise((resolveListen, reject) => { instance.server.once("error", reject); instance.server.listen(options.port, "127.0.0.1", resolveListen); diff --git a/packages/orchestration/operator/static/app.js b/packages/orchestration/operator/static/app.js index 837413f..2225d55 100644 --- a/packages/orchestration/operator/static/app.js +++ b/packages/orchestration/operator/static/app.js @@ -2,6 +2,7 @@ import { setConnection, showError } from "./js/api.js"; import { loadProjects } from "./js/data.js"; import { bindHandlers } from "./js/handlers.js"; +import { bindWorkflowEditor } from "./js/workflows.js"; import { elements, state } from "./js/state.js"; // Contract anchors retained for source-level UI tests and operator safety review. @@ -15,6 +16,7 @@ void [ ]; bindHandlers(); +bindWorkflowEditor(); loadProjects().catch((error) => { setConnection("error", "Unavailable", "Local session"); diff --git a/packages/orchestration/operator/static/css/shell.css b/packages/orchestration/operator/static/css/shell.css index 57dc1da..575dfef 100644 --- a/packages/orchestration/operator/static/css/shell.css +++ b/packages/orchestration/operator/static/css/shell.css @@ -2,6 +2,22 @@ * Shell: centered case frame, head bar, project switcher, primary actions. */ +.skip { + position: fixed; + top: 0.5rem; + left: 0.5rem; + z-index: 40; + padding: 0.45rem 0.65rem; + border: 1px solid var(--ink); + background: var(--sheet); + color: var(--ink); + transform: translateY(calc(-100% - 0.75rem)); +} + +.skip:focus-visible { + transform: translateY(0); +} + .runboard, .frame.runboard, .runboard.frame, diff --git a/packages/orchestration/operator/static/css/workflows.css b/packages/orchestration/operator/static/css/workflows.css new file mode 100644 index 0000000..1c90dcd --- /dev/null +++ b/packages/orchestration/operator/static/css/workflows.css @@ -0,0 +1,46 @@ +/* Revision editor: semantic controls are usable without graph interpretation. */ +.workflow-editor { margin-top: 2rem; padding: 1.25rem; border: 1px solid var(--line, #c7d0d4); background: var(--panel, #fff); } +.workflow-editor__head { display:flex; justify-content:space-between; gap:1rem; align-items:center; } +.workflow-editor__head h2 { margin:.15rem 0 0; } +.workflow-editor__grid { display:grid; grid-template-columns:minmax(10rem, .7fr) minmax(18rem, 2fr) minmax(14rem, 1fr); gap:1rem; margin-top:1rem; } +.workflow-rail,.workflow-inspector { border:1px solid var(--line, #c7d0d4); padding:.8rem; min-width:0; } +.workflow-rail h3,.workflow-inspector h3 { margin-top:0; } +.workflow-canvas { min-width:0; } +#workflow-graph { display:block; width:100%; min-height:14rem; border:1px solid var(--line, #c7d0d4); background:#f7fafb; } +#workflow-graph-panel { overflow-x:auto; } +.workflow-node { fill:#fff; stroke:#17324d; stroke-width:2; rx:6; } +.workflow-node--join,.workflow-node--fan-out { fill:#e7f3f6; } +.workflow-node--gate,.workflow-node--checkpoint { fill:#fff4dc; } +.workflow-node--terminal { fill:#e8f4ea; } +.workflow-edge { stroke:#17324d; stroke-width:2; fill:none; marker-end:url(#workflow-arrow); } +.workflow-edge--artifact,.workflow-edge--stream { stroke:#006b75; } +.workflow-edge--stream { stroke-dasharray:3 3; stroke-width:3; } +.workflow-edge--condition { stroke:#995600; stroke-dasharray:7 4; } +.workflow-edge--loop-back { stroke:#7a3e98; stroke-dasharray:2 4; } +.workflow-edge-label { fill:#435466; font:10px ui-monospace,monospace; text-anchor:middle; paint-order:stroke; stroke:#f7fafb; stroke-width:3px; } +.workflow-node-badge { fill:#506274; font:10px ui-monospace,monospace; } +.workflow-form { display:grid; gap:.55rem; margin-top:.75rem; } +.workflow-views,.workflow-control-row,.workflow-checks { display:flex; flex-wrap:wrap; gap:.45rem; margin:.75rem 0; } +.workflow-views [role="tab"][aria-selected="true"] { background:#17324d; color:#fff; } +.workflow-view { min-width:0; } +.workflow-structured-controls { display:grid; gap:.45rem; padding:.75rem; border:1px solid var(--line, #c7d0d4); } +.workflow-structured-controls h3 { margin:0; } +.workflow-inspector-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:.5rem; } +.workflow-inspector-grid label { display:grid; gap:.2rem; min-width:0; } +.workflow-inspector input:not([type="checkbox"]),.workflow-inspector select,.workflow-inspector textarea { width:100%; min-width:0; } +.workflow-checks label { display:flex; align-items:center; gap:.35rem; } +.workflow-checks input { flex:none; } +.workflow-analysis-output { max-height:18rem; overflow:auto; } +#workflow-analysis-output { min-height:7rem; white-space:pre-wrap; border:1px solid var(--line, #c7d0d4); padding:.5rem; } +.workflow-form textarea,#workflow-diff-output { width:100%; box-sizing:border-box; font: .82rem ui-monospace, monospace; } +.workflow-form textarea { min-height:9rem; } +.workflow-rail button { display:block; width:100%; margin:.25rem 0; text-align:left; } +#workflow-history { padding-left:1.2rem; } +.workflow-inspector dd { overflow-wrap:anywhere; } +.workflow-structure { display:grid; gap:.65rem; max-height:22rem; overflow:auto; } +.workflow-structure table { width:100%; border-collapse:collapse; font-size:.82rem; } +.workflow-structure th,.workflow-structure td { padding:.35rem; border-bottom:1px solid var(--line, #c7d0d4); text-align:left; vertical-align:top; } +#workflow-diff-output { min-height:5rem; white-space:pre-wrap; border:1px solid var(--line, #c7d0d4); padding:.5rem; } +@media (prefers-reduced-motion: reduce) { .workflow-editor * { scroll-behavior:auto; transition:none !important; } } +@media (max-width: 900px) { .workflow-editor { max-width:100%; } .workflow-editor__grid { grid-template-columns:1fr; min-width:0; max-width:100%; } .workflow-rail { max-height:12rem; overflow:auto; } } +@media (max-width: 640px) { .workflow-editor__head { align-items:flex-start; flex-direction:column; } .workflow-inspector-grid { grid-template-columns:1fr; } .workflow-canvas input,.workflow-canvas select,.workflow-canvas textarea { width:100%; max-width:100%; } .workflow-control-row button { flex:1 1 9rem; } } diff --git a/packages/orchestration/operator/static/index.html b/packages/orchestration/operator/static/index.html index a9e3062..5aef099 100644 --- a/packages/orchestration/operator/static/index.html +++ b/packages/orchestration/operator/static/index.html @@ -284,6 +284,87 @@

Evidence log

+ +
+
+

Revision-controlled

Workflow systems map

+ +
+
+ +
+
+ + + + +
+ +
+ + Workflow stage map + A topologically layered workflow map. Color and line style distinguish data, stream, condition, sequence, and loop-back edges. The tables after the map provide the complete equivalent structure and live instance state. + + + +
+ +
+ +
+

Structured authoring

+ + +
+ + + + + +
+ + + + +

Revision budget unavailable

+
+
+
+

Structured nodes and edges

+
+
+
+ +
+

Drafts cannot change while a run is active.

+
@@ -312,8 +393,10 @@

Start a bounded run

+ +

- Runs use Codex in a dedicated Git worktree. The console cannot commit, push, publish, + Runs use the selected local execution profile in a dedicated Git worktree. The console cannot commit, push, publish, deploy, or force cleanup.