Skip to content

fix: keep numeric reminder targets stable across fetches - #92

Merged
steipete merged 1 commit into
mainfrom
fix/stable-reminder-indexes
Sep 15, 2026
Merged

steipete merged 1 commit into
mainfrom
fix/stable-reminder-indexes

Conversation

@steipete

Copy link
Copy Markdown
Collaborator

Two reminders with the same due date and title inherited EventKit's fetch order. A subsequent fetch in a different order could therefore make edit 1, complete 1, or delete 1 target a different reminder from the one displayed as index 1.

The shared sorter now breaks date/title ties with the stable reminder ID. Existing date and title ordering is preserved. Command documentation explains the ordering and recommends IDs when the reminder set itself may change.

Validation: failing regressions demonstrated changed numeric targets for both dated and undated ties, then passed with the fix. A compiled synthetic probe now resolves the same ID after reversing the fetch order. make check passed with 94.3% RemindCore coverage, docs built, and independent P0–P2 autoreview was scoped-clean. No live reminder records were changed.

@clawsweeper

clawsweeper Bot commented Sep 15, 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.

@clawsweeper clawsweeper Bot added P2 Normal priority bug or improvement with limited blast radius. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Sep 15, 2026
@clawsweeper

clawsweeper Bot commented Sep 15, 2026

Copy link
Copy Markdown

Codex review: needs maintainer review before merge. Reviewed September 15, 2026, 4:15 AM ET / 08:15 UTC.

ClawSweeper review

What this changes

The PR breaks reminder sorting ties with stable IDs, adds reordered-fetch regression tests, and documents numeric targeting limits.

Merge readiness

Ready for maintainer review

The fix remains necessary: current main and v0.3.7 lack deterministic ordering for tied reminders. The patch addresses that gap without a blocking correctness finding.

Priority: P2
Reviewed head: 664eada8a24a2d10fc0b492a83e356b5abd473ba

Review scores

Measure Result What it means
Overall readiness 🐚 platinum hermit (4/6) A focused shared-path fix with relevant regression coverage and no identified blocking defect.
Proof confidence 🌊 off-meta tidepool Not applicable: The collaborator-authored PR is exempt from the external-contributor proof gate; its reported synthetic sorter/resolver probe and regression results support the change but do not demonstrate live EventKit behavior.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Verification

Check Result Evidence
Real behavior Not applicable Not applicable: The collaborator-authored PR is exempt from the external-contributor proof gate; its reported synthetic sorter/resolver probe and regression results support the change but do not demonstrate live EventKit behavior.
Evidence reviewed 7 items Verified patch scope: The pinned base-to-head diff changes only the shared comparator, regression tests, command documentation, and an Unreleased changelog entry.
Current main still has the defect: GitHub confirmed main remains at the pinned base. Its comparator stops at title comparison when dates match, leaving distinct reminders with equal dates and titles unordered relative to one another.
Release baseline: The latest published release is v0.3.7, targeting f4326de; inspection of that tag's sorter confirms it also lacks the ID tie-breaker.
Findings None None.
Security None None.

How this fits together

remindctl reads Apple Reminders through EventKit and displays numbered reminders. Its shared sorter also determines which reminder a numeric edit, completion, or deletion targets.

flowchart TD
  A[EventKit reminders] --> B[Default view filter]
  B --> C[Shared reminder sorter]
  C --> D[Numbered listing]
  E[Numeric command target] --> F[Index resolver]
  C --> F
  F --> G[Edit complete or delete by ID]
Loading

Before merge

None.

Agent review details

Security

None.

Review metrics

Metric Value Why it matters
Production and test delta Production +8/-4 lines; tests +24/-0 lines The small comparator change is justified by deterministic targeting and covered by both dated and undated regression cases.

Technical review

Best possible solution:

Keep one deterministic sorter for display and numeric resolution, with stable IDs recommended whenever the reminder set changes between commands.

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

Yes, from source: reversing distinct reminders with equal dates and titles can change their numeric positions under main's comparator. The new regression exercises that mechanism; this review did not run tests.

Is this the best way to solve the issue?

Yes. Adding the ID as the final shared sort key preserves existing date/title precedence and fixes both display and resolution without introducing another targeting mechanism.

AGENTS.md: not found in the target repository.

Codex review notes: model internal, reasoning medium; reviewed against 673a4666794e.

Labels

Label changes:

  • add P2: This bounded correctness fix prevents numeric commands from selecting a different reminder when equal-key records arrive in a different order.
  • add rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🌊 off-meta tidepool and patch quality is 🐚 platinum hermit.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Not applicable: The collaborator-authored PR is exempt from the external-contributor proof gate; its reported synthetic sorter/resolver probe and regression results support the change but do not demonstrate live EventKit behavior.

Label justifications:

  • P2: This bounded correctness fix prevents numeric commands from selecting a different reminder when equal-key records arrive in a different order.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🌊 off-meta tidepool and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Not applicable: The collaborator-authored PR is exempt from the external-contributor proof gate; its reported synthetic sorter/resolver probe and regression results support the change but do not demonstrate live EventKit behavior.

Evidence

What I checked:

Likely related people:

  • unknown: The claimed source-line change could not be verified from bounded local history. (role: source history unknown; confidence: low)

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.

@steipete
steipete merged commit 79959f8 into main Sep 15, 2026
11 checks passed
@steipete
steipete deleted the fix/stable-reminder-indexes branch September 15, 2026 08:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P2 Normal priority bug or improvement with limited blast radius. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. 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.

1 participant