Skip to content

ci: landing train (do not merge) - #4557

Open
steipete wants to merge 21 commits into
mainfrom
landing-train
Open

steipete wants to merge 21 commits into
mainfrom
landing-train

Conversation

@steipete

Copy link
Copy Markdown
Owner

Batched landing train: main plus several READY PRs, merged here so CI runs once on the combination before each PR is merged on its own. Maintainer infrastructure; never merged. Not a draft on purpose: draft PRs defer the macOS Swift tests.

@clawsweeper

clawsweeper Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

🦞👀
ClawSweeper picked this up.

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

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ⚠️ Failed 2026-10-19T06:22:53.922827Z 69dcec5 New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@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: 2f7b51a4b6

ℹ️ 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 runAttributes = CTRunGetAttributes(run) as NSDictionary
let attributes = title.attributes(at: CTRunGetStringRange(run).location, effectiveRange: nil)
guard attributes[.foregroundColor] as? NSColor == foregroundColor,
(attributes[.attachment] as? NSTextAttachment)?.image?.isTemplate != false,

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 Treat neutral progress-bar attachments as template-safe

When a fresh layout contains .progressBar—including the built-in Bars Stacked preset—the attachment from progressBarImage retains NSImage's default isTemplate == false, so this guard rejects it even though it is rendered only with the neutral foreground color. The renderer consequently falls back to an attributed title, and these monochrome stacked layouts still do not receive inactive-display dimming; distinguish genuinely colored attachments from neutral progress bars and add the preset to the template-path tests.

AGENTS.md reference: AGENTS.md:L4-L5

Useful? React with 👍 / 👎.

@clawsweeper clawsweeper Bot added P2 Normal priority bug or improvement with limited blast radius. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Oct 16, 2026
@clawsweeper

clawsweeper Bot commented Oct 16, 2026

Copy link
Copy Markdown

Codex review: needs maintainer review before merge.

What this changes

This PR combines repairs for OpenCode Go history, Antigravity widget resets, stacked menu-bar dimming, and confetti duration for shared CI validation.

Example: OpenCode v2.0.29 local history displayed in CodexBar’s OpenCode Go settings.

  • Before: Today shows $0.00 and 0 tokens; the last 30 days show $7.07.
  • After: Today shows $0.99 and 1.5M tokens; the last 30 days show $11.15.

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) Useful bounded repairs with no definite introduced defect; direct app evidence covers OpenCode history, while the combined train has uneven runtime coverage and intentionally partial dimming scope.
Proof confidence 🦐 gold shrimp (3/6) This owner-authored infrastructure PR is outside the ordinary contributor proof gate; inspected OpenCode Go screenshots exercise the settings entry point, while the stacked-rendering image demonstrates only synthetic AppKit tinting.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Product

Kind: Bug fix · Worth it: Yes · Fix scope: Partial
User problem: Local OpenCode Go history stops updating after a v2 upgrade, Antigravity widgets omit reset captions, stacked monochrome rows miss native dimming, and reset confetti disappears early.
Reason: The owner has authorized batching these bounded repairs; the menu-bar lane explicitly leaves colored and other unsupported rendering cases to the existing issue.

Merge readiness

✅ Ready for maintainer review

Keep open as maintainer-controlled CI infrastructure: this PR explicitly must never merge, and inspection found no definite introduced defect.

Priority: P2
Reviewed head: 2f7b51a4b6d6fa0d00c807c9dfffb9f1c52e254b

Before merge

None.

Findings

None.

Tests

  • Missing end-to-end proof: The menu-bar evidence is synthetic rather than a live multi-display capture, widget behavior has focused source-level coverage, and the confetti recording could not be inspected because its host was blocked.
Agent review details

How this fits together

Provider history and quota snapshots feed cost aggregation, menu-bar rendering, widget snapshots, and reset celebrations; this temporary train validates several repair branches together.

flowchart LR
A[Provider history and quotas] --> B[Usage store]
B --> C[Menu bar renderer]
B --> D[Widget snapshot]
B --> E[Reset celebration]
F[Repair branches] --> G[Combined CI train]
Loading

Technical review

Best possible solution:

Use this train for combined CI, land the repair lanes individually, and retain the broader dimming issue for its remaining cases.

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

Main’s legacy-only history query, missing Antigravity row windows, stacked-title template exclusion, and five-second overlay timer establish the affected paths; no target code was executed during this review.

Is this the best way to solve the issue?

The repairs reuse existing owners and preserve legacy precedence, unknown-capacity handling, color safeguards, and opt-in celebration behavior; the dimming repair deliberately addresses only part of the linked issue.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning medium; reviewed against 72f47e23c8e8.

Provenance checked

Testing

Proof path: shipped entry point.

Security

None.

Evidence

What I checked:

Likely related people:

  • Peter Steinberger: Raw commit 99eaa55 adds Sources/CodexBar/MenuBarLayoutRenderer.swift:113 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: 99eaa55deba6; files: Sources/CodexBar/MenuBarLayoutRenderer.swift)
  • Lev: Raw commit 4d27bb1 adds Sources/CodexBar/MenuBarLayoutRenderer.swift:410 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: medium; commits: 4d27bb113e5e; files: Sources/CodexBar/MenuBarLayoutRenderer.swift)
  • YY: Raw commit 76d62b2 adds Sources/CodexBar/MenuBarLayoutRenderer.swift:304 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: medium; commits: 76d62b222c8f; files: Sources/CodexBar/MenuBarLayoutRenderer.swift)
  • Zihao Qi: Raw commit 984c2d1 adds Sources/CodexBar/UsageStore+WidgetSnapshot.swift:157 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: medium; commits: 984c2d1fa91b; files: Sources/CodexBar/UsageStore+WidgetSnapshot.swift)
  • Sopen: Raw commit 7754035 adds Sources/CodexBarCore/Providers/OpenCodeGo/OpenCodeGoLocalUsageReader.swift:119 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: medium; commits: 7754035e6bb5; files: Sources/CodexBarCore/Providers/OpenCodeGo/OpenCodeGoLocalUsageReader.swift)

Review metrics

Metric Value Why it matters
Production and regression coverage Production +43/-46 lines; tests +280/-5 lines Production shrinks slightly while tests cover v2 deduplication, measured versus unknown widget windows, template rendering, and animation lifetime.

Labels

Label changes:

  • add P2: The bundled repairs address limited provider-history and display defects without evidence of an urgent core-runtime failure.
  • add proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence.
  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🐚 platinum hermit.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.

Label justifications:

  • P2: The bundled repairs address limited provider-history and display defects without evidence of an urgent core-runtime failure.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence.

Rating scale

6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior.

Workflow

ClawSweeper edits this one comment on every review. Comment @clawsweeper re-review for a fresh review only. Repair and merge execution lanes are retired.

Reviewed October 15, 2026, 9:25 PM ET / October 16, 2026, 01:25 UTC.

@steipete
steipete force-pushed the landing-train branch 2 times, most recently from 11426d4 to 21f020c Compare October 16, 2026 02:47

@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: 21f020cc80

ℹ️ 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 +584 to +586
with tempfile.TemporaryDirectory(prefix="codexbar-test-discovery-") as home:
environment = os.environ | {"HOME": home, "CFFIXED_USER_HOME": home}
result = subprocess.run(command, capture_output=True, text=True, env=environment)

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 Keep SwiftPM's dependency cache outside the private HOME

On a clean checkout or compiled-cache fallback, this redirects SwiftPM's default shared-cache root into a fresh temporary directory, so the ~/Library/Caches/org.swift.swiftpm cache explicitly restored by .github/workflows/ci.yml lines 144–153 is ignored and then deleted; local focused runs likewise refetch dependencies and can fail offline despite a warm cache. swift test --help identifies --cache-path as the shared-cache override, so preserve the caller's cache path explicitly while isolating the test process's HOME.

AGENTS.md reference: AGENTS.md:L31-L31

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: f47367d7f2

ℹ️ 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 thread CHANGELOG.md Outdated
Comment on lines +48 to +50
- Claude: release macOS sleep inhibitors after passive CLI session probes (#4544). Thanks @iamyeizi!
- Claude: open Platform usage for default and API accounts while keeping recognized subscriptions on Claude usage settings (#4503). Thanks @Alex-Keyes!
- Dock: stop rescanning windows on every update pass while preserving Settings and scheduled update dialogs (#4516, #4524). Thanks @harjothkhara and @Leen15!

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 Keep new fixes in the unreleased section

This commit introduces the sleep-inhibitor fix after 0.76.0 was released, but records it under 0.76.0, so generated release notes will attribute the fix to a version that did not contain it. The other two added lines also duplicate entries already present in the 0.76.1 Unreleased section; move #4544 there and remove the duplicate #4503/#4516/#4524 entries.

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: 1a2135e821

ℹ️ 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 +105 to +109
return .automaticCandidates([
context.snapshot.primary,
context.snapshot.secondary,
context.snapshot.tertiary))
context.snapshot.tertiary,
].compactMap(\.self))

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 Keep partial Auto providers in highest-usage rotation

When MiniMax has one exhausted lane and another usable lane, returning all lanes as .automaticCandidates makes the shared selector choose the 100% lane, after which providerWithHighestUsage passes that percentage to shouldExcludeFromHighestUsage. Because MiniMax still sets automaticSelectionPrioritizesExhaustedWindow to false and has no partial-exhaustion branch there, the provider is dropped from the unified highest-usage icon even though it is not fully rate-limited; z.ai has the same combination. Update the exclusion policy for these candidate-based multi-lane providers.

Useful? React with 👍 / 👎.

Comment thread CHANGELOG.md
Comment on lines 8 to 10
### Added

- Settings: offer a six-day Monday–Saturday work week for weekly pace and session forecasts (#4548). Thanks @ViaxCo!

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 Keep existing fixes under the Fixed heading

Placing ### Added here causes every existing entry from “Usage forecasts” through the sleep-inhibitor change to be categorized as an addition rather than a fix by changelog/release-note consumers. Keep the new Settings item under Added, but restore a Fixed heading before the existing fixes and group the new widget fix with them.

Useful? React with 👍 / 👎.

Comment thread CHANGELOG.md Outdated

### Added

- Claude: optionally read web usage from the Claude desktop app’s signed-in session, following desktop account switches without using browser credentials (#4494). Thanks @flutterrausch!

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 Move newly landed features to the unreleased section

This implementation lands after the dated 0.76.0 release, but the new Claude desktop-cookie entry is recorded under 0.76.0; the Settings navigation and Auto-ranking entries added below have the same problem, so generated release notes will claim that an already-published build contained these features. The fresh evidence in this revision is the newly added #4494, #4475, and #4491 entries themselves; move them into the corresponding 0.76.1 Unreleased sections.

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: 00a6add424

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


func includesOverviewTab(enabledProviders: [UsageProvider]) -> Bool {
enabledProviders.count > 1 &&
self.switcherProviderIDs(enabledFirstPartyProviders: enabledProviders).count > 1 &&

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 Count non-top-level plugins before hiding Overview

When there is one enabled first-party provider plus an enabled plugin declared with topLevel: false, the plugin is offered in the Overview picker via overviewProviderIDs, but this condition counts only switcher providers, so it hides the Overview tab and makes that selection inaccessible. Base the tab decision on the providers eligible for Overview rather than only first-party and top-level switcher segments.

Useful? React with 👍 / 👎.

Comment on lines +95 to +96
environment["CODEXBAR_DASHBOARD_TOKEN"] = self.configuration.token
process.environment = environment

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 Hide the bearer from provider subprocesses

When the managed server services a CLI-backed provider, this bearer remains in ProcessInfo.processInfo.environment; CLIUsageCommand.fetchUsageOutput uses that environment as its provider base, and subprocess runners forward it unchanged to provider executables. Consequently every invoked provider CLI receives the dashboard credential even though only the server needs it. Remove the variable from the serve process after resolving authentication, or explicitly scrub it from provider launch environments.

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: 5c1f0a0d11

ℹ️ 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 +111 to +112
try process.run()
self.child = process

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 Tie the managed server lifetime to the app process

If CodexBar crashes or is force-quit, applicationShouldTerminate never calls stopForTermination(), and this ordinary child process is reparented rather than terminated. Because the helper has null stdin/stdout and no parent-death monitor, a configured non-loopback server can continue exposing its authenticated endpoints indefinitely; relaunching CodexBar then only reports a port conflict and cannot stop the orphan it no longer owns. Add parent-liveness monitoring in the helper or another owner-bound shutdown mechanism.

Useful? React with 👍 / 👎.

@steipete
steipete force-pushed the landing-train branch 2 times, most recently from de905d2 to f2864e7 Compare October 16, 2026 12:56

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

ℹ️ 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 +147 to +149
case let error as ProviderFetchClassifiedError:
// `.authenticationExpired` is the server rejecting a credential that was read fine.
return error.kind == .missingCredential || error.kind == .permissionDenied

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 Distinguish HTTP 403 from cookie-access denial

When an automatic cookie import first encounters a locked Chromium Keychain but later obtains a session from another browser, an HTTP 403 from that session is also represented as ProviderFetchClassifiedError.permissionDenied. The lock witness therefore remains true and this branch serves the cached app snapshot, masking the provider's real rejection; preserve whether permissionDenied originated from browser credential access rather than accepting every error of that kind.

AGENTS.md reference: AGENTS.md:L54-L54

Useful? React with 👍 / 👎.

elijahfriedman and others added 8 commits October 16, 2026 13:45
Grok's ACP server exposes billing as the extension method `_x.ai/billing`;
`x.ai/billing` returns JSON-RPC -32601 on Grok CLI 1.0.60 and 1.0.62.
Request the underscore name first and retry the legacy name once when the
method is unavailable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`_x.ai/billing` returns `{config: {creditUsagePercent, currentPeriod, ...}}`.
Reuse the nested credits parser for it, keep the legacy top-level decoder,
and reject results with no usage percentage so the pipeline can fall back.
Teach the account-context fixture to answer the legacy retry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Plugins can set icon.svg (inline, at most 8 KB). Only plain vector shapes
are accepted; scripts, styles, links, url() references, raster images,
foreignObject and DOCTYPE/entities are rejected, and a rejected SVG falls
back to the monogram. The SVG renders as a template image in the switcher
and on the menu card.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rejecting a literal url( was not enough: fill="u\72l(...)" passes it and CSS
decodes the escape into a URL function. Attribute values now allow only
letters, digits, spaces and .,#%+-() (no CSS escapes, comments, declarations,
quotes, colons or slashes), fill/stroke must be a colour keyword, #hex or
numeric rgb()/rgba(), and xmlns must be the SVG namespace. Adds the reported
bypass plus red-team cases (case and full-width variants, character
references, image-set/paint/var, style, use/a/xlink/xml:base, foreign
namespaces, stylesheet PI, NUL) and accepted-paint cases.
OAuth decoded the whole `limits` array as one typed value, so a single entry
with an unexpected field type dropped every model-scoped weekly row. Parse
the array with the Web path's entry-by-entry parser instead and remove the
OAuth-only limit types.

Co-Authored-By: claude-sonnet-5-5 <noreply@anthropic.com>
The per-entry limits parse re-reads the body with JSONSerialization, which
rejects numbers JSONDecoder accepts (e.g. 1e400) and threw for the whole
response. Fall back to an empty limits list instead, as before.

Fold the cross-path limits tests into ClaudeWebUsageExtraWindowTests using
the per-test OAuth defaults fixture, assert the Web primary percent in the
sibling-shape case, and drop the separate suite.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
steipete and others added 2 commits October 18, 2026 18:54
Rasterize validated inline icons into fixed template bitmaps and reject unbounded canvas dimensions before native decoding. Keep validation in the icon constructor so every caller retains the monogram fallback.

Co-authored-by: Shivanath Devinarayanan <1937549+shivanathd@users.noreply.github.com>

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

ℹ️ 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 +582 to +583
// Discovery order follows working directories and process contexts; it is not part of the scope.
.sorted()

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 Make scan ordering match the order-independent scope

When the same Pi session and entry ID exist under two roots with different snapshots, rebuildDailyUsage keeps whichever copy appears first, and the file list is still ordered by discovery-derived rootIndex. Sorting only this fingerprint means reversing workingDirectories now produces the same scope key and initially reuses the old result, but a later forced, interval, or file-change refresh can choose the other copy and change totals under that identical scope. Sort roots/files by a stable key before deduplication as well so an order-independent cache identity always represents deterministic totals.

Useful? React with 👍 / 👎.

This branch has not been deployed

No deployments
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. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants