@bongos/core 1.19.892 → 1.19.893
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 +13 -13
- package/docs/module-api-changelog.md +2 -0
- package/modules/government/protected-surfaces.json +6 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/module-api.js +1 -1
- package/tests/agents_sync.mjs +17 -2
- package/tests/government_protected_surfaces.mjs +51 -5
- package/tests/module-scope-map.mjs +10 -2
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.893",
|
|
6
|
+
"core_contract": "1.19.893",
|
|
7
|
+
"source_commit": "99f7250a5cc9e39e16d1869281d1fd2660a466ad",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-
|
|
9
|
+
"built_at": "2026-09-19T22:26:15.995Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 498,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 2796,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "1ffd95b16bdf5a9986639f6ea5452817996a270f6274f1195d3330fc915fe900",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -2612,7 +2612,7 @@
|
|
|
2612
2612
|
{
|
|
2613
2613
|
"path": "docs/module-api-changelog.md",
|
|
2614
2614
|
"mode": "0000644",
|
|
2615
|
-
"sha256": "
|
|
2615
|
+
"sha256": "adada9ba37f56cd06bbb497540a86710002658b4160a9c0e31f5a3ae36fb1ddb"
|
|
2616
2616
|
},
|
|
2617
2617
|
{
|
|
2618
2618
|
"path": "docs/modules-contract.md",
|
|
@@ -4377,7 +4377,7 @@
|
|
|
4377
4377
|
{
|
|
4378
4378
|
"path": "modules/government/protected-surfaces.json",
|
|
4379
4379
|
"mode": "0000644",
|
|
4380
|
-
"sha256": "
|
|
4380
|
+
"sha256": "3c70a4abe22d8720a57da14e1f6dbc659cc57b066c1c811c8130f20d6d586e20"
|
|
4381
4381
|
},
|
|
4382
4382
|
{
|
|
4383
4383
|
"path": "modules/government/ranks.js",
|
|
@@ -7712,12 +7712,12 @@
|
|
|
7712
7712
|
{
|
|
7713
7713
|
"path": "package-lock.json",
|
|
7714
7714
|
"mode": "0000644",
|
|
7715
|
-
"sha256": "
|
|
7715
|
+
"sha256": "4439b27f55c654d0758f704b1225fb25509949f048e9292b5c54af9c047c59a2"
|
|
7716
7716
|
},
|
|
7717
7717
|
{
|
|
7718
7718
|
"path": "package.json",
|
|
7719
7719
|
"mode": "0000644",
|
|
7720
|
-
"sha256": "
|
|
7720
|
+
"sha256": "3c2e6c91f071304b4464dfa845786eb5037631d1dff4cdad6c9560201dfc9bb6"
|
|
7721
7721
|
},
|
|
7722
7722
|
{
|
|
7723
7723
|
"path": "public-docs/index.html",
|
|
@@ -9722,7 +9722,7 @@
|
|
|
9722
9722
|
{
|
|
9723
9723
|
"path": "src/module-api.js",
|
|
9724
9724
|
"mode": "0000644",
|
|
9725
|
-
"sha256": "
|
|
9725
|
+
"sha256": "f5e01142842ee5a6d8c2cb8870eb8bd41e9de63d4e3621a07a69fc2c095597c7"
|
|
9726
9726
|
},
|
|
9727
9727
|
{
|
|
9728
9728
|
"path": "src/module-loader/catalog.js",
|
|
@@ -9897,7 +9897,7 @@
|
|
|
9897
9897
|
{
|
|
9898
9898
|
"path": "tests/agents_sync.mjs",
|
|
9899
9899
|
"mode": "0000644",
|
|
9900
|
-
"sha256": "
|
|
9900
|
+
"sha256": "2e161bf9ef98425974d8295c8227688cd6fde55314fb3b9413df55542d5a109a"
|
|
9901
9901
|
},
|
|
9902
9902
|
{
|
|
9903
9903
|
"path": "tests/agents_validate.mjs",
|
|
@@ -11402,7 +11402,7 @@
|
|
|
11402
11402
|
{
|
|
11403
11403
|
"path": "tests/government_protected_surfaces.mjs",
|
|
11404
11404
|
"mode": "0000644",
|
|
11405
|
-
"sha256": "
|
|
11405
|
+
"sha256": "fd0cca1a62b8c2ab3bd556aabf4f6949bb6affb66c2fb1fd6258bccfffebc744"
|
|
11406
11406
|
},
|
|
11407
11407
|
{
|
|
11408
11408
|
"path": "tests/government_rank_sync.mjs",
|
|
@@ -12202,7 +12202,7 @@
|
|
|
12202
12202
|
{
|
|
12203
12203
|
"path": "tests/module-scope-map.mjs",
|
|
12204
12204
|
"mode": "0000644",
|
|
12205
|
-
"sha256": "
|
|
12205
|
+
"sha256": "d55b193ee9dcba85a9d51f108352de17f453dfb413b9b391028c9d8f7ff7fab0"
|
|
12206
12206
|
},
|
|
12207
12207
|
{
|
|
12208
12208
|
"path": "tests/module_api.mjs",
|
|
@@ -2258,5 +2258,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
2258
2258
|
landed since 1.19.890 with no explicit bump. run 35471575521. (task 1002620)
|
|
2259
2259
|
1.19.892 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2260
2260
|
landed since 1.19.891 with no explicit bump. run 35471773244. (task 1002620)
|
|
2261
|
+
1.19.893 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2262
|
+
landed since 1.19.892 with no explicit bump. run 35473299957. (task 1002620)
|
|
2261
2263
|
---------------------------------------------------------------------------
|
|
2262
2264
|
```
|
|
@@ -90,6 +90,11 @@
|
|
|
90
90
|
{ "glob": "CLAUDE.md", "group": "docs", "why": "the methodology core" },
|
|
91
91
|
{ "glob": ".claude/hooks/", "group": "automation", "why": "local automation that could weaken a gate" },
|
|
92
92
|
{ "glob": ".claude/settings.json", "group": "automation", "why": "local automation that could weaken a gate" },
|
|
93
|
-
{ "glob": "config/scheduled-routines.json", "group": "automation", "why": "task 1002500. The ROUTINE SWITCHBOARD: per routine it decides enabled, cadence and requiresAutonomy — so an edit here can arm overnight-builder (autonomous claim+ship) or silence main-audit, the post-merge trust-boundary backstop ADR 0043 relies on. Sibling of .claude/hooks/ and .claude/settings.json above: the routine BODIES under .claude/scheduled-tasks/ are the autonomy module's source surface and stay unprotected, because protectedness derives per module and walling them is a separate policy decision (the .claude/agents/ precedent recorded in tests/government_protected_surfaces.mjs). This file is kernel-owned territory (module-scope-map's kernel key carries 'config/'), which is already protected, so registering it widens no module wall. The set is computed, not listed: the routine-switch tripwire in tests/government_protected_surfaces.mjs re-detects every config/*.json declaring routine switches and reds if one is unregistered." }
|
|
93
|
+
{ "glob": "config/scheduled-routines.json", "group": "automation", "why": "task 1002500. The ROUTINE SWITCHBOARD: per routine it decides enabled, cadence and requiresAutonomy — so an edit here can arm overnight-builder (autonomous claim+ship) or silence main-audit, the post-merge trust-boundary backstop ADR 0043 relies on. Sibling of .claude/hooks/ and .claude/settings.json above: the routine BODIES under .claude/scheduled-tasks/ are the autonomy module's source surface and stay unprotected, because protectedness derives per module and walling them is a separate policy decision (the .claude/agents/ precedent recorded in tests/government_protected_surfaces.mjs). This file is kernel-owned territory (module-scope-map's kernel key carries 'config/'), which is already protected, so registering it widens no module wall. The set is computed, not listed: the routine-switch tripwire in tests/government_protected_surfaces.mjs re-detects every config/*.json declaring routine switches and reds if one is unregistered." },
|
|
94
|
+
{
|
|
95
|
+
"glob": "modules/agents/",
|
|
96
|
+
"group": "automation",
|
|
97
|
+
"why": "task 1004006, owner decision 2026-09-19. Who may EDIT the agents module. This is the policy decision the note at the head of tests/government_protected_surfaces.mjs reserved when task 1002492 backed out '.claude/agents/' — not a scope fix and not a side effect. The module fires subagents unattended and SPENDS REAL MONEY doing it (~$0.90 a fire, a per-agent monthly ceiling in agents_004, folded into the global MTD autonomy brake), so editing what may fire and what it may cost is Metic work. The 1002492 note's stated cost was that it walls goals 1000038/39/40; all three are ARCHIVED and re-derived on 2026-09-19 there are ZERO live goals scoped to agents. Of the nine live tasks in the module six already require Metic; the three that did not are the agent secret-file permission rule, the run-ledger column allowlist and the model-provider port — security and spend surfaces that ADR 0043 already keeps sub-Metic builders out of in spirit. Protectedness is DERIVED PER MODULE (module-scope-map isProtected -> touchesOverlap), so this one glob is what flips the whole module, which is the intent here rather than the accident it was in 1002492."
|
|
98
|
+
}
|
|
94
99
|
]
|
|
95
100
|
}
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.893",
|
|
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.893",
|
|
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.893",
|
|
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
|
@@ -71,7 +71,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
|
|
|
71
71
|
// there. scripts/gds/bump-version.js still rewrites the literal below; it appends
|
|
72
72
|
// the entry to that file. Look for a version's history there, not here.
|
|
73
73
|
// ---------------------------------------------------------------------------
|
|
74
|
-
const CORE_VERSION = '1.19.
|
|
74
|
+
const CORE_VERSION = '1.19.893'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
75
75
|
|
|
76
76
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
77
77
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|
package/tests/agents_sync.mjs
CHANGED
|
@@ -328,7 +328,20 @@ t('the wall is wired to the REAL protected-surface registry', () => {
|
|
|
328
328
|
assert.equal(realMatcher('modules/government/catalog.js'), true, 'the authority surface');
|
|
329
329
|
assert.equal(realMatcher('migrations/001_init.sql'), true, 'schema');
|
|
330
330
|
assert.equal(realMatcher('.claude/hooks/pre-push.js'), true, 'local automation');
|
|
331
|
-
|
|
331
|
+
// A module's own code is not protected BY DEFAULT — the contrast case that
|
|
332
|
+
// proves this wall discriminates rather than blanketing everything.
|
|
333
|
+
//
|
|
334
|
+
// This used to cite modules/agents/lib/validate.js, which stopped being a
|
|
335
|
+
// valid example on 2026-09-19 when task 1004006 walled the agents module at
|
|
336
|
+
// Metic on the owner's decision. The case still needs an unprotected module
|
|
337
|
+
// file; modules/ideas/ is one, and the assertion below re-states WHY it is the
|
|
338
|
+
// example rather than leaving the next reader to rediscover that the old one
|
|
339
|
+
// turned. (A fixture chosen because it is negative can become positive, and
|
|
340
|
+
// the test then looks untouched by the change that broke it.)
|
|
341
|
+
assert.equal(realMatcher('modules/ideas/routing.js'), false, "a module's own code is not protected by default");
|
|
342
|
+
assert.equal(realMatcher('modules/agents/lib/validate.js'), true,
|
|
343
|
+
'the agents module IS protected since task 1004006 — deliberately, and it is '
|
|
344
|
+
+ 'no longer usable as the unprotected example above');
|
|
332
345
|
// `.claude/agents/` itself is deliberately NOT in the registry — see the note
|
|
333
346
|
// on ADDED_SINCE_R101 in tests/government_protected_surfaces.mjs. Protecting
|
|
334
347
|
// it would rank-wall the whole agents module by derivation, which is a
|
|
@@ -358,8 +371,10 @@ t('a path scope onto the authority surface is withheld a rank AND flagged', () =
|
|
|
358
371
|
t('an unprotected path scope still reconciles normally', () => {
|
|
359
372
|
// The wall is a floor, not a ban — a tightening that refused every path scope
|
|
360
373
|
// would pass the test above and break the feature.
|
|
374
|
+
// modules/ideas/ rather than modules/agents/lib/ — the latter became a
|
|
375
|
+
// PROTECTED path in task 1004006, so it can no longer stand for "unprotected".
|
|
361
376
|
const d = sync.parseAgentFile(
|
|
362
|
-
'---\nname: reader\ntrigger: on-demand\nscope_paths: [modules/
|
|
377
|
+
'---\nname: reader\ntrigger: on-demand\nscope_paths: [modules/ideas/]\n---\nbody', {});
|
|
363
378
|
assert.equal(sync.declaresProtectedScope(d, [], realMatcher), false);
|
|
364
379
|
const p = sync.planOne(d, {
|
|
365
380
|
authorRank: 'metic', allowedModules: ['agents'], isProtectedPath: realMatcher,
|
|
@@ -240,6 +240,29 @@ const ADDED_SINCE_R101 = [
|
|
|
240
240
|
+ 'edit which slipped past the pre-push hook and the grader — the one ADR 0043 '
|
|
241
241
|
+ 'layer that does not depend on the builder cooperating.',
|
|
242
242
|
},
|
|
243
|
+
// task 1004006, owner decision 2026-09-19. THE POLICY DECISION the note at the head of
|
|
244
|
+
// this file reserved when task 1002492 backed out `.claude/agents/`: who may EDIT the
|
|
245
|
+
// agents module. Landed deliberately, as that note required — the entry here, the
|
|
246
|
+
// publish-manifest check (already satisfied: modules/agents/ is on PUBLISH_ALLOWLIST,
|
|
247
|
+
// verified rather than assumed), and the switchboard tripwire below re-aimed rather
|
|
248
|
+
// than deleted.
|
|
249
|
+
//
|
|
250
|
+
// The note's stated cost was that it walls goals 1000038/39/40. All three are ARCHIVED,
|
|
251
|
+
// and re-derived on 2026-09-19 there are ZERO live goals scoped to agents — so that
|
|
252
|
+
// specific cost is gone, which is exactly why the note said to re-derive rather than
|
|
253
|
+
// trust it. What replaced it: the module now spends real money unattended (~$0.90 a
|
|
254
|
+
// fire, per-agent monthly ceiling in agents_004, folded into the global MTD brake).
|
|
255
|
+
{
|
|
256
|
+
after: 'config/scheduled-routines.json',
|
|
257
|
+
glob: 'modules/agents/',
|
|
258
|
+
why: 'the module that fires subagents unattended and SPENDS to do it. Editing what '
|
|
259
|
+
+ 'may fire, and what it may cost, is Metic work. Of the nine live tasks in the '
|
|
260
|
+
+ 'module six already required Metic; the three that did not are the agent '
|
|
261
|
+
+ 'secret-file permission rule, the run-ledger column allowlist and the '
|
|
262
|
+
+ 'model-provider port — security and spend surfaces ADR 0043 already keeps '
|
|
263
|
+
+ 'sub-Metic builders out of in spirit, so the real cost of this entry is three '
|
|
264
|
+
+ 'tasks that arguably should not have been open.',
|
|
265
|
+
},
|
|
243
266
|
];
|
|
244
267
|
|
|
245
268
|
// Surfaces RENAMED since R101 — still protected, under a new path. Distinct from
|
|
@@ -731,11 +754,34 @@ test('registering the switchboard widened no module wall', () => {
|
|
|
731
754
|
assert.ok(protectedNow.includes('kernel'),
|
|
732
755
|
'kernel owns config/ and was already protected before this entry; if it is not, the '
|
|
733
756
|
+ 'premise that registering a config/ file widens nothing has changed.');
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
757
|
+
// task 1004006 RE-AIMED THIS, and did not delete it. The assertion used to be
|
|
758
|
+
// `!includes('agents')`, and its job was never "agents must stay open" — it was "the
|
|
759
|
+
// SWITCHBOARD entry must not have reached the agents module as a side effect". That job
|
|
760
|
+
// still exists; agents is now protected for its OWN declared reason (the owner's
|
|
761
|
+
// 2026-09-19 decision), which is the separate policy act the old message pointed at.
|
|
762
|
+
//
|
|
763
|
+
// So the check becomes: agents is protected, and it is protected BY ITS OWN GLOB. If
|
|
764
|
+
// the switchboard entry — or any future config/ entry — were what reached the module,
|
|
765
|
+
// surfaceFor would name that file instead, and this still fails.
|
|
766
|
+
assert.ok(protectedNow.includes('agents'),
|
|
767
|
+
'the agents module is no longer protected — task 1004006 registered modules/agents/ '
|
|
768
|
+
+ 'on the owner\'s decision (the module fires subagents unattended and spends to do '
|
|
769
|
+
+ 'it). If the entry was removed, that is a policy reversal and belongs in the note '
|
|
770
|
+
+ 'at the head of this file, not a silent deletion.');
|
|
771
|
+
const agentsSurface = ppc.surfaceFor('modules/agents/lib/validate.js');
|
|
772
|
+
assert.equal(agentsSurface && agentsSurface.glob, 'modules/agents/',
|
|
773
|
+
'the agents module is protected by SOMETHING OTHER than its own glob — a config/ or '
|
|
774
|
+
+ 'switchboard entry has widened into it, which is the second-order effect this test '
|
|
775
|
+
+ 'exists to catch. The deliberate entry and an accidental one look identical in '
|
|
776
|
+
+ 'protectedModules(); only the matching glob tells them apart.');
|
|
777
|
+
// 1002492's rejection still stands: the module SOURCE is walled, agent DEFINITION files
|
|
778
|
+
// are not. Walling those was a scope fix that the scope_paths wall in
|
|
779
|
+
// modules/agents/lib/validate.js already does properly, and it is not what 1004006
|
|
780
|
+
// decided.
|
|
781
|
+
assert.ok(!ppc.surfaceFor('.claude/agents/historian.md'),
|
|
782
|
+
'.claude/agents/ became protected — task 1002492 considered and rejected that, and '
|
|
783
|
+
+ 'task 1004006 walled the module SOURCE without reopening it. An agent definition '
|
|
784
|
+
+ 'is scoped by validate.js, not by a rank floor on the file.');
|
|
739
785
|
assert.ok(ppc.surfaceFor('scripts/gds/conductor-dispatch.js'),
|
|
740
786
|
'the autonomy module was protected through conductor-dispatch.js before this entry. '
|
|
741
787
|
+ 'If that glob is gone, re-derive which modules this registry walls before trusting '
|
|
@@ -145,8 +145,16 @@ test('agents joined the roster (task 1002736) — the territory goals 1000038/39
|
|
|
145
145
|
const globs = scope.globsForModules(['agents']);
|
|
146
146
|
assert.ok(globs.includes('modules/agents/'), 'agents owns its module directory');
|
|
147
147
|
assert.ok(globs.includes('.claude/agents/'), 'the committed definitions are the module source surface');
|
|
148
|
-
// Derived, not hand-set
|
|
149
|
-
|
|
148
|
+
// Derived, not hand-set. This flipped to TRUE in task 1004006, when the owner
|
|
149
|
+
// walled the module at Metic (2026-09-19): modules/agents/ is now a registered
|
|
150
|
+
// protected surface because the module fires subagents unattended and spends
|
|
151
|
+
// real money doing it. The assertion below is the point of this pair and is
|
|
152
|
+
// UNCHANGED — `protected` must still be the faithful derivation rather than a
|
|
153
|
+
// literal, which is what would break if someone hand-set the flag to match.
|
|
154
|
+
assert.equal(scope.isProtectedModule('agents'), true,
|
|
155
|
+
'the agents module lost its Metic floor — task 1004006 registered modules/agents/ '
|
|
156
|
+
+ 'on the owner\'s decision. A reversal is a policy act and belongs in the note at '
|
|
157
|
+
+ 'the head of tests/government_protected_surfaces.mjs.');
|
|
150
158
|
assert.equal(
|
|
151
159
|
scope.scopeForModule('agents').protected,
|
|
152
160
|
scope.isProtected(globs),
|