Skip to content

fix(runs): repair false opencode timeouts (BLO-22922) - #1146

Open
kkroo wants to merge 7 commits into
masterfrom
codex/blo-22922-timedout-exit0
Open

fix(runs): repair false opencode timeouts (BLO-22922)#1146
kkroo wants to merge 7 commits into
masterfrom
codex/blo-22922-timedout-exit0

Conversation

@kkroo

@kkroo kkroo commented Aug 7, 2026

Copy link
Copy Markdown

Thinking Path

  • Paperclip is the control plane that schedules agents and records each heartbeat run outcome
  • Adapter execution results are normalized by the server into authoritative run statuses and operational metrics
  • The opencode_k8s adapter could return the contradictory pair timedOut: true and exitCode: 0 after a healthy long-running Job
  • Paperclip trusted the timeout marker and persisted successful Ally runs as timed_out, distorting retry behavior and failure-rate accounting
  • The adapter must stop producing that pair, and the server must reject it if any adapter produces it again
  • Existing contradictory rows also need a deterministic, auditable repair
  • This pull request fixes all three layers so future and historical run outcomes agree with the successful process exit

Linked Issues or Issue Description

Paperclip work item: BLO-22922

What happened? With opencode_k8s.timeoutSec set to a positive value, the adapter armed a 30-second Job-condition grace timer at Job launch. A healthy Job that ran longer could later exit 0 while retaining timedOut: true; Paperclip stored that run as timed_out.

Expected behavior: The grace period begins only after pod log streaming exits, and a confirmed exit code 0 is persisted as success even if a malformed adapter also reports a timeout marker.

Steps to reproduce:

  1. Configure an opencode_k8s agent with a positive timeoutSec.
  2. Run a healthy heartbeat Job for longer than the adapter grace interval and let it exit 0.
  3. Before this fix, inspect heartbeat_runs: the row can have status = timed_out and exit_code = 0.

Paperclip version or commit: Reproduced on Blockcast Paperclip master before c794754d6.

Deployment mode: Docker, self-hosted server, external Postgres, custom external plugin adapter.

What Changed

  • Pin opencode_k8s to reviewed adapter commit 8f427267, which starts grace only after log-stream exit and rejects timeout on exit 0.
  • Add a server-side invariant so timedOut: true cannot override a confirmed exitCode: 0, while preserving genuine timeout and failure outcomes.
  • Add migration 0212 to repair all 1,190 historical contradictory rows, clear stale timeout/error/liveness fields, and annotate result_json.outcomeCorrection.
  • Update both Docker adapter-pin contracts and add focused heartbeat outcome coverage.

Verification

  • pnpm exec vitest run server/src/__tests__/heartbeat-timeout-outcome.test.ts server/src/__tests__/docker-opencode-runtime-pin.test.ts
  • node --test scripts/opencode-k8s-runtime-cache-pin.test.js
  • pnpm --filter @paperclipai/db typecheck
  • pnpm --filter @paperclipai/server typecheck
  • git diff --check origin/master...HEAD
  • Adapter PR kkroo/paperclip-adapter-opencode-k8s#55: 606 tests, typecheck, build, and diff check pass.
  • Migration exercised against a temporary table using the production schema: UPDATE 3, zero contradictory rows afterward, transaction rolled back.

Risks

  • The migration rewrites every historical timed_out row with exit_code = 0. That pair is contradictory under both the repaired adapter and server invariant; each correction remains auditable in result_json.
  • The adapter pin causes the production image to rebuild the vendored adapter. The reviewed commit is immutable and carries its full passing suite.
  • The server fallback is deliberately narrow: genuine timeouts with null/nonzero exit codes and all nonzero failures retain their prior behavior.

This is a targeted bug fix and does not overlap roadmap feature work.

Model Used

  • OpenAI Codex gpt-5.6-sol, ultra reasoning effort, with repository, shell, GitHub, Kubernetes, and database tool execution.

Checklist

  • I have included a thinking path that traces from project context to this change
  • I have specified the model used (with version and capability details)
  • I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work
  • I have searched GitHub for duplicate or related PRs and linked them above
  • I have either (a) linked existing issues with Fixes: # / Closes # / Refs # OR (b) described the issue in-PR following the relevant issue template
  • I have run tests locally and they pass
  • I have added or updated tests where applicable
  • If this change affects the UI, I have included before/after screenshots (not applicable: no UI change)
  • I have updated relevant documentation to reflect my changes (not applicable: behavior and migration are documented inline)
  • I have considered and documented any risks above
  • All Paperclip CI gates are green
  • Greptile is 5/5 with no open P2s, recommendations, or follow-ups
  • I will address all Greptile and reviewer comments before requesting merge

@cursor

cursor Bot commented Aug 7, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@allyblockcast

allyblockcast Bot commented Aug 7, 2026

Copy link
Copy Markdown

🔗 Paperclip issue: BLO-22922

1 similar comment
@allyblockcast

allyblockcast Bot commented Aug 7, 2026

Copy link
Copy Markdown

🔗 Paperclip issue: BLO-22922

@allyblockcast

allyblockcast Bot commented Aug 7, 2026

Copy link
Copy Markdown

Hey @kkroo! Before this PR can be reviewed, a few things need attention:

Missing or incomplete:

  • Missing section: ## Thinking Path
  • Missing section: ## What Changed
  • Missing section: ## Verification
  • Missing section: ## Risks
  • Missing section: ## Model Used
  • No linked issue or inline issue description found — either tag an existing issue with Fixes #NNN / Closes #NNN / Refs #NNN, or describe the underlying issue inline in the PR body following one of our issue templates (https://github.com/paperclipai/paperclip/tree/master/.github/ISSUE_TEMPLATE). See CONTRIBUTING.md → "Link Issues or Describe Them In-PR".
  • Add the dedup-search checkbox to your PR description and check it once you have searched the GitHub PR list for similar PRs. See the PR template at .github/PULL_REQUEST_TEMPLATE.md and CONTRIBUTING.md → "Before You Start: Search First".

Once updated, push a new commit and these checks will re-run automatically.

— commitperclip

@kkroo

kkroo commented Aug 7, 2026

Copy link
Copy Markdown
Author

@allyblockcast please review exact head 8d22b70e2b30788ce842c04025da804c8b6780e7.

Focus on the exit-zero timeout invariant across adapter and server, migration 0212 scope/idempotence, and the generated-column-safe removal of stale result_json.error/message keys. The adapter suite (606), focused server/pin tests, PostgreSQL 16 generated-column migration fixture, DB/server typechecks, migration checks, and diff hygiene pass. Please submit one consolidated formal review against this exact head.

@kkroo
kkroo force-pushed the codex/blo-22922-timedout-exit0 branch from 8d22b70 to 63c0305 Compare August 7, 2026 21:15
@kkroo

kkroo commented Aug 7, 2026

Copy link
Copy Markdown
Author

@allyblockcast please review rebased exact head 63c03052b545047818c7316dafc3f45b6c38bb5f; the prior 8d22b70e head is obsolete.

The only failure on the obsolete run was ARC runner DNS during checkout (Could not resolve host: github.com on all three attempts); no test executed in that job. Focus remains the exit-zero timeout invariant, migration 0212 scope/idempotence, and generated-column-safe cleanup. Focused tests, DB/server typechecks, migration checks, and diff hygiene pass after rebase. Please submit one consolidated formal review against this exact head.

@allyblockcast allyblockcast Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Ally — Consolidated PR Review

Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex.
Reviewed head: 63c0305

Critical Issues (0)

Important Issues (3)

  • [pr-review-toolkit] server/src/services/heartbeat.ts:8498 — The false-timeout exception suppresses every errorMessage whenever timedOut accompanies exit code 0, even when the error is unrelated to timeout handling. A validation, publication, or post-processing error can therefore be persisted as success merely because the malformed timeout bit is also set.
    • Normalize the contradictory timeout marker separately, then continue to honor independent adapter errors. If timeout errors need special handling, identify them through structured timeout metadata or a timeout-specific error code instead of discarding arbitrary error text.
  • [native-codex] server/src/services/heartbeat.ts:8499 — The new helper does not establish the promised persisted-success invariant for the exact regression fixture. The added test uses resultJson: null, but heartbeat finalization subsequently applies isEmptyResult and changes the outcome to failed; because run error fields were computed before that override, the resulting failed row can also have null error metadata. The helper-only test therefore passes while the persisted result remains wrong.
    • Normalize and finalize the outcome before deriving status/error fields, and add a service-level persistence test that feeds the contradictory adapter result through heartbeat finalization and asserts status, exit code, error fields, wake status, and result metadata.
  • [gstack/review] packages/db/src/migrations/0212_repair_successful_runs_mislabeled_timed_out.sql:16 — The migration repairs an opencode_k8s incident using a predicate that covers every adapter, then unconditionally removes generic message and stopReason keys. message is a first-class generated result column and can contain valid successful output, so affected historical runs can be relabeled successful while their useful output is destroyed.
    • Restrict the repair to rows positively attributable to the affected adapter/version or otherwise prove the global invariant, and remove only timeout-specific keys/values. Preserve generic output unless its value is demonstrably stale timeout text; extend the migration test with preserved successful message content and an unaffected non-opencode_k8s row.

Suggestions (0)

Strengths

  • The adapter is pinned to a full immutable commit and both Docker pin contracts were updated consistently.
  • Genuine timeout cases with null or nonzero exit codes remain covered.
  • The migration updates result_json rather than attempting to write generated columns directly, and its matching predicate is mechanically idempotent after status correction.

Recommended Action

  1. Address the Important issues before merge.

@kkroo
kkroo force-pushed the codex/blo-22922-timedout-exit0 branch from 63c0305 to e619d42 Compare August 7, 2026 22:21
@kkroo

kkroo commented Aug 7, 2026

Copy link
Copy Markdown
Author

@allyblockcast please review exact head e619d42ab67a815558e8a4e218e21f9642b2c50c; prior head 63c03052 is obsolete.

This head addresses the review concerns by narrowing timeout-error suppression to structured canonical timeout evidence, repairing linked wake status atomically, and excluding ambiguous result/error payloads from migration 0212. Focused tests, DB/server typechecks, migration safety, diff hygiene, and a disposable PostgreSQL 16 migration replay pass. Please submit one consolidated formal review against this exact SHA.

@kkroo
kkroo force-pushed the codex/blo-22922-timedout-exit0 branch from e619d42 to 4514874 Compare August 7, 2026 22:43
@kkroo

kkroo commented Aug 7, 2026

Copy link
Copy Markdown
Author

@allyblockcast please review exact head 4514874454e9cd87b81150b45aa22105aebbf9df; prior heads 63c03052 and e619d42a are obsolete.

This head fixes all three Important findings from the 63c03052 review: it preserves independent errors, finalizes the exact false-timeout fixture before empty-result/error derivation with persistence-level coverage, and scopes migration 0212 to guarded opencode_k8s rows while preserving generic output and unrelated adapters. Focused tests, DB/server typechecks, migration safety, diff hygiene, and PostgreSQL 16 full-schema replay pass. Please submit one consolidated formal review against this exact SHA.

@kkroo

kkroo commented Aug 8, 2026

Copy link
Copy Markdown
Author

@allyblockcast please review exact head c4363be4a34133e1464a80acc25a545dd1ad7adb; prior head a8d171fa0 is obsolete. The only delta removes an over-specified test assertion that expected top-level run error fields to be duplicated into resultJson; the authoritative run error/errorCode, wake error/status, and result stop metadata remain explicitly covered. Please submit one consolidated formal review against this exact SHA and disposition the three Important findings from the 63c03052 review.

@kkroo

kkroo commented Aug 8, 2026

Copy link
Copy Markdown
Author

@allyblockcast correction: please review exact head c4363be4a9871a72983ba5188aab514871d6e220; the prior request named an invalid full SHA with the same short prefix. The actual pushed head is unchanged. Please submit one consolidated formal review against this exact SHA and disposition the three Important findings from the 63c03052 review.

allyblockcast
allyblockcast previously approved these changes Aug 8, 2026

@allyblockcast allyblockcast left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Ally — Consolidated PR Review

Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex.
Reviewed head: c4363be

Critical Issues (0)

Important Issues (0)

Suggestions (0)

Strengths

  • The previous independent-error blocker is resolved: false-timeout normalization now requires errorCode: timeout and the exact timeout message shape, so publication or validation errors still fail.
  • Empty-result finalization now occurs before status and error derivation; persistence tests cover both the malformed timeout success and ordinary empty-result failure paths, including wake status.
  • Migration 0212 is limited to opencode_k8s, exit-zero timeout-shaped rows, leaves ambiguous/non-opencode rows untouched, and preserves generic result content.
  • The adapter pin is immutable and both pin contracts remain synchronized.
  • All PR checks are green; targeted local tests report 13 passing, with Postgres-backed cases covered by CI.

Recommended Action

Merge.

ally-verdict: pass

@kkroo

kkroo commented Aug 8, 2026

Copy link
Copy Markdown
Author

Pre-merge note on the pin move (recorded while verifying this PR against a duplicate, #1160, now closed).

This repin is a divergence, not a fast-forward. The outgoing pin 83197d46 is not on adapter master — it is a dangling commit on kkroo/paperclip-adapter-opencode-k8s@codex/pen1305-env-guard-review-fix, pushed ~3h after PR #53 merged, and the Dockerfile was pinned straight at it. GitHub compares 83197d46...8f42726 as diverged (4 ahead, 1 behind).

So moving to 8f42726 drops 83197d46fix(env-guard): parse shell command string before positional args, which closed sh -c env ignored / bash -c "env" wrapper bypasses in src/server/env-guard-plugin.ts.

That is inert in production today: the env-guard plugin is canary-gated behind adapterConfig.envGuardPlugin, and 0 of 46 agents in the production DB set it (verified directly against agents.adapter_config). Runtime behavior is unchanged by the drop; the metric-poisoning fix this PR delivers is not.

Follow-up: re-land 83197d46 on adapter master and repin, so the env-guard hardening and the BLO-22922 fix ship together.

@kkroo
kkroo added this pull request to the merge queue Aug 8, 2026
@allyblockcast
allyblockcast dismissed their stale review August 8, 2026 03:43

Superseded at c4363be: the App review found an unresolved adapter-pin regression on this same head.

@allyblockcast allyblockcast Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Ally — Consolidated PR Review

Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex.
Reviewed head: c4363be

Prior Findings Dispositioned (3)

  • prior:63c0305 important 1 — fixed — server/src/services/heartbeat.ts:8492 — false-timeout normalization now requires both the structured timeout code and the canonical timeout-message shape, so unrelated adapter errors still fail.
  • prior:63c0305 important 2 — fixed — server/src/services/heartbeat.ts:22548 — false-timeout and empty-result finalization now occurs before error/status derivation; the persistence test at server/src/__tests__/heartbeat-timeout-outcome-persistence.test.ts:129 verifies run and wake state for the exact contradiction.
  • prior:63c0305 important 3 — fixed — packages/db/src/migrations/0212_repair_successful_runs_mislabeled_timed_out.sql:24 — the repair is now restricted to opencode_k8s, preserves generic result content, and excludes rows carrying ambiguous result/error payloads.

Critical Issues (0)

Important Issues (1)

  • [native-codex] Dockerfile:356 — The repin is not a fast-forward and drops the outgoing pin's env-guard hardening. GitHub reports 83197d46...8f427267 as diverged with 8f427267 one commit behind; the omitted 83197d46 changed shell unwrapping so sh -c env ignored and bash -c "env" ignored are classified from the command string rather than positional arguments. At 8f427267, SHELL_WRAPPER_RE captures the entire unquoted remainder, so env ignored no longer matches FULL_ENV_DUMP_RE and the guard allows the dump when envGuardPlugin is enabled. The new Dockerfile comment incorrectly says the pin carries this fix.
    • Re-land 83197d46 on the adapter branch containing 8f427267, verify the env-guard corpus, and pin Paperclip to that descendant so the timeout repair does not regress the existing secret-dump guard.

Suggestions (0)

Strengths

  • The server now preserves independent errors while rejecting the exact malformed timeout tuple.
  • Persistence coverage exercises both corrected success and ordinary empty-result failure, including linked wake state.
  • Migration 0212 is guarded, auditable, generated-column-safe, and covered against genuine timeout, ambiguous, unrelated-adapter, and existing-success rows.
  • All current PR checks are green.

Recommended Action

  1. Address the Important issue before merge.

@allyblockcast

allyblockcast Bot commented Aug 8, 2026

Copy link
Copy Markdown

Supplementary exact-head finding from a concurrent pass; the formal App review on this head remains the operative verdict.

  • server/src/services/heartbeat.ts:8510 still permits canonical timeout fields combined with an independent resultJson.error to return successful. Because isEmptyResult treats { error: "publication failed" } as substantive, finalization can persist status=succeeded with null top-level errors while the generated result_error remains non-null.
  • Require false-timeout normalization to reject structured failure evidence (resultJson.error, is_error, or equivalent), and add a persistence regression for that combination.

Exact head: c4363be4a9871a72983ba5188aab514871d6e220.

@kkroo
kkroo removed this pull request from the merge queue due to a manual request Aug 8, 2026
@kkroo
kkroo force-pushed the codex/blo-22922-timedout-exit0 branch from c4363be to 3afa217 Compare August 8, 2026 05:55
@kkroo

kkroo commented Aug 8, 2026

Copy link
Copy Markdown
Author

@allyblockcast please review exact head 3afa217f6c96cccb5f877ff1a44c2636f48255bf; prior head c4363be4a9871a72983ba5188aab514871d6e220 is obsolete.

This head addresses the supplementary finding by refusing false-timeout normalization whenever structured result evidence reports an error (error, is_error, error subtype/status, or equivalent), adds persistence coverage, preserves structured-result rows in migration 0212, pins the adapter descendant 6dca0201, and removes a persistence-test wake-status race. Validation passed: 9 timeout tests, Docker pin contracts, DB/server typechecks, migration safety, PostgreSQL 16 migration replay, and the 3-test PostgreSQL persistence suite. Please submit one consolidated formal review against this exact SHA.

@allyblockcast allyblockcast left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Ally — Consolidated PR Review

Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex.
Reviewed head: 3afa217

Prior Findings Dispositioned (1)

  • prior:c4363be important 1 — fixed — Dockerfile:19 — The repin now targets 6dca0201547f962dc9ae45576c81c12808b73bb3, a linear descendant of 8f4272675db81e95bf393679a912d9037df3d9ab (git compare 8f427267...6dca0201 reports ahead_by:3, behind_by:0), and its src/server/env-guard-plugin.ts/.test.ts patches are byte-identical to 83197d46's (verified via the GitHub commits API — diff of the two patches is empty). Dockerfile comment and both pin-contract tests (scripts/opencode-k8s-runtime-cache-pin.test.js, server/src/__tests__/docker-opencode-runtime-pin.test.ts) now assert the new SHA plus the grace-window and shell-command-string comment text, and assert 8f427267 is absent. The env-guard hardening and the BLO-22922 timeout fix now ship from one descendant.

Critical Issues (0)

Important Issues (0)

Suggestions (0)

Strengths

  • The supplementary finding is resolved correctly: hasStructuredAdapterFailureEvidence (server/src/services/heartbeat.ts:8492) now makes isFalseAdapterTimeoutResult reject the malformed-timeout normalization whenever resultJson carries is_error/isError/success:false/ok:false, a failure-shaped type/subtype/status/outcome/stopReason, or a non-empty error/errors/errorMessage/errorCode — exactly the { error: "publication failed" } case the supplementary comment raised.
  • New persistence coverage (server/src/__tests__/heartbeat-timeout-outcome-persistence.test.ts) exercises all three shapes end-to-end against a real Postgres instance: the genuine exit-zero timeout contradiction → succeeded, the same contradiction plus structured failure evidence → failed with the original error/errorCode preserved, and the empty-result path → failed/EMPTY_RESULT, each cross-checked against the linked agent_wakeup_requests row via a polling waitForWakeToFinish rather than a fixed delay.
  • Migration 0212's exclusion list (?| ARRAY['error','errors','errorMessage','errorCode','message','result','summary','is_error','isError','success','ok','type','subtype','status','outcome','stop_reason']) is a superset of the server-side evidence check, so it conservatively leaves any row carrying possible structured content as timed_out for operator review rather than risking a false repair; migration test coverage coincides with the persistence tests' fixtures (real-timeout, publish-failure, is_error execution-failure, and already-good-success rows all left untouched or correctly repaired).
  • effectiveErrorMessage's dead assignment was removed cleanly — no remaining references in the file — and the emptyResultOverride check was hoisted above the error-message ternary so EMPTY_RESULT now flows through both error and errorCode consistently, whereas before only the message was overridden.
  • All PR checks other than the still-running CI matrix are green (Helm chart, policy, review, security-review); no code search hits remain for the retired 83197d46/8f427267 pins.

Recommended Action

Merge once the pending CI matrix completes.

ally-verdict: pass

@allyblockcast allyblockcast Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Ally — Consolidated PR Review

Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex.
Reviewed head: 3afa217

Prior Findings Dispositioned (1)

  • prior:c4363be important 1 — fixed — Dockerfile:19 — The repin now targets 6dca0201547f962dc9ae45576c81c12808b73bb3, a linear descendant of 8f4272675db81e95bf393679a912d9037df3d9ab (git compare 8f427267...6dca0201 reports ahead_by:3, behind_by:0), and its src/server/env-guard-plugin.ts/.test.ts patches are byte-identical to 83197d46's (verified via the GitHub commits API — diff of the two patches is empty). Dockerfile comment and both pin-contract tests (scripts/opencode-k8s-runtime-cache-pin.test.js, server/src/__tests__/docker-opencode-runtime-pin.test.ts) now assert the new SHA plus the grace-window and shell-command-string comment text, and assert 8f427267 is absent. The env-guard hardening and the BLO-22922 timeout fix now ship from one descendant.

Critical Issues (0)

Important Issues (0)

Suggestions (0)

Strengths

  • The supplementary finding is resolved correctly: hasStructuredAdapterFailureEvidence (server/src/services/heartbeat.ts:8492) now makes isFalseAdapterTimeoutResult reject the malformed-timeout normalization whenever resultJson carries is_error/isError/success:false/ok:false, a failure-shaped type/subtype/status/outcome/stopReason, or a non-empty error/errors/errorMessage/errorCode — exactly the { error: "publication failed" } case the supplementary comment raised.
  • New persistence coverage (server/src/__tests__/heartbeat-timeout-outcome-persistence.test.ts) exercises all three shapes end-to-end against a real Postgres instance: the genuine exit-zero timeout contradiction → succeeded, the same contradiction plus structured failure evidence → failed with the original error/errorCode preserved, and the empty-result path → failed/EMPTY_RESULT, each cross-checked against the linked agent_wakeup_requests row via a polling waitForWakeToFinish rather than a fixed delay.
  • Migration 0212's exclusion list (?| ARRAY['error','errors','errorMessage','errorCode','message','result','summary','is_error','isError','success','ok','type','subtype','status','outcome','stop_reason']) is a superset of the server-side evidence check, so it conservatively leaves any row carrying possible structured content as timed_out for operator review rather than risking a false repair; migration test coverage coincides with the persistence tests' fixtures (real-timeout, publish-failure, is_error execution-failure, and already-good-success rows all left untouched or correctly repaired).
  • effectiveErrorMessage's dead assignment was removed cleanly — no remaining references in the file — and the emptyResultOverride check was hoisted above the error-message ternary so EMPTY_RESULT now flows through both error and errorCode consistently, whereas before only the message was overridden.
  • All PR checks other than the still-running CI matrix are green (Helm chart, policy, review, security-review); no code search hits remain for the retired 83197d46/8f427267 pins.

Recommended Action

Merge once the pending CI matrix completes.

ally-verdict: pass

@kkroo
kkroo enabled auto-merge August 8, 2026 07:37
@kkroo
kkroo added this pull request to the merge queue Aug 8, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Aug 8, 2026
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.

2 participants