after-care 2026-09-08: kein AST-Parser hinter der AST-Behauptung, drei Advisories geschlossen, drei Test-Pins umgedreht - #12
Open
lukisch wants to merge 6 commits into
Open
Conversation
Ohne diesen Pin sieht ein Checkout unter Linux/macOS jede der 40 Textdateien als vollstaendig geaendert (i/lf w/crlf), obwohl sich nichts geaendert hat - das Phantom-Diff-Muster. Renormalisierung haben wir geprueft: sie aendert keine einzige Datei, der Index lag bereits durchgaengig auf LF. Binaerassets sind ausdruecklich als -text markiert.
docs/MEHRSPRACHIGKEIT-ANALYSE_2026-08-25.md war getrackt und damit oeffentlich. Es ist keine Nutzerdokumentation, sondern eine interne Entscheidungsvorlage, und sie gab preis: - interne Ticket-ID T-20260825-... samt Ticketsystem und Hostname - den absoluten lokalen Repo-Pfad des Maintainers - die auf dessen Rechner installierten Claude-Code-Plugins samt Pfad - Portfolio-Interna (Anzahl eigener MCP-Server und Roblox-Projekte) - die woertlich zitierte Nutzerfrage aus einer privaten Sitzung Kein Secret, deshalb kein Force-Push - die Datei bleibt lokal erhalten und ist ab jetzt ignoriert. Der oeffentlich relevante Teil (was die Code-Analyse tatsaechlich tut und wo ihre Grenze liegt) wandert in die README, statt verloren zu gehen.
Beide READMEs und llms.txt bewarben AST-basierte Klassen- und Methodenextraktion. Die Quelle widerspricht dem selbst: der Kommentar ueber analyzePythonCode lautet 'Simple Python AST-like parser', die Implementierung ist zeilen- und regexbasiert, und das Paket hat ueberhaupt keine Parser-Abhaengigkeit (nur Format-Parser fuer JSON/YAML/TOML/XML). Ein echtes ast.parse laeuft nur als Subprozess-Sperre vor jedem apply in cc_python_structural_edit sowie in cc_runtime_import_diagnose. Das ist kein Wortklauberei-Unterschied: an verschachtelten oder mehrzeiligen Konstrukten verhaelt sich ein Scanner anders als ein Parser, und wer AST liest, erwartet Letzteres. Neuer Abschnitt 'Scope and limits' / 'Geltungsbereich und Grenzen' in beiden READMEs plus Scope-Notiz in llms.txt. Er benennt zugleich die zweite, bisher nirgends dokumentierte Grenze: 9 der 23 Tools setzen Python voraus und pruefen die Dateiendung nicht - eine .ts-Datei liefert deshalb ein plausibel aussehendes falsches Ergebnis statt eines Fehlers. Ausserdem steht jetzt da, welche zwei Tools einen lokalen python-Interpreter brauchen und welche nicht. Nebenbei: DokuReader stand in llms.txt mit '|' statt ':' und brach damit als Listeneintrag; Last-checked auf 2026-09-08 gezogen.
…sollten test/metadata.test.ts verteidigte an drei Stellen den Ist-Zustand statt der Eigenschaft: 1. Die Vitest-Badge-Zahl stand als Literal '187' im erwarteten String. Jeder neue Test haette die Suite rot gemacht - der Test bestrafte also das Testen. Jetzt: Format pruefen und zusaetzlich, dass README, README_de und llms.txt dieselbe Zahl nennen. Das faengt die Divergenz, um die es eigentlich geht. 2. 'Last-checked: 2026-09-06' war als Literal gepinnt. Jede Auffrischung des Frischestempels - der Zweck des Stempels - haette den Test gebrochen. Jetzt Datumsformat statt Datum. 3. actions/checkout@v4 und setup-node@v4 waren als Literale festgenagelt und haetten jede SHA-Pinnung blockiert. Jetzt Tag ODER 40-stelliger SHA - und die Workflow-Datei ist entsprechend auf verifizierte SHAs gepinnt (checkout v7.0.1 3d3c42e5..., setup-node v7.0.0 82076278...; beide ueber die GitHub-API zum Release-Tag aufgeloest, nicht geraten). Dazu: EXPECTED_TOOL_COUNT war eine handgepflegte Konstante, die dieselbe Aenderung haette mitpflegen muessen, die sie absichern soll. Sie wird jetzt aus src/index.ts gezaehlt. Neu: ein Negativ-Guard gegen die 'AST-based'-Behauptung in den drei Doku-Flaechen, damit sie nicht zurueckkehrt. 189 statt 187 Tests, alle gruen.
- @toon-format/toon ^2.1.0 -> ^2.3.1 (HIGH, GHSA-p95v-992w-h6c3): Prototype Pollution beim Dekodieren von TOON-Eingaben. Das ist die ernsteste der drei: TOON ist eine beworbene Eingabeform von cc_convert_format, das Tool nimmt also genau die untrusted input entgegen, um die es in dem Advisory geht. Bewusst auf der 2er-Linie geblieben - 2.3.1 behebt das Advisory, waehrend latest 4.1.1 zwei Major-Spruenge und damit ein Verhaltensrisiko fuer die Konvertierung bedeutet haette. - qs override ^6.15.2 -> ^6.16.0 (MODERATE, GHSA-x5fp-wj9c-mxmx und GHSA-4mjr-xmp4-gh2g). - fast-uri override ^3.1.5 -> ^3.1.7. Das erledigt zugleich den seit 2026-09-03 offenen Dependabot-PR #10, der wegen des Branch-Schutzes auf BLOCKED stand und deshalb liegen blieb. npm audit: vorher 2 Vulnerabilities (1 high, 1 moderate) plus der offene fast-uri-PR, jetzt 0. Alle drei Test-Gates nach dem Upgrade erneut gruen: 189 Vitest, 35 MCP-stdio, 43 i18n.
Die Ueberschrift '## [1.3.23]' stand dreimal da - datiert 08-24, 08-21 und 08-16 - und las sich wie drei Releases derselben Versionsnummer. npm kennt genau ein 1.3.23, veroeffentlicht am 2026-08-25, also nach allen drei Bloecken: die drei Aenderungssaetze sind zusammen in diesem einen Release ausgeliefert worden. Jetzt eine Ueberschrift mit dem echten Veroeffentlichungsdatum, die drei Arbeitsdaten als Unterabschnitte erhalten. Beim Abgleich mit npm nebenbei aufgefallen und im Hinweis vermerkt: 1.3.19, 1.3.20 und 1.3.21 sind veroeffentlicht (alle am 2026-07-31), haben aber keinen Changelog-Eintrag. Der 1.3.25-Block steht bewusst als 'unreleased'. Die Versionstraeger bleiben auf 1.3.24, bis tatsaechlich veroeffentlicht wird - eine deklarierte Version, die es auf keiner Flaeche gibt, waere genau der Versions-Drift, den diese Runde sonst aufraeumt.
|
Welcome! 👋 Thanks for your first pull request in this repository. A maintainer will review it soon. Please make sure:
Thanks for contributing! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Surface-After-Care-Runde, Zeile 25 der
ellmos-ai-Rotation. Sechs thematisch getrennte Commits, alle drei Test-Gates lokal grün (189 Vitest, 35 MCP-stdio, 43 i18n),npm auditauf 0.masterist über klassischen Branch-Schutz geschützt (rules/branches/masterliefert[], erstbranches/master/protectionzeigtrequired_approving_review_count: 1) — deshalb PR statt Direkt-Push, und deshalb braucht dieser PR ein echtes Approval, nicht nur einen Merge.Hauptfund: die Doku bewarb einen AST-Parser, den es nicht gibt
README, README_de und
llms.txtversprachen AST-based class/method extraction. Die Quelle widerspricht dem selbst — der Kommentar überanalyzePythonCodelautet// Simple Python AST-like parser, die Implementierung liest Zeilen und Regexe, und das Paket hat überhaupt keine Parser-Abhängigkeit (nur Format-Parser für JSON/YAML/TOML/XML). Ein echtesast.parseläuft an genau zwei Stellen: als Subprozess-Sperre vor jedemapplyincc_python_structural_editund incc_runtime_import_diagnose.Das ist kein Wortstreit. An verschachtelten und mehrzeiligen Konstrukten verhält sich ein Scanner anders als ein Parser, und wer „AST" liest, rechnet mit Letzterem.
Beim Nachlesen fiel die zweite, bisher nirgends dokumentierte Grenze auf: 9 der 23 Tools setzen Python voraus und prüfen die Dateiendung nicht. Eine
.ts-Datei liefert deshalb kein Fehlersignal, sondern ein plausibel aussehendes falsches Ergebnis — typischerweise null Klassen und eine fehlgelesene Import-Liste. Beides steht jetzt in einem Abschnitt Scope and limits / Geltungsbereich und Grenzen in beiden READMEs plus einer Scope-Notiz inllms.txt, zusammen mit der Angabe, welche zwei Tools einen lokalenpython-Interpreter brauchen.Den fehlenden Extension-Guard behebt dieser PR nicht — das ist eine Verhaltensänderung und als Aufgabe vorgemerkt.
Sicherheit: drei offene Advisories, jetzt 0
@toon-format/toonqs(override)fast-uri(override)Das TOON-Advisory ist das ernsteste, weil es genau auf einem beworbenen Pfad liegt:
cc_convert_formatnimmt TOON als Eingabeformat entgegen, also untrusted input by design. Bewusst auf der 2er-Linie geblieben — 2.3.1 schließt das Advisory,latest(4.1.1) wären zwei Major-Sprünge und ein Verhaltensrisiko für die Konvertierung.PR #10 stand seit dem 2026-09-03 auf
BLOCKEDund blieb deshalb liegen; der Bump ist hier enthalten.Vierter Fall in Folge: Tests, die verteidigen, was sie finden sollten
test/metadata.test.tspinnte an drei Stellen den Ist-Zustand statt der Eigenschaft — jede dieser Zusicherungen hätte genau die Änderung rot gemacht, für die sie gedacht war:badge/Vitest-187%20passedals Literal → jeder neue Test hätte die Suite gebrochen. Der Test bestrafte das Testen. Jetzt: Format prüfen und zusätzlich, dass README, README_de undllms.txtdieselbe Zahl nennen — das fängt die Divergenz, um die es eigentlich geht. (Belegt: dieser PR fügt zwei Tests hinzu, 187 → 189.)Last-checked: 2026-09-06als Literal → jede Auffrischung des Frischestempels, also sein Zweck, hätte den Test gebrochen. Jetzt Datumsformat statt Datum.actions/checkout@v4/setup-node@v4als Literale → hätten jede SHA-Pinnung blockiert. Jetzt Tag oder 40-stelliger SHA, und die Workflow-Datei ist entsprechend gepinnt (checkout v7.0.13d3c42e5…, setup-node v7.0.082076278…; beide über die GitHub-API zum Release-Tag aufgelöst, nicht geraten).Dazu war
EXPECTED_TOOL_COUNTeine handgepflegte Konstante, die dieselbe Änderung hätte mitpflegen müssen, die sie absichern soll — sie wird jetzt aussrc/index.tsgezählt (23). Neu ist ein Negativ-Guard gegen die Rückkehr derAST-based-Behauptung.Privacy
docs/MEHRSPRACHIGKEIT-ANALYSE_2026-08-25.mdwar getrackt und damit öffentlich. Es ist keine Nutzerdokumentation, sondern eine interne Entscheidungsvorlage, und gab preis: eine interne Ticket-ID samt Ticketsystem und Hostname, den absoluten lokalen Repo-Pfad, die auf dem Maintainer-Rechner installierten Plugins samt Pfad, Portfolio-Interna und die wörtlich zitierte Nutzerfrage aus einer privaten Sitzung. Kein Secret, deshalb kein Force-Push —git rm --cachedplus.gitignore. Der öffentlich relevante Teil steckt jetzt im Scope-Abschnitt der README.Changelog
## [1.3.23]stand dreimal da (08-24, 08-21, 08-16) und las sich wie drei Releases derselben Nummer. npm kennt genau ein1.3.23, veröffentlicht am 2026-08-25 — also nach allen drei Blöcken. Jetzt eine Überschrift mit dem echten Veröffentlichungsdatum, die drei Arbeitsdaten als Unterabschnitte. Nebenbefund im Hinweis vermerkt:1.3.19,1.3.20,1.3.21sind auf npm veröffentlicht, haben aber keinen Changelog-Eintrag.Der
1.3.25-Block steht bewusst als unreleased, die Versionsträger bleiben auf1.3.24— eine deklarierte Version, die es auf keiner Fläche gibt, wäre genau der Versions-Drift, den diese Runde sonst aufräumt.Sonstiges
.gitattributesmit LF-Pin ergänzt (sechster Phantom-Diff-Fall der Rotation): ohne ihn meldet ein Checkout unter Linux/macOS alle 40 getrackten Textdateien als vollständig geändert. Renormalisierung geprüft — sie ändert keine einzige Datei.llms.txt: DokuReader stand mit|statt:und brach als Listeneintrag;Last-checkedauf 2026-09-08.llms.txtverlinkten Repos gegen die API aufpublicgeprüft — kein 404, anders als bei den beiden Vorläufern der Rotation.Offen (als Aufgaben erfasst, nicht in diesem PR)
1.3.25+ Tag nach dem Merge; die npm-Paketseite zeigt sonst weiter die alte, falsche AST-Aussage.