-
Notifications
You must be signed in to change notification settings - Fork 3
fix(cli): report effective workflow timeouts #884
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| --- | ||
| "@gh-symphony/cli": patch | ||
| --- | ||
|
|
||
| Report the effective runtime timeout values and their configuration source from `workflow validate`, including a stable three-field JSON timeout object (#882). | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -7,6 +7,7 @@ import { | |
| WorkflowValidationError, | ||
| renderPrompt, | ||
| resolveWorkflowExecutionPhase, | ||
| resolveWorkflowRuntimeTimeouts, | ||
| type TrackedIssue, | ||
| } from "@gh-symphony/core"; | ||
| import { | ||
|
|
@@ -105,10 +106,13 @@ type WorkflowValidationReport = { | |
| approvalPolicy: string | null; | ||
| threadSandbox: string | null; | ||
| turnSandboxPolicy: string | null; | ||
| }; | ||
| runtimeTimeouts: { | ||
| readTimeoutMs: number; | ||
| stallTimeoutMs: number; | ||
| turnTimeoutMs: number; | ||
| }; | ||
| runtimeTimeoutSource: "runtime.timeouts" | "codex/defaults"; | ||
| hooks: { | ||
| afterCreate: string | null; | ||
| beforeRun: string | null; | ||
|
|
@@ -843,6 +847,7 @@ function validateWorkflow( | |
| return "pass" as const; | ||
| })() | ||
| : ("skip" as const); | ||
| const effectiveTimeouts = resolveWorkflowRuntimeTimeouts(workflow); | ||
|
|
||
| return { | ||
| ok: true, | ||
|
|
@@ -878,10 +883,15 @@ function validateWorkflow( | |
| approvalPolicy: workflow.codex.approvalPolicy, | ||
| threadSandbox: workflow.codex.threadSandbox, | ||
| turnSandboxPolicy: workflow.codex.turnSandboxPolicy, | ||
| readTimeoutMs: workflow.codex.readTimeoutMs, | ||
| stallTimeoutMs: workflow.codex.stallTimeoutMs, | ||
| turnTimeoutMs: workflow.codex.turnTimeoutMs, | ||
| }, | ||
| runtimeTimeouts: { | ||
| readTimeoutMs: effectiveTimeouts.readTimeoutMs, | ||
| stallTimeoutMs: effectiveTimeouts.stallTimeoutMs, | ||
| turnTimeoutMs: effectiveTimeouts.turnTimeoutMs, | ||
| }, | ||
| runtimeTimeoutSource: workflow.runtime | ||
| ? "runtime.timeouts" | ||
| : "codex/defaults", | ||
|
Comment on lines
+892
to
+894
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. P3 — the source is re-derived here instead of coming from the resolver, so it can silently drift when #888 lands.
The drift risk is that this is a duplicated invariant rather than a derived one. #888 is about changing precisely that precedence; when it changes the resolver, nothing here fails to compile and no test in this file necessarily fails — the label just starts lying again, in the same class of way #882 was filed for. Cheap insurance, and it makes the follow-up in the sibling comment fall out for free: have the resolver return the provenance alongside the values (or add a thin Non-blocking — the current output is correct and verified. Generated by Claude Code |
||
| hooks: { | ||
| afterCreate: workflow.hooks.afterCreate, | ||
| beforeRun: workflow.hooks.beforeRun, | ||
|
|
@@ -920,9 +930,9 @@ Runtime | |
| codex.approval_policy=${report.summary.codex.approvalPolicy ?? "unset"} | ||
| codex.thread_sandbox=${report.summary.codex.threadSandbox ?? "unset"} | ||
| codex.turn_sandbox_policy=${report.summary.codex.turnSandboxPolicy ?? "unset"} | ||
| codex.read_timeout_ms=${report.summary.codex.readTimeoutMs} | ||
| codex.stall_timeout_ms=${report.summary.codex.stallTimeoutMs} | ||
| codex.turn_timeout_ms=${report.summary.codex.turnTimeoutMs} | ||
| runtime.timeouts.read_timeout_ms=${report.summary.runtimeTimeouts.readTimeoutMs} (source: ${report.summary.runtimeTimeoutSource}) | ||
| runtime.timeouts.stall_timeout_ms=${report.summary.runtimeTimeouts.stallTimeoutMs} (source: ${report.summary.runtimeTimeoutSource}) | ||
| runtime.timeouts.turn_timeout_ms=${report.summary.runtimeTimeouts.turnTimeoutMs} (source: ${report.summary.runtimeTimeoutSource}) | ||
|
Comment on lines
+933
to
+935
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. P3 — The source label is one value for all three lines, so it can only say "not codex:
read_timeout_ms: 77777777 came from This is a real improvement over the previous head and I'm not blocking on it, but the criterion asked for the source to be unambiguous, and per-field provenance is what actually delivers that: resolve each field and label it nit, same lines: Generated by Claude Code |
||
|
|
||
| Hooks | ||
| after_create=${report.summary.hooks.afterCreate ?? "unset"} | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
P3 —
patchunderstates a removal of released--jsonkeys.I agree with your call on the codex bot's alias request:
summary.codex.*TimeoutMscould report values the runtime never used, so aliasing them forward would preserve exactly the failure #882 exists to kill. Removing them is right.The severity is the separate question that thread didn't cover.
summary.codex.{readTimeoutMs,stallTimeoutMs,turnTimeoutMs}were in releasedworkflow validate --jsonoutput and are now absent — I confirmed against the built CLI at this head thatsummary.codexcarries onlyapprovalPolicy,threadSandbox,turnSandboxPolicy. Automation reading those keys getsundefined, not a wrong number, which is the better failure but still a break.A
minorbump would put the removal in the changelog where a consumer pinning~actually sees it before it bites. The one-line body is otherwise good and does mention the new object.Your call — if CLI
--jsonoutput isn't covered by the package's compat surface, say so and this drops.Generated by Claude Code