You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The ?? workflow.codex arm is unreachable for any workflow that declares a runtime: block, because the parser materializes runtime.timeouts with hardcoded defaults whenever a runtime: block is present. A legacy top-level codex: timeout declaration is then silently discarded.
The orchestrator forwards this resolver to the runtime, so this is a behavior bug, not only a reporting one.
Reproduction
Front-matter containing both a runtime: block with no timeouts: sub-block and a legacy top-level codex: block:
The declared 7777 / 88888 is dropped without a warning. Removing the runtime: block resolves correctly to 7777, which confirms the trigger is the presence of the runtime: block rather than the codex: block being malformed.
Why it matters
This is the mirror of #882. There the CLI reported a value the runtime did not use; here the runtime uses a value the operator did not declare. A repository migrating from the legacy codex: timeouts to runtime.timeouts — the exact state where both blocks coexist — silently reverts to a 5s read timeout and a 300s stall timeout. On this repository those defaults are 6x and 3x tighter than the declared values, which is the failure mode #882 was chasing.
Found while verifying #884 (PR for #882). Not caused by that PR: main and the PR branch resolve identically here. #884 is correct to report the effective value; this issue is about the effective value itself being wrong.
Suggested fix
Distinguish "declared" from "defaulted" for runtime.timeouts so the fallback can actually fire — e.g. keep runtime.timeouts optional through parsing and apply defaults only in resolveWorkflowRuntimeTimeouts after the ?? workflow.codex arm, or track which timeout fields were explicitly present.
Per-field merge is worth considering: today a runtime.timeouts block that sets only read_timeout_ms also silently defaults the other two rather than inheriting them from codex:.
Either way, a workflow declaring both blocks should not lose the declared values in silence — a validation warning naming the shadowed keys would help operators mid-migration.
Acceptance
A workflow with a runtime: block, no runtime.timeouts:, and a legacy codex: timeout block resolves to the codex: values.
Problem
resolveWorkflowRuntimeTimeouts(packages/core/src/workflow/config.ts:285) is written as a fallback:The
?? workflow.codexarm is unreachable for any workflow that declares aruntime:block, because the parser materializesruntime.timeoutswith hardcoded defaults whenever aruntime:block is present. A legacy top-levelcodex:timeout declaration is then silently discarded.The orchestrator forwards this resolver to the runtime, so this is a behavior bug, not only a reporting one.
Reproduction
Front-matter containing both a
runtime:block with notimeouts:sub-block and a legacy top-levelcodex:block:The declared 7777 / 88888 is dropped without a warning. Removing the
runtime:block resolves correctly to 7777, which confirms the trigger is the presence of theruntime:block rather than thecodex:block being malformed.Why it matters
This is the mirror of #882. There the CLI reported a value the runtime did not use; here the runtime uses a value the operator did not declare. A repository migrating from the legacy
codex:timeouts toruntime.timeouts— the exact state where both blocks coexist — silently reverts to a 5s read timeout and a 300s stall timeout. On this repository those defaults are 6x and 3x tighter than the declared values, which is the failure mode #882 was chasing.Found while verifying #884 (PR for #882). Not caused by that PR:
mainand the PR branch resolve identically here. #884 is correct to report the effective value; this issue is about the effective value itself being wrong.Suggested fix
Distinguish "declared" from "defaulted" for
runtime.timeoutsso the fallback can actually fire — e.g. keepruntime.timeoutsoptional through parsing and apply defaults only inresolveWorkflowRuntimeTimeoutsafter the?? workflow.codexarm, or track which timeout fields were explicitly present.Per-field merge is worth considering: today a
runtime.timeoutsblock that sets onlyread_timeout_msalso silently defaults the other two rather than inheriting them fromcodex:.Either way, a workflow declaring both blocks should not lose the declared values in silence — a validation warning naming the shadowed keys would help operators mid-migration.
Acceptance
runtime:block, noruntime.timeouts:, and a legacycodex:timeout block resolves to thecodex:values.runtime.timeouts:continues to resolve to those values (fix(cli): workflow validate reports codex timeouts the runtime does not use #882 behavior preserved).packages/corecover all three, plus the partial-runtime.timeoutscase.