Skip to content

fix(claude): migrate email-keyed iCloud snapshots to slot keys - #3111

Merged
steipete merged 22 commits into
steipete:mainfrom
sf-jin-ku:fix/claude-swap-cloudkit-snapshot-keys
Aug 21, 2026
Merged

fix(claude): migrate email-keyed iCloud snapshots to slot keys#3111
steipete merged 22 commits into
steipete:mainfrom
sf-jin-ku:fix/claude-swap-cloudkit-snapshot-keys

Conversation

@sf-jin-ku

@sf-jin-ku sf-jin-ku commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Follow-up to fix(claude): disambiguate claude-swap accounts that share an email #3082: claude-swap CloudKit snapshot keys moved from an email hash to claude-swap:<slot>. CloudKit cannot rename record IDs, so this Mac now saves the slot-keyed record and deletes its leftover email-keyed record on the same device.
  • Predecessor cleanup is Claude Swap only: provider .claude, loginMethod == claude-swap, and accountID prefixed claude-swap:. Live email-keyed snapshots (for example a still-present Claude identity that uses the mailbox) are left alone. Unknown CloudKit names are not deleted.
  • Duplicate swap slots that share a mailbox retire a single leftover email-keyed record.
  • Non-Claude snapshots that move from email to a durable account ID are not classified as obsolete predecessors.
  • Restored predecessor mappings are not consumed on relaunch until this device publishes its current live snapshot set, so a leftover that became live again (Claude Swap → regular Claude while the app was stopped) is not deleted from a stale in-flight save confirmation.

Test plan

  • swift test --filter SyncModelTests (includes non-Claude / Claude-subscription predecessor regressions, and restored-mapping reconcile)
  • make check / ./Scripts/lint.sh lint
  • Live iCloud before leftover inventory on this Mac (production 0.54.0; snapshots on, API keys/cookies off)
  • After-fix: identity-signed build of this branch saves the slot-keyed record and deletes the leftover
  • Second Mac: fleet UI shows one slot-keyed Claude Swap card instead of a leftover email-keyed duplicate

Proof limits (this checkout cannot go further)

This is as far as live CloudKit evidence can go here. Do not treat the leftover inventory as after-fix proof.

Captured

  • One Mac on this iCloud account (fleetDevices: 1)
  • Signed production CodexBar 0.54.0 with CloudKit entitlements
  • Sync enabled: snapshots on, fleet accounts on, secrets off
  • Leftover email-keyed Claude Swap record still present (loginMethod: claude-swap, no accountID, email-shaped identity, snap-claude-<64-hex>-<this-device> where <64-hex> is not sha256("claude-swap:N") for N in 0..31)
  • Plus a default-keyed snap-claude-default-<this-device> card

Blocked on this machine

  • No Developer ID identity (security find-identity -p codesigning -v → 0 identities). package_app.sh only embeds CloudKit entitlements + Scripts/profiles/CodexBar-DeveloperID.provisionprofile for Developer ID Application: Peter Steinberger (Y5PE65HELJ) + release + com.steipete.codexbar. Ad-hoc / CodexBar Development cannot talk to Production iCloud.com.steipete.codexbar.
  • After-fix (slot key saved and email-keyed record gone) needs that identity-signed PR binary. Notarization is not required for local proof.
  • Second-Mac fleet screenshot is impossible until a second CodexBar Mac is on this iCloud account and that signed PR build has pushed.

Parser tests and the Claude Swap-only predecessor guard are not a substitute for two-Mac after-fix.

ClawSweeper P1 / P3

  • Predecessor helper now requires Claude Swap identity shape; Codex/workspace-ID and Claude subscription snapshots with a distinct account ID + email no longer name a deletion candidate.
  • Unreleased CHANGELOG.md line for this migration removed (release-owned).

Made with Cursor

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

ℹ️ 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 Sources/CodexBar/Sync/CloudSyncEngine.swift Outdated
@clawsweeper clawsweeper Bot added merge-risk: 🚨 availability 🚨 Merging this PR could cause crashes, hangs, restart loops, stalls, or process outages. 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 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, 5:24 PM ET / 21:24 UTC.

ClawSweeper review

What this changes

This PR migrates Claude Swap CloudKit snapshots from email-derived record IDs to slot-derived IDs and removes a confirmed obsolete email-keyed predecessor.

Regression provenance

Possible regression — probable (reviewed change; known regression link). No predecessor PR is attributed.

Merge readiness

Blocked until real behavior proof is added - 7 items remain

Keep open: the latest head still has two concrete CloudKit migration defects, and it lacks the required after-fix production CloudKit proof. The prior merged Claude Swap identity work is related but does not supersede this migration.

Priority: P2
Reviewed head: 3d0ffb1003f053a72e1f481aafcdbd2778d06459

Review scores

Measure Result What it means
Overall readiness 🦪 silver shellfish (2/6) Focused migration work is present, but two correctness defects and missing after-fix CloudKit proof prevent merge readiness.
Proof confidence 🦪 silver shellfish (2/6) Needs real behavior proof before merge: The contributor shows a real pre-fix leftover but explicitly has not run this head with production CloudKit signing to show replacement save and guarded deletion. 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 🦐 gold shrimp (3/6) 2 actionable review findings remain.

Verification

Check Result Evidence
Real behavior Needs proof Needs real behavior proof before merge: The contributor shows a real pre-fix leftover but explicitly has not run this head with production CloudKit signing to show replacement save and guarded deletion. 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 Empty publication bypasses reconciliation: queueSnapshots([]) accepts an empty authoritative snapshot set, but pushPendingSnapshots returns before marking reconciliation complete. A restored predecessor mapping can therefore remain deferred indefinitely after its replacement was already confirmed.
Batch failure is classified as terminal without retry metadata: The retry classifier only retries default CloudKit errors when retryAfterSeconds is present; a batchRequestFailed record without that metadata is dropped or terminally suppressed instead of retried.
Existing regression coverage misses both engine-level paths: Tests cover deferred deletion after a boolean reconciliation gate and selected transient errors, but do not cover an empty queueSnapshots([]) publication or batchRequestFailed without a retry delay.
Findings 2 actionable findings [P2] Reconcile an empty live-snapshot publication
[P2] Retry batch-rejected CloudKit records
Security None None.

How this fits together

CodexBar converts provider account usage into local snapshots and optionally synchronizes them to CloudKit for fleet display. The migration path persists local sync state, waits for CloudKit save confirmation, then deletes an obsolete predecessor record.

flowchart LR
A[Claude Swap account state] --> B[Local snapshot publication]
B --> C[Migration reconciliation]
C --> D[Persisted sync state]
D --> E[CloudKit save confirmation]
E --> F[Predecessor deletion]
F --> G[Fleet account display]
Loading

Before merge

  • Add real behavior proof - Needs real behavior proof before merge: The contributor shows a real pre-fix leftover but explicitly has not run this head with production CloudKit signing to show replacement save and guarded deletion. 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.
  • Reconcile an empty live-snapshot publication (P2) - queueSnapshots([]) reaches this method with no pending delete, so this guard returns before the restored mapping is reconciled. A prior save confirmation remains deferred forever and the email-keyed duplicate persists until a nonempty publication occurs; treat the first empty publication as authoritative and add a regression.
  • Retry batch-rejected CloudKit records (P2) - batchRequestFailed normally has no retry delay, so the default branch treats it as terminal: saves are suppressed and deletes are forgotten even though another record caused the batch rejection. Classify that code as transient and cover the no-delay case.
  • Resolve merge risk (P1) - A relaunch followed by an empty local snapshot publication can leave the obsolete email-keyed CloudKit card indefinitely because the deferred predecessor mapping is never drained.
  • Resolve merge risk (P1) - A CloudKit batch-level rejection without retry metadata can permanently suppress a replacement save or forget its predecessor deletion.
  • Resolve merge risk (P1) - The migration deletes persisted CloudKit records, but no after-fix signed CloudKit run yet proves the guarded deletion path.
  • Complete next step (P2) - The two blocking source defects have narrow, testable repairs; contributor-supplied signed CloudKit proof remains required after repair.

Findings

  • [P2] Reconcile an empty live-snapshot publication — Sources/CodexBar/Sync/CloudSyncEngine.swift:1386-1387
  • [P2] Retry batch-rejected CloudKit records — Sources/CodexBar/Sync/CloudSyncEngine.swift:286-288
Agent review details

Security

None.

Review metrics

Metric Value Why it matters
Migration surface 5 files; production +516/-30, tests +503 The change substantially expands persisted CloudKit lifecycle handling, so upgrade-path regressions need focused coverage.

Merge-risk options

Maintainer options:

  1. Repair and prove the migration (recommended)
    Handle empty reconciliation and batch-level retry failures with focused tests, then provide a redacted signed CloudKit run that shows the intended replacement and deletion.
  2. Pause the branch
    Leave the migration unmerged if a production-signed CloudKit validation environment is not available after the code defects are repaired.

Technical review

Best possible solution:

Treat the first empty snapshot publication as authoritative reconciliation, retry batch-rejected records with a bounded transient delay, add focused regressions, then capture a redacted production-signed CloudKit migration trace before merge.

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

Yes for the two code paths: a restored mapping followed by queueSnapshots([]), and a batch-rejected CloudKit record without retry metadata, both lead to the stated outcomes from the current head.

Is this the best way to solve the issue?

No. The replacement-then-delete design is appropriate, but it must reconcile an empty live set and classify batch rejections as recoverable before it is safe to merge.

Full review comments:

  • [P2] Reconcile an empty live-snapshot publication — Sources/CodexBar/Sync/CloudSyncEngine.swift:1386-1387
    queueSnapshots([]) reaches this method with no pending delete, so this guard returns before the restored mapping is reconciled. A prior save confirmation remains deferred forever and the email-keyed duplicate persists until a nonempty publication occurs; treat the first empty publication as authoritative and add a regression.
    Confidence: 0.94
  • [P2] Retry batch-rejected CloudKit records — Sources/CodexBar/Sync/CloudSyncEngine.swift:286-288
    batchRequestFailed normally has no retry delay, so the default branch treats it as terminal: saves are suppressed and deletes are forgotten even though another record caused the batch rejection. Classify that code as transient and cover the no-delay case.
    Confidence: 0.87

Overall correctness: patch is incorrect
Overall confidence: 0.91

AGENTS.md: found and applied where relevant.

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

Labels

Label changes:

  • add P2: The branch has bounded but merge-blocking CloudKit migration correctness defects.
  • remove P1: Current review triage priority is P2, so this older priority label is no longer current.

Label justifications:

  • P2: The branch has bounded but merge-blocking CloudKit migration correctness defects.
  • merge-risk: 🚨 compatibility: The change migrates existing CloudKit record identities and can remove persisted predecessor records.
  • rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🦐 gold shrimp.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The contributor shows a real pre-fix leftover but explicitly has not run this head with production CloudKit signing to show replacement save and guarded deletion. 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 SyncModelTests.
  • [P1] swift test --filter CloudSyncSettingsTests.
  • [P1] make test.
  • [P1] make check.

What I checked:

  • Empty publication bypasses reconciliation: queueSnapshots([]) accepts an empty authoritative snapshot set, but pushPendingSnapshots returns before marking reconciliation complete. A restored predecessor mapping can therefore remain deferred indefinitely after its replacement was already confirmed. (Sources/CodexBar/Sync/CloudSyncEngine.swift:1386, 3d0ffb1003f0)
  • Batch failure is classified as terminal without retry metadata: The retry classifier only retries default CloudKit errors when retryAfterSeconds is present; a batchRequestFailed record without that metadata is dropped or terminally suppressed instead of retried. (Sources/CodexBar/Sync/CloudSyncEngine.swift:286, 3d0ffb1003f0)
  • Existing regression coverage misses both engine-level paths: Tests cover deferred deletion after a boolean reconciliation gate and selected transient errors, but do not cover an empty queueSnapshots([]) publication or batchRequestFailed without a retry delay. (Tests/CodexBarTests/SyncModelTests.swift:542, 3d0ffb1003f0)
  • Latest head provenance: The latest commit introduced the restored-mapping reconciliation guard, which is the area containing the empty-publication gap. (Sources/CodexBar/Sync/CloudSyncEngine.swift:1384, 3d0ffb1003f0)
  • Real behavior proof remains incomplete: The PR body and contributor comments explicitly provide only pre-fix inventory; a signed branch run has not shown the slot-keyed save and safe removal of the email-keyed record.
  • Current-main source comparison unavailable locally: The review checkout could inspect the PR head, but its promised base objects were unavailable and the configured remote could not resolve, so current-main source could not be independently loaded from this checkout.

Likely related people:

  • sf-jin-ku: Authored this migration and the related merged Claude Swap slot-identity work. (role: feature owner; confidence: high; commits: 3d0ffb1003f0, 63bf039cc076; files: Sources/CodexBar/Sync/CloudSyncEngine.swift, Sources/CodexBarCore/Sync/SyncModels.swift)
  • Peter Steinberger: Feature-history shortlog shows repeated CloudSyncEngine contributions in the checked-out history. (role: recent area contributor; confidence: medium; files: Sources/CodexBar/Sync/CloudSyncEngine.swift)

Rank-up moves

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

  • Repair the empty-publication and batch-retry paths with regression coverage.
  • Capture a redacted production-signed CloudKit run showing the slot record save and predecessor removal.
  • Update the PR body with the evidence; request @clawsweeper re-review if automatic review does not resume.

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 (10 earlier review cycles; latest 8 shown)
  • reviewed 2026-08-20T20:28:01.103Z sha ec188c2 :: needs real behavior proof before merge. :: [P1] Bind delete retries to their originating sync engine
  • reviewed 2026-08-20T21:31:49.181Z sha eac53a8 :: needs real behavior proof before merge. :: [P1] Reconcile pending predecessors against current snapshots
  • reviewed 2026-08-20T21:49:05.049Z sha 7f93015 :: needs real behavior proof before merge. :: [P1] Cancel persisted deletes when the predecessor becomes live | [P3] Remove the release-owned changelog entry
  • reviewed 2026-08-20T23:13:43.211Z sha 7d75b12 :: needs real behavior proof before merge. :: [P3] Remove the release-owned changelog entry
  • reviewed 2026-08-21T00:52:45.562Z sha 9d6567f :: needs real behavior proof before merge. :: [P1] Retain failed shared-slot predecessor dependencies | [P3] Remove the release-owned changelog entry
  • reviewed 2026-08-21T01:48:42.476Z sha ecb286e :: needs real behavior proof before merge. :: [P1] Restrict predecessor cleanup to Claude Swap snapshots
  • reviewed 2026-08-21T02:32:12.221Z sha ecb286e :: needs real behavior proof before merge. :: [P1] Restrict predecessor cleanup to Claude Swap snapshots | [P3] Remove the release-owned changelog line
  • reviewed 2026-08-21T20:23:33.801Z sha 0e29fc9 :: needs real behavior proof before merge. :: [P1] Defer restored predecessor deletion until snapshots reconcile

Terminal delete failures are reported once with delayed retries only for
recoverable errors, and email-keyed leftovers wait until the replacement
record is saved.

@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: 7080d1bdb8

ℹ️ 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 Sources/CodexBar/Sync/CloudSyncEngine.swift
Keep pending predecessor deletes in the persistence envelope before sleeping so a relaunch can finish the CloudKit migration if the retry task never ran.

Co-authored-by: Cursor <cursoragent@cursor.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: 5dc264d114

ℹ️ 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 Sources/CodexBar/Sync/CloudSyncEngine.swift Outdated
@clawsweeper clawsweeper Bot added the merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. label Aug 20, 2026
Mark slot-keyed migration snapshots complete after permission, auth, or invalid-argument save failures so the 120s snapshot push does not keep requeueing the same record.

Co-authored-by: Cursor <cursoragent@cursor.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: ec188c201b

ℹ️ 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 Sources/CodexBar/Sync/CloudSyncEngine.swift Outdated
@clawsweeper clawsweeper Bot added merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. P1 Urgent regression or broken agent/channel workflow affecting real users now. and removed P2 Normal priority bug or improvement with limited blast radius. merge-risk: 🚨 availability 🚨 Merging this PR could cause crashes, hangs, restart loops, stalls, or process outages. labels Aug 20, 2026
Skip leftover-record retries after an account switch so a sleeping task cannot delete a same-named snapshot in a newly signed-in iCloud account.

Co-authored-by: Cursor <cursoragent@cursor.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: eac53a8b5e

ℹ️ 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 Sources/CodexBar/Sync/CloudSyncEngine.swift Outdated
@clawsweeper clawsweeper Bot removed the merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. label Aug 20, 2026
A later live email-keyed snapshot must not stay queued for delete just because an earlier slot-keyed save still has a pending predecessor set.

Co-authored-by: Cursor <cursoragent@cursor.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: 7f93015749

ℹ️ 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 Sources/CodexBar/Sync/CloudSyncEngine.swift Outdated
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Aug 20, 2026
A delayed CloudKit retry must not delete an email-keyed snapshot that was published again after a transient predecessor delete. Drop that name from the persisted retry set and the engine queue.

Co-authored-by: Cursor <cursoragent@cursor.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: 290cfee9a2

ℹ️ 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 Sources/CodexBar/Sync/CloudSyncEngine.swift Outdated
A transient in-flight delete can land after the predecessor is live again. Skip persist-and-retry when the record is in the current live snapshot set so cancellation is not resurrected.

Co-authored-by: Cursor <cursoragent@cursor.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: 7e663aea7a

ℹ️ 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 Sources/CodexBar/Sync/CloudSyncEngine.swift Outdated
Comment thread Sources/CodexBar/Sync/CloudSyncEngine.swift Outdated

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

ℹ️ 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 Sources/CodexBar/Sync/CloudSyncEngine.swift Outdated
Skip retrying an unchanged terminal replacement without recording it in lastSnapshotHashes, so an unconfirmed slot cannot retire an email-keyed leftover.

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

ℹ️ 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 Sources/CodexBar/Sync/CloudSyncEngine.swift Outdated
Comment thread Sources/CodexBar/Sync/CloudSyncEngine.swift Outdated
…t saves

Confirmed CloudKit saves now keep the in-flight payload hash, and terminal failures skip retrying that hash even when the snapshot has no predecessor.

@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: 9d6567f902

ℹ️ 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 Sources/CodexBar/Sync/CloudSyncEngine.swift
Comment thread Sources/CodexBar/Sync/CloudSyncEngine.swift
…on stop

A newer payload that arrives during an unconfirmed save stays pending and is flushed after that save completes, and toggling iCloud off no longer leaves in-flight hashes that skip every later publication.

@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: 4ee82a8f73

ℹ️ 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 Sources/CodexBar/Sync/CloudSyncEngine.swift
Comment thread Sources/CodexBar/Sync/CloudSyncEngine.swift
…s on conflict

accountTemporarilyUnavailable is treated as a transient CloudKit error, and a server-winning conflict no longer leaves pendingSaveHashes blocking later snapshot publications.

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

ℹ️ 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 Sources/CodexBar/Sync/CloudSyncEngine.swift
Fetched CloudKit snapshots no longer overwrite an in-flight local payload, and pending local updates win when merging unpublished fleet cache entries.

@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: 78d553bd11

ℹ️ 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 Sources/CodexBar/Sync/CloudSyncEngine.swift Outdated
Pending snapshot payloads from before disable are discarded so re-enabling sync cannot upload or delete against a stale account set.
@sf-jin-ku

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Aug 21, 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: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Aug 21, 2026
Predecessor deletes must not run for other providers that move from
email to a durable account ID. Drop the unreleased changelog line.

Co-authored-by: Cursor <cursoragent@cursor.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: 0e29fc9b57

ℹ️ 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 Sources/CodexBar/Sync/CloudSyncEngine.swift Outdated
@sf-jin-ku

Copy link
Copy Markdown
Contributor Author

Turned on iCloud sync on this Mac to capture the CloudKit leftover ClawSweeper asked about. Secrets stay off.

Live private zone after fetch (signed 0.54.0, this device only): one Claude Swap snapshot is still email-keyed (loginMethod=claude-swap, no accountID, record hash is not sha256("claude-swap:N")). That is the predecessor this PR deletes after a slot-keyed save.

Fleet currently has one Mac, so there is no second-Mac card screenshot. After-fix still needs an identity-signed build of this branch (this machine has no Developer ID). Details are in the PR body.

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Aug 21, 2026
…concile

CKSyncEngine can confirm an in-flight slot save on relaunch before local snapshots publish. Wait until that set is applied so a leftover email-keyed record that became live again is not deleted.

Co-authored-by: Cursor <cursoragent@cursor.com>
@sf-jin-ku

Copy link
Copy Markdown
Contributor Author

Proof submission has hit its limit on this checkout.

This machine can show the before leftover (one Mac, production 0.54.0, snapshots on, secrets off): an email-keyed Claude Swap CloudKit record that is not sha256("claude-swap:N"). That inventory is already in the PR body.

It cannot show after-fix:

  • no Developer ID identity here, so this branch cannot be CloudKit-signed against Production iCloud.com.steipete.codexbar
  • this iCloud account has only one CodexBar Mac, so there is no second-Mac fleet card

Parser tests are not a substitute for that after-fix / two-Mac capture. Next live proof needs Developer ID Application: Peter Steinberger (Y5PE65HELJ) (or a machine that already has it), then:

CODEXBAR_SIGNING=identity \
APP_IDENTITY='Developer ID Application: Peter Steinberger (Y5PE65HELJ)' \
./Scripts/package_app.sh release

Pushed 3d0ffb100 for the restored-mapping P2 and the gatekeeper comment on the Claude-only predecessor helper. Not pinging ClawSweeper until required CI is green on that SHA.

@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: 3d0ffb1003

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

liveSnapshots: self.pendingSnapshots,
hashes: self.lastSnapshotHashes,
envelope: self.persistenceEnvelope)
if !self.pendingSnapshots.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.

P2 Badge Reconcile authoritative empty snapshot publications

When a relaunch restores pendingPredecessorDeletes and the replacement-save confirmation arrives before local usage, an authoritative queueSnapshots([]) never sets hasReconciledLiveSnapshots; if there is no persisted delete yet, the guard above also returns before reaching this branch. The confirmed slot-keyed record and its email-keyed predecessor can therefore remain duplicated indefinitely when this Mac currently has no snapshots. Fresh evidence beyond the prior startup comment is that the final fix marks reconciliation only inside the nonempty branch; retain the deferred confirmation and drain it after the first publication even when that publication is empty.

Useful? React with 👍 / 👎.

Comment on lines +286 to +287
default:
guard let retryAfter = error.retryAfterSeconds else { return 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 Retry records rejected with their CloudKit batch

When CloudKit reports .batchRequestFailed for a record because another record in the same batch failed, that error normally has no retryAfterSeconds, so this fallback classifies it as terminal. Save handling then suppresses the snapshot payload for the rest of the process, while delete handling forgets the persisted delete intent; after the peer record's conflict or transient failure is resolved, the batch-rejected replacement or predecessor deletion is never retried. Treat batchRequestFailed as recoverable and requeue it after the causal batch failure is handled.

Useful? React with 👍 / 👎.

@clawsweeper clawsweeper Bot added P2 Normal priority bug or improvement with limited blast radius. and removed P1 Urgent regression or broken agent/channel workflow affecting real users now. labels Aug 21, 2026
@steipete
steipete merged commit 416ef87 into steipete:main Aug 21, 2026
9 checks passed
steipete added a commit that referenced this pull request Aug 21, 2026
steipete added a commit that referenced this pull request Aug 21, 2026
* Fix menu bar layout editor drag-and-drop

Layout editor chips were Buttons with .draggable attached. On macOS the
button's gesture recognizer claims the mouse-down, so no drag session ever
starts: reordering and the trash drop zone were unreachable by mouse and the
Delete key was the only way to remove a token. Moving .draggable onto the
button label does not help, because the button still owns the gesture.

Replace the chips with a plain draggable view that keeps click selection,
keyboard activation, and accessibility, and make the trash zone a click
target for the selected token as well.

* Fix Codex CLI approval policy (#3118)

* docs: credit #3118 changelog entry

* fix(commandcode): Add support for individual-pro-v1 plan ($80/mo credits) (#3116)

* fix(commandcode): Add support for individual-pro-v1 plan ($80/mo credits)

Command Code's updated Pro tier ($20/mo → $80 credits) ships as
individual-pro-v1 (legacy individual-pro remains $30). The new planId
hit the hard unknownPlan throw in CommandCodeUsageFetcher, surfaced as
'Unknown Command Code plan: individual-pro-v1'.

Add the versioned plan to CommandCodePlanCatalog (verified against
live frontend bundle assets/constants-B6rERLKd.js and pricing docs).
Pro pricing now: $20 → $80 (docs/resources/pricing-limits), legacy
Pro kept for backwards compat.

* test(commandcode): Cover individual-pro-v1 plan resolution

Regression coverage for the $80 Pro v1 tier: an active subscription
with planId individual-pro-v1 must resolve through
CommandCodePlanCatalog instead of hitting the unknownPlan throw, and
the catalog check now pins pro-v1 at 80 credits.

* fix(alibaba): tolerate the Personal usage gateway's empty-Success responses (#3128)

Mainland Personal/Solo Token Plan (cn-personal) intermittently shows "Could not
parse Alibaba Token Plan usage: Missing Personal usage windows" even though auth
succeeds. The `/tokenplan/personal/api/v2/usage` gateway sometimes answers with a
200 "Success" envelope (`code=SUCCESS`, `successResponse=true`, empty errorCode)
whose payload omits the `per5HourPercentage`/`per1WeekPercentage` windows. The
parser treated that absence as a hard parse failure.

- Throw a distinct `.usageWindowsUnavailable` for a Success-with-no-windows body
  instead of `parseFailed("Missing Personal usage windows")`.
- Retry the usage call a few times (the payload is usually populated on an
  immediate re-request) before surfacing it.
- When it stays empty, surface the softer "temporarily unavailable; it will
  refresh automatically" message. CodexBar keeps the last-good card either way
  (a returned empty snapshot would blank it, so this stays a thrown error).

Verified on a real cn-personal account: the fetch retries and, while the endpoint
was returning empty, surfaced the transient message with the last-good card
preserved. Adds AlibabaTokenPlanPersonalUsageRetryTests (recovers when a full
response follows an empty one; throws .usageWindowsUnavailable when every attempt
is empty).

Refs #2500.

Co-authored-by: LeoLin <leolin990405@gmail.com>

* docs: credit #3116 and #3128 changelog entries

* fix(claude): migrate email-keyed iCloud snapshots to slot keys (#3111)

* fix(claude): migrate email-keyed iCloud snapshots to slot keys

* fix(sync): confirm CloudKit snapshot saves before deleting predecessors

Terminal delete failures are reported once with delayed retries only for
recoverable errors, and email-keyed leftovers wait until the replacement
record is saved.

* fix(sync): persist leftover snapshot deletes across delayed retries

Keep pending predecessor deletes in the persistence envelope before sleeping so a relaunch can finish the CloudKit migration if the retry task never ran.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): stop retrying terminal CloudKit replacement saves

Mark slot-keyed migration snapshots complete after permission, auth, or invalid-argument save failures so the 120s snapshot push does not keep requeueing the same record.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): bind delayed CloudKit deletes to the originating engine

Skip leftover-record retries after an account switch so a sleeping task cannot delete a same-named snapshot in a newly signed-in iCloud account.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): drop stale CloudKit predecessors that are live again

A later live email-keyed snapshot must not stay queued for delete just because an earlier slot-keyed save still has a pending predecessor set.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): cancel leftover snapshot deletes when they become live

A delayed CloudKit retry must not delete an email-keyed snapshot that was published again after a transient predecessor delete. Drop that name from the persisted retry set and the engine queue.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): do not retry CloudKit deletes for live snapshots

A transient in-flight delete can land after the predecessor is live again. Skip persist-and-retry when the record is in the current live snapshot set so cancellation is not resurrected.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): isolate CloudKit migration state from the next iCloud account

Clear predecessor maps and snapshot hashes when persistence is wiped, and requeue leftover deletes only after the current live snapshot set has been reconciled.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): persist predecessor deletes and requeue empty publications

Keep the replacement-to-predecessor map in the persistence envelope across relaunch, and still requeue leftover snapshot deletes when the next publication is empty.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): wait for every shared-mailbox replacement before deleting

Two Claude Swap slots can share one email-keyed predecessor. Delete that leftover only after no unsaved replacement still points at it.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): retry lost CloudKit responses and keep shared leftovers

Treat serverResponseLost as a recoverable retry, and confirm saved replacements before abandoning failed siblings so a shared email-keyed record is not deleted early.

* fix(sync): queue predecessor deletes for unchanged slot payloads

When a slot snapshot is already published, newly obsolete email-keyed leftovers still need to be recorded and deleted instead of being skipped by the payload-hash shortcut.

* fix(sync): confirm slot saves and ignore remote cache as live

Predecessor deletes now wait for a confirmed replacement hash, and delete retries treat only local pending/confirmed snapshots as live so a fetched leftover cannot cancel its own removal.

* fix(sync): do not treat terminal save failures as confirmed

Skip retrying an unchanged terminal replacement without recording it in lastSnapshotHashes, so an unconfirmed slot cannot retire an email-keyed leftover.

* fix(sync): record confirmed save hashes and skip all terminal snapshot saves

Confirmed CloudKit saves now keep the in-flight payload hash, and terminal failures skip retrying that hash even when the snapshot has no predecessor.

* fix(sync): requeue in-flight snapshot updates and clear save markers on stop

A newer payload that arrives during an unconfirmed save stays pending and is flushed after that save completes, and toggling iCloud off no longer leaves in-flight hashes that skip every later publication.

* fix(sync): retry unavailable iCloud accounts and drop in-flight hashes on conflict

accountTemporarilyUnavailable is treated as a transient CloudKit error, and a server-winning conflict no longer leaves pendingSaveHashes blocking later snapshot publications.

* fix(sync): do not requeue fetched snapshots over in-flight local saves

Fetched CloudKit snapshots no longer overwrite an in-flight local payload, and pending local updates win when merging unpublished fleet cache entries.

* fix(sync): drop retained snapshots when iCloud sync stops

Pending snapshot payloads from before disable are discarded so re-enabling sync cannot upload or delete against a stale account set.

* fix(sync): limit email-keyed snapshot cleanup to Claude Swap

Predecessor deletes must not run for other providers that move from
email to a durable account ID. Drop the unreleased changelog line.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): defer restored predecessor deletes until live snapshots reconcile

CKSyncEngine can confirm an in-flight slot save on relaunch before local snapshots publish. Wait until that set is applied so a leftover email-keyed record that became live again is not deleted.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(codex): isolate profile-scoped token cost snapshots (#3132)

* docs: credit #3111 changelog entry

* perf(spend): parallelize loads and memoize model build (#3105)

* perf(spend): parallelize loads and memoize model build

- Parallelize independent provider refreshes in makeRequest via
  TaskGroup (was sequential 400ms-6s additive).
- Parallelize Codex multi-account loads in SpendDashboardSource.load
  via ThrowingTaskGroup (was sequential 2s×N).
- Memoize SpendDashboardModel: cache CurrencyExchange conversion per
  currency pair, hoist bounds once per build, and reuse static
  utcCalendar for Mistral/OpenRouter bucket (was new calendar per
  entry, 2920× per build).

Evidence:
- SpendDashboardController.swift:237 parallel baselines
- SpendDashboardController.swift:433 parallel codex
- SpendDashboardModel.swift:300 conversionCache + bounds hoist
- SpendDashboardModel.swift:1069 utcCalendar reuse

Before: 全部 3-10s empty → 2-3s; build 40ms → 8ms.
After: TaskGroup wall-time = slowest provider, model build cached.

* fix(spend): restore Codex account order after parallel load

Task group completion order was appended directly to inputs, but providerRows uses input offset as tie-breaker for equal/unknown totals, so out-of-order completions reordered Codex · #1/#2 rows. Carry request index and sort results before appending, with compact formatting to keep file_length under warning.

Fixes ClawSweeper P2 for #3105.

* test(spend): add out-of-order Codex concurrent order regression

Verifies that parallel Codex loads restore configured request order even when second account's snapshot completes first. Equal totals make completion order visible via providerRows tie-breaker, so without sorting the rows would reorder.

Covers ClawSweeper P2 for #3105 and serves as needs-proof evidence.

* test: update gatekeeper anchors after rebase to 54.0

* fix(spend): repair parallel load CI - file_length and escaping captures

* fix(spend): debounce frequent refresh and throttle date window rebuilds

- 250ms debounce for withObservationTracking and token publication bursts
- 30s throttle for refreshDateWindow same-day revisits
- display-only fast path to avoid Codex scan for filter/currency changes
- update gatekeeper anchors for line shifts

* Improve Antigravity retrieval: retired Flash alias and offline fallback

- Map retired Flash wire ids (3.6/3.5/3-flash-agent) to 3.7-flash via canonicalModelID (opencodex RETIRED_FLASH_TIERS lesson), humanize via canonical, dedup collapsed windows by lowest remaining
- Add AntigravityOfflineStore counting ~/.gemini/antigravity-cli/conversations/*.db (GEMINI_CLI_HOME override) with tokscale cache fallback, and AntigravityOfflineFetchStrategy as terminal offline probe in auto/cli pipelines
- Cover with AntigravityModelLabelTests retired alias cases and AntigravityOfflineStoreTests (db/cache/count)

* fix(gate): add missing provider-specific markers and sync anchors

- add // Provider-specific by design for OpenCodex enrichment and token publication sync
- sync gate anchors after debounce/throttle line shifts

* fix(lint): wrap long provider-specific comment

* Fix provider architecture gatekeeper for Antigravity offline and retired alias

- Move CLI home marker to before gemini literal and update SpendDashboard marker to avoid flagging its own reason
- Add marker before family() and update suppressed anchors to 748/751/754/757
- Allowlist offline gemini, family cluster, and UsageStore codex constructs

* test: include offline strategy in antigravity pipeline expectations

* fix(gate): sync remaining anchors and add missing markers

* chore: trigger CI

* fix(spend): make debounce instant for testing

* fix(gate): update anchors after merge with main

* fix(lint): break long delay line

* fix(gate): drop stale codex anchor absorbed by sourceRevisions cluster

* docs: credit #3105 changelog entry

* style: swiftformat pass on layout editor chips

---------

Co-authored-by: kiranmagic7 <kiranmagic@proton.me>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Sebastian Marines <18373185+sebastianmarines@users.noreply.github.com>
Co-authored-by: Zhongyue Lin <101193087+LeoLin990405@users.noreply.github.com>
Co-authored-by: LeoLin <leolin990405@gmail.com>
Co-authored-by: sf-jin-ku <jin.ku@sendbird.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Yuxin Qiao <104957188+Yuxin-Qiao@users.noreply.github.com>
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: 🦪 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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants