Files
management/scripts/__pycache__/pruefe_upstream_drift.cpython-312.pyc
T

176 lines
24 KiB
Plaintext
Raw Normal View History

Ë
›ñ‡j®HãóxdZddlmZddlZddlZddlZddlZddlmZ ddl Z dZ e dZ
dZd Zd
Zgd ¢Zd Zd
ZeedfZdZej-dd«dzZddZd dZd!dZd"dZd"dZd#dZd$dZd"dZd%dZ d&dZ!d&dZ"e#dk(reje"««yy#e
$rejd«YŒ”wxYw)'uF pruefe_upstream_drift.py — Byte-Vergleich gegen die gepinnte Baseline.
Schützt die übernommenen Framework-Dateien vor stillem Umschreiben
(Entscheidung 8 im Design 2026-08-11, Frage von sorb: „wird die
AGENTS.md ggf. durch Agenten umgeschrieben?"). Die Baseline liegt unter
docs/sources/upstream/neckbeard-v0.3.1/ (siehe HERKUNFT.md dort); ein
Framework-Upgrade aktualisiert Baseline und Arbeitskopie im selben,
bewussten Commit.
Prüfungen (Fehler, Exit 1):
1. byte-identische Paare laut PAARE
2. AGENTS.md beginnt byte-identisch mit der Baseline-AGENTS.md und
trägt direkt danach die Marke des Projektabschnitts
3. **Vollständigkeit:** jede Datei der Baseline ist genau einer Klasse
zugeordnet — byte-identisch, AGENTS-Präfix, erklärt erweitert
(ADR-0024) oder bewusst nicht übernommen. Eine vendorierte Datei,
die in keiner Liste steht, wird von nichts verglichen und fällt
sonst durchs Raster.
4. **Abgleich beim Upgrade:** hat upstream zwischen der vorigen und der
aktuellen Baseline eine erklärt-erweiterte Datei angefasst, muss die
ABGLEICH.tsv der aktuellen Baseline sie quittieren — eine Zeile
`<datei> <vorige-baseline> <was nachgezogen wurde>`.
Zu 4, weil es die ungewöhnlichste ist: Die erweiterten Dateien werden
absichtlich nicht byte-verglichen (ADR-0024), also meldet auch nichts,
wenn upstream sie ändert. Beim Upgrade v0.1.1 → v0.3.1 waren zwei von
drei betroffen, und gemeldet hat es nichts — sichtbar wurde es nur, weil
jemand daran dachte. Diese Prüfung kann nicht beurteilen, ob richtig
nachgezogen wurde; sie kann sagen, **dass** etwas nachzuziehen war. Der
Fehler ist Vergessen, nicht Falschmachen (FRAMEWORK-BEFUNDE, FB-12).
âš ï¸ Die Quittung steht bewusst in einer eigenen Datei und nicht in der
Prosa der HERKUNFT.md: Der erste Entwurf suchte den Dateinamen irgendwo im
Text — und der steht dort *immer*, in der Inventartabelle. Die Prüfung war
damit nicht streng, sondern wirkungslos, und ihr eigener Selbsttest hat es
verdeckt, weil sein Fixture eine leere Notiz war. Eine Zusicherung deckt
den Fall jetzt ab.
Fehlt eine Baseline-Datei, ist das ein Fehler, kein Skip
(Stillstandsprüfungs-Regel: eine Prüfung ohne Gegenseite ist ungeprüft).
Usage: python scripts/pruefe_upstream_drift.py [repo-root]
python scripts/pruefe_upstream_drift.py --selbsttest
é)Ú annotationsN)ÚPathz;pruefe_upstream_drift.py braucht PyYAML: pip install pyyamlzdocs/sources/upstreamz/neckbeard-v0.3.1z<!-- projektabschnitt -->z HERKUNFT.mdz ABGLEICH.tsv)
)ú CLAUDE.mdr)ú WORKFLOW.mdr)zdocs/adr/template.mdztemplates/adr-template.md)zdocs/design/template.mdztemplates/design-template.md)zdocs/aar/template.mdztemplates/aar-template.md)zdocs/issues/template.mdztemplates/issue-template.md)zdocs/ledger/template.mdztemplates/ledger-template.md)zdocs/verdict/template.mdztemplates/verdict-template.md)úscripts/check_harvest.pyr)úscripts/judge.pyr)ú schema.yamlzscripts/validate.pyzscripts/gen_status.py)zscripts/check_locked.pyú AGENTS.mdz¦link_fields: [related, judged]
types:
wiki-page:
required: [type, area]
fields:
status: { enum: [open, harvested] }
harvested_in: { kind: str }
z{ enum: [open, harvested] }z%{ enum: [open, harvested, declined] }z$ eigener_typ:
required: [type]
cóJtˆfdjd«D««S)Nc3ótK|]/}|j«sŒt|j««Œ1y­w©N)Úis_fileÚstrÚ relative_to)Ú.0Úbases €úR/Users/thore/.claude/jobs/9aaf0185/tmp/management/scripts/pruefe_upstream_drift.pyÚ <genexpr>z#baseline_dateien.<locals>.<genexpr>ss(øèø€ÐS±O¨qÀqÇyÁyÅ{”#a—mm )×*±Oùsƒ88Ú*)ÚsortedÚrglob)rs`rÚbaseline_dateienrrsø€Ü ÓS°D·J±J¸s´OÓ cóVtdtjd|«D««xsdS)Nc3ó2K|]}t|«Œy­wr
)Úint)rÚts rrz%version_schluessel.<locals>.<genexpr>wsèø€Ð:Ñ!9˜A”Q—Ñ!9ùsz\d+)r)ÚtupleÚreÚfindall)Únames rÚversion_schluesselr#vs#Ü Ñ§¡¨F°DÔ!9Ó B¸Brcó~|tz }|j«sgStd|j«D«d¬«S)z Alle Baselines, aelteste zuerst.c3óBK|]}|j«sŒ|Œy­wr
)Úis_dir)rrs rrzbaselines.<locals>.<genexpr>sèø€Ð°q·x±xµz”1Ñ3ùs˜có,t|j«Sr
)r#r")rs rÚ<lambda>zbaselines.<locals>.<lambda>€sÔ 2°1·6±6Ô :r)Úkey)ÚUPSTREAMr&rÚiterdir)ÚrootÚ verzeichniss rÚ baselinesr.zs=àœ‘/€KØ × Ñ Ô Øˆ Ü ÑB˜k× <rc
óXtD\}}||z ||z }}|j«s|jdtd|«Œ<|j«s|jd|«Œa|j «|j «k7sŒƒ|jd|dtd|d«Œ£y)Baseline fehlt: Ú/zArbeitskopie fehlt: zDRIFT: z weicht von z ab)ÚPAARErÚappendÚBASELINEÚ
read_bytes)r,rÚfehlerÚarbeitÚoriginalÚbs rÚ pruefe_paarer;ƒs—߈Øf‰}˜d X™oˆ1ˆØy‰yŒ{Ø M‰MÐ,¬X¨J°a¸°zÐ Ø M‰MаÐ
\‰\^˜qŸ|™|
M‰M˜G F 8¨<¼°zÀÀ8À*ÈCÐ "rcóØ|dz |dz }}|j«s|jdtd«y|j«s|jd«y|j«}|j«}|j |«s|jd«y|t |«dj
dd«}t|j«dd vr|jd
td «yy) Nr
r0z
/AGENTS.mdzArbeitskopie fehlt: AGENTS.mduQDRIFT: AGENTS.md — Upstream-Teil ist nicht mehr byte-identisch mit der Baselineúutf-8ÚreplacerézAGENTS.md: Marke 'z%' fehlt direkt nach dem Upstream-Teil) rr3r4r5Ú
startswithÚlenÚdecodeÚMARKEÚ
splitlines)r,rr6ÚagentsÚ agents_baseÚupstreamr7Úrests rÚ
pruefe_agentsrIŽØ Ñ,¨d°[Ñ.@ˆK€FØ × Ñ Ô Ø
Ш
°*ÐØ >‰>Ô Ø
ÐØ×'€HØ
×
Ñ
Ó
€FØ × Ñ ˜ 
ðØ ”#h“- !× °)Ó <€DÜ D—O% Ð
Ð*¬5¨'ð2&ð+rcóˆtDchc]\}}|Œ c}}tt«ztt«ztt«z}t |«D]#}||vsŒ|j
dtd|d«Œ%ttzD]2}||z j«rŒ|j
dtd|d«Œ4ycc}}w)z4Jede vendorierte Datei gehoert in genau eine Klasse.zUNZUGEORDNET: r1u ist vendoriert, steht aber in keiner Liste — es vergleicht sie nichts. Nach PAARE, ERWEITERT oder NICHT_UEBERNOMMEN eintragen.r0z$ (deklariert, aber nicht vendoriert)N) r2ÚsetÚ ERWEITERTÚNICHT_UEBERNOMMENÚ
SONDERFALLrr3r4r)rr6Ú
zugeordnetÚdateis rÚpruefe_vollstaendigkeitrS¢s¿å %Ô˜˜1! Ò¬Y«Ñ7¼#Ô>OÓ:PÑ
Œj€Jä! 'ˆØ ˜
Ò M‰MØ ¤ 
¨!¨E¨7ð3>ð
@ð ÔØu × M‰MÐ,¬X¨J°a¸°wð?3ð
/ùó'sŠ B>có>t|«}t|«dkry|d|d}}|jtt«jk7r:|j dtt«jd|jd«yg}t D]`}||z ||z }}|j«r|j«sŒ.|j«|j«k7sŒP|j |«Œb|sy|tz } | j«s2|j |jdtd t|«d
«yt«}
| jd d ¬
«j«D]c} | j«r| j«jd«rŒ3|
j!| j#d«dj««Œe|D]J}||
vsŒ|j d|d|jd|jd|jdtd «ŒLy)zJHat upstream eine erweiterte Datei angefasst, muss HERKUNFT.md sie nennen.éNéþÿÿÿéÿÿÿÿzBASELINE zeigt auf z", neuester vendorierter Stand ist u — welcher gilt?r1z fehlt, upstream hat aber uC erweiterte Datei(en) angefasst — ungeprueft ist nicht bestanden.r=r>)ÚencodingÚerrorsÚ rzABGLEICH: upstream hat z
zwischen z und z geaendert, z4 quittiert sie nicht. Nachziehen und dort eintragen.)r.rAr"rr4r3rLrr5ÚABGLEICHrKÚ read_textrDÚstripÚlstripr@ÚaddÚsplit) r,r6ôständeÚvorherÚjetztÚ geaendertrRÚaltÚneuÚquittungÚ quittiertÚzeiles rÚpruefe_abgleichrk²ä˜‹o€GÜ
ˆ7ƒ|ØØ˜B‘K ¨¡ˆE€FØ ‡zz”Tœ(“^×
Ð+¬D´«N×,?Ñ,?Ð+@ðA0Ø05·
±
¨|Ð;MðOô PàØ€I߈ؘE‘> 5¨5¡=ˆSˆØ{‰{Œ} C§K¡K¤MØ Ø >‰>Ó ˜sŸ~™~Ó × Ñ ˜UÕ ñ Øà”xÑ€HØ × Ñ Ô Ø
Øz‰zˆl˜!œH˜:Ð%?Ü9ð
 Ü€IØ×#¨W¸YÐØ{‰{Œ} § ¡ £× 9Ñ 9¸#Ô >Ø Ø
e—kk Ñ*×UóˆØ ˜ Ò M‰MØ)¨%¨°
¸6¿;¹;¸-ÀuØ—:‘:,˜l¨5¯:©:¨,°a¼°zðB
rc óz|dz |dz }}|j«r|j«s|jd«y tj|j d¬««xsi}tj|j d¬««xsi}t|t«rt|t«s|jd«yd D]o}t|j|«xsg«t|j|«xsg«z
} | sŒC|jd
|d t| «d |j«Œq|jd
«xsij«D\}
} |jd
«xsij|
«} | €#|jd|
d|jd«ŒPdD]„}
| j|
«xs |
dk7rgni}| j|
«xs |
dk7rgni}t|«t|«z
} | sŒU|jd
|
d|
d t| «d |j«Œ†| jd«xsij«D\}}|xsijd«}| jd«xsij|«xsijd«}|sŒU|ŒXt|«t|«z
} | sŒr|jd
|
d|dt| «d |j«Œ£Œ¢y#tj
$r*}|jdt
|«dd«Yd}~yd}~wwxYw)u"Deckt unsere schema.yaml noch alles ab, was die Baseline fuehrt?
âš ï¸ Anlass: Beim Upgrade auf v0.3.1 wurde der Handabgleich quittiert —
wahrheitsgemaess — und verlor trotzdem zwei Felder (wiki-page.status,
wiki-page.harvested_in). Die Quittungspflicht aus ADR-0024 fragt, OB
nachgezogen wurde, nicht OB VOLLSTAENDIG. Sie wurde in der Annahme
gebaut, der Fehler sei Vergessen und nicht Falschmachen; dieselbe
Aufgabe hat das an ihrem ersten Tag widerlegt.
Diese Pruefung schliesst die Luecke nur fuer schema.yaml, weil YAML
strukturell vergleichbar ist. Fuer die beiden Python-Dateien gibt es
keine Entsprechung — das bleibt offen und ist als Muster notiert.
Erlaubt ist Hinzufuegen (wir erweitern erklaert, ADR-0024), verboten
ist Verlieren.
r z/schema.yaml fehlt in Arbeitskopie oder BaselineNr=©rXzschema.yaml nicht lesbar: éPzAschema.yaml ist keine YAML-Abbildung (Arbeitskopie oder Baseline))Ú link_fieldsÚvendoredz
schema.yaml: z
verliert z gegenueber Útypeszschema.yaml: Typ 'z' aus z fehlt)ÚfieldsÚrequiredÚrulesrrÚenumz Enum verliert )rr3ÚyamlÚ safe_loadr]Ú YAMLErrorrÚ
isinstanceÚdictrKÚgetrr"Úitems)r,rr6Ú
eigen_pfadÚ
basis_pfadÚeigenÚbasisÚexÚ
schluesselÚfehltÚtypÚspecÚeigenerÚteilÚhierÚdortÚfeldÚregelÚwerteÚunsers rÚpruefe_schema_deckungrÚsð"" 1°4¸-Ñ3G
€JØ × Ñ Ô  Z×%7Ñ%7Ô%9Ø
Ððܘz×3¸WÐLÈ"ˆÜ˜z×3¸LÈ"ˆô eœTÔ "¬*°U¼DÔ*AØ
ðã1ˆ
ÜE—I‘I˜jÓ/¨RÓ0´3°u·y±yÀÓ7LÒ7RÐPRÓ3SÑSˆÚ Ø M‰M˜M¨*¨°ZÄÀuÃ
¸ðO(Ø(,¯ ©  
 —i‘i Ó.¨B×7‰ ˆˆTØ—9‘9˜WÓ×ÓØ ˆ?Ø M‰MÐ.¨s¨e°6¸$¿)¹)¸ÀFÐ Û3ˆDØ—;‘;˜tÓH¨t°xÒ/?©ÀRˆ—88˜D“>ÒE¨D°HÒ,<¡bÀ"ˆ˜“I¤ D£ Ñ)ˆEÚØ
 
¨c¨U°!°D°6¸Ü!'¨£ ¨|¸D¿I¹I¸HõIð !ŸH™H 4°"×=‰KˆD[˜b×% -ˆEØ—kk (Ó1¨r×6°tÓ×ÓOˆEژјE›
¤S¨£ZÑ/ÚØ—M‘M M°#°°a¸°v¸_Ü%+¨E£] O°<ÀÇ Á ¸#LõMò
8øô! >‰>òØ
Ð2´3°r³7¸3¸B°<°.Ðûðús¾AK=Ë=L:Ì L5Ì5L:cóš|tz }g}t|||«t|||«t||«t ||«t |||«|Sr
)r4r;rIrSrkr)r,rr6s rÚpruefersMØ ”(‰?€DØ€FÜt˜VÔ$˜˜˜D D˜˜$   €Mrc
óŠ
dgcŠ
Šd8ˆ