Anlass: #231 hat testfiles/pdf/ auf 17 PDFs und rund 48 MB erweitert (u. a. ecoDMS-Handbuch 296 S., „Azure for Architects“ 701 S.). tools/chemenu/tests/test_raw_derive_testfiles.py leitete jede Datei unter testfiles/ zweimal ab und nahm sie an; allein Azure braucht für eine Ableitung 48 s. Das lief in jedem CI-Lauf, auch wenn ein Commit keinen Konverter berührte. Und viele aussagekräftige Testquellen (Verlagsbücher, Herstellerunterlagen, Dokumente mit Personendaten) dürfen nicht in dieses öffentliche Repo.
Stand: abgeschlossen
Veröffentlicht als Commit 71170bc (Kandidat 10.1.0-beta.2), dazu zwei Nachzüge beim Abschluss ohne Versionssprung: 028f620 (docs/dev/development.md: Zugang über die Freigabe im privaten Repo) und c439dc6 (Kopfkommentar von converters.yml, statt des überflüssigen 1Password-Wegs).
Verifiziert durch:
71170bc: ci.yml Lauf 698 grün; release.yml als Kandidat Lauf 700 grün (converters übersprungen); converters.yml per workflow_dispatch auf main Lauf 702 grün (8,7 min, 33 Tests). Der automatische Lauf 699 auf demselben Commit war rot, allein wegen der Zugriffseinstellung (Punkt 4).
028f620 (nur docs/): nur ci.yml gestartet, Lauf 705 grün; converters.yml nicht gestartet.
c439dc6 (nur converters.yml): ci.yml Lauf 706 grün, converters.yml von selbst gestartet, Lauf 707 grün.
Release-Gate: Läufe 703 und 704 (siehe unten).
Entscheidung (Betreiber, 2026-10-14)
Die Konverter-Tests gegen reale Dokumente laufen in einem eigenen Workflow, nicht im Standard-CI-Lauf.
Ein Release prüft sie beim Veröffentlichen.
Ändert ein Commit die Konverter, läuft der Workflow automatisch über einen Pfad-Filter; stack-dev/stack-build bekommen die Anweisung, ihn abzuwarten.
Testkorpus und Konverter-Test-Harness liegen in einem eigenen, privaten Git-Repo, das für die Testläufe gezielt geladen wird. Dort liegen auch Quellen, die nicht öffentlich eingecheckt werden können.
Beim Bau bestätigt (2026-10-14): Name torben/chemenu-testfiles; der Betreiber hat das Repo angelegt und das Hochladen der Dateien dorthin ausdrücklich freigegeben.
Umsetzung
Privates Repo torben/chemenu-testfiles mit:
corpus/<format>/…: alle bisherigen Dateien aus testfiles/ (mail, office, pdf, zip) plus die 13 neuen PDFs aus #231. 34 Dateien, jede per SHA-256 gegen das Original geprüft. Die zwei Bücher sind beim Umzug umbenannt (azure-for-architects-3e.pdf, concurrency-in-csharp-cookbook.pdf).
harness/: test_raw_derive_testfiles.py (mit dem pytest-Marker testfiles) und eine conftest.py, die die hermetischen Fixtures der Stack-Suite über pytest_plugins = ["chemenu.tests.conftest"] borgt. Die Vergleichswerkzeuge aus #233 kommen dort hinzu.
README.md: Herkunftstabelle mit einer Spalte „Public“, dazu Aufruf und Layout. Die Herkunft der 13 neuen PDFs steht größtenteils auf „unknown“ oder „no“; sie zu ergänzen ist Sache des Betreibers und kein Kriterium dieses Pakets.
Ort im Arbeitsbaum: eigener Klon nach testfiles/, testfiles/ steht in .gitignore. Kein Submodul. Fehlt der Klon, fehlt nur dieser Lauf; nichts in tools/chemenu/tests/ braucht ihn. Die bisher versionierten 22 Dateien sind aus diesem Repo entfernt (Historie bleibt), ebenso das Testmodul und der -text-Block in .gitattributes.
Harness gegen den Arbeitsbaum:cd tools && .venv/bin/python -m pytest -c pytest.ini ../testfiles/harness. -c pytest.ini wendet die Konfiguration der Suite auf ein Harness außerhalb von tools/ an. Eine Konverter-Änderung, die erwartete Ausgaben (.expect) ändert, sind zwei Commits, einer je Repo, der private zuerst; der Workflow testet immer main des privaten Repos. Weil das Harness repository_tree_guard aus der Suite borgt, darf während eines lokalen Laufs nichts im Stack-Checkout geändert werden.
Workflow .gitea/workflows/converters.yml: Aufbau wie ci.yml, checkt zusätzlich das private Repo nach testfiles/ aus und führt das Harness aus. Zugang: ${{ gitea.token }}. Der Token liest das zweite private Repo, weil dessen eigene Actions-Einstellungen torben/chemenu Zugriff gewähren; eine Einstellung in chemenu selbst wirkt nicht. Ohne die Freigabe scheitert der Checkout mit „Determining the default branch … not found“ (Läufe 699, 701). Ein 1Password-Token, im Entwurf als Ausweg vorgesehen, ist damit nicht nötig. Kopfkommentar und docs/dev/development.md sagen das. Auslöser: push auf main mit paths: – tools/chemenu/filters/**, tools/chemenu/commands/raw/derive.py, tools/chemenu/commands/raw/accept.py, tools/chemenu/tests/test_raw_derive*.py, tools/chemenu/tests/binary_formats.py, tools/requirements.txt, .gitea/workflows/converters.yml –, dazu workflow_dispatch. Ein Push ins private Repo löst nichts hier aus; dann von Hand starten. Der Runner arbeitet Läufe nacheinander ab: converters reiht sich hinter ci.yml und dessen pwsh-Job ein.
Standard-CI:ci.yml unverändert; der Test ist mit dem Modul umgezogen. Die Suite lief mit --cov auf 3064 bestanden, 4 übersprungen, 91,25 % gesamt; die Untergrenze 85 hält (CI Lauf 698).
Release: Statt workflow_call (in dieser Gitea-Instanz nicht belegt) trägt release.yml einen eigenen ersten Job converters mit denselben Schritten; release hat needs: converters. Für -beta.N entscheidet der Job skip aus VERSION und läuft nicht. Der Kommentar in release.yml verweist für die Begründung auf converters.yml.
Anweisungen:dev-setup.md (neuer Schritt 6, Klon und Zugang), publish-and-ci.md (Schritt 3: der converters-Lauf startet von selbst bei Konverter-Pfaden, wird abgewartet, rot zählt wie rotes CI; von Hand über dispatch_workflow auf main), testing-conventions.md (Scope).
Doku:docs/dev/development.md (Absatz zu testfiles/, Workflow-Liste, Release-Gate, Zugang); der Changelog-Eintrag nennt den Umzug.
Beleg des Release-Gates
Probelauf auf dem Wegwerf-Zweig gate-probe-232 (inzwischen gelöscht), damit nie ein echter Release oder Tag entstehen kann: VERSION = 99.0.0 (ohne Suffix), in release.yml ist der Job release durch ein einziges echo REACHED ersetzt; gestartet per dispatch_workflow auf dem Zweig.
Lauf 703, Harness-Schritt absichtlich rot (kein Test passt zum Schlüsselwort, pytest Exit 5): converters rot, release übersprungen.
Lauf 704, Harness-Schritt grün (Teilmenge -k "nist or ifg"): converters grün, release gestartet und REACHED ausgegeben.
Danach: Zweig gelöscht; es gibt weder Tag noch Release v99.0.0 (neuester Tag v10.0.0).
Akzeptanzkriterien
torben/chemenu-testfiles ist privat und enthält corpus/ (alle bisherigen Dateien + die 13 neuen PDFs), harness/ und README.md mit Herkunftstabelle. (Lauf 702 lädt es und führt das Harness aus.)
In diesem Repo ist testfiles/ nicht mehr versioniert und steht in .gitignore; ein frischer Klon ohne Zugang zum privaten Repo besteht pytest, docs verify und instructions verify. (CI Lauf 698 ohne testfiles/.)
Ein Commit, der nur Stack-Dateien außerhalb der Pfade aus Punkt 4 ändert, startet ci.yml, aber nicht converters.yml. (028f620, nur docs/dev/development.md: Lauf 705 ci.yml, kein converters-Lauf.)
Ein Commit, der eine Datei unter tools/chemenu/filters/ ändert, startet converters.yml von selbst – nach #231 verschoben: Dieses Paket ändert nichts unter filters/, und für den Beleg allein eine Konverter-Änderung zu bauen, wäre eine Änderung ohne Inhalt. #231 ist die erste Änderung dort und trägt das Kriterium. Hier belegt ist derselbe Mechanismus über einen anderen Eintrag der paths:-Liste: .gitea/workflows/converters.yml startete den Workflow zweimal von selbst (Läufe 699, 707), und Lauf 707 lud das private Repo und führte das Harness über alle Dateien aus.
workflow_dispatch von converters.yml funktioniert auf main. (Lauf 702.)
Ein Release ohne Suffix entsteht nur nach grünem Harness-Lauf im selben Release-Lauf; bei Rot kein Tag. (Läufe 703 rot und 704 grün, oben.)
Die Coverage-Untergrenze in ci.yml hält. (Lokal 91,25 % bei Untergrenze 85; CI Lauf 698 grün.)
dev-setup.md, publish-and-ci.md, testing-conventions.md und docs/dev/development.md beschreiben den neuen Ablauf; docs verify findet keinen toten Link auf testfiles/README.md.
CI und converters.yml auf dem veröffentlichten Commit grün. (71170bc: 698, 702; letzter Commit c439dc6: 706, 707.)
Versionsteil
Patch im laufenden Kandidaten: 10.1.0-beta.2. tools/ und instructions/ liegen im Version-Gate. Drop-in: Workflows, testfiles/ und instructions/dev/ gehen mit dist export nicht in eine Instanz. Die beiden Nachzüge (docs/, .gitea/) liegen außerhalb des Gates und brauchten keinen Sprung.
Anlass: #231 hat `testfiles/pdf/` auf 17 PDFs und rund 48 MB erweitert (u. a. ecoDMS-Handbuch 296 S., „Azure for Architects“ 701 S.). `tools/chemenu/tests/test_raw_derive_testfiles.py` leitete jede Datei unter `testfiles/` zweimal ab und nahm sie an; allein Azure braucht für eine Ableitung 48 s. Das lief in jedem CI-Lauf, auch wenn ein Commit keinen Konverter berührte. Und viele aussagekräftige Testquellen (Verlagsbücher, Herstellerunterlagen, Dokumente mit Personendaten) dürfen nicht in dieses öffentliche Repo.
## Stand: abgeschlossen
Veröffentlicht als Commit `71170bc` (Kandidat `10.1.0-beta.2`), dazu zwei Nachzüge beim Abschluss ohne Versionssprung: `028f620` (`docs/dev/development.md`: Zugang über die Freigabe im privaten Repo) und `c439dc6` (Kopfkommentar von `converters.yml`, statt des überflüssigen 1Password-Wegs).
Verifiziert durch:
- `71170bc`: `ci.yml` Lauf 698 grün; `release.yml` als Kandidat Lauf 700 grün (`converters` übersprungen); `converters.yml` per `workflow_dispatch` auf `main` Lauf 702 grün (8,7 min, 33 Tests). Der automatische Lauf 699 auf demselben Commit war rot, allein wegen der Zugriffseinstellung (Punkt 4).
- `028f620` (nur `docs/`): nur `ci.yml` gestartet, Lauf 705 grün; `converters.yml` nicht gestartet.
- `c439dc6` (nur `converters.yml`): `ci.yml` Lauf 706 grün, `converters.yml` von selbst gestartet, Lauf 707 grün.
- Release-Gate: Läufe 703 und 704 (siehe unten).
## Entscheidung (Betreiber, 2026-10-14)
- Die Konverter-Tests gegen reale Dokumente laufen in einem **eigenen Workflow**, nicht im Standard-CI-Lauf.
- **Ein Release prüft sie** beim Veröffentlichen.
- Ändert ein Commit die Konverter, läuft der Workflow **automatisch über einen Pfad-Filter**; `stack-dev`/`stack-build` bekommen die Anweisung, ihn abzuwarten.
- **Testkorpus und Konverter-Test-Harness liegen in einem eigenen, privaten Git-Repo**, das für die Testläufe gezielt geladen wird. Dort liegen auch Quellen, die nicht öffentlich eingecheckt werden können.
- Beim Bau bestätigt (2026-10-14): Name `torben/chemenu-testfiles`; der Betreiber hat das Repo angelegt und das Hochladen der Dateien dorthin ausdrücklich freigegeben.
## Umsetzung
1. **Privates Repo `torben/chemenu-testfiles`** mit:
- `corpus/<format>/…`: alle bisherigen Dateien aus `testfiles/` (mail, office, pdf, zip) plus die 13 neuen PDFs aus #231. 34 Dateien, jede per SHA-256 gegen das Original geprüft. Die zwei Bücher sind beim Umzug umbenannt (`azure-for-architects-3e.pdf`, `concurrency-in-csharp-cookbook.pdf`).
- `harness/`: `test_raw_derive_testfiles.py` (mit dem pytest-Marker `testfiles`) und eine `conftest.py`, die die hermetischen Fixtures der Stack-Suite über `pytest_plugins = ["chemenu.tests.conftest"]` borgt. Die Vergleichswerkzeuge aus #233 kommen dort hinzu.
- `README.md`: Herkunftstabelle mit einer Spalte „Public“, dazu Aufruf und Layout. Die Herkunft der 13 neuen PDFs steht größtenteils auf „unknown“ oder „no“; sie zu ergänzen ist Sache des Betreibers und kein Kriterium dieses Pakets.
2. **Ort im Arbeitsbaum:** eigener Klon nach `testfiles/`, `testfiles/` steht in `.gitignore`. Kein Submodul. Fehlt der Klon, fehlt nur dieser Lauf; nichts in `tools/chemenu/tests/` braucht ihn. Die bisher versionierten 22 Dateien sind aus diesem Repo entfernt (Historie bleibt), ebenso das Testmodul und der `-text`-Block in `.gitattributes`.
3. **Harness gegen den Arbeitsbaum:** `cd tools && .venv/bin/python -m pytest -c pytest.ini ../testfiles/harness`. `-c pytest.ini` wendet die Konfiguration der Suite auf ein Harness außerhalb von `tools/` an. Eine Konverter-Änderung, die erwartete Ausgaben (`.expect`) ändert, sind zwei Commits, einer je Repo, der private zuerst; der Workflow testet immer `main` des privaten Repos. Weil das Harness `repository_tree_guard` aus der Suite borgt, darf während eines lokalen Laufs nichts im Stack-Checkout geändert werden.
4. **Workflow `.gitea/workflows/converters.yml`**: Aufbau wie `ci.yml`, checkt zusätzlich das private Repo nach `testfiles/` aus und führt das Harness aus. Zugang: `${{ gitea.token }}`. Der Token liest das zweite private Repo, weil dessen eigene Actions-Einstellungen `torben/chemenu` Zugriff gewähren; eine Einstellung in `chemenu` selbst wirkt nicht. Ohne die Freigabe scheitert der Checkout mit „Determining the default branch … not found“ (Läufe 699, 701). Ein 1Password-Token, im Entwurf als Ausweg vorgesehen, ist damit nicht nötig. Kopfkommentar und `docs/dev/development.md` sagen das. Auslöser: `push` auf `main` mit `paths:` – `tools/chemenu/filters/**`, `tools/chemenu/commands/raw/derive.py`, `tools/chemenu/commands/raw/accept.py`, `tools/chemenu/tests/test_raw_derive*.py`, `tools/chemenu/tests/binary_formats.py`, `tools/requirements.txt`, `.gitea/workflows/converters.yml` –, dazu `workflow_dispatch`. Ein Push ins private Repo löst nichts hier aus; dann von Hand starten. Der Runner arbeitet Läufe nacheinander ab: `converters` reiht sich hinter `ci.yml` und dessen pwsh-Job ein.
5. **Standard-CI:** `ci.yml` unverändert; der Test ist mit dem Modul umgezogen. Die Suite lief mit `--cov` auf 3064 bestanden, 4 übersprungen, 91,25 % gesamt; die Untergrenze 85 hält (CI Lauf 698).
6. **Release:** Statt `workflow_call` (in dieser Gitea-Instanz nicht belegt) trägt `release.yml` einen eigenen ersten Job `converters` mit denselben Schritten; `release` hat `needs: converters`. Für `-beta.N` entscheidet der Job `skip` aus `VERSION` und läuft nicht. Der Kommentar in `release.yml` verweist für die Begründung auf `converters.yml`.
7. **Anweisungen:** `dev-setup.md` (neuer Schritt 6, Klon und Zugang), `publish-and-ci.md` (Schritt 3: der `converters`-Lauf startet von selbst bei Konverter-Pfaden, wird abgewartet, rot zählt wie rotes CI; von Hand über `dispatch_workflow` auf `main`), `testing-conventions.md` (Scope).
8. **Doku:** `docs/dev/development.md` (Absatz zu `testfiles/`, Workflow-Liste, Release-Gate, Zugang); der Changelog-Eintrag nennt den Umzug.
## Beleg des Release-Gates
Probelauf auf dem Wegwerf-Zweig `gate-probe-232` (inzwischen gelöscht), damit nie ein echter Release oder Tag entstehen kann: `VERSION` = `99.0.0` (ohne Suffix), in `release.yml` ist der Job `release` durch ein einziges `echo REACHED` ersetzt; gestartet per `dispatch_workflow` auf dem Zweig.
- **Lauf 703, Harness-Schritt absichtlich rot** (kein Test passt zum Schlüsselwort, pytest Exit 5): `converters` rot, `release` übersprungen.
- **Lauf 704, Harness-Schritt grün** (Teilmenge `-k "nist or ifg"`): `converters` grün, `release` gestartet und `REACHED` ausgegeben.
- Danach: Zweig gelöscht; es gibt weder Tag noch Release `v99.0.0` (neuester Tag `v10.0.0`).
## Akzeptanzkriterien
- [x] `torben/chemenu-testfiles` ist privat und enthält `corpus/` (alle bisherigen Dateien + die 13 neuen PDFs), `harness/` und `README.md` mit Herkunftstabelle. (Lauf 702 lädt es und führt das Harness aus.)
- [x] In diesem Repo ist `testfiles/` nicht mehr versioniert und steht in `.gitignore`; ein frischer Klon ohne Zugang zum privaten Repo besteht `pytest`, `docs verify` und `instructions verify`. (CI Lauf 698 ohne `testfiles/`.)
- [x] Ein Commit, der nur Stack-Dateien außerhalb der Pfade aus Punkt 4 ändert, startet `ci.yml`, aber nicht `converters.yml`. (`028f620`, nur `docs/dev/development.md`: Lauf 705 `ci.yml`, kein `converters`-Lauf.)
- [x] ~~Ein Commit, der eine Datei unter `tools/chemenu/filters/` ändert, startet `converters.yml` von selbst~~ – **nach #231 verschoben**: Dieses Paket ändert nichts unter `filters/`, und für den Beleg allein eine Konverter-Änderung zu bauen, wäre eine Änderung ohne Inhalt. #231 ist die erste Änderung dort und trägt das Kriterium. Hier belegt ist derselbe Mechanismus über einen anderen Eintrag der `paths:`-Liste: `.gitea/workflows/converters.yml` startete den Workflow zweimal von selbst (Läufe 699, 707), und Lauf 707 lud das private Repo und führte das Harness über alle Dateien aus.
- [x] `workflow_dispatch` von `converters.yml` funktioniert auf `main`. (Lauf 702.)
- [x] Ein Release ohne Suffix entsteht nur nach grünem Harness-Lauf im selben Release-Lauf; bei Rot kein Tag. (Läufe 703 rot und 704 grün, oben.)
- [x] Die Coverage-Untergrenze in `ci.yml` hält. (Lokal 91,25 % bei Untergrenze 85; CI Lauf 698 grün.)
- [x] `dev-setup.md`, `publish-and-ci.md`, `testing-conventions.md` und `docs/dev/development.md` beschreiben den neuen Ablauf; `docs verify` findet keinen toten Link auf `testfiles/README.md`.
- [x] CI und `converters.yml` auf dem veröffentlichten Commit grün. (`71170bc`: 698, 702; letzter Commit `c439dc6`: 706, 707.)
## Versionsteil
Patch im laufenden Kandidaten: `10.1.0-beta.2`. `tools/` und `instructions/` liegen im Version-Gate. Drop-in: Workflows, `testfiles/` und `instructions/dev/` gehen mit `dist export` nicht in eine Instanz. Die beiden Nachzüge (`docs/`, `.gitea/`) liegen außerhalb des Gates und brauchten keinen Sprung.
## Kette
Kette „Konverter-Qualität“
- Vorgänger: keiner - erstes Glied
- Nachfolger: #233
torben
changed title from CI: Konverter-Tests gegen `testfiles/` in eigenen Workflow – Pfad-Trigger, Release-Prüfung, nicht mehr im Standard-Lauf to Konverter-Testkorpus und Test-Harness in eigenes privates Repo; eigener Workflow mit Pfad-Trigger, Release-Prüfung, nicht mehr im Standard-CI2026-10-14 12:07:51 +00:00
Changelog: Betreiber-Entscheidung ergänzt: Testkorpus und Harness ziehen in ein eigenes privates Repo (torben/chemenu-testfiles), das als gitignorierter Klon nach testfiles/ geladen wird. Dort dürfen auch nicht-öffentliche Quellen liegen. Damit neu: Umzug der 22 versionierten und 13 neuen Dateien, Zugang des Workflows zum privaten Repo (Job-Token oder 1Password), dev-setup.md. Der pytest-Marker wandert mit dem Modul. Erstes Glied der Kette „Konverter-Qualität“ (#232 → #233 → #231 → #234).
**Changelog:** Betreiber-Entscheidung ergänzt: Testkorpus und Harness ziehen in ein eigenes privates Repo (`torben/chemenu-testfiles`), das als gitignorierter Klon nach `testfiles/` geladen wird. Dort dürfen auch nicht-öffentliche Quellen liegen. Damit neu: Umzug der 22 versionierten und 13 neuen Dateien, Zugang des Workflows zum privaten Repo (Job-Token oder 1Password), `dev-setup.md`. Der pytest-Marker wandert mit dem Modul. Erstes Glied der Kette „Konverter-Qualität“ (#232 → #233 → #231 → #234).
Bau-Sitzung /stack-build: Konverter-Testkorpus und Harness liegen im privaten Repo torben/chemenu-testfiles; hier sind sie entfernt (Commit 71170bc, 10.1.0-beta.2). Neu: Workflow converters.yml (Pfad-Trigger + workflow_dispatch), Release-Gate als erster Job in release.yml, vier Anweisungs- und Doku-Dateien nachgezogen. Verifiziert: ci.yml 698, release.yml 700, converters.yml 702 grün; Release-Gate per Wegwerf-Zweig belegt (703 rot → release übersprungen, 704 grün → REACHED; Zweig gelöscht, kein Tag v99.0.0). Abweichung vom Entwurf: ${{ gitea.token }} genügt, sobald der repo-übergreifende Zugriff im privaten Repo gesetzt ist, ein 1Password-Token entfällt. Offen: die beiden Pfad-Filter-Kriterien brauchen echte Commits auf main (AGENTS.md-only; Änderung unter filters/); die Herkunftsspalte der 13 neuen PDFs in der README des privaten Repos ist vom Betreiber zu ergänzen.
Bau-Sitzung `/stack-build`: Konverter-Testkorpus und Harness liegen im privaten Repo `torben/chemenu-testfiles`; hier sind sie entfernt (Commit `71170bc`, `10.1.0-beta.2`). Neu: Workflow `converters.yml` (Pfad-Trigger + `workflow_dispatch`), Release-Gate als erster Job in `release.yml`, vier Anweisungs- und Doku-Dateien nachgezogen. Verifiziert: `ci.yml` 698, `release.yml` 700, `converters.yml` 702 grün; Release-Gate per Wegwerf-Zweig belegt (703 rot → `release` übersprungen, 704 grün → `REACHED`; Zweig gelöscht, kein Tag `v99.0.0`). Abweichung vom Entwurf: `${{ gitea.token }}` genügt, sobald der repo-übergreifende Zugriff im privaten Repo gesetzt ist, ein 1Password-Token entfällt. Offen: die beiden Pfad-Filter-Kriterien brauchen echte Commits auf `main` (AGENTS.md-only; Änderung unter `filters/`); die Herkunftsspalte der 13 neuen PDFs in der README des privaten Repos ist vom Betreiber zu ergänzen.
Abschluss /stack-close: Body im Endzustand, alle Kriterien erledigt; das filters/-Kriterium ist mit Begründung nach #231 verschoben. Veralteter Text: Kopf von converters.yml und docs/dev/development.md beschrieben noch den 1Password-Ausweg statt der Freigabe im privaten Repo. Nachgezogen in 028f620 (CI 705 grün, belegt zugleich: Commit außerhalb der paths: startet converters.yml nicht) und c439dc6 (CI 706, converters.yml von selbst 707, beide grün). Kein Versionssprung nötig (docs/, .gitea/). Sonst nichts veraltet: tools/CONTRACT.md und die Stage-Contracts sind unberührt, keine Installationsanweisung geändert.
Abschluss `/stack-close`: Body im Endzustand, alle Kriterien erledigt; das `filters/`-Kriterium ist mit Begründung nach #231 verschoben. Veralteter Text: Kopf von `converters.yml` und `docs/dev/development.md` beschrieben noch den 1Password-Ausweg statt der Freigabe im privaten Repo. Nachgezogen in `028f620` (CI 705 grün, belegt zugleich: Commit außerhalb der `paths:` startet `converters.yml` nicht) und `c439dc6` (CI 706, `converters.yml` von selbst 707, beide grün). Kein Versionssprung nötig (`docs/`, `.gitea/`). Sonst nichts veraltet: `tools/CONTRACT.md` und die Stage-Contracts sind unberührt, keine Installationsanweisung geändert.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Anlass: #231 hat
testfiles/pdf/auf 17 PDFs und rund 48 MB erweitert (u. a. ecoDMS-Handbuch 296 S., „Azure for Architects“ 701 S.).tools/chemenu/tests/test_raw_derive_testfiles.pyleitete jede Datei untertestfiles/zweimal ab und nahm sie an; allein Azure braucht für eine Ableitung 48 s. Das lief in jedem CI-Lauf, auch wenn ein Commit keinen Konverter berührte. Und viele aussagekräftige Testquellen (Verlagsbücher, Herstellerunterlagen, Dokumente mit Personendaten) dürfen nicht in dieses öffentliche Repo.Stand: abgeschlossen
Veröffentlicht als Commit
71170bc(Kandidat10.1.0-beta.2), dazu zwei Nachzüge beim Abschluss ohne Versionssprung:028f620(docs/dev/development.md: Zugang über die Freigabe im privaten Repo) undc439dc6(Kopfkommentar vonconverters.yml, statt des überflüssigen 1Password-Wegs).Verifiziert durch:
71170bc:ci.ymlLauf 698 grün;release.ymlals Kandidat Lauf 700 grün (convertersübersprungen);converters.ymlperworkflow_dispatchaufmainLauf 702 grün (8,7 min, 33 Tests). Der automatische Lauf 699 auf demselben Commit war rot, allein wegen der Zugriffseinstellung (Punkt 4).028f620(nurdocs/): nurci.ymlgestartet, Lauf 705 grün;converters.ymlnicht gestartet.c439dc6(nurconverters.yml):ci.ymlLauf 706 grün,converters.ymlvon selbst gestartet, Lauf 707 grün.Entscheidung (Betreiber, 2026-10-14)
stack-dev/stack-buildbekommen die Anweisung, ihn abzuwarten.torben/chemenu-testfiles; der Betreiber hat das Repo angelegt und das Hochladen der Dateien dorthin ausdrücklich freigegeben.Umsetzung
torben/chemenu-testfilesmit:corpus/<format>/…: alle bisherigen Dateien austestfiles/(mail, office, pdf, zip) plus die 13 neuen PDFs aus #231. 34 Dateien, jede per SHA-256 gegen das Original geprüft. Die zwei Bücher sind beim Umzug umbenannt (azure-for-architects-3e.pdf,concurrency-in-csharp-cookbook.pdf).harness/:test_raw_derive_testfiles.py(mit dem pytest-Markertestfiles) und eineconftest.py, die die hermetischen Fixtures der Stack-Suite überpytest_plugins = ["chemenu.tests.conftest"]borgt. Die Vergleichswerkzeuge aus #233 kommen dort hinzu.README.md: Herkunftstabelle mit einer Spalte „Public“, dazu Aufruf und Layout. Die Herkunft der 13 neuen PDFs steht größtenteils auf „unknown“ oder „no“; sie zu ergänzen ist Sache des Betreibers und kein Kriterium dieses Pakets.testfiles/,testfiles/steht in.gitignore. Kein Submodul. Fehlt der Klon, fehlt nur dieser Lauf; nichts intools/chemenu/tests/braucht ihn. Die bisher versionierten 22 Dateien sind aus diesem Repo entfernt (Historie bleibt), ebenso das Testmodul und der-text-Block in.gitattributes.cd tools && .venv/bin/python -m pytest -c pytest.ini ../testfiles/harness.-c pytest.iniwendet die Konfiguration der Suite auf ein Harness außerhalb vontools/an. Eine Konverter-Änderung, die erwartete Ausgaben (.expect) ändert, sind zwei Commits, einer je Repo, der private zuerst; der Workflow testet immermaindes privaten Repos. Weil das Harnessrepository_tree_guardaus der Suite borgt, darf während eines lokalen Laufs nichts im Stack-Checkout geändert werden..gitea/workflows/converters.yml: Aufbau wieci.yml, checkt zusätzlich das private Repo nachtestfiles/aus und führt das Harness aus. Zugang:${{ gitea.token }}. Der Token liest das zweite private Repo, weil dessen eigene Actions-Einstellungentorben/chemenuZugriff gewähren; eine Einstellung inchemenuselbst wirkt nicht. Ohne die Freigabe scheitert der Checkout mit „Determining the default branch … not found“ (Läufe 699, 701). Ein 1Password-Token, im Entwurf als Ausweg vorgesehen, ist damit nicht nötig. Kopfkommentar unddocs/dev/development.mdsagen das. Auslöser:pushaufmainmitpaths:–tools/chemenu/filters/**,tools/chemenu/commands/raw/derive.py,tools/chemenu/commands/raw/accept.py,tools/chemenu/tests/test_raw_derive*.py,tools/chemenu/tests/binary_formats.py,tools/requirements.txt,.gitea/workflows/converters.yml–, dazuworkflow_dispatch. Ein Push ins private Repo löst nichts hier aus; dann von Hand starten. Der Runner arbeitet Läufe nacheinander ab:convertersreiht sich hinterci.ymlund dessen pwsh-Job ein.ci.ymlunverändert; der Test ist mit dem Modul umgezogen. Die Suite lief mit--covauf 3064 bestanden, 4 übersprungen, 91,25 % gesamt; die Untergrenze 85 hält (CI Lauf 698).workflow_call(in dieser Gitea-Instanz nicht belegt) trägtrelease.ymleinen eigenen ersten Jobconvertersmit denselben Schritten;releasehatneeds: converters. Für-beta.Nentscheidet der JobskipausVERSIONund läuft nicht. Der Kommentar inrelease.ymlverweist für die Begründung aufconverters.yml.dev-setup.md(neuer Schritt 6, Klon und Zugang),publish-and-ci.md(Schritt 3: derconverters-Lauf startet von selbst bei Konverter-Pfaden, wird abgewartet, rot zählt wie rotes CI; von Hand überdispatch_workflowaufmain),testing-conventions.md(Scope).docs/dev/development.md(Absatz zutestfiles/, Workflow-Liste, Release-Gate, Zugang); der Changelog-Eintrag nennt den Umzug.Beleg des Release-Gates
Probelauf auf dem Wegwerf-Zweig
gate-probe-232(inzwischen gelöscht), damit nie ein echter Release oder Tag entstehen kann:VERSION=99.0.0(ohne Suffix), inrelease.ymlist der Jobreleasedurch ein einzigesecho REACHEDersetzt; gestartet perdispatch_workflowauf dem Zweig.convertersrot,releaseübersprungen.-k "nist or ifg"):convertersgrün,releasegestartet undREACHEDausgegeben.v99.0.0(neuester Tagv10.0.0).Akzeptanzkriterien
torben/chemenu-testfilesist privat und enthältcorpus/(alle bisherigen Dateien + die 13 neuen PDFs),harness/undREADME.mdmit Herkunftstabelle. (Lauf 702 lädt es und führt das Harness aus.)testfiles/nicht mehr versioniert und steht in.gitignore; ein frischer Klon ohne Zugang zum privaten Repo bestehtpytest,docs verifyundinstructions verify. (CI Lauf 698 ohnetestfiles/.)ci.yml, aber nichtconverters.yml. (028f620, nurdocs/dev/development.md: Lauf 705ci.yml, keinconverters-Lauf.)Ein Commit, der eine Datei unter– nach #231 verschoben: Dieses Paket ändert nichts untertools/chemenu/filters/ändert, startetconverters.ymlvon selbstfilters/, und für den Beleg allein eine Konverter-Änderung zu bauen, wäre eine Änderung ohne Inhalt. #231 ist die erste Änderung dort und trägt das Kriterium. Hier belegt ist derselbe Mechanismus über einen anderen Eintrag derpaths:-Liste:.gitea/workflows/converters.ymlstartete den Workflow zweimal von selbst (Läufe 699, 707), und Lauf 707 lud das private Repo und führte das Harness über alle Dateien aus.workflow_dispatchvonconverters.ymlfunktioniert aufmain. (Lauf 702.)ci.ymlhält. (Lokal 91,25 % bei Untergrenze 85; CI Lauf 698 grün.)dev-setup.md,publish-and-ci.md,testing-conventions.mdunddocs/dev/development.mdbeschreiben den neuen Ablauf;docs verifyfindet keinen toten Link auftestfiles/README.md.converters.ymlauf dem veröffentlichten Commit grün. (71170bc: 698, 702; letzter Commitc439dc6: 706, 707.)Versionsteil
Patch im laufenden Kandidaten:
10.1.0-beta.2.tools/undinstructions/liegen im Version-Gate. Drop-in: Workflows,testfiles/undinstructions/dev/gehen mitdist exportnicht in eine Instanz. Die beiden Nachzüge (docs/,.gitea/) liegen außerhalb des Gates und brauchten keinen Sprung.Kette
Kette „Konverter-Qualität“
CI: Konverter-Tests gegen `testfiles/` in eigenen Workflow – Pfad-Trigger, Release-Prüfung, nicht mehr im Standard-Laufto Konverter-Testkorpus und Test-Harness in eigenes privates Repo; eigener Workflow mit Pfad-Trigger, Release-Prüfung, nicht mehr im Standard-CIChangelog: Betreiber-Entscheidung ergänzt: Testkorpus und Harness ziehen in ein eigenes privates Repo (
torben/chemenu-testfiles), das als gitignorierter Klon nachtestfiles/geladen wird. Dort dürfen auch nicht-öffentliche Quellen liegen. Damit neu: Umzug der 22 versionierten und 13 neuen Dateien, Zugang des Workflows zum privaten Repo (Job-Token oder 1Password),dev-setup.md. Der pytest-Marker wandert mit dem Modul. Erstes Glied der Kette „Konverter-Qualität“ (#232 → #233 → #231 → #234).Bau-Sitzung
/stack-build: Konverter-Testkorpus und Harness liegen im privaten Repotorben/chemenu-testfiles; hier sind sie entfernt (Commit71170bc,10.1.0-beta.2). Neu: Workflowconverters.yml(Pfad-Trigger +workflow_dispatch), Release-Gate als erster Job inrelease.yml, vier Anweisungs- und Doku-Dateien nachgezogen. Verifiziert:ci.yml698,release.yml700,converters.yml702 grün; Release-Gate per Wegwerf-Zweig belegt (703 rot →releaseübersprungen, 704 grün →REACHED; Zweig gelöscht, kein Tagv99.0.0). Abweichung vom Entwurf:${{ gitea.token }}genügt, sobald der repo-übergreifende Zugriff im privaten Repo gesetzt ist, ein 1Password-Token entfällt. Offen: die beiden Pfad-Filter-Kriterien brauchen echte Commits aufmain(AGENTS.md-only; Änderung unterfilters/); die Herkunftsspalte der 13 neuen PDFs in der README des privaten Repos ist vom Betreiber zu ergänzen.Abschluss
/stack-close: Body im Endzustand, alle Kriterien erledigt; dasfilters/-Kriterium ist mit Begründung nach #231 verschoben. Veralteter Text: Kopf vonconverters.ymlunddocs/dev/development.mdbeschrieben noch den 1Password-Ausweg statt der Freigabe im privaten Repo. Nachgezogen in028f620(CI 705 grün, belegt zugleich: Commit außerhalb derpaths:startetconverters.ymlnicht) undc439dc6(CI 706,converters.ymlvon selbst 707, beide grün). Kein Versionssprung nötig (docs/,.gitea/). Sonst nichts veraltet:tools/CONTRACT.mdund die Stage-Contracts sind unberührt, keine Installationsanweisung geändert.