@bongos/core 1.19.1032 → 1.19.1034

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.
Files changed (151) hide show
  1. package/.bongos-core.json +322 -117
  2. package/.claude/skills/builder-start/SKILL.md +1 -1
  3. package/.claude/skills/grade-audit/SKILL.md +1 -1
  4. package/.claude/skills/grade-recover/SKILL.md +2 -1
  5. package/.claude/skills/grader-health/SKILL.md +5 -1
  6. package/.claude/skills/merge-mode/SKILL.md +1 -1
  7. package/docs/adr/0089-modular-multi-model-adversarial-grader.md +15 -0
  8. package/docs/adr/0175-the-board-room-full-idea-ratification.md +3 -2
  9. package/docs/adr/0178-the-copy-desk-flag-and-queue.md +3 -3
  10. package/docs/adr/0188-patrol-runs-on-ci-not-the-server.md +2 -2
  11. package/docs/adr/0189-baseline-floors-and-the-freeze-detector.md +1 -1
  12. package/docs/adr/0233-a-copy-proposal-is-a-task-carrying-a-patch.md +1 -1
  13. package/docs/adr/0241-the-artist-gate-is-a-per-project-deploy-gate-that-reads-a-state.md +11 -3
  14. package/docs/adr/README.md +4 -4
  15. package/docs/api/openapi.json +1 -1
  16. package/docs/architecture.md +4 -3
  17. package/docs/canonical-permissions.md +2 -2
  18. package/docs/copy-inventory.md +34 -30
  19. package/docs/copy-registry.json +69 -33
  20. package/docs/file-map.md +4 -3
  21. package/docs/module-api-changelog.md +4 -0
  22. package/docs/recipes/autobongos-windows-host.md +3 -1
  23. package/docs/recipes/local-dev.md +45 -3
  24. package/docs/recipes/packaging-the-core.md +3 -1
  25. package/docs/recipes/redteam-patrol.md +2 -2
  26. package/docs/recipes/upgrading-the-core.md +1 -1
  27. package/modules/autonomy/cadence.js +52 -0
  28. package/modules/autonomy/gauge.js +57 -9
  29. package/modules/government/protected-surfaces.json +1 -0
  30. package/modules/grading/grade-engine.js +267 -0
  31. package/modules/grading/grader-subagent.js +4 -3
  32. package/modules/grading/grader-workers/index.js +67 -11
  33. package/modules/grading/grader-workers/worker-verdict.js +32 -2
  34. package/modules/grading/grader.js +109 -88
  35. package/modules/hall-ui/public/deploy.js +35 -0
  36. package/modules/hall-ui/public/project-settings.css +7 -0
  37. package/modules/hall-ui/records/builders-roster.md +10 -0
  38. package/modules/hall-ui/records/catalog.md +10 -0
  39. package/modules/hall-ui/records/collaboration.md +14 -0
  40. package/modules/hall-ui/records/goal-dependency-forest.md +11 -0
  41. package/modules/hall-ui/records/oversight-family.md +19 -0
  42. package/modules/hall-ui/records/panel-family.md +19 -0
  43. package/modules/hall-ui/records/reading-rooms.md +12 -0
  44. package/modules/hall-ui/records/record-family.md +13 -0
  45. package/modules/hall-ui/records/reference-room.md +9 -0
  46. package/modules/hall-ui/records/roster-and-ledger.md +9 -0
  47. package/modules/hall-ui/records/sky.md +23 -0
  48. package/modules/lifecycle/dependency-advisory.js +2 -1
  49. package/modules/lifecycle/routes/tasks.js +19 -4
  50. package/modules/lifecycle/ship-preflight.js +91 -0
  51. package/modules/provisioning/control-plane-guard.js +14 -13
  52. package/modules/provisioning/core-upgrade.js +30 -17
  53. package/modules/provisioning/public-refusal.js +44 -0
  54. package/modules/provisioning/routes/disconnect.js +2 -1
  55. package/modules/provisioning/routes/env-manifest.js +5 -4
  56. package/modules/provisioning/routes/provisioning.js +16 -15
  57. package/modules/provisioning/routes/repo-private.js +2 -1
  58. package/package-lock.json +2 -2
  59. package/package.json +1 -1
  60. package/release-notes.json +7481 -0
  61. package/scripts/gds/address-park-sweep.sh +3 -1
  62. package/scripts/gds/autobongos-run.js +91 -3
  63. package/scripts/gds/backfill-cost.js +20 -9
  64. package/scripts/gds/baseline-staleness.js +1 -1
  65. package/scripts/gds/claim.js +2 -2
  66. package/scripts/gds/credential-presence.js +281 -0
  67. package/scripts/gds/db-backup-nightly.sh +9 -4
  68. package/scripts/gds/db-backup-offsite.sh +4 -2
  69. package/scripts/gds/deploy-main-audit-gate.sh +11 -4
  70. package/scripts/gds/dev-lib.js +212 -5
  71. package/scripts/gds/dev.js +102 -50
  72. package/scripts/gds/doctor.js +3 -2
  73. package/scripts/gds/grade-correlation-audit.js +280 -0
  74. package/scripts/gds/grade-replay.js +237 -0
  75. package/scripts/gds/hooks/pre-push.js +7 -3
  76. package/scripts/gds/main-audit.js +19 -10
  77. package/scripts/gds/memory-map.js +3 -1
  78. package/scripts/gds/onboarding-config.js +3 -2
  79. package/scripts/gds/package-core.js +72 -1
  80. package/scripts/gds/plain-cards.js +4 -0
  81. package/scripts/gds/preflight.js +12 -4
  82. package/scripts/gds/provision-core-upgrade.js +282 -80
  83. package/scripts/gds/provision-repo-auth.js +15 -0
  84. package/scripts/gds/provision.js +1 -1
  85. package/scripts/gds/publish-credential-check.js +3 -0
  86. package/scripts/gds/push-main.js +14 -3
  87. package/scripts/gds/push-path-brief.js +3 -2
  88. package/scripts/gds/redteam-patrol.js +4 -4
  89. package/scripts/gds/release-notes.js +271 -0
  90. package/scripts/gds/run-routine.js +18 -5
  91. package/scripts/gds/run-unit-tests.js +14 -3
  92. package/scripts/gds/seed-board-room-tasks.js +1 -1
  93. package/scripts/gds/session-cost.js +12 -3
  94. package/scripts/gds/ship-deploy-target.js +11 -6
  95. package/scripts/gds/ship-flow.js +5 -3
  96. package/scripts/gds/ship-grade-steps.js +33 -0
  97. package/scripts/gds/ship-land.js +241 -16
  98. package/scripts/gds/ship-merge.js +3 -2
  99. package/scripts/gds/ship-preflight-steps.js +86 -11
  100. package/scripts/gds/ship.js +1 -1
  101. package/scripts/gds/stray-unit-sweep.sh +3 -1
  102. package/scripts/gds/upgrade-migrate.js +67 -0
  103. package/scripts/gds/upgrade.js +9 -7
  104. package/scripts/hall-preview/README.md +20 -3
  105. package/scripts/hall-preview/live-identity.js +1 -1
  106. package/scripts/hall-preview/refresh-fixtures.js +71 -11
  107. package/scripts/hall-preview/scrub-identity.js +296 -0
  108. package/src/bongos/routes/security.js +3 -3
  109. package/src/build-info.js +4 -2
  110. package/src/module-api.js +1 -1
  111. package/tests/adr_0089_scope.mjs +70 -0
  112. package/tests/adr_0162_citation.mjs +184 -0
  113. package/tests/autobongos_cadence.mjs +74 -0
  114. package/tests/autobongos_loop.mjs +114 -0
  115. package/tests/autonomy_gauge.mjs +56 -0
  116. package/tests/consumer_layout_boot.mjs +363 -31
  117. package/tests/core_upgrade_door.mjs +40 -6
  118. package/tests/core_upgrade_runner.mjs +329 -5
  119. package/tests/credential_presence.mjs +153 -0
  120. package/tests/db_backup_nightly.mjs +21 -3
  121. package/tests/db_backup_offsite.mjs +81 -0
  122. package/tests/deploy_audit_gate.mjs +5 -2
  123. package/tests/deploy_page_projects.mjs +63 -2
  124. package/tests/dev_lib.mjs +2 -1
  125. package/tests/dev_windows.mjs +324 -0
  126. package/tests/env_knobs_neutral_prefix.mjs +203 -0
  127. package/tests/fixtures/grade-replay/recorded-panel-grades.json +27 -0
  128. package/tests/government_protected_surfaces.mjs +10 -0
  129. package/tests/grade_correlation_audit.mjs +159 -0
  130. package/tests/grade_engine.mjs +249 -0
  131. package/tests/grade_engine_replay.mjs +99 -0
  132. package/tests/grader_prompt_window_bound.mjs +132 -0
  133. package/tests/grader_unbacked_score.mjs +194 -0
  134. package/tests/hall_preview_scrub.mjs +214 -0
  135. package/tests/hall_records.mjs +85 -0
  136. package/tests/helpers.mjs +25 -0
  137. package/tests/instance_db_migrated_on_code_move.mjs +8 -1
  138. package/tests/integration_parked_ratchet.mjs +24 -1
  139. package/tests/plain_cards.mjs +1 -1
  140. package/tests/provisioning_public_refusal.mjs +195 -0
  141. package/tests/publish_status_branch.mjs +128 -0
  142. package/tests/redteam_patrol.mjs +1 -1
  143. package/tests/release_notes.mjs +327 -0
  144. package/tests/shell_stat_portability.mjs +49 -0
  145. package/tests/ship_land_conflict.mjs +181 -0
  146. package/tests/ship_land_red_pr.mjs +236 -0
  147. package/tests/ship_preflight.mjs +226 -3
  148. package/tests/start_env_guard.mjs +16 -0
  149. package/tests/sweep_app_account.mjs +15 -2
  150. package/tests/upgrade.mjs +20 -1
  151. package/tests/upgrade_migrate.mjs +195 -0
@@ -0,0 +1,195 @@
1
+ // tests/upgrade_migrate.mjs — `bongos upgrade` migrates an ADOPTED project that declares
2
+ // no migrate script, instead of rolling itself back (task 1004274; found preparing the
3
+ // task 1004047 catch-up pass).
4
+ //
5
+ // The catch-up pass could not reach mercury: an adopted Python/Flask project whose
6
+ // package.json is exactly what the adopt layer mints — name, private, dependencies, no
7
+ // scripts. upgrade.js migrated with `npm run migrate` only, so every upgrade of it died
8
+ // at step 4, after the pin had moved and the new core was installed, and rolled back —
9
+ // restarting a live app to change nothing — while the dry run reported nothing wrong.
10
+ //
11
+ // Pinned here: the fallback is the core's own migrate.sh, byte-identical to what a
12
+ // scaffold's script runs; a declared script still wins; the dry run says which one will
13
+ // run, on a line the Deploy page's pre-flight parser picks up; and the real command
14
+ // resolves the instance even when whoever launched the upgrade left a stray INIT_CWD.
15
+ //
16
+ // Run: node --test tests/upgrade_migrate.mjs
17
+
18
+ import { test } from 'node:test';
19
+ import assert from 'node:assert/strict';
20
+ import { createRequire } from 'node:module';
21
+ import { execFileSync } from 'node:child_process';
22
+ import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, realpathSync, symlinkSync } from 'node:fs';
23
+ import { tmpdir } from 'node:os';
24
+ import path from 'node:path';
25
+ import { fileURLToPath } from 'node:url';
26
+
27
+ const require = createRequire(import.meta.url);
28
+ const { migratePlan, CORE_MIGRATE_SCRIPT } = require('../scripts/gds/upgrade-migrate.js');
29
+ const u = require('../scripts/gds/upgrade.js');
30
+ const init = require('../scripts/gds/init.js');
31
+ const { parsePreflight } = require('../scripts/gds/provision-core-upgrade.js');
32
+
33
+ const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
34
+ const fixture = (prefix) => realpathSync(mkdtempSync(path.join(tmpdir(), prefix)));
35
+
36
+ // A project exactly as the adopt layer leaves one that had no package.json of its own —
37
+ // built BY that layer, so this cannot drift from what adoption really writes.
38
+ function adoptedProject({ installed = '1.19.312' } = {}) {
39
+ const dir = fixture('upgrade-migrate-adopted-');
40
+ const { pkg, action } = init.mergeCoreDependency(null, { coreRange: `file:vendor/bongos-core-${installed}.tgz`, name: 'mercury' });
41
+ assert.equal(action, 'created', 'fixture: the adopt layer minted the package.json');
42
+ assert.deepEqual(Object.keys(pkg).sort(), ['dependencies', 'name', 'private'], 'fixture: mercury\'s real shape — no scripts at all');
43
+ writeFileSync(path.join(dir, 'package.json'), `${JSON.stringify(pkg, null, 2)}\n`);
44
+ const core = path.join(dir, 'node_modules', '@bongos', 'core');
45
+ mkdirSync(core, { recursive: true });
46
+ writeFileSync(path.join(core, 'package.json'), `${JSON.stringify({ name: '@bongos/core', version: installed })}\n`);
47
+ return dir;
48
+ }
49
+
50
+ function scaffoldedProject(scripts = { migrate: init.INSTANCE_MIGRATE_SCRIPT, start: init.INSTANCE_START_SCRIPT }) {
51
+ const dir = fixture('upgrade-migrate-scaffold-');
52
+ writeFileSync(path.join(dir, 'package.json'), `${JSON.stringify({ name: 'charter', private: true, scripts, dependencies: { '@bongos/core': '1.19.871' } }, null, 2)}\n`);
53
+ return dir;
54
+ }
55
+
56
+ // Records every spawn as "cmd args…" plus its options. The pre-flight's database
57
+ // resolver is answered with a name (as the real one answers on a provisioned box), and
58
+ // `npm install` flips the installed core to `installTo` — all a successful install needs
59
+ // to look like here.
60
+ function recordingRun(calls, { dir, installTo, db = 'mercury' } = {}) {
61
+ return (cmd, args = [], opts = {}) => {
62
+ calls.push({ line: `${cmd} ${args.join(' ')}`.trim(), opts });
63
+ if (cmd === 'git' && args[0] === 'status') return { status: 0, stdout: '' };
64
+ if (cmd === process.execPath && String(args[1] || '').includes('instanceDbName')) return { status: 0, stdout: db };
65
+ if (cmd === 'npm' && args[0] === 'install' && installTo) {
66
+ writeFileSync(path.join(dir, 'node_modules', '@bongos', 'core', 'package.json'), `${JSON.stringify({ name: '@bongos/core', version: installTo })}\n`);
67
+ }
68
+ return { status: 0, stdout: '' };
69
+ };
70
+ }
71
+
72
+ test('the fallback IS the scaffold\'s own migrate script, byte for byte', () => {
73
+ assert.equal(`bash ${CORE_MIGRATE_SCRIPT}`, init.INSTANCE_MIGRATE_SCRIPT,
74
+ 'an adopted project must be migrated by exactly the command a greenfield scaffold declares');
75
+ });
76
+
77
+ test('a project with no migrate script is migrated by the core\'s migrate.sh, from its own root', () => {
78
+ const dir = adoptedProject();
79
+ const plan = migratePlan(dir, { env: { PATH: '/usr/bin', PGDATABASE: 'mercury', INIT_CWD: '/somewhere/else' } });
80
+ assert.equal(plan.via, 'core-script');
81
+ assert.equal(plan.cmd, 'bash');
82
+ assert.deepEqual(plan.args, [CORE_MIGRATE_SCRIPT]);
83
+ assert.equal(plan.env.INIT_CWD, dir, 'INIT_CWD is what npm run would set — the project, never an inherited stray');
84
+ assert.equal(plan.env.PGDATABASE, 'mercury', 'the database the runner named still reaches migrate.sh');
85
+ assert.match(plan.note, /declares no migrate script/);
86
+ });
87
+
88
+ test('scripts without a migrate entry, or a blank one, also fall back', () => {
89
+ assert.equal(migratePlan(scaffoldedProject({ start: 'node app.js' })).via, 'core-script');
90
+ assert.equal(migratePlan(scaffoldedProject({ migrate: ' ' })).via, 'core-script');
91
+ });
92
+
93
+ test('a declared migrate script still wins, whatever it says', () => {
94
+ for (const migrate of [init.INSTANCE_MIGRATE_SCRIPT, 'node scripts/own-migrate.js']) {
95
+ const plan = migratePlan(scaffoldedProject({ migrate }));
96
+ assert.equal(plan.via, 'npm-script');
97
+ assert.deepEqual([plan.cmd, ...plan.args], ['npm', 'run', 'migrate']);
98
+ assert.equal(plan.env, null, 'npm sets INIT_CWD itself, so nothing is overridden');
99
+ assert.equal(plan.note, null, 'the ordinary case adds no pre-flight line');
100
+ }
101
+ });
102
+
103
+ test('a missing or unparseable package.json keeps the old command rather than guessing', () => {
104
+ assert.equal(migratePlan(fixture('upgrade-migrate-empty-')).via, 'npm-script');
105
+ const bad = fixture('upgrade-migrate-bad-');
106
+ writeFileSync(path.join(bad, 'package.json'), '{ not json');
107
+ assert.equal(migratePlan(bad).via, 'npm-script');
108
+ });
109
+
110
+ test('runMigrate spawns the plan: npm on a scaffold, the core script on an adopted project', () => {
111
+ const calls = [];
112
+ u.runMigrate(scaffoldedProject(), recordingRun(calls));
113
+ const adopted = adoptedProject();
114
+ u.runMigrate(adopted, recordingRun(calls));
115
+ assert.equal(calls[0].line, 'npm run migrate');
116
+ assert.equal(calls[0].opts.env, undefined, 'the scaffold path inherits the environment exactly as before');
117
+ assert.equal(calls[1].line, `bash ${CORE_MIGRATE_SCRIPT}`);
118
+ assert.equal(calls[1].opts.cwd, adopted);
119
+ assert.equal(calls[1].opts.env.INIT_CWD, adopted);
120
+ });
121
+
122
+ test('a full registry upgrade of an adopted project migrates it instead of rolling back', async () => {
123
+ const dir = adoptedProject({ installed: '1.19.312' });
124
+ const calls = [];
125
+ const res = await u.runUpgrade(
126
+ { to: '1.19.1029', registry: true, instance: dir, service: 'mercury', healthCheck: false },
127
+ {
128
+ log: () => {}, err: () => {},
129
+ run: recordingRun(calls, { dir, installTo: '1.19.1029' }),
130
+ materialize: () => ({ skills: 0 }),
131
+ regenerateApiArtifacts: () => ({ ok: true, ran: [] }),
132
+ databaseUrl: '', pgDatabase: '',
133
+ },
134
+ );
135
+ const lines = calls.map((c) => c.line);
136
+ assert.equal(res.ok, true, `the upgrade completes: ${res.error || ''}`);
137
+ assert.ok(!res.rolledBack, 'and was not rolled back');
138
+ assert.ok(lines.includes(`bash ${CORE_MIGRATE_SCRIPT}`), 'the schema moved with the code');
139
+ assert.ok(!lines.includes('npm run migrate'), 'the missing script was never asked for');
140
+ assert.ok(lines.indexOf(`bash ${CORE_MIGRATE_SCRIPT}`) < lines.indexOf('systemctl restart mercury'), 'and migrate still runs before the restart that makes the code live');
141
+ });
142
+
143
+ test('the dry run names the fallback on a line the Deploy page\'s pre-flight shows', async () => {
144
+ const dir = adoptedProject();
145
+ const out = [];
146
+ const res = await u.runUpgrade(
147
+ { to: '1.19.1029', registry: true, instance: dir, dryRun: true },
148
+ { log: (m) => out.push(m), err: () => {}, run: recordingRun([]) },
149
+ );
150
+ assert.equal(res.ok, true);
151
+ const text = out.join('\n');
152
+ assert.match(text, new RegExp(`would: npm install → bash ${CORE_MIGRATE_SCRIPT.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&')} →`));
153
+ const { checks } = parsePreflight(text);
154
+ assert.ok(checks.some((c) => /declares no migrate script/.test(c)), `the door's parser carries it: ${JSON.stringify(checks)}`);
155
+ assert.deepEqual(JSON.parse(readFileSync(path.join(dir, 'package.json'), 'utf8')).dependencies,
156
+ { '@bongos/core': 'file:vendor/bongos-core-1.19.312.tgz' }, 'and the dry run moved nothing');
157
+ });
158
+
159
+ test('the dry run of an ordinary scaffold is unchanged', async () => {
160
+ const dir = scaffoldedProject();
161
+ const core = path.join(dir, 'node_modules', '@bongos', 'core');
162
+ mkdirSync(core, { recursive: true });
163
+ writeFileSync(path.join(core, 'package.json'), `${JSON.stringify({ name: '@bongos/core', version: '1.19.871' })}\n`);
164
+ const out = [];
165
+ await u.runUpgrade({ to: '1.19.1029', registry: true, instance: dir, dryRun: true }, { log: (m) => out.push(m), err: () => {}, run: recordingRun([]) });
166
+ const text = out.join('\n');
167
+ assert.match(text, /would: npm install → npm run migrate →/);
168
+ assert.doesNotMatch(text, /declares no migrate script/);
169
+ });
170
+
171
+ // The real migrate.sh, through its DB-free --print-roots seam (tests/migrate_root_resolution.mjs):
172
+ // the fallback must find the PROJECT, not the core package and not a stray INIT_CWD.
173
+ test('the real fallback command resolves the project as its instance root, despite a stray INIT_CWD', (t) => {
174
+ const dir = adoptedProject();
175
+ writeFileSync(path.join(dir, 'bongos.config.json'), JSON.stringify({ instanceRoot: '.' }));
176
+ const core = path.join(dir, 'node_modules', '@bongos', 'core');
177
+ // Swap the stub for the real core, so the script that runs is the one that ships.
178
+ execFileSync(process.execPath, ['-e', 'require("fs").rmSync(process.argv[1], { recursive: true, force: true })', core]);
179
+ try { symlinkSync(REPO_ROOT, core, 'dir'); } catch (e) {
180
+ if (e.code === 'EPERM' || e.code === 'EACCES') return t.skip('this platform refuses symlinks without elevation');
181
+ throw e;
182
+ }
183
+ const stray = fixture('upgrade-migrate-stray-');
184
+ const base = { ...process.env, INIT_CWD: stray };
185
+ for (const k of Object.keys(base)) if (/_INSTANCE_ROOT$/.test(k)) delete base[k];
186
+ const rootsOf = (out) => Object.fromEntries(out.split('\n').map((l) => /^(INVOKE_CWD|CORE_ROOT|INSTANCE_ROOT)=(.*)$/.exec(l)).filter(Boolean).map((m) => [m[1], m[2]]));
187
+
188
+ const plan = migratePlan(dir, { env: base });
189
+ const roots = rootsOf(execFileSync(plan.cmd, [...plan.args, '--print-roots'], { cwd: dir, env: plan.env, encoding: 'utf8' }));
190
+ assert.equal(roots.INSTANCE_ROOT, dir, 'migrate.sh migrates THIS project');
191
+
192
+ // And the override is load-bearing: the same script with the inherited value is misaimed.
193
+ const blind = rootsOf(execFileSync('bash', [CORE_MIGRATE_SCRIPT, '--print-roots'], { cwd: dir, env: base, encoding: 'utf8' }));
194
+ assert.notEqual(blind.INSTANCE_ROOT, dir, 'without INIT_CWD pinned, a stray value decides which project is migrated');
195
+ });