Skip to content

ERMAIN-387: create-appointment confirm path (outlook.create_appointment + erato-appointment fence)#804

Merged
bdart merged 4 commits into
mainfrom
feature/ermain-387-si-5-create-appointment-confirm-path
Jul 6, 2026
Merged

ERMAIN-387: create-appointment confirm path (outlook.create_appointment + erato-appointment fence)#804
bdart merged 4 commits into
mainfrom
feature/ermain-387-si-5-create-appointment-confirm-path

Conversation

@bdart

@bdart bdart commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Implements ERMAIN-387 on top of the merged #801 seam: the model's picked slot becomes a user-confirmed, prefilled displayNewAppointmentForm (Saved/Sent manually — no Graph/EWS write anywhere).

Flow: outlook_schedule step 4 now emits one erato-appointment fenced JSON block + one propose_client_action("outlook.create_appointment") + a prose restate. The add-in renders the fence as an appointment summary card; the (always-ask enforced) confirm card shows time + attendees and opens the prefilled form.

Pieces:

  • outlook.create_appointment in IMPLEMENTED_CLIENT_ACTIONS, partitioned by KIND (email vs appointment) so the email renderer can never surface an appointment action as a reply button (and vice versa).
  • New erato-appointment fence dispatch in the shared library via registry key EratoAppointmentCodeBlock (default: plain code block; web unaffected).
  • OutlookArtifact.bodyFormat is now optional and gates everything email-shaped (drifted-tag rescue, whole-body card) — scheduling prose can never card as an insertable email.
  • body_format gate decoupled: artifact stamping extracted to pure buildOutlookArtifact with two doors (body_format arg OR offerable client actions).
  • Confirm-card state machine + auto-prompt one-shot extracted to useClientActionConfirmFlow, shared by the email renderer (behavior unchanged, suite green) and the new OutlookEratoAppointmentRenderer.
  • Neutral-context sends record a NO_ITEM_SEND_IDENTITY sentinel so the item-independent appointment action can still auto-prompt from the pinned no-item pane; item-bound reply executors treat it as a mismatch (fail closed).
  • Mobile gate: no action on Outlook iOS/Android (displayNewAppointmentForm unsupported); recurrence never prefilled.
  • Facet TOML: client_actions + presentation = "auto_prompt" + client_actions_always_ask, step-4 rewrite (ports the shelved 4a/4b/4c baseline; "never claim booked" kept). Content-package counterpart: EratoLab/erato-subscription-content branch feature/ermain-387-create-appointment-facet (byte-identical section, stacks on content#1).

Tests: both-gates proposal validation, artifact-stamping path (confirm surface works without body_format), parser/form-opener (incl. mobile gate + no recurrence), appointment renderer confirm/deny/auto-prompt (incl. neutral-context sentinel match), email-renderer kind filter, MessageContent fence dispatch + carding gates.

  • Success feedback follows the add-in's transient idiom (unified 2026-07-06): confirm cards close on every resolution, the action button swaps to "Opened!" for ~2s — no persistent resolved rows. Web/library counterpart tracked as ERMAIN-435.

@bdart bdart marked this pull request as ready for review July 6, 2026 14:41
…tem-independent auto-prompt, shared button styles
@bdart bdart enabled auto-merge (squash) July 6, 2026 15:28
@bdart bdart disabled auto-merge July 6, 2026 15:54
@bdart bdart merged commit 136f902 into main Jul 6, 2026
28 of 29 checks passed
@bdart bdart deleted the feature/ermain-387-si-5-create-appointment-confirm-path branch July 6, 2026 15:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant