clearotron 0.3.2-beta.7 → 0.3.2-beta.8
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/.env.example +24 -23
- package/INSTALL.md +142 -75
- package/README.md +3 -3
- package/bin/onboard.mjs +637 -216
- package/bin/start.mjs +133 -23
- package/bin/update.mjs +58 -11
- package/build-info.json +2 -2
- package/docs/architecture/04-configuration-reference.md +26 -11
- package/docs/architecture/05-config-governance.md +17 -7
- package/driver/CHANGELOG.md +76 -0
- package/driver/band-size.mjs +59 -0
- package/driver/config-inventory.mjs +112 -9
- package/driver/contract-arm2-baseline.json +1 -3
- package/driver/contract-e3-backlog.mjs +26 -26
- package/driver/contract-vocabulary.mjs +44 -10
- package/driver/door-gates.mjs +41 -7
- package/driver/driver.config.mjs +272 -59
- package/driver/engine/CONTRACT.md +10 -3
- package/driver/engine/README.md +2 -2
- package/driver/engine/anthropic-agent.mjs +77 -21
- package/driver/engine/auth.mjs +129 -10
- package/driver/engine/jx-turn.mjs +7 -6
- package/driver/engine/mcp/recording-server.mjs +13 -0
- package/driver/engine/openai-agent.mjs +4 -2
- package/driver/engine/probe.mjs +110 -23
- package/driver/findings-model.mjs +1 -1
- package/driver/flag-snapshot.mjs +28 -5
- package/driver/gateway.mjs +24 -18
- package/driver/jx-lanes.mjs +21 -2
- package/driver/jx-units.mjs +6 -3
- package/driver/jx.mjs +4 -2
- package/driver/matter-frame-record.mjs +90 -1
- package/driver/named-band.mjs +34 -2
- package/driver/package.json +1 -1
- package/driver/pipeline.mjs +200 -23
- package/driver/portal-config-view.mjs +30 -1
- package/driver/portal-report.mjs +15 -1
- package/driver/portal-service.mjs +46 -6
- package/driver/predelivery-lint.mjs +12 -2
- package/driver/publish/index.mjs +46 -5
- package/driver/publish/knockout.mjs +10 -1
- package/driver/publish/render-knockout.mjs +69 -7
- package/driver/publish/render.mjs +170 -59
- package/driver/publish/report-data.mjs +4 -1
- package/driver/publish/report-topbar.mjs +58 -0
- package/driver/publish/templates/report.css +18 -1
- package/driver/publish/xlsx.mjs +13 -1
- package/driver/register-availability.mjs +2 -2
- package/driver/register-coverage.mjs +94 -1
- package/driver/register-digest-record.mjs +236 -11
- package/driver/register-plan.mjs +170 -0
- package/driver/result-noun-fields.mjs +2 -2
- package/driver/run-economics.mjs +41 -10
- package/driver/run-requirements.mjs +173 -9
- package/driver/runner.mjs +3 -3
- package/driver/stages.mjs +12 -8
- package/driver/suite-census.json +142 -64
- package/driver/systemd/README.md +7 -4
- package/driver/terminal-clamp.mjs +107 -1
- package/driver/tokens.mjs +169 -3
- package/driver/unit-environment.mjs +42 -15
- package/driver/unit-inventory.mjs +19 -2
- package/driver/verify.mjs +27 -0
- package/mcp-server/CHANGELOG.md +4 -0
- package/mcp-server/package.json +1 -1
- package/mcp-server/server.mjs +15 -1
- package/package.json +1 -1
- package/portal-ui/dist/assets/{index-5UyqAyNM.js → index-6jzO9HiX.js} +155 -79
- package/portal-ui/dist/index.html +1 -1
- package/portal-ui/package.json +1 -1
- package/providers/jx/README.md +2 -1
- package/providers/jx/src/turn-envelope.mjs +8 -3
- package/providers/oauth-mcp-bridge/CHANGELOG.md +4 -0
- package/providers/oauth-mcp-bridge/package.json +1 -1
- package/providers/uspto-local/README.md +1 -1
- package/scripts/authority-boundary-probe.mjs +4 -2
- package/scripts/env-audit.mjs +12 -6
- package/scripts/freeze-example-run.mjs +49 -16
- package/scripts/generated-files-are-current.mjs +69 -4
- package/scripts/settings-render-check.mjs +75 -2
- package/scripts/test-full.mjs +96 -3
- package/scripts/test-run.mjs +10 -0
- package/shared/deployment-box.mjs +7 -2
- package/shared/driver-dir.mjs +1 -1
- package/shared/names-in-force.mjs +1 -1
package/driver/suite-census.json
CHANGED
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
"ext": "mjs",
|
|
23
23
|
"perFile": {
|
|
24
24
|
"a-backgrounded-install-can-actually-run-a-clearance.test.mjs": {
|
|
25
|
-
"tests":
|
|
26
|
-
"asserts":
|
|
25
|
+
"tests": 10,
|
|
26
|
+
"asserts": 46,
|
|
27
27
|
"skips": 0,
|
|
28
28
|
"todos": 0
|
|
29
29
|
},
|
|
@@ -70,8 +70,8 @@
|
|
|
70
70
|
"todos": 0
|
|
71
71
|
},
|
|
72
72
|
"a-budget-is-recorded-beside-the-band-it-ran-against.test.mjs": {
|
|
73
|
-
"tests":
|
|
74
|
-
"asserts":
|
|
73
|
+
"tests": 12,
|
|
74
|
+
"asserts": 42,
|
|
75
75
|
"skips": 0,
|
|
76
76
|
"todos": 0
|
|
77
77
|
},
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
},
|
|
102
102
|
"a-capture-that-stopped-describing-the-box-says-so.test.mjs": {
|
|
103
103
|
"tests": 16,
|
|
104
|
-
"asserts":
|
|
104
|
+
"asserts": 34,
|
|
105
105
|
"skips": 0,
|
|
106
106
|
"todos": 0
|
|
107
107
|
},
|
|
@@ -142,8 +142,20 @@
|
|
|
142
142
|
"todos": 0
|
|
143
143
|
},
|
|
144
144
|
"a-client-condition-never-carries-an-engine-token.test.mjs": {
|
|
145
|
-
"tests":
|
|
146
|
-
"asserts":
|
|
145
|
+
"tests": 9,
|
|
146
|
+
"asserts": 24,
|
|
147
|
+
"skips": 0,
|
|
148
|
+
"todos": 0
|
|
149
|
+
},
|
|
150
|
+
"a-cloud-account-bills-as-itself.test.mjs": {
|
|
151
|
+
"tests": 18,
|
|
152
|
+
"asserts": 121,
|
|
153
|
+
"skips": 0,
|
|
154
|
+
"todos": 0
|
|
155
|
+
},
|
|
156
|
+
"a-cloud-billed-install-carries-its-cloud-to-the-services.test.mjs": {
|
|
157
|
+
"tests": 17,
|
|
158
|
+
"asserts": 111,
|
|
147
159
|
"skips": 0,
|
|
148
160
|
"todos": 0
|
|
149
161
|
},
|
|
@@ -461,7 +473,7 @@
|
|
|
461
473
|
},
|
|
462
474
|
"a-mid-run-mint-cannot-lose-a-mark.test.mjs": {
|
|
463
475
|
"tests": 10,
|
|
464
|
-
"asserts":
|
|
476
|
+
"asserts": 20,
|
|
465
477
|
"skips": 0,
|
|
466
478
|
"todos": 0
|
|
467
479
|
},
|
|
@@ -599,7 +611,7 @@
|
|
|
599
611
|
},
|
|
600
612
|
"a-real-dispatch-records-the-tool-that-served-it.test.mjs": {
|
|
601
613
|
"tests": 1,
|
|
602
|
-
"asserts":
|
|
614
|
+
"asserts": 6,
|
|
603
615
|
"skips": 0,
|
|
604
616
|
"todos": 0
|
|
605
617
|
},
|
|
@@ -743,7 +755,7 @@
|
|
|
743
755
|
},
|
|
744
756
|
"a-run-records-the-tool-that-served-it.test.mjs": {
|
|
745
757
|
"tests": 13,
|
|
746
|
-
"asserts":
|
|
758
|
+
"asserts": 33,
|
|
747
759
|
"skips": 0,
|
|
748
760
|
"todos": 0
|
|
749
761
|
},
|
|
@@ -891,6 +903,12 @@
|
|
|
891
903
|
"skips": 0,
|
|
892
904
|
"todos": 0
|
|
893
905
|
},
|
|
906
|
+
"a-turn-the-program-answers-itself-names-no-model.test.mjs": {
|
|
907
|
+
"tests": 5,
|
|
908
|
+
"asserts": 16,
|
|
909
|
+
"skips": 0,
|
|
910
|
+
"todos": 0
|
|
911
|
+
},
|
|
894
912
|
"a-two-form-matter-owes-a-read-per-form.test.mjs": {
|
|
895
913
|
"tests": 8,
|
|
896
914
|
"asserts": 25,
|
|
@@ -964,8 +982,8 @@
|
|
|
964
982
|
"todos": 0
|
|
965
983
|
},
|
|
966
984
|
"ab-tooling-honesty.test.mjs": {
|
|
967
|
-
"tests":
|
|
968
|
-
"asserts":
|
|
985
|
+
"tests": 16,
|
|
986
|
+
"asserts": 78,
|
|
969
987
|
"skips": 0,
|
|
970
988
|
"todos": 0
|
|
971
989
|
},
|
|
@@ -1041,6 +1059,12 @@
|
|
|
1041
1059
|
"skips": 0,
|
|
1042
1060
|
"todos": 0
|
|
1043
1061
|
},
|
|
1062
|
+
"an-engine-program-installed-with-clearotron-is-the-last-resort.test.mjs": {
|
|
1063
|
+
"tests": 13,
|
|
1064
|
+
"asserts": 47,
|
|
1065
|
+
"skips": 0,
|
|
1066
|
+
"todos": 0
|
|
1067
|
+
},
|
|
1044
1068
|
"an-environment-read-through-optional-chaining-is-a-read.test.mjs": {
|
|
1045
1069
|
"tests": 6,
|
|
1046
1070
|
"asserts": 19,
|
|
@@ -1150,8 +1174,8 @@
|
|
|
1150
1174
|
"todos": 0
|
|
1151
1175
|
},
|
|
1152
1176
|
"audit-workbook-commonlaw-unlogged.test.mjs": {
|
|
1153
|
-
"tests":
|
|
1154
|
-
"asserts":
|
|
1177
|
+
"tests": 9,
|
|
1178
|
+
"asserts": 37,
|
|
1155
1179
|
"skips": 0,
|
|
1156
1180
|
"todos": 0
|
|
1157
1181
|
},
|
|
@@ -1929,6 +1953,12 @@
|
|
|
1929
1953
|
"skips": 0,
|
|
1930
1954
|
"todos": 0
|
|
1931
1955
|
},
|
|
1956
|
+
"doctor-and-start-look-where-the-services-look.test.mjs": {
|
|
1957
|
+
"tests": 12,
|
|
1958
|
+
"asserts": 28,
|
|
1959
|
+
"skips": 0,
|
|
1960
|
+
"todos": 0
|
|
1961
|
+
},
|
|
1932
1962
|
"doctor-names-who-is-in-the-store.test.mjs": {
|
|
1933
1963
|
"tests": 5,
|
|
1934
1964
|
"asserts": 15,
|
|
@@ -1937,7 +1967,7 @@
|
|
|
1937
1967
|
},
|
|
1938
1968
|
"doctor-reads-the-units-not-the-shell.test.mjs": {
|
|
1939
1969
|
"tests": 40,
|
|
1940
|
-
"asserts":
|
|
1970
|
+
"asserts": 116,
|
|
1941
1971
|
"skips": 1,
|
|
1942
1972
|
"todos": 0
|
|
1943
1973
|
},
|
|
@@ -2146,8 +2176,8 @@
|
|
|
2146
2176
|
"todos": 0
|
|
2147
2177
|
},
|
|
2148
2178
|
"engine-probe.test.mjs": {
|
|
2149
|
-
"tests":
|
|
2150
|
-
"asserts":
|
|
2179
|
+
"tests": 30,
|
|
2180
|
+
"asserts": 143,
|
|
2151
2181
|
"skips": 0,
|
|
2152
2182
|
"todos": 0
|
|
2153
2183
|
},
|
|
@@ -2159,7 +2189,7 @@
|
|
|
2159
2189
|
},
|
|
2160
2190
|
"engine.anthropic.test.mjs": {
|
|
2161
2191
|
"tests": 65,
|
|
2162
|
-
"asserts":
|
|
2192
|
+
"asserts": 239,
|
|
2163
2193
|
"skips": 0,
|
|
2164
2194
|
"todos": 0
|
|
2165
2195
|
},
|
|
@@ -2488,8 +2518,8 @@
|
|
|
2488
2518
|
"todos": 0
|
|
2489
2519
|
},
|
|
2490
2520
|
"freeze-example-run.test.mjs": {
|
|
2491
|
-
"tests":
|
|
2492
|
-
"asserts":
|
|
2521
|
+
"tests": 10,
|
|
2522
|
+
"asserts": 47,
|
|
2493
2523
|
"skips": 0,
|
|
2494
2524
|
"todos": 0
|
|
2495
2525
|
},
|
|
@@ -2782,8 +2812,8 @@
|
|
|
2782
2812
|
"todos": 0
|
|
2783
2813
|
},
|
|
2784
2814
|
"matter-frame-record.test.mjs": {
|
|
2785
|
-
"tests":
|
|
2786
|
-
"asserts":
|
|
2815
|
+
"tests": 24,
|
|
2816
|
+
"asserts": 81,
|
|
2787
2817
|
"skips": 0,
|
|
2788
2818
|
"todos": 0
|
|
2789
2819
|
},
|
|
@@ -2836,8 +2866,8 @@
|
|
|
2836
2866
|
"todos": 0
|
|
2837
2867
|
},
|
|
2838
2868
|
"named-band.test.mjs": {
|
|
2839
|
-
"tests":
|
|
2840
|
-
"asserts":
|
|
2869
|
+
"tests": 22,
|
|
2870
|
+
"asserts": 78,
|
|
2841
2871
|
"skips": 0,
|
|
2842
2872
|
"todos": 0
|
|
2843
2873
|
},
|
|
@@ -2914,8 +2944,8 @@
|
|
|
2914
2944
|
"todos": 0
|
|
2915
2945
|
},
|
|
2916
2946
|
"onboard-wizard.test.mjs": {
|
|
2917
|
-
"tests":
|
|
2918
|
-
"asserts":
|
|
2947
|
+
"tests": 77,
|
|
2948
|
+
"asserts": 293,
|
|
2919
2949
|
"skips": 2,
|
|
2920
2950
|
"todos": 0
|
|
2921
2951
|
},
|
|
@@ -3070,8 +3100,8 @@
|
|
|
3070
3100
|
"todos": 0
|
|
3071
3101
|
},
|
|
3072
3102
|
"pipeline.mock.registergap.test.mjs": {
|
|
3073
|
-
"tests":
|
|
3074
|
-
"asserts":
|
|
3103
|
+
"tests": 6,
|
|
3104
|
+
"asserts": 34,
|
|
3075
3105
|
"skips": 0,
|
|
3076
3106
|
"todos": 0
|
|
3077
3107
|
},
|
|
@@ -3124,8 +3154,8 @@
|
|
|
3124
3154
|
"todos": 0
|
|
3125
3155
|
},
|
|
3126
3156
|
"plan-qid-is-an-identity.test.mjs": {
|
|
3127
|
-
"tests":
|
|
3128
|
-
"asserts":
|
|
3157
|
+
"tests": 17,
|
|
3158
|
+
"asserts": 56,
|
|
3129
3159
|
"skips": 0,
|
|
3130
3160
|
"todos": 0
|
|
3131
3161
|
},
|
|
@@ -3166,8 +3196,8 @@
|
|
|
3166
3196
|
"todos": 0
|
|
3167
3197
|
},
|
|
3168
3198
|
"portal-config-view.test.mjs": {
|
|
3169
|
-
"tests":
|
|
3170
|
-
"asserts":
|
|
3199
|
+
"tests": 37,
|
|
3200
|
+
"asserts": 106,
|
|
3171
3201
|
"skips": 0,
|
|
3172
3202
|
"todos": 0
|
|
3173
3203
|
},
|
|
@@ -3220,8 +3250,8 @@
|
|
|
3220
3250
|
"todos": 0
|
|
3221
3251
|
},
|
|
3222
3252
|
"portal-service.test.mjs": {
|
|
3223
|
-
"tests":
|
|
3224
|
-
"asserts":
|
|
3253
|
+
"tests": 130,
|
|
3254
|
+
"asserts": 695,
|
|
3225
3255
|
"skips": 1,
|
|
3226
3256
|
"todos": 0
|
|
3227
3257
|
},
|
|
@@ -3634,8 +3664,8 @@
|
|
|
3634
3664
|
"todos": 0
|
|
3635
3665
|
},
|
|
3636
3666
|
"register-digest-record.test.mjs": {
|
|
3637
|
-
"tests":
|
|
3638
|
-
"asserts":
|
|
3667
|
+
"tests": 40,
|
|
3668
|
+
"asserts": 152,
|
|
3639
3669
|
"skips": 0,
|
|
3640
3670
|
"todos": 0
|
|
3641
3671
|
},
|
|
@@ -3669,6 +3699,12 @@
|
|
|
3669
3699
|
"skips": 0,
|
|
3670
3700
|
"todos": 0
|
|
3671
3701
|
},
|
|
3702
|
+
"register-reach-refusal.test.mjs": {
|
|
3703
|
+
"tests": 13,
|
|
3704
|
+
"asserts": 26,
|
|
3705
|
+
"skips": 0,
|
|
3706
|
+
"todos": 0
|
|
3707
|
+
},
|
|
3672
3708
|
"register-record-log-run-scoped.test.mjs": {
|
|
3673
3709
|
"tests": 9,
|
|
3674
3710
|
"asserts": 21,
|
|
@@ -3742,8 +3778,8 @@
|
|
|
3742
3778
|
"todos": 0
|
|
3743
3779
|
},
|
|
3744
3780
|
"render.test.mjs": {
|
|
3745
|
-
"tests":
|
|
3746
|
-
"asserts":
|
|
3781
|
+
"tests": 152,
|
|
3782
|
+
"asserts": 611,
|
|
3747
3783
|
"skips": 0,
|
|
3748
3784
|
"todos": 0
|
|
3749
3785
|
},
|
|
@@ -3916,8 +3952,8 @@
|
|
|
3916
3952
|
"todos": 0
|
|
3917
3953
|
},
|
|
3918
3954
|
"run-economics.test.mjs": {
|
|
3919
|
-
"tests":
|
|
3920
|
-
"asserts":
|
|
3955
|
+
"tests": 25,
|
|
3956
|
+
"asserts": 158,
|
|
3921
3957
|
"skips": 0,
|
|
3922
3958
|
"todos": 0
|
|
3923
3959
|
},
|
|
@@ -4233,6 +4269,18 @@
|
|
|
4233
4269
|
"skips": 0,
|
|
4234
4270
|
"todos": 0
|
|
4235
4271
|
},
|
|
4272
|
+
"setup-asks-how-claude-is-paid.test.mjs": {
|
|
4273
|
+
"tests": 14,
|
|
4274
|
+
"asserts": 96,
|
|
4275
|
+
"skips": 0,
|
|
4276
|
+
"todos": 0
|
|
4277
|
+
},
|
|
4278
|
+
"setup-asks-which-ai-runs-your-searches.test.mjs": {
|
|
4279
|
+
"tests": 12,
|
|
4280
|
+
"asserts": 58,
|
|
4281
|
+
"skips": 0,
|
|
4282
|
+
"todos": 0
|
|
4283
|
+
},
|
|
4236
4284
|
"shipped-brand-is-the-product.test.mjs": {
|
|
4237
4285
|
"tests": 7,
|
|
4238
4286
|
"asserts": 24,
|
|
@@ -4396,8 +4444,8 @@
|
|
|
4396
4444
|
"todos": 0
|
|
4397
4445
|
},
|
|
4398
4446
|
"suite-cannot-reach-a-real-engine.test.mjs": {
|
|
4399
|
-
"tests":
|
|
4400
|
-
"asserts":
|
|
4447
|
+
"tests": 11,
|
|
4448
|
+
"asserts": 31,
|
|
4401
4449
|
"skips": 0,
|
|
4402
4450
|
"todos": 0
|
|
4403
4451
|
},
|
|
@@ -4504,8 +4552,8 @@
|
|
|
4504
4552
|
"todos": 0
|
|
4505
4553
|
},
|
|
4506
4554
|
"test-full-runs-every-corpus-or-names-the-one-it-did-not.test.mjs": {
|
|
4507
|
-
"tests":
|
|
4508
|
-
"asserts":
|
|
4555
|
+
"tests": 17,
|
|
4556
|
+
"asserts": 54,
|
|
4509
4557
|
"skips": 0,
|
|
4510
4558
|
"todos": 0
|
|
4511
4559
|
},
|
|
@@ -4528,14 +4576,14 @@
|
|
|
4528
4576
|
"todos": 0
|
|
4529
4577
|
},
|
|
4530
4578
|
"the-advice-fits-the-machine-it-is-printed-on.test.mjs": {
|
|
4531
|
-
"tests":
|
|
4532
|
-
"asserts":
|
|
4579
|
+
"tests": 17,
|
|
4580
|
+
"asserts": 67,
|
|
4533
4581
|
"skips": 0,
|
|
4534
4582
|
"todos": 0
|
|
4535
4583
|
},
|
|
4536
4584
|
"the-allowance-line-is-the-servers-words.test.mjs": {
|
|
4537
4585
|
"tests": 2,
|
|
4538
|
-
"asserts":
|
|
4586
|
+
"asserts": 5,
|
|
4539
4587
|
"skips": 0,
|
|
4540
4588
|
"todos": 0
|
|
4541
4589
|
},
|
|
@@ -4827,6 +4875,12 @@
|
|
|
4827
4875
|
"skips": 0,
|
|
4828
4876
|
"todos": 0
|
|
4829
4877
|
},
|
|
4878
|
+
"the-install-pages-describe-the-install-this-build-performs.test.mjs": {
|
|
4879
|
+
"tests": 11,
|
|
4880
|
+
"asserts": 89,
|
|
4881
|
+
"skips": 0,
|
|
4882
|
+
"todos": 0
|
|
4883
|
+
},
|
|
4830
4884
|
"the-install-places-what-a-server-needs.test.mjs": {
|
|
4831
4885
|
"tests": 22,
|
|
4832
4886
|
"asserts": 51,
|
|
@@ -4840,14 +4894,14 @@
|
|
|
4840
4894
|
"todos": 0
|
|
4841
4895
|
},
|
|
4842
4896
|
"the-inventory-names-the-units-this-box-runs.test.mjs": {
|
|
4843
|
-
"tests":
|
|
4844
|
-
"asserts":
|
|
4897
|
+
"tests": 22,
|
|
4898
|
+
"asserts": 63,
|
|
4845
4899
|
"skips": 0,
|
|
4846
4900
|
"todos": 0
|
|
4847
4901
|
},
|
|
4848
4902
|
"the-knockout-page-leads-with-the-read.test.mjs": {
|
|
4849
|
-
"tests":
|
|
4850
|
-
"asserts":
|
|
4903
|
+
"tests": 38,
|
|
4904
|
+
"asserts": 117,
|
|
4851
4905
|
"skips": 0,
|
|
4852
4906
|
"todos": 0
|
|
4853
4907
|
},
|
|
@@ -5061,12 +5115,24 @@
|
|
|
5061
5115
|
"skips": 0,
|
|
5062
5116
|
"todos": 0
|
|
5063
5117
|
},
|
|
5118
|
+
"the-report-names-the-models-that-served-it.test.mjs": {
|
|
5119
|
+
"tests": 37,
|
|
5120
|
+
"asserts": 111,
|
|
5121
|
+
"skips": 0,
|
|
5122
|
+
"todos": 0
|
|
5123
|
+
},
|
|
5064
5124
|
"the-report-shell-keeps-what-a-repair-does-not-resend.test.mjs": {
|
|
5065
5125
|
"tests": 6,
|
|
5066
5126
|
"asserts": 28,
|
|
5067
5127
|
"skips": 0,
|
|
5068
5128
|
"todos": 0
|
|
5069
5129
|
},
|
|
5130
|
+
"the-retired-azure-settings-are-read-by-nothing.test.mjs": {
|
|
5131
|
+
"tests": 3,
|
|
5132
|
+
"asserts": 14,
|
|
5133
|
+
"skips": 0,
|
|
5134
|
+
"todos": 0
|
|
5135
|
+
},
|
|
5070
5136
|
"the-reviewing-pass-reads-the-lines-a-client-sees-first.test.mjs": {
|
|
5071
5137
|
"tests": 10,
|
|
5072
5138
|
"asserts": 27,
|
|
@@ -5398,8 +5464,8 @@
|
|
|
5398
5464
|
"todos": 0
|
|
5399
5465
|
},
|
|
5400
5466
|
"update-refuses-on-a-packaged-install.test.mjs": {
|
|
5401
|
-
"tests":
|
|
5402
|
-
"asserts":
|
|
5467
|
+
"tests": 10,
|
|
5468
|
+
"asserts": 32,
|
|
5403
5469
|
"skips": 0,
|
|
5404
5470
|
"todos": 0
|
|
5405
5471
|
},
|
|
@@ -5506,8 +5572,8 @@
|
|
|
5506
5572
|
"todos": 0
|
|
5507
5573
|
},
|
|
5508
5574
|
"what-doctor-passes-a-search-accepts.test.mjs": {
|
|
5509
|
-
"tests":
|
|
5510
|
-
"asserts":
|
|
5575
|
+
"tests": 15,
|
|
5576
|
+
"asserts": 49,
|
|
5511
5577
|
"skips": 0,
|
|
5512
5578
|
"todos": 0
|
|
5513
5579
|
},
|
|
@@ -5607,8 +5673,8 @@
|
|
|
5607
5673
|
"todos": 0
|
|
5608
5674
|
},
|
|
5609
5675
|
"a-run-list-names-its-client.test.mjs": {
|
|
5610
|
-
"tests":
|
|
5611
|
-
"asserts":
|
|
5676
|
+
"tests": 5,
|
|
5677
|
+
"asserts": 35,
|
|
5612
5678
|
"skips": 0,
|
|
5613
5679
|
"todos": 0
|
|
5614
5680
|
},
|
|
@@ -5911,6 +5977,12 @@
|
|
|
5911
5977
|
"skips": 0,
|
|
5912
5978
|
"todos": 0
|
|
5913
5979
|
},
|
|
5980
|
+
"allowanceParity.test.ts": {
|
|
5981
|
+
"tests": 2,
|
|
5982
|
+
"asserts": 6,
|
|
5983
|
+
"skips": 0,
|
|
5984
|
+
"todos": 0
|
|
5985
|
+
},
|
|
5914
5986
|
"api.test.ts": {
|
|
5915
5987
|
"tests": 46,
|
|
5916
5988
|
"asserts": 187,
|
|
@@ -5966,8 +6038,8 @@
|
|
|
5966
6038
|
"todos": 0
|
|
5967
6039
|
},
|
|
5968
6040
|
"composerProduct.test.ts": {
|
|
5969
|
-
"tests":
|
|
5970
|
-
"asserts":
|
|
6041
|
+
"tests": 37,
|
|
6042
|
+
"asserts": 147,
|
|
5971
6043
|
"skips": 0,
|
|
5972
6044
|
"todos": 0
|
|
5973
6045
|
},
|
|
@@ -6008,8 +6080,8 @@
|
|
|
6008
6080
|
"todos": 0
|
|
6009
6081
|
},
|
|
6010
6082
|
"engineState.test.ts": {
|
|
6011
|
-
"tests":
|
|
6012
|
-
"asserts":
|
|
6083
|
+
"tests": 12,
|
|
6084
|
+
"asserts": 50,
|
|
6013
6085
|
"skips": 0,
|
|
6014
6086
|
"todos": 0
|
|
6015
6087
|
},
|
|
@@ -6037,6 +6109,12 @@
|
|
|
6037
6109
|
"skips": 0,
|
|
6038
6110
|
"todos": 0
|
|
6039
6111
|
},
|
|
6112
|
+
"geographyStampParity.test.ts": {
|
|
6113
|
+
"tests": 1,
|
|
6114
|
+
"asserts": 3,
|
|
6115
|
+
"skips": 0,
|
|
6116
|
+
"todos": 0
|
|
6117
|
+
},
|
|
6040
6118
|
"grouping.test.ts": {
|
|
6041
6119
|
"tests": 27,
|
|
6042
6120
|
"asserts": 70,
|
|
@@ -6111,7 +6189,7 @@
|
|
|
6111
6189
|
},
|
|
6112
6190
|
"nav.test.ts": {
|
|
6113
6191
|
"tests": 15,
|
|
6114
|
-
"asserts":
|
|
6192
|
+
"asserts": 94,
|
|
6115
6193
|
"skips": 0,
|
|
6116
6194
|
"todos": 0
|
|
6117
6195
|
},
|
|
@@ -6213,7 +6291,7 @@
|
|
|
6213
6291
|
},
|
|
6214
6292
|
"registerCoverage.test.ts": {
|
|
6215
6293
|
"tests": 12,
|
|
6216
|
-
"asserts":
|
|
6294
|
+
"asserts": 40,
|
|
6217
6295
|
"skips": 0,
|
|
6218
6296
|
"todos": 0
|
|
6219
6297
|
},
|
|
@@ -6237,7 +6315,7 @@
|
|
|
6237
6315
|
},
|
|
6238
6316
|
"screenCopy.test.ts": {
|
|
6239
6317
|
"tests": 63,
|
|
6240
|
-
"asserts":
|
|
6318
|
+
"asserts": 243,
|
|
6241
6319
|
"skips": 0,
|
|
6242
6320
|
"todos": 0
|
|
6243
6321
|
},
|
package/driver/systemd/README.md
CHANGED
|
@@ -153,10 +153,13 @@ checkout by a debugging session cannot quietly reconfigure the queue drain.
|
|
|
153
153
|
|
|
154
154
|
**If the service fails to start**, `systemctl --user status prelim-driver.service` names the reason.
|
|
155
155
|
The two that have actually happened: `CLEAROTRON_CHECKOUT_DIR` unset — so `ExecStart` resolves to
|
|
156
|
-
`/driver/runner.mjs`, which does not exist — and `claude`
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
156
|
+
`/driver/runner.mjs`, which does not exist — and no `claude` the unit can find, which is not a start
|
|
157
|
+
failure at all but shows later as every stage burning its retry ladder for zero tokens. `clearotron
|
|
158
|
+
install` offers to install the chosen engine's program into `~/.local/share/clearotron/engines`, and the
|
|
159
|
+
unit uses that copy when its `PATH` has none, so the second happens only when that offer was declined.
|
|
160
|
+
Accept it by running `clearotron install` again, or set `CLEAROTRON_CLAUDE_PATH`
|
|
161
|
+
in `~/.env` to the binary's absolute path; the unit's `PATH` already covers `~/.local/bin` and
|
|
162
|
+
`~/.npm-global/bin`, the two layouts the documents permit.
|
|
160
163
|
|
|
161
164
|
### `profile-service.service` needs its checkout path edited by hand
|
|
162
165
|
|
|
@@ -87,6 +87,36 @@ export function recordNamesDefect(record) {
|
|
|
87
87
|
return typeof record?.defect === "string" && record.defect.trim().length > 0 && record?.delivered === true;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* The conditions `clientConditions` could NOT render, so the surface does not carry them. PURE.
|
|
93
|
+
*
|
|
94
|
+
* A REFUSAL NOBODY RECORDS IS THE DEFECT ONE LAYER ALONG. The fallback drops a token-bearing reason it
|
|
95
|
+
* cannot compose a sentence for, which is the right answer for the client and a silent loss for
|
|
96
|
+
* everyone else: the condition was in the run record, it applies, and the delivered page no longer says
|
|
97
|
+
* so. Before this, the operator's signal was the voice lint flagging the token on the page. Take the
|
|
98
|
+
* token off the page and that flag goes quiet — the gap would be closed and the disclosure would go
|
|
99
|
+
* with it, with nothing in between to say which. So the drop reports itself here, the lint reads it,
|
|
100
|
+
* and the run record keeps the reason either way.
|
|
101
|
+
*
|
|
102
|
+
* @param {{reasons?: string[], clauses?: string[]}} sidecar the parsed `_driver/verdict.json`
|
|
103
|
+
* @returns {string[]} the run-record reasons that reach no client surface
|
|
104
|
+
*/
|
|
105
|
+
// IT DECIDES THE SAME THREE THINGS `clientConditions` DECIDES, and they have to keep agreeing: what
|
|
106
|
+
// counts as a stored clause, what counts as an empty reason, and which reasons the authority can
|
|
107
|
+
// render. The third cannot drift — both call `clauseFromReason` — and the first two are the two lines
|
|
108
|
+
// below. A change to either belongs in both, and arm 9 drives them together against one sidecar.
|
|
109
|
+
export function unrenderableConditions({ reasons, clauses } = {}) {
|
|
110
|
+
const rs = Array.isArray(reasons) ? reasons : [];
|
|
111
|
+
const cs = Array.isArray(clauses) ? clauses : [];
|
|
112
|
+
return rs.filter((r, i) => {
|
|
113
|
+
if (typeof cs[i] === "string" && cs[i].trim()) return false;
|
|
114
|
+
const text = String(r ?? "").trim();
|
|
115
|
+
if (!text) return false;
|
|
116
|
+
return !clauseFromReason(text) && ENGINE_TOKEN_RE.test(text);
|
|
117
|
+
}).map((r) => String(r).trim());
|
|
118
|
+
}
|
|
119
|
+
|
|
90
120
|
/**
|
|
91
121
|
* THE LEDE IS THE OPINION'S, BY DECISION AND NOT BY PUSH ORDER. The terminal guards run
|
|
92
122
|
* earlier in the delivery block than the coverage floor, so their clauses landed at index 0 and the
|
|
@@ -107,6 +137,70 @@ export function orderClausesForLede(clauses, reasons, guardSet) {
|
|
|
107
137
|
return { clauses: ordered.map((x) => x.c), reasons: ordered.map((x) => x.r) };
|
|
108
138
|
}
|
|
109
139
|
|
|
140
|
+
/**
|
|
141
|
+
* THE CLAUSE AUTHORITY — one composer for the reader's sentence, called both where the numbers are
|
|
142
|
+
* known and where only the run-record reason survives. PURE.
|
|
143
|
+
*
|
|
144
|
+
* A run recorded before clauses were persisted carries `reasons` and no `clauses`, so every condition
|
|
145
|
+
* fell back to the run-record sentence and a republished archived report opened its Conditions list
|
|
146
|
+
* with `floor_duty_undischarged:4 of 430 floor row(s)…` — on the page and in the exported PDF. Dropping
|
|
147
|
+
* the condition instead loses a point the reader must weigh, and re-generating every archived run is
|
|
148
|
+
* not on offer. The third way is this: for both defects that can reach that list the reader's sentence
|
|
149
|
+
* is fully determined by the two numbers the reason already carries in its own prefix. An archived run
|
|
150
|
+
* therefore holds everything needed to compose the client's sentence; what it lacks is only the store.
|
|
151
|
+
*
|
|
152
|
+
* ONE DEFINITION, TWO ENTRY POINTS. The clamp site calls `clauseForDefect` with the counts it already
|
|
153
|
+
* holds; the republish path calls `clauseFromReason`, which reads the same two numbers off the reason's
|
|
154
|
+
* prefix and hands them to the same composer. A second spelling of either sentence would drift, and the
|
|
155
|
+
* drift would be invisible: both surfaces render, and only a reader comparing a fresh run against a
|
|
156
|
+
* republished one would ever see it.
|
|
157
|
+
*
|
|
158
|
+
* AN UNRECOGNISED SHAPE IS REFUSED, AND REFUSED HERE MEANS `null` — NEVER A THROW. This runs on the
|
|
159
|
+
* republish path. A throw there is the failure at the top of this file: a live run died at delivery
|
|
160
|
+
* after 5.55 hours and the client received nothing instead of a report naming one gap. The caller
|
|
161
|
+
* decides what the absence means.
|
|
162
|
+
*/
|
|
163
|
+
const CLAUSE_AUTHORITY = Object.freeze({
|
|
164
|
+
synthesis_unaccounted_delivered: (n, m) =>
|
|
165
|
+
`${n} of the ${m} register records this search surfaced are neither addressed as findings nor expressly set aside in this report — they remain open points a reader must weigh`,
|
|
166
|
+
floor_duty_undischarged: (n, m) =>
|
|
167
|
+
`${n} of the ${m} live registrations identical or near-identical to the mark are not individually addressed in this report — each remains an open point a reader must weigh`,
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* The reader's sentence for a defect, from its counts. PURE.
|
|
172
|
+
*
|
|
173
|
+
* @param {string} defect the machine token, with or without its `:N` tail
|
|
174
|
+
* @param {number} n the count the defect names
|
|
175
|
+
* @param {number} m the population it is out of
|
|
176
|
+
* @returns {string|null} the client's sentence, or null for a shape this module cannot render
|
|
177
|
+
*/
|
|
178
|
+
export function clauseForDefect(defect, n, m) {
|
|
179
|
+
const compose = CLAUSE_AUTHORITY[String(defect ?? "").split(":")[0].trim()];
|
|
180
|
+
if (!compose) return null;
|
|
181
|
+
const a = Number(n), b = Number(m);
|
|
182
|
+
if (!Number.isFinite(a) || !Number.isFinite(b)) return null;
|
|
183
|
+
return compose(a, b);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// The run-record reason's own opening: `<token>:<n> of <m> <noun>`. The NOUN is deliberately not part
|
|
187
|
+
// of the match — `record(s)` and `floor row(s)` are the two spellings today, and a third would make
|
|
188
|
+
// this stop recognising a shape it can render perfectly well. The token is what selects the sentence.
|
|
189
|
+
const REASON_PREFIX_RE = /^([a-z][a-z0-9_]*):(\d[\d,]*)\s+of\s+(\d[\d,]*)\s/i;
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* The reader's sentence for a condition that has only its run-record reason. PURE.
|
|
193
|
+
*
|
|
194
|
+
* @param {string} reason the run-record sentence
|
|
195
|
+
* @returns {string|null} the client's sentence, or null when the reason is not one this can render
|
|
196
|
+
*/
|
|
197
|
+
export function clauseFromReason(reason) {
|
|
198
|
+
const m = String(reason ?? "").match(REASON_PREFIX_RE);
|
|
199
|
+
if (!m) return null;
|
|
200
|
+
const num = (t) => Number(String(t).replace(/,/g, ""));
|
|
201
|
+
return clauseForDefect(m[1], num(m[2]), num(m[3]));
|
|
202
|
+
}
|
|
203
|
+
|
|
110
204
|
/**
|
|
111
205
|
* THE CLIENT'S CONDITION LIST, from a verdict sidecar. PURE.
|
|
112
206
|
*
|
|
@@ -135,6 +229,15 @@ export function orderClausesForLede(clauses, reasons, guardSet) {
|
|
|
135
229
|
* · a clean reason with no clause survives → break: return "" for a missing clause, arm 2 red
|
|
136
230
|
* · a legacy sidecar still yields its conditions → break: require the clauses key, arm 3 red
|
|
137
231
|
* · clauses shorter than reasons loses nothing → break: map over clauses, arm 4 red
|
|
232
|
+
* · a pre-split reason renders as the lawyer's → break: return the reason, arm 5 red
|
|
233
|
+
* · an unrenderable token-bearing reason is gone → break: return it, arm 6 red
|
|
234
|
+
*
|
|
235
|
+
* THE FALLBACK NO LONGER PRINTS THE RUN RECORD. Where no clause was stored, the clause authority above
|
|
236
|
+
* composes one from the reason's own counts; where it cannot, the condition is DROPPED rather than
|
|
237
|
+
* rendered in engine voice. Dropping is a loss and it is the smaller one: a client who reads
|
|
238
|
+
* `floor_duty_undischarged:4` has been handed the engine's private vocabulary as their own advice. A
|
|
239
|
+
* reason carrying no engine identifier is a factual open-state already — the three machinery sites push
|
|
240
|
+
* the reason AS the clause — and it still survives untouched, which is arm 2.
|
|
138
241
|
*
|
|
139
242
|
* @param {{reasons?: string[], clauses?: string[]}} sidecar the parsed `_driver/verdict.json`
|
|
140
243
|
* @returns {string[]} one condition per reason, in the sidecar's own order
|
|
@@ -144,6 +247,9 @@ export function clientConditions({ reasons, clauses } = {}) {
|
|
|
144
247
|
const cs = Array.isArray(clauses) ? clauses : [];
|
|
145
248
|
return rs.map((r, i) => {
|
|
146
249
|
const clause = typeof cs[i] === "string" ? cs[i].trim() : "";
|
|
147
|
-
|
|
250
|
+
if (clause) return clause;
|
|
251
|
+
const text = String(r ?? "").trim();
|
|
252
|
+
if (!text) return "";
|
|
253
|
+
return clauseFromReason(text) ?? (ENGINE_TOKEN_RE.test(text) ? "" : text);
|
|
148
254
|
}).filter(Boolean);
|
|
149
255
|
}
|