Skip to content

feat(spend): cache-first and 5m TTL for dashboard - #3107

Open
Yuxin-Qiao wants to merge 12 commits into
steipete:mainfrom
Yuxin-Qiao:feat/spend-cache-ttl
Open

feat(spend): cache-first and 5m TTL for dashboard#3107
Yuxin-Qiao wants to merge 12 commits into
steipete:mainfrom
Yuxin-Qiao:feat/spend-cache-ttl

Conversation

@Yuxin-Qiao

Copy link
Copy Markdown
Contributor

Complements #3105 (parallel) and #3106 (silent) with cache-first.

Cache-first

  • SpendDashboardController.swift:1083 shouldPrimeCachedCodex was phase == .ordinary only. Cold 全部 with loadedInputs.isEmpty and forceRefresh (user taps Refresh while empty) never primed cache → 2s empty 正在刷新. Now also primes when empty, so first paint uses loadCached:330 50ms sqlite snapshot.

TTL

  • UsageStore+SpendDashboardTokenCost.swift:72 refreshSpendDashboardTokenUsageNow had no TTL beyond inFlight, so every pane re-open (makeRequest:237 refreshMissing) forced a 365d rescan. Add 5m TTL for non-forced calls when scope unchanged and publication exists. Pane tab switch now 0s.

Evidence

  • SpendDashboardController.swift:1083 priming
  • UsageStore+SpendDashboardTokenCost.swift:72 TTL
  • swiftformat + swiftlint --strict clean
  • Before: tab switch → 365d scan; cold empty 2s
  • After: warm 0s, cold 50ms cached

Follow-up for full cross-restart persistence is tracked separately.

@clawsweeper

clawsweeper Bot commented Aug 20, 2026

Copy link
Copy Markdown

🦞👀
ClawSweeper picked this up.

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

@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: 1f4bbb2cc7

ℹ️ 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 +73 to +77
if !force,
let lastAt = self.lastSpendDashboardTokenFetchAt[provider.instanceID],
let lastScope = self.lastSpendDashboardTokenFetchScope[provider.instanceID],
lastScope == costScopeSignature,
self.spendDashboardTokenSnapshotPublicationForCurrentConfig(for: provider) != 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 Route a non-forced request through the TTL check

This TTL cannot fire through production code: the sole caller in SpendDashboardSource.makeRequest always passes force: true, while .refreshMissing invokes that caller only when no current publication exists—even though this condition requires one. Consequently, the new five-minute guard cannot suppress any dashboard token scan; the caller needs to preserve the build mode's forced/non-forced semantics or perform the TTL decision before the missing-publication predicate.

Useful? React with 👍 / 👎.

@clawsweeper clawsweeper Bot added P2 Normal priority bug or improvement with limited blast radius. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Aug 20, 2026
@clawsweeper

clawsweeper Bot commented Aug 20, 2026

Copy link
Copy Markdown

Codex review: needs real behavior proof before merge. Reviewed August 21, 2026, 6:14 PM ET / 22:14 UTC.

ClawSweeper review

What this changes

The PR adds cache-first dashboard loading, a five-minute token-snapshot TTL, and bounded usage-log/cache hydration to reduce repeated spend-dashboard scans.

Merge readiness

Blocked until real behavior proof is added - 8 items remain

This PR is still necessary, but two cache-first paths can publish incorrect spend data and need repair before merge.

Priority: P2
Reviewed head: b577455ac925265e87a54f1c3315723ee6d0f257

Review scores

Measure Result What it means
Overall readiness 🧂 unranked krab (1/6) The performance intent is useful, but two report-correctness defects and missing runtime proof leave the PR unready.
Proof confidence 🧂 unranked krab (1/6) Needs real behavior proof before merge: The PR body states timings and tooling results but provides no after-fix runtime artifact showing cache reuse and refresh after expiry; add redacted terminal output, logs, or a recording. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Patch quality 🦪 silver shellfish (2/6) 2 actionable review findings remain.

Verification

Check Result Evidence
Real behavior Needs proof Needs real behavior proof before merge: The PR body states timings and tooling results but provides no after-fix runtime artifact showing cache reuse and refresh after expiry; add redacted terminal output, logs, or a recording. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Evidence reviewed 6 items Current main does not include this optimization: Current main still refreshes only when a publication is missing and passes a forced refresh; it has no TTL-aware request gate or aggregate-report hydration mode.
Aggregate mode loses report inputs: The new aggregate mode deliberately excludes persisted usage rows, causing reconstruction from aggregate rows that omit reasoning and timestamps.
The report builder depends on row metadata: Cached-report construction derives pricing evidence and reasoning totals from usage rows, so synthesized aggregate rows are not report-equivalent for historical pricing or reasoning usage.
Findings 2 actionable findings [P2] Preserve report metadata in aggregate hydration
[P2] Require dashboard coverage before reusing legacy freshness
Security None None.

Live Verification

Command: swift test --filter CostUsageStoreAggregateModeTests

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.22.0.tgz

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

Assertions:

  • FAIL expect_output: Test run with
  • FAIL expect_output: Test run with

How this fits together

The spend dashboard collects provider token snapshots and local usage logs, then builds and publishes a cost report to dashboard panes. This change decides when existing data is reused versus rescanned and how cached usage is hydrated.

flowchart LR
A[Provider snapshots and local logs] --> B[Spend dashboard request]
B --> C[Freshness and scope check]
C --> D[Cache or provider refresh]
D --> E[Cost report builder]
E --> F[Dashboard pane]
Loading

Before merge

  • Add real behavior proof - Needs real behavior proof before merge: The PR body states timings and tooling results but provides no after-fix runtime artifact showing cache reuse and refresh after expiry; add redacted terminal output, logs, or a recording. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
  • Preserve report metadata in aggregate hydration (P2) - aggregateReport omits persisted rows, then reconstructs rows without reasoning or timestamps. The report builder uses those fields for reasoning totals and historical pricing, so a warm cache can change displayed spend; retain equivalent metadata or use a report-safe representation.
  • Require dashboard coverage before reusing legacy freshness (P2) - A recent legacy publication is accepted without checking its history scope. The regular pipeline can hold a shorter snapshot while this dashboard requests 365 days, so the fallback skips the fetch and the All view remains incomplete until a later refresh.
  • Resolve merge risk (P1) - A warm aggregate cache can show zero reasoning usage or price historical usage incorrectly.
  • Resolve merge risk (P1) - A recent shorter legacy snapshot can make the dashboard’s All view show incomplete history until another refresh.
  • Resolve merge risk (P1) - The PR has no after-fix runtime artifact showing warm reuse and expiry behavior.
  • Improve patch quality - Repair the aggregate-cache and legacy-freshness paths with focused regressions.
  • Improve patch quality - Add a redacted after-fix runtime trace showing a warm reopen and refresh after five minutes.

Findings

  • [P2] Preserve report metadata in aggregate hydration — Sources/CodexBarCore/Vendored/CostUsage/CostUsageStore+CodexCache.swift:321-326
  • [P2] Require dashboard coverage before reusing legacy freshness — Sources/CodexBar/UsageStore+SpendDashboardTokenCost.swift:35-38
Agent review details

Security

None.

Review metrics

Metric Value Why it matters
Production vs. test delta production +120/-26; tests +275/-22 across 13 files The patch adds a substantial cache path, so focused correctness regressions should cover its new fast paths.

Merge-risk options

Maintainer options:

  1. Repair cache equivalence (recommended)
    Preserve or reconstruct the metadata needed for historical pricing and reasoning totals, and reject under-scoped legacy snapshots before skipping a dashboard refresh.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Preserve report equivalence between aggregate and scan-ready cache hydration, and require dashboard-scope coverage before accepting legacy snapshot freshness.

Technical review

Best possible solution:

Keep cache hydration report-equivalent to a full scan and reuse legacy data only after proving it covers the dashboard’s 365-day scope.

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

Yes. Source inspection shows aggregate hydration drops row metadata used by the report builder, and legacy freshness can suppress the required 365-day dashboard refresh.

Is this the best way to solve the issue?

No. The fast path needs report-equivalence coverage and the legacy fallback must verify dashboard-window coverage before it can safely skip a fetch.

Full review comments:

  • [P2] Preserve report metadata in aggregate hydration — Sources/CodexBarCore/Vendored/CostUsage/CostUsageStore+CodexCache.swift:321-326
    aggregateReport omits persisted rows, then reconstructs rows without reasoning or timestamps. The report builder uses those fields for reasoning totals and historical pricing, so a warm cache can change displayed spend; retain equivalent metadata or use a report-safe representation.
    Confidence: 0.97
  • [P2] Require dashboard coverage before reusing legacy freshness — Sources/CodexBar/UsageStore+SpendDashboardTokenCost.swift:35-38
    A recent legacy publication is accepted without checking its history scope. The regular pipeline can hold a shorter snapshot while this dashboard requests 365 days, so the fallback skips the fetch and the All view remains incomplete until a later refresh.
    Confidence: 0.98

Overall correctness: patch is incorrect
Overall confidence: 0.96

AGENTS.md: found and applied where relevant.

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

Labels

Label changes:

  • add merge-risk: 🚨 compatibility: Cache-first hydration can replace established dashboard totals with incomplete historical data.

Label justifications:

  • P2: The PR can show incorrect spend-dashboard totals but has limited blast radius and no availability impact.
  • merge-risk: 🚨 compatibility: Cache-first hydration can replace established dashboard totals with incomplete historical data.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🦪 silver shellfish.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The PR body states timings and tooling results but provides no after-fix runtime artifact showing cache reuse and refresh after expiry; add redacted terminal output, logs, or a recording. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Evidence

Acceptance criteria:

  • [P1] swift test --filter CostUsageStoreAggregateModeTests.
  • [P1] swift test --filter SpendDashboardSourceConcurrencyTests.
  • [P1] make check.

What I checked:

Likely related people:

  • steipete: Peter Steinberger authored the merged spend-reporting integration and the related shared-cache heatmap work. (role: introduced merged spend-reporting series; confidence: high; commits: bbb5cd73af04, 521af81e1e10; files: Sources/CodexBar/SpendDashboardController.swift, Sources/CodexBarCore/Vendored/CostUsage/CostUsageStore+CodexCache.swift)
  • Yuxin-Qiao: Yuxin Qiao has prior merged work on all-time provider spend and dashboard token/coverage presentation, beyond this proposed branch. (role: recent spend-dashboard contributor; confidence: high; commits: 5277c8a6d21e, d6a90ad88787; files: Sources/CodexBar/SpendDashboardController.swift, Sources/CodexBar/UsageStore+SpendDashboardTokenCost.swift)

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 (5 earlier review cycles)
  • reviewed 2026-08-20T11:19:53.716Z sha 1f4bbb2 :: needs real behavior proof before merge. :: [P2] Route ordinary pane opens through the TTL gate
  • reviewed 2026-08-20T12:35:18.779Z sha 4582171 :: needs real behavior proof before merge. :: [P2] Route the TTL through an eligible refresh path
  • reviewed 2026-08-21T10:19:03.342Z sha b7ceb1b :: needs real behavior proof before merge. :: [P2] Route pane reopening through the TTL gate
  • reviewed 2026-08-21T16:42:40.414Z sha 5245b8b :: needs real behavior proof before merge. :: [P2] Route ordinary reopening through the TTL gate
  • reviewed 2026-08-21T21:16:54.896Z sha 5d3a4c9 :: needs real behavior proof before merge. :: [P2] Refresh stale snapshots when the unchanged pane reopens

@steipete

Copy link
Copy Markdown
Owner

CI failure is a real compile error:

Sources/CodexBar/SpendDashboardController.swift:1086:23: error: referencing operator function '==' on 'Equatable' requires that 'SpendDashboardController.LoadPhase' conform to 'Equatable'

LoadPhase needs Equatable (or match with a case/if case pattern instead of ==). Please fix and re-push.

- shouldPrimeCachedCodex now also primes when loadedInputs is empty
  even in forcing phase, so cold-start 全部 with empty model gets
  50ms cached Codex snapshot instead of 2s empty → groups. Covers
  the Refresh-while-empty path.

- refreshSpendDashboardTokenUsageNow respects 5m TTL for
  non-forced pane re-open: reuses existing
  spendDashboardTokenPublication when scope unchanged and last fetch
  <5m, avoiding 365d rescan on every tab switch.

Evidence:
- SpendDashboardController.swift:1083 shouldPrimeCachedCodex
- UsageStore+SpendDashboardTokenCost.swift:72 TTL gate
Before: tab switch → 365d scan; cold 全部 empty 2s.
After: warm tab switch 0s, cold 全部 50ms cached.
@Yuxin-Qiao
Yuxin-Qiao force-pushed the feat/spend-cache-ttl branch from 4582171 to d3596a6 Compare August 21, 2026 09:57

@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: d3596a6a84

ℹ️ 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".

let shouldPrimeCachedCodex: Bool = self.cachedLoader != nil
&& !Set(Self.codexOwnershipByID(configuration.codexAccountIdentities).keys)
.isSubset(of: Set(self.loadedInputs.map(\.id)))
&& (phase == .ordinary || self.loadedInputs.isEmpty)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Pattern-match the load phase instead of comparing it

LoadPhase does not conform to Equatable, and its reconciling(ForcedOutcome) payload prevents synthesized conformance, so phase == .ordinary produces a “binary operator '==' cannot be applied” compiler error and blocks every build. Preserve the prior if case .ordinary = phase pattern or introduce an explicit case-checking property; the repository-required test run would have caught this before handoff.

AGENTS.md reference: AGENTS.md:L23-L24

Useful? React with 👍 / 👎.

@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: ac856d5c36

ℹ️ 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".

let identity = "\(logURL.path)|\(size)|\(mtime)"

if let cached = self.readCachedEntries(identity: identity), !cached.isEmpty {
if let cached = self.readCachedEntries(identity: identity, since: since) {

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 Apply the report cutoff on cache misses

When usage.jsonl has changed since the previous read—as it normally does whenever a new request is appended—the identity check here misses and loadEntries reparses, deduplicates, sorts, and returns the entire lifetime log without applying since. Consequently, the new window only limits SQLite cache-hit reads, while active users continue hitting the unbounded latency and memory path this change is meant to avoid; apply the cutoff in the parser/miss path as well, while retaining the full cache if needed.

Useful? React with 👍 / 👎.

@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: 73bc2a1a34

ℹ️ 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 +246 to +248
for baseline in providerBaselines where mode.shouldRefresh(
hasPublication: baseline.publication != nil,
isDashboardTokenStale: store.spendDashboardTokenFetchIsStale(for: baseline.provider))

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 Trigger the TTL check when reopening the pane

When the pane is reopened after five minutes without a configuration change, SpendDashboardPane.onAppear calls update(configuration:), but the equality guard in SpendDashboardController.update returns before building a request, so the stale predicate added here is never evaluated. Fresh evidence in the current tree is that the patch now correctly passes the non-forced mode to the loader, while the unchanged controller guard still prevents that path from running on an ordinary reopen. The cached snapshot can therefore remain beyond the advertised TTL until a configuration/date change or manual refresh triggers another load.

Useful? React with 👍 / 👎.

@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

let parsed = try OpenCodexUsageParser.parse(fileURL: logURL, fileManager: fileManager)
var unique: [String: OpenCodexUsageEntry] = [:]
for entry in parsed {
unique[entry.requestID] = entry

P2 Badge Apply the cutoff before parsing cache misses

When usage.jsonl changes, this cache-miss path still parses the entire lifetime file, materializes every entry in unique, sorts the full collection, and rewrites all entries before the since filter runs. Thus active logs remain subject to unbounded peak memory and refresh latency even though the returned array is windowed. Fresh evidence in the current tree is that the follow-up only filters deduped after these full-history operations; pass the cutoff into parsing or otherwise avoid materializing old entries on the report path.

ℹ️ 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".

@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: b577455ac9

ℹ️ 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 +324 to +326
let rowsByPath = mode == .scanReady
? Dictionary(grouping: snapshot.usageRows, by: \.path)
: [:]

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 Preserve row metadata in aggregate report hydration

When cached Codex usage contains reasoning tokens or usage preceding a historical pricing cutoff, .aggregateReport discards the persisted rows and reconstructs them from day/model aggregates. Those synthesized rows omit both reasoning and timestampUnixMs, while buildCodexReportFromCache derives displayed reasoning totals and date-sensitive pricing from those fields. Consequently, the cache-first snapshot can report zero reasoning and price historical usage at current rates; retain the required metadata in the aggregate representation or decode the rows needed for an equivalent report.

Useful? React with 👍 / 👎.

Comment on lines +35 to +38
guard self.tokenSnapshotPublicationForCurrentProviderConfig(for: provider) != nil,
let legacyLast = self.lastTokenFetchAt[provider.instanceID]
else { return true }
return Date().timeIntervalSince(legacyLast) >= 5 * 60

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 Require full dashboard coverage before adopting legacy freshness

When the regular token pipeline has just published its default 30-day snapshot before the first dashboard open, this branch treats it as fresh solely from its timestamp even though the dashboard requests scanDays == 365. capturedTokenPublication then falls back to that legacy snapshot and skips the independent dashboard fetch, so the dashboard's 365-day/All view is populated with only 30 days of history until another refresh is triggered. Reuse legacy freshness only when its history coverage and scope satisfy the dashboard request.

Useful? React with 👍 / 👎.

@clawsweeper clawsweeper Bot added the merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. label Aug 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. P2 Normal priority bug or improvement with limited blast radius. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. 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