@mc-and-his-agents/loom-installer 0.1.17 → 0.1.18
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/scripts/governance_surface.py +115 -0
- package/payload/plugin/loom/skills/shared/scripts/loom_check.py +22 -0
- package/payload/plugin/loom/skills/shared/scripts/loom_flow.py +18 -1
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py +115 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py +22 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py +18 -1
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py +115 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py +22 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py +18 -1
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py +115 -0
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_check.py +22 -0
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py +18 -1
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py +115 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py +22 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py +18 -1
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py +115 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py +22 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py +18 -1
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py +115 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py +22 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py +18 -1
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py +115 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py +22 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py +18 -1
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py +115 -0
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_check.py +22 -0
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py +18 -1
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/governance_surface.py +115 -0
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py +22 -0
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py +18 -1
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": "3daaced2a93b2f5170fc738bcd631d6323336c82",
|
|
6
6
|
"source_ref": "main",
|
|
7
|
-
"built_at": "2026-04-25T13:
|
|
7
|
+
"built_at": "2026-04-25T13:30:42+08:00",
|
|
8
8
|
"runtime": {
|
|
9
9
|
"python_minimum": "3.10",
|
|
10
10
|
"python_recommended": "3.11+"
|
|
@@ -623,18 +623,18 @@
|
|
|
623
623
|
},
|
|
624
624
|
{
|
|
625
625
|
"path": "plugin/loom/skills/shared/scripts/governance_surface.py",
|
|
626
|
-
"bytes":
|
|
627
|
-
"sha256": "
|
|
626
|
+
"bytes": 51952,
|
|
627
|
+
"sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
|
|
628
628
|
},
|
|
629
629
|
{
|
|
630
630
|
"path": "plugin/loom/skills/shared/scripts/loom_check.py",
|
|
631
|
-
"bytes":
|
|
632
|
-
"sha256": "
|
|
631
|
+
"bytes": 271781,
|
|
632
|
+
"sha256": "916036e9f69521168511ca4e30cd7066ae2d9abb22294fb984ebe3d76d199cfa"
|
|
633
633
|
},
|
|
634
634
|
{
|
|
635
635
|
"path": "plugin/loom/skills/shared/scripts/loom_flow.py",
|
|
636
|
-
"bytes":
|
|
637
|
-
"sha256": "
|
|
636
|
+
"bytes": 288183,
|
|
637
|
+
"sha256": "76fd6610e74672d527f43edd1311dbd6ca571406536d04dae502236eb67a5a38"
|
|
638
638
|
},
|
|
639
639
|
{
|
|
640
640
|
"path": "plugin/loom/skills/shared/scripts/loom_init.py",
|
|
@@ -1208,18 +1208,18 @@
|
|
|
1208
1208
|
},
|
|
1209
1209
|
{
|
|
1210
1210
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py",
|
|
1211
|
-
"bytes":
|
|
1212
|
-
"sha256": "
|
|
1211
|
+
"bytes": 51952,
|
|
1212
|
+
"sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
|
|
1213
1213
|
},
|
|
1214
1214
|
{
|
|
1215
1215
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py",
|
|
1216
|
-
"bytes":
|
|
1217
|
-
"sha256": "
|
|
1216
|
+
"bytes": 271781,
|
|
1217
|
+
"sha256": "916036e9f69521168511ca4e30cd7066ae2d9abb22294fb984ebe3d76d199cfa"
|
|
1218
1218
|
},
|
|
1219
1219
|
{
|
|
1220
1220
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py",
|
|
1221
|
-
"bytes":
|
|
1222
|
-
"sha256": "
|
|
1221
|
+
"bytes": 288183,
|
|
1222
|
+
"sha256": "76fd6610e74672d527f43edd1311dbd6ca571406536d04dae502236eb67a5a38"
|
|
1223
1223
|
},
|
|
1224
1224
|
{
|
|
1225
1225
|
"path": "skills/loom-adopt/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -1823,18 +1823,18 @@
|
|
|
1823
1823
|
},
|
|
1824
1824
|
{
|
|
1825
1825
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py",
|
|
1826
|
-
"bytes":
|
|
1827
|
-
"sha256": "
|
|
1826
|
+
"bytes": 51952,
|
|
1827
|
+
"sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
|
|
1828
1828
|
},
|
|
1829
1829
|
{
|
|
1830
1830
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py",
|
|
1831
|
-
"bytes":
|
|
1832
|
-
"sha256": "
|
|
1831
|
+
"bytes": 271781,
|
|
1832
|
+
"sha256": "916036e9f69521168511ca4e30cd7066ae2d9abb22294fb984ebe3d76d199cfa"
|
|
1833
1833
|
},
|
|
1834
1834
|
{
|
|
1835
1835
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py",
|
|
1836
|
-
"bytes":
|
|
1837
|
-
"sha256": "
|
|
1836
|
+
"bytes": 288183,
|
|
1837
|
+
"sha256": "76fd6610e74672d527f43edd1311dbd6ca571406536d04dae502236eb67a5a38"
|
|
1838
1838
|
},
|
|
1839
1839
|
{
|
|
1840
1840
|
"path": "skills/loom-handoff/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -2438,18 +2438,18 @@
|
|
|
2438
2438
|
},
|
|
2439
2439
|
{
|
|
2440
2440
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py",
|
|
2441
|
-
"bytes":
|
|
2442
|
-
"sha256": "
|
|
2441
|
+
"bytes": 51952,
|
|
2442
|
+
"sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
|
|
2443
2443
|
},
|
|
2444
2444
|
{
|
|
2445
2445
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_check.py",
|
|
2446
|
-
"bytes":
|
|
2447
|
-
"sha256": "
|
|
2446
|
+
"bytes": 271781,
|
|
2447
|
+
"sha256": "916036e9f69521168511ca4e30cd7066ae2d9abb22294fb984ebe3d76d199cfa"
|
|
2448
2448
|
},
|
|
2449
2449
|
{
|
|
2450
2450
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py",
|
|
2451
|
-
"bytes":
|
|
2452
|
-
"sha256": "
|
|
2451
|
+
"bytes": 288183,
|
|
2452
|
+
"sha256": "76fd6610e74672d527f43edd1311dbd6ca571406536d04dae502236eb67a5a38"
|
|
2453
2453
|
},
|
|
2454
2454
|
{
|
|
2455
2455
|
"path": "skills/loom-init/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -3058,18 +3058,18 @@
|
|
|
3058
3058
|
},
|
|
3059
3059
|
{
|
|
3060
3060
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py",
|
|
3061
|
-
"bytes":
|
|
3062
|
-
"sha256": "
|
|
3061
|
+
"bytes": 51952,
|
|
3062
|
+
"sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
|
|
3063
3063
|
},
|
|
3064
3064
|
{
|
|
3065
3065
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py",
|
|
3066
|
-
"bytes":
|
|
3067
|
-
"sha256": "
|
|
3066
|
+
"bytes": 271781,
|
|
3067
|
+
"sha256": "916036e9f69521168511ca4e30cd7066ae2d9abb22294fb984ebe3d76d199cfa"
|
|
3068
3068
|
},
|
|
3069
3069
|
{
|
|
3070
3070
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py",
|
|
3071
|
-
"bytes":
|
|
3072
|
-
"sha256": "
|
|
3071
|
+
"bytes": 288183,
|
|
3072
|
+
"sha256": "76fd6610e74672d527f43edd1311dbd6ca571406536d04dae502236eb67a5a38"
|
|
3073
3073
|
},
|
|
3074
3074
|
{
|
|
3075
3075
|
"path": "skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -3673,18 +3673,18 @@
|
|
|
3673
3673
|
},
|
|
3674
3674
|
{
|
|
3675
3675
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py",
|
|
3676
|
-
"bytes":
|
|
3677
|
-
"sha256": "
|
|
3676
|
+
"bytes": 51952,
|
|
3677
|
+
"sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
|
|
3678
3678
|
},
|
|
3679
3679
|
{
|
|
3680
3680
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
3681
|
-
"bytes":
|
|
3682
|
-
"sha256": "
|
|
3681
|
+
"bytes": 271781,
|
|
3682
|
+
"sha256": "916036e9f69521168511ca4e30cd7066ae2d9abb22294fb984ebe3d76d199cfa"
|
|
3683
3683
|
},
|
|
3684
3684
|
{
|
|
3685
3685
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
3686
|
-
"bytes":
|
|
3687
|
-
"sha256": "
|
|
3686
|
+
"bytes": 288183,
|
|
3687
|
+
"sha256": "76fd6610e74672d527f43edd1311dbd6ca571406536d04dae502236eb67a5a38"
|
|
3688
3688
|
},
|
|
3689
3689
|
{
|
|
3690
3690
|
"path": "skills/loom-pre-review/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -4288,18 +4288,18 @@
|
|
|
4288
4288
|
},
|
|
4289
4289
|
{
|
|
4290
4290
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py",
|
|
4291
|
-
"bytes":
|
|
4292
|
-
"sha256": "
|
|
4291
|
+
"bytes": 51952,
|
|
4292
|
+
"sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
|
|
4293
4293
|
},
|
|
4294
4294
|
{
|
|
4295
4295
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py",
|
|
4296
|
-
"bytes":
|
|
4297
|
-
"sha256": "
|
|
4296
|
+
"bytes": 271781,
|
|
4297
|
+
"sha256": "916036e9f69521168511ca4e30cd7066ae2d9abb22294fb984ebe3d76d199cfa"
|
|
4298
4298
|
},
|
|
4299
4299
|
{
|
|
4300
4300
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py",
|
|
4301
|
-
"bytes":
|
|
4302
|
-
"sha256": "
|
|
4301
|
+
"bytes": 288183,
|
|
4302
|
+
"sha256": "76fd6610e74672d527f43edd1311dbd6ca571406536d04dae502236eb67a5a38"
|
|
4303
4303
|
},
|
|
4304
4304
|
{
|
|
4305
4305
|
"path": "skills/loom-resume/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -4903,18 +4903,18 @@
|
|
|
4903
4903
|
},
|
|
4904
4904
|
{
|
|
4905
4905
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py",
|
|
4906
|
-
"bytes":
|
|
4907
|
-
"sha256": "
|
|
4906
|
+
"bytes": 51952,
|
|
4907
|
+
"sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
|
|
4908
4908
|
},
|
|
4909
4909
|
{
|
|
4910
4910
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py",
|
|
4911
|
-
"bytes":
|
|
4912
|
-
"sha256": "
|
|
4911
|
+
"bytes": 271781,
|
|
4912
|
+
"sha256": "916036e9f69521168511ca4e30cd7066ae2d9abb22294fb984ebe3d76d199cfa"
|
|
4913
4913
|
},
|
|
4914
4914
|
{
|
|
4915
4915
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py",
|
|
4916
|
-
"bytes":
|
|
4917
|
-
"sha256": "
|
|
4916
|
+
"bytes": 288183,
|
|
4917
|
+
"sha256": "76fd6610e74672d527f43edd1311dbd6ca571406536d04dae502236eb67a5a38"
|
|
4918
4918
|
},
|
|
4919
4919
|
{
|
|
4920
4920
|
"path": "skills/loom-retire/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -5518,18 +5518,18 @@
|
|
|
5518
5518
|
},
|
|
5519
5519
|
{
|
|
5520
5520
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py",
|
|
5521
|
-
"bytes":
|
|
5522
|
-
"sha256": "
|
|
5521
|
+
"bytes": 51952,
|
|
5522
|
+
"sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
|
|
5523
5523
|
},
|
|
5524
5524
|
{
|
|
5525
5525
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
5526
|
-
"bytes":
|
|
5527
|
-
"sha256": "
|
|
5526
|
+
"bytes": 271781,
|
|
5527
|
+
"sha256": "916036e9f69521168511ca4e30cd7066ae2d9abb22294fb984ebe3d76d199cfa"
|
|
5528
5528
|
},
|
|
5529
5529
|
{
|
|
5530
5530
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
5531
|
-
"bytes":
|
|
5532
|
-
"sha256": "
|
|
5531
|
+
"bytes": 288183,
|
|
5532
|
+
"sha256": "76fd6610e74672d527f43edd1311dbd6ca571406536d04dae502236eb67a5a38"
|
|
5533
5533
|
},
|
|
5534
5534
|
{
|
|
5535
5535
|
"path": "skills/loom-review/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -6133,18 +6133,18 @@
|
|
|
6133
6133
|
},
|
|
6134
6134
|
{
|
|
6135
6135
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/governance_surface.py",
|
|
6136
|
-
"bytes":
|
|
6137
|
-
"sha256": "
|
|
6136
|
+
"bytes": 51952,
|
|
6137
|
+
"sha256": "ae74631688a91f774f29c54177f7b8477f23d445395e315fb91b24f5412dfcd2"
|
|
6138
6138
|
},
|
|
6139
6139
|
{
|
|
6140
6140
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py",
|
|
6141
|
-
"bytes":
|
|
6142
|
-
"sha256": "
|
|
6141
|
+
"bytes": 271781,
|
|
6142
|
+
"sha256": "916036e9f69521168511ca4e30cd7066ae2d9abb22294fb984ebe3d76d199cfa"
|
|
6143
6143
|
},
|
|
6144
6144
|
{
|
|
6145
6145
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py",
|
|
6146
|
-
"bytes":
|
|
6147
|
-
"sha256": "
|
|
6146
|
+
"bytes": 288183,
|
|
6147
|
+
"sha256": "76fd6610e74672d527f43edd1311dbd6ca571406536d04dae502236eb67a5a38"
|
|
6148
6148
|
},
|
|
6149
6149
|
{
|
|
6150
6150
|
"path": "skills/loom-spec-review/.loom-runtime/shared/scripts/loom_init.py",
|
|
@@ -146,6 +146,112 @@ MATURITY_LEVELS = {
|
|
|
146
146
|
"summary": "Host-backed binding, reconciliation, controlled merge, and closeout gates are available.",
|
|
147
147
|
},
|
|
148
148
|
}
|
|
149
|
+
MATURITY_REQUIRED_FIELDS = {
|
|
150
|
+
"light": [
|
|
151
|
+
{
|
|
152
|
+
"id": "work_item",
|
|
153
|
+
"layer": "core",
|
|
154
|
+
"required": True,
|
|
155
|
+
"defaulting": "generated",
|
|
156
|
+
"recommended_action": "run loom-init or restore the Work Item carrier",
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"id": "recovery",
|
|
160
|
+
"layer": "core",
|
|
161
|
+
"required": True,
|
|
162
|
+
"defaulting": "generated",
|
|
163
|
+
"recommended_action": "restore the recovery carrier",
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"id": "status_surface",
|
|
167
|
+
"layer": "core",
|
|
168
|
+
"required": True,
|
|
169
|
+
"defaulting": "generated",
|
|
170
|
+
"recommended_action": "restore the status surface carrier",
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"id": "review",
|
|
174
|
+
"layer": "core",
|
|
175
|
+
"required": True,
|
|
176
|
+
"defaulting": "generated",
|
|
177
|
+
"recommended_action": "restore the review carrier",
|
|
178
|
+
},
|
|
179
|
+
],
|
|
180
|
+
"standard": [
|
|
181
|
+
{
|
|
182
|
+
"id": "fr_work_item_layer",
|
|
183
|
+
"layer": "github-profile",
|
|
184
|
+
"required": True,
|
|
185
|
+
"defaulting": "profile",
|
|
186
|
+
"recommended_action": "declare the FR -> Work Item split through the GitHub profile upgrade path",
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"id": "spec_path",
|
|
190
|
+
"layer": "core",
|
|
191
|
+
"required": True,
|
|
192
|
+
"defaulting": "generated",
|
|
193
|
+
"recommended_action": "install formal spec scaffold",
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"id": "plan_path",
|
|
197
|
+
"layer": "core",
|
|
198
|
+
"required": True,
|
|
199
|
+
"defaulting": "generated",
|
|
200
|
+
"recommended_action": "install execution plan scaffold",
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"id": "spec_gate",
|
|
204
|
+
"layer": "core",
|
|
205
|
+
"required": True,
|
|
206
|
+
"defaulting": "generated",
|
|
207
|
+
"recommended_action": "record or restore the spec review gate",
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"id": "status_control_plane",
|
|
211
|
+
"layer": "core",
|
|
212
|
+
"required": True,
|
|
213
|
+
"defaulting": "builtin",
|
|
214
|
+
"recommended_action": "run loom_status or loom_check to rebuild the status control plane",
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"id": "basic_host_binding",
|
|
218
|
+
"layer": "github-profile",
|
|
219
|
+
"required": True,
|
|
220
|
+
"defaulting": "profile",
|
|
221
|
+
"recommended_action": "run governance-profile binding and repair missing host bindings",
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
"id": "closeout_reconciliation_read",
|
|
225
|
+
"layer": "github-profile",
|
|
226
|
+
"required": True,
|
|
227
|
+
"defaulting": "profile",
|
|
228
|
+
"recommended_action": "install repo interop so closeout can consume reconciliation",
|
|
229
|
+
},
|
|
230
|
+
],
|
|
231
|
+
"strong": [
|
|
232
|
+
{
|
|
233
|
+
"id": "repo_interface",
|
|
234
|
+
"layer": "repo-owned-residue",
|
|
235
|
+
"required": True,
|
|
236
|
+
"defaulting": "scaffold",
|
|
237
|
+
"recommended_action": "install or repair the repo companion interface",
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"id": "repo_interop",
|
|
241
|
+
"layer": "repo-owned-residue",
|
|
242
|
+
"required": True,
|
|
243
|
+
"defaulting": "scaffold",
|
|
244
|
+
"recommended_action": "install or repair the repo interop contract",
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"id": "github_controlled_merge",
|
|
248
|
+
"layer": "github-profile",
|
|
249
|
+
"required": True,
|
|
250
|
+
"defaulting": "host",
|
|
251
|
+
"recommended_action": "enable controlled merge binding and required host gates",
|
|
252
|
+
},
|
|
253
|
+
],
|
|
254
|
+
}
|
|
149
255
|
|
|
150
256
|
|
|
151
257
|
def run_process(args: list[str], cwd: Path) -> subprocess.CompletedProcess[str]:
|
|
@@ -1033,9 +1139,16 @@ def maturity_status(
|
|
|
1033
1139
|
}
|
|
1034
1140
|
achieved: list[str] = []
|
|
1035
1141
|
missing_by_level: dict[str, list[str]] = {}
|
|
1142
|
+
missing_details_by_level: dict[str, list[dict[str, Any]]] = {}
|
|
1036
1143
|
for level in ("light", "standard", "strong"):
|
|
1037
1144
|
missing = [field for field in MATURITY_LEVELS[level]["requires"] if not facts.get(field)]
|
|
1038
1145
|
missing_by_level[level] = missing
|
|
1146
|
+
field_rows = MATURITY_REQUIRED_FIELDS.get(level, [])
|
|
1147
|
+
missing_details_by_level[level] = [
|
|
1148
|
+
row
|
|
1149
|
+
for row in field_rows
|
|
1150
|
+
if row["id"] in missing
|
|
1151
|
+
]
|
|
1039
1152
|
if not missing:
|
|
1040
1153
|
achieved.append(level)
|
|
1041
1154
|
facts[level] = True
|
|
@@ -1051,7 +1164,9 @@ def maturity_status(
|
|
|
1051
1164
|
"achieved": achieved,
|
|
1052
1165
|
"next": next_level,
|
|
1053
1166
|
"levels": MATURITY_LEVELS,
|
|
1167
|
+
"required_fields": MATURITY_REQUIRED_FIELDS,
|
|
1054
1168
|
"missing_by_level": missing_by_level,
|
|
1169
|
+
"missing_details_by_level": missing_details_by_level,
|
|
1055
1170
|
}
|
|
1056
1171
|
|
|
1057
1172
|
|
|
@@ -94,6 +94,7 @@ CORE_DOCS = (
|
|
|
94
94
|
"docs/evidence/landing-map.md",
|
|
95
95
|
"docs/evidence/validations/validation-closeout-reconciliation-blocking-gate.md",
|
|
96
96
|
"docs/evidence/validations/validation-adoption-maturity-upgrade-automation.md",
|
|
97
|
+
"docs/evidence/validations/validation-adoption-maturity-required-fields.md",
|
|
97
98
|
"docs/evidence/validations/validation-github-profile-binding-orchestration.md",
|
|
98
99
|
"docs/evidence/validations/validation-github-profile-drift-reconciliation.md",
|
|
99
100
|
"docs/evidence/validations/validation-github-profile-graphql-budget-guard.md",
|
|
@@ -832,6 +833,25 @@ def require_governance_control_plane(
|
|
|
832
833
|
strong_requires = levels.get("strong", {}).get("requires") if isinstance(levels, dict) and isinstance(levels.get("strong"), dict) else None
|
|
833
834
|
if not isinstance(strong_requires, list) or "github_controlled_merge" not in strong_requires:
|
|
834
835
|
failures.append(Failure(category, f"{context}.maturity strong level must require GitHub controlled merge"))
|
|
836
|
+
required_fields = maturity.get("required_fields")
|
|
837
|
+
if not isinstance(required_fields, dict) or set(required_fields) != {"light", "standard", "strong"}:
|
|
838
|
+
failures.append(Failure(category, f"{context}.maturity required_fields must define light, standard, and strong"))
|
|
839
|
+
else:
|
|
840
|
+
for level, rows in required_fields.items():
|
|
841
|
+
if not isinstance(rows, list) or not rows:
|
|
842
|
+
failures.append(Failure(category, f"{context}.maturity required_fields.{level} must be a non-empty list"))
|
|
843
|
+
continue
|
|
844
|
+
for row in rows:
|
|
845
|
+
if not isinstance(row, dict):
|
|
846
|
+
failures.append(Failure(category, f"{context}.maturity required_fields.{level} entries must be objects"))
|
|
847
|
+
continue
|
|
848
|
+
if row.get("layer") not in {"core", "github-profile", "repo-owned-residue"}:
|
|
849
|
+
failures.append(Failure(category, f"{context}.maturity required_fields.{level} layer must be stable"))
|
|
850
|
+
if not isinstance(row.get("recommended_action"), str) or not row.get("recommended_action"):
|
|
851
|
+
failures.append(Failure(category, f"{context}.maturity required_fields.{level} entries must include recommended_action"))
|
|
852
|
+
missing_details = maturity.get("missing_details_by_level")
|
|
853
|
+
if not isinstance(missing_details, dict) or set(missing_details) != {"light", "standard", "strong"}:
|
|
854
|
+
failures.append(Failure(category, f"{context}.maturity missing_details_by_level must define light, standard, and strong"))
|
|
835
855
|
|
|
836
856
|
|
|
837
857
|
def require_locator_entry(
|
|
@@ -1364,6 +1384,8 @@ def require_governance_upgrade_payload(
|
|
|
1364
1384
|
failures.append(Failure(category, f"{context} action owner must stay within the stable set"))
|
|
1365
1385
|
if action.get("status") not in {"planned", "present"}:
|
|
1366
1386
|
failures.append(Failure(category, f"{context} action status must be planned/present"))
|
|
1387
|
+
if action.get("action") == "satisfy_missing_input" and not isinstance(action.get("recommended_action"), str):
|
|
1388
|
+
failures.append(Failure(category, f"{context} missing-input actions must include recommended_action"))
|
|
1367
1389
|
|
|
1368
1390
|
|
|
1369
1391
|
def require_review_record_contract(
|
|
@@ -3553,11 +3553,17 @@ def governance_profile_payload(target_root: Path, operation: str) -> dict[str, A
|
|
|
3553
3553
|
current = maturity.get("current")
|
|
3554
3554
|
next_level = maturity.get("next")
|
|
3555
3555
|
missing_by_level = maturity.get("missing_by_level")
|
|
3556
|
+
missing_details_by_level = maturity.get("missing_details_by_level")
|
|
3556
3557
|
missing_inputs: list[Any] = []
|
|
3558
|
+
missing_details: list[Any] = []
|
|
3557
3559
|
if operation == "upgrade-plan" and isinstance(next_level, str) and isinstance(missing_by_level, dict):
|
|
3558
3560
|
raw_missing = missing_by_level.get(next_level, [])
|
|
3559
3561
|
if isinstance(raw_missing, list):
|
|
3560
3562
|
missing_inputs = raw_missing
|
|
3563
|
+
if isinstance(missing_details_by_level, dict):
|
|
3564
|
+
raw_details = missing_details_by_level.get(next_level, [])
|
|
3565
|
+
if isinstance(raw_details, list):
|
|
3566
|
+
missing_details = raw_details
|
|
3561
3567
|
result = "pass" if not missing_inputs else "block"
|
|
3562
3568
|
summary = (
|
|
3563
3569
|
f"governance profile is already at `{current}` maturity."
|
|
@@ -3570,6 +3576,8 @@ def governance_profile_payload(target_root: Path, operation: str) -> dict[str, A
|
|
|
3570
3576
|
"result": result,
|
|
3571
3577
|
"summary": summary,
|
|
3572
3578
|
"missing_inputs": missing_inputs,
|
|
3579
|
+
"missing_details": missing_details,
|
|
3580
|
+
"recommended_action": "run governance-profile upgrade --dry-run" if result == "block" else None,
|
|
3573
3581
|
"fallback_to": None if result == "pass" else "adoption",
|
|
3574
3582
|
"maturity": maturity,
|
|
3575
3583
|
"governance_control_plane": control_plane,
|
|
@@ -3617,7 +3625,9 @@ UPGRADE_SCAFFOLD: dict[str, dict[str, str]] = {
|
|
|
3617
3625
|
|
|
3618
3626
|
def governance_upgrade_actions(target_root: Path, target_level: str, maturity: dict[str, Any]) -> list[dict[str, Any]]:
|
|
3619
3627
|
missing_by_level = maturity.get("missing_by_level")
|
|
3628
|
+
missing_details_by_level = maturity.get("missing_details_by_level")
|
|
3620
3629
|
missing = missing_by_level.get(target_level, []) if isinstance(missing_by_level, dict) else []
|
|
3630
|
+
missing_details = missing_details_by_level.get(target_level, []) if isinstance(missing_details_by_level, dict) else []
|
|
3621
3631
|
actions: list[dict[str, Any]] = []
|
|
3622
3632
|
for relative, content in UPGRADE_SCAFFOLD.items():
|
|
3623
3633
|
path = target_root / relative
|
|
@@ -3633,12 +3643,19 @@ def governance_upgrade_actions(target_root: Path, target_level: str, maturity: d
|
|
|
3633
3643
|
}
|
|
3634
3644
|
)
|
|
3635
3645
|
for item in missing if isinstance(missing, list) else []:
|
|
3646
|
+
detail = next((row for row in missing_details if isinstance(row, dict) and row.get("id") == item), {})
|
|
3636
3647
|
actions.append(
|
|
3637
3648
|
{
|
|
3638
3649
|
"action": "satisfy_missing_input",
|
|
3639
3650
|
"id": item,
|
|
3640
|
-
"owner":
|
|
3651
|
+
"owner": (
|
|
3652
|
+
"loom-owned"
|
|
3653
|
+
if str(item) in {"repo_interface", "repo_interop"}
|
|
3654
|
+
else "profile"
|
|
3655
|
+
),
|
|
3641
3656
|
"status": "planned",
|
|
3657
|
+
"layer": detail.get("layer"),
|
|
3658
|
+
"recommended_action": detail.get("recommended_action"),
|
|
3642
3659
|
"reason": f"`{target_level}` maturity currently reports this missing input.",
|
|
3643
3660
|
}
|
|
3644
3661
|
)
|
|
@@ -146,6 +146,112 @@ MATURITY_LEVELS = {
|
|
|
146
146
|
"summary": "Host-backed binding, reconciliation, controlled merge, and closeout gates are available.",
|
|
147
147
|
},
|
|
148
148
|
}
|
|
149
|
+
MATURITY_REQUIRED_FIELDS = {
|
|
150
|
+
"light": [
|
|
151
|
+
{
|
|
152
|
+
"id": "work_item",
|
|
153
|
+
"layer": "core",
|
|
154
|
+
"required": True,
|
|
155
|
+
"defaulting": "generated",
|
|
156
|
+
"recommended_action": "run loom-init or restore the Work Item carrier",
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"id": "recovery",
|
|
160
|
+
"layer": "core",
|
|
161
|
+
"required": True,
|
|
162
|
+
"defaulting": "generated",
|
|
163
|
+
"recommended_action": "restore the recovery carrier",
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"id": "status_surface",
|
|
167
|
+
"layer": "core",
|
|
168
|
+
"required": True,
|
|
169
|
+
"defaulting": "generated",
|
|
170
|
+
"recommended_action": "restore the status surface carrier",
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"id": "review",
|
|
174
|
+
"layer": "core",
|
|
175
|
+
"required": True,
|
|
176
|
+
"defaulting": "generated",
|
|
177
|
+
"recommended_action": "restore the review carrier",
|
|
178
|
+
},
|
|
179
|
+
],
|
|
180
|
+
"standard": [
|
|
181
|
+
{
|
|
182
|
+
"id": "fr_work_item_layer",
|
|
183
|
+
"layer": "github-profile",
|
|
184
|
+
"required": True,
|
|
185
|
+
"defaulting": "profile",
|
|
186
|
+
"recommended_action": "declare the FR -> Work Item split through the GitHub profile upgrade path",
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"id": "spec_path",
|
|
190
|
+
"layer": "core",
|
|
191
|
+
"required": True,
|
|
192
|
+
"defaulting": "generated",
|
|
193
|
+
"recommended_action": "install formal spec scaffold",
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"id": "plan_path",
|
|
197
|
+
"layer": "core",
|
|
198
|
+
"required": True,
|
|
199
|
+
"defaulting": "generated",
|
|
200
|
+
"recommended_action": "install execution plan scaffold",
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"id": "spec_gate",
|
|
204
|
+
"layer": "core",
|
|
205
|
+
"required": True,
|
|
206
|
+
"defaulting": "generated",
|
|
207
|
+
"recommended_action": "record or restore the spec review gate",
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"id": "status_control_plane",
|
|
211
|
+
"layer": "core",
|
|
212
|
+
"required": True,
|
|
213
|
+
"defaulting": "builtin",
|
|
214
|
+
"recommended_action": "run loom_status or loom_check to rebuild the status control plane",
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"id": "basic_host_binding",
|
|
218
|
+
"layer": "github-profile",
|
|
219
|
+
"required": True,
|
|
220
|
+
"defaulting": "profile",
|
|
221
|
+
"recommended_action": "run governance-profile binding and repair missing host bindings",
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
"id": "closeout_reconciliation_read",
|
|
225
|
+
"layer": "github-profile",
|
|
226
|
+
"required": True,
|
|
227
|
+
"defaulting": "profile",
|
|
228
|
+
"recommended_action": "install repo interop so closeout can consume reconciliation",
|
|
229
|
+
},
|
|
230
|
+
],
|
|
231
|
+
"strong": [
|
|
232
|
+
{
|
|
233
|
+
"id": "repo_interface",
|
|
234
|
+
"layer": "repo-owned-residue",
|
|
235
|
+
"required": True,
|
|
236
|
+
"defaulting": "scaffold",
|
|
237
|
+
"recommended_action": "install or repair the repo companion interface",
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"id": "repo_interop",
|
|
241
|
+
"layer": "repo-owned-residue",
|
|
242
|
+
"required": True,
|
|
243
|
+
"defaulting": "scaffold",
|
|
244
|
+
"recommended_action": "install or repair the repo interop contract",
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"id": "github_controlled_merge",
|
|
248
|
+
"layer": "github-profile",
|
|
249
|
+
"required": True,
|
|
250
|
+
"defaulting": "host",
|
|
251
|
+
"recommended_action": "enable controlled merge binding and required host gates",
|
|
252
|
+
},
|
|
253
|
+
],
|
|
254
|
+
}
|
|
149
255
|
|
|
150
256
|
|
|
151
257
|
def run_process(args: list[str], cwd: Path) -> subprocess.CompletedProcess[str]:
|
|
@@ -1033,9 +1139,16 @@ def maturity_status(
|
|
|
1033
1139
|
}
|
|
1034
1140
|
achieved: list[str] = []
|
|
1035
1141
|
missing_by_level: dict[str, list[str]] = {}
|
|
1142
|
+
missing_details_by_level: dict[str, list[dict[str, Any]]] = {}
|
|
1036
1143
|
for level in ("light", "standard", "strong"):
|
|
1037
1144
|
missing = [field for field in MATURITY_LEVELS[level]["requires"] if not facts.get(field)]
|
|
1038
1145
|
missing_by_level[level] = missing
|
|
1146
|
+
field_rows = MATURITY_REQUIRED_FIELDS.get(level, [])
|
|
1147
|
+
missing_details_by_level[level] = [
|
|
1148
|
+
row
|
|
1149
|
+
for row in field_rows
|
|
1150
|
+
if row["id"] in missing
|
|
1151
|
+
]
|
|
1039
1152
|
if not missing:
|
|
1040
1153
|
achieved.append(level)
|
|
1041
1154
|
facts[level] = True
|
|
@@ -1051,7 +1164,9 @@ def maturity_status(
|
|
|
1051
1164
|
"achieved": achieved,
|
|
1052
1165
|
"next": next_level,
|
|
1053
1166
|
"levels": MATURITY_LEVELS,
|
|
1167
|
+
"required_fields": MATURITY_REQUIRED_FIELDS,
|
|
1054
1168
|
"missing_by_level": missing_by_level,
|
|
1169
|
+
"missing_details_by_level": missing_details_by_level,
|
|
1055
1170
|
}
|
|
1056
1171
|
|
|
1057
1172
|
|