bryan tan
Menu
Let’s talk
Back
PythonMCPsystemd

Personal assistant gateway

A personal assistant agent, and the mechanical guard that stops it doing what it was merely told not to.

  1. Ask it why the nightly run failed.

    Bills, alerts, a job that did not finish — it reads what it needs and reports back over Telegram. Checking is the job it is pointed at.

  2. It finds the thing and names it.

    A merge left two copies of the same function, so the imports break at collection. That is the half of the job worth having, and it is done without touching anything.

  3. Then it stops, because it has to.

    "Patch it" is a write, and the model does not decline it — it cannot reach it. The allow-list sits at the tool layer and fails closed, which is where the rule went after a live trial showed an earlier build routing around an instruction that merely asked.

  • 01 Built a personal executive-assistant agent on an open-source agent runtime — Telegram front end, MCP tool access, and a multi-provider fallback chain — with per-profile isolation so a separate family-facing assistant runs its own tool surface, voice and routing from the same gateway
  • 02 Replaced instruction-level agent safety with a fail-closed allow-list tool guard enforced at the tool layer, after a live trial showed the model routing around an earlier guard into a real checkout — the model can no longer reach a write path that policy has not granted
  • 03 Took the LLM off the execution path for dispatched work, routing it mechanically through a pre-gateway hook with a per-project lock and a concurrency cap, and launching each run as its own transient systemd unit after finding that a oneshot unit silently reaped every run it backgrounded
  • 04 Diagnosed an agent outage as a subscription-tier gate rather than exhausted quota — identical-size requests with neutral system prompts succeeded while the agent's own traffic was refused — and kept a second provider in the fallback chain so the assistant stays available when the shared pool is gated

Interface recreated with invented data — no production screenshot is published. Private system; walkthrough and code review available on request.

Role
Sole engineer
Timeline
2026 — ongoing
Stack
Python · MCP · Telegram · systemd