authn: remove the local agent-token plane The agent_token table and everything that minted, verified, listed or revoked it. Agent credentials are tokens.sr.ht working tokens now: signed, expiring, owned by a meta.sr.ht account and carrying grants, verified locally by sr-ht-ecore's bearer package. One door, and nothing behind it — a credential the instance plane refuses is refused, where it used to be offered to a second store that might say yes. DEPLOY GATE: do not deploy this until every agent configured with the shared secret holds a tokens.sr.ht token with spec:propose (spec:read to read). Migration 0005 drops the table, migrate-on-upgrade runs it on deploy, and deploying early locks out every agent at once — including the SSH push path. hooks/ no longer reads agent_token directly. The push path goes through the same authn.Resolver the HTTP surfaces use and demands spec:propose, because a push by an agent is a proposal by another transport. The refs rule and the provenance requirement are untouched on both counts: a universal grant is still only an agent to the receive path, and X-Agent / X-Agent-Session are still mandatory on every agent write. bearer.ErrNotOurs is now a permanent refusal. A meta.sr.ht PAT used to fall through to the local store and miss there; with no store to fall through to it earns a 401 rather than the 503 an unclassified error would. [tokens.sr.ht] origin becomes a required config key: with no issuer there is no credential to check, so the daemon fails startup instead of serving reads and refusing every agent write one request at a time. /tokens redirects to the daemon that issues (tokens SPEC ch. 7).
feat(cmd): agent tokens and host-side proposals get admin commands Two entry points were missing, and both left a deployment unable to do the thing it exists for. `token create|list|revoke` — db/ has had the whole agent-token lifecycle since Phase 1, but nothing called it: no CLI, no page. A fresh instance therefore had no credential for the agent write plane, which refuses an anonymous caller by design, and the only way to mint one was an operator hand-writing an INSERT with a sha256 hash. The plaintext is printed once and never logged; only its hash is stored, and the listing deliberately omits the hash so nobody mistakes it for the credential. `doc propose ~owner/space <file>...` — the two agent write surfaces are remote and so need a bearer token. When the operator and the documents are already on the host, that token is ceremony: the process can open Postgres and the bare repositories directly, so it constructs the agent principal itself rather than resolving one from an agent_token row. Provenance is not waived — --agent and --session are recorded exactly as a remote agent's are, so `git log` cannot tell the two apart, and neither can a reviewer. It calls service.Propose, so If-Match, the branch cut, the trailers and the auto-merge gate stay spelled once. Flags parse before, after and between the positionals: Go's flag package stops at the first non-flag, which would make `doc propose ~bigbes/rfcs spec.md --title x` drop --title and fail one layer down complaining about a missing title rather than the flag it ignored. spec-rsb, spec-ovo