# CODE-DESIGN-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-V030 ## 0. 状态与唯一修复 - 角色:`dev.developer.ana.cai`。 - predecessor:V029=`22001/f46e25c3b6911ff928c913c73ea9f72731dc6ba9877da2d4c8405d9d194d3dbb`;独立审核=`HOLD/3/3`,audit=`280419/3462f855cfb7d26eb92c3868f69d6cd252d5ec8f8dc538f06cb1d0226ea6e2c5`。 - 本版只修复 `BLOCK-V029-01/02/03`:child LF-only;child-start 起单一 10s deadline + all-path Kill once/Wait 5s;success 强制 exact 12 progress + four attempted/created/VALID + consumed=true。 - 本版仅计划,不执行 parent/child,不物化 Y01—Y04,不连接数据库。 ## 1. inherited bindings - exact Y01—Y04 payload/path/profile 与 V028/V029 不变。 - stdin transcript=`51206/6ea1f921913927009045a0c6168f2693de0d65d4f2ba0d33056bbafb38c9b052`;management future attachment 必须逐字节相同。 - tool calls:一次 exec_command 2000ms→一次 non-empty write_stdin 30000ms→仅在 live session 时一次 empty poll 10000ms;其余 no retry。 - process:parent PowerShell=1;child PowerShell=0..1;child source 不含 Process/Start/Start-Process/Invoke-Expression,不能派生 process tree。 ## 2. deadline/lifecycle contract - deadline 从 `$p.Start()` 成功立即启动,覆盖 async stdin Write/Flush/Close、WaitForExit、kill 与 stream drain。 - active deadline=10000ms;任何阶段 Remaining<=0 或 task wait false 进入同一 catch。 - `StopChild` 是唯一 termination API;`killIssued` 保证 Kill 最多一次;随后 WaitForExit(5000)。成功才设置 child_exited/actual exit;失败保持 child_exited=false,禁止 observer,四行 U。 - catch 与 finally 都调用同一 idempotent StopChild,故 child-start 后任何异常均在 parent terminal 前完成 kill/join 或明确 CHILD_LIVENESS_UNKNOWN。 - child stdout 用 `Console.Out.Write(...+LF)`,不使用 WriteLine,固定 0 CR。stderr=0;parent final 同样 LF-only。 ## 3. exact V030 parent preimage 以下 fence(不含 fence、含一个 final LF)是唯一 parent cmd;embedded child here-string runtime value不含 closing 前 LF。唯一 placeholder 必须在提交审核前替换为 child hash。 ```powershell $ErrorActionPreference='Stop' $ProgressPreference='SilentlyContinue' $root='E:\mb-ms-doc\project-info' $ids=@('Y01','Y02','Y03','Y04') $paths=@('E:\mb-ms-doc\project-info\dev\ana-dev\ana_semi_preconsumption_v002.py','E:\mb-ms-doc\project-info\dev\ana-dev\test\test_ana_semi_preconsumption_v002.py','E:\mb-ms-doc\project-info\dev\ana-dev\test\ana_semi_preconsumption_vectors_v002.json','E:\mb-ms-doc\project-info\dev\ana-dev\test\run_ana_semi_preconsumption_validation_v002.py') $sizes=@(17465,3359,4016,13037) $hashes=@('89812a35ac352d6fd0887f0b67df85962070d637aba4962992b46e073dd4bcf6','1983df916d5b9553a885a949d2674d9f8a8e7b1a6c4c5989eadf48245d929cf0','86f563b43d934cb0828e395f557ded328ad2abcfb2c1ef7bdbc8a4c32c12cbca','244463c2a66910dd71564f148d5845672261dedc80a636e21e809712b691337e') $childSource=@' $ErrorActionPreference='Stop' $ids=@('Y01','Y02','Y03','Y04') $paths=@('E:\mb-ms-doc\project-info\dev\ana-dev\ana_semi_preconsumption_v002.py','E:\mb-ms-doc\project-info\dev\ana-dev\test\test_ana_semi_preconsumption_v002.py','E:\mb-ms-doc\project-info\dev\ana-dev\test\ana_semi_preconsumption_vectors_v002.json','E:\mb-ms-doc\project-info\dev\ana-dev\test\run_ana_semi_preconsumption_validation_v002.py') $sizes=@(17465,3359,4016,13037) $hashes=@('89812a35ac352d6fd0887f0b67df85962070d637aba4962992b46e073dd4bcf6','1983df916d5b9553a885a949d2674d9f8a8e7b1a6c4c5989eadf48245d929cf0','86f563b43d934cb0828e395f557ded328ad2abcfb2c1ef7bdbc8a4c32c12cbca','244463c2a66910dd71564f148d5845672261dedc80a636e21e809712b691337e') function Sha([byte[]]$b){$s=[Security.Cryptography.SHA256]::Create();try{return([BitConverter]::ToString($s.ComputeHash($b))).Replace('-','').ToLowerInvariant()}finally{$s.Dispose()}} function Fail([string]$c){[Console]::Out.Write('STOP:'+$c+"`n");[Console]::Out.Flush();exit 27} function Profile([int]$i,[byte[]]$b){if($b.Length-ne$sizes[$i]-or(Sha $b)-ne$hashes[$i]){Fail 'PAYLOAD_HASH'};if($b.Length-ge3-and$b[0]-eq239-and$b[1]-eq187-and$b[2]-eq191){Fail 'PAYLOAD_BOM'};if(@($b|Where-Object{$_-eq13-or$_-eq0}).Count-ne0){Fail 'PAYLOAD_CR_NUL'};$lf=@($b|Where-Object{$_-eq10}).Count;if($i-eq2){if($lf-ne0-or$b[-1]-ne125){Fail 'PAYLOAD_JCS_PROFILE'}}elseif($lf-lt1-or$b[-1]-ne10-or$b[-2]-eq10){Fail 'PAYLOAD_TEXT_PROFILE'}} try{ $lines=@();for($i=0;$i-lt5;$i++){$v=[Console]::In.ReadLine();if($null-eq$v){Fail 'TRANSCRIPT_EOF'};$lines+=$v} $payloadText=($lines[0..3]-join"`n")+"`n";$a=[Text.Encoding]::ASCII $end=$lines[4]-split"`t",-1;if($end.Count-ne3-or$end[0]-ne'END'-or$end[1]-ne'4'-or$end[2]-ne(Sha $a.GetBytes($payloadText))){Fail 'TRANSCRIPT_END'} $decoded=@();for($i=0;$i-lt4;$i++){$f=$lines[$i]-split"`t",-1;if($f.Count-ne5-or$f[0]-ne$ids[$i]-or$f[1]-cne$paths[$i]-or$f[2]-ne([string]$sizes[$i])-or$f[3]-ne$hashes[$i]){Fail 'TRANSCRIPT_FIELDS'};if($f[4]-cnotmatch'\A(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?\z'){Fail 'TRANSCRIPT_BASE64'};try{$b=[Convert]::FromBase64String($f[4])}catch{Fail 'TRANSCRIPT_DECODE'};Profile $i $b;$decoded+=,$b} for($i=0;$i-lt4;$i++){[Console]::Out.Write('BEGIN:'+$ids[$i]+"`n");[Console]::Out.Flush();$fs=[IO.FileStream]::new($paths[$i],[IO.FileMode]::CreateNew,[IO.FileAccess]::Write,[IO.FileShare]::None,4096,[IO.FileOptions]::WriteThrough);[Console]::Out.Write('CREATED:'+$ids[$i]+"`n");[Console]::Out.Flush();try{$fs.Write($decoded[$i],0,$decoded[$i].Length);$fs.Flush($true)}finally{$fs.Dispose()};$rb=[IO.File]::ReadAllBytes($paths[$i]);Profile $i $rb;[Console]::Out.Write('DONE:'+$ids[$i]+"`n");[Console]::Out.Flush()} exit 0 }catch{Fail ('EXCEPTION_'+$_.Exception.GetType().Name.ToUpperInvariant())} '@ function Sha([byte[]]$b){$s=[Security.Cryptography.SHA256]::Create();try{return([BitConverter]::ToString($s.ComputeHash($b))).Replace('-','').ToLowerInvariant()}finally{$s.Dispose()}} function ReadExact([string]$p){$f=[IO.FileStream]::new($p,[IO.FileMode]::Open,[IO.FileAccess]::Read,[IO.FileShare]::None);try{$m=[IO.MemoryStream]::new();try{$f.CopyTo($m);return $m.ToArray()}finally{$m.Dispose()}}finally{$f.Dispose()}} function Obj([int]$i,[hashtable]$progress){ $attempted=$(if($progress.ContainsKey('BEGIN:'+$ids[$i])){$true}elseif($progress.ContainsKey('PROGRESS_UNKNOWN')){$null}else{$false}) $createdSignal=$progress.ContainsKey('CREATED:'+$ids[$i]);$created=$(if($createdSignal){$true}elseif($progress.ContainsKey('PROGRESS_UNKNOWN')){$null}else{$false}) try{$x=Get-Item -LiteralPath $paths[$i] -Force -ErrorAction Stop}catch [Management.Automation.ItemNotFoundException]{return[ordered]@{id=$ids[$i];attempted=$attempted;created_by_attempt=$created;exists=$false;object_type='ABSENT';reparse=$false;bytes=$null;sha256=$null;validation='NOT_PRESENT'}}catch{return[ordered]@{id=$ids[$i];attempted=$attempted;created_by_attempt=$created;exists=$null;object_type='UNKNOWN';reparse=$null;bytes=$null;sha256=$null;validation='UNKNOWN'}} if($attempted-eq$true-and-not$createdSignal){$created=$null} $rp=(($x.Attributes-band[IO.FileAttributes]::ReparsePoint)-ne0);if($rp){return[ordered]@{id=$ids[$i];attempted=$attempted;created_by_attempt=$created;exists=$true;object_type='REPARSE';reparse=$true;bytes=$null;sha256=$null;validation='INVALID'}} if($x.PSIsContainer){return[ordered]@{id=$ids[$i];attempted=$attempted;created_by_attempt=$created;exists=$true;object_type='DIRECTORY';reparse=$false;bytes=$null;sha256=$null;validation='INVALID'}} try{$b=ReadExact $paths[$i];$valid=($b.Length-eq$sizes[$i]-and(Sha $b)-eq$hashes[$i]);return[ordered]@{id=$ids[$i];attempted=$attempted;created_by_attempt=$created;exists=$true;object_type='FILE';reparse=$false;bytes=$b.Length;sha256=(Sha $b);validation=$(if($valid){'VALID'}else{'INVALID'})}}catch{return[ordered]@{id=$ids[$i];attempted=$attempted;created_by_attempt=$created;exists=$true;object_type='FILE';reparse=$false;bytes=$null;sha256=$null;validation='UNKNOWN'}} } $p=$null;$deadline=$null;$killIssued=$false;$parentExit=27;$terminal='PARENT_PRECHECK_STOP';$stop='UNINITIALIZED';$childStarted=$false;$childExited=$false;$childExit=$null;$timedOut=$false;$progress=@{};$progressComplete=$false function Remaining {if($null-eq$script:deadline){return 0};return[Math]::Max(0,10000-[int]$script:deadline.ElapsedMilliseconds)} function StopChild { if($null-eq$script:p-or$script:childExited){return $true} try{if(-not$script:p.HasExited){if(-not$script:killIssued){$script:killIssued=$true;try{$script:p.Kill()}catch{if(-not$script:p.HasExited){return $false}}};if(-not$script:p.WaitForExit(5000)){return $false}};$script:childExited=$true;$script:childExit=$script:p.ExitCode;return $true}catch{return $false} } try{ $lines=@();for($i=0;$i-lt5;$i++){$v=[Console]::In.ReadLine();if($null-eq$v){throw 'TRANSCRIPT_EOF'};$lines+=$v};$transcript=($lines-join"`n")+"`n" $tb=[Text.Encoding]::ASCII.GetBytes($transcript);if($tb.Length-ne51206-or(Sha $tb)-ne'6ea1f921913927009045a0c6168f2693de0d65d4f2ba0d33056bbafb38c9b052'){throw 'TRANSCRIPT_HASH'} foreach($d in @($root,(Join-Path $root 'dev'),(Join-Path $root 'dev\ana-dev'),(Join-Path $root 'dev\ana-dev\test'))){$di=[IO.DirectoryInfo]::new($d);if(-not$di.Exists-or($di.Attributes-band[IO.FileAttributes]::Directory)-eq0-or($di.Attributes-band[IO.FileAttributes]::ReparsePoint)-ne0){throw 'DIR_STATE'}} foreach($path in $paths){try{Get-Item -LiteralPath $path -Force -ErrorAction Stop|Out-Null;throw 'TARGET_PREEXISTS'}catch [Management.Automation.ItemNotFoundException]{}} $childBytes=[Text.UTF8Encoding]::new($false).GetBytes($childSource);if(Sha $childBytes-ne'aeeddde8793d352af5f81988aa603a30cea9c145eaeb6024c5e83801800b30cc'){throw 'CHILD_SOURCE_HASH'} $enc=[Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($childSource));$psi=[Diagnostics.ProcessStartInfo]::new();$psi.FileName='C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe';$psi.Arguments='-NoLogo -NoProfile -NonInteractive -ExecutionPolicy Bypass -EncodedCommand '+$enc;$psi.UseShellExecute=$false;$psi.CreateNoWindow=$true;$psi.RedirectStandardInput=$true;$psi.RedirectStandardOutput=$true;$psi.RedirectStandardError=$true;$psi.StandardInputEncoding=[Text.Encoding]::ASCII $p=[Diagnostics.Process]::new();$p.StartInfo=$psi;if(-not$p.Start()){throw 'CHILD_START_FALSE'};$childStarted=$true;$deadline=[Diagnostics.Stopwatch]::StartNew() $om=[IO.MemoryStream]::new();$em=[IO.MemoryStream]::new();$ot=$p.StandardOutput.BaseStream.CopyToAsync($om);$et=$p.StandardError.BaseStream.CopyToAsync($em);$inBytes=[Text.Encoding]::ASCII.GetBytes($transcript);$wt=$p.StandardInput.BaseStream.WriteAsync($inBytes,0,$inBytes.Length);$remain=Remaining;if($remain-le0-or-not$wt.Wait($remain)){$timedOut=$true;throw 'CHILD_STDIN_TIMEOUT'};$ft=$p.StandardInput.BaseStream.FlushAsync();$remain=Remaining;if($remain-le0-or-not$ft.Wait($remain)){$timedOut=$true;throw 'CHILD_STDIN_FLUSH_TIMEOUT'};$p.StandardInput.Close() $remain=Remaining;if($remain-le0-or-not$p.WaitForExit($remain)){$timedOut=$true;if(-not(StopChild)){throw 'CHILD_LIVENESS_UNKNOWN'}}else{$childExited=$true;$childExit=$p.ExitCode} if(-not[Threading.Tasks.Task]::WaitAll(@($ot,$et),2000)){throw 'CHILD_STREAM_UNKNOWN'};$ob=$om.ToArray();$eb=$em.ToArray();if($eb.Length-ne0){throw 'CHILD_STDERR'} try{$os=[Text.UTF8Encoding]::new($false,$true).GetString($ob)}catch{throw 'CHILD_STDOUT_UTF8'};$pls=@($os-split"`n"|Where-Object{$_-ne''});$expected=@('BEGIN:Y01','CREATED:Y01','DONE:Y01','BEGIN:Y02','CREATED:Y02','DONE:Y02','BEGIN:Y03','CREATED:Y03','DONE:Y03','BEGIN:Y04','CREATED:Y04','DONE:Y04');$pi=0;$seenStop=$false;foreach($q in $pls){if($q-cnotmatch'\A(?:(?:BEGIN|CREATED|DONE):Y0[1-4]|STOP:[A-Z0-9_]+)\z'){$progress['PROGRESS_UNKNOWN']=$true;throw 'CHILD_PROGRESS_SCHEMA'};if($q-like'STOP:*'){if($seenStop-or$q-ne$pls[-1]){$progress['PROGRESS_UNKNOWN']=$true;throw 'CHILD_PROGRESS_ORDER'};$seenStop=$true}else{if($seenStop-or$pi-ge$expected.Count-or$q-ne$expected[$pi]){$progress['PROGRESS_UNKNOWN']=$true;throw 'CHILD_PROGRESS_ORDER'};$pi++};if($progress.ContainsKey($q)){$progress['PROGRESS_UNKNOWN']=$true;throw 'CHILD_PROGRESS_DUPLICATE'};$progress[$q]=$true};$progressComplete=($pi-eq12-and-not$seenStop-and$pls.Count-eq12-and-not$progress.ContainsKey('PROGRESS_UNKNOWN')) $stopLine=@($pls|Where-Object{$_-like'STOP:*'});if($timedOut){$terminal='CHILD_TIMEOUT_KILLED';$stop='CHILD_TIMEOUT';$parentExit=27}elseif($childExit-eq0){$terminal='SOURCE_FREEZE_COMPLETED_PENDING_STATIC_REVIEW';$stop=$null;$parentExit=0}else{$terminal='CHILD_FAIL_CLOSED';$stop=$(if($stopLine.Count-eq1){$stopLine[0].Substring(5)}else{'CHILD_EXIT_'+$childExit});$parentExit=27} }catch{ if($childStarted-and-not$childExited){if(-not(StopChild)){$stop='CHILD_LIVENESS_UNKNOWN';$terminal='CHILD_LIVENESS_UNKNOWN';$parentExit=27}else{$progress['PROGRESS_UNKNOWN']=$true}} if($stop-ne'CHILD_LIVENESS_UNKNOWN'){$msg=[string]$_.Exception.Message;$stop=$(if($msg-cmatch'\A[A-Z0-9_]+\z'){$msg}else{'PARENT_EXCEPTION_'+$_.Exception.GetType().Name.ToUpperInvariant()});$terminal=$(if($childStarted){'PARENT_OR_CHILD_FAIL_CLOSED'}else{'PARENT_PRECHECK_STOP'});$parentExit=27} }finally{ if($childStarted-and-not$childExited){if(-not(StopChild)){$stop='CHILD_LIVENESS_UNKNOWN';$terminal='CHILD_LIVENESS_UNKNOWN';$parentExit=27}else{$progress['PROGRESS_UNKNOWN']=$true}} $rows=@();if($childStarted-and-not$childExited){for($i=0;$i-lt4;$i++){$rows+=[ordered]@{id=$ids[$i];attempted=$null;created_by_attempt=$null;exists=$null;object_type='UNKNOWN';reparse=$null;bytes=$null;sha256=$null;validation='UNKNOWN'}}}else{for($i=0;$i-lt4;$i++){$rows+=Obj $i $progress}} $valid=@($rows|Where-Object{$_.validation-eq'VALID'}).Count;$attemptedAll=(@($rows|Where-Object{$_.attempted-eq$true}).Count-eq4);$createdAll=(@($rows|Where-Object{$_.created_by_attempt-eq$true}).Count-eq4) $consumed=$(if(@($rows|Where-Object{$_.created_by_attempt-eq$true}).Count-gt0){$true}elseif(@($rows|Where-Object{$null-eq$_.created_by_attempt}).Count-gt0){$null}else{$false});$existingCount=@($rows|Where-Object{$_.exists-eq$true}).Count $successEvidence=($progressComplete-and$childExited-and$childExit-eq0-and-not$timedOut-and$valid-eq4-and$existingCount-eq4-and$attemptedAll-and$createdAll-and$consumed-eq$true) if($parentExit-eq0-and-not$successEvidence){$terminal='PARENT_SUCCESS_EVIDENCE_MISMATCH';$stop='FINAL_CROSS_FIELD';$parentExit=27} $o=[ordered]@{schema_id='ANA.SEMI.STAGE.S.PARENT.TERMINAL.V003';terminal_state=$terminal;stop_code=$stop;governance_exit_code=$parentExit;parent_process_count=1;child_process_count=$(if($childStarted){1}else{0});child_exited=$childExited;child_exit_code=$childExit;child_timed_out=$timedOut;kill_issued=$killIssued;progress_complete=$progressComplete;authorization_consumed=$consumed;observed_existing_count=$existingCount;valid_count=$valid;rows=$rows} $j=$o|ConvertTo-Json -Compress -Depth 6;[Console]::Out.Write($j+"`n");[Console]::Out.Flush();exit $parentExit } ``` ## 4. row/schema and success - row 9-key schema、N/B/U/V/I/Q/R/D/X semantics 与 V029 第 5/8 节保持。 - top V003 ordered keys:`schema_id,terminal_state,stop_code,governance_exit_code,parent_process_count,child_process_count,child_exited,child_exit_code,child_timed_out,kill_issued,progress_complete,authorization_consumed,observed_existing_count,valid_count,rows`。 - T13:child exit0 但 progress!=exact12、任一 row attempted/created/VALID 不全、consumed!=true、existing/valid!=4 → `PARENT_SUCCESS_EVIDENCE_MISMATCH/FINAL_CROSS_FIELD/27`。 - T14:只有 progress_complete=true、child_exited=true、actual exit0、timed_out=false、4 attempted=true、4 created=true、4 exists/VALID、consumed=true 才 governance=0。 - child_exited=false 永远 rows=U/U/U/U,consumed=null,governance=27;禁止 Get-Item/raw scan。 ## 5. fixed vectors gate 提交审核前 append-only 登记 parent/child parser/hash、EncodedCommand/Arguments/CommandLine、LF/CR、output ceiling、T13/T14 full literal JSON hash;placeholder=0。未登记不得送审。 ## 6. zero state - Y01—Y04 absent;run/Y05—Y08 absent;parent/child/candidate/database 未执行。 - Stage S/Stage V/database authorization=`NOT_ISSUED/NOT_ISSUED/NOT_ISSUED`;formal=0;BATCH-001=HELD;darkline_restored=false。 ## 7. fixed V030 vectors 与 T13/T14 literals - parent=`12849/de7eabb6c83f10058382bbd0bca766f36d802bb4d8bd8ba11b352dac8495afa2`;PS5.1 parser=0;CR/LF/final=`0/68/0x0A`。 - child=`2797/aeeddde8793d352af5f81988aa603a30cea9c145eaeb6024c5e83801800b30cc`;PS5.1 parser=0;CR/LF/final=`0/15/0x7D`;progress/STOP 只用显式 LF。 - child EncodedCommand=`7460 chars/5b3931022b452facf7a0941c26549cea24da3d8eafd01476a9152025c2d924ee`;Arguments=`7535/8e27019d502f352e946fd87354fbc53a9b29720b7ff8d8219e3d823a66b46cb9`;expected command line=`7593/f2a7b2c7b0ba55b8091e34410d2df8203128724756ca58919ba34a94a2797e07`。 - child source static process-spawn token count=0;child process tree total=1(child 自身),不能派生孙进程。 - parent final ASCII 上界 `<3800+LF`;child stdout 上界 `<768 ASCII bytes`、stderr=0;tool max_output_tokens=4096。 ### T13 canonical JSON(无 final LF) ```json {"schema_id":"ANA.SEMI.STAGE.S.PARENT.TERMINAL.V003","terminal_state":"PARENT_SUCCESS_EVIDENCE_MISMATCH","stop_code":"FINAL_CROSS_FIELD","governance_exit_code":27,"parent_process_count":1,"child_process_count":1,"child_exited":true,"child_exit_code":0,"child_timed_out":false,"kill_issued":false,"progress_complete":false,"authorization_consumed":true,"observed_existing_count":3,"valid_count":3,"rows":[{"id":"Y01","attempted":true,"created_by_attempt":true,"exists":true,"object_type":"FILE","reparse":false,"bytes":17465,"sha256":"89812a35ac352d6fd0887f0b67df85962070d637aba4962992b46e073dd4bcf6","validation":"VALID"},{"id":"Y02","attempted":true,"created_by_attempt":true,"exists":true,"object_type":"FILE","reparse":false,"bytes":3359,"sha256":"1983df916d5b9553a885a949d2674d9f8a8e7b1a6c4c5989eadf48245d929cf0","validation":"VALID"},{"id":"Y03","attempted":true,"created_by_attempt":true,"exists":true,"object_type":"FILE","reparse":false,"bytes":4016,"sha256":"86f563b43d934cb0828e395f557ded328ad2abcfb2c1ef7bdbc8a4c32c12cbca","validation":"VALID"},{"id":"Y04","attempted":false,"created_by_attempt":false,"exists":false,"object_type":"ABSENT","reparse":false,"bytes":null,"sha256":null,"validation":"NOT_PRESENT"}]} ``` - T13=`1223/1cd50b60922da80e25622119c47edff61d13f9646783c44050ecf1807b83b264`。 ### T14 canonical JSON(无 final LF) ```json {"schema_id":"ANA.SEMI.STAGE.S.PARENT.TERMINAL.V003","terminal_state":"SOURCE_FREEZE_COMPLETED_PENDING_STATIC_REVIEW","stop_code":null,"governance_exit_code":0,"parent_process_count":1,"child_process_count":1,"child_exited":true,"child_exit_code":0,"child_timed_out":false,"kill_issued":false,"progress_complete":true,"authorization_consumed":true,"observed_existing_count":4,"valid_count":4,"rows":[{"id":"Y01","attempted":true,"created_by_attempt":true,"exists":true,"object_type":"FILE","reparse":false,"bytes":17465,"sha256":"89812a35ac352d6fd0887f0b67df85962070d637aba4962992b46e073dd4bcf6","validation":"VALID"},{"id":"Y02","attempted":true,"created_by_attempt":true,"exists":true,"object_type":"FILE","reparse":false,"bytes":3359,"sha256":"1983df916d5b9553a885a949d2674d9f8a8e7b1a6c4c5989eadf48245d929cf0","validation":"VALID"},{"id":"Y03","attempted":true,"created_by_attempt":true,"exists":true,"object_type":"FILE","reparse":false,"bytes":4016,"sha256":"86f563b43d934cb0828e395f557ded328ad2abcfb2c1ef7bdbc8a4c32c12cbca","validation":"VALID"},{"id":"Y04","attempted":true,"created_by_attempt":true,"exists":true,"object_type":"FILE","reparse":false,"bytes":13037,"sha256":"244463c2a66910dd71564f148d5845672261dedc80a636e21e809712b691337e","validation":"VALID"}]} ``` - T14=`1271/772d2f2f02d0dadd886f219768ebeb421b489aece0eb284ed97ab583184949da`。 - T13/T14 均为 15 top-level ordered keys + 4×9 row ordered keys;strict JSON parse 后按相同 key order compact 重序列化 byte-identical。 - T14 executable predicate 与 literal 完全绑定:exact12、no STOP/unknown、4 attempted、4 created、4 existing/VALID、consumed=true、child exit0、not timeout。 - T13 表示 child exit0 但只完成 Y01—Y03;progress/rows/consumption 与 governance27 一致。其他 success-evidence drift 一律归 T13 family/27,不得改写为 T14。 第 7 节 supersede 第 5 节待补状态;placeholder=0,仅允许独立计划审核。