ERMAIN-387: create-appointment confirm path (outlook.create_appointment + erato-appointment fence)#804
Merged
bdart merged 4 commits intoJul 6, 2026
Conversation
…nt + erato-appointment fence renderer)
…se on resolution, buttons show transient Opened!
…tem-independent auto-prompt, shared button styles
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.
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_schedulestep 4 now emits oneerato-appointmentfenced JSON block + onepropose_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_appointmentinIMPLEMENTED_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).erato-appointmentfence dispatch in the shared library via registry keyEratoAppointmentCodeBlock(default: plain code block; web unaffected).OutlookArtifact.bodyFormatis now optional and gates everything email-shaped (drifted-tag rescue, whole-body card) — scheduling prose can never card as an insertable email.body_formatgate decoupled: artifact stamping extracted to purebuildOutlookArtifactwith two doors (body_format arg OR offerable client actions).useClientActionConfirmFlow, shared by the email renderer (behavior unchanged, suite green) and the newOutlookEratoAppointmentRenderer.NO_ITEM_SEND_IDENTITYsentinel 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).displayNewAppointmentFormunsupported); recurrence never prefilled.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 branchfeature/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.