Felix is a personal AI agent that lives on its own machine and is reachable over chat. It holds a persistent memory of what it learns, loads written procedures the way a person reaches for a checklist, wakes itself on a schedule to do recurring work, and talks to real services through authenticated APIs.
Nothing here is a black box. Every layer is a file you can read or a service you can swap out.
Live in production, running unattended under a supervisor process. Every claim below comes from the running system, not a design doc.
Wakes itself in the early morning and covers the previously completed US session. The schedule is deliberately anchored after the closing bell, so every figure it reports is a final closing price rather than an intraday wiggle. Leads with the performance block.
Compares everything it tracks against the prior close, then filters the noise into tiers — a large move becomes a headline, a moderate one becomes a watch item, and anything smaller stays silent unless news explains a build-up.
For flagged items only, it pulls the one or two headlines most likely to explain the move and summarises them in its own words rather than pasting links. Anything on the always-cover list is included regardless of size.
Holds a target allocation in a config file and reports the gap between target and actual each morning, so rebalancing signals surface before they compound into a real overweight.
A weekly job reads its written policy, checks a live external signal, applies the gate, and writes draft instructions through the broker API. Its output is handed to the digest job, so the user gets one coherent message instead of two competing ones.
An escape hatch from the gate: a named trigger can bypass the normal condition, but only for one designated item, and only when that trigger is written into policy. Everything else still obeys the gate.
Two durable stores injected into every session — who the user is, and hard-won operational facts. It remembers that a particular auth flow has a short window and will fail if not completed promptly, so it doesn't relearn that lesson every week.
Procedural memory loaded only when relevant — scheduled digests, API integration guides, note-taking, email triage, version control, document generation (docx/pdf/xlsx/pptx), research, and delegation to external coding agents.
Both jobs check the market calendar before doing anything. On a holiday they return a literal suppression token and send nothing at all — no phantom "flat day" reports, no actions taken against a closed venue.
An ops skill encodes the failure modes already hit and fixed — a crash loop from a missing lockfile, OAuth token expiry, stalled job heartbeats — so a repeat incident is a lookup rather than a fresh debugging session.
Two scheduled jobs, deliberately sequenced. The weekly action job runs first and stores its result; the morning digest picks that result up and reports it — so one alert covers both the market and the decision.
Pull the live sentiment reading. Below the threshold, the period's action proceeds across every bucket. Above it, the action is skipped and the allocation rolls forward.
Per-bucket instructions are created as drafts through the broker API and stamped with which rule triggered them — gate passed, override applied, or skipped / rolled over. Nothing reaches the venue without a human.
Account state, session performance and day P/L in base currency, moves versus prior close, the news behind the flags, upcoming dates inside the next week, allocation drift — and the week's action outcome folded in.
The weekend run covers the final session of the trading week. The non-trading day is simply not scheduled.
Venue closed → both jobs suppress themselves entirely rather than sending a hollow report.
Behavioural rules live in a plain markdown policy document — human-readable, versioned, and authoritative. The skill only operationalises it, which means changing what the agent does is editing a text file rather than rewriting an agent.
Capital is only committed when an external reading sits below a declared threshold. The gate doesn't try to predict anything — it just refuses to act in one specific condition.
A skipped period doesn't lose its allocation; the amount compounds into the next decision point. Skipping is deferral, not forfeiture.
A documented catalyst can bypass the gate for one designated item only. The exception is narrow, written down, and cannot leak into the other buckets.
If the condition never clears, the accumulated amount is held rather than force-deployed to hit an arbitrary target. No pressure to spend.
| Horizon | Long-term; built to be boring and repeatable |
| Cadence | Fixed periodic tranches, not discretionary trades |
| Entry gate | External sentiment threshold |
| Gate fails | Skip, roll forward to the next decision point |
| Period ends gated | Hold — never force an action |
| Override | Documented catalyst, single item only |
| Audit trail | Every decision stamped with the rule that fired |
A fixed schedule deployed blindly acts the same at froth as it does at fear. Gating on sentiment isn't an attempt to time anything — it keeps dry powder for the periods when everything is on sale. And because a skipped amount rolls forward rather than expiring, a deferred period isn't lost capital, just a later entry. Over a long horizon the only difference is more shares for the same money.
Ranked by how much manual work each item removes. Nothing here is committed — it's a working list.
| Agent | Hermes Agent by Nous Research |
| Runtime | Self-hosted, supervisor-managed, 24/7 |
| Model | deepseek-flash |
| Integrations | 3 MCP servers, HTTP and stdio |
| Auth | OAuth for the live account, API keys for data |
| Scheduling | Cron with a heartbeat watchdog |
| Delivery | Chat, with message-length-aware chunking |
| Memory | Markdown stores + 64 lazy-loaded skills |
Draft-only actions. Holiday suppression. A sentiment gate. Rollover instead of forced deployment. Every decision path records which rule fired — so any outcome can be traced back to the policy that produced it.