@mc-and-his-agents/loom-installer 0.1.69 → 0.1.70

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.
Files changed (21) hide show
  1. package/package.json +1 -1
  2. package/payload/manifest.json +41 -41
  3. package/payload/plugin/loom/skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py +30 -1
  4. package/payload/plugin/loom/skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py +30 -1
  5. package/payload/plugin/loom/skills/loom-init/.loom-runtime/shared/scripts/loom_check.py +30 -1
  6. package/payload/plugin/loom/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py +30 -1
  7. package/payload/plugin/loom/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py +30 -1
  8. package/payload/plugin/loom/skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py +30 -1
  9. package/payload/plugin/loom/skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py +30 -1
  10. package/payload/plugin/loom/skills/loom-review/.loom-runtime/shared/scripts/loom_check.py +30 -1
  11. package/payload/plugin/loom/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py +30 -1
  12. package/payload/plugin/loom/skills/shared/scripts/loom_check.py +30 -1
  13. package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py +30 -1
  14. package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py +30 -1
  15. package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_check.py +30 -1
  16. package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py +30 -1
  17. package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py +30 -1
  18. package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py +30 -1
  19. package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py +30 -1
  20. package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_check.py +30 -1
  21. package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py +30 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mc-and-his-agents/loom-installer",
3
- "version": "0.1.69",
3
+ "version": "0.1.70",
4
4
  "description": "Node installer for Loom plugin and single-skill installation surfaces.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -2,12 +2,12 @@
2
2
  "schema_version": "loom-installer-payload/v1",
3
3
  "loom_version": "v0.6.0",
4
4
  "source_repository": "https://github.com/MC-and-his-Agents/Loom",
5
- "source_commit": "e87b612a3057dda9b5890f10e04213ac12278ba8",
5
+ "source_commit": "f994dbb1dc014aa2899bb06b9890d2bb94fb2968",
6
6
  "source_ref": "main",
7
- "built_at": "2026-05-08T11:20:18+08:00",
7
+ "built_at": "2026-05-08T13:38:25+08:00",
8
8
  "version_context": {
9
9
  "repo_version": "v0.6.0",
10
- "installer_package_version": "0.1.69",
10
+ "installer_package_version": "0.1.70",
11
11
  "plugin_surface_version": "0.4.0",
12
12
  "host_adapter_version": "1.0.0",
13
13
  "skills_registry_version": "1.4.0",
@@ -742,8 +742,8 @@
742
742
  },
743
743
  {
744
744
  "path": "plugin/loom/skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py",
745
- "bytes": 454593,
746
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
745
+ "bytes": 455757,
746
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
747
747
  },
748
748
  {
749
749
  "path": "plugin/loom/skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py",
@@ -1412,8 +1412,8 @@
1412
1412
  },
1413
1413
  {
1414
1414
  "path": "plugin/loom/skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py",
1415
- "bytes": 454593,
1416
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
1415
+ "bytes": 455757,
1416
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
1417
1417
  },
1418
1418
  {
1419
1419
  "path": "plugin/loom/skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py",
@@ -2082,8 +2082,8 @@
2082
2082
  },
2083
2083
  {
2084
2084
  "path": "plugin/loom/skills/loom-init/.loom-runtime/shared/scripts/loom_check.py",
2085
- "bytes": 454593,
2086
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
2085
+ "bytes": 455757,
2086
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
2087
2087
  },
2088
2088
  {
2089
2089
  "path": "plugin/loom/skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py",
@@ -2757,8 +2757,8 @@
2757
2757
  },
2758
2758
  {
2759
2759
  "path": "plugin/loom/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py",
2760
- "bytes": 454593,
2761
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
2760
+ "bytes": 455757,
2761
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
2762
2762
  },
2763
2763
  {
2764
2764
  "path": "plugin/loom/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py",
@@ -3427,8 +3427,8 @@
3427
3427
  },
3428
3428
  {
3429
3429
  "path": "plugin/loom/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py",
3430
- "bytes": 454593,
3431
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
3430
+ "bytes": 455757,
3431
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
3432
3432
  },
3433
3433
  {
3434
3434
  "path": "plugin/loom/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py",
@@ -4097,8 +4097,8 @@
4097
4097
  },
4098
4098
  {
4099
4099
  "path": "plugin/loom/skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py",
4100
- "bytes": 454593,
4101
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
4100
+ "bytes": 455757,
4101
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
4102
4102
  },
4103
4103
  {
4104
4104
  "path": "plugin/loom/skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py",
@@ -4767,8 +4767,8 @@
4767
4767
  },
4768
4768
  {
4769
4769
  "path": "plugin/loom/skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py",
4770
- "bytes": 454593,
4771
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
4770
+ "bytes": 455757,
4771
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
4772
4772
  },
4773
4773
  {
4774
4774
  "path": "plugin/loom/skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py",
@@ -5437,8 +5437,8 @@
5437
5437
  },
5438
5438
  {
5439
5439
  "path": "plugin/loom/skills/loom-review/.loom-runtime/shared/scripts/loom_check.py",
5440
- "bytes": 454593,
5441
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
5440
+ "bytes": 455757,
5441
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
5442
5442
  },
5443
5443
  {
5444
5444
  "path": "plugin/loom/skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py",
@@ -6107,8 +6107,8 @@
6107
6107
  },
6108
6108
  {
6109
6109
  "path": "plugin/loom/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py",
6110
- "bytes": 454593,
6111
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
6110
+ "bytes": 455757,
6111
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
6112
6112
  },
6113
6113
  {
6114
6114
  "path": "plugin/loom/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py",
@@ -6492,8 +6492,8 @@
6492
6492
  },
6493
6493
  {
6494
6494
  "path": "plugin/loom/skills/shared/scripts/loom_check.py",
6495
- "bytes": 454593,
6496
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
6495
+ "bytes": 455757,
6496
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
6497
6497
  },
6498
6498
  {
6499
6499
  "path": "plugin/loom/skills/shared/scripts/loom_flow.py",
@@ -7127,8 +7127,8 @@
7127
7127
  },
7128
7128
  {
7129
7129
  "path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py",
7130
- "bytes": 454593,
7131
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
7130
+ "bytes": 455757,
7131
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
7132
7132
  },
7133
7133
  {
7134
7134
  "path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py",
@@ -7797,8 +7797,8 @@
7797
7797
  },
7798
7798
  {
7799
7799
  "path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py",
7800
- "bytes": 454593,
7801
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
7800
+ "bytes": 455757,
7801
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
7802
7802
  },
7803
7803
  {
7804
7804
  "path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py",
@@ -8467,8 +8467,8 @@
8467
8467
  },
8468
8468
  {
8469
8469
  "path": "skills/loom-init/.loom-runtime/shared/scripts/loom_check.py",
8470
- "bytes": 454593,
8471
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
8470
+ "bytes": 455757,
8471
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
8472
8472
  },
8473
8473
  {
8474
8474
  "path": "skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py",
@@ -9142,8 +9142,8 @@
9142
9142
  },
9143
9143
  {
9144
9144
  "path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py",
9145
- "bytes": 454593,
9146
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
9145
+ "bytes": 455757,
9146
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
9147
9147
  },
9148
9148
  {
9149
9149
  "path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py",
@@ -9812,8 +9812,8 @@
9812
9812
  },
9813
9813
  {
9814
9814
  "path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py",
9815
- "bytes": 454593,
9816
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
9815
+ "bytes": 455757,
9816
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
9817
9817
  },
9818
9818
  {
9819
9819
  "path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py",
@@ -10482,8 +10482,8 @@
10482
10482
  },
10483
10483
  {
10484
10484
  "path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py",
10485
- "bytes": 454593,
10486
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
10485
+ "bytes": 455757,
10486
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
10487
10487
  },
10488
10488
  {
10489
10489
  "path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py",
@@ -11152,8 +11152,8 @@
11152
11152
  },
11153
11153
  {
11154
11154
  "path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py",
11155
- "bytes": 454593,
11156
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
11155
+ "bytes": 455757,
11156
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
11157
11157
  },
11158
11158
  {
11159
11159
  "path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py",
@@ -11822,8 +11822,8 @@
11822
11822
  },
11823
11823
  {
11824
11824
  "path": "skills/loom-review/.loom-runtime/shared/scripts/loom_check.py",
11825
- "bytes": 454593,
11826
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
11825
+ "bytes": 455757,
11826
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
11827
11827
  },
11828
11828
  {
11829
11829
  "path": "skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py",
@@ -12492,8 +12492,8 @@
12492
12492
  },
12493
12493
  {
12494
12494
  "path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py",
12495
- "bytes": 454593,
12496
- "sha256": "0f8b937e6725f233882ab26441c2d8c8d76abfd2c48fc0f758d50287d7bbfb90"
12495
+ "bytes": 455757,
12496
+ "sha256": "dce8bac53c736f890be83eb3bd4f6e4a0ace1fd5f816b0333516596ca7d64a4d"
12497
12497
  },
12498
12498
  {
12499
12499
  "path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py",
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")
@@ -9065,6 +9065,34 @@ def check_operating_layer_contract(root: Path) -> list[Failure]:
9065
9065
  return failures
9066
9066
 
9067
9067
 
9068
+ def check_orchestration_conformance_profiles(root: Path) -> list[Failure]:
9069
+ failures: list[Failure] = []
9070
+ required_anchors = {
9071
+ "docs/evidence/orchestration-conformance-profiles.md": [
9072
+ "orchestration-core",
9073
+ "orchestration-extension",
9074
+ "orchestration-live",
9075
+ "non-blocking by default",
9076
+ "不得替代 governance maturity profile",
9077
+ "Core 缺口必须 fail closed",
9078
+ "Extension 缺口不得污染 `orchestration-core` pass/fail",
9079
+ "explicit skip / unavailable evidence",
9080
+ ],
9081
+ }
9082
+ for relative, anchors in required_anchors.items():
9083
+ path = root / relative
9084
+ try:
9085
+ text = path.read_text(encoding="utf-8")
9086
+ except OSError as exc:
9087
+ failures.append(Failure("orchestration-conformance", f"`{relative}` is unreadable: {exc}"))
9088
+ continue
9089
+ for anchor in anchors:
9090
+ if anchor not in text:
9091
+ failures.append(Failure("orchestration-conformance", f"`{relative}` must mention `{anchor}`"))
9092
+
9093
+ return failures
9094
+
9095
+
9068
9096
  def is_within(path: Path, root: Path) -> bool:
9069
9097
  try:
9070
9098
  path.relative_to(root)
@@ -9109,12 +9137,13 @@ def collect_failures(root: Path) -> list[Failure]:
9109
9137
  failures.extend(check_generated_artifacts_untracked(root))
9110
9138
  failures.extend(check_github_cli_budget(root))
9111
9139
  failures.extend(check_operating_layer_contract(root))
9140
+ failures.extend(check_orchestration_conformance_profiles(root))
9112
9141
  failures.extend(check_markdown_links(root))
9113
9142
  return failures
9114
9143
 
9115
9144
 
9116
9145
  def print_report(root: Path, failures: list[Failure]) -> None:
9117
- categories_checked = 23
9146
+ categories_checked = 24
9118
9147
  if not failures:
9119
9148
  print(f"loom_check: OK ({root})")
9120
9149
  print(f"checked {categories_checked} surfaces")