@bongos/core 1.19.32 → 1.19.34
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 +20 -15
- package/.claude/skills/builder-sequence/SKILL.md +1 -1
- package/.claude/skills/builder-ship/SKILL.md +5 -0
- package/.claude/skills/fix-task/SKILL.md +3 -1
- package/modules/lifecycle/db.js +1 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/module-api.js +5 -1
- package/tests/migration_allocation.mjs +35 -0
- package/tests/skill_docs_unavailable_regrade.mjs +35 -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.34",
|
|
6
|
+
"core_contract": "1.19.34",
|
|
7
|
+
"source_commit": "4c7df27cafa52b11076549985f3b270f52a4b83d",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-11T15:
|
|
9
|
+
"built_at": "2026-08-11T15:15:18.155Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 286,
|
|
13
13
|
"agent_docs_stubbed": 21,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 1208,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 1515,
|
|
20
|
+
"tree_sha256": "36e160fe7d3ed2db78dea0705bbd6c0da8af094f50ef11a921e88f1ef5e670cb",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
{
|
|
88
88
|
"path": ".claude/skills/builder-sequence/SKILL.md",
|
|
89
89
|
"mode": "0000644",
|
|
90
|
-
"sha256": "
|
|
90
|
+
"sha256": "4284bc0184dd27752202ce02974fa8909fc462f546ee3cae38fa26b4ca071f81"
|
|
91
91
|
},
|
|
92
92
|
{
|
|
93
93
|
"path": ".claude/skills/builder-setup/SKILL.md",
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
{
|
|
98
98
|
"path": ".claude/skills/builder-ship/SKILL.md",
|
|
99
99
|
"mode": "0000644",
|
|
100
|
-
"sha256": "
|
|
100
|
+
"sha256": "b21b28bc173431adbaf8c98faec0d32c84808258099a35c346b2cff6612f9f51"
|
|
101
101
|
},
|
|
102
102
|
{
|
|
103
103
|
"path": ".claude/skills/builder-stage/SKILL.md",
|
|
@@ -142,7 +142,7 @@
|
|
|
142
142
|
{
|
|
143
143
|
"path": ".claude/skills/fix-task/SKILL.md",
|
|
144
144
|
"mode": "0000644",
|
|
145
|
-
"sha256": "
|
|
145
|
+
"sha256": "1cb690260144b33fe2c149348d5f048454a90c525285aa768de326cf097a7be9"
|
|
146
146
|
},
|
|
147
147
|
{
|
|
148
148
|
"path": ".claude/skills/goal-create/SKILL.md",
|
|
@@ -3362,7 +3362,7 @@
|
|
|
3362
3362
|
{
|
|
3363
3363
|
"path": "modules/lifecycle/db.js",
|
|
3364
3364
|
"mode": "0000644",
|
|
3365
|
-
"sha256": "
|
|
3365
|
+
"sha256": "77528182c408edf2b8f3e07382bb83f97a7d668b979e97e60e4ff0c2e1bc7109"
|
|
3366
3366
|
},
|
|
3367
3367
|
{
|
|
3368
3368
|
"path": "modules/lifecycle/done-when.js",
|
|
@@ -4012,12 +4012,12 @@
|
|
|
4012
4012
|
{
|
|
4013
4013
|
"path": "package-lock.json",
|
|
4014
4014
|
"mode": "0000644",
|
|
4015
|
-
"sha256": "
|
|
4015
|
+
"sha256": "0a1787d27918736a0349bf2963267b7b164b874fa36cead87070f4ef72216385"
|
|
4016
4016
|
},
|
|
4017
4017
|
{
|
|
4018
4018
|
"path": "package.json",
|
|
4019
4019
|
"mode": "0000644",
|
|
4020
|
-
"sha256": "
|
|
4020
|
+
"sha256": "b720c31ba0ccf0ef270d7342c8cc3b0e99a9d93e720145176b4f86fc2dfa266a"
|
|
4021
4021
|
},
|
|
4022
4022
|
{
|
|
4023
4023
|
"path": "public-docs/index.html",
|
|
@@ -5637,7 +5637,7 @@
|
|
|
5637
5637
|
{
|
|
5638
5638
|
"path": "src/module-api.js",
|
|
5639
5639
|
"mode": "0000644",
|
|
5640
|
-
"sha256": "
|
|
5640
|
+
"sha256": "aec58f6fb1a7383beb03097fc4acea896237d45f75246101f0db10e573fc4725"
|
|
5641
5641
|
},
|
|
5642
5642
|
{
|
|
5643
5643
|
"path": "src/module-loader/loader.js",
|
|
@@ -6832,7 +6832,7 @@
|
|
|
6832
6832
|
{
|
|
6833
6833
|
"path": "tests/migration_allocation.mjs",
|
|
6834
6834
|
"mode": "0000644",
|
|
6835
|
-
"sha256": "
|
|
6835
|
+
"sha256": "08db201ebec44ea5a711e3c86e36dda63ec22881a400e910dd7c64961c80f6e9"
|
|
6836
6836
|
},
|
|
6837
6837
|
{
|
|
6838
6838
|
"path": "tests/migration_namespace.mjs",
|
|
@@ -7439,6 +7439,11 @@
|
|
|
7439
7439
|
"mode": "0000644",
|
|
7440
7440
|
"sha256": "7e4f4270188771f1fc1fa7d68e9730b4562fb772ee9ecbd04b65fd1738ee9795"
|
|
7441
7441
|
},
|
|
7442
|
+
{
|
|
7443
|
+
"path": "tests/skill_docs_unavailable_regrade.mjs",
|
|
7444
|
+
"mode": "0000644",
|
|
7445
|
+
"sha256": "0eeccae9320f419667cf9ede3c13671a5b03571f7f2f17067bff1857234ddf91"
|
|
7446
|
+
},
|
|
7442
7447
|
{
|
|
7443
7448
|
"path": "tests/skill_prefs.mjs",
|
|
7444
7449
|
"mode": "0000644",
|
|
@@ -60,7 +60,7 @@ Between passes, report progress in one line — which task landed, what is next,
|
|
|
60
60
|
|
|
61
61
|
Two more halts are yours to detect, not the script's:
|
|
62
62
|
|
|
63
|
-
- **`ship_failed`** — the ship bounced, the grade failed, or the task did not reach `shipped`.
|
|
63
|
+
- **`ship_failed`** — the ship bounced, the grade failed, or the task did not reach `shipped`. Tell the two non-pass grade shapes apart first: **`GRADER UNAVAILABLE`** (`panel_outcome='unavailable'`) is **not a quality rejection** — the panel could not run, there is nothing to fix, and `node scripts/gds/ship.js <id> --regrade` re-runs the grade once the grader is reachable (a recoverable pause, not a halt). A genuine **`FAIL`** has findings: fix, commit, re-run `node scripts/gds/ship.js <id> --regrade`; if it still will not land, halt and report.
|
|
64
64
|
- **`scope_surprise`** — the task turns out to need work outside its `touches[]`, or its premise is wrong (the thing it describes is already done, or no longer true). Do not quietly widen the scope; that is a new task.
|
|
65
65
|
|
|
66
66
|
**On any halt:** leave the current task claimed, stop, and report — what you hit, which task, and what it needs from a human. Then say plainly what already landed. Everything shipped stays shipped; a halt costs the rest of the run, not the work done.
|
|
@@ -19,6 +19,11 @@ The CLI drives a **three-state lifecycle** with a subagent grader between states
|
|
|
19
19
|
|
|
20
20
|
`/builder-ship` runs steps 1 + 2 inline; on auto-confirm it chains into step 3 (push, merge on main, smoke, deploy).
|
|
21
21
|
|
|
22
|
+
**Two non-pass grade shapes — tell them apart before reacting:**
|
|
23
|
+
|
|
24
|
+
- **`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`.
|
|
25
|
+
- **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`.
|
|
26
|
+
|
|
22
27
|
(Dev-box game 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).
|
|
23
28
|
|
|
24
29
|
## How to use
|
|
@@ -48,7 +48,9 @@ Runs the recurring "claim, fix, and ship task NNNN" macro end to end. Its own va
|
|
|
48
48
|
node scripts/gds/api.js GET /api/gds/tasks/<id>
|
|
49
49
|
```
|
|
50
50
|
- `shipped` (or `confirmed`, awaiting `/merge-mode`) → done; relay the completion card per `/builder-ship`.
|
|
51
|
-
- Still `completed` →
|
|
51
|
+
- Still `completed` → read the grade shape before reacting; two distinct outcomes park a task here:
|
|
52
|
+
- **`GRADER UNAVAILABLE`** (`panel_outcome='unavailable'`) — the panel could not run (infra outage/bypass). **Not a quality rejection**: there are no findings to fix. Re-run the grade when the grader is reachable: `node scripts/gds/ship.js <id> --regrade`.
|
|
53
|
+
- **A genuine `FAIL`** — the grader bounced it with findings. **Surface its feedback verbatim** — don't paraphrase or summarize away the specifics — then loop back to step 4 with that feedback in hand; fix, commit, and re-grade: `node scripts/gds/ship.js <id> --regrade`.
|
|
52
54
|
|
|
53
55
|
## Constraints
|
|
54
56
|
|
package/modules/lifecycle/db.js
CHANGED
|
@@ -1474,6 +1474,7 @@ async function findTaskBySourceRef({ source, sourceRef } = {}, deps = {}) {
|
|
|
1474
1474
|
|
|
1475
1475
|
const TASK_SETTER_COLUMNS = new Set([
|
|
1476
1476
|
'kind', 'discipline', 'newcomer_friendly', 'security_sensitive', 'parallel_safe', 'automation_tag',
|
|
1477
|
+
'needs_migration', 'module_key',
|
|
1477
1478
|
]);
|
|
1478
1479
|
|
|
1479
1480
|
async function updateTaskColumn(id, column, value) {
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.34",
|
|
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.34",
|
|
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.34",
|
|
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/src/module-api.js
CHANGED
|
@@ -491,8 +491,12 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
|
|
|
491
491
|
// landed since 1.19.30 with no explicit bump. run 31503461332. (task 1002620)
|
|
492
492
|
// 1.19.32 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
493
493
|
// landed since 1.19.31 with no explicit bump. run 31504858325. (task 1002620)
|
|
494
|
+
// 1.19.33 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
495
|
+
// landed since 1.19.32 with no explicit bump. run 31505528205. (task 1002620)
|
|
496
|
+
// 1.19.34 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
497
|
+
// landed since 1.19.33 with no explicit bump. run 31505952506. (task 1002620)
|
|
494
498
|
// ---------------------------------------------------------------------------
|
|
495
|
-
const CORE_VERSION = '1.19.
|
|
499
|
+
const CORE_VERSION = '1.19.34'; // CI auto-patch carrier (ADR 0161); see changelog above
|
|
496
500
|
|
|
497
501
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
498
502
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|
|
@@ -177,6 +177,41 @@ function shouldReserveMigrationNumber(task) {
|
|
|
177
177
|
}
|
|
178
178
|
});
|
|
179
179
|
|
|
180
|
+
// Runtime wiring, not source text: every column setter must clear the
|
|
181
|
+
// TASK_SETTER_COLUMNS allowlist inside updateTaskColumn. The needs_migration
|
|
182
|
+
// setter shipped throwing at runtime because only a source-regex test covered
|
|
183
|
+
// it — and the same gap had silently broken updateTaskModuleKey (module_key
|
|
184
|
+
// was never allowlisted). Stub the shared pool and drive the real functions.
|
|
185
|
+
await test('every task column setter clears the updateTaskColumn allowlist at runtime', async () => {
|
|
186
|
+
const { pool } = require('../src/bongos/pool.js');
|
|
187
|
+
const realQuery = pool.query;
|
|
188
|
+
const seen = [];
|
|
189
|
+
pool.query = async (sql, params) => { seen.push({ sql, params }); return { rows: [{}] }; };
|
|
190
|
+
try {
|
|
191
|
+
const db = require('../modules/lifecycle/db.js');
|
|
192
|
+
const setters = [
|
|
193
|
+
[() => db.updateTaskKind(1, 'bug'), 'kind'],
|
|
194
|
+
[() => db.updateTaskDiscipline(1, 'engineer'), 'discipline'],
|
|
195
|
+
[() => db.updateTaskNewcomerFriendly(1, true), 'newcomer_friendly'],
|
|
196
|
+
[() => db.updateTaskParallelSafe(1, true), 'parallel_safe'],
|
|
197
|
+
[() => db.updateTaskAutomationTag(1, 'live-only'), 'automation_tag'],
|
|
198
|
+
[() => db.updateTaskNeedsMigration(1, false), 'needs_migration'],
|
|
199
|
+
[() => db.updateTaskModuleKey(1, null), 'module_key'],
|
|
200
|
+
];
|
|
201
|
+
for (const [call, column] of setters) {
|
|
202
|
+
const before = seen.length;
|
|
203
|
+
await call(); // throws here if the column is missing from the allowlist
|
|
204
|
+
assert.ok(seen.length > before, `${column} setter must reach pool.query`);
|
|
205
|
+
assert.ok(
|
|
206
|
+
seen[seen.length - 1].sql.includes(`SET ${column} =`),
|
|
207
|
+
`${column} setter must UPDATE its own column`
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
} finally {
|
|
211
|
+
pool.query = realQuery;
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
|
|
180
215
|
await test('PATCH /tasks/:id accepts needs_migration so a wrong flag is correctable', () => {
|
|
181
216
|
assert.ok(
|
|
182
217
|
/needs_migration: \{ type: 'boolean' \}/.test(routesSrc),
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// tests/skill_docs_unavailable_regrade.mjs — the builder-facing skills teach
|
|
2
|
+
// unavailable-vs-fail + the --regrade recovery command (task 1002654, Wave 2 of
|
|
3
|
+
// the grader-hardening evaluation). A GRADER UNAVAILABLE outcome
|
|
4
|
+
// (panel_outcome='unavailable', R01/R02) is not a quality rejection, and every
|
|
5
|
+
// skill that walks a builder through shipping must say so and name the recovery:
|
|
6
|
+
// node scripts/gds/ship.js <id> --regrade
|
|
7
|
+
import assert from 'node:assert/strict';
|
|
8
|
+
import { test } from 'node:test';
|
|
9
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
|
|
13
|
+
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
14
|
+
const SKILLS = ['builder-ship', 'fix-task', 'builder-sequence'];
|
|
15
|
+
|
|
16
|
+
// .claude/skills is INSTANCE-materialized; a neutral core checkout carries none
|
|
17
|
+
// (task 1002470) — check what exists, with a non-vacuity guard like file_map.mjs.
|
|
18
|
+
const present = SKILLS
|
|
19
|
+
.map((name) => ({ name, file: path.join(ROOT, '.claude', 'skills', name, 'SKILL.md') }))
|
|
20
|
+
.filter(({ file }) => existsSync(file));
|
|
21
|
+
|
|
22
|
+
test('ship-path skills name the unavailable-vs-fail distinction and the --regrade recovery', () => {
|
|
23
|
+
for (const { name, file } of present) {
|
|
24
|
+
const md = readFileSync(file, 'utf8');
|
|
25
|
+
assert.ok(md.includes("panel_outcome='unavailable'"),
|
|
26
|
+
`${name}: must name the grader-outage outcome (panel_outcome='unavailable')`);
|
|
27
|
+
assert.match(md, /not a quality rejection/i,
|
|
28
|
+
`${name}: must say an unavailable grade is NOT a quality rejection`);
|
|
29
|
+
assert.match(md, /node scripts\/gds\/ship\.js <(?:task-)?id> --regrade/,
|
|
30
|
+
`${name}: must name the recovery command: node scripts/gds/ship.js <id> --regrade`);
|
|
31
|
+
}
|
|
32
|
+
if (existsSync(path.join(ROOT, '.claude', 'skills'))) {
|
|
33
|
+
assert.ok(present.length > 0, '.claude/skills exists but none of the ship-path skills were found — the check went vacuous');
|
|
34
|
+
}
|
|
35
|
+
});
|