.wikitool-remotes.json existiert in diesem Checkout nicht. tools/chemenu/commands/git_publish.py:101 dokumentiert das Verhalten ausdrücklich: absent → unrestricted. Der Publish-Remote-Gate ist damit nicht scharf.
ENVIRONMENT.md beschreibt origin dagegen als „einziges Publish-Ziel", und AGENTS.md führt
den Gate unter den drei in Code erzwungenen Grenzen. Eine Regel, die dokumentiert ist und nicht
greift, ist schlechter als eine fehlende: sie erzeugt genau das Vertrauen, das sie nicht
verdient.
Warum das jetzt zählt
Solange dies eine Instanz mit einem einzigen, öffentlichen Remote ist, ist der Schaden begrenzt.
Mit der privaten Arbeitsinstanz aus #30 — Clone mit zusätzlichem upstream-Remote — entsteht
genau das Szenario, gegen das der Gate gebaut wurde: privater Korpus, der auf ein öffentliches
Upstream gepusht wird und von dort nicht zurückgeholt werden kann.
instructions/private-instance.md Schritt 5 setzt die Datei als Teil der Einrichtung. Der
Zeitpunkt, sie hier zu haben, ist vor dem Klonen — sonst erbt die private Instanz einen
Checkout, dessen Sicherung nie geprüft wurde.
prio/1 weil size/XS: der Aufwand ist eine kleine Datei, der vermiedene Schaden ist
irreversibel und steht unmittelbar bevor. Herabstufen, falls die private Instanz doch später
kommt.
Akzeptanzkriterien
.wikitool-remotes.json in diesem Checkout angelegt, mit der origin-URL als einzigem erlaubten Ziel
tools/wikitool doctor meldet den Gate als gesetzt
Gegenprobe: ein publish gegen ein nicht gelistetes Ziel verweigert mit Exit 42
Geprüft, ob doctor das Fehlen deutlicher melden sollte als bisher — eine dokumentierte, aber inerte Sicherung sollte nicht nur informativ auftauchen
Verifiziert am 2026-09-01.
## Befund
`.wikitool-remotes.json` existiert in diesem Checkout nicht.
`tools/chemenu/commands/git_publish.py:101` dokumentiert das Verhalten ausdrücklich:
**absent → unrestricted.** Der Publish-Remote-Gate ist damit nicht scharf.
`ENVIRONMENT.md` beschreibt `origin` dagegen als „einziges Publish-Ziel", und `AGENTS.md` führt
den Gate unter den drei in Code erzwungenen Grenzen. Eine Regel, die dokumentiert ist und nicht
greift, ist schlechter als eine fehlende: sie erzeugt genau das Vertrauen, das sie nicht
verdient.
## Warum das jetzt zählt
Solange dies eine Instanz mit einem einzigen, öffentlichen Remote ist, ist der Schaden begrenzt.
Mit der privaten Arbeitsinstanz aus #30 — Clone mit zusätzlichem `upstream`-Remote — entsteht
genau das Szenario, gegen das der Gate gebaut wurde: privater Korpus, der auf ein öffentliches
Upstream gepusht wird und von dort nicht zurückgeholt werden kann.
`instructions/private-instance.md` Schritt 5 setzt die Datei als Teil der Einrichtung. Der
Zeitpunkt, sie hier zu haben, ist **vor** dem Klonen — sonst erbt die private Instanz einen
Checkout, dessen Sicherung nie geprüft wurde.
`prio/1` weil `size/XS`: der Aufwand ist eine kleine Datei, der vermiedene Schaden ist
irreversibel und steht unmittelbar bevor. Herabstufen, falls die private Instanz doch später
kommt.
## Akzeptanzkriterien
- [ ] `.wikitool-remotes.json` in diesem Checkout angelegt, mit der `origin`-URL als einzigem erlaubten Ziel
- [ ] `tools/wikitool doctor` meldet den Gate als gesetzt
- [ ] Gegenprobe: ein `publish` gegen ein nicht gelistetes Ziel verweigert mit Exit 42
- [ ] Geprüft, ob `doctor` das Fehlen deutlicher melden sollte als bisher — eine dokumentierte, aber inerte Sicherung sollte nicht nur informativ auftauchen
In #36 (Master: Weg zum MCP-Leseserver) als Schritt 0 geführt: nicht auf dem Pfad zum Server,
aber vorab zu erledigen, weil es Vorbedingung für #30 ist und Minuten kostet. Blockiert den
Abschluss von #36 nicht.
In **#36** (Master: Weg zum MCP-Leseserver) als Schritt 0 geführt: nicht auf dem Pfad zum Server,
aber vorab zu erledigen, weil es Vorbedingung für #30 ist und Minuten kostet. Blockiert den
Abschluss von #36 nicht.
.wikitool-remotes.json in diesem Checkout angelegt, mit der origin-Push-URL als einzigem
Ziel. Gitignored, reist also nicht mit.
doctor meldet OK publish-remotes: Gate armed: 1 allowed push target(s).
Gegenprobe gefahren: ein zweites Remote auf eine erfundene URL gelegt, publish --remote gatecheck → Exit 42, Arbeitsbaum unberührt, Test-Remote wieder entfernt.
Punkt 4 geprüft und umgesetzt: doctor sagte bisher nur, ob die Datei da ist. Jetzt beginnt
jeder der drei Zustände mit Gate armed: bzw. Gate not armed:. Der einzelne Remote ohne
Allowlist bleibt OK — er hat nichts zu schützen, und ein FAIL machte die Datei durch die
Hintertür verpflichtend —, sagt aber ausdrücklich, dass jedes Push-Ziel durchkommt.
Nebenbefund: check_publish_remotes() hatte keine Tests. Drei sind dazugekommen, einer je
Zustand.
Damit steht die Sicherung vor dem Klonen der privaten Instanz (#30), was der eigentliche
Punkt an prio/1 war.
Umgesetzt in **2.2.3**.
- `.wikitool-remotes.json` in diesem Checkout angelegt, mit der `origin`-Push-URL als einzigem
Ziel. Gitignored, reist also nicht mit.
- `doctor` meldet `OK publish-remotes: Gate armed: 1 allowed push target(s)`.
- Gegenprobe gefahren: ein zweites Remote auf eine erfundene URL gelegt,
`publish --remote gatecheck` → **Exit 42**, Arbeitsbaum unberührt, Test-Remote wieder entfernt.
- Punkt 4 geprüft und umgesetzt: `doctor` sagte bisher nur, ob die *Datei* da ist. Jetzt beginnt
jeder der drei Zustände mit `Gate armed:` bzw. `Gate not armed:`. Der einzelne Remote ohne
Allowlist bleibt `OK` — er hat nichts zu schützen, und ein FAIL machte die Datei durch die
Hintertür verpflichtend —, sagt aber ausdrücklich, dass jedes Push-Ziel durchkommt.
Nebenbefund: `check_publish_remotes()` hatte **keine Tests**. Drei sind dazugekommen, einer je
Zustand.
Damit steht die Sicherung **vor** dem Klonen der privaten Instanz (#30), was der eigentliche
Punkt an `prio/1` war.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Verifiziert am 2026-09-01.
Befund
.wikitool-remotes.jsonexistiert in diesem Checkout nicht.tools/chemenu/commands/git_publish.py:101dokumentiert das Verhalten ausdrücklich:absent → unrestricted. Der Publish-Remote-Gate ist damit nicht scharf.
ENVIRONMENT.mdbeschreibtorigindagegen als „einziges Publish-Ziel", undAGENTS.mdführtden Gate unter den drei in Code erzwungenen Grenzen. Eine Regel, die dokumentiert ist und nicht
greift, ist schlechter als eine fehlende: sie erzeugt genau das Vertrauen, das sie nicht
verdient.
Warum das jetzt zählt
Solange dies eine Instanz mit einem einzigen, öffentlichen Remote ist, ist der Schaden begrenzt.
Mit der privaten Arbeitsinstanz aus #30 — Clone mit zusätzlichem
upstream-Remote — entstehtgenau das Szenario, gegen das der Gate gebaut wurde: privater Korpus, der auf ein öffentliches
Upstream gepusht wird und von dort nicht zurückgeholt werden kann.
instructions/private-instance.mdSchritt 5 setzt die Datei als Teil der Einrichtung. DerZeitpunkt, sie hier zu haben, ist vor dem Klonen — sonst erbt die private Instanz einen
Checkout, dessen Sicherung nie geprüft wurde.
prio/1weilsize/XS: der Aufwand ist eine kleine Datei, der vermiedene Schaden istirreversibel und steht unmittelbar bevor. Herabstufen, falls die private Instanz doch später
kommt.
Akzeptanzkriterien
.wikitool-remotes.jsonin diesem Checkout angelegt, mit derorigin-URL als einzigem erlaubten Zieltools/wikitool doctormeldet den Gate als gesetztpublishgegen ein nicht gelistetes Ziel verweigert mit Exit 42doctordas Fehlen deutlicher melden sollte als bisher — eine dokumentierte, aber inerte Sicherung sollte nicht nur informativ auftauchenIn #36 (Master: Weg zum MCP-Leseserver) als Schritt 0 geführt: nicht auf dem Pfad zum Server,
aber vorab zu erledigen, weil es Vorbedingung für #30 ist und Minuten kostet. Blockiert den
Abschluss von #36 nicht.
Umgesetzt in 2.2.3.
.wikitool-remotes.jsonin diesem Checkout angelegt, mit derorigin-Push-URL als einzigemZiel. Gitignored, reist also nicht mit.
doctormeldetOK publish-remotes: Gate armed: 1 allowed push target(s).publish --remote gatecheck→ Exit 42, Arbeitsbaum unberührt, Test-Remote wieder entfernt.doctorsagte bisher nur, ob die Datei da ist. Jetzt beginntjeder der drei Zustände mit
Gate armed:bzw.Gate not armed:. Der einzelne Remote ohneAllowlist bleibt
OK— er hat nichts zu schützen, und ein FAIL machte die Datei durch dieHintertür verpflichtend —, sagt aber ausdrücklich, dass jedes Push-Ziel durchkommt.
Nebenbefund:
check_publish_remotes()hatte keine Tests. Drei sind dazugekommen, einer jeZustand.
Damit steht die Sicherung vor dem Klonen der privaten Instanz (#30), was der eigentliche
Punkt an
prio/1war.