18ae28f918
Chemenu kompiliert Rohnotizen zu einem verlinkten, quellengebundenen Wiki: raw/ -> types/ + tools/ -> kb/ -> reports/. Was mechanisch ist, macht tools/wikitool; was Urteil braucht, macht ein Agent unter Contracts, deren Grenzen in Code durchgesetzt sind statt im Prompt. Dieser Commit ist der Startpunkt der oeffentlichen Historie. Die vorherige Entwicklung fand in einer privaten Instanz statt und ist nicht Teil dieses Repositorys; ihre Erzaehlung steht vollstaendig in CHANGES.md, das mit 44 Eintraegen von 0.1.0 bis 2.1.0 erhalten geblieben ist. Der mitgelieferte Korpus ist ein Testbett und eine Demo: 170 Seiten ueber den Stack selbst - Gates, Lint, Versionierung, Suche, das Wiki-Muster. Er dokumentiert das Werkzeug mit den eigenen Mitteln des Werkzeugs. Lizenz: AGPL-3.0 fuer den Stack (tools/, types/), CC-BY-4.0 fuer die Inhalte. Die Grenze zwischen beiden ist der Dateiplan, den dist export berechnet - siehe NOTICE.
136 lines
8.0 KiB
Markdown
136 lines
8.0 KiB
Markdown
---
|
|
type: types/concept.md
|
|
concept_type: problem
|
|
tags: [tooling, lint, provenance, hand-edit, gap]
|
|
created: 2026-08-31
|
|
modified: 2026-08-31
|
|
related: [wikitool, Lint Workflow, Self-Healing, Issue Label Scheme, Write-Once Frontmatter Fields, Command Round-Trip Integrity]
|
|
sources: [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 - Two Round-Trip Defects Found by an Ingest Session 2026-08-31]
|
|
confidence: 0.50
|
|
confidence_base: 0.50
|
|
provenance: sourced
|
|
summary: Werkzeugluecke, in der ein Check einen Defekt zuverlaessig meldet, aber kein Befehl ihn behebt - womit die Handeditierung der einzige verbleibende Ausweg ist
|
|
---
|
|
# Detect-Repair Asymmetry
|
|
|
|
**Typ:** Problem
|
|
|
|
## Definition
|
|
|
|
Detect-Repair Asymmetry beschreibt den Zustand, in dem ein Werkzeug einen Defekt zuverlässig
|
|
**meldet**, aber keinen Befehl anbietet, der ihn **behebt**. Der Agent, dem das Werkzeug den
|
|
Befund vorlegt, hat dann genau zwei Auswege: den Defekt stehen lassen oder ihn von Hand
|
|
reparieren. In einem Stack, dessen Kernprinzip lautet, dass Mechanisches das Werkzeug erledigt
|
|
und niemals die Hand, führt eine solche Lücke die Handeditierung als einzige verbleibende
|
|
Option wieder ein - an genau der Stelle, an der die Regeln sie am dringendsten ausschließen
|
|
wollen.
|
|
|
|
Die Asymmetrie ist keine Regelverletzung, sondern ein Konstruktionsfehler in der
|
|
Werkzeugoberfläche. Sie fällt erst auf, wenn der gemeldete Defekt zum ersten Mal wirklich
|
|
auftritt.
|
|
|
|
## Kernpunkte
|
|
|
|
- **Melden und Reparieren sind getrennte Fähigkeiten.** Ein Check zu schreiben ist billig, ein
|
|
Reparaturbefehl teuer, weil er den korrekten Zielzustand kennen und atomar herstellen muss.
|
|
Deshalb entsteht die Lücke nicht aus Nachlässigkeit, sondern aus dem Kostengefälle zwischen
|
|
beiden.
|
|
- **Der Befund selbst erzeugt den Druck.** Solange niemand die kaputte Referenz sieht, gibt es
|
|
keinen Anlass, sie von Hand zu korrigieren. Sobald `lint` sie in jedem Lauf meldet, ist die
|
|
Handeditierung der kürzeste Weg zu einem sauberen Lauf.
|
|
- **Fall aus diesem Wiki (2026-08-31):** `lint` und `sources coverage` melden kaputte
|
|
`raw_files:`-Referenzen zuverlässig, aber kein `wikitool`-Befehl schreibt `raw_files:` auf
|
|
einer bestehenden Seite. `touch` deckt die Felder ab, die die Seite selbst beschreiben,
|
|
`xref` die Seiten-Referenz-Arrays; `raw_files:` ist keines von beidem, weil es auf einen Pfad
|
|
zeigt und nicht auf einen Seitentitel. `new source --set raw_files=…` schreibt das Feld genau
|
|
einmal, bei der Erstellung[^s-conversation-comma-bug-budget-refund-and-lint-report-path-session-2026-08-31].
|
|
- **Formal erlaubt ist nicht dasselbe wie beabsichtigt.** Invariante 1 aus `AGENTS.md` zählt
|
|
Katalog, `log.md`, `provenance.md`, die Skill-Verzeichnisse, die beiden JSON-Dateien und die
|
|
Seiten-Referenz-Arrays auf. `raw_files:` steht in keiner dieser Aufzählungen, die
|
|
Handeditierung ist also nicht verboten - sie widerspricht nur dem Kernprinzip, aus dem die
|
|
Aufzählung
|
|
stammt[^s-conversation-comma-bug-budget-refund-and-lint-report-path-session-2026-08-31].
|
|
- **Die Reparatur gehört dorthin, wo der Zwischenzustand nie existiert.** Für den konkreten
|
|
Fall wurde `raw rename` vorgeschlagen, das `git mv` und jede referenzierende Source-Seite in
|
|
einem Schritt erledigt, statt eines nachgelagerten `sources relink`: nur in der gebündelten
|
|
Form gibt es keinen Moment, in dem die Datei weg ist und die Referenz
|
|
hängt[^s-conversation-comma-bug-budget-refund-and-lint-report-path-session-2026-08-31].
|
|
- **Der Fall wurde am selben Tag geschlossen, und wie er geschlossen wurde, ist die
|
|
Verallgemeinerung.** `1.4.0` (Commit `dbe2f73`) gab `touch` ein `--set`/`--add`/`--remove`,
|
|
das jedes vom Schema deklarierte Feld erreicht statt nur `raw_files:`. Der Reparaturbefehl
|
|
wurde also nicht auf den gemeldeten Befund zugeschnitten, sondern auf die Feldklasse, zu der
|
|
er gehört - siehe
|
|
[[Write-Once Frontmatter Fields]][^s-conversation-write-once-frontmatter-fields-and-touch-set-session-2026-08-31].
|
|
- **Die gebündelte Form blieb trotzdem offen.** `raw rename`, das `git mv` und jede
|
|
referenzierende Source-Seite in einem Schritt erledigt, wurde als Issue #16 abgespalten. Der
|
|
Zwischenzustand „Datei weg, Referenz hängt" existiert seit `1.4.0` also kürzer - zwei Befehle
|
|
statt einer Handeditierung -, aber er existiert noch[^s-conversation-write-once-frontmatter-fields-and-touch-set-session-2026-08-31].
|
|
- **Zweiter Fall, andere Herkunft (2026-08-31):** auf einer Source-Seite stand ein `related:`,
|
|
das `types/source.md` nicht deklariert. `lint` meldete den Schema-Fehler zuverlässig, aber
|
|
`xref remove` räumte nur deklarierte Felder und erreichte ihn nicht. Die Asymmetrie entstand
|
|
hier nicht aus einer fehlenden Fähigkeit, sondern daraus, dass ein Schwesterbefehl einen
|
|
Zustand schreiben konnte, den der Gegenbefehl nicht kannte - geschlossen mit `1.6.0`
|
|
(Gitea-Issue #18). Die Klasse dieser Kombination ist
|
|
[[Command Round-Trip Integrity]][^s-conversation-two-round-trip-defects-found-by-an-ingest-session-2026-08-31]
|
|
- **Verwandt, aber nicht dasselbe wie [[Self-Healing]]:** Self-Healing beschreibt, dass ein
|
|
Lauf gefundene Mängel automatisch behebt. Detect-Repair Asymmetry beschreibt den Fall davor -
|
|
dass es den Befehl, den ein Self-Healing-Lauf aufrufen müsste, überhaupt nicht gibt.
|
|
|
|
## Beispiele
|
|
|
|
- [[wikitool]] - `lint` und `sources coverage` meldeten kaputte `raw_files:`-Referenzen, ohne
|
|
dass ein Befehl sie korrigierte (Gitea-Issue #14, geschlossen mit `1.4.0`); die gebündelte
|
|
Reparatur `raw rename` ist als Issue #16 offen
|
|
- [[Lint Workflow]] - der Lauf, der den Befund erzeugt und damit den Druck, ihn von Hand
|
|
wegzuräumen
|
|
- [[wikitool]] - `lint` meldete das undeklarierte `related:` auf einer Source-Seite, das kein
|
|
Befehl entfernen konnte (Gitea-Issue #18, geschlossen mit `1.6.0`)
|
|
|
|
## Wann zu verwenden
|
|
|
|
- Beim Entwurf eines neuen Checks: prüfen, ob es für jeden Befund, den er erzeugen kann, einen
|
|
Befehl gibt, der ihn behebt. Wenn nicht, ist der Check ohne den zugehörigen Reparaturbefehl
|
|
unvollständig ausgeliefert.
|
|
- Bei der Bewertung einer wiederkehrenden Handeditierung: die Frage ist nicht, warum der Agent
|
|
sie vorgenommen hat, sondern welcher Befehl fehlte.
|
|
|
|
## Wann NICHT zu verwenden
|
|
|
|
- Für Befunde, die ein Urteil verlangen und deshalb gar keinen deterministischen Zielzustand
|
|
haben - ein Widerspruch zwischen zwei Seiten oder eine veraltete Aussage sind semantische
|
|
Befunde, kein fehlender Befehl.
|
|
- Als Begründung, einen Check wegzulassen, bis die Reparatur fertig ist. Ein gemeldeter Defekt
|
|
ohne Reparatur ist immer noch besser als ein unbemerkter.
|
|
|
|
## Verwandte Concepts
|
|
|
|
- [[Self-Healing]]
|
|
- [[Lint Workflow]]
|
|
|
|
## Beziehungen
|
|
|
|
- **abgegrenzt gegen:** [[Write-Once Frontmatter Fields]]
|
|
- **tritt auf in:** [[wikitool]]
|
|
- **wird sichtbar durch:** [[Lint Workflow]]
|
|
- **abgegrenzt gegen:** [[Self-Healing]]
|
|
- **verwandt mit:** [[Issue Label Scheme]]
|
|
- **abgegrenzt gegen:** [[Command Round-Trip Integrity]]
|
|
|
|
## Siehe auch
|
|
|
|
- [[Write-Once Frontmatter Fields]]
|
|
- [[wikitool]]
|
|
- [[Lint Workflow]]
|
|
- [[Self-Healing]]
|
|
- [[Issue Label Scheme]]
|
|
- [[Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31]]
|
|
- [[Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31]]
|
|
- [[Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31]]
|
|
- [[Command Round-Trip Integrity]]
|
|
|
|
## Fußnoten
|
|
|
|
[^s-conversation-comma-bug-budget-refund-and-lint-report-path-session-2026-08-31]: [[Source - Conversation - Comma Bug Budget Refund and Lint Report Path Session 2026-08-31]]
|
|
[^s-conversation-write-once-frontmatter-fields-and-touch-set-session-2026-08-31]: [[Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31]]
|
|
[^s-conversation-two-round-trip-defects-found-by-an-ingest-session-2026-08-31]: [[Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31]]
|