@bongos/core 1.19.602 → 1.19.604
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 +14 -14
- package/docs/module-api-changelog.md +4 -0
- package/docs/onboarding/diagrams/05-versioning.mmd +2 -0
- package/docs/onboarding/diagrams/assertions.json +4 -0
- package/modules/lifecycle/db-versions.js +18 -2
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/module-api.js +1 -1
- package/tests/version_promotion.mjs +5 -1
- package/tests/version_roll_forward.mjs +37 -1
package/.bongos-core.json
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
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.604",
|
|
6
|
+
"core_contract": "1.19.604",
|
|
7
|
+
"source_commit": "a0b8d2452aa627d45214f54b63305c41150dfffd",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-
|
|
9
|
+
"built_at": "2026-09-08T23:04:26.027Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 457,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 2558,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "e207bd28e7b6dfedc243c12724dc4419850b2fd1b573af52c057014c148408ee",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -2727,7 +2727,7 @@
|
|
|
2727
2727
|
{
|
|
2728
2728
|
"path": "docs/module-api-changelog.md",
|
|
2729
2729
|
"mode": "0000644",
|
|
2730
|
-
"sha256": "
|
|
2730
|
+
"sha256": "e2b518f8b64d95ee83ea4821e25942fc0b37e6ac3c3ebf0c2351ffad064f7020"
|
|
2731
2731
|
},
|
|
2732
2732
|
{
|
|
2733
2733
|
"path": "docs/modules-contract.md",
|
|
@@ -2762,7 +2762,7 @@
|
|
|
2762
2762
|
{
|
|
2763
2763
|
"path": "docs/onboarding/diagrams/05-versioning.mmd",
|
|
2764
2764
|
"mode": "0000644",
|
|
2765
|
-
"sha256": "
|
|
2765
|
+
"sha256": "9953ad9844456ab15b151e7e0d9c4bdedbde2551e59e6626ca00b18acee413b8"
|
|
2766
2766
|
},
|
|
2767
2767
|
{
|
|
2768
2768
|
"path": "docs/onboarding/diagrams/README.md",
|
|
@@ -2772,7 +2772,7 @@
|
|
|
2772
2772
|
{
|
|
2773
2773
|
"path": "docs/onboarding/diagrams/assertions.json",
|
|
2774
2774
|
"mode": "0000644",
|
|
2775
|
-
"sha256": "
|
|
2775
|
+
"sha256": "01096656b5a5aef3a11322dbde7a3339f9605388186d7e25e2e6b2c2aaee198b"
|
|
2776
2776
|
},
|
|
2777
2777
|
{
|
|
2778
2778
|
"path": "docs/onboarding/diagrams/puppeteer-config.json",
|
|
@@ -5567,7 +5567,7 @@
|
|
|
5567
5567
|
{
|
|
5568
5568
|
"path": "modules/lifecycle/db-versions.js",
|
|
5569
5569
|
"mode": "0000644",
|
|
5570
|
-
"sha256": "
|
|
5570
|
+
"sha256": "51b170cdd34a90c49070ec79723b5250dffbc8c61d5ed114d6a560bcc93cadb7"
|
|
5571
5571
|
},
|
|
5572
5572
|
{
|
|
5573
5573
|
"path": "modules/lifecycle/db.js",
|
|
@@ -7627,12 +7627,12 @@
|
|
|
7627
7627
|
{
|
|
7628
7628
|
"path": "package-lock.json",
|
|
7629
7629
|
"mode": "0000644",
|
|
7630
|
-
"sha256": "
|
|
7630
|
+
"sha256": "5641c682f6618871cdcb765ee962b6b7ce884bad1786e6ee4a24c8bf0a43f8c0"
|
|
7631
7631
|
},
|
|
7632
7632
|
{
|
|
7633
7633
|
"path": "package.json",
|
|
7634
7634
|
"mode": "0000644",
|
|
7635
|
-
"sha256": "
|
|
7635
|
+
"sha256": "a725aa33a88eadd39a01540bd819b5856c541d3d10f6386bcd8ee05b70497377"
|
|
7636
7636
|
},
|
|
7637
7637
|
{
|
|
7638
7638
|
"path": "public-docs/index.html",
|
|
@@ -9347,7 +9347,7 @@
|
|
|
9347
9347
|
{
|
|
9348
9348
|
"path": "src/module-api.js",
|
|
9349
9349
|
"mode": "0000644",
|
|
9350
|
-
"sha256": "
|
|
9350
|
+
"sha256": "ec2543ebf2e3bd98d8497238975cec5bccc13cbff7f8835b42bec4757ae078f9"
|
|
9351
9351
|
},
|
|
9352
9352
|
{
|
|
9353
9353
|
"path": "src/module-loader/catalog.js",
|
|
@@ -12727,12 +12727,12 @@
|
|
|
12727
12727
|
{
|
|
12728
12728
|
"path": "tests/version_promotion.mjs",
|
|
12729
12729
|
"mode": "0000644",
|
|
12730
|
-
"sha256": "
|
|
12730
|
+
"sha256": "a2be1bb9ea506cac6f1d7e4c54fe4dbd07fbca5fbd64624c099c0faf8be528de"
|
|
12731
12731
|
},
|
|
12732
12732
|
{
|
|
12733
12733
|
"path": "tests/version_roll_forward.mjs",
|
|
12734
12734
|
"mode": "0000644",
|
|
12735
|
-
"sha256": "
|
|
12735
|
+
"sha256": "cb4b723c632f3ec5f3bdbf06057d252bfbe3052841548a8ac386984c52447fc9"
|
|
12736
12736
|
},
|
|
12737
12737
|
{
|
|
12738
12738
|
"path": "tests/versions_route.mjs",
|
|
@@ -1653,5 +1653,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
1653
1653
|
landed since 1.19.600 with no explicit bump. run 34188958832. (task 1002620)
|
|
1654
1654
|
1.19.602 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1655
1655
|
landed since 1.19.601 with no explicit bump. run 34189930315. (task 1002620)
|
|
1656
|
+
1.19.603 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1657
|
+
landed since 1.19.602 with no explicit bump. run 34191126290. (task 1002620)
|
|
1658
|
+
1.19.604 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1659
|
+
landed since 1.19.603 with no explicit bump. run 34288910914. (task 1002620)
|
|
1656
1660
|
---------------------------------------------------------------------------
|
|
1657
1661
|
```
|
|
@@ -18,6 +18,8 @@ flowchart TB
|
|
|
18
18
|
v_GDS_V4 --> v_BONGOS_V1
|
|
19
19
|
v_CB_V1["CB-V1 — building"]
|
|
20
20
|
v_BONGOS_V1 --> v_CB_V1
|
|
21
|
+
v_BONGOS_V2["BONGOS-V2 — planning"]
|
|
22
|
+
v_CB_V1 --> v_BONGOS_V2
|
|
21
23
|
end
|
|
22
24
|
VERSIONS --> CLOSE["Version close — all done_when_criteria satisfied"]
|
|
23
25
|
CLOSE --> ARCHIVE["Archive scope to limitations/*.md; status=shipped"]
|
|
@@ -404,11 +404,27 @@ async function closeVersion({ versionId, plan = [], reason, planningVersionId =
|
|
|
404
404
|
// Smoke fixtures are excluded on the same terms as the abandon branch, so
|
|
405
405
|
// both doors agree about what "unfinished" means.
|
|
406
406
|
const { rows: moved } = await client.query(
|
|
407
|
-
|
|
407
|
+
// THE VERSION MOVES WITH THE GOAL (task 1003710). Setting only
|
|
408
|
+
// `goal_id` leaves the task in a goal on the SUCCESSOR while still
|
|
409
|
+
// stamped with the version that just closed, and that column is not
|
|
410
|
+
// decoration: `version_progress` joins `tasks t ON t.version_id = v.id`
|
|
411
|
+
// and `version-close.js` filters `WHERE version_id = $1` in three
|
|
412
|
+
// places. A half-moved task therefore counts against a SHIPPED version
|
|
413
|
+
// forever, never counts toward the successor, and leaves the closed
|
|
414
|
+
// version still reporting carry-over it no longer holds — surfacing as
|
|
415
|
+
// "V1 closed but still shows N carried", a long way from here.
|
|
416
|
+
//
|
|
417
|
+
// Identical to the fix task 1003709 made to `carryBugsForward`
|
|
418
|
+
// (db-goals.js). Both halves of the boundary move — the roll-forward
|
|
419
|
+
// here and the maintenance carry-over there — and I shipped both with
|
|
420
|
+
// the same defect while only one got fixed. tests/version_roll_forward.mjs
|
|
421
|
+
// now pins the two against each other so the next edit cannot drift one
|
|
422
|
+
// without the other.
|
|
423
|
+
`UPDATE tasks SET goal_id = $2, version_id = $3, updated_at = now()
|
|
408
424
|
WHERE goal_id = $1 AND ${nonTerminalSql('status')}
|
|
409
425
|
AND title NOT LIKE '\\_\\_smoke\\_\\_%' ESCAPE '\\'
|
|
410
426
|
RETURNING id`,
|
|
411
|
-
[step.goalId, successorId]
|
|
427
|
+
[step.goalId, successorId, planningVersionId]
|
|
412
428
|
);
|
|
413
429
|
|
|
414
430
|
await client.query(
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.604",
|
|
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.604",
|
|
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.604",
|
|
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
|
@@ -55,7 +55,7 @@ const { buildInfo } = require('./build-info');
|
|
|
55
55
|
// there. scripts/gds/bump-version.js still rewrites the literal below; it appends
|
|
56
56
|
// the entry to that file. Look for a version's history there, not here.
|
|
57
57
|
// ---------------------------------------------------------------------------
|
|
58
|
-
const CORE_VERSION = '1.19.
|
|
58
|
+
const CORE_VERSION = '1.19.604'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
59
59
|
|
|
60
60
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
61
61
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|
|
@@ -128,7 +128,11 @@ test('the hook is composed in the ROUTE, not inside closeVersion', () => {
|
|
|
128
128
|
// the module's require DAG — and the route is the one place already holding the
|
|
129
129
|
// whole facade. Reaching sideways between the units is how that DAG stops being
|
|
130
130
|
// one.
|
|
131
|
-
|
|
131
|
+
// Comments stripped: db-versions.js NAMES carryBugsForward in prose (task
|
|
132
|
+
// 1003710's fix note points at the identical fix made there), and a check that
|
|
133
|
+
// read the explanation would fail on the cross-reference rather than on a call.
|
|
134
|
+
const dbvCode = DBV.replace(/\/\/[^\n]*/g, '');
|
|
135
|
+
assert.equal(/carryBugsForward/.test(dbvCode), false,
|
|
132
136
|
'db-versions.js must not reach into db-goals.js');
|
|
133
137
|
assert.match(ROUTES, /db\.promotePlanningVersion\(client\)/);
|
|
134
138
|
assert.match(ROUTES, /db\.carryBugsForward\(/);
|
|
@@ -36,7 +36,16 @@ const ROUTES = src('modules/lifecycle/routes/versions.js');
|
|
|
36
36
|
|
|
37
37
|
// The roll_forward branch, sliced so assertions land on the right code.
|
|
38
38
|
const CLOSE = DBV.slice(DBV.indexOf('async function closeVersion'));
|
|
39
|
-
|
|
39
|
+
// The roll_forward branch, bounded by its own `else {` and the invariant check
|
|
40
|
+
// that follows the disposition loop. Anchored on real markers rather than a
|
|
41
|
+
// character offset: a `- 4000` window silently stopped reaching the branch's own
|
|
42
|
+
// guard the moment the branch grew (task 1003710 added a comment and broke it).
|
|
43
|
+
const ROLL = (() => {
|
|
44
|
+
const start = CLOSE.lastIndexOf('} else {', CLOSE.indexOf("verb: 'roll_forward', result: 'succeeded'"));
|
|
45
|
+
const end = CLOSE.indexOf('// The invariant');
|
|
46
|
+
if (start === -1 || end === -1) throw new Error('roll_forward branch markers moved — fix this slice, do not widen it');
|
|
47
|
+
return CLOSE.slice(start, end);
|
|
48
|
+
})();
|
|
40
49
|
|
|
41
50
|
// ---------------------------------------------------------------------------
|
|
42
51
|
// The lineage
|
|
@@ -95,6 +104,33 @@ test('only UNFINISHED tasks are re-pointed; shipped work stays with the version
|
|
|
95
104
|
assert.match(move, /smoke/, 'smoke fixtures are excluded on the same terms as the abandon branch');
|
|
96
105
|
});
|
|
97
106
|
|
|
107
|
+
test('the VERSION moves with the goal, not just the goal_id (task 1003710)', () => {
|
|
108
|
+
// THE BUG THIS PINS, and it shipped. Setting only `goal_id` leaves the task in
|
|
109
|
+
// a goal on the successor while still stamped with the version that closed.
|
|
110
|
+
// `version_progress` joins `tasks t ON t.version_id = v.id` and
|
|
111
|
+
// `version-close.js` filters `WHERE version_id = $1`, so the task counts
|
|
112
|
+
// against a SHIPPED version forever, never counts toward the successor, and
|
|
113
|
+
// leaves the closed version reporting carry-over it no longer holds.
|
|
114
|
+
const move = ROLL.slice(ROLL.indexOf('UPDATE tasks SET goal_id'), ROLL.indexOf('RETURNING id`,', ROLL.indexOf('UPDATE tasks SET goal_id')));
|
|
115
|
+
assert.match(move, /version_id = \$3/, 'the successor version must be written too');
|
|
116
|
+
assert.match(ROLL, /\[step\.goalId, successorId, planningVersionId\]/, 'and bound, not interpolated');
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test('BOTH boundary moves write both columns — they cannot drift apart', () => {
|
|
120
|
+
// The roll-forward here and `carryBugsForward` in db-goals.js are the two ways
|
|
121
|
+
// a task crosses a version boundary. They shipped with the same defect and only
|
|
122
|
+
// one was fixed (task 1003709 fixed the carry-over, 1003710 this one). Pinning
|
|
123
|
+
// them against each other is what stops the next edit repeating it.
|
|
124
|
+
const dbg = src('modules/lifecycle/db-goals.js');
|
|
125
|
+
const carry = dbg.slice(dbg.indexOf('async function carryBugsForward'));
|
|
126
|
+
const carryMove = carry.slice(carry.indexOf('UPDATE tasks SET goal_id'));
|
|
127
|
+
for (const [name, sql] of [['roll_forward (db-versions.js)', ROLL.slice(ROLL.indexOf('UPDATE tasks SET goal_id'))],
|
|
128
|
+
['carryBugsForward (db-goals.js)', carryMove]]) {
|
|
129
|
+
assert.match(sql.slice(0, 200), /goal_id = \$2/, `${name}: must move goal_id`);
|
|
130
|
+
assert.match(sql.slice(0, 200), /version_id = \$3/, `${name}: must move version_id`);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
|
|
98
134
|
test('the predecessor is archived LAST, after its work has left', () => {
|
|
99
135
|
// The brief's explicit ask: it archives holding zero unfinished tasks, so it
|
|
100
136
|
// passes R10's own closure check on the way out rather than being
|