1
1
2026-06-04 3ee8742df6bc2da18b159d9ea769f7dd44e062d3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
Ë
þêjP%ãóü—ddlmZddlZddlZddlZddlZddlmZddlmZm    Z    ddl
m Z ddl m Z eGd„d««ZeGd    „d
««Zdd „Zdd „Zdd „Zdd„Zdd„Zdd„Zdd„Zedk(r ee««‚y)é)Ú annotationsN)Ú    dataclass)ÚdatetimeÚtimezone)ÚPath)ÚAnycó@—eZdZUded<ded<ded<ded<ded<y)Ú    FileCheckÚstrÚpathÚstatusÚ
error_codeÚexpected_sha256Ú actual_sha256N©Ú__name__Ú
__module__Ú __qualname__Ú__annotations__©óú.\manifest_pack_validator.pyr
r
s…à
ƒIØ ƒK؃OØÓØÔrr
cóh—eZdZUded<ded<ded<ded<ded<ded<ded    <ded
<d ed <y )Ú
CaseResultr Úcase_idÚ
package_idÚexpected_statusr ÚintÚ
file_countÚchecked_file_countÚpass_file_countÚfail_file_countz    list[str]Ú error_codesNrrrrrrs4…à ƒL؃OØÓØ ƒK؃OØÓØÓØÓØÔrrcó‡—tj«}|jd«5Štˆfd„d«D]}|j    |«Œ    ddd«|j «S#1swY|j «SxYw)NÚrbcó&•—‰jd«S)Ni)Úread)Úhandles€rÚ<lambda>zsha256_file.<locals>.<lambda>&sø€ &§+¡+¨kÔ":rr)ÚhashlibÚsha256ÚopenÚiterÚupdateÚ    hexdigest)r ÚdigestÚchunkr(s   @rÚ sha256_filer2#shø€Ü ^‰^Ó €FØ     ‰4Œ˜FÜÓ:¸CÖ@ˆEØ M‰M˜%Õ  ñA÷
ð × Ñ Ó Ð÷
ð × Ñ Ó Ðús §&A&Á&A>có—|jdd¬«5}tj|«}ddd«tt«s t d«‚|j d«}t|t«s t d«‚|S#1swYŒRxYw)NÚrúutf-8©ÚencodingÚMANIFEST_NOT_OBJECTÚfilesÚMANIFEST_FILES_NOT_LIST)r,ÚjsonÚloadÚ
isinstanceÚdictÚ
ValueErrorÚgetÚlist)r r(Úpayloadr9s    rÚ load_manifestrC+so€Ø     ‰3 ˆÔ    )¨VÜ—)‘)˜FÓ#ˆ÷
*ä gœtÔ $ÜÐ.Ó/Ð/Ø K‰K˜Ó  €EÜ eœTÔ "ÜÐ2Ó3Ð3Ø €N÷
*Р   )ús ”A;Á;Bcóʗt|«}|j«ry|j«}||z j«}    |j|«|dfS#t$rYywxYw)N)NÚABSOLUTE_PATH_NOT_ALLOWED)NÚPATH_OUTSIDE_CASEÚ)rÚ is_absoluteÚresolveÚ relative_tor?)Úcase_dirÚ relative_pathÚraw_pathÚresolved_case_dirÚ resolved_files     rÚ_safe_resolve_case_filerP6sr€ÜMÓ"€HØ×ÑÔØ0Ø ×(Ñ(Ó*ÐØ Ñ(×1Ñ1Ó3€Mð)Ø×!Ñ!Ð"3Ô4ð ˜"Ð Ðøô ò)Ù(ð)úsÁAÁ    A"Á!A"có,—|jd«rdSdS)NÚinvalid_ÚFAILÚPASS)Ú
startswith)rs rÚ_expected_statusrVCs€Ø×'Ñ'¨
Ô3ˆ6Ð?¸Ð?rcój—|j}t|«}|dz }g}g}|j«st|d|ddddddg¬«    |fS    t    |«}t|jd«xsd«}|d}    |    D]_}
t|
t«s|jd    «Œ&t|
jd
«xsd«} t|
jd «xsd«j«} t!|| «\} }|r0|j|«|jt#| d|| d««Œ±| | j«s0|jd «|jt#| dd | d««Œót%| «}|j«| k7r1|jd «|jt#| dd | |««ŒB|jt#| dd| |««Œbt'd„|D««}t'd„|D««}|st)|«t)|    «k(rdnd}t||||t)|    «t)|«||t+t-|««¬«    |fS#t
j tf$rB}t|d|dddddt|«xs|jjg¬«    |fcYd}~Sd}~wwxYw)Nz manifest.jsonrGrSrÚMANIFEST_MISSING©    rrrr rr r!r"r#rr9ÚFILE_ITEM_NOT_OBJECTr r+Ú FILE_MISSINGÚSHA256_MISMATCHrTc3ó@K—|]}|jdk(sŒd–—Œy­w©rSéN©r ©Ú.0Úrows  rÚ    <genexpr>z validate_case.<locals>.<genexpr>‰óèø€ÐK¡{ °c·j±jÀFÓ6Jœ!¡{ùó‚—c3ó@K—|]}|jdk(sŒd–—Œy­w©rTr_Nr`ras  rrdz validate_case.<locals>.<genexpr>Šrerf)ÚnamerVÚexistsrrCr;ÚJSONDecodeErrorr?r Ú    __class__rr@r=r>ÚappendÚlowerrPr
r2ÚsumÚlenÚsortedÚset)rKrrÚ manifest_pathÚ file_checksr#ÚmanifestÚexcrr9ÚitemÚrel_pathÚ expected_shaÚ target_pathÚ
path_errorÚ
actual_shar"r!r s                   rÚ validate_caser}Gsƀ؏m‰m€GÜ& wÓ/€OؘÑ.€MØ#%€KØ€Kà × Ñ Ô !ä ØØØ /ØØØ#$Ø !Ø !Ø/Ð0ô
ð ð 
ð     
ð
Ü  Ó/ˆô"X—\‘\ ,Ó/Ò5°2Ó6€JØ WÑ €EäˆÜ˜$¤Ô%Ø × Ñ Ð5Ô 6Ø Üt—x‘x Ó'Ò-¨2Ó.ˆÜ˜4Ÿ8™8 HÓ-Ò3°Ó4×:Ñ:Ó<ˆ Ü"9¸(ÀHÓ"Mш ZÙ Ø × Ñ ˜zÔ *Ø × Ñ œy¨°6¸:À|ÐUWÓXÔ YØ Ø Ð  k×&8Ñ&8Ô&:Ø × Ñ ˜~Ô .Ø × Ñ œy¨°6¸>È<ÐY[Ó\Ô ]Ø Ü  Ó-ˆ
Ø × Ñ Ó  Ò -Ø × Ñ Ð0Ô 1Ø × Ñ œy¨°6Ð;LÈlÐ\fÓgÔ hÙ Ø×Ñœ9 X¨v°r¸<ÈÓTÖUð)ô,ÑK¡{ÓKÓK€OÜÑK¡{ÓKÓK€OÙ&¬3¨{Ó+;¼sÀ5»zÒ+I‰VÈv€F䨨!Ø+ØÜ˜5“zÜ" ;Ó/Ø+Ø+Üœs ;Ó/Ó0ô
    
ð    ð ð øôY ×  Ñ  ¤*Ð -ò
ä ØØØ /ØØØ#$Ø !Ø !Ü  ›XÒ?¨¯©×)?Ñ)?Ð@ô
ð ð 
õ     
ûð
úsÁ     IÉJ2É07J-Ê'J2Ê-J2có—|jdd¬«td„|j«D««}g}g}|D]‡}t|«\}}|j    |«|D]a}|j    |j
|j |j|j|j|j|jdœ«ŒcŒ‰|j|jtjtj «j#«t%|«t%|«t'|«t)d„|D««t)d„|D««t)d„|D««t+d„|D««d    œ
}    |d
z j-d d d ¬«5}
t/j0|
gd¢¬«} | j3«|D]†} | j5| j
| j | j6| j| j8| j:| j<| j>djA| jB«dœ    «Œˆ    ddd«|dz j-d d d ¬«5}
t/j0|
gd¢¬«} | j3«| jE|«ddd«|dz j-d d¬«5}
tGjH|    |
dd¬«ddd«d|    d›dd ddddd d d!d d"|    d#›d$|    d%›d&|    d'›d(|    d)›d*|    d+›g} |d,z j-d d¬«5}
|
jKd-jA| «d-z«ddd«|    S#1swYŒxYw#1swYŒÈxYw#1swYŒœxYw#1swY|    SxYw).NT)ÚparentsÚexist_okc3óBK—|]}|j«sŒ|–—Œy­w©N)Úis_dir)rbr s  rrdz write_outputs.<locals>.<genexpr>žsèø€ÐNÑ(< ÀÇ Á Å ”tÑ(<ùs‚˜)rrÚ    file_pathr rrrc3ó@K—|]}|jdk(sŒd–—Œy­wrhr`ras  rrdz write_outputs.<locals>.<genexpr>¹óèø€ÐL¡| °s·z±zÀVÓ7Kœ!¡|ùrfc3ó@K—|]}|jdk(sŒd–—Œy­wr^r`ras  rrdz write_outputs.<locals>.<genexpr>ºr†rfc3óTK—|] }|j|jk(sŒd–—Œ"y­w)r_N©r rras  rrdz write_outputs.<locals>.<genexpr>»s#èø€Ð*j¹ °ÈÏ
É
ÐVY×ViÑViÓHi¬1¹ ùs‚(¡(c3óNK—|]}|j|jk(–—Œy­wr‚r‰ras  rrdz write_outputs.<locals>.<genexpr>¼s èø€ÐVÉÀ#˜CŸJ™J¨#×*=Ñ*=Õ=Éùs‚#%)
Ú experiment_idÚrun_idÚcreated_at_utcÚ
input_rootÚ
output_dirÚ total_casesÚ
pass_countÚ
fail_countÚexpected_matrix_match_countÚ quality_passzcase_results.csvÚwrGz    utf-8-sig)Únewliner7rY)Ú
fieldnamesÚ;zfile_check_details.csvz summary.jsonr5r6Fé)Ú ensure_asciiÚindentz# rŒu  ç»“果导读u- åˆ›å»ºäººå‘˜: ai-codexu_- æ–‡ä»¶èŒè´£: è®°å½• manifest åŒ…校验实验的可读结论,不作为核心业务主表。u[- ç®¡ç†è§„范/模板: project-d/exp-doc/实验规范.md; project-d/dev-doc/编码规范.mduF- å¼•用文件: summary.json; case_results.csv; file_check_details.csvuU- è®°å½•方式: append-only å®žéªŒæ—¥å¿— + å¼€å‘日志 + å®¡è®¡æŠ¥å‘Šäº¤å‰å¼•用。u    ## ç»“论z- total_cases: rz- pass_count: r‘z- fail_count: r’z- expected_matrix_match_count: r“z- quality_pass: r”z
readout.mdÚ
)&ÚmkdirrqÚiterdirr}rmrrr r rrrrirÚnowrÚutcÚ    isoformatr rproÚallr,ÚcsvÚ
DictWriterÚ writeheaderÚwriterowrrr r!r"Újoinr#Ú    writerowsr;ÚdumpÚwrite)rŽrÚ    case_dirsÚ case_resultsÚ    file_rowsrKÚresultÚchecksÚcheckÚsummaryr(ÚwriterrcÚreadouts              rÚ write_outputsr´œsk€Ø×јT¨DÐÔ1ÜÑN¨
×(:Ñ(:Ô(<ÓNÓN€IØ%'€LØ&(€IãˆÜ& xÓ0‰ˆØ×јFÔ#ÛˆEØ × Ñ à%Ÿ~™~Ø"(×"3Ñ"3Ø!&§¡Ø#Ÿl™lØ"'×"2Ñ"2Ø',×'<Ñ'<Ø%*×%8Ñ%8ñõ
ñðð"$Ÿ™Ø—/‘/Ü"Ÿ,™,¤x§|¡|Ó4×>Ñ>Ó@ܘ*“oܘ*“oܘ<Ó(ÜÑL¡|ÓLÓLÜÑL¡|ÓLÓLÜ'*Ñ*j¹ Ó*jÓ'jÜÑVÉÓVÓVñ €Gð Ð)Ñ
)×    /Ñ    /°¸RÈ+Р   /Ô    VÐZ`Ü—‘Ø ò
ô 
ˆð    ×ÑÔÛˆCØ O‰Oà"Ÿ{™{Ø"%§.¡.Ø'*×':Ñ':Ø!Ÿj™jØ"%§.¡.Ø*-×*@Ñ*@Ø'*×':Ñ':Ø'*×':Ñ':Ø#&§8¡8¨C¯O©OÓ#<ñ
õ ñ ÷!
Wð> Ð/Ñ
/×    5Ñ    5°cÀ2ÐP[Р   5Ô    \Ð`fÜ—‘Ø òô 
ˆð    ×ÑÔØ×јÔ#÷
]𠠐~Ñ
%×    +Ñ    +¨C¸'Р   +Ô    BÀfÜ     ‰    '˜6°¸aÕ@÷
Cð ˆWXÑ Ð ˜}Ð-Ø
Ø"ØiØeØPØ_Ø
ØØ
Ø
˜' -Ñ0Ð1Ð2Ø
˜ Ñ.Ð/Ð0Ø
˜ Ñ.Ð/Ð0Ø
)¨'Ð2OÑ*PÐ)QÐRØ
˜7 >Ñ2Ð3Ð4ð€Gð" |Ñ
#×    )Ñ    )¨#¸Р   )Ô    @ÀF؏ ‰ T—Y‘Y˜wÓ'¨$Ñ.Ô/÷
Að €N÷M
WÑ    Vú÷>
]Р   \ú÷ 
CР   Bú÷(
Að €Nús1ÆB5MÉ;MÊ4M)Ì"$M5ÍMÍM&Í)M2Í5M?có—tjd¬«}|jddt¬«|jddt¬«|j    «}t |j |j«}|drdSd    S)
Nz/Validate manifest packages for EXP-D-HEAVY-001.)Ú descriptionz --input-rootT)ÚrequiredÚtypez --output-dirr”rr_)ÚargparseÚArgumentParserÚ add_argumentrÚ
parse_argsr´rŽr)ÚparserÚargsr±s   rÚmainr¿sq€Ü × $Ñ $Ð1bÔ c€FØ
×ј°¼DÐÔAØ
×ј°¼DÐÔAØ × Ñ Ó €DܘDŸO™O¨T¯_©_Ó=€GؘÒ'ˆ1Ð.¨QÐ.rÚ__main__)r rÚreturnr )r rrÁúdict[str, Any])rKrrLr rÁztuple[Path | None, str])rr rÁr )rKrrÁz"tuple[CaseResult, list[FileCheck]])rŽrrrrÁrÂ)rÁr)Ú
__future__rr¹r£r*r;Ú dataclassesrrrÚpathlibrÚtypingrr
rr2rCrPrVr}r´r¿rÚ
SystemExitrrrÚ<module>rÈs–ðÝ"ãÛ
ÛÛ Ý!ß'ÝÝð ÷ðó ðð ÷    ð    ó ð    óóó
ó@óRójióX/ð ˆzÒÙ
‘T“VÓ
Ððr