Repository navigation
Feature request: shared Calendar update/delete and exact event readback for app agents #427
Description
The built-in local Calendar provides shareable calendar.events, calendar.add_event and calendar.notify. Its actual update/delete implementations exist, but their descriptors omit shareable; there is no exact event-by-ID get tool. This is a compatibility feature request if that sharing policy is intentional, not a claim that an app should bypass consent or directly call the owning service.
Scope: OctoSense 3a4d1e1e557750eac69b412f34d36021306ea654. Current main tools blob 243c04aa0b5d027fd0a79435c73b18d16ade8beb and service blob 33f1a25f12960fa9db39dfc82de631bc40666866 were rechecked and are unchanged at this observation.
Use case: an authorized third-party app Agent reads a scheduling message, creates a local event, then receives a changed/cancelled instruction and must update/remove the same event and reconcile the resulting state. We specifically mean OctoSense's built-in local Calendar store, not Google Calendar, EventKit or device_calendar.
Minimal executed reproduction:
- Load the original Calendar tools JSON into the original relay
Catalog::grant/entry/shareable/may_callmethods. - Explicitly grant
calendar.update_eventandcalendar.remove_eventtomuse-goals. Both still return false frommay_call, including with the developer flag; the owningos.calendarcaller succeeds.calendar.eventsis a positive shared control, and an ungranted caller is a negative control. This is descriptor policy, not missing account authorization. - Run the original Calendar service
handle: direct calls with app IDmuse-goalsare refused by the owner check.handle(os.calendar, "get", …)returns an unavailable-method error; it does not return precise absence. - A filtered
calendar.eventscall can return an empty list while the exact event still exists. The list caps at 200 and has no ID filter/pagination descriptor, so absence from that result is insufficient deletion/reconciliation proof.
Execution layer: isolated original Rust logic, not a native Shell session. The pure Calendar core/UI/cards are unchanged; only the Host registration/import adapter is removed for the small harness. Four production relay methods are copied byte-for-byte into a minimal Catalog data container. No fake model/Calendar implementation is used. Seven existing upstream Calendar tests and two boundary tests passed. No native relay/consent/GUI approval or real model turn was executed; this does not establish native full-chain success.
Proposed local patch (not installed, submitted or accepted):
- Mark existing
calendar.update_eventandcalendar.remove_eventshareable. Keep all per-tool grants, owning executor, account/admission/Agent consent and approval handling. Keep deleterisk: destructive,confirm: host, and existing updateexpectedstale-state check. - Add a read-only shareable
calendar.get_eventwith exactid, returning{found, event}. An absent ID returnsfound:false; corrupt/unreadable storage is an error, not false absence. Return the saved event for caller-side exact field comparison; do not claim delivery/synchronization. - Include regression tests for same-ID update/readback, stale update refusal, delete/readback absence, lookup beyond the list cap and corrupt-store error.
The final local patched pure-core suite passed 9 tests (7 unchanged + 2 new), and one relay policy test passed. One test of the proposed seven descriptors passed against the unmodified actual App Hub ToolManifest::validate. Patch application was checked on fixed original files. None of these tests modifies a Gate or proves signed installation/native approval/model choice. Upstream maintainers should review the sharing policy and native consent/confirmation behavior before adopting it.
Related: #267 introduced Mail/Calendar agent cards; #411 and #382 concern engine/system agent reach. Searches for calendar shareable, calendar update_event, calendar remove_event and calendar get_event were repeated. No exact competing shared-update/get proposal was found in those captured results; this is scoped search, not exhaustive proof. Please link an existing design if this owner-only policy is intentional.
No private events, contacts, credentials, provider keys or personal store contents are needed: all executed service data was synthetic in temporary directories. This request does not ask for reserved identity impersonation, a custom tool loop, or deletion/recreation as an update substitute.
Activity
9tuore commentedon Oct 9, 2026
Follow-up implementation proposal for #427: shared Calendar reconciliation and exact saved-event lookup
This revises the existing feature request, not a new issue. #427 is OPEN; the patch is not installed or accepted upstream. I am attaching the tested narrow implementation below for maintainer review; this is not a production integration claim.
The current
apps/AGENTS.mdexplicitly says thatcalendar.update_eventbelongs to Calendar's UI and own Agent, not new Mail/system grants. Accordingly, sharing update/delete is a requested policy change for maintainers to review, not a fix for an accidentally missing permission. No caller gets a tool merely by asking for it.The attached patch changes exactly two files at OctoSense
3a4d1e1e557750eac69b412f34d36021306ea654:apps/calendar/host-service/src/lib.rs: add read-only exact-IDget_eventand two regression tests. Unreadable/corrupt storage is an error; an absent ID returns{found:false,event:{}}instead of relying on a bounded list. Existing owner guard, stale-state update behavior and service registration remain unchanged.apps/calendar/bundle/tools.json: declarecalendar.get_event; propose sharing the existing update/delete tools. Delete keepsrisk: destructiveandconfirm: host. Per-tool grants, signed admission, account/Agent consent, owning executor and Host approval mechanisms remain required. This intentionally broadens the shareable surface if adopted.Validation actually run after normalizing the added Rust into readable blocks:
ToolManifest::validateThe harness removes only the Host registration/import adapter to avoid building a complete Shell. It is not a replacement runtime. Original and patched harness packages now have distinct Cargo names: a preliminary rerun omitted the two new test names despite exit 0, so that output was treated as insufficient and preserved; the corrected run explicitly lists both new tests. No omitted tests are counted as passes. Rustfmt is unavailable in the installed toolchain, so formatting was reviewed manually; no rustfmt success is claimed.
Unverified: complete official workspace/service build, native Shell cold-start, admission offer registration, real Agent consent/approval routing, actual model-selected calls, device/UI acceptance and real scheduling effects. No Gate changes, identity impersonation, secret/private event data, provider calls or production integration are included.
Official root/apps
AGENTS.mdrequirements were read at the fixed revision (no applicableCONTRIBUTING.mdor Calendar rustfmt configuration was found in its tree). Before adoption, maintainers must review the owner-only policy change, update the requesting app's grants and shipped admission offer, update English/Chinese documentation together, and run the documented workspace/service/Shell acceptance checks. Those integration/docs changes are intentionally outside this narrow two-file review patch. Full official CI/setup checks were not run by this isolated test task. Any public Git commit should use the public identity required by the root instructions.Patch SHA256:
e5545d88382f689faf99d050f0053c4bdf7a99486dc07384195314880f1a4d9b.The two affected files have the same Git blob IDs in official Desktop RC2 (
4ccf8e068399b1da139771a9ed94cef05fa6ae60) and the audited source revision. This was checked against the recursive Git trees; the tests remain bound to the audited revision above.Two-file patch (implementation and regression tests)
9tuore commentedon Oct 10, 2026
RC2 follow-up: real built-in Calendar service/UI validation and a fail-closed reconciliation patch
This is a follow-up to #427, not a new issue or a claim that Store-app Calendar admission is accepted. Calendar's owner-only update policy in apps/AGENTS.md remains authoritative until maintainers review a change.
Fixed sources: Desktop RC2 4ccf8e0; App Hub 95e4831afca7227b640f075b252c04355bb63865. This round compiled the byte-identical original Calendar with the actual prepared Appstore library (no HostService import shim). Seven original tests passed. Independent-process synthetic CRUD, same-ID updates, retry protection, stale-snapshot rejection and durable-file readback passed 11 checks. The unchanged Calendar Splash UI also passed actual visible creation, editing, restart restoration, two-click delete and restart-absence checks on an isolated reference card host. That reference uses --system only for the shipped os.calendar bundle, never for Muse; it is not a full installed Shell session.
A new fault reproduction shows original load(...).unwrap_or_default() treating malformed events.json as empty: add_event then overwrites the damaged file. This was reproduced only in a synthetic isolated directory; original bytes and failed tests are retained. A plain empty list must not establish absence under this fault.
The revised narrow patch below:
Final proposed service: 10 Rust tests passed (7 unchanged + 3 new), 20 independent-process/policy/schema checks and 7 precise-reconciliation/fault checks passed. The unchanged Calendar UI against the explicitly identified patched service passed 7 visible checks. Original and patched Host SHA/source identities are separated. Earlier fixture/signature/risk failures are preserved.
The unmodified App Hub API HostLimits::with_offered_tools positively resolves a narrowly offered calendar.events request while retaining app ID muse-goals; unoffered delete, digest tampering and missing shipping signatures remain refused. This is only a trusted-host policy/digest component test using an explicit unsigned developer fixture, not Store catalog admission or a Shell grant. #182 still covers the missing Store-app admission-offer path. No system identity impersonation, altered signature checks, budget increase, private event/mail data, provider call, second runtime or installed host replacement is included.
Still unverified/BLOCKED: official installed third-party Calendar relay, real model-selected tool calls and native host approval in a full Shell. The latest debug reference build also reproduced Muse startup's 64ms script time limit; that failure is preserved and not described as full-chain success.
Local reproducibility scripts and evidence are in the Muse development branch under official_muse/semifinal/tests and evidence/pivot-builtin-20261010; transport synchronization is being independently verified. No main/tag/release was changed. Patch SHA256: f40635f6373dd68ea295f5c1c0bf964c1f044ce14dc268df0931be8a809c2ad8.
Three-file RC2 review patch including regression tests
9tuore commentedon Oct 10, 2026
Full Desktop follow-up: owner UI CRUD now verified; Muse Agent admission remains separate
Fixed sources: Desktop RC2
4ccf8e068399b1da139771a9ed94cef05fa6ae60, App Hub95e4831afca7227b640f075b252c04355bb63865. This is an isolated companion proposal, not an accepted official release.We built the complete Intel Desktop with the pinned Octos kernel. Frozen Host SHA-256:
baf55d24c3245ca858e68b9776d7f470558d619c65edc4ce288ceb90c8a276b7. In the real built-in Calendar owner window, one specifically authorized synthetic event was created, edited without changing its ID, read back through the existing fixed-grant Systemcalendar.eventsroute, restored after actual process exit/restart, then deleted through the normal two-step owner UI. A second actual restart returned an empty bounded target-day list. All three owned processes exited normally; screenshots and replies are retained.These results do not establish Muse's own-ID Agent Relay, a model-selected tool call, native Person consent, exact-ID lookup, or authoritative deletion absence.
calendar.get_eventstill returnsnot_grantedfor the existing System grant. Owner success does not resolve #182 or the owner-only sharing policy discussed here.The remaining cold-registration issue in the existing read-only diagnostic entry was isolated: Calendar declarations were checked before its owner executor was lazily loaded. The narrow optional patch calls the existing admitted Calendar lazy loader before the read-only declaration filter. It adds no System grants or caller identity, and keeps risk, schema, admission and Relay checks. Three exact Shell tests and eight real diagnostic checks passed, including write refusal and unchanged get denial. This diagnostic proposal is separate from enabling third-party Calendar access.
Review artifacts at the exact development commit:
Could maintainers confirm the supported route for a third-party app to obtain an explicit Calendar read/write offer and precise reconciliation, while preserving the current owner policy, user consent and trusted approval requirements? We have not bypassed those requirements or represented this companion work as upstream acceptance.
9tuore commentedon Oct 13, 2026
RC6 follow-up: real third-party UI → native Calendar Relay → same-ID update/delete now exercised in a paired Host
This continues #427; it is a local host-extension contribution, not upstream acceptance or stock App Hub compatibility. The current official owner-only sharing policy still requires an upstream design decision.
Fixed base: Desktop
desktop-v0.1.0-rc.6, SDKf9f6fea90b52182790cb2641fd0145c425af4d84, App Hub386359153ed6377b5f047bd9ed2767a6a2ac2bc7, pinned Octos kernelb0759a57719fd35b3a2da1c5d969bc67538ed516(2.0.3-rc.13). The full Intel Host was rebuilt withapp-hub,octos-coreand launched through a normal macOS application. Source executable SHA-256 before local signing:f7a189ba0a182c46798415c73f7b66ec6e49307a280eba5612ae85205e30bca3.The working path is a narrow structured foreground adapter,
calendar_bridge.run/history, incrates/shell/src/host_tools/calendar_bridge.rs:muse-goalsUI sends{request_id, operation, args}. It cannot supply a claimed owner identity or arbitrary kernel RPC.os.calendar. The app is not relabelled asos.calendar.add:calendar.add_eventfollowed by exactcalendar.get_event.update: exact read →calendar.update_eventwith the original snapshot → exact read; preserve the same ID and original creation request ID.remove: exact read →calendar.remove_eventwith expected snapshot → exact read returningfound:false.historyreconciles the saved request instead of inventing a new mutation.source: host_calendar_relay, not a fabricated kernel Agent transcript. In this route the model extracts arguments; the structured adapter selects the CRUD sequence. This does not demonstrate unrestricted model-selected multi-tool execution.Actual GUI result on 2026-10-14, using one synthetic event:
found:falseThe same event ID was
ev-1791936336411-10536678661696203558747825447691337924throughout. Native approval was not replaced with a manufactured receipt. Raw screenshots, UI-operation timestamps, request journals, and failures are retained locally; personal profile/account data is not attached here.The exact-ID and fallible-read Calendar changes proposed earlier remain necessary: bounded
calendar.eventsabsence is not deletion proof, and corrupt storage must produce an error rather than be overwritten as an empty calendar. The local signed bundle is admitted only by the explicitly paired Host offer. The unchanged default Host gate still refuses these requested tools; we do not describe that as upstream admission success.A small reproducible protocol for callers is:
{"request_id":"example-create-01","operation":"add","args":{"request_id":"example-create-01","title":"Review","start":"2026-10-15T15:00","end":"2026-10-15T16:00","timezone":"Asia/Shanghai","location":"Online","notes":""}}Then reconcile that request using
calendar_bridge.history, and bind subsequent edits to the exact returned event. Never infer mutation success from model prose or a card merely appearing.Would upstream prefer formalizing a contained-app structured Calendar API, or expanding the existing Agent offer/Relay contract to support this exact reconciliation without an adapter? This report contributes the actual working boundary and failure handling for that decision. Separately, a scoped Shell Dock/work-area fix has been submitted because maximizing a contained app obscured the bottom controls during this same real acceptance run.