RUNBOOK-VERON: deploy uses fetch + merge --ff-only and api-only rebuilds (the old text used git pull, contradicting its own warning); new sections for host timers, CI (6 runners x1, windyadmin-scoped, 90m ceiling, queue truth in the gitea DB, logs in R2), sign-in posture and break-glass; standing checkout = OC5. AGENTS.md no longer says GENESIS / no code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3.6 KiB
AGENTS.md — windy-git
Read this before touching anything. Then read DNA_STRAND_MASTER_PLAN.md, which is the source of truth.
Current state (2026-09-23)
LIVE on Veron 1 — app.windygit.com (Gitea 1.24.6, Windy SSO only),
api.windygit.com (our plane: humans via hub JWKS, agents via Eternitas EPT),
models.windygit.com. Strands G0–G5, G7, G11 done; see the plan for the rest.
It is also the permanent CI for the private platform repos (GitHub Actions
cannot run on them): scripts/sync_from_github.sh + scripts/pr_status_bridge.py,
onboarding in docs/CUTOVER.md, operations in docs/RUNBOOK-VERON.md.
Standing dev checkout: OC5 ~/windy-git. Deploy copy: Veron /srv/windygit/src.
The rules that will get you reverted if you break them
- Do not fork Gitea. (D-2 / I-1.) Our code calls Gitea's REST API from our own service. Any patch to Gitea source goes in
patches/as a numbered rebasable diff with a one-line justification, andmake checkfails past 3 files without an ADR. - Never say "a Git." (D-9 / I-9.) Git is not a countable noun. A moment in time is a commit; user-facing, it is a version or save point.
make checkgreps for violations. - Never touch Kit 0. (D-4 / §7.8.) Not in v0, not in v1. Only Grant may overturn a never.
- No Stripe. No prices. No checkout. (I-11.) This cell emits usage events; the Windy Cloud kernel owns the ladder.
- Never claim live while a provider is mock. (I-8.) Every seam fails closed.
/health/fullreports what it can prove and nothing more. repo_typeexists from migration 001. (I-7.) Never inferred, never defaulted at read time, never retrofitted.- Git objects on local disk, heavy bytes on R2. Never the reverse. (I-3.)
/versionmust be honest. (I-12.) The commit sha is baked at image build; a runtimeCOMMIT_SHAenv var is ignored with a warning. Nine of twelve sibling services cannot name their own commit — we will not be the tenth.- Every invariant has a named test. Cite the invariant in the test file header.
- An unverifiable codon is not done. Every codon in the plan has an acceptance criterion. Finished-looking code without its acceptance test is not finished.
House conventions
- Python 3.12 · FastAPI · pydantic-settings · Postgres schema
windgit· own alembic, every migration with a tested downgrade. make check=ruff+mypy+pytest+ membrane-drift + capabilities-drift +/versionhonesty + vocabulary audit. The local gate IS the merge gate.- Errors are 4-field repair pointers:
{code, speak, machine_cause, remediation_tool}. No exceptions, including validation errors. - Every tool response carries
state_proof+next_actions. - Telemetry
actor_typecomes from the enum{human, agent, system}.'service'is not legal — it 422s and silently drops the whole batch. A sibling service is losing telemetry to exactly this today. - Runner labels are explicit and pinned:
[self-hosted, linux, x64]orveron-1.ubuntu-latestis banned — no runner here has it, so the job queues forever.
Membrane
Calls out, calls in, and events are enumerated in invariant I-2 and mirrored in docs/MEMBRANE.v1.md. Adding a call means editing I-2 first, then the doc, then the code. Not the other way round.
What needs Grant
See §7 of the plan. Short version: opening to any non-Grant user · any pricing · advancing off the GitHub mirror · marketing provenance before the upstream integrity fix lands · a hard fork of Gitea · the marketing site · enabling repo_type=model in production · anything involving Kit 0.