From 5f8edb79248a7eaccda9600137128331fb0b19b3 Mon Sep 17 00:00:00 2001 From: Saadi Myftija Date: Thu, 11 Dec 2025 14:58:03 +0100 Subject: [PATCH 1/6] Make the image builds deterministic --- packages/cli-v3/package.json | 3 +- packages/cli-v3/src/build/buildWorker.ts | 27 ++++++------ packages/cli-v3/src/build/bundle.ts | 4 +- packages/cli-v3/src/deploy/buildImage.ts | 26 +++++------ .../entryPoints/managed-index-controller.ts | 4 +- .../cli-v3/src/entryPoints/managed/env.ts | 4 +- .../cli-v3/src/utilities/buildManifest.ts | 4 +- packages/cli-v3/src/utilities/fileSystem.ts | 3 +- pnpm-lock.yaml | 43 ++++++++++++++----- 9 files changed, 73 insertions(+), 45 deletions(-) diff --git a/packages/cli-v3/package.json b/packages/cli-v3/package.json index 81f374099d..3223f332c5 100644 --- a/packages/cli-v3/package.json +++ b/packages/cli-v3/package.json @@ -92,10 +92,10 @@ "@opentelemetry/resources": "2.0.1", "@opentelemetry/sdk-trace-node": "2.0.1", "@opentelemetry/semantic-conventions": "1.36.0", + "@s2-dev/streamstore": "^0.17.6", "@trigger.dev/build": "workspace:4.2.0", "@trigger.dev/core": "workspace:4.2.0", "@trigger.dev/schema-to-json": "workspace:4.2.0", - "@s2-dev/streamstore": "^0.17.6", "ansi-escapes": "^7.0.0", "braces": "^3.0.3", "c12": "^1.11.1", @@ -117,6 +117,7 @@ "import-in-the-middle": "1.11.0", "import-meta-resolve": "^4.1.0", "ini": "^5.0.0", + "json-stable-stringify": "^1.3.0", "jsonc-parser": "3.2.1", "magicast": "^0.3.4", "minimatch": "^10.0.1", diff --git a/packages/cli-v3/src/build/buildWorker.ts b/packages/cli-v3/src/build/buildWorker.ts index 6e818a0b1e..b23b802f50 100644 --- a/packages/cli-v3/src/build/buildWorker.ts +++ b/packages/cli-v3/src/build/buildWorker.ts @@ -12,7 +12,7 @@ import { join, relative, sep } from "node:path"; import { generateContainerfile } from "../deploy/buildImage.js"; import { writeFile } from "node:fs/promises"; import { buildManifestToJSON } from "../utilities/buildManifest.js"; -import { readPackageJSON, writePackageJSON } from "pkg-types"; +import { readPackageJSON } from "pkg-types"; import { writeJSONFile } from "../utilities/fileSystem.js"; import { isWindows } from "std-env"; import { pathToFileURL } from "node:url"; @@ -192,20 +192,23 @@ async function writeDeployFiles({ ) ?? {}; // Step 3: Write the resolved dependencies to the package.json file - await writePackageJSON(join(outputPath, "package.json"), { - ...packageJson, - name: packageJson.name ?? "trigger-project", - dependencies: { - ...dependencies, + await writeJSONFile( + join(outputPath, "package.json"), + { + ...packageJson, + name: packageJson.name ?? "trigger-project", + dependencies: { + ...dependencies, + }, + trustedDependencies: Object.keys(dependencies).sort(), + devDependencies: {}, + peerDependencies: {}, + scripts: {}, }, - trustedDependencies: Object.keys(dependencies), - devDependencies: {}, - peerDependencies: {}, - scripts: {}, - }); + true + ); await writeJSONFile(join(outputPath, "build.json"), buildManifestToJSON(buildManifest)); - await writeJSONFile(join(outputPath, "metafile.json"), bundleResult.metafile); await writeContainerfile(outputPath, buildManifest); } diff --git a/packages/cli-v3/src/build/bundle.ts b/packages/cli-v3/src/build/bundle.ts index c085937f68..4d1cfd53f8 100644 --- a/packages/cli-v3/src/build/bundle.ts +++ b/packages/cli-v3/src/build/bundle.ts @@ -414,7 +414,9 @@ export async function createBuildManifestFromBundle({ otelImportHook: { include: resolvedConfig.instrumentedPackageNames ?? [], }, - outputHashes: bundle.outputHashes, + // `outputHashes` is only needed for dev builds for the deduplication mechanism during rebuilds. + // For deploys builds, we omit it to ensure deterministic builds + outputHashes: target === "dev" ? bundle.outputHashes : {}, }; if (!workerDir) { diff --git a/packages/cli-v3/src/deploy/buildImage.ts b/packages/cli-v3/src/deploy/buildImage.ts index e325b58d8f..f060ce0303 100644 --- a/packages/cli-v3/src/deploy/buildImage.ts +++ b/packages/cli-v3/src/deploy/buildImage.ts @@ -193,12 +193,12 @@ async function remoteBuildImage(options: DepotBuildImageOptions): Promise a.name.localeCompare(b.name)), deploy: {}, build: {}, }; diff --git a/packages/cli-v3/src/utilities/fileSystem.ts b/packages/cli-v3/src/utilities/fileSystem.ts index 28178881b1..87d74732eb 100644 --- a/packages/cli-v3/src/utilities/fileSystem.ts +++ b/packages/cli-v3/src/utilities/fileSystem.ts @@ -1,4 +1,5 @@ import fsSync from "fs"; +import stringify from "json-stable-stringify"; import fsModule, { writeFile } from "fs/promises"; import fs from "node:fs"; import { homedir, tmpdir } from "node:os"; @@ -159,7 +160,7 @@ export async function safeReadJSONFile(path: string) { } export async function writeJSONFile(path: string, json: any, pretty = false) { - await safeWriteFile(path, JSON.stringify(json, undefined, pretty ? 2 : undefined)); + await safeWriteFile(path, stringify(json, pretty ? { space: 2 } : undefined) ?? ""); } // Will create the directory if it doesn't exist diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 000ad8ab3d..4102c43736 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1444,6 +1444,9 @@ importers: ini: specifier: ^5.0.0 version: 5.0.0 + json-stable-stringify: + specifier: ^1.3.0 + version: 1.3.0 jsonc-parser: specifier: 3.2.1 version: 3.2.1 @@ -11803,13 +11806,14 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + call-bound@1.0.4: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} @@ -14834,6 +14838,10 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stable-stringify@1.3.0: + resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==} + engines: {node: '>= 0.4'} + json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -14860,6 +14868,9 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + jsonpath-plus@10.3.0: resolution: {integrity: sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==} engines: {node: '>=18.0.0'} @@ -31881,7 +31892,7 @@ snapshots: array.prototype.flat@1.3.2: dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.0 @@ -31895,7 +31906,7 @@ snapshots: array.prototype.flatmap@1.3.2: dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.0 @@ -32328,16 +32339,18 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.2: + call-bind@1.0.7: dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.3.0 + set-function-length: 1.2.2 - call-bind@1.0.7: + call-bind@1.0.8: dependencies: + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - es-errors: 1.3.0 - function-bind: 1.1.2 get-intrinsic: 1.3.0 set-function-length: 1.2.2 @@ -35816,6 +35829,14 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json-stable-stringify@1.3.0: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + isarray: 2.0.5 + jsonify: 0.0.1 + object-keys: 1.1.1 + json-stringify-safe@5.0.1: {} json5@1.0.2: @@ -35842,6 +35863,8 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonify@0.0.1: {} + jsonpath-plus@10.3.0: dependencies: '@jsep-plugin/assignment': 1.3.0(jsep@1.4.0) @@ -40313,7 +40336,7 @@ snapshots: string.prototype.padend@3.1.4: dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 define-properties: 1.1.4 es-abstract: 1.21.1 From 81a8811df6596d945673d6ca008c0e256c11ffc4 Mon Sep 17 00:00:00 2001 From: Saadi Myftija Date: Thu, 11 Dec 2025 14:59:10 +0100 Subject: [PATCH 2/6] Pass in deployment id and version when scheduling runs (supervisor) --- apps/supervisor/src/index.ts | 2 ++ apps/supervisor/src/workloadManager/docker.ts | 2 ++ apps/supervisor/src/workloadManager/kubernetes.ts | 8 ++++++++ apps/supervisor/src/workloadManager/types.ts | 2 ++ .../run-engine/src/engine/systems/dequeueSystem.ts | 5 +++-- packages/core/src/v3/schemas/runEngine.ts | 5 +++-- 6 files changed, 20 insertions(+), 4 deletions(-) diff --git a/apps/supervisor/src/index.ts b/apps/supervisor/src/index.ts index b958897ad4..7a4a93a961 100644 --- a/apps/supervisor/src/index.ts +++ b/apps/supervisor/src/index.ts @@ -252,6 +252,8 @@ class ManagedSupervisor { machine: message.run.machine, orgId: message.organization.id, projectId: message.project.id, + deploymentId: message.deployment.friendlyId, + deploymentVersion: message.deployment.version, runId: message.run.id, runFriendlyId: message.run.friendlyId, version: message.version, diff --git a/apps/supervisor/src/workloadManager/docker.ts b/apps/supervisor/src/workloadManager/docker.ts index 4ebbe11ca7..666d7fdb1e 100644 --- a/apps/supervisor/src/workloadManager/docker.ts +++ b/apps/supervisor/src/workloadManager/docker.ts @@ -72,6 +72,8 @@ export class DockerWorkloadManager implements WorkloadManager { `TRIGGER_DEQUEUED_AT_MS=${opts.dequeuedAt.getTime()}`, `TRIGGER_POD_SCHEDULED_AT_MS=${Date.now()}`, `TRIGGER_ENV_ID=${opts.envId}`, + `TRIGGER_DEPLOYMENT_ID=${opts.deploymentId}`, + `TRIGGER_DEPLOYMENT_VERSION=${opts.deploymentVersion}`, `TRIGGER_RUN_ID=${opts.runFriendlyId}`, `TRIGGER_SNAPSHOT_ID=${opts.snapshotFriendlyId}`, `TRIGGER_SUPERVISOR_API_PROTOCOL=${this.opts.workloadApiProtocol}`, diff --git a/apps/supervisor/src/workloadManager/kubernetes.ts b/apps/supervisor/src/workloadManager/kubernetes.ts index 2042bf8b6a..56854e6232 100644 --- a/apps/supervisor/src/workloadManager/kubernetes.ts +++ b/apps/supervisor/src/workloadManager/kubernetes.ts @@ -123,6 +123,14 @@ export class KubernetesWorkloadManager implements WorkloadManager { name: "TRIGGER_ENV_ID", value: opts.envId, }, + { + name: "TRIGGER_DEPLOYMENT_ID", + value: opts.deploymentId, + }, + { + name: "TRIGGER_DEPLOYMENT_VERSION", + value: opts.deploymentVersion, + }, { name: "TRIGGER_SNAPSHOT_ID", value: opts.snapshotFriendlyId, diff --git a/apps/supervisor/src/workloadManager/types.ts b/apps/supervisor/src/workloadManager/types.ts index 64573fb3b9..e4350f164e 100644 --- a/apps/supervisor/src/workloadManager/types.ts +++ b/apps/supervisor/src/workloadManager/types.ts @@ -29,6 +29,8 @@ export interface WorkloadManagerCreateOptions { envType: EnvironmentType; orgId: string; projectId: string; + deploymentId: string; + deploymentVersion: string; runId: string; runFriendlyId: string; snapshotId: string; diff --git a/internal-packages/run-engine/src/engine/systems/dequeueSystem.ts b/internal-packages/run-engine/src/engine/systems/dequeueSystem.ts index a8316a9880..b21dd0758d 100644 --- a/internal-packages/run-engine/src/engine/systems/dequeueSystem.ts +++ b/internal-packages/run-engine/src/engine/systems/dequeueSystem.ts @@ -560,8 +560,9 @@ export class DequeueSystem { version: result.worker.version, }, deployment: { - id: result.deployment?.id, - friendlyId: result.deployment?.friendlyId, + id: result.deployment?.id ?? "", + friendlyId: result.deployment?.friendlyId ?? "", + version: result.deployment?.version ?? "", imagePlatform: result.deployment?.imagePlatform, }, run: { diff --git a/packages/core/src/v3/schemas/runEngine.ts b/packages/core/src/v3/schemas/runEngine.ts index 376a8522de..ece184d764 100644 --- a/packages/core/src/v3/schemas/runEngine.ts +++ b/packages/core/src/v3/schemas/runEngine.ts @@ -246,8 +246,9 @@ export const DequeuedMessage = z.object({ version: z.string(), }), deployment: z.object({ - id: z.string().optional(), - friendlyId: z.string().optional(), + id: z.string(), + friendlyId: z.string(), + version: z.string(), imagePlatform: z.string().optional(), }), run: z.object({ From 7c49f68a58367e9d9921bcccfbc4948172dff55d Mon Sep 17 00:00:00 2001 From: Saadi Myftija Date: Thu, 11 Dec 2025 16:24:33 +0100 Subject: [PATCH 3/6] Fix sort issue --- packages/cli-v3/src/utilities/buildManifest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli-v3/src/utilities/buildManifest.ts b/packages/cli-v3/src/utilities/buildManifest.ts index a8b5bf7c52..5cddbac71e 100644 --- a/packages/cli-v3/src/utilities/buildManifest.ts +++ b/packages/cli-v3/src/utilities/buildManifest.ts @@ -6,7 +6,7 @@ export function buildManifestToJSON(manifest: BuildManifest): BuildManifest { return { ...rest, // sort externals for deterministic builds - externals: externals?.slice().sort((a, b) => a.name.localeCompare(b.name)), + externals: externals?.slice().sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0)), deploy: {}, build: {}, }; From 8923a6103dbc3caee8793554439c33c42bf3c092 Mon Sep 17 00:00:00 2001 From: Saadi Myftija Date: Thu, 11 Dec 2025 16:44:54 +0100 Subject: [PATCH 4/6] Add changeset --- .changeset/five-pens-fly.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/five-pens-fly.md diff --git a/.changeset/five-pens-fly.md b/.changeset/five-pens-fly.md new file mode 100644 index 0000000000..2251b67e58 --- /dev/null +++ b/.changeset/five-pens-fly.md @@ -0,0 +1,6 @@ +--- +"trigger.dev": minor +"@trigger.dev/core": minor +--- + +feat(cli): deterministic image builds for deployments From bc0b18e1172ab8c0cde6c080143e1276ccfce7ae Mon Sep 17 00:00:00 2001 From: Saadi Myftija Date: Thu, 11 Dec 2025 17:26:59 +0100 Subject: [PATCH 5/6] Add note about the dequeued run schema --- .../run-engine/src/engine/systems/dequeueSystem.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/internal-packages/run-engine/src/engine/systems/dequeueSystem.ts b/internal-packages/run-engine/src/engine/systems/dequeueSystem.ts index b21dd0758d..45c8212918 100644 --- a/internal-packages/run-engine/src/engine/systems/dequeueSystem.ts +++ b/internal-packages/run-engine/src/engine/systems/dequeueSystem.ts @@ -559,11 +559,13 @@ export class DequeueSystem { friendlyId: result.worker.friendlyId, version: result.worker.version, }, + // TODO: use a discriminated union schema to differentiate between dequeued runs in dev and in deployed environments. + // Would help make the typechecking stricter deployment: { - id: result.deployment?.id ?? "", - friendlyId: result.deployment?.friendlyId ?? "", - version: result.deployment?.version ?? "", - imagePlatform: result.deployment?.imagePlatform, + id: result.deployment?.id ?? "NO_DEPLOYMENT_DEV_ENV", + friendlyId: result.deployment?.friendlyId ?? "NO_DEPLOYMENT_DEV_ENV", + version: result.deployment?.version ?? "NO_DEPLOYMENT_DEV_ENV", + imagePlatform: result.deployment?.imagePlatform ?? "NO_DEPLOYMENT_DEV_ENV", }, run: { id: lockedTaskRun.id, From f61159e1a80b7bb3dac7108796ec06f752b76541 Mon Sep 17 00:00:00 2001 From: Saadi Myftija Date: Fri, 12 Dec 2025 09:20:16 +0100 Subject: [PATCH 6/6] Avoid breaking the `DequeuedMessage` schema --- apps/supervisor/src/index.ts | 10 ++++++++-- apps/supervisor/src/workloadManager/docker.ts | 2 +- apps/supervisor/src/workloadManager/kubernetes.ts | 2 +- apps/supervisor/src/workloadManager/types.ts | 2 +- .../run-engine/src/engine/systems/dequeueSystem.ts | 7 +++---- packages/core/src/v3/schemas/runEngine.ts | 5 ++--- 6 files changed, 16 insertions(+), 12 deletions(-) diff --git a/apps/supervisor/src/index.ts b/apps/supervisor/src/index.ts index 7a4a93a961..0e274b3039 100644 --- a/apps/supervisor/src/index.ts +++ b/apps/supervisor/src/index.ts @@ -244,6 +244,12 @@ class ManagedSupervisor { } try { + if (!message.deployment.friendlyId) { + // mostly a type guard, deployments always exists for deployed environments + // a proper fix would be to use a discriminated union schema to differentiate between dequeued runs in dev and in deployed environments. + throw new Error("Deployment is missing"); + } + await this.workloadManager.create({ dequeuedAt: message.dequeuedAt, envId: message.environment.id, @@ -252,8 +258,8 @@ class ManagedSupervisor { machine: message.run.machine, orgId: message.organization.id, projectId: message.project.id, - deploymentId: message.deployment.friendlyId, - deploymentVersion: message.deployment.version, + deploymentFriendlyId: message.deployment.friendlyId, + deploymentVersion: message.backgroundWorker.version, runId: message.run.id, runFriendlyId: message.run.friendlyId, version: message.version, diff --git a/apps/supervisor/src/workloadManager/docker.ts b/apps/supervisor/src/workloadManager/docker.ts index 666d7fdb1e..d6651d325a 100644 --- a/apps/supervisor/src/workloadManager/docker.ts +++ b/apps/supervisor/src/workloadManager/docker.ts @@ -72,7 +72,7 @@ export class DockerWorkloadManager implements WorkloadManager { `TRIGGER_DEQUEUED_AT_MS=${opts.dequeuedAt.getTime()}`, `TRIGGER_POD_SCHEDULED_AT_MS=${Date.now()}`, `TRIGGER_ENV_ID=${opts.envId}`, - `TRIGGER_DEPLOYMENT_ID=${opts.deploymentId}`, + `TRIGGER_DEPLOYMENT_ID=${opts.deploymentFriendlyId}`, `TRIGGER_DEPLOYMENT_VERSION=${opts.deploymentVersion}`, `TRIGGER_RUN_ID=${opts.runFriendlyId}`, `TRIGGER_SNAPSHOT_ID=${opts.snapshotFriendlyId}`, diff --git a/apps/supervisor/src/workloadManager/kubernetes.ts b/apps/supervisor/src/workloadManager/kubernetes.ts index 56854e6232..96fbd7a274 100644 --- a/apps/supervisor/src/workloadManager/kubernetes.ts +++ b/apps/supervisor/src/workloadManager/kubernetes.ts @@ -125,7 +125,7 @@ export class KubernetesWorkloadManager implements WorkloadManager { }, { name: "TRIGGER_DEPLOYMENT_ID", - value: opts.deploymentId, + value: opts.deploymentFriendlyId, }, { name: "TRIGGER_DEPLOYMENT_VERSION", diff --git a/apps/supervisor/src/workloadManager/types.ts b/apps/supervisor/src/workloadManager/types.ts index e4350f164e..90b6195779 100644 --- a/apps/supervisor/src/workloadManager/types.ts +++ b/apps/supervisor/src/workloadManager/types.ts @@ -29,7 +29,7 @@ export interface WorkloadManagerCreateOptions { envType: EnvironmentType; orgId: string; projectId: string; - deploymentId: string; + deploymentFriendlyId: string; deploymentVersion: string; runId: string; runFriendlyId: string; diff --git a/internal-packages/run-engine/src/engine/systems/dequeueSystem.ts b/internal-packages/run-engine/src/engine/systems/dequeueSystem.ts index 45c8212918..5a951a645c 100644 --- a/internal-packages/run-engine/src/engine/systems/dequeueSystem.ts +++ b/internal-packages/run-engine/src/engine/systems/dequeueSystem.ts @@ -562,10 +562,9 @@ export class DequeueSystem { // TODO: use a discriminated union schema to differentiate between dequeued runs in dev and in deployed environments. // Would help make the typechecking stricter deployment: { - id: result.deployment?.id ?? "NO_DEPLOYMENT_DEV_ENV", - friendlyId: result.deployment?.friendlyId ?? "NO_DEPLOYMENT_DEV_ENV", - version: result.deployment?.version ?? "NO_DEPLOYMENT_DEV_ENV", - imagePlatform: result.deployment?.imagePlatform ?? "NO_DEPLOYMENT_DEV_ENV", + id: result.deployment?.id, + friendlyId: result.deployment?.friendlyId, + imagePlatform: result.deployment?.imagePlatform, }, run: { id: lockedTaskRun.id, diff --git a/packages/core/src/v3/schemas/runEngine.ts b/packages/core/src/v3/schemas/runEngine.ts index ece184d764..376a8522de 100644 --- a/packages/core/src/v3/schemas/runEngine.ts +++ b/packages/core/src/v3/schemas/runEngine.ts @@ -246,9 +246,8 @@ export const DequeuedMessage = z.object({ version: z.string(), }), deployment: z.object({ - id: z.string(), - friendlyId: z.string(), - version: z.string(), + id: z.string().optional(), + friendlyId: z.string().optional(), imagePlatform: z.string().optional(), }), run: z.object({