Skip to content

fix: stop triage loop at completion-summary node + i18n object-key crashes (#1863)#1866

Merged
gsxdsm merged 3 commits into
mainfrom
feature/fix-triage
Jul 2, 2026
Merged

fix: stop triage loop at completion-summary node + i18n object-key crashes (#1863)#1866
gsxdsm merged 3 commits into
mainfrom
feature/fix-triage

Conversation

@gsxdsm

@gsxdsm gsxdsm commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

Fixes #1863.

The issue conflated two distinct v0.52.0 regressions (the reporter's i18n root-cause guess was only half of it).

1. The real triage loop — engine (primary fix)

The completion-summary graph node was added to every built-in workflow in v0.52.0 (FN-7228/FN-7233), wired with a success-only edge — no failure edge. It's a best-effort node (ensureWorkflowCompletionSummary already backfills task.summary), but two failure paths bypass its advisory !blocking → success coercion:

  • a thrown handler exception (e.g. missing worktree) → executeNodeWithRetries returns value:"exception"
  • a failed summary projection writepublishTaskProjectionFromResult returns value:"projection-error"

With no failure edge, either terminates the graph at completion-summary. routeGraphFailureToExecutionResume then treats the in-review failure as recoverable and moves the task back to todo, which replays the already-passed nodes (0 new tokens) and fails again — the infinite triage → in-progress → todo loop in the report (token usage 0, execution NOT STARTED).

Fix: the graph executor now degrades a completion-summary node failure to success so the graph always advances, with a routeGraphFailureToExecutionResume backstop that parks failed instead of looping. Shared isCompletionSummaryNode predicate exported from @fusion/core.

2. The i18n crash the reporter saw — dashboard

t("taskDetail.executionMode") resolves to a nested object (the inline mode-toggle copy), so i18next returns "key 'taskDetail.executionMode (en)' returned an object instead of string" and crashes the Stats tab — the exact error in the report. Surface enumeration found two more callers of the same class: routing.source and nodes.dockerHost. Added leaf label keys across all 6 locales and switched the callers.

Tests

  • workflow-graph-completion-summary-nonfatal.test.ts — a failing summary node (both modes) never terminates/loops the graph, a non-summary node still fails, and all 5 built-ins have no failure edge. Fails without the engine fix.
  • i18n-string-keys-not-objects.test.ts — invariant guard scanning every t("literal") caller against the real en/app.json. Catches a reverted caller.
  • TaskTokenStatsPanel.test.tsx — reproduces the exact i18next error against the real bundle.

Verification

  • Merge gate: 317 engine-core + 63 CI-shape pass
  • Core/engine typecheck clean; i18n parity + typecheck pass; changeset validates
  • All touched dashboard/core/engine suites green

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes

    • Fixed an issue where completion-summary failures could cause tasks to loop indefinitely during resume.
    • Made completion-summary behavior best-effort so workflows keep progressing even when summary handling fails.
    • Prevented dashboard crashes by ensuring UI labels use leaf translation keys (not nested objects).
  • New Features

    • Added missing i18n label keys for Docker host, routing source, and execution mode across multiple languages.
  • Tests

    • Added regression coverage for completion-summary non-fatal handling and translation-key validation.

…crashes (#1863)

Two distinct v0.52.0 regressions reported in issue #1863.

1. Triage loop (engine): the best-effort completion-summary graph node is
   wired into every built-in workflow with a success-only edge. A thrown
   handler exception or a failed summary projection write bypassed the
   advisory `!blocking -> success` coercion, terminated the graph at
   'completion-summary', and routeGraphFailureToExecutionResume bounced the
   in-review task back to todo forever (token usage 0, execution NOT STARTED).
   The graph executor now degrades a completion-summary node failure to
   success (ensureWorkflowCompletionSummary still backfills task.summary), with
   a routeGraphFailureToExecutionResume backstop. Shared isCompletionSummaryNode
   predicate exported from @fusion/core.

2. i18n object-key crashes (dashboard): three views called t() with keys that
   resolve to nested objects (taskDetail.executionMode, routing.source,
   nodes.dockerHost), so i18next returned "returned an object instead of
   string" and crashed the render. Added leaf label keys across all locales and
   switched the callers.

Tests: engine non-fatal completion-summary regression (fails without the fix),
dashboard invariant guard scanning t("literal") callers against real en/app.json,
and a Stats-panel reproduction against the real bundle.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@gsxdsm, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 7 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: e4547214-d92a-47db-a623-850d4974b540

📥 Commits

Reviewing files that changed from the base of the PR and between 98db287 and 704e891.

📒 Files selected for processing (1)
  • packages/engine/src/executor.ts
📝 Walkthrough

Walkthrough

This PR makes completion-summary node failures non-fatal, adds leaf i18n label keys and updates dashboard usage to avoid object-valued translation lookups, and switches pi-claude-cli to the builtin Anthropic model catalog API with matching dependency and test updates.

Changes

Completion-Summary Non-Fatal Execution

Layer / File(s) Summary
Completion-summary predicate and re-exports
packages/core/src/builtin-completion-summary-node.ts, packages/core/src/index.ts, packages/core/src/workflow-lifecycle-validation.ts
Adds isCompletionSummaryNode, re-exports completion-summary symbols, and uses the helper in workflow lifecycle validation.
Graph executor degrade logic and router backstop
packages/engine/src/workflow-graph-executor.ts, packages/engine/src/executor.ts, packages/engine/src/__tests__/workflow-graph-completion-summary-nonfatal.test.ts, .changeset/fix-stats-execution-mode-object-key.md
Completion-summary handler and projection failures now degrade to success, the executor router stops retry looping for that node, and regression coverage plus release notes are added.

i18n Leaf-Key Fixes and Guard Test

Layer / File(s) Summary
New leaf translation keys across locales and typings
packages/i18n/locales/en|es|fr|ko|zh-CN|zh-TW/app.json, packages/i18n/src/resources.d.ts
Adds dockerHostLabel, sourceLabel, and executionModeLabel keys across locale files and generated resource typings.
Dashboard components switched to leaf keys
packages/dashboard/app/__tests__/i18n-string-keys-not-objects.test.ts, packages/dashboard/app/components/NodeDetailModal.tsx, RoutingTab.tsx, TaskTokenStatsPanel.tsx, TaskTokenStatsPanel.test.tsx
Replaces nested object translation keys with leaf label keys in three components and adds regression and guard tests for object-valued translation lookups.

pi-claude-cli builtin model catalog

Layer / File(s) Summary
Builtin catalog accessor and dependency pinning
packages/pi-claude-cli/index.ts, packages/pi-claude-cli/package.json
Uses getBuiltinModels("anthropic") for catalog construction and pins the related pi-ai packages in dev and peer dependencies.
Provider test updates
packages/pi-claude-cli/src/__tests__/provider.test.ts
Updates the provider test mocks and catalog stubs to use the builtin-models API.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant workflow-graph-executor as workflow-graph-executor
  participant completion-summary node as completion-summary node
  participant publishTaskProjection as publishTaskProjection
  participant executor router as executor router

  workflow-graph-executor->>completion-summary node: executeNodeWithRetries
  completion-summary node--xworkflow-graph-executor: handler throws
  workflow-graph-executor->>workflow-graph-executor: degrade to success
  workflow-graph-executor->>publishTaskProjection: publishTaskProjectionFromResult
  publishTaskProjection--xworkflow-graph-executor: projection write fails
  workflow-graph-executor->>workflow-graph-executor: keep original result
  executor router->>executor router: failedNode === COMPLETION_SUMMARY_NODE_ID
  executor router-->>executor router: return false
Loading

Possibly related PRs

  • Runfusion/Fusion#1540: Both PRs modify the projection publishing pipeline in workflow-graph-executor.ts, including publishTaskProjectionFromResult failure handling.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The pi-claude-cli dependency/catalog changes are unrelated to the completion-summary and dashboard i18n fixes. Remove or split the unrelated pi-claude-cli changes into a separate PR focused on dependency/catalog updates.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly names both main fixes: the completion-summary triage loop and the i18n object-key crash.
Linked Issues check ✅ Passed The PR updates the workflow executor and i18n keys/tests to prevent completion-summary failures and nested-object translation crashes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/fix-triage

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR fixes two distinct v0.52.0 regressions reported in issue #1863.

  • Engine triage loop (primary): the completion-summary graph node was wired with a success-only edge but had two failure escape paths (handler exception and projection-write failure) that could terminate the graph and send the task into an infinite in-review → todo replay cycle. The graph executor now degrades both failure modes to success for any isCompletionSummaryNode, with a secondary backstop in routeGraphFailureToExecutionResume that parks the task failed rather than looping it.
  • i18n object-key crashes: three dashboard views called t() with keys that resolved to nested objects (taskDetail.executionMode, routing.source, nodes.dockerHost), causing i18next to render an error string and crash those tabs. New leaf keys were added across all six locales and callers updated. A new invariant test walks all dashboard source files against the real en/app.json to catch future regressions of this class.

Confidence Score: 5/5

Safe to merge — both failure paths in the graph executor are correctly degraded for the completion-summary node, the i18n leaf-key additions are complete across all six locales, and the regression tests cover the invariant end-to-end.

Both bug-fix paths (handler throw → isCompletionSummaryNode degrade; projection-write failure → swallowed and kept as success) are exercised by independent tests. The built-in workflow surface enumeration test locks the no-failure-edge assumption. The i18n invariant test will catch any future object-key regression. The pi-claude-cli migration is a targeted API rename with matching mock updates. No regressions introduced.

No files require special attention. The one P2 observation (the i18n static scanner does not cover template-literal t() calls) is a documentation gap, not a functional defect.

Important Files Changed

Filename Overview
packages/engine/src/workflow-graph-executor.ts Two targeted patches: degrade a failing completion-summary handler (exception path) to success after retries, and swallow a DB projection-write failure for the same node — both via isCompletionSummaryNode. Logic is correct and both failure modes are independently tested.
packages/engine/src/executor.ts Adds backstop in routeGraphFailureToExecutionResume that parks the task as failed (instead of looping it back to todo) when the failed node is the completion-summary node by ID. Correctly positioned as a secondary safety net; the primary fix lives in the graph executor.
packages/core/src/builtin-completion-summary-node.ts Adds isCompletionSummaryNode predicate exported as the single source of truth. Matches both the fixed built-in ID and any plugin node with summaryTarget: task. Correctly replaces the duplicated inline string comparison in workflow-lifecycle-validation.ts.
packages/dashboard/app/tests/i18n-string-keys-not-objects.test.ts Invariant guard that walks dashboard source at test time and flags any t(literal) call whose key resolves to a nested object in the real en/app.json. Correctly excludes tests dirs and returnObjects:true call sites. Logic is sound; minor limitations (template literals, variables) are acceptable for a static scanner.
packages/engine/src/tests/workflow-graph-completion-summary-nonfatal.test.ts Regression suite covering both failure modes (handler throw + projection-write failure) plus a non-summary node that must still fail, and a surface-enumeration test asserting all 5 built-in workflows wire completion-summary with no failure edge. Thorough coverage of the invariant.
packages/dashboard/app/components/TaskTokenStatsPanel.tsx Switches t(taskDetail.executionMode) (a nested-object key) to t(taskDetail.executionModeLabel) (a leaf string key), fixing the i18next crash that rendered the Stats tab unusable.
packages/dashboard/app/components/RoutingTab.tsx Switches t(routing.source) (object key, contains noRouting/override/projectDefault sub-keys) to t(routing.sourceLabel) (new leaf key). Fix is correct; new locale keys are present across all 6 bundles.
packages/dashboard/app/components/NodeDetailModal.tsx Switches t(nodes.dockerHost) (nested object) to t(nodes.dockerHostLabel) (new leaf key). Fix is correct and consistent with the other two i18n sites.
packages/pi-claude-cli/index.ts Migrates from deprecated getModels (top-level pi-ai export) to getBuiltinModels from @earendil-works/pi-ai/providers/all following pi-ai 0.80 restructure. Test mock updated to the new subpath. Package version pins unified in devDependencies.
packages/i18n/locales/en/app.json Adds three new leaf keys (nodes.dockerHostLabel, routing.sourceLabel, taskDetail.executionModeLabel) adjacent to the existing nested-object siblings they replace in the callers.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[executeNodeWithRetries] --> B{All retries exhausted?}
    B -- No --> C[Handler succeeds - return result]
    B -- Yes --> D{isCompletionSummaryNode?}
    D -- Yes --> E[Degrade to success value: summary-unavailable]
    D -- No --> F[Return failure value: exception]

    G[publishTaskProjectionFromResult] --> H{publishTaskProjection throws?}
    H -- No --> I[Return result unchanged]
    H -- Yes --> J{isCompletionSummaryNode?}
    J -- Yes --> K[Return result with projectionError in contextPatch keep outcome]
    J -- No --> L[Return failure value: projection-error]

    E --> M[Graph continues to next node]
    K --> M
    F --> N[Graph terminates]
    L --> N

    N --> O[routeGraphFailureToExecutionResume]
    O --> P{failedNode === COMPLETION_SUMMARY_NODE_ID?}
    P -- Yes --> Q[Park task as failed backstop]
    P -- No --> R[Normal resume logic: move to todo]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A[executeNodeWithRetries] --> B{All retries exhausted?}
    B -- No --> C[Handler succeeds - return result]
    B -- Yes --> D{isCompletionSummaryNode?}
    D -- Yes --> E[Degrade to success value: summary-unavailable]
    D -- No --> F[Return failure value: exception]

    G[publishTaskProjectionFromResult] --> H{publishTaskProjection throws?}
    H -- No --> I[Return result unchanged]
    H -- Yes --> J{isCompletionSummaryNode?}
    J -- Yes --> K[Return result with projectionError in contextPatch keep outcome]
    J -- No --> L[Return failure value: projection-error]

    E --> M[Graph continues to next node]
    K --> M
    F --> N[Graph terminates]
    L --> N

    N --> O[routeGraphFailureToExecutionResume]
    O --> P{failedNode === COMPLETION_SUMMARY_NODE_ID?}
    P -- Yes --> Q[Park task as failed backstop]
    P -- No --> R[Normal resume logic: move to todo]
Loading

Reviews (2): Last reviewed commit: "Merge origin/main into feature/fix-triag..." | Re-trigger Greptile

* let the caller park the task `failed` (a visible terminal state) instead of
* looping it forever.
*/
if (failedNode === COMPLETION_SUMMARY_NODE_ID) return false;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 The backstop checks failedNode === COMPLETION_SUMMARY_NODE_ID (ID-only), but isCompletionSummaryNode — used by the graph executor for the actual degradation — also matches nodes whose config.summaryTarget === "task" with a different ID. If a plugin workflow wires a summaryTarget:"task" node under a custom ID and somehow its failure reaches this router, the backstop would not fire and the task would still loop. Aligning the check with the predicate closes the gap cleanly, even though the PR correctly notes this path should be unreachable after the graph-executor fix.

Suggested change
if (failedNode === COMPLETION_SUMMARY_NODE_ID) return false;
if (failedNode === COMPLETION_SUMMARY_NODE_ID || isCompletionSummaryNode({ id: failedNode })) return false;

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
packages/engine/src/workflow-graph-executor.ts (1)

1210-1233: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Degrade logic is sound but leaves no operator-visible trace of the underlying failure.

Both branches swallow the real error into an in-memory context patch only. Since completion-summary has no skillName, shouldRecordNodeProgress never records it into task.workflowStepResults, and neither branch calls this.deps.logTaskEntry?.(...) (unlike the post-merge traversal-error path a few lines above, which does log). A recurring failure (e.g. a persistent model/provider outage) would silently degrade to "success" on every run with zero signal in the task log.

Consider adding a logTaskEntry call in each branch so operators can still notice a systemically failing summary node.

♻️ Proposed logging addition
     if (isCompletionSummaryNode(node)) {
+      this.deps.logTaskEntry?.(
+        `[completion-summary] node handler failed after retries — degrading to success: ${lastError instanceof Error ? lastError.message : String(lastError)}`,
+      );
       const degraded: WorkflowNodeResult = {
       if (isCompletionSummaryNode(node)) {
+        this.deps.logTaskEntry?.(
+          `[completion-summary] projection write failed — preserving node outcome: ${error instanceof Error ? error.message : String(error)}`,
+        );
         return {

Also applies to: 1354-1372

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/engine/src/workflow-graph-executor.ts` around lines 1210 - 1233, The
completion-summary degrade path in workflow-graph-executor swallows the
underlying exception into contextPatch without any operator-visible log. In the
isCompletionSummaryNode(node) branch, add a this.deps.logTaskEntry?.(...) call
before returning the degraded WorkflowNodeResult, and do the same in the other
completion-summary fallback branch referenced by the review so persistent
failures are visible in task logs. Use the existing node.id, lastError, and
degraded result context to keep the message consistent with nearby
traversal-error logging.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@packages/engine/src/workflow-graph-executor.ts`:
- Around line 1210-1233: The completion-summary degrade path in
workflow-graph-executor swallows the underlying exception into contextPatch
without any operator-visible log. In the isCompletionSummaryNode(node) branch,
add a this.deps.logTaskEntry?.(...) call before returning the degraded
WorkflowNodeResult, and do the same in the other completion-summary fallback
branch referenced by the review so persistent failures are visible in task logs.
Use the existing node.id, lastError, and degraded result context to keep the
message consistent with nearby traversal-error logging.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: d8aba147-8c6d-4942-a0a1-f39a81213451

📥 Commits

Reviewing files that changed from the base of the PR and between c59ae0b and 3884169.

📒 Files selected for processing (19)
  • .changeset/fix-stats-execution-mode-object-key.md
  • packages/core/src/builtin-completion-summary-node.ts
  • packages/core/src/index.ts
  • packages/core/src/workflow-lifecycle-validation.ts
  • packages/dashboard/app/__tests__/i18n-string-keys-not-objects.test.ts
  • packages/dashboard/app/components/NodeDetailModal.tsx
  • packages/dashboard/app/components/RoutingTab.tsx
  • packages/dashboard/app/components/TaskTokenStatsPanel.tsx
  • packages/dashboard/app/components/__tests__/TaskTokenStatsPanel.test.tsx
  • packages/engine/src/__tests__/workflow-graph-completion-summary-nonfatal.test.ts
  • packages/engine/src/executor.ts
  • packages/engine/src/workflow-graph-executor.ts
  • packages/i18n/locales/en/app.json
  • packages/i18n/locales/es/app.json
  • packages/i18n/locales/fr/app.json
  • packages/i18n/locales/ko/app.json
  • packages/i18n/locales/zh-CN/app.json
  • packages/i18n/locales/zh-TW/app.json
  • packages/i18n/src/resources.d.ts

gsxdsm and others added 2 commits July 1, 2026 17:05
…to getBuiltinModels

The Typecheck CI gate was failing because pi-claude-cli declared pi-ai and
pi-coding-agent as unpinned "*" peers. pi-ai 0.80 was published and, via
hoisting/non-frozen resolution, the bare `@earendil-works/pi-ai` import floated
to 0.80.3 — which moved the top-level `getModels` export to the deprecated
`/compat` shim ("has no exported member named 'getModels'").

Migrate forward to the latest, consistent with cli/engine which already pin
^0.80.3:
- Pin pi-ai and pi-coding-agent to ^0.80.3 (peer + dev) so the whole extension
  resolves one pi-ai version; pinning pi-coding-agent too avoids the
  AssistantMessageEventStream type skew that a pi-ai-only bump reintroduced.
- Import the canonical `getBuiltinModels` from
  `@earendil-works/pi-ai/providers/all` (identical signature to the old
  `getModels`; the top-level export is now the deprecated compat alias).
- Update the provider test mock to the new subpath.

Behavior-preserving: getBuiltinModels === getModels. Typecheck, the full
recursive typecheck, and all 347 pi-claude-cli tests pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Resolves the pnpm-lock.yaml conflict. Main's #1865 (review-checkout routing)
auto-merged cleanly with the completion-summary backstop in executor.ts.

Main independently pinned pi-claude-cli's pi-ai/pi-coding-agent to ^0.80.3
(e154892) but kept the top-level `getModels` import, which 0.80.3 removed —
this branch's migration to `getBuiltinModels` from `/providers/all` is retained
as the working fix. Lockfile regenerated against the merged package.json.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@gsxdsm gsxdsm merged commit 615431b into main Jul 2, 2026
6 checks passed
@gsxdsm gsxdsm deleted the feature/fix-triage branch July 2, 2026 00:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

v0.52.0: Triage always fails with "Workflow graph terminated with failure at node 'completion-summary'" — i18n key returns object instead of string

1 participant