Skip to content

fix(queue): close four webhook-redelivery holes and guard the family in CI (#9561, #9562, #9563) - #9567

Merged
JSONbored merged 1 commit into
mainfrom
fix/resolve-redelivery-and-unused-locals
Jul 28, 2026
Merged

fix(queue): close four webhook-redelivery holes and guard the family in CI (#9561, #9562, #9563)#9567
JSONbored merged 1 commit into
mainfrom
fix/resolve-redelivery-and-unused-locals

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

Closes #9561
Closes #9562
Closes #9563

Summary

GitHub redelivers the same issue_comment, and the queue's max_retries: 3 plus the DLQ re-drive reuse the identical deliveryId. There is no global delivery-level dedupesrc/github/webhook.ts suppresses a re-POST whose row is already processed, but a queue retry re-enters processGitHubWebhook directly, and recordWebhookEvent is an upsert written after the handler returns.

#9312 added a redelivery guard to the handlers someone greped for at the time. Four were missed.

Eleven functions share the signature (env: Env, deliveryId: string, payload: GitHubWebhookPayload), written in two formattings — one line and five. A grep for either shape sees only half the family. That is the mechanical cause, not carelessness, and it is what the new CI check removes.

What a replay actually cost

handler replay damage
maybeProcessResolveCommand A second permanent review-memory suppression row per finding, plus a re-posted confirmation
maybeProcessGateOverrideCommand resolveOverrideHeadSha re-fetches the live head on purpose, so a commit landing in between means the replay neutralizes the Gate on a newer commit the maintainer never overrode
maybeProcessPrPanelRetrigger A guaranteed second paid LLM reviewforceAiReview bypasses the review cache and the fingerprint cache and steals the lock, by design
maybeProcessPrPanelGenerateTests A second real AI generation plus a brand-new public comment (createIssueComment, not the in-place marker kind)
maybeProcessLoopOverMentionCommand The ~20 commands answered inline: a duplicate agent run, model spend, and a duplicated public answer

The gate-override writes are each individually idempotent (the check-run is PATCHed in place, the confirmation is a marker comment) — which is exactly why the missing guard was easy to miss. The damage is target drift, not duplication.

The dispatcher checks two event types, and both are load-bearing

A dry-run/paused original still spent the agent run and the AI summary, but recorded agent_command_reply_skipped rather than agent_command_replied. Keying on the completed event alone would leave exactly the replays that already cost money unguarded. Verified by removing one arm at a time: with only the completed arm, the dry-run regression test fails.

maybeThrottleLoopOverCommand contains its own redelivery short-circuit but is not a substitute — it returns early on policy === "off", and commandRateLimitPolicy defaults to 'off' (migration 0097), so on a default repo it never runs.

Verified safe, left unguarded — with the mechanism stated

The allowlist in the new checker carries these, so "this one is fine" is a claim a reviewer can check rather than an absence someone has to re-derive:

  • maybeProcessConfigurationCommand — idempotent createOrUpdateAgentCommandComment with a deterministic body, so a replay's PATCH is skipped.
  • maybeProcessPlanCommandisPlanCommandCoolingDown short-circuits first; its key (actor + repo) is strictly broader than the guard's, and ISSUE_PLAN_COOLDOWN_MS is identical to COMMAND_RATE_LIMIT_REDELIVERY_WINDOW_MS.
  • maybeProcessAgentCommandFeedbackReactionrecordAgentCommandFeedback is an onConflictDoUpdate on (answerId, actorHash) behind a unique index, so a replay rewrites the same vote rather than double-counting.

The CI check

scripts/check-command-redelivery-guards.ts, in the established idiom of check-dead-source-files.ts and check-regate-sort-key.ts:

  • normalizes whitespace so both signature formattings match
  • bounds each handler body by brace depth, not a line window — with handlers 30–470 lines long and packed adjacently, a fixed window would let a neighbour's guard satisfy the scan for the handler actually missing one (the exact false negative hit while check-regate-sort-key.ts was being written)
  • requires an unguarded handler to be allowlisted with a reason

Testing

Every guard has a regression test proven against its own removal — each fails with the guard taken out and passes with it in:

test without the guard
resolve 2 suppression rows instead of 1
gate-override a second, newer overridden SHA appears
panel generate-tests 2 AI runs instead of 1
panel retrigger 2 forced file refreshes instead of 1
dispatcher (live) a duplicated public answer
dispatcher (dry-run) 2 skipped events, and it fails even with the completed-event arm present

Plus 10 direct tests for the checker itself, including both signature formattings, the brace-depth bounding in both orders, nested blocks, exact-name allowlisting, and the real tree staying clean.

src/queue/processors.ts changed lines: 0 uncovered statements, 0 uncovered branches.

…in CI (#9561, #9562, #9563)

GitHub redelivers the same issue_comment, and the queue's max_retries:3 plus the
DLQ re-drive reuse the identical deliveryId. There is no global delivery-level
dedupe -- src/github/webhook.ts suppresses a re-POST whose row is already
`processed`, but a QUEUE retry re-enters processGitHubWebhook directly and
recordWebhookEvent is an upsert written after the handler returns. #9312 added a
guard to the handlers someone greped for at the time; four were missed.

Eleven functions share the signature (env, deliveryId, payload), written in TWO
formattings -- one-line and five-line. A grep for either shape sees only half the
family. That is the mechanical cause, not carelessness.

WHAT A REPLAY COST, per handler:

- maybeProcessResolveCommand: a SECOND permanent review-memory suppression row
  per finding (recordReviewSuppression), plus a re-posted confirmation.
- maybeProcessGateOverrideCommand: the writes are individually idempotent, which
  is why this was easy to miss -- but resolveOverrideHeadSha re-fetches the LIVE
  head on purpose, so if a commit landed in between, the replay neutralizes the
  Gate on a NEWER commit the maintainer never overrode, breaking the handler's own
  "no permanent bypass, this commit only" invariant.
- maybeProcessPrPanelRetrigger: the publish passes forceAiReview, which by design
  bypasses the AI-review cache AND the cross-head fingerprint cache AND steals the
  review lock ("a duplicate LLM call is the explicitly accepted cost"). Right for a
  maintainer re-ticking the box; wrong for a queue retry. A guaranteed second paid
  review, and non-deterministic output can flip the published verdict.
- maybeProcessPrPanelGenerateTests: a second real AI generation plus a brand-new
  public comment (createIssueComment, not the in-place marker kind). Its text twin
  already guarded the identical event type and targetKey.
- maybeProcessLoopOverMentionCommand: the ~20 commands answered INLINE. Checks
  BOTH agent_command_replied and agent_command_reply_skipped, because a dry-run
  original still spent the agent run and the AI summary while recording only the
  skipped event -- keying on the completed event alone would leave exactly the
  replays that already cost money unguarded. Verified: with only the completed arm,
  the dry-run regression test fails.

maybeThrottleLoopOverCommand is NOT a substitute: it returns early on
`policy === "off"`, and commandRateLimitPolicy defaults to 'off' (migration 0097).

VERIFIED SAFE, left unguarded with the mechanism stated in the allowlist:
- maybeProcessConfigurationCommand: idempotent createOrUpdateAgentCommandComment
  with a deterministic body, so the PATCH is skipped.
- maybeProcessPlanCommand: isPlanCommandCoolingDown short-circuits first; its key
  is strictly broader and ISSUE_PLAN_COOLDOWN_MS equals the redelivery window.
- maybeProcessAgentCommandFeedbackReaction: recordAgentCommandFeedback is an
  onConflictDoUpdate on (answerId, actorHash) behind a unique index, so a replay
  rewrites the same vote rather than double-counting.

scripts/check-command-redelivery-guards.ts fails CI on a twelfth handler. It
normalizes whitespace so both formattings match, and bounds each body by brace
depth rather than a line window -- a fixed window would let a neighbour's guard
satisfy the scan for the handler actually missing one, the exact false negative hit
while check-regate-sort-key.ts was written.

Every guard has a regression test proven against its own removal: each fails with
the guard taken out (2 suppression rows, a second overridden SHA, 2 AI runs, 2
forced refreshes, a duplicate public answer) and passes with it in.
@JSONbored JSONbored self-assigned this Jul 28, 2026
@loopover-orb

loopover-orb Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Warning

⏸️ LoopOver review result - manual review recommended

Review updated: 2026-07-28 10:15:19 UTC

7 files · 1 AI reviewer · no blockers · CI green · clean

⏸️ Suggested Action - Manual Review

  • Touches a guarded path — held for manual review: This PR changes guardrail-protected path(s): .github/workflows/ci.yml (matched .github/workflows/**).

Review summary
This PR adds a mechanical CI checker (`check-command-redelivery-guards.ts`) that scans `src/queue/processors.ts` for the `(env, deliveryId, payload)` webhook-handler family and fails if any lacks the `hasAuditEventForDelivery` redelivery guard, then applies that guard to four previously-unguarded handlers (`maybeProcessGateOverrideCommand`, `maybeProcessResolveCommand`, `maybeProcessPrPanelRetrigger`, `maybeProcessPrPanelGenerateTests`, `maybeProcessLoopOverMentionCommand`). Each guard reuses the pre-existing `hasAuditEventForDelivery` helper already imported at the top of processors.ts (not new machinery), and each is backed by a real end-to-end regression test that calls `processJob` twice with the identical `deliveryId` and asserts no second side effect (duplicate suppression row, duplicate AI run, duplicate comment, or override on a moved head SHA) — these exercise the actual production code path rather than fabricating state. The checker itself correctly tracks brace depth per-handler (verified by an explicit adjacent-handler false-negative test) rather than using a fixed line window, and normalizes whitespace to catch both signature formattings. The `maybeProcessLoopOverMentionCommand` fix correctly checks both the `_replied` and `_reply_skipped` event types to cover the dry-run-still-spent-money case. CI is green on this commit.

Nits — 7 non-blocking
  • scripts/check-command-redelivery-guards.ts:40,109,123 use unnamed magic numbers (900, 6, 470, 30) for scan bounds/window sizes; naming them as constants would make intent clearer, though each is already explained in a comment.
  • scripts/check-command-redelivery-guards.ts:136 (`bodyText`) nests to depth 5 — could flatten the char-loop with an early continue.
  • The `ALLOWED_WITHOUT_GUARD` allowlist lives inline in the script rather than as repo config — fine for internal tooling, but worth a comment noting it's deliberately not config-as-code since it's about code shape, not per-repo behavior.
  • Consider extracting `HANDLER_SCAN_CEILING_LINES`-adjacent constants (window size 6, largest-handler estimate 470) into named constants for readability, per the external brief's magic-number flags.
  • No functional changes needed; the diff is well-tested and traces each guard placement to the actual hazard (e.g., placing the gate-override guard before the live-head refetch).
  • PR author also opened the linked issue — Link an issue that was opened by a different contributor, or provide a rationale for why this self-authored issue represents genuine discovery work.
  • Touches a guarded path — held for manual review — A maintainer must review and merge this change.

Decision drivers

  • ✅ Code review — No blockers (1 reviewer)
  • ⚠️ Gate result — Not blocking (Advisory; not blocking this PR.)
Context & advisory signals — never blocks the verdict
Signal Result Evidence
Linked issue ✅ Linked #9561, #9562, #9563
Related work ✅ No active overlap found No same-issue or scoped active PR overlap found.
Change scope ❌ 8/20 High review scope from cached public metadata (3 linked issues).
Validation posture ✅ 25/25 PR body includes validation/test evidence.
Contributor workload ✅ 10/10 Author activity: 14 registered-repo PR(s), 13 merged, 317 issue(s).
Contributor context ✅ Confirmed Gittensor contributor JSONbored; Gittensor profile; 14 PR(s), 317 issue(s).
Improvement ✅ Minor risk: clean · value: minor · LLM: significant
Linked issue satisfaction

Addressed
The PR adds the #9312 redelivery guard to both handlers named in the issue — maybeProcessResolveCommand (preventing duplicate permanent suppression rows) and maybeProcessGateOverrideCommand (preventing target drift onto a newer commit) — with matching regression tests, and additionally adds a CI check plus fixes for two more handlers beyond the issue's scope.

Review context
  • Author: JSONbored
  • Role context: owner (maintainer lane)
  • Public audience mode: oss maintainer
  • Lane context: Repository is configured for direct PR review.
  • Public profile languages: Python, TypeScript, Ruby, Go, MDX, Shell, Solidity, JavaScript
  • Official Gittensor activity: 14 PR(s), 317 issue(s).
  • PR-specific overlap: none found.
Contributor next steps
  • Start here: Treat this as maintainer-lane context rather than normal contributor-lane activity.
  • Then work through the remaining 2 steps in the Signals table above.
Signal definitions
  • Related work = same linked issue, overlapping active PRs, or title/path similarity.
  • Change scope = cached public metadata such as size labels, draft state, and review-burden hints.
  • Validation posture = whether the PR provides enough public validation/test evidence for maintainer review.
  • Contributor workload = public contributor activity and cleanup pressure, not a repo-wide quality failure.
  • Contributor context = public GitHub/Gittensor identity context; non-Gittensor status is not a blocker.
🧪 Chat with LoopOver

Ask LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.

  • @loopover ask <question> answers contribution-quality Q&A with source citations and freshness.
  • @loopover chat <question> answers in natural prose from cached decision-pack facts via local inference (maintainer/collaborator; read-only).
  • A plain-language @loopover mention with a real question is routed to the closest matching read-only command automatically — no exact syntax required.

Full command reference: https://loopover.ai/docs/loopover-commands

🧪 Experimental — new and may change.

🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed


💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →.

Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.

  • Re-run LoopOver review

@superagent-security

Copy link
Copy Markdown
Contributor

Superagent didn't find any vulnerabilities or security issues in this PR.

@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
loopover-ui 1236db6 Commit Preview URL

Branch Preview URL
Jul 28 2026, 09:55 AM

@codecov

codecov Bot commented Jul 28, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 89.62%. Comparing base (968c731) to head (1236db6).
⚠️ Report is 2 commits behind head on main.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #9567   +/-   ##
=======================================
  Coverage   89.62%   89.62%           
=======================================
  Files         867      867           
  Lines      110801   110813   +12     
  Branches    26346    26351    +5     
=======================================
+ Hits        99307    99319   +12     
  Misses      10229    10229           
  Partials     1265     1265           
Flag Coverage Δ
backend 95.33% <100.00%> (+<0.01%) ⬆️
control-plane 99.86% <ø> (ø)
rees 89.62% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/queue/processors.ts 94.91% <100.00%> (+0.01%) ⬆️

@codecov

codecov Bot commented Jul 28, 2026

Copy link
Copy Markdown

Bundle Report

Changes will decrease total bundle size by 210 bytes (-0.0%) ⬇️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
loopover-ui 7.66MB -210 bytes (-0.0%) ⬇️

Affected Assets, Files, and Routes:

view changes for bundle: loopover-ui

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/add-scalar-classes-DXx-OJV2.js (New) 2.16MB 2.16MB 100.0% 🚀
assets/tanstack-vendor-Dxry2-5g.js (New) 865.99kB 865.99kB 100.0% 🚀
assets/docs.fumadocs-spike-api-reference-nFpMT86X.js (New) 443.45kB 443.45kB 100.0% 🚀
assets/AgentScalarChatInterface.vue-Ivw5ax1r.js (New) 201.7kB 201.7kB 100.0% 🚀
assets/modal-C8SIET1q.js (New) 184.5kB 184.5kB 100.0% 🚀
assets/client-Cok72R5D.js (New) 151.47kB 151.47kB 100.0% 🚀
assets/self-hosting-configuration-1r6dwu38.js (New) 102.08kB 102.08kB 100.0% 🚀
assets/maintainer-panel-D_lyIwB7.js (New) 78.99kB 78.99kB 100.0% 🚀
assets/routes-Ck-nXnZY.js (New) 35.96kB 35.96kB 100.0% 🚀
assets/owner-panel-SihDsaoF.js (New) 27.92kB 27.92kB 100.0% 🚀
assets/app-O7EW3g8j.js (New) 25.78kB 25.78kB 100.0% 🚀
assets/ui-vendor-Db3arImx.js (New) 24.57kB 24.57kB 100.0% 🚀
assets/miner-panel-X2WhlK_K.js (New) 20.24kB 20.24kB 100.0% 🚀
assets/app.runs-DyQQpFdZ.js (New) 20.22kB 20.22kB 100.0% 🚀
assets/api._op-BZBJhBja.js (New) 17.57kB 17.57kB 100.0% 🚀
assets/self-hosting-docs-audit-iS-ODV77.js (New) 16.6kB 16.6kB 100.0% 🚀
assets/docs._slug-CyHTj6MS.js (New) 15.52kB 15.52kB 100.0% 🚀
assets/playground-panel-B7Ce82Co.js (New) 14.42kB 14.42kB 100.0% 🚀
assets/fairness--Yqh4-4p.js (New) 10.73kB 10.73kB 100.0% 🚀
assets/app.audit-iTsUKuwR.js (New) 10.08kB 10.08kB 100.0% 🚀
assets/app.config-generator-BX3u5Zp8.js (New) 10.06kB 10.06kB 100.0% 🚀
assets/maintainers-Dok9r-H2.js (New) 8.06kB 8.06kB 100.0% 🚀
assets/miners-CWt9O0I9.js (New) 7.91kB 7.91kB 100.0% 🚀
assets/agents-kpAU_a9u.js (New) 7.74kB 7.74kB 100.0% 🚀
assets/commands-panel-BZJA1eHZ.js (New) 6.65kB 6.65kB 100.0% 🚀
assets/maintainer-workflow-B1oiVdEd.js (New) 6.52kB 6.52kB 100.0% 🚀
assets/digest-panel-DdC5Sm6K.js (New) 6.15kB 6.15kB 100.0% 🚀
assets/repos._owner._repo.quality-BSwjd6-6.js (New) 6.14kB 6.14kB 100.0% 🚀
assets/docs-nav-BgIUu1Cg.js (New) 6.01kB 6.01kB 100.0% 🚀
assets/docs.index-D-VlqyPO.js (New) 5.95kB 5.95kB 100.0% 🚀
assets/api.index-4rZA0J7x.js (New) 4.7kB 4.7kB 100.0% 🚀
assets/docs-9VAVNjiU.js (New) 2.7kB 2.7kB 100.0% 🚀
assets/api-CNptTrcV.js (New) 2.69kB 2.69kB 100.0% 🚀
assets/docs-page-DqvPtMJM.js (New) 2.1kB 2.1kB 100.0% 🚀
assets/table-Bon3heh4.js (New) 1.75kB 1.75kB 100.0% 🚀
assets/app.workbench-CBBhvGQn.js (New) 1.58kB 1.58kB 100.0% 🚀
assets/tabs-BAi8KLrb.js (New) 1.39kB 1.39kB 100.0% 🚀
assets/app.repos-DBQnh09S.js (New) 1.07kB 1.07kB 100.0% 🚀
assets/input-sTy7xHqw.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/file-cog-BQuvdOOV.js (New) 758 bytes 758 bytes 100.0% 🚀
assets/app.maintainer-BsKyAbBW.js (New) 502 bytes 502 bytes 100.0% 🚀
assets/app.owner-CFB9JjZC.js (New) 474 bytes 474 bytes 100.0% 🚀
assets/app.commands-CMqPMji6.js (New) 455 bytes 455 bytes 100.0% 🚀
assets/app.playground-DZosXb-e.js (New) 442 bytes 442 bytes 100.0% 🚀
assets/index-jkJ1cunD.js (New) 438 bytes 438 bytes 100.0% 🚀
assets/app.digest-DeSixYs1.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/eye-off-B1mHHCOO.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/app.miner-zzV4P12o.js (New) 422 bytes 422 bytes 100.0% 🚀
assets/key-round-DOq5dzPq.js (New) 355 bytes 355 bytes 100.0% 🚀
assets/bot-BVdpZtBJ.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/trash-2-FgSMP7vT.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/save-B-UXNlP6.js (New) 327 bytes 327 bytes 100.0% 🚀
assets/git-pull-request-arrow-BHwyy9Kj.js (New) 321 bytes 321 bytes 100.0% 🚀
assets/list-checks-DdVyaHp-.js (New) 279 bytes 279 bytes 100.0% 🚀
assets/compass-DhCkEBeo.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/history-Bdantkc5.js (New) 237 bytes 237 bytes 100.0% 🚀
assets/message-square-D1PDCT3t.js (New) 233 bytes 233 bytes 100.0% 🚀
assets/lock-CtXf0993.js (New) 206 bytes 206 bytes 100.0% 🚀
assets/rotate-cw-Hc7GzJaU.js (New) 201 bytes 201 bytes 100.0% 🚀
assets/play-CvTH65rn.js (New) 190 bytes 190 bytes 100.0% 🚀
assets/circle-check-CMgUP_o1.js (New) 178 bytes 178 bytes 100.0% 🚀
assets/search-Dp2iu1K7.js (New) 174 bytes 174 bytes 100.0% 🚀
assets/add-scalar-classes-CYbNOnEV.js (Deleted) -2.16MB 0 bytes -100.0% 🗑️
assets/tanstack-vendor-BsErCrLz.js (Deleted) -865.99kB 0 bytes -100.0% 🗑️
assets/docs.fumadocs-spike-api-reference-BkBDEKKn.js (Deleted) -443.45kB 0 bytes -100.0% 🗑️
assets/AgentScalarChatInterface.vue-CxTEgKqL.js (Deleted) -201.7kB 0 bytes -100.0% 🗑️
assets/modal-BvuP0842.js (Deleted) -184.5kB 0 bytes -100.0% 🗑️
assets/client-CWA8Dz3J.js (Deleted) -151.47kB 0 bytes -100.0% 🗑️
assets/self-hosting-configuration-GO9aG0jf.js (Deleted) -102.29kB 0 bytes -100.0% 🗑️
assets/maintainer-panel-C9A52DqO.js (Deleted) -78.99kB 0 bytes -100.0% 🗑️
assets/routes-ChWzi9jO.js (Deleted) -35.96kB 0 bytes -100.0% 🗑️
assets/owner-panel-KQjjR-qB.js (Deleted) -27.92kB 0 bytes -100.0% 🗑️
assets/app-CU0RVvq3.js (Deleted) -25.78kB 0 bytes -100.0% 🗑️
assets/ui-vendor-CiHqZdx2.js (Deleted) -24.57kB 0 bytes -100.0% 🗑️
assets/miner-panel-zVh86H-x.js (Deleted) -20.24kB 0 bytes -100.0% 🗑️
assets/app.runs-DTeORplD.js (Deleted) -20.22kB 0 bytes -100.0% 🗑️
assets/api._op-CYFHqa3X.js (Deleted) -17.57kB 0 bytes -100.0% 🗑️
assets/self-hosting-docs-audit-CXX-MeUM.js (Deleted) -16.6kB 0 bytes -100.0% 🗑️
assets/docs._slug-D2lZRmDP.js (Deleted) -15.52kB 0 bytes -100.0% 🗑️
assets/playground-panel-BZgaH6Fn.js (Deleted) -14.42kB 0 bytes -100.0% 🗑️
assets/fairness-RIGQh-lF.js (Deleted) -10.73kB 0 bytes -100.0% 🗑️
assets/app.audit-CQj1083V.js (Deleted) -10.08kB 0 bytes -100.0% 🗑️
assets/app.config-generator-7TnvYiB2.js (Deleted) -10.06kB 0 bytes -100.0% 🗑️
assets/maintainers-ippVh3Rk.js (Deleted) -8.06kB 0 bytes -100.0% 🗑️
assets/miners-DZ2M_rKC.js (Deleted) -7.91kB 0 bytes -100.0% 🗑️
assets/agents-B-rMxOua.js (Deleted) -7.74kB 0 bytes -100.0% 🗑️
assets/commands-panel-BHE4Dykx.js (Deleted) -6.65kB 0 bytes -100.0% 🗑️
assets/maintainer-workflow-BzHjvhZf.js (Deleted) -6.52kB 0 bytes -100.0% 🗑️
assets/digest-panel-VrcC8sLb.js (Deleted) -6.15kB 0 bytes -100.0% 🗑️
assets/repos._owner._repo.quality-p6sYIACO.js (Deleted) -6.14kB 0 bytes -100.0% 🗑️
assets/docs-nav-D25tLdpt.js (Deleted) -6.01kB 0 bytes -100.0% 🗑️
assets/docs.index-cKCECan_.js (Deleted) -5.95kB 0 bytes -100.0% 🗑️
assets/api.index-BNCAzI-M.js (Deleted) -4.7kB 0 bytes -100.0% 🗑️
assets/docs-BvW1pryo.js (Deleted) -2.7kB 0 bytes -100.0% 🗑️
assets/api-BBCWgGvI.js (Deleted) -2.69kB 0 bytes -100.0% 🗑️
assets/docs-page-Csc2ZXGf.js (Deleted) -2.1kB 0 bytes -100.0% 🗑️
assets/table-D4OBK90G.js (Deleted) -1.75kB 0 bytes -100.0% 🗑️
assets/app.workbench-DXLIrxat.js (Deleted) -1.58kB 0 bytes -100.0% 🗑️
assets/tabs-DFSJx3CQ.js (Deleted) -1.39kB 0 bytes -100.0% 🗑️
assets/app.repos-CSST0zel.js (Deleted) -1.07kB 0 bytes -100.0% 🗑️
assets/input-ifCg_i-4.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/file-cog--tq5fJQE.js (Deleted) -758 bytes 0 bytes -100.0% 🗑️
assets/app.maintainer-DyzBBi-o.js (Deleted) -502 bytes 0 bytes -100.0% 🗑️
assets/app.owner-CSoKFq9Q.js (Deleted) -474 bytes 0 bytes -100.0% 🗑️
assets/app.commands-BI2cMhD5.js (Deleted) -455 bytes 0 bytes -100.0% 🗑️
assets/app.playground-BtMUETVn.js (Deleted) -442 bytes 0 bytes -100.0% 🗑️
assets/index-D41Z91lm.js (Deleted) -438 bytes 0 bytes -100.0% 🗑️
assets/app.digest-NpEADLZY.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/eye-off-ePXc5djW.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/app.miner-Bj3LSN04.js (Deleted) -422 bytes 0 bytes -100.0% 🗑️
assets/key-round-k3MkIdYu.js (Deleted) -355 bytes 0 bytes -100.0% 🗑️
assets/bot-CmRLSQ-t.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/trash-2-BJKhTP0s.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/save-Bpl7X6ye.js (Deleted) -327 bytes 0 bytes -100.0% 🗑️
assets/git-pull-request-arrow-C4y8z_Fy.js (Deleted) -321 bytes 0 bytes -100.0% 🗑️
assets/list-checks-CDy3kTwz.js (Deleted) -279 bytes 0 bytes -100.0% 🗑️
assets/compass-C1UB-JHW.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/history-aanmfgPj.js (Deleted) -237 bytes 0 bytes -100.0% 🗑️
assets/message-square-Wwhx1Zac.js (Deleted) -233 bytes 0 bytes -100.0% 🗑️
assets/lock-SjTvHtWN.js (Deleted) -206 bytes 0 bytes -100.0% 🗑️
assets/rotate-cw-DqkSAjRd.js (Deleted) -201 bytes 0 bytes -100.0% 🗑️
assets/play-BSjUoCsC.js (Deleted) -190 bytes 0 bytes -100.0% 🗑️
assets/circle-check-B3jz2g3l.js (Deleted) -178 bytes 0 bytes -100.0% 🗑️
assets/search-C3VG5bua.js (Deleted) -174 bytes 0 bytes -100.0% 🗑️

@loopover-orb loopover-orb Bot added the manual-review Gittensor contributor context label Jul 28, 2026
@JSONbored
JSONbored merged commit f221acf into main Jul 28, 2026
9 checks passed
@JSONbored
JSONbored deleted the fix/resolve-redelivery-and-unused-locals branch July 28, 2026 10:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

manual-review Gittensor contributor context

Projects

None yet

1 participant