@mc-and-his-agents/loom-installer 0.1.60 → 0.1.61
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 +62 -62
- package/payload/plugin/loom/skills/shared/references/governance/governance-maturity-model.md +6 -0
- package/payload/plugin/loom/skills/shared/scripts/governance_surface.py +83 -5
- package/payload/plugin/loom/skills/shared/scripts/loom_check.py +52 -3
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/governance/governance-maturity-model.md +6 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py +83 -5
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py +52 -3
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/governance/governance-maturity-model.md +6 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py +83 -5
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py +52 -3
- package/payload/skills/loom-init/.loom-runtime/shared/references/governance/governance-maturity-model.md +6 -0
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py +83 -5
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_check.py +52 -3
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/governance/governance-maturity-model.md +6 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py +83 -5
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py +52 -3
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/governance/governance-maturity-model.md +6 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py +83 -5
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py +52 -3
- package/payload/skills/loom-resume/.loom-runtime/shared/references/governance/governance-maturity-model.md +6 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py +83 -5
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py +52 -3
- package/payload/skills/loom-retire/.loom-runtime/shared/references/governance/governance-maturity-model.md +6 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py +83 -5
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py +52 -3
- package/payload/skills/loom-review/.loom-runtime/shared/references/governance/governance-maturity-model.md +6 -0
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py +83 -5
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_check.py +52 -3
- package/payload/skills/loom-spec-review/.loom-runtime/shared/references/governance/governance-maturity-model.md +6 -0
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/governance_surface.py +83 -5
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py +52 -3
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": "b7afde5914867bdf89382b13da60d769ed5ae225",
|
|
6
6
|
"source_ref": "main",
|
|
7
|
-
"built_at": "2026-04-29T19:
|
|
7
|
+
"built_at": "2026-04-29T19:51:34+08:00",
|
|
8
8
|
"runtime": {
|
|
9
9
|
"python_minimum": "3.10",
|
|
10
10
|
"python_recommended": "3.11+"
|
|
@@ -453,8 +453,8 @@
|
|
|
453
453
|
},
|
|
454
454
|
{
|
|
455
455
|
"path": "plugin/loom/skills/shared/references/governance/governance-maturity-model.md",
|
|
456
|
-
"bytes":
|
|
457
|
-
"sha256": "
|
|
456
|
+
"bytes": 3466,
|
|
457
|
+
"sha256": "12aaf2f6d52e7dbe049b8a6252ea909fae48f7321e9f6ce0fbbbfb0313915e2b"
|
|
458
458
|
},
|
|
459
459
|
{
|
|
460
460
|
"path": "plugin/loom/skills/shared/references/governance/host-object-taxonomy.md",
|
|
@@ -653,13 +653,13 @@
|
|
|
653
653
|
},
|
|
654
654
|
{
|
|
655
655
|
"path": "plugin/loom/skills/shared/scripts/governance_surface.py",
|
|
656
|
-
"bytes":
|
|
657
|
-
"sha256": "
|
|
656
|
+
"bytes": 79591,
|
|
657
|
+
"sha256": "85039f034e25144fa2ba5fedaf6fbac1367a726ece9a77580bbf18bcbf97b996"
|
|
658
658
|
},
|
|
659
659
|
{
|
|
660
660
|
"path": "plugin/loom/skills/shared/scripts/loom_check.py",
|
|
661
|
-
"bytes":
|
|
662
|
-
"sha256": "
|
|
661
|
+
"bytes": 420225,
|
|
662
|
+
"sha256": "e0d0178b76619a82a6d616db872a57efaea90e635bfe0883ef318e42e937232c"
|
|
663
663
|
},
|
|
664
664
|
{
|
|
665
665
|
"path": "plugin/loom/skills/shared/scripts/loom_flow.py",
|
|
@@ -1068,8 +1068,8 @@
|
|
|
1068
1068
|
},
|
|
1069
1069
|
{
|
|
1070
1070
|
"path": "skills/loom-adopt/.loom-runtime/shared/references/governance/governance-maturity-model.md",
|
|
1071
|
-
"bytes":
|
|
1072
|
-
"sha256": "
|
|
1071
|
+
"bytes": 3466,
|
|
1072
|
+
"sha256": "12aaf2f6d52e7dbe049b8a6252ea909fae48f7321e9f6ce0fbbbfb0313915e2b"
|
|
1073
1073
|
},
|
|
1074
1074
|
{
|
|
1075
1075
|
"path": "skills/loom-adopt/.loom-runtime/shared/references/governance/host-object-taxonomy.md",
|
|
@@ -1268,13 +1268,13 @@
|
|
|
1268
1268
|
},
|
|
1269
1269
|
{
|
|
1270
1270
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py",
|
|
1271
|
-
"bytes":
|
|
1272
|
-
"sha256": "
|
|
1271
|
+
"bytes": 79591,
|
|
1272
|
+
"sha256": "85039f034e25144fa2ba5fedaf6fbac1367a726ece9a77580bbf18bcbf97b996"
|
|
1273
1273
|
},
|
|
1274
1274
|
{
|
|
1275
1275
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py",
|
|
1276
|
-
"bytes":
|
|
1277
|
-
"sha256": "
|
|
1276
|
+
"bytes": 420225,
|
|
1277
|
+
"sha256": "e0d0178b76619a82a6d616db872a57efaea90e635bfe0883ef318e42e937232c"
|
|
1278
1278
|
},
|
|
1279
1279
|
{
|
|
1280
1280
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py",
|
|
@@ -1713,8 +1713,8 @@
|
|
|
1713
1713
|
},
|
|
1714
1714
|
{
|
|
1715
1715
|
"path": "skills/loom-handoff/.loom-runtime/shared/references/governance/governance-maturity-model.md",
|
|
1716
|
-
"bytes":
|
|
1717
|
-
"sha256": "
|
|
1716
|
+
"bytes": 3466,
|
|
1717
|
+
"sha256": "12aaf2f6d52e7dbe049b8a6252ea909fae48f7321e9f6ce0fbbbfb0313915e2b"
|
|
1718
1718
|
},
|
|
1719
1719
|
{
|
|
1720
1720
|
"path": "skills/loom-handoff/.loom-runtime/shared/references/governance/host-object-taxonomy.md",
|
|
@@ -1913,13 +1913,13 @@
|
|
|
1913
1913
|
},
|
|
1914
1914
|
{
|
|
1915
1915
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py",
|
|
1916
|
-
"bytes":
|
|
1917
|
-
"sha256": "
|
|
1916
|
+
"bytes": 79591,
|
|
1917
|
+
"sha256": "85039f034e25144fa2ba5fedaf6fbac1367a726ece9a77580bbf18bcbf97b996"
|
|
1918
1918
|
},
|
|
1919
1919
|
{
|
|
1920
1920
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py",
|
|
1921
|
-
"bytes":
|
|
1922
|
-
"sha256": "
|
|
1921
|
+
"bytes": 420225,
|
|
1922
|
+
"sha256": "e0d0178b76619a82a6d616db872a57efaea90e635bfe0883ef318e42e937232c"
|
|
1923
1923
|
},
|
|
1924
1924
|
{
|
|
1925
1925
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py",
|
|
@@ -2358,8 +2358,8 @@
|
|
|
2358
2358
|
},
|
|
2359
2359
|
{
|
|
2360
2360
|
"path": "skills/loom-init/.loom-runtime/shared/references/governance/governance-maturity-model.md",
|
|
2361
|
-
"bytes":
|
|
2362
|
-
"sha256": "
|
|
2361
|
+
"bytes": 3466,
|
|
2362
|
+
"sha256": "12aaf2f6d52e7dbe049b8a6252ea909fae48f7321e9f6ce0fbbbfb0313915e2b"
|
|
2363
2363
|
},
|
|
2364
2364
|
{
|
|
2365
2365
|
"path": "skills/loom-init/.loom-runtime/shared/references/governance/host-object-taxonomy.md",
|
|
@@ -2558,13 +2558,13 @@
|
|
|
2558
2558
|
},
|
|
2559
2559
|
{
|
|
2560
2560
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py",
|
|
2561
|
-
"bytes":
|
|
2562
|
-
"sha256": "
|
|
2561
|
+
"bytes": 79591,
|
|
2562
|
+
"sha256": "85039f034e25144fa2ba5fedaf6fbac1367a726ece9a77580bbf18bcbf97b996"
|
|
2563
2563
|
},
|
|
2564
2564
|
{
|
|
2565
2565
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_check.py",
|
|
2566
|
-
"bytes":
|
|
2567
|
-
"sha256": "
|
|
2566
|
+
"bytes": 420225,
|
|
2567
|
+
"sha256": "e0d0178b76619a82a6d616db872a57efaea90e635bfe0883ef318e42e937232c"
|
|
2568
2568
|
},
|
|
2569
2569
|
{
|
|
2570
2570
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py",
|
|
@@ -3008,8 +3008,8 @@
|
|
|
3008
3008
|
},
|
|
3009
3009
|
{
|
|
3010
3010
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/references/governance/governance-maturity-model.md",
|
|
3011
|
-
"bytes":
|
|
3012
|
-
"sha256": "
|
|
3011
|
+
"bytes": 3466,
|
|
3012
|
+
"sha256": "12aaf2f6d52e7dbe049b8a6252ea909fae48f7321e9f6ce0fbbbfb0313915e2b"
|
|
3013
3013
|
},
|
|
3014
3014
|
{
|
|
3015
3015
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/references/governance/host-object-taxonomy.md",
|
|
@@ -3208,13 +3208,13 @@
|
|
|
3208
3208
|
},
|
|
3209
3209
|
{
|
|
3210
3210
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py",
|
|
3211
|
-
"bytes":
|
|
3212
|
-
"sha256": "
|
|
3211
|
+
"bytes": 79591,
|
|
3212
|
+
"sha256": "85039f034e25144fa2ba5fedaf6fbac1367a726ece9a77580bbf18bcbf97b996"
|
|
3213
3213
|
},
|
|
3214
3214
|
{
|
|
3215
3215
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py",
|
|
3216
|
-
"bytes":
|
|
3217
|
-
"sha256": "
|
|
3216
|
+
"bytes": 420225,
|
|
3217
|
+
"sha256": "e0d0178b76619a82a6d616db872a57efaea90e635bfe0883ef318e42e937232c"
|
|
3218
3218
|
},
|
|
3219
3219
|
{
|
|
3220
3220
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py",
|
|
@@ -3653,8 +3653,8 @@
|
|
|
3653
3653
|
},
|
|
3654
3654
|
{
|
|
3655
3655
|
"path": "skills/loom-pre-review/.loom-runtime/shared/references/governance/governance-maturity-model.md",
|
|
3656
|
-
"bytes":
|
|
3657
|
-
"sha256": "
|
|
3656
|
+
"bytes": 3466,
|
|
3657
|
+
"sha256": "12aaf2f6d52e7dbe049b8a6252ea909fae48f7321e9f6ce0fbbbfb0313915e2b"
|
|
3658
3658
|
},
|
|
3659
3659
|
{
|
|
3660
3660
|
"path": "skills/loom-pre-review/.loom-runtime/shared/references/governance/host-object-taxonomy.md",
|
|
@@ -3853,13 +3853,13 @@
|
|
|
3853
3853
|
},
|
|
3854
3854
|
{
|
|
3855
3855
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py",
|
|
3856
|
-
"bytes":
|
|
3857
|
-
"sha256": "
|
|
3856
|
+
"bytes": 79591,
|
|
3857
|
+
"sha256": "85039f034e25144fa2ba5fedaf6fbac1367a726ece9a77580bbf18bcbf97b996"
|
|
3858
3858
|
},
|
|
3859
3859
|
{
|
|
3860
3860
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
3861
|
-
"bytes":
|
|
3862
|
-
"sha256": "
|
|
3861
|
+
"bytes": 420225,
|
|
3862
|
+
"sha256": "e0d0178b76619a82a6d616db872a57efaea90e635bfe0883ef318e42e937232c"
|
|
3863
3863
|
},
|
|
3864
3864
|
{
|
|
3865
3865
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
@@ -4298,8 +4298,8 @@
|
|
|
4298
4298
|
},
|
|
4299
4299
|
{
|
|
4300
4300
|
"path": "skills/loom-resume/.loom-runtime/shared/references/governance/governance-maturity-model.md",
|
|
4301
|
-
"bytes":
|
|
4302
|
-
"sha256": "
|
|
4301
|
+
"bytes": 3466,
|
|
4302
|
+
"sha256": "12aaf2f6d52e7dbe049b8a6252ea909fae48f7321e9f6ce0fbbbfb0313915e2b"
|
|
4303
4303
|
},
|
|
4304
4304
|
{
|
|
4305
4305
|
"path": "skills/loom-resume/.loom-runtime/shared/references/governance/host-object-taxonomy.md",
|
|
@@ -4498,13 +4498,13 @@
|
|
|
4498
4498
|
},
|
|
4499
4499
|
{
|
|
4500
4500
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py",
|
|
4501
|
-
"bytes":
|
|
4502
|
-
"sha256": "
|
|
4501
|
+
"bytes": 79591,
|
|
4502
|
+
"sha256": "85039f034e25144fa2ba5fedaf6fbac1367a726ece9a77580bbf18bcbf97b996"
|
|
4503
4503
|
},
|
|
4504
4504
|
{
|
|
4505
4505
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py",
|
|
4506
|
-
"bytes":
|
|
4507
|
-
"sha256": "
|
|
4506
|
+
"bytes": 420225,
|
|
4507
|
+
"sha256": "e0d0178b76619a82a6d616db872a57efaea90e635bfe0883ef318e42e937232c"
|
|
4508
4508
|
},
|
|
4509
4509
|
{
|
|
4510
4510
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py",
|
|
@@ -4943,8 +4943,8 @@
|
|
|
4943
4943
|
},
|
|
4944
4944
|
{
|
|
4945
4945
|
"path": "skills/loom-retire/.loom-runtime/shared/references/governance/governance-maturity-model.md",
|
|
4946
|
-
"bytes":
|
|
4947
|
-
"sha256": "
|
|
4946
|
+
"bytes": 3466,
|
|
4947
|
+
"sha256": "12aaf2f6d52e7dbe049b8a6252ea909fae48f7321e9f6ce0fbbbfb0313915e2b"
|
|
4948
4948
|
},
|
|
4949
4949
|
{
|
|
4950
4950
|
"path": "skills/loom-retire/.loom-runtime/shared/references/governance/host-object-taxonomy.md",
|
|
@@ -5143,13 +5143,13 @@
|
|
|
5143
5143
|
},
|
|
5144
5144
|
{
|
|
5145
5145
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py",
|
|
5146
|
-
"bytes":
|
|
5147
|
-
"sha256": "
|
|
5146
|
+
"bytes": 79591,
|
|
5147
|
+
"sha256": "85039f034e25144fa2ba5fedaf6fbac1367a726ece9a77580bbf18bcbf97b996"
|
|
5148
5148
|
},
|
|
5149
5149
|
{
|
|
5150
5150
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py",
|
|
5151
|
-
"bytes":
|
|
5152
|
-
"sha256": "
|
|
5151
|
+
"bytes": 420225,
|
|
5152
|
+
"sha256": "e0d0178b76619a82a6d616db872a57efaea90e635bfe0883ef318e42e937232c"
|
|
5153
5153
|
},
|
|
5154
5154
|
{
|
|
5155
5155
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py",
|
|
@@ -5588,8 +5588,8 @@
|
|
|
5588
5588
|
},
|
|
5589
5589
|
{
|
|
5590
5590
|
"path": "skills/loom-review/.loom-runtime/shared/references/governance/governance-maturity-model.md",
|
|
5591
|
-
"bytes":
|
|
5592
|
-
"sha256": "
|
|
5591
|
+
"bytes": 3466,
|
|
5592
|
+
"sha256": "12aaf2f6d52e7dbe049b8a6252ea909fae48f7321e9f6ce0fbbbfb0313915e2b"
|
|
5593
5593
|
},
|
|
5594
5594
|
{
|
|
5595
5595
|
"path": "skills/loom-review/.loom-runtime/shared/references/governance/host-object-taxonomy.md",
|
|
@@ -5788,13 +5788,13 @@
|
|
|
5788
5788
|
},
|
|
5789
5789
|
{
|
|
5790
5790
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py",
|
|
5791
|
-
"bytes":
|
|
5792
|
-
"sha256": "
|
|
5791
|
+
"bytes": 79591,
|
|
5792
|
+
"sha256": "85039f034e25144fa2ba5fedaf6fbac1367a726ece9a77580bbf18bcbf97b996"
|
|
5793
5793
|
},
|
|
5794
5794
|
{
|
|
5795
5795
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
5796
|
-
"bytes":
|
|
5797
|
-
"sha256": "
|
|
5796
|
+
"bytes": 420225,
|
|
5797
|
+
"sha256": "e0d0178b76619a82a6d616db872a57efaea90e635bfe0883ef318e42e937232c"
|
|
5798
5798
|
},
|
|
5799
5799
|
{
|
|
5800
5800
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
@@ -6233,8 +6233,8 @@
|
|
|
6233
6233
|
},
|
|
6234
6234
|
{
|
|
6235
6235
|
"path": "skills/loom-spec-review/.loom-runtime/shared/references/governance/governance-maturity-model.md",
|
|
6236
|
-
"bytes":
|
|
6237
|
-
"sha256": "
|
|
6236
|
+
"bytes": 3466,
|
|
6237
|
+
"sha256": "12aaf2f6d52e7dbe049b8a6252ea909fae48f7321e9f6ce0fbbbfb0313915e2b"
|
|
6238
6238
|
},
|
|
6239
6239
|
{
|
|
6240
6240
|
"path": "skills/loom-spec-review/.loom-runtime/shared/references/governance/host-object-taxonomy.md",
|
|
@@ -6433,13 +6433,13 @@
|
|
|
6433
6433
|
},
|
|
6434
6434
|
{
|
|
6435
6435
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/governance_surface.py",
|
|
6436
|
-
"bytes":
|
|
6437
|
-
"sha256": "
|
|
6436
|
+
"bytes": 79591,
|
|
6437
|
+
"sha256": "85039f034e25144fa2ba5fedaf6fbac1367a726ece9a77580bbf18bcbf97b996"
|
|
6438
6438
|
},
|
|
6439
6439
|
{
|
|
6440
6440
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
6441
|
-
"bytes":
|
|
6442
|
-
"sha256": "
|
|
6441
|
+
"bytes": 420225,
|
|
6442
|
+
"sha256": "e0d0178b76619a82a6d616db872a57efaea90e635bfe0883ef318e42e937232c"
|
|
6443
6443
|
},
|
|
6444
6444
|
{
|
|
6445
6445
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py",
|
package/payload/plugin/loom/skills/shared/references/governance/governance-maturity-model.md
CHANGED
|
@@ -22,6 +22,8 @@ Loom 当前冻结三档成熟度:
|
|
|
22
22
|
|
|
23
23
|
`light` 适用于只需要最小执行入口与基本 review / merge 纪律的仓库。
|
|
24
24
|
|
|
25
|
+
Fresh adoption 默认最高只能到 `light`。repo-local aliases、workflow 文件或 companion scaffold 不等于宿主强制控制面。
|
|
26
|
+
|
|
25
27
|
至少必须具备:
|
|
26
28
|
|
|
27
29
|
- `Work Item` 作为唯一默认执行入口
|
|
@@ -63,6 +65,7 @@ Loom 当前冻结三档成熟度:
|
|
|
63
65
|
- 强前置 `gate chain`
|
|
64
66
|
- `GitHub controlled merge`
|
|
65
67
|
- merge 后 `closeout + reconciliation` 一体化
|
|
68
|
+
- 已验证的宿主强制控制面:branch protection 或 ruleset、required checks、PR merge path、controlled merge basis、closeout basis
|
|
66
69
|
- 可验证的 GitHub profile upgrade 路径
|
|
67
70
|
- parity validation 证据
|
|
68
71
|
|
|
@@ -84,6 +87,7 @@ Loom 当前冻结三档成熟度:
|
|
|
84
87
|
- 需要统一 host binding、merge control 与 closeout control plane
|
|
85
88
|
- 需要用统一 taxonomy 暴露 stale / drift / gate failure
|
|
86
89
|
- 需要对 adopted repo 给出可检查的 parity / upgrade judgment
|
|
90
|
+
- 宿主 branch protection 或 ruleset、required checks、PR merge path、controlled merge basis、closeout basis 都能被 verified host read 证明
|
|
87
91
|
|
|
88
92
|
## 6. 阻断条件
|
|
89
93
|
|
|
@@ -93,6 +97,8 @@ Loom 当前冻结三档成熟度:
|
|
|
93
97
|
- formal spec 路径仍可绕过 `spec review`
|
|
94
98
|
- `status control plane` 仍由多个 skill 各自拼装
|
|
95
99
|
- merge / closeout 仍缺稳定 binding chain
|
|
100
|
+
- 宿主控制面为 `unverified`、`stale` 或 `host_unavailable`
|
|
101
|
+
- 只有 local gate starter 或 workflow 文件,但 required checks / branch protection / ruleset 未被宿主强制
|
|
96
102
|
- parity 仍只有口头比较,没有版本控制内证据
|
|
97
103
|
|
|
98
104
|
## 7. 与 adoption / check / status 的关系
|
|
@@ -224,7 +224,16 @@ MATURITY_LEVELS = {
|
|
|
224
224
|
"summary": "Formal spec, spec gate, status control plane, basic host binding, and closeout/reconciliation reads are available.",
|
|
225
225
|
},
|
|
226
226
|
"strong": {
|
|
227
|
-
"requires": [
|
|
227
|
+
"requires": [
|
|
228
|
+
"standard",
|
|
229
|
+
"repo_interface",
|
|
230
|
+
"repo_interop",
|
|
231
|
+
"host_enforced_control_plane",
|
|
232
|
+
"pr_merge_path",
|
|
233
|
+
"controlled_merge_basis",
|
|
234
|
+
"closeout_basis",
|
|
235
|
+
"github_controlled_merge",
|
|
236
|
+
],
|
|
228
237
|
"summary": "Host-backed binding, reconciliation, controlled merge, and closeout gates are available.",
|
|
229
238
|
},
|
|
230
239
|
}
|
|
@@ -332,6 +341,34 @@ MATURITY_REQUIRED_FIELDS = {
|
|
|
332
341
|
"defaulting": "host",
|
|
333
342
|
"recommended_action": "enable controlled merge binding and required host gates",
|
|
334
343
|
},
|
|
344
|
+
{
|
|
345
|
+
"id": "host_enforced_control_plane",
|
|
346
|
+
"layer": "github-profile",
|
|
347
|
+
"required": True,
|
|
348
|
+
"defaulting": "host",
|
|
349
|
+
"recommended_action": "verify branch protection or ruleset enforcement plus required checks before claiming strong governance",
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
"id": "pr_merge_path",
|
|
353
|
+
"layer": "github-profile",
|
|
354
|
+
"required": True,
|
|
355
|
+
"defaulting": "host",
|
|
356
|
+
"recommended_action": "prove the PR merge path is host-owned and readable before strong governance",
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
"id": "controlled_merge_basis",
|
|
360
|
+
"layer": "github-profile",
|
|
361
|
+
"required": True,
|
|
362
|
+
"defaulting": "host",
|
|
363
|
+
"recommended_action": "prove controlled merge depends on verified host checks instead of local aliases",
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
"id": "closeout_basis",
|
|
367
|
+
"layer": "github-profile",
|
|
368
|
+
"required": True,
|
|
369
|
+
"defaulting": "host",
|
|
370
|
+
"recommended_action": "prove closeout consumes merge commit and reconciliation basis before strong governance",
|
|
371
|
+
},
|
|
335
372
|
],
|
|
336
373
|
}
|
|
337
374
|
ADOPTION_GATE_ROLLOUT_MODES = {
|
|
@@ -1620,6 +1657,7 @@ def detect_host_binding_surface(
|
|
|
1620
1657
|
|
|
1621
1658
|
def maturity_status(
|
|
1622
1659
|
*,
|
|
1660
|
+
repository_mode: str,
|
|
1623
1661
|
carrier_summary: dict[str, dict[str, str]],
|
|
1624
1662
|
repo_interface: dict[str, Any],
|
|
1625
1663
|
repo_interop: dict[str, Any],
|
|
@@ -1639,22 +1677,54 @@ def maturity_status(
|
|
|
1639
1677
|
repo_interop_present = repo_interop.get("availability") == "present"
|
|
1640
1678
|
basic_host_binding_present = host_binding.get("result") == "pass"
|
|
1641
1679
|
github_control_plane_present = github_control_plane.get("default_branch") != "unknown"
|
|
1680
|
+
host_enforcement = github_control_plane.get("host_enforcement")
|
|
1681
|
+
host_enforced_control_plane = (
|
|
1682
|
+
isinstance(host_enforcement, dict)
|
|
1683
|
+
and host_enforcement.get("verification_status") == "verified"
|
|
1684
|
+
and host_enforcement.get("branch_protection_or_ruleset") is True
|
|
1685
|
+
and host_enforcement.get("required_checks") is True
|
|
1686
|
+
)
|
|
1687
|
+
required_objects = host_binding.get("required_objects")
|
|
1688
|
+
implementation_pr = required_objects.get("implementation_pr") if isinstance(required_objects, dict) else None
|
|
1689
|
+
merge_commit = required_objects.get("merge_commit") if isinstance(required_objects, dict) else None
|
|
1690
|
+
closeout = required_objects.get("closeout") if isinstance(required_objects, dict) else None
|
|
1691
|
+
pr_merge_path = (
|
|
1692
|
+
isinstance(implementation_pr, dict)
|
|
1693
|
+
and implementation_pr.get("authority") == "host"
|
|
1694
|
+
and implementation_pr.get("status") in {"host-managed", "present"}
|
|
1695
|
+
)
|
|
1696
|
+
controlled_merge_basis = host_enforced_control_plane and github_control_plane_present and pr_merge_path
|
|
1697
|
+
closeout_basis = (
|
|
1698
|
+
repo_interop_present
|
|
1699
|
+
and isinstance(merge_commit, dict)
|
|
1700
|
+
and merge_commit.get("authority") == "host"
|
|
1701
|
+
and isinstance(closeout, dict)
|
|
1702
|
+
and closeout.get("status") == "present"
|
|
1703
|
+
)
|
|
1642
1704
|
facts = {
|
|
1643
1705
|
**carrier_present,
|
|
1644
1706
|
"light": False,
|
|
1645
1707
|
"standard": False,
|
|
1646
|
-
"fr_work_item_layer": repo_interface_present,
|
|
1708
|
+
"fr_work_item_layer": repo_interface_present and repository_mode != "new",
|
|
1647
1709
|
"spec_gate": spec_gate_present,
|
|
1648
1710
|
"status_control_plane": True,
|
|
1649
|
-
"basic_host_binding": basic_host_binding_present,
|
|
1650
|
-
"closeout_reconciliation_read": repo_interop_present,
|
|
1711
|
+
"basic_host_binding": basic_host_binding_present and repository_mode != "new",
|
|
1712
|
+
"closeout_reconciliation_read": repo_interop_present and repository_mode != "new",
|
|
1651
1713
|
"repo_interface": repo_interface_present,
|
|
1652
1714
|
"repo_interop": repo_interop_present,
|
|
1715
|
+
"host_enforced_control_plane": host_enforced_control_plane and repository_mode != "new",
|
|
1716
|
+
"pr_merge_path": pr_merge_path and repository_mode != "new",
|
|
1717
|
+
"controlled_merge_basis": controlled_merge_basis and repository_mode != "new",
|
|
1718
|
+
"closeout_basis": closeout_basis and repository_mode != "new",
|
|
1653
1719
|
"github_controlled_merge": (
|
|
1654
|
-
|
|
1720
|
+
repository_mode != "new"
|
|
1721
|
+
and github_control_plane_present
|
|
1655
1722
|
and basic_host_binding_present
|
|
1656
1723
|
and repo_interface_present
|
|
1657
1724
|
and repo_interop_present
|
|
1725
|
+
and host_enforced_control_plane
|
|
1726
|
+
and controlled_merge_basis
|
|
1727
|
+
and closeout_basis
|
|
1658
1728
|
),
|
|
1659
1729
|
}
|
|
1660
1730
|
achieved: list[str] = []
|
|
@@ -1687,12 +1757,18 @@ def maturity_status(
|
|
|
1687
1757
|
"required_fields": MATURITY_REQUIRED_FIELDS,
|
|
1688
1758
|
"missing_by_level": missing_by_level,
|
|
1689
1759
|
"missing_details_by_level": missing_details_by_level,
|
|
1760
|
+
"fresh_adoption": {
|
|
1761
|
+
"repository_mode": repository_mode,
|
|
1762
|
+
"max_default_maturity": "light",
|
|
1763
|
+
"applied": repository_mode == "new",
|
|
1764
|
+
},
|
|
1690
1765
|
"gate_rollout": adoption_gate_rollout_status(maturity_current=current),
|
|
1691
1766
|
}
|
|
1692
1767
|
|
|
1693
1768
|
|
|
1694
1769
|
def governance_control_plane(
|
|
1695
1770
|
*,
|
|
1771
|
+
repository_mode: str,
|
|
1696
1772
|
carrier_summary: dict[str, dict[str, str]],
|
|
1697
1773
|
github_control_plane: dict[str, Any],
|
|
1698
1774
|
repo_interface: dict[str, Any],
|
|
@@ -1714,6 +1790,7 @@ def governance_control_plane(
|
|
|
1714
1790
|
"taxonomy": GATE_FAILURE_TAXONOMY,
|
|
1715
1791
|
"gate_chain": GATE_CHAIN,
|
|
1716
1792
|
"maturity": maturity_status(
|
|
1793
|
+
repository_mode=repository_mode,
|
|
1717
1794
|
carrier_summary=carrier_summary,
|
|
1718
1795
|
repo_interface=repo_interface,
|
|
1719
1796
|
repo_interop=repo_interop,
|
|
@@ -1750,6 +1827,7 @@ def build_governance_surface(
|
|
|
1750
1827
|
workspace_profile = detect_workspace_profile(root, host_binding=host_binding)
|
|
1751
1828
|
gate_starter = detect_gate_starter(root)
|
|
1752
1829
|
control_plane = governance_control_plane(
|
|
1830
|
+
repository_mode=repository_mode,
|
|
1753
1831
|
carrier_summary=carrier_summary,
|
|
1754
1832
|
github_control_plane=github_control_plane,
|
|
1755
1833
|
repo_interface=repo_interface,
|
|
@@ -495,6 +495,24 @@ def load_command_json(
|
|
|
495
495
|
return payload, None
|
|
496
496
|
|
|
497
497
|
|
|
498
|
+
def host_read_unavailable(payload: dict[str, object]) -> bool:
|
|
499
|
+
haystack = json.dumps(payload, ensure_ascii=False).lower()
|
|
500
|
+
return any(
|
|
501
|
+
needle in haystack
|
|
502
|
+
for needle in (
|
|
503
|
+
"api rate limit exceeded",
|
|
504
|
+
"http 403",
|
|
505
|
+
"host_unavailable",
|
|
506
|
+
"host unavailable",
|
|
507
|
+
"rate limit exceeded",
|
|
508
|
+
)
|
|
509
|
+
)
|
|
510
|
+
|
|
511
|
+
|
|
512
|
+
def host_verification_unconfirmed(payload: dict[str, object]) -> bool:
|
|
513
|
+
return payload.get("host_verification_status") in {"unverified", "stale", "host_unavailable"} or host_read_unavailable(payload)
|
|
514
|
+
|
|
515
|
+
|
|
498
516
|
def load_command_json_with_retry(
|
|
499
517
|
root: Path,
|
|
500
518
|
args: list[str],
|
|
@@ -987,6 +1005,13 @@ def require_governance_control_plane(
|
|
|
987
1005
|
strong_requires = levels.get("strong", {}).get("requires") if isinstance(levels, dict) and isinstance(levels.get("strong"), dict) else None
|
|
988
1006
|
if not isinstance(strong_requires, list) or "github_controlled_merge" not in strong_requires:
|
|
989
1007
|
failures.append(Failure(category, f"{context}.maturity strong level must require GitHub controlled merge"))
|
|
1008
|
+
elif not {
|
|
1009
|
+
"host_enforced_control_plane",
|
|
1010
|
+
"pr_merge_path",
|
|
1011
|
+
"controlled_merge_basis",
|
|
1012
|
+
"closeout_basis",
|
|
1013
|
+
}.issubset(set(strong_requires)):
|
|
1014
|
+
failures.append(Failure(category, f"{context}.maturity strong level must require verified host enforcement and closeout basis"))
|
|
990
1015
|
required_fields = maturity.get("required_fields")
|
|
991
1016
|
if not isinstance(required_fields, dict) or set(required_fields) != {"light", "standard", "strong"}:
|
|
992
1017
|
failures.append(Failure(category, f"{context}.maturity required_fields must define light, standard, and strong"))
|
|
@@ -1006,6 +1031,11 @@ def require_governance_control_plane(
|
|
|
1006
1031
|
missing_details = maturity.get("missing_details_by_level")
|
|
1007
1032
|
if not isinstance(missing_details, dict) or set(missing_details) != {"light", "standard", "strong"}:
|
|
1008
1033
|
failures.append(Failure(category, f"{context}.maturity missing_details_by_level must define light, standard, and strong"))
|
|
1034
|
+
fresh_adoption = maturity.get("fresh_adoption")
|
|
1035
|
+
if not isinstance(fresh_adoption, dict):
|
|
1036
|
+
failures.append(Failure(category, f"{context}.maturity fresh_adoption must be an object"))
|
|
1037
|
+
elif fresh_adoption.get("max_default_maturity") != "light":
|
|
1038
|
+
failures.append(Failure(category, f"{context}.maturity fresh_adoption max_default_maturity must stay light"))
|
|
1009
1039
|
require_adoption_gate_rollout_payload(
|
|
1010
1040
|
failures,
|
|
1011
1041
|
category=category,
|
|
@@ -2785,7 +2815,14 @@ def check_root_self_adoption_carrier(root: Path) -> list[Failure]:
|
|
|
2785
2815
|
)
|
|
2786
2816
|
if kind == "governance-status":
|
|
2787
2817
|
maturity = payload.get("maturity")
|
|
2788
|
-
if
|
|
2818
|
+
if isinstance(maturity, dict) and maturity.get("current") == "strong":
|
|
2819
|
+
pass
|
|
2820
|
+
elif host_verification_unconfirmed(payload):
|
|
2821
|
+
missing_by_level = maturity.get("missing_by_level") if isinstance(maturity, dict) else {}
|
|
2822
|
+
strong_missing = missing_by_level.get("strong") if isinstance(missing_by_level, dict) else []
|
|
2823
|
+
if not isinstance(strong_missing, list) or "host_enforced_control_plane" not in strong_missing:
|
|
2824
|
+
failures.append(Failure("root-self-adoption", "`root governance status` host-unavailable fallback must keep strong blocked on host enforcement"))
|
|
2825
|
+
else:
|
|
2789
2826
|
failures.append(Failure("root-self-adoption", "`root governance status` must report strong maturity after self-management binding"))
|
|
2790
2827
|
if kind == "runtime-parity":
|
|
2791
2828
|
checks = payload.get("checks")
|
|
@@ -3135,7 +3172,7 @@ def check_daily_execution_cli(root: Path) -> list[Failure]:
|
|
|
3135
3172
|
(
|
|
3136
3173
|
"host-binding-validate",
|
|
3137
3174
|
["python3", "tools/loom_flow.py", "host-binding", "validate", "--target", ".", "--owner", "MC-and-his-Agents", "--repo", "Loom", "--branch", "main"],
|
|
3138
|
-
{"pass"},
|
|
3175
|
+
{"pass", "block"},
|
|
3139
3176
|
),
|
|
3140
3177
|
(
|
|
3141
3178
|
"governance-profile-status",
|
|
@@ -3466,7 +3503,10 @@ def check_daily_execution_cli(root: Path) -> list[Failure]:
|
|
|
3466
3503
|
if payload.get("schema_version") != "loom-host-binding/v1":
|
|
3467
3504
|
failures.append(Failure("daily-execution-cli", "`host-binding validate` must report schema v1"))
|
|
3468
3505
|
branch = payload.get("branch")
|
|
3469
|
-
|
|
3506
|
+
host_unavailable = host_read_unavailable(payload)
|
|
3507
|
+
if payload.get("result") == "block" and not host_unavailable:
|
|
3508
|
+
failures.append(Failure("daily-execution-cli", "`host-binding validate --branch main` must pass unless the host read is unavailable"))
|
|
3509
|
+
if (not isinstance(branch, dict) or branch.get("status") != "present") and not host_unavailable:
|
|
3470
3510
|
failures.append(Failure("daily-execution-cli", "`host-binding validate --branch main` must read the branch via REST"))
|
|
3471
3511
|
if label in {"governance-profile-status", "governance-profile-upgrade-plan"}:
|
|
3472
3512
|
if payload.get("command") != "governance-profile":
|
|
@@ -3481,6 +3521,15 @@ def check_daily_execution_cli(root: Path) -> list[Failure]:
|
|
|
3481
3521
|
context=f"`{label}` governance_control_plane",
|
|
3482
3522
|
payload=control_plane,
|
|
3483
3523
|
)
|
|
3524
|
+
maturity = payload.get("maturity")
|
|
3525
|
+
if isinstance(maturity, dict):
|
|
3526
|
+
current = maturity.get("current")
|
|
3527
|
+
if current == "strong":
|
|
3528
|
+
failures.append(Failure("daily-execution-cli", "`examples/new-project` fresh adoption must not default to strong maturity"))
|
|
3529
|
+
missing_by_level = maturity.get("missing_by_level")
|
|
3530
|
+
strong_missing = missing_by_level.get("strong") if isinstance(missing_by_level, dict) else []
|
|
3531
|
+
if not isinstance(strong_missing, list) or "host_enforced_control_plane" not in strong_missing:
|
|
3532
|
+
failures.append(Failure("daily-execution-cli", "`examples/new-project` strong upgrade-plan must expose missing host enforcement"))
|
|
3484
3533
|
if label == "governance-profile-upgrade-plan":
|
|
3485
3534
|
require_adoption_decisions_payload(
|
|
3486
3535
|
failures,
|
|
@@ -22,6 +22,8 @@ Loom 当前冻结三档成熟度:
|
|
|
22
22
|
|
|
23
23
|
`light` 适用于只需要最小执行入口与基本 review / merge 纪律的仓库。
|
|
24
24
|
|
|
25
|
+
Fresh adoption 默认最高只能到 `light`。repo-local aliases、workflow 文件或 companion scaffold 不等于宿主强制控制面。
|
|
26
|
+
|
|
25
27
|
至少必须具备:
|
|
26
28
|
|
|
27
29
|
- `Work Item` 作为唯一默认执行入口
|
|
@@ -63,6 +65,7 @@ Loom 当前冻结三档成熟度:
|
|
|
63
65
|
- 强前置 `gate chain`
|
|
64
66
|
- `GitHub controlled merge`
|
|
65
67
|
- merge 后 `closeout + reconciliation` 一体化
|
|
68
|
+
- 已验证的宿主强制控制面:branch protection 或 ruleset、required checks、PR merge path、controlled merge basis、closeout basis
|
|
66
69
|
- 可验证的 GitHub profile upgrade 路径
|
|
67
70
|
- parity validation 证据
|
|
68
71
|
|
|
@@ -84,6 +87,7 @@ Loom 当前冻结三档成熟度:
|
|
|
84
87
|
- 需要统一 host binding、merge control 与 closeout control plane
|
|
85
88
|
- 需要用统一 taxonomy 暴露 stale / drift / gate failure
|
|
86
89
|
- 需要对 adopted repo 给出可检查的 parity / upgrade judgment
|
|
90
|
+
- 宿主 branch protection 或 ruleset、required checks、PR merge path、controlled merge basis、closeout basis 都能被 verified host read 证明
|
|
87
91
|
|
|
88
92
|
## 6. 阻断条件
|
|
89
93
|
|
|
@@ -93,6 +97,8 @@ Loom 当前冻结三档成熟度:
|
|
|
93
97
|
- formal spec 路径仍可绕过 `spec review`
|
|
94
98
|
- `status control plane` 仍由多个 skill 各自拼装
|
|
95
99
|
- merge / closeout 仍缺稳定 binding chain
|
|
100
|
+
- 宿主控制面为 `unverified`、`stale` 或 `host_unavailable`
|
|
101
|
+
- 只有 local gate starter 或 workflow 文件,但 required checks / branch protection / ruleset 未被宿主强制
|
|
96
102
|
- parity 仍只有口头比较,没有版本控制内证据
|
|
97
103
|
|
|
98
104
|
## 7. 与 adoption / check / status 的关系
|