Skip to content

Clear a stale Codex connectivity failure when publication is withheld - #3214

Open
olddonkey wants to merge 2 commits into
steipete:mainfrom
olddonkey:fix/codex-clear-stale-error-on-withheld-publication
Open

Clear a stale Codex connectivity failure when publication is withheld#3214
olddonkey wants to merge 2 commits into
steipete:mainfrom
olddonkey:fix/codex-clear-stale-error-on-withheld-publication

Conversation

@olddonkey

@olddonkey olddonkey commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Problem

The Codex card can get stuck showing Network error: <the system's offline message> on a machine whose network is fine, and stay that way across relaunches, while the app is in fact fetching successfully every refresh cycle.

Seen on my own install (0.55.1, single Codex account). ~/Library/Application Support/CodexBar/codex-account-snapshots.json:

records[0].error             = "Network error: …the internet connection appears to be offline."
records[0].credits.updatedAt = <now>          ← this refresh cycle
records[0].snapshot.updatedAt = <27 hours old>

Meanwhile the same machine, seconds apart:

  • curl https://chatgpt.com/backend-api/wham/usage with the auth-file token → HTTP 200 in 0.33 s
  • /Applications/CodexBar.app/Contents/Helpers/CodexBarCLI usage --provider codexsucceeds, fresh updatedAt
  • the app's own debug log for the same period → zero network errors, six completed refresh cycles

Root cause

Two behaviours combine, both in the Codex weekly-reset publication path.

A withheld publication returns before the code that clears errors. resolvedCodexRefreshOutcome bails out as soon as the admission withholds a reading:

guard let admittedOutcome = admission.outcome else {
    if let expectedGuard = resolution.expectedGuard { self.retireCodexStateIfRefreshOwnerChanged() }
    return nil          // ← everything downstream, including errors[provider] = nil, is skipped
}

Withholding is a judgement about that reading, not about connectivity — the fetch behind it succeeded. But because the publication path is skipped, the previous failure's message survives it.

The message is persisted and rehydrated. A network failure that keeps prior usage takes resolvedCodexAccountOutcome's preserve branch, which stores the message next to the preserved snapshot; launch restores it (UsageStore+Refresh, self.errors[.codex] = hydratedPrior.error), so relaunching cannot clear it either. The consecutive-failure gate means it is only recorded once an outage survives more than one cycle, so what sticks is a real outage's message — it just never stops being displayed.

Put together: one transient outage records a message; the weekly-reset guard then withholds every later reading for as long as the account stays at or below the reset threshold; no cycle ever clears the message; and the card keeps blaming the network for a staleness that has a completely different cause. That misdirection is the real damage here — the frozen value is a separate, deliberate behaviour, but the label sends people to check their Wi-Fi.

Why this surfaces now

Not a recent code change. git log -S puts all three ingredients — the withholding guard, the early return nil, and the error rehydration — in b2b9c53, "fix: confirm Codex weekly reset snapshots" (#2064, 2026-07-11, first released in v0.42.1). #3177 reshaped that branch into an admission struct last week but did not introduce the skip: its parent commit's else branch returns nil the same way.

What changed is how often the branch is reached. It only engages on an early backend weekly reset — a reading at or below the reset threshold while the stored one is above it and the reset credit is still available. Those started arriving in August: #2790 (08-08), then #3168 and #3179 (08-24), #3193 (08-25). Before that the guard essentially never fired in the wild, so the missing clear never showed.

A second condition decides whether it heals: usually the next reading climbs past the threshold within hours and publishes normally, clearing the message with it. An account that stays in the 0–1% band for a long stretch (mine routes most traffic elsewhere) keeps every reading inside the withhold band, so the stale message survives indefinitely.

Fix

When the fetch behind a withheld reading succeeded, clear the recorded connectivity failure — in memory and in the persisted record — before returning.

Only that class is eligible, and the scope matters: matching weekly lows before the prior reset remain private pins down a broader invariant — a withheld publication leaves published state alone, down to lastSourceLabels and lastFetchAttempts. Clearing every error would have broken it. A successful fetch is direct evidence against an offline claim and nothing else, so auth, workspace and parse messages are left untouched and that invariant still holds. Eligibility reuses shouldPreserveCodexAccountSnapshotOnFailure, the same classification that allowed the message to be stored beside preserved usage in the first place, so there is one definition of "connectivity-shaped failure" read in both directions. Account scoping reuses the matching the weekly-reset candidate persistence already applies, so one account's success never clears another account's recorded failure. Nothing about which snapshot gets published changes.

The persisted copy is amended from the store's own contents rather than by writing codexAccountSnapshots: a single-account Codex refresh empties that array for its duration (UsageStore+Refresh), so writing it during a withheld cycle would erase the very snapshot the cycle is preserving. My first draft did exactly that and the regression test caught it, which is why the test also asserts the preserved snapshot survives on disk.

Real behavior on the affected install

Everything below is from the live 0.55.1 install this was found on. Timestamps are UTC.

While stuck~/Library/Application Support/CodexBar/codex-account-snapshots.json, and the same machine at the same time:

records[0].error              = "Network error: …the internet connection appears to be offline."
records[0].snapshot.updatedAt = 2026-08-25T13:50:31Z      (27 hours old)
records[0].credits.updatedAt  = 2026-08-26T16:34:18Z      (this refresh cycle)

curl chatgpt.com/backend-api/wham/usage   → HTTP 200 in 0.33 s
CodexBarCLI usage --provider codex        → succeeds, updatedAt 2026-08-26T16:35:17Z, weekly 1%
app debug log, 6 refresh cycles           → zero network errors

The app's own decision log for those cycles, which is what withholds the reading:

stage=initial       decision=requiresConfirmation  initial.weeklyUsedPercent=1.000
stage=confirmation  decision=preservePrevious      confirmation.updatedAt == initial.updatedAt

After it left the withhold band — the same file once weekly usage crossed the 1% threshold and the reading published normally:

records[0].error              = nil
records[0].snapshot.updatedAt = 2026-08-26T19:41:33Z
weekly                        = 2%

That is the coupling this PR breaks, observed live: nothing but a publication clears the message, so while readings are withheld it cannot go away. The card was reporting an outage for 27 hours on a machine that was online the whole time.

I could not stage an after-fix capture of a withheld cycle: that needs the account inside the withhold band (weekly at or below 1%, advanced boundary, reset credit still available) and this account left it at 19:41 UTC. The threshold is a fixed constant with no override, so producing that output on demand would mean feeding a fake reading, which is not live proof. I drove a real UsageStore against a copy of the real snapshot file and the real ~/.codex auth over the network to confirm the harness exercises the real pipeline end to end; it published the current 2% reading, as expected outside the band. Happy to post the withheld capture at the next early reset, and the harness is available if you would rather run it on an account that is in the band now.

Tests

  • withheld weekly reset clears the failure recorded before it — walks the real sequence: publish → a failing fetch records and persists the message → relaunch rehydrates it → a successful fetch is withheld by the weekly guard. Asserts the published snapshot is still preserved and that the message is gone from both memory and disk.
  • withheld publication keeps a failure recorded by the same refresh — guards the other direction: a fetch that actually failed keeps its message, because that message is what explains the stale card.
  • a withheld publication clears only a connectivity claim — pins the eligibility boundary, including the "prior error" string the existing invariant test relies on.
  • a withheld success restores first-failure suppression — two failures surface a message, a withheld success clears it and records the success on the consecutive-failure gate, and one later transient failure is suppressed again exactly as it would be after an ordinary published success.

make check clean; full make test green.

🤖 Generated with Claude Code

A withheld weekly-reset reading returns before the publication path that
clears `errors`, so the message from an earlier outage outlived the
successful fetch that replaced it. That message is also persisted beside
the preserved account snapshot and rehydrated at launch, so a relaunch
could not clear it either: the card kept reporting that the network was
offline while every refresh cycle was in fact succeeding.

Clear it when the withheld reading's own fetch succeeded. Only a
connectivity message is eligible — a successful fetch is evidence against
exactly that claim, and leaving every other kind untouched keeps a
withheld publication otherwise inert with respect to published state.
Eligibility reuses the classification that allowed the message to be
stored beside preserved usage in the first place.

The persisted copy is amended from the store's own contents rather than
by writing `codexAccountSnapshots`, which a single-account refresh empties
for its duration; writing that array here would erase the snapshot the
withheld cycle is preserving.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@clawsweeper

clawsweeper Bot commented Aug 26, 2026

Copy link
Copy Markdown

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

@olddonkey

Copy link
Copy Markdown
Contributor Author

Changelog entry for the release flow (not added to CHANGELOG.md per docs/RELEASING.md):

- Codex: stop the usage card from reporting a network outage after connectivity recovers. A withheld weekly-reset reading no longer leaves the previous failure's message in place, and the message is cleared from the persisted account snapshot too, so relaunching no longer restores it.

Related but out of scope, from the same investigation: on the same account the withhold itself never resolves, because the immediate confirmation lands in the same second as the initial reading and confirmationDecision requires confirmation.updatedAt > initial.updatedAt. From the app's own decision log:

stage=initial       decision=requiresConfirmation  confirmation.present=false
                    initial.weeklyUsedPercent=1.000  initial.updatedAt=1787762517
stage=confirmation  decision=preservePrevious
                    confirmation.updatedAt=1787762517   ← equal, not greater
                    initialConfirmationAccountMatches=true
                    stableAccountCompatible=true  stablePlanCompatible=true

Account, plan, advanced boundary and the 1 available -> 1 available credit inventory all match; only the timestamp ordering fails, and confirmation.present=false on every cycle means the #3177 delayed candidate never gets carried. Happy to open that separately if you'd like it looked at — I left it alone here since it is your recent design and this PR is only about the message that outlives it.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 97fc3b458c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +19 to +20
if let recorded = self.errors[.codex], Self.codexErrorDisprovedBySuccessfulFetch(recorded) {
self.errors[.codex] = nil

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Reset the failure gate after withheld success

When an outage has already reached the UI, failureGates[.codex] has a streak of at least two. Clearing only errors[.codex] leaves that streak intact, unlike the normal successful-publication path, which calls recordSuccess(). Consequently, after one or more withheld successful refreshes, the next single transient failure is surfaced immediately instead of being suppressed while the preserved snapshot exists. Reset or record success on the Codex failure gate when this successful fetch clears the connectivity error.

Useful? React with 👍 / 👎.

@clawsweeper clawsweeper Bot added P2 Normal priority bug or improvement with limited blast radius. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Aug 26, 2026
@clawsweeper

clawsweeper Bot commented Aug 26, 2026

Copy link
Copy Markdown

Codex review: needs real behavior proof before merge. Reviewed August 26, 2026, 4:17 PM ET / 20:17 UTC.

ClawSweeper review

What this changes

This PR clears stale Codex connectivity messages and resets refresh-failure suppression when a successfully fetched weekly-reset reading is withheld from publication.

Merge readiness

Blocked until stronger real behavior proof is added - 3 items remain

The implementation is focused and addresses the prior failure-gate finding, but this external PR still needs after-fix real-behavior proof before merge.

Priority: P2
Reviewed head: 70a37b98d203d48a920916bc044e1d9a7f9e8921

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) The patch and regression coverage are solid, but after-fix real behavior proof remains the merge gate.
Proof confidence 🦐 gold shrimp (3/6) Needs stronger real behavior proof before merge: The body has credible before-state evidence, but it lacks an after-fix real withheld-refresh result showing the message cleared; add redacted live output or logs, then update the PR body for re-review (or ask a maintainer to comment @clawsweeper re-review).
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Verification

Check Result Evidence
Real behavior Needs proof Needs stronger real behavior proof before merge: The body has credible before-state evidence, but it lacks an after-fix real withheld-refresh result showing the message cleared; add redacted live output or logs, then update the PR body for re-review (or ask a maintainer to comment @clawsweeper re-review).
Evidence reviewed 5 items Current-main behavior: Current main returns immediately when weekly-reset admission withholds an outcome, before the ordinary publication path clears the Codex error state.
Focused implementation: The PR calls the new cleanup helper only on the withheld path; the helper clears connectivity-classified errors, preserves other error classes, updates the persisted matching account record, and records fetch success on the failure gate.
Regression coverage: The added tests cover persisted-error hydration, withheld-success cleanup, non-connectivity preservation, and the previously reported first-failure suppression reset.
Findings None None.
Security None None.

Live Verification

Command: swift run CodexBarCLI --help

Result: FAIL (failed) — execution before step 1 run: sh -lc pnpm install --ignore-scripts --frozen-lockfile failed: ! Corepack is about to download https://registry.npmjs.org/pnpm/-/pnpm-11.24.0.tgz

sh -lc pnpm install --ignore-scripts --frozen-lockfile failed: ! Corepack is about to download https://registry.npmjs.org/pnpm/-/pnpm-11.24.0.tgz

Assertions:

  • FAIL expect_output: Usage:

How this fits together

CodexBar fetches Codex usage, validates suspicious weekly-reset readings, and then publishes trusted account state to the menu bar card and snapshot store. Withheld readings preserve the trusted usage while this change removes a disproven connectivity error.

flowchart LR
A[Codex usage fetch] --> B[Weekly reset admission]
B -->|Publish| C[Update card and account snapshot]
B -->|Withhold successful reading| D[Clear stale connectivity error]
D --> E[Preserve trusted usage]
E --> F[Menu bar card]
Loading

Before merge

  • Add real behavior proof - Needs stronger real behavior proof before merge: The body has credible before-state evidence, but it lacks an after-fix real withheld-refresh result showing the message cleared; add redacted live output or logs, then update the PR body for re-review (or ask a maintainer to comment @clawsweeper re-review).
  • Resolve merge risk (P1) - The PR body documents the affected live installation but does not show an after-fix withheld successful refresh clearing the stale error.
  • Complete next step (P2) - The remaining merge blocker is contributor-supplied real-behavior proof, not a repair suitable for automation.
Agent review details

Security

None.

Review metrics

Metric Value Why it matters
Production versus test delta production +93/-1, tests +287 The persistence-sensitive behavior is accompanied by targeted coverage for state, disk, classification, and failure-gate outcomes.

Merge-risk options

Maintainer options:

  1. Decide the mitigation before merge
    Keep the existing weekly-reset admission policy and land this narrow error-state repair once redacted after-fix evidence demonstrates the withheld-success path.
  2. Pause or close
    Do not merge this PR until maintainers decide whether the risk is worth taking.

Technical review

Best possible solution:

Keep the existing weekly-reset admission policy and land this narrow error-state repair once redacted after-fix evidence demonstrates the withheld-success path.

Do we have a high-confidence way to reproduce the issue?

Yes, source-reproducible: current main returns before error cleanup on withheld admission, and the PR's focused tests construct the persisted-error and withheld-success sequence.

Is this the best way to solve the issue?

Yes, the patch reuses the existing connectivity classification and account-scoped persistence path without changing weekly-reset publication policy.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against cf79d1310493.

Labels

Label changes:

  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🐚 platinum hermit.
  • remove rating: 🦪 silver shellfish: Current PR rating is rating: 🦐 gold shrimp, so this older rating label is no longer current.

Label justifications:

  • P2: This is a bounded Codex provider-state correction that prevents a misleading stale connectivity message.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🐚 platinum hermit.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs stronger real behavior proof before merge: The body has credible before-state evidence, but it lacks an after-fix real withheld-refresh result showing the message cleared; add redacted live output or logs, then update the PR body for re-review (or ask a maintainer to comment @clawsweeper re-review).

Evidence

What I checked:

Likely related people:

  • steipete: Introduced the merged Codex weekly-reset confirmation behavior and has extensive recent ownership history for Codex account-state isolation. (role: feature owner; confidence: high; commits: b2b9c535e513, 5bc78a2c309b; files: Sources/CodexBar/Providers/Codex/UsageStore+CodexPATRefresh.swift, Sources/CodexBar/Providers/Codex/UsageStore+CodexAccountState.swift)
  • Zihao-Qi: Authored the merged delayed-confirmation follow-up that owns the nearby weekly-reset admission path. (role: recent area contributor; confidence: medium; commits: 0a1aa53598c9; files: Sources/CodexBar/Providers/Codex/UsageStore+CodexWeeklyResetConfirmation.swift)

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Add redacted after-fix evidence showing a successfully fetched withheld reading clears the persisted and displayed connectivity error.

Rating scale

Score Internal tier Crab rank Meaning
6/6 S 🦀 challenger crab Exceptional readiness
5/6 A 🦞 diamond lobster Very strong readiness
4/6 B 🐚 platinum hermit Good normal PR; ordinary maintainer review
3/6 C 🦐 gold shrimp Useful, but confidence is limited
2/6 D 🦪 silver shellfish Proof or implementation needs work
1/6 F 🧂 unranked krab Not merge-ready
N/A NA 🌊 off-meta tidepool Rating does not apply

Overall follows the weaker of proof and patch quality.
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

Workflow

  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

History

Review history (1 earlier review cycle)
  • reviewed 2026-08-26T18:15:37.474Z sha 97fc3b4 :: needs real behavior proof before merge. :: [P2] Reset the failure gate after a withheld successful fetch

Review follow-up. The ordinary publication path records the fetch success
on the consecutive-failure gate; the withheld path returned without doing
so, leaving the streak from the outage that just ended. The next transient
failure would then be surfaced immediately instead of receiving the normal
first-failure suppression.

The streak counts fetch outcomes rather than publications, so record the
success alongside clearing the connectivity message.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@olddonkey

Copy link
Copy Markdown
Contributor Author

Both items addressed in 70a37b98d; the PR body now carries the live evidence.

[P2] Reset the failure gate after a withheld successful fetch — fixed. Correct catch, and the reasoning generalises: the streak counts fetch outcomes, not publications, so the withheld path had no business leaving the outage's streak standing. clearCodexFetchErrorAfterWithheldPublication now calls failureGates[.codex]?.recordSuccess() as soon as the outcome is a success, before and independently of the message-eligibility check. New test a withheld success restores first-failure suppression walks exactly the sequence you described: two failures surface a message → a withheld success clears it and records the success → one later transient failure is suppressed again.

Two things that test surfaced, worth recording because they are easy to get wrong:

  • suppression is conditional on hadPriorData, so a scenario that lets the prior snapshot drop will surface the first failure no matter what the gate says;
  • the two behaviours key off different things — isPreservableNetworkTransportError matches the NSURLErrorDomain domain and code, while the connectivity classification matches the message text. The test's error now mirrors production on both axes (the domain/code plus the "Network error: …" shape the Codex OAuth fetcher produces).

Real behavior proof — added, with one honest gap. The "Real behavior on the affected install" section has the live capture from the 0.55.1 install this was found on: the persisted record carrying the message while returned 200 in 0.33 s, the bundled CLI succeeded, and the app's debug log showed six refresh cycles with zero network errors — plus the app's own requiresConfirmationpreservePrevious decision log for those cycles.

It also has the live recovery: once weekly usage crossed the 1% threshold the reading published normally and the message disappeared on its own. That is the coupling this PR breaks, observed end to end on a real account — nothing but a publication clears the message, so while readings are withheld it cannot go away.

What I could not produce is an after-fix capture of a withheld cycle. That needs the account inside the withhold band (weekly at or below 1%, advanced boundary, reset credit available); this one left the band at 19:41 UTC and resetThreshold is a fixed constant with no override, so generating that output on demand would mean feeding a fake reading — which would not be live proof of anything. I did drive a real UsageStore against a copy of the real snapshot file and the real ~/.codex auth over the network to confirm the harness exercises the real pipeline; outside the band it published the current 2% reading, as expected. I will post the withheld capture at the next early reset, and I can share the harness if you would rather run it on an account that is in the band now.

Gate on this head: make check 0 violations, full make test 78/78 groups / 933 selections green.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Aug 26, 2026

Copy link
Copy Markdown

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event exact_review_queue).
Result: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Aug 26, 2026

@steipete steipete left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

The stale-connectivity diagnosis is sound, and resetting the failure gate alongside clearing the message addresses the earlier feedback. I found one remaining correctness boundary in head 70a37b9.

P2 — Validate refresh freshness and account ownership before clearing state. clearCodexFetchErrorAfterWithheldPublication records success and clears errors[.codex] before checking the current account, and it never checks the refresh generation. Its caller reaches this branch after awaiting publication admission. A nil admission can also result from cancellation or a failed confirmation, so a superseded refresh can clear the selected account's error/failure gate. Please apply the existing generation, cancellation, and account/workspace ownership guards before any cleanup, with regressions for a superseded refresh and a same-email account/workspace switch.

The stacked-account branch also retains the prior record unchanged when result.outcome is nil. Please cover the same successful-but-withheld recovery there, or explicitly narrow the PR's claim to single-account refreshes. Preserve the published snapshot, credits, pending reset evidence, sibling account errors, and persisted records; this should not change weekly-reset admission policy.

The current CI is green, but the added tests do not exercise these ownership races or the stacked path. The new test file extends CodexAccountScopedRefreshTests, so that is the focused suite to run. A persistence/relaunch assertion after successful cleanup would also pin down the original user-visible failure.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P2 Normal priority bug or improvement with limited blast radius. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants