Skip to content

feat: accept exact coordinates for location reminders - #114

Open
adambiggs wants to merge 1 commit into
openclaw:mainfrom
adambiggs:feat/add-coordinates
Open

adambiggs wants to merge 1 commit into
openclaw:mainfrom
adambiggs:feat/add-coordinates

Conversation

@adambiggs

@adambiggs adambiggs commented Oct 28, 2026 •

Copy link
Copy Markdown

add accepts --latitude and --longitude together to create a geofence at an exact point without geocoding. --location becomes an optional display label when coordinates are supplied; address-only triggers and the existing radius and departure options retain their behavior. Coordinates must be paired, finite and within their latitude/longitude bounds.

Closes #112.

Native CLI evidence

Recorded 2026-10-28 UTC on macOS, head c432e9e0688e7ff119b107d369511dab8ea6e4a5. Locally built release-configuration binary, ad-hoc signed. SHA-256: 282182c8140b20dd69be222f871a526b82e490c47c8aa055c689ddd2860f759e; signature verification passed. Each command below starts a fresh candidate process. Coordinates and reminder titles are synthetic. Output shows selected JSON fields; the actual list ID and list name are replaced consistently with <redacted-list-id> and <redacted-list>. The runner verified both against the designated list before retaining these responses.

Create, fresh-process readback, exact-ID deletion and absence
$ remindctl add 'remindctl coordinate test (delete me) 396f6758-7c4d-4982-b42a-100ecff218fb arrival' --list-id '<redacted-list-id>' --latitude 12.5 --longitude=-34.25 --radius 200 --location 'Synthetic arrival label' --json --no-input
exit: 0
{"id": "1FA2DF2A-70BA-49EF-80C4-7F3BB5A652F2", "listID": "<redacted-list-id>", "listName": "<redacted-list>", "locationTrigger": {"address": "Synthetic arrival label", "latitude": 12.5, "longitude": -34.25, "proximity": "arriving", "radius": 200}, "title": "remindctl coordinate test (delete me) 396f6758-7c4d-4982-b42a-100ecff218fb arrival"}

$ remindctl add 'remindctl coordinate test (delete me) 396f6758-7c4d-4982-b42a-100ecff218fb departure' --list-id '<redacted-list-id>' --latitude=-12.5 --longitude 34.25 --leaving --json --no-input
exit: 0
{"id": "F5A829AE-5538-4468-8091-EB23D9242026", "listID": "<redacted-list-id>", "listName": "<redacted-list>", "locationTrigger": {"address": "", "latitude": -12.5, "longitude": 34.25, "proximity": "leaving", "radius": 100}, "title": "remindctl coordinate test (delete me) 396f6758-7c4d-4982-b42a-100ecff218fb departure"}

$ remindctl info --json --no-input -- 1FA2DF2A-70BA-49EF-80C4-7F3BB5A652F2
exit: 0
{"id": "1FA2DF2A-70BA-49EF-80C4-7F3BB5A652F2", "listID": "<redacted-list-id>", "listName": "<redacted-list>", "locationTrigger": {"address": "Synthetic arrival label", "latitude": 12.5, "longitude": -34.25, "proximity": "arriving", "radius": 200}, "title": "remindctl coordinate test (delete me) 396f6758-7c4d-4982-b42a-100ecff218fb arrival"}

$ remindctl info --json --no-input -- F5A829AE-5538-4468-8091-EB23D9242026
exit: 0
{"id": "F5A829AE-5538-4468-8091-EB23D9242026", "listID": "<redacted-list-id>", "listName": "<redacted-list>", "locationTrigger": {"address": "", "latitude": -12.5, "longitude": 34.25, "proximity": "leaving", "radius": 100}, "title": "remindctl coordinate test (delete me) 396f6758-7c4d-4982-b42a-100ecff218fb departure"}

$ remindctl info --json --no-input -- 1FA2DF2A-70BA-49EF-80C4-7F3BB5A652F2
exit: 0
{"id": "1FA2DF2A-70BA-49EF-80C4-7F3BB5A652F2", "listID": "<redacted-list-id>", "listName": "<redacted-list>", "locationTrigger": {"address": "Synthetic arrival label", "latitude": 12.5, "longitude": -34.25, "proximity": "arriving", "radius": 200}, "title": "remindctl coordinate test (delete me) 396f6758-7c4d-4982-b42a-100ecff218fb arrival"}

$ remindctl delete --force --json --no-input -- 1FA2DF2A-70BA-49EF-80C4-7F3BB5A652F2
exit: 0
{"deleted": 1}

$ remindctl info --json --no-input -- 1FA2DF2A-70BA-49EF-80C4-7F3BB5A652F2
exit: 1
stderr: Reminder not found: "1FA2DF2A-70BA-49EF-80C4-7F3BB5A652F2".

$ remindctl info --json --no-input -- F5A829AE-5538-4468-8091-EB23D9242026
exit: 0
{"id": "F5A829AE-5538-4468-8091-EB23D9242026", "listID": "<redacted-list-id>", "listName": "<redacted-list>", "locationTrigger": {"address": "", "latitude": -12.5, "longitude": 34.25, "proximity": "leaving", "radius": 100}, "title": "remindctl coordinate test (delete me) 396f6758-7c4d-4982-b42a-100ecff218fb departure"}

$ remindctl delete --force --json --no-input -- F5A829AE-5538-4468-8091-EB23D9242026
exit: 0
{"deleted": 1}

$ remindctl info --json --no-input -- F5A829AE-5538-4468-8091-EB23D9242026
exit: 1
stderr: Reminder not found: "F5A829AE-5538-4468-8091-EB23D9242026".

Both exact returned IDs were read back with their saved geometry, deleted individually, then confirmed absent in fresh processes. Known IDs: 2; confirmed absent: 2; unverified IDs: 0; no pending write.

Regression and offline evidence

The full offline gate was rerun 2026-10-28 UTC on the submitted head. The complete upstream offline gate ran without filtering suites; the upstream 90% coverage threshold and exclusions are unchanged.

format: exit 0, 0.497s
swiftlint: exit 0, 0.178s
shellcheck: exit 0, 0.425s
actionlint: exit 0, 0.187s
coverage: exit 0, 28.939s
diff: exit 0, 0.008s
total: 30.234s
==> Coverage (lines): 95.2% (960/1008)
Behavior removal fails; the submitted head passes

Earlier behavior-removal checks applied both changes together: restore the base AddCommand behavior with unused optional latitude/longitude parameters retained so the tests compile, and force the alarm factory through the geocoder branch. Both filtered suites ran against that modified tree. Their source commit was not recorded. The excerpts show the coordinate failures alongside passing compatibility assertions. Fresh passing output below was captured on the submitted head.

Earlier red-cli.log excerpt (exit 1):
✘ Test "The add parser accepts coordinate options" recorded an issue with 1 argument labeled → false at AddCoordinateTests.swift:7:4: Caught error: Unknown option --latitude
✔ Test "Address-only and absent locations preserve their behavior" passed after 0.004 seconds.
✘ Suite AddCoordinateTests failed after 0.007 seconds with 30 issues.
✘ Test run with 7 tests in 1 suite failed after 0.008 seconds with 30 issues.
Earlier red-geocoder.log excerpt (exit 1):
✘ Test "Coordinate alarms bypass geocoding and preserve their label and geometry" recorded an issue with 1 argument leaving → false at LocationAlarmTests.swift:9:4: Caught error: .called
✔ Test "Address-only alarms still use the geocoder" passed after 0.001 seconds.
✘ Suite LocationAlarmTests failed after 0.001 seconds with 2 issues.
✘ Test run with 2 tests in 1 suite failed after 0.001 seconds with 2 issues.

Fresh filtered AddCoordinateTests and LocationAlarmTests output (exit 0):
✔ Suite AddCoordinateTests passed after 0.002 seconds.
✔ Test run with 7 tests in 1 suite passed after 0.002 seconds.
✔ Suite LocationAlarmTests passed after 0.001 seconds.
✔ Test run with 2 tests in 1 suite passed after 0.001 seconds.

Maintainer direction

The maintainer decision remains open: should add expose paired --latitude and --longitude, with --location as an optional display label? This PR proposes that interface as the coordinate-input option described in #112. The evidence above establishes behavior; it does not establish maintainer approval.

Allow add to use a verified point without address geocoding. Validate paired finite coordinates and bounds before opening a store, and retain location text as a display label. Exercise detached alarm construction with a failing geocoder to prove the bypass.
@clawsweeper

clawsweeper Bot commented Oct 28, 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 clawsweeper:intake:feature Preliminary submission classification; full source review pending. P2 Normal priority bug or improvement with limited blast radius. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. and removed clawsweeper:intake:feature Preliminary submission classification; full source review pending. labels Oct 28, 2026
@clawsweeper

clawsweeper Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

Codex review: blocked before merge.

What this changes

This PR adds paired latitude and longitude options for exact geofences, with an optional location label.

Example: Create a reminder at latitude 12.5, longitude -34.25 with a 200-meter radius.

  • Before: The CLI accepts only an address and relies on geocoding.
  • After: Using --latitude 12.5 --longitude=-34.25 --radius 200 saves the exact point without geocoding.

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) Native CLI proof is sufficient and no actionable patch defect was found; overall readiness remains capped by the unresolved interface decision.
Proof confidence 🦞 diamond lobster (5/6) Sufficient (terminal): The reviewed-head macOS terminal output exercises AddCommand through real EventKit persistence for labeled arrival and unlabeled departure geofences, verifies exact saved geometry and list metadata in fresh CLI processes, and confirms exact-ID cleanup; it satisfies the earlier proof request.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Product

Kind: Feature · Worth it: Needs a maintainer decision · Fix scope: Complete
User problem: Address geocoding can save a geofence far from the intended landmark, and CLI users cannot provide a verified exact point.
Reason: The capability has concrete value and implements one of the linked issue's stated alternatives, but introduces public flags and conditional location-label semantics without recorded owner approval.

Merge readiness

⛔ Blocked before merge - 1 item remains

Keep this PR open: it provides a distinct, working coordinate-input capability absent from main, with no actionable code defect found; the public interface still needs an owner decision.

Priority: P2
Reviewed head: c432e9e0688e7ff119b107d369511dab8ea6e4a5
Owner decision: Required. See Decision needed.

Decision needed

  • Question: Should add expose paired --latitude and --longitude options, with --location serving as an optional display label when coordinates are supplied?
  • Recommendation: Accept explicit coordinate input: Approve the proposed paired options as a bounded way to bypass inaccurate address geocoding.
  • Why: The implementation and native CLI evidence support the proposed behavior, but the existing owner has not approved this new public interface.

Before merge

  • Resolve maintainer decision - Resolve the maintainer decision shown above before merge.

Findings

None.

Tests

  • Missing end-to-end proof: The supplied behavior-removal failures lack a recorded source revision, so they do not establish a pinned base-fail/head-pass comparison.
Agent review details

How this fits together

The add command validates location arguments, constructs the existing LocationTrigger model, and passes it to RemindersStore, which saves an EventKit geofence and returns its persisted metadata.

flowchart TD
  A[CLI location arguments] --> B[Add command validation]
  B --> C[LocationTrigger]
  C --> D[EventKit alarm construction]
  D --> E[Coordinate point or address geocoder]
  E --> F[EventKit reminder storage]
  F --> G[JSON readback]
Loading

Technical review

Best possible solution:

Approve or decline the paired coordinate interface, retaining the existing alarm owner, address behavior, timeout contract, and persisted format.

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

Main source establishes that CLI callers cannot supply coordinates despite existing model support; the contributor's native output demonstrates the added route, while the original landmark geocoder response was not independently reproduced.

Is this the best way to solve the issue?

This is a focused implementation of an explicit remedy offered in the linked report, using existing owners without changing automatic geocoder selection; choosing that remedy remains a product decision.

AGENTS.md: not found in the target repository.

Codex review notes: model internal, reasoning medium; reviewed against 136b79b86355.

Provenance checked

  • Location argument validation keeps the original intent (85a5893: The original location feature exposed address geocoding, arrival/departure and radius; later refactoring simplified equivalent branches and radius validation rejected nonfinite values.)
  • Geocoder extraction and alarm ownership keeps the original intent (fix: bound EventKit operations with shared timeout #68: Bound geocoding to 30 seconds and cancel the underlying operation on timeout or caller cancellation; the extraction preserves this implementation and its existing coordinate bypass.)

Testing

Proof path: shipped entry point.

Security

None.

Evidence

What I checked:

Labels

Label changes:

  • add proof: sufficient: Contributor real behavior proof is sufficient.
  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • add status: ⏳ waiting on maintainer: Only explicit maintainer approvals or decisions remain; merge is still blocked.
  • remove rating: 🧂 unranked krab: Current PR rating is rating: 🦐 gold shrimp, so this older rating label is no longer current.
  • remove status: 📣 needs proof: Current PR status label is status: ⏳ waiting on maintainer.

Label justifications:

  • P2: Exact coordinate input is a useful, limited-scope improvement for location reminder accuracy.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: ⏳ waiting on maintainer: Only explicit maintainer approvals or decisions remain; merge is still blocked.
  • proof: sufficient: Contributor real behavior proof is sufficient.

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.

History

Review history (1 earlier review cycle)
  • reviewed 2026-10-28T03:40:08.421Z sha c432e9e :: needs real behavior proof before merge. :: none

Reviewed October 28, 2026, 12:19 AM ET / 04:19 UTC (Revision 2).

@adambiggs

Copy link
Copy Markdown
Author

Added inspectable synthetic create/readback/delete output and regression evidence to the PR body for unchanged head c432e9e0688e7ff119b107d369511dab8ea6e4a5. Both synthetic IDs are confirmed absent. The maintainer decision on exposing the coordinate flags remains open.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

🦞👀
Exact review queued.

Re-review progress:

@clawsweeper clawsweeper Bot added clawsweeper:intake:feature Preliminary submission classification; full source review pending. proof: sufficient Contributor real behavior proof is sufficient. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on maintainer Only explicit maintainer approvals or decisions remain; merge is still blocked. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. clawsweeper:intake:feature Preliminary submission classification; full source review pending. labels Oct 28, 2026

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: sufficient Contributor real behavior proof is sufficient. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on maintainer Only explicit maintainer approvals or decisions remain; merge is still blocked.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Landmark geofence address can resolve to city-level coordinates

1 participant