Anyone DMing @Larry in Slack โ staff, you. Routed to slack-dm-handler.
@Larry in any channel he's in (#larry-page is the home). Routed to slack-mention-handler.
New email to larry@formia.co.nz. Pub/Sub push โ inbox-triage on each message.
New hire submits at welcome.formia.co.nz/<token> โ Larry notified, manager DM'd.
Pulse survey (4pm weekdays), weekly digests, daily project sweep, monthly bills.
You hitting a button on the dashboard โ /tasks page, individual run-now buttons.
Slack interactive buttons (approve/decline), Gmail Pub/Sub. All auth-verified.
One run can enqueue another โ e.g. inbox-triage of an invoice โ file follow-up.
- OnboardingCreate record ยท email portal link ยท track signed contracts ยท digital sign IR330/KS2 ยท iPayroll-ready PDF
- Pulse survey2 staff/weekday rotation ยท question bank ยท sentiment tracking ยท weekly digest
- Leave managementRequest, approve, decline ยท balance tracking ยท iPayroll alignment
- Tool allowancePer-staff balance, request log, top-ups
- Vehicle remindersPer-vehicle WOF/REGO/service due dates
- H&S complianceToolbox talks, induction tracking, cert expiry
- Incident reportingLog, notify Mark + Ben, cross-link to leave if time-off mentioned
- Drive search + readFind files by path or query ยท extract text from PDFs (with OCR) and Word docs ยท parse spreadsheets
- Drive write + editUpload new files ยท update existing ยท find/replace in .docx ยท set/append cells in .xlsx
- Gmail triageEvery inbound classified โ invoice / supplier / staff / for-rohan / junk / etc.
- Gmail send + replyAuto-replies on internal/known-thread mail ยท proposes on external first-contact
- File-as-you-goInvoices โ /finance/incoming/YYYY-MM/ ยท contracts โ staff HR folders ยท etc.
- Semantic memoryPersistent facts about people, suppliers, decisions, preferences. Searchable across runs.
- Episodic eventsEvery action Larry takes is logged with trace + payload. Full audit history.
- ProjectsOpen follow-ups with owner + next-review date. Daily sweep nudges overdue ones.
- EntitiesStaff, suppliers, customers, vehicles, properties โ single source of truth.
- Approval queueHigh-risk actions (external email, deletions) wait for your tap-to-approve.
- Kill switchesPer-tool toggles in /settings โ flip e.g. xero-write off if you want a freeze.
- HR access tiersStaff can see own data only ยท managers see their company ยท admin (you) sees all.
- Audit trailEvery event in /events. Every run in /runs. Every memory has provenance.
- Approval policyPer-tool YAML rules (config/approval-policy.yaml). Predicates checkable in code.
- 1YouDM Larry: 'Tony Wall starts Tuesday at BWJ as salesperson, Ben's his manager'
- 2Larryonboarding.create โ seeds 32-item role-aware checklist
- 3Larryonboarding.sendWelcomeEmail โ emails Tony from larry@ with magic link
- 4TonyOpens welcome.formia.co.nz/<token> on his phone, fills paperwork, digitally signs
- 5LarryAuto-DMs you + Ben on Slack with summary + still-needed list
- 6YouOpen /onboardings/<id>, click Download PDF, paste fields into iPayroll
- 7BenWalks Tony through H&S induction items on day one โ tick off as done
- 8Larry30 + 90 day review reminders fire automatically as Slack DMs
- 1GmailPub/Sub push fires the moment anything lands
- 2WebhookFilters out obvious noise (no-reply senders, Slack notification mail, marketing) โ events.email.skipped
- 3Larryinbox-triage runs on the rest โ reads, classifies, retrieves relevant memory
- 4LarryActs: file invoice / reply / file to Drive / propose for approval / DM you on Slack
- 5LarryAlways archives + marks read after acting. NEVER leaves anything sitting in his inbox.
- 1AnyoneDMs @Larry in Slack โ staff with a leave request, you with an instruction, etc.
- 2WebhookVerifies HMAC signature, checks recent-history dedup, enqueues a run
- 3Larryslack-dm-handler โ checks access tier, reads relevant skill (leave / incident / etc.)
- 4LarryActs via the right tools โ capture data, log to DB, file artefacts in Drive
- 5LarryReplies in the same DM with what was done + proof links
- 1StaffDMs Larry: 'I cut my hand on the saw', 'There was a near-miss with the forklift'
- 2Larryincident.log โ row in incidents table, visible on /incidents immediately
- 3LarryDMs Mark Bidlake (H&S lead) every incident ยท DMs you + Mark for injuries ยท flags WorkSafe-notifiable
- 4LarryIf description mentions time off ('off for 1 week') โ auto-prompted to also leave.request
- 1CronMon-Fri 4pm โ pulse-survey-afternoon fires
- 2LarryPicks 2 most-overdue staff, picks each a question they haven't seen recently
- 3LarryDMs each privately. Records pulse.question_sent event.
- 4StaffReplies in their DM (or doesn't โ that's logged too)
- 5Larryslack-dm-handler matches the reply via pulse.recordResponse, writes pulse_responses row
- 1LarryTries to do something that policy says 'propose, don't auto-run' (e.g. send external email)
- 2Approval policyPer-tool rules in config/approval-policy.yaml decide auto vs propose vs forbidden
- 3Larryaction.propose creates a row in /approvals with the payload + rationale
- 4SlackLarry DMs you a card โ Approve / Decline buttons inline
- 5YouTap Approve โ Larry executes the proposed action and reports back. Tap Decline โ Larry acknowledges.
- 1AnythingA tool errors mid-run ยท Anthropic times out ยท Larry's code throws ยท etc.
- 2RunnerCatches the error, sets task_run.status = 'failed', logs run.failed event
- 3LarryIf trigger was Slack โ posts 'on a break' fallback to original channel (you never sit in silence)
- 4alertRohanDMs you with: error message, trace id, who triggered it, link to /runs/<id>
- 5YouOpen the run, see exact tool calls + responses. Fix root cause if needed.
Every Slack-triggered run MUST end with a user-visible reply. If the model tries to silently exit, Larry posts a fallback message. You never sit in silence after a DM.
If the runner crashes BEFORE creating a task_runs row (e.g. schema migration race), the queue handler posts an 'on a break' message to the trigger channel + DMs you the error.
Every failed run DMs you in Slack: error class, trace id, triggering user, HTTP code, link to /runs/<id> for full call log. No silent failures.
High-risk actions (external email, deletions, irreversible writes) are proposed not executed. You tap Approve in Slack to action them. Auto-expire 72h with a nudge.
Every 'I'll get back to you on this' creates a project.upsert row with a next-review date. Daily project sweep DMs you on overdue items so nothing stalls forever.
Any task_run sitting in 'running' state >20 min gets auto-marked failed (probably crashed mid-execution). Runs every drain cycle so the dashboard never lies.
Tools detect when their work implies another workflow โ e.g. incident.log spotting 'off for a week' forces a leave.request in the same run. Documented in house-rules ยง4.
Every action is an event row (kind, payload, traceId, taskRunId). Every run is a task_runs row with cost + tool calls + summary. Drillable from /runs and /events.
House rule: Larry can't say 'done' without proof โ every claim cites the receipt (Drive link, Slack ts, DB row id, gmail message id). Catches hallucinated 'I filed it'.
Larry's email inbox is internal โ you never read it. Anything needing your attention appears as a Slack DM with summary + email link + recommended action.