# CODE-DESIGN-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-V015 - plan_id: `CODE-DESIGN-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-V015` - role_instance_id: `dev.developer.ana.cai` - created_at: `2026-07-26T10:29:03.4689921+08:00` - predecessor_plan: `CODE-DESIGN-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-V014` / `144286/bd9c03fac8a025bf3fe01eb37099e846f04bc304eef92bc5f3ac9f14cafc8539` / review=`PASS/0/0` - predecessor_failure_audit: `AUDIT-DEV-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-REPAIR2-PRECONSUMPTION-STOP-FAILURE-001` / `162489/115bac1466edc3abac581830e6feac0dfa03c8ddbe935f60daf61bf1cb0a6045` / line=`1434` - predecessor_authorization: `AUTH-DEV-ANA-SEMI-ROOT-PREFLIGHT-V007-REPAIR2-IMPLEMENTATION-20260725-001/A001=TERMINATED_PRECONSUMPTION_UNCONSUMED_PERMANENTLY_CLOSED` - status: `PENDING_INDEPENDENT_PREFLIGHT_REPAIR_PLAN_REVIEW` - current_authorization: `NOT_ISSUED` - implementation/synthetic/database/BATCH-001: `NOT_AUTHORIZED/HELD/HELD/HELD` ## 1. 目标与范围 本计划只修复 `BLOCK-PRECONSUMPTION-01_MANDATORY_PREFLIGHT_TERMINAL_MISMATCH_RERUN_STARTED`,并固化 `ISSUE-PRECONSUMPTION-COMM-01_LEGACY_MBX_ROUTE_ATTEMPT_AFTER_NATIVE_POLICY` 的不回退要求。 必须关闭四个根因: 1. 时间窗口全部使用 `DateTimeOffset`,禁止 `DateTime` 与 `DateTimeOffset` 隐式比较。 2. mandatory preflight 恰好调用一次;首次异常、mismatch 或 uncertainty 当场生成本地 terminal STOP,禁止修正后重跑。 3. 相关进程选择器使用完整可执行文件坐标和完整命令行等值匹配,禁止 substring/self-match。 4. terminal 仅通过 Codex 原生 exact-thread 投递,禁止 legacy MB-X route/inbox/session fallback。 本计划不修改 V014,不复用已经关闭的 Repair2 A001/run/target,也不授权 R01—R20、outer、csc、synthetic、proof、config-editor、mysql、SQL、数据库、网络、凭据、正式数据或业务动作。 ## 2. 技术路线决定 ### 2.1 保留的执行工具栈 | 层 | 技术 | 职责 | |---|---|---| | native process runner | C# / .NET Framework | 原生进程启动、stdout/stderr bytes、生命周期和 sidecar | | orchestration / evidence | Windows PowerShell 5.1 + .NET BCL | preflight、CreateNew、hash、JCS/receipt/manifest、失败收口 | | compiler | reviewed `csc.exe` | 仅在后续单独授权的 R3 实现链中编译 C# | ### 2.2 Python / Node.js 处置 Python 和 Node.js 技术上均可实现时间、文件和 JSON 逻辑,但本轮不换栈:V007/V014 已审核的 C# API、PowerShell DAG、进程数、argv、JCS 和失败状态均依赖现有技术坐标。换栈会同时引入 runtime、依赖、进程、argv、canonical JSON 和打包合同重审,不能缩短当前最短路径。 若未来需要换栈,必须作为独立架构变更重新设计、审核和授权,不得在本计划或后续实现中静默替换。 ## 3. 新的两阶段修复链 ### 3.1 Stage P:稳定 preflight 模块 候选 run:`RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PRECONSUMPTION-REPAIR-IMPLEMENTATION-20260726-001`。 计划目标如下,全部使用项目根相对路径;当前均不得物化: | ID | 路径 | role | |---|---|---| | P01 | `dev/ana-dev/AnaSemi.Repair3PreconsumptionV001.psm1` | SOURCE | | P02 | `dev/ana-dev/test/Test-AnaSemiRepair3PreconsumptionV001.Static.ps1` | TEST_SOURCE | | P03 | `dev/ana-dev/test/AnaSemiRepair3PreconsumptionVectorsV001.json` | TEST_VECTOR | | P04 | `dev/ana-dev/test/Invoke-AnaSemiRepair3PreconsumptionValidationV001.ps1` | VALIDATION_SOURCE | | P05 | `dev/ana-dev/tmp/RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PRECONSUMPTION-REPAIR-IMPLEMENTATION-20260726-001/test/static-result.json` | TEST_RESULT | | P06 | `dev/ana-dev/tmp/RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PRECONSUMPTION-REPAIR-IMPLEMENTATION-20260726-001/test/contract-result.json` | TEST_RESULT | | P07 | `dev/ana-dev/tmp/RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PRECONSUMPTION-REPAIR-IMPLEMENTATION-20260726-001/receipt/preflight-repair-receipt.md` | RECEIPT | | P08 | `dev/ana-dev/tmp/RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PRECONSUMPTION-REPAIR-IMPLEMENTATION-20260726-001/manifest/preflight-repair-manifest.csv` | MANIFEST | Stage P 必须先独立计划审核,再由 management 单独决定 P01—P08 的一次性物化/验证授权。实现后必须由 `dev.reviewer.ana.cai` 独立实现审核。P 阶段不得创建任何 R3 target,不得访问数据库或凭据。 ### 3.2 Stage R3:后续实现链 只有 P 阶段实现审核 PASS 后,才允许另立完整 R3 计划并冻结新的 versioned R01—R20、payload、run、authorization、attempt、argv 和 hash。R3 不得复用 Repair2 的任何 ID/path/hash。 本 V015 不请求 R3 实现授权;它只建立可被 R3 授权引用的稳定 preflight 能力。 ## 4. P01 公共 API P01 只导出以下四个函数,禁止额外 pipeline output: 1. `ConvertTo-AnaSemiAuthorizationWindow` 2. `Test-AnaSemiAuthorizationWindow` 3. `Select-AnaSemiExactRelatedProcess` 4. `Invoke-AnaSemiPreconsumptionPreflight` 所有 helper 的非返回 API 调用必须显式赋给 `$null` 或 `[void]`;每个导出函数只返回恰好一个 `PSCustomObject`。调用端在读取属性前必须验证: - `@($result).Count -eq 1` - `PSTypeNames[0]` 等于该函数冻结的类型名 - required property set 采用 ordinal、case-sensitive、无 missing/extra - 每个字段类型/null 符合下文 schema 任何 count/type/property 漂移直接进入 `STOP_PRECONSUMPTION_RESULT_CONTRACT_DRIFT`,不得再次调用函数。 ## 5. 时间窗口唯一合同 ### 5.1 输入格式 `authorized_at` 与 `expires_at` 必须为带 offset、恰好 7 位小数的字符串,解析格式唯一为: `yyyy-MM-dd'T'HH:mm:ss.fffffffK` 实现只允许: ```powershell [DateTimeOffset]::ParseExact( $value, "yyyy-MM-dd'T'HH:mm:ss.fffffffK", [Globalization.CultureInfo]::InvariantCulture, [Globalization.DateTimeStyles]::None ) ``` 禁止 `[datetime]`、`Get-Date` 返回值与 `DateTimeOffset` 直接比较,禁止 culture fallback、宽松 parse 或解析失败后的第二种格式。 ### 5.2 比较坐标 - `now` 只来自一次 `[DateTimeOffset]::UtcNow` 调用,测试时由注入的 clock 返回。 - 三个时点均转换为 `UtcDateTime.Ticks:INT64`。 - 唯一有效规则:`authorized_ticks <= now_ticks -and now_ticks < expires_ticks`。 - `expires_ticks <= authorized_ticks` 直接 STOP。 - 解析、转换或 clock 任一异常直接 STOP,不得重新取时。 ### 5.3 固定测试向量 以 `authorized_at=2026-07-26T01:12:58.2748820+08:00`、`expires_at=2026-07-26T03:12:58.2748820+08:00` 为纯合成向量: | case | now | expected | |---|---|---| | T-BEFORE | `2026-07-26T01:12:58.2748819+08:00` | OUTSIDE | | T-AT-START | `2026-07-26T01:12:58.2748820+08:00` | INSIDE | | T-INSIDE | `2026-07-26T02:00:00.0000000+08:00` | INSIDE | | T-AT-END | `2026-07-26T03:12:58.2748820+08:00` | OUTSIDE | | T-MALFORMED | `2026/07/26 02:00:00` | STOP_PARSE | 这些向量只验证比较语义,不授予历史窗口或任何执行权。 ## 6. mandatory preflight 单次调用状态机 ### 6.1 唯一阶段顺序 `START → IDENTITY → WINDOW → PLAN_HASH → TARGET_ABSENCE → HISTORY_IMMUTABILITY → PROCESS_STATE → PASS` `Invoke-AnaSemiPreconsumptionPreflight` 内部维护 `preflight_invocation_count=1`。生产调用方必须在进入函数前置本地 monotonic guard;函数返回或抛出后 guard 永久关闭,本 turn 不得再调用。 ### 6.2 首错终态 | 首个事实 | terminal_status | stop_code | 可继续 | |---|---|---|---:| | 所有检查通过 | PASS | null | 仅允许进入后续管理授权明确的下一动作 | | 已知 mismatch | STOP | `STOP_PRECONSUMPTION_GATE_MISMATCH` | 否 | | 解析/API/类型异常 | STOP | `STOP_PRECONSUMPTION_PREFLIGHT_EXCEPTION` | 否 | | 进程或文件状态不可确定 | STOP | `STOP_PRECONSUMPTION_STATE_UNCERTAIN` | 否 | | 返回对象合同漂移 | STOP | `STOP_PRECONSUMPTION_RESULT_CONTRACT_DRIFT` | 否 | catch 只允许创建本地 terminal 对象;禁止修正参数、修改脚本、再次调用 preflight、重新取时、重新枚举或转入另一工具。即使尚未消费未来 authorization,也必须结束该 authorization chain。 ## 7. PreflightResult 完整 schema 类型名:`ANA.SEMI.PRECONSUMPTION.RESULT.V001`。 固定 22 个字段,按 ordinal 排序: `authorization_id,authorized_at_utc_ticks,candidate_run_exists,exception_type,expires_at_utc_ticks,finished_at,history_hash_mismatch_count,invocation_count,materialized_target_count,now_utc_ticks,preflight_stage,related_process_count,result_schema_id,started_at,status,stop_code,target_existing_count,uncertain_field,authorized_outer_started,credential_access,database_connection_performed,network_access` 类型/null: - STRING 非空:`authorization_id,result_schema_id,started_at,finished_at,status,preflight_stage` - INT64 非负:三个 `*_utc_ticks`;解析失败时对应不可获得值为 null - INT32 非负:`invocation_count,target_existing_count,history_hash_mismatch_count,related_process_count,materialized_target_count`;无法安全取得的字段为 null - BOOL:`candidate_run_exists,authorized_outer_started,credential_access,database_connection_performed,network_access`;无法确定时允许 null,但 status 必须 STOP - nullable STRING:`stop_code,exception_type,uncertain_field` - `invocation_count` 在所有合法对象中恰好为 1 - PASS 要求 stop/exception/uncertain 均 null,全部计数字段非 null且为 0,五个 BOOL 均 false - STOP 不得用 0/false 伪造未完成检查;未执行或不确定字段必须 null 本对象只存在于内存和原生 terminal 消息;pre-consumption STOP 不创建项目文件。 ## 8. 不会 self-match 的 exact process selector ### 8.1 输入快照 selector 只接受结构化进程行: `process_id:UINT32,parent_process_id:UINT32,executable_path:STRING|null,command_line:STRING|null` 生产 adapter 从 `Win32_Process` 一次性获取快照;测试 adapter 使用 P03 固定数组。禁止在 selector 内再次查询。 ### 8.2 outer 匹配规则 future management authorization 必须提供: - `expected_outer_executable_path` - `expected_outer_command_line_utf8_sha256` - `expected_outer_command_line_utf8_base64` - `source_preflight_process_id` 一行仅在以下全部成立时匹配: 1. `process_id != source_preflight_process_id` 2. `executable_path` 非 null,经 `Path.GetFullPath` 后与 expected path 采用 `OrdinalIgnoreCase` 完全相等 3. `command_line` 非 null,其 UTF-8 bytes 与 reviewed Base64 解码 bytes 完全相等 4. UTF-8 SHA-256 与 reviewed hash 完全相等 禁止 `-like`、`-match`、`Contains`、substring、仅进程名、仅 script path 或把当前 shell 命令正文中的字符串当作实际 child argv。任一候选 path/command_line null、规范化异常或重复 exact match 均为 STATE_UNCERTAIN,不得宣称 count=0。 ### 8.3 其他禁止进程 csc/mysql/mysql_config_editor 只按 future authorization 提供的 reviewed executable full path 做 `OrdinalIgnoreCase` 完整路径匹配。path 为 null 或枚举失败同样是 STATE_UNCERTAIN。 ### 8.4 固定 selector 反例 P03 至少包含: 1. exact outer 行 → count=1 2. 相同 exe、不同完整 command line → count=0 3. command line 仅包含 expected 字符串 → count=0 4. source PID 且其 command line 文本含 expected 字符串 → count=0 5. exact command line、不同 exe → count=0 6. executable_path=null → STOP_UNCERTAIN 7. command_line=null → STOP_UNCERTAIN 8. 两条 exact outer → STOP_UNCERTAIN ## 9. native-only terminal delivery terminal 的唯一通信入口为 Codex 原生 exact-thread: - management:授权中冻结的 `management.admin` thread id - reviewer:项目配置冻结的 `dev.reviewer.ana.cai` thread id 禁止 `mbx interaction route`、`mbx send`、project inbox、session bridge、历史 session fallback 或任何 legacy JSONL 投递。 每个目标最多调用一次原生发送;成功只记 `dispatch_accepted`。超时、返回不确定或目标状态不明确时记录 `DELIVERY_AMBIGUOUS_NO_RETRY`,不得改走备用通道、重发或把 delivery ambiguity 解释为执行成功。 P02/P04 必须静态扫描 P01—P04,不允许出现 legacy route/inbox/session 调用字符串;本规则只验证源码合同,不在 P 阶段真实发送测试消息。 ## 10. P 阶段验证方案 ### 10.1 进程与文件边界 未来 P 阶段若获单独授权: - P01—P04 使用 CreateNew/no-overwrite 物化 - 启动恰好一个 reviewed PowerShell validation process 执行 P04 - child/csc/mysql/config-editor/network/database/credential 均为 0/false - P05→P06→P07→P08 按 DAG CreateNew - 任一失败保留已物化子集,禁止补造、覆盖、删除或重试 ### 10.2 测试覆盖 P04 必须覆盖: 1. 5 个时间向量 2. 首个异常注入后 `invocation_count=1` 且第二调用被本地 guard 拒绝 3. 8 个 selector 向量 4. PASS/4 类 STOP 的 22 字段 schema/null 矩阵 5. helper 额外 pipeline object、missing/extra property、错误类型探针 6. legacy communication token 静态禁入 7. CreateNew conflict/no-overwrite ### 10.3 P05/P06 canonical P05/P06 为 UTF-8 无 BOM、无 CR、无尾 LF 的 ordinal-key JCS。P07 为 UTF-8 Markdown,P08 为 RFC4180 CSV。P08 记录 P01—P07 bytes/hash;P08 self row 的 bytes/hash 为空,外部 P08 hash 只进入原生 handoff/审计,保持 DAG 无环。 ## 11. 验收标准 V015 计划审核 PASS 必须证明: 1. C# + PowerShell 栈选择及不换栈边界明确。 2. `DateTimeOffset` parse/UTC ticks/半开窗口合同唯一。 3. 任一首错只生成一个 terminal,preflight 不可重入且不可重跑。 4. exact selector 不会因为 source shell 文本而 self-match。 5. unknown 与 confirmed zero 分离,不伪造进程或文件状态。 6. native-only delivery 不存在 legacy fallback。 7. P01—P08 目标、状态、测试、DAG 和两阶段授权边界完整。 8. V014、历史失败包和已关闭授权均保持不变。 ## 12. 风险与 STOP - 任何新增 runtime 或改用 Python/Node.js:STOP_ARCHITECTURE_DRIFT - 任何 `DateTime`/宽松 parse/culture fallback:STOP_TIME_CONTRACT_DRIFT - 首错后第二次 preflight、重新取时或重新枚举:STOP_RETRY_CONTRACT_DRIFT - substring/process-name-only/self-match:STOP_PROCESS_SELECTOR_DRIFT - legacy MB-X 通信 fallback:STOP_COMMUNICATION_POLICY_DRIFT - P 阶段与 R3 阶段合并授权:STOP_STAGE_AUTHORIZATION_DRIFT - 旧 Repair2 ID/path/run/target 复用:STOP_HISTORY_REUSE ## 13. 当前门禁 本文件仅允许 `dev.reviewer.ana.cai` 独立计划审核。审核 PASS 也只允许向 `management.admin` 申请 Stage P 的 P01—P08 单次实现授权,不允许直接进入 R3、synthetic 或数据库。 在新的明确管理授权前,禁止创建 P01—P08、R3 R01—R20、运行 PowerShell validation/csc/outer/synthetic/proof/config-editor/mysql/SQL/database、读取凭据、访问网络、创建正式数据、执行 BATCH-001 或形成业务结论。