Repository navigation
feat: Microsoft 365 and Google connected at the same time, merged review - #63
Merged
Merged
Conversation
…NER REVIEW)
PR-3 of docs/plans/2026-09-27-google-provider-and-shared-registration.md.
Contract edit: docs/adr/ADR-009-reminder-adapters.md gains an additive amendment recording
the Google Tasks adapter and the marker placement both adapters actually use (free-text body:
To Do body.content, Google Tasks notes; never title or due). The reminder checker's ADR hash
literal is re-pinned; P0-REMINDER-CROSS-CONTRACT-001 passes; the pre-existing
P0-REMINDER-INVENTORY-001 failure is unchanged; contracts/*.json untouched.
- graph live/google/tasks.rs: create / complete / check_status against the Google Tasks API
over the per-provider Google session with the tasks scope. create verifies the signed-in
account matches the scanned account before any request, takes the first task list as the
default, posts one task (title, needsAction, a date-only `due`, notes carrying the chosen
reminder time and the opaque OpenLoops reference) and reports Created only on HTTP 200 with
a usable id; anything after dispatch without that is the same uncertain outcome the
Microsoft adapter uses. Every request is origin-confined, bounded, redirect-free, one
request per attempt. A 401 clears only the Google session slot.
- graph live/provider.rs: create_reminder / complete_reminder / reminder_status dispatch on
the AccountConfig variant; the Microsoft arms call reminders.rs unchanged.
- desktop: reminder drafts, dispatch, completion and the sync job route by the record's
provider through account_config(provider); reminder_sync_checks groups by provider so one
job serves both; the PR-2b "later release" guard is gone; outcome texts name Google Tasks
for Google records and are unchanged for Microsoft.
- ui: the review draft reads reminder-service and reminder-time-note; for Google the note
states that Google Tasks saves the date only and does not alert, and that the chosen time
is written into the task's notes.
Review fixes (Opus read-only review, Opus implementer): `due` is the user's LOCAL calendar
date (an evening pick west of UTC no longer lands on the next day); a 401 on the completion
PATCH clears the Google session and never re-sends; Microsoft copy restored byte-identical
and pinned by tests; Google screens name Google Tasks everywhere ("To Do" / "Google Tasks"
short names keep Microsoft strings unchanged); one shared local-time formatter with UTC
offset; a list response without `items` is an empty list; reminder paths build the Microsoft
config without mail-loading shared/group inputs (reminder_account_config); sync planning
extracted to reminder_sync_jobs() and tested for both providers; facade and adapter guards
reject cross-provider requests; POST non-200 and post-dispatch transport failures are
Uncertain; the PATCH test asserts method and exact body.
Verified: cargo fmt --check; clippy -D warnings (graph live-connection, desktop
native-ui,ui-screenshot); graph 198 passed; desktop 459 passed, 0 failed, 3 ignored;
Cargo.lock unchanged; public-repo gate on staged files.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YCesN8ZHnhqa6n3rWFThas
PR-4 of docs/plans/2026-09-27-google-provider-and-shared-registration.md; the last slice of the approved plan. - Settings.mail_providers is an enabled set again: "Include in scans" per provider on the Sources card, at least one provider always enabled; disabling a provider clears its session and status and removes its messages and cards from the review without touching the other provider's decisions. The "Mail provider" Segmented now only selects whose fields the card shows. - One scan job loads every enabled account in sequence (sign-ins run back to back under the single in-process guard); each provider's result is merged or reported on its own status line, so one provider's failure never discards the other's mail. LoadProgress totals span both providers. Failed sources are keyed (provider, label) and retried through their own AccountConfig. Incremental checks run every enabled provider. - Reminder sync runs one job over both providers' records (routing by record provider from PR-3); the PR-2b Microsoft-only guard is gone. - Title bar names every connected provider; the Sources heading shows a pill per connected provider when more than one is enabled; scope summary wording covers both. Review fixes (Opus read-only review, Opus implementer): the Review pane follows the first enabled provider (primary_mail_provider), not the Sources card's view selection, so a Microsoft-only user who looks at the Google segment keeps Microsoft To Do copy and reconcile routing; the handle-uniqueness test now fails without the next_handle fix; remove_provider resets scan_summary / scan_errors / scan_incomplete; retry_jobs skips a provider it cannot configure with a status line instead of failing the retry; stale "<service>: <error>" lines clear when that provider loads; the dead own-inbox-accessible property is gone; loaders document that LoadProgress::begin runs once per job. Declared visible changes for Microsoft-only users: the "Include in scans" checkbox is always shown, and a shared mailbox counts two sources (Inbox, Sent Items) in the progress total when the shared scope is missing (done still reaches total; tested). Follow-ups recorded in the plan: cross-provider anchors on surviving cards after a removal; "Reload saved settings" changing the enabled set without clearing. Verified: cargo fmt --check; clippy -D warnings (graph live-connection, desktop native-ui,ui-screenshot); graph 205 passed; desktop 479 passed, 0 failed, 3 ignored; Cargo.lock unchanged; public-repo gate on staged files. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YCesN8ZHnhqa6n3rWFThas
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
PR-4, the last slice of
docs/plans/2026-09-27-google-provider-and-shared-registration.md: a user can keep a Microsoft 365 account and a Gmail account connected at the same time and review both in one list. Stacked on #62 (Google Tasks); rebase after it merges.Behaviour
Verification
cargo fmt --all -- --check; clippy-D warningson both crates: cleancargo test -p openloops-graph --features live-connection: 205 passedcargo test -p openloops-desktop --features native-ui -- --test-threads=1: 479 passed, 0 failed, 3 ignoredTwo declared visible changes for Microsoft-only users: the Include in scans checkbox is always shown, and a shared mailbox counts two sources (Inbox, Sent Items) in the progress total when the shared scope is missing. All other Microsoft-only copy and behaviour are byte-identical to #62.
Cargo.lockunchanged; public-repo gate passed on the staged filesNot yet exercised live
No two-account scan has run against real accounts. Smoke test after merge: enable both, sign in to each, scan, confirm cards from both mailboxes with the right "Open message in Outlook/Gmail" labels, then disable one and confirm its cards disappear while the other's decisions persist.
🤖 Generated with Claude Code
https://claude.ai/code/session_01YCesN8ZHnhqa6n3rWFThas