# CODE-DESIGN-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-V016 - plan_id: `CODE-DESIGN-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-V016` - role_instance_id: `dev.developer.ana.cai` - created_at: `2026-07-26T10:53:51.2300398+08:00` - predecessor_plan: `CODE-DESIGN-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-V015` / `15143/687ade2bcca4ecc3c699623005ff4a2cd31565fceac9b76145606e3a1d47e7a1` - predecessor_review: `AUDIT-DEV-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-PRECONSUMPTION-REPAIR-PLAN-V015=HOLD/4/4` / `169442/763a4c3aea2f1f90b42a72f102089996b77ea6d2445a22452e7b2c49f57347b7` / line `1476` - status: `PENDING_INDEPENDENT_PREFLIGHT_REPAIR_PLAN_REREVIEW` - current_authorization: `NOT_ISSUED` - implementation/synthetic/database/BATCH-001: `NOT_AUTHORIZED/HELD/HELD/HELD` 本修订按原生 observed order 编制;跨任务 wall-clock 字符串不作为因果顺序证据。V015 及其审计均保持 append-only 不变。 ## 1. 修订目标与不回退边界 本 V016 仅关闭: 1. `BLOCK-V015-01=EXPORTED_API_AND_SINGLE_INVOCATION_GUARD_UNCLOSED` 2. `BLOCK-V015-02=TIME_VECTOR_AND_RESULT_SCHEMA_DRIFT` 3. `BLOCK-V015-03=PROCESS_SELECTOR_CANDIDATE_AND_UNKNOWN_SCOPE_UNCLOSED` 4. `BLOCK-V015-04=STAGE_P_PROCESS_AND_EVIDENCE_PACKAGE_UNCLOSED` 保留 V015 已成立部分: - 执行工具仍为 C#/.NET Framework native runner + Windows PowerShell 5.1/.NET BCL orchestration;本链不切换 Python 或 Node.js。 - Git 仅为 `INFORMATIONAL_NON_BLOCKING_BY_HUMAN_OVERRIDE`。 - terminal 仅走 Codex native exact-thread,禁止 legacy MB-X route/inbox/session fallback。 - Stage P 与后续 R3 分开审核、分开授权;V016 PASS 也不授权实现、synthetic、数据库或 BATCH-001。 - 已永久关闭的 Repair2 authorization/run/targets 只读,不复用、不修补、不重跑。 ## 2. Stage P 目标宇宙 候选 run:`RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PRECONSUMPTION-REPAIR-IMPLEMENTATION-20260726-001`。 | ID | project-root-relative path | role | media_type | schema_id | |---|---|---|---|---| | P01 | `dev/ana-dev/AnaSemi.Repair3PreconsumptionV001.psm1` | SOURCE | `text/plain; charset=utf-8` | `ANA-SEMI-PRECONSUMPTION-MODULE-PSM1-V001` | | P02 | `dev/ana-dev/test/Test-AnaSemiRepair3PreconsumptionV001.Static.ps1` | TEST_SOURCE | `text/plain; charset=utf-8` | `ANA-SEMI-PRECONSUMPTION-STATIC-TEST-PS1-V001` | | P03 | `dev/ana-dev/test/AnaSemiRepair3PreconsumptionVectorsV001.json` | TEST_VECTOR | `application/jcs+json` | `ANA-SEMI-PRECONSUMPTION-VECTORS-JCS-V001` | | P04 | `dev/ana-dev/test/Invoke-AnaSemiRepair3PreconsumptionValidationV001.ps1` | VALIDATION_SOURCE | `text/plain; charset=utf-8` | `ANA-SEMI-PRECONSUMPTION-VALIDATION-PS1-V001` | | P05 | `dev/ana-dev/tmp/RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PRECONSUMPTION-REPAIR-IMPLEMENTATION-20260726-001/test/static-result.json` | TEST_RESULT | `application/jcs+json` | `ANA-SEMI-PRECONSUMPTION-STATIC-RESULT-JCS-V001` | | P06 | `dev/ana-dev/tmp/RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PRECONSUMPTION-REPAIR-IMPLEMENTATION-20260726-001/test/contract-result.json` | TEST_RESULT | `application/jcs+json` | `ANA-SEMI-PRECONSUMPTION-CONTRACT-RESULT-JCS-V001` | | P07 | `dev/ana-dev/tmp/RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PRECONSUMPTION-REPAIR-IMPLEMENTATION-20260726-001/receipt/preflight-repair-receipt.md` | RECEIPT | `text/markdown; charset=utf-8` | `ANA-SEMI-PRECONSUMPTION-RECEIPT-MD-V001` | | P08 | `dev/ana-dev/tmp/RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PRECONSUMPTION-REPAIR-IMPLEMENTATION-20260726-001/manifest/preflight-repair-manifest.csv` | MANIFEST | `text/csv; charset=utf-8` | `ANA-SEMI-PRECONSUMPTION-MANIFEST-CSV-V001` | P01—P08 和候选 run 当前必须全部 absent。每个未来 target 只能以 `FileMode.CreateNew` 首次物化;禁止 pre-delete、overwrite、truncate、rename-over、repair 或 backfill。 ## 3. P01 四个公共 API 的完整合同 所有函数只输出一个 `PSCustomObject`;创建对象时按下列固定字段顺序插入属性,并将固定类型名插入 `PSTypeNames[0]`。任何 helper 的无返回调用必须用 `[void]` 或 `$null=` 抑制。调用端必须先验证 `@($result).Count=1`、类型名、ordinal/case-sensitive property set、字段类型和 null 规则,之后才可读取业务字段。 ### 3.1 `ConvertTo-AnaSemiAuthorizationWindow` 精确签名: ```text ConvertTo-AnaSemiAuthorizationWindow( [Parameter(Mandatory)][ValidateNotNullOrEmpty()][string] AuthorizedAtRaw, [Parameter(Mandatory)][ValidateNotNullOrEmpty()][string] ExpiresAtRaw ) -> exactly one ANA.SEMI.AUTHORIZATION.WINDOW.V001 ``` 返回字段固定顺序: `authorized_at_raw,authorized_at_utc_ticks,expires_at_raw,expires_at_utc_ticks,schema_id,status,stop_code` 类型与值域: - raw/schema/status/stop 为 STRING|null;raw 与 schema 永不为 null。 - ticks 为 INT64|null。 - status=`PASS|STOP`。 - stop_code=`null|STOP_AUTHORIZED_AT_PARSE|STOP_EXPIRES_AT_PARSE|STOP_NON_POSITIVE_WINDOW`。 - PASS:两个 ticks 非 null,`expires_at_utc_ticks > authorized_at_utc_ticks`,stop=null。 - STOP:不可获得的 ticks 为 null,不得伪造 0。 ### 3.2 `Test-AnaSemiAuthorizationWindow` 精确签名: ```text Test-AnaSemiAuthorizationWindow( [Parameter(Mandatory)][psobject] WindowResult, [Parameter(Mandatory)][DateTimeOffset] Now ) -> exactly one ANA.SEMI.AUTHORIZATION.WINDOW.TEST.V001 ``` 先验证 WindowResult 是上一 API 的完整 PASS 对象。返回字段固定顺序: `authorized_at_utc_ticks,expires_at_utc_ticks,inside_window,now_utc_ticks,schema_id,status,stop_code` - ticks 为 INT64|null;inside_window 为 BOOL|null。 - status=`PASS|STOP`。 - stop_code=`null|STOP_WINDOW_INPUT_CONTRACT|STOP_NOW_CONVERSION`。 - PASS 的唯一判定:`authorized_ticks <= now_ticks -and now_ticks < expires_ticks`。 - 本函数不 parse string,也不自行取时;Now 的强类型在 API 边界阻止字符串混入 clock。 ### 3.3 `Select-AnaSemiExactRelatedProcess` 精确签名: ```text Select-AnaSemiExactRelatedProcess( [Parameter(Mandatory)][object[]] SnapshotRows, [Parameter(Mandatory)][ValidateNotNullOrEmpty()][string] ExpectedOuterExecutablePath, [Parameter(Mandatory)][ValidatePattern('^[0-9a-f]{64}$')][string] ExpectedOuterCommandLineSha256, [Parameter(Mandatory)][ValidateNotNullOrEmpty()][string] ExpectedOuterCommandLineBase64, [Parameter(Mandatory)][uint32] SourcePreflightProcessId, [Parameter(Mandatory)][string[]] ProhibitedExecutablePaths ) -> exactly one ANA.SEMI.PROCESS.SELECTOR.RESULT.V001 ``` 返回字段固定顺序: `confirmed_zero,duplicate_process_id_count,exact_outer_count,matched_process_ids,prohibited_process_count,related_process_count,schema_id,snapshot_row_count,status,stop_code,uncertain_fields,unknown_relevant_count` - counts 为 INT32|null;confirmed_zero 为 BOOL|null。 - matched_process_ids 为按 UINT32 升序的 ARRAY|null;uncertain_fields 为 ordinal 排序 ARRAY|null。 - status=`PASS|STOP`。 - stop_code=`null|STOP_SNAPSHOT_CONTRACT|STOP_DUPLICATE_PROCESS_ID|STOP_RELEVANT_PROCESS_FIELD_UNKNOWN|STOP_MULTIPLE_EXACT_OUTER|STOP_PROCESS_PRESENT`。 ### 3.4 `Invoke-AnaSemiPreconsumptionPreflight` 精确签名: ```text Invoke-AnaSemiPreconsumptionPreflight( [string] AuthorizationId, [string] AuthorizedAtRaw, [string] ExpiresAtRaw, [int64] ExpectedPlanBytes, [string] ExpectedPlanSha256, [string] ExpectedOuterExecutablePath, [string] ExpectedOuterCommandLineSha256, [string] ExpectedOuterCommandLineBase64, [uint32] SourcePreflightProcessId, [string[]] ProhibitedExecutablePaths, [System.Threading.SemaphoreSlim] InvocationGate, [scriptblock] NowProvider, [scriptblock] IdentityProvider, [scriptblock] PlanHashProvider, [scriptblock] TargetStateProvider, [scriptblock] HistoryProvider, [scriptblock] ProcessSnapshotProvider ) -> exactly one ANA.SEMI.PRECONSUMPTION.RESULT.V002 ``` 参数全部 Mandatory/ValidateNotNull;SHA-256 为 lowercase 64 hex;ExpectedPlanBytes 非负;InvocationGate 初始必须是 `new SemaphoreSlim(1,1)`,且每个 authorization 只能创建一个,不得跨 authorization 复用。 六个 provider 每个至多调用一次,必须输出恰好一个固定类型对象: | provider | output type | required fields | |---|---|---| | NowProvider | `System.DateTimeOffset` | 强类型值本身 | | IdentityProvider | `ANA.SEMI.PREFLIGHT.IDENTITY.V001` | `cwd,host,role_instance_id,source_thread_id,status` | | PlanHashProvider | `ANA.SEMI.PREFLIGHT.PLANHASH.V001` | `bytes,sha256,status` | | TargetStateProvider | `ANA.SEMI.PREFLIGHT.TARGETSTATE.V001` | `candidate_run_exists,materialized_target_count,target_existing_count,status,uncertain_fields` | | HistoryProvider | `ANA.SEMI.PREFLIGHT.HISTORY.V001` | `history_hash_mismatch_count,status,uncertain_fields` | | ProcessSnapshotProvider | `ANA.SEMI.PREFLIGHT.SNAPSHOT.V001` | `adapter_status,rows,snapshot_id,uncertain_fields` | provider count/type/property 漂移属于 `STOP_PRECONSUMPTION_RESULT_CONTRACT_DRIFT`;不得纠正或再次调用。 ## 4. 原子 single-invocation / reentrancy 状态机 ### 4.1 唯一所有权 调用入口第一条有副作用语句必须为: ```text owned := InvocationGate.Wait(0) ``` `SemaphoreSlim.Wait(0)` 是唯一原子所有权判定。禁止先读 `CurrentCount` 再决定;禁止 lock-file、普通 BOOL、模块全局字符串或 check-then-set。Gate 一经成功取得永不 `Release()`、不 Dispose 后重建、不替换实例。 状态只有: `READY(count=1) -> OWNED_RUNNING(count=0) -> OWNED_TERMINAL(count=0)` - 首个调用取得 owner 后,`invocation_count=1`。 - 任一并发/后续调用 `Wait(0)=false`,不得进入任何 provider,不得取时、枚举或读文件;直接返回 `STOP_PRECONSUMPTION_ALREADY_INVOKED`,`invocation_count=null`,stage=`START`。 - owner 的首次 mismatch/exception/uncertainty 立即进入 OWNED_TERMINAL。catch/finally 只构造一次结果,禁止第二轮 preflight。 - 生产调用方收到首个结果后只允许 native terminal handoff;不得再次调用 P01。 ### 4.2 provider 调用顺序和短路 固定阶段: `START -> IDENTITY -> WINDOW_PARSE -> CLOCK -> WINDOW_TEST -> PLAN_HASH -> TARGET_STATE -> HISTORY -> PROCESS_SNAPSHOT -> PROCESS_SELECT -> PASS` 每一阶段先增加该 provider 的本地 call counter,再调用一次;首错后后续 counter 保持 0。最终结果记录 `preflight_stage` 为最后进入的阶段。测试必须验证每个 STOP 场景的精确 provider call vector。 ### 4.3 terminal 映射 | first fact | status | stop_code | later provider | |---|---|---|---| | gate already consumed | STOP | `STOP_PRECONSUMPTION_ALREADY_INVOKED` | 全部 0 | | identity mismatch | STOP | `STOP_PRECONSUMPTION_GATE_MISMATCH` | 全部后续 0 | | time parse/window mismatch | STOP | `STOP_PRECONSUMPTION_GATE_MISMATCH` | WINDOW 后续 0 | | provider/API/type exception | STOP | `STOP_PRECONSUMPTION_PREFLIGHT_EXCEPTION` | 全部后续 0 | | provider result contract drift | STOP | `STOP_PRECONSUMPTION_RESULT_CONTRACT_DRIFT` | 全部后续 0 | | file/process state unknown | STOP | `STOP_PRECONSUMPTION_STATE_UNCERTAIN` | 全部后续 0 | | known target/history/process mismatch | STOP | `STOP_PRECONSUMPTION_GATE_MISMATCH` | 全部后续 0 | | all pass | PASS | null | none | 任何 STOP 均结束未来 authorization chain,即使 authorization 尚未被 CreateNew 消费。禁止 re-time、re-enumerate、corrected recomputation、retry、A002、replacement 或 renewal。 ## 5. 时间合同与固定向量 ### 5.1 parse 与比较 AuthorizedAtRaw/ExpiresAtRaw 唯一 parse 格式:`yyyy-MM-dd'T'HH:mm:ss.fffffffK`,仅允许 `DateTimeOffset.ParseExact(value, format, InvariantCulture, DateTimeStyles.None)`。比较坐标只允许 `UtcDateTime.Ticks:INT64`,窗口为半开 `[authorized_at,expires_at)`。 NowProvider 被 owner 恰好调用一次,结果必须是单一 `System.DateTimeOffset`。字符串、DateTime、null、多对象或异常均 STOP;不得重新取时。 ### 5.2 七个固定时间向量 基准:authorized=`2026-07-26T01:12:58.2748820+08:00`,expires=`2026-07-26T03:12:58.2748820+08:00`。 | case_id | authorized input | expires input | typed Now | expected | |---|---|---|---|---| | T-BEFORE | baseline | baseline | `2026-07-25T17:12:58.2748819+00:00` | PASS/inside=false | | T-AT-START | baseline | baseline | `2026-07-25T17:12:58.2748820+00:00` | PASS/inside=true | | T-INSIDE | baseline | baseline | `2026-07-25T18:00:00.0000000+00:00` | PASS/inside=true | | T-AT-END | baseline | baseline | `2026-07-25T19:12:58.2748820+00:00` | PASS/inside=false | | T-AUTH-MALFORMED | `2026/07/26 01:12:58` | baseline | `2026-07-25T18:00:00.0000000+00:00` | STOP_AUTHORIZED_AT_PARSE | | T-EXPIRES-MALFORMED | baseline | `2026/07/26 03:12:58` | `2026-07-25T18:00:00.0000000+00:00` | STOP_EXPIRES_AT_PARSE | | T-NONPOSITIVE | baseline | `2026-07-26T01:12:58.2748820+08:00` | `2026-07-25T18:00:00.0000000+00:00` | STOP_NON_POSITIVE_WINDOW | 坏格式只进入被 parse 的 authorization 字段;typed Now 位置永不放字符串。 ## 6. PreflightResult V002 的 22 字段 字段按 ordinal/case-sensitive 顺序为: ```text authorization_id authorized_at_utc_ticks authorized_outer_started candidate_run_exists credential_access database_connection_performed exception_type expires_at_utc_ticks finished_at history_hash_mismatch_count invocation_count materialized_target_count network_access now_utc_ticks preflight_stage related_process_count result_schema_id started_at status stop_code target_existing_count uncertain_field ``` 属性名 preimage 为上述名称以单一 `0x0A` 连接、无尾 LF:`22 properties / 403 bytes / sha256=4c3f8d873a6be20c0e449c6c6d1f196204ec8c3dfa399e3a5ee0e19f5fa153a2`。 类型/null: - STRING 非空:`authorization_id,result_schema_id,started_at,finished_at,status,preflight_stage`。 - nullable STRING:`exception_type,stop_code,uncertain_field`。 - nullable INT64:三个 `*_utc_ticks`。 - nullable INT32 非负:`invocation_count,target_existing_count,history_hash_mismatch_count,related_process_count,materialized_target_count`。 - nullable BOOL:`candidate_run_exists,authorized_outer_started,credential_access,database_connection_performed,network_access`。 - status=`PASS|STOP`;result_schema_id=`ANA.SEMI.PRECONSUMPTION.RESULT.V002`。 - owner PASS:invocation_count=1;三 ticks 非 null;五 count 非 null且为 0;五 BOOL=false;stop/exception/uncertain=null;stage=PASS。 - owner STOP:已完成阶段值按实际填写,未执行/unknown 值为 null,不得伪造 0/false。 - second-call STOP:invocation_count=null,stage=START,stop=`STOP_PRECONSUMPTION_ALREADY_INVOKED`,除 authorization/result/timestamps/status 外业务字段均 null。 ## 7. 一次快照、候选分类与 confirmed-zero ### 7.1 adapter 快照边界 ProcessSnapshotProvider 只调用一次 Win32_Process adapter;selector 内禁止再次查询。adapter 先生成一个不可变数组,每行固定字段: `command_line:STRING|null,executable_path:STRING|null,name:STRING|null,parent_process_id:UINT32,process_id:UINT32` adapter query failure、枚举中断、重复 process_id、字段访问异常写入 snapshot `adapter_status=STOP` 和 ordinal `uncertain_fields`;不得丢弃失败行后宣称 zero。rows 按 process_id 数字升序;重复 PID 不 deduplicate,直接 STOP。 ### 7.2 相关名称集合 相关名称集合只由 reviewed full paths 的 `Path.GetFileName()` 生成并按 OrdinalIgnoreCase 去重: - expected outer PowerShell path - prohibited csc path - prohibited mysql path - prohibited mysql_config_editor path 先按 `name` 完整等值确定 relevant row: - source_preflight_process_id 行在任何字段访问前排除,因而 source shell 正文不会 self-match。 - name=null:STATE_UNCERTAIN(无法判断 relevance)。 - name 不在相关名称集合:明确 irrelevant;其 path/command null 不影响 zero。 - name 在集合:path=null/规范化异常为 STATE_UNCERTAIN。 - path 与 expected outer full path 相等时,command_line=null/UTF-8 转换异常为 STATE_UNCERTAIN;bytes 必须同时等于 reviewed Base64 解码 bytes 且 SHA-256 相等才是 exact outer。 - path 与某个 prohibited full path 相等即为 prohibited present;不需要读取 command_line。 - relevant name 但 full path 为其他已知路径:明确 irrelevant,不是 unknown。 ### 7.3 排序、计数和终态 - rows 按 PID 升序处理;matched_process_ids 同序。 - exact_outer_count=0 且 prohibited_process_count=0 且 unknown_relevant_count=0 且 duplicate=0 才能 `confirmed_zero=true`。 - exact_outer_count=1 或 prohibited>0 是已知 mismatch:`STOP_PROCESS_PRESENT`。 - exact_outer_count>1、任何 relevant unknown、duplicate PID 或 adapter STOP 是 uncertainty,优先于 known mismatch。 - 不允许 substring、`-like`、`-match`、Contains、process-name-only、script-path-only 或命令正文自证。 ### 7.4 十个固定 selector 向量 | case | rows | expected | |---|---|---| | S-EMPTY | 空 snapshot/PASS | confirmed_zero=true | | S-EXACT | 一条 exact outer | STOP_PROCESS_PRESENT | | S-CMD-DIFFERENT | same outer exe/different full command | confirmed_zero=true | | S-SUBSTRING | command only contains expected bytes | confirmed_zero=true | | S-SOURCE-SELF | source PID/name/path/cmd all似 exact | confirmed_zero=true | | S-EXE-DIFFERENT | same cmd/different known path | confirmed_zero=true | | S-RELEVANT-PATH-NULL | PowerShell name/path null | STOP_RELEVANT_PROCESS_FIELD_UNKNOWN | | S-OUTER-CMD-NULL | exact outer path/cmd null | STOP_RELEVANT_PROCESS_FIELD_UNKNOWN | | S-DUP-PID | 两行同 PID | STOP_DUPLICATE_PROCESS_ID | | S-TWO-EXACT | 两个 exact outer PID | STOP_MULTIPLE_EXACT_OUTER | ## 8. P03 完整 schema P03 为 UTF-8、无 BOM/CR/NUL/尾 LF 的 RFC 8785/JCS object。顶层键集合: `api_contracts,forbidden_communication_tokens_base64,preflight_cases,process_selector_cases,result_schema,run_id,schema_id,time_cases` - schema_id 固定 `ANA-SEMI-PRECONSUMPTION-VECTORS-JCS-V001`。 - run_id 固定 Stage P candidate run。 - api_contracts:4 行,字段 `api_id,parameter_names,parameter_types,return_property_names,return_type_name`;数组顺序为本计划 3.1—3.4。 - time_cases:本计划七行,字段 `authorized_at_raw,case_id,expected_inside,expected_status,expected_stop_code,expires_at_raw,now_utc`。 - process_selector_cases:本计划十行,字段 `case_id,expected_confirmed_zero,expected_exact_outer_count,expected_prohibited_count,expected_status,expected_stop_code,rows`;rows 使用 7.1 五字段 schema。 - preflight_cases 固定 8 行:PASS、IDENTITY_MISMATCH、TIME_PARSE_STOP、PLAN_HASH_MISMATCH、TARGET_UNKNOWN、HISTORY_MISMATCH、PROCESS_UNKNOWN、SECOND_CALL;字段 `case_id,expected_invocation_count,expected_provider_call_vector,expected_stage,expected_status,expected_stop_code`。 - result_schema:字段 `property_count=22,property_name_preimage_bytes=403,property_name_sha256=4c3f...,property_names,property_types`。 - forbidden_communication_tokens_base64:仅存被禁 token 的 UTF-8 Base64,不在 P01/P02/P04 中出现原始 legacy 调用字面量;P04 在内存解码后扫描 P01/P02/P04 bytes。 所有数组顺序固定;key 使用 JCS ordinal order;未知/额外 key STOP。 ## 9. P05/P06 完整结果 schema ### 9.1 P05 static-result 顶层键:`check_results,schema_id,status,summary`。 - schema_id=`ANA-SEMI-PRECONSUMPTION-STATIC-RESULT-JCS-V001` - status=`TEST_PASS|TEST_FAIL` - check_results 固定 12 行、按 check_id ordinal 排序;row 字段:`actual,check_id,expected,status,stop_code`,全部 STRING,stop_code nullable。 - 12 个 check_id:`API_COUNT,API_SIGNATURES,API_RETURN_SCHEMAS,COMMUNICATION_FORBIDDEN_TOKENS,CREATE_NEW_ONLY,NO_EXTRA_PIPELINE_OUTPUT,NO_FORBIDDEN_RUNTIME,PROCESS_SELECTOR_NO_SUBSTRING,RESULT_22_PROPERTY_HASH,SEMAPHORE_NO_RELEASE,SOURCE_PATH_ALLOWLIST,TARGET_PATH_ALLOWLIST`。 - summary 字段:`fail_count:INT32,pass_count:INT32,total_count:INT32`;total=12,pass+fail=12;status 与 fail_count 交叉一致。 ### 9.2 P06 contract-result 顶层键:`api_results,preflight_results,process_selector_results,schema_id,status,summary,time_results`。 - schema_id=`ANA-SEMI-PRECONSUMPTION-CONTRACT-RESULT-JCS-V001` - status=`TEST_PASS|TEST_FAIL` - time_results 7 行:`actual_inside,actual_status,actual_stop_code,case_id,expected_inside,expected_status,expected_stop_code,status`。 - process_selector_results 10 行:`actual_confirmed_zero,actual_exact_outer_count,actual_status,actual_stop_code,case_id,expected_confirmed_zero,expected_exact_outer_count,expected_status,expected_stop_code,status`。 - preflight_results 8 行:`actual_invocation_count,actual_provider_call_vector,actual_stage,actual_status,actual_stop_code,case_id,expected_invocation_count,expected_provider_call_vector,expected_stage,expected_status,expected_stop_code,status`。 - api_results 4 行:`api_id,actual_object_count,actual_property_count,actual_property_sha256,actual_type_name,expected_object_count,expected_property_count,expected_property_sha256,expected_type_name,status`。 - summary:`api_fail_count,case_fail_count,case_pass_count,case_total_count,status`;case_total=25,所有 count INT32 非负且交叉一致。 P05/P06 canonical bytes 均为 UTF-8、无 BOM/CR/NUL/尾 LF、strict JSON、JCS reserialize byte-identical。任一 output 自身 schema/canonical 失败不允许创建 P07。 ## 10. 唯一 validation 进程合同 ### 10.1 tool 与 argv - executable:`C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe` - snapshot:`455680/9785001b0dcf755eddb8af294a373c0b87b2498660f724e76c4d53f9c217c7a3` - cwd:`E:\mb-ms-doc\project-info` - UseShellExecute=false;CreateNoWindow=true;stdin disabled;stdout/stderr 分开重定向到 parent memory;不得走文本 pipeline 或临时文件。 14 个 token(token[0] 含 executable): ```text 0 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe 1 -NoLogo 2 -NoProfile 3 -NonInteractive 4 -ExecutionPolicy 5 Bypass 6 -File 7 E:\mb-ms-doc\project-info\dev\ana-dev\test\Invoke-AnaSemiRepair3PreconsumptionValidationV001.ps1 8 -ProjectRoot 9 E:\mb-ms-doc\project-info 10 -RunId 11 RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PRECONSUMPTION-REPAIR-IMPLEMENTATION-20260726-001 12 -OutputRoot 13 E:\mb-ms-doc\project-info\dev\ana-dev\tmp\RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PRECONSUMPTION-REPAIR-IMPLEMENTATION-20260726-001 ``` token preimage 为 UTF-8 token 以单一 NUL 连接、无尾 NUL:`14/483/cbdacac456a1746341e9b9f8e55296a7797bef13f3802e5d6456020c81b5c03a`。 ProcessStartInfo.Arguments 逐字为: ```text -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Bypass -File E:\mb-ms-doc\project-info\dev\ana-dev\test\Invoke-AnaSemiRepair3PreconsumptionValidationV001.ps1 -ProjectRoot E:\mb-ms-doc\project-info -RunId RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PRECONSUMPTION-REPAIR-IMPLEMENTATION-20260726-001 -OutputRoot E:\mb-ms-doc\project-info\dev\ana-dev\tmp\RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PRECONSUMPTION-REPAIR-IMPLEMENTATION-20260726-001 ``` UTF-8:`425/713ec98a5ec3bfc1ecad2f6f59d164d8ec7602482c6d6fd1b6fe5dbe55a25218`。这些 token 无空格/quote,禁止添加、删除、重排或替换 option。 ### 10.2 timeout/lifecycle - outer process count exactly 1;child/csc/synthetic/proof/config-editor/mysql/query/database=0/0/0/0/0/0/false。 - timeout=120000ms;超时只允许 Kill 一次,kill-wait=10000ms;禁止 restart。 - stdout/stderr 必须异步复制 native bytes 到两个独立内存 stream,wait/kill 后等待两个 copy task 完成并关闭 handle。 - success:exit=0、stdout=0 bytes、stderr=0 bytes、timed_out=false、liveness=EXITED。 - timeout 后成功 kill/wait 且 streams/handles/target snapshot 全部可知:`OUTER_TIMEOUT_KILLED_STOP`;liveness/stream/target 任一不确定:`PACKAGE_UNCLOSED_STOP/27`。 ### 10.3 parent native process result 不落项目文件;原生 terminal 返回固定 15 字段: `argv_count,argv_preimage_sha256,exit_code,finished_at,killed,liveness,process_id,process_started,started_at,stderr_bytes,stderr_sha256,stdout_bytes,stdout_sha256,timed_out,tool_sha256` process_started=false 时 pid/timestamps/exit/streams/liveness 为 null;started=true 时 pid/started_at 非 null。未观察 exit 时 exit_code=null,禁止用治理 exit 27 冒充 child actual exit。empty stream hash=`e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855`。 ## 11. P07/P08 schema、DAG 与 hash topology ### 11.1 P07 receipt P07 为 UTF-8 Markdown、无 BOM/CR/NUL、恰好一个尾 LF。固定 key 顺序: `receipt_schema_id,run_id,plan_id,outer_tool_sha256,outer_argv_sha256,outer_process_count,outer_exit_code,outer_timed_out,P05_status,P06_status,prepackage_terminal_state,materialized_target_count,prohibited_process_count,network_access,credential_access,database_connection_performed,final_status,final_stop_code` P07 不含自己的 bytes/hash,不含 P08 bytes/hash。P07 只在 P05/P06 本身 canonical 可验证或其中一个合法 TEST_FAIL object 已物化后创建。 ### 11.2 P08 manifest P08 列顺序: `artifact_id,run_id,role,schema_id,relative_path,media_type,expected_presence,materialized,exists,status,upstream_stop_code,bytes,sha256` 恰好 P01—P08 八行,artifact_id 升序。enum: - expected_presence=`REQUIRED_BEFORE_OUTER|REQUIRED_ON_STATIC_STAGE|REQUIRED_ON_CONTRACT_STAGE|REQUIRED_ON_CLOSURE_STAGE|SELF` - status=`MATERIALIZED_VALID|MATERIALIZED_TEST_FAIL|ATTEMPTED_NO_OUTPUT|MATERIALIZED_INVALID|NOT_RUN_UPSTREAM_STOP|STATE_UNCERTAIN|MANIFEST_SELF_EXTERNAL_HASH` - materialized/exists=`true|false|null` 规则: - MATERIALIZED_VALID/TEST_FAIL:materialized=exists=true,bytes/sha256 非 null。 - ATTEMPTED_NO_OUTPUT/NOT_RUN:false/false,bytes/sha256 null。 - MATERIALIZED_INVALID:true/true;仅在安全 close/reopen/hash 成功时合法且 bytes/hash 非 null,否则必须 STATE_UNCERTAIN。 - STATE_UNCERTAIN:null/null,bytes/hash null。 - P08 self:true/true/status=MANIFEST_SELF_EXTERNAL_HASH,但 self-row bytes/hash 为空;外部 P08 bytes/hash 只进入 native handoff/audit。 P08 使用 UTF-8 无 BOM/NUL、RFC4180 quoting、CRLF 行终止且恰好一个最终 CRLF。重复 role/schema/path/ID、path escape、额外/缺失行 STOP。 ### 11.3 无环顺序 `reviewed plan/audit -> P01-P04 -> outer -> P05 -> conditional P06 -> freeze P01-P06 -> P07 -> P08(self blank) -> external P08 bytes/hash` P05 static TEST_FAIL 时 P06 明确 NOT_RUN,仍允许 P07/P08 封装已知失败;P05 自身 invalid/unknown 时禁止 P07。P06 TEST_FAIL 时允许 P07/P08;P06 invalid/unknown 时禁止 P07。 ## 12. 总失败矩阵与 materialization truth table 符号:`V=MATERIALIZED_VALID`、`F=MATERIALIZED_TEST_FAIL`、`A=ATTEMPTED_NO_OUTPUT`、`I=MATERIALIZED_INVALID且证据可安全取得`、`N=NOT_RUN_UPSTREAM_STOP`、`U=STATE_UNCERTAIN`、`S=MANIFEST_SELF_EXTERNAL_HASH`、`K=按实际已完成前缀(V),失败点(A|I),其后N`。 | terminal | P01-P04 | P05 | P06 | P07 | P08 | governance final | |---|---|---|---|---|---|---| | PASS | V,V,V,V | V | V | V | S | 0 | | STATIC_TEST_FAIL_CLOSED | V,V,V,V | F | N | V | S | 11 | | CONTRACT_TEST_FAIL_CLOSED | V,V,V,V | V | F | V | S | 11 | | SOURCE_CREATE_STOP(k) | K | N | N | N | N | 21 | | OUTER_START_STOP | V,V,V,V | N | N | N | N | 22 | | OUTER_NONZERO_WITHOUT_VALID_TEST_OBJECT | V,V,V,V | A或I | N | N | N | 27 | | OUTER_TIMEOUT_KILLED_KNOWN | V,V,V,V | 按实际V/F/A/I/N | 按实际V/F/A/I/N | N | N | 24;若包状态不闭合则27 | | OUTER_LIVENESS_OR_STREAM_UNKNOWN | V,V,V,V | U | U | U | U | 27 | | P05_WRITE_STOP | V,V,V,V | A或I | N | N | N | 27 | | P06_WRITE_STOP | V,V,V,V | V | A或I | N | N | 27 | | RECEIPT_STOP_KNOWN | V,V,V,V | V或F | V或F或N | A或I | N | 25 | | MANIFEST_STOP_KNOWN | V,V,V,V | V或F | V或F或N | V | A或I | 26 | | ANY_TARGET_STATE_UNKNOWN | 按实际 | 按实际或U | 按实际或U | 按实际或U | 按实际或U | 27 | SOURCE_CREATE_STOP(k) 的精确行规则:P01—P04 固定顺序创建;索引 `k` 为 N;P05—P08=N,outer=0。 closure precedence: 1. 任何 liveness/stream/handle/target 状态 unknown,或 prepackage 已为 27:最终 27。 2. 否则 P07 required 且已知失败:最终 25。 3. 否则 P08 required 且已知失败:最终 26。 4. 否则保留 primary(0/11/21/22/24)。 同一事实不得同时映射两个 final;实际 outer exit 与 governance final 分字段记录。 ## 13. native-only communication 与静态验收 P01—P04 不实现任何消息发送 API。外部 source 仅在 terminal 后使用 Codex 原生 exact management/reviewer thread 各至多一次;dispatch ambiguity 记 `DELIVERY_AMBIGUOUS_NO_RETRY`,禁止 resend/fallback。 P02/P04 静态扫描 P01/P02/P04 bytes:禁止 legacy MB-X CLI、route、inbox、session、history fallback 的原始调用 token。P03 仅以 Base64 保存禁词测试向量,避免测试数据本身违反源文件字面禁入。 ## 14. 独立计划审核验收 V016 PASS 必须独立证明: 1. 四个 API 的参数、单对象返回类型、属性顺序、类型/null/enum 均唯一。 2. SemaphoreSlim Wait(0) 是唯一原子 owner;不 release;second call 无 provider/I/O 并返回固定 STOP。 3. malformed 只进入被 parse 的 authorization 字段;typed Now 不接收字符串。 4. 22 字段确为 ordinal 顺序,count/403-byte preimage/hash 可复算。 5. 一次 process snapshot、relevant-name scope、source PID 排除、null/duplicate/排序和 confirmed-zero 均唯一。 6. P03/P05/P06/P07/P08 schemas、process tool/argv/timeout/native result、truth table、closure precedence 和 hash DAG 完整。 7. P01—P08/run 仍 absent,V014/V015/旧失败包未修改,所有数据库/业务门继续 HELD。 ## 15. 当前门禁 V016 仅提交 `dev.reviewer.ana.cai` 独立计划复审。PASS 也只允许向 management.admin 申请新的 Stage P P01—P08 单次实现/验证授权;不得直接物化、运行 P04、进入 R3/synthetic/proof/config-editor/mysql/SQL/database/network/credential/formal target/BATCH-001。 任何 plan/hash/path/API/schema/argv/timeout/target/role 漂移,任何 first-error 后重算,任何 substring/self-match,任何 legacy communication fallback,任何 Python/Node 静默换栈,均立即 HOLD/STOP。