@adamchanadam/cer-workflow 0.3.18 → 0.3.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,9 +10,9 @@ In plain language: when you discover halfway through that the direction, constra
10
10
 
11
11
  If you do not want to choose between ordinary chat, Goal, and CER up front, use `/CER-auto <task>` after installation. It first selects the minimum sufficient route: ordinary execution, Goal, CER Workflow, or blocked because authority, safety, or acceptance conditions are missing.
12
12
 
13
- [Traditional Chinese README](https://github.com/Adamchanadam/cer-workflow/blob/v0.3.17/README.md) | [GitHub repository](https://github.com/Adamchanadam/cer-workflow)
13
+ [Traditional Chinese README](https://github.com/Adamchanadam/cer-workflow/blob/v0.3.19/README.md) | [GitHub repository](https://github.com/Adamchanadam/cer-workflow)
14
14
 
15
- ![CER-auto route selector: ordinary execution, Goal, CER Workflow, and blocked](https://raw.githubusercontent.com/Adamchanadam/cer-workflow/v0.3.17/assets/cer-auto-routing-infographic.en.png)
15
+ ![CER-auto route selector: ordinary execution, Goal, CER Workflow, and blocked](https://raw.githubusercontent.com/Adamchanadam/cer-workflow/v0.3.19/assets/cer-auto-routing-infographic.en.png)
16
16
 
17
17
  ## Install
18
18
 
@@ -78,7 +78,7 @@ New users should start with `/CER-auto`. If it returns ordinary execution or Goa
78
78
 
79
79
  When CER starts, the Controller first shows a startup card and a roadmap. The tasks in the left sidebar are named with C / E1 / R, so you can tell which task coordinates, which one writes, and which one reviews in read-only mode. The inline roadmap in the main chat shows the current stage, confirmed context, and the next checkpoint.
80
80
 
81
- ![CER startup screen: startup card, inline roadmap, and sidebar C / E1 / R task names](https://raw.githubusercontent.com/Adamchanadam/cer-workflow/v0.3.17/assets/cer_start_screen_1.en.png)
81
+ ![CER startup screen: startup card, inline roadmap, and sidebar C / E1 / R task names](https://raw.githubusercontent.com/Adamchanadam/cer-workflow/v0.3.19/assets/cer_start_screen_1.en.png)
82
82
 
83
83
  ## Choose First
84
84
 
@@ -157,7 +157,7 @@ The Goal details above follow OpenAI's [Long-running work](https://learn.chatgpt
157
157
 
158
158
  ## CER Roles
159
159
 
160
- ![CER workflow diagram: Controller, Executor, and Reviewer handle coordination, file changes, and review](https://raw.githubusercontent.com/Adamchanadam/cer-workflow/v0.3.17/assets/cer-workflow-infographic.en.png)
160
+ ![CER workflow diagram: Controller, Executor, and Reviewer handle coordination, file changes, and review](https://raw.githubusercontent.com/Adamchanadam/cer-workflow/v0.3.19/assets/cer-workflow-infographic.en.png)
161
161
 
162
162
  **Controller (C): coordination and decisions**
163
163
 
@@ -183,7 +183,7 @@ Medium and large tasks sometimes need several kinds of preparation at once: find
183
183
 
184
184
  Exploration Helpers only produce candidate material. They do not modify the project, replace the Executor or Reviewer, or declare the work complete. The Controller decides whether to start them based on task size, source clarity, and whether parallel preparation is actually useful. The complete conditions live in the [complete Exploration Helper rules](skills/cer-workflow-en/references/parallel-producers.md#activation-eligibility).
185
185
 
186
- ![CER Exploration Helpers architecture: /CER-auto selects a route first; only CER Workflow or /CER-start enters C; C may start helpers by risk, E1 writes, and R reviews read-only only when needed](https://raw.githubusercontent.com/Adamchanadam/cer-workflow/v0.3.17/assets/cer-exploration-helper-architecture.en.png)
186
+ ![CER Exploration Helpers architecture: /CER-auto selects a route first; only CER Workflow or /CER-start enters C; C may start helpers by risk, E1 writes, and R reviews read-only only when needed](https://raw.githubusercontent.com/Adamchanadam/cer-workflow/v0.3.19/assets/cer-exploration-helper-architecture.en.png)
187
187
 
188
188
  ## Commands
189
189
 
@@ -220,7 +220,7 @@ When CER starts, it first confirms that the working tasks can return messages to
220
220
 
221
221
  This package is a distribution wrapper for the included Skill packages. Public runtime behavior remains owned by the Skill files and their references.
222
222
 
223
- Package version `0.3.18` matches the included CER Workflow Skill runtime VERSION files. npm support is an installability and onboarding layer for future users. It does not change CER runtime behavior. Validator, package, and install checks do not by themselves prove manual UAT pass, token saving, or universal task quality.
223
+ Package version `0.3.19` matches the included CER Workflow Skill runtime VERSION files. npm support is an installability and onboarding layer for future users. It does not change CER runtime behavior. Validator, package, and install checks do not by themselves prove manual UAT pass, token saving, or universal task quality.
224
224
 
225
225
  Packaged surfaces:
226
226
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adamchanadam/cer-workflow",
3
- "version": "0.3.18",
3
+ "version": "0.3.19",
4
4
  "description": "Installable npm package for the CER Workflow Codex skills.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +1 @@
1
- 0.3.18
1
+ 0.3.19
@@ -116,8 +116,10 @@ CER v1 接受自然語言和 slash command 兩種入口。slash command 是穩
116
116
  ## Controller preflight
117
117
 
118
118
  在建立本輪 E1、復用同輪既有 E1,或派任何實際 E1/R 批次前,C 先完成適應式任務契約。它不是表格儀式;簡單低風險且終點唯一的任務可只在內部完成並以短摘要直接工作。長期、多批,或新產品、流程、設計、內容、體驗型成果,C 維護一份活的任務簡報,並把必要答案濃縮進首次公開對齊的初始路線圖與自足派工。活的任務簡報不是新 workflow,也不建立固定項目文件;它只是 C 在本輪 CER 內用來承載目前已裁決任務狀態的工作面。
119
-
120
- C 只判斷五項,每項標成 `已確認`、`可安全推定``關鍵缺失`:
119
+
120
+ 通用任務前檢/層級對焦的唯一全域 owner 不在 CER Skill;本節只作 CER-specific mapping,不重定義該八項。C 將通用 `對準`/`失焦`/`受阻` 判斷映射到本節的 `已確認`、`可安全推定`、`關鍵缺失` 與 blocked 停點。複雜 ordinary/Goal/CER 工作法任務不得只因 route label 跳過必要層級對焦;簡單、單步、低風險且終點唯一的任務仍可內部通過,不強制顯示對焦卡。可見對焦卡、preflight、活的任務簡報或路線圖更新不計作成果進度、驗收證據或產品品質證明,也不改變 `/CER-auto` 四路線、不新增 CER role、schema、enum slash command。
121
+
122
+ C 只判斷五項,每項標成 `已確認`、`可安全推定` 或 `關鍵缺失`:
121
123
 
122
124
  - 終點:可觀察終點是甚麼,哪些明確不做。
123
125
  - 真源:完成判斷前必讀甚麼,已讀甚麼,仍有哪些關鍵未知。
@@ -297,6 +297,10 @@ numbering 規則生效前已開始且無法可靠回推原 cycle number。cycle
297
297
  - 非簡單正式實作批次在派工前,C 能逐項回答真源攝取四問:誰擁有、誰實際使用、如何生效、甚麼反例能推翻;答案只作 Controller preflight 與自足派工摘要,不建立第二個規則 owner。
298
298
  - C 答不到真源攝取四問任一項,或答案依賴未讀必要真源時,該完成條件是 `關鍵缺失`;C 不派正式實作批次,只做必要唯讀診斷、收窄驗收範圍或停問使用者。
299
299
  - 長期、多批、高風險或非簡單正式實作批次的正式派工包含短小 `pre_dispatch_evidence`,可讀回 `outcome_anchor` 指向、目標未完成條件、成功後成果差異、真源攝取四問摘要及來源錨點、必要真源已讀/缺失處置、工作線分類,以及 drift checkpoint 結論或未觸發理由;缺失時 E1/R 只回傳零寫入 `BATCH_BLOCKED_MISSING_PRE_DISPATCH_EVIDENCE`。
300
+ - 複雜 ordinary/Goal/CER 工作法任務不得只因 route label 跳過任務前檢/層級對焦;若需要可見對焦卡,它只讀並在正式計劃、寫入、派工或接納前呈現,不派批次。
301
+ - 簡單、單步、低風險且終點唯一的任務仍可內部快速通過,不強制顯示對焦卡或建立活的任務簡報。
302
+ - 對焦卡、preflight、活的任務簡報或路線圖更新不算成果進度、驗收證據或產品品質證明;技術 PASS 但沒有成果差異時,不能標為 `對準`。
303
+ - CER 對任務前檢只作本地映射;不得新增 slash command、role、schema 或 enum,也不得改寫 `/CER-auto` 四路線。
300
304
 
301
305
  ## Controller 長任務挑戰情景
302
306
 
@@ -452,6 +456,12 @@ numbering 規則生效前已開始且無法可靠回推原 cycle number。cycle
452
456
  - C 把真源攝取門檻擴成預設全文讀取、全 repo 審查、固定 Full Audit、第二份規則 owner 或固定表格流程。
453
457
  - 長期、多批、高風險或非簡單正式實作批次的派工包缺 `pre_dispatch_evidence`,或只寫「C 已判斷」但無可讀回摘要,E1/R 仍開始寫入、審閱或補完 C 的判斷。
454
458
  - 關鍵終點、權限或驗收缺失時,C 不停問而直接派工。
459
+ - 複雜 Goal 任務只因不是 full CER 而跳過任務前檢/層級對焦。
460
+ - ordinary 複雜任務被規則寫成永不需要對焦。
461
+ - 簡單低風險單步任務被強制顯示對焦卡。
462
+ - 對焦卡、preflight 或活的任務簡報被算作 progress、驗收或產品品質證據。
463
+ - 技術 PASS 但沒有成果差異時,對焦判定仍標為 `對準`。
464
+ - 對焦規則在 CER 內新增 slash command、role、schema 或 enum,或改寫 `/CER-auto` 四路線。
455
465
  - 長期多批任務未固定 `outcome_anchor`,或後續 E1/R 自行改寫最終成果、完成條件、替代成果或排除範圍。
456
466
  - 預期成果改善為零且不是必要條件的實作批次仍被派出。
457
467
  - 診斷、候選、審閱、格式通過、檔案一致、問題記錄、設計完成、改名或換版本被自動計作主線成果進度。
@@ -463,6 +463,41 @@ LIVING_BRIEF_FORBIDDEN = {
463
463
  "r_initial_prompt_only": "R 只按最初 prompt 驗收",
464
464
  }
465
465
 
466
+ TASK_PREFLIGHT_MAPPING_REQUIREMENTS = {
467
+ "global_owner_external": "通用任務前檢/層級對焦的唯一全域 owner 不在 CER Skill",
468
+ "cer_mapping_only": "本節只作 CER-specific mapping",
469
+ "no_redefine_eight": "不重定義該八項",
470
+ "route_label_not_skip": "複雜 ordinary/Goal/CER 工作法任務不得只因 route label 跳過必要層級對焦",
471
+ "simple_no_forced_card": "不強制顯示對焦卡",
472
+ "card_not_progress": "對焦卡、preflight、活的任務簡報或路線圖更新不計作成果進度",
473
+ "auto_routes_unchanged": "不改變 `/CER-auto` 四路線",
474
+ "no_new_surface": "不新增 CER role、schema、enum 或 slash command",
475
+ }
476
+
477
+ TASK_PREFLIGHT_UAT_REQUIREMENTS = {
478
+ "complex_routes_focus": "複雜 ordinary/Goal/CER 工作法任務不得只因 route label 跳過任務前檢/層級對焦",
479
+ "simple_internal": "簡單、單步、低風險且終點唯一的任務仍可內部快速通過",
480
+ "focus_not_quality": "對焦卡、preflight、活的任務簡報或路線圖更新不算成果進度、驗收證據或產品品質證明",
481
+ "technical_pass_not_aligned": "技術 PASS 但沒有成果差異時,不能標為 `對準`",
482
+ "cer_mapping_no_surface": "CER 對任務前檢只作本地映射",
483
+ "failure_complex_goal_skips": "複雜 Goal 任務只因不是 full CER 而跳過任務前檢/層級對焦",
484
+ "failure_ordinary_never_focus": "ordinary 複雜任務被規則寫成永不需要對焦",
485
+ "failure_simple_forced": "簡單低風險單步任務被強制顯示對焦卡",
486
+ "failure_focus_progress": "對焦卡、preflight 或活的任務簡報被算作 progress、驗收或產品品質證據",
487
+ "failure_technical_aligned": "技術 PASS 但沒有成果差異時,對焦判定仍標為 `對準`",
488
+ "failure_new_surface": "對焦規則在 CER 內新增 slash command、role、schema 或 enum",
489
+ }
490
+
491
+ TASK_PREFLIGHT_FORBIDDEN = {
492
+ "cer_owns_general": "CER Skill 是任務前檢八項的唯一 owner",
493
+ "focus_progress": "對焦卡本身可增加主線成果進度",
494
+ "focus_enum": "任務前檢新增 `focus_status` enum",
495
+ "focus_command": "`/CER-focus` 是 CER slash command",
496
+ "auto_fifth_route": "`/CER-auto` 因對焦改成第五路線",
497
+ "goal_never_focus": "Goal 路線永遠不需要層級對焦",
498
+ "simple_always_card": "低風險單步任務必須顯示對焦卡",
499
+ }
500
+
466
501
  OUTCOME_ANCHOR_REQUIREMENTS = (
467
502
  "不可由後續批次自行改寫的 `outcome_anchor`",
468
503
  "不可接受的替代成果",
@@ -1040,6 +1075,15 @@ def validate_texts(root: Path, texts: dict[str, str]) -> list[str]:
1040
1075
  for label, forbidden in LIVING_BRIEF_FORBIDDEN.items():
1041
1076
  if forbidden in core_normalized:
1042
1077
  findings.append(f"living-brief fixed contradiction present {label}")
1078
+ for label, required in TASK_PREFLIGHT_MAPPING_REQUIREMENTS.items():
1079
+ if required not in core_normalized:
1080
+ findings.append(f"task-preflight CER mapping missing {label}")
1081
+ for label, required in TASK_PREFLIGHT_UAT_REQUIREMENTS.items():
1082
+ if required not in uat:
1083
+ findings.append(f"uat.md missing task-preflight counterexample {label}")
1084
+ for label, forbidden in TASK_PREFLIGHT_FORBIDDEN.items():
1085
+ if forbidden in normalized_markdown:
1086
+ findings.append(f"task-preflight fixed contradiction present {label}")
1043
1087
  for label, forbidden in UNEXPECTED_FAILURE_FORBIDDEN.items():
1044
1088
  if forbidden in normalized_markdown:
1045
1089
  findings.append(f"unexpected-failure fixed contradiction present {label}")
@@ -1665,6 +1709,20 @@ def mutation_matrix(root: Path) -> tuple[int, list[str]]:
1665
1709
  mutated_fragment("references/uat.md", fragment),
1666
1710
  )
1667
1711
  )
1712
+ for label, fragment in TASK_PREFLIGHT_MAPPING_REQUIREMENTS.items():
1713
+ cases.append(
1714
+ (
1715
+ f"task_preflight_mapping_missing_{label}",
1716
+ mutated_fragment("references/core-runtime.md", fragment),
1717
+ )
1718
+ )
1719
+ for label, fragment in TASK_PREFLIGHT_UAT_REQUIREMENTS.items():
1720
+ cases.append(
1721
+ (
1722
+ f"task_preflight_uat_missing_{label}",
1723
+ mutated_fragment("references/uat.md", fragment),
1724
+ )
1725
+ )
1668
1726
  for label, fragment in TRUTH_SOURCE_INTAKE_UAT_REQUIREMENTS.items():
1669
1727
  cases.append(
1670
1728
  (
@@ -1765,6 +1823,17 @@ def mutation_matrix(root: Path) -> tuple[int, list[str]]:
1765
1823
  ),
1766
1824
  )
1767
1825
  )
1826
+ for label, contradiction in TASK_PREFLIGHT_FORBIDDEN.items():
1827
+ cases.append(
1828
+ (
1829
+ f"task_preflight_contradiction_{label}",
1830
+ mutated(
1831
+ "references/core-runtime.md",
1832
+ "## Controller preflight",
1833
+ f"## Controller preflight\n\n{contradiction}。",
1834
+ ),
1835
+ )
1836
+ )
1768
1837
  for label, contradiction in TRUTH_SOURCE_INTAKE_FORBIDDEN.items():
1769
1838
  cases.append(
1770
1839
  (
@@ -1 +1 @@
1
- 0.3.18
1
+ 0.3.19
@@ -115,8 +115,10 @@ Persist one short, non-authoritative route-transition checkpoint only when a tra
115
115
  ## Controller Preflight
116
116
 
117
117
  Before creating this cycle's E1, reusing the existing E1 in the same cycle, or dispatching any real E1/R batch, C completes an adaptive task contract. This is not a form-filling ceremony. For simple low-risk work with one clear endpoint, C may complete it internally and proceed with a short summary. For long-running, multi-batch, or new product, flow, design, content, or experience work, C maintains a living task brief and compresses the necessary answers into a first-public-alignment roadmap and self-contained dispatch. The living task brief is not a new workflow and does not create fixed project documents; it is only C's working surface for the currently adjudicated task state inside this CER cycle.
118
-
119
- C judges only five items, each marked `confirmed`, `safe inference`, or `critical missing`:
118
+
119
+ The sole general owner for task preflight / layer focus is not the CER Skill; this section is only the CER-specific mapping and must not redefine the eight items. C maps the user-facing `aligned` / `misaligned` / `blocked` judgment to this section's `confirmed`, `safe inference`, `critical missing`, and blocked checkpoints. Complex ordinary, Goal, and CER Workflow tasks must not skip needed layer focus merely because of their route label; simple one-step low-risk work with one clear endpoint may still pass internally and must not be forced to show a focus card. A visible focus card, preflight, living task brief, or roadmap update is not outcome progress, acceptance evidence, or product-quality proof, and it must not change the four `/CER-auto` routes or add a CER role, schema, enum, or slash command.
120
+
121
+ C judges only five items, each marked `confirmed`, `safe inference`, or `critical missing`:
120
122
 
121
123
  - Endpoint: what observable endpoint exists, and what is explicitly out of scope.
122
124
  - Sources: what must be read before completion can be judged, what has been read, and what key unknowns remain.
@@ -355,6 +355,10 @@ cycle label or guess a number.
355
355
  - Before a non-simple formal implementation batch, C can answer each truth-source intake question: who owns it, who actually uses it, how it takes effect, and what counterexample can disprove it. The answers are only a Controller preflight and self-contained-dispatch summary, not a second rule owner.
356
356
  - If C cannot answer any truth-source intake question, or if an answer depends on an unread required source, that completion condition is `critical missing`. C does not dispatch a formal implementation batch and only performs necessary read-only diagnosis, narrows the acceptance scope, or stops for user decision.
357
357
  - A formal packet for long-running, multi-batch, high-risk, or non-simple formal implementation work includes compact `pre_dispatch_evidence` that reads back the `outcome_anchor` pointer, target unfinished condition, expected outcome difference, truth-source intake four-question summary with source anchors, required-source read/unknown disposition, work-lane classification, and drift checkpoint conclusion or no-trigger reason; if it is missing, E1/R only returns a zero-write `BATCH_BLOCKED_MISSING_PRE_DISPATCH_EVIDENCE`.
358
+ - Complex ordinary, Goal, and CER Workflow tasks must not skip task preflight / layer focus merely because of their route label. When a visible focus card is needed, it is read-only and appears before formal planning, writing, dispatch, or acceptance; it does not dispatch a batch.
359
+ - Simple one-step low-risk work with one clear endpoint may still pass through a fast internal check and must not be forced to show a focus card or create a living task brief.
360
+ - A focus card, preflight, living task brief, or roadmap update is not outcome progress, acceptance evidence, or product-quality proof. When technical PASS has no outcome delta, the focus judgment cannot be `aligned`.
361
+ - CER only maps task preflight locally; it must not add a slash command, role, schema, or enum, and must not rewrite the four `/CER-auto` routes.
358
362
 
359
363
  ## Controller Long-Task Challenge Scenarios
360
364
 
@@ -533,6 +537,12 @@ These scenarios only test the unexpected-failure gate in
533
537
  - C expands the truth-source intake gate into default full-text ingestion, whole-repo review, fixed Full Audit, a second rule owner, or a fixed form workflow.
534
538
  - A long-running, multi-batch, high-risk, or non-simple formal implementation packet lacks `pre_dispatch_evidence`, or only says "C already judged" without readable support, and E1/R still writes, reviews, or fills in C's missing judgment.
535
539
  - C dispatches instead of stopping when critical endpoint, permission, or acceptance information is missing.
540
+ - A complex Goal task skips task preflight / layer focus only because it is not full CER.
541
+ - A complex ordinary task is written as never needing focus.
542
+ - A simple low-risk one-step task is forced to show a focus card.
543
+ - A focus card, preflight, or living task brief is counted as progress, acceptance, or product-quality evidence.
544
+ - Technical PASS has no outcome delta, but the focus judgment is still marked `aligned`.
545
+ - A focus rule inside CER adds a slash command, role, schema, or enum, or rewrites the four `/CER-auto` routes.
536
546
  - Long multi-batch work lacks `outcome_anchor`, or later E1/R rewrites the final outcome, completion conditions, substitute outcomes, or exclusions.
537
547
  - An implementation batch with zero expected outcome improvement and no necessary-prerequisite role is still dispatched.
538
548
  - Diagnostics, candidates, reviews, format pass, file consistency, logged issues, design completion, renaming, or version changes are automatically counted as mainline outcome progress.
@@ -463,6 +463,41 @@ LIVING_BRIEF_FORBIDDEN = {
463
463
  "r_initial_prompt_only": "R reviews only against the initial prompt",
464
464
  }
465
465
 
466
+ TASK_PREFLIGHT_MAPPING_REQUIREMENTS = {
467
+ "global_owner_external": "The sole general owner for task preflight / layer focus is not the CER Skill",
468
+ "cer_mapping_only": "this section is only the CER-specific mapping",
469
+ "no_redefine_eight": "must not redefine the eight items",
470
+ "route_label_not_skip": "Complex ordinary, Goal, and CER Workflow tasks must not skip needed layer focus merely because of their route label",
471
+ "simple_no_forced_card": "must not be forced to show a focus card",
472
+ "card_not_progress": "A visible focus card, preflight, living task brief, or roadmap update is not outcome progress",
473
+ "auto_routes_unchanged": "must not change the four `/CER-auto` routes",
474
+ "no_new_surface": "add a CER role, schema, enum, or slash command",
475
+ }
476
+
477
+ TASK_PREFLIGHT_UAT_REQUIREMENTS = {
478
+ "complex_routes_focus": "Complex ordinary, Goal, and CER Workflow tasks must not skip task preflight / layer focus merely because of their route label",
479
+ "simple_internal": "Simple one-step low-risk work with one clear endpoint may still pass through a fast internal check",
480
+ "focus_not_quality": "A focus card, preflight, living task brief, or roadmap update is not outcome progress, acceptance evidence, or product-quality proof",
481
+ "technical_pass_not_aligned": "When technical PASS has no outcome delta, the focus judgment cannot be `aligned`",
482
+ "cer_mapping_no_surface": "CER only maps task preflight locally",
483
+ "failure_complex_goal_skips": "A complex Goal task skips task preflight / layer focus only because it is not full CER",
484
+ "failure_ordinary_never_focus": "A complex ordinary task is written as never needing focus",
485
+ "failure_simple_forced": "A simple low-risk one-step task is forced to show a focus card",
486
+ "failure_focus_progress": "A focus card, preflight, or living task brief is counted as progress, acceptance, or product-quality evidence",
487
+ "failure_technical_aligned": "Technical PASS has no outcome delta, but the focus judgment is still marked `aligned`",
488
+ "failure_new_surface": "A focus rule inside CER adds a slash command, role, schema, or enum",
489
+ }
490
+
491
+ TASK_PREFLIGHT_FORBIDDEN = {
492
+ "cer_owns_general": "the CER Skill is the sole owner of the eight task-preflight items",
493
+ "focus_progress": "a focus card itself may increase mainline outcome progress",
494
+ "focus_enum": "task preflight adds a `focus_status` enum",
495
+ "focus_command": "`/CER-focus` is a CER slash command",
496
+ "auto_fifth_route": "`/CER-auto` adds a fifth route because of focus",
497
+ "goal_never_focus": "the Goal route never needs layer focus",
498
+ "simple_always_card": "low-risk one-step work must show a focus card",
499
+ }
500
+
466
501
  OUTCOME_ANCHOR_REQUIREMENTS = (
467
502
  "immutable `outcome_anchor`",
468
503
  "unacceptable substitute outcomes",
@@ -1042,6 +1077,15 @@ def validate_texts(root: Path, texts: dict[str, str]) -> list[str]:
1042
1077
  for label, forbidden in LIVING_BRIEF_FORBIDDEN.items():
1043
1078
  if forbidden in core_normalized:
1044
1079
  findings.append(f"living-brief fixed contradiction present {label}")
1080
+ for label, required in TASK_PREFLIGHT_MAPPING_REQUIREMENTS.items():
1081
+ if required not in core_normalized:
1082
+ findings.append(f"task-preflight CER mapping missing {label}")
1083
+ for label, required in TASK_PREFLIGHT_UAT_REQUIREMENTS.items():
1084
+ if required not in uat:
1085
+ findings.append(f"uat.md missing task-preflight counterexample {label}")
1086
+ for label, forbidden in TASK_PREFLIGHT_FORBIDDEN.items():
1087
+ if forbidden in normalized_markdown:
1088
+ findings.append(f"task-preflight fixed contradiction present {label}")
1045
1089
  for label, forbidden in UNEXPECTED_FAILURE_FORBIDDEN.items():
1046
1090
  if forbidden in normalized_markdown:
1047
1091
  findings.append(f"unexpected-failure fixed contradiction present {label}")
@@ -1667,6 +1711,20 @@ def mutation_matrix(root: Path) -> tuple[int, list[str]]:
1667
1711
  mutated_fragment("references/uat.md", fragment),
1668
1712
  )
1669
1713
  )
1714
+ for label, fragment in TASK_PREFLIGHT_MAPPING_REQUIREMENTS.items():
1715
+ cases.append(
1716
+ (
1717
+ f"task_preflight_mapping_missing_{label}",
1718
+ mutated_fragment("references/core-runtime.md", fragment),
1719
+ )
1720
+ )
1721
+ for label, fragment in TASK_PREFLIGHT_UAT_REQUIREMENTS.items():
1722
+ cases.append(
1723
+ (
1724
+ f"task_preflight_uat_missing_{label}",
1725
+ mutated_fragment("references/uat.md", fragment),
1726
+ )
1727
+ )
1670
1728
  for label, fragment in TRUTH_SOURCE_INTAKE_UAT_REQUIREMENTS.items():
1671
1729
  cases.append(
1672
1730
  (
@@ -1767,6 +1825,17 @@ def mutation_matrix(root: Path) -> tuple[int, list[str]]:
1767
1825
  ),
1768
1826
  )
1769
1827
  )
1828
+ for label, contradiction in TASK_PREFLIGHT_FORBIDDEN.items():
1829
+ cases.append(
1830
+ (
1831
+ f"task_preflight_contradiction_{label}",
1832
+ mutated(
1833
+ "references/core-runtime.md",
1834
+ "## Controller Preflight",
1835
+ f"## Controller Preflight\n\n{contradiction}.",
1836
+ ),
1837
+ )
1838
+ )
1770
1839
  for label, contradiction in TRUTH_SOURCE_INTAKE_FORBIDDEN.items():
1771
1840
  cases.append(
1772
1841
  (