release: durable Sessions, unified Automations, and trustworthy Runs#982
Conversation
Adds failing coverage for BackgroundRunDetail: a run with errorKind=permission_missing must render plain-language "what happened / what to do" copy above the fold, before the Debug section, and a healthy run must show no banner at all. Also adds a coverage test for a new colocated background-runs error-copy module mirroring the loops error-copy.ts exhaustiveness pattern. Confirmed red: `bun test "apps/web/app/background-runs/[runId]/background-run-detail.test.tsx"` failed with "Expected to contain: doesn't have write access" before the RunErrorBanner component existed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…795) The only accurate explanation for a failed background run (e.g. permission_missing) was buried in the operator-facing Debug section, several clicks past the surfaces a user actually looks at first. Adds a new colocated error-copy.ts (mirroring apps/web/app/loops/error-copy.ts) scoped to BackgroundAgentErrorKind, and a RunErrorBanner component rendered above the fold on /background-runs/[runId], right after the page header and before the proof strip / Debug section. Renders nothing when errorKind is null. The existing sidebar "Run" card's raw errorKind/errorMessage text and the Debug section are left untouched, per the ticket's scope. Scope decisions recorded (per ticket's open questions): - Forked a background-runs-specific error-copy.ts rather than sharing loops' module, since BackgroundAgentErrorKind is a distinct vocabulary (only 3 of 10 kinds overlap with ALL_KNOWN_LOOP_ERROR_KINDS). - Deferred the trigger-surface (repo-agents-dashboard.tsx) status affordance — out of scope per the ticket, not implemented here. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
docs: define Sessions, Automations, and Runs product contract
ops: make authenticated production canary classifications truthful
…wlists fix: fail closed unattended repository allowlists
product: gate experimental systems out of default Sessions
regression: lock durable Session reconnect semantics
…alized-execution Wire background execution through normalized snapshot input
…-execution Wire loop agent steps through normalized snapshot input
docs(automations): decide against physical storage convergence (#945)
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…elop-931 chore: merge main release ancestry back into develop
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: faff303627
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| return lifecycleResponse( | ||
| { | ||
| success: true, | ||
| alreadyRunning: true, |
There was a problem hiding this comment.
Persist active state before reporting resumed
When a hibernated session has only a saved sandboxName and the provider answers the resume call with “sandbox is already/still running,” this branch returns 200/alreadyRunning without calling updateSession or restoring an active runtime state. The client handles alreadyRunning by polling /api/sandbox/reconnect, but that route requires runtime state with an expiresAt; the still-paused DB state ({ type, sandboxName }) is reported as no_sandbox, so the user sees resume fail even though the VM is live. Persist a refreshed active state or perform a real reconnect before returning success here.
Useful? React with 👍 / 👎.
Production verification — 2026-07-12Release merged and deployed.
Authenticated automation proofTruthful result:
Known operational limitations
Production claim: the exact release is deployed, publicly healthy, migration/build gates passed, and signed-out product routes are smoke-proven. Authenticated unattended execution is implemented and fail-closed, but remains unproven in production until #866 is configured. |
Why
Promotes the completed product-reset epic #931 from
developto production.The protected product is now intentionally smaller and more coherent:
This release also completes the runtime-snapshot epic #944: queued unattended work executes immutable versioned intent while current security policy can only revoke or narrow it. Background persistent workspaces and loop disposable-step workspaces remain source-correct.
What changed
Trust and contracts
AgentDefinitionV1and normalized Run contracts (architecture: add a versioned AgentDefinition contract with pure legacy adapters #936–architecture: extract a truthful normalized Run read contract from Account Coordinator #937 / PRs feat: add versioned reusable agent definitions #952, architecture: add truthful normalized Run read contract #951).develop.Unified product
Trustworthy unattended execution
NormalizedUnattendedStepInputV1(feat(runtime): define pure NormalizedUnattendedStepInputV1 contract #965 / PR Define pure normalized unattended input V1 contract #977).Storage decision
Out of scope
Database and migration impact
Three ordered migrations are included and were audited against
origin/main:0085_familiar_chronomancer.sql: makesagent_loop_runs.loop_idnullable and changes the source FK toON DELETE SET NULL, preserving Run history. This constraint replacement is acknowledged by the migration-safety gate. After retained null-source rows exist, schema rollback is fix-forward, not a reverse migration.0086_clammy_greymalkin.sql: additively adds nullable V1 execution-snapshot/version/hash columns and an all-or-none validation constraint tobackground_agent_runs.0087_useful_shen.sql: adds the equivalent compatible snapshot tuple/constraint toagent_loop_runs.The journal indices/tags and snapshot chain are sequential through
0087. The snapshot migrations are legacy-compatible; old rows remain nullable and use bounded, observable fallback. App rollback can keep the forward-compatible columns. Do not drop snapshot evidence during rollback.Important environment finding: safe fingerprint audit proved dev currently shares production Postgres and Redis/KV. No destructive dev journey was run. This is tracked in #981. The migrations have already been exercised by isolated per-PR Vercel Preview builds and their Preview Smoke/API Contract gates.
How it was verified
Release head on
develop:044a49d1c59cd8f36fea5ecd3acf886853d77489.Ancestry sync PR #983 merged prior
mainrelease history back intodevelopwithout changing the file tree; all required gates, Vercel dev deployment, Preview Smoke, and API Contract Tests reran on the synced head.Deterministic/local gates on the final feature head and cumulative release diff:
bun --bun run ci— all 882 isolated test files passed; formatting, lint, typecheck, and migration sync passed.bun run --cwd apps/web build:ci— production build passed; 109 static pages generated.BASE_REF=origin/main bun run check:migration-safety— three migrations checked; destructive constraint change explicitly acknowledged.bun run --cwd apps/web db:check— schema and migration journal in sync.lint-and-typecheck,build, andguards; relevant preview deployments, Preview Smoke, API Contract Tests, and per-slice browser/runtime proof are recorded on those PRs.Shared dev proof for exact SHA
044a49d1:dpl_zvJbQL75cmpzYGgqEQMkpbmxRPavREADY athttps://open-agents-klvckwsyg-dennisons-projects.vercel.app.https://open-agents-env-dev-dennisons-projects.vercel.app./api/auth/info, and/api/modelsall returned 200./runsand/automations; no page errors. One non-blocking Vercel Web Analytics script warning was observed.Evidence quality: deterministic full-suite/build proof, isolated preview deploy/migration proof, source-specific preview/browser/runtime proof, and exact-SHA non-destructive shared-dev smoke. Production proof will be added after merge and deployment.
Risk and rollback
Risk tier: high because this release includes workflow/executor changes and migrations, despite each slice being additive or backward-compatible.
Rollback/fix-forward:
vercel rollbackfirst and inspect logs second.0085after null-source Runs exist; fix forward while preserving retained evidence.blocked_by_configuration, never passed or recovered.Live risks/limitations:
dennisons-projects/open-agents; production evidence below uses exact scope/deployment metadata.Reviewer guide
Review in this order:
docs/plans/sessions-automations-runs.mdand [Epic] Product reset: durable Sessions, Automations, and trustworthy Runs #931 for the product boundary.apps/web/lib/{automations,runs}andapps/web/app/{automations,runs}.0085–0087, snapshot schemas, and source deletion behavior.apps/web/lib/unattended-runtime/normalized-step-input.tsplus background/loop executor adapters.docs/decisions/automation-run-storage.mdfor why storage/executors intentionally remain source-specific.