Teamregler och beslut
Ett beslut som fattas i en persons agentsession stannar i den sessionen. Nästa session, eller en kollegas agent, får aldrig veta om det. Teamregler ger besluten ett hem som varje agent läser: ett repo för organisationen, en fil per repo och ett verktyg för att läsa dem.
Det är en konvention plus ett verktyg. Det finns inget att slå på.
Var reglerna finns
| Var | Fil | Gäller för |
|---|---|---|
<org>/.rules (ett repo i din organisation) | RULES.md, DECISIONS.md | Varje repo i organisationen |
| Valfritt repo | .forgejo/RULES.md, .forgejo/DECISIONS.md | Det repot |
Filerna läses från varje repos standardbranch, så en regel ändras genom en pull request precis som alla andra ändringar, med granskning och historik.
Varje ## -rubrik inleder en regel (eller ett beslut), och rubriken namnger den. Text före den första ## -rubriken behålls som inledning.
# 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.Hur organisationens och repots regler kombineras
Organisationens regler och repots slås ihop per rubrik. En regel i repot med samma rubrik som en regel i organisationen ersätter den (versaler och skiljetecken spelar ingen roll), så ett repo kan skärpa eller lätta på en enskild regel utan att kopiera resten. Regler som bara finns i repot kommer efter organisationens.
<!-- web/.forgejo/RULES.md -->
## Review
Two approvals: this repository takes payments.get_team_rules: verktyget som agenterna anropar
| MCP-verktyg | REST |
|---|---|
get_team_rules | GET /_app/api/v1/orgs/<org>/repos/<repo>/team-rules |
Det returnerar varje regel med dess kind (rules eller decisions), title, body, om den kom från organisationen eller repot (scope), om den ersatte en regel i organisationen (overrides_org) och dess source (repo, sökväg och branch). files listar varje fil som söktes och om den hittades. digest ändras så fort de sammanslagna reglerna ändras.
Det kräver findings:read (eller orgs:read) och läsåtkomst till repot. Den som kan läsa repot men inte .rules-repot får bara repots regler, och organisationens filer listas då som not_readable.
Regler är instruktioner till dina agenter, med samma tyngd som repots AGENTS.md, och alla med skrivåtkomst till .rules-repot eller till repot kan ändra dem. Dela ut skrivåtkomst till .rules med det i åtanke. En regel ger aldrig någon behörighet.
Lägg reglerna i AGENTS.md eller CLAUDE.md
Agenter som läser en AGENTS.md- eller CLAUDE.md-fil men inte anropar verktyg kan bära reglerna i den filen. ?format=agents-md returnerar ett Markdown-block mellan två markörer:
<!-- fremforge:team-rules:start -->
...
<!-- fremforge:team-rules:end -->Blocket består av samma byte för samma regler. Kör det här från repots rot för att lägga till blocket eller uppdatera det (det ersätter bara blocket och lägger till det i slutet första gången):
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.mdCommitta resultatet i en pull request. Om du vill kontrollera i CI att kopian är aktuell jämför du digest: i filens block med headern X-Fremforge-Rules-Digest i svaret på samma begäran.
Om du hellre inte kopierar in reglerna i filen räcker det med en rad för agenter som kan anropa verktyg:
At the start of a task, call get_team_rules for this repository and follow the rules it returns.Beslut
DECISIONS.md har samma form som RULES.md: en ## -rubrik per beslut. Skriv beslutet, datumet och varför, så att en agent som stöter på frågan igen inte fattar beslutet en gång till:
## Kysely, not Drizzle (2026-10-01)
New database code uses Kysely. Drizzle stays only in the frozen migrations.