@bongos/core 1.19.1040 → 1.19.1041
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 +19 -14
- package/docs/module-api-changelog.md +2 -0
- package/modules/grading/grader-subagent.js +7 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/src/module-api.js +1 -1
- package/tests/grade_model_provider.mjs +1 -1
- package/tests/grader_reviewer_isolation.mjs +68 -0
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.1041",
|
|
6
|
+
"core_contract": "1.19.1041",
|
|
7
|
+
"source_commit": "781aa748b3e03ade6ce8a871f235a3c9b2807f0a",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-
|
|
9
|
+
"built_at": "2026-09-26T16:00:35.772Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 542,
|
|
13
13
|
"agent_docs_stubbed": 26,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 2506,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 3075,
|
|
20
|
+
"tree_sha256": "ecbc8d868250fced6eeba4366b6b3f8dcd1a71502be7e3ec23650aa23f615da7",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -2767,7 +2767,7 @@
|
|
|
2767
2767
|
{
|
|
2768
2768
|
"path": "docs/module-api-changelog.md",
|
|
2769
2769
|
"mode": "0000644",
|
|
2770
|
-
"sha256": "
|
|
2770
|
+
"sha256": "54fe0dfc62e378fa8e590fbdce05a0094885cccae13b665007d96e7797f66d6e"
|
|
2771
2771
|
},
|
|
2772
2772
|
{
|
|
2773
2773
|
"path": "docs/modules-contract.md",
|
|
@@ -4692,7 +4692,7 @@
|
|
|
4692
4692
|
{
|
|
4693
4693
|
"path": "modules/grading/grader-subagent.js",
|
|
4694
4694
|
"mode": "0000644",
|
|
4695
|
-
"sha256": "
|
|
4695
|
+
"sha256": "ab47b186029c899a4e6ab43b3b5850dece658737ad08bdeec25a2653b6af62c0"
|
|
4696
4696
|
},
|
|
4697
4697
|
{
|
|
4698
4698
|
"path": "modules/grading/grader-workers/efficiency.js",
|
|
@@ -8487,12 +8487,12 @@
|
|
|
8487
8487
|
{
|
|
8488
8488
|
"path": "package-lock.json",
|
|
8489
8489
|
"mode": "0000644",
|
|
8490
|
-
"sha256": "
|
|
8490
|
+
"sha256": "c414fedc98910e53cb9b9e41f6f5bbf1d0c446e112bc79bbedb0417ca21f3d7d"
|
|
8491
8491
|
},
|
|
8492
8492
|
{
|
|
8493
8493
|
"path": "package.json",
|
|
8494
8494
|
"mode": "0000644",
|
|
8495
|
-
"sha256": "
|
|
8495
|
+
"sha256": "f7f732d65454317018b4df384ee3623df53b288846eff4bb5eecb251c2c8f50e"
|
|
8496
8496
|
},
|
|
8497
8497
|
{
|
|
8498
8498
|
"path": "public-docs/index.html",
|
|
@@ -8512,7 +8512,7 @@
|
|
|
8512
8512
|
{
|
|
8513
8513
|
"path": "release-notes.json",
|
|
8514
8514
|
"mode": "0000644",
|
|
8515
|
-
"sha256": "
|
|
8515
|
+
"sha256": "2299f29e67b632093950b98bbe95449c68f020a202b46c3b2de3e722373005fe"
|
|
8516
8516
|
},
|
|
8517
8517
|
{
|
|
8518
8518
|
"path": "scripts/bongos-mcp.js",
|
|
@@ -10572,7 +10572,7 @@
|
|
|
10572
10572
|
{
|
|
10573
10573
|
"path": "src/module-api.js",
|
|
10574
10574
|
"mode": "0000644",
|
|
10575
|
-
"sha256": "
|
|
10575
|
+
"sha256": "111153edb1c12f70dc1803c615be20ed3364ffb7971ff08cfc7b34a3eefee224"
|
|
10576
10576
|
},
|
|
10577
10577
|
{
|
|
10578
10578
|
"path": "src/module-loader/catalog.js",
|
|
@@ -12492,7 +12492,7 @@
|
|
|
12492
12492
|
{
|
|
12493
12493
|
"path": "tests/grade_model_provider.mjs",
|
|
12494
12494
|
"mode": "0000644",
|
|
12495
|
-
"sha256": "
|
|
12495
|
+
"sha256": "ecc16c3daa0d5d8e47af493433f39a62882571949686d20e1b3bde9eef9e1ff7"
|
|
12496
12496
|
},
|
|
12497
12497
|
{
|
|
12498
12498
|
"path": "tests/grade_server_authoritative.mjs",
|
|
@@ -12554,6 +12554,11 @@
|
|
|
12554
12554
|
"mode": "0000644",
|
|
12555
12555
|
"sha256": "50a785eb6e2c71d5a043c2ec2c37a835777da6397dac3ffc2542acdde14b57a8"
|
|
12556
12556
|
},
|
|
12557
|
+
{
|
|
12558
|
+
"path": "tests/grader_reviewer_isolation.mjs",
|
|
12559
|
+
"mode": "0000644",
|
|
12560
|
+
"sha256": "ee95ed46c2593541105e9fc42a21fe7e4a6a19f8ba54156856df1d8e8c06021f"
|
|
12561
|
+
},
|
|
12557
12562
|
{
|
|
12558
12563
|
"path": "tests/grader_root_outage.mjs",
|
|
12559
12564
|
"mode": "0000644",
|
|
@@ -2559,5 +2559,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
2559
2559
|
landed since 1.19.1038 with no explicit bump. run 36229255566. (task 1002620)
|
|
2560
2560
|
1.19.1040 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2561
2561
|
landed since 1.19.1039 with no explicit bump. run 36251192410. (task 1002620)
|
|
2562
|
+
1.19.1041 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2563
|
+
landed since 1.19.1040 with no explicit bump. run 36253865251. (task 1002620)
|
|
2562
2564
|
---------------------------------------------------------------------------
|
|
2563
2565
|
```
|
|
@@ -47,12 +47,19 @@ function runClaudeCli({ prompt, opts = {} }) {
|
|
|
47
47
|
const isRoot = typeof process.getuid === 'function' && process.getuid() === 0;
|
|
48
48
|
const permissionMode = isRoot ? 'acceptEdits' : 'bypassPermissions';
|
|
49
49
|
|
|
50
|
+
// NO MCP SERVERS (task 1000380). `--tools Read` limits the BUILT-IN tools only;
|
|
51
|
+
// MCP servers are a separate list, so without `--strict-mcp-config` every worker
|
|
52
|
+
// inherited the host's configured servers and claude.ai connectors — measured at
|
|
53
|
+
// 21 extra tools on the owner's Mac, a docs connector that can delete documents
|
|
54
|
+
// among them — inside a session with no permission prompts, reading a diff
|
|
55
|
+
// someone else wrote. Strict mode with no `--mcp-config` loads zero servers.
|
|
50
56
|
const args = [
|
|
51
57
|
'-p',
|
|
52
58
|
'--print',
|
|
53
59
|
'--model', model,
|
|
54
60
|
'--output-format', 'json',
|
|
55
61
|
'--tools', 'Read',
|
|
62
|
+
'--strict-mcp-config',
|
|
56
63
|
'--disable-slash-commands',
|
|
57
64
|
'--permission-mode', permissionMode,
|
|
58
65
|
];
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.1041",
|
|
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.1041",
|
|
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.1041",
|
|
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/release-notes.json
CHANGED
|
@@ -7537,5 +7537,11 @@
|
|
|
7537
7537
|
"id": "1003368",
|
|
7538
7538
|
"text": "Closed a security hole where a builder's branch could choose the program the server runs while auto-resolving merge conflicts; the server now always uses its own trusted copy."
|
|
7539
7539
|
}
|
|
7540
|
+
],
|
|
7541
|
+
"1.19.1041": [
|
|
7542
|
+
{
|
|
7543
|
+
"id": "1000380",
|
|
7544
|
+
"text": "The grader's reviewers now see only the file-reading tool they need. Before, they could also reach every service connected on the machine running them, such as documents and email, with no approval prompts, while reading code"
|
|
7545
|
+
}
|
|
7540
7546
|
]
|
|
7541
7547
|
}
|
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.1041'; // 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');
|
|
@@ -74,7 +74,7 @@ test('the Claude spawn is the default provider, with the identical argv', { skip
|
|
|
74
74
|
const r = await subagent.runSubagent({ prompt: 'hi', opts: { claudeBin: bin, model: 'claude-sonnet-5', cwd: dir } });
|
|
75
75
|
const argv = JSON.parse(subagent.extractAssistantResult(r.stdout));
|
|
76
76
|
const perm = typeof process.getuid === 'function' && process.getuid() === 0 ? 'acceptEdits' : 'bypassPermissions';
|
|
77
|
-
assert.deepEqual(argv, ['-p', '--print', '--model', 'claude-sonnet-5', '--output-format', 'json', '--tools', 'Read', '--disable-slash-commands', '--permission-mode', perm]);
|
|
77
|
+
assert.deepEqual(argv, ['-p', '--print', '--model', 'claude-sonnet-5', '--output-format', 'json', '--tools', 'Read', '--strict-mcp-config', '--disable-slash-commands', '--permission-mode', perm]);
|
|
78
78
|
assert.equal(r.cost_usd, 0.5);
|
|
79
79
|
const d = await subagent.runSubagent({ prompt: 'hi', opts: { claudeBin: bin, cwd: dir } });
|
|
80
80
|
assert.equal(JSON.parse(subagent.extractAssistantResult(d.stdout))[3], 'claude-sonnet-5', 'no model → the default grader model, as before');
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// tests/grader_reviewer_isolation.mjs — a grader reviewer sees the Read tool and
|
|
2
|
+
// NOTHING the host happens to have connected (task 1000380, re-scoped 2026-09-26).
|
|
3
|
+
//
|
|
4
|
+
// THE GAP THIS PINS. Every panel worker is a `claude -p` session reading a diff that
|
|
5
|
+
// someone else wrote, launched with permission prompts off (bypassPermissions, or
|
|
6
|
+
// acceptEdits as root — task 1003574). `--tools Read` limits the BUILT-IN tools only.
|
|
7
|
+
// It says nothing about MCP servers, so without `--strict-mcp-config` a reviewer
|
|
8
|
+
// inherits every server the host has configured — the user's settings, the project's
|
|
9
|
+
// .mcp.json, and the claude.ai connectors. Measured on the owner's Mac on 2026-09-26
|
|
10
|
+
// with the reviewer's exact flags: 22 tools (Read + 21 MCP tools, among them a docs
|
|
11
|
+
// connector that can create and delete documents); with `--strict-mcp-config`, 1.
|
|
12
|
+
// A diff that smuggles instructions to its reviewer had those 21 tools to reach for,
|
|
13
|
+
// with nothing to prompt for approval.
|
|
14
|
+
//
|
|
15
|
+
// `--strict-mcp-config` with no `--mcp-config` beside it loads zero servers, which is
|
|
16
|
+
// the whole intent: a reviewer needs no MCP server to read files.
|
|
17
|
+
//
|
|
18
|
+
// Run: node --test tests/grader_reviewer_isolation.mjs
|
|
19
|
+
import { test } from 'node:test';
|
|
20
|
+
import assert from 'node:assert/strict';
|
|
21
|
+
import fs from 'node:fs';
|
|
22
|
+
import os from 'node:os';
|
|
23
|
+
import path from 'node:path';
|
|
24
|
+
import { createRequire } from 'node:module';
|
|
25
|
+
|
|
26
|
+
const require = createRequire(import.meta.url);
|
|
27
|
+
const subagent = require('../modules/grading/grader-subagent.js');
|
|
28
|
+
|
|
29
|
+
// A stand-in `claude` that answers with the argv it was launched with, in the
|
|
30
|
+
// result envelope the real CLI uses — so the test reads what was ACTUALLY passed
|
|
31
|
+
// to the spawn, not what the source text looks like.
|
|
32
|
+
async function spawnArgv(opts = {}) {
|
|
33
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'grader-isolation-'));
|
|
34
|
+
const bin = path.join(dir, 'claude');
|
|
35
|
+
fs.writeFileSync(bin, '#!/usr/bin/env node\nprocess.stdin.resume(); process.stdin.on("end", () => process.stdout.write(JSON.stringify({ type: "result", result: JSON.stringify(process.argv.slice(2)) })));\n');
|
|
36
|
+
fs.chmodSync(bin, 0o755);
|
|
37
|
+
try {
|
|
38
|
+
const r = await subagent.runSubagent({ prompt: 'review this', opts: { claudeBin: bin, cwd: dir, ...opts } });
|
|
39
|
+
return JSON.parse(subagent.extractAssistantResult(r.stdout));
|
|
40
|
+
} finally {
|
|
41
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const skip = process.platform === 'win32' && 'the stand-in CLI is a shebang script';
|
|
46
|
+
|
|
47
|
+
test('a reviewer is launched with --strict-mcp-config, so no host MCP server loads', { skip }, async () => {
|
|
48
|
+
const argv = await spawnArgv();
|
|
49
|
+
assert.ok(argv.includes('--strict-mcp-config'),
|
|
50
|
+
`every reviewer spawn must ignore the host's MCP configuration; argv was ${JSON.stringify(argv)}`);
|
|
51
|
+
// Strict mode with no config file is what makes the server list EMPTY. Handing it
|
|
52
|
+
// a config would re-open exactly the door the flag closes.
|
|
53
|
+
assert.ok(!argv.includes('--mcp-config'), 'no MCP config is supplied to a reviewer');
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test('the flag holds for every model the panel runs, not only the default', { skip }, async () => {
|
|
57
|
+
for (const model of ['claude-sonnet-5', 'claude-opus-5-5', 'claude-haiku-4-5-20251001']) {
|
|
58
|
+
const argv = await spawnArgv({ model });
|
|
59
|
+
assert.ok(argv.includes('--strict-mcp-config'), `missing for ${model}`);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test('the built-in tool list is still Read alone — the two limits work together', { skip }, async () => {
|
|
64
|
+
const argv = await spawnArgv();
|
|
65
|
+
const i = argv.indexOf('--tools');
|
|
66
|
+
assert.ok(i >= 0, '--tools is passed');
|
|
67
|
+
assert.equal(argv[i + 1], 'Read', 'the only built-in tool is Read');
|
|
68
|
+
});
|