Publish-Remote-Gate ist in diesem Checkout inert: .wikitool-remotes.json fehlt, ENVIRONMENT.md beschreibt es als gesetzt #34

Closed
opened 2026-09-01 21:11:05 +00:00 by torben · 2 comments
Owner

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
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
torben added the prio/blocking label 2026-09-01 21:11:05 +00:00
Author
Owner

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.
Author
Owner

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 gatecheckExit 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.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: torben/chemenu#34