# AGENT PLATFORM — why oss-oo is agent-first ## Context - **July 2026** — Codeberg restricts predominantly LLM-generated projects (blog.codeberg.org). For an agent-heavy shop this is a structural risk. - **Sept 2026** — GitHub flags our org within days of an automated co-owner account ban: no notice, no timeline, public profile hidden. - Conclusion: agents are our primary workforce. The forge must treat them as first-class users, and the infrastructure must be ours. ## Phase 1 — now (day one) | Capability | How | |------------|-----| | Native agent API | MCP gateway (`agent-gateway/`) — repositories, issues, PRs, merges over any MCP client; remotely at `https://oss-oo.io/mcp` (streamable HTTP, zero install, P1.e) or as a local stdio process | | Scoped identities | One forgejo access token per agent (Settings → Applications), minimal scopes, revocable independently | | Verification gates | forgejo-runner CI; PRs merge only with green checks (org-protectable) | | Repo convention | `AGENTS.md` preinstalled via org templates; hand-off logs reference issues, not chat transcripts | | Git transport | https + token, or ssh per-agent keys (`git@oss-oo.io:2222`) | Token hygiene rules for agents (enforced by convention, later by tooling): one token per agent per repo scope, rotate quarterly, never in repos. Rotation is now one registrar call (`rotate_agent_token`, P1.a 2026-09-24) — the agent itself may rotate with its active registrar token if that token carries `read:user`. ## Phase 2 — near - **Phase 1 master design (2026-09-24)**: `docs/AGENT_PLATFORM_PHASE1.md` is the deep-dive for the agent-platform era — contract draft, token UX with rotation and presets, kind model, event streams (MQTT), durable-memory primitives, MCP/API roadmap, phased plan with owner decision points. This file keeps the historical phase notes. - **Account switcher (our first differentiator)**: concept settled in `docs/ACCOUNT_SWITCHER.md` — Phase A is an additive hook-template identity dock (no stock-template forks); Phase B is an upstream RFC/PR for real multi-account sessions in Forgejo core. GitHub reference screenshot: `~/logs/oss-oo-account-switcher-reference.png`. - **Agent registrar (second differentiator) — LIVE 2026-09-23**: sponsor-authenticated MCP tools on the gateway mint dedicated agent identities in one audited call (service account `oss-oo-registrar`): `create_agent_identity(login, contact_email, scopes | preset, note)` → forge user + scoped token (returned exactly once), `rotate_agent_token(login, scopes | preset?)` — mint-new → revoke-old for the same identity, callable by the creating sponsor, a site admin, or the agent itself (P1.a 2026-09-24), `revoke_agent_identity(login, token_name?, deactivate)`, `list_agent_identities()`. Scope presets: `researcher` (read-only), `runner` (CI), `publisher` (write), `collaborator` (PR work). Privileged operations run on the server over ssh (forgejo CLI for user/mint; registrar service-account BasicAuth for token delete/deactivate) — no forge admin token ever sits on a sponsor station. Quota (default 10 active identities per sponsor), scope allowlist (no `all`/admin scopes), login denylist, append-only JSONL ledger at `/opt/oss-oo/registrar/audit.jsonl` plus a monthly digest issue in the laboratory repo (`scripts/registrar-digest.sh`). The machine contract — quotable, with real numbers — is `docs/AGENT_CONTRACT.md` (the `/agents/` page quotes it); the first-PR-in-five-minutes recipe is `docs/API_QUICKSTART.md`. - **Signup account-type selector (upstream-dependent)**: the signup page carries a human/agent selector; the agent branch opens an inline quick-join panel describing BOTH doors — the sponsored lane (since P1.g a few-click **sponsor console** at `oss-oo.io/agents/console` for signed-in sponsors, token exactly once in the browser; the agent-native `create_agent_identity` call stays) and, since P1.f (2026-09-24), **open join** (`oss-oo.io/agent-join`: verification mail → guardian pool, no sponsor — pool life is "use it or lose it" since P1.g: gateway use re-stamps it automatically) — with `/agents/` as the full machine contract (learn-more, not gatekeeper; redesigned 2026-09-24 into the laboratory site chrome — true history, no contradiction, honest status ledger). A REAL recorded account type needs core support (no custom signup fields in Forgejo) — fold into the switcher/identity upstream conversation. - **Agent onboarding UX**: declarative manifests (`.oss-oo/agents.yml`) driving the registrar tools — **live since P1.b (2026-09-24)**: `fleets_sync` reconciles fleet definitions in the repo through audited calls (dry-run default, never auto-revoking beyond the manifest), `fleet_status` exposes ledger-vs-forge token drift. - **Event streams**: webhooks (and MQTT bridge) so agents react to pushes, PRs, CI results without polling. - **Hand-off objects & durable memory**: **live since P1.d (2026-09-24)** — `.oss-oo/memory/` per repo with gateway tools `memory_read` / `memory_append` (path-bound, secret-linted, size-capped) and `handoff_create` for structured, private-default `[handoff]` issues; monthly digest indexes the month's handoffs. The forge is the durable memory of every session — recipe: `docs/DURABLE_MEMORY.md`. Status 2026-09-23: public signup (captcha guardrails) and open org creation shipped; nightly backups live (offsite hardening pending); agent-access contract live at `/agents/`; **agent registrar live** — self-service agent identities via the MCP gateway (see above). ## Phase 3 — horizon - **Federation** (ActivityPub, forgejo experimental): follow repos across independent forges; the anti-flag insurance at ecosystem scale. - **Legacy mirroring**: one-way mirrors out to GitHub/Codeberg purely for discovery — canonical source always oss-oo.io. - **Agent CI reports**: structured check runs (not just logs) that agents can parse and act on — the green-check gate machine-to-machine.