Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
175 commits
Select commit Hold shift + click to select a range
af447d6
fix(cloud): add Atlas video provider
claude Jul 3, 2026
6c499df
fix(cloud): map Atlas video audio option
claude Jul 3, 2026
22ce323
fix cloud theme token scope
claude Jul 3, 2026
0e2bc24
add press release domain model
claude Jul 3, 2026
ad0f84c
fix(cloud-apps): DEPLOY_FRONTEND honest not-live status + cache inval…
NubsCarson Jul 3, 2026
7ee608b
feat(meetings): W1 scaffold — shared meeting contract, TranscriptSour…
Jul 3, 2026
fac7c56
feat(meetings): pin PlatformStrategies seam for platform adapters (#1…
Jul 3, 2026
ad980b8
chore(meetings): lockfile for plugin-meetings deps (#11856)
Jul 3, 2026
4ced947
feat(elizacloud): register ModelType.TRANSCRIPTION cloud handler with…
Jul 3, 2026
19e9fd0
feat(ui): live meeting transcripts — join bar, live pane, meeting bad…
Jul 3, 2026
2e7f62b
feat(meetings): port Vexa Google Meet bot — shared flow, launch, gues…
Jul 3, 2026
99d9c37
feat(meetings): transcription pipeline — SpeakerStreamManager (LocalA…
Jul 3, 2026
9c6eb13
feat(meetings): port Vexa Teams + Zoom web adapters (#11856)
Jul 3, 2026
a8336a6
feat(meetings): MeetingService orchestration, actions, routes, live W…
Jul 3, 2026
803026f
feat(calendar): meeting auto-join via ScheduledTask spine + send-agen…
Jul 3, 2026
0023ef0
feat(discord): voice-channel meeting transcripts — per-user diarized …
Jul 3, 2026
584de2b
feat(meetings): barrel-export createMeetingTranscriptionPipeline for …
Jul 3, 2026
03bc8dc
chore(meetings): lockfile — plugin-discord → plugin-meetings workspac…
Jul 3, 2026
b0ab749
fix(meetings): abort-responsive join, UI polish + evidence (#11856)
Jul 3, 2026
5319381
fix(ui): stop the reconnecting indicator from shifting content + fix …
roninjin10 Jul 3, 2026
3813d19
feat(meetings): headless launch mode + platform-capability gating + d…
Jul 3, 2026
e5285d4
refactor(meetings): consolidate meeting actions — shared service guar…
Jul 3, 2026
131393e
feat(meetings): refuse join on unsupported hosts (mobile / no Chromiu…
Jul 3, 2026
9ae4126
test(meetings): headless in-process e2e + service/writer error-path c…
Jul 3, 2026
a5eba70
test(#10722): rendered-geometry 44px tap-target gate + semantic-outco…
claude Jul 3, 2026
2f7cb59
test(#10722): webkit ui-smoke project WIP — salvaged from rate-limite…
claude Jul 3, 2026
58a690f
test(meetings): deterministic mocked scenario lane — JOIN/LEAVE/GET, …
Jul 3, 2026
b56345f
feat(meetings): strengthen JOIN_MEETING routing signal (similes, desc…
Jul 3, 2026
d415be3
fix(ui): make first-run onboarding recoverable instead of looping on …
roninjin10 Jul 3, 2026
af50800
fix: gate app monetization on review
claude Jul 3, 2026
f5f4702
docs(cloud-sdk): clarify create-time monetization review gate
Jul 3, 2026
c7b4c1d
fix: clear monetization branch blockers
claude Jul 3, 2026
cbfd5f8
fix(ui): raise shared tap targets for geometry gate
claude Jul 3, 2026
52b2b81
fix(ui): restore macOS two-finger swipe-back/forward trackpad gesture
roninjin10 Jul 3, 2026
8137ace
Merge PR #11878 (401db9ce1bafb963a23ab7adbde1a391f5ed20dd) into devel…
Jul 3, 2026
cdf6220
Merge PR #11887 (52b2b81f2761131ad5676c71c296cdf6daffd7d1) into devel…
Jul 3, 2026
3c3ee32
Merge PR #11885 (fcbaad47940ab14e73f5ddc63abbbf4599c724a1) into devel…
Jul 3, 2026
9a0e42b
Merge PR #11884 (d415be38faf41368219858c58ce85e5386c99402) into devel…
Jul 3, 2026
6e992ce
Merge PR #11880 (33eaba8f9f558c90d0a64ab554ade3e0aee02a21) into devel…
Jul 3, 2026
c0e4e29
Merge PR #11867 (5319381f7086ce55276e81ececec4f67261b9ade) into devel…
Jul 3, 2026
ccb90f9
Merge PR #11840 (e39c2265c89451fcaa320878a29aa36e00b729b2) into devel…
Jul 3, 2026
3ed84c5
Merge PR #11831 (99b6da0e792af45d62171e58e136352381be4cda) into devel…
Jul 3, 2026
49f2c09
Merge PR #11877 (2f7cb59c8fba7507a0c00a42d6beb8f45fd8885d) into devel…
Jul 3, 2026
4cd039c
Merge PR #11868 (cbfd5f87704edb1174e3373f344e896345dc0366) into devel…
Jul 3, 2026
e5f02ed
Merge PR #11816 (22ce32341c13aebcf008acf912ebf653760fdfdd) into devel…
Jul 3, 2026
5cb63f6
Merge PR #11835 (ad0f84c03248a32ac04fdda6759134e867080f19) into devel…
Jul 3, 2026
fda6fc8
Merge PR #11828 (c7b4c1d332eaae1905a09223772072567473382a) into devel…
Jul 3, 2026
d953586
Merge PR #11825 (0e2bc24daf7a71265f517aeae683e89668e86ac3) into devel…
Jul 3, 2026
a0c6ca6
Merge PR #11785 (6c499df62b6107f39a681f380b65c6aecad6b5b0) into devel…
Jul 3, 2026
33a247a
Merge PR #11860 (b56345f2d353ee1dcb444bd110aeddc13fc10910) into devel…
Jul 3, 2026
4fa7d0a
fix(ui): no-provider Settings redirect requires live canRespond=false…
Jul 3, 2026
192d7b4
fix(ui): story-gate play fn waits for delayed splash; unconditional s…
Jul 3, 2026
76edf32
fix(cloud): video poll-timeout must not full-refund while the upstrea…
lalalune Jul 3, 2026
ce09360
fix(cloud): agent 'create a monetized app' degrades gracefully — down…
lalalune Jul 3, 2026
a224756
fix(ci): green the Client Tests lane — content-based bundle-dup gate,…
lalalune Jul 3, 2026
3a2b4eb
fix(inbox): surface connector degradation instead of an empty healthy…
lalalune Jul 3, 2026
2abc5e8
feat(calendar): honor RRULE/recurring event semantics in LifeOps cale…
lalalune Jul 3, 2026
119fb7a
fix(local-inference): interactive-over-background model-lock priority…
lalalune Jul 3, 2026
cff4189
fix(android): bionic host honors maxTokens per native call + real inc…
lalalune Jul 3, 2026
13baa44
fix(examples/edad): Option-B deploy body — camelCase CreateContainerS…
NubsCarson Jul 3, 2026
f1e91a0
ci(janitor): freeze-proof the zombie janitor — dual runner lanes, no …
NubsCarson Jul 3, 2026
0d2de01
fix(agent): don't BM25-rerank the DATABASE search_vectors op (drops z…
NubsCarson Jul 3, 2026
f6af878
fix(agent): preserve semantic search vector results
lalalune Jul 3, 2026
d23d702
fix(core): keep brain-provider override failover tail
lalalune Jul 3, 2026
a62aca0
fix(core): suppress unaddressed runtime failure replies
lalalune Jul 3, 2026
4a81c62
test(#10722): webkit ui-smoke project WIP — salvaged from rate-limite…
lalalune Jul 3, 2026
2d347a4
fix(core): repair task backoff, cron days, plugin filters
lalalune Jul 3, 2026
fa29225
test(#11877): scope plugin-views spec output per engine (no Chromium/…
Jul 3, 2026
7e7a3cd
fix(cloud): forward the RESOLVED video duration to the provider — bil…
NubsCarson Jul 3, 2026
fad9bdf
fix(cloud): close the #10852 app-key scope gap on frontend/review/bac…
NubsCarson Jul 3, 2026
6be754c
fix(cloud): forward billed video duration to provider
lalalune Jul 3, 2026
370b285
fix(ui): fall back to the owner cloud API key for native Apps API aut…
NubsCarson Jul 3, 2026
78c444f
fix(ui): consolidate app controls on design system
lalalune Jul 3, 2026
58329b1
fix(plugin-sql): getLogs limit param, memory worldId mapping, sanitiz…
NubsCarson Jul 3, 2026
252817b
fix(ui): enable WKWebView allowsBackForwardNavigationGestures on macO…
Jul 3, 2026
e31d3ec
fix(ui): reconnecting-pill test locks out-of-flow contract; warn bann…
Jul 3, 2026
4529692
fix(ui): document cloud-theme predicate scope (#11816) + steward subs…
Jul 3, 2026
3ebcce0
test(cloud-apps): cover DEPLOY_FRONTEND not-live (status ready) branc…
Jul 3, 2026
447dff5
fix(ui): first-run 'other' provider finishes local (configure-later) …
Jul 3, 2026
7173bb4
fix(core): triage bot noise before Stage 1
lalalune Jul 3, 2026
f5422db
test(#11868): deny-list geometry gate, revert HomeScreen tap-shadow, …
Jul 3, 2026
6f62710
fix(cloud-apps): enforce the confirm TTL on WITHDRAW_APP_EARNINGS (st…
NubsCarson Jul 3, 2026
1c3167f
fix(app-control): scaffold views/apps outside a monorepo checkout and…
NubsCarson Jul 3, 2026
a142800
fix(plugin-cloud-apps): deploy-gate poll robustness + reachability pr…
NubsCarson Jul 3, 2026
1579baf
fix(cloud): press-release idempotency atomic + per-org, discriminated…
Jul 3, 2026
2a4c700
fix(cloud): scope-guard GET /apps/:id — close the read-only cross-app…
NubsCarson Jul 3, 2026
b40e602
fix(orchestrator/security): variable-cost self-spend can no longer au…
lalalune Jul 3, 2026
a662a09
fix(cloud-apps): CREATE_APP creates un-monetized + review guidance (n…
Jul 3, 2026
62144cd
fix(cloud): Atlas video per-resolution pricing (fixes unresolvable ro…
Jul 3, 2026
fc1cba7
test(orchestrator): align broker spend prompts (#11964)
lalalune Jul 3, 2026
55d97b7
fix(core): preserve semantic memory hits after BM25 rerank (#11965)
lalalune Jul 3, 2026
faf6fb7
fix(cloud/money): refund verified video failures even after the stale…
lalalune Jul 3, 2026
b742bfa
fix(meetings): guard malformed meeting-URL crash (BL-2), server-compu…
Jul 3, 2026
757788b
fix(meetings): manifest auto-enable (BL-1), sync reservation+rollback…
Jul 3, 2026
39ebf34
ci(cloud): scope deploy-api to the production environment so it can p…
lalalune Jul 3, 2026
af43425
fix(core): bot-noise triage parses verdict via canonical helpers so i…
lalalune Jul 3, 2026
1a3e232
fix(cli-inference): pool-first warm-session auth — use an app-connect…
NubsCarson Jul 3, 2026
664ebe1
fix(ui): enable native Apps queries under API-key auth (#11973)
lalalune Jul 3, 2026
d7b9be6
fix(agent): send oauth beta header in inline anthropic subscription t…
NubsCarson Jul 3, 2026
ce8ce33
fix(plugin-cloud-apps): fast-fail permanent deploy poll errors (#11967)
lalalune Jul 3, 2026
43aeee6
fix(ui): hidden keep-alive views wake on tab refocus + desktop dock e…
NubsCarson Jul 3, 2026
eb28823
fix(ui): demo visual polish — widget value truncation, launcher tile …
NubsCarson Jul 3, 2026
d435aa5
fix(app-control): register a freshly built app on verification-pass s…
lalalune Jul 3, 2026
35a9cab
feat(meetings): meeting transcription — Vexa Meet/Teams/Zoom bots + D…
lalalune Jul 3, 2026
50eb582
fix(cloud): pay affiliate earnings only from collected markup (#11976)
lalalune Jul 3, 2026
010f80f
fix(ui): refresh native Steward sessions with Bearer auth (#11978)
lalalune Jul 3, 2026
d2ed356
feat(orchestrator): github PAT via credential proxy — spawned agents …
lalalune Jul 3, 2026
1e0f35c
fix(cloud/security): close remaining cross-org IDOR gaps from the aut…
NubsCarson Jul 3, 2026
0e0f360
style(cloud): format affiliate billing guard (#11984)
lalalune Jul 3, 2026
daea07f
feat(orchestrator): per-spawn scoped model-token leases + revocation …
lalalune Jul 3, 2026
8beb40f
fix: gate GENERATE_MEDIA on a usable media key so the agent never pro…
lalalune Jul 3, 2026
15bc680
fix: post-merge review-sweep corrections (#11917, #11927) (#11982)
lalalune Jul 3, 2026
35990d1
Merge remote-tracking branch 'origin/develop' into shaw/dazzling-swir…
Jul 3, 2026
8ca1229
fix(cloud): keep steward login on env tenant (#11987)
lalalune Jul 3, 2026
8ab3e99
fix(meetings): wire plugin auto-enable through the package manifest (…
lalalune Jul 3, 2026
c0788ab
Merge remote-tracking branch 'origin/develop' into shaw/dazzling-swir…
Jul 3, 2026
20cd6d3
fix(cloud): narrow affiliate before applying markup (#11989)
lalalune Jul 3, 2026
788d150
Merge remote-tracking branch 'origin/develop' into shaw/dazzling-swir…
Jul 3, 2026
d79f3a0
add press release domain model (#11825)
lalalune Jul 3, 2026
5c73d75
fix(cli-inference): declare claude agent sdk optional dependency (#11…
lalalune Jul 3, 2026
e0bfffb
Merge remote-tracking branch 'origin/develop' into shaw/dazzling-swir…
Jul 3, 2026
9ac7b44
fix(orchestrator): revoke model leases on native terminal paths (#11991)
lalalune Jul 3, 2026
2e539f8
fix(openai): preserve free-form record-arg intent when closing open m…
lalalune Jul 3, 2026
fd61f9d
feat(ui): launcher/views redesign — split character, fix wallet/tasks…
Jul 3, 2026
b2bcea6
Merge pull request #11993 from elizaOS/shaw/practical-rubin-10cf36
lalalune Jul 3, 2026
160b5ca
perf(mobile): unblock the API bind — cut Android cold boot ~21s → ~8s…
lalalune Jul 3, 2026
2b30b3e
fix(ui): tutorial tile starts the tour directly, restore TutorialView…
Jul 3, 2026
ec5145d
fix(cloud): catch a present-but-invalid media key with a health break…
lalalune Jul 3, 2026
3d7adcd
Merge pull request #11997 from elizaOS/shaw/practical-rubin-10cf36
lalalune Jul 3, 2026
8a3d7b8
feat(cloud): add marketing press release routes and actions
Jul 3, 2026
0d0e87f
Merge pull request #11998 from elizaOS/fix/11819-pr-routes-actions
lalalune Jul 3, 2026
8b633e7
test(app): live-stack e2e proving scheduled-reminder create → fire → …
lalalune Jul 3, 2026
a13e24e
fix(cloud): restore orange brand background on login page (#12004)
standujar Jul 3, 2026
d56e8a5
feat(core): secrets-feature federation — pluggable non-decrypting bro…
0xSolace Jul 3, 2026
bd2ba56
fix(scripts,test): resolve turbo from a worktree; count design-system…
lalalune Jul 3, 2026
fc82868
feat(import-conversations): add Claude export parser (#12006)
lalalune Jul 3, 2026
af08da3
feat(import-conversations): Track B — ChatGPT export parser (#11881) …
lalalune Jul 3, 2026
bb8700c
fix(import-conversations): handle chatgpt zip exports (#12008)
lalalune Jul 3, 2026
29ffa1f
feat(import-conversations): add DocumentService sink adapter
lalalune Jul 3, 2026
3718346
fix: finish PR 11962 chat onboarding verification
lalalune Jul 3, 2026
1e74e66
wip: preserve worktree changes before cleanup
Jul 3, 2026
e3951d9
fix(mobile): stub fsevents in the iOS/Android agent bundle (native-ad…
Jul 3, 2026
136ab5b
Merge pull request #12011 from elizaOS/shaw/practical-rubin-10cf36
lalalune Jul 3, 2026
5161348
wip: preserve tracked worktree edits before cleanup
Jul 3, 2026
a0c6891
fix(meetings): format post-12009 changes
lalalune Jul 3, 2026
c9803c4
feat(cloud/advertising): programmatic DSP / OpenRTB provider (#11665)…
lalalune Jul 3, 2026
117c654
test(evidence): live scenario evidence for #11821 + #11355 (#12015)
lalalune Jul 3, 2026
52012d9
fix(ios): keep KeepAwakeBridge core JavaScriptCore-free (full-Bun eng…
Jul 3, 2026
baabc19
Merge pull request #12016 from elizaOS/shaw/practical-rubin-10cf36
lalalune Jul 3, 2026
4a3d45c
test(meetings): drop stale Plugin.autoEnable lockstep assertion (fiel…
Jul 3, 2026
760ba73
Merge remote-tracking branch 'origin/develop' into shaw/dazzling-swir…
Jul 3, 2026
7cabac5
fix(meetings): auto-enable via the config feature toggle, drop ELIZA_…
lalalune Jul 3, 2026
0bc446f
fix(repo): revert accidental files from ios keep-awake fix
lalalune Jul 3, 2026
b3d929e
Merge remote-tracking branch 'origin/develop' into shaw/dazzling-swir…
Jul 3, 2026
1c8363f
Merge remote-tracking branch 'origin/develop' into shaw/dazzling-swir…
Jul 3, 2026
cff0045
fix(plugin-app-control): gate VIEWS on viewless connector turns
NubsCarson Jul 3, 2026
01216ba
fix(actions): disambiguate action routing
lalalune Jul 3, 2026
b2f44a0
test(evidence): live LifeOps/PA trajectories + benchmark baseline (#1…
lalalune Jul 3, 2026
624cd62
fix(ui): malformed model UiSpec bricks the whole app — contain to the…
NubsCarson Jul 3, 2026
d663c30
fix(connectors): over-limit splitter chunks, nested-markdown sentinel…
NubsCarson Jul 3, 2026
2d4b1c9
fix(app): never leave a blank page on boot failure — reload card + de…
NubsCarson Jul 3, 2026
cc49890
chore(evidence): clean 12022 artifacts
lalalune Jul 3, 2026
f6e69f1
test(app): live proactive-suggestion e2e + evidence + fix ui-smoke pr…
lalalune Jul 3, 2026
2fa997d
fix(core): plan the model-committed follow-up instead of shipping its…
NubsCarson Jul 3, 2026
e4f9caa
fix(ios): background URLSession for the ~5GB local-model download so …
lalalune Jul 3, 2026
77d6c79
fix(app): make Android evidence capture resilient to sdcard pulls
lalalune Jul 3, 2026
d34c2e9
test(core): format promissory ack regression
lalalune Jul 3, 2026
278f324
fix(agent-orchestrator): register built apps at deploy completion
NubsCarson Jul 3, 2026
65d1e42
fix: add eliza-code runner image install option (#12032)
lalalune Jul 3, 2026
418b320
fix(telegram): plain-text fallback no longer shows raw MarkdownV2 bac…
NubsCarson Jul 3, 2026
95eb713
chore(evidence): normalize proactive live artifacts
lalalune Jul 3, 2026
e2d9a6d
fix(core): three basic-capabilities bugs — history-dropping crash, fu…
NubsCarson Jul 3, 2026
dcf8445
test(lifeops): real-local-model PA benchmark score history (#11789, #…
lalalune Jul 3, 2026
4c5dedf
fix(cloud): reserve affiliate markup upfront on /v1/embeddings (#1201…
NubsCarson Jul 3, 2026
4bc7314
test(app): align onboarding ui-smoke spec with shipped composer copy …
NubsCarson Jul 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
72 changes: 72 additions & 0 deletions .github/issue-evidence/10689-atlas-video-provider.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# #10689 Atlas Cloud video provider

## Scope

Agent-actionable slice:
- Add Atlas Cloud as a `/api/v1/generate-video` provider through the existing video registry.
- Add supported Atlas video model definitions and `video:generation` pricing rows.
- Keep the FAL video provider path unchanged.
- Add deterministic provider/pricing tests plus a credential-gated live lane.

## Deterministic evidence

Run from repo root:

```bash
bun test packages/cloud/shared/src/lib/providers/video/atlascloud-video-generation.test.ts \
packages/cloud/shared/src/lib/providers/video/fal-video-generation.test.ts \
packages/cloud/shared/src/lib/services/ai-pricing/video-generation-pricing.test.ts \
packages/cloud/shared/src/lib/services/media-model-roster.test.ts
```

Expected coverage:
- Atlas request body uses documented `generateVideo` payload fields, including
image/reference aliases and `generate_audio` for route-level `audio`.
- Atlas inline output normalization returns a usable `video/*` object.
- Missing `ATLASCLOUD_API_KEY` fails before upstream dispatch.
- Every supported Atlas video model has an Atlas `video:generation` pricing row.
- The checked-in media model roster indexes the wired Atlas video model IDs.

Additional review validation, 2026-07-03:

```bash
bun test packages/cloud/shared/src/lib/providers/video/atlascloud-video-generation.test.ts \
packages/cloud/shared/src/lib/providers/video/atlascloud-video-generation.real.test.ts \
packages/cloud/shared/src/lib/providers/video/fal-video-generation.test.ts \
packages/cloud/shared/src/lib/services/ai-pricing/video-generation-pricing.test.ts \
packages/cloud/shared/src/lib/services/media-model-roster.test.ts
bun run --cwd packages/cloud/shared typecheck
bun run --cwd packages/cloud/api typecheck
bunx @biomejs/biome check packages/cloud/shared/src/lib/providers/video/atlascloud-video-generation.ts \
packages/cloud/shared/src/lib/providers/video/atlascloud-video-generation.test.ts \
packages/cloud/shared/src/lib/providers/video/atlascloud-video-generation.real.test.ts \
packages/cloud/shared/src/lib/providers/video/registry.ts \
packages/cloud/shared/src/lib/services/ai-pricing-definitions.ts \
packages/cloud/shared/src/lib/services/ai-pricing/providers/atlascloud.ts \
packages/cloud/shared/src/lib/services/ai-pricing/providers/fal.ts \
packages/cloud/shared/src/lib/services/ai-pricing/lookup.ts \
packages/cloud/shared/src/lib/services/ai-pricing/video-generation-pricing.test.ts \
packages/cloud/shared/src/lib/services/media-model-roster.ts \
packages/cloud/api/v1/generate-video/route.ts
git diff --check origin/develop..HEAD
```

Result: deterministic tests passed (`12 pass`, `1 skip` for the credential-gated
live Atlas lane), both package typechecks passed, targeted Biome passed, and
diff whitespace check passed.

## Live evidence

N/A from this workspace: no Atlas Cloud production API key or spend budget was available.

Human/operator command when credentials are available:

```bash
TEST_LANE=post-merge ATLASCLOUD_API_KEY=<redacted> \
bun test packages/cloud/shared/src/lib/providers/video/atlascloud-video-generation.real.test.ts
```

Required manual review after the live lane:
- Open the returned video URL and confirm the media plays.
- Attach the generated video artifact or URL, provider request id, route logs, billing row, and generated `generations` row.
- Add the model matrix required by #10689 for each Atlas model enabled in production.
79 changes: 79 additions & 0 deletions .github/issue-evidence/10721-calendar-rrule/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# #11788 / #10721 — calendar RRULE / recurring-event semantics

Evidence that LifeOps calendar actions now honor RRULE/recurring-event
semantics end to end: recurrence-aware create, explicit instance-vs-series
intent on update/delete, series mutations that target the series master
(never an iteration over flattened occurrences), and recurrence metadata on
readback.

## Artifacts

| File | What it proves |
| --- | --- |
| `live-llm-trajectory.json` | **Real-LLM trajectories** (live `claude` CLI, haiku — not the proxy, not a mock) driving the PRODUCTION `CALENDAR` action handler. Contains every prompt the handler built, every raw model response, the provider-bound service calls, and the grounded replies for 4 scenarios (see below). Reviewed by hand. |
| `live-rrule-evidence.mts` | The runner that produced the trajectory (drives `createCalendarActionRunner` with the live model at the `CalendarActionDeps` seam and a spied `CalendarService`). Re-run: `cp` into `plugins/plugin-calendar/` and `bun live-rrule-evidence.mts`. |
| `fail-without-fix.txt` | The new test suites run against the **pre-fix** `calendar-handler.ts` + `CalendarService.ts` from `origin/develop`: **22 failures** (ambiguous recurring delete mutates without asking, recurrence dropped on create, no series-master resolution, invalid RRULE silently ignored, …). All 22 pass with the fix. |
| `test-runs.txt` | Full local runs: plugin-calendar suite (**195 passing / 2 skipped** incl. 54 new recurrence tests), plugin-google (**22**), packages/shared (**1049**), typecheck across all 7 affected packages. |

## Live-LLM scenario results (from `live-llm-trajectory.json`)

1. **create-recurring** — "book a 30 minute morning run … every monday at 7am
eastern": the live model planned `create_event` and extracted
`RRULE:FREQ=WEEKLY;BYDAY=MO` itself; `createCalendarEvent` received
`recurrence: ["RRULE:FREQ=WEEKLY;BYDAY=MO"]`; reply: *"Created calendar
event "morning run" … It repeats weekly on Monday."*
2. **update-ambiguous** — "move my team standup to 10am" against a recurring
occurrence: the model extraction did **not** invent a scope, the handler
clarified — *""Team Standup" repeats weekly on Wednesday. should i change
just this occurrence or the whole series?"* — and **no mutation was
issued**.
3. **update-instance** — "move just this one team standup occurrence to
10am": live extraction returned `recurrenceScope: "instance"`;
`updateCalendarEvent` was called with the occurrence id +
`recurrenceScope: "instance"`.
4. **delete-series** — "delete the whole series of my team standup": exactly
**one** `deleteCalendarEvent` call with `recurrenceScope: "series"`.

## Acceptance criteria mapping

- *"Create a recurring …" produces a recurring event through the real
calendar service path and readback shows the recurrence metadata* —
live scenario 1 + `calendar-recurrence-service.test.ts`
("normalizes recurrence to the provider and surfaces it on readback":
provider input, `event.recurrence`, and the PGlite cache row all carry the
RRULE) + plugin-google contract test (insert/patch `requestBody.recurrence`,
readback mapping).
- *Update/delete of a recurring title requires explicit single occurrence vs
series intent when ambiguous* — live scenario 2 +
`calendar-recurrence-ops.test.ts` (ambiguous update & delete → clarification,
zero mutation calls).
- *A single occurrence update/delete does not mutate/delete the whole series* —
live scenario 3 + ops/service tests (instance scope patches/deletes only the
addressed occurrence id).
- *A series update/delete does not require iterating over flattened
occurrences* — live scenario 4 + service test: ONE provider call against the
resolved series-master id (cache-first via `recurringEventId`, provider
`getEvent` fallback), plus cached-occurrence purge.
- *Multi-account `grantId + calendarId` isolation is preserved* — service test
"series scope deletes the master once and purges cached occurrences,
preserving other accounts" (foreign-grant rows survive the purge).
- *DST correctness* — `recurrence.test.ts` expands a daily-9am rule across the
2026-03-08 spring-forward and 2026-11-01 fall-back (America/New_York):
local wall-clock time holds, exactly one occurrence per local day; expected
instants independently verified against `Intl.DateTimeFormat`.
COUNT/UNTIL termination and weekly/monthly next-occurrence covered.

## Required evidence not applicable

- **Video walkthrough / before-after screenshots (desktop + mobile)** —
N/A: no UI surface changed; this is an action/service/contract change. The
user-visible surface is chat replies, which are captured verbatim (grounded
reply text) in `live-llm-trajectory.json`.
- **Live Google Calendar API round-trip** — N/A in this environment: no
`GOOGLE_CALENDAR_ACCESS_TOKEN` available. The provider seam is covered by
the recorded-wire contract tests (`google-calendar-connector.contract.test.ts`
pattern, extended in `plugins/plugin-google/src/index.test.ts`) and the
existing live drift lane `google-calendar-connector.real.test.ts`
(post-merge, token-gated) exercises `mapEvent` against the real API,
including the new `recurrence`/`recurringEventId` fields.
- **Audio** — N/A: no voice path touched.
25 changes: 25 additions & 0 deletions .github/issue-evidence/10721-calendar-rrule/fail-without-fix.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
× normalizes recurrence to the provider and surfaces it on readback 34ms
× rejects invalid recurrence fail-closed — no provider call, no one-off event 7ms
× rejects recurring creates on the Apple Calendar path 6ms
× series scope through an occurrence id patches the cached series master 6ms
× series scope for an uncached id resolves the master via the provider 4ms
× recurrence lines imply a series edit and reach the provider patch 5ms
× rejects recurrence lines with instance scope (rules are series-level) 5ms
× rejects an invalid recurrenceScope fail-closed 5ms
× series scope deletes the master once and purges cached occurrences, preserving other accounts 7ms
× rejects an invalid recurrenceScope fail-closed 6ms
× recurrence failures are CalendarServiceError instances 7ms
× ambiguous intent → clarification, and nothing is updated 22ms
× "just this" phrasing → patches only the addressed occurrence 5ms
× "whole series" phrasing → one series-scoped patch 4ms
× explicit recurrenceScope detail wins without special phrasing 3ms
× a recurrence-rule change is implicitly a series edit 4ms
× ambiguous intent → clarification, and nothing is deleted 2ms
× "just this" phrasing → deletes only the addressed occurrence 2ms
× "whole series" phrasing → exactly one series-scoped delete call 2ms
× explicit eventId path forwards a structured recurrenceScope 2ms
× carries structured RRULE recurrence into the create request 4ms
× accepts recurrence via the rrule alias detail key 3ms
⎯⎯⎯⎯⎯⎯ Failed Tests 22 ⎯⎯⎯⎯⎯⎯⎯
Test Files 2 failed (2)
Tests 22 failed | 5 passed (27)
Loading
Loading