Remove Epiphany job backend kind

This commit is contained in:
Meta Vens 2026-05-12 05:30:18 +01:00
commit b9ad3cdac7
24 changed files with 13 additions and 447 deletions

View file

@ -1307,12 +1307,6 @@
],
"type": "string"
},
"EpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"EpiphanyJobBinding": {
"properties": {
"authority_scope": {
@ -1327,16 +1321,6 @@
"null"
]
},
"backend_kind": {
"anyOf": [
{
"$ref": "#/definitions/EpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blocking_reason": {
"type": [
"string",

View file

@ -1567,12 +1567,6 @@
],
"type": "string"
},
"EpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"EpiphanyJobBinding": {
"properties": {
"authority_scope": {
@ -1587,16 +1581,6 @@
"null"
]
},
"backend_kind": {
"anyOf": [
{
"$ref": "#/definitions/EpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blocking_reason": {
"type": [
"string",
@ -4559,16 +4543,6 @@
"null"
]
},
"backendKind": {
"anyOf": [
{
"$ref": "#/definitions/ThreadEpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blockingReason": {
"type": [
"string",
@ -4647,12 +4621,6 @@
],
"type": "object"
},
"ThreadEpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"ThreadEpiphanyJobKind": {
"enum": [
"indexing",

View file

@ -8436,12 +8436,6 @@
],
"type": "string"
},
"EpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"EpiphanyJobBinding": {
"properties": {
"authority_scope": {
@ -8456,16 +8450,6 @@
"null"
]
},
"backend_kind": {
"anyOf": [
{
"$ref": "#/definitions/v2/EpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blocking_reason": {
"type": [
"string",
@ -16160,16 +16144,6 @@
"null"
]
},
"backendKind": {
"anyOf": [
{
"$ref": "#/definitions/v2/ThreadEpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blockingReason": {
"type": [
"string",
@ -16248,12 +16222,6 @@
],
"type": "object"
},
"ThreadEpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"ThreadEpiphanyJobKind": {
"enum": [
"indexing",

View file

@ -4976,12 +4976,6 @@
],
"type": "string"
},
"EpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"EpiphanyJobBinding": {
"properties": {
"authority_scope": {
@ -4996,16 +4990,6 @@
"null"
]
},
"backend_kind": {
"anyOf": [
{
"$ref": "#/definitions/EpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blocking_reason": {
"type": [
"string",
@ -14047,16 +14031,6 @@
"null"
]
},
"backendKind": {
"anyOf": [
{
"$ref": "#/definitions/ThreadEpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blockingReason": {
"type": [
"string",
@ -14135,12 +14109,6 @@
],
"type": "object"
},
"ThreadEpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"ThreadEpiphanyJobKind": {
"enum": [
"indexing",

View file

@ -21,16 +21,6 @@
"null"
]
},
"backendKind": {
"anyOf": [
{
"$ref": "#/definitions/ThreadEpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blockingReason": {
"type": [
"string",
@ -109,12 +99,6 @@
],
"type": "object"
},
"ThreadEpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"ThreadEpiphanyJobKind": {
"enum": [
"indexing",

View file

@ -566,12 +566,6 @@
],
"type": "string"
},
"EpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"EpiphanyJobBinding": {
"properties": {
"authority_scope": {
@ -586,16 +580,6 @@
"null"
]
},
"backend_kind": {
"anyOf": [
{
"$ref": "#/definitions/EpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blocking_reason": {
"type": [
"string",

View file

@ -1014,12 +1014,6 @@
],
"type": "string"
},
"EpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"EpiphanyJobBinding": {
"properties": {
"authority_scope": {
@ -1034,16 +1028,6 @@
"null"
]
},
"backend_kind": {
"anyOf": [
{
"$ref": "#/definitions/EpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blocking_reason": {
"type": [
"string",

View file

@ -955,12 +955,6 @@
],
"type": "string"
},
"EpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"EpiphanyJobBinding": {
"properties": {
"authority_scope": {
@ -975,16 +969,6 @@
"null"
]
},
"backend_kind": {
"anyOf": [
{
"$ref": "#/definitions/EpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blocking_reason": {
"type": [
"string",

View file

@ -955,12 +955,6 @@
],
"type": "string"
},
"EpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"EpiphanyJobBinding": {
"properties": {
"authority_scope": {
@ -975,16 +969,6 @@
"null"
]
},
"backend_kind": {
"anyOf": [
{
"$ref": "#/definitions/EpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blocking_reason": {
"type": [
"string",

View file

@ -955,12 +955,6 @@
],
"type": "string"
},
"EpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"EpiphanyJobBinding": {
"properties": {
"authority_scope": {
@ -975,16 +969,6 @@
"null"
]
},
"backend_kind": {
"anyOf": [
{
"$ref": "#/definitions/EpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blocking_reason": {
"type": [
"string",

View file

@ -1014,12 +1014,6 @@
],
"type": "string"
},
"EpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"EpiphanyJobBinding": {
"properties": {
"authority_scope": {
@ -1034,16 +1028,6 @@
"null"
]
},
"backend_kind": {
"anyOf": [
{
"$ref": "#/definitions/EpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blocking_reason": {
"type": [
"string",

View file

@ -955,12 +955,6 @@
],
"type": "string"
},
"EpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"EpiphanyJobBinding": {
"properties": {
"authority_scope": {
@ -975,16 +969,6 @@
"null"
]
},
"backend_kind": {
"anyOf": [
{
"$ref": "#/definitions/EpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blocking_reason": {
"type": [
"string",

View file

@ -1014,12 +1014,6 @@
],
"type": "string"
},
"EpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"EpiphanyJobBinding": {
"properties": {
"authority_scope": {
@ -1034,16 +1028,6 @@
"null"
]
},
"backend_kind": {
"anyOf": [
{
"$ref": "#/definitions/EpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blocking_reason": {
"type": [
"string",

View file

@ -955,12 +955,6 @@
],
"type": "string"
},
"EpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"EpiphanyJobBinding": {
"properties": {
"authority_scope": {
@ -975,16 +969,6 @@
"null"
]
},
"backend_kind": {
"anyOf": [
{
"$ref": "#/definitions/EpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blocking_reason": {
"type": [
"string",

View file

@ -955,12 +955,6 @@
],
"type": "string"
},
"EpiphanyJobBackendKind": {
"enum": [
"heartbeat"
],
"type": "string"
},
"EpiphanyJobBinding": {
"properties": {
"authority_scope": {
@ -975,16 +969,6 @@
"null"
]
},
"backend_kind": {
"anyOf": [
{
"$ref": "#/definitions/EpiphanyJobBackendKind"
},
{
"type": "null"
}
]
},
"blocking_reason": {
"type": [
"string",

View file

@ -3,4 +3,4 @@
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { EpiphanyJobKind } from "./EpiphanyJobKind";
export type EpiphanyJobBinding = { id: string, kind: EpiphanyJobKind, scope: string, owner_role: string, launcher_job_id?: string | null, authority_scope?: string | null, backend_kind?: EpiphanyJobBackendKind | null, backend_job_id?: string | null, linked_subgoal_ids?: Array<string>, linked_graph_node_ids?: Array<string>, progress_note?: string | null, blocking_reason?: string | null, };
export type EpiphanyJobBinding = { id: string, kind: EpiphanyJobKind, scope: string, owner_role: string, launcher_job_id?: string | null, authority_scope?: string | null, backend_job_id?: string | null, linked_subgoal_ids?: Array<string>, linked_graph_node_ids?: Array<string>, progress_note?: string | null, blocking_reason?: string | null, };

View file

@ -1,8 +1,7 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { ThreadEpiphanyJobBackendKind } from "./ThreadEpiphanyJobBackendKind";
import type { ThreadEpiphanyJobKind } from "./ThreadEpiphanyJobKind";
import type { ThreadEpiphanyJobStatus } from "./ThreadEpiphanyJobStatus";
export type ThreadEpiphanyJob = { id: string, kind: ThreadEpiphanyJobKind, scope: string, ownerRole: string, launcherJobId?: string | null, authorityScope?: string | null, backendKind?: ThreadEpiphanyJobBackendKind | null, backendJobId?: string | null, status: ThreadEpiphanyJobStatus, itemsProcessed?: number | null, itemsTotal?: number | null, progressNote?: string | null, lastCheckpointAtUnixSeconds?: bigint | null, blockingReason?: string | null, activeThreadIds?: Array<string>, linkedSubgoalIds?: Array<string>, linkedGraphNodeIds?: Array<string>, };
export type ThreadEpiphanyJob = { id: string, kind: ThreadEpiphanyJobKind, scope: string, ownerRole: string, launcherJobId?: string | null, authorityScope?: string | null, backendJobId?: string | null, status: ThreadEpiphanyJobStatus, itemsProcessed?: number | null, itemsTotal?: number | null, progressNote?: string | null, lastCheckpointAtUnixSeconds?: bigint | null, blockingReason?: string | null, activeThreadIds?: Array<string>, linkedSubgoalIds?: Array<string>, linkedGraphNodeIds?: Array<string>, };

View file

@ -1,5 +0,0 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
export type ThreadEpiphanyJobBackendKind = "heartbeat";

View file

@ -337,7 +337,6 @@ export type { ThreadEpiphanyGraphQueryMissing } from "./ThreadEpiphanyGraphQuery
export type { ThreadEpiphanyInvalidationInput } from "./ThreadEpiphanyInvalidationInput";
export type { ThreadEpiphanyInvalidationStatus } from "./ThreadEpiphanyInvalidationStatus";
export type { ThreadEpiphanyJob } from "./ThreadEpiphanyJob";
export type { ThreadEpiphanyJobBackendKind } from "./ThreadEpiphanyJobBackendKind";
export type { ThreadEpiphanyJobKind } from "./ThreadEpiphanyJobKind";
export type { ThreadEpiphanyJobStatus } from "./ThreadEpiphanyJobStatus";
export type { ThreadEpiphanyJobsSource } from "./ThreadEpiphanyJobsSource";

View file

@ -1978,7 +1978,6 @@ mod tests {
owner_role: "epiphany-core".to_string(),
launcher_job_id: None,
authority_scope: None,
backend_kind: None,
backend_job_id: None,
status: v2::ThreadEpiphanyJobStatus::Needed,
items_processed: Some(12),
@ -2048,7 +2047,6 @@ mod tests {
owner_role: "epiphany-verifier".to_string(),
launcher_job_id: None,
authority_scope: None,
backend_kind: None,
backend_job_id: None,
status: v2::ThreadEpiphanyJobStatus::Needed,
items_processed: None,
@ -2207,9 +2205,6 @@ mod tests {
owner_role: "epiphany-modeler".to_string(),
launcher_job_id: Some("epiphany-launch-1".to_string()),
authority_scope: Some("epiphany.role.modeling".to_string()),
backend_kind: Some(
codex_protocol::protocol::EpiphanyJobBackendKind::Heartbeat,
),
backend_job_id: Some("backend-1".to_string()),
linked_subgoal_ids: vec!["phase-6".to_string()],
linked_graph_node_ids: vec!["state-spine".to_string()],
@ -2228,7 +2223,6 @@ mod tests {
owner_role: "epiphany-modeler".to_string(),
launcher_job_id: Some("epiphany-launch-1".to_string()),
authority_scope: Some("epiphany.role.modeling".to_string()),
backend_kind: Some(v2::ThreadEpiphanyJobBackendKind::Heartbeat),
backend_job_id: Some("backend-1".to_string()),
status: v2::ThreadEpiphanyJobStatus::Pending,
items_processed: None,
@ -2266,7 +2260,6 @@ mod tests {
"owner_role": "epiphany-modeler",
"launcher_job_id": "epiphany-launch-1",
"authority_scope": "epiphany.role.modeling",
"backend_kind": "heartbeat",
"backend_job_id": "backend-1",
"linked_subgoal_ids": ["phase-6"],
"linked_graph_node_ids": ["state-spine"],
@ -2280,7 +2273,6 @@ mod tests {
"ownerRole": "epiphany-modeler",
"launcherJobId": "epiphany-launch-1",
"authorityScope": "epiphany.role.modeling",
"backendKind": "heartbeat",
"backendJobId": "backend-1",
"status": "pending",
"progressNote": "Explicitly launched through the Epiphany authority surface onto the heartbeat backend.",
@ -2313,7 +2305,6 @@ mod tests {
owner_role: "epiphany-verifier".to_string(),
launcher_job_id: Some("epiphany-launch-2".to_string()),
authority_scope: Some("epiphany.role.verification".to_string()),
backend_kind: Some(v2::ThreadEpiphanyJobBackendKind::Heartbeat),
backend_job_id: Some("backend-2".to_string()),
status: v2::ThreadEpiphanyJobStatus::Completed,
items_processed: Some(1),
@ -2373,7 +2364,6 @@ mod tests {
"ownerRole": "epiphany-verifier",
"launcherJobId": "epiphany-launch-2",
"authorityScope": "epiphany.role.verification",
"backendKind": "heartbeat",
"backendJobId": "backend-2",
"status": "completed",
"itemsProcessed": 1,
@ -3259,9 +3249,6 @@ mod tests {
owner_role: "epiphany-reorient".to_string(),
launcher_job_id: Some("epiphany-launch-1".to_string()),
authority_scope: Some("epiphany.reorient.regather".to_string()),
backend_kind: Some(
codex_protocol::protocol::EpiphanyJobBackendKind::Heartbeat,
),
backend_job_id: Some("backend-1".to_string()),
linked_subgoal_ids: vec!["phase-6".to_string()],
linked_graph_node_ids: vec!["state-spine".to_string()],
@ -3280,7 +3267,6 @@ mod tests {
owner_role: "epiphany-reorient".to_string(),
launcher_job_id: Some("epiphany-launch-1".to_string()),
authority_scope: Some("epiphany.reorient.regather".to_string()),
backend_kind: Some(v2::ThreadEpiphanyJobBackendKind::Heartbeat),
backend_job_id: Some("backend-1".to_string()),
status: v2::ThreadEpiphanyJobStatus::Pending,
items_processed: None,
@ -3338,7 +3324,6 @@ mod tests {
"owner_role": "epiphany-reorient",
"launcher_job_id": "epiphany-launch-1",
"authority_scope": "epiphany.reorient.regather",
"backend_kind": "heartbeat",
"backend_job_id": "backend-1",
"linked_subgoal_ids": ["phase-6"],
"linked_graph_node_ids": ["state-spine"],
@ -3352,7 +3337,6 @@ mod tests {
"ownerRole": "epiphany-reorient",
"launcherJobId": "epiphany-launch-1",
"authorityScope": "epiphany.reorient.regather",
"backendKind": "heartbeat",
"backendJobId": "backend-1",
"status": "pending",
"progressNote": "Explicitly launched through the Epiphany authority surface onto the heartbeat backend.",
@ -3384,7 +3368,6 @@ mod tests {
owner_role: "epiphany-reorient".to_string(),
launcher_job_id: Some("epiphany-launch-1".to_string()),
authority_scope: Some("epiphany.reorient.resume".to_string()),
backend_kind: Some(v2::ThreadEpiphanyJobBackendKind::Heartbeat),
backend_job_id: Some("backend-1".to_string()),
status: v2::ThreadEpiphanyJobStatus::Completed,
items_processed: Some(1),
@ -3436,7 +3419,6 @@ mod tests {
"ownerRole": "epiphany-reorient",
"launcherJobId": "epiphany-launch-1",
"authorityScope": "epiphany.reorient.resume",
"backendKind": "heartbeat",
"backendJobId": "backend-1",
"status": "completed",
"itemsProcessed": 1,
@ -3855,7 +3837,6 @@ mod tests {
owner_role: "epiphany-harness".to_string(),
launcher_job_id: None,
authority_scope: Some("epiphany.specialist".to_string()),
backend_kind: None,
backend_job_id: None,
linked_subgoal_ids: Vec::new(),
linked_graph_node_ids: Vec::new(),
@ -3882,7 +3863,6 @@ mod tests {
owner_role: "epiphany-harness".to_string(),
launcher_job_id: None,
authority_scope: Some("epiphany.specialist".to_string()),
backend_kind: Some(v2::ThreadEpiphanyJobBackendKind::Heartbeat),
backend_job_id: Some("job-123".to_string()),
status: v2::ThreadEpiphanyJobStatus::Pending,
items_processed: None,
@ -3930,7 +3910,6 @@ mod tests {
"scope": "role-scoped specialist work",
"ownerRole": "epiphany-harness",
"authorityScope": "epiphany.specialist",
"backendKind": "heartbeat",
"backendJobId": "job-123",
"status": "pending",
"progressNote": "Runtime agent job is pending."
@ -3960,7 +3939,6 @@ mod tests {
owner_role: "epiphany-harness".to_string(),
launcher_job_id: None,
authority_scope: Some("epiphany.specialist".to_string()),
backend_kind: None,
backend_job_id: None,
linked_subgoal_ids: Vec::new(),
linked_graph_node_ids: Vec::new(),
@ -3978,7 +3956,6 @@ mod tests {
owner_role: "epiphany-harness".to_string(),
launcher_job_id: None,
authority_scope: Some("epiphany.specialist".to_string()),
backend_kind: None,
backend_job_id: None,
status: v2::ThreadEpiphanyJobStatus::Blocked,
items_processed: None,
@ -4151,7 +4128,6 @@ mod tests {
owner_role: "epiphany-harness".to_string(),
launcher_job_id: Some("launcher-specialist".to_string()),
authority_scope: Some("epiphany.specialist".to_string()),
backend_kind: Some(v2::ThreadEpiphanyJobBackendKind::Heartbeat),
backend_job_id: Some("job-123".to_string()),
status: v2::ThreadEpiphanyJobStatus::Running,
items_processed: Some(1),
@ -4179,7 +4155,6 @@ mod tests {
"ownerRole": "epiphany-harness",
"launcherJobId": "launcher-specialist",
"authorityScope": "epiphany.specialist",
"backendKind": "heartbeat",
"backendJobId": "job-123",
"status": "running",
"itemsProcessed": 1,
@ -5074,7 +5049,6 @@ mod tests {
owner_role: "epiphany-harness".to_string(),
launcher_job_id: Some("launcher-specialist".to_string()),
authority_scope: Some("epiphany.specialist".to_string()),
backend_kind: Some(v2::ThreadEpiphanyJobBackendKind::Heartbeat),
backend_job_id: Some("job-123".to_string()),
status: v2::ThreadEpiphanyJobStatus::Running,
items_processed: Some(1),

View file

@ -4645,13 +4645,6 @@ pub enum ThreadEpiphanyJobKind {
Specialist,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub enum ThreadEpiphanyJobBackendKind {
Heartbeat,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
@ -4683,9 +4676,6 @@ pub struct ThreadEpiphanyJob {
pub authority_scope: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[ts(optional = nullable)]
pub backend_kind: Option<ThreadEpiphanyJobBackendKind>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[ts(optional = nullable)]
pub backend_job_id: Option<String>,
pub status: ThreadEpiphanyJobStatus,
#[serde(default, skip_serializing_if = "Option::is_none")]

View file

@ -182,7 +182,6 @@ use codex_app_server_protocol::ThreadEpiphanyIndexResponse;
use codex_app_server_protocol::ThreadEpiphanyInvalidationInput;
use codex_app_server_protocol::ThreadEpiphanyInvalidationStatus;
use codex_app_server_protocol::ThreadEpiphanyJob;
use codex_app_server_protocol::ThreadEpiphanyJobBackendKind;
use codex_app_server_protocol::ThreadEpiphanyJobInterruptParams;
use codex_app_server_protocol::ThreadEpiphanyJobInterruptResponse;
use codex_app_server_protocol::ThreadEpiphanyJobKind;
@ -463,7 +462,6 @@ use codex_protocol::protocol::EpiphanyCodeRef;
use codex_protocol::protocol::EpiphanyEvidenceRecord;
use codex_protocol::protocol::EpiphanyInvestigationCheckpoint;
use codex_protocol::protocol::EpiphanyInvestigationDisposition;
use codex_protocol::protocol::EpiphanyJobBackendKind as CoreEpiphanyJobBackendKind;
use codex_protocol::protocol::EpiphanyJobBinding;
use codex_protocol::protocol::EpiphanyJobKind as CoreEpiphanyJobKind;
use codex_protocol::protocol::EpiphanyObservation;
@ -5318,7 +5316,6 @@ impl CodexMessageProcessor {
owner_role: "epiphany-harness".to_string(),
launcher_job_id: Some(launched.launcher_job_id.clone()),
authority_scope: None,
backend_kind: Some(ThreadEpiphanyJobBackendKind::Heartbeat),
backend_job_id: Some(launched.backend_job_id.clone()),
status: ThreadEpiphanyJobStatus::Pending,
items_processed: None,
@ -7275,7 +7272,6 @@ impl CodexMessageProcessor {
owner_role: "epiphany-harness".to_string(),
launcher_job_id: Some(launched.launcher_job_id.clone()),
authority_scope: None,
backend_kind: Some(ThreadEpiphanyJobBackendKind::Heartbeat),
backend_job_id: Some(launched.backend_job_id.clone()),
status: ThreadEpiphanyJobStatus::Pending,
items_processed: None,
@ -15001,13 +14997,13 @@ async fn load_epiphany_role_result_snapshot(
"No matching Epiphany role specialist binding exists.".to_string(),
);
};
if binding_backend_kind(binding) == Some(CoreEpiphanyJobBackendKind::Heartbeat) {
if binding_backend_job_id(binding).is_some() {
return load_epiphany_role_result_from_runtime_spine(binding, runtime_store_path, role_id);
}
(
ThreadEpiphanyRoleResultStatus::BackendUnavailable,
None,
"Non-heartbeat role bindings are unsupported; launch a heartbeat-backed role worker for typed runtime-spine results.".to_string(),
"Role binding has no runtime-spine job id; launch a runtime-linked role worker for typed results.".to_string(),
)
}
@ -15045,13 +15041,13 @@ async fn load_epiphany_reorient_result_snapshot(
"No matching Epiphany reorientation worker binding exists.".to_string(),
);
};
if binding_backend_kind(binding) == Some(CoreEpiphanyJobBackendKind::Heartbeat) {
if binding_backend_job_id(binding).is_some() {
return load_epiphany_reorient_result_from_runtime_spine(binding, runtime_store_path);
}
(
ThreadEpiphanyReorientResultStatus::BackendUnavailable,
None,
"Non-heartbeat reorientation bindings are unsupported; launch a heartbeat-backed reorient worker for typed runtime-spine results.".to_string(),
"Reorientation binding has no runtime-spine job id; launch a runtime-linked reorient worker for typed results.".to_string(),
)
}
@ -16128,7 +16124,7 @@ async fn load_completed_epiphany_reorient_finding(
.job_bindings
.iter()
.find(|binding| binding.id == binding_id)
&& binding_backend_kind(binding) == Some(CoreEpiphanyJobBackendKind::Heartbeat)
&& binding_backend_job_id(binding).is_some()
{
let runtime_store_path = thread.epiphany_runtime_spine_store_path().await;
let (status, finding, _note) = load_epiphany_reorient_result_from_runtime_spine(
@ -16150,7 +16146,7 @@ async fn load_completed_epiphany_reorient_finding(
}
Err(CodexErr::InvalidRequest(
"non-heartbeat reorientation findings are unsupported; accept only typed runtime-spine heartbeat results"
"reorientation findings without runtime-spine results are unsupported; accept only typed runtime-spine results"
.to_string(),
))
}
@ -16192,7 +16188,7 @@ async fn load_completed_epiphany_role_finding(
binding_id
))
})?;
if binding_backend_kind(binding) == Some(CoreEpiphanyJobBackendKind::Heartbeat) {
if binding_backend_job_id(binding).is_some() {
let runtime_store_path = thread.epiphany_runtime_spine_store_path().await;
let (status, finding, _note) = load_epiphany_role_result_from_runtime_spine(
binding,
@ -16214,7 +16210,7 @@ async fn load_completed_epiphany_role_finding(
}
Err(CodexErr::InvalidRequest(
"non-heartbeat role findings are unsupported; accept only typed runtime-spine heartbeat results"
"role findings without runtime-spine results are unsupported; accept only typed runtime-spine results"
.to_string(),
))
}
@ -17879,10 +17875,6 @@ fn binding_launcher_job_id(binding: &EpiphanyJobBinding) -> Option<&str> {
binding.launcher_job_id.as_deref()
}
fn binding_backend_kind(binding: &EpiphanyJobBinding) -> Option<CoreEpiphanyJobBackendKind> {
binding.backend_kind
}
fn binding_backend_job_id(binding: &EpiphanyJobBinding) -> Option<&str> {
binding.backend_job_id.as_deref()
}
@ -18183,9 +18175,6 @@ fn map_epiphany_bound_job(
owner_role: binding.owner_role.clone(),
launcher_job_id: binding_launcher_job_id(binding).map(str::to_string),
authority_scope: binding.authority_scope.clone(),
backend_kind: runtime_link
.map(|_| ThreadEpiphanyJobBackendKind::Heartbeat)
.or_else(|| binding_backend_kind(binding).map(map_core_epiphany_job_backend_kind)),
backend_job_id: runtime_link
.map(|link| link.runtime_job_id.clone())
.or_else(|| binding_projected_backend_job_id(binding).map(str::to_string)),
@ -18218,9 +18207,6 @@ fn overlay_epiphany_job_binding(
job.owner_role = binding.owner_role.clone();
job.launcher_job_id = binding_launcher_job_id(binding).map(str::to_string);
job.authority_scope = binding.authority_scope.clone();
job.backend_kind = runtime_link
.map(|_| ThreadEpiphanyJobBackendKind::Heartbeat)
.or_else(|| binding_backend_kind(binding).map(map_core_epiphany_job_backend_kind));
job.backend_job_id = runtime_link
.map(|link| link.runtime_job_id.clone())
.or_else(|| binding_projected_backend_job_id(binding).map(str::to_string));
@ -18241,10 +18227,7 @@ fn overlay_epiphany_job_binding(
return job;
}
if runtime_link.is_some()
|| (binding_backend_kind(binding) == Some(CoreEpiphanyJobBackendKind::Heartbeat)
&& binding_backend_job_id(binding).is_some())
{
if runtime_link.is_some() || binding_backend_job_id(binding).is_some() {
job.status = ThreadEpiphanyJobStatus::Pending;
job.blocking_reason = None;
job.progress_note = Some(
@ -18260,18 +18243,7 @@ fn overlay_epiphany_job_binding(
}
fn binding_projected_backend_job_id(binding: &EpiphanyJobBinding) -> Option<&str> {
match binding_backend_kind(binding) {
Some(CoreEpiphanyJobBackendKind::Heartbeat) => binding_backend_job_id(binding),
None => None,
}
}
fn map_core_epiphany_job_backend_kind(
kind: CoreEpiphanyJobBackendKind,
) -> ThreadEpiphanyJobBackendKind {
match kind {
CoreEpiphanyJobBackendKind::Heartbeat => ThreadEpiphanyJobBackendKind::Heartbeat,
}
binding_backend_job_id(binding)
}
fn map_core_epiphany_job_kind(kind: CoreEpiphanyJobKind) -> ThreadEpiphanyJobKind {
@ -18301,7 +18273,6 @@ fn map_epiphany_index_job(
owner_role: "epiphany-core".to_string(),
launcher_job_id: None,
authority_scope: None,
backend_kind: None,
backend_job_id: None,
status: ThreadEpiphanyJobStatus::Unavailable,
items_processed: None,
@ -18337,7 +18308,6 @@ fn map_epiphany_index_job(
owner_role: "epiphany-core".to_string(),
launcher_job_id: None,
authority_scope: None,
backend_kind: None,
backend_job_id: None,
status: epiphany_job_status_from_retrieval_status(retrieval.status),
items_processed: retrieval.indexed_file_count,
@ -18403,7 +18373,6 @@ fn map_epiphany_remap_job(state: Option<&EpiphanyThreadState>) -> ThreadEpiphany
owner_role: "epiphany-core".to_string(),
launcher_job_id: None,
authority_scope: None,
backend_kind: None,
backend_job_id: None,
status: if needs_work {
ThreadEpiphanyJobStatus::Needed
@ -18457,7 +18426,6 @@ fn map_epiphany_verification_job(state: Option<&EpiphanyThreadState>) -> ThreadE
owner_role: "epiphany-harness".to_string(),
launcher_job_id: None,
authority_scope: None,
backend_kind: None,
backend_job_id: None,
status,
items_processed: Some(verified),
@ -18479,7 +18447,6 @@ fn map_epiphany_specialist_job() -> ThreadEpiphanyJob {
owner_role: "epiphany-harness".to_string(),
launcher_job_id: None,
authority_scope: None,
backend_kind: None,
backend_job_id: None,
status: ThreadEpiphanyJobStatus::Unavailable,
items_processed: None,
@ -18509,7 +18476,6 @@ fn epiphany_blocked_state_job(
owner_role: "epiphany-harness".to_string(),
launcher_job_id: None,
authority_scope: None,
backend_kind: None,
backend_job_id: None,
status: ThreadEpiphanyJobStatus::Blocked,
items_processed: None,
@ -20662,7 +20628,6 @@ mod tests {
owner_role: EPIPHANY_REORIENT_OWNER_ROLE.to_string(),
launcher_job_id: Some("launcher-1".to_string()),
authority_scope: Some("epiphany.reorient.resume".to_string()),
backend_kind: Some(codex_protocol::protocol::EpiphanyJobBackendKind::Heartbeat),
backend_job_id: Some("backend-1".to_string()),
linked_subgoal_ids: Vec::new(),
linked_graph_node_ids: Vec::new(),
@ -20975,7 +20940,6 @@ mod tests {
owner_role: "epiphany-verifier".to_string(),
launcher_job_id: None,
authority_scope: None,
backend_kind: None,
backend_job_id: None,
status: ThreadEpiphanyJobStatus::Needed,
items_processed: None,
@ -23327,7 +23291,6 @@ mod tests {
owner_role: "epiphany-modeler".to_string(),
launcher_job_id: None,
authority_scope: Some("epiphany.role.modeling".to_string()),
backend_kind: None,
backend_job_id: None,
linked_subgoal_ids: vec!["phase-6".to_string()],
linked_graph_node_ids: vec!["runtime-spine".to_string()],
@ -23355,10 +23318,6 @@ mod tests {
.expect("heartbeat specialist slot should exist");
assert_eq!(specialist.status, ThreadEpiphanyJobStatus::Pending);
assert_eq!(
specialist.backend_kind,
Some(ThreadEpiphanyJobBackendKind::Heartbeat)
);
assert_eq!(
specialist.backend_job_id.as_deref(),
Some("heartbeat-turn-1")
@ -23429,7 +23388,6 @@ mod tests {
owner_role: "epiphany-modeler".to_string(),
launcher_job_id: Some("epiphany-heartbeat-launch-1".to_string()),
authority_scope: Some("epiphany.role.modeling".to_string()),
backend_kind: Some(codex_protocol::protocol::EpiphanyJobBackendKind::Heartbeat),
backend_job_id: Some("heartbeat-job-1".to_string()),
linked_subgoal_ids: Vec::new(),
linked_graph_node_ids: Vec::new(),
@ -23460,7 +23418,6 @@ mod tests {
owner_role: "epiphany-harness".to_string(),
launcher_job_id: None,
authority_scope: Some("epiphany.specialist".to_string()),
backend_kind: None,
backend_job_id: None,
linked_subgoal_ids: vec!["phase-6".to_string()],
linked_graph_node_ids: vec!["job-control".to_string()],
@ -23485,7 +23442,6 @@ mod tests {
Some("epiphany.specialist")
);
assert_eq!(specialist.launcher_job_id, None);
assert_eq!(specialist.backend_kind, None);
assert_eq!(specialist.backend_job_id, None);
assert_eq!(specialist.linked_subgoal_ids, vec!["phase-6".to_string()]);
assert_eq!(

View file

@ -33,8 +33,6 @@ use codex_protocol::protocol::EpiphanyGraphFrontier;
use codex_protocol::protocol::EpiphanyGraphs;
use codex_protocol::protocol::EpiphanyInvariant;
use codex_protocol::protocol::EpiphanyInvestigationCheckpoint;
#[cfg(test)]
use codex_protocol::protocol::EpiphanyJobBackendKind;
use codex_protocol::protocol::EpiphanyJobBinding;
use codex_protocol::protocol::EpiphanyJobKind;
use codex_protocol::protocol::EpiphanyModeState;
@ -848,7 +846,6 @@ fn build_epiphany_job_launch_binding(
owner_role: request.owner_role.clone(),
launcher_job_id: None,
authority_scope: Some(request.authority_scope.clone()),
backend_kind: None,
backend_job_id: None,
linked_subgoal_ids: request.linked_subgoal_ids.clone(),
linked_graph_node_ids: request.linked_graph_node_ids.clone(),
@ -960,7 +957,6 @@ fn clear_epiphany_job_binding_backend(
) -> Vec<EpiphanyJobBinding> {
let binding = &mut bindings[binding_index];
binding.launcher_job_id = None;
binding.backend_kind = None;
binding.backend_job_id = None;
binding.progress_note = None;
binding.blocking_reason = Some(blocking_reason.to_string());
@ -1198,17 +1194,6 @@ fn validate_epiphany_job_bindings(job_bindings: &[EpiphanyJobBinding]) -> Vec<St
if let Some(blocking_reason) = binding.blocking_reason.as_deref() {
require_nonempty_update(blocking_reason, "job_binding.blocking_reason", &mut errors);
}
match (binding.backend_kind, binding.backend_job_id.as_deref()) {
(Some(_), None) => errors.push(format!(
"job binding {:?} sets backend_kind without backend_job_id",
binding.id
)),
(None, Some(_)) => errors.push(format!(
"job binding {:?} sets backend_job_id without backend_kind",
binding.id
)),
_ => {}
}
if !binding.id.is_empty() && !seen_ids.insert(binding.id.as_str()) {
errors.push(format!("duplicate job binding id {:?}", binding.id));
}
@ -1527,7 +1512,6 @@ mod epiphany_update_tests {
owner_role: "epiphany-harness".to_string(),
launcher_job_id: Some(format!("launcher-{id}")),
authority_scope: Some("epiphany.specialist".to_string()),
backend_kind: Some(EpiphanyJobBackendKind::Heartbeat),
backend_job_id: Some(format!("heartbeat-job-{id}")),
linked_subgoal_ids: vec!["phase-6".to_string()],
linked_graph_node_ids: vec!["job-surface".to_string()],
@ -2017,7 +2001,6 @@ mod epiphany_update_tests {
owner_role: String::new(),
launcher_job_id: Some(String::new()),
authority_scope: Some(String::new()),
backend_kind: Some(EpiphanyJobBackendKind::Heartbeat),
backend_job_id: Some(String::new()),
linked_subgoal_ids: Vec::new(),
linked_graph_node_ids: Vec::new(),
@ -2079,38 +2062,7 @@ mod epiphany_update_tests {
}
#[test]
fn validate_epiphany_state_update_rejects_incomplete_or_conflicting_job_backend_bindings() {
let update = EpiphanyStateUpdate {
job_bindings: Some(vec![
EpiphanyJobBinding {
backend_kind: Some(EpiphanyJobBackendKind::Heartbeat),
backend_job_id: None,
..job_binding("missing-backend-job-id")
},
EpiphanyJobBinding {
backend_kind: None,
backend_job_id: Some("heartbeat-job-orphan".to_string()),
..job_binding("orphan-backend-job-id")
},
]),
..Default::default()
};
let errors =
epiphany_state_update_validation_errors(&EpiphanyThreadState::default(), &update);
assert!(errors.iter().any(|error| {
error.contains("backend_kind without backend_job_id")
&& error.contains("missing-backend-job-id")
}));
assert!(errors.iter().any(|error| {
error.contains("backend_job_id without backend_kind")
&& error.contains("orphan-backend-job-id")
}));
}
#[test]
fn build_epiphany_job_launch_binding_targets_heartbeat_backend() {
fn build_epiphany_job_launch_binding_leaves_lifecycle_to_runtime_links() {
let request = EpiphanyJobLaunchRequest {
expected_revision: Some(7),
binding_id: "modeling-checkpoint-worker".to_string(),
@ -2131,7 +2083,6 @@ mod epiphany_update_tests {
let runtime_link = build_epiphany_runtime_link(&request, "turn-1");
assert_eq!(binding.launcher_job_id, None);
assert_eq!(binding.backend_kind, None);
assert_eq!(binding.backend_job_id, None);
assert_eq!(binding.progress_note, None);
assert_eq!(

View file

@ -3356,13 +3356,6 @@ pub enum EpiphanyJobKind {
Specialist,
}
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, JsonSchema, TS)]
#[serde(rename_all = "snake_case")]
#[ts(rename_all = "snake_case")]
pub enum EpiphanyJobBackendKind {
Heartbeat,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS)]
pub struct EpiphanyJobBinding {
pub id: String,
@ -3376,9 +3369,6 @@ pub struct EpiphanyJobBinding {
#[ts(type = "string | null")]
pub authority_scope: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[ts(type = "EpiphanyJobBackendKind | null")]
pub backend_kind: Option<EpiphanyJobBackendKind>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[ts(type = "string | null")]
pub backend_job_id: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]