# Calendar／Scheduling API × Agent

CURRENT_STATUS: CURRENT
OBSERVATION: SPEC_ONLY
FRESHNESS: CURRENT
PAGE_TYPE: reference
CANONICAL_URL: /tools/ea-223-calendar-scheduling-api-agent
CLAIM_IDS: none
EVIDENCE_IDS: EVD-EA-223-URL-906B7A9215ED, EVD-EA-223-URL-E274D3FA73A6, EVD-EA-223-URL-2671DF10C7A9, EVD-EA-223-URL-47A5E50A22FC, EVD-EA-223-URL-5A4119997022, EVD-EA-223-URL-093059F82668, EVD-EA-223-URL-FEFF205190D2, EVD-EA-223-URL-58075F12154D, EA-223-R11-RESEARCH, EA-223-R11-WEB-READBACK
UNKNOWN_IDS: EA-223-UNKNOWN-01
OPS_IDS: none

## Summary
free/busyから候補を作った後、時間帯・参加者・招待副作用・競合・再試行をどう管理するか。空き時間確認だけで予約確定や全員承諾を宣言しない。

## Current judgment
1. Google Freebusyは指定期間・calendar/groupの空き/塞がりを返すAPIであり、event作成やslot reserveではない。各calendar/group errorsを確認し、busyが空でもerrorならUNKNOWNにする。Graph getScheduleもavailability情報を返す別methodで、混雑entry時5006等を扱う。[C1,M1;予約状態境界は推論]
2. Google更新はretrieved ETagをIf-Matchへ渡し、競合412時は再取得して差分と承認を再評価する。無条件overwriteや最新etagへの差し替えだけでは他者編集を守れない。insertに同じ条件付き更新の仕組みはない。[C2]
3. Google client指定event IDは規定formatに従い、responseを失った作成の重複対策に使える。Graph transactionIdは不要retry低減の入口である。どちらも任意の全操作・無期限・複数provider across exactly-onceの保証へ一般化しない。timeoutではstable intent→provider ID readbackから判断する。[C3,M2;cross-provider否定は保証範囲推論]
4. Google sendUpdates all/externalOnly/noneを承認対象にする。noneには外部calendar同期失敗やevent欠落のwarningがある。Graph event creationはattendeesを含むと全員へ招待を送ると記載され、通知抑制を前提とするdraft作成に流用しない。[C3,C4,M2]
5. Graph timeZoneはmailboxのsupported zonesを確認する。local表示だけではDST fold/gapを解消しない。UTC instant、zone ID、元local値・offset・ambiguous選択、tzdata version、end/startを保持し、存在しないlocal timeは候補生成を止める。IANAとWindows名称はadapterで検証して写像する組織提案である。[M1,M2,L1]
6. room resourceはmailbox設定とpolicyによるaccept/rejectがあり、organizer eventの201だけでroom予約済み・全員承諾とはしない。参加者は表示名だけでなく安定ID/mailbox/resource typeを解決し、外部送信・宛先・本文・時間帯・通知設定を承認へ結ぶ。[M2;承認bindingは提案]
7. Google sync tokenが無効な410ではfullsyncを行う。stale cacheや通知一件を最新状態の証拠として扱わず、readbackを再取得する。[C5]
8. Cal.com v2 bookingはcal-api-versionが正しくないと旧版へdefaultする記載がある。attendee timeZoneとevent type等をversion固定する。公開例にconflict/limits bypass関連optionsがあるため、Agentへ任意JSONを通さず明示allowlistにする。API例のoption=trueを安全な推奨defaultsとはしない。[B1;allowlistは提案]

## Scope
Calendar／Scheduling API × Agent

## Confirmed
- Google Freebusyは指定期間・calendar/groupの空き/塞がりを返すAPIであり、event作成やslot reserveではない。各calendar/group errorsを確認し、busyが空でもerrorならUNKNOWNにする。Graph getScheduleもavailability情報を返す別methodで、混雑entry時5006等を扱う。[C1,M1;予約状態境界は推論]
- Google更新はretrieved ETagをIf-Matchへ渡し、競合412時は再取得して差分と承認を再評価する。無条件overwriteや最新etagへの差し替えだけでは他者編集を守れない。insertに同じ条件付き更新の仕組みはない。[C2]
- Google client指定event IDは規定formatに従い、responseを失った作成の重複対策に使える。Graph transactionIdは不要retry低減の入口である。どちらも任意の全操作・無期限・複数provider across exactly-onceの保証へ一般化しない。timeoutではstable intent→provider ID readbackから判断する。[C3,M2;cross-provider否定は保証範囲推論]
- Google sendUpdates all/externalOnly/noneを承認対象にする。noneには外部calendar同期失敗やevent欠落のwarningがある。Graph event creationはattendeesを含むと全員へ招待を送ると記載され、通知抑制を前提とするdraft作成に流用しない。[C3,C4,M2]
- Graph timeZoneはmailboxのsupported zonesを確認する。local表示だけではDST fold/gapを解消しない。UTC instant、zone ID、元local値・offset・ambiguous選択、tzdata version、end/startを保持し、存在しないlocal timeは候補生成を止める。IANAとWindows名称はadapterで検証して写像する組織提案である。[M1,M2,L1]
- room resourceはmailbox設定とpolicyによるaccept/rejectがあり、organizer eventの201だけでroom予約済み・全員承諾とはしない。参加者は表示名だけでなく安定ID/mailbox/resource typeを解決し、外部送信・宛先・本文・時間帯・通知設定を承認へ結ぶ。[M2;承認bindingは提案]
- Google sync tokenが無効な410ではfullsyncを行う。stale cacheや通知一件を最新状態の証拠として扱わず、readbackを再取得する。[C5]
- Cal.com v2 bookingはcal-api-versionが正しくないと旧版へdefaultする記載がある。attendee timeZoneとevent type等をversion固定する。公開例にconflict/limits bypass関連optionsがあるため、Agentへ任意JSONを通さず明示allowlistにする。API例のoption=trueを安全な推奨defaultsとはしない。[B1;allowlistは提案]

## UNKNOWN
- EA-223-UNKNOWN-01: 旧Luna一意locator、orgのcalendar権限/委任/room policy、Google event ID衝突の分散条件、Graph transactionId有効範囲/保持、Cal.com exact header version/bypass権限/plan、実SDK pin、scope最小化、recurrence/all-dayとwebhook更新/失効、実二重予約防止/room accept、latency/費用と保持はUNKNOWN。
未認証、対象差分、scope不明、競合、実行結果不明では操作と確定通知を止めます。旧Luna成果の所在未確定を不存在へ読み替えません。

## Evidence
- EVD-EA-223-URL-906B7A9215ED (RESEARCH): [C1] Google — Freebusy: query: — https://developers.google.com/workspace/calendar/api/v3/reference/freebusy/query
- EVD-EA-223-URL-E274D3FA73A6 (RESEARCH): [C2] Google — Get specific versions of resources: — https://developers.google.com/workspace/calendar/api/guides/version-resources
- EVD-EA-223-URL-2671DF10C7A9 (RESEARCH): [C3] Google — Create events: — https://developers.google.com/workspace/calendar/api/guides/create-events
- EVD-EA-223-URL-47A5E50A22FC (RESEARCH): [C4] Google — Events: insert: — https://developers.google.com/workspace/calendar/api/v3/reference/events/insert
- EVD-EA-223-URL-5A4119997022 (RESEARCH): [C5] Google — Synchronize resources efficiently: — https://developers.google.com/workspace/calendar/api/guides/sync
- EVD-EA-223-URL-093059F82668 (RESEARCH): [M1] Microsoft — calendar: getSchedule: — https://learn.microsoft.com/en-us/graph/api/calendar-getschedule?view=graph-rest-1.0
- EVD-EA-223-URL-FEFF205190D2 (RESEARCH): [M2] Microsoft — Create event: — https://learn.microsoft.com/en-us/graph/api/user-post-events?view=graph-rest-1.0
- EVD-EA-223-URL-58075F12154D (RESEARCH): [B1] Cal.com — Create a booking: — https://cal.com/docs/api-reference/v2/bookings/create-a-booking
- EA-223-R11-RESEARCH (RESEARCH): EA-223 監査済みresearch / canonical revision binding
- EA-223-R11-WEB-READBACK (IMPL): EA-223 Web body identity / canonical readback

## Failure / limits
同時にfree/busyを確認した二人が異なるevent IDで同じ時間へ作成し得る。安定IDによるretry dedupとslot conflict対策は異なる。DST foldで01:30が二つのUTC時刻になり、gapで02:30が存在しない。Graph招待の自動送信、Google none同期warning、room拒否、calendar error、stale ETag、sync410、外部参加者への誤送信、タイムゾーン変換とall-day/recurrenceを失敗域に含める。
## Failure / limits
旧Luna一意locator、orgのcalendar権限/委任/room policy、Google event ID衝突の分散条件、Graph transactionId有効範囲/保持、Cal.com exact header version/bypass権限/plan、実SDK pin、scope最小化、recurrence/all-dayとwebhook更新/失効、実二重予約防止/room accept、latency/費用と保持はUNKNOWN。
未認証、対象差分、scope不明、競合、実行結果不明では操作と確定通知を止めます。旧Luna成果の所在未確定を不存在へ読み替えません。
## Practice
承認済み内容をhash/revisionと結ぶ、結果不明をUNKNOWNへ止める、再試行前にprovider状態を読み戻す、という設計は組織側の提案です。利用可能なAPIだけで組織の認可や人間承諾が完成するとはしません。
## Practice
必要なapp導入、対象resourceの権限、OAuth方式/consent、tenant・region・plan、SDKとAPI versionを採用先ごとに確認します。rate/quota、通知設定と外部参加者を検証します。
## Practice
actor/tenant/対象resourceと権限を再確認し、秘密鍵はserver側へ置きます。入力内の命令をtool authorityへ転用しません。承認内容・revision、provider receipt、結果readback、human handoffを別状態で監査可能にします。PII・保持/削除・DLP・外部転送・費用と運用閾値は組織の受入を要します。
## PUBLIC_CLAIM
free/busyから候補を作った後、時間帯・参加者・招待副作用・競合・再試行をどう管理するか。空き時間確認だけで予約確定や全員承諾を宣言しない。

## ESTABLISHED
1. Google Freebusyは指定期間・calendar/groupの空き/塞がりを返すAPIであり、event作成やslot reserveではない。各calendar/group errorsを確認し、busyが空でもerrorならUNKNOWNにする。Graph getScheduleもavailability情報を返す別methodで、混雑entry時5006等を扱う。[C1,M1;予約状態境界は推論]
2. Google更新はretrieved ETagをIf-Matchへ渡し、競合412時は再取得して差分と承認を再評価する。無条件overwriteや最新etagへの差し替えだけでは他者編集を守れない。insertに同じ条件付き更新の仕組みはない。[C2]
3. Google client指定event IDは規定formatに従い、responseを失った作成の重複対策に使える。Graph transactionIdは不要retry低減の入口である。どちらも任意の全操作・無期限・複数provider across exactly-onceの保証へ一般化しない。timeoutではstable intent→provider ID readbackから判断する。[C3,M2;cross-provider否定は保証範囲推論]
4. Google sendUpdates all/externalOnly/noneを承認対象にする。noneには外部calendar同期失敗やevent欠落のwarningがある。Graph event creationはattendeesを含むと全員へ招待を送ると記載され、通知抑制を前提とするdraft作成に流用しない。[C3,C4,M2]
5. Graph timeZoneはmailboxのsupported zonesを確認する。local表示だけではDST fold/gapを解消しない。UTC instant、zone ID、元local値・offset・ambiguous選択、tzdata version、end/startを保持し、存在しないlocal timeは候補生成を止める。IANAとWindows名称はadapterで検証して写像する組織提案である。[M1,M2,L1]
6. room resourceはmailbox設定とpolicyによるaccept/rejectがあり、organizer eventの201だけでroom予約済み・全員承諾とはしない。参加者は表示名だけでなく安定ID/mailbox/resource typeを解決し、外部送信・宛先・本文・時間帯・通知設定を承認へ結ぶ。[M2;承認bindingは提案]
7. Google sync tokenが無効な410ではfullsyncを行う。stale cacheや通知一件を最新状態の証拠として扱わず、readbackを再取得する。[C5]
8. Cal.com v2 bookingはcal-api-versionが正しくないと旧版へdefaultする記載がある。attendee timeZoneとevent type等をversion固定する。公開例にconflict/limits bypass関連optionsがあるため、Agentへ任意JSONを通さず明示allowlistにする。API例のoption=trueを安全な推奨defaultsとはしない。[B1;allowlistは提案]

## INFERENCE
承認済み内容をhash/revisionと結ぶ、結果不明をUNKNOWNへ止める、再試行前にprovider状態を読み戻す、という設計は組織側の提案です。利用可能なAPIだけで組織の認可や人間承諾が完成するとはしません。

## FAILURE_ENVELOPE
同時にfree/busyを確認した二人が異なるevent IDで同じ時間へ作成し得る。安定IDによるretry dedupとslot conflict対策は異なる。DST foldで01:30が二つのUTC時刻になり、gapで02:30が存在しない。Graph招待の自動送信、Google none同期warning、room拒否、calendar error、stale ETag、sync410、外部参加者への誤送信、タイムゾーン変換とall-day/recurrenceを失敗域に含める。

## AVAILABILITY_GATES
必要なapp導入、対象resourceの権限、OAuth方式/consent、tenant・region・plan、SDKとAPI versionを採用先ごとに確認します。rate/quota、通知設定と外部参加者を検証します。

## SECURITY_PRIVACY_AUDIT_OPERABILITY
actor/tenant/対象resourceと権限を再確認し、秘密鍵はserver側へ置きます。入力内の命令をtool authorityへ転用しません。承認内容・revision、provider receipt、結果readback、human handoffを別状態で監査可能にします。PII・保持/削除・DLP・外部転送・費用と運用閾値は組織の受入を要します。

## UNKNOWN_AND_STOP_CONDITION
旧Luna一意locator、orgのcalendar権限/委任/room policy、Google event ID衝突の分散条件、Graph transactionId有効範囲/保持、Cal.com exact header version/bypass権限/plan、実SDK pin、scope最小化、recurrence/all-dayとwebhook更新/失効、実二重予約防止/room accept、latency/費用と保持はUNKNOWN。
未認証、対象差分、scope不明、競合、実行結果不明では操作と確定通知を止めます。旧Luna成果の所在未確定を不存在へ読み替えません。

## SOURCES
EVIDENCE_AS_OF: 2026-10-04。資料はprovider/method/設定に限定して解釈します。
- [C1] Google — Freebusy: query: https://developers.google.com/workspace/calendar/api/v3/reference/freebusy/query
- [C2] Google — Get specific versions of resources: https://developers.google.com/workspace/calendar/api/guides/version-resources
- [C3] Google — Create events: https://developers.google.com/workspace/calendar/api/guides/create-events
- [C4] Google — Events: insert: https://developers.google.com/workspace/calendar/api/v3/reference/events/insert
- [C5] Google — Synchronize resources efficiently: https://developers.google.com/workspace/calendar/api/guides/sync
- [M1] Microsoft — calendar: getSchedule: https://learn.microsoft.com/en-us/graph/api/calendar-getschedule?view=graph-rest-1.0
- [M2] Microsoft — Create event: https://learn.microsoft.com/en-us/graph/api/user-post-events?view=graph-rest-1.0
- [B1] Cal.com — Create a booking: https://cal.com/docs/api-reference/v2/bookings/create-a-booking
- [L1] Work — workflow_contract_probe.py: results/EA-223-results.json

NEXT: /agent/start.json
STOP: This is a knowledge projection, not an execution order.