# AGENTS.md — Teahub v1 (Green Tea) You are on **prod**: https://teahub.xyz, a Gitea on Fly (app `green-tea`). Everything here is the factory's own record; nothing here is scaffolding from before 2026-10-14. ``` you (any agent) ──MCP──▶ mcp.teahub.xyz ──as the signed-in user──▶ teahub.xyz (Gitea) │ login: GitHub (now), nostr (next) ├── teahubxyz/teahub the spine (this repo) ├── teahubxyz/time Time: the clock (Gitea Actions on the Fly runner) └── Time = the automation layer. It lives here, on prod (teahubxyz/time); the GitHub copy is an archived proof of concept. Time acts as the Gitea user `time` (its own token, TIME_TOKEN) to open and merge PRs; everything else it does as the Actions identity (`gitea-actions`), and every write it makes is a git push. Seats: Claude (haiku / sonnet / opus / fable, ANTHROPIC_API_KEY, user-level secret) by default; Venice wired but idle. Spend: every model call is booked to time/ledger/.jsonl; TIME_DAILY_USD=5, TIME_MONTHLY_USD=100 stop the clock and open an `andon` issue. No model decides whether to spend. hb-5 (the Mac) is NOT part of prod: it is the operator's playground and the old instance (matcha.teahub.xyz). Boring (ops MCP) lives on the Mac and may reach prod as a client; prod never depends on it. ``` ## Moves - Read first: this file, `docs/decisions.md` (why things are the way they are), `docs/rebuild.md` (what it took). - Work is an issue with a `DONE:` line. Open it, do it, receipt it on the issue, close it. Label it `ready` and Time dispatches it to a seat; label it `spec` and Time splits it into cards. - You act as yourself (Time too: it is the `time` user). There is no shared service token on prod. If you can't do something, your Gitea permissions are the reason; ask the owner (`teahubxyz`) on the issue. - Porting from the old instance: only when a card needs it, only after reading it, one piece per commit, and a line in `docs/rebuild.md` saying what it took. - Secrets: prod holds Gitea's own keys, the GitHub OAuth client, the MCP's OAuth client, and the seat keys listed in `docs/decisions.md`. Nothing else. Do not add one without a decision there. A temporary admin token is deleted (sqlite3 on the Fly box) and the deletion checked before you write that it's gone. - Be boring by default; get clever only on an ANDON. Deterministic scripts before cheap inference before expensive inference. - Cost ladder for seats: Luna = haiku, Sol = sonnet, Astra = opus. Fable is for the operator's own maths, not the factory. ## Where things are - MCP source: `mcp/` (FastMCP, deploy with `fly deploy`). - Decisions: `docs/decisions.md` (append-only, dated). - Rebuild log: `docs/rebuild.md`. - Skills: `.agents/skills/` (vendored; see its README). Marketing/launch work: read `product-marketing` first, then `launch` / `social` / `copywriting`; `brag-slim` for launch videos; `marketing-loops` for anything recurring. - Time's engine: `teahubxyz/time` `.github/time/` (`time.py` the clock, `venture.py` the venture loop, `astra.py` the daily planner, `seats.json` the seats).