Giving an Agent Write Access to My Calendar Without Giving It Delete
๐ Topic
Hermes needed to write calendar events on my behalf. Instead of pointing it at my real calendar with full write access, I scoped the capability down to a dedicated calendar it owns, banned deletion outright, and used a tombstone pattern for anything that needs to go away.
๐ฏ Goal
Give an agent real, useful calendar-write capability without letting a bug, a bad model turn, or a misinterpreted instruction destroy data on the calendar I actually rely on.
๐ What I Did
I scoped the capability to its blast radius before turning it on, and made the scope decision explicit rather than implicit.
Main areas covered:
- decided Hermes writes only to a dedicated "Hermes" calendar, not to my primary calendar โ a new event created by the agent lands somewhere I own and can review, isolated from everything else on my schedule
- decided the agent can mark-outdated only on events it created itself, never delete โ and never touch anything it didn't create, on any calendar
- implemented mark-outdated as a tombstone: an event that's no longer valid gets flagged as outdated rather than removed, so there's always a record of what the agent decided was stale and why, instead of a silent gap where an event used to be
- put the enforcement in the executable itself, not in the persona instructions โ the constraint holds even if the model's read of its own instructions drifts, because the code path simply doesn't expose a delete or cross-calendar-write capability to call
- documented the two scope decisions and the reasoning explicitly in a handoff, including why enforcement lives in code rather than in the natural-language instruction file โ a decision worth being able to point back to later, not just something implied by the diff
๐ Key Cybersecurity Connections
This is blast-radius containment applied to a personal calendar: instead of asking "can I fully trust this agent with delete access to my real calendar," the actual question was "what's the smallest capability that still does the useful thing" โ and the answer was write-only, to a dedicated calendar, no deletes, ever. That reframes the trust question from "how much do I trust this system" (which changes over time, in both directions) to "how much could a mistake actually cost" (which is now bounded regardless of how much I trust the system on any given day).
Enforcing the constraint in code rather than in the instruction file is the same lesson as this month's earlier "narration is not a command" bug: a natural-language instruction is a request the model can misread, drift from, or have overridden by a cleverly-worded input; a capability that's structurally absent from the executable can't be talked around. The tombstone pattern is the audit-trail half of the same discipline โ even the allowed action (marking outdated) leaves evidence instead of erasing it.
๐ Investigation Questions
- Does the agent write to a dedicated, isolated calendar, or directly to the calendar I actually rely on?
- Is delete capability exposed anywhere in the executable, even if the instructions say not to use it?
- Does "mark outdated" leave a record, or does it behave like a silent delete under a different name?
- Is the scope decision documented with its reasoning, or only implicit in what the code happens to do?
- Would this constraint survive a persona or instruction-file rewrite, since it lives in code rather than in prose?
๐จ Detection Opportunities
Checks for an agent with calendar (or similarly destructive-capable) write access:
- agent-originated writes landing on a primary or shared calendar instead of an isolated, dedicated one
- delete capability reachable in code regardless of what the instructions claim
- a "mark outdated" or similar soft-delete action that doesn't actually preserve a record
- a capability scope decision with no documented reasoning to audit later
- enforcement relying solely on natural-language instructions rather than structural code constraints
Example:
project=hermes-calendar-write
signal=agent_write_capability_reaches_primary_calendar
risk_area=blast_radius_of_agent_originated_data_writes
triage=confirm_writes_isolated_to_dedicated_calendar_delete_unreachable_in_code
๐งญ MITRE ATT&CK Techniques
No direct mapping claimed. This is a data-integrity and least-privilege design pattern for an autonomous agent's write capability, not an adversary technique.
๐บ Visual Investigation Diagram
Hermes needs calendar write capability
โ
Question: full access to primary calendar, or scoped?
โ
Decision: dedicated "Hermes" calendar only
โ
Decision: mark-outdated, never delete, only on own events
โ
Enforcement lives in the executable, not the instruction file
โ
Tombstone: outdated events flagged, never erased
โ
Blast radius bounded regardless of model behavior on any given day
โ Challenges
The tempting shortcut was giving the agent write access to the real calendar directly โ it's less setup, and "it'll probably behave" felt reasonable given how much other hardening had already gone into the system this month. Choosing the dedicated-calendar-plus-tombstone pattern instead meant more plumbing for a feature that, most days, will never come close to needing the isolation it provides.
๐ What I Learned
I learned that the right question for a new destructive-adjacent capability isn't "do I trust this system enough," it's "what's the actual cost if I'm wrong about that trust" โ and that answering the second question with architecture (isolation, no delete, tombstones) makes the first question matter much less.
โก Next Steps
- Periodically review the dedicated Hermes calendar for events that should be reconciled onto the primary one
- Audit other agent-writable data stores (contacts, reminders) for the same dedicated-store-plus-tombstone pattern
- Confirm the tombstone flag is actually surfaced somewhere I'd see it, not just stored and forgotten
- Extend the "enforcement in code, not instructions" principle as a standing checklist item for future write-capable features
๐ง Reflection
This is the kind of security decision that produces literally nothing to show for it on a normal day โ no incident, no near-miss, no story. That's exactly the point: the cost of being wrong about how much to trust the system is now bounded by design, not by how careful the model happens to be that day.
๐งฉ Lessons Learned
What worked
Scoping writes to a dedicated calendar, banning delete outright, and enforcing both in code rather than in the instruction file.
What broke
Nothing yet โ this was proactive containment before the capability shipped, not a response to an incident.
Why it mattered
An agent with real write access to a personal calendar is one misread instruction away from real data loss if the capability isn't structurally bounded.
Fix / takeaway
Isolate agent-originated writes to a dedicated store, forbid deletion in favor of tombstoning, and enforce the constraint where it can't be talked around โ in code, not in prose.
๐ Skill Progression Context
This supports my cybersecurity progression because blast-radius containment, least-privilege scoping of write capabilities, and structural (rather than policy-only) enforcement are core data-integrity and access-control disciplines for any system with autonomous write access to real user data.
๐ TL;DR
Hermes can write to my calendar now โ just not my real one, and never with a delete button, only a tombstone.