Leitlinien-Export: ausgewählte Seiten als generierte GUIDELINES.md in die erfassten Repos schreiben (MVP, ohne PR) #179

Closed
opened 2026-10-04 20:40:23 +00:00 by torben · 8 comments
Owner

Teil C aus dem Design #171 (dort D6 und die verworfenen Alternativen), auf MVP reduziert durch Betreiberentscheidung vom 2026-10-05 - dieselbe Reduktion wie #178 für die Aufwärtsrichtung. Baut auf #177 (Erfassung, Manifest, Git-Zugriff) und #178 (manueller Lauf in einer beaufsichtigten Sitzung) auf.

Erledigt (2026-10-06). Gebaut als 283cdae8bea11daf342f9171cf9bcbabb095371e (8.0.0-beta.44), verifiziert durch CI-Lauf #554 (verify und pwsh grün: Tests, Live-Tracker-Suite, Coverage, Entwicklungsbaum, Versions-Gate, frische Instanz aus der Distribution) und Release-Lauf #555 (Beta korrekt nicht veröffentlicht). Abschluss-Nachzug als 40839d956d491c3ab60532c30d9ea228243a280e (8.0.0-beta.45), verifiziert durch CI-Lauf #557 und Release-Lauf #558, beide grün. Lokal vor dem ersten Publish: pytest 2304 passed, hermetischer Lauf der berührten Tests grün, docs verify, instructions verify. Danach export guidelines --tag guideline gegen den echten Demo-Korpus: 4 Seiten, 362 Zeilen, außerhalb von Code kein [[, [^, ^[[ und kein generierter Block.

Problem

Projekt-Repositories tragen eigene Agentenregeln, die sich wiederholen und auseinanderlaufen (Belegt/Annahme trennen, Secrets nur in .env, kein Force-Push, Sprachregel). Die Instanz hält diese Leitlinien jetzt einmal und liefert sie an die Repos aus - als generierte, eingecheckte Datei im Repo (D6), so dass jedes Repo lokal arbeitsfähig bleibt, auch in CI und ohne MCP-Zugang.

Entscheidungen (Betreiber, 2026-10-05)

  • Die Sitzung läuft immer in der konkreten Instanz, aus der die Leitlinien kommen - in torben/chemenu ist das der Demo-Korpus, in einem Checkout von torben/nathan dessen Korpus. Quelle ist der Checkout, in dem tools/wikitool läuft (config.ROOT).
  • Ziel-Repos sind die erfassten Repos dieser Instanz - die repo aus den _capture.json-Manifesten unter raw/ (#177). Es gibt keine zweite Zielliste.
  • Zugriff über denselben Weg wie #177: repo_captures Bare-Cache-Repo, Zugangsdaten des Hosts, nie eine Rückfrage.
  • Keine PRs, keine Merges. Der Betreiber startet den Lauf in einer beaufsichtigten Sitzung, das Ergebnis landet direkt auf dem Branch des Ziel-Repos.
  • F1 = (A): der Push ist durch ein Gate im Code gesichert - das Guideline Push Gate, ein fünftes benanntes Gate (§ 4). Begründung: ein Push in ein fremdes Repo ist die irreversibelste Aktion des Stacks, und ein öffentliches Ziel-Repo macht jeden Inhalt sofort öffentlich (auch eine private instance=-URL). Verworfen: der Auftrag des Betreibers als Freigabe (Prosa-Grenze).

Zurückgestellt, nicht gebaut (Wiederaufnahme nur durch ein neues Issue): Auslieferung per PR über gitea-mcp/gh, eine Auslieferungs-Instruction, unbeaufsichtigter Lauf, Belieferung per Tag erfasster Repos.

Entwurf (wie gebaut)

1. Auswahl ohne neues Schema

export guidelines nimmt dieselben Prädikat-Optionen wie search: --field/-f (wiederholbar, UND), --kind, --subtype, --collection, --tag. Die Kurzformen laufen über search.filters.raw_predicates (von search und export gemeinsam genutzt), Auswertung über parse_predicate/validate_fields/apply_predicates und load_pages_by_path/unreadable_pages. Kein Textargument. Welcher Filter die Leitlinien auswählt, steht in kb/CONVENTIONS.md § "Guidelines for other repositories"; die Vorlage kb/CONVENTIONS.md.template setzt --tag guideline als Vorgabe (keine Setup-Frage). Im Demo-Korpus tragen vier Seiten das Tag (§ Abschluss). kb/CONTRACT.md § "Pages that leave the wiki: guidelines" sagt, dass der Filter dort steht und was der Export mit einer Seite macht.

Abbruch mit exit 1 (ERROR-Zeile, keine Exportausgabe auf stdout), nichts gepusht: kein Prädikat; null Treffer; unbekanntes Feld; irgendeine Seite unter kb/ mit unlesbarem Frontmatter (namentlich); kb/ oder types/ schmutzig inkl. unversionierter Dateien, oder kein Git-Checkout.

2. Mechanisches Rendern (kein LLM)

Ohne --push geht die Datei nach stdout. LF, genau ein abschließendes \n.

Zeile 1: <!-- wikitool:export kind=guidelines instance=<url> commit=<sha> - generated, do not edit by hand --> - instance= ist git remote get-url origin ohne Userinfo (auch scp-Form git@host:x → host:x), ohne origin local; commit= ist git log -1 --format=%H -- <ausgewählte Seiten>. Kein Zeitstempel.

Je Seite, sortiert nach (title.casefold(), title), durch eine Leerzeile getrennt: # <Titel>, dann der Text ohne Frontmatter; ein führendes H1 wird ersetzt, übrige Überschriften bleiben. Links-Block (blocks.strip) und Fußnotenblock (provenance.split_cite_block, Marker- und Legacy-Form) entfernt; außerhalb von Code: [^id] und ^[[…]] entfernt, [[T|A]]/[[T#x|A]] → A, [[T]]/[[T#x]] → T (über normalize_link_target). Code bleibt byteweise (Maske strip_code_spans). LINK_RE liegt in kb_scan.py (commands/page_ops re-exportiert es), damit das Kernmodul kein Kommandomodul importiert.

3. Schreiben in die erfassten Repos (--push)

Ziele: repo_capture.captured_manifests(raw_dir) (auch von raw status benutzt), je (repo, ref) einmal; --bundle <raw-bundle> (wiederholbar) schränkt ein, ein unbekanntes Bundle ist exit 1. Ein unlesbares Manifest wird als skipped gemeldet. --bundle/--confirm ohne --push ist exit 1.

Identität, vor jedem Fetch geprüft: git config user.name/user.email im Instanz-Checkout; fehlt eines, exit 1 ohne Gate und ohne Token. Übergabe an commit-tree als GIT_AUTHOR_*/GIT_COMMITTER_*.

Übersprungen mit Grund (exit 0): Tag-Muster als Ref-Regel; nicht erreichbar; Branch fehlt; keine GUIDELINES.md (nicht teilnehmend); GUIDELINES.md ohne Export-Kopf (handgeschrieben, nie ersetzt); fremdes instance=. Eine Kopfzeile ohne instance= ist der Opt-in-Stub.

Je teilnehmendem Ziel: Blob gleich → unchanged. Sonst new (bloßer Opt-in-Stub) oder changed (eigener früherer Export). Schreiben: repo_capture.commit_file - Plumbing im Cache-Repo (hash-object -w --no-filters, temporärer Index, write-tree, commit-tree -p <tip>), ein vorhandenes Ausführungsbit bleibt; Nachricht Update GUIDELINES.md from <instance> at <commit12>. Dann repo_capture.push_commit: git push --porcelain ohne Force, Ablehnung am Ref-Status ! erkannt (über run_git_result, das stdout auch bei exit ≠ 0 liefert), nie am stderr-Text. Kein Ref-Status → failed. Der flache Cache (--depth 1) trägt.

Invariante (getestet): nach dem Lauf trägt jedes Ziel-Repo entweder seinen alten Tip oder genau einen neuen Commit darüber, der sich nur in GUIDELINES.md unterscheidet. Kein anderer Pfad, Branch, Tag, nie Force.

Ausgabe: je Ziel <repo> <branch>: unchanged | written <alt12> -> <neu12> | skipped (<grund>) | rejected (<grund>) - the branch moved; run again | failed (<grund>), dann die Zählung. Exit 1, wenn ein Ziel rejected oder failed ist (Geschriebenes bleibt geschrieben), sonst 0.

Kein Rückkopplungskreis: raw capture schließt die Export-Datei aus, raw status meldet das Bundle nach dem Push nicht.

4. Guideline Push Gate

  • --push ohne passendes --confirm fetcht und baut alles, pusht nichts, exit 42; Ausgabe: Status je Ziel, Diff von GUIDELINES.md für jedes zu schreibende Ziel, Wiederholungszeile tools/wikitool export guidelines --confirm <token> --push --field … [--bundle …] (über typer.echo, weil die Rich-Konsole lange Zeilen in einer Pipe umbricht).
  • Token: sha256 über die sortierten [repo, ref, alter Tip, Blob] der zu schreibenden Ziele, 12 Zeichen; Commit-SHA nicht enthalten (Zeitstempel).
  • Nichts zu schreiben → kein Gate, exit 0.
  • Publish-Remote Gate bleibt auf publish beschränkt (Manifeste deklarieren die Ziele).
  • Kommando-Record: Effect write, Idempotent yes, Budget counted, Network yes, Gate guideline-push, eigene Gruppe "Guideline export".

5. Kein Rückfluss

raw accept lehnt eine Datei mit Export-Kopf (nach optionalem BOM) ab - direkt, im Ordner (auch erfasste Ordner), als --replaces-Datei und als --replaces-bundle-Material; Pfad und Grund, nichts verschoben. EXPORT_MARKER ist einmal definiert, in guideline_export.py.

Abweichungen vom Entwurf (in Build und Abschluss entschieden)

  • Statuswörter der Ausgabe englisch (new/changed/unchanged/skipped/written/rejected/failed) - Tool-Ausgabe ist Steuerebene. failed ist neu: ein git-Fehler beim Schreiben, der keine Ablehnung ist.
  • "nichts auf stdout" bei Abbruch heißt: keine Exportausgabe; die ERROR-Zeile des Fehlervertrags steht auf stdout.
  • LINK_RE nach kb_scan.py verschoben, filters.raw_predicates als gemeinsame Kurzform-Auflösung, captured_manifests aus raw status herausgelöst.
  • Neu angefasst, im Entwurf nicht genannt: kb/CONVENTIONS.md(.template), instructions/kb-profiles.md, tests/test_cli.py (Netzwerk-Liste).
  • Abschluss: die Vorlage trug zuerst einen {…}-Platzhalter für den Filter; setup-instance.md liest jeden Platzhalter als Setup-Frage, der Filter wäre unbemerkt eine neue Frage geworden, die eine leere Instanz nicht beantworten kann und INSTALL.md nicht nennt. Jetzt steht dort die Vorgabe --tag guideline (8.0.0-beta.45).

Akzeptanzkriterien

Tests in tools/chemenu/tests/test_export_guidelines.py (32 Tests) gegen Bare-Repos über file://.

  • Die Seitenmenge der Ausgabe ist genau die von search --limit 0 mit denselben Prädikaten; Reihenfolge nach (title.casefold(), title).
  • Ohne Prädikat, bei null Treffern, bei unbekanntem Feld, bei unlesbarem Frontmatter unter kb/ und bei schmutzigem kb//types/ (auch unversioniert): exit 1, keine Exportausgabe, kein Ziel-Repo verändert.
  • Außerhalb von Code kein [[, kein [^, kein ^[[, kein Links-/Fußnotenblock, kein Frontmatter; Inline-Code und Codeblöcke byteweise unverändert.
  • Wikilinks nach § 2 (alle vier Formen); jede Seite beginnt mit # <Titel>, führendes H1 nicht doppelt, andere Überschriften behalten ihre Ebene.
  • Zeile 1 exakt; commit= jüngster Commit einer ausgewählten Seite; instance= ohne Userinfo, ohne origin local.
  • Zwei Läufe byte-identisch, auch nach einem Instanz-Commit ohne ausgewählte Seite.
  • --push ohne user.name/user.email: exit 1 ohne Gate und Token, Refs unverändert; mit Identität tragen Autor und Committer genau diese Werte.
  • --push ohne Token: exit 42, Refs unverändert; Ausgabe mit Status je Ziel, Diff und --confirm-Zeile.
  • --push mit Token: genau ein neuer Commit, diff --name-only ist genau GUIDELINES.md, Bytes gleich stdout; zweiter Lauf unchanged, kein Commit, kein Gate, exit 0.
  • Token nach bewegtem Ziel-Branch, geänderter Leitlinie, hinzugekommenem Ziel, erfundenes Token: wieder exit 42, nichts gepusht.
  • Handgeschrieben, ohne Datei, fremdes instance=, Tag-Regel: je eine Zeile mit Grund, Refs unverändert.
  • Bewegter Branch zwischen Fetch und Push: nicht geforced, Remote auf dem fremden Commit, rejected, exit 1 - auch mit LANGUAGE=de.
  • Nicht erreichbares Ziel ist eine Zeile; die übrigen werden bedient.
  • Nach einem Push meldet raw status das Bundle nicht als geändert.
  • EXPORT_MARKER genau einmal definiert; echte Export-Ausgabe wird von _content_exclusion ausgeschlossen (auch mit BOM).
  • raw accept lehnt Datei und Ordner mit Export-Datei ab, incoming/ und raw/ unverändert.
  • AGENTS.md § Gates nennt fünf Gates (und der Verweis auf docs/why-gates-are-code.md); instructions/gates.md § Guideline Push Gate; docs/why-gates-are-code.md begründet die Token-Form und zählt fünf.
  • Kommando-Record in tools/CONTRACT.md; raw/CONTRACT.md; kb/CONTRACT.md; README.md ("Roll out the guidelines to the captured repositories", Teilnahme); tools/README.md; CHANGES.md.
  • pytest, docs verify, instructions verify grün; CI grün (Läufe #554 und #557).

Abschluss

  • Leitlinien im Demo-Korpus (Betreiberauftrag beim Abschluss): tags: guideline tragen jetzt Diff-Reviewable Agent Edits, Structural Enforcement over Documented Rule, Green Suite Blind Spot und Ambient Environment Dependency - allgemeine Regeln für Agenten- und Testarbeit in jedem Repo. Bewusst nicht: Command Round-Trip Integrity und Delete Rather Than Anonymize (an die Wiki-Werkzeuge gebunden). Gesetzt mit touch --add tags=guideline --no-date, protokolliert in kb/log.md; Tier 1 der Korpus-Policy (punktuell, unter der Gate-Schwelle).
  • Doku-Prüfung (stack-close Schritt 3): docs/why-gates-are-code.md war schon im Build nachgezogen; die übrigen docs/-Seiten tragen keine Begründung, die sich verschoben hat. Kommando-Record, raw//kb/CONTRACT.md und beide READMEs gegen das gebaute Verhalten gelesen - stimmig. Keine Installations-Instruction berührt; der einzige Fund war der Vorlagen-Platzhalter (§ Abweichungen), behoben in 8.0.0-beta.45.
  • Nachbefund, nicht Teil dieses Pakets: alle vier getaggten Seiten tragen außerhalb des generierten Blocks noch eine leere, handgeschriebene ## Beziehungen-Überschrift und einen ## Siehe auch-Abschnitt mit einem Quellen-Titel. Der Export gibt sie wie spezifiziert unverändert aus. Ob die Seiten bereinigt werden oder der Export solche Abschnitte zusätzlich entfernt, ist eine offene Frage an den Betreiber.

Betroffene Stellen

  • Neu: tools/chemenu/guideline_export.py, tools/chemenu/commands/export_cmd.py (registriert in cli.py), tools/chemenu/tests/test_export_guidelines.py.
  • Erweitert: repo_capture.py, commands/raw_cmd.py, search/filters.py, commands/search.py, kb_scan.py, commands/page_ops.py, cli_contract.py, tests/test_cli.py.
  • Doku: AGENTS.md, instructions/gates.md, docs/why-gates-are-code.md, tools/CONTRACT.md, raw/CONTRACT.md, kb/CONTRACT.md, kb/CONVENTIONS.md(.template), instructions/kb-profiles.md, README.md, tools/README.md, CHANGES.md.
  • Inhalt: vier Konzeptseiten getaggt, kb/log.md.

Versionsteil

--minor, gebumpt als 8.0.0-beta.44 im laufenden 8.0.0-Kandidaten (neues Kommando mit eigenem Gate, Drop-in in beide Richtungen; kb/ und Manifeste unberührt), plus --patch als 8.0.0-beta.45 für die Vorlagen-Korrektur.

Teil C aus dem Design #171 (dort D6 und die verworfenen Alternativen), **auf MVP reduziert durch Betreiberentscheidung vom 2026-10-05** - dieselbe Reduktion wie #178 für die Aufwärtsrichtung. Baut auf #177 (Erfassung, Manifest, Git-Zugriff) und #178 (manueller Lauf in einer beaufsichtigten Sitzung) auf. **Erledigt (2026-10-06).** Gebaut als `283cdae8bea11daf342f9171cf9bcbabb095371e` (8.0.0-beta.44), verifiziert durch CI-Lauf [#554](https://gitea.nehmer.net/torben/chemenu/actions/runs/554) (`verify` und `pwsh` grün: Tests, Live-Tracker-Suite, Coverage, Entwicklungsbaum, Versions-Gate, frische Instanz aus der Distribution) und Release-Lauf [#555](https://gitea.nehmer.net/torben/chemenu/actions/runs/555) (Beta korrekt nicht veröffentlicht). Abschluss-Nachzug als `40839d956d491c3ab60532c30d9ea228243a280e` (8.0.0-beta.45), verifiziert durch CI-Lauf [#557](https://gitea.nehmer.net/torben/chemenu/actions/runs/557) und Release-Lauf [#558](https://gitea.nehmer.net/torben/chemenu/actions/runs/558), beide grün. Lokal vor dem ersten Publish: `pytest` 2304 passed, hermetischer Lauf der berührten Tests grün, `docs verify`, `instructions verify`. Danach `export guidelines --tag guideline` gegen den echten Demo-Korpus: 4 Seiten, 362 Zeilen, außerhalb von Code kein `[[`, `[^`, `^[[` und kein generierter Block. ## Problem Projekt-Repositories tragen eigene Agentenregeln, die sich wiederholen und auseinanderlaufen (Belegt/Annahme trennen, Secrets nur in `.env`, kein Force-Push, Sprachregel). Die Instanz hält diese Leitlinien jetzt einmal und liefert sie an die Repos aus - als generierte, eingecheckte Datei im Repo (D6), so dass jedes Repo lokal arbeitsfähig bleibt, auch in CI und ohne MCP-Zugang. ## Entscheidungen (Betreiber, 2026-10-05) - **Die Sitzung läuft immer in der konkreten Instanz**, aus der die Leitlinien kommen - in `torben/chemenu` ist das der Demo-Korpus, in einem Checkout von `torben/nathan` dessen Korpus. Quelle ist der Checkout, in dem `tools/wikitool` läuft (`config.ROOT`). - **Ziel-Repos sind die erfassten Repos dieser Instanz** - die `repo` aus den `_capture.json`-Manifesten unter `raw/` (#177). Es gibt keine zweite Zielliste. - **Zugriff über denselben Weg wie #177:** `repo_capture`s Bare-Cache-Repo, Zugangsdaten des Hosts, nie eine Rückfrage. - **Keine PRs, keine Merges.** Der Betreiber startet den Lauf in einer beaufsichtigten Sitzung, das Ergebnis landet direkt auf dem Branch des Ziel-Repos. - **F1 = (A): der Push ist durch ein Gate im Code gesichert** - das **Guideline Push Gate**, ein fünftes benanntes Gate (§ 4). Begründung: ein Push in ein fremdes Repo ist die irreversibelste Aktion des Stacks, und ein öffentliches Ziel-Repo macht jeden Inhalt sofort öffentlich (auch eine private `instance=`-URL). *Verworfen:* der Auftrag des Betreibers als Freigabe (Prosa-Grenze). **Zurückgestellt, nicht gebaut** (Wiederaufnahme nur durch ein neues Issue): Auslieferung per PR über `gitea-mcp`/`gh`, eine Auslieferungs-Instruction, unbeaufsichtigter Lauf, Belieferung per Tag erfasster Repos. ## Entwurf (wie gebaut) ### 1. Auswahl ohne neues Schema `export guidelines` nimmt **dieselben Prädikat-Optionen wie `search`**: `--field/-f` (wiederholbar, UND), `--kind`, `--subtype`, `--collection`, `--tag`. Die Kurzformen laufen über `search.filters.raw_predicates` (von `search` und `export` gemeinsam genutzt), Auswertung über `parse_predicate`/`validate_fields`/`apply_predicates` und `load_pages_by_path`/`unreadable_pages`. **Kein Textargument.** Welcher Filter die Leitlinien auswählt, steht in `kb/CONVENTIONS.md` § "Guidelines for other repositories"; die Vorlage `kb/CONVENTIONS.md.template` setzt `--tag guideline` als Vorgabe (keine Setup-Frage). Im Demo-Korpus tragen vier Seiten das Tag (§ Abschluss). `kb/CONTRACT.md` § "Pages that leave the wiki: guidelines" sagt, dass der Filter dort steht und was der Export mit einer Seite macht. Abbruch mit exit 1 (ERROR-Zeile, **keine Exportausgabe** auf stdout), nichts gepusht: kein Prädikat; null Treffer; unbekanntes Feld; irgendeine Seite unter `kb/` mit unlesbarem Frontmatter (namentlich); `kb/` oder `types/` schmutzig inkl. unversionierter Dateien, oder kein Git-Checkout. ### 2. Mechanisches Rendern (kein LLM) Ohne `--push` geht die Datei nach stdout. LF, genau ein abschließendes `\n`. **Zeile 1:** `<!-- wikitool:export kind=guidelines instance=<url> commit=<sha> - generated, do not edit by hand -->` - `instance=` ist `git remote get-url origin` ohne Userinfo (auch scp-Form `git@host:x` → `host:x`), ohne `origin` `local`; `commit=` ist `git log -1 --format=%H -- <ausgewählte Seiten>`. Kein Zeitstempel. **Je Seite**, sortiert nach `(title.casefold(), title)`, durch eine Leerzeile getrennt: `# <Titel>`, dann der Text ohne Frontmatter; ein führendes H1 wird ersetzt, übrige Überschriften bleiben. Links-Block (`blocks.strip`) und Fußnotenblock (`provenance.split_cite_block`, Marker- und Legacy-Form) entfernt; außerhalb von Code: `[^id]` und `^[[…]]` entfernt, `[[T|A]]`/`[[T#x|A]]` → `A`, `[[T]]`/`[[T#x]]` → `T` (über `normalize_link_target`). Code bleibt byteweise (Maske `strip_code_spans`). `LINK_RE` liegt in `kb_scan.py` (`commands/page_ops` re-exportiert es), damit das Kernmodul kein Kommandomodul importiert. ### 3. Schreiben in die erfassten Repos (`--push`) **Ziele:** `repo_capture.captured_manifests(raw_dir)` (auch von `raw status` benutzt), je `(repo, ref)` einmal; `--bundle <raw-bundle>` (wiederholbar) schränkt ein, ein unbekanntes Bundle ist exit 1. Ein unlesbares Manifest wird als `skipped` gemeldet. `--bundle`/`--confirm` ohne `--push` ist exit 1. **Identität, vor jedem Fetch geprüft:** `git config user.name`/`user.email` im Instanz-Checkout; fehlt eines, exit 1 ohne Gate und ohne Token. Übergabe an `commit-tree` als `GIT_AUTHOR_*`/`GIT_COMMITTER_*`. **Übersprungen mit Grund (exit 0):** Tag-Muster als Ref-Regel; nicht erreichbar; Branch fehlt; keine `GUIDELINES.md` (nicht teilnehmend); `GUIDELINES.md` ohne Export-Kopf (handgeschrieben, nie ersetzt); fremdes `instance=`. Eine Kopfzeile ohne `instance=` ist der Opt-in-Stub. **Je teilnehmendem Ziel:** Blob gleich → `unchanged`. Sonst `new` (bloßer Opt-in-Stub) oder `changed` (eigener früherer Export). Schreiben: `repo_capture.commit_file` - Plumbing im Cache-Repo (`hash-object -w --no-filters`, temporärer Index, `write-tree`, `commit-tree -p <tip>`), ein vorhandenes Ausführungsbit bleibt; Nachricht `Update GUIDELINES.md from <instance> at <commit12>`. Dann `repo_capture.push_commit`: `git push --porcelain` ohne Force, Ablehnung am Ref-Status `!` erkannt (über `run_git_result`, das stdout auch bei exit ≠ 0 liefert), nie am stderr-Text. Kein Ref-Status → `failed`. Der flache Cache (`--depth 1`) trägt. **Invariante (getestet):** nach dem Lauf trägt jedes Ziel-Repo entweder seinen alten Tip oder genau einen neuen Commit darüber, der sich nur in `GUIDELINES.md` unterscheidet. Kein anderer Pfad, Branch, Tag, nie Force. **Ausgabe:** je Ziel `<repo> <branch>: unchanged | written <alt12> -> <neu12> | skipped (<grund>) | rejected (<grund>) - the branch moved; run again | failed (<grund>)`, dann die Zählung. Exit 1, wenn ein Ziel `rejected` oder `failed` ist (Geschriebenes bleibt geschrieben), sonst 0. **Kein Rückkopplungskreis:** `raw capture` schließt die Export-Datei aus, `raw status` meldet das Bundle nach dem Push nicht. ### 4. Guideline Push Gate - `--push` ohne passendes `--confirm` fetcht und baut alles, pusht nichts, exit 42; Ausgabe: Status je Ziel, Diff von `GUIDELINES.md` für jedes zu schreibende Ziel, Wiederholungszeile `tools/wikitool export guidelines --confirm <token> --push --field … [--bundle …]` (über `typer.echo`, weil die Rich-Konsole lange Zeilen in einer Pipe umbricht). - Token: sha256 über die sortierten `[repo, ref, alter Tip, Blob]` der zu schreibenden Ziele, 12 Zeichen; Commit-SHA nicht enthalten (Zeitstempel). - Nichts zu schreiben → kein Gate, exit 0. - Publish-Remote Gate bleibt auf `publish` beschränkt (Manifeste deklarieren die Ziele). - Kommando-Record: Effect `write`, Idempotent `yes`, Budget `counted`, Network `yes`, Gate `guideline-push`, eigene Gruppe "Guideline export". ### 5. Kein Rückfluss `raw accept` lehnt eine Datei mit Export-Kopf (nach optionalem BOM) ab - direkt, im Ordner (auch erfasste Ordner), als `--replaces`-Datei und als `--replaces-bundle`-Material; Pfad und Grund, nichts verschoben. `EXPORT_MARKER` ist einmal definiert, in `guideline_export.py`. ## Abweichungen vom Entwurf (in Build und Abschluss entschieden) - Statuswörter der Ausgabe englisch (`new`/`changed`/`unchanged`/`skipped`/`written`/`rejected`/`failed`) - Tool-Ausgabe ist Steuerebene. `failed` ist neu: ein git-Fehler beim Schreiben, der keine Ablehnung ist. - "nichts auf stdout" bei Abbruch heißt: keine Exportausgabe; die ERROR-Zeile des Fehlervertrags steht auf stdout. - `LINK_RE` nach `kb_scan.py` verschoben, `filters.raw_predicates` als gemeinsame Kurzform-Auflösung, `captured_manifests` aus `raw status` herausgelöst. - Neu angefasst, im Entwurf nicht genannt: `kb/CONVENTIONS.md(.template)`, `instructions/kb-profiles.md`, `tests/test_cli.py` (Netzwerk-Liste). - Abschluss: die Vorlage trug zuerst einen `{…}`-Platzhalter für den Filter; `setup-instance.md` liest jeden Platzhalter als Setup-Frage, der Filter wäre unbemerkt eine neue Frage geworden, die eine leere Instanz nicht beantworten kann und `INSTALL.md` nicht nennt. Jetzt steht dort die Vorgabe `--tag guideline` (8.0.0-beta.45). ## Akzeptanzkriterien Tests in `tools/chemenu/tests/test_export_guidelines.py` (32 Tests) gegen Bare-Repos über `file://`. - [x] Die Seitenmenge der Ausgabe ist genau die von `search --limit 0` mit denselben Prädikaten; Reihenfolge nach `(title.casefold(), title)`. - [x] Ohne Prädikat, bei null Treffern, bei unbekanntem Feld, bei unlesbarem Frontmatter unter `kb/` und bei schmutzigem `kb/`/`types/` (auch unversioniert): exit 1, keine Exportausgabe, kein Ziel-Repo verändert. - [x] Außerhalb von Code kein `[[`, kein `[^`, kein `^[[`, kein Links-/Fußnotenblock, kein Frontmatter; Inline-Code und Codeblöcke byteweise unverändert. - [x] Wikilinks nach § 2 (alle vier Formen); jede Seite beginnt mit `# <Titel>`, führendes H1 nicht doppelt, andere Überschriften behalten ihre Ebene. - [x] Zeile 1 exakt; `commit=` jüngster Commit einer ausgewählten Seite; `instance=` ohne Userinfo, ohne `origin` `local`. - [x] Zwei Läufe byte-identisch, auch nach einem Instanz-Commit ohne ausgewählte Seite. - [x] `--push` ohne `user.name`/`user.email`: exit 1 ohne Gate und Token, Refs unverändert; mit Identität tragen Autor und Committer genau diese Werte. - [x] `--push` ohne Token: exit 42, Refs unverändert; Ausgabe mit Status je Ziel, Diff und `--confirm`-Zeile. - [x] `--push` mit Token: genau ein neuer Commit, `diff --name-only` ist genau `GUIDELINES.md`, Bytes gleich stdout; zweiter Lauf `unchanged`, kein Commit, kein Gate, exit 0. - [x] Token nach bewegtem Ziel-Branch, geänderter Leitlinie, hinzugekommenem Ziel, erfundenes Token: wieder exit 42, nichts gepusht. - [x] Handgeschrieben, ohne Datei, fremdes `instance=`, Tag-Regel: je eine Zeile mit Grund, Refs unverändert. - [x] Bewegter Branch zwischen Fetch und Push: nicht geforced, Remote auf dem fremden Commit, `rejected`, exit 1 - auch mit `LANGUAGE=de`. - [x] Nicht erreichbares Ziel ist eine Zeile; die übrigen werden bedient. - [x] Nach einem Push meldet `raw status` das Bundle nicht als geändert. - [x] `EXPORT_MARKER` genau einmal definiert; echte Export-Ausgabe wird von `_content_exclusion` ausgeschlossen (auch mit BOM). - [x] `raw accept` lehnt Datei und Ordner mit Export-Datei ab, `incoming/` und `raw/` unverändert. - [x] `AGENTS.md` § Gates nennt fünf Gates (und der Verweis auf `docs/why-gates-are-code.md`); `instructions/gates.md` § Guideline Push Gate; `docs/why-gates-are-code.md` begründet die Token-Form und zählt fünf. - [x] Kommando-Record in `tools/CONTRACT.md`; `raw/CONTRACT.md`; `kb/CONTRACT.md`; `README.md` ("Roll out the guidelines to the captured repositories", Teilnahme); `tools/README.md`; `CHANGES.md`. - [x] `pytest`, `docs verify`, `instructions verify` grün; CI grün (Läufe #554 und #557). ## Abschluss - **Leitlinien im Demo-Korpus (Betreiberauftrag beim Abschluss):** `tags: guideline` tragen jetzt [[Diff-Reviewable Agent Edits]], [[Structural Enforcement over Documented Rule]], [[Green Suite Blind Spot]] und [[Ambient Environment Dependency]] - allgemeine Regeln für Agenten- und Testarbeit in jedem Repo. Bewusst nicht: Command Round-Trip Integrity und Delete Rather Than Anonymize (an die Wiki-Werkzeuge gebunden). Gesetzt mit `touch --add tags=guideline --no-date`, protokolliert in `kb/log.md`; Tier 1 der Korpus-Policy (punktuell, unter der Gate-Schwelle). - **Doku-Prüfung (stack-close Schritt 3):** `docs/why-gates-are-code.md` war schon im Build nachgezogen; die übrigen `docs/`-Seiten tragen keine Begründung, die sich verschoben hat. Kommando-Record, `raw/`/`kb/CONTRACT.md` und beide READMEs gegen das gebaute Verhalten gelesen - stimmig. Keine Installations-Instruction berührt; der einzige Fund war der Vorlagen-Platzhalter (§ Abweichungen), behoben in 8.0.0-beta.45. - **Nachbefund, nicht Teil dieses Pakets:** alle vier getaggten Seiten tragen außerhalb des generierten Blocks noch eine leere, handgeschriebene `## Beziehungen`-Überschrift und einen `## Siehe auch`-Abschnitt mit einem Quellen-Titel. Der Export gibt sie wie spezifiziert unverändert aus. Ob die Seiten bereinigt werden oder der Export solche Abschnitte zusätzlich entfernt, ist eine offene Frage an den Betreiber. ## Betroffene Stellen - **Neu:** `tools/chemenu/guideline_export.py`, `tools/chemenu/commands/export_cmd.py` (registriert in `cli.py`), `tools/chemenu/tests/test_export_guidelines.py`. - **Erweitert:** `repo_capture.py`, `commands/raw_cmd.py`, `search/filters.py`, `commands/search.py`, `kb_scan.py`, `commands/page_ops.py`, `cli_contract.py`, `tests/test_cli.py`. - **Doku:** `AGENTS.md`, `instructions/gates.md`, `docs/why-gates-are-code.md`, `tools/CONTRACT.md`, `raw/CONTRACT.md`, `kb/CONTRACT.md`, `kb/CONVENTIONS.md(.template)`, `instructions/kb-profiles.md`, `README.md`, `tools/README.md`, `CHANGES.md`. - **Inhalt:** vier Konzeptseiten getaggt, `kb/log.md`. ## Versionsteil **`--minor`**, gebumpt als 8.0.0-beta.44 im laufenden 8.0.0-Kandidaten (neues Kommando mit eigenem Gate, Drop-in in beide Richtungen; `kb/` und Manifeste unberührt), plus `--patch` als 8.0.0-beta.45 für die Vorlagen-Korrektur.
torben added the prio/plannedsize/Marea/kbkind/build labels 2026-10-04 20:40:23 +00:00
Author
Owner

Changelog: Body gegen den Baum nach #177/#178 aufgefrischt.

  • Korrigiert: Rückfluss-Ausschluss in raw capture existiert schon; links.py war der falsche Verweis (betrifft related:-Kanten) - jetzt provenance.py/blocks.py/markdown_code.py/page_ops.LINK_RE.
  • Kopf: generated= und --no-timestamp entfallen; commit= ist der jüngste Commit, der eine ausgewählte Seite berührt (statt HEAD) - deterministisch, keine PR-Flut bei fremden Commits; instance= ohne Userinfo.
  • Rendern: # <Titel> statt ## <Titel> (Kollision mit Seitenabschnitten), keine eigene Herkunftszeile; Links-Block und Legacy-Zitate entfernt; Code bleibt unverändert.
  • Neu: Abbruch ohne Prädikat, bei null Treffern, bei unlesbarem Frontmatter; Sauberkeit gilt für kb/ und types/; --out überschreibt nie eine Datei ohne Export-Kopf; EXPORT_MARKER einmal definiert; raw accept lehnt Export-Dateien ebenfalls ab.
  • Auslieferung: Opt-in setzt den Export-Kopf voraus; fremdes instance= wird nicht ersetzt; bei öffentlichem Ziel genehmigt der Betreiber den Inhalt vor dem Öffnen der PR; nur Forge-API, höchstens eine offene PR; Instruction manual: true.
  • Akzeptanzkriterien entsprechend als prüfbare Eigenschaften neu gefasst.
**Changelog:** Body gegen den Baum nach #177/#178 aufgefrischt. - Korrigiert: Rückfluss-Ausschluss in `raw capture` existiert schon; `links.py` war der falsche Verweis (betrifft `related:`-Kanten) - jetzt `provenance.py`/`blocks.py`/`markdown_code.py`/`page_ops.LINK_RE`. - Kopf: `generated=` und `--no-timestamp` entfallen; `commit=` ist der jüngste Commit, der eine ausgewählte Seite berührt (statt `HEAD`) - deterministisch, keine PR-Flut bei fremden Commits; `instance=` ohne Userinfo. - Rendern: `# <Titel>` statt `## <Titel>` (Kollision mit Seitenabschnitten), keine eigene Herkunftszeile; Links-Block und Legacy-Zitate entfernt; Code bleibt unverändert. - Neu: Abbruch ohne Prädikat, bei null Treffern, bei unlesbarem Frontmatter; Sauberkeit gilt für `kb/` und `types/`; `--out` überschreibt nie eine Datei ohne Export-Kopf; `EXPORT_MARKER` einmal definiert; `raw accept` lehnt Export-Dateien ebenfalls ab. - Auslieferung: Opt-in setzt den Export-Kopf voraus; fremdes `instance=` wird nicht ersetzt; bei öffentlichem Ziel genehmigt der Betreiber den Inhalt **vor** dem Öffnen der PR; nur Forge-API, höchstens eine offene PR; Instruction `manual: true`. - Akzeptanzkriterien entsprechend als prüfbare Eigenschaften neu gefasst.
torben changed title from Leitlinien-Export: ausgewählte Seiten als generierte Datei in Projekt-Repositories ausliefern to Leitlinien-Export: ausgewählte Seiten als generierte Datei für Projekt-Repositories (MVP, ohne PR) 2026-10-05 20:22:37 +00:00
Author
Owner

Changelog: Betreiberentscheidung: MVP wie #178, keine PRs/Merges. Gestrichen: Auslieferung per PR über die Forge, Erkennung teilnehmender Repos, Auslieferungs-Instruction instructions/guidelines-export.md samt ihren Invarianten (fremdes instance=, Genehmigung vor öffentlicher PR, eine offene PR je Repo) - als zurückgestellt im Body vermerkt. Neu: Der Export schreibt per --out in einen lokalen Checkout, Committen im Ziel-Repo ist Sache des Betreibers; --out legt keine fehlenden Verzeichnisse an; Command-Record-Notes und ein README-Satz ersetzen die Instruction. Titel angepasst. Labels unverändert (Code, Tests und raw accept-Änderung halten size/M).

**Changelog:** Betreiberentscheidung: MVP wie #178, keine PRs/Merges. Gestrichen: Auslieferung per PR über die Forge, Erkennung teilnehmender Repos, Auslieferungs-Instruction `instructions/guidelines-export.md` samt ihren Invarianten (fremdes `instance=`, Genehmigung vor öffentlicher PR, eine offene PR je Repo) - als zurückgestellt im Body vermerkt. Neu: Der Export schreibt per `--out` in einen lokalen Checkout, Committen im Ziel-Repo ist Sache des Betreibers; `--out` legt keine fehlenden Verzeichnisse an; Command-Record-Notes und ein README-Satz ersetzen die Instruction. Titel angepasst. Labels unverändert (Code, Tests und `raw accept`-Änderung halten `size/M`).
torben added kind/decision and removed kind/build labels 2026-10-05 20:32:35 +00:00
Author
Owner

Changelog: Betreiberentscheidung: Ziel ist immer das Repo, in dem der Agent läuft - Zug aus dem Projekt-Repo statt Schub aus der Instanz. Committen folgt den Regeln des Projekt-Repos. Neu offen: F1 (Weg zur Instanz: lokaler Checkout / MCP-Tool / beides) und F2 (Filter von der Instanz deklariert in kb/CONVENTIONS.md / vom Aufrufer übergeben), je mit Empfehlung (A). Kriterien und betroffene Stellen sind nach F1/F2 verzweigt; neues Kriterium: Aufruf mit cwd in einem anderen Repo. Neu gelabelt: kind/build → kind/decision wegen F1/F2.

**Changelog:** Betreiberentscheidung: Ziel ist immer das Repo, in dem der Agent läuft - Zug aus dem Projekt-Repo statt Schub aus der Instanz. Committen folgt den Regeln des Projekt-Repos. Neu offen: F1 (Weg zur Instanz: lokaler Checkout / MCP-Tool / beides) und F2 (Filter von der Instanz deklariert in `kb/CONVENTIONS.md` / vom Aufrufer übergeben), je mit Empfehlung (A). Kriterien und betroffene Stellen sind nach F1/F2 verzweigt; neues Kriterium: Aufruf mit cwd in einem anderen Repo. Neu gelabelt: `kind/build` → `kind/decision` wegen F1/F2.
torben changed title from Leitlinien-Export: ausgewählte Seiten als generierte Datei für Projekt-Repositories (MVP, ohne PR) to Leitlinien-Export: ausgewählte Seiten als generierte GUIDELINES.md in die erfassten Repos schreiben (MVP, ohne PR) 2026-10-05 20:40:10 +00:00
Author
Owner

Changelog: Missverständnis der vorigen Fassung korrigiert. Die Sitzung läuft in der Instanz (Demo-Korpus hier, torben/nathan dort). Ziel-Repos sind die erfassten Repos aus den _capture.json, Zugriff über den Git-Weg aus #177; Ablauf wie #178 (manuell, beaufsichtigt, direkt auf den Branch, keine PR).

  • Gestrichen: Zug aus dem Projekt-Repo, alte F1 (lokaler Checkout/MCP) und alte F2 (Filter-Deklaration) - der Filter bleibt --field wie search, dokumentiert als Prosa in kb/CONVENTIONS.md (D6). --out entfällt; ohne --push geht die Ausgabe nach stdout.
  • Neu: --push schreibt per Plumbing im Cache-Repo genau einen Commit, der nur GUIDELINES.md ändert, Push ohne Force. Opt-in durch eine GUIDELINES.md mit Export-Kopf. Übersprungen werden handgeschriebene Dateien, fremdes instance=, Tag-Regeln und nicht erreichbare Repos. Kein Rückkopplungskreis mit raw status.
  • Neu offen: F1 - Gate mit --confirm-Token vor dem Push (Empfehlung) oder kein Gate.
  • Labels bleiben (kind/decision wegen F1).
**Changelog:** Missverständnis der vorigen Fassung korrigiert. Die Sitzung läuft in der Instanz (Demo-Korpus hier, `torben/nathan` dort). Ziel-Repos sind die erfassten Repos aus den `_capture.json`, Zugriff über den Git-Weg aus #177; Ablauf wie #178 (manuell, beaufsichtigt, direkt auf den Branch, keine PR). - Gestrichen: Zug aus dem Projekt-Repo, alte F1 (lokaler Checkout/MCP) und alte F2 (Filter-Deklaration) - der Filter bleibt `--field` wie `search`, dokumentiert als Prosa in `kb/CONVENTIONS.md` (D6). `--out` entfällt; ohne `--push` geht die Ausgabe nach stdout. - Neu: `--push` schreibt per Plumbing im Cache-Repo genau einen Commit, der nur `GUIDELINES.md` ändert, Push ohne Force. Opt-in durch eine `GUIDELINES.md` mit Export-Kopf. Übersprungen werden handgeschriebene Dateien, fremdes `instance=`, Tag-Regeln und nicht erreichbare Repos. Kein Rückkopplungskreis mit `raw status`. - Neu offen: F1 - Gate mit `--confirm`-Token vor dem Push (Empfehlung) oder kein Gate. - Labels bleiben (`kind/decision` wegen F1).
torben added kind/build and removed kind/decision labels 2026-10-05 20:58:30 +00:00
Author
Owner

Changelog: F1 entschieden (Betreiber): (A), ein Gate im Code. Neu ist § 4 „Guideline Push Gate“: Ohne Token läuft alles bis vor den Push, dann exit 42 mit Status und Diff je Ziel. Das Token fasst (URL, Branch, alter Tip, neuer Blob) zusammen. Gibt es nichts zu schreiben, endet der Lauf ohne Gate. Das Publish-Remote Gate bleibt auf publish beschränkt, weil die Manifeste die Zielmenge schon deklarieren. Die Kriterien für das Gate sind jetzt fest, ebenso die Doku in AGENTS.md § Gates, instructions/gates.md und docs/why-gates-are-code.md. Neu gelabelt: kind/decision → kind/build, weil keine Frage mehr offen ist. size/M bleibt: ein Build in einer Sitzung, keine offene Designfrage.

**Changelog:** F1 entschieden (Betreiber): (A), ein Gate im Code. Neu ist § 4 „Guideline Push Gate“: Ohne Token läuft alles bis vor den Push, dann exit 42 mit Status und Diff je Ziel. Das Token fasst (URL, Branch, alter Tip, neuer Blob) zusammen. Gibt es nichts zu schreiben, endet der Lauf ohne Gate. Das Publish-Remote Gate bleibt auf `publish` beschränkt, weil die Manifeste die Zielmenge schon deklarieren. Die Kriterien für das Gate sind jetzt fest, ebenso die Doku in `AGENTS.md` § Gates, `instructions/gates.md` und `docs/why-gates-are-code.md`. Neu gelabelt: `kind/decision` → `kind/build`, weil keine Frage mehr offen ist. `size/M` bleibt: ein Build in einer Sitzung, keine offene Designfrage.
Author
Owner

Changelog: Body mit dem Baum abgeglichen. Alle genannten Symbole existieren. Neu festgelegt:

  • Identität: user.name/user.email kommen aus dem Checkout der Instanz und werden als GIT_AUTHOR_*/GIT_COMMITTER_* an commit-tree übergeben, weil run_git im Cache-Repo nur die globale Konfiguration sähe. Fehlt eine davon: exit 1 vor dem Gate. Dazu ein neues Kriterium.
  • Ablehnung beim Push: erkannt über git push --porcelain (Ref-Status !), nicht über den stderr-Text, denn git meldet lokalisiert. Dafür braucht es einen git-Aufruf, der stdout auch bei exit ≠ 0 liefert. Das Kriterium nennt jetzt die Unabhängigkeit von der Locale.
  • Flacher Cache (--depth 1): Push von einem per Plumbing gebauten Commit am 2026-10-05 mit git 2.56 über file:// geprüft. Der Push funktioniert. Ein Push auf einen veralteten Tip wird abgelehnt, der Remote-Branch bleibt stehen.
  • Der Commit-SHA gehört ausdrücklich nicht ins Token, weil commit-tree einen Zeitstempel setzt.
  • EXPORT_MARKER zieht ohne Importzyklus ins Kernmodul.
  • Einhängepunkt für raw accept ist _check_files.
  • docs/why-gates-are-code.md zählt in beiden Abschnitten fünf Gates.

Labels unverändert.

**Changelog:** Body mit dem Baum abgeglichen. Alle genannten Symbole existieren. Neu festgelegt: - Identität: `user.name`/`user.email` kommen aus dem Checkout der Instanz und werden als `GIT_AUTHOR_*`/`GIT_COMMITTER_*` an `commit-tree` übergeben, weil `run_git` im Cache-Repo nur die globale Konfiguration sähe. Fehlt eine davon: exit 1 vor dem Gate. Dazu ein neues Kriterium. - Ablehnung beim Push: erkannt über `git push --porcelain` (Ref-Status `!`), nicht über den stderr-Text, denn git meldet lokalisiert. Dafür braucht es einen git-Aufruf, der stdout auch bei exit ≠ 0 liefert. Das Kriterium nennt jetzt die Unabhängigkeit von der Locale. - Flacher Cache (`--depth 1`): Push von einem per Plumbing gebauten Commit am 2026-10-05 mit git 2.56 über `file://` geprüft. Der Push funktioniert. Ein Push auf einen veralteten Tip wird abgelehnt, der Remote-Branch bleibt stehen. - Der Commit-SHA gehört ausdrücklich nicht ins Token, weil `commit-tree` einen Zeitstempel setzt. - `EXPORT_MARKER` zieht ohne Importzyklus ins Kernmodul. - Einhängepunkt für `raw accept` ist `_check_files`. - `docs/why-gates-are-code.md` zählt in beiden Abschnitten fünf Gates. Labels unverändert.
Author
Owner

Changelog: Gebaut und publiziert als 283cdae (8.0.0-beta.44), CI-Lauf #554 grün, Release-Lauf #555 hat die Beta korrekt übersprungen. Alle Akzeptanzkriterien sind abgehakt. Der Body beschreibt jetzt den gebauten Stand.

Neu ist der Abschnitt „Abweichungen“:

  • Statuswörter in der Ausgabe sind englisch.
  • failed ist als zusätzlicher Status dazugekommen.
  • Bei einem Abbruch steht die ERROR-Zeile auf stdout, aber keine Exportausgabe.
  • LINK_RE liegt jetzt in kb_scan.py, filters.raw_predicates ist neu, captured_manifests ist aus raw status herausgelöst.
  • Der Demo-Filter --tag guideline steht in kb/CONVENTIONS.md, mit einem Abschnitt in der Vorlage.

Offen ist nur noch stack-close.

**Changelog:** Gebaut und publiziert als `283cdae` (8.0.0-beta.44), CI-Lauf #554 grün, Release-Lauf #555 hat die Beta korrekt übersprungen. Alle Akzeptanzkriterien sind abgehakt. Der Body beschreibt jetzt den gebauten Stand. Neu ist der Abschnitt „Abweichungen“: - Statuswörter in der Ausgabe sind englisch. - `failed` ist als zusätzlicher Status dazugekommen. - Bei einem Abbruch steht die ERROR-Zeile auf stdout, aber keine Exportausgabe. - `LINK_RE` liegt jetzt in `kb_scan.py`, `filters.raw_predicates` ist neu, `captured_manifests` ist aus `raw status` herausgelöst. - Der Demo-Filter `--tag guideline` steht in `kb/CONVENTIONS.md`, mit einem Abschnitt in der Vorlage. Offen ist nur noch `stack-close`.
Author
Owner

Changelog: Abgeschlossen.

  • Die Vorlage setzt den Leitlinien-Filter jetzt als Vorgabe. Vorher stand dort ein Platzhalter, und den liest setup-instance.md als Setup-Frage. Version 8.0.0-beta.45, Commit 40839d9, CI-Lauf #557 grün.
  • Vier Konzeptseiten im Demo-Korpus tragen jetzt tags: guideline.
  • Die Doku-Prüfung hat sonst nichts Veraltetes gefunden.
  • Nachbefund: Auf allen vier getaggten Seiten stehen noch eine leere, handgeschriebene ## Beziehungen-Überschrift und ein ## Siehe auch-Abschnitt. Ob die Seiten bereinigt werden oder der Export solche Abschnitte entfernt, entscheidet der Betreiber. Body final, Issue geschlossen.
**Changelog:** Abgeschlossen. - Die Vorlage setzt den Leitlinien-Filter jetzt als Vorgabe. Vorher stand dort ein Platzhalter, und den liest `setup-instance.md` als Setup-Frage. Version 8.0.0-beta.45, Commit `40839d9`, CI-Lauf #557 grün. - Vier Konzeptseiten im Demo-Korpus tragen jetzt `tags: guideline`. - Die Doku-Prüfung hat sonst nichts Veraltetes gefunden. - Nachbefund: Auf allen vier getaggten Seiten stehen noch eine leere, handgeschriebene `## Beziehungen`-Überschrift und ein `## Siehe auch`-Abschnitt. Ob die Seiten bereinigt werden oder der Export solche Abschnitte entfernt, entscheidet der Betreiber. Body final, Issue geschlossen.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: torben/chemenu#179