Natural-language M365 without lowering IT's guard
OpenM365 gives non-technical users natural-language, LLM-driven access to enterprise Microsoft 365 — email, calendar, OneDrive, SharePoint, Teams, contacts, tasks, groups — by making the safe path the only path an agent can take.
The promise only counts if the reach is real. So how far does it already go?
This isn't a concept slide. OpenM365 ships domain modules for mail, calendar, OneDrive, SharePoint, Teams, contacts, tasks and groups — the surfaces enterprise work actually happens on.
Real reach into M365. Which is exactly what makes raw access dangerous.
One bad call could delete a mailbox or leak confidential files — and IT cannot govern what has no safety envelope. That's why naive access is unacceptable to the enterprise.
So OpenM365 never exposes raw Graph. Every ask enters through one door.
A single mutating call to Graph could delete a mailbox that was never meant to be touched.
Without controls, an agent could exfiltrate sensitivity-labelled files or PII outside the tenant.
IT can't approve what has no safety envelope — so the answer has been to say no.
Plain-English asks are classified by an LLM into one of 6 action categories, then planned into concrete steps — turning natural language into a governable, step-shaped action.
Once an ask is steps, every step can be judged. That's where the hooks come in.
Each step is evaluated by 8 hooks in fixed order #1–#8. The engine is fail-closed: any single DENY — or any hook exception, caught and treated as a DENY vote — blocks the whole action.
That governs actions before they run. But what happens when one still goes wrong?
Before destructive operations, CheckpointManager takes a filesystem snapshot of the workspace. Every step can carry a compensating undo, run in reverse order on failure — so a mistake can be walked back.
Snapshot plus reverse-order undo keeps the safe path safe even when an action fails.
CheckpointManager creates a filesystem snapshot of workspace directories before destructive operations (EXE-004).
On failure, PlanRunner replays each completed step's compensating rollback action in reverse order.
DryRunClient intercepts POST/PUT/PATCH/DELETE and passes GET through, so writes can be previewed before executing.
Un-bypassable by construction. And the same discipline built OpenM365 itself.
1,965 of 1,992 commits came from the Amplifier bot over roughly 5 weeks, with 236 features tracked complete and project status healthy. The discipline that makes agents safe in M365 also built the system.
Safe agentic access to the enterprise — and a proof point of how it gets built.
Data as of: last commit 2026-04-06. All figures verified against the openm365 repository; fact-check verdict: pass.
Feature status: constitutional hooks, rollback/checkpointing, intent kernel, dry-run, approval workflow, 8 Graph surfaces and Entra/OAuth all COMPLETE. Local/COM offline backend is in backlog (status: ready), not yet shipped.
Commands run:
git rev-list --count HEAD → 1,992 commits; git log --reverse --format='%ai' → 2026-03-02 to 2026-04-06 (~5 weeks)git log --format='%an <%ae>' | sort | uniq -c | sort -rn → 1,965 Amplifier bot / 27 openm365 Monitorfind src -name '*.py' | xargs wc -l | tail -1 → 28,781 lines; find src -name '*.py' | wc -l → 154 filesfind tests -name 'test_*.py' | wc -l → 200; grep -rh 'def test_' tests/ | wc -l → 4,639ls -1 src/openm365/graph/*.py → mail, calendar, onedrive, sharepoint, teams, contacts, tasks, groups (8 surfaces)for f in ...; do grep -A3 'def order' src/openm365/safety/hooks/$f.py; done → hooks ordered #1–#8sed -n '1,20p' src/openm365/executor/runner.py → “There is no mode that omits hooks. There is no fast path around safety.”sed -n '14,30p' src/openm365/intent/models.py → 6 intent categories (QUERY/CREATE/MODIFY/DELETE/DEPLOY/ADMIN)grep -c '^- ' STATE.yaml → 236 completed features; grep 'status: healthy' STATE.yamlGaps: Test PASS status is NOT claimed — only test counts are grounded (pytest --co produced collection errors in this environment, likely missing runtime deps / M365 credentials). Bulk-delete limits are a policy-configurable goal, not a shipped constant. The local/COM offline backend is not yet implemented.
Primary contributors: Amplifier autonomous dev-machine bot (1,965 commits, ~99%); openm365 Monitor bot (27 commits).