diff --git a/kb/concepts/Delete Rather Than Anonymize.md b/kb/concepts/Delete Rather Than Anonymize.md new file mode 100644 index 0000000..24e4405 --- /dev/null +++ b/kb/concepts/Delete Rather Than Anonymize.md @@ -0,0 +1,72 @@ +--- +type: types/concept.md +concept_type: decision +tags: [] +created: 2026-09-01 +modified: 2026-09-01 +related: [Chemenu] +sources: ['Source - Public Release, Corpus Purge and History Squash Session 2026-09-01'] +confidence: 0.90 +confidence_base: 0.70 +provenance: sourced +summary: 'Private Korpusinhalte per Loeschung entfernen statt zu anonymisieren: ein Seitentitel ist der einzige Identifier eines Wikis, Umbenennen ist die volle page-lifecycle-Prozedur je Seite, Loeschen ist ein unterstuetztes Kommando.' +--- +# Delete Rather Than Anonymize + +**Typ:** Decision + +## Definition + +Wenn private oder sensible Inhalte aus einem Wiki entfernt werden müssen, ist Löschen einer +zugehörigen Seite in der Regel dem Anonymisieren (Umbenennen, Ersetzen sensibler Details bei +sonst unverändertem Inhalt) vorzuziehen - wenn ein unterstütztes Löschkommando existiert. + +## Kernpunkte + +- Ein Seitentitel ist in einem verlinkten Wiki oft der **einzige Identifier** einer Seite: Er + lebt in Wikilinks, Zitatmarkern und Frontmatter-Arrays jeder referenzierenden Seite. Ihn zu + ändern (Anonymisieren durch Umbenennen) verlangt deshalb eine vollständige Rename-Prozedur pro + betroffener Seite - bei mehreren zusammenhängenden Seiten multipliziert sich der Aufwand. +- Löschen dagegen ist ein einzelner, unterstützter Vorgang, der eine Seite mechanisch aus dem + Rest des Wikis de-linkt (bekannte Referenzarten: Frontmatter-Felder, ganzzeilige + Verweis-Aufzählungen). Er ist damit für strukturelle Bereinigung **schneller und weniger + fehleranfällig** als Anonymisierung. +- Bei Inhalten, die eine reale Topologie beschreiben (z. B. eine Infrastrukturdokumentation), + entschärft Anonymisieren einzelner Bezeichner (Hostnamen, IP-Adressen) die eigentliche + Preisgabe nicht: Die Struktur - welche Systeme wie zusammenhängen - bleibt erhalten, auch wenn + die Namen ausgetauscht sind. +- **Grenze der Methode:** Ein mechanisches Löschkommando entfernt typischerweise nur + strukturelle Referenzen (Frontmatter, Aufzählungen), nicht zwingend Erwähnungen im Fließtext + einer anderen Seite. Nach der Löschung ist eine gezielte Nachkontrolle nötig, ob der entfernte + Name noch im Klartext irgendwo im Wiki steht. + +## Wann zu verwenden + +- Der zu entfernende Inhalt ist als eigenständige Seite oder eigenständige Seitengruppe + abgrenzbar. +- Ein Löschkommando existiert, das Referenzen mechanisch bereinigt (nicht ein bloßes Entfernen + der Datei, das tote Links hinterlässt). +- Der Inhalt beschreibt eine reale, zusammenhängende Struktur (Infrastruktur, ein Netzwerk, eine + Organisation), bei der einzelne Bezeichner austauschen die eigentliche Preisgabe nicht behebt. + +## Wann NICHT zu verwenden + +- Wenn nur ein einzelner sensibler Wert innerhalb einer sonst wertvollen, generischen Seite + steht (z. B. ein Firmenname als Beispiel in einer sonst allgemeingültigen Anleitung) - dort ist + gezieltes Redigieren der Seite treffender als sie komplett zu verwerfen. +- Wenn die Seite Beziehungen trägt, die für sich genommen wertvoll und nicht sensibel sind - dann + kann eine Neufassung mit generischem Beispiel sinnvoller sein als Löschung. + +## Verwandte Concepts + +- [[Mass-Update Gate]] + +## Beziehungen + +- **gilt fuer:** [[Chemenu]] + +## Siehe auch + +- [[Source - Public Release, Corpus Purge and History Squash Session 2026-09-01]] +- [[Chemenu]] + diff --git a/kb/concepts/Dual Licensing by File Plan.md b/kb/concepts/Dual Licensing by File Plan.md new file mode 100644 index 0000000..3a30020 --- /dev/null +++ b/kb/concepts/Dual Licensing by File Plan.md @@ -0,0 +1,71 @@ +--- +type: types/concept.md +concept_type: decision +tags: [] +created: 2026-09-01 +modified: 2026-09-01 +related: [Chemenu] +sources: ['Source - Public Release, Corpus Purge and History Squash Session 2026-09-01'] +confidence: 0.50 +confidence_base: 0.70 +provenance: sourced +summary: Ein Repo mit Code- und Inhaltsanteil erhaelt zwei Lizenzen; die Grenze zwischen ihnen ist kein zweiter, gepflegter Pfadkatalog, sondern der ohnehin vorhandene Dateiplan des Distributionswerkzeugs. +--- +# Dual Licensing by File Plan + +**Typ:** Decision + +## Definition + +Ein Repository, das sowohl Werkzeug-Code als auch inhaltliches Material (Dokumentation, Daten, +kompiliertes Wissen) enthält, bekommt zwei Lizenzdateien statt einer - eine für den Code, eine +für den Inhalt. Welche Datei zu welcher Lizenz gehört, wird nicht in einer eigenen, zweiten +Liste festgehalten, sondern aus dem Dateiplan abgeleitet, den ein vorhandenes +Distributions-/Build-Werkzeug ohnehin pflegt. + +## Kernpunkte + +- Der naheliegende Fehler ist, die Grenze zwischen „Code" und „Inhalt" als eigene, gepflegte + Aufzählung von Pfaden in der Lizenzdatei selbst festzuschreiben. Das ist eine zweite Kopie + einer Regel, die bereits an anderer Stelle existiert (dem Dateiplan des Build-/ + Distributionswerkzeugs) - und die Kopie, die driftet, wenn sich Verzeichnisse verschieben. +- Stattdessen verweist die Lizenz-Notiz auf den bestehenden Plan (z. B. eine Funktion, die + berechnet, was in eine Distribution exportiert wird und was nicht) als **einzige** Quelle der + Wahrheit für die Grenze. +- Welche der beiden Lizenzen den generischen Dateinamen `LICENSE` trägt, ist keine + Nebensächlichkeit: Es sollte die Lizenz sein, die ein Code-Hosting-Dienst (Forge) für das + Repository insgesamt meldet - typischerweise die restriktivere/Copyleft-Lizenz. Ein Leser, der + eine Copyleft-Pflicht übersieht, wird dadurch geschädigt; wer eine Pflicht zu viel annimmt, + nicht. +- Ein Distributions-Export, der Code unter einer Copyleft-Lizenz ausliefert, muss die + zugehörige Lizenzdatei zwingend mitliefern (nicht optional, nicht still übersprungen, wenn sie + fehlt) - sonst ist die exportierte Instanz eine Lizenzverletzung, sobald sie veröffentlicht + wird. + +## Wann zu verwenden + +- Ein Repository trägt sowohl Software-/Werkzeugcode als auch Inhalt mit eigenem + Urheberrechtscharakter (Dokumentation, Wissensbasis, Daten), für die unterschiedliche Lizenzen + angemessen sind. +- Es existiert bereits ein Werkzeug, das programmatisch entscheidet, welche Dateien zu welcher + Kategorie gehören (z. B. für einen Export- oder Build-Schritt). + +## Wann NICHT zu verwenden + +- Bei einem Repository, dessen Inhalt untrennbar mit dem Code verwoben ist und für das keine + separate, maschinell nachvollziehbare Grenze existiert - dort wäre die Lizenz-Zuordnung selbst + wieder eine unabhängige, drift-anfällige Liste. + +## Verwandte Concepts + +- [[Chemenu]] + +## Beziehungen + +- **gilt fuer:** [[Chemenu]] + +## Siehe auch + +- [[Source - Public Release, Corpus Purge and History Squash Session 2026-09-01]] +- [[Chemenu]] + diff --git a/kb/concepts/INDEX.md b/kb/concepts/INDEX.md index c101a37..d3b5a62 100644 --- a/kb/concepts/INDEX.md +++ b/kb/concepts/INDEX.md @@ -2,7 +2,7 @@ # kb/concepts/ - Index -76 page(s). Regenerated by `wikitool index rebuild`. +78 page(s). Regenerated by `wikitool index rebuild`. ## All @@ -25,9 +25,11 @@ | [[CPPC]] | protocol | Hardwareschnittstelle Collaborative Processor Performance Control für feingranulares CPU-Power-Management zwischen Betriebssystem und AMD-Prozessor. | 2026-08-29 | | [[Cross-platform Agent Skills]] | architecture | Architektur fuer Agent-Skills, die ueber mehrere LLM-Werkzeuge hinweg funktionieren; in Chemenu selbst am 2026-08-04 umgesetzt und ueberprueft | 2026-09-01 | | [[Crystallization]] | workflow | Verdichten abgeschlossener Erkundungen, Debugging-Sitzungen und Recherchen zu strukturierten Wiki-Auszügen als eigenständige Wissensquellen. | 2026-08-29 | +| [[Delete Rather Than Anonymize]] | decision | Private Korpusinhalte per Loeschung entfernen statt zu anonymisieren: ein Seitentitel ist der einzige Identifier eines Wikis, Umbenennen ist die volle page-lifecycle-Prozedur je Seite, Loeschen ist ein unterstuetztes Kommando. | 2026-09-01 | | [[Denylist over Allowlist]] | decision | Entscheidung, schreibbare Felder als Schema minus kurzer Sperrliste zu bestimmen statt als gepflegte Positivliste, weil die Positivliste eine zweite Kopie des Schemas waere | 2026-08-31 | | [[Detect-Repair Asymmetry]] | problem | Werkzeugluecke, in der ein Check einen Defekt zuverlaessig meldet, aber kein Befehl ihn behebt - womit die Handeditierung der einzige verbleibende Ausweg ist | 2026-08-31 | | [[Diff-Reviewable Agent Edits]] | decision | Entscheidung, Dateiaenderungen ueber Edit/Write statt ueber Shell-Heredocs zu fahren, weil nur das erste eine pruefbare Diff hinterlaesst | 2026-08-31 | +| [[Dual Licensing by File Plan]] | decision | Ein Repo mit Code- und Inhaltsanteil erhaelt zwei Lizenzen; die Grenze zwischen ihnen ist kein zweiter, gepflegter Pfadkatalog, sondern der ohnehin vorhandene Dateiplan des Distributionswerkzeugs. | 2026-09-01 | | [[Entity Extraction]] | pattern | Erkennen und Strukturieren von Entities (Personen, Projekte, Bibliotheken, Concepts, Dateien, Entscheidungen, Systeme, Werkzeuge) samt typspezifischer Attribute aus Rohquellen. | 2026-08-29 | | [[Episodic Memory]] | architecture | Speicherschicht für verdichtete Sitzungszusammenfassungen und Befunde; Brücke zwischen rohem Working Memory und langlebigem Semantic Memory. | 2026-08-29 | | [[Event-Driven Automation]] | workflow | Muster, das automatische Auslöser an Wiki-Lebenszyklusereignisse hängt, um manuellen Pflegeaufwand und das Risiko der Verwahrlosung zu senken. | 2026-08-29 | diff --git a/kb/entities/projects/Chemenu.md b/kb/entities/projects/Chemenu.md index 8b2034b..0d03b24 100644 --- a/kb/entities/projects/Chemenu.md +++ b/kb/entities/projects/Chemenu.md @@ -4,8 +4,8 @@ entity_type: project tags: [wiki, llm, knowledge-base] created: 2026-08-04 modified: 2026-09-01 -related: [Personalization Plane, Issue Label Scheme, Optional Instance Context File] -sources: [Source - Copilot Skill Restructure Instructions, Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04, Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30, Source - Conversation - Comma Bug Budget Refund and Lint Report Path Session 2026-08-31, Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31, Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31, Source - Conversation - Gate Counting and Measured Calibration Session 2026-08-31, Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31, Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31] +related: [Personalization Plane, Issue Label Scheme, Optional Instance Context File, Delete Rather Than Anonymize, Dual Licensing by File Plan] +sources: [Source - Copilot Skill Restructure Instructions, Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04, Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30, Source - Conversation - Comma Bug Budget Refund and Lint Report Path Session 2026-08-31, Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31, Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31, Source - Conversation - Gate Counting and Measured Calibration Session 2026-08-31, Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31, Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31, 'Source - Public Release, Corpus Purge and History Squash Session 2026-09-01'] confidence: 0.90 confidence_base: 0.90 provenance: mixed @@ -60,6 +60,8 @@ Das Repository hat bereits ein deterministisches CLI, `tools/wikitool` (Python, - **verwendet:** [[Personalization Plane]] - **verwendet:** [[Issue Label Scheme]] - **verwendet:** [[Optional Instance Context File]] +- **wendet an:** [[Delete Rather Than Anonymize]] +- **wendet an:** [[Dual Licensing by File Plan]] ## Details @@ -210,6 +212,9 @@ Repositorys selbst und keine Aussagen aus einer Rohdatenquelle; der Änderungsda - [[Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31]] - [[Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31]] - [[Optional Instance Context File]] +- [[Source - Public Release, Corpus Purge and History Squash Session 2026-09-01]] +- [[Delete Rather Than Anonymize]] +- [[Dual Licensing by File Plan]] ## Fußnoten diff --git a/kb/entities/tools/wikitool.md b/kb/entities/tools/wikitool.md index 0e72d87..1ef49ef 100644 --- a/kb/entities/tools/wikitool.md +++ b/kb/entities/tools/wikitool.md @@ -5,7 +5,7 @@ tags: [cli, automation, deterministic, wiki-management] created: 2026-08-03 modified: 2026-09-01 related: [Semantic Lint Automation, Session Orientation, Iteration and Cost Limits, KB Stack Versioning, KB Migration, Personalization Plane, Detect-Repair Asymmetry, Write-Once Frontmatter Fields, Denylist over Allowlist, Command Round-Trip Integrity, Green Suite Blind Spot, Ambient Environment Dependency, Structural Enforcement over Documented Rule, Optional Instance Context File] -sources: [Source - LLM Improvements Codex Analysis, Source - LLM Improvements Sonnet Analysis, Source - Copilot Skill Restructure Instructions, Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04, Source - LLM Improvements Production Agent Gaps 2026, Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30, Source - Conversation - Comma Bug Budget Refund and Lint Report Path Session 2026-08-31, Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31, Source - Conversation - Auto Mode and Tool Choice Session 2026-08-31, Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31, Source - Conversation - Gate Counting and Measured Calibration Session 2026-08-31, Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31, Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31, Source - Conversation - ENVIRONMENT.md as an Optional Third Session-Level File Session 2026-08-31] +sources: [Source - LLM Improvements Codex Analysis, Source - LLM Improvements Sonnet Analysis, Source - Copilot Skill Restructure Instructions, Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04, Source - LLM Improvements Production Agent Gaps 2026, Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30, Source - Conversation - Comma Bug Budget Refund and Lint Report Path Session 2026-08-31, Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31, Source - Conversation - Auto Mode and Tool Choice Session 2026-08-31, Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31, Source - Conversation - Gate Counting and Measured Calibration Session 2026-08-31, Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31, Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31, Source - Conversation - ENVIRONMENT.md as an Optional Third Session-Level File Session 2026-08-31, 'Source - Public Release, Corpus Purge and History Squash Session 2026-09-01'] confidence: 0.90 confidence_base: 0.90 provenance: sourced @@ -147,6 +147,20 @@ ist[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30]. ## Historie +- 2026-09-01 - `2.1.0`-`2.2.2`: Vorbereitung und Durchführung der Veröffentlichung. `dist export` + bekommt `REQUIRED_ROOT_FILES` (fehlende Lizenzdateien lassen den Export scheitern statt still + weiterzulaufen) und `find_leaks()` (strukturelle Prüfung des fertigen Export-Plans gegen + Personalisierungsdateien, `instructions/dev/`, `kb/`- und `raw/`-Inhalte - bewusst kein + Text-Muster-Scan, weil der eigene Hostname legitim in `INSTALL.md`/`version.py` steht). `publish` + bekommt ein drittes Gate: das **Publish-Remote-Gate** prüft die aufgelöste Push-URL (nicht den + Remote-Namen) gegen eine optionale, gitignorete `.wikitool-remotes.json` und hat als einziges + der drei Gates keinen `--confirm`-Token - der Weg daran vorbei ist ein bewusster Edit der + Datei durch den Nutzer, nie durch einen Agenten. `doctor` bekommt den `publish-remotes`-Check. + Ein `raw_dir`-Testfixture löste `config.ROOT` gegen das echte Repo-Root statt die Fixture auf + und bestand nur, weil zufällig ein Verzeichnis existierte, das der Korpus-Schnitt entfernte - + in der Fixture geschlossen, nicht im einzelnen Test, aus demselben Grund wie Gitea #8. + Siehe [[Chemenu]], [[Mass-Update Gate]], [[Delete Rather Than Anonymize]], + [[Dual Licensing by File Plan]][^s-public-release-corpus-purge-and-history-squash-session-2026-09-01] - 2026-09-01 - `2.0.0` (Commit `9a7abe6`, 730 Tests grün): das Python-Paket heißt `chemenu` statt `wiki_tools`, **das Kommando bleibt `wikitool`**. Der Import-Name eines Pakets ist ein flacher globaler Namensraum ohne Kollisionsschutz, `wiki_tools` war dafür zu generisch; @@ -249,6 +263,7 @@ ist[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30]. - [[Structural Enforcement over Documented Rule]] - [[Optional Instance Context File]] - [[Source - Conversation - ENVIRONMENT.md as an Optional Third Session-Level File Session 2026-08-31]] +- [[Source - Public Release, Corpus Purge and History Squash Session 2026-09-01]] ## Fußnoten @@ -261,3 +276,4 @@ ist[^s-conversation-versioning-ci-cd-and-content-migration-session-2026-08-30]. [^s-conversation-agents-md-skill-restructuring-session-2026-08-04]: [[Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04]] [^s-conversation-hardening-the-test-suite-against-silent-environment-dependencies-session-2026-08-31]: [[Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31]] [^s-llm-improvements-codex-analysis]: [[Source - LLM Improvements Codex Analysis]] +[^s-public-release-corpus-purge-and-history-squash-session-2026-09-01]: [[Source - Public Release, Corpus Purge and History Squash Session 2026-09-01]] diff --git a/kb/index.md b/kb/index.md index f3b7986..923aef1 100644 --- a/kb/index.md +++ b/kb/index.md @@ -13,11 +13,11 @@ The page tables live in a generated `INDEX.md` inside each collection, linked be ## Statistics -- **Total Pages:** 170 +- **Total Pages:** 173 - **Comparisons:** 1 -- **Concepts:** 76 +- **Concepts:** 78 - **Entities:** 72 -- **Sources:** 21 +- **Sources:** 22 - **Last Updated:** 2026-09-01 --- @@ -27,9 +27,9 @@ The page tables live in a generated `INDEX.md` inside each collection, linked be | Collection | Pages | Index | |------------|------:|-------| | `comparisons/` | 1 | [comparisons/INDEX.md](comparisons/INDEX.md) | -| `concepts/` | 76 | [concepts/INDEX.md](concepts/INDEX.md) | +| `concepts/` | 78 | [concepts/INDEX.md](concepts/INDEX.md) | | `entities/` | 72 | [entities/INDEX.md](entities/INDEX.md) | -| `sources/` | 21 | [sources/INDEX.md](sources/INDEX.md) | +| `sources/` | 22 | [sources/INDEX.md](sources/INDEX.md) | ### entities/ diff --git a/kb/log.md b/kb/log.md index 39487af..aae25e2 100644 --- a/kb/log.md +++ b/kb/log.md @@ -55,3 +55,9 @@ und `doctor` grün. Die Seite beschrieb sich als persoenliches IT-Wissenswiki; seit der Veroeffentlichung ist diese Instanz Testbett und oeffentliche Demo. Beschreibung, Zweck und Lizenz nachgezogen, die historische Aussage ueber die monolithische AGENTS.md als Ausgangspunkt datiert statt geloescht. --- + +## [2026-09-01] ingest | raw/notes/Conversation Transcript - Public Release, Corpus Purge and History Squash Session 2026-09-01.md + +Source-Seite angelegt, Chemenu und wikitool aktualisiert, zwei neue Concept-Seiten (Delete Rather Than Anonymize, Dual Licensing by File Plan), quer verlinkt. + +--- diff --git a/kb/provenance.md b/kb/provenance.md index 1b4c394..dc6573b 100644 --- a/kb/provenance.md +++ b/kb/provenance.md @@ -8,9 +8,9 @@ inline `[^cite-id]` footnote). ## Coverage Summary -- **Total raw files:** 21 -- **Covered:** 21 -- **Uncovered:** 0 +- **Total raw files:** 24 +- **Covered:** 22 +- **Uncovered:** 2 --- @@ -76,6 +76,19 @@ inline `[^cite-id]` footnote). - Covered by: [[Source - Conversation - Nightly Drift-Check Workflow and doctor's Bootstrap Gap Session 2026-08-31]] - Cited by: [[CI Integration]], [[Gitea Actions]] +### `raw/notes/Conversation Transcript - Private-Instance Merge Correction and Issue 30 Session 2026-09-01.md` + +No source page covers this file yet. + +### `raw/notes/Conversation Transcript - Public Release, Corpus Purge and History Squash Session 2026-09-01.md` + +- Covered by: [[Source - Public Release, Corpus Purge and History Squash Session 2026-09-01]] + - Cited by: [[Chemenu]], [[Delete Rather Than Anonymize]], [[Dual Licensing by File Plan]], [[wikitool]] + +### `raw/notes/Conversation Transcript - Publish-Remote Gate and Issue Triage Session 2026-09-01.md` + +No source page covers this file yet. + ### `raw/notes/Conversation Transcript - Two Round-Trip Defects Found by an Ingest Session 2026-08-31.md` - Covered by: [[Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31]] diff --git a/kb/sources/INDEX.md b/kb/sources/INDEX.md index 40ef06c..0c8890d 100644 --- a/kb/sources/INDEX.md +++ b/kb/sources/INDEX.md @@ -2,7 +2,7 @@ # kb/sources/ - Index -21 page(s). Regenerated by `wikitool index rebuild`. +22 page(s). Regenerated by `wikitool index rebuild`. ## All @@ -28,5 +28,6 @@ | [[Source - LLM Improvements Sonnet Analysis]] | notes | Sonnet-Analyse, die AGENTS.md und wikitool mit Farzas Gist und awesome-llm-wiki vergleicht und die Codex-Analyse um konkrete Empfehlungen zu Qualitätsschwellen, Stilrichtlinie, Auditrhythmus und Skalierung ergänzt | 2026-08-03 | | [[Source - LLM Wiki Pattern]] | article | Grundlegendes Muster für persönliche Wissensbasen mit LLMs: ein dauerhaftes Wiki schrittweise pflegen, statt es aus den Quellen neu herzuleiten. | 2026-07-26 | | [[Source - LLM Wiki v2]] | article | Erweitertes LLM-Wiki-Muster mit Praxiserfahrungen aus agentmemory zu Memory Lifecycle, Confidence Scoring, Wissensgraph und Automatisierung. | 2026-07-26 | +| [[Source - Public Release, Corpus Purge and History Squash Session 2026-09-01]] | notes | Sitzung, die den Chemenu-Stack von einer privaten Testinstanz in ein oeffentliches Repo ueberfuehrt: Korpus geloescht statt anonymisiert, Git-History auf einen Commit gesquashed, AGPL-3.0/CC-BY-4.0-Dual-Lizenz gewaehlt, dist export um einen Leak-Canary gehaertet. | 2026-09-01 | | [[Source - Wine]] | notes | Wine-Konfiguration für Arch Linux: pacman-NoExtract-Einstellungen und Bottles-Runtime-Optionen einschließlich Proton- und Lutris-Varianten. | 2026-08-01 | diff --git a/kb/sources/Source - Public Release, Corpus Purge and History Squash Session 2026-09-01.md b/kb/sources/Source - Public Release, Corpus Purge and History Squash Session 2026-09-01.md new file mode 100644 index 0000000..53e35e9 --- /dev/null +++ b/kb/sources/Source - Public Release, Corpus Purge and History Squash Session 2026-09-01.md @@ -0,0 +1,87 @@ +--- +type: types/source.md +source_type: notes +author: Torben +raw_files: ['raw/notes/Conversation Transcript - Public Release, Corpus Purge and History Squash Session 2026-09-01.md'] +source_language: de +date: 2026-09-01 +tags: [] +entities: [Chemenu, wikitool] +concepts: [Mass-Update Gate, Delete Rather Than Anonymize, Dual Licensing by File Plan] +summary: 'Sitzung, die den Chemenu-Stack von einer privaten Testinstanz in ein oeffentliches Repo ueberfuehrt: Korpus geloescht statt anonymisiert, Git-History auf einen Commit gesquashed, AGPL-3.0/CC-BY-4.0-Dual-Lizenz gewaehlt, dist export um einen Leak-Canary gehaertet.' +--- +# Source: Public Release, Corpus Purge and History Squash Session 2026-09-01 + +**Autor:** Torben +**Datum:** 2026-09-01 +**Raw-Dateien:** raw/notes/Conversation Transcript - Public Release, Corpus Purge and History Squash Session 2026-09-01.md +**Typ:** Notes + +## Zusammenfassung + +Torben bat darum, den Chemenu-Korpus zu bereinigen und das Repo zu veröffentlichen, mit +ausdrücklichem Wunsch nach Teufels-Advokat-Modus und einer kleinen Multi-Agent-Debatte. Drei +parallele Explore-Agenten inventarisierten private Daten, den Distributionsmechanismus und die +Git-History; die History-Prüfung erklärte den Baum fälschlich für „safe to publish", ohne +`USER.md` je zu öffnen — ein Befund, der später den Ausschlag für den vollständigen History-Schnitt +gab. Drei geforkte Debattierer (harte Trennung, geteiltes Upstream, Teufels-Advokat) argumentierten +gegeneinander; die Synthese übernahm „löschen statt anonymisieren" und „History squashen" von der +harten Position, das Clone-mit-Upstream-Modell von der geteilten Position, aber unter der +Bedingung, dass ein Remote-Gate zuerst existiert — eine Bedingung, die der Teufels-Advokat mit +seinem Leck-Argument erzwang. + +Nutzer traf vier Entscheidungen über `AskUserQuestion`: Gitea öffentlich schalten (kleinste +Änderung), Korpus chirurgisch löschen, private Instanz als Clone mit Upstream und Gate zuerst, +und als Lizenz AGPL-3.0 (Stack) + CC-BY-4.0 (Inhalte) — die Affero-Variante bewusst wegen Issue +#19 (MCP-Frontend als Netzdienst). + +Ausgeführt wurde: Lizenzdateien (AGPL-Text von gnu.org geholt, nicht aus dem Gedächtnis +rekonstruiert), ein Leak-Canary in `dist export` (`find_leaks()`, strukturell statt textbasiert, +weil ein Muster-Scan den eigenen legitimen Host mit ausschließen müsste), die Korpus-Löschung +(108 Seiten statt der im Plan geschätzten ~35, weil 40 Seiten mit generischen Titeln tatsächlich +um die private Infrastruktur herum geschrieben waren), der History-Squash auf einen Commit, und +die Veröffentlichung selbst. + +Zwei Annahmen wurden durch Messung widerlegt und korrigiert: Ein Force-Push allein reicht nicht — +der alte HEAD blieb per SHA abrufbar, bis Reflogs auf dem Server verfielen und `gc --prune=now` +lief. Und `rg`-Scans ohne `--hidden` übersehen `.gitea/`, `.github/`, `.vibe/` — ein zweiter +Fund (private Referenzen in `ci.yml`) kam erst über `git grep` zum Vorschein. + +## Kernaussagen + +- Ein Seitentitel ist der einzige Identifier des Wikis; Löschen (`wikitool rm`) ist dafür billiger + und sicherer als Anonymisieren, das die volle `page-lifecycle`-Prozedur pro Seite verlangt. +- Der eigentliche Preisgeber bei einem Infrastruktur-Handbuch ist die Topologie, nicht der + Hostname — gefälschte IPs entschärfen keine Angriffskarte. +- Ein Force-Push macht alte Commits unreferenziert, aber nicht unerreichbar: Sie bleiben per SHA + fetchbar, bis Server-Reflogs verfallen sind und `git gc --prune=now` gelaufen ist. +- `dist export`s Lizenz-Dateien mussten zur Pflicht werden (`REQUIRED_ROOT_FILES`), weil das + übliche `if source.is_file()`-Muster eine fehlende Lizenz still überspringen würde — bei AGPL + eine Verletzung, sobald eine Instanz öffentlich landet. +- Ein Text-Muster-Scan für Leaks scheitert an legitimen Vorkommen des eigenen Hostnamens; ein + struktureller Scan (welche Pfade/Dateien dürfen nie im Plan stehen) umgeht das. + +## Aufgaben + +- [x] Korpus bereinigt, History gesquasht, Lizenzen gesetzt, Repo veröffentlicht (in dieser + Sitzung erledigt) +- [ ] Siehe Issue #27 (Decay-/Lint-Ausschluss für mitgelieferte Seiten) und #28 (Demo-Korpus als + eigene Fixture) für Folgearbeit aus dieser Sitzung + +## Nicht übernommen + +- Die konkreten Namen und Details der gelöschten privaten Infrastruktur (Hostnamen, IP-Bereiche, + persönliche Angaben) sind bewusst nicht in diese Source-Seite übernommen — sie zu wiederholen + widerspräche dem Zweck der Sitzung. Wo sie als Beispiel dienen mussten, steht hier nur die Art + der Information (z. B. "eine Homelab-Cluster-Dokumentation"), nie der Wortlaut. +- Der volle Wortlaut der drei Debattenpositionen ist nicht übernommen - nur ihre tragenden + Argumente und was aus ihnen in die Synthese einging. Der vollständige Text steht im Transkript. + +## Verwandte Entities + +- [[Chemenu]] +- [[wikitool]] + +## Verwandte Concepts + +- [[Mass-Update Gate]] diff --git a/raw/notes/Conversation Transcript - Private-Instance Merge Correction and Issue 30 Session 2026-09-01.md b/raw/notes/Conversation Transcript - Private-Instance Merge Correction and Issue 30 Session 2026-09-01.md new file mode 100644 index 0000000..5e1b393 --- /dev/null +++ b/raw/notes/Conversation Transcript - Private-Instance Merge Correction and Issue 30 Session 2026-09-01.md @@ -0,0 +1,128 @@ +# Conversation Transcript - Private-Instance Merge Correction and Issue 30 Session + +> Source: Claude Code session (`claude-opus-5`), chemenu workspace +> Collected: 2026-09-01 +> Participant: Torben +> Fidelity: **faithful summary transcript, not a verbatim log.** Torben's questions and +> instructions are quoted verbatim; the assistant's reasoning is condensed. All shell output +> shown was produced by real, disposable test repositories built in a scratch directory during +> this session (not the chemenu repository itself) and is reproduced as run. +> No credentials appeared in the session. +> Third of three transcripts cut from this session; the first two cover the corpus/history work +> and the Publish-Remote Gate this one corrects a claim about. + +Covers Torben asking what actually happens to the demo corpus in a private instance when the +upstream changes it - which exposed an unverified, incorrect claim the assistant had just +written into `instructions/private-instance.md` the same day. The claim was tested empirically, +found wrong, corrected in a released patch (2.2.1), and turned into a properly scoped, tested +merge procedure plus a new issue (#30) proposing the fix belongs in the tool itself, or that the +upstream should stop shipping content on the branch private instances pull machinery from. + +--- + +## Turn 1 - "was passiert in der privaten instanz nach diesen schema wenn sich upstream der demo-korpus ändert?" + +The assistant treated this as a request to verify, not answer from the existing text - the +previous transcript's `private-instance.md` had said a `git merge upstream/main` would see +*deleted-in-ours, unmodified-in-theirs* and resolve silently, which was written as an assumption +and never tested. + +Built a throwaway upstream/private pair of git repos in the scratch directory to test it: private +instance deletes the demo corpus once, upstream then modifies one demo page, adds a new one, and +deletes another. Ran a plain `git merge upstream/main`. Result, measured rather than assumed: + +- The upstream's **modified** page produced `CONFLICT (modify/delete)` and left the upstream's + version sitting in the working tree - resolving it the obvious way (`git add -A`) would commit + that version, bringing the deleted demo page back. +- The upstream's **new** page was staged silently. No conflict, no message. +- The upstream's **deleted** page (matching a page already deleted on the private side) produced + nothing - the one case that actually worked as claimed. + +The middle case was the one the original claim missed entirely, and it is the dangerous one +because nothing announces it - a demo page the upstream adds simply arrives and starts showing +up in the private instance's own `lint`, `index`, `search` and `confidence decay`. + +A second candidate fix was tested and also failed: a `.gitattributes` `merge=ours` driver for +`kb/**`/`raw/**`. Same three-scenario test showed the modify/delete conflict still occurred and +the new page still landed - the driver only resolves content conflicts on files both sides +touch, not modify/delete pairs or additions. + +## Turn 2 - Fixing the instruction, in a released patch + +`instructions/private-instance.md` was rewritten: the "Why a clone rather than a tarball" +section now states the measured three-case table instead of the wrong assumption. The update +procedure was rewritten to hold the merge open (`git merge --no-commit --no-ff`), force the +content stages (`kb/`, `raw/`) back to the pre-merge state while `HEAD` still points at the +commit before the merge, commit, and then run an explicit check +(`git diff --name-only $BEFORE HEAD -- kb raw` must be empty) - a check the reader cannot silently +skip past, unlike a claim they might trust. The bad advice in "Decision points" ("resolve a +conflict under kb/ as keep-deleted") was replaced, since that advice is exactly what leads +someone to `git add -A` the leaked content. + +The corrected procedure was itself run against the same three-scenario test plus a fourth +(`raw/` alongside `kb/`), and against error paths (dirty working tree rejected, a second run +with nothing new to pull is a no-op) - all passing before publishing. + +Version bumped `2.2.0 -> 2.2.1`. The changelog entry states plainly that the earlier text was +"nicht gemessen, sondern angenommen" (not measured, assumed) rather than framing it as a minor +wording fix. Published; tests green (752, unchanged in count - this was a documentation fix). + +## Turn 3 - "stelle mal ein sauberes skripting hier exemplarisch dar. gibt es alternative setups? könnten wir die demo/test-seiten aus dem repo main irgendwie heraushalten? erstelle aus dem ganzen thema ein issue... aktualisiere/prüfe, ob #3 im gitea sauber ist. prüfe, ob wir sonst alle offenen enden verdrahtet haben." + +Four asks in one message. Handled in order: + +**A standalone script**, written and tested (not just described) against the same scenario: +rejects a dirty working tree, rejects a concurrent merge/rebase, holds the merge open the same +way the instruction's procedure now does, is a no-op on a second run with nothing new, and exits +non-zero with a rollback command if the post-merge diff check ever finds leaked content - the +check the manual procedure relies on a human to run, made unskippable. + +**Alternative setups**, and the negative result from Turn 1 (`merge=ours` does not work) was kept +rather than omitted, since a rejected alternative is exactly the kind of finding this capture +procedure is meant to preserve. + +**Whether the demo corpus can be kept out of `main` entirely** - assessed as the better fix in +principle: the private-instance script (and the instruction's manual procedure) treats a symptom +on every downstream instance, repeatedly; keeping content off the branch machinery is pulled from +would remove the need for either, by construction, for any new instance. Named as two variants +(a separate `demo` branch, or a separate demo repository) with the real cost stated rather than +glossed over - `main` becomes a content-free shell, which was the reason the corpus was kept in +the first place (as a walkable example), and `nightly.yml`'s corpus lint would need to move. + +**Issue #30 opened**, carrying the measured table, the working script, both alternatives with +their tradeoffs, and the explicit note that it is not a duplicate of #28 but depends on it - #28 +is why the corpus moves at all (demo and testbed sharing one `kb/`), #30 is what that movement +does to a downstream clone. + +**Issue #3 checked against its own acceptance criteria** (all five, from the closed issue's own +text) rather than assumed closed-and-fine: a grep for the pre-rename name outside history/ +changelog/transcripts, presence of a project entity page, the "Thoth" persona note in both +`SOUL.md` and its template, and no active technical identifier still using the old name. Found +clean - the handful of remaining mentions (`INSTALL.md`, two `kb/` pages) were all phrased as +history ("bis 2026-09-01", "damals"), which the criteria explicitly exempt. + +**The wiring audit** turned up the two gaps described in the second transcript's closing turn +(`tools/CONTRACT.md` missing the new gate, `gates.md` not linking to `private-instance.md`) and +the stale project-page description - all three fixed in the same pass and published as 2.2.2, +verified with `docs verify`, `instructions verify`, `doctor` (16 checks OK), `lint` (clean but for +one pre-existing orphan page unrelated to this work), and the full test suite. + +## Turn 4 - This capture + +Torben asked for this session to be captured via `instructions/capture-session.md`, with an +explicit instruction to keep private and confidential material out - consistent with, not +separate from, everything the day's work had been about. Handled by generalizing every +infrastructure and personal-data reference that appeared during the day's audits rather than +reproducing the original identifiers, cutting the session into three topic transcripts (this +being the third), and filing this transcript's own existence as evidence rather than as new +open work - nothing in this turn required a new issue. + +## Outcome + +- **Version:** 2.2.0 -> 2.2.1 -> 2.2.2 +- **Commits:** `private-instance.md` correction (2.2.1), documentation wiring + project-page + rewrite (2.2.2, shared with the second transcript's closing turn) +- **Tests:** 752, green throughout +- **Issues:** #30 opened; #3 verified against its own acceptance criteria and confirmed clean, + no action needed +- **CI:** green after each publish in this transcript's scope diff --git a/raw/notes/Conversation Transcript - Public Release, Corpus Purge and History Squash Session 2026-09-01.md b/raw/notes/Conversation Transcript - Public Release, Corpus Purge and History Squash Session 2026-09-01.md new file mode 100644 index 0000000..c0f15f5 --- /dev/null +++ b/raw/notes/Conversation Transcript - Public Release, Corpus Purge and History Squash Session 2026-09-01.md @@ -0,0 +1,208 @@ +# Conversation Transcript - Public Release, Corpus Purge and History Squash Session + +> Source: Claude Code session (`claude-opus-5`), chemenu workspace +> Collected: 2026-09-01 +> Participant: Torben +> Fidelity: **faithful summary transcript, not a verbatim log.** Torben's instructions and +> decisions are quoted verbatim; the assistant's reasoning and the exploration agents' findings +> are condensed. Command outputs shown are real, but every private hostname, IP address and +> personal detail that appeared during the audit has been **generalized rather than repeated** - +> reproducing them here would undo the point of the session. No secret values (tokens, keys) +> ever appeared. +> **Several passages are second-hand.** Three `Explore` subagents (private-data inventory, +> distribution mechanism, git-history audit) and three forked debate agents (hard-separation, +> shared-upstream, devil's-advocate positions) ran in the background; their findings are +> summarized here, not reproduced verbatim, and are named as such at each point they inform a +> decision. +> One of three transcripts cut from the same session; the other two cover building the +> Publish-Remote Gate and the private-instance procedure, and correcting a bug found in that +> procedure afterward (issue #30). + +Covers turning the chemenu wiki stack from a private testbed into a publishable repository: +deciding what to delete versus anonymize, squashing the git history, choosing a license, and +verifying the result anonymously end to end. Resulted in the corpus purge (108 pages, ~90 raw +files removed), a single-commit public history, `LICENSE`/`LICENSE-CONTENT`/`NOTICE`, the +`dist export` leak canary (2.1.0), a CI fixture fix (2.1.1), and the repository going public on +Gitea. + +--- + +## Turn 1 - "ich möchte die kb hier bereinigen, es soll nur noch test content sein, ich möchte das repo veröffentlichen..." + +Torben's instruction, in substance: clean the KB down to test content, publish the repository, +falsify or remove IP addresses, keep the repo usable as a demo and a testbed going forward; he +would rebuild his real private instance separately. He asked for tips on three specific +questions - how a private fork could pull upstream fixes back, how to set up that private copy +and where to develop the stack, and whether a `kb/manual/` should ship with the distribution so +it documents itself - explicitly requested "mindestens ... teufels anwalt modus" and a small +multi-agent debate, and flagged himself as new to packaging/distributing an LLM application. + +The session started in plan mode. Three `Explore` subagents ran in parallel: + +- **Private-data inventory** - catalogued what in `raw/` and `kb/` was hard-private (a real + home-lab cluster's bootstrap manual, several personal notes, a 2.46 MB conversation transcript + full of infrastructure references), what was anonymizable (internal hostnames, private IP + ranges), and what was legitimately generic (the stack's own concepts, technologies, tools). +- **Distribution mechanism** - read `dist_cmd.py`, `INSTALL.md` and the version-check machinery; + confirmed `dist export` already ships no `kb/`/`raw/` content and that the update feed's + default URL pointed at the (then-private) origin repo. +- **Git-history audit** - measured `.git` size, largest blobs, deleted-file history, and + concluded the tree was "safe to publish" - a conclusion the session later disproved, see Turn 4. + +## Turn 2 - The debate + +Three forked debaters argued from the same context: + +- **A (hard separation):** delete and rebuild the corpus rather than anonymize, because a page + title is the wiki's only identifier and lives in wikilinks/citations/frontmatter across the + corpus - renaming is the full page-lifecycle procedure, deleting is a supported command. + Squash history rather than selective `filter-repo`, because the history audit itself had just + been shown to under-report risk. No shared git ancestry between the public repo and the + private instance, ever. +- **B (shared upstream):** clone-with-`upstream`-remote instead, because the tarball update path + in `INSTALL.md` is `cp -r` with no three-way merge; argued the leak risk from shared history is + a mechanism problem (a remote allowlist), not a discipline problem, and that most of the + corpus (the ~190 generic pages) is worth keeping as real test data rather than deleting it all. +- **C (devil's advocate):** attacked both positions' shared premises - "just a testbed" was + false (`USER.md` is tracked and carries real personal data), "publish the repo" was + underspecified (which host, and what breaks), there was no `LICENSE` at all, a shipped manual + would decay under `confidence_decay.py` and mislead a new instance, and demo/testbed are + conflicting goals for one `kb/`. + +The assistant's synthesis kept A's "delete, don't anonymize" and "squash the history" (C's +finding that the audit under-reported risk made this decisive), adopted B's clone-with-`upstream` +model but **conditioned it on a remote-allowlist gate existing first** (addressing C's leak +concern with code, not discipline), rejected the shipped manual per C's decay argument, and +decided the surviving corpus should lean toward the stack's own self-documentation rather than +Torben's real infrastructure - which the actual corpus math later validated (Turn 5). + +## Turn 3 - Clarifying questions and plan approval + +The assistant asked Torben to choose among concrete options (`AskUserQuestion`) rather than +picking on his behalf: + +- **Publish target:** "Gitea öffentlich schalten" (chosen) over mirroring to GitHub or keeping + Gitea private with a GitHub mirror - smallest change, CI/release feed stay correct as-is. +- **Corpus:** "Chirurgisch löschen (Empfehlung)" (chosen) over full synthetic rebuild or + anonymization. +- **Private instance:** "Clone mit upstream, Gate zuerst (Empfehlung)" (chosen) over hard + separation or a later migration. +- **License:** first pass "Was wäre CC-BY-4 für content und eine GPL oder LGPL fürs Tooling? + Berate mich hier noch mal" - the assistant advised against LGPL (no library-linking use case + here to justify the fetch-only variant), and named the real choice as GPL vs. **AGPL**, because + issue #19 (an MCP frontend for `wikitool`) points toward running the stack as a network + service, which is exactly the gap GPL leaves and AGPL closes. Torben chose **AGPL-3.0 + + CC-BY-4.0**. + +The written plan covered: publish blockers (license, `dist export` allowlist, `INSTALL.md` +token wording), the corpus purge, the history squash, the private-instance model with the gate +as a precondition, why the manual idea was declined, and a leak-canary for `dist export`. Torben +approved it via `ExitPlanMode` without further changes. + +## Turn 4 - Executing the license and leak-canary work (2.1.0) + +Before touching content: a full repo bundle backup outside the tree, verified by `git bundle +verify` and a commit-count comparison (150 commits, all 15 tags present). + +- Fetched the AGPL-3.0 text from `gnu.org` (not reconstructed from memory - a license must be + the authoritative text) and copied the CC-BY-4.0 text from the vendored `commonplace` + submodule, per the license each already carries. +- Added `LICENSE` (AGPL - deliberately the AGPL rather than a separate `LICENSE-CODE`, because + that is the file a forge reports for the repository, and under-noticing a copyleft obligation + harms a reader in a way over-noticing does not), `LICENSE-CONTENT` (CC-BY), `NOTICE` (the + license boundary and the `commonplace` attribution CC-BY requires). +- `dist_cmd.py`: added the three license files to `ROOT_FILES`, and a separate + `REQUIRED_ROOT_FILES` check that **fails the export** if they are missing - every other + `ROOT_FILES` entry is copied `if source.is_file()` and silently skipped otherwise, which is + wrong for a license (a distribution shipping AGPL code with no license text is a violation the + moment it is published). +- Added `find_leaks()`: a structural (not text-pattern) check of the finished export plan against + personalization files, `instructions/dev/`, `kb/` pages and `raw/` sources - rejected a + hostname/IP text-scan approach, because the project's own host legitimately appears in + `INSTALL.md` and `version.py`, so such a scan would either whitelist the string it's looking + for or false-positive on every export. +- Six new tests in `test_dist_cmd.py`; full suite green; version bumped `2.0.0 -> 2.1.0`. + +## Turn 5 - The corpus purge + +A workshop (`work/publish-cleanup`) was opened per `work/CONTRACT.md`, because ~103 planned +`wikitool rm` calls exceed a single iteration-budget unit. + +Analysis found the plan's estimate wrong in a way worth recording: not ~35 pages would become +sourceless after deleting the obviously-private ones, but **75**. Splitting them: 28 were the +user's own infrastructure (unambiguous), and **40 carried generic technology titles but were +written entirely around the user's own cluster** (a storage page explained itself via one +specific storage class name, a Kubernetes page via the user's own network ranges) - not +reusable pages with a private example, but private documentation with a generic heading. The +remaining 7 were genuinely clean in body text but sourced from the user's personal +document-processing pipeline. + +Presented to Torben as a three-way choice; he chose **"Alle 75 löschen"** over keeping the +clean 7 (via provenance reclassification) or rewriting the 40 as vendor-neutral pages. The +result: 152 pages plus 25 sources remained by design - the stack's own self-documentation +(gates, lint, versioning, search, the wiki pattern itself), which the earlier debate had argued +for without knowing this would be the actual outcome. + +Execution: `wikitool rm --page