@bongos/core 1.19.495 → 1.19.496
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 +11 -11
- package/docs/module-api-changelog.md +2 -0
- package/modules/lifecycle/goal-advisory.js +9 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/module-api.js +1 -1
- package/tests/goal_advisory.mjs +28 -0
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.496",
|
|
6
|
+
"core_contract": "1.19.496",
|
|
7
|
+
"source_commit": "8c795e90254fbc29139c278e0fd6d890b2c32035",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-03T14:
|
|
9
|
+
"built_at": "2026-09-03T14:22:08.467Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 425,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 2387,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "a6e4b7c3e281c43562758626b607ca7c0fa66491a11f41433d821d9a4e94d839",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -2567,7 +2567,7 @@
|
|
|
2567
2567
|
{
|
|
2568
2568
|
"path": "docs/module-api-changelog.md",
|
|
2569
2569
|
"mode": "0000644",
|
|
2570
|
-
"sha256": "
|
|
2570
|
+
"sha256": "f7ca8307d5cae80f0602080d5d3fc9944cc15d9fc5d2fdf43f45d89626edd039"
|
|
2571
2571
|
},
|
|
2572
2572
|
{
|
|
2573
2573
|
"path": "docs/modules-contract.md",
|
|
@@ -5312,7 +5312,7 @@
|
|
|
5312
5312
|
{
|
|
5313
5313
|
"path": "modules/lifecycle/goal-advisory.js",
|
|
5314
5314
|
"mode": "0000644",
|
|
5315
|
-
"sha256": "
|
|
5315
|
+
"sha256": "494c93f4cc64eb8dbc23039fa50a27b8242ba09b5afa0843ca985c807e312b6c"
|
|
5316
5316
|
},
|
|
5317
5317
|
{
|
|
5318
5318
|
"path": "modules/lifecycle/goal-authz.js",
|
|
@@ -7212,12 +7212,12 @@
|
|
|
7212
7212
|
{
|
|
7213
7213
|
"path": "package-lock.json",
|
|
7214
7214
|
"mode": "0000644",
|
|
7215
|
-
"sha256": "
|
|
7215
|
+
"sha256": "cb12024e16aedcd701269af77cc73012013873d07e37301c24ae10e3c1f2d28b"
|
|
7216
7216
|
},
|
|
7217
7217
|
{
|
|
7218
7218
|
"path": "package.json",
|
|
7219
7219
|
"mode": "0000644",
|
|
7220
|
-
"sha256": "
|
|
7220
|
+
"sha256": "ccfb94ab67d5acffc5c910496496a9cfbe44343ff52b90098857338dda375bae"
|
|
7221
7221
|
},
|
|
7222
7222
|
{
|
|
7223
7223
|
"path": "public-docs/index.html",
|
|
@@ -8882,7 +8882,7 @@
|
|
|
8882
8882
|
{
|
|
8883
8883
|
"path": "src/module-api.js",
|
|
8884
8884
|
"mode": "0000644",
|
|
8885
|
-
"sha256": "
|
|
8885
|
+
"sha256": "2b403360f3b811aecd3de800ebb5cb87dbc5df36e045754184dd3924abc187f9"
|
|
8886
8886
|
},
|
|
8887
8887
|
{
|
|
8888
8888
|
"path": "src/module-loader/catalog.js",
|
|
@@ -9917,7 +9917,7 @@
|
|
|
9917
9917
|
{
|
|
9918
9918
|
"path": "tests/goal_advisory.mjs",
|
|
9919
9919
|
"mode": "0000644",
|
|
9920
|
-
"sha256": "
|
|
9920
|
+
"sha256": "1a7498e0a1927485db9a9e99b19012dc7df91825b11077b283a95b23971fe86e"
|
|
9921
9921
|
},
|
|
9922
9922
|
{
|
|
9923
9923
|
"path": "tests/goal_category.mjs",
|
|
@@ -1427,5 +1427,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
1427
1427
|
landed since 1.19.493 with no explicit bump. run 33697218855. (task 1002620)
|
|
1428
1428
|
1.19.495 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1429
1429
|
landed since 1.19.494 with no explicit bump. run 33766103175. (task 1002620)
|
|
1430
|
+
1.19.496 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1431
|
+
landed since 1.19.495 with no explicit bump. run 33766363834. (task 1002620)
|
|
1430
1432
|
---------------------------------------------------------------------------
|
|
1431
1433
|
```
|
|
@@ -40,8 +40,14 @@ function generalGoalTitle(versionId) {
|
|
|
40
40
|
// authorization gate. This is advice appended to a request that ALREADY SUCCEEDED;
|
|
41
41
|
// a wrong guess here nags a builder about a task that is fine, which is worse than
|
|
42
42
|
// staying quiet. A missing versionId or an unreadable goal title yields null.
|
|
43
|
-
|
|
43
|
+
//
|
|
44
|
+
// kind='bug' is a THIRD silent case (task 1003214, idea 1000828 — the owner
|
|
45
|
+
// directive against manufacturing small goals): a fix sitting in the catch-all,
|
|
46
|
+
// or with no goal at all, is already where it belongs, so both reasons above
|
|
47
|
+
// collapse to null for a bug. The nudge is for homeless FEATURE work only.
|
|
48
|
+
function adviseGoal({ versionId, goalId, goalTitle, kind } = {}) {
|
|
44
49
|
if (goalId == null) {
|
|
50
|
+
if (kind === 'bug') return null;
|
|
45
51
|
return {
|
|
46
52
|
reason: 'no_goal',
|
|
47
53
|
message: 'This task has no goal to live in — no scope wall, no done-when criteria gating it, '
|
|
@@ -53,6 +59,7 @@ function adviseGoal({ versionId, goalId, goalTitle } = {}) {
|
|
|
53
59
|
}
|
|
54
60
|
if (versionId == null || typeof goalTitle !== 'string') return null;
|
|
55
61
|
if (goalTitle !== generalGoalTitle(versionId)) return null;
|
|
62
|
+
if (kind === 'bug') return null;
|
|
56
63
|
return {
|
|
57
64
|
reason: 'catch_all',
|
|
58
65
|
message: `This task landed in "${goalTitle}", the version's catch-all bucket rather than a real goal — `
|
|
@@ -93,6 +100,7 @@ async function buildGoalAdvisory({ db, versionId, task }) {
|
|
|
93
100
|
versionId,
|
|
94
101
|
goalId: task.goal_id,
|
|
95
102
|
goalTitle: homeGoal && homeGoal.title,
|
|
103
|
+
kind: task.kind,
|
|
96
104
|
});
|
|
97
105
|
if (!verdict) return null;
|
|
98
106
|
// LIMIT 6, not 6-in-JS: Postgres truncates instead of shipping every open goal
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.496",
|
|
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.496",
|
|
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.496",
|
|
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
|
@@ -45,7 +45,7 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
|
|
|
45
45
|
// there. scripts/gds/bump-version.js still rewrites the literal below; it appends
|
|
46
46
|
// the entry to that file. Look for a version's history there, not here.
|
|
47
47
|
// ---------------------------------------------------------------------------
|
|
48
|
-
const CORE_VERSION = '1.19.
|
|
48
|
+
const CORE_VERSION = '1.19.496'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
49
49
|
|
|
50
50
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
51
51
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|
package/tests/goal_advisory.mjs
CHANGED
|
@@ -55,10 +55,30 @@ await test('catch_all — landing in "<version> — general" is a bucket, not a
|
|
|
55
55
|
assert.equal(a.goal_id, 3, 'names the catch-all so a caller can PATCH away from it');
|
|
56
56
|
});
|
|
57
57
|
|
|
58
|
+
// task 1003214 (idea 1000828): a bug in the catch-all is where it belongs, so the
|
|
59
|
+
// advisory goes silent (reuses the same null the module already uses for "no
|
|
60
|
+
// advice needed").
|
|
61
|
+
await test("kind='bug' in the catch-all is quiet — a fix is where it belongs", () => {
|
|
62
|
+
assert.equal(adviseGoal({ versionId: V, goalId: 3, goalTitle: generalGoalTitle(V), kind: 'bug' }), null);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
await test("kind='feature' in the catch-all still gets the nudge — quiet is bug-only", () => {
|
|
66
|
+
const a = adviseGoal({ versionId: V, goalId: 3, goalTitle: generalGoalTitle(V), kind: 'feature' });
|
|
67
|
+
assert.equal(a.reason, 'catch_all');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
await test("kind='bug' with no goal at all is quiet too — a fix needs no home to be filed correctly", () => {
|
|
71
|
+
assert.equal(adviseGoal({ versionId: V, goalId: null, kind: 'bug' }), null);
|
|
72
|
+
});
|
|
73
|
+
|
|
58
74
|
await test('a REAL goal is silent — null, not an empty object', () => {
|
|
59
75
|
assert.equal(adviseGoal({ versionId: V, goalId: 1000025, goalTitle: 'Builder experience — hall, dev box, and skills' }), null);
|
|
60
76
|
});
|
|
61
77
|
|
|
78
|
+
await test("kind='bug' under a real goal is silent too — already silent, kind changes nothing", () => {
|
|
79
|
+
assert.equal(adviseGoal({ versionId: V, goalId: 1000025, goalTitle: 'Builder experience — hall, dev box, and skills', kind: 'bug' }), null);
|
|
80
|
+
});
|
|
81
|
+
|
|
62
82
|
// The bug this guards: a near-miss title must not be mistaken for the catch-all.
|
|
63
83
|
// db.generalGoalIdForVersion resolves the SAME string, so if these two ever disagree
|
|
64
84
|
// a task would be filed into a goal the advisory then calls orphaned (or vice versa).
|
|
@@ -164,6 +184,14 @@ await test('buildGoalAdvisory: the catch-all is detected and named', async () =>
|
|
|
164
184
|
assert.equal(a.goal_id, 3);
|
|
165
185
|
});
|
|
166
186
|
|
|
187
|
+
// task 1003214: the full POST /tasks path (buildGoalAdvisory reads task.kind
|
|
188
|
+
// off the already-committed row) for a bug landed in the catch-all — silent.
|
|
189
|
+
await test("buildGoalAdvisory: kind='bug' in the catch-all yields null end to end", async () => {
|
|
190
|
+
const db = stubDb({ goal: { id: 3, title: generalGoalTitle(V) }, goals: [] });
|
|
191
|
+
const a = await buildGoalAdvisory({ db, versionId: V, task: { id: 7, goal_id: 3, kind: 'bug' } });
|
|
192
|
+
assert.equal(a, null);
|
|
193
|
+
});
|
|
194
|
+
|
|
167
195
|
// The invariant a future refactor will quietly break. Both DB calls are covered:
|
|
168
196
|
// getGoal is only reached when goal_id is set, listGoals only on the unhappy path.
|
|
169
197
|
await test('NON-BLOCKING: buildGoalAdvisory returns null when getGoal throws', async () => {
|