edit | blame | history | raw

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

  • plan_id: CODE-DESIGN-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-V024
  • role_instance_id: dev.developer.ana.cai
  • created_at: 2026-07-26T21:41:42.6035331+08:00
  • predecessor: CODE-DESIGN-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-V023 / 14676/947699226f5b69a8fcc1faa888bbd38277e456c3341f69289fd1e44363d09ad0
  • predecessor_review: AUDIT-DEV-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-PYTHON-STAGE-P-REPAIR-PLAN-V023=HOLD/3/3 / 234600/760e657f6cae3b7fed502a073f513374ebb10dea8ca1215e710a19b83f677e27 / line 1828
  • status: PENDING_INDEPENDENT_PYTHON_ARCHITECTURE_REPAIR_PLAN_REREVIEW
  • implementation_authorization: NOT_ISSUED
  • database_execution_authorization: NOT_ISSUED

V024 只关闭 V023 的三项 blocker。继续选择“外部完全继承 V020、Python 仅替换内部 runtime”,不申请专业 amendment,不改变 V020 consumer wire。V023 已通过的 Y03、Y07、actual command-line provider、zero-state 与 native-only 边界全部继承且不得回退。

1. BLOCK-V021-01:恢复 exact V020 行级 wire

1.1 Y05/P05 exact CHECK_RESULT

Y05 顶层、schema、summary 完全继承 V020:

  • top keys=check_results,schema_id,status,summary
  • schema_id=ANA-SEMI-PRECONSUMPTION-STATIC-RESULT-JCS-V002
  • CHECK_RESULT keys=actual,check_id,expected,status,stop_code
  • SUMMARY keys=fail_count,pass_count,total_count
  • row status=MATCH|MISMATCH;MATCH iff actual==expected 且 stop_code=null;MISMATCH iff actual!=expected 且 stop_code=STATIC_CHECK_MISMATCH
  • total_count=12,pass_count+fail_count=12;top status=TEST_PASS iff fail_count=0,否则 TEST_FAIL

V023 的 case_id 与 12 个 PY-* ID 全部 supersede。唯一 12 行及 PASS actual/expected literal 为:

ordinal check_id expected PASS actual
1 API_COUNT 4 4
2 API_SIGNATURES CONVERT,INVOKE,SELECTOR,TEST CONVERT,INVOKE,SELECTOR,TEST
3 API_RETURN_SCHEMAS API_RESULT_V005 API_RESULT_V005
4 COMMUNICATION_FORBIDDEN_TOKENS 0 0
5 CREATE_NEW_ONLY true true
6 NO_EXTRA_PIPELINE_OUTPUT true true
7 NO_FORBIDDEN_RUNTIME true true
8 PROCESS_SELECTOR_NO_SUBSTRING true true
9 RESULT_22_PROPERTY_HASH 4c3f8d873a6be20c0e449c6c6d1f196204ec8c3dfa399e3a5ee0e19f5fa153a2 4c3f8d873a6be20c0e449c6c6d1f196204ec8c3dfa399e3a5ee0e19f5fa153a2
10 SEMAPHORE_NO_RELEASE true true
11 SOURCE_PATH_ALLOWLIST Y01,Y02,Y03,Y04 Y01,Y02,Y03,Y04
12 TARGET_PATH_ALLOWLIST Y01,Y02,Y03,Y04,Y05,Y06,Y07,Y08 Y01,Y02,Y03,Y04,Y05,Y06,Y07,Y08

Python-specific AST/import/call/writer checks只作为形成上述 actual literal 的内部子断言;不得新增行、改 ID、改字段或另建 consumer-visible group。任何子断言失败,使对应既有 check actual=false 或实际观测串并进入同一 MISMATCH row。

1.2 Y06/P06 exact groups、row keys 与类型

Y06 顶层 keys 固定:

api_negative_results,api_results,preflight_results,process_selector_results,provider_precedence_results,schema_id,status,summary,time_results

schema_id=ANA-SEMI-PRECONSUMPTION-CONTRACT-RESULT-JCS-V006。SUMMARY keys 固定:

api_fail_count,api_negative_fail_count,api_negative_pass_count,api_negative_total_count,case_fail_count,case_pass_count,case_total_count,precedence_fail_count,precedence_pass_count,precedence_total_count,status

固定 counts:api=4、negative=8、time=7、selector=15、preflight=8、precedence=4、functional case_total=30。每个数组按既有 ID ordinal,无 missing/extra/duplicate。

TIME_RESULT keys:

actual_inside,actual_status,actual_stop_code,case_id,expected_inside,expected_status,expected_stop_code,status,stop_code

inside=BOOL|null;actual/expected status=STRING;actual/expected stop与row stop=STRING|null

SELECTOR_RESULT keys(exact 27):

actual_adapter_call_count,actual_confirmed_zero,actual_duplicate_process_id_count,actual_exact_outer_count,actual_matched_process_ids,actual_prohibited_process_count,actual_related_process_count,actual_snapshot_row_count,actual_status,actual_stop_code,actual_uncertain_fields,actual_unknown_relevant_count,case_id,expected_adapter_call_count,expected_confirmed_zero,expected_duplicate_process_id_count,expected_exact_outer_count,expected_matched_process_ids,expected_prohibited_process_count,expected_related_process_count,expected_snapshot_row_count,expected_status,expected_stop_code,expected_uncertain_fields,expected_unknown_relevant_count,status,stop_code

call/count=INT32|null;confirmed=BOOL|null;matched=ARRAY<UINT32>|null;uncertain=ARRAY<STRING>|null;status=STRING;stop nullable。数组 numeric/ordinal sorted、无重复。任何 cross-field 不等为 MISMATCH/SELECTOR_CASE_MISMATCH

PREFLIGHT_RESULT keys:

actual_finished_at_null,actual_invocation_count,actual_provider_call_vector,actual_stage,actual_started_at_null,actual_status,actual_stop_code,case_id,expected_finished_at_null,expected_invocation_count,expected_provider_call_vector,expected_stage,expected_started_at_null,expected_status,expected_stop_code,status,stop_code

null flags=BOOL;invocation=INT32|null;provider vector 是 exact 6-key object history,identity,now,plan_hash,process_snapshot,target_state,每值 INT32 0|1;stage/status非空 STRING;stop nullable。

PROVIDER_PRECEDENCE_RESULT keys:

actual_exception_type,actual_provider_call_vector,actual_stage,actual_status,actual_stop_code,case_id,expected_exception_type,expected_provider_call_vector,expected_stage,expected_status,expected_stop_code,status,stop_code

exception/row stop nullable,其余按 V018;exact 4 IDs 与 call vector 继承 V018 lines 30-39。

API_RESULT V005 keys:

actual_object_count,actual_property_count,actual_property_names,actual_property_names_sha256,actual_property_types,actual_property_types_sha256,actual_type_names,api_id,expected_object_count,expected_property_count,expected_property_names,expected_property_names_sha256,expected_property_type_rules,expected_property_type_rules_sha256,expected_type_name,observation_status,status,stop_code

API_NEGATIVE_RESULT V004 keys:

actual_object_count,actual_property_count,actual_property_names,actual_property_names_sha256,actual_property_types,actual_property_types_sha256,actual_type_names,api_id,case_id,expected_actual_object_count,expected_actual_property_count,expected_actual_property_names_sha256,expected_actual_property_types_sha256,expected_actual_type_names,expected_observation_status,expected_property_count,expected_property_names,expected_property_names_sha256,expected_property_type_rules,expected_property_type_rules_sha256,expected_type_name,observation_status,status,stop_code

两类 API row 的 counts=INT32|null(expected object/count按 V019/V020 非空);names/types/rules=ARRAY<STRING>|null;hash=lowercase64|null;actual_type_names=ARRAY<STRING>;null 与 observation priority 精确继承 V019 lines 18-31、126-151 和 V020 lines 16-64。四 API name/type/rule vectors及 hashes逐项继承 V020 lines 28-52,不进行 Python 类型重命名。row MATCH 必须对完整 actual/expected evidence 逐字段相等;不得只比较 enum。

TIME/SELECTOR/PREFLIGHT ordinary row 均使用各自上述完整 schema;V023 的通用 case_id,status,stop_code 三字段声明全部 supersede。

2. BLOCK-V021-02:exact bootstrap preimage 安全修复

2.1 唯一 deterministic transform

V024 bootstrap 以 V023 已复算通过的 6461/996a79a55972fde5258f012daada29b73bf00432e56a2cdf1a130a5cff629f96 为唯一输入,按以下 ordinal replacements 生成;除此之外无 byte 差异:

  1. import line 加入 re
  2. bundle authorization/attempt gate 改为本节 exact re.fullmatch block。
  3. validate_py 整段替换为 2.2 exact block。
  4. create_new_verified 及其 Win32 binding 整段替换为 2.3 exact block。

authorization/attempt exact replacement:

if not isinstance(bundle.get("authorization_id"),str) or re.fullmatch(r"AUTH-[A-Z0-9]+(?:-[A-Z0-9]+)*",bundle["authorization_id"],re.ASCII) is None: die(11,"BUNDLE_AUTH_ID_INVALID")
if not isinstance(bundle.get("attempt_id"),str) or re.fullmatch(r"[A-Z0-9]+(?:-[A-Z0-9]+)*-A001",bundle["attempt_id"],re.ASCII) is None: die(11,"BUNDLE_ATTEMPT_ID_INVALID")

parent 在 child start 前必须把这两个值与 management exact authorization/attempt 逐字比较;fullmatch 只验证 shape,不能替代 parent equality。任何不等在 child 未启动前 STOP。

2.2 per-artifact AST/import/call/native allowlist

以下是 replacement 的完整 gate contract;实现 source 必须适配它,不允许管理端放宽:

POLICY={
 "Y01":{"imports":{"base64","ctypes","datetime","hashlib","json","os","pathlib","re","threading"},"module_calls":{"base64.b64decode","ctypes.WinDLL","ctypes.byref","ctypes.cast","ctypes.create_string_buffer","ctypes.create_unicode_buffer","ctypes.get_last_error","ctypes.set_last_error","ctypes.sizeof","ctypes.string_at","datetime.datetime.now","hashlib.sha256","json.dumps","json.loads","os.fspath","os.getpid","pathlib.Path","re.fullmatch"},"methods":{"CloseHandle","CommandLineToArgvW","CreateToolhelp32Snapshot","LocalFree","NtQueryInformationProcess","OpenProcess","Process32FirstW","Process32NextW","QueryFullProcessImageNameW","append","decode","encode","get","hexdigest","items","resolve","sort"}},
 "Y02":{"imports":{"ast","base64","hashlib","json","pathlib"},"module_calls":{"ast.parse","base64.b64decode","hashlib.sha256","json.dumps","json.loads","pathlib.Path"},"methods":{"append","decode","encode","endswith","get","hexdigest","items","read_bytes","resolve","sort","startswith"}},
 "Y04":{"imports":{"base64","ctypes","hashlib","importlib","json","os","pathlib","sys"},"module_calls":{"base64.b64decode","ctypes.WinDLL","ctypes.byref","ctypes.create_string_buffer","ctypes.get_last_error","ctypes.set_last_error","ctypes.sizeof","hashlib.sha256","importlib.util.module_from_spec","importlib.util.spec_from_file_location","json.dumps","json.loads","os.fspath","pathlib.Path"},"methods":{"CloseHandle","CreateDirectoryW","CreateFileW","FlushFileBuffers","GetFileInformationByHandleEx","GetFileType","ReadFile","WriteFile","append","decode","encode","exec_module","get","hexdigest","items","resolve","sort"}}}
SAFE_NAMES={"RuntimeError","ValueError","bool","bytearray","bytes","callable","dict","enumerate","int","isinstance","len","list","max","min","range","set","sorted","str","tuple","type","zip"}
DENIED_NAMES={"__import__","breakpoint","compile","delattr","eval","exec","getattr","globals","input","locals","open","setattr","vars"}
DENIED_NODES=(ast.AsyncFunctionDef,ast.Await,ast.Delete,ast.Global,ast.Lambda,ast.Nonlocal,ast.With,ast.AsyncWith)
def dotted(node):
 parts=[]
 while isinstance(node,ast.Attribute): parts.append(node.attr);node=node.value
 if not isinstance(node,ast.Name): return None
 parts.append(node.id);return ".".join(reversed(parts))
def validate_py(data,name):
 if data[:3]==b"\xef\xbb\xbf" or b"\r" in data or b"\x00" in data or not data.endswith(b"\n"): die(11,"SOURCE_BYTES_INVALID:"+name)
 try: text=data.decode("utf-8",errors="strict");tree=ast.parse(text,filename=name,mode="exec")
 except Exception as e: die(11,"SOURCE_AST_INVALID:"+name+":"+type(e).__name__)
 policy=POLICY[name];imports=set();local_calls={n.name for n in tree.body if isinstance(n,(ast.FunctionDef,ast.ClassDef))}
 for n in tree.body:
  if isinstance(n,ast.Import):
   for a in n.names:
    if a.asname is not None or a.name not in policy["imports"]: die(11,"SOURCE_IMPORT_DENIED:"+name)
    imports.add(a.name.split(".")[0])
  elif isinstance(n,ast.ImportFrom): die(11,"SOURCE_IMPORT_DENIED:"+name)
 for n in ast.walk(tree):
  if isinstance(n,DENIED_NODES): die(11,"SOURCE_NODE_DENIED:"+name)
  if isinstance(n,ast.Attribute) and n.attr.startswith("__"): die(11,"SOURCE_DUNDER_DENIED:"+name)
  if isinstance(n,ast.Call):
   if isinstance(n.func,ast.Name):
    if n.func.id in DENIED_NAMES or (n.func.id not in SAFE_NAMES and n.func.id not in local_calls): die(11,"SOURCE_CALL_DENIED:"+name)
   elif isinstance(n.func,ast.Attribute):
    call=dotted(n.func);root=call.split(".",1)[0] if call else None
    if (root in imports and call not in policy["module_calls"]) or (root not in imports and n.func.attr not in policy["methods"]): die(11,"SOURCE_ATTR_CALL_DENIED:"+name)
   else: die(11,"SOURCE_DYNAMIC_CALL_DENIED:"+name)

Y01 的 native method set 只允许 process snapshot/command-line APIs;Y04 的 native method set 只允许目录与 exclusive writer APIs;Y02 不允许 ctypes。os.system/os.spawn*、subprocess/network/database import、dynamic import、attribute indirection、任意额外 native API 均在首个 source CreateNew 前被拒绝。Y05 只复核已发生的 gate evidence,不再承担安全前置责任。

2.3 complete Win32 writer signatures、error 与 reparse boundary

exact replacement 必须定义并使用下列全部 prototypes;任何未绑定 native symbol 不得调用:

import ctypes
from ctypes import wintypes
K32=ctypes.WinDLL("kernel32",use_last_error=True)
CreateFileW=K32.CreateFileW;CreateFileW.argtypes=[wintypes.LPCWSTR,wintypes.DWORD,wintypes.DWORD,wintypes.LPVOID,wintypes.DWORD,wintypes.DWORD,wintypes.HANDLE];CreateFileW.restype=wintypes.HANDLE
WriteFile=K32.WriteFile;WriteFile.argtypes=[wintypes.HANDLE,wintypes.LPVOID,wintypes.DWORD,ctypes.POINTER(wintypes.DWORD),wintypes.LPVOID];WriteFile.restype=wintypes.BOOL
ReadFile=K32.ReadFile;ReadFile.argtypes=[wintypes.HANDLE,wintypes.LPVOID,wintypes.DWORD,ctypes.POINTER(wintypes.DWORD),wintypes.LPVOID];ReadFile.restype=wintypes.BOOL
FlushFileBuffers=K32.FlushFileBuffers;FlushFileBuffers.argtypes=[wintypes.HANDLE];FlushFileBuffers.restype=wintypes.BOOL
CloseHandle=K32.CloseHandle;CloseHandle.argtypes=[wintypes.HANDLE];CloseHandle.restype=wintypes.BOOL
GetFileInformationByHandleEx=K32.GetFileInformationByHandleEx;GetFileInformationByHandleEx.argtypes=[wintypes.HANDLE,wintypes.INT,wintypes.LPVOID,wintypes.DWORD];GetFileInformationByHandleEx.restype=wintypes.BOOL
GetFileType=K32.GetFileType;GetFileType.argtypes=[wintypes.HANDLE];GetFileType.restype=wintypes.DWORD
class FILE_ATTRIBUTE_TAG_INFO(ctypes.Structure): _fields_=[("FileAttributes",wintypes.DWORD),("ReparseTag",wintypes.DWORD)]
INVALID_HANDLE_VALUE=ctypes.c_void_p(-1).value
GENERIC_READ=0x80000000;GENERIC_WRITE=0x40000000
FILE_SHARE_ALL=7;CREATE_NEW=1;OPEN_EXISTING=3;FILE_TYPE_DISK=1
FILE_ATTRIBUTE_DIRECTORY=0x10;FILE_ATTRIBUTE_NORMAL=0x80;FILE_ATTRIBUTE_REPARSE_POINT=0x400
FILE_FLAG_WRITE_THROUGH=0x80000000;FILE_FLAG_OPEN_REPARSE_POINT=0x00200000;FILE_FLAG_BACKUP_SEMANTICS=0x02000000
def fail_last(code,label): err=ctypes.get_last_error();die(code,label+":"+str(err))
def close_checked(h,label):
 ctypes.set_last_error(0);ok=CloseHandle(h);err=ctypes.get_last_error()
 if not ok: die(27,label+":"+str(err))
def info_checked(h,want_dir,label):
 ctypes.set_last_error(0);kind=GetFileType(h);err=ctypes.get_last_error()
 if kind!=FILE_TYPE_DISK: die(27,label+"_TYPE:"+str(err))
 info=FILE_ATTRIBUTE_TAG_INFO();ctypes.set_last_error(0);ok=GetFileInformationByHandleEx(h,9,ctypes.byref(info),ctypes.sizeof(info));err=ctypes.get_last_error()
 if not ok: die(27,label+"_INFO:"+str(err))
 if info.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT: die(27,label+"_REPARSE")
 if bool(info.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)!=want_dir: die(27,label+"_KIND")
def verify_parents(path):
 chain=[];cur=path.parent
 while True:
  if cur==ROOT: chain.append(cur);break
  if ROOT not in cur.parents: die(11,"PARENT_ESCAPE")
  chain.append(cur);cur=cur.parent
 for q in reversed(chain):
  ctypes.set_last_error(0);h=CreateFileW(str(q),0,FILE_SHARE_ALL,None,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OPEN_REPARSE_POINT,None);err=ctypes.get_last_error()
  if h in (None,INVALID_HANDLE_VALUE): die(27,"PARENT_OPEN:"+str(err))
  try: info_checked(h,True,"PARENT")
  finally: close_checked(h,"PARENT_CLOSE")
def create_new_verified(path,data):
 verify_parents(path)
 ctypes.set_last_error(0);h=CreateFileW(str(path),GENERIC_WRITE,0,None,CREATE_NEW,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_WRITE_THROUGH,None);err=ctypes.get_last_error()
 if h in (None,INVALID_HANDLE_VALUE): die(11,"CREATE_NEW_FAILED:"+str(err))
 try:
  info_checked(h,False,"CREATE")
  off=0
  while off<len(data):
   chunk=data[off:off+1048576];buf=ctypes.create_string_buffer(chunk);done=wintypes.DWORD(0);ctypes.set_last_error(0);ok=WriteFile(h,buf,len(chunk),ctypes.byref(done),None);err=ctypes.get_last_error()
   if not ok or done.value!=len(chunk): die(27,"WRITE_UNCERTAIN:"+str(err))
   off+=done.value
  ctypes.set_last_error(0);ok=FlushFileBuffers(h);err=ctypes.get_last_error()
  if not ok: die(27,"FLUSH_UNCERTAIN:"+str(err))
 finally: close_checked(h,"CLOSE_UNCERTAIN")
 ctypes.set_last_error(0);h=CreateFileW(str(path),GENERIC_READ,0,None,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OPEN_REPARSE_POINT,None);err=ctypes.get_last_error()
 if h in (None,INVALID_HANDLE_VALUE): die(27,"REOPEN_UNCERTAIN:"+str(err))
 try:
  info_checked(h,False,"REOPEN");out=bytearray();buf=ctypes.create_string_buffer(1048576)
  while True:
   done=wintypes.DWORD(0);ctypes.set_last_error(0);ok=ReadFile(h,buf,len(buf),ctypes.byref(done),None);err=ctypes.get_last_error()
   if not ok: die(27,"READ_UNCERTAIN:"+str(err))
   if done.value==0: break
   out.extend(buf.raw[:done.value])
 finally: close_checked(h,"RECLOSE_UNCERTAIN")
 if bytes(out)!=data or hashlib.sha256(bytes(out)).digest()!=hashlib.sha256(data).digest(): die(27,"REOPEN_BYTES_DRIFT")

last-error 必须在对应 native call 后立即捕获,不能在其他 API 后读取。parent chain 从 ROOT 到 target parent 每级均以 OPEN_REPARSE_POINT|BACKUP_SEMANTICS 验证目录且非 reparse;created/reopened target 必须 disk、non-directory、non-reparse。任一 handle/type/info/write/flush/close/reopen/read/hash uncertainty 为 27;CreateNew pre-existence 为 11;不得 delete/rename/replace/truncate/backfill。

2.4 fixed vectors

本节 exact transform 的固定向量:

  • bootstrap=12144/c263b074893fa9c12e3807c889be9f245a68c65abbb9a8d5bc5ea11ad5595615,final byte=0x0A,CR count=0
  • RFC4648 Base64=16192/60c30a19d51da33ab0b13d336f70b113258a12aae5c0d55f38f585ec6ab3e637
  • wrapper token=16271/74e5021af3b4d0ad53fa18f258b9bec4416f6c155a077db74d15005ca7472a29
  • argv token preimage=5/16368/8c1b23bad1f78b61d84b7c26be3115cd2eb0c0e95d0fca5e043028094e68d13e
  • ProcessStartInfo Arguments=16282/05f5de86985435e09859cf4d2956afbb39af638b95b84ba35b900b5a77fbb9be
  • expected Win32 CommandLine=16372/adf4b05762d876c99f348a29746591bb3001c72a890b12ea0c1e9e8db6c883d8

派生规则继续 V022:5 token 单 LF、无尾 LF;Arguments=-I -B -c "<wrapper>";CommandLine="<python absolute path>" <Arguments>;runtime snapshot 必须仍是 91648/3c6a206b7d93cca823934a83732220dcffd413fd1036d9fb82eebb64599cf7f3/3.12.13

3. BLOCK-V021-04:Y05/Y06/Y08 与 native closure 总闭合

3.1 Y03/Y07 不回退

Y03 保持 4016/86f563b43d934cb0828e395f557ded328ad2abcfb2c1ef7bdbc8a4c32c12cbca。Y07 exact literals保持 PASS=449/51f12385835588e257859e36073da90290cb2a5465426b73174568c86960490c、STATIC=480/9ee2ce5e1fb04b6e43572d1f634343654b6a54abed8063ab0dd20dcf0d783a80、CONTRACT=470/1caa6eee696e12af70af766fec88a34b001490e883b2b2397f2f2b4ff1621724

3.2 Y08 exact fixed prefix rows

所有行 run_id 固定为 RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PYTHON-STAGE-P-20260726-001。13 columns 固定:

artifact_id,run_id,role,schema_id,relative_path,media_type,expected_presence,materialized,exists,status,upstream_stop_code,bytes,sha256

每行前七字段唯一为:

id role schema_id relative_path media_type expected_presence
Y01 SOURCE ANA-SEMI-PRECONSUMPTION-MODULE-PY-V001 dev/ana-dev/ana_semi_preconsumption_v002.py text/x-python; charset=utf-8 REQUIRED_BEFORE_OUTER
Y02 TEST_SOURCE ANA-SEMI-PRECONSUMPTION-STATIC-TEST-PY-V001 dev/ana-dev/test/test_ana_semi_preconsumption_v002.py text/x-python; charset=utf-8 REQUIRED_BEFORE_OUTER
Y03 TEST_VECTOR ANA-SEMI-PRECONSUMPTION-VECTORS-JCS-V005 dev/ana-dev/test/ana_semi_preconsumption_vectors_v002.json application/jcs+json REQUIRED_BEFORE_OUTER
Y04 VALIDATION_SOURCE ANA-SEMI-PRECONSUMPTION-VALIDATION-PY-V001 dev/ana-dev/test/run_ana_semi_preconsumption_validation_v002.py text/x-python; charset=utf-8 REQUIRED_BEFORE_OUTER
Y05 TEST_RESULT ANA-SEMI-PRECONSUMPTION-STATIC-RESULT-JCS-V002 dev/ana-dev/tmp/RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PYTHON-STAGE-P-20260726-001/test/static-result.json application/jcs+json REQUIRED_ON_STATIC_STAGE
Y06 TEST_RESULT ANA-SEMI-PRECONSUMPTION-CONTRACT-RESULT-JCS-V006 dev/ana-dev/tmp/RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PYTHON-STAGE-P-20260726-001/test/contract-result.json application/jcs+json REQUIRED_ON_CONTRACT_STAGE
Y07 RECEIPT ANA-SEMI-PRECONSUMPTION-RECEIPT-MD-V005 dev/ana-dev/tmp/RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PYTHON-STAGE-P-20260726-001/receipt/preflight-repair-receipt.md text/markdown; charset=utf-8 REQUIRED_ON_CLOSURE_STAGE
Y08 MANIFEST ANA-SEMI-PRECONSUMPTION-MANIFEST-CSV-V002 dev/ana-dev/tmp/RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PYTHON-STAGE-P-20260726-001/manifest/preflight-repair-manifest.csv text/csv; charset=utf-8 SELF

Y08 必须 RFC4180 CRLF+final CRLF、恰好八行、按 Y01-Y08 ordinal。后六字段由唯一 symbol 展开:

  • V=true,true,MATERIALIZED_VALID,null,actual_nonnegative_decimal,actual_lowercase64
  • F=true,true,MATERIALIZED_TEST_FAIL,null,actual_nonnegative_decimal,actual_lowercase64
  • A(code)=false,false,ATTEMPTED_NO_OUTPUT,code,null,null
  • I(code)=true,true,MATERIALIZED_INVALID,code,actual_nonnegative_decimal,actual_lowercase64
  • N(code)=false,false,NOT_RUN_UPSTREAM_STOP,code,null,null
  • U=null,null,STATE_UNCERTAIN,PACKAGE_UNCLOSED_STOP,null,null
  • S=true,true,MANIFEST_SELF_EXTERNAL_HASH,null,null,null

该固定 prefix + symbol 是每条 13-field row 的唯一构造,不存在自由字段。

3.3 non-overlapping state lookup

native schema=ANA.SEMI.PRECONSUMPTION.NATIVE.FINAL.V004,keys与 C00-C40 继续 V020。状态查找按以下优先且必须恰好命中一项:

  1. 任一事实 unknown/handle/liveness/hash uncertain → C10/U/27;
  2. source writer attempted but no file:Y01/Y02/Y03/Y04 分别 C03/C04/C05/C06,当前 target=A、上游 V、下游 N;
  3. source materialized-invalid-known:Y01/Y02/Y03/Y04 分别 C20/C21/C22/C23,当前 target=I、上游 V、下游 N;
  4. outer start/nonzero/timeout、Y05/Y06 writer、receipt/manifest、closed-package timeout 依次只查 V018 C07-C19;
  5. timeout-killed-known prefix只查 V019 C24-C39与V020 C40,恰好 18 个;
  6. closed PASS/STATIC/CONTRACT只查 C00/C01/C02。

C03-C06 只允许 A;C20-C23 只允许 I,V023 的“A或I自由分支”作废。每个 state 的 top-level 与 Y01-Y08 symbols仍取 V018 lines 177-227、V019 lines 155-203、V020 lines 66-84;上述 lookup 使它们无重叠。C18 external bytes/hash 必须等于 actual invalid Y08;C00 唯一 PASS/0;Y08 self row bytes/hash始终 blank,外部 hash仅进入 native/audit。

4. 零状态、后续边界与验收

  • Y01-Y08=ABSENT_8_OF_8;future run=ABSENT
  • 旧 P01-P04 immutable hashes不变,旧 P05-P08/run absent。
  • 当前没有 implementation/database authorization;未执行 bootstrap、Python、PowerShell、csc、node、mysql、SQL、database、network、credential。
  • V024 只允许独立计划复审。PASS 后仅可向 management 申请新的 single-use Python Stage P Y01-Y08 implementation authorization;仍不自动授权 R3 或数据库。
  • 后续数据库预检继续采用 Python orchestration + frozen mysql.exe --login-path=ana_semi_admin_preflight,秘密不进入 argv/stdin/env/file/log;另需独立数据库授权。
  • formal target=0;BATCH-001=HELD;darkline_restored=false。

验收必须复算:V024 plan bytes/hash、V023 audit snapshot、Y03/Y07、六项 bootstrap vectors、AST gate coverage、Win32 prototypes、Y05 12 rows、Y06 6 groups、Y08 8 prefixes/7 symbols、C00-C40 唯一 lookup及 zero-state。任何不一致 HOLD。

5. 复算登记

  • local read-only deterministic reconstruction:V022 bootstrap → V023 four transforms 首先复得 6461/996a79a...9f96,再执行 V024 四项 replacement;六项结果逐项等于 2.4。
  • 本复算未启动 Python;只读取计划文字并用 UTF-8/Base64/SHA-256 字节函数派生。