CedarCopilot wants to merge 3 commits into staging from fix/sherlock-before-meeting-ambiguous-target-20260904-150852
Live on prod, 1 of 6 behaviors degraded
Strict CloudWatch fallback found 26 prod failure log lines for [executeExternalCrm] Post-execution deal link failed (non-critical) (Failed query: update \) in the last 24h while checking runplaybooksectionexecution, handleexecutescheduledexecution, sha-256, is present, the.
Production telemetry shows 54 successful '[executeScheduledExecution] Firing playbook before-meeting' operations across 8 worker streams from 2026-09-06 22:30:00Z through 2026-09-08 07:30:02Z. The firing logs include matching google_event_id and target_meeting_title for the.
Strict CloudWatch fallback found 1 recent prod failure log lines for Failed to create execution for task (Failed to execute task: Failed query: update \), but the same failure had 19 log lines in the comparable pre-deploy baseline. Libra is not blaming this PR intent without a.
Strict CloudWatch fallback found 1 recent prod failure log lines for Failed to create execution for task (Failed to execute task: Failed query: update \), but the same failure had 19 log lines in the comparable pre-deploy baseline. Libra is not blaming this PR intent without a.
Unable to complete a production verification: post-deploy telemetry showed scheduled/automation spans, but no spans or logs tied specifically to the before-meeting execution, legacy recovery, or overrideInstructions behavior. The evidence is therefore insufficient to establish.
Verification cited only 7 matching post-deploy events, below the 20-event floor for calling a change verified. Nothing is failing; there is not yet enough traffic to confirm it.
Libra has verdicts on 2 of 6 tracked behaviors on prod; 4 are still being checked. Libra checks hourly for 3 days after each deploy.
A Cedar conversation can hold several real meetings on the same day , most commonly when
multiple contacts at one company share a domain and get merged into one Cedar conversation
(e.g. several Meta contacts all landing on one "Meta" deal). The before-meeting trigger
correctly scheduled one execution per calendar event, but at fire time gave the meeting-prep
subagent nothing beyond conversationId and a generic prompt ("Meeting preparation ,
before-meeting trigger"). Left to guess which of the conversation's upcoming meetings it was
for, the subagent converged on whichever was chronologically nearest "now" and re-delivered
that meeting's (already-sent) prep instead of writing one for its actual target.
Traced via Sherlock for Willem/Listen Labs (2026-09-04): three same-day Meta meetings (Emma 11:35am, Charlie 12:00pm, Shubha 1:30pm) shared one Cedar conversation. The trigger scheduled 2 hours ahead of Shubha's 1:30pm call fired on time, but re-posted Emma's 11:35am prep to Slack a third time and never wrote anything for Shubha , reported as "meeting hasn't loaded."
handleExecuteScheduledExecution.ts already parsed the calendar event's googleEventId out of
the dedupe key ({googleEventId}:before-meeting:playbook:...), but only used it for a
participant RSVP-decline check, then discarded it before dispatching the subagent.
handleExecuteScheduledExecution.ts: consolidated the googleEventId parse + calendar-event
lookup into one unconditional query (previously gated behind the participant-only RSVP check),
and used it to build explicit target-meeting instructions (title, start time, timezone) for
every before-meeting execution, not just participant ones.runPlaybookSectionExecution's existing additionalInstructions
hook (already used by daily-agenda's fan-out for the same purpose , per-execution caller
context appended to the dispatched subagent's instructions).playbook-execution-triggers.ts: also joined additionalInstructions into the legacy
(non-ref) dispatch path's overrideInstructions , without this it would have silently
vanished for any account still on that fallback path.before-meeting-execution-rsvp-gate.test.ts's mock to match the new query shape
(this caught a real bug during review: the unconditional query crashed on
undefined.toISOString() against the old mock, which only modeled rsvp/orgAopId), and
added two new tests: the target-meeting text is forwarded, and the change fails open (no
additionalInstructions, execution still proceeds) when no calendar event resolves.pnpm --filter @zero/server exec vitest run src/mastra/routeHandlers/event-execution/__tests__/before-meeting-execution-rsvp-gate.test.ts , 7/7 passing.agent_tool_calls for the run-subagent/meeting-prep run scheduled ~2h before each , the
fetch-conversation step should be followed by a brief specific to that contact rather than
a re-delivery of a different one, and #weewee-meetingprep should show one correct post per
meeting, not duplicates.pnpm --filter @zero/server run types , cleanpnpm --filter @zero/server exec eslint on all 3 changed files , cleanpnpm deps:check , 0 violations, 1735 modules cruised/thermo-review: š“ 0, š” 0, š¢ 2 nits (no missing legacy-path test, ISO-string readability) , both non-blockingš¤ Generated with Claude Code
https://claude.ai/code/session_01NCrzpfdSkCgjvtgmUGbEjQ
This PR resolves the calendar event associated with each before-me
Libra has not measured any production surfaces for this change yet.