Teamregels en besluiten
Een besluit dat in de agentsessie van één persoon wordt genomen, blijft in die sessie. De volgende sessie, of de agent van een collega, hoort er nooit van. Teamregels geven besluiten een plek die elke agent leest: één repository voor de organisatie, één bestand per repository en een leestool.
Het is een afspraak plus een tool. Er hoeft niets aangezet te worden.
Waar regels staan
| Waar | Bestand | Geldt voor |
|---|---|---|
<org>/.rules (een repository in je organisatie) | RULES.md, DECISIONS.md | Elke repository van de organisatie |
| Elke repository | .forgejo/RULES.md, .forgejo/DECISIONS.md | Die repository |
Bestanden worden gelezen vanaf de standaardbranch van elke repository, dus een regel verandert via een pull request zoals elke andere wijziging, met review en geschiedenis.
Elke ## -kop begint één regel (of besluit); de kop is de naam ervan. Tekst vóór de eerste ## -kop blijft bewaard als inleiding.
# Rules
## Migrations
Every migration is expand-only. A column is dropped in a later release, never in the one that stops using it.
## Review
One approval from someone who did not write the change.Hoe regels van organisatie en repository samengaan
De regels van de organisatie en die van de repository worden samengevoegd op kop. Een repositoryregel met dezelfde kop als een organisatieregel vervangt die (hoofdletters en leestekens maken niet uit), zodat een repository één regel kan aanscherpen of versoepelen zonder de rest te kopiëren. Regels die alleen in de repository staan, komen na die van de organisatie.
<!-- web/.forgejo/RULES.md -->
## Review
Two approvals: this repository takes payments.get_team_rules: de tool die agents aanroepen
| MCP-tool | REST |
|---|---|
get_team_rules | GET /_app/api/v1/orgs/<org>/repos/<repo>/team-rules |
De tool geeft elke regel terug met de kind (rules of decisions), title, body, of hij van de organisatie of de repository komt (scope), of hij een organisatieregel vervangt (overrides_org) en de source (repository, pad en branch). files noemt elk bestand waarnaar is gezocht en of het is gevonden. digest verandert zodra de samengevoegde regels veranderen.
Je hebt findings:read (of orgs:read) nodig en leestoegang tot de repository. Wie de repository kan lezen maar de .rules-repository niet, krijgt alleen de regels van de repository; de bestanden van de organisatie staan dan vermeld als not_readable.
Regels zijn instructies aan je agents, met hetzelfde gewicht als de AGENTS.md van de repository, en iedereen met schrijftoegang tot de .rules-repository of de repository kan ze wijzigen. Geef schrijftoegang tot .rules dus met beleid. Een regel geeft nooit een recht.
Zet de regels in AGENTS.md of CLAUDE.md
Agents die een AGENTS.md- of CLAUDE.md-bestand lezen maar geen tools aanroepen, kunnen de regels in dat bestand meekrijgen. ?format=agents-md geeft een Markdown-blok tussen twee markeringen terug:
<!-- fremforge:team-rules:start -->
...
<!-- fremforge:team-rules:end -->Voor dezelfde regels is het blok byte voor byte gelijk. Om het toe te voegen of bij te werken, voer je dit uit vanuit de root van de repository (het vervangt alleen het blok en voegt het de eerste keer achteraan toe):
ORG=<org>; REPO=<repo>; FILE=AGENTS.md
curl -fsS -H "Authorization: Bearer $FREMFORGE_TOKEN" \
"https://frem.sh/_app/api/v1/orgs/$ORG/repos/$REPO/team-rules?format=agents-md" > .team-rules.md
touch "$FILE"
python3 - "$FILE" .team-rules.md <<'PY'
import sys
path, block = sys.argv[1], open(sys.argv[2]).read().strip()
cur = open(path).read()
s, e = '<!-- fremforge:team-rules:start -->', '<!-- fremforge:team-rules:end -->'
if s in cur and e in cur:
new = cur[:cur.index(s)] + block + cur[cur.index(e) + len(e):]
else:
new = cur.rstrip() + ('\n\n' if cur.strip() else '') + block + '\n'
open(path, 'w').write(new)
PY
rm .team-rules.mdCommit het resultaat in een pull request. Wil je in CI controleren of de kopie actueel is, vergelijk dan de digest: in het blok in het bestand met de header X-Fremforge-Rules-Digest van hetzelfde verzoek.
Wil je de regels liever niet in het bestand kopiëren, dan volstaat voor agents die tools kunnen aanroepen één regel:
At the start of a task, call get_team_rules for this repository and follow the rules it returns.Besluiten
DECISIONS.md heeft dezelfde vorm als RULES.md: één ## -kop per besluit. Schrijf het besluit op met de datum en de reden, zodat een agent die de vraag opnieuw tegenkomt haar niet nog een keer beslist:
## Kysely, not Drizzle (2026-10-01)
New database code uses Kysely. Drizzle stays only in the frozen migrations.