@bongos/core 1.19.166 → 1.19.167

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 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.166",
6
- "core_contract": "1.19.166",
7
- "source_commit": "f0915c151ca43c0539146b5538ab7e5232c0340d",
5
+ "core_version": "1.19.167",
6
+ "core_contract": "1.19.167",
7
+ "source_commit": "35e223942ac5cbbccc7300e2db6175343b2f300a",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-08-16T17:20:37.651Z",
9
+ "built_at": "2026-08-16T17:31:19.570Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 305,
13
13
  "agent_docs_stubbed": 21,
14
- "functional_verbatim": 1264,
14
+ "functional_verbatim": 1265,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 1590,
20
- "tree_sha256": "66c7fea0b4a3bc4ad100fbc357028f28c0445c73227a53a90f842938c6e059f8",
19
+ "file_count": 1591,
20
+ "tree_sha256": "b033aa8ae702d08b637604677eefba0fb49124560898516f90f6fbbe751ce09a",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/blocker-review/SKILL.md",
@@ -4202,12 +4202,12 @@
4202
4202
  {
4203
4203
  "path": "package-lock.json",
4204
4204
  "mode": "0000644",
4205
- "sha256": "99da59c846c54ee93a5cc36d2dd760afd344905469a9a6368388de10ee02c506"
4205
+ "sha256": "91c78ba67f8cece0ac27f0dd7ae8cd927e3d4e041eeb41d7de1ddb9897331554"
4206
4206
  },
4207
4207
  {
4208
4208
  "path": "package.json",
4209
4209
  "mode": "0000644",
4210
- "sha256": "0f77d032953f120415ec207ecc3827fb00156aec357f542614445ed644c4b4a8"
4210
+ "sha256": "c1fd91411d3a575ba33f6632a8820320389a490c4678e9a238c288008f8d03b5"
4211
4211
  },
4212
4212
  {
4213
4213
  "path": "public-docs/index.html",
@@ -5259,6 +5259,11 @@
5259
5259
  "mode": "0000644",
5260
5260
  "sha256": "5de4203d6a764c8aec374c7802f69f659816d2c0d75bbe70144f7dfb56df2e39"
5261
5261
  },
5262
+ {
5263
+ "path": "scripts/gds/seed-bv1-community-tasks.js",
5264
+ "mode": "0000644",
5265
+ "sha256": "081a90e2b6b6ed78c5230b38ad95a8c620a504c307e227480214aa08590db881"
5266
+ },
5262
5267
  {
5263
5268
  "path": "scripts/gds/seed-bv1-privacy-invites-tasks.js",
5264
5269
  "mode": "0000644",
@@ -5807,7 +5812,7 @@
5807
5812
  {
5808
5813
  "path": "src/module-api.js",
5809
5814
  "mode": "0000644",
5810
- "sha256": "b83c5398b0e936e23705d50233c269ede9f36ea85f3c7b98111fbc501fd6d39a"
5815
+ "sha256": "4bd1d6d5c41a01b6338a148203a8a289864cee0dd7e3d2a4f5de15dd90c0443e"
5811
5816
  },
5812
5817
  {
5813
5818
  "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.166",
3
+ "version": "1.19.167",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.166",
9
+ "version": "1.19.167",
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.166",
3
+ "version": "1.19.167",
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,131 @@
1
+ // Seed the community-tab build tasks the 1002782 spike scoped, into the
2
+ // community-surface goal (created by the spike; pass --goal <id>).
3
+ //
4
+ // Source of truth: docs/specs/bongos-v1-community-tab.md (owner-signed
5
+ // 2026-08-16: own goal; builder-of-week auto-computed). Idempotent on
6
+ // source_ref bv1-community-CTn; safe to re-run (tasks re-home if --goal moves).
7
+ //
8
+ // Run: node scripts/gds/seed-bv1-community-tasks.js --goal 1000065
9
+
10
+ const { apiCall, arg } = require('./cli-lib');
11
+
12
+ const VER = 'BONGOS-V1';
13
+ const SRC = 'planning-session';
14
+ const SPEC = 'docs/specs/bongos-v1-community-tab.md';
15
+
16
+ // Cross-goal dependency: the shared privacy predicate (privacy spike PV2).
17
+ const PV2 = 1002967;
18
+
19
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
20
+
21
+ async function api(method, path, body, _tries = 0) {
22
+ await sleep(1500);
23
+ const r = await apiCall(method, `/api/gds${path}`, body);
24
+ if (r.status === 429 && _tries < 8) {
25
+ const wait = (r.data?.error?.details?.retry_after_seconds || 30) + 1;
26
+ console.log(` …rate-limited, waiting ${wait}s`);
27
+ await sleep(wait * 1000);
28
+ return api(method, path, body, _tries + 1);
29
+ }
30
+ return r;
31
+ }
32
+
33
+ const NEW_TASKS = [
34
+ {
35
+ ref: 'CT1', kind: 'feature', prio: 3, est: 120, crit: ['CS5'], deps: [], ready: true,
36
+ title: 'Windowed data plane: activity snapshots appended on changed-totals rollup reports',
37
+ desc: `New table platform_identity_activity_snapshots (client_id, github_id, credits, tasks_shipped, karma, reported_at) — additive platform_identity_* migration — plus one INSERT on the existing rollup-report path, skipped when totals are unchanged. Window value per builder = latest totals minus last snapshot at-or-before window start, summed across projects; missing baseline counts from zero. Reporting-time (not earning-time) semantics — document honestly, options B/C recorded in ${SPEC} D2. Compaction (daily granularity after 90 days) is a later, volume-triggered task: note it in this task's handoff, do not build it.`,
38
+ },
39
+ {
40
+ ref: 'CT2', kind: 'feature', prio: 3, est: 180, crit: ['CS1', 'CS5'], deps: ['CT1', PV2],
41
+ title: 'Windowed leaderboard API: GET /community/leaderboard',
42
+ desc: `Public endpoint: ?window=7d|30d|365d|all&discipline=. All-time reads the existing rollup; windowed reads CT1 deltas. Eligibility via the SHARED privacy predicate (task ${PV2} / privacy spike PV2) — active + public + stats shown; no surface-local variant. Columns: credits (rank), tasks_shipped, karma; response identical for every viewer. ${SPEC} D3.`,
43
+ },
44
+ {
45
+ ref: 'CT3', kind: 'feature', prio: 3, est: 120, crit: ['CS2'], deps: [PV2],
46
+ title: 'Builder search API: name + discipline under public-profile rules',
47
+ desc: `Public search over active+public accounts: handle/display-name prefix + trigram, discipline filter. Matrix consequences: hide_stats accounts findable by NAME but excluded from discipline-FILTERED results (disciplines are rollup-derived); private + provisional absent. This is not the recruiting search — the discoverable sliver population never appears here. ${SPEC} D4.`,
48
+ },
49
+ {
50
+ ref: 'CT4', kind: 'feature', prio: 3, est: 180, crit: ['CS1', 'CS2'], deps: ['CT2', 'CT3'],
51
+ title: 'The /community page: leaderboards + search + feature cards',
52
+ desc: `The public tab on the hub apex (status-ui, beside Explore): leaderboard windows + discipline tabs, search, builder-of-week + rising-builder card slots, server-render-friendly markup (goal 1000048 indexes later; their specifics). 'community' is already in the reserved slug list (edited by spike 1002782). ${SPEC} D1/D3/D4.`,
53
+ },
54
+ {
55
+ ref: 'CT5', kind: 'feature', prio: 3, est: 120, crit: ['CS3'], deps: ['CT2'],
56
+ title: 'Builder of the Week: crown-at-render + weekly_features table + archive',
57
+ desc: `Owner-signed formula: top 7d credit delta among leaderboard-eligible builders, floor one shipped work in window, ties by ships then karma. Crowned at first render after Monday 00:00 UTC and recorded to platform_identity_weekly_features (github_id, week_start, credits_delta, ships_delta) so the crown is pinned and the archive section renders from real rows. No cron. Formula shown on the page. ${SPEC} D5.`,
58
+ },
59
+ {
60
+ ref: 'CT6', kind: 'feature', prio: 4, est: 90, crit: ['CS4'], deps: ['CT4'],
61
+ title: 'Recruit affordance for project.recruit holders',
62
+ desc: `Leaderboard rows + search results grow a Recruit button rendered only for holders of project.recruit (the console wave's atom — coordinate spike 1002786 R2/R4), linking into the console invite flow. A door to a gated surface, never a data reveal. ${SPEC} D6.`,
63
+ },
64
+ {
65
+ ref: 'CT7', kind: 'feature', prio: 4, est: 90, crit: ['CS1'], deps: ['CT2'],
66
+ title: 'Rising builder + most-active-projects cards',
67
+ desc: `Rising builder: biggest relative 30d delta on a small all-time base (same CT1 snapshots). Most-active projects: the snapshots aggregated on the project axis, a strip on the community tab (orb-sizing reuse is goal 1000044 territory — feed it, don't build it here). ${SPEC} D7 items 1-2.`,
68
+ },
69
+ {
70
+ ref: 'CT8', kind: 'infra', prio: 4, est: 90, crit: ['CS3'], deps: ['CT2', 'CT5'],
71
+ title: 'Weekly Discord community digest',
72
+ desc: `A scheduled routine posting top movers + builder of the week via the existing postWebhook plumbing (scripts/discord/lib.js channels). Owner-audience copy, no jargon. ${SPEC} D7 item 4.`,
73
+ },
74
+ {
75
+ ref: 'CT9', kind: 'verify', prio: 3, est: 90, crit: ['CS1', 'CS2', 'CS3'], deps: ['CT2', 'CT3', 'CT4', 'CT5'],
76
+ title: 'PROOF: matrix enforcement + window math on the community surfaces',
77
+ desc: `Seed fixture accounts in every privacy state and snapshot rows across window boundaries; assert: private/provisional/hidden absent from every board, search result, feature card; name-vs-discipline search asymmetry for hide_stats; window deltas exact against the seeded snapshots; anonymous and signed-in responses identical. ${SPEC} D8.`,
78
+ },
79
+ ];
80
+
81
+ (async () => {
82
+ const goalId = Number(arg('--goal'));
83
+ if (!goalId) {
84
+ console.error('usage: node scripts/gds/seed-bv1-community-tasks.js --goal <id>');
85
+ process.exit(2);
86
+ }
87
+ console.log(`Seeding community-tab tasks under goal ${goalId} (${VER})…`);
88
+ const idByRef = {};
89
+ let created = 0, existing = 0;
90
+
91
+ for (const t of NEW_TASKS) {
92
+ const r = await api('POST', '/tasks', {
93
+ version_id: VER,
94
+ goal_id: goalId,
95
+ title: t.title,
96
+ description: t.desc,
97
+ kind: t.kind,
98
+ discipline: 'engineer',
99
+ priority: t.prio,
100
+ est_minutes: t.est,
101
+ criterion_ids: t.crit,
102
+ source: SRC,
103
+ source_ref: `bv1-community-${t.ref}`,
104
+ });
105
+ if (!r.ok) { console.log(` ${t.ref}: FAILED ${r.status} ${JSON.stringify(r.data)}`); continue; }
106
+ const task = r.data.task || r.data;
107
+ idByRef[t.ref] = Number(task.id);
108
+ if (r.data.idempotent || r.data.existing) existing++; else created++;
109
+ console.log(` ${t.ref} → task ${task.id} (${t.kind}, P${t.prio})`);
110
+ }
111
+
112
+ console.log('Wiring dependencies…');
113
+ for (const t of NEW_TASKS.filter((x) => x.deps.length)) {
114
+ const id = idByRef[t.ref];
115
+ const deps = t.deps.map((d) => (typeof d === 'number' ? d : idByRef[d])).filter(Boolean);
116
+ if (!id || !deps.length) continue;
117
+ const r = await api('PUT', `/tasks/${id}/dependencies`, { depends_on_task_ids: deps });
118
+ console.log(` ${t.ref} (task ${id}) depends on [${deps.join(', ')}]: ${r.ok ? 'ok' : 'FAILED ' + r.status + ' ' + JSON.stringify(r.data).slice(0, 160)}`);
119
+ }
120
+
121
+ console.log('Promoting the zero-dep root…');
122
+ for (const t of NEW_TASKS.filter((x) => x.ready)) {
123
+ const id = idByRef[t.ref];
124
+ if (!id) continue;
125
+ const r = await api('POST', `/tasks/${id}/promote`, {});
126
+ console.log(` ${t.ref} (task ${id}): ${r.ok ? 'ready' : 'promote note ' + JSON.stringify(r.data).slice(0, 120)}`);
127
+ }
128
+
129
+ console.log(`\nDONE. created=${created} existing=${existing}.`);
130
+ console.log('ref→id:', JSON.stringify(idByRef));
131
+ })();
package/src/module-api.js CHANGED
@@ -759,8 +759,10 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
759
759
  // landed since 1.19.164 with no explicit bump. run 31960929146. (task 1002620)
760
760
  // 1.19.166 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
761
761
  // landed since 1.19.165 with no explicit bump. run 31961272140. (task 1002620)
762
+ // 1.19.167 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
763
+ // landed since 1.19.166 with no explicit bump. run 31961815831. (task 1002620)
762
764
  // ---------------------------------------------------------------------------
763
- const CORE_VERSION = '1.19.166'; // CI auto-patch carrier (ADR 0161); see changelog above
765
+ const CORE_VERSION = '1.19.167'; // CI auto-patch carrier (ADR 0161); see changelog above
764
766
 
765
767
  // A namespaced logger so a module's log lines are attributable + consistent.
766
768
  // Usage: const log = api.logger('dev-box'); log.info('mounted');