@bongos/core 1.19.208 → 1.19.209
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 +15 -10
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +121 -0
- package/src/module-api.js +3 -1
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.209",
|
|
6
|
+
"core_contract": "1.19.209",
|
|
7
|
+
"source_commit": "7163dda884c4ff7ab746790988dd3612e1271681",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-
|
|
9
|
+
"built_at": "2026-08-17T21:40:11.933Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 310,
|
|
13
13
|
"agent_docs_stubbed": 21,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 1300,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 1631,
|
|
20
|
+
"tree_sha256": "f933ba33ff7212d28d0d1b4447b760177e211576e00658e3050a7a72528c3bc5",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -4282,12 +4282,12 @@
|
|
|
4282
4282
|
{
|
|
4283
4283
|
"path": "package-lock.json",
|
|
4284
4284
|
"mode": "0000644",
|
|
4285
|
-
"sha256": "
|
|
4285
|
+
"sha256": "9a096a5f5cadd3f8dab6e2c958402e36c857ff560a14364c756161c41d573ed3"
|
|
4286
4286
|
},
|
|
4287
4287
|
{
|
|
4288
4288
|
"path": "package.json",
|
|
4289
4289
|
"mode": "0000644",
|
|
4290
|
-
"sha256": "
|
|
4290
|
+
"sha256": "9b699cde73691611630459b846d40b8a887cb51099b8d4193d775fd76f1b9749"
|
|
4291
4291
|
},
|
|
4292
4292
|
{
|
|
4293
4293
|
"path": "public-docs/index.html",
|
|
@@ -5339,6 +5339,11 @@
|
|
|
5339
5339
|
"mode": "0000644",
|
|
5340
5340
|
"sha256": "c5393ea0633f1fd60b1f6a1e86f7f86be489b74c56d2a0e947f8b262eaeab2cb"
|
|
5341
5341
|
},
|
|
5342
|
+
{
|
|
5343
|
+
"path": "scripts/gds/seed-bongos-v1-idea-routing-tasks.js",
|
|
5344
|
+
"mode": "0000644",
|
|
5345
|
+
"sha256": "1756751e8c32d9667c82173ac7ba78f98b8416aa946c747036502c5853cbf77f"
|
|
5346
|
+
},
|
|
5342
5347
|
{
|
|
5343
5348
|
"path": "scripts/gds/seed-bongos-v1-seo-tasks.js",
|
|
5344
5349
|
"mode": "0000644",
|
|
@@ -5897,7 +5902,7 @@
|
|
|
5897
5902
|
{
|
|
5898
5903
|
"path": "src/module-api.js",
|
|
5899
5904
|
"mode": "0000644",
|
|
5900
|
-
"sha256": "
|
|
5905
|
+
"sha256": "efbf7edd3c80dbce81da9aa7473ae1903674c9018da9803e6ab0e807bcb616f0"
|
|
5901
5906
|
},
|
|
5902
5907
|
{
|
|
5903
5908
|
"path": "src/module-loader/catalog.js",
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.209",
|
|
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.209",
|
|
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.209",
|
|
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",
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// Seed the tasks for goal 1000071 "Idea routing — work that has a home lands in it" (BONGOS-V1).
|
|
2
|
+
// Source of truth: docs/specs/bongos-v1-idea-routing.md (status: final).
|
|
3
|
+
// Idempotent on (source, source_ref). Re-running resolves to the existing rows.
|
|
4
|
+
//
|
|
5
|
+
// Run: node scripts/gds/seed-bongos-v1-idea-routing-tasks.js
|
|
6
|
+
const os = require('os');
|
|
7
|
+
const sess = require(os.homedir() + '/.config/cloudbongos/gds-session.json');
|
|
8
|
+
const BASE = sess.api_base.replace(/\/$/, '');
|
|
9
|
+
const TOKEN = sess.token;
|
|
10
|
+
const VER = 'BONGOS-V1';
|
|
11
|
+
const GOAL = 1000071;
|
|
12
|
+
const SRC = 'planning-session';
|
|
13
|
+
const META_TASK = 1003059; // this planning session's meta task — moved into the goal
|
|
14
|
+
const DISCORD_BUGS_IDEA = 1000771; // subsumed by R11; marked promoted against it
|
|
15
|
+
const H = { Authorization: `Bearer ${TOKEN}`, 'Content-Type': 'application/json' };
|
|
16
|
+
|
|
17
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
18
|
+
async function api(method, path, body, _tries = 0) {
|
|
19
|
+
await sleep(400); // base throttle to stay under the per-IP rate limit
|
|
20
|
+
const res = await fetch(`${BASE}/api/gds${path}`, {
|
|
21
|
+
method, headers: H, body: body ? JSON.stringify(body) : undefined,
|
|
22
|
+
});
|
|
23
|
+
const text = await res.text();
|
|
24
|
+
let json; try { json = JSON.parse(text); } catch { json = { _raw: text.slice(0, 300) }; }
|
|
25
|
+
if (res.status === 429 && _tries < 8) {
|
|
26
|
+
const wait = ((json.error && json.error.details && json.error.details.retry_after_seconds) || 30) + 1;
|
|
27
|
+
console.log(` …rate-limited, waiting ${wait}s`);
|
|
28
|
+
await sleep(wait * 1000);
|
|
29
|
+
return api(method, path, body, _tries + 1);
|
|
30
|
+
}
|
|
31
|
+
return { status: res.status, ok: res.ok, json };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Landing matrix (interview-decided): bugs hard-land (Metic+ filer → ready; sub-Metic → backlog);
|
|
35
|
+
// every other goal-bound kind soft-lands (backlog, one Metic+ promote away); homeless → inbox.
|
|
36
|
+
//
|
|
37
|
+
// crit uses the goal's criterion SLUGS via CRIT — positional "Cn" tokens resolve against the
|
|
38
|
+
// whole VERSION's criterion order (and even matched an old criterion literally slugged "C1"),
|
|
39
|
+
// which mislinked the first seed run; slugs are position-independent.
|
|
40
|
+
const CRIT = {
|
|
41
|
+
C1: 'bug-lands-in-its-goal', C2: 'inbox-holds-only-homeless', C3: 'no-route-loses-the-author',
|
|
42
|
+
C4: 'filing-cannot-outrun-rank', C5: 'system-offers-the-home', C6: 'triage-shrinks-to-judgment',
|
|
43
|
+
};
|
|
44
|
+
const TASKS = [
|
|
45
|
+
// T1 — zero-dep layer — P5
|
|
46
|
+
{ ref:'R02', kind:'infra', disc:'engineer', prio:5, est:90, crit:['C1','C3'], deps:[], title:'R02 · Schema: idea_inbox.suggested_goal_id + lineage origin \'route\'', desc:'Core migration: nullable suggested_goal_id FK on idea_inbox (routing hint for soft-landed/Discord/homeless ideas). Module migration (ideas_*): extend ideas_task_lineage.origin CHECK with \'route\'. See docs/specs/bongos-v1-idea-routing.md.' },
|
|
47
|
+
{ ref:'R03', kind:'bug', disc:'engineer', prio:5, est:90, crit:['C1'], deps:[], title:'R03 · Catch-all fallback never resolves to a non-building version', desc:'generalGoalIdForVersion (modules/lifecycle/db.js:1343) + the null-goal fallback (:1414): a task create must never land in a shipped/frozen version\'s catch-all goal (the 1000771 failure shape). Routed creates with no goal go to the inbox instead. Done-when: test proves a create against a shipped version cannot resolve a catch-all.' },
|
|
48
|
+
{ ref:'R07', kind:'feature', disc:'engineer', prio:5, est:120, crit:['C5'], deps:[], title:'R07 · Capture-time goal suggester (advisory consulted BEFORE creation)', desc:'Expose candidate goals for a draft capture — reuse buildGoalAdvisory\'s candidate logic (modules/lifecycle/goal-advisory.js:89) as a pre-creation read (e.g. GET /inbox/goal-suggestions?title=&kind=&version=). Feeds the hall picker (R08), CLI (R09), and Discord suggestion (R11). Done-when: candidates returned for a draft title/kind without creating anything.' },
|
|
49
|
+
{ ref:'R10', kind:'feature', disc:'ui', prio:5, est:120, crit:['C5'], deps:[], title:'R10 · Hall move-a-task-to-goal affordance', desc:'PATCH /tasks/:id {goal_id} (task 1763) exists but has no hall UI. Add move-to-goal on the task overlay (Metic+, task.edit) so a wrong routing pick is one reassignment, never a re-file. Done-when: a Metic+ moves a task between same-version goals from the hall.' },
|
|
50
|
+
{ ref:'R14', kind:'decision', disc:'engineer', prio:5, est:60, crit:['C2'], deps:[], title:'R14 · ADR: idea routing — capture-time promotion, the landing matrix, the homeless-only inbox', desc:'Write the ADR recording: routing mechanism is capture-time promotion (never inbox bypass — the Discord #bugs lesson), the landing matrix (bugs hard-land by rank; other kinds soft-land; Full Ideas/criterion-proposals/decisions never auto-route), and the inbox\'s new identity (holds only work without a home). Source: docs/specs/bongos-v1-idea-routing.md interview decisions.' },
|
|
51
|
+
|
|
52
|
+
// T2 — the core mechanism — P5
|
|
53
|
+
{ ref:'R01', kind:'feature', disc:'engineer', prio:5, est:240, crit:['C1','C3'], deps:['R02'], title:'R01 · Capture-time routing core: POST /inbox accepts goal_id and converts in one transaction', desc:'Extend inbox.captureIdea/route: when goal_id present and the landing matrix says route, one transaction writes the idea row (status=promoted, promoted_to_task_id), the task (in the goal, matrix-decided status), and ideas_task_lineage (origin=route). Validations: goal open + belongs to a building version; Full-grade and criterion-proposal/decision kinds never auto-route; goal-less capture behaves exactly as today. Deps R02.' },
|
|
54
|
+
|
|
55
|
+
// T3 — enforcement + surfaces — P4
|
|
56
|
+
{ ref:'R05', kind:'feature', disc:'engineer', prio:4, est:150, crit:['C4'], deps:['R01'], title:'R05 · Rank-aware landing: matrix enforcement server-side', desc:'Metic+ filer\'s bug → status=ready; sub-Metic filer / any non-bug kind → backlog (awaiting any Metic+ promote via the existing task.promote, surfaced in the Needs-your-attention slice). Auto-derived requires_rank floors (ADR 0084) and the goal scope wall run on routed tasks exactly as on authored ones. Deps R01.' },
|
|
57
|
+
{ ref:'R11', kind:'feature', disc:'engineer', prio:4, est:180, crit:['C1','C3'], deps:['R01'], title:'R11 · Discord #bugs retired onto the routing path', desc:'Replace discord-bugs.js\'s direct createTask bypass (hardcoded GDS-V3 → goal 1000002 catch-all; destroys attribution) with capture-time routing: idea row + classifier-suggested goal (suggested_goal_id), soft-landing into the pending queue for a one-click Metic+ route. Unlinked authors still yield an attributable idea row (captured_by null). Closes inbox idea 1000771. Deps R01.' },
|
|
58
|
+
{ ref:'R12', kind:'feature', disc:'engineer', prio:4, est:120, crit:['C5'], deps:['R02'], title:'R12 · Discord #ideas carries routing hints', desc:'The #ideas inbound (discord-inbound.js) files with no suggested_version at all today. Add: default suggested_version (most-recent building), classifier-suggested suggested_goal_id. Deps R02.' },
|
|
59
|
+
{ ref:'R08', kind:'feature', disc:'ui', prio:4, est:240, crit:['C1','C5'], deps:['R01','R07'], title:'R08 · Hall filing surface: file a bug/idea with a goal picker', desc:'The hall has NO capture surface today (triage only). Add file-a-bug/idea: title, body, kind, goal picker fed by the suggester (R07); submits to POST /inbox with goal_id so goal-bound work routes at filing time. Grade capture untouched. Deps R01,R07.' },
|
|
60
|
+
{ ref:'R09', kind:'feature', disc:'engineer', prio:4, est:120, crit:['C1','C5'], deps:['R01','R07'], title:'R09 · CLI capture routing: --goal, suggester prompt, active-claim default', desc:'capture.js gains --goal; when the builder holds a claim the suggested goal defaults to the claim\'s goal (interview decision 4); suggester candidates offered otherwise. Deps R01,R07.' },
|
|
61
|
+
{ ref:'R13', kind:'feature', disc:'engineer', prio:4, est:120, crit:['C2','C6'], deps:['R07'], title:'R13 · Promote path passes goal_id; /idea-triage goes homeless-only', desc:'task-detail.js (:320) and triage.js (:160) finally send goal_id (suggester-fed default) so even triaged promotions land in a real goal; the /idea-triage skill doc is updated to the homeless-only contract. Deps R07.' },
|
|
62
|
+
|
|
63
|
+
// T4 — proofs — P3
|
|
64
|
+
{ ref:'R04', kind:'verify', disc:'engineer', prio:3, est:90, crit:['C3'], deps:['R01'], title:'R04 · PROOF: attribution survives the route end-to-end', desc:'A routed bug\'s task ships; sourceIdeaForTask returns the filer; ideas_task_lineage (origin=route) + captured_by intact — the trail goal 1000067\'s ideator credit will pay against (test). Deps R01.' },
|
|
65
|
+
{ ref:'R06', kind:'verify', disc:'engineer', prio:3, est:120, crit:['C4'], deps:['R05'], title:'R06 · PROOF: abuse matrix — filing cannot escalate', desc:'A Xenos mass-filing bugs never lands claimable work, never reaches protected scope, rate limits hold; a sub-Metic cannot reach ready via any capture vector (test suite). Deps R05.' },
|
|
66
|
+
|
|
67
|
+
// T5 — the measured close — P2
|
|
68
|
+
{ ref:'R15', kind:'verify', disc:'engineer', prio:2, est:120, crit:['C2','C6'], deps:['R01','R05','R13'], title:'R15 · PROOF: reclassification sweep of the open inbox', desc:'Walk the open idea_inbox (~50 rows at planning time; 14 bugs) under the new rules: every goal-bound bug homed in a real goal; residual inbox is homeless-only; before/after counts recorded in this task\'s notes as the goal\'s measured evidence. Deps R01,R05,R13.' },
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
const ROOTS = ['R02', 'R03', 'R07', 'R10', 'R14']; // zero-dep, non-spike → open for claiming
|
|
72
|
+
|
|
73
|
+
(async () => {
|
|
74
|
+
const idByRef = {};
|
|
75
|
+
let created = 0, existing = 0;
|
|
76
|
+
console.log(`Seeding ${TASKS.length} tasks under goal ${GOAL} (${VER})…`);
|
|
77
|
+
for (const t of TASKS) {
|
|
78
|
+
const r = await api('POST', '/tasks', {
|
|
79
|
+
version_id: VER, goal_id: GOAL, title: t.title, description: t.desc,
|
|
80
|
+
kind: t.kind, discipline: t.disc, priority: t.prio, est_minutes: t.est,
|
|
81
|
+
criterion_ids: t.crit.map((c) => CRIT[c]), source: SRC, source_ref: `bongos-v1-idea-routing-${t.ref}`,
|
|
82
|
+
});
|
|
83
|
+
if (!r.ok) { console.log(` ${t.ref}: FAILED ${r.status} ${JSON.stringify(r.json)}`); continue; }
|
|
84
|
+
const task = r.json.task || r.json;
|
|
85
|
+
idByRef[t.ref] = task.id;
|
|
86
|
+
if (r.json.idempotent || r.json.existing) existing++; else created++;
|
|
87
|
+
console.log(` ${t.ref} → task ${task.id} (${t.kind}/${t.disc}, P${t.prio}, [${t.crit.join(',')}])`);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
console.log('Wiring dependencies…');
|
|
91
|
+
let edges = 0;
|
|
92
|
+
for (const t of TASKS) {
|
|
93
|
+
if (!t.deps.length) continue;
|
|
94
|
+
const id = idByRef[t.ref];
|
|
95
|
+
const depIds = t.deps.map((d) => idByRef[d]).filter(Boolean);
|
|
96
|
+
if (!id || depIds.length !== t.deps.length) { console.log(` ${t.ref}: dep resolve gap, skipping`); continue; }
|
|
97
|
+
const r = await api('POST', `/tasks/${id}/dependencies`, { depends_on_task_ids: depIds });
|
|
98
|
+
if (!r.ok) { console.log(` ${t.ref}: dep FAILED ${r.status} ${JSON.stringify(r.json)}`); continue; }
|
|
99
|
+
edges += (r.json.added || depIds.length);
|
|
100
|
+
console.log(` ${t.ref} depends on ${t.deps.join(',')}`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
console.log('Promoting the zero-dep layer to ready…');
|
|
104
|
+
for (const ref of ROOTS) {
|
|
105
|
+
const id = idByRef[ref];
|
|
106
|
+
if (!id) continue;
|
|
107
|
+
const r = await api('POST', `/tasks/${id}/promote`, {});
|
|
108
|
+
console.log(` ${ref} (task ${id}): ${r.ok ? 'ready' : 'promote note ' + JSON.stringify(r.json).slice(0, 120)}`);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
console.log('Linking provenance…');
|
|
112
|
+
if (idByRef.R11) {
|
|
113
|
+
const r = await api('PATCH', `/inbox/${DISCORD_BUGS_IDEA}`, { status: 'promoted', promoted_to_task_id: Number(idByRef.R11) });
|
|
114
|
+
console.log(` idea ${DISCORD_BUGS_IDEA} → ${r.ok ? `promoted against R11 (task ${idByRef.R11})` : 'PATCH note ' + JSON.stringify(r.json).slice(0, 160)}`);
|
|
115
|
+
}
|
|
116
|
+
const meta = await api('PATCH', `/tasks/${META_TASK}`, { goal_id: GOAL });
|
|
117
|
+
console.log(` meta task ${META_TASK} → ${meta.ok ? `goal ${GOAL}` : 'PATCH note ' + JSON.stringify(meta.json).slice(0, 160)}`);
|
|
118
|
+
|
|
119
|
+
console.log(`\nDONE. created=${created} existing=${existing} depEdges=${edges}. Roots opened: ${ROOTS.join(', ')}.`);
|
|
120
|
+
console.log('ref→id:', JSON.stringify(idByRef));
|
|
121
|
+
})();
|
package/src/module-api.js
CHANGED
|
@@ -843,8 +843,10 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
|
|
|
843
843
|
// landed since 1.19.206 with no explicit bump. run 32065995444. (task 1002620)
|
|
844
844
|
// 1.19.208 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
845
845
|
// landed since 1.19.207 with no explicit bump. run 32068332007. (task 1002620)
|
|
846
|
+
// 1.19.209 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
847
|
+
// landed since 1.19.208 with no explicit bump. run 32072227661. (task 1002620)
|
|
846
848
|
// ---------------------------------------------------------------------------
|
|
847
|
-
const CORE_VERSION = '1.19.
|
|
849
|
+
const CORE_VERSION = '1.19.209'; // CI auto-patch carrier (ADR 0161); see changelog above
|
|
848
850
|
|
|
849
851
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
850
852
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|