From 2df16b117931ceef07e35c992da197c95cc675bd Mon Sep 17 00:00:00 2001 From: Will Washburn Date: Wed, 14 Oct 2026 10:49:59 -0700 Subject: [PATCH 1/4] feat(status): own portable work and communication semantics in Relay core --- CHANGELOG.md | 4 + package-lock.json | 17 + package.json | 4 +- packages/status/README.md | 10 + .../contracts/communication-status.v1.json | 2435 +++++++++ .../status/contracts/session-work.v1.json | 4861 +++++++++++++++++ .../fixtures/communication-status.v1.json | 1569 ++++++ .../status/fixtures/session-status.v1.json | 3633 ++++++++++++ packages/status/package.json | 59 + packages/status/scripts/export-contracts.mjs | 28 + packages/status/src/communication.ts | 188 + packages/status/src/index.ts | 3 + packages/status/src/native.ts | 46 + packages/status/src/work.ts | 337 ++ packages/status/test/communication.test.ts | 93 + packages/status/test/native.test.ts | 26 + packages/status/test/work.test.ts | 94 + packages/status/tsconfig.json | 13 + packages/status/vitest.config.ts | 1 + 19 files changed, 13420 insertions(+), 1 deletion(-) create mode 100644 packages/status/README.md create mode 100644 packages/status/contracts/communication-status.v1.json create mode 100644 packages/status/contracts/session-work.v1.json create mode 100644 packages/status/fixtures/communication-status.v1.json create mode 100644 packages/status/fixtures/session-status.v1.json create mode 100644 packages/status/package.json create mode 100644 packages/status/scripts/export-contracts.mjs create mode 100644 packages/status/src/communication.ts create mode 100644 packages/status/src/index.ts create mode 100644 packages/status/src/native.ts create mode 100644 packages/status/src/work.ts create mode 100644 packages/status/test/communication.test.ts create mode 100644 packages/status/test/native.test.ts create mode 100644 packages/status/test/work.test.ts create mode 100644 packages/status/tsconfig.json create mode 100644 packages/status/vitest.config.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index cd3e44679..cbd9a91c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Minor + +- Add portable `@agent-relay/status` work transitions, communication admission rules, and cross-language contract fixtures. History remains an evidence provider. + ## [14.0.0] - 2026-10-13 ### Changed diff --git a/package-lock.json b/package-lock.json index 6736bed65..800f95419 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14348,6 +14348,23 @@ "engines": { "node": ">=22.0.0" } + }, + "node_modules/@agent-relay/status": { + "resolved": "packages/status", + "link": true + }, + "packages/status": { + "name": "@agent-relay/status", + "version": "14.1.0", + "license": "Apache-2.0", + "dependencies": { + "zod": "^4.4.3" + }, + "devDependencies": { + "@types/node": "^22.19.3", + "typescript": "^5.9.3", + "vitest": "^4.1.0" + } } } } diff --git a/package.json b/package.json index 70871ceb8..f662a7c59 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,9 @@ "test:e2e": "vitest run --config vitest.e2e.config.ts", "smoke:prod": "node tests/e2e/prod-smoke/prod-smoke.mjs", "test:subscriptions:proof": "node --test tests/e2e/github-subscriptions/*.test.mjs", - "build:cli-surface": "npm --prefix packages/cli-surface run build" + "build:cli-surface": "npm --prefix packages/cli-surface run build", + "build:status": "npm --prefix packages/status run build", + "test:status": "npm --prefix packages/status test" }, "author": "AgentWorkforce ", "license": "Apache-2.0", diff --git a/packages/status/README.md b/packages/status/README.md new file mode 100644 index 000000000..dd8cef9a9 --- /dev/null +++ b/packages/status/README.md @@ -0,0 +1,10 @@ +# Relay status core + +One portable owner for work status, communication policy, native-evidence interpretation, and transition fixtures. No database, hosted service, transport, or harness parser dependencies. + +- Work: working, needs attention, waiting on agent, idle, waiting on PR, done, archived. Reasons explain the current activity or blocker. Freshness is separate; silence never changes state. +- Communication: Open, Knock, Allow list, Busy, Offline. Admission policy survives disconnects and Busy. Delivery adapters must recheck policy immediately before injection. +- History OSS captures and normalizes harness evidence. Hosted History stores and serves evidence. Neither owns product status, work episodes, PR completion rules, or communication policy. +- Cloud persists hosted projections and supplies PR facts. Desktop persists local projections. Both apply these rules; native-language consumers generate wire types from the exported JSON and run the same fixtures. + +`npm run contracts` regenerates schemas and fixtures. `npm run contracts:check` detects drift. Run `npm test` for reference semantics. Publication follows the normal Relay release process; creating this package does not enable live delivery enforcement. diff --git a/packages/status/contracts/communication-status.v1.json b/packages/status/contracts/communication-status.v1.json new file mode 100644 index 000000000..470850e1a --- /dev/null +++ b/packages/status/contracts/communication-status.v1.json @@ -0,0 +1,2435 @@ +{ + "schemaVersion": 1, + "owner": "@agent-relay/status/communication", + "types": { + "CommunicationLabel": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string", + "enum": [ + "open", + "knock", + "allow_list", + "busy", + "offline" + ] + }, + "CommunicationIdentity": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "agentId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], + "additionalProperties": false + }, + "CommunicationPolicy": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "recipient": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "agentId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], + "additionalProperties": false + }, + "revision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "admission": { + "type": "string", + "enum": [ + "open", + "knock", + "allow_list" + ] + }, + "interruption": { + "type": "string", + "enum": [ + "available", + "busy" + ] + }, + "allowedAgentIds": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + } + }, + "required": [ + "schemaVersion", + "recipient", + "revision", + "admission", + "interruption", + "allowedAgentIds" + ], + "additionalProperties": false + }, + "CommunicationStatus": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "policy": { + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "recipient": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "agentId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], + "additionalProperties": false + }, + "revision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "admission": { + "type": "string", + "enum": [ + "open", + "knock", + "allow_list" + ] + }, + "interruption": { + "type": "string", + "enum": [ + "available", + "busy" + ] + }, + "allowedAgentIds": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + } + }, + "required": [ + "schemaVersion", + "recipient", + "revision", + "admission", + "interruption", + "allowedAgentIds" + ], + "additionalProperties": false + }, + "connection": { + "type": "string", + "enum": [ + "online", + "offline" + ] + }, + "queueSupported": { + "type": "boolean" + }, + "revision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "observedAt": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + } + }, + "required": [ + "schemaVersion", + "policy", + "connection", + "queueSupported", + "revision", + "observedAt" + ], + "additionalProperties": false + }, + "ConversationGrant": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "id": { + "type": "string", + "minLength": 1 + }, + "recipient": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "agentId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], + "additionalProperties": false + }, + "sender": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "agentId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], + "additionalProperties": false + }, + "conversationId": { + "type": "string", + "minLength": 1 + }, + "state": { + "type": "string", + "enum": [ + "pending", + "approved", + "rejected", + "revoked", + "expired" + ] + }, + "revision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + } + }, + "required": [ + "schemaVersion", + "id", + "recipient", + "sender", + "conversationId", + "state", + "revision", + "expiresAt" + ], + "additionalProperties": false + }, + "CommunicationMessage": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "sender": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "agentId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], + "additionalProperties": false + }, + "recipient": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "agentId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], + "additionalProperties": false + }, + "conversationId": { + "type": "string", + "minLength": 1 + }, + "inReplyTo": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "id", + "sender", + "recipient", + "conversationId", + "inReplyTo" + ], + "additionalProperties": false + }, + "AwaitedReply": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "sender": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "agentId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], + "additionalProperties": false + }, + "conversationId": { + "type": "string", + "minLength": 1 + }, + "requestId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "sender", + "conversationId", + "requestId" + ], + "additionalProperties": false + }, + "CommunicationDecision": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "deliver", + "request_approval", + "hold", + "queue", + "reject" + ] + }, + "reason": { + "type": "string", + "enum": [ + "allowed", + "awaited_reply", + "approval_required", + "grant_rejected", + "grant_revoked", + "grant_expired", + "not_allowed", + "wrong_scope", + "wrong_recipient", + "busy", + "offline", + "offline_not_queueable" + ] + }, + "policyRevision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": [ + "action", + "reason", + "policyRevision" + ], + "additionalProperties": false + }, + "CommunicationReceipt": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "messageId": { + "type": "string", + "minLength": 1 + }, + "state": { + "type": "string", + "enum": [ + "pending_approval", + "held", + "queued", + "delivered", + "rejected", + "expired" + ] + }, + "policyRevision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "observedAt": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + } + }, + "required": [ + "schemaVersion", + "messageId", + "state", + "policyRevision", + "observedAt" + ], + "additionalProperties": false + }, + "CommunicationDecisionInput": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "status": { + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "policy": { + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "recipient": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "agentId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], + "additionalProperties": false + }, + "revision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "admission": { + "type": "string", + "enum": [ + "open", + "knock", + "allow_list" + ] + }, + "interruption": { + "type": "string", + "enum": [ + "available", + "busy" + ] + }, + "allowedAgentIds": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + } + }, + "required": [ + "schemaVersion", + "recipient", + "revision", + "admission", + "interruption", + "allowedAgentIds" + ], + "additionalProperties": false + }, + "connection": { + "type": "string", + "enum": [ + "online", + "offline" + ] + }, + "queueSupported": { + "type": "boolean" + }, + "revision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "observedAt": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + } + }, + "required": [ + "schemaVersion", + "policy", + "connection", + "queueSupported", + "revision", + "observedAt" + ], + "additionalProperties": false + }, + "message": { + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "sender": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "agentId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], + "additionalProperties": false + }, + "recipient": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "agentId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], + "additionalProperties": false + }, + "conversationId": { + "type": "string", + "minLength": 1 + }, + "inReplyTo": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "id", + "sender", + "recipient", + "conversationId", + "inReplyTo" + ], + "additionalProperties": false + }, + "grants": { + "type": "array", + "items": { + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "id": { + "type": "string", + "minLength": 1 + }, + "recipient": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "agentId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], + "additionalProperties": false + }, + "sender": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "agentId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], + "additionalProperties": false + }, + "conversationId": { + "type": "string", + "minLength": 1 + }, + "state": { + "type": "string", + "enum": [ + "pending", + "approved", + "rejected", + "revoked", + "expired" + ] + }, + "revision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + } + }, + "required": [ + "schemaVersion", + "id", + "recipient", + "sender", + "conversationId", + "state", + "revision", + "expiresAt" + ], + "additionalProperties": false + } + }, + "awaitedReplies": { + "type": "array", + "items": { + "type": "object", + "properties": { + "sender": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "agentId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], + "additionalProperties": false + }, + "conversationId": { + "type": "string", + "minLength": 1 + }, + "requestId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "sender", + "conversationId", + "requestId" + ], + "additionalProperties": false + } + }, + "now": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + } + }, + "required": [ + "status", + "message", + "grants", + "awaitedReplies", + "now" + ], + "additionalProperties": false + } + }, + "fixtures": { + "schemaVersion": 1, + "cases": [ + { + "name": "open accepts an authenticated scoped sender", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "open", + "expected": { + "action": "deliver", + "reason": "allowed", + "policyRevision": 1 + } + }, + { + "name": "open does not cross workspace", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_b", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "open", + "expected": { + "action": "reject", + "reason": "wrong_scope", + "policyRevision": 1 + } + }, + { + "name": "knock requires approval", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "knock", + "expected": { + "action": "request_approval", + "reason": "approval_required", + "policyRevision": 1 + } + }, + { + "name": "approved knock admits that conversation", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [ + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "approved", + "revision": 1, + "expiresAt": "2026-10-14T12:00:00Z" + } + ], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "knock", + "expected": { + "action": "deliver", + "reason": "allowed", + "policyRevision": 1 + } + }, + { + "name": "approval does not grant another conversation", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_b", + "inReplyTo": null + }, + "grants": [ + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "approved", + "revision": 1, + "expiresAt": "2026-10-14T12:00:00Z" + } + ], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "knock", + "expected": { + "action": "request_approval", + "reason": "approval_required", + "policyRevision": 1 + } + }, + { + "name": "rejected knock cannot deliver", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [ + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "approved", + "revision": 1, + "expiresAt": "2026-10-14T12:00:00Z" + }, + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "rejected", + "revision": 2, + "expiresAt": "2026-10-14T12:00:00Z" + } + ], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "knock", + "expected": { + "action": "reject", + "reason": "grant_rejected", + "policyRevision": 1 + } + }, + { + "name": "revoked knock cannot deliver", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [ + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "approved", + "revision": 1, + "expiresAt": "2026-10-14T12:00:00Z" + }, + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "revoked", + "revision": 2, + "expiresAt": "2026-10-14T12:00:00Z" + } + ], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "knock", + "expected": { + "action": "reject", + "reason": "grant_revoked", + "policyRevision": 1 + } + }, + { + "name": "expired knock cannot deliver", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [ + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "approved", + "revision": 1, + "expiresAt": "2026-10-14T12:00:00Z" + }, + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "expired", + "revision": 2, + "expiresAt": "2026-10-14T12:00:00Z" + } + ], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "knock", + "expected": { + "action": "reject", + "reason": "grant_expired", + "policyRevision": 1 + } + }, + { + "name": "expiry boundary denies admission", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [ + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "approved", + "revision": 1, + "expiresAt": "2026-10-13T12:00:00Z" + } + ], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "knock", + "expected": { + "action": "reject", + "reason": "grant_expired", + "policyRevision": 1 + } + }, + { + "name": "allow list matches stable identity", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "allow_list", + "interruption": "available", + "allowedAgentIds": [ + "agent_sender" + ] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "allow_list", + "expected": { + "action": "deliver", + "reason": "allowed", + "policyRevision": 1 + } + }, + { + "name": "unlisted sender is refused", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "allow_list", + "interruption": "available", + "allowedAgentIds": [ + "another_agent" + ] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "allow_list", + "expected": { + "action": "reject", + "reason": "not_allowed", + "policyRevision": 1 + } + }, + { + "name": "busy holds ordinary messages", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "busy", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "busy", + "expected": { + "action": "hold", + "reason": "busy", + "policyRevision": 1 + } + }, + { + "name": "busy admits correlated awaited reply", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "busy", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": "request_a" + }, + "grants": [], + "awaitedReplies": [ + { + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "requestId": "request_a" + } + ], + "now": "2026-10-13T12:00:00Z" + }, + "label": "busy", + "expected": { + "action": "deliver", + "reason": "awaited_reply", + "policyRevision": 1 + } + }, + { + "name": "busy rejects wrong reply correlation", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "busy", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": "other_request" + }, + "grants": [], + "awaitedReplies": [ + { + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "requestId": "request_a" + } + ], + "now": "2026-10-13T12:00:00Z" + }, + "label": "busy", + "expected": { + "action": "hold", + "reason": "busy", + "policyRevision": 1 + } + }, + { + "name": "awaited reply cannot bypass allow list", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "allow_list", + "interruption": "busy", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": "request_a" + }, + "grants": [], + "awaitedReplies": [ + { + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "requestId": "request_a" + } + ], + "now": "2026-10-13T12:00:00Z" + }, + "label": "busy", + "expected": { + "action": "reject", + "reason": "not_allowed", + "policyRevision": 1 + } + }, + { + "name": "offline wins over busy and retains policy", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "allow_list", + "interruption": "busy", + "allowedAgentIds": [ + "agent_sender" + ] + }, + "connection": "offline", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "offline", + "expected": { + "action": "queue", + "reason": "offline", + "policyRevision": 1 + } + }, + { + "name": "offline transport without queue refuses", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "offline", + "queueSupported": false, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "offline", + "expected": { + "action": "reject", + "reason": "offline_not_queueable", + "policyRevision": 1 + } + }, + { + "name": "offline still requires knock admission", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "offline", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "offline", + "expected": { + "action": "request_approval", + "reason": "approval_required", + "policyRevision": 1 + } + }, + { + "name": "conflicting grant revision cannot restore approval", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [ + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "approved", + "revision": 1, + "expiresAt": "2026-10-14T12:00:00Z" + }, + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "revoked", + "revision": 1, + "expiresAt": "2026-10-14T12:00:00Z" + } + ], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "knock", + "expected": { + "action": "reject", + "reason": "grant_revoked", + "policyRevision": 1 + } + } + ], + "reads": [ + { + "name": "read failure keeps last state", + "previous": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "input": null, + "expected": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "stale": true + }, + { + "name": "unsupported schema keeps last state", + "previous": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "input": { + "schemaVersion": 2, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "expected": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "stale": true + }, + { + "name": "stale revision keeps last state", + "previous": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "input": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 0, + "observedAt": "2026-10-13T12:00:00Z" + }, + "expected": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "stale": true + }, + { + "name": "unknown enum keeps last state", + "previous": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "input": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "future_policy", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "expected": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "stale": true + }, + { + "name": "other workspace keeps last state", + "previous": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "input": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "another_workspace", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "expected": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "stale": true + }, + { + "name": "unsupported policy keeps last state", + "previous": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "input": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 2, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "expected": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "stale": true + }, + { + "name": "new supported revision is accepted", + "previous": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "input": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 2, + "observedAt": "2026-10-13T12:00:00Z" + }, + "expected": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 2, + "observedAt": "2026-10-13T12:00:00Z" + }, + "stale": false + } + ] + } +} diff --git a/packages/status/contracts/session-work.v1.json b/packages/status/contracts/session-work.v1.json new file mode 100644 index 000000000..072b6ab66 --- /dev/null +++ b/packages/status/contracts/session-work.v1.json @@ -0,0 +1,4861 @@ +{ + "schemaVersion": 1, + "owner": "@agent-relay/status/work", + "types": { + "SessionWorkState": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string", + "enum": [ + "working", + "needs_attention", + "waiting_on_agent", + "idle", + "waiting_on_pr", + "done", + "archived" + ] + }, + "SessionWorkReason": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string", + "enum": [ + "no_activity", + "thinking", + "tool_running", + "testing", + "coordinating", + "human_input", + "approval", + "credentials", + "failure", + "agent_reply", + "pr_review", + "pr_ci", + "pr_merge", + "turn_finished", + "paused", + "dependencies_resolved", + "completed", + "merged", + "archived" + ] + }, + "SessionStatusIdentity": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "sessionId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], + "additionalProperties": false + }, + "SessionWorkDependency": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "kind": { + "type": "string", + "enum": [ + "human", + "agent", + "pr" + ] + }, + "state": { + "type": "string", + "enum": [ + "pending", + "resolved" + ] + }, + "target": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "id", + "kind", + "state", + "target" + ], + "additionalProperties": false + }, + "SessionWorkStatus": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "identity": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "sessionId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], + "additionalProperties": false + }, + "workEpisodeId": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "revision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "state": { + "type": "string", + "enum": [ + "working", + "needs_attention", + "waiting_on_agent", + "idle", + "waiting_on_pr", + "done", + "archived" + ] + }, + "reason": { + "type": "string", + "enum": [ + "no_activity", + "thinking", + "tool_running", + "testing", + "coordinating", + "human_input", + "approval", + "credentials", + "failure", + "agent_reply", + "pr_review", + "pr_ci", + "pr_merge", + "turn_finished", + "paused", + "dependencies_resolved", + "completed", + "merged", + "archived" + ] + }, + "basis": { + "type": "string", + "enum": [ + "observed", + "inferred" + ] + }, + "observedAt": { + "anyOf": [ + { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + }, + { + "type": "null" + } + ] + }, + "lastSeenAt": { + "anyOf": [ + { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + }, + { + "type": "null" + } + ] + }, + "dependencies": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "kind": { + "type": "string", + "enum": [ + "human", + "agent", + "pr" + ] + }, + "state": { + "type": "string", + "enum": [ + "pending", + "resolved" + ] + }, + "target": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "id", + "kind", + "state", + "target" + ], + "additionalProperties": false + } + }, + "evidenceIds": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "producerSequences": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "resume": { + "anyOf": [ + { + "type": "object", + "properties": { + "state": { + "type": "string", + "enum": [ + "working", + "needs_attention", + "waiting_on_agent", + "idle", + "waiting_on_pr", + "done", + "archived" + ] + }, + "reason": { + "type": "string", + "enum": [ + "no_activity", + "thinking", + "tool_running", + "testing", + "coordinating", + "human_input", + "approval", + "credentials", + "failure", + "agent_reply", + "pr_review", + "pr_ci", + "pr_merge", + "turn_finished", + "paused", + "dependencies_resolved", + "completed", + "merged", + "archived" + ] + }, + "basis": { + "type": "string", + "enum": [ + "observed", + "inferred" + ] + } + }, + "required": [ + "state", + "reason", + "basis" + ], + "additionalProperties": false + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "schemaVersion", + "identity", + "workEpisodeId", + "revision", + "state", + "reason", + "basis", + "observedAt", + "lastSeenAt", + "dependencies", + "evidenceIds", + "producerSequences", + "resume" + ], + "additionalProperties": false + }, + "SessionWorkEvent": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "oneOf": [ + { + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "identity": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "sessionId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], + "additionalProperties": false + }, + "eventId": { + "type": "string", + "minLength": 1 + }, + "producerId": { + "type": "string", + "minLength": 1 + }, + "sequence": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "expectedRevision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "workEpisodeId": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "observedAt": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + }, + "kind": { + "type": "string", + "const": "start" + } + }, + "required": [ + "schemaVersion", + "identity", + "eventId", + "producerId", + "sequence", + "expectedRevision", + "workEpisodeId", + "observedAt", + "kind" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "identity": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "sessionId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], + "additionalProperties": false + }, + "eventId": { + "type": "string", + "minLength": 1 + }, + "producerId": { + "type": "string", + "minLength": 1 + }, + "sequence": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "expectedRevision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "workEpisodeId": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "observedAt": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + }, + "kind": { + "type": "string", + "const": "activity" + }, + "reason": { + "type": "string", + "enum": [ + "thinking", + "tool_running", + "testing", + "coordinating" + ] + } + }, + "required": [ + "schemaVersion", + "identity", + "eventId", + "producerId", + "sequence", + "expectedRevision", + "workEpisodeId", + "observedAt", + "kind", + "reason" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "identity": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "sessionId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], + "additionalProperties": false + }, + "eventId": { + "type": "string", + "minLength": 1 + }, + "producerId": { + "type": "string", + "minLength": 1 + }, + "sequence": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "expectedRevision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "workEpisodeId": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "observedAt": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + }, + "kind": { + "type": "string", + "const": "wait" + }, + "reason": { + "type": "string", + "enum": [ + "human_input", + "approval", + "credentials", + "failure", + "agent_reply", + "pr_review", + "pr_ci", + "pr_merge" + ] + }, + "dependencies": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "kind": { + "type": "string", + "enum": [ + "human", + "agent", + "pr" + ] + }, + "state": { + "type": "string", + "enum": [ + "pending", + "resolved" + ] + }, + "target": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "id", + "kind", + "state", + "target" + ], + "additionalProperties": false + } + } + }, + "required": [ + "schemaVersion", + "identity", + "eventId", + "producerId", + "sequence", + "expectedRevision", + "workEpisodeId", + "observedAt", + "kind", + "reason", + "dependencies" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "identity": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "sessionId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], + "additionalProperties": false + }, + "eventId": { + "type": "string", + "minLength": 1 + }, + "producerId": { + "type": "string", + "minLength": 1 + }, + "sequence": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "expectedRevision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "workEpisodeId": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "observedAt": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + }, + "kind": { + "type": "string", + "const": "resolve_dependency" + }, + "dependencyId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "schemaVersion", + "identity", + "eventId", + "producerId", + "sequence", + "expectedRevision", + "workEpisodeId", + "observedAt", + "kind", + "dependencyId" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "identity": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "sessionId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], + "additionalProperties": false + }, + "eventId": { + "type": "string", + "minLength": 1 + }, + "producerId": { + "type": "string", + "minLength": 1 + }, + "sequence": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "expectedRevision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "workEpisodeId": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "observedAt": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + }, + "kind": { + "type": "string", + "const": "turn_finished" + } + }, + "required": [ + "schemaVersion", + "identity", + "eventId", + "producerId", + "sequence", + "expectedRevision", + "workEpisodeId", + "observedAt", + "kind" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "identity": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "sessionId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], + "additionalProperties": false + }, + "eventId": { + "type": "string", + "minLength": 1 + }, + "producerId": { + "type": "string", + "minLength": 1 + }, + "sequence": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "expectedRevision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "workEpisodeId": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "observedAt": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + }, + "kind": { + "type": "string", + "const": "complete" + }, + "reason": { + "type": "string", + "enum": [ + "completed", + "merged" + ] + } + }, + "required": [ + "schemaVersion", + "identity", + "eventId", + "producerId", + "sequence", + "expectedRevision", + "workEpisodeId", + "observedAt", + "kind", + "reason" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "identity": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "sessionId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], + "additionalProperties": false + }, + "eventId": { + "type": "string", + "minLength": 1 + }, + "producerId": { + "type": "string", + "minLength": 1 + }, + "sequence": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "expectedRevision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "workEpisodeId": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "observedAt": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + }, + "kind": { + "type": "string", + "const": "archive" + } + }, + "required": [ + "schemaVersion", + "identity", + "eventId", + "producerId", + "sequence", + "expectedRevision", + "workEpisodeId", + "observedAt", + "kind" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "identity": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "sessionId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], + "additionalProperties": false + }, + "eventId": { + "type": "string", + "minLength": 1 + }, + "producerId": { + "type": "string", + "minLength": 1 + }, + "sequence": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "expectedRevision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "workEpisodeId": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "observedAt": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + }, + "kind": { + "type": "string", + "const": "unarchive" + } + }, + "required": [ + "schemaVersion", + "identity", + "eventId", + "producerId", + "sequence", + "expectedRevision", + "workEpisodeId", + "observedAt", + "kind" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "schemaVersion": { + "type": "number", + "const": 1 + }, + "identity": { + "type": "object", + "properties": { + "organizationId": { + "type": "string", + "minLength": 1 + }, + "workspaceId": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + }, + "sessionId": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], + "additionalProperties": false + }, + "eventId": { + "type": "string", + "minLength": 1 + }, + "producerId": { + "type": "string", + "minLength": 1 + }, + "sequence": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "expectedRevision": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "workEpisodeId": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "observedAt": { + "type": "string", + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" + }, + "kind": { + "type": "string", + "const": "heartbeat" + } + }, + "required": [ + "schemaVersion", + "identity", + "eventId", + "producerId", + "sequence", + "expectedRevision", + "workEpisodeId", + "observedAt", + "kind" + ], + "additionalProperties": false + } + ] + } + }, + "fixtures": { + "schemaVersion": 1, + "cases": [ + { + "name": "silent tool stays working across a long heartbeat gap", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "activity", + "reason": "tool_running" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "working", + "reason": "tool_running", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T14:00:00Z", + "kind": "heartbeat" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "working", + "reason": "tool_running", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T14:00:00Z", + "dependencies": [], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "turn_finished" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "idle", + "reason": "turn_finished", + "basis": "observed", + "observedAt": "2026-10-13T12:04:00Z", + "lastSeenAt": "2026-10-13T14:00:00Z", + "dependencies": [], + "evidenceIds": [ + "e4" + ], + "producerSequences": { + "runner": 4 + }, + "resume": null + } + } + ] + }, + { + "name": "approval survives turn completion and heartbeat", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "wait", + "reason": "approval", + "dependencies": [ + { + "id": "dep_a", + "kind": "human", + "state": "pending", + "target": "target_a" + } + ] + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "needs_attention", + "reason": "approval", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "human", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "turn_finished" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "needs_attention", + "reason": "approval", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "human", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "heartbeat" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "needs_attention", + "reason": "approval", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:04:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "human", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 4 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e5", + "producerId": "runner", + "sequence": 5, + "expectedRevision": 4, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:05:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "invalid_transition", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "needs_attention", + "reason": "approval", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:04:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "human", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 4 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e6", + "producerId": "runner", + "sequence": 6, + "expectedRevision": 4, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:06:00Z", + "kind": "resolve_dependency", + "dependencyId": "dep_a" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 5, + "state": "idle", + "reason": "dependencies_resolved", + "basis": "observed", + "observedAt": "2026-10-13T12:06:00Z", + "lastSeenAt": "2026-10-13T12:06:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "human", + "state": "resolved", + "target": "target_a" + } + ], + "evidenceIds": [ + "e6" + ], + "producerSequences": { + "runner": 6 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e7", + "producerId": "runner", + "sequence": 7, + "expectedRevision": 5, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:07:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 6, + "state": "done", + "reason": "completed", + "basis": "observed", + "observedAt": "2026-10-13T12:07:00Z", + "lastSeenAt": "2026-10-13T12:07:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "human", + "state": "resolved", + "target": "target_a" + } + ], + "evidenceIds": [ + "e7" + ], + "producerSequences": { + "runner": 7 + }, + "resume": null + } + } + ] + }, + { + "name": "agent_reply survives turn completion and heartbeat", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "wait", + "reason": "agent_reply", + "dependencies": [ + { + "id": "dep_a", + "kind": "agent", + "state": "pending", + "target": "target_a" + } + ] + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "waiting_on_agent", + "reason": "agent_reply", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "agent", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "turn_finished" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "waiting_on_agent", + "reason": "agent_reply", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "agent", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "heartbeat" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "waiting_on_agent", + "reason": "agent_reply", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:04:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "agent", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 4 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e5", + "producerId": "runner", + "sequence": 5, + "expectedRevision": 4, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:05:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "invalid_transition", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "waiting_on_agent", + "reason": "agent_reply", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:04:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "agent", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 4 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e6", + "producerId": "runner", + "sequence": 6, + "expectedRevision": 4, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:06:00Z", + "kind": "resolve_dependency", + "dependencyId": "dep_a" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 5, + "state": "idle", + "reason": "dependencies_resolved", + "basis": "observed", + "observedAt": "2026-10-13T12:06:00Z", + "lastSeenAt": "2026-10-13T12:06:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "agent", + "state": "resolved", + "target": "target_a" + } + ], + "evidenceIds": [ + "e6" + ], + "producerSequences": { + "runner": 6 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e7", + "producerId": "runner", + "sequence": 7, + "expectedRevision": 5, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:07:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 6, + "state": "done", + "reason": "completed", + "basis": "observed", + "observedAt": "2026-10-13T12:07:00Z", + "lastSeenAt": "2026-10-13T12:07:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "agent", + "state": "resolved", + "target": "target_a" + } + ], + "evidenceIds": [ + "e7" + ], + "producerSequences": { + "runner": 7 + }, + "resume": null + } + } + ] + }, + { + "name": "pr_ci survives turn completion and heartbeat", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "wait", + "reason": "pr_ci", + "dependencies": [ + { + "id": "dep_a", + "kind": "pr", + "state": "pending", + "target": "target_a" + } + ] + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "waiting_on_pr", + "reason": "pr_ci", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "pr", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "turn_finished" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "waiting_on_pr", + "reason": "pr_ci", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "pr", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "heartbeat" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "waiting_on_pr", + "reason": "pr_ci", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:04:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "pr", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 4 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e5", + "producerId": "runner", + "sequence": 5, + "expectedRevision": 4, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:05:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "invalid_transition", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "waiting_on_pr", + "reason": "pr_ci", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:04:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "pr", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 4 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e6", + "producerId": "runner", + "sequence": 6, + "expectedRevision": 4, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:06:00Z", + "kind": "resolve_dependency", + "dependencyId": "dep_a" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 5, + "state": "idle", + "reason": "dependencies_resolved", + "basis": "observed", + "observedAt": "2026-10-13T12:06:00Z", + "lastSeenAt": "2026-10-13T12:06:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "pr", + "state": "resolved", + "target": "target_a" + } + ], + "evidenceIds": [ + "e6" + ], + "producerSequences": { + "runner": 6 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e7", + "producerId": "runner", + "sequence": 7, + "expectedRevision": 5, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:07:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 6, + "state": "done", + "reason": "completed", + "basis": "observed", + "observedAt": "2026-10-13T12:07:00Z", + "lastSeenAt": "2026-10-13T12:07:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "pr", + "state": "resolved", + "target": "target_a" + } + ], + "evidenceIds": [ + "e7" + ], + "producerSequences": { + "runner": 7 + }, + "resume": null + } + } + ] + }, + { + "name": "useful work resumes while dependency remains pending", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "wait", + "reason": "agent_reply", + "dependencies": [ + { + "id": "agent_a", + "kind": "agent", + "state": "pending", + "target": "agent_1" + } + ] + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "waiting_on_agent", + "reason": "agent_reply", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [ + { + "id": "agent_a", + "kind": "agent", + "state": "pending", + "target": "agent_1" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "activity", + "reason": "testing" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "working", + "reason": "testing", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [ + { + "id": "agent_a", + "kind": "agent", + "state": "pending", + "target": "agent_1" + } + ], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "turn_finished" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "waiting_on_agent", + "reason": "agent_reply", + "basis": "observed", + "observedAt": "2026-10-13T12:04:00Z", + "lastSeenAt": "2026-10-13T12:04:00Z", + "dependencies": [ + { + "id": "agent_a", + "kind": "agent", + "state": "pending", + "target": "agent_1" + } + ], + "evidenceIds": [ + "e4" + ], + "producerSequences": { + "runner": 4 + }, + "resume": null + } + } + ] + }, + { + "name": "one PR merge does not finish two PRs", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "wait", + "reason": "pr_review", + "dependencies": [ + { + "id": "pr1", + "kind": "pr", + "state": "pending", + "target": "https://github.com/a/b/pull/1" + }, + { + "id": "pr2", + "kind": "pr", + "state": "pending", + "target": "https://github.com/a/b/pull/2" + } + ] + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "waiting_on_pr", + "reason": "pr_review", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [ + { + "id": "pr1", + "kind": "pr", + "state": "pending", + "target": "https://github.com/a/b/pull/1" + }, + { + "id": "pr2", + "kind": "pr", + "state": "pending", + "target": "https://github.com/a/b/pull/2" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "resolve_dependency", + "dependencyId": "pr1" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "waiting_on_pr", + "reason": "pr_review", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [ + { + "id": "pr1", + "kind": "pr", + "state": "resolved", + "target": "https://github.com/a/b/pull/1" + }, + { + "id": "pr2", + "kind": "pr", + "state": "pending", + "target": "https://github.com/a/b/pull/2" + } + ], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "complete", + "reason": "merged" + }, + "outcome": "invalid_transition", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "waiting_on_pr", + "reason": "pr_review", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [ + { + "id": "pr1", + "kind": "pr", + "state": "resolved", + "target": "https://github.com/a/b/pull/1" + }, + { + "id": "pr2", + "kind": "pr", + "state": "pending", + "target": "https://github.com/a/b/pull/2" + } + ], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e5", + "producerId": "runner", + "sequence": 5, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:05:00Z", + "kind": "resolve_dependency", + "dependencyId": "pr2" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "idle", + "reason": "dependencies_resolved", + "basis": "observed", + "observedAt": "2026-10-13T12:05:00Z", + "lastSeenAt": "2026-10-13T12:05:00Z", + "dependencies": [ + { + "id": "pr1", + "kind": "pr", + "state": "resolved", + "target": "https://github.com/a/b/pull/1" + }, + { + "id": "pr2", + "kind": "pr", + "state": "resolved", + "target": "https://github.com/a/b/pull/2" + } + ], + "evidenceIds": [ + "e5" + ], + "producerSequences": { + "runner": 5 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e6", + "producerId": "runner", + "sequence": 6, + "expectedRevision": 4, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:06:00Z", + "kind": "complete", + "reason": "merged" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 5, + "state": "done", + "reason": "merged", + "basis": "observed", + "observedAt": "2026-10-13T12:06:00Z", + "lastSeenAt": "2026-10-13T12:06:00Z", + "dependencies": [ + { + "id": "pr1", + "kind": "pr", + "state": "resolved", + "target": "https://github.com/a/b/pull/1" + }, + { + "id": "pr2", + "kind": "pr", + "state": "resolved", + "target": "https://github.com/a/b/pull/2" + } + ], + "evidenceIds": [ + "e6" + ], + "producerSequences": { + "runner": 6 + }, + "resume": null + } + } + ] + }, + { + "name": "new episode rejects late completion and stale revisions", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "done", + "reason": "completed", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_b", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_b", + "revision": 3, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "complete", + "reason": "merged" + }, + "outcome": "wrong_episode", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_b", + "revision": 3, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e5", + "producerId": "runner", + "sequence": 5, + "expectedRevision": 0, + "workEpisodeId": "episode_b", + "observedAt": "2026-10-13T12:05:00Z", + "kind": "activity", + "reason": "testing" + }, + "outcome": "conflict", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_b", + "revision": 3, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e6", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 3, + "workEpisodeId": "episode_b", + "observedAt": "2026-10-13T12:06:00Z", + "kind": "heartbeat" + }, + "outcome": "duplicate", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_b", + "revision": 3, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + } + ] + }, + { + "name": "archive requires explicit unarchive", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "done", + "reason": "completed", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "archive" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "archived", + "reason": "archived", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": { + "state": "done", + "reason": "completed", + "basis": "observed" + } + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "activity", + "reason": "testing" + }, + "outcome": "archived", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "archived", + "reason": "archived", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": { + "state": "done", + "reason": "completed", + "basis": "observed" + } + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e5", + "producerId": "runner", + "sequence": 5, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:05:00Z", + "kind": "heartbeat" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "archived", + "reason": "archived", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:05:00Z", + "dependencies": [], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 5 + }, + "resume": { + "state": "done", + "reason": "completed", + "basis": "observed" + } + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e6", + "producerId": "runner", + "sequence": 6, + "expectedRevision": 4, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:06:00Z", + "kind": "unarchive" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 5, + "state": "done", + "reason": "completed", + "basis": "observed", + "observedAt": "2026-10-13T12:06:00Z", + "lastSeenAt": "2026-10-13T12:06:00Z", + "dependencies": [], + "evidenceIds": [ + "e6" + ], + "producerSequences": { + "runner": 6 + }, + "resume": null + } + } + ] + }, + { + "name": "foreign scope and future schema do not overwrite status", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_b", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "turn_finished" + }, + "outcome": "wrong_session", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 2, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "turn_finished" + }, + "outcome": "invalid", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + } + ] + }, + { + "name": "adding a wait preserves unrelated dependencies", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "wait", + "reason": "approval", + "dependencies": [ + { + "id": "human_a", + "kind": "human", + "state": "pending", + "target": "user_a" + } + ] + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "needs_attention", + "reason": "approval", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [ + { + "id": "human_a", + "kind": "human", + "state": "pending", + "target": "user_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "wait", + "reason": "agent_reply", + "dependencies": [ + { + "id": "agent_a", + "kind": "agent", + "state": "pending", + "target": "agent_a" + } + ] + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "waiting_on_agent", + "reason": "agent_reply", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [ + { + "id": "human_a", + "kind": "human", + "state": "pending", + "target": "user_a" + }, + { + "id": "agent_a", + "kind": "agent", + "state": "pending", + "target": "agent_a" + } + ], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "invalid_transition", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "waiting_on_agent", + "reason": "agent_reply", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [ + { + "id": "human_a", + "kind": "human", + "state": "pending", + "target": "user_a" + }, + { + "id": "agent_a", + "kind": "agent", + "state": "pending", + "target": "agent_a" + } + ], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + } + ] + }, + { + "name": "merge without an associated PR is not completion", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "complete", + "reason": "merged" + }, + "outcome": "invalid_transition", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + } + ] + }, + { + "name": "historical session can archive without inventing a work episode", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "archive_1", + "producerId": "desktop", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": null, + "observedAt": "2026-10-13T13:01:00Z", + "kind": "archive" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 1, + "state": "archived", + "reason": "archived", + "basis": "observed", + "observedAt": "2026-10-13T13:01:00Z", + "lastSeenAt": "2026-10-13T13:01:00Z", + "dependencies": [], + "evidenceIds": [ + "archive_1" + ], + "producerSequences": { + "desktop": 1 + }, + "resume": { + "state": "idle", + "reason": "no_activity", + "basis": "inferred" + } + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "archive_2", + "producerId": "desktop", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": null, + "observedAt": "2026-10-13T13:02:00Z", + "kind": "heartbeat" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 2, + "state": "archived", + "reason": "archived", + "basis": "observed", + "observedAt": "2026-10-13T13:01:00Z", + "lastSeenAt": "2026-10-13T13:02:00Z", + "dependencies": [], + "evidenceIds": [ + "archive_1" + ], + "producerSequences": { + "desktop": 2 + }, + "resume": { + "state": "idle", + "reason": "no_activity", + "basis": "inferred" + } + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "archive_3", + "producerId": "desktop", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": null, + "observedAt": "2026-10-13T13:03:00Z", + "kind": "unarchive" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 3, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": "2026-10-13T13:03:00Z", + "lastSeenAt": "2026-10-13T13:03:00Z", + "dependencies": [], + "evidenceIds": [ + "archive_3" + ], + "producerSequences": { + "desktop": 3 + }, + "resume": null + } + } + ] + } + ], + "reads": [ + { + "name": "read failure keeps last state", + "previous": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "input": null, + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "stale": true + }, + { + "name": "unsupported schema keeps last state", + "previous": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "input": { + "schemaVersion": 2, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "stale": true + }, + { + "name": "stale revision keeps last state", + "previous": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "input": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 0, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "stale": true + }, + { + "name": "unknown enum keeps last state", + "previous": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "input": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "future_state", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "stale": true + }, + { + "name": "other workspace keeps last state", + "previous": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "input": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "another_workspace", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "stale": true + }, + { + "name": "new supported revision is accepted", + "previous": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "input": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "stale": false + } + ] + } +} diff --git a/packages/status/fixtures/communication-status.v1.json b/packages/status/fixtures/communication-status.v1.json new file mode 100644 index 000000000..15b293f0c --- /dev/null +++ b/packages/status/fixtures/communication-status.v1.json @@ -0,0 +1,1569 @@ +{ + "schemaVersion": 1, + "cases": [ + { + "name": "open accepts an authenticated scoped sender", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "open", + "expected": { + "action": "deliver", + "reason": "allowed", + "policyRevision": 1 + } + }, + { + "name": "open does not cross workspace", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_b", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "open", + "expected": { + "action": "reject", + "reason": "wrong_scope", + "policyRevision": 1 + } + }, + { + "name": "knock requires approval", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "knock", + "expected": { + "action": "request_approval", + "reason": "approval_required", + "policyRevision": 1 + } + }, + { + "name": "approved knock admits that conversation", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [ + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "approved", + "revision": 1, + "expiresAt": "2026-10-14T12:00:00Z" + } + ], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "knock", + "expected": { + "action": "deliver", + "reason": "allowed", + "policyRevision": 1 + } + }, + { + "name": "approval does not grant another conversation", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_b", + "inReplyTo": null + }, + "grants": [ + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "approved", + "revision": 1, + "expiresAt": "2026-10-14T12:00:00Z" + } + ], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "knock", + "expected": { + "action": "request_approval", + "reason": "approval_required", + "policyRevision": 1 + } + }, + { + "name": "rejected knock cannot deliver", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [ + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "approved", + "revision": 1, + "expiresAt": "2026-10-14T12:00:00Z" + }, + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "rejected", + "revision": 2, + "expiresAt": "2026-10-14T12:00:00Z" + } + ], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "knock", + "expected": { + "action": "reject", + "reason": "grant_rejected", + "policyRevision": 1 + } + }, + { + "name": "revoked knock cannot deliver", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [ + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "approved", + "revision": 1, + "expiresAt": "2026-10-14T12:00:00Z" + }, + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "revoked", + "revision": 2, + "expiresAt": "2026-10-14T12:00:00Z" + } + ], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "knock", + "expected": { + "action": "reject", + "reason": "grant_revoked", + "policyRevision": 1 + } + }, + { + "name": "expired knock cannot deliver", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [ + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "approved", + "revision": 1, + "expiresAt": "2026-10-14T12:00:00Z" + }, + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "expired", + "revision": 2, + "expiresAt": "2026-10-14T12:00:00Z" + } + ], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "knock", + "expected": { + "action": "reject", + "reason": "grant_expired", + "policyRevision": 1 + } + }, + { + "name": "expiry boundary denies admission", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [ + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "approved", + "revision": 1, + "expiresAt": "2026-10-13T12:00:00Z" + } + ], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "knock", + "expected": { + "action": "reject", + "reason": "grant_expired", + "policyRevision": 1 + } + }, + { + "name": "allow list matches stable identity", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "allow_list", + "interruption": "available", + "allowedAgentIds": [ + "agent_sender" + ] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "allow_list", + "expected": { + "action": "deliver", + "reason": "allowed", + "policyRevision": 1 + } + }, + { + "name": "unlisted sender is refused", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "allow_list", + "interruption": "available", + "allowedAgentIds": [ + "another_agent" + ] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "allow_list", + "expected": { + "action": "reject", + "reason": "not_allowed", + "policyRevision": 1 + } + }, + { + "name": "busy holds ordinary messages", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "busy", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "busy", + "expected": { + "action": "hold", + "reason": "busy", + "policyRevision": 1 + } + }, + { + "name": "busy admits correlated awaited reply", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "busy", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": "request_a" + }, + "grants": [], + "awaitedReplies": [ + { + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "requestId": "request_a" + } + ], + "now": "2026-10-13T12:00:00Z" + }, + "label": "busy", + "expected": { + "action": "deliver", + "reason": "awaited_reply", + "policyRevision": 1 + } + }, + { + "name": "busy rejects wrong reply correlation", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "busy", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": "other_request" + }, + "grants": [], + "awaitedReplies": [ + { + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "requestId": "request_a" + } + ], + "now": "2026-10-13T12:00:00Z" + }, + "label": "busy", + "expected": { + "action": "hold", + "reason": "busy", + "policyRevision": 1 + } + }, + { + "name": "awaited reply cannot bypass allow list", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "allow_list", + "interruption": "busy", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": "request_a" + }, + "grants": [], + "awaitedReplies": [ + { + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "requestId": "request_a" + } + ], + "now": "2026-10-13T12:00:00Z" + }, + "label": "busy", + "expected": { + "action": "reject", + "reason": "not_allowed", + "policyRevision": 1 + } + }, + { + "name": "offline wins over busy and retains policy", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "allow_list", + "interruption": "busy", + "allowedAgentIds": [ + "agent_sender" + ] + }, + "connection": "offline", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "offline", + "expected": { + "action": "queue", + "reason": "offline", + "policyRevision": 1 + } + }, + { + "name": "offline transport without queue refuses", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "offline", + "queueSupported": false, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "offline", + "expected": { + "action": "reject", + "reason": "offline_not_queueable", + "policyRevision": 1 + } + }, + { + "name": "offline still requires knock admission", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "offline", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "offline", + "expected": { + "action": "request_approval", + "reason": "approval_required", + "policyRevision": 1 + } + }, + { + "name": "conflicting grant revision cannot restore approval", + "input": { + "status": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "knock", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "message": { + "id": "msg_a", + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "conversationId": "conv_a", + "inReplyTo": null + }, + "grants": [ + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "approved", + "revision": 1, + "expiresAt": "2026-10-14T12:00:00Z" + }, + { + "schemaVersion": 1, + "id": "grant_a", + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "sender": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_sender" + }, + "conversationId": "conv_a", + "state": "revoked", + "revision": 1, + "expiresAt": "2026-10-14T12:00:00Z" + } + ], + "awaitedReplies": [], + "now": "2026-10-13T12:00:00Z" + }, + "label": "knock", + "expected": { + "action": "reject", + "reason": "grant_revoked", + "policyRevision": 1 + } + } + ], + "reads": [ + { + "name": "read failure keeps last state", + "previous": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "input": null, + "expected": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "stale": true + }, + { + "name": "unsupported schema keeps last state", + "previous": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "input": { + "schemaVersion": 2, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "expected": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "stale": true + }, + { + "name": "stale revision keeps last state", + "previous": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "input": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 0, + "observedAt": "2026-10-13T12:00:00Z" + }, + "expected": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "stale": true + }, + { + "name": "unknown enum keeps last state", + "previous": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "input": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "future_policy", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "expected": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "stale": true + }, + { + "name": "other workspace keeps last state", + "previous": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "input": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "another_workspace", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "expected": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "stale": true + }, + { + "name": "unsupported policy keeps last state", + "previous": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "input": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 2, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "expected": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "stale": true + }, + { + "name": "new supported revision is accepted", + "previous": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 1, + "observedAt": "2026-10-13T12:00:00Z" + }, + "input": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 2, + "observedAt": "2026-10-13T12:00:00Z" + }, + "expected": { + "schemaVersion": 1, + "policy": { + "schemaVersion": 1, + "recipient": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "agentId": "agent_recipient" + }, + "revision": 1, + "admission": "open", + "interruption": "available", + "allowedAgentIds": [] + }, + "connection": "online", + "queueSupported": true, + "revision": 2, + "observedAt": "2026-10-13T12:00:00Z" + }, + "stale": false + } + ] +} diff --git a/packages/status/fixtures/session-status.v1.json b/packages/status/fixtures/session-status.v1.json new file mode 100644 index 000000000..a2ee70b29 --- /dev/null +++ b/packages/status/fixtures/session-status.v1.json @@ -0,0 +1,3633 @@ +{ + "schemaVersion": 1, + "cases": [ + { + "name": "silent tool stays working across a long heartbeat gap", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "activity", + "reason": "tool_running" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "working", + "reason": "tool_running", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T14:00:00Z", + "kind": "heartbeat" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "working", + "reason": "tool_running", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T14:00:00Z", + "dependencies": [], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "turn_finished" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "idle", + "reason": "turn_finished", + "basis": "observed", + "observedAt": "2026-10-13T12:04:00Z", + "lastSeenAt": "2026-10-13T14:00:00Z", + "dependencies": [], + "evidenceIds": [ + "e4" + ], + "producerSequences": { + "runner": 4 + }, + "resume": null + } + } + ] + }, + { + "name": "approval survives turn completion and heartbeat", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "wait", + "reason": "approval", + "dependencies": [ + { + "id": "dep_a", + "kind": "human", + "state": "pending", + "target": "target_a" + } + ] + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "needs_attention", + "reason": "approval", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "human", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "turn_finished" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "needs_attention", + "reason": "approval", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "human", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "heartbeat" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "needs_attention", + "reason": "approval", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:04:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "human", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 4 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e5", + "producerId": "runner", + "sequence": 5, + "expectedRevision": 4, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:05:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "invalid_transition", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "needs_attention", + "reason": "approval", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:04:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "human", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 4 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e6", + "producerId": "runner", + "sequence": 6, + "expectedRevision": 4, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:06:00Z", + "kind": "resolve_dependency", + "dependencyId": "dep_a" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 5, + "state": "idle", + "reason": "dependencies_resolved", + "basis": "observed", + "observedAt": "2026-10-13T12:06:00Z", + "lastSeenAt": "2026-10-13T12:06:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "human", + "state": "resolved", + "target": "target_a" + } + ], + "evidenceIds": [ + "e6" + ], + "producerSequences": { + "runner": 6 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e7", + "producerId": "runner", + "sequence": 7, + "expectedRevision": 5, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:07:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 6, + "state": "done", + "reason": "completed", + "basis": "observed", + "observedAt": "2026-10-13T12:07:00Z", + "lastSeenAt": "2026-10-13T12:07:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "human", + "state": "resolved", + "target": "target_a" + } + ], + "evidenceIds": [ + "e7" + ], + "producerSequences": { + "runner": 7 + }, + "resume": null + } + } + ] + }, + { + "name": "agent_reply survives turn completion and heartbeat", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "wait", + "reason": "agent_reply", + "dependencies": [ + { + "id": "dep_a", + "kind": "agent", + "state": "pending", + "target": "target_a" + } + ] + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "waiting_on_agent", + "reason": "agent_reply", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "agent", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "turn_finished" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "waiting_on_agent", + "reason": "agent_reply", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "agent", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "heartbeat" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "waiting_on_agent", + "reason": "agent_reply", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:04:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "agent", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 4 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e5", + "producerId": "runner", + "sequence": 5, + "expectedRevision": 4, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:05:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "invalid_transition", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "waiting_on_agent", + "reason": "agent_reply", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:04:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "agent", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 4 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e6", + "producerId": "runner", + "sequence": 6, + "expectedRevision": 4, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:06:00Z", + "kind": "resolve_dependency", + "dependencyId": "dep_a" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 5, + "state": "idle", + "reason": "dependencies_resolved", + "basis": "observed", + "observedAt": "2026-10-13T12:06:00Z", + "lastSeenAt": "2026-10-13T12:06:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "agent", + "state": "resolved", + "target": "target_a" + } + ], + "evidenceIds": [ + "e6" + ], + "producerSequences": { + "runner": 6 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e7", + "producerId": "runner", + "sequence": 7, + "expectedRevision": 5, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:07:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 6, + "state": "done", + "reason": "completed", + "basis": "observed", + "observedAt": "2026-10-13T12:07:00Z", + "lastSeenAt": "2026-10-13T12:07:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "agent", + "state": "resolved", + "target": "target_a" + } + ], + "evidenceIds": [ + "e7" + ], + "producerSequences": { + "runner": 7 + }, + "resume": null + } + } + ] + }, + { + "name": "pr_ci survives turn completion and heartbeat", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "wait", + "reason": "pr_ci", + "dependencies": [ + { + "id": "dep_a", + "kind": "pr", + "state": "pending", + "target": "target_a" + } + ] + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "waiting_on_pr", + "reason": "pr_ci", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "pr", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "turn_finished" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "waiting_on_pr", + "reason": "pr_ci", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "pr", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "heartbeat" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "waiting_on_pr", + "reason": "pr_ci", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:04:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "pr", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 4 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e5", + "producerId": "runner", + "sequence": 5, + "expectedRevision": 4, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:05:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "invalid_transition", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "waiting_on_pr", + "reason": "pr_ci", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:04:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "pr", + "state": "pending", + "target": "target_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 4 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e6", + "producerId": "runner", + "sequence": 6, + "expectedRevision": 4, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:06:00Z", + "kind": "resolve_dependency", + "dependencyId": "dep_a" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 5, + "state": "idle", + "reason": "dependencies_resolved", + "basis": "observed", + "observedAt": "2026-10-13T12:06:00Z", + "lastSeenAt": "2026-10-13T12:06:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "pr", + "state": "resolved", + "target": "target_a" + } + ], + "evidenceIds": [ + "e6" + ], + "producerSequences": { + "runner": 6 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e7", + "producerId": "runner", + "sequence": 7, + "expectedRevision": 5, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:07:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 6, + "state": "done", + "reason": "completed", + "basis": "observed", + "observedAt": "2026-10-13T12:07:00Z", + "lastSeenAt": "2026-10-13T12:07:00Z", + "dependencies": [ + { + "id": "dep_a", + "kind": "pr", + "state": "resolved", + "target": "target_a" + } + ], + "evidenceIds": [ + "e7" + ], + "producerSequences": { + "runner": 7 + }, + "resume": null + } + } + ] + }, + { + "name": "useful work resumes while dependency remains pending", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "wait", + "reason": "agent_reply", + "dependencies": [ + { + "id": "agent_a", + "kind": "agent", + "state": "pending", + "target": "agent_1" + } + ] + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "waiting_on_agent", + "reason": "agent_reply", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [ + { + "id": "agent_a", + "kind": "agent", + "state": "pending", + "target": "agent_1" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "activity", + "reason": "testing" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "working", + "reason": "testing", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [ + { + "id": "agent_a", + "kind": "agent", + "state": "pending", + "target": "agent_1" + } + ], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "turn_finished" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "waiting_on_agent", + "reason": "agent_reply", + "basis": "observed", + "observedAt": "2026-10-13T12:04:00Z", + "lastSeenAt": "2026-10-13T12:04:00Z", + "dependencies": [ + { + "id": "agent_a", + "kind": "agent", + "state": "pending", + "target": "agent_1" + } + ], + "evidenceIds": [ + "e4" + ], + "producerSequences": { + "runner": 4 + }, + "resume": null + } + } + ] + }, + { + "name": "one PR merge does not finish two PRs", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "wait", + "reason": "pr_review", + "dependencies": [ + { + "id": "pr1", + "kind": "pr", + "state": "pending", + "target": "https://github.com/a/b/pull/1" + }, + { + "id": "pr2", + "kind": "pr", + "state": "pending", + "target": "https://github.com/a/b/pull/2" + } + ] + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "waiting_on_pr", + "reason": "pr_review", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [ + { + "id": "pr1", + "kind": "pr", + "state": "pending", + "target": "https://github.com/a/b/pull/1" + }, + { + "id": "pr2", + "kind": "pr", + "state": "pending", + "target": "https://github.com/a/b/pull/2" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "resolve_dependency", + "dependencyId": "pr1" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "waiting_on_pr", + "reason": "pr_review", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [ + { + "id": "pr1", + "kind": "pr", + "state": "resolved", + "target": "https://github.com/a/b/pull/1" + }, + { + "id": "pr2", + "kind": "pr", + "state": "pending", + "target": "https://github.com/a/b/pull/2" + } + ], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "complete", + "reason": "merged" + }, + "outcome": "invalid_transition", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "waiting_on_pr", + "reason": "pr_review", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [ + { + "id": "pr1", + "kind": "pr", + "state": "resolved", + "target": "https://github.com/a/b/pull/1" + }, + { + "id": "pr2", + "kind": "pr", + "state": "pending", + "target": "https://github.com/a/b/pull/2" + } + ], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e5", + "producerId": "runner", + "sequence": 5, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:05:00Z", + "kind": "resolve_dependency", + "dependencyId": "pr2" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "idle", + "reason": "dependencies_resolved", + "basis": "observed", + "observedAt": "2026-10-13T12:05:00Z", + "lastSeenAt": "2026-10-13T12:05:00Z", + "dependencies": [ + { + "id": "pr1", + "kind": "pr", + "state": "resolved", + "target": "https://github.com/a/b/pull/1" + }, + { + "id": "pr2", + "kind": "pr", + "state": "resolved", + "target": "https://github.com/a/b/pull/2" + } + ], + "evidenceIds": [ + "e5" + ], + "producerSequences": { + "runner": 5 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e6", + "producerId": "runner", + "sequence": 6, + "expectedRevision": 4, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:06:00Z", + "kind": "complete", + "reason": "merged" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 5, + "state": "done", + "reason": "merged", + "basis": "observed", + "observedAt": "2026-10-13T12:06:00Z", + "lastSeenAt": "2026-10-13T12:06:00Z", + "dependencies": [ + { + "id": "pr1", + "kind": "pr", + "state": "resolved", + "target": "https://github.com/a/b/pull/1" + }, + { + "id": "pr2", + "kind": "pr", + "state": "resolved", + "target": "https://github.com/a/b/pull/2" + } + ], + "evidenceIds": [ + "e6" + ], + "producerSequences": { + "runner": 6 + }, + "resume": null + } + } + ] + }, + { + "name": "new episode rejects late completion and stale revisions", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "done", + "reason": "completed", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_b", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_b", + "revision": 3, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "complete", + "reason": "merged" + }, + "outcome": "wrong_episode", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_b", + "revision": 3, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e5", + "producerId": "runner", + "sequence": 5, + "expectedRevision": 0, + "workEpisodeId": "episode_b", + "observedAt": "2026-10-13T12:05:00Z", + "kind": "activity", + "reason": "testing" + }, + "outcome": "conflict", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_b", + "revision": 3, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e6", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 3, + "workEpisodeId": "episode_b", + "observedAt": "2026-10-13T12:06:00Z", + "kind": "heartbeat" + }, + "outcome": "duplicate", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_b", + "revision": 3, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + } + ] + }, + { + "name": "archive requires explicit unarchive", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "done", + "reason": "completed", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "archive" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "archived", + "reason": "archived", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": { + "state": "done", + "reason": "completed", + "basis": "observed" + } + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "activity", + "reason": "testing" + }, + "outcome": "archived", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "archived", + "reason": "archived", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": { + "state": "done", + "reason": "completed", + "basis": "observed" + } + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e5", + "producerId": "runner", + "sequence": 5, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:05:00Z", + "kind": "heartbeat" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 4, + "state": "archived", + "reason": "archived", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:05:00Z", + "dependencies": [], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 5 + }, + "resume": { + "state": "done", + "reason": "completed", + "basis": "observed" + } + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e6", + "producerId": "runner", + "sequence": 6, + "expectedRevision": 4, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:06:00Z", + "kind": "unarchive" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 5, + "state": "done", + "reason": "completed", + "basis": "observed", + "observedAt": "2026-10-13T12:06:00Z", + "lastSeenAt": "2026-10-13T12:06:00Z", + "dependencies": [], + "evidenceIds": [ + "e6" + ], + "producerSequences": { + "runner": 6 + }, + "resume": null + } + } + ] + }, + { + "name": "foreign scope and future schema do not overwrite status", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_b", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "turn_finished" + }, + "outcome": "wrong_session", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 2, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "turn_finished" + }, + "outcome": "invalid", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + } + ] + }, + { + "name": "adding a wait preserves unrelated dependencies", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "wait", + "reason": "approval", + "dependencies": [ + { + "id": "human_a", + "kind": "human", + "state": "pending", + "target": "user_a" + } + ] + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "needs_attention", + "reason": "approval", + "basis": "observed", + "observedAt": "2026-10-13T12:02:00Z", + "lastSeenAt": "2026-10-13T12:02:00Z", + "dependencies": [ + { + "id": "human_a", + "kind": "human", + "state": "pending", + "target": "user_a" + } + ], + "evidenceIds": [ + "e2" + ], + "producerSequences": { + "runner": 2 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e3", + "producerId": "runner", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:03:00Z", + "kind": "wait", + "reason": "agent_reply", + "dependencies": [ + { + "id": "agent_a", + "kind": "agent", + "state": "pending", + "target": "agent_a" + } + ] + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "waiting_on_agent", + "reason": "agent_reply", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [ + { + "id": "human_a", + "kind": "human", + "state": "pending", + "target": "user_a" + }, + { + "id": "agent_a", + "kind": "agent", + "state": "pending", + "target": "agent_a" + } + ], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e4", + "producerId": "runner", + "sequence": 4, + "expectedRevision": 3, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:04:00Z", + "kind": "complete", + "reason": "completed" + }, + "outcome": "invalid_transition", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 3, + "state": "waiting_on_agent", + "reason": "agent_reply", + "basis": "observed", + "observedAt": "2026-10-13T12:03:00Z", + "lastSeenAt": "2026-10-13T12:03:00Z", + "dependencies": [ + { + "id": "human_a", + "kind": "human", + "state": "pending", + "target": "user_a" + }, + { + "id": "agent_a", + "kind": "agent", + "state": "pending", + "target": "agent_a" + } + ], + "evidenceIds": [ + "e3" + ], + "producerSequences": { + "runner": 3 + }, + "resume": null + } + } + ] + }, + { + "name": "merge without an associated PR is not completion", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e1", + "producerId": "runner", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:01:00Z", + "kind": "start" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "e2", + "producerId": "runner", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": "episode_a", + "observedAt": "2026-10-13T12:02:00Z", + "kind": "complete", + "reason": "merged" + }, + "outcome": "invalid_transition", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + } + } + ] + }, + { + "name": "historical session can archive without inventing a work episode", + "initial": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 0, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": null, + "lastSeenAt": null, + "dependencies": [], + "evidenceIds": [], + "producerSequences": {}, + "resume": null + }, + "steps": [ + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "archive_1", + "producerId": "desktop", + "sequence": 1, + "expectedRevision": 0, + "workEpisodeId": null, + "observedAt": "2026-10-13T13:01:00Z", + "kind": "archive" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 1, + "state": "archived", + "reason": "archived", + "basis": "observed", + "observedAt": "2026-10-13T13:01:00Z", + "lastSeenAt": "2026-10-13T13:01:00Z", + "dependencies": [], + "evidenceIds": [ + "archive_1" + ], + "producerSequences": { + "desktop": 1 + }, + "resume": { + "state": "idle", + "reason": "no_activity", + "basis": "inferred" + } + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "archive_2", + "producerId": "desktop", + "sequence": 2, + "expectedRevision": 1, + "workEpisodeId": null, + "observedAt": "2026-10-13T13:02:00Z", + "kind": "heartbeat" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 2, + "state": "archived", + "reason": "archived", + "basis": "observed", + "observedAt": "2026-10-13T13:01:00Z", + "lastSeenAt": "2026-10-13T13:02:00Z", + "dependencies": [], + "evidenceIds": [ + "archive_1" + ], + "producerSequences": { + "desktop": 2 + }, + "resume": { + "state": "idle", + "reason": "no_activity", + "basis": "inferred" + } + } + }, + { + "event": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "eventId": "archive_3", + "producerId": "desktop", + "sequence": 3, + "expectedRevision": 2, + "workEpisodeId": null, + "observedAt": "2026-10-13T13:03:00Z", + "kind": "unarchive" + }, + "outcome": "applied", + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": null, + "revision": 3, + "state": "idle", + "reason": "no_activity", + "basis": "inferred", + "observedAt": "2026-10-13T13:03:00Z", + "lastSeenAt": "2026-10-13T13:03:00Z", + "dependencies": [], + "evidenceIds": [ + "archive_3" + ], + "producerSequences": { + "desktop": 3 + }, + "resume": null + } + } + ] + } + ], + "reads": [ + { + "name": "read failure keeps last state", + "previous": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "input": null, + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "stale": true + }, + { + "name": "unsupported schema keeps last state", + "previous": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "input": { + "schemaVersion": 2, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "stale": true + }, + { + "name": "stale revision keeps last state", + "previous": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "input": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 0, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "stale": true + }, + { + "name": "unknown enum keeps last state", + "previous": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "input": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "future_state", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "stale": true + }, + { + "name": "other workspace keeps last state", + "previous": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "input": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "another_workspace", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "stale": true + }, + { + "name": "new supported revision is accepted", + "previous": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 1, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "input": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "expected": { + "schemaVersion": 1, + "identity": { + "organizationId": "org_a", + "workspaceId": "ws_a", + "source": "codex", + "sessionId": "session_a" + }, + "workEpisodeId": "episode_a", + "revision": 2, + "state": "working", + "reason": "thinking", + "basis": "observed", + "observedAt": "2026-10-13T12:01:00Z", + "lastSeenAt": "2026-10-13T12:01:00Z", + "dependencies": [], + "evidenceIds": [ + "e1" + ], + "producerSequences": { + "runner": 1 + }, + "resume": null + }, + "stale": false + } + ] +} diff --git a/packages/status/package.json b/packages/status/package.json new file mode 100644 index 000000000..c567aa5d1 --- /dev/null +++ b/packages/status/package.json @@ -0,0 +1,59 @@ +{ + "name": "@agent-relay/status", + "version": "14.1.0", + "description": "Portable Relay work status and communication policy semantics", + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + }, + "./work": { + "types": "./dist/work.d.ts", + "import": "./dist/work.js", + "default": "./dist/work.js" + }, + "./communication": { + "types": "./dist/communication.d.ts", + "import": "./dist/communication.js", + "default": "./dist/communication.js" + }, + "./native": { + "types": "./dist/native.d.ts", + "import": "./dist/native.js", + "default": "./dist/native.js" + }, + "./contracts/*": "./contracts/*" + }, + "files": [ + "dist", + "contracts", + "fixtures", + "README.md" + ], + "scripts": { + "build": "tsc -p tsconfig.json", + "test": "vitest run --config vitest.config.ts", + "contracts": "npm run build && node scripts/export-contracts.mjs", + "contracts:check": "npm run build && node scripts/export-contracts.mjs --check", + "prepack": "npm run contracts:check" + }, + "dependencies": { + "zod": "^4.4.3" + }, + "devDependencies": { + "typescript": "^5.9.3", + "vitest": "^4.1.0", + "@types/node": "^22.19.3" + }, + "license": "Apache-2.0", + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/AgentWorkforce/relay.git", + "directory": "packages/status" + } +} diff --git a/packages/status/scripts/export-contracts.mjs b/packages/status/scripts/export-contracts.mjs new file mode 100644 index 000000000..7e1f35660 --- /dev/null +++ b/packages/status/scripts/export-contracts.mjs @@ -0,0 +1,28 @@ +import { readFileSync, writeFileSync } from 'node:fs'; +import { z } from 'zod'; +import { sessionStatusSchemas } from '../dist/work.js'; +import { communicationStatusSchemas } from '../dist/communication.js'; +for (const [file, owner, types, fixture] of [ + ['session-work', 'work', sessionStatusSchemas, 'session-status'], + ['communication-status', 'communication', communicationStatusSchemas, 'communication-status'], +]) { + const output = + JSON.stringify( + { + schemaVersion: 1, + owner: `@agent-relay/status/${owner}`, + types: Object.fromEntries( + Object.entries(types).map(([name, schema]) => [name, z.toJSONSchema(schema)]) + ), + fixtures: JSON.parse( + readFileSync(new URL(`../fixtures/${fixture}.v1.json`, import.meta.url), 'utf8') + ), + }, + null, + 2 + ) + '\n'; + const path = new URL(`../contracts/${file}.v1.json`, import.meta.url); + if (process.argv.includes('--check')) { + if (readFileSync(path, 'utf8') !== output) throw Error(`Contract drift: ${file}`); + } else writeFileSync(path, output); +} diff --git a/packages/status/src/communication.ts b/packages/status/src/communication.ts new file mode 100644 index 000000000..e9baae83b --- /dev/null +++ b/packages/status/src/communication.ts @@ -0,0 +1,188 @@ +/** Communication policy v1. Pure decisions; this module does not send or acknowledge messages. */ +import { z } from 'zod'; + +const id = z.string().min(1); +const revision = z.number().int().min(0).max(Number.MAX_SAFE_INTEGER); +const instant = z.iso.datetime({ offset: true }); +export const COMMUNICATION_STATUS_VERSION = 1 as const; +export const communicationLabel = z.enum(['open', 'knock', 'allow_list', 'busy', 'offline']); +export const communicationIdentity = z.strictObject({ + organizationId: id, + workspaceId: id, + agentId: id, +}); +export const communicationPolicy = z.strictObject({ + schemaVersion: z.literal(COMMUNICATION_STATUS_VERSION), + recipient: communicationIdentity, + revision, + admission: z.enum(['open', 'knock', 'allow_list']), + interruption: z.enum(['available', 'busy']), + allowedAgentIds: z.array(id), +}); +export const communicationStatus = z.strictObject({ + schemaVersion: z.literal(COMMUNICATION_STATUS_VERSION), + policy: communicationPolicy, + connection: z.enum(['online', 'offline']), + queueSupported: z.boolean(), + /** Admission and connectivity can change independently. */ + revision, + observedAt: instant, +}); +export type CommunicationStatus = z.infer; +export type CommunicationPolicy = z.infer; +export const conversationGrant = z.strictObject({ + schemaVersion: z.literal(COMMUNICATION_STATUS_VERSION), + id, + recipient: communicationIdentity, + sender: communicationIdentity, + conversationId: id, + state: z.enum(['pending', 'approved', 'rejected', 'revoked', 'expired']), + /** Monotonic for the recipient/sender/conversation tuple, including renewed knocks. */ + revision, + expiresAt: instant, +}); +export const communicationMessage = z.strictObject({ + id, + sender: communicationIdentity, + recipient: communicationIdentity, + conversationId: id, + inReplyTo: id.nullable(), +}); +export const awaitedReply = z.strictObject({ + sender: communicationIdentity, + conversationId: id, + requestId: id, +}); +export const communicationDecision = z.strictObject({ + action: z.enum(['deliver', 'request_approval', 'hold', 'queue', 'reject']), + reason: z.enum([ + 'allowed', + 'awaited_reply', + 'approval_required', + 'grant_rejected', + 'grant_revoked', + 'grant_expired', + 'not_allowed', + 'wrong_scope', + 'wrong_recipient', + 'busy', + 'offline', + 'offline_not_queueable', + ]), + policyRevision: revision, +}); +export const communicationReceipt = z.strictObject({ + schemaVersion: z.literal(COMMUNICATION_STATUS_VERSION), + messageId: id, + state: z.enum(['pending_approval', 'held', 'queued', 'delivered', 'rejected', 'expired']), + policyRevision: revision, + observedAt: instant, +}); +export const communicationDecisionInput = z.strictObject({ + status: communicationStatus, + message: communicationMessage, + grants: z.array(conversationGrant), + awaitedReplies: z.array(awaitedReply), + now: instant, +}); +export type CommunicationDecision = z.infer; + +/** Named schemas exported for generated desktop contracts. */ +export const communicationStatusSchemas = { + CommunicationLabel: communicationLabel, + CommunicationIdentity: communicationIdentity, + CommunicationPolicy: communicationPolicy, + CommunicationStatus: communicationStatus, + ConversationGrant: conversationGrant, + CommunicationMessage: communicationMessage, + AwaitedReply: awaitedReply, + CommunicationDecision: communicationDecision, + CommunicationReceipt: communicationReceipt, + CommunicationDecisionInput: communicationDecisionInput, +}; + +export function effectiveCommunicationStatus( + status: CommunicationStatus +): z.infer { + return status.connection === 'offline' + ? 'offline' + : status.policy.interruption === 'busy' + ? 'busy' + : status.policy.admission; +} +const sameScope = (a: z.infer, b: z.infer) => + a.organizationId === b.organizationId && a.workspaceId === b.workspaceId; +const sameAgent = (a: z.infer, b: z.infer) => + sameScope(a, b) && a.agentId === b.agentId; + +/** Call only with authenticated identities and current grants from trusted storage. + * A deliver decision is permission to attempt delivery, never a delivered receipt. + * Re-evaluate before injection, including after approval/reconnect/policy changes. + */ +export function decideCommunication( + input: z.infer +): CommunicationDecision { + const { status, message, grants, awaitedReplies, now } = communicationDecisionInput.parse(input); + const p = status.policy; + const result = ( + action: CommunicationDecision['action'], + reason: CommunicationDecision['reason'] + ): CommunicationDecision => ({ action, reason, policyRevision: p.revision }); + if (!sameAgent(message.recipient, p.recipient)) return result('reject', 'wrong_recipient'); + if (!sameScope(message.sender, p.recipient)) return result('reject', 'wrong_scope'); + if (p.admission === 'allow_list' && !p.allowedAgentIds.includes(message.sender.agentId)) + return result('reject', 'not_allowed'); + if (p.admission === 'knock') { + // The latest revision wins, even if an older grant was approved. + const denialRank = (g: z.infer) => + g.state === 'revoked' + ? 5 + : g.state === 'rejected' + ? 4 + : g.state === 'expired' || Date.parse(g.expiresAt) <= Date.parse(now) + ? 3 + : g.state === 'pending' + ? 2 + : 1; + const matching = grants + .filter( + (g) => + sameAgent(g.sender, message.sender) && + sameAgent(g.recipient, p.recipient) && + g.conversationId === message.conversationId + ) + .sort((a, b) => b.revision - a.revision || denialRank(b) - denialRank(a)); + const grant = matching[0]; + if (grant?.state === 'rejected') return result('reject', 'grant_rejected'); + if (grant?.state === 'revoked') return result('reject', 'grant_revoked'); + if (grant && (grant.state === 'expired' || Date.parse(grant.expiresAt) <= Date.parse(now))) + return result('reject', 'grant_expired'); + if (!grant || grant.state !== 'approved') return result('request_approval', 'approval_required'); + } + if (status.connection === 'offline') + return result( + status.queueSupported ? 'queue' : 'reject', + status.queueSupported ? 'offline' : 'offline_not_queueable' + ); + const expectedReply = awaitedReplies.some( + (r) => + sameAgent(r.sender, message.sender) && + r.conversationId === message.conversationId && + r.requestId === message.inReplyTo + ); + if (p.interruption === 'busy' && !expectedReply) return result('hold', 'busy'); + return result('deliver', expectedReply ? 'awaited_reply' : 'allowed'); +} + +/** Unsupported versions, stale responses, and read failures never reset a policy to Open. */ +export function readCommunicationStatus(input: unknown, previous: CommunicationStatus) { + const parsed = communicationStatus.safeParse(input); + if ( + !parsed.success || + !sameAgent(parsed.data.policy.recipient, previous.policy.recipient) || + parsed.data.revision < previous.revision || + parsed.data.policy.revision < previous.policy.revision + ) + return { status: previous, stale: true }; + return { status: parsed.data, stale: false }; +} diff --git a/packages/status/src/index.ts b/packages/status/src/index.ts new file mode 100644 index 000000000..a8da2184b --- /dev/null +++ b/packages/status/src/index.ts @@ -0,0 +1,3 @@ +export * from './work.js'; +export * from './communication.js'; +export * from './native.js'; diff --git a/packages/status/src/native.ts b/packages/status/src/native.ts new file mode 100644 index 000000000..acd9d585d --- /dev/null +++ b/packages/status/src/native.ts @@ -0,0 +1,46 @@ +import { initialSessionWorkStatus, type SessionWorkStatus } from './work.js'; +type Identity = SessionWorkStatus['identity']; +export type NativeEvidence = { + id: string; + at: string; + kind: string; + type: string | null; + taskStatus: string | null; + toolName: string | null; +}; +/** Conservative baseline for historical rows with no explicit status producer. */ +export function inferNativeWorkStatus(id: Identity, evidence: NativeEvidence | null): SessionWorkStatus { + const status = initialSessionWorkStatus(id); + if (!evidence) return status; + status.observedAt = evidence.at; + status.lastSeenAt = evidence.at; + status.evidenceIds = [evidence.id]; + const task = evidence.taskStatus?.toLowerCase(); + if ( + evidence.kind === 'task' && + ['completed', 'complete', 'finished', 'done', 'succeeded'].includes(task ?? '') + ) { + status.state = 'done'; + status.reason = 'completed'; + } else if (evidence.kind === 'task_complete') { + status.reason = 'turn_finished'; + } else if ( + evidence.kind === 'turn_aborted' || + ['idle', 'paused', 'waiting', 'blocked', 'cancelled', 'canceled', 'failed'].includes(task ?? '') + ) { + status.reason = 'paused'; + } else if ( + evidence.type !== 'tool_result' && + /(^|[.:/]|__)(request_user_input|askuserquestion)$/i.test(evidence.toolName ?? '') + ) { + status.state = 'needs_attention'; + status.reason = 'human_input'; + } else { + status.state = 'working'; + status.reason = + (evidence.kind === 'tool_call' || evidence.type === 'tool_use') && evidence.type !== 'tool_result' + ? 'tool_running' + : 'thinking'; + } + return status; +} diff --git a/packages/status/src/work.ts b/packages/status/src/work.ts new file mode 100644 index 000000000..d7527e83c --- /dev/null +++ b/packages/status/src/work.ts @@ -0,0 +1,337 @@ +/** Versioned work evidence contract. Admission/authentication belongs to the caller. */ +import { z } from 'zod'; + +export const SESSION_STATUS_VERSION = 1 as const; +export const sessionWorkState = z.enum([ + 'working', + 'needs_attention', + 'waiting_on_agent', + 'idle', + 'waiting_on_pr', + 'done', + 'archived', +]); +export const sessionWorkReason = z.enum([ + 'no_activity', + 'thinking', + 'tool_running', + 'testing', + 'coordinating', + 'human_input', + 'approval', + 'credentials', + 'failure', + 'agent_reply', + 'pr_review', + 'pr_ci', + 'pr_merge', + 'turn_finished', + 'paused', + 'dependencies_resolved', + 'completed', + 'merged', + 'archived', +]); +const id = z.string().min(1); +const counter = z.number().int().min(0).max(Number.MAX_SAFE_INTEGER); +const instant = z.iso.datetime({ offset: true }); +export const sessionStatusIdentity = z.strictObject({ + organizationId: id, + workspaceId: id, + source: id, + sessionId: id, +}); +export const sessionWorkDependency = z.strictObject({ + id, + kind: z.enum(['human', 'agent', 'pr']), + state: z.enum(['pending', 'resolved']), + /** Stable agent ID or PR URL; never a display name. */ + target: id, +}); +const assessment = { + state: sessionWorkState, + reason: sessionWorkReason, +}; +export const sessionWorkStatus = z.strictObject({ + schemaVersion: z.literal(SESSION_STATUS_VERSION), + identity: sessionStatusIdentity, + workEpisodeId: id.nullable(), + revision: counter, + ...assessment, + basis: z.enum(['observed', 'inferred']), + observedAt: instant.nullable(), + lastSeenAt: instant.nullable(), + dependencies: z.array(sessionWorkDependency), + evidenceIds: z.array(id), + producerSequences: z.record(z.string(), counter), + /** Archive wraps, rather than overwrites, the last work assessment. */ + resume: z.strictObject({ ...assessment, basis: z.enum(['observed', 'inferred']) }).nullable(), +}); +export type SessionWorkStatus = z.infer; +export type SessionWorkState = z.infer; + +const event = { + schemaVersion: z.literal(SESSION_STATUS_VERSION), + identity: sessionStatusIdentity, + eventId: id, + /** Stable producer incarnation; a restarted sequence needs a new producerId. */ + producerId: id, + sequence: counter, + /** Compare-and-set against the projection, not a wall-clock ordering guess. */ + expectedRevision: counter, + workEpisodeId: id.nullable(), + observedAt: instant, +}; +export const sessionWorkEvent = z.discriminatedUnion('kind', [ + z.strictObject({ ...event, kind: z.literal('start') }), + z.strictObject({ + ...event, + kind: z.literal('activity'), + reason: z.enum(['thinking', 'tool_running', 'testing', 'coordinating']), + }), + z.strictObject({ + ...event, + kind: z.literal('wait'), + reason: z.enum([ + 'human_input', + 'approval', + 'credentials', + 'failure', + 'agent_reply', + 'pr_review', + 'pr_ci', + 'pr_merge', + ]), + dependencies: z.array(sessionWorkDependency).min(1), + }), + z.strictObject({ + ...event, + kind: z.literal('resolve_dependency'), + dependencyId: id, + }), + z.strictObject({ ...event, kind: z.literal('turn_finished') }), + z.strictObject({ + ...event, + kind: z.literal('complete'), + reason: z.enum(['completed', 'merged']), + }), + z.strictObject({ ...event, kind: z.literal('archive') }), + z.strictObject({ ...event, kind: z.literal('unarchive') }), + z.strictObject({ ...event, kind: z.literal('heartbeat') }), +]); +export type SessionWorkEvent = z.infer; + +/** Named schema exports used by the generated Rust/Swift contract. */ +export const sessionStatusSchemas = { + SessionWorkState: sessionWorkState, + SessionWorkReason: sessionWorkReason, + SessionStatusIdentity: sessionStatusIdentity, + SessionWorkDependency: sessionWorkDependency, + SessionWorkStatus: sessionWorkStatus, + SessionWorkEvent: sessionWorkEvent, +}; + +export function initialSessionWorkStatus(identity: SessionWorkStatus['identity']): SessionWorkStatus { + return sessionWorkStatus.parse({ + schemaVersion: 1, + identity, + workEpisodeId: null, + revision: 0, + state: 'idle', + reason: 'no_activity', + basis: 'inferred', + observedAt: null, + lastSeenAt: null, + dependencies: [], + evidenceIds: [], + producerSequences: {}, + resume: null, + }); +} + +const waitState = (reason: SessionWorkStatus['reason']): SessionWorkState => + reason === 'agent_reply' + ? 'waiting_on_agent' + : reason.startsWith('pr_') + ? 'waiting_on_pr' + : 'needs_attention'; +const pending = (value: SessionWorkStatus) => value.dependencies.filter((d) => d.state === 'pending'); +const sameIdentity = (a: SessionWorkStatus['identity'], b: SessionWorkStatus['identity']) => + a.organizationId === b.organizationId && + a.workspaceId === b.workspaceId && + a.source === b.source && + a.sessionId === b.sessionId; + +/** Pure reference transition. Persistence must commit the returned revision atomically. + * Native event interpretation, PR-head validation, and inference are separate producers. + */ +export function transitionSessionWorkStatus( + previous: SessionWorkStatus, + input: unknown +): { + status: SessionWorkStatus; + outcome: + | 'applied' + | 'invalid' + | 'wrong_session' + | 'duplicate' + | 'conflict' + | 'wrong_episode' + | 'archived' + | 'invalid_transition'; +} { + const parsed = sessionWorkEvent.safeParse(input); + const unchanged = ( + outcome: Exclude['outcome'], 'applied'> + ) => ({ status: previous, outcome }); + if (!parsed.success) return unchanged('invalid'); + const e = parsed.data; + if (!sameIdentity(previous.identity, e.identity)) return unchanged('wrong_session'); + if ( + Object.hasOwn(previous.producerSequences, e.producerId) && + e.sequence <= previous.producerSequences[e.producerId]! + ) + return unchanged('duplicate'); + if (e.expectedRevision !== previous.revision) return unchanged('conflict'); + if (e.workEpisodeId === null && !['archive', 'unarchive', 'heartbeat'].includes(e.kind)) + return unchanged('invalid_transition'); + if (previous.revision === Number.MAX_SAFE_INTEGER) return unchanged('invalid_transition'); + if (e.kind !== 'start' && e.workEpisodeId !== previous.workEpisodeId) return unchanged('wrong_episode'); + if (previous.state === 'archived' && !['unarchive', 'heartbeat'].includes(e.kind)) + return unchanged('archived'); + const next: SessionWorkStatus = structuredClone(previous); + switch (e.kind) { + case 'start': + if (e.workEpisodeId === null) return unchanged('invalid_transition'); + if (e.workEpisodeId === previous.workEpisodeId) return unchanged('invalid_transition'); + next.workEpisodeId = e.workEpisodeId; + next.state = 'working'; + next.reason = 'thinking'; + next.dependencies = []; + next.resume = null; + break; + case 'activity': + if (previous.state === 'done') return unchanged('invalid_transition'); + next.state = 'working'; + next.reason = e.reason; + break; + case 'wait': { + if (previous.state === 'done') return unchanged('invalid_transition'); + const kind = e.reason === 'agent_reply' ? 'agent' : e.reason.startsWith('pr_') ? 'pr' : 'human'; + if ( + !e.dependencies.some((d) => d.kind === kind && d.state === 'pending') || + new Set(e.dependencies.map((d) => d.id)).size !== e.dependencies.length + ) + return unchanged('invalid_transition'); + next.state = waitState(e.reason); + next.reason = e.reason; + // A new wait cannot erase another producer's outstanding dependency. + for (const dependency of e.dependencies) { + const existing = next.dependencies.find((d) => d.id === dependency.id); + if ( + existing && + (existing.kind !== dependency.kind || + existing.target !== dependency.target || + existing.state !== dependency.state) + ) + return unchanged('invalid_transition'); + if (!existing) next.dependencies.push(dependency); + } + break; + } + case 'resolve_dependency': + if (!next.dependencies.some((d) => d.id === e.dependencyId && d.state === 'pending')) + return unchanged('invalid_transition'); + next.dependencies = next.dependencies.map((d) => + d.id === e.dependencyId ? { ...d, state: 'resolved' } : d + ); + if (previous.state !== 'working') selectWait(next); + break; + case 'turn_finished': + if (previous.state === 'working') { + next.state = 'idle'; + next.reason = 'turn_finished'; + if (pending(next).length) selectWait(next); + } + break; + case 'complete': + if (pending(next).length || (e.reason === 'merged' && !next.dependencies.some((d) => d.kind === 'pr'))) + return unchanged('invalid_transition'); + next.state = 'done'; + next.reason = e.reason; + break; + case 'archive': + next.resume = { + state: previous.state, + reason: previous.reason, + basis: previous.basis, + }; + next.state = 'archived'; + next.reason = 'archived'; + break; + case 'unarchive': + if (previous.state !== 'archived' || !previous.resume || previous.resume.state === 'archived') + return unchanged('invalid_transition'); + next.state = previous.resume.state; + next.reason = previous.resume.reason; + next.resume = null; + break; + case 'heartbeat': + break; + } + next.revision++; + next.producerSequences = { + ...next.producerSequences, + [e.producerId]: e.sequence, + }; + // Older wall clocks cannot make a session less fresh. They also do not order work. + next.lastSeenAt = latestInstant(previous.lastSeenAt, e.observedAt); + if ( + e.kind !== 'heartbeat' && + !(e.kind === 'turn_finished' && next.state === previous.state && next.reason === previous.reason) + ) { + next.observedAt = e.observedAt; + next.basis = e.kind === 'unarchive' ? previous.resume!.basis : 'observed'; + next.evidenceIds = [e.eventId]; + } + return { status: next, outcome: 'applied' }; +} + +function latestInstant(a: string | null, b: string) { + return a && Date.parse(a) > Date.parse(b) ? a : b; +} +function selectWait(status: SessionWorkStatus) { + const waiting = pending(status); + const kind = ['human', 'agent', 'pr'].find((k) => waiting.some((d) => d.kind === k)); + const currentKind = + status.state === 'needs_attention' + ? 'human' + : status.state === 'waiting_on_agent' + ? 'agent' + : status.state === 'waiting_on_pr' + ? 'pr' + : null; + if (kind && kind === currentKind) return; + const reason = + kind === 'human' + ? 'human_input' + : kind === 'agent' + ? 'agent_reply' + : kind === 'pr' + ? 'pr_review' + : 'dependencies_resolved'; + status.state = kind ? waitState(reason) : 'idle'; + status.reason = reason; +} + +/** An unsupported server version/read failure preserves the last supported snapshot. */ +export function readSessionWorkStatus(input: unknown, previous: SessionWorkStatus) { + const parsed = sessionWorkStatus.safeParse(input); + if ( + !parsed.success || + !sameIdentity(previous.identity, parsed.data.identity) || + parsed.data.revision < previous.revision + ) + return { status: previous, stale: true }; + return { status: parsed.data, stale: false }; +} diff --git a/packages/status/test/communication.test.ts b/packages/status/test/communication.test.ts new file mode 100644 index 000000000..e634b84bc --- /dev/null +++ b/packages/status/test/communication.test.ts @@ -0,0 +1,93 @@ +import { readFileSync } from 'node:fs'; +import { describe, expect, it } from 'vitest'; +import { z } from 'zod'; +import { + communicationDecisionInput, + communicationReceipt, + communicationStatus, + decideCommunication, + effectiveCommunicationStatus, + readCommunicationStatus, + communicationStatusSchemas, +} from '../src/communication.js'; + +const fixtures = JSON.parse( + readFileSync(new URL('../fixtures/communication-status.v1.json', import.meta.url), 'utf8') +); +describe('communication status v1 contract', () => { + for (const fixture of fixtures.reads) { + it(fixture.name, () => { + expect(readCommunicationStatus(fixture.input, fixture.previous)).toEqual({ + status: fixture.expected, + stale: fixture.stale, + }); + }); + } + it('the exported bundle matches the owned schemas and decision fixtures', () => { + const bundle = JSON.parse( + readFileSync(new URL('../contracts/communication-status.v1.json', import.meta.url), 'utf8') + ); + expect(bundle.fixtures).toEqual(fixtures); + expect(bundle.types).toEqual( + Object.fromEntries( + Object.entries(communicationStatusSchemas).map(([name, schema]) => [name, z.toJSONSchema(schema)]) + ) + ); + }); + for (const fixture of fixtures.cases) { + it(fixture.name, () => { + const input = communicationDecisionInput.parse(fixture.input); + expect(effectiveCommunicationStatus(input.status)).toBe(fixture.label); + expect(decideCommunication(input)).toEqual(fixture.expected); + }); + } + const status = communicationStatus.parse(fixtures.cases[0].input.status); + it('reconnecting and clearing Busy restores the saved admission policy', () => { + const saved = { + ...status, + policy: { + ...status.policy, + admission: 'knock' as const, + interruption: 'busy' as const, + }, + }; + expect(effectiveCommunicationStatus({ ...saved, connection: 'offline' })).toBe('offline'); + expect(effectiveCommunicationStatus(saved)).toBe('busy'); + expect( + effectiveCommunicationStatus({ + ...saved, + policy: { ...saved.policy, interruption: 'available' }, + }) + ).toBe('knock'); + }); + it.each([ + null, + {}, + { ...status, schemaVersion: 2 }, + { ...status, revision: 0 }, + { ...status, policy: { ...status.policy, admission: 'future_policy' } }, + { ...status, policy: { ...status.policy, revision: 0 } }, + ])('failed or unsupported reads cannot reset admission to Open', (input) => { + expect(readCommunicationStatus(input, status)).toEqual({ + status, + stale: true, + }); + }); + it('a delivery decision is not a delivered receipt', () => { + const input = communicationDecisionInput.parse(fixtures.cases[0].input); + expect(decideCommunication(input).action).toBe('deliver'); + expect(communicationReceipt.safeParse(decideCommunication(input)).success).toBe(false); + }); + it('an approval for another sender or recipient grants no access', () => { + const input = communicationDecisionInput.parse( + fixtures.cases.find((f: { name: string }) => f.name === 'approved knock admits that conversation').input + ); + for (const side of ['sender', 'recipient'] as const) { + const grants = input.grants.map((g) => ({ + ...g, + [side]: { ...g[side], agentId: 'different_agent' }, + })); + expect(decideCommunication({ ...input, grants }).action).toBe('request_approval'); + } + }); +}); diff --git a/packages/status/test/native.test.ts b/packages/status/test/native.test.ts new file mode 100644 index 000000000..a89f8d5db --- /dev/null +++ b/packages/status/test/native.test.ts @@ -0,0 +1,26 @@ +import { expect, it } from 'vitest'; +import { inferNativeWorkStatus, type NativeEvidence } from '../src/native.js'; +const identity = { organizationId: 'org', workspaceId: 'rw_real', source: 'codex', sessionId: 'sess_real' }; +const fact: NativeEvidence = { + id: 'fact', + at: '2026-10-14T00:00:00Z', + kind: 'assistant', + type: null, + taskStatus: null, + toolName: null, +}; +it.each([ + [null, 'idle', 'no_activity'], + [{ ...fact, kind: 'task_complete' }, 'idle', 'turn_finished'], + [{ ...fact, kind: 'task', taskStatus: 'completed' }, 'done', 'completed'], + [{ ...fact, kind: 'tool_call', toolName: 'request_user_input' }, 'needs_attention', 'human_input'], + [ + { ...fact, kind: 'tool_call', toolName: 'request_user_input', type: 'tool_result' }, + 'working', + 'thinking', + ], + [{ ...fact, kind: 'tool_call' }, 'working', 'tool_running'], + [{ ...fact, kind: 'turn_aborted' }, 'idle', 'paused'], +] as const)('interprets normalized facts without a History dependency: %j', (evidence, state, reason) => { + expect(inferNativeWorkStatus(identity, evidence)).toMatchObject({ state, reason, basis: 'inferred' }); +}); diff --git a/packages/status/test/work.test.ts b/packages/status/test/work.test.ts new file mode 100644 index 000000000..d533dc60b --- /dev/null +++ b/packages/status/test/work.test.ts @@ -0,0 +1,94 @@ +import { readFileSync } from 'node:fs'; +import { describe, expect, it } from 'vitest'; +import { z } from 'zod'; +import { + initialSessionWorkStatus, + readSessionWorkStatus, + sessionWorkEvent, + sessionWorkStatus, + transitionSessionWorkStatus, + sessionStatusSchemas, +} from '../src/work.js'; + +const fixtures = JSON.parse( + readFileSync(new URL('../fixtures/session-status.v1.json', import.meta.url), 'utf8') +); +describe('work status v1 transition contract', () => { + for (const fixture of fixtures.reads) { + it(fixture.name, () => { + expect(readSessionWorkStatus(fixture.input, fixture.previous)).toEqual({ + status: fixture.expected, + stale: fixture.stale, + }); + }); + } + it('the exported bundle matches the owned schemas and transition fixtures', () => { + const bundle = JSON.parse( + readFileSync(new URL('../contracts/session-work.v1.json', import.meta.url), 'utf8') + ); + expect(bundle.fixtures).toEqual(fixtures); + expect(bundle.types).toEqual( + Object.fromEntries( + Object.entries(sessionStatusSchemas).map(([name, schema]) => [name, z.toJSONSchema(schema)]) + ) + ); + }); + for (const fixture of fixtures.cases) { + it(fixture.name, () => { + let current = sessionWorkStatus.parse(fixture.initial); + expect(initialSessionWorkStatus(current.identity)).toEqual(current); + for (const step of fixture.steps) { + const before = structuredClone(current); + const result = transitionSessionWorkStatus(current, step.event); + expect(result.outcome, step.event.eventId).toBe(step.outcome); + expect(result.status, step.event.eventId).toEqual(sessionWorkStatus.parse(step.expected)); + expect(current).toEqual(before); + current = result.status; + } + }); + } + const working = sessionWorkStatus.parse(fixtures.cases[0].steps[0].expected); + it.each([ + null, + {}, + { ...working, schemaVersion: 2 }, + { ...working, state: 'future_state' }, + { ...working, revision: 0 }, + { ...working, identity: { ...working.identity, workspaceId: 'another' } }, + ])('retains the last supported snapshot after a failed or incompatible read', (input) => { + expect(readSessionWorkStatus(input, working)).toEqual({ + status: working, + stale: true, + }); + }); + it('rejects malformed timestamps and unsafe revisions', () => { + expect( + sessionWorkStatus.safeParse({ + ...working, + revision: Number.MAX_SAFE_INTEGER + 1, + }).success + ).toBe(false); + expect(sessionWorkStatus.safeParse({ ...working, observedAt: 'yesterday' }).success).toBe(false); + expect( + sessionWorkEvent.safeParse({ + ...fixtures.cases[0].steps[0].event, + sequence: -1, + }).success + ).toBe(false); + }); + it('unknown producer names cannot mutate object prototypes', () => { + const initial = initialSessionWorkStatus(working.identity); + const result = transitionSessionWorkStatus(initial, { + ...fixtures.cases[0].steps[0].event, + producerId: '__proto__', + }); + expect(result.outcome).toBe('applied'); + expect(Object.hasOwn(result.status.producerSequences, '__proto__')).toBe(true); + expect( + transitionSessionWorkStatus(result.status, { + ...fixtures.cases[0].steps[0].event, + producerId: '__proto__', + }).outcome + ).toBe('duplicate'); + }); +}); diff --git a/packages/status/tsconfig.json b/packages/status/tsconfig.json new file mode 100644 index 000000000..5c5d393b0 --- /dev/null +++ b/packages/status/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "strict": true, + "declaration": true, + "outDir": "dist", + "rootDir": "src", + "skipLibCheck": true + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/status/vitest.config.ts b/packages/status/vitest.config.ts new file mode 100644 index 000000000..5102c6457 --- /dev/null +++ b/packages/status/vitest.config.ts @@ -0,0 +1 @@ +export default { test: { include: ['test/**/*.test.ts'] } }; From 39a8773d4ae035c4c43eaeab505f5b474c97356d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 14 Oct 2026 17:52:54 +0000 Subject: [PATCH 2/4] style: auto-format with Prettier --- .../contracts/communication-status.v1.json | 257 ++-------- .../status/contracts/session-work.v1.json | 473 ++++-------------- .../fixtures/communication-status.v1.json | 12 +- .../status/fixtures/session-status.v1.json | 304 +++-------- 4 files changed, 221 insertions(+), 825 deletions(-) diff --git a/packages/status/contracts/communication-status.v1.json b/packages/status/contracts/communication-status.v1.json index 470850e1a..f183e6a48 100644 --- a/packages/status/contracts/communication-status.v1.json +++ b/packages/status/contracts/communication-status.v1.json @@ -5,13 +5,7 @@ "CommunicationLabel": { "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "string", - "enum": [ - "open", - "knock", - "allow_list", - "busy", - "offline" - ] + "enum": ["open", "knock", "allow_list", "busy", "offline"] }, "CommunicationIdentity": { "$schema": "https://json-schema.org/draft/2020-12/schema", @@ -30,11 +24,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "agentId" - ], + "required": ["organizationId", "workspaceId", "agentId"], "additionalProperties": false }, "CommunicationPolicy": { @@ -61,11 +51,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "agentId" - ], + "required": ["organizationId", "workspaceId", "agentId"], "additionalProperties": false }, "revision": { @@ -75,18 +61,11 @@ }, "admission": { "type": "string", - "enum": [ - "open", - "knock", - "allow_list" - ] + "enum": ["open", "knock", "allow_list"] }, "interruption": { "type": "string", - "enum": [ - "available", - "busy" - ] + "enum": ["available", "busy"] }, "allowedAgentIds": { "type": "array", @@ -96,14 +75,7 @@ } } }, - "required": [ - "schemaVersion", - "recipient", - "revision", - "admission", - "interruption", - "allowedAgentIds" - ], + "required": ["schemaVersion", "recipient", "revision", "admission", "interruption", "allowedAgentIds"], "additionalProperties": false }, "CommunicationStatus": { @@ -137,11 +109,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "agentId" - ], + "required": ["organizationId", "workspaceId", "agentId"], "additionalProperties": false }, "revision": { @@ -151,18 +119,11 @@ }, "admission": { "type": "string", - "enum": [ - "open", - "knock", - "allow_list" - ] + "enum": ["open", "knock", "allow_list"] }, "interruption": { "type": "string", - "enum": [ - "available", - "busy" - ] + "enum": ["available", "busy"] }, "allowedAgentIds": { "type": "array", @@ -184,10 +145,7 @@ }, "connection": { "type": "string", - "enum": [ - "online", - "offline" - ] + "enum": ["online", "offline"] }, "queueSupported": { "type": "boolean" @@ -203,14 +161,7 @@ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" } }, - "required": [ - "schemaVersion", - "policy", - "connection", - "queueSupported", - "revision", - "observedAt" - ], + "required": ["schemaVersion", "policy", "connection", "queueSupported", "revision", "observedAt"], "additionalProperties": false }, "ConversationGrant": { @@ -241,11 +192,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "agentId" - ], + "required": ["organizationId", "workspaceId", "agentId"], "additionalProperties": false }, "sender": { @@ -264,11 +211,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "agentId" - ], + "required": ["organizationId", "workspaceId", "agentId"], "additionalProperties": false }, "conversationId": { @@ -277,13 +220,7 @@ }, "state": { "type": "string", - "enum": [ - "pending", - "approved", - "rejected", - "revoked", - "expired" - ] + "enum": ["pending", "approved", "rejected", "revoked", "expired"] }, "revision": { "type": "integer", @@ -332,11 +269,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "agentId" - ], + "required": ["organizationId", "workspaceId", "agentId"], "additionalProperties": false }, "recipient": { @@ -355,11 +288,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "agentId" - ], + "required": ["organizationId", "workspaceId", "agentId"], "additionalProperties": false }, "conversationId": { @@ -378,13 +307,7 @@ ] } }, - "required": [ - "id", - "sender", - "recipient", - "conversationId", - "inReplyTo" - ], + "required": ["id", "sender", "recipient", "conversationId", "inReplyTo"], "additionalProperties": false }, "AwaitedReply": { @@ -407,11 +330,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "agentId" - ], + "required": ["organizationId", "workspaceId", "agentId"], "additionalProperties": false }, "conversationId": { @@ -423,11 +342,7 @@ "minLength": 1 } }, - "required": [ - "sender", - "conversationId", - "requestId" - ], + "required": ["sender", "conversationId", "requestId"], "additionalProperties": false }, "CommunicationDecision": { @@ -436,13 +351,7 @@ "properties": { "action": { "type": "string", - "enum": [ - "deliver", - "request_approval", - "hold", - "queue", - "reject" - ] + "enum": ["deliver", "request_approval", "hold", "queue", "reject"] }, "reason": { "type": "string", @@ -467,11 +376,7 @@ "maximum": 9007199254740991 } }, - "required": [ - "action", - "reason", - "policyRevision" - ], + "required": ["action", "reason", "policyRevision"], "additionalProperties": false }, "CommunicationReceipt": { @@ -488,14 +393,7 @@ }, "state": { "type": "string", - "enum": [ - "pending_approval", - "held", - "queued", - "delivered", - "rejected", - "expired" - ] + "enum": ["pending_approval", "held", "queued", "delivered", "rejected", "expired"] }, "policyRevision": { "type": "integer", @@ -508,13 +406,7 @@ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" } }, - "required": [ - "schemaVersion", - "messageId", - "state", - "policyRevision", - "observedAt" - ], + "required": ["schemaVersion", "messageId", "state", "policyRevision", "observedAt"], "additionalProperties": false }, "CommunicationDecisionInput": { @@ -551,11 +443,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "agentId" - ], + "required": ["organizationId", "workspaceId", "agentId"], "additionalProperties": false }, "revision": { @@ -565,18 +453,11 @@ }, "admission": { "type": "string", - "enum": [ - "open", - "knock", - "allow_list" - ] + "enum": ["open", "knock", "allow_list"] }, "interruption": { "type": "string", - "enum": [ - "available", - "busy" - ] + "enum": ["available", "busy"] }, "allowedAgentIds": { "type": "array", @@ -598,10 +479,7 @@ }, "connection": { "type": "string", - "enum": [ - "online", - "offline" - ] + "enum": ["online", "offline"] }, "queueSupported": { "type": "boolean" @@ -617,14 +495,7 @@ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" } }, - "required": [ - "schemaVersion", - "policy", - "connection", - "queueSupported", - "revision", - "observedAt" - ], + "required": ["schemaVersion", "policy", "connection", "queueSupported", "revision", "observedAt"], "additionalProperties": false }, "message": { @@ -650,11 +521,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "agentId" - ], + "required": ["organizationId", "workspaceId", "agentId"], "additionalProperties": false }, "recipient": { @@ -673,11 +540,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "agentId" - ], + "required": ["organizationId", "workspaceId", "agentId"], "additionalProperties": false }, "conversationId": { @@ -696,13 +559,7 @@ ] } }, - "required": [ - "id", - "sender", - "recipient", - "conversationId", - "inReplyTo" - ], + "required": ["id", "sender", "recipient", "conversationId", "inReplyTo"], "additionalProperties": false }, "grants": { @@ -734,11 +591,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "agentId" - ], + "required": ["organizationId", "workspaceId", "agentId"], "additionalProperties": false }, "sender": { @@ -757,11 +610,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "agentId" - ], + "required": ["organizationId", "workspaceId", "agentId"], "additionalProperties": false }, "conversationId": { @@ -770,13 +619,7 @@ }, "state": { "type": "string", - "enum": [ - "pending", - "approved", - "rejected", - "revoked", - "expired" - ] + "enum": ["pending", "approved", "rejected", "revoked", "expired"] }, "revision": { "type": "integer", @@ -823,11 +666,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "agentId" - ], + "required": ["organizationId", "workspaceId", "agentId"], "additionalProperties": false }, "conversationId": { @@ -839,11 +678,7 @@ "minLength": 1 } }, - "required": [ - "sender", - "conversationId", - "requestId" - ], + "required": ["sender", "conversationId", "requestId"], "additionalProperties": false } }, @@ -853,13 +688,7 @@ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" } }, - "required": [ - "status", - "message", - "grants", - "awaitedReplies", - "now" - ], + "required": ["status", "message", "grants", "awaitedReplies", "now"], "additionalProperties": false } }, @@ -1481,9 +1310,7 @@ "revision": 1, "admission": "allow_list", "interruption": "available", - "allowedAgentIds": [ - "agent_sender" - ] + "allowedAgentIds": ["agent_sender"] }, "connection": "online", "queueSupported": true, @@ -1531,9 +1358,7 @@ "revision": 1, "admission": "allow_list", "interruption": "available", - "allowedAgentIds": [ - "another_agent" - ] + "allowedAgentIds": ["another_agent"] }, "connection": "online", "queueSupported": true, @@ -1803,9 +1628,7 @@ "revision": 1, "admission": "allow_list", "interruption": "busy", - "allowedAgentIds": [ - "agent_sender" - ] + "allowedAgentIds": ["agent_sender"] }, "connection": "offline", "queueSupported": true, diff --git a/packages/status/contracts/session-work.v1.json b/packages/status/contracts/session-work.v1.json index 072b6ab66..8ff9a3fa7 100644 --- a/packages/status/contracts/session-work.v1.json +++ b/packages/status/contracts/session-work.v1.json @@ -5,15 +5,7 @@ "SessionWorkState": { "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "string", - "enum": [ - "working", - "needs_attention", - "waiting_on_agent", - "idle", - "waiting_on_pr", - "done", - "archived" - ] + "enum": ["working", "needs_attention", "waiting_on_agent", "idle", "waiting_on_pr", "done", "archived"] }, "SessionWorkReason": { "$schema": "https://json-schema.org/draft/2020-12/schema", @@ -61,12 +53,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "source", - "sessionId" - ], + "required": ["organizationId", "workspaceId", "source", "sessionId"], "additionalProperties": false }, "SessionWorkDependency": { @@ -79,30 +66,18 @@ }, "kind": { "type": "string", - "enum": [ - "human", - "agent", - "pr" - ] + "enum": ["human", "agent", "pr"] }, "state": { "type": "string", - "enum": [ - "pending", - "resolved" - ] + "enum": ["pending", "resolved"] }, "target": { "type": "string", "minLength": 1 } }, - "required": [ - "id", - "kind", - "state", - "target" - ], + "required": ["id", "kind", "state", "target"], "additionalProperties": false }, "SessionWorkStatus": { @@ -133,12 +108,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "source", - "sessionId" - ], + "required": ["organizationId", "workspaceId", "source", "sessionId"], "additionalProperties": false }, "workEpisodeId": { @@ -195,10 +165,7 @@ }, "basis": { "type": "string", - "enum": [ - "observed", - "inferred" - ] + "enum": ["observed", "inferred"] }, "observedAt": { "anyOf": [ @@ -235,30 +202,18 @@ }, "kind": { "type": "string", - "enum": [ - "human", - "agent", - "pr" - ] + "enum": ["human", "agent", "pr"] }, "state": { "type": "string", - "enum": [ - "pending", - "resolved" - ] + "enum": ["pending", "resolved"] }, "target": { "type": "string", "minLength": 1 } }, - "required": [ - "id", - "kind", - "state", - "target" - ], + "required": ["id", "kind", "state", "target"], "additionalProperties": false } }, @@ -323,17 +278,10 @@ }, "basis": { "type": "string", - "enum": [ - "observed", - "inferred" - ] + "enum": ["observed", "inferred"] } }, - "required": [ - "state", - "reason", - "basis" - ], + "required": ["state", "reason", "basis"], "additionalProperties": false }, { @@ -389,12 +337,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "source", - "sessionId" - ], + "required": ["organizationId", "workspaceId", "source", "sessionId"], "additionalProperties": false }, "eventId": { @@ -476,12 +419,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "source", - "sessionId" - ], + "required": ["organizationId", "workspaceId", "source", "sessionId"], "additionalProperties": false }, "eventId": { @@ -524,12 +462,7 @@ }, "reason": { "type": "string", - "enum": [ - "thinking", - "tool_running", - "testing", - "coordinating" - ] + "enum": ["thinking", "tool_running", "testing", "coordinating"] } }, "required": [ @@ -573,12 +506,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "source", - "sessionId" - ], + "required": ["organizationId", "workspaceId", "source", "sessionId"], "additionalProperties": false }, "eventId": { @@ -644,30 +572,18 @@ }, "kind": { "type": "string", - "enum": [ - "human", - "agent", - "pr" - ] + "enum": ["human", "agent", "pr"] }, "state": { "type": "string", - "enum": [ - "pending", - "resolved" - ] + "enum": ["pending", "resolved"] }, "target": { "type": "string", "minLength": 1 } }, - "required": [ - "id", - "kind", - "state", - "target" - ], + "required": ["id", "kind", "state", "target"], "additionalProperties": false } } @@ -714,12 +630,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "source", - "sessionId" - ], + "required": ["organizationId", "workspaceId", "source", "sessionId"], "additionalProperties": false }, "eventId": { @@ -806,12 +717,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "source", - "sessionId" - ], + "required": ["organizationId", "workspaceId", "source", "sessionId"], "additionalProperties": false }, "eventId": { @@ -893,12 +799,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "source", - "sessionId" - ], + "required": ["organizationId", "workspaceId", "source", "sessionId"], "additionalProperties": false }, "eventId": { @@ -941,10 +842,7 @@ }, "reason": { "type": "string", - "enum": [ - "completed", - "merged" - ] + "enum": ["completed", "merged"] } }, "required": [ @@ -988,12 +886,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "source", - "sessionId" - ], + "required": ["organizationId", "workspaceId", "source", "sessionId"], "additionalProperties": false }, "eventId": { @@ -1075,12 +968,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "source", - "sessionId" - ], + "required": ["organizationId", "workspaceId", "source", "sessionId"], "additionalProperties": false }, "eventId": { @@ -1162,12 +1050,7 @@ "minLength": 1 } }, - "required": [ - "organizationId", - "workspaceId", - "source", - "sessionId" - ], + "required": ["organizationId", "workspaceId", "source", "sessionId"], "additionalProperties": false }, "eventId": { @@ -1285,9 +1168,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -1329,9 +1210,7 @@ "observedAt": "2026-10-13T12:02:00Z", "lastSeenAt": "2026-10-13T12:02:00Z", "dependencies": [], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -1372,9 +1251,7 @@ "observedAt": "2026-10-13T12:02:00Z", "lastSeenAt": "2026-10-13T14:00:00Z", "dependencies": [], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 3 }, @@ -1415,9 +1292,7 @@ "observedAt": "2026-10-13T12:04:00Z", "lastSeenAt": "2026-10-13T14:00:00Z", "dependencies": [], - "evidenceIds": [ - "e4" - ], + "evidenceIds": ["e4"], "producerSequences": { "runner": 4 }, @@ -1483,9 +1358,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -1542,9 +1415,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -1592,9 +1463,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 3 }, @@ -1642,9 +1511,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 4 }, @@ -1693,9 +1560,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 4 }, @@ -1744,9 +1609,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e6" - ], + "evidenceIds": ["e6"], "producerSequences": { "runner": 6 }, @@ -1795,9 +1658,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e7" - ], + "evidenceIds": ["e7"], "producerSequences": { "runner": 7 }, @@ -1863,9 +1724,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -1922,9 +1781,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -1972,9 +1829,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 3 }, @@ -2022,9 +1877,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 4 }, @@ -2073,9 +1926,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 4 }, @@ -2124,9 +1975,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e6" - ], + "evidenceIds": ["e6"], "producerSequences": { "runner": 6 }, @@ -2175,9 +2024,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e7" - ], + "evidenceIds": ["e7"], "producerSequences": { "runner": 7 }, @@ -2243,9 +2090,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -2302,9 +2147,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -2352,9 +2195,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 3 }, @@ -2402,9 +2243,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 4 }, @@ -2453,9 +2292,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 4 }, @@ -2504,9 +2341,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e6" - ], + "evidenceIds": ["e6"], "producerSequences": { "runner": 6 }, @@ -2555,9 +2390,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e7" - ], + "evidenceIds": ["e7"], "producerSequences": { "runner": 7 }, @@ -2623,9 +2456,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -2682,9 +2513,7 @@ "target": "agent_1" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -2733,9 +2562,7 @@ "target": "agent_1" } ], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -2783,9 +2610,7 @@ "target": "agent_1" } ], - "evidenceIds": [ - "e4" - ], + "evidenceIds": ["e4"], "producerSequences": { "runner": 4 }, @@ -2851,9 +2676,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -2922,9 +2745,7 @@ "target": "https://github.com/a/b/pull/2" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -2979,9 +2800,7 @@ "target": "https://github.com/a/b/pull/2" } ], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -3036,9 +2855,7 @@ "target": "https://github.com/a/b/pull/2" } ], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -3093,9 +2910,7 @@ "target": "https://github.com/a/b/pull/2" } ], - "evidenceIds": [ - "e5" - ], + "evidenceIds": ["e5"], "producerSequences": { "runner": 5 }, @@ -3150,9 +2965,7 @@ "target": "https://github.com/a/b/pull/2" } ], - "evidenceIds": [ - "e6" - ], + "evidenceIds": ["e6"], "producerSequences": { "runner": 6 }, @@ -3218,9 +3031,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3262,9 +3073,7 @@ "observedAt": "2026-10-13T12:02:00Z", "lastSeenAt": "2026-10-13T12:02:00Z", "dependencies": [], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -3305,9 +3114,7 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -3349,9 +3156,7 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -3393,9 +3198,7 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -3436,9 +3239,7 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -3504,9 +3305,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3548,9 +3347,7 @@ "observedAt": "2026-10-13T12:02:00Z", "lastSeenAt": "2026-10-13T12:02:00Z", "dependencies": [], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -3591,9 +3388,7 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -3639,9 +3434,7 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -3686,9 +3479,7 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:05:00Z", "dependencies": [], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 5 }, @@ -3733,9 +3524,7 @@ "observedAt": "2026-10-13T12:06:00Z", "lastSeenAt": "2026-10-13T12:06:00Z", "dependencies": [], - "evidenceIds": [ - "e6" - ], + "evidenceIds": ["e6"], "producerSequences": { "runner": 6 }, @@ -3801,9 +3590,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3844,9 +3631,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3887,9 +3672,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3955,9 +3738,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4014,9 +3795,7 @@ "target": "user_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -4079,9 +3858,7 @@ "target": "agent_a" } ], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -4136,9 +3913,7 @@ "target": "agent_a" } ], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -4204,9 +3979,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4248,9 +4021,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4316,9 +4087,7 @@ "observedAt": "2026-10-13T13:01:00Z", "lastSeenAt": "2026-10-13T13:01:00Z", "dependencies": [], - "evidenceIds": [ - "archive_1" - ], + "evidenceIds": ["archive_1"], "producerSequences": { "desktop": 1 }, @@ -4363,9 +4132,7 @@ "observedAt": "2026-10-13T13:01:00Z", "lastSeenAt": "2026-10-13T13:02:00Z", "dependencies": [], - "evidenceIds": [ - "archive_1" - ], + "evidenceIds": ["archive_1"], "producerSequences": { "desktop": 2 }, @@ -4410,9 +4177,7 @@ "observedAt": "2026-10-13T13:03:00Z", "lastSeenAt": "2026-10-13T13:03:00Z", "dependencies": [], - "evidenceIds": [ - "archive_3" - ], + "evidenceIds": ["archive_3"], "producerSequences": { "desktop": 3 }, @@ -4441,9 +4206,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4466,9 +4229,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4494,9 +4255,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4518,9 +4277,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4542,9 +4299,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4570,9 +4325,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4594,9 +4347,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4618,9 +4369,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4646,9 +4395,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4670,9 +4417,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4694,9 +4439,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4722,9 +4465,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4746,9 +4487,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4770,9 +4509,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4798,9 +4535,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4822,9 +4557,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -4846,9 +4579,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, diff --git a/packages/status/fixtures/communication-status.v1.json b/packages/status/fixtures/communication-status.v1.json index 15b293f0c..3a8a5d095 100644 --- a/packages/status/fixtures/communication-status.v1.json +++ b/packages/status/fixtures/communication-status.v1.json @@ -616,9 +616,7 @@ "revision": 1, "admission": "allow_list", "interruption": "available", - "allowedAgentIds": [ - "agent_sender" - ] + "allowedAgentIds": ["agent_sender"] }, "connection": "online", "queueSupported": true, @@ -666,9 +664,7 @@ "revision": 1, "admission": "allow_list", "interruption": "available", - "allowedAgentIds": [ - "another_agent" - ] + "allowedAgentIds": ["another_agent"] }, "connection": "online", "queueSupported": true, @@ -938,9 +934,7 @@ "revision": 1, "admission": "allow_list", "interruption": "busy", - "allowedAgentIds": [ - "agent_sender" - ] + "allowedAgentIds": ["agent_sender"] }, "connection": "offline", "queueSupported": true, diff --git a/packages/status/fixtures/session-status.v1.json b/packages/status/fixtures/session-status.v1.json index a2ee70b29..230bf8118 100644 --- a/packages/status/fixtures/session-status.v1.json +++ b/packages/status/fixtures/session-status.v1.json @@ -58,9 +58,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -102,9 +100,7 @@ "observedAt": "2026-10-13T12:02:00Z", "lastSeenAt": "2026-10-13T12:02:00Z", "dependencies": [], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -145,9 +141,7 @@ "observedAt": "2026-10-13T12:02:00Z", "lastSeenAt": "2026-10-13T14:00:00Z", "dependencies": [], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 3 }, @@ -188,9 +182,7 @@ "observedAt": "2026-10-13T12:04:00Z", "lastSeenAt": "2026-10-13T14:00:00Z", "dependencies": [], - "evidenceIds": [ - "e4" - ], + "evidenceIds": ["e4"], "producerSequences": { "runner": 4 }, @@ -256,9 +248,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -315,9 +305,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -365,9 +353,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 3 }, @@ -415,9 +401,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 4 }, @@ -466,9 +450,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 4 }, @@ -517,9 +499,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e6" - ], + "evidenceIds": ["e6"], "producerSequences": { "runner": 6 }, @@ -568,9 +548,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e7" - ], + "evidenceIds": ["e7"], "producerSequences": { "runner": 7 }, @@ -636,9 +614,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -695,9 +671,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -745,9 +719,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 3 }, @@ -795,9 +767,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 4 }, @@ -846,9 +816,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 4 }, @@ -897,9 +865,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e6" - ], + "evidenceIds": ["e6"], "producerSequences": { "runner": 6 }, @@ -948,9 +914,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e7" - ], + "evidenceIds": ["e7"], "producerSequences": { "runner": 7 }, @@ -1016,9 +980,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -1075,9 +1037,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -1125,9 +1085,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 3 }, @@ -1175,9 +1133,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 4 }, @@ -1226,9 +1182,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 4 }, @@ -1277,9 +1231,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e6" - ], + "evidenceIds": ["e6"], "producerSequences": { "runner": 6 }, @@ -1328,9 +1280,7 @@ "target": "target_a" } ], - "evidenceIds": [ - "e7" - ], + "evidenceIds": ["e7"], "producerSequences": { "runner": 7 }, @@ -1396,9 +1346,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -1455,9 +1403,7 @@ "target": "agent_1" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -1506,9 +1452,7 @@ "target": "agent_1" } ], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -1556,9 +1500,7 @@ "target": "agent_1" } ], - "evidenceIds": [ - "e4" - ], + "evidenceIds": ["e4"], "producerSequences": { "runner": 4 }, @@ -1624,9 +1566,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -1695,9 +1635,7 @@ "target": "https://github.com/a/b/pull/2" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -1752,9 +1690,7 @@ "target": "https://github.com/a/b/pull/2" } ], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -1809,9 +1745,7 @@ "target": "https://github.com/a/b/pull/2" } ], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -1866,9 +1800,7 @@ "target": "https://github.com/a/b/pull/2" } ], - "evidenceIds": [ - "e5" - ], + "evidenceIds": ["e5"], "producerSequences": { "runner": 5 }, @@ -1923,9 +1855,7 @@ "target": "https://github.com/a/b/pull/2" } ], - "evidenceIds": [ - "e6" - ], + "evidenceIds": ["e6"], "producerSequences": { "runner": 6 }, @@ -1991,9 +1921,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -2035,9 +1963,7 @@ "observedAt": "2026-10-13T12:02:00Z", "lastSeenAt": "2026-10-13T12:02:00Z", "dependencies": [], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -2078,9 +2004,7 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -2122,9 +2046,7 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -2166,9 +2088,7 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -2209,9 +2129,7 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -2277,9 +2195,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -2321,9 +2237,7 @@ "observedAt": "2026-10-13T12:02:00Z", "lastSeenAt": "2026-10-13T12:02:00Z", "dependencies": [], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -2364,9 +2278,7 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -2412,9 +2324,7 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -2459,9 +2369,7 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:05:00Z", "dependencies": [], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 5 }, @@ -2506,9 +2414,7 @@ "observedAt": "2026-10-13T12:06:00Z", "lastSeenAt": "2026-10-13T12:06:00Z", "dependencies": [], - "evidenceIds": [ - "e6" - ], + "evidenceIds": ["e6"], "producerSequences": { "runner": 6 }, @@ -2574,9 +2480,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -2617,9 +2521,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -2660,9 +2562,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -2728,9 +2628,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -2787,9 +2685,7 @@ "target": "user_a" } ], - "evidenceIds": [ - "e2" - ], + "evidenceIds": ["e2"], "producerSequences": { "runner": 2 }, @@ -2852,9 +2748,7 @@ "target": "agent_a" } ], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -2909,9 +2803,7 @@ "target": "agent_a" } ], - "evidenceIds": [ - "e3" - ], + "evidenceIds": ["e3"], "producerSequences": { "runner": 3 }, @@ -2977,9 +2869,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3021,9 +2911,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3089,9 +2977,7 @@ "observedAt": "2026-10-13T13:01:00Z", "lastSeenAt": "2026-10-13T13:01:00Z", "dependencies": [], - "evidenceIds": [ - "archive_1" - ], + "evidenceIds": ["archive_1"], "producerSequences": { "desktop": 1 }, @@ -3136,9 +3022,7 @@ "observedAt": "2026-10-13T13:01:00Z", "lastSeenAt": "2026-10-13T13:02:00Z", "dependencies": [], - "evidenceIds": [ - "archive_1" - ], + "evidenceIds": ["archive_1"], "producerSequences": { "desktop": 2 }, @@ -3183,9 +3067,7 @@ "observedAt": "2026-10-13T13:03:00Z", "lastSeenAt": "2026-10-13T13:03:00Z", "dependencies": [], - "evidenceIds": [ - "archive_3" - ], + "evidenceIds": ["archive_3"], "producerSequences": { "desktop": 3 }, @@ -3214,9 +3096,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3239,9 +3119,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3267,9 +3145,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3291,9 +3167,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3315,9 +3189,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3343,9 +3215,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3367,9 +3237,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3391,9 +3259,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3419,9 +3285,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3443,9 +3307,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3467,9 +3329,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3495,9 +3355,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3519,9 +3377,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3543,9 +3399,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3571,9 +3425,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3595,9 +3447,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, @@ -3619,9 +3469,7 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": [ - "e1" - ], + "evidenceIds": ["e1"], "producerSequences": { "runner": 1 }, From b35e5876536992abbe6bd7efd7552571ee9476a0 Mon Sep 17 00:00:00 2001 From: Will Washburn Date: Wed, 14 Oct 2026 10:57:50 -0700 Subject: [PATCH 3/4] refactor(status): share PR completion and wait semantics --- packages/status/README.md | 4 +- packages/status/package.json | 7 +- packages/status/src/index.ts | 1 + packages/status/src/pr.ts | 130 ++++++++++++++++++++++++++++++++ packages/status/test/pr.test.ts | 102 +++++++++++++++++++++++++ 5 files changed, 242 insertions(+), 2 deletions(-) create mode 100644 packages/status/src/pr.ts create mode 100644 packages/status/test/pr.test.ts diff --git a/packages/status/README.md b/packages/status/README.md index dd8cef9a9..095a588b4 100644 --- a/packages/status/README.md +++ b/packages/status/README.md @@ -1,6 +1,6 @@ # Relay status core -One portable owner for work status, communication policy, native-evidence interpretation, and transition fixtures. No database, hosted service, transport, or harness parser dependencies. +One portable owner for work status, communication policy, native-evidence interpretation, PR completion rules, and transition fixtures. No database, hosted service, transport, or harness parser dependencies. - Work: working, needs attention, waiting on agent, idle, waiting on PR, done, archived. Reasons explain the current activity or blocker. Freshness is separate; silence never changes state. - Communication: Open, Knock, Allow list, Busy, Offline. Admission policy survives disconnects and Busy. Delivery adapters must recheck policy immediately before injection. @@ -8,3 +8,5 @@ One portable owner for work status, communication policy, native-evidence interp - Cloud persists hosted projections and supplies PR facts. Desktop persists local projections. Both apply these rules; native-language consumers generate wire types from the exported JSON and run the same fixtures. `npm run contracts` regenerates schemas and fixtures. `npm run contracts:check` detects drift. Run `npm test` for reference semantics. Publication follows the normal Relay release process; creating this package does not enable live delivery enforcement. + +PR adapters supply fresh, stable-head provider facts and a durable event ID. Core checks episode identity, complete declared dependencies, evidence age, and all required merges before producing a transition. diff --git a/packages/status/package.json b/packages/status/package.json index c567aa5d1..60e892bf3 100644 --- a/packages/status/package.json +++ b/packages/status/package.json @@ -24,7 +24,12 @@ "import": "./dist/native.js", "default": "./dist/native.js" }, - "./contracts/*": "./contracts/*" + "./contracts/*": "./contracts/*", + "./pr": { + "types": "./dist/pr.d.ts", + "import": "./dist/pr.js", + "default": "./dist/pr.js" + } }, "files": [ "dist", diff --git a/packages/status/src/index.ts b/packages/status/src/index.ts index a8da2184b..205e477bf 100644 --- a/packages/status/src/index.ts +++ b/packages/status/src/index.ts @@ -1,3 +1,4 @@ export * from './work.js'; export * from './communication.js'; export * from './native.js'; +export * from './pr.js'; diff --git a/packages/status/src/pr.ts b/packages/status/src/pr.ts new file mode 100644 index 000000000..f0d76d5c0 --- /dev/null +++ b/packages/status/src/pr.ts @@ -0,0 +1,130 @@ +import { z } from 'zod'; +import { + sessionWorkStatus, + sessionWorkEvent, + type SessionWorkEvent, + type SessionWorkStatus, +} from './work.js'; + +const instant = z.iso.datetime({ offset: true }); +export const prWorkEvidence = z.strictObject({ + url: z.url().regex(/^https:\/\/github\.com\/[^/]+\/[^/]+\/pull\/[1-9]\d*$/), + headSha: z.string().regex(/^[0-9a-f]{40,64}$/i), + state: z.enum(['open', 'closed', 'merged']), + review: z.enum(['approved', 'changes_requested', 'pending']), + checks: z.enum(['success', 'pending', 'failure']), + observedAt: instant, + mergedAt: instant.nullable(), +}); +export type PrWorkEvidence = z.infer; +export const prWorkEpisode = z + .strictObject({ + identity: sessionWorkStatus.shape.identity, + workEpisodeId: z.string().min(1), + // Explicit, immutable completion requirements. Transcript/contributor links never populate this. + required: z + .array(z.strictObject({ dependencyId: z.string().min(1), url: prWorkEvidence.shape.url })) + .min(1) + .max(100), + }) + .superRefine((value, ctx) => { + if ( + new Set(value.required.map((p) => p.dependencyId)).size !== value.required.length || + new Set(value.required.map((p) => p.url.toLowerCase())).size !== value.required.length + ) + ctx.addIssue({ code: 'custom', message: 'Duplicate PR requirement' }); + }); +export type PrWorkEpisode = z.infer; +const canonical = (url: string) => url.toLowerCase(); + +/** One event at a time. The adapter supplies a durable event ID and persists the event before submission. */ +export function nextPrWorkEvent(input: { + episode: PrWorkEpisode; + status: SessionWorkStatus; + evidence: PrWorkEvidence[]; + now: string; + producerId: string; + eventId: string; +}): SessionWorkEvent | null { + const episode = prWorkEpisode.parse(input.episode); + const status = sessionWorkStatus.parse(input.status); + if ( + JSON.stringify(episode.identity) !== JSON.stringify(status.identity) || + episode.workEpisodeId !== status.workEpisodeId || + !['waiting_on_pr', 'idle'].includes(status.state) + ) + return null; + // A late PR producer cannot interrupt working or resolve a human/agent wait. + if (status.dependencies.some((d) => d.state === 'pending' && d.kind !== 'pr')) return null; + const evidence = new Map( + input.evidence.map((e) => { + const p = prWorkEvidence.parse(e); + return [canonical(p.url), p]; + }) + ); + const now = Date.parse(input.now); + if (status.dependencies.filter((d) => d.kind === 'pr').length !== episode.required.length) return null; + const required = episode.required.map((p) => ({ + ...p, + snapshot: evidence.get(canonical(p.url)), + dependency: status.dependencies.find( + (d) => d.id === p.dependencyId && d.kind === 'pr' && canonical(d.target) === canonical(p.url) + ), + })); + // Require a complete, fresh set, including already-resolved dependencies. No historical merge completion. + if ( + required.some( + (p) => + !p.dependency || + !p.snapshot || + now - Date.parse(p.snapshot.observedAt) > 300_000 || + Date.parse(p.snapshot.observedAt) > now || + p.snapshot.state === 'closed' + ) + ) + return null; + const producerId = input.producerId; + const sequence = (status.producerSequences[producerId] ?? 0) + 1; + const common = { + schemaVersion: 1 as const, + identity: episode.identity, + workEpisodeId: episode.workEpisodeId, + producerId, + sequence, + expectedRevision: status.revision, + observedAt: input.now, + eventId: input.eventId, + }; + const merged = required.find( + (p) => p.snapshot!.state === 'merged' && p.snapshot!.mergedAt && p.dependency!.state === 'pending' + ); + if (merged) + return sessionWorkEvent.parse({ + ...common, + kind: 'resolve_dependency', + dependencyId: merged.dependencyId, + }); + if ( + required.every( + (p) => p.snapshot!.state === 'merged' && p.snapshot!.mergedAt && p.dependency!.state === 'resolved' + ) && + status.dependencies.every((d) => d.state === 'resolved') + ) { + return sessionWorkEvent.parse({ ...common, kind: 'complete', reason: 'merged' }); + } + const pending = required.filter((p) => p.dependency!.state === 'pending'); + if (!pending.length || status.state !== 'waiting_on_pr') return null; + // Check/review failure does not invent a human blocker: the runner owns that transition. + const reason = pending.some((p) => p.snapshot!.checks !== 'success') + ? 'pr_ci' + : pending.some((p) => p.snapshot!.review !== 'approved') + ? 'pr_review' + : 'pr_merge'; + if (status.reason === reason) return null; + return sessionWorkEvent.parse({ + ...common, + kind: 'wait', + reason, + dependencies: pending.map((p) => p.dependency), + }); +} diff --git a/packages/status/test/pr.test.ts b/packages/status/test/pr.test.ts new file mode 100644 index 000000000..ac2904d49 --- /dev/null +++ b/packages/status/test/pr.test.ts @@ -0,0 +1,102 @@ +import { describe, it, expect } from 'vitest'; +import { + initialSessionWorkStatus, + transitionSessionWorkStatus, + type SessionWorkStatus, +} from '../src/work.js'; +import { nextPrWorkEvent, type PrWorkEvidence, type PrWorkEpisode } from '../src/pr.js'; +const now = '2026-10-13T12:00:00Z'; +const identity = { organizationId: 'org', workspaceId: 'workspace', source: 'codex', sessionId: 'session' }; +const url = 'https://github.com/acme/repo/pull/1'; +const episode: PrWorkEpisode = { + identity, + workEpisodeId: 'episode_1', + required: [{ dependencyId: 'pr1', url }], +}; +const snapshot: PrWorkEvidence = { + url, + headSha: 'a'.repeat(40), + state: 'merged', + mergedAt: now, + observedAt: now, + review: 'approved', + checks: 'success', +}; +const status = (): SessionWorkStatus => ({ + ...initialSessionWorkStatus(identity), + workEpisodeId: 'episode_1', + revision: 5, + state: 'waiting_on_pr', + reason: 'pr_ci', + dependencies: [{ id: 'pr1', target: url, kind: 'pr', state: 'pending' }], +}); +const next = (s = status(), evidence = [snapshot], e = episode) => + nextPrWorkEvent({ + episode: e, + status: s, + evidence, + now, + producerId: 'cloud-pr-v1', + eventId: `pr-event-${s.revision}`, + }); + +describe('episode-scoped PR work evidence', () => { + it("resolves a required merge before finishing and replays Relay core's real reducer", () => { + const resolve = next()!; + expect(resolve.kind).toBe('resolve_dependency'); + const resolved = transitionSessionWorkStatus(status(), resolve); + expect(resolved.outcome).toBe('applied'); + const complete = next(resolved.status)!; + expect(complete.kind).toBe('complete'); + expect(transitionSessionWorkStatus(resolved.status, complete).status.state).toBe('done'); + }); + it.each(['working', 'needs_attention', 'waiting_on_agent', 'done', 'archived'] as const)( + 'never overwrites %s with a merge', + (state) => { + expect(next({ ...status(), state })).toBeNull(); + } + ); + it('refuses a historical episode, contributor link, different tenant, stale evidence, or undeclared dependency', () => { + expect(next({ ...status(), workEpisodeId: 'new-work' })).toBeNull(); + expect( + next(status(), [snapshot], { ...episode, required: [{ dependencyId: 'contributor', url }] }) + ).toBeNull(); + expect(next({ ...status(), identity: { ...identity, workspaceId: 'other' } })).toBeNull(); + expect(next(status(), [{ ...snapshot, observedAt: '2026-10-13T11:00:00Z' }])).toBeNull(); + expect(next({ ...status(), dependencies: [] })).toBeNull(); + }); + it('does not finish until every required PR is merged and every dependency is resolved', () => { + const second = { dependencyId: 'pr2', url: url.replace('/1', '/2') }; + const both = { ...episode, required: [...episode.required, second] }; + const s = { + ...status(), + dependencies: [ + ...status().dependencies, + { id: 'pr2', target: second.url, kind: 'pr' as const, state: 'pending' as const }, + ], + }; + expect(next(s, [snapshot], both)).toBeNull(); + const evidence = [snapshot, { ...snapshot, url: second.url, state: 'open' as const, mergedAt: null }]; + const resolved = transitionSessionWorkStatus(s, next(s, evidence, both)!).status; + expect(next(resolved, evidence, both)?.kind).not.toBe('complete'); + expect( + next({ + ...status(), + dependencies: [ + ...status().dependencies, + { id: 'human', kind: 'human', target: 'owner', state: 'pending' }, + ], + }) + ).toBeNull(); + }); + it('rechecks review/CI reasons without declaring failures human blockers', () => { + expect( + next(status(), [{ ...snapshot, state: 'open', checks: 'success', review: 'pending' }]) + ).toMatchObject({ kind: 'wait', reason: 'pr_review' }); + expect(next(status(), [{ ...snapshot, state: 'open' }])).toMatchObject({ + kind: 'wait', + reason: 'pr_merge', + }); + expect(next(status(), [{ ...snapshot, state: 'closed', mergedAt: null }])).toBeNull(); + }); +}); From 20575e052abc709e615ffabfb382a9d9d635d497 Mon Sep 17 00:00:00 2001 From: Will Washburn Date: Wed, 14 Oct 2026 10:59:20 -0700 Subject: [PATCH 4/4] build(status): preserve canonical generated contract formatting --- .prettierignore | 3 + .../contracts/communication-status.v1.json | 257 ++++++++-- .../status/contracts/session-work.v1.json | 473 ++++++++++++++---- 3 files changed, 591 insertions(+), 142 deletions(-) diff --git a/.prettierignore b/.prettierignore index 2085ab091..c3a209c14 100644 --- a/.prettierignore +++ b/.prettierignore @@ -9,3 +9,6 @@ packages/config/src/cli-registry.generated.ts tests/benchmarks/head-to-head.ts .agentworkforce/trajectories/ .trajectories/ + +# Owner-generated status bundles use the exporter canonical JSON format. +packages/status/contracts/*.json diff --git a/packages/status/contracts/communication-status.v1.json b/packages/status/contracts/communication-status.v1.json index f183e6a48..470850e1a 100644 --- a/packages/status/contracts/communication-status.v1.json +++ b/packages/status/contracts/communication-status.v1.json @@ -5,7 +5,13 @@ "CommunicationLabel": { "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "string", - "enum": ["open", "knock", "allow_list", "busy", "offline"] + "enum": [ + "open", + "knock", + "allow_list", + "busy", + "offline" + ] }, "CommunicationIdentity": { "$schema": "https://json-schema.org/draft/2020-12/schema", @@ -24,7 +30,11 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "agentId"], + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], "additionalProperties": false }, "CommunicationPolicy": { @@ -51,7 +61,11 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "agentId"], + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], "additionalProperties": false }, "revision": { @@ -61,11 +75,18 @@ }, "admission": { "type": "string", - "enum": ["open", "knock", "allow_list"] + "enum": [ + "open", + "knock", + "allow_list" + ] }, "interruption": { "type": "string", - "enum": ["available", "busy"] + "enum": [ + "available", + "busy" + ] }, "allowedAgentIds": { "type": "array", @@ -75,7 +96,14 @@ } } }, - "required": ["schemaVersion", "recipient", "revision", "admission", "interruption", "allowedAgentIds"], + "required": [ + "schemaVersion", + "recipient", + "revision", + "admission", + "interruption", + "allowedAgentIds" + ], "additionalProperties": false }, "CommunicationStatus": { @@ -109,7 +137,11 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "agentId"], + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], "additionalProperties": false }, "revision": { @@ -119,11 +151,18 @@ }, "admission": { "type": "string", - "enum": ["open", "knock", "allow_list"] + "enum": [ + "open", + "knock", + "allow_list" + ] }, "interruption": { "type": "string", - "enum": ["available", "busy"] + "enum": [ + "available", + "busy" + ] }, "allowedAgentIds": { "type": "array", @@ -145,7 +184,10 @@ }, "connection": { "type": "string", - "enum": ["online", "offline"] + "enum": [ + "online", + "offline" + ] }, "queueSupported": { "type": "boolean" @@ -161,7 +203,14 @@ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" } }, - "required": ["schemaVersion", "policy", "connection", "queueSupported", "revision", "observedAt"], + "required": [ + "schemaVersion", + "policy", + "connection", + "queueSupported", + "revision", + "observedAt" + ], "additionalProperties": false }, "ConversationGrant": { @@ -192,7 +241,11 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "agentId"], + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], "additionalProperties": false }, "sender": { @@ -211,7 +264,11 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "agentId"], + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], "additionalProperties": false }, "conversationId": { @@ -220,7 +277,13 @@ }, "state": { "type": "string", - "enum": ["pending", "approved", "rejected", "revoked", "expired"] + "enum": [ + "pending", + "approved", + "rejected", + "revoked", + "expired" + ] }, "revision": { "type": "integer", @@ -269,7 +332,11 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "agentId"], + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], "additionalProperties": false }, "recipient": { @@ -288,7 +355,11 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "agentId"], + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], "additionalProperties": false }, "conversationId": { @@ -307,7 +378,13 @@ ] } }, - "required": ["id", "sender", "recipient", "conversationId", "inReplyTo"], + "required": [ + "id", + "sender", + "recipient", + "conversationId", + "inReplyTo" + ], "additionalProperties": false }, "AwaitedReply": { @@ -330,7 +407,11 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "agentId"], + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], "additionalProperties": false }, "conversationId": { @@ -342,7 +423,11 @@ "minLength": 1 } }, - "required": ["sender", "conversationId", "requestId"], + "required": [ + "sender", + "conversationId", + "requestId" + ], "additionalProperties": false }, "CommunicationDecision": { @@ -351,7 +436,13 @@ "properties": { "action": { "type": "string", - "enum": ["deliver", "request_approval", "hold", "queue", "reject"] + "enum": [ + "deliver", + "request_approval", + "hold", + "queue", + "reject" + ] }, "reason": { "type": "string", @@ -376,7 +467,11 @@ "maximum": 9007199254740991 } }, - "required": ["action", "reason", "policyRevision"], + "required": [ + "action", + "reason", + "policyRevision" + ], "additionalProperties": false }, "CommunicationReceipt": { @@ -393,7 +488,14 @@ }, "state": { "type": "string", - "enum": ["pending_approval", "held", "queued", "delivered", "rejected", "expired"] + "enum": [ + "pending_approval", + "held", + "queued", + "delivered", + "rejected", + "expired" + ] }, "policyRevision": { "type": "integer", @@ -406,7 +508,13 @@ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" } }, - "required": ["schemaVersion", "messageId", "state", "policyRevision", "observedAt"], + "required": [ + "schemaVersion", + "messageId", + "state", + "policyRevision", + "observedAt" + ], "additionalProperties": false }, "CommunicationDecisionInput": { @@ -443,7 +551,11 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "agentId"], + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], "additionalProperties": false }, "revision": { @@ -453,11 +565,18 @@ }, "admission": { "type": "string", - "enum": ["open", "knock", "allow_list"] + "enum": [ + "open", + "knock", + "allow_list" + ] }, "interruption": { "type": "string", - "enum": ["available", "busy"] + "enum": [ + "available", + "busy" + ] }, "allowedAgentIds": { "type": "array", @@ -479,7 +598,10 @@ }, "connection": { "type": "string", - "enum": ["online", "offline"] + "enum": [ + "online", + "offline" + ] }, "queueSupported": { "type": "boolean" @@ -495,7 +617,14 @@ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" } }, - "required": ["schemaVersion", "policy", "connection", "queueSupported", "revision", "observedAt"], + "required": [ + "schemaVersion", + "policy", + "connection", + "queueSupported", + "revision", + "observedAt" + ], "additionalProperties": false }, "message": { @@ -521,7 +650,11 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "agentId"], + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], "additionalProperties": false }, "recipient": { @@ -540,7 +673,11 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "agentId"], + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], "additionalProperties": false }, "conversationId": { @@ -559,7 +696,13 @@ ] } }, - "required": ["id", "sender", "recipient", "conversationId", "inReplyTo"], + "required": [ + "id", + "sender", + "recipient", + "conversationId", + "inReplyTo" + ], "additionalProperties": false }, "grants": { @@ -591,7 +734,11 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "agentId"], + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], "additionalProperties": false }, "sender": { @@ -610,7 +757,11 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "agentId"], + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], "additionalProperties": false }, "conversationId": { @@ -619,7 +770,13 @@ }, "state": { "type": "string", - "enum": ["pending", "approved", "rejected", "revoked", "expired"] + "enum": [ + "pending", + "approved", + "rejected", + "revoked", + "expired" + ] }, "revision": { "type": "integer", @@ -666,7 +823,11 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "agentId"], + "required": [ + "organizationId", + "workspaceId", + "agentId" + ], "additionalProperties": false }, "conversationId": { @@ -678,7 +839,11 @@ "minLength": 1 } }, - "required": ["sender", "conversationId", "requestId"], + "required": [ + "sender", + "conversationId", + "requestId" + ], "additionalProperties": false } }, @@ -688,7 +853,13 @@ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" } }, - "required": ["status", "message", "grants", "awaitedReplies", "now"], + "required": [ + "status", + "message", + "grants", + "awaitedReplies", + "now" + ], "additionalProperties": false } }, @@ -1310,7 +1481,9 @@ "revision": 1, "admission": "allow_list", "interruption": "available", - "allowedAgentIds": ["agent_sender"] + "allowedAgentIds": [ + "agent_sender" + ] }, "connection": "online", "queueSupported": true, @@ -1358,7 +1531,9 @@ "revision": 1, "admission": "allow_list", "interruption": "available", - "allowedAgentIds": ["another_agent"] + "allowedAgentIds": [ + "another_agent" + ] }, "connection": "online", "queueSupported": true, @@ -1628,7 +1803,9 @@ "revision": 1, "admission": "allow_list", "interruption": "busy", - "allowedAgentIds": ["agent_sender"] + "allowedAgentIds": [ + "agent_sender" + ] }, "connection": "offline", "queueSupported": true, diff --git a/packages/status/contracts/session-work.v1.json b/packages/status/contracts/session-work.v1.json index 8ff9a3fa7..072b6ab66 100644 --- a/packages/status/contracts/session-work.v1.json +++ b/packages/status/contracts/session-work.v1.json @@ -5,7 +5,15 @@ "SessionWorkState": { "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "string", - "enum": ["working", "needs_attention", "waiting_on_agent", "idle", "waiting_on_pr", "done", "archived"] + "enum": [ + "working", + "needs_attention", + "waiting_on_agent", + "idle", + "waiting_on_pr", + "done", + "archived" + ] }, "SessionWorkReason": { "$schema": "https://json-schema.org/draft/2020-12/schema", @@ -53,7 +61,12 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "source", "sessionId"], + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], "additionalProperties": false }, "SessionWorkDependency": { @@ -66,18 +79,30 @@ }, "kind": { "type": "string", - "enum": ["human", "agent", "pr"] + "enum": [ + "human", + "agent", + "pr" + ] }, "state": { "type": "string", - "enum": ["pending", "resolved"] + "enum": [ + "pending", + "resolved" + ] }, "target": { "type": "string", "minLength": 1 } }, - "required": ["id", "kind", "state", "target"], + "required": [ + "id", + "kind", + "state", + "target" + ], "additionalProperties": false }, "SessionWorkStatus": { @@ -108,7 +133,12 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "source", "sessionId"], + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], "additionalProperties": false }, "workEpisodeId": { @@ -165,7 +195,10 @@ }, "basis": { "type": "string", - "enum": ["observed", "inferred"] + "enum": [ + "observed", + "inferred" + ] }, "observedAt": { "anyOf": [ @@ -202,18 +235,30 @@ }, "kind": { "type": "string", - "enum": ["human", "agent", "pr"] + "enum": [ + "human", + "agent", + "pr" + ] }, "state": { "type": "string", - "enum": ["pending", "resolved"] + "enum": [ + "pending", + "resolved" + ] }, "target": { "type": "string", "minLength": 1 } }, - "required": ["id", "kind", "state", "target"], + "required": [ + "id", + "kind", + "state", + "target" + ], "additionalProperties": false } }, @@ -278,10 +323,17 @@ }, "basis": { "type": "string", - "enum": ["observed", "inferred"] + "enum": [ + "observed", + "inferred" + ] } }, - "required": ["state", "reason", "basis"], + "required": [ + "state", + "reason", + "basis" + ], "additionalProperties": false }, { @@ -337,7 +389,12 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "source", "sessionId"], + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], "additionalProperties": false }, "eventId": { @@ -419,7 +476,12 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "source", "sessionId"], + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], "additionalProperties": false }, "eventId": { @@ -462,7 +524,12 @@ }, "reason": { "type": "string", - "enum": ["thinking", "tool_running", "testing", "coordinating"] + "enum": [ + "thinking", + "tool_running", + "testing", + "coordinating" + ] } }, "required": [ @@ -506,7 +573,12 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "source", "sessionId"], + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], "additionalProperties": false }, "eventId": { @@ -572,18 +644,30 @@ }, "kind": { "type": "string", - "enum": ["human", "agent", "pr"] + "enum": [ + "human", + "agent", + "pr" + ] }, "state": { "type": "string", - "enum": ["pending", "resolved"] + "enum": [ + "pending", + "resolved" + ] }, "target": { "type": "string", "minLength": 1 } }, - "required": ["id", "kind", "state", "target"], + "required": [ + "id", + "kind", + "state", + "target" + ], "additionalProperties": false } } @@ -630,7 +714,12 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "source", "sessionId"], + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], "additionalProperties": false }, "eventId": { @@ -717,7 +806,12 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "source", "sessionId"], + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], "additionalProperties": false }, "eventId": { @@ -799,7 +893,12 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "source", "sessionId"], + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], "additionalProperties": false }, "eventId": { @@ -842,7 +941,10 @@ }, "reason": { "type": "string", - "enum": ["completed", "merged"] + "enum": [ + "completed", + "merged" + ] } }, "required": [ @@ -886,7 +988,12 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "source", "sessionId"], + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], "additionalProperties": false }, "eventId": { @@ -968,7 +1075,12 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "source", "sessionId"], + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], "additionalProperties": false }, "eventId": { @@ -1050,7 +1162,12 @@ "minLength": 1 } }, - "required": ["organizationId", "workspaceId", "source", "sessionId"], + "required": [ + "organizationId", + "workspaceId", + "source", + "sessionId" + ], "additionalProperties": false }, "eventId": { @@ -1168,7 +1285,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -1210,7 +1329,9 @@ "observedAt": "2026-10-13T12:02:00Z", "lastSeenAt": "2026-10-13T12:02:00Z", "dependencies": [], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 2 }, @@ -1251,7 +1372,9 @@ "observedAt": "2026-10-13T12:02:00Z", "lastSeenAt": "2026-10-13T14:00:00Z", "dependencies": [], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 3 }, @@ -1292,7 +1415,9 @@ "observedAt": "2026-10-13T12:04:00Z", "lastSeenAt": "2026-10-13T14:00:00Z", "dependencies": [], - "evidenceIds": ["e4"], + "evidenceIds": [ + "e4" + ], "producerSequences": { "runner": 4 }, @@ -1358,7 +1483,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -1415,7 +1542,9 @@ "target": "target_a" } ], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 2 }, @@ -1463,7 +1592,9 @@ "target": "target_a" } ], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 3 }, @@ -1511,7 +1642,9 @@ "target": "target_a" } ], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 4 }, @@ -1560,7 +1693,9 @@ "target": "target_a" } ], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 4 }, @@ -1609,7 +1744,9 @@ "target": "target_a" } ], - "evidenceIds": ["e6"], + "evidenceIds": [ + "e6" + ], "producerSequences": { "runner": 6 }, @@ -1658,7 +1795,9 @@ "target": "target_a" } ], - "evidenceIds": ["e7"], + "evidenceIds": [ + "e7" + ], "producerSequences": { "runner": 7 }, @@ -1724,7 +1863,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -1781,7 +1922,9 @@ "target": "target_a" } ], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 2 }, @@ -1829,7 +1972,9 @@ "target": "target_a" } ], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 3 }, @@ -1877,7 +2022,9 @@ "target": "target_a" } ], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 4 }, @@ -1926,7 +2073,9 @@ "target": "target_a" } ], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 4 }, @@ -1975,7 +2124,9 @@ "target": "target_a" } ], - "evidenceIds": ["e6"], + "evidenceIds": [ + "e6" + ], "producerSequences": { "runner": 6 }, @@ -2024,7 +2175,9 @@ "target": "target_a" } ], - "evidenceIds": ["e7"], + "evidenceIds": [ + "e7" + ], "producerSequences": { "runner": 7 }, @@ -2090,7 +2243,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -2147,7 +2302,9 @@ "target": "target_a" } ], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 2 }, @@ -2195,7 +2352,9 @@ "target": "target_a" } ], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 3 }, @@ -2243,7 +2402,9 @@ "target": "target_a" } ], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 4 }, @@ -2292,7 +2453,9 @@ "target": "target_a" } ], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 4 }, @@ -2341,7 +2504,9 @@ "target": "target_a" } ], - "evidenceIds": ["e6"], + "evidenceIds": [ + "e6" + ], "producerSequences": { "runner": 6 }, @@ -2390,7 +2555,9 @@ "target": "target_a" } ], - "evidenceIds": ["e7"], + "evidenceIds": [ + "e7" + ], "producerSequences": { "runner": 7 }, @@ -2456,7 +2623,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -2513,7 +2682,9 @@ "target": "agent_1" } ], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 2 }, @@ -2562,7 +2733,9 @@ "target": "agent_1" } ], - "evidenceIds": ["e3"], + "evidenceIds": [ + "e3" + ], "producerSequences": { "runner": 3 }, @@ -2610,7 +2783,9 @@ "target": "agent_1" } ], - "evidenceIds": ["e4"], + "evidenceIds": [ + "e4" + ], "producerSequences": { "runner": 4 }, @@ -2676,7 +2851,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -2745,7 +2922,9 @@ "target": "https://github.com/a/b/pull/2" } ], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 2 }, @@ -2800,7 +2979,9 @@ "target": "https://github.com/a/b/pull/2" } ], - "evidenceIds": ["e3"], + "evidenceIds": [ + "e3" + ], "producerSequences": { "runner": 3 }, @@ -2855,7 +3036,9 @@ "target": "https://github.com/a/b/pull/2" } ], - "evidenceIds": ["e3"], + "evidenceIds": [ + "e3" + ], "producerSequences": { "runner": 3 }, @@ -2910,7 +3093,9 @@ "target": "https://github.com/a/b/pull/2" } ], - "evidenceIds": ["e5"], + "evidenceIds": [ + "e5" + ], "producerSequences": { "runner": 5 }, @@ -2965,7 +3150,9 @@ "target": "https://github.com/a/b/pull/2" } ], - "evidenceIds": ["e6"], + "evidenceIds": [ + "e6" + ], "producerSequences": { "runner": 6 }, @@ -3031,7 +3218,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -3073,7 +3262,9 @@ "observedAt": "2026-10-13T12:02:00Z", "lastSeenAt": "2026-10-13T12:02:00Z", "dependencies": [], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 2 }, @@ -3114,7 +3305,9 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": ["e3"], + "evidenceIds": [ + "e3" + ], "producerSequences": { "runner": 3 }, @@ -3156,7 +3349,9 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": ["e3"], + "evidenceIds": [ + "e3" + ], "producerSequences": { "runner": 3 }, @@ -3198,7 +3393,9 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": ["e3"], + "evidenceIds": [ + "e3" + ], "producerSequences": { "runner": 3 }, @@ -3239,7 +3436,9 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": ["e3"], + "evidenceIds": [ + "e3" + ], "producerSequences": { "runner": 3 }, @@ -3305,7 +3504,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -3347,7 +3548,9 @@ "observedAt": "2026-10-13T12:02:00Z", "lastSeenAt": "2026-10-13T12:02:00Z", "dependencies": [], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 2 }, @@ -3388,7 +3591,9 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": ["e3"], + "evidenceIds": [ + "e3" + ], "producerSequences": { "runner": 3 }, @@ -3434,7 +3639,9 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:03:00Z", "dependencies": [], - "evidenceIds": ["e3"], + "evidenceIds": [ + "e3" + ], "producerSequences": { "runner": 3 }, @@ -3479,7 +3686,9 @@ "observedAt": "2026-10-13T12:03:00Z", "lastSeenAt": "2026-10-13T12:05:00Z", "dependencies": [], - "evidenceIds": ["e3"], + "evidenceIds": [ + "e3" + ], "producerSequences": { "runner": 5 }, @@ -3524,7 +3733,9 @@ "observedAt": "2026-10-13T12:06:00Z", "lastSeenAt": "2026-10-13T12:06:00Z", "dependencies": [], - "evidenceIds": ["e6"], + "evidenceIds": [ + "e6" + ], "producerSequences": { "runner": 6 }, @@ -3590,7 +3801,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -3631,7 +3844,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -3672,7 +3887,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -3738,7 +3955,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -3795,7 +4014,9 @@ "target": "user_a" } ], - "evidenceIds": ["e2"], + "evidenceIds": [ + "e2" + ], "producerSequences": { "runner": 2 }, @@ -3858,7 +4079,9 @@ "target": "agent_a" } ], - "evidenceIds": ["e3"], + "evidenceIds": [ + "e3" + ], "producerSequences": { "runner": 3 }, @@ -3913,7 +4136,9 @@ "target": "agent_a" } ], - "evidenceIds": ["e3"], + "evidenceIds": [ + "e3" + ], "producerSequences": { "runner": 3 }, @@ -3979,7 +4204,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4021,7 +4248,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4087,7 +4316,9 @@ "observedAt": "2026-10-13T13:01:00Z", "lastSeenAt": "2026-10-13T13:01:00Z", "dependencies": [], - "evidenceIds": ["archive_1"], + "evidenceIds": [ + "archive_1" + ], "producerSequences": { "desktop": 1 }, @@ -4132,7 +4363,9 @@ "observedAt": "2026-10-13T13:01:00Z", "lastSeenAt": "2026-10-13T13:02:00Z", "dependencies": [], - "evidenceIds": ["archive_1"], + "evidenceIds": [ + "archive_1" + ], "producerSequences": { "desktop": 2 }, @@ -4177,7 +4410,9 @@ "observedAt": "2026-10-13T13:03:00Z", "lastSeenAt": "2026-10-13T13:03:00Z", "dependencies": [], - "evidenceIds": ["archive_3"], + "evidenceIds": [ + "archive_3" + ], "producerSequences": { "desktop": 3 }, @@ -4206,7 +4441,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4229,7 +4466,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4255,7 +4494,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4277,7 +4518,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4299,7 +4542,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4325,7 +4570,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4347,7 +4594,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4369,7 +4618,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4395,7 +4646,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4417,7 +4670,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4439,7 +4694,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4465,7 +4722,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4487,7 +4746,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4509,7 +4770,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4535,7 +4798,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4557,7 +4822,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 }, @@ -4579,7 +4846,9 @@ "observedAt": "2026-10-13T12:01:00Z", "lastSeenAt": "2026-10-13T12:01:00Z", "dependencies": [], - "evidenceIds": ["e1"], + "evidenceIds": [ + "e1" + ], "producerSequences": { "runner": 1 },