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

176 lines
24 KiB
Plaintext
Raw Normal View History

Ë
›ñ‡j®Hãóx—dZddlmZddlZddlZddlZddlZddlmZ ddl Z dZ e ›d�Z
dZd Zd
Zgd ¢Zd Zd
ZeedfZdZej-dd«dzZdd„Zd d„Zd!d„Zd"d„Zd"d„Zd#d„Zd$d„Zd"d„Zd%d„Z d&d„Z!d&d„Z"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óJ‡—tˆfd„‰jd«D««S)Nc3ót•K—|]/}|j«sŒt|j‰««–—Œ1y­w©N)Úis_fileÚstrÚ relative_to)Ú.0ÚpÚ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—m‘m DÓ)×*±Oùsƒ8™8Ú*)ÚsortedÚrglob)rs`rÚbaseline_dateienrrsø€Ü ÓS°D·J±J¸s´OÓSÓ SÐSócóV—td„tjd|«D««xsdS)Nc3ó2K—|]}t|«–—Œy­wr
)Úint)rÚts rrz%version_schluessel.<locals>.<genexpr>wsèø€Ð:Ñ!9˜A”�Q—Ñ!9ùs‚z\d+)r)ÚtupleÚreÚfindall)Únames rÚversion_schluesselr#vs#€Ü Ñ:¤§¡¨F°DÔ!9Ó:Ó :Ò B¸dÐ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èø€ÐBÑ3˜°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×1Ñ1Ô3ÓBÙ:ô <ð<rc
óX—tD]¡\}}||z ||z }}|j«s|jdt›d|›�«Œ<|j«s|jd|›�«Œa|j «|j «k7sŒƒ|jd|›dt›d|›d�«Œ£y)NúBaseline fehlt: Ú/zArbeitskopie fehlt: zDRIFT: z weicht von z ab)ÚPAARErÚappendÚBASELINEÚ
read_bytes)r,rÚfehlerÚarbeitÚoriginalÚaÚbs rÚ pruefe_paarer;ƒs—€ß!ш�Ø�f‰}˜d X™oˆ1ˆØ�y‰yŒ{Ø �M‰MÐ,¬X¨J°a¸°zÐBÕ CØ—‘”Ø �M‰MÐ0°°Ð9Õ :Ø
�\‰\‹^˜qŸ|™|›~Ó
-Ø �M‰M˜G F 8¨<¼°zÀÀ8À*ÈCÐPÕ Qñ"rcóØ—|dz |dz }}|j«s|jdt›d�«y|j«s|jd«y|j«}|j«}|j |«s|jd«y|t |«dj
dd«}t|j«dd vr|jd
t›d �«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Žsç€Ø Ñ,¨d°[Ñ.@ˆK€FØ × Ñ Ô Ø�
‰
Ð(¬¨
°*Ð=Ô>ØØ �>‰>Ô Ø�
‰
Ð5Ô6ØØ×%Ñ%Ó'€HØ
×
Ñ
Ó
€FØ × Ñ ˜XÔ &Ø�
‰
ð8ô 9àØ ”#�h“-�.Ð !× (Ñ (¨°)Ó <€DÜ �D—O‘OÓ% a¨Ð*Ñ*Ø�
‰
Ð*¬5¨'ð2&ð&õ 'ð+rcóˆ—tD��chc]\}}|’Œ c}}tt«ztt«ztt«z}t |«D]#}||vsŒ|j
dt›d|›d�«Œ%ttzD]2}||z j«rŒ|j
dt›d|›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Ú_ÚoÚ
zugeordnetÚdateis rÚpruefe_vollstaendigkeitrS¢s¿€å %Ô&¡™˜˜1’! Ò&¬¬Y«Ñ7¼#Ô>OÓ:PÑPÜ
Œj‹/ñ€Jä! $Ö'ˆØ ˜
Ò "Ø �M‰MØ ¤ 
¨!¨E¨7ð3>ð?õ
@ð(ô Ô.Ô.ˆØ�u‘ ×%Ñ%Õ'Ø �M‰MÐ,¬X¨J°a¸°wð?3ð4õ
5ñ/ùó'sŠ B>có>—t|«}t|«dkry|d|d}}|jtt«jk7r:|j dtt«j›d|j›d�«yg}t D]`}||z ||z }}|j«r|j«sŒ.|j«|j«k7sŒP|j |«Œb|sy|tz } | j«s2|j |j›dt›d 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|j›d|j›d|j›dt›d� «Œ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²sì€ä˜‹o€GÜ
ˆ7ƒ|�aÒØØ˜B‘K ¨¡ˆE€FØ ‡z�z”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Ð#ÓG×RÑRÖTˆØ�{‰{Œ} § ¡ £× 9Ñ 9¸#Ô >Ø Ø�
‰
�e—k‘k $Ó'¨Ñ*×0Ñ0Ó2Õ3ð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|j›d�«Œ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€ð"" MÑ1°4¸-Ñ3G�
€JØ × Ñ Ô  Z×%7Ñ%7Ô%9Ø�
‰
ÐGÔHØðÜ—‘˜z×3Ñ3¸WÐ3ÓEÓFÒLÈ"ˆÜ—‘˜z×3Ñ3¸WÐ3ÓEÓFÒLÈ"ˆô �eœTÔ "¬*°U¼DÔ*AØ�
‰
ð5ô 6àã1ˆ
Ü�E—I‘I˜jÓ)Ò/¨RÓ0´3°u·y±yÀÓ7LÒ7RÐPRÓ3SÑSˆÚ Ø �M‰M˜M¨*¨°ZÄÀuÃ
¸ðO(Ø(,¯ ©  {ð4õ
5ð2ð —i‘i Ó(Ò.¨B×5Ñ5×7‰ ˆˆTØ—9‘9˜WÓ%Ò+¨×0Ñ0°Ó5ˆØ ˆ?Ø �M‰MÐ.¨s¨e°6¸$¿)¹)¸ÀFÐKÔ LØ Û3ˆDØ—;‘;˜tÓ$ÒH¨t°xÒ/?©ÀRˆDØ—8‘8˜D“>ÒE¨D°HÒ,<¡bÀ"ˆDܘ“I¤ D£ Ñ)ˆEÚØ—
‘
 
¨c¨U°!°D°6¸Ü!'¨£ ¨|¸D¿I¹I¸;ðHõIð 4ð!ŸH™H XÓ.Ò4°"×;Ñ;Ö=‰KˆD�%Ø’[˜b×%Ñ% fÓ-ˆEØ—k‘k (Ó+Ò1¨r×6Ñ6°tÓ<ÒBÀ×GÑGÈÓOˆEÚ˜Ñ*ܘE›
¤S¨£ZÑ/�ÚØ—M‘M M°#°°a¸°v¸_Ü%+¨E£] O°<ÀÇ Á ¸{ð#LõMò
>ñ8øô! �>‰>òØ�
‰
Ð2´3°r³7¸3¸B°<°.ÐAÔBÜûðús¾AK=Ë=L:Ì L5Ì5L:cóš—|tz }g}t|||«t|||«t||«t ||«t |||«|Sr
)r4r;rIrSrkr�)r,rr6s rÚpruefer‘sM€Ø ”(‰?€DØ€FÜ��t˜VÔ$Ü�$˜˜fÔ%ܘD &Ô)Ü�D˜&Ô!ܘ$  fÔ-Ø €Mrc
óŠ
‡
‡—dgcŠ
Šd8ˆ