@mc-and-his-agents/loom-installer 0.1.10 → 0.1.12
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/package.json +1 -1
- package/payload/manifest.json +42 -42
- package/payload/plugin/loom/skills/shared/scripts/loom_check.py +147 -12
- package/payload/plugin/loom/skills/shared/scripts/loom_flow.py +284 -8
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py +147 -12
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py +284 -8
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py +147 -12
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py +284 -8
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_check.py +147 -12
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py +284 -8
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py +147 -12
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py +284 -8
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py +147 -12
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py +284 -8
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py +147 -12
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py +284 -8
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py +147 -12
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py +284 -8
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_check.py +147 -12
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py +284 -8
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py +147 -12
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py +284 -8
package/package.json
CHANGED
package/payload/manifest.json
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"schema_version": "loom-installer-payload/v1",
|
|
3
3
|
"loom_version": "0.4.0",
|
|
4
4
|
"source_repository": "https://github.com/MC-and-his-Agents/Loom",
|
|
5
|
-
"source_commit": "
|
|
5
|
+
"source_commit": "f11f0f24401eca30d21786c41e39a74be05bf342",
|
|
6
6
|
"source_ref": "main",
|
|
7
|
-
"built_at": "2026-04-
|
|
7
|
+
"built_at": "2026-04-25T11:57:32+08:00",
|
|
8
8
|
"runtime": {
|
|
9
9
|
"python_minimum": "3.10",
|
|
10
10
|
"python_recommended": "3.11+"
|
|
@@ -628,13 +628,13 @@
|
|
|
628
628
|
},
|
|
629
629
|
{
|
|
630
630
|
"path": "plugin/loom/skills/shared/scripts/loom_check.py",
|
|
631
|
-
"bytes":
|
|
632
|
-
"sha256": "
|
|
631
|
+
"bytes": 256345,
|
|
632
|
+
"sha256": "5a515322557bf66f21c37e138e3e0302be450842abdf5b42a5c9b94a62012b95"
|
|
633
633
|
},
|
|
634
634
|
{
|
|
635
635
|
"path": "plugin/loom/skills/shared/scripts/loom_flow.py",
|
|
636
|
-
"bytes":
|
|
637
|
-
"sha256": "
|
|
636
|
+
"bytes": 260571,
|
|
637
|
+
"sha256": "47c0437b00572be5cf84125fd5ccde1449afb41c93c493942e6c4c1dbf3462cb"
|
|
638
638
|
},
|
|
639
639
|
{
|
|
640
640
|
"path": "plugin/loom/skills/shared/scripts/loom_init.py",
|
|
@@ -1213,13 +1213,13 @@
|
|
|
1213
1213
|
},
|
|
1214
1214
|
{
|
|
1215
1215
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py",
|
|
1216
|
-
"bytes":
|
|
1217
|
-
"sha256": "
|
|
1216
|
+
"bytes": 256345,
|
|
1217
|
+
"sha256": "5a515322557bf66f21c37e138e3e0302be450842abdf5b42a5c9b94a62012b95"
|
|
1218
1218
|
},
|
|
1219
1219
|
{
|
|
1220
1220
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py",
|
|
1221
|
-
"bytes":
|
|
1222
|
-
"sha256": "
|
|
1221
|
+
"bytes": 260571,
|
|
1222
|
+
"sha256": "47c0437b00572be5cf84125fd5ccde1449afb41c93c493942e6c4c1dbf3462cb"
|
|
1223
1223
|
},
|
|
1224
1224
|
{
|
|
1225
1225
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -1828,13 +1828,13 @@
|
|
|
1828
1828
|
},
|
|
1829
1829
|
{
|
|
1830
1830
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py",
|
|
1831
|
-
"bytes":
|
|
1832
|
-
"sha256": "
|
|
1831
|
+
"bytes": 256345,
|
|
1832
|
+
"sha256": "5a515322557bf66f21c37e138e3e0302be450842abdf5b42a5c9b94a62012b95"
|
|
1833
1833
|
},
|
|
1834
1834
|
{
|
|
1835
1835
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py",
|
|
1836
|
-
"bytes":
|
|
1837
|
-
"sha256": "
|
|
1836
|
+
"bytes": 260571,
|
|
1837
|
+
"sha256": "47c0437b00572be5cf84125fd5ccde1449afb41c93c493942e6c4c1dbf3462cb"
|
|
1838
1838
|
},
|
|
1839
1839
|
{
|
|
1840
1840
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -2443,13 +2443,13 @@
|
|
|
2443
2443
|
},
|
|
2444
2444
|
{
|
|
2445
2445
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_check.py",
|
|
2446
|
-
"bytes":
|
|
2447
|
-
"sha256": "
|
|
2446
|
+
"bytes": 256345,
|
|
2447
|
+
"sha256": "5a515322557bf66f21c37e138e3e0302be450842abdf5b42a5c9b94a62012b95"
|
|
2448
2448
|
},
|
|
2449
2449
|
{
|
|
2450
2450
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py",
|
|
2451
|
-
"bytes":
|
|
2452
|
-
"sha256": "
|
|
2451
|
+
"bytes": 260571,
|
|
2452
|
+
"sha256": "47c0437b00572be5cf84125fd5ccde1449afb41c93c493942e6c4c1dbf3462cb"
|
|
2453
2453
|
},
|
|
2454
2454
|
{
|
|
2455
2455
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -3063,13 +3063,13 @@
|
|
|
3063
3063
|
},
|
|
3064
3064
|
{
|
|
3065
3065
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py",
|
|
3066
|
-
"bytes":
|
|
3067
|
-
"sha256": "
|
|
3066
|
+
"bytes": 256345,
|
|
3067
|
+
"sha256": "5a515322557bf66f21c37e138e3e0302be450842abdf5b42a5c9b94a62012b95"
|
|
3068
3068
|
},
|
|
3069
3069
|
{
|
|
3070
3070
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py",
|
|
3071
|
-
"bytes":
|
|
3072
|
-
"sha256": "
|
|
3071
|
+
"bytes": 260571,
|
|
3072
|
+
"sha256": "47c0437b00572be5cf84125fd5ccde1449afb41c93c493942e6c4c1dbf3462cb"
|
|
3073
3073
|
},
|
|
3074
3074
|
{
|
|
3075
3075
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -3678,13 +3678,13 @@
|
|
|
3678
3678
|
},
|
|
3679
3679
|
{
|
|
3680
3680
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
3681
|
-
"bytes":
|
|
3682
|
-
"sha256": "
|
|
3681
|
+
"bytes": 256345,
|
|
3682
|
+
"sha256": "5a515322557bf66f21c37e138e3e0302be450842abdf5b42a5c9b94a62012b95"
|
|
3683
3683
|
},
|
|
3684
3684
|
{
|
|
3685
3685
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
3686
|
-
"bytes":
|
|
3687
|
-
"sha256": "
|
|
3686
|
+
"bytes": 260571,
|
|
3687
|
+
"sha256": "47c0437b00572be5cf84125fd5ccde1449afb41c93c493942e6c4c1dbf3462cb"
|
|
3688
3688
|
},
|
|
3689
3689
|
{
|
|
3690
3690
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -4293,13 +4293,13 @@
|
|
|
4293
4293
|
},
|
|
4294
4294
|
{
|
|
4295
4295
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py",
|
|
4296
|
-
"bytes":
|
|
4297
|
-
"sha256": "
|
|
4296
|
+
"bytes": 256345,
|
|
4297
|
+
"sha256": "5a515322557bf66f21c37e138e3e0302be450842abdf5b42a5c9b94a62012b95"
|
|
4298
4298
|
},
|
|
4299
4299
|
{
|
|
4300
4300
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py",
|
|
4301
|
-
"bytes":
|
|
4302
|
-
"sha256": "
|
|
4301
|
+
"bytes": 260571,
|
|
4302
|
+
"sha256": "47c0437b00572be5cf84125fd5ccde1449afb41c93c493942e6c4c1dbf3462cb"
|
|
4303
4303
|
},
|
|
4304
4304
|
{
|
|
4305
4305
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -4908,13 +4908,13 @@
|
|
|
4908
4908
|
},
|
|
4909
4909
|
{
|
|
4910
4910
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py",
|
|
4911
|
-
"bytes":
|
|
4912
|
-
"sha256": "
|
|
4911
|
+
"bytes": 256345,
|
|
4912
|
+
"sha256": "5a515322557bf66f21c37e138e3e0302be450842abdf5b42a5c9b94a62012b95"
|
|
4913
4913
|
},
|
|
4914
4914
|
{
|
|
4915
4915
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py",
|
|
4916
|
-
"bytes":
|
|
4917
|
-
"sha256": "
|
|
4916
|
+
"bytes": 260571,
|
|
4917
|
+
"sha256": "47c0437b00572be5cf84125fd5ccde1449afb41c93c493942e6c4c1dbf3462cb"
|
|
4918
4918
|
},
|
|
4919
4919
|
{
|
|
4920
4920
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -5523,13 +5523,13 @@
|
|
|
5523
5523
|
},
|
|
5524
5524
|
{
|
|
5525
5525
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
5526
|
-
"bytes":
|
|
5527
|
-
"sha256": "
|
|
5526
|
+
"bytes": 256345,
|
|
5527
|
+
"sha256": "5a515322557bf66f21c37e138e3e0302be450842abdf5b42a5c9b94a62012b95"
|
|
5528
5528
|
},
|
|
5529
5529
|
{
|
|
5530
5530
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
5531
|
-
"bytes":
|
|
5532
|
-
"sha256": "
|
|
5531
|
+
"bytes": 260571,
|
|
5532
|
+
"sha256": "47c0437b00572be5cf84125fd5ccde1449afb41c93c493942e6c4c1dbf3462cb"
|
|
5533
5533
|
},
|
|
5534
5534
|
{
|
|
5535
5535
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -6138,13 +6138,13 @@
|
|
|
6138
6138
|
},
|
|
6139
6139
|
{
|
|
6140
6140
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
6141
|
-
"bytes":
|
|
6142
|
-
"sha256": "
|
|
6141
|
+
"bytes": 256345,
|
|
6142
|
+
"sha256": "5a515322557bf66f21c37e138e3e0302be450842abdf5b42a5c9b94a62012b95"
|
|
6143
6143
|
},
|
|
6144
6144
|
{
|
|
6145
6145
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
6146
|
-
"bytes":
|
|
6147
|
-
"sha256": "
|
|
6146
|
+
"bytes": 260571,
|
|
6147
|
+
"sha256": "47c0437b00572be5cf84125fd5ccde1449afb41c93c493942e6c4c1dbf3462cb"
|
|
6148
6148
|
},
|
|
6149
6149
|
{
|
|
6150
6150
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -92,6 +92,8 @@ CORE_DOCS = (
|
|
|
92
92
|
"docs/methodology/templates/pull-request.md",
|
|
93
93
|
"docs/evidence/extraction-ledger.md",
|
|
94
94
|
"docs/evidence/landing-map.md",
|
|
95
|
+
"docs/evidence/validations/validation-closeout-reconciliation-blocking-gate.md",
|
|
96
|
+
"docs/evidence/validations/validation-loom-core-runtime-parity.md",
|
|
95
97
|
"docs/evidence/validations/validation-syvert-strong-governance-parity.md",
|
|
96
98
|
"docs/adoption/rationale.md",
|
|
97
99
|
"docs/adoption/routing-and-checkpoints.md",
|
|
@@ -1117,10 +1119,14 @@ def require_reconciliation_payload(
|
|
|
1117
1119
|
if not isinstance(finding, dict):
|
|
1118
1120
|
failures.append(Failure(category, f"{context} reconciliation findings must be JSON objects"))
|
|
1119
1121
|
continue
|
|
1120
|
-
if finding.get("
|
|
1122
|
+
if finding.get("category") not in {"drift", "gate_failure"}:
|
|
1123
|
+
failures.append(Failure(category, f"{context} reconciliation finding category must stay within the stable taxonomy"))
|
|
1124
|
+
if finding.get("kind") not in {"merged_but_open", "absorbed_but_open", "parent_drift", "project_drift", "host_signal_drift"}:
|
|
1121
1125
|
failures.append(Failure(category, f"{context} reconciliation finding kind must stay within the stable contract"))
|
|
1122
1126
|
if finding.get("severity") not in {"warn", "fix-needed", "block"}:
|
|
1123
1127
|
failures.append(Failure(category, f"{context} reconciliation finding severity must stay within the stable contract"))
|
|
1128
|
+
if finding.get("fallback_to") not in {"reconciliation-sync", "manual-reconciliation", None}:
|
|
1129
|
+
failures.append(Failure(category, f"{context} reconciliation finding fallback_to must stay within the stable contract"))
|
|
1124
1130
|
if not isinstance(finding.get("subject"), str) or not finding.get("subject"):
|
|
1125
1131
|
failures.append(Failure(category, f"{context} reconciliation findings must include non-empty `subject`"))
|
|
1126
1132
|
if not isinstance(finding.get("evidence"), dict):
|
|
@@ -1162,6 +1168,68 @@ def require_closeout_reconciliation_contract(
|
|
|
1162
1168
|
failures.append(Failure(category, f"{context} must point blocked reconciliation drift to `manual-reconciliation`"))
|
|
1163
1169
|
|
|
1164
1170
|
|
|
1171
|
+
def require_runtime_parity_payload(
|
|
1172
|
+
failures: list[Failure],
|
|
1173
|
+
*,
|
|
1174
|
+
category: str,
|
|
1175
|
+
context: str,
|
|
1176
|
+
payload: object,
|
|
1177
|
+
) -> None:
|
|
1178
|
+
if not isinstance(payload, dict):
|
|
1179
|
+
failures.append(Failure(category, f"{context} must be an object"))
|
|
1180
|
+
return
|
|
1181
|
+
if payload.get("command") != "runtime-parity":
|
|
1182
|
+
failures.append(Failure(category, f"{context} must report `command: runtime-parity`"))
|
|
1183
|
+
if payload.get("operation") != "validate":
|
|
1184
|
+
failures.append(Failure(category, f"{context} must report `operation: validate`"))
|
|
1185
|
+
if payload.get("schema_version") != "loom-runtime-parity/v1":
|
|
1186
|
+
failures.append(Failure(category, f"{context} schema_version must be `loom-runtime-parity/v1`"))
|
|
1187
|
+
if payload.get("result") not in {"pass", "block"}:
|
|
1188
|
+
failures.append(Failure(category, f"{context} result must be `pass` or `block`"))
|
|
1189
|
+
if not isinstance(payload.get("summary"), str) or not payload.get("summary"):
|
|
1190
|
+
failures.append(Failure(category, f"{context} must include a non-empty `summary`"))
|
|
1191
|
+
if not isinstance(payload.get("missing_inputs"), list):
|
|
1192
|
+
failures.append(Failure(category, f"{context} must include `missing_inputs`"))
|
|
1193
|
+
if payload.get("fallback_to") not in {None, "admission", "merge", "reconciliation-sync", "manual-runtime-reconciliation", "rebootstrap-runtime", "refresh-install", "loom-init"}:
|
|
1194
|
+
failures.append(Failure(category, f"{context} fallback_to must stay within the stable runtime parity contract"))
|
|
1195
|
+
require_runtime_state_payload(
|
|
1196
|
+
failures,
|
|
1197
|
+
category=category,
|
|
1198
|
+
context=context,
|
|
1199
|
+
payload=payload.get("runtime_state"),
|
|
1200
|
+
expected_scene="repo-local-demo",
|
|
1201
|
+
expected_carrier="repo-local-wrapper",
|
|
1202
|
+
allowed_results={"pass"},
|
|
1203
|
+
)
|
|
1204
|
+
checks = payload.get("checks")
|
|
1205
|
+
if not isinstance(checks, list):
|
|
1206
|
+
failures.append(Failure(category, f"{context} must include `checks` as a list"))
|
|
1207
|
+
return
|
|
1208
|
+
required_checks = {
|
|
1209
|
+
"work_item",
|
|
1210
|
+
"status_control_plane",
|
|
1211
|
+
"gate_chain",
|
|
1212
|
+
"controlled_merge_contract",
|
|
1213
|
+
"closeout_reconciliation",
|
|
1214
|
+
"shadow_parity_boundary",
|
|
1215
|
+
}
|
|
1216
|
+
check_names = {check.get("name") for check in checks if isinstance(check, dict)}
|
|
1217
|
+
if not required_checks.issubset(check_names):
|
|
1218
|
+
failures.append(Failure(category, f"{context} must cover the stable runtime parity check set"))
|
|
1219
|
+
for check in checks:
|
|
1220
|
+
if not isinstance(check, dict):
|
|
1221
|
+
failures.append(Failure(category, f"{context} checks must be JSON objects"))
|
|
1222
|
+
continue
|
|
1223
|
+
if check.get("result") not in {"pass", "block"}:
|
|
1224
|
+
failures.append(Failure(category, f"{context} check `{check.get('name')}` result must be `pass` or `block`"))
|
|
1225
|
+
if not isinstance(check.get("summary"), str) or not check.get("summary"):
|
|
1226
|
+
failures.append(Failure(category, f"{context} check `{check.get('name')}` must include non-empty `summary`"))
|
|
1227
|
+
if not isinstance(check.get("missing_inputs"), list):
|
|
1228
|
+
failures.append(Failure(category, f"{context} check `{check.get('name')}` must include `missing_inputs`"))
|
|
1229
|
+
if not isinstance(check.get("evidence"), dict):
|
|
1230
|
+
failures.append(Failure(category, f"{context} check `{check.get('name')}` must include `evidence`"))
|
|
1231
|
+
|
|
1232
|
+
|
|
1165
1233
|
def require_review_record_contract(
|
|
1166
1234
|
failures: list[Failure],
|
|
1167
1235
|
*,
|
|
@@ -2124,6 +2192,20 @@ def check_daily_execution_cli(root: Path) -> list[Failure]:
|
|
|
2124
2192
|
["python3", "tools/loom_status.py", "--target", "examples/new-project", "--item", "INIT-0001"],
|
|
2125
2193
|
{"pass", "block"},
|
|
2126
2194
|
),
|
|
2195
|
+
(
|
|
2196
|
+
"runtime-parity",
|
|
2197
|
+
[
|
|
2198
|
+
"python3",
|
|
2199
|
+
"tools/loom_flow.py",
|
|
2200
|
+
"runtime-parity",
|
|
2201
|
+
"validate",
|
|
2202
|
+
"--target",
|
|
2203
|
+
"examples/new-project",
|
|
2204
|
+
"--item",
|
|
2205
|
+
"INIT-0001",
|
|
2206
|
+
],
|
|
2207
|
+
{"pass"},
|
|
2208
|
+
),
|
|
2127
2209
|
(
|
|
2128
2210
|
"governance-profile-status",
|
|
2129
2211
|
["python3", "tools/loom_flow.py", "governance-profile", "status", "--target", "examples/new-project"],
|
|
@@ -2361,6 +2443,13 @@ def check_daily_execution_cli(root: Path) -> list[Failure]:
|
|
|
2361
2443
|
context="`loom_status`",
|
|
2362
2444
|
payload=payload,
|
|
2363
2445
|
)
|
|
2446
|
+
if label == "runtime-parity":
|
|
2447
|
+
require_runtime_parity_payload(
|
|
2448
|
+
failures,
|
|
2449
|
+
category="daily-execution-cli",
|
|
2450
|
+
context="`runtime-parity validate`",
|
|
2451
|
+
payload=payload,
|
|
2452
|
+
)
|
|
2364
2453
|
if label in {"governance-profile-status", "governance-profile-upgrade-plan"}:
|
|
2365
2454
|
if payload.get("command") != "governance-profile":
|
|
2366
2455
|
failures.append(Failure("daily-execution-cli", f"`{label}` must report `command: governance-profile`"))
|
|
@@ -4608,18 +4697,20 @@ def check_daily_execution_cli(root: Path) -> list[Failure]:
|
|
|
4608
4697
|
"summary": "warn",
|
|
4609
4698
|
"missing_inputs": [],
|
|
4610
4699
|
"fallback_to": "manual-reconciliation",
|
|
4611
|
-
|
|
4612
|
-
|
|
4613
|
-
|
|
4614
|
-
|
|
4615
|
-
|
|
4616
|
-
|
|
4617
|
-
|
|
4618
|
-
|
|
4619
|
-
|
|
4700
|
+
"findings": [
|
|
4701
|
+
{
|
|
4702
|
+
"category": "drift",
|
|
4703
|
+
"kind": "project_drift",
|
|
4704
|
+
"severity": "warn",
|
|
4705
|
+
"subject": "project 5",
|
|
4706
|
+
"evidence": {},
|
|
4707
|
+
"recommended_action": "review warning",
|
|
4708
|
+
"fallback_to": "reconciliation-sync",
|
|
4709
|
+
}
|
|
4710
|
+
],
|
|
4711
|
+
},
|
|
4620
4712
|
},
|
|
4621
|
-
|
|
4622
|
-
)
|
|
4713
|
+
)
|
|
4623
4714
|
if warn_payload_failures:
|
|
4624
4715
|
failures.append(
|
|
4625
4716
|
Failure(
|
|
@@ -4628,6 +4719,50 @@ def check_daily_execution_cli(root: Path) -> list[Failure]:
|
|
|
4628
4719
|
)
|
|
4629
4720
|
)
|
|
4630
4721
|
|
|
4722
|
+
valid_reconciliation_samples = [
|
|
4723
|
+
("merged_but_open", "fix-needed", "reconciliation-sync"),
|
|
4724
|
+
("absorbed_but_open", "fix-needed", "reconciliation-sync"),
|
|
4725
|
+
("parent_drift", "block", "manual-reconciliation"),
|
|
4726
|
+
("host_signal_drift", "block", "manual-reconciliation"),
|
|
4727
|
+
]
|
|
4728
|
+
for kind, reconciliation_result_value, fallback_to in valid_reconciliation_samples:
|
|
4729
|
+
sample_failures = []
|
|
4730
|
+
require_closeout_reconciliation_contract(
|
|
4731
|
+
sample_failures,
|
|
4732
|
+
category="daily-execution-cli",
|
|
4733
|
+
context=f"`closeout-{kind}`",
|
|
4734
|
+
payload={
|
|
4735
|
+
"result": "block",
|
|
4736
|
+
"fallback_to": fallback_to,
|
|
4737
|
+
"reconciliation": {
|
|
4738
|
+
"command": "reconciliation",
|
|
4739
|
+
"operation": "audit",
|
|
4740
|
+
"result": reconciliation_result_value,
|
|
4741
|
+
"summary": kind,
|
|
4742
|
+
"missing_inputs": [] if kind != "host_signal_drift" else ["github control plane"],
|
|
4743
|
+
"fallback_to": "manual-reconciliation",
|
|
4744
|
+
"findings": [
|
|
4745
|
+
{
|
|
4746
|
+
"category": "drift",
|
|
4747
|
+
"kind": kind,
|
|
4748
|
+
"severity": reconciliation_result_value,
|
|
4749
|
+
"subject": "closeout sample",
|
|
4750
|
+
"evidence": {},
|
|
4751
|
+
"recommended_action": "reconcile closeout sample",
|
|
4752
|
+
"fallback_to": fallback_to,
|
|
4753
|
+
}
|
|
4754
|
+
],
|
|
4755
|
+
},
|
|
4756
|
+
},
|
|
4757
|
+
)
|
|
4758
|
+
if sample_failures:
|
|
4759
|
+
failures.append(
|
|
4760
|
+
Failure(
|
|
4761
|
+
"daily-execution-cli",
|
|
4762
|
+
f"`closeout-{kind}` synthetic payload must satisfy closeout reconciliation validation",
|
|
4763
|
+
)
|
|
4764
|
+
)
|
|
4765
|
+
|
|
4631
4766
|
return failures
|
|
4632
4767
|
|
|
4633
4768
|
|