@bongos/core 1.19.835 → 1.19.837
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/.bongos-core.json +58 -33
- package/.claude/skills/builder-claim/SKILL.md +2 -0
- package/.claude/skills/builder-release/SKILL.md +1 -1
- package/.claude/skills/builder-ship/SKILL.md +2 -0
- package/.claude/skills/builder-start/SKILL.md +1 -1
- package/docs/module-api-changelog.md +4 -0
- package/modules/lifecycle/db-claims.js +4 -2
- package/modules/lifecycle/db-ship.js +64 -0
- package/modules/lifecycle/publish-reconciler.js +23 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/api.js +5 -1
- package/scripts/gds/box.js +5 -1
- package/scripts/gds/build-cli-package.js +1 -0
- package/scripts/gds/claim.js +17 -2
- package/scripts/gds/cli-lib.js +11 -0
- package/scripts/gds/doctor.js +28 -1
- package/scripts/gds/plain-cards.js +348 -0
- package/scripts/gds/provision.js +4 -1
- package/scripts/gds/push-path-brief.js +2 -0
- package/scripts/gds/release.js +3 -0
- package/scripts/gds/runner-drift.js +151 -0
- package/scripts/gds/ship-flow.js +4 -0
- package/scripts/gds/ship-grade-steps.js +5 -0
- package/scripts/gds/ship-land.js +14 -1
- package/scripts/gds/start.js +3 -0
- package/src/module-api.js +1 -1
- package/tests/claim_gate_rebase.mjs +54 -3
- package/tests/plain_cards.mjs +221 -0
- package/tests/provision.mjs +18 -0
- package/tests/rebase_gate_unprovable.mjs +134 -0
- package/tests/runner_drift.mjs +173 -0
package/.bongos-core.json
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.837",
|
|
6
|
+
"core_contract": "1.19.837",
|
|
7
|
+
"source_commit": "d3feb6abfa5bf8256137d7be87929d517c266c48",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-17T16:
|
|
9
|
+
"built_at": "2026-09-17T16:49:51.613Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 493,
|
|
13
13
|
"agent_docs_stubbed": 26,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 2253,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 2772,
|
|
20
|
+
"tree_sha256": "ce96f2d9d0c9b141f032d74100c6f505b5c6fdce72de9da3a6a8620538af685b",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
{
|
|
53
53
|
"path": ".claude/skills/builder-claim/SKILL.md",
|
|
54
54
|
"mode": "0000644",
|
|
55
|
-
"sha256": "
|
|
55
|
+
"sha256": "6e5555dccf68419b690ec2f4ac1f31c98399f946f9c39f23503afbbfe808ee15"
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
"path": ".claude/skills/builder-cost/SKILL.md",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
{
|
|
88
88
|
"path": ".claude/skills/builder-release/SKILL.md",
|
|
89
89
|
"mode": "0000644",
|
|
90
|
-
"sha256": "
|
|
90
|
+
"sha256": "c9f9607939f1048370e0fd35626b5d8dc0d6c7285d0b6aa4bbb745c5cb4b16a5"
|
|
91
91
|
},
|
|
92
92
|
{
|
|
93
93
|
"path": ".claude/skills/builder-sequence/SKILL.md",
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
{
|
|
103
103
|
"path": ".claude/skills/builder-ship/SKILL.md",
|
|
104
104
|
"mode": "0000644",
|
|
105
|
-
"sha256": "
|
|
105
|
+
"sha256": "dca7c8f6e31c21c08ab2c4810cb6345b35bb287d51be93ed46d793c2096b86b4"
|
|
106
106
|
},
|
|
107
107
|
{
|
|
108
108
|
"path": ".claude/skills/builder-stage/SKILL.md",
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
{
|
|
113
113
|
"path": ".claude/skills/builder-start/SKILL.md",
|
|
114
114
|
"mode": "0000644",
|
|
115
|
-
"sha256": "
|
|
115
|
+
"sha256": "db68cfce733b850121f3b3e6ec094bd2864a85b36c414626037200fa69f34529"
|
|
116
116
|
},
|
|
117
117
|
{
|
|
118
118
|
"path": ".claude/skills/design-sync/SKILL.md",
|
|
@@ -2562,7 +2562,7 @@
|
|
|
2562
2562
|
{
|
|
2563
2563
|
"path": "docs/module-api-changelog.md",
|
|
2564
2564
|
"mode": "0000644",
|
|
2565
|
-
"sha256": "
|
|
2565
|
+
"sha256": "7b2488f4099bcc1060d6257077010857c05b886459ad106f722ed19b0b5178f0"
|
|
2566
2566
|
},
|
|
2567
2567
|
{
|
|
2568
2568
|
"path": "docs/modules-contract.md",
|
|
@@ -5587,7 +5587,7 @@
|
|
|
5587
5587
|
{
|
|
5588
5588
|
"path": "modules/lifecycle/db-claims.js",
|
|
5589
5589
|
"mode": "0000644",
|
|
5590
|
-
"sha256": "
|
|
5590
|
+
"sha256": "4b9beaede9eec500e1d25739f33f0903b0262f7ec8be7374279a4c6c3d38fa36"
|
|
5591
5591
|
},
|
|
5592
5592
|
{
|
|
5593
5593
|
"path": "modules/lifecycle/db-deps-criteria.js",
|
|
@@ -5627,7 +5627,7 @@
|
|
|
5627
5627
|
{
|
|
5628
5628
|
"path": "modules/lifecycle/db-ship.js",
|
|
5629
5629
|
"mode": "0000644",
|
|
5630
|
-
"sha256": "
|
|
5630
|
+
"sha256": "02b7d3ca2ec138b1ffd8509e48702a68f79faab3a16dfdc3f223ce807fdf9e90"
|
|
5631
5631
|
},
|
|
5632
5632
|
{
|
|
5633
5633
|
"path": "modules/lifecycle/db-tasks.js",
|
|
@@ -5792,7 +5792,7 @@
|
|
|
5792
5792
|
{
|
|
5793
5793
|
"path": "modules/lifecycle/publish-reconciler.js",
|
|
5794
5794
|
"mode": "0000644",
|
|
5795
|
-
"sha256": "
|
|
5795
|
+
"sha256": "6176e109575f02c681240b809b85b272c438c7284a7fdd290cd87b46abdb9e7c"
|
|
5796
5796
|
},
|
|
5797
5797
|
{
|
|
5798
5798
|
"path": "modules/lifecycle/rot.js",
|
|
@@ -7852,12 +7852,12 @@
|
|
|
7852
7852
|
{
|
|
7853
7853
|
"path": "package-lock.json",
|
|
7854
7854
|
"mode": "0000644",
|
|
7855
|
-
"sha256": "
|
|
7855
|
+
"sha256": "376f02b1d5253b7b790331c0f6639d16da022314d4a83c58ca10a9648337f01e"
|
|
7856
7856
|
},
|
|
7857
7857
|
{
|
|
7858
7858
|
"path": "package.json",
|
|
7859
7859
|
"mode": "0000644",
|
|
7860
|
-
"sha256": "
|
|
7860
|
+
"sha256": "f8da5247d7da8fdcdb322b12a5ebb362315389a7049ea4d76160115066a6cf3f"
|
|
7861
7861
|
},
|
|
7862
7862
|
{
|
|
7863
7863
|
"path": "public-docs/index.html",
|
|
@@ -7952,7 +7952,7 @@
|
|
|
7952
7952
|
{
|
|
7953
7953
|
"path": "scripts/gds/api.js",
|
|
7954
7954
|
"mode": "0000644",
|
|
7955
|
-
"sha256": "
|
|
7955
|
+
"sha256": "d36fa664267d64796faf071278437cb7cfa8c2b1c7ae2140bcb01d7c2ddf16e1"
|
|
7956
7956
|
},
|
|
7957
7957
|
{
|
|
7958
7958
|
"path": "scripts/gds/api.ps1",
|
|
@@ -8097,7 +8097,7 @@
|
|
|
8097
8097
|
{
|
|
8098
8098
|
"path": "scripts/gds/box.js",
|
|
8099
8099
|
"mode": "0000644",
|
|
8100
|
-
"sha256": "
|
|
8100
|
+
"sha256": "a2d44a3c30aa83d675edc985bb562ed0599ed1a59bdca3efb515c8be2abcea35"
|
|
8101
8101
|
},
|
|
8102
8102
|
{
|
|
8103
8103
|
"path": "scripts/gds/bug-attachment-audit.js",
|
|
@@ -8117,7 +8117,7 @@
|
|
|
8117
8117
|
{
|
|
8118
8118
|
"path": "scripts/gds/build-cli-package.js",
|
|
8119
8119
|
"mode": "0000644",
|
|
8120
|
-
"sha256": "
|
|
8120
|
+
"sha256": "630bdedb252e6d77a3427d962fca94094c747c377679ec1157644d76f142b6e8"
|
|
8121
8121
|
},
|
|
8122
8122
|
{
|
|
8123
8123
|
"path": "scripts/gds/bump-version.js",
|
|
@@ -8152,7 +8152,7 @@
|
|
|
8152
8152
|
{
|
|
8153
8153
|
"path": "scripts/gds/claim.js",
|
|
8154
8154
|
"mode": "0000644",
|
|
8155
|
-
"sha256": "
|
|
8155
|
+
"sha256": "a02e76a5f817501745c843c1df25fdd9584e91eb3d97fe76976fd508b70f72d9"
|
|
8156
8156
|
},
|
|
8157
8157
|
{
|
|
8158
8158
|
"path": "scripts/gds/classify-discipline.js",
|
|
@@ -8177,7 +8177,7 @@
|
|
|
8177
8177
|
{
|
|
8178
8178
|
"path": "scripts/gds/cli-lib.js",
|
|
8179
8179
|
"mode": "0000644",
|
|
8180
|
-
"sha256": "
|
|
8180
|
+
"sha256": "d320945b629ad20f4e6cc272f3b531d6f98ed2dae2f07286b459db5b15d2c07a"
|
|
8181
8181
|
},
|
|
8182
8182
|
{
|
|
8183
8183
|
"path": "scripts/gds/client-baseurl-guard.js",
|
|
@@ -8317,7 +8317,7 @@
|
|
|
8317
8317
|
{
|
|
8318
8318
|
"path": "scripts/gds/doctor.js",
|
|
8319
8319
|
"mode": "0000644",
|
|
8320
|
-
"sha256": "
|
|
8320
|
+
"sha256": "eaae00a0124635c26f45b4f6620ed95e913a5c2140178fb85bd3f5020dab5d44"
|
|
8321
8321
|
},
|
|
8322
8322
|
{
|
|
8323
8323
|
"path": "scripts/gds/enroll-control-plane.js",
|
|
@@ -8714,6 +8714,11 @@
|
|
|
8714
8714
|
"mode": "0000644",
|
|
8715
8715
|
"sha256": "b61317006e5df92afb5744bd9fb9b3180bf8a674b7f691773114280660a42a2a"
|
|
8716
8716
|
},
|
|
8717
|
+
{
|
|
8718
|
+
"path": "scripts/gds/plain-cards.js",
|
|
8719
|
+
"mode": "0000644",
|
|
8720
|
+
"sha256": "7f54da72ae01fa7db57098e3dfd523f9f65a65efa316e8962b9cf7d60faf9be0"
|
|
8721
|
+
},
|
|
8717
8722
|
{
|
|
8718
8723
|
"path": "scripts/gds/portability-smoke-art.sh",
|
|
8719
8724
|
"mode": "0000644",
|
|
@@ -8787,7 +8792,7 @@
|
|
|
8787
8792
|
{
|
|
8788
8793
|
"path": "scripts/gds/provision.js",
|
|
8789
8794
|
"mode": "0000644",
|
|
8790
|
-
"sha256": "
|
|
8795
|
+
"sha256": "94a77427cb16c8a959eb279866f3777830d7a33617f02aed5eedb383ca26e84a"
|
|
8791
8796
|
},
|
|
8792
8797
|
{
|
|
8793
8798
|
"path": "scripts/gds/publish-credential-check.js",
|
|
@@ -8817,7 +8822,7 @@
|
|
|
8817
8822
|
{
|
|
8818
8823
|
"path": "scripts/gds/push-path-brief.js",
|
|
8819
8824
|
"mode": "0000644",
|
|
8820
|
-
"sha256": "
|
|
8825
|
+
"sha256": "4fbbb81668b9fa2d7713ba9585bfe8dfacba25c5bd87c9368d1078cec6d985a3"
|
|
8821
8826
|
},
|
|
8822
8827
|
{
|
|
8823
8828
|
"path": "scripts/gds/read-session-export.js",
|
|
@@ -8847,7 +8852,7 @@
|
|
|
8847
8852
|
{
|
|
8848
8853
|
"path": "scripts/gds/release.js",
|
|
8849
8854
|
"mode": "0000644",
|
|
8850
|
-
"sha256": "
|
|
8855
|
+
"sha256": "997c4c4f45d360b765877e3583038be21b52267112b7b33e9c673ab245d682fc"
|
|
8851
8856
|
},
|
|
8852
8857
|
{
|
|
8853
8858
|
"path": "scripts/gds/rename-goals.js",
|
|
@@ -8904,6 +8909,11 @@
|
|
|
8904
8909
|
"mode": "0000644",
|
|
8905
8910
|
"sha256": "c5fb602f48d48ca31f5f5290d3624050267ec9bdf4b0c2988e3ff7d59e523bff"
|
|
8906
8911
|
},
|
|
8912
|
+
{
|
|
8913
|
+
"path": "scripts/gds/runner-drift.js",
|
|
8914
|
+
"mode": "0000644",
|
|
8915
|
+
"sha256": "2a0919b7769007eba2b58f2c0a3f77d42a644c8c2912059ae2af689e06302d6e"
|
|
8916
|
+
},
|
|
8907
8917
|
{
|
|
8908
8918
|
"path": "scripts/gds/sandbox-stage.js",
|
|
8909
8919
|
"mode": "0000644",
|
|
@@ -9127,7 +9137,7 @@
|
|
|
9127
9137
|
{
|
|
9128
9138
|
"path": "scripts/gds/ship-flow.js",
|
|
9129
9139
|
"mode": "0000644",
|
|
9130
|
-
"sha256": "
|
|
9140
|
+
"sha256": "c29075a13419ef2bc13f2ff1fd921c725c633ab1e3284dbe9531e1fb55219678"
|
|
9131
9141
|
},
|
|
9132
9142
|
{
|
|
9133
9143
|
"path": "scripts/gds/ship-git.js",
|
|
@@ -9137,7 +9147,7 @@
|
|
|
9137
9147
|
{
|
|
9138
9148
|
"path": "scripts/gds/ship-grade-steps.js",
|
|
9139
9149
|
"mode": "0000644",
|
|
9140
|
-
"sha256": "
|
|
9150
|
+
"sha256": "158a01214499cd229a51819cd2dfcfee2eae34475f87f23795f81ec83d54f337"
|
|
9141
9151
|
},
|
|
9142
9152
|
{
|
|
9143
9153
|
"path": "scripts/gds/ship-grade.js",
|
|
@@ -9157,7 +9167,7 @@
|
|
|
9157
9167
|
{
|
|
9158
9168
|
"path": "scripts/gds/ship-land.js",
|
|
9159
9169
|
"mode": "0000644",
|
|
9160
|
-
"sha256": "
|
|
9170
|
+
"sha256": "fafa751359543787133e26a7aa18307fec163b0955eea38677a1b319d4dc6162"
|
|
9161
9171
|
},
|
|
9162
9172
|
{
|
|
9163
9173
|
"path": "scripts/gds/ship-memory-sync.js",
|
|
@@ -9272,7 +9282,7 @@
|
|
|
9272
9282
|
{
|
|
9273
9283
|
"path": "scripts/gds/start.js",
|
|
9274
9284
|
"mode": "0000644",
|
|
9275
|
-
"sha256": "
|
|
9285
|
+
"sha256": "70aa432e6142fa7a5e7ca5232aa0f362c1e2b891b8ac34ad7d34a4665abe043f"
|
|
9276
9286
|
},
|
|
9277
9287
|
{
|
|
9278
9288
|
"path": "scripts/gds/status.js",
|
|
@@ -9777,7 +9787,7 @@
|
|
|
9777
9787
|
{
|
|
9778
9788
|
"path": "src/module-api.js",
|
|
9779
9789
|
"mode": "0000644",
|
|
9780
|
-
"sha256": "
|
|
9790
|
+
"sha256": "5434f6390d888bb9c3181c449483867da3fd6637a8748fe98f0609cc57f75022"
|
|
9781
9791
|
},
|
|
9782
9792
|
{
|
|
9783
9793
|
"path": "src/module-loader/catalog.js",
|
|
@@ -10457,7 +10467,7 @@
|
|
|
10457
10467
|
{
|
|
10458
10468
|
"path": "tests/claim_gate_rebase.mjs",
|
|
10459
10469
|
"mode": "0000644",
|
|
10460
|
-
"sha256": "
|
|
10470
|
+
"sha256": "944e025c19ed31efbe04bf27dccccd0705782a5c028271299c8982461d050eb7"
|
|
10461
10471
|
},
|
|
10462
10472
|
{
|
|
10463
10473
|
"path": "tests/claim_recall.mjs",
|
|
@@ -12374,6 +12384,11 @@
|
|
|
12374
12384
|
"mode": "0000644",
|
|
12375
12385
|
"sha256": "c3ceef2141a0f5f19c6dacfa0f9c927e5904757c39925e852b34b08c4c2576a5"
|
|
12376
12386
|
},
|
|
12387
|
+
{
|
|
12388
|
+
"path": "tests/plain_cards.mjs",
|
|
12389
|
+
"mode": "0000644",
|
|
12390
|
+
"sha256": "925f4ffa450b2eddff31712b8ea1cd3e7853110f156d8fd4574f1ba1d05d16a8"
|
|
12391
|
+
},
|
|
12377
12392
|
{
|
|
12378
12393
|
"path": "tests/planning_session_skill.mjs",
|
|
12379
12394
|
"mode": "0000644",
|
|
@@ -12592,7 +12607,7 @@
|
|
|
12592
12607
|
{
|
|
12593
12608
|
"path": "tests/provision.mjs",
|
|
12594
12609
|
"mode": "0000644",
|
|
12595
|
-
"sha256": "
|
|
12610
|
+
"sha256": "09a759a1b1e0cac3ddafdd64adca4daed0f6a8ab4c48a07f42954f38ed510433"
|
|
12596
12611
|
},
|
|
12597
12612
|
{
|
|
12598
12613
|
"path": "tests/provision_disconnect.mjs",
|
|
@@ -12809,6 +12824,11 @@
|
|
|
12809
12824
|
"mode": "0000644",
|
|
12810
12825
|
"sha256": "f9e7b2e7ae906198ef0badd1bbbe8e28cd4e8d20770ddc351b85aa2c8ce85198"
|
|
12811
12826
|
},
|
|
12827
|
+
{
|
|
12828
|
+
"path": "tests/rebase_gate_unprovable.mjs",
|
|
12829
|
+
"mode": "0000644",
|
|
12830
|
+
"sha256": "07a40476b9215049c2e61ae2323ade7443b23dab6ca7bac3cd9d6041103d250e"
|
|
12831
|
+
},
|
|
12812
12832
|
{
|
|
12813
12833
|
"path": "tests/recall_cli.mjs",
|
|
12814
12834
|
"mode": "0000644",
|
|
@@ -12959,6 +12979,11 @@
|
|
|
12959
12979
|
"mode": "0000644",
|
|
12960
12980
|
"sha256": "b5698af4ca50c44b384a3adfd1a1b1132bab630241ebb70ac77b13a67ffc8eae"
|
|
12961
12981
|
},
|
|
12982
|
+
{
|
|
12983
|
+
"path": "tests/runner_drift.mjs",
|
|
12984
|
+
"mode": "0000644",
|
|
12985
|
+
"sha256": "51e07247e84af72a316fac8b3c373198d80af6f97ec3fd08a9e99ab010a1b6ff"
|
|
12986
|
+
},
|
|
12962
12987
|
{
|
|
12963
12988
|
"path": "tests/sandbox_stage.mjs",
|
|
12964
12989
|
"mode": "0000644",
|
|
@@ -6,6 +6,8 @@ description: >-
|
|
|
6
6
|
|
|
7
7
|
**Script skill (authoritative).** The core action is `node scripts/gds/claim.js <task-id> [--worktree NAME]`. Once the args are determined, run it and relay its output verbatim — do not paraphrase error messages or reformat the claimed card.
|
|
8
8
|
|
|
9
|
+
**The one exception — a refusal, for a non-technical builder (task 1003989).** Every refusal now ends with an `[otb-plain]` card: what happened, what you will do next, whether a person is needed (and who), and whether this is a rule or a fault. Read the session's interaction profile (the Conductor injects it; with none injected, assume non-technical — CLAUDE.md §2). **Non-technical or mixed:** lead with the card in your own plain words and do what its "What I will do" line says; keep the raw text back unless they ask for it. **Engineer:** relay verbatim, as above. **Any profile:** `By design: Yes` means the refusal is a rule, not breakage — never look for a way round it and never offer one.
|
|
10
|
+
|
|
9
11
|
You are claiming a task on behalf of the current builder. The claim is atomic — either it succeeds (and the task is locked to this session) or it fails with a clear reason and the user picks differently.
|
|
10
12
|
|
|
11
13
|
## What this skill does
|
|
@@ -4,7 +4,7 @@ description: >-
|
|
|
4
4
|
Cancel an active claim without shipping: the task returns to 'ready' and no credits are awarded. Triggers: "/builder-release N", "cancel my claim", "I'm dropping this task", "give it back".
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
**Script skill (authoritative).** The core action is `node scripts/gds/release.js <task-id> --reason "..."`. Once the task id and reason are determined, run it and print its output verbatim — do not editorialize the result.
|
|
7
|
+
**Script skill (authoritative).** The core action is `node scripts/gds/release.js <task-id> --reason "..."`. Once the task id and reason are determined, run it and print its output verbatim — do not editorialize the result. If the release is refused, the output closes with an `[otb-plain]` card; for a builder whose interaction profile is not `engineer`, tell them what that card says instead of pasting the refusal (the rule is spelled out in `/builder-claim`).
|
|
8
8
|
|
|
9
9
|
You are releasing a task on behalf of the current builder. Releasing is the honest "I started this, but I'm not finishing it right now" exit.
|
|
10
10
|
|
|
@@ -25,6 +25,8 @@ The CLI drives a **three-state lifecycle** with a subagent grader between states
|
|
|
25
25
|
- **`GRADER UNAVAILABLE`** (`panel_outcome='unavailable'`) — the grading panel could not run (worker infra outage or a pre-spawn bypass). This is **not a quality rejection**: no quality signal was produced, there are no findings to fix, and the task parks at `completed` ungraded (aggregates exclude these rounds as `n_unavailable` — an outage never counts as a zero). Recovery: when the grader is reachable again, re-run just the grade step — `node scripts/gds/ship.js <id> --regrade`.
|
|
26
26
|
- **A genuine `FAIL`** — the panel ran and returned findings. Fix the real issues, commit on the claim branch (the grader reads committed history, not the working tree), then re-grade with the same command: `node scripts/gds/ship.js <id> --regrade`.
|
|
27
27
|
|
|
28
|
+
**Every way a ship can stall closes with an `[otb-plain]` card** (task 1003989) — both shapes above, an authorization refusal, a red pull request, a failed push, a land still pending, a land the server could not prove. When the builder's interaction profile is not `engineer`, that card is what you tell them: what happened, what you are doing about it, and whether they need to ask anyone. Its `By design` line decides your next move — `Yes` is a rule to respect (a pending land needs nothing; a protected path cannot be re-graded past), `No` is a fault to go and fix. Do not answer a stall by running the ship again unchanged.
|
|
29
|
+
|
|
28
30
|
(Game-surface changes, `--approved`) Persists the builder's sandbox self-approval to `tasks.sandbox_review` — `{ by, at, stamp, url, method }`, with `by`/`at` stamped server-side ([#1048](https://example.com/builders#/task/1048), ADR 0046).
|
|
29
31
|
|
|
30
32
|
## How to use
|
|
@@ -40,7 +40,7 @@ Delivery is now deterministic (task 1288). The **card-delivery hook** (`.claude/
|
|
|
40
40
|
Either way, don't hand-run internal scripts; the package isn't unpacked yet.
|
|
41
41
|
- **The card says the instance isn't reachable / running.** Same branch. **Hosted:** the server is not this machine's to start — check the origin is up (`curl -sI <buildersOrigin>/healthz`) and re-run; `bongos dev` cannot reach it, and starting a local instance instead would hide the outage behind an empty board. **Local:** the server was never brought up — route: `bongos dev`, then re-run. (`start.js` prints a guided card itself on a connection failure — relay it verbatim.)
|
|
42
42
|
- **Exit code 3 / "Wrong instance — refusing to act".** This machine's signed-in session targets a *different* instance than this project's `config/branding.json`. This is correct-by-design (it prevents writing to the wrong place). Route: run the exact `bongos login <origin>` line the message prints (the origin is right there), then re-run. **Do not** set an env override to force the mismatched instance.
|
|
43
|
-
- **"no Bongos session"** — the auth case above (`/builder-setup` for a first-timer, `/builder-reauth` for a stale session).
|
|
43
|
+
- **"no Bongos session"** — the auth case above (`/builder-setup` for a first-timer, `/builder-reauth` for a stale session). The sign-in guidance blocks end with an `[otb-plain]` card (task 1003989): unless the builder's interaction profile is `engineer`, say what the card says and then walk the sign-in with them, rather than relaying the block.
|
|
44
44
|
|
|
45
45
|
Emit one guided next step, not a wall of options. These are the same fixes `bongos doctor` and the environment preflight (`preflight.js`) describe — this just front-loads them onto the first command so a newcomer isn't diagnosing a crash.
|
|
46
46
|
|
|
@@ -2144,5 +2144,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
2144
2144
|
landed since 1.19.833 with no explicit bump. run 35244719662. (task 1002620)
|
|
2145
2145
|
1.19.835 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2146
2146
|
landed since 1.19.834 with no explicit bump. run 35245617627. (task 1002620)
|
|
2147
|
+
1.19.836 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2148
|
+
landed since 1.19.835 with no explicit bump. run 35247495964. (task 1002620)
|
|
2149
|
+
1.19.837 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2150
|
+
landed since 1.19.836 with no explicit bump. run 35248928789. (task 1002620)
|
|
2147
2151
|
---------------------------------------------------------------------------
|
|
2148
2152
|
```
|
|
@@ -29,7 +29,7 @@ const { unsatisfiedDeps } = require('./db-deps-criteria.js');
|
|
|
29
29
|
const { depRefusalRow } = require('./dead-deps.js');
|
|
30
30
|
const { claimGate, claimPermissionsFor, disambiguateWorktreeName, foldWorktreeName } = require('./db-rank-authz.js');
|
|
31
31
|
const { sealSessionLog } = require('./db-shared.js');
|
|
32
|
-
const {
|
|
32
|
+
const { gatingRebaseTasksForBuilder, shouldRefuseClaimResolve } = require('./db-ship.js');
|
|
33
33
|
const { REWARD_SUGGESTION_CAP, rewardGateAssignment } = require('./db-tasks.js');
|
|
34
34
|
|
|
35
35
|
// -------------------------------------------------------------------------
|
|
@@ -108,7 +108,9 @@ async function claimTask({ taskId, builderId, worktreeName, headSha, creatorSess
|
|
|
108
108
|
// the builder is motivated to clear it; since it gates their queue, they
|
|
109
109
|
// can't walk away from it. Runs in THIS txn so it can't race a concurrent
|
|
110
110
|
// ship that clears the last flag.
|
|
111
|
-
|
|
111
|
+
// The GATING subset, not the surfacing one: a strand the builder cannot clear
|
|
112
|
+
// stops blocking after a grace, while still being reported (task 1003294).
|
|
113
|
+
const owedRebases = await gatingRebaseTasksForBuilder(builderId, client);
|
|
112
114
|
if (owedRebases.length > 0) {
|
|
113
115
|
throw {
|
|
114
116
|
code: 'REBASE_REQUIRED',
|
|
@@ -377,6 +377,67 @@ async function flagTaskNeedsRebase(taskId, reason = null) {
|
|
|
377
377
|
// claims and by the hall/CLI surfacing (part 5). Accepts an optional client so
|
|
378
378
|
// it can run inside claimTask's FOR UPDATE txn or standalone on the pool.
|
|
379
379
|
// Ordered oldest-flagged first so the surfacing can show the longest-outstanding.
|
|
380
|
+
// UNPROVABLE_GATE_GRACE_MS — how long a strand the builder may be UNABLE to clear
|
|
381
|
+
// keeps gating their queue before the gate lets go of it (task 1003294).
|
|
382
|
+
//
|
|
383
|
+
// ADR 0120 part 3 blocks a builder's NEW claims while they owe a rebase, because
|
|
384
|
+
// the rebase is a chore only they can do and the gate is what makes them do it.
|
|
385
|
+
// That reasoning holds for every strand reason EXCEPT one.
|
|
386
|
+
//
|
|
387
|
+
// 'no_branch_no_tip' means: no branch in the CORE repo, and no published tip on the
|
|
388
|
+
// claim. Two very different situations produce it and the reconciler cannot tell
|
|
389
|
+
// them apart:
|
|
390
|
+
//
|
|
391
|
+
// (a) the builder never pushed -> THEY CAN FIX IT. The gate is working.
|
|
392
|
+
// (b) the task delivered to the INSTANCE repo, not the core -- e.g. task 1003253,
|
|
393
|
+
// whose commit is real, complete and deployed on the instance host. The core
|
|
394
|
+
// reconciler has structurally no way to see that repository, so the land can
|
|
395
|
+
// NEVER be proven here.
|
|
396
|
+
//
|
|
397
|
+
// In case (b) the gate blocks every future claim by that builder over a task that
|
|
398
|
+
// cannot be cleared by any action available to them, and the recorded remedy has
|
|
399
|
+
// been a hand-run SQL UPDATE on the droplet -- exactly the surgery this reconciler
|
|
400
|
+
// exists to remove. Two builders hit it in one session (1002459, then 1003253).
|
|
401
|
+
//
|
|
402
|
+
// So the gate keeps its teeth for a bounded window -- long enough to motivate the
|
|
403
|
+
// builder in case (a), who only has to push -- and then stops BLOCKING. It does not
|
|
404
|
+
// stop REPORTING: the flag stays set, the row keeps its reason, and every surfacing
|
|
405
|
+
// (me.js, the hall, the CLI) still shows it, because needsRebaseTasksForBuilder is
|
|
406
|
+
// deliberately left unfiltered. A strand that outlives the window needs a human
|
|
407
|
+
// disposition, and a frozen queue is not how to ask for one.
|
|
408
|
+
const UNPROVABLE_GATE_GRACE_MS = Number(process.env.REBASE_GATE_UNPROVABLE_GRACE_MS) || 24 * 60 * 60_000;
|
|
409
|
+
|
|
410
|
+
// The reason that carries this ambiguity. Stored by the reconciler as
|
|
411
|
+
// `strand:<reason>` (announceStrand), so it is matched here in that spelling.
|
|
412
|
+
const UNPROVABLE_STRAND_REASON = 'strand:no_branch_no_tip';
|
|
413
|
+
|
|
414
|
+
// gatingRebaseTasksForBuilder — the subset of owed rebases that may REFUSE a new
|
|
415
|
+
// claim. Split from needsRebaseTasksForBuilder on purpose: that one answers "what
|
|
416
|
+
// does this builder owe?" (surfacing, part 5) and must stay complete, while this one
|
|
417
|
+
// answers "what may stop them working?" (the gate, part 3). Collapsing the two is
|
|
418
|
+
// what would turn "stop blocking" into "stop telling them", which is the opposite of
|
|
419
|
+
// the fix.
|
|
420
|
+
//
|
|
421
|
+
// COALESCE, not a bare comparison: a NULL reason or NULL timestamp must fall through
|
|
422
|
+
// to "still gating". Written as NOT(...) over non-NULL operands so no row can be
|
|
423
|
+
// dropped by three-valued logic -- an unknown is a reason to keep the gate, never to
|
|
424
|
+
// release it.
|
|
425
|
+
async function gatingRebaseTasksForBuilder(builderId, client = pool, graceMs = UNPROVABLE_GATE_GRACE_MS) {
|
|
426
|
+
const { rows } = await client.query(
|
|
427
|
+
`SELECT id, title, needs_rebase_reason, needs_rebase_at
|
|
428
|
+
FROM tasks
|
|
429
|
+
WHERE needs_rebase = true AND status = 'confirmed' AND shipped_by = $1
|
|
430
|
+
AND NOT (
|
|
431
|
+
COALESCE(needs_rebase_reason, '') = $3
|
|
432
|
+
AND needs_rebase_at IS NOT NULL
|
|
433
|
+
AND needs_rebase_at < now() - ($2::bigint * interval '1 millisecond')
|
|
434
|
+
)
|
|
435
|
+
ORDER BY needs_rebase_at ASC NULLS LAST, id ASC`,
|
|
436
|
+
[builderId, Math.max(0, Number(graceMs) || 0), UNPROVABLE_STRAND_REASON]
|
|
437
|
+
);
|
|
438
|
+
return rows;
|
|
439
|
+
}
|
|
440
|
+
|
|
380
441
|
async function needsRebaseTasksForBuilder(builderId, client = pool) {
|
|
381
442
|
const { rows } = await client.query(
|
|
382
443
|
`SELECT id, title, needs_rebase_reason, needs_rebase_at
|
|
@@ -1297,6 +1358,9 @@ module.exports = {
|
|
|
1297
1358
|
getClaimPublishedSha,
|
|
1298
1359
|
listConfirmedTasksForReconcile,
|
|
1299
1360
|
needsRebaseTasksForBuilder,
|
|
1361
|
+
gatingRebaseTasksForBuilder,
|
|
1362
|
+
UNPROVABLE_GATE_GRACE_MS,
|
|
1363
|
+
UNPROVABLE_STRAND_REASON,
|
|
1300
1364
|
releaseClaimOnBehalf,
|
|
1301
1365
|
resolveClaim,
|
|
1302
1366
|
restoreTask,
|
|
@@ -76,6 +76,10 @@
|
|
|
76
76
|
const githubPush = require('./github-push');
|
|
77
77
|
const seams = require('../../src/module-api');
|
|
78
78
|
const conflictResolve = require('./conflict-resolve');
|
|
79
|
+
// The claim gate's grace for a strand its builder may be unable to clear — imported
|
|
80
|
+
// rather than restated so the sweep's escalation and the gate agree on one number
|
|
81
|
+
// (task 1003294).
|
|
82
|
+
const { UNPROVABLE_GATE_GRACE_MS, UNPROVABLE_STRAND_REASON } = require('./db-ship.js');
|
|
79
83
|
|
|
80
84
|
// 5-min cadence: frequent enough that a strand heals within minutes of CI
|
|
81
85
|
// finishing, cheap enough that the GitHub API cost is negligible: steady state
|
|
@@ -281,6 +285,7 @@ async function runSweep(deps = {}) {
|
|
|
281
285
|
let errors = 0;
|
|
282
286
|
let unprovable = 0; // confirmed tasks the sweep could not prove landed this pass
|
|
283
287
|
let staleStrands = 0; // of those, the ones older than STALE_CONFIRMED_MS (WARN'd)
|
|
288
|
+
let unprovableUngated = 0; // strands past the grace that no longer gate (task 1003294)
|
|
284
289
|
let strandsFlagged = 0; // task 1002606: needs_rebase flags NEWLY set this sweep (any site)
|
|
285
290
|
// task 1002723: one entry per confirmed task per sweep ("<id>:<disposition>").
|
|
286
291
|
// The 1002702/1002716 strands sat through 5+ sweeps with ZERO journal evidence
|
|
@@ -722,6 +727,23 @@ async function runSweep(deps = {}) {
|
|
|
722
727
|
`strand:${reason}`,
|
|
723
728
|
`confirmed ~${Math.round(ageMs / 3_600_000)}h ago, unprovable (${reason}) — no landed proof`
|
|
724
729
|
);
|
|
730
|
+
// ESCALATE rather than keep blocking silently (task 1003294). Past the
|
|
731
|
+
// grace, a 'no_branch_no_tip' strand has stopped gating its builder's
|
|
732
|
+
// queue — see gatingRebaseTasksForBuilder. That is deliberate, because it
|
|
733
|
+
// may be a task delivered to the INSTANCE repo, which this reconciler has
|
|
734
|
+
// no way to see. It is NOT a resolution: the row is still flagged and still
|
|
735
|
+
// unlanded, and it now needs a human to dispose of it. Say so on every
|
|
736
|
+
// sweep, with the age, so it cannot rot unnoticed the way a frozen queue
|
|
737
|
+
// at least made loud.
|
|
738
|
+
if (`strand:${reason}` === UNPROVABLE_STRAND_REASON && ageMs > UNPROVABLE_GATE_GRACE_MS) {
|
|
739
|
+
unprovableUngated++;
|
|
740
|
+
errFn(
|
|
741
|
+
`[publish-reconciler] UNPROVABLE task ${r.task_id}: no core branch and no published tip after ` +
|
|
742
|
+
`~${Math.round(ageMs / 3_600_000)}h — no longer gating its builder's queue (grace ` +
|
|
743
|
+
`${Math.round(UNPROVABLE_GATE_GRACE_MS / 3_600_000)}h). It is still confirmed and still unlanded: ` +
|
|
744
|
+
`push the branch, or dispose of it deliberately if the work landed outside this repository.`
|
|
745
|
+
);
|
|
746
|
+
}
|
|
725
747
|
} else if (prClosedUnmerged) {
|
|
726
748
|
await announceStrand(
|
|
727
749
|
r,
|
|
@@ -789,7 +811,7 @@ async function runSweep(deps = {}) {
|
|
|
789
811
|
}
|
|
790
812
|
if (staleStrands) {
|
|
791
813
|
errFn(
|
|
792
|
-
`[publish-reconciler] ${staleStrands} stale strand(s): confirmed >${Math.round(STALE_CONFIRMED_MS / 60_000)}min with no provable land — credited but unlanded; see STRAND lines above`
|
|
814
|
+
`[publish-reconciler] ${staleStrands} stale strand(s): confirmed >${Math.round(STALE_CONFIRMED_MS / 60_000)}min with no provable land — credited but unlanded; see STRAND lines above${unprovableUngated ? `; ${unprovableUngated} past the gate grace and no longer blocking (see UNPROVABLE lines)` : ''}`
|
|
793
815
|
);
|
|
794
816
|
}
|
|
795
817
|
// task 1002723: the always-on per-sweep account. Every confirmed task the sweep
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.837",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.19.
|
|
9
|
+
"version": "1.19.837",
|
|
10
10
|
"license": "AGPL-3.0-or-later",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"express": "^4.21.2",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.837",
|
|
4
4
|
"description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"main": "src/platform-server.js",
|
package/scripts/gds/api.js
CHANGED
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
const fs = require('node:fs');
|
|
21
21
|
const { cliClient, arg, stripBom, resolveQuiet, isBoxScope, printBoxScopeGuidanceAndExit, cliExit, repairMsysMangledPath,
|
|
22
22
|
instanceDevBoxSupport, devBoxUnavailableMessage } = require('./cli-lib');
|
|
23
|
+
const { plainCardLines } = require('./plain-cards');
|
|
23
24
|
|
|
24
25
|
|
|
25
26
|
(async () => {
|
|
@@ -96,7 +97,10 @@ const { cliClient, arg, stripBom, resolveQuiet, isBoxScope, printBoxScopeGuidanc
|
|
|
96
97
|
// that a /box/ 404 always means — and only for a reader who typed a box command.
|
|
97
98
|
if (res.status === 404 && /^\/api\/(?:bongos\/v1|bongos|gds)\/box\b/.test(urlPath)) {
|
|
98
99
|
const { available } = await instanceDevBoxSupport();
|
|
99
|
-
if (!available)
|
|
100
|
+
if (!available) {
|
|
101
|
+
console.error(`\n✖ ${devBoxUnavailableMessage()}`);
|
|
102
|
+
for (const line of plainCardLines('dev_box_unavailable')) console.error(line);
|
|
103
|
+
}
|
|
100
104
|
}
|
|
101
105
|
// task 1002734: process.exit() here aborted node 5/5 on Windows —
|
|
102
106
|
// "Assertion failed: !(handle->flags & UV_HANDLE_CLOSING), file src\win\async.c"
|
package/scripts/gds/box.js
CHANGED
|
@@ -54,6 +54,8 @@ const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
|
54
54
|
// INSTANCE root, riding ADR 0108's resolvers, instead of assuming it sits beside
|
|
55
55
|
// box.js. ADR 0150 (BV1.R97/R98).
|
|
56
56
|
const instanceConfig = require(path.join(REPO_ROOT, 'src/instance-config'));
|
|
57
|
+
const { installedCoreVersion, runnerBanner } = require('./runner-drift.js');
|
|
58
|
+
const { coreVersionSafe } = require('./provision-config.js');
|
|
57
59
|
const BOX_INFRA_TEMPLATE = 'builder-box-cloud-init.yaml';
|
|
58
60
|
|
|
59
61
|
// Ordered candidate infra/ dirs — first that actually holds the cloud-init
|
|
@@ -1120,6 +1122,8 @@ async function cmdReconcileDrift(pool, boxes, { apply }) {
|
|
|
1120
1122
|
const MAX_INTENT_ATTEMPTS = numEnv('BOX_INTENT_MAX_ATTEMPTS', 3);
|
|
1121
1123
|
|
|
1122
1124
|
async function cmdRunIntents(pool, boxes, boxOnboard, { apply }) {
|
|
1125
|
+
const instanceRoot = process.env.BONGOS_INSTANCE_ROOT || process.cwd();
|
|
1126
|
+
console.log(runnerBanner({ runnerVersion: coreVersionSafe(), runnerRoot: REPO_ROOT, instanceVersion: installedCoreVersion(instanceRoot), instanceRoot }));
|
|
1123
1127
|
if (!apply) {
|
|
1124
1128
|
const { rows } = await pool.query(
|
|
1125
1129
|
`SELECT bi.*, b.github_login FROM box_intents bi
|
|
@@ -1325,4 +1329,4 @@ async function main() {
|
|
|
1325
1329
|
|
|
1326
1330
|
if (require.main === module) main();
|
|
1327
1331
|
|
|
1328
|
-
module.exports = { cmdProvision, deprovisionOne, parkOne, cmdSweepIdle, cmdSweepDormant, deleteWithRetry, cmdReconcileDrift, runDnsHook, runDnsHookBlackhole, markErrorUnlessDestroyed, resolveBoxInfraDir, boxInfraCandidates, readCloudInit, buildBoxEnv, BOX_INFRA_TEMPLATE };
|
|
1332
|
+
module.exports = { cmdProvision, cmdRunIntents, deprovisionOne, parkOne, cmdSweepIdle, cmdSweepDormant, deleteWithRetry, cmdReconcileDrift, runDnsHook, runDnsHookBlackhole, markErrorUnlessDestroyed, resolveBoxInfraDir, boxInfraCandidates, readCloudInit, buildBoxEnv, BOX_INFRA_TEMPLATE };
|
|
@@ -56,6 +56,7 @@ const FILES = [
|
|
|
56
56
|
'scripts/gds/install-git-hooks.js', // lazy dep of setup.js
|
|
57
57
|
'scripts/gds/preflight.js',
|
|
58
58
|
'scripts/gds/surface.js', // who the output is for: agent vs terminal (task 1003680)
|
|
59
|
+
'scripts/gds/plain-cards.js', // required by cli-lib + release; prints nothing on the terminal surface (task 1003989)
|
|
59
60
|
// The partial-checkout preflight (task 1003098). start/claim/ship require it
|
|
60
61
|
// ABOVE their first module require, so an absent file here breaks every verb in
|
|
61
62
|
// the published package -- which is exactly how tests/cli_package.mjs caught it.
|
package/scripts/gds/claim.js
CHANGED
|
@@ -31,6 +31,7 @@ const { CORE_NS } = require('./migration-namespace');
|
|
|
31
31
|
const { contextPack, formatContextPack, resolveWorktreeRoot } = require('./context-pack');
|
|
32
32
|
const { printClaimRecall } = require('./claim-recall');
|
|
33
33
|
const { decideWorktreeClaim, ESCAPE_FLAG } = require('./worktree-claim-guard');
|
|
34
|
+
const { plainCardLines } = require('./plain-cards');
|
|
34
35
|
// task 1003153 — the DEAD dependency edge, one definition shared with the route
|
|
35
36
|
// and the detector. A lifecycle CLI may require the lifecycle module directly
|
|
36
37
|
// (the documented exception in modules/lifecycle/CLAUDE.md).
|
|
@@ -164,7 +165,10 @@ function enforceWorktreeClaim(taskId, { allowMainCheckout }) {
|
|
|
164
165
|
});
|
|
165
166
|
if (d.verdict === 'allow') return tree;
|
|
166
167
|
for (const line of d.lines) console.error(line);
|
|
167
|
-
if (d.verdict === 'refuse')
|
|
168
|
+
if (d.verdict === 'refuse') {
|
|
169
|
+
for (const line of plainCardLines('main_checkout_claim')) console.error(line);
|
|
170
|
+
process.exit(2);
|
|
171
|
+
}
|
|
168
172
|
console.error('');
|
|
169
173
|
return tree;
|
|
170
174
|
}
|
|
@@ -315,8 +319,19 @@ function clip(s, max = 160) {
|
|
|
315
319
|
// conflict apart from a failed worktree detection. Optional and defaulted — the
|
|
316
320
|
// function stays pure and every existing caller/test keeps working.
|
|
317
321
|
function formatClaimFailure(r, taskId, ctx) {
|
|
322
|
+
const info = claimErrorInfo(r);
|
|
323
|
+
const { lines, exit } = claimFailureGuidance(info, r, taskId, ctx);
|
|
324
|
+
// task 1003989: the same refusal in plain words, AFTER the curated text so nothing
|
|
325
|
+
// an engineer relies on moves. The owed-task gate names a flagged reason per task;
|
|
326
|
+
// the first one is translated too, because that token is what a builder is stuck on.
|
|
327
|
+
const { code, d } = info;
|
|
328
|
+
const owed = code === 'REBASE_REQUIRED' ? (d.rebaseTasks || d.rebase_tasks || []) : [];
|
|
329
|
+
const flagged = owed.length ? plainCardLines(String(owed[0].reason || '')) : [];
|
|
330
|
+
return { lines: [...lines, ...plainCardLines(code), ...flagged], exit };
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
function claimFailureGuidance({ code, message, d }, r, taskId, ctx) {
|
|
318
334
|
const lines = [];
|
|
319
|
-
const { code, message, d } = claimErrorInfo(r);
|
|
320
335
|
|
|
321
336
|
// #766: a generic onboarding stage gate (kept rendering cleanly, not as raw JSON).
|
|
322
337
|
if (code === 'stage_required') {
|