@bongos/core 1.19.195 → 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.195",
6
- "core_contract": "1.19.195",
7
- "source_commit": "6f4385930d135df297276b8621d06766d37a31f4",
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:34:38.864Z",
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": 1284,
14
+ "functional_verbatim": 1285,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 1614,
20
- "tree_sha256": "8116719f0704b34ec16115f9e0134e61f13a8dbdcf965a215c6696d637c7ed91",
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": "b7073912e1aea3da33f876999a6beaae028142f0bf7bf66c1f95efc261b41272"
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",
@@ -4267,12 +4272,12 @@
4267
4272
  {
4268
4273
  "path": "package-lock.json",
4269
4274
  "mode": "0000644",
4270
- "sha256": "7b801c937ba9dd1e63dd47500431d689b484386e24ce7dd4a170e8aad9fe3795"
4275
+ "sha256": "ee80b4cb2114c56ba516f47f2e883ebaab71a1369863ce1c5f96cb982bd636eb"
4271
4276
  },
4272
4277
  {
4273
4278
  "path": "package.json",
4274
4279
  "mode": "0000644",
4275
- "sha256": "41ec69a812063ad9f24f616976b4492e2b651cfb5bdc4242ebd5873b7a9e8c2f"
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": "719cefa356719d4cbe09a49186afae9e5cc116eece82c2c2694ab93706effd54"
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;
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.195",
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.195",
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.195",
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
@@ -817,8 +817,10 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
817
817
  // landed since 1.19.193 with no explicit bump. run 31987857242. (task 1002620)
818
818
  // 1.19.195 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
819
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)
820
822
  // ---------------------------------------------------------------------------
821
- const CORE_VERSION = '1.19.195'; // CI auto-patch carrier (ADR 0161); see changelog above
823
+ const CORE_VERSION = '1.19.196'; // CI auto-patch carrier (ADR 0161); see changelog above
822
824
 
823
825
  // A namespaced logger so a module's log lines are attributable + consistent.
824
826
  // Usage: const log = api.logger('dev-box'); log.info('mounted');