Commit 43fd220
feat(t1b): kfx auf T1b ohne Codeaenderung, und mfi sagt jetzt ab (MF-1023/1024)
Zwei MF in einem Commit, und das gehoert begruendet: MF-1023 (mfi) war
fertig und wurde vom Tor „build define parity" abgewiesen — aus einem
Grund, der selbst ein Fund ist (unten). Beim Beheben lag MF-1024 (kfx)
schon im Baum, und die abgeleiteten Zahlen (STAND.md,
VERIFICATION_TIERS.md) sind kumulativ. Sie kuenstlich zu trennen haette
einen Zwischenstand erfunden, den es nicht gab.
═══ MF-1024: kfx von T3 auf T1b, ohne eine Zeile Codeaenderung ═══
Der Leser war **richtig** — ihm fehlte nur ein Abbild von fremder Hand.
hxcfes `KRYOFLUXSTREAM`-Modul (ACCESS = RW) schreibt je Spur eine
eigene Datei in der kanonischen Benennung `trackNN.S.raw`; zwei davon
liegen jetzt im Korpus.
Gemessen, ohne Aenderung am Plugin:
Sonde ja, Konfidenz 75 (MF-729: 50..79 = „Struktur gelesen")
open 0, 1 Zylinder, 1 Kopf (ein Strom IST eine Spur)
Spur 0 rc=0, 0 Sektoren, 115631 Rohbyte = die ganze Datei
Die Zusicherung ist **flussgerecht**, nicht sektorweise: ein
KryoFlux-Strom liefert keine Sektoren, und die Sektortafel dieses
Tests waere fuer ihn das falsche Mass (dieselbe Ueberlegung wie bei
`mfi` in MF-1020).
Stattdessen prueft sie die STRUKTUR mit `uft_kfc_stream_is_valid()`
(MF-919): die Funktion laeuft die OOB-Kette ab und haelt die in den
Bloecken **eingebettete** Stromposition gegen ihre eigene Zaehlung der
Nicht-OOB-Bytes. Gemessen je Strom **10 OOB-Bloecke und 3
Indexmarken** — eine Aussage ueber die Datei, nicht ueber unseren
Code.
**Und die Gegenprobe gehoert dazu, weil `kfx` genau daran einmal
gescheitert ist.** MF-919 hat gemessen, dass die alte Sonde
`0x0D`-Bytes ZAEHLTE und in 512 Zufallsbytes nie „nein" sagen konnte.
Heute fallen durch:
64 KB Pseudozufall OOB 1, Index 0 -> ungueltig
ein gekipptes 0x0D im Strom OOB 7, Index 3 -> ungueltig
eine IMD-Datei OOB 24, Index 0 -> ungueltig
Ein Erkenner, dessen „nein" nicht vorgefuehrt ist, ist kein Erkenner.
═══ MF-1023: mfi — der gepackte Strom war der Sektorinhalt ═══
Zwei Befunde am MFI-Leser, gemessen an `hxcfe_pc160.mfi`.
**Die Kopfzahl der Datei wurde ignoriert.** `uint8_t c = count / 2;
uint8_t h = count % 2;` — fest zwei Koepfe. Unabhaengig nachgelesen
sagt die Datei: `cyl_count = 42` (Aufloesung 0), `head_count = 1`, 42
belegte Eintraege. Gemeldet wurden **21 Zylinder und 2 Koepfe** — die
halbe Diskette auf einem Kopf, den es nicht gibt. Gestalt von MF-1016
(`jv1` erfand eine zweite Seite).
Nebenbei: der Lauf brach bei einem leeren Spureintrag ab („End
marker"). Den gibt es im Format nicht — MAME liest genau
`cyl_count * head_count` Eintraege und behandelt einen leeren als
leere Spur. Gestalt von MF-1017 (`jv3`). **In dieser Pruefdatei ist
kein Eintrag leer**, der Abbruch hat hier also nicht zugeschlagen;
Befund 1 allein erklaert die 21. Das steht so im Code, weil eine
Ursache, die man nicht gemessen hat, keine ist.
**Der zlib-Strom war der Sektorinhalt.** „Sektor 0" begann mit
`78 9C ED` — `78 9C` ist der zlib-Kopf —, und bei mehr als 65535 Byte
wurde still abgeschnitten. Das Wissen stand im Kommentar („Track data
is zlib-compressed") und nicht im Code; der Aufrufer bekam `UFT_OK`.
Gestalt von MF-864.
`read_track` sagt jetzt `UFT_ERROR_NOT_SUPPORTED`; eine leere Spur
bleibt eine Aussage und liefert `UFT_OK` ohne Inhalt.
**Warum nicht entpackt wird — P3-329.** Der Baum hat keinen
erreichbaren Entpacker: CMake setzt bei `ZLIB_FOUND` ein Makro, das
**keine** C-Datei liest; `uft_imz.c` prueft einen ANDEREN Namen, den
niemand definiert; die `.pro` des primaeren Baus kennt zlib nicht. Das
zu aendern ist eine Eigentuemer-Entscheidung (Anti-Ziel „keine neuen
Dependencies"), die drei Wege stehen mit ihren Kosten in P3-329.
Die Merkmalstafel sagt es jetzt genau: `Read: PARTIAL` mit Begruendung
— gelesen werden Kennung, Kopf, Geometrie und Spurtabelle, die
Spurdaten nicht. Der Weg dahin gehoert dazu: erst stand `UNSUPPORTED`
da, und `test_capability_manifest` hat zu Recht geblockt („ZU WENIG"),
weil sein Traeger fuer „Read" hart `open && read_track` ist; dann war
`CAP_READ` entfernt — auch zu grob, denn „nicht lesbar" ist eine
andere Aussage als „liest den Behaelter, nicht die Daten".
**`mfi` geht NICHT auf T1b**, obwohl das Fixture im Korpus liegt und
die Provenienz vollstaendig ist: der Manifest-Eintrag verknuepft
keinen Test. T1b heisst „ein Fremdwerkzeug hat die Datei erzeugt und
UFT liest sie" — UFT liest den Behaelter, nicht die Daten.
═══ Warum das erste MF-1023 abgewiesen wurde ═══
Das Tor `scripts/define_parity_gate.py` meldete:
C:UFT_HAS_ZLIB ist keine Abweichung mehr — Eintrag aus
scripts/define_parity_baseline.json entfernen
Die Grundlinie fuehrt `C:UFT_HAS_ZLIB` als „kein Verbraucher im
Quellcode". Ich hatte den Makronamen in einem **Zeichenketten-Literal**
der Merkmalstafel genannt — und das Tor streift Kommentare ab,
Zeichenketten aber nicht. Zu Recht: ein Makro kann als WERT benutzt
werden, und `UFT_VERSION_STRING` waere sonst ein Falschbefund.
Also hat **meine Prosa ein Tor erfuellt**, ohne dass sich am Code
etwas geaendert haette. Die Grundlinie zu kuerzen waere die falsche
Antwort gewesen — es gibt weiterhin keinen Verbraucher. Der Name steht
jetzt nur noch im Kommentar, und eine Warnung fuer die naechste Hand
steht daneben.
Kennzahl (Regel 9): **T1b 35 → 36**, **T3 26 → 25** (`kfx`). `mfi`
bleibt T2. Korpus: +230 KB in zwei Stromdateien; Tore Korpus-Herkunft
0 Befunde bei 43 Eintraegen, Korpus-Inhalt 45 gegen Grundlinie 45,
define-parity 0 Abweichungen.
Tests: 402/402 gruen (ein benannter Skip: test_freezer);
`tests/test_fremde_hand_liest.c` jetzt **14 gruen, 0 rot**.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BHdqfaZ5RFb1HPcw7NYoEY1 parent 369f3d8 commit 43fd220
10 files changed
Lines changed: 641 additions & 385 deletions
File tree
- docs
- src/formats/mfi
- tests
- corpus_free
- corpus_manifest
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
17 | | - | |
18 | | - | |
| 17 | + | |
| 18 | + | |
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| |||
121 | 121 | | |
122 | 122 | | |
123 | 123 | | |
124 | | - | |
125 | | - | |
| 124 | + | |
| 125 | + | |
126 | 126 | | |
127 | 127 | | |
128 | 128 | | |
| |||
312 | 312 | | |
313 | 313 | | |
314 | 314 | | |
315 | | - | |
| 315 | + | |
316 | 316 | | |
317 | 317 | | |
318 | 318 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
520 | 520 | | |
521 | 521 | | |
522 | 522 | | |
| 523 | + | |
523 | 524 | | |
524 | 525 | | |
525 | 526 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
| 11 | + | |
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| |||
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
42 | | - | |
| 42 | + | |
43 | 43 | | |
44 | 44 | | |
45 | 45 | | |
| |||
0 commit comments