raw accept: Datums-Shard statt Typverzeichnis, fidelity/authority am Drop-Punkt (Teil 1/3, #67)
CI / verify (push) Successful in 52s
Release / release (push) Successful in 35s

Files changed:
- .gitignore
- CHANGES.md
- VERSION
- instructions/bootstrap.md
- instructions/wiki-ingest/SKILL.md
- kb/CONTRACT.md
- raw/CONTRACT.md
- tools/CONTRACT.md
- tools/chemenu/commands/dist_cmd.py
- tools/chemenu/commands/docs_verify.py
- tools/chemenu/commands/new_page.py
- tools/chemenu/commands/raw_cmd.py
- tools/chemenu/commands/touch.py
- tools/chemenu/lint_core.py
- tools/chemenu/tests/test_dist_cmd.py
- tools/chemenu/tests/test_docs_verify.py
- tools/chemenu/tests/test_lint.py
- tools/chemenu/tests/test_new_page.py
- tools/chemenu/tests/test_provenance.py
- tools/chemenu/tests/test_raw_cmd.py
- tools/chemenu/tests/test_touch.py
- tools/chemenu/tests/test_type_resolver.py
- tools/chemenu/type_resolver.py
- types/source.md
- types/source.schema.yaml
This commit is contained in:
2026-09-08 21:42:27 +02:00
parent f2a093bc8b
commit f4353ccfb3
25 changed files with 1167 additions and 344 deletions
+82 -1
View File
@@ -35,7 +35,7 @@ dev-checkout concern - readable here, never shipped as something to parse.
---
## 4.8.0-beta.7 - 2026-09-08 - source_type: Default streichen, unclassified als sichtbares Fach, layout: fuer source (schliesst #66)
## 4.8.0-beta.8 - 2026-09-08 - raw accept: Datums-Shard statt Typverzeichnis, fidelity/authority am Drop-Punkt (schliesst #67)
**Author:** Torben Nehmer
@@ -48,6 +48,7 @@ dev-checkout concern - readable here, never shipped as something to parse.
- update entity naming conventions to use singular form for consistency
- kb/concepts/ bekommt Areas: layout: fuer concept, Area-Titel aus jedem Type-Spec, Schwellen-Empfehlung im lint (schliesst #59)
- source_type: Default streichen, unclassified als sichtbares Fach, layout: fuer source (schliesst #66)
- raw accept: Datums-Shard statt Typverzeichnis, fidelity/authority am Drop-Punkt (schliesst #67)
<!-- /wikitool:bumps -->
Das Label `status/incoming` gibt es seit heute in Gitea: der Mensch legt einen
@@ -418,6 +419,86 @@ maschinengelesenes Format. Kein `--breaking`, kein Migrationsdokument.
Schließt #66.
**`raw accept`: Datums-Shard statt Typverzeichnis, `fidelity`/`authority` am Drop-Punkt** (#67,
Paket B von vier — A ist #66 oben, C ist #68, D ist #69): zwei unabhängige Befunde, ein
Codepfad.
Befund 1: `raw/CONTRACT.md`s vier Typverzeichnisse (`articles/`, `documents/`, `notes/`,
`assets/`) lösten keinen der drei Gründe ein, die einen Verzeichnis-Split rechtfertigen —
`raw/` wird nie durchgeblättert, keine Klausel dieser Datei galt je pro Verzeichnis, alle vier
verrotten gleich (unveränderlich, nie gelöscht). Der Split kostete real: der Mensch trifft beim
Ablegen in `incoming/<typ>/` eine Routing-Entscheidung, die später blind nach `source_type:`
abgeschrieben wird — genau darüber entstand der in #66 korrigierte Bias (`raw/notes/` hielt laut
altem Contract-Text „Gesprächsprotokolle", 16 der 25 Dateien dort waren tatsächlich Transkripte).
Befund 2: was am Drop-Punkt bekannt ist und danach nirgends mehr — wie treu eine Erfassung ist
und was das Material über seinen Gegenstand behaupten darf. Zwei neue, unabhängige Achsen auf
`types/source.md`: `fidelity` (`verbatim`/`published`/`secondhand`/`nontextual`) und `authority`
(`normative`/`reporting`/`opinion`), beide mit `unknown` als backfill-only-Wert.
Umgesetzt:
- `raw accept` adressiert eine Datei jetzt über `raw/<YYYY>/<MM>/`, berechnet aus dem
Annahmedatum — eine reine Funktion von etwas Unveränderlichem, kann also nie rebalancieren und
keinen `[^cite-id]`-Anker brechen. `incoming/` wird flach; ein Unterverzeichnis wird toleriert
und ignoriert statt inspiziert (alte `incoming/<typ>/`-Skripte laufen unverändert weiter).
Bestandsdateien in `raw/articles|documents|notes|assets/` bleiben unbewegt und weiter gültige
`--replaces`-Ziele — das Layout war nirgends versioniert, es gibt also keine „zwei Korpusformen".
Wächst eine bereits promotete Einzeldatei zum Bündel, entsteht das Bündel an ihrem eigenen
Speicherort, nie im heutigen Shard — ein Bündel aus altem und neuem Datum hätte keine
eindeutig richtige Adresse.
- Stem-Eindeutigkeit (#64) gilt jetzt global über `raw/`, nicht mehr pro Typverzeichnis —
ohne Typverzeichnisse als Grenze wäre die Prüfung sonst wirkungslos gegen ein Bündel in einem
anderen Shard oder einem Alt-Verzeichnis.
- `fidelity`/`authority`: neu in `types/source.schema.yaml`, ohne `default:` und bewusst
**nicht** in `required:` (sonst bricht jede bestehende Instanz an der Validierung — die
MINOR-Einstufung unten hängt daran). Erzwungen stattdessen im Werkzeug: `raw accept` verlangt
beide Flags immer; trägt der Aufruf `--page`, schreibt es sie direkt auf die Zielseite, sonst
druckt es die fertige `new source --set fidelity=... --set authority=...`-Folgezeile, und
`new source` verweigert seinerseits ohne beide Werte. `unknown` ist backfill-only — weder
`raw accept` noch `new source` dürfen es schreiben.
- Capture-Felder sind **fill-once**, nicht auf `touch.py`s `UNSETTABLE`-Denylist: eine Denylist
hätte auch den ersten (Backfill-)Schreibzugriff verboten, den der Migrationslauf braucht.
`touch --set <feld>=<wert>` schreibt nur, solange das Feld fehlt, und verweist danach auf
`raw accept --replaces` als einzigen Korrekturweg — der einzige Aufruf, der einen bereits
gesetzten Capture-Wert überschreiben darf, weil eine korrigierte Erfassung eine neue Edition
der Quelle ist, keine Bearbeitung der Seite. `types/source.md` deklariert die Feldliste selbst
(`capture_fields:`), gelesen über `TypeResolver.get_capture_fields` statt an drei Stellen
hartkodiert.
- `lint` bekommt einen neuen beratenden Befund, *Confidence Above Source Standing*: die
Autoritätsbewertung, die `kb/CONVENTIONS.md`s Confidence-Rubrik seit je verlangt („+0.1 für
offizielle Doku"), aber nirgends festhielt. Eine stackseitige Obergrenzentabelle in
`kb/CONTRACT.md` (`reporting` 0.8, `opinion` 0.6, `secondhand`/`nontextual` 0.7, `normative`/
`verbatim`/`published`/`unknown` ohne Obergrenze) begrenzt `confidence_base`, ersetzt es aber
nicht — eine Formel hätte zwei widersprechende Ableitungen derselben Zahl, und Autorität ist
eine Obergrenze, kein Determinant. Nicht in `HARD_ERROR_KEYS`. Auf dieser Instanz meldet der
Befund aktuell nichts: kein Bestand trägt die neuen Felder, das ist erwartet, nicht geprüft.
- Aufgeräumt: `dist_cmd.RAW_SUBDIRS` und der darauf laufende `docs verify`-Check
(`check_raw_subdirs`) entfallen ersatzlos, `raw/CONTRACT.md`s Routing-Tabelle beschreibt
stattdessen den Shard, die Ignore-Kanarie wandert von `incoming/documents/probe.pdf` auf
`incoming/probe.pdf`.
**MINOR**, `4.8.0-beta.8` desselben Kandidaten — drei geprüfte Bedingungen: `raw accept` nimmt
weiterhin Dateien aus `incoming/<irgendwas>/` an, statt sie zu verweigern; `fidelity`/`authority`
stehen nicht in `required:`; die zwei neuen Pflichtflags an `raw accept` sind eine
Verhaltensänderung, aber dieselbe Einstufung, die #66s `new source`-Verweigerung im selben
Kandidaten schon bekam. Kein `--breaking`, kein Migrationsdokument nötig — kein Bestand wird
durch diesen Bump ungültig.
Geändert: `raw/CONTRACT.md`, `types/source.md`, `types/source.schema.yaml`,
`tools/chemenu/commands/raw_cmd.py` (Neufassung), `tools/chemenu/commands/new_page.py`
(Capture-Feld-Pflicht), `tools/chemenu/commands/touch.py` (`_capture_field_or_fail`,
Fill-once), `tools/chemenu/type_resolver.py` (`get_capture_fields`),
`tools/chemenu/commands/dist_cmd.py`/`docs_verify.py` (Aufräumen), `tools/chemenu/lint_core.py`
(neuer Befund), `kb/CONTRACT.md` (Obergrenzentabelle), `tools/CONTRACT.md`, `.gitignore`,
`instructions/bootstrap.md`, `instructions/wiki-ingest/SKILL.md` (Schritt 1 und 6), zugehörige
Tests.
Absichtlich nicht in diesem Publish: der Backfill über die 31 bestehenden Source-Seiten (eigener
`work/`-Lauf nach `instructions/migrate-corpus.md`, eigenes Mass-Update-Gate) und die
Beleg-/Fundzeile im Changelog dazu — #67 bleibt bis dahin offen, dieser Bump deckt Schritt 1 der
im Issue festgehaltenen Drei-Publish-Abfolge.
---
## 4.7.4 - 2026-09-04 - bootstrap.md nennt den session-id-WARN nach frischem Bootstrap explizit als erwartet