@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 +6 -6
- package/package.json +1 -1
- package/skills/cer-workflow/VERSION +1 -1
- package/skills/cer-workflow/references/core-runtime.md +4 -2
- package/skills/cer-workflow/references/uat.md +10 -0
- package/skills/cer-workflow/scripts/validate_cer_skill.py +69 -0
- package/skills/cer-workflow-en/VERSION +1 -1
- package/skills/cer-workflow-en/references/core-runtime.md +4 -2
- package/skills/cer-workflow-en/references/uat.md +10 -0
- package/skills/cer-workflow-en/scripts/validate_cer_skill.py +69 -0
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.
|
|
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
|
-

|
|
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
|
-

|
|
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
|
-

|
|
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
|
-

|
|
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.
|
|
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 +1 @@
|
|
|
1
|
-
0.3.
|
|
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.
|
|
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
|
-
|
|
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
|
(
|