@bongos/core 1.19.194 → 1.19.196
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.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.196",
|
|
6
|
+
"core_contract": "1.19.196",
|
|
7
|
+
"source_commit": "057ae65d085a223a3f09f796164eee79e35242d6",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-17T02:
|
|
9
|
+
"built_at": "2026-08-17T02:44:35.952Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 309,
|
|
13
13
|
"agent_docs_stubbed": 21,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 1285,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 1615,
|
|
20
|
+
"tree_sha256": "0bab078fb9153e86b9ebaf32900bd0c90ba911bc05100fd25ce101dc5e4342b7",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -2892,7 +2892,7 @@
|
|
|
2892
2892
|
{
|
|
2893
2893
|
"path": "modules/government/catalog.js",
|
|
2894
2894
|
"mode": "0000644",
|
|
2895
|
-
"sha256": "
|
|
2895
|
+
"sha256": "ed853e83a9765e0a5de90195a15dea6b0bf1f6d07be0b6ad740d54a7c79c2c7d"
|
|
2896
2896
|
},
|
|
2897
2897
|
{
|
|
2898
2898
|
"path": "modules/government/config.js",
|
|
@@ -2954,6 +2954,11 @@
|
|
|
2954
2954
|
"mode": "0000644",
|
|
2955
2955
|
"sha256": "e4802709d31031f2a7b66e1c3a07fd71def94b2eaf4eff7ad8a0f22bf6eeaf5e"
|
|
2956
2956
|
},
|
|
2957
|
+
{
|
|
2958
|
+
"path": "modules/government/migrations/government_004_board_permissions.sql",
|
|
2959
|
+
"mode": "0000644",
|
|
2960
|
+
"sha256": "75913af702d6529c9a5cf2e2c42d9c329eea92ae99274fb71f2524520de4cfbf"
|
|
2961
|
+
},
|
|
2957
2962
|
{
|
|
2958
2963
|
"path": "modules/government/module.json",
|
|
2959
2964
|
"mode": "0000644",
|
|
@@ -3332,7 +3337,7 @@
|
|
|
3332
3337
|
{
|
|
3333
3338
|
"path": "modules/hall-ui/public/people.js",
|
|
3334
3339
|
"mode": "0000644",
|
|
3335
|
-
"sha256": "
|
|
3340
|
+
"sha256": "65240ee6f7c1dd4a73282f82a659e5906edbe612500e2e4ed9930f31f7e3f377"
|
|
3336
3341
|
},
|
|
3337
3342
|
{
|
|
3338
3343
|
"path": "modules/hall-ui/public/primer.css",
|
|
@@ -4267,12 +4272,12 @@
|
|
|
4267
4272
|
{
|
|
4268
4273
|
"path": "package-lock.json",
|
|
4269
4274
|
"mode": "0000644",
|
|
4270
|
-
"sha256": "
|
|
4275
|
+
"sha256": "ee80b4cb2114c56ba516f47f2e883ebaab71a1369863ce1c5f96cb982bd636eb"
|
|
4271
4276
|
},
|
|
4272
4277
|
{
|
|
4273
4278
|
"path": "package.json",
|
|
4274
4279
|
"mode": "0000644",
|
|
4275
|
-
"sha256": "
|
|
4280
|
+
"sha256": "43f68be2f5fa45a19e658f124d5b70c535990e6b40a01abc9fc67e4daf9c28f1"
|
|
4276
4281
|
},
|
|
4277
4282
|
{
|
|
4278
4283
|
"path": "public-docs/index.html",
|
|
@@ -5882,7 +5887,7 @@
|
|
|
5882
5887
|
{
|
|
5883
5888
|
"path": "src/module-api.js",
|
|
5884
5889
|
"mode": "0000644",
|
|
5885
|
-
"sha256": "
|
|
5890
|
+
"sha256": "d789e8fcee6eed4ab2bf9badfaed68832830493d1d6b76f9d9263fae5c1d4163"
|
|
5886
5891
|
},
|
|
5887
5892
|
{
|
|
5888
5893
|
"path": "src/module-loader/catalog.js",
|
|
@@ -198,6 +198,22 @@ const PERMISSIONS = [
|
|
|
198
198
|
{ key: 'override_request.decide', system: false, floor: 'metic', guards: 'GET /override-requests, POST .../:id/decide (ADR 0157, was archon)' },
|
|
199
199
|
{ key: 'claim.release.any', system: false, floor: 'metic', scope: 'any', resource: 'claim', guards: 'POST /claims/:id/release-on-behalf (ADR 0157, was archon)' },
|
|
200
200
|
{ key: 'idea.ratify', system: false, floor: 'metic', guards: 'POST /inbox/:id/ratify (ADR 0157, was archon)' },
|
|
201
|
+
// ── the Board Room (ADR 0175, goal 1000069) ──────────────────────────────────
|
|
202
|
+
// Declared BEFORE their routes exist (R07/R08 add them), and deliberately so:
|
|
203
|
+
// for a NEW key the unsafe order is code-first. A grant row naming a key no
|
|
204
|
+
// route reads is INERT; a route reading a key with no grant rows 403s everyone.
|
|
205
|
+
// ADR 0174's Consequences record that failure landing on the Government tab
|
|
206
|
+
// itself. So grants lead, routes follow — inside this goal, not across releases.
|
|
207
|
+
{ key: 'board.item.open', system: false, floor: 'metic', guards: 'POST /board/items — put a subject to the board (ADR 0175; a Full Idea window opens automatically on grade pass, so in practice this guards an amendment)' },
|
|
208
|
+
// floor 'xenos' is NOT a mistake and must not be "tightened". Who may vote is
|
|
209
|
+
// the CONSTITUTION's membership predicate, resolved per request from config
|
|
210
|
+
// (ADR 0175 §6) — today `rank:archon`. Encoding that rank here too would fork
|
|
211
|
+
// authority truth into a second place and, worse, would make widening the
|
|
212
|
+
// franchise a MIGRATION rather than the config change ADR 0175 §6 promises it
|
|
213
|
+
// is. So the atom says only "this route exists for authenticated builders" and
|
|
214
|
+
// the predicate does the real gating — the `criterion.create` pattern above,
|
|
215
|
+
// where the floor is real but explicitly not the whole gate.
|
|
216
|
+
{ key: 'board.vote.cast', system: false, floor: 'xenos', guards: 'POST /board/items/:id/vote — floor is the coarse gate; board membership is the configured predicate (ADR 0175 §6), checked in-handler' },
|
|
201
217
|
{ key: 'task.newcomer_restock', system: false, floor: 'metic', guards: 'POST /tasks/newcomer-restock (ADR 0157, was archon)' },
|
|
202
218
|
{ key: 'task.peer_votes.tally', system: false, floor: 'metic', guards: 'POST /tasks/peer-votes/tally (ADR 0157, was archon)' },
|
|
203
219
|
{ key: 'goal.reorder', system: false, floor: 'metic', guards: 'POST /goals/reorder (ADR 0157, was archon)' },
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
-- government_004_board_permissions.sql — grant the two Board Room atoms
|
|
2
|
+
-- (task 1003017 / R04 of goal 1000069). Decision of record: ADR 0175.
|
|
3
|
+
--
|
|
4
|
+
-- catalog.js now carries `board.item.open` (floor 'metic') and `board.vote.cast`
|
|
5
|
+
-- (floor 'xenos'). Both are operational (system:false) — creating an item or
|
|
6
|
+
-- casting a vote confers authority on nobody, which is the same argument the
|
|
7
|
+
-- `version.create` row makes against a symmetry-with-`version.close` reading.
|
|
8
|
+
--
|
|
9
|
+
-- ── THIS MIGRATION IS LOAD-BEARING, not bookkeeping ─────────────────────────
|
|
10
|
+
-- The compat seed (governance_002) is run-once, so a database that has already
|
|
11
|
+
-- migrated would never learn a key added only in code: no rank would hold these,
|
|
12
|
+
-- and the routes R07/R08 add would 403 every builder including the Archon. The
|
|
13
|
+
-- grant has to arrive as its own migration for the change to be behaviour-
|
|
14
|
+
-- identical in practice and not just on a fresh install. `governance_006` is the
|
|
15
|
+
-- worked example this copies.
|
|
16
|
+
--
|
|
17
|
+
-- ── WHY THE GRANTS LAND BEFORE THE ROUTES ───────────────────────────────────
|
|
18
|
+
-- The consuming routes do not exist yet (R07 opens a window, R08 casts a vote).
|
|
19
|
+
-- That order is deliberate, and it is the safe one: a grant row naming a key no
|
|
20
|
+
-- route reads is INERT, while a route reading a key with no grant rows fails
|
|
21
|
+
-- closed for everyone. ADR 0174's Consequences record what the inverse costs —
|
|
22
|
+
-- the key that gates the Government tab failing closed on the very surface an
|
|
23
|
+
-- owner would use to investigate. So grants lead and routes follow, inside this
|
|
24
|
+
-- goal rather than across releases.
|
|
25
|
+
--
|
|
26
|
+
-- ── WHY `board.vote.cast` GOES TO EVERY RANK, INCLUDING xenos ───────────────
|
|
27
|
+
-- This is the row most likely to be "corrected" by a later reader, so: it is
|
|
28
|
+
-- correct. Who may vote is the CONSTITUTION's membership predicate, resolved per
|
|
29
|
+
-- request from config (ADR 0175 §6) — today `rank:archon`. Encoding that rank
|
|
30
|
+
-- here as well would fork authority truth into a second place, and would make
|
|
31
|
+
-- widening the franchise a MIGRATION rather than the config change ADR 0175 §6
|
|
32
|
+
-- promises. The atom therefore says only "this route exists for authenticated
|
|
33
|
+
-- builders"; the predicate does the real gating, in-handler. This is exactly the
|
|
34
|
+
-- shape `criterion.create` already uses, where the floor is real but explicitly
|
|
35
|
+
-- not the whole gate.
|
|
36
|
+
--
|
|
37
|
+
-- ── NOT GRANTED: there is no `board.config.manage` ──────────────────────────
|
|
38
|
+
-- The planning outline named a third key for changing the constitution. It is
|
|
39
|
+
-- deliberately absent, because the constitution is FILE config: config.js reads
|
|
40
|
+
-- config/government.json and config/government.neutral.json with readFileSync
|
|
41
|
+
-- and there is no write route — every write route in this module edits DB rows
|
|
42
|
+
-- (ranks, grants, assignments), never config. A key no route consumes does not
|
|
43
|
+
-- exist (catalog.js's first rule), so minting one would have made the catalog
|
|
44
|
+
-- describe authority nothing can exercise. Amending the constitution stays what
|
|
45
|
+
-- ADR 0175 §7 describes: the board RATIFIES, and the file edit + merge executes
|
|
46
|
+
-- — which is also ADR 0162's "advisory, never self-executing" holding.
|
|
47
|
+
--
|
|
48
|
+
-- ── ONE BLOCK PER RANK, and the form is load-bearing ────────────────────────
|
|
49
|
+
-- The drift guard (tests/government_seed.mjs) scans for the literal
|
|
50
|
+
-- `SELECT '<rank>', unnest(ARRAY[…])`, so a combined
|
|
51
|
+
-- `unnest(ARRAY['metic','archon'])` form parses as ZERO grants and reds the
|
|
52
|
+
-- build. Four blocks because the seed is a cumulative superset: a 'xenos'-floored
|
|
53
|
+
-- key is held by every rank, a 'metic'-floored key by metic and archon.
|
|
54
|
+
--
|
|
55
|
+
-- Additive only: two new permission keys granted; nothing is revoked (the union
|
|
56
|
+
-- model in tests/government_seed.mjs cannot express a revoke). Idempotent
|
|
57
|
+
-- (ON CONFLICT DO NOTHING); forward-safe (INSERT only).
|
|
58
|
+
|
|
59
|
+
BEGIN;
|
|
60
|
+
|
|
61
|
+
INSERT INTO government_rank_permissions (rank_key, permission_key)
|
|
62
|
+
SELECT 'xenos', unnest(ARRAY[
|
|
63
|
+
'board.vote.cast'
|
|
64
|
+
])
|
|
65
|
+
ON CONFLICT (rank_key, permission_key) DO NOTHING;
|
|
66
|
+
|
|
67
|
+
INSERT INTO government_rank_permissions (rank_key, permission_key)
|
|
68
|
+
SELECT 'thetes', unnest(ARRAY[
|
|
69
|
+
'board.vote.cast'
|
|
70
|
+
])
|
|
71
|
+
ON CONFLICT (rank_key, permission_key) DO NOTHING;
|
|
72
|
+
|
|
73
|
+
INSERT INTO government_rank_permissions (rank_key, permission_key)
|
|
74
|
+
SELECT 'metic', unnest(ARRAY[
|
|
75
|
+
'board.vote.cast',
|
|
76
|
+
'board.item.open'
|
|
77
|
+
])
|
|
78
|
+
ON CONFLICT (rank_key, permission_key) DO NOTHING;
|
|
79
|
+
|
|
80
|
+
INSERT INTO government_rank_permissions (rank_key, permission_key)
|
|
81
|
+
SELECT 'archon', unnest(ARRAY[
|
|
82
|
+
'board.vote.cast',
|
|
83
|
+
'board.item.open'
|
|
84
|
+
])
|
|
85
|
+
ON CONFLICT (rank_key, permission_key) DO NOTHING;
|
|
86
|
+
|
|
87
|
+
COMMIT;
|
|
@@ -58,6 +58,25 @@
|
|
|
58
58
|
|
|
59
59
|
function mountDirectory(builders) {
|
|
60
60
|
all = Array.isArray(builders) ? builders : [];
|
|
61
|
+
// An EMPTY directory is almost never missing data — it is ADR 0171's
|
|
62
|
+
// fail-closed consent boundary doing exactly what it was ratified to do.
|
|
63
|
+
// `listScoutingRollup` filters on `profile_state = 'active'`, every account
|
|
64
|
+
// starts `'provisional'`, and an account activates ONLY when its human signs
|
|
65
|
+
// in at the hub itself (P03, ratified by the owner 2026-08-16: no backfill
|
|
66
|
+
// activation). This builders hall predates the hub flow, so its builders stay
|
|
67
|
+
// unlisted until each has signed in there once.
|
|
68
|
+
//
|
|
69
|
+
// Reporting that as "no cross-project activity reported yet" is actively
|
|
70
|
+
// misleading — the activity exists and is visible on every project's own
|
|
71
|
+
// leaderboard; the accounts simply are not publicly listed — and that wrong
|
|
72
|
+
// explanation is why an empty directory got filed as a bug (task 1002937).
|
|
73
|
+
// Say which of the two it is, so the page is never mistaken for broken.
|
|
74
|
+
if (!all.length) {
|
|
75
|
+
notice('Nobody is publicly listed here yet. A builder joins this directory once they have '
|
|
76
|
+
+ 'signed in on the main platform site at least once — accounts stay unlisted until then, '
|
|
77
|
+
+ 'and none are listed without it. Their work still shows on each project’s own ledger.');
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
61
80
|
kit.makeFilterBar({
|
|
62
81
|
mount: document.getElementById('people-filters'),
|
|
63
82
|
search: { id: 'people-q', label: 'Search', placeholder: 'name or discipline' },
|
|
@@ -73,7 +92,9 @@
|
|
|
73
92
|
columns: ['Builder', { label: 'Projects', class: 'num' }, { label: 'Credits', class: 'num' },
|
|
74
93
|
{ label: 'Ships', class: 'num' }, { label: 'Karma', class: 'num' }, 'Disciplines', 'Last active'],
|
|
75
94
|
rowHtml: rowHtml,
|
|
76
|
-
|
|
95
|
+
// Reached only when the directory HAS builders and the search excluded them
|
|
96
|
+
// all — the empty-API case returns above with its own explanation.
|
|
97
|
+
emptyMsg: 'No listed builder matches that search.',
|
|
77
98
|
pager: pager,
|
|
78
99
|
});
|
|
79
100
|
rerender();
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.196",
|
|
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.196",
|
|
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.196",
|
|
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
|
@@ -815,8 +815,12 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
|
|
|
815
815
|
// landed since 1.19.192 with no explicit bump. run 31985689267. (task 1002620)
|
|
816
816
|
// 1.19.194 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
817
817
|
// landed since 1.19.193 with no explicit bump. run 31987857242. (task 1002620)
|
|
818
|
+
// 1.19.195 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
819
|
+
// landed since 1.19.194 with no explicit bump. run 31988381869. (task 1002620)
|
|
820
|
+
// 1.19.196 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
821
|
+
// landed since 1.19.195 with no explicit bump. run 31988890305. (task 1002620)
|
|
818
822
|
// ---------------------------------------------------------------------------
|
|
819
|
-
const CORE_VERSION = '1.19.
|
|
823
|
+
const CORE_VERSION = '1.19.196'; // CI auto-patch carrier (ADR 0161); see changelog above
|
|
820
824
|
|
|
821
825
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
822
826
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|