edit | blame | history | raw

CODE-DESIGN-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-V031

0. 状态与唯一修复

  • 角色:dev.developer.ana.cai
  • predecessor:V030=20599/e167912f4a7e1572d17bac7494c6cd2d0c624da64ef951dee5038b227ae0ec0b;独立专业审核=PASS/0/0,audit=286828/6a8685c05db4bfb52f45a48f10e83793ddc6cdbc9965e99cb83d6221138d0a1f
  • management authorization decision=HOLD/2/2,audit=487624/796aea4d8f6e0a0f63995f35994ac0004c73eb906211681b99161b273228fb53;candidate authorization=NOT_GENERATED/send_count=0
  • 本版只修复 BLOCK-MGMT-PROJECT-INFO-ANA-V007-STAGE-S-PARENT-DEADLINE-COVERAGE-INCOMPLETEBLOCK-MGMT-PROJECT-INFO-ANA-V007-STAGE-S-PARENT-KILL-WAIT-NOT-IDEMPOTENT:normal-path stdin write/flush、child wait、stream drain 全部消费同一 10000ms Remaining;child 不依赖 EOF,因此 timed lifecycle 删除同步 StandardInput.Close;termination 只允许一次 Kill 与一次 5000ms Wait,结果缓存,catch/finally 后续调用零等待返回。
  • 本版仅计划,不执行 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 V031 parent preimage

以下 fence(不含 fence、含一个 final LF)是唯一 parent cmd;embedded child here-string runtime value不含 closing 前 LF。唯一 placeholder 必须在提交审核前替换为 child hash。

$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;$stopChildInvoked=$false;$stopChildResult=$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($script:stopChildInvoked){return [bool]$script:stopChildResult}
  $script:stopChildInvoked=$true;$r=$false
  try{
    if($null-eq$script:p-or$script:childExited){$r=$true}
    else{
      $canWait=$true
      if(-not$script:p.HasExited){
        if(-not$script:killIssued){$script:killIssued=$true;try{$script:p.Kill()}catch{if(-not$script:p.HasExited){$canWait=$false}}}
        if($canWait-and-not$script:p.HasExited){if(-not$script:p.WaitForExit(5000)){$canWait=$false}}
      }
      if($canWait-and$script:p.HasExited){$script:childExited=$true;$script:childExit=$script:p.ExitCode;$r=$true}
    }
  }catch{$r=$false}
  $script:stopChildResult=$r
  return $r
}
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'}
  $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($ot.IsCompleted-and$et.IsCompleted)){$remain=Remaining;if($remain-le0-or-not[Threading.Tasks.Task]::WaitAll(@($ot,$et),$remain)){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 V031 vectors 与 T13/T14 literals

  • parent=13256/4fd0f9b720ce69f3a7903a12959149708e7c70c538081fa59f10dc308caa1cb6;PS5.1 parser=0;CR/LF/final=0/81/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)

{"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)

{"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,仅允许独立计划审核。