@bongos/core 1.19.1078 → 1.19.1079
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 +30 -25
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +6 -0
- package/clients/bongos-client/index.cjs +6 -0
- package/clients/bongos-client/index.d.ts +10 -0
- package/clients/bongos-client/index.mjs +6 -0
- package/docs/api/openapi.json +246 -3
- package/docs/api-reference.md +5 -2
- package/docs/architecture.md +2 -1
- package/docs/module-api-changelog.md +2 -0
- package/docs/modules-contract.md +10 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/scripts/gds/module-artifact.js +9 -2
- package/scripts/gds/module.js +142 -1
- package/src/bongos/module-store.js +55 -0
- package/src/bongos/routes/modules.js +119 -2
- package/src/module-api.js +1 -1
- package/tests/module_install.mjs +224 -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.1079",
|
|
6
|
+
"core_contract": "1.19.1079",
|
|
7
|
+
"source_commit": "0383ae383a565f9a6b3c9cef65e5db1a25fda1b8",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-
|
|
9
|
+
"built_at": "2026-09-29T17:08:08.029Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 550,
|
|
13
13
|
"agent_docs_stubbed": 25,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 2534,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 3110,
|
|
20
|
+
"tree_sha256": "09c2966aeb5069bc3a6d9f1f306e4d993ec3f09da7b4136e4cab9b93e0f3e690",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -322,12 +322,12 @@
|
|
|
322
322
|
{
|
|
323
323
|
"path": "clients/bongos-client/README.md",
|
|
324
324
|
"mode": "0000644",
|
|
325
|
-
"sha256": "
|
|
325
|
+
"sha256": "8aa624b247e99bb0a7e3a97745ecd4aa64d7fdddc89d92f47cb20d433d2ad5b0"
|
|
326
326
|
},
|
|
327
327
|
{
|
|
328
328
|
"path": "clients/bongos-client/bongos-client.global.js",
|
|
329
329
|
"mode": "0000644",
|
|
330
|
-
"sha256": "
|
|
330
|
+
"sha256": "510df3006216f3a54f88d90e802d565cc52753ab723061787229ee3d65bd5c83"
|
|
331
331
|
},
|
|
332
332
|
{
|
|
333
333
|
"path": "clients/bongos-client/examples/hello-world.mjs",
|
|
@@ -337,17 +337,17 @@
|
|
|
337
337
|
{
|
|
338
338
|
"path": "clients/bongos-client/index.cjs",
|
|
339
339
|
"mode": "0000644",
|
|
340
|
-
"sha256": "
|
|
340
|
+
"sha256": "3e76df3485bb6fb4555e2b85b6637104718eee1fd325f9a951641dc971833295"
|
|
341
341
|
},
|
|
342
342
|
{
|
|
343
343
|
"path": "clients/bongos-client/index.d.ts",
|
|
344
344
|
"mode": "0000644",
|
|
345
|
-
"sha256": "
|
|
345
|
+
"sha256": "129e807451025dd8346054523b1829db460319c04c640b9e78af39ba012c73bc"
|
|
346
346
|
},
|
|
347
347
|
{
|
|
348
348
|
"path": "clients/bongos-client/index.mjs",
|
|
349
349
|
"mode": "0000644",
|
|
350
|
-
"sha256": "
|
|
350
|
+
"sha256": "de3ceb5761e334327e7e6367acc8dc4daea75561c1b17c967bb0b7fc43aa7dc1"
|
|
351
351
|
},
|
|
352
352
|
{
|
|
353
353
|
"path": "clients/bongos-client/package.json",
|
|
@@ -2207,17 +2207,17 @@
|
|
|
2207
2207
|
{
|
|
2208
2208
|
"path": "docs/api-reference.md",
|
|
2209
2209
|
"mode": "0000644",
|
|
2210
|
-
"sha256": "
|
|
2210
|
+
"sha256": "db6392644382a35358daedffe8289ba644ee4d005e842110271702966a8e7cd3"
|
|
2211
2211
|
},
|
|
2212
2212
|
{
|
|
2213
2213
|
"path": "docs/api/openapi.json",
|
|
2214
2214
|
"mode": "0000644",
|
|
2215
|
-
"sha256": "
|
|
2215
|
+
"sha256": "b3795bc67242cfbebf5cd0023327dfc768293fbe09b5998b3c0c2a8f26754ea0"
|
|
2216
2216
|
},
|
|
2217
2217
|
{
|
|
2218
2218
|
"path": "docs/architecture.md",
|
|
2219
2219
|
"mode": "0000644",
|
|
2220
|
-
"sha256": "
|
|
2220
|
+
"sha256": "cb0de2130b810b17ba5b79cc52a6bf4594e84d9aa2d88405be7dd96f66e3cf06"
|
|
2221
2221
|
},
|
|
2222
2222
|
{
|
|
2223
2223
|
"path": "docs/branding-contract.md",
|
|
@@ -2742,12 +2742,12 @@
|
|
|
2742
2742
|
{
|
|
2743
2743
|
"path": "docs/module-api-changelog.md",
|
|
2744
2744
|
"mode": "0000644",
|
|
2745
|
-
"sha256": "
|
|
2745
|
+
"sha256": "cd8f1a1404e5c2fc789d2efa06eb513c165de83c6c9af94350ec8fbaf90a897a"
|
|
2746
2746
|
},
|
|
2747
2747
|
{
|
|
2748
2748
|
"path": "docs/modules-contract.md",
|
|
2749
2749
|
"mode": "0000644",
|
|
2750
|
-
"sha256": "
|
|
2750
|
+
"sha256": "31b76c94f9c9703249328a9faa71a87e79e644c41ba41acb7c7209135ccbcb21"
|
|
2751
2751
|
},
|
|
2752
2752
|
{
|
|
2753
2753
|
"path": "docs/onboarding/diagrams/01-task-lifecycle.mmd",
|
|
@@ -8602,12 +8602,12 @@
|
|
|
8602
8602
|
{
|
|
8603
8603
|
"path": "package-lock.json",
|
|
8604
8604
|
"mode": "0000644",
|
|
8605
|
-
"sha256": "
|
|
8605
|
+
"sha256": "b94499c149cab0d2b61e2c16da48bdc29e750538aa9c60363cf4d4cc0511b145"
|
|
8606
8606
|
},
|
|
8607
8607
|
{
|
|
8608
8608
|
"path": "package.json",
|
|
8609
8609
|
"mode": "0000644",
|
|
8610
|
-
"sha256": "
|
|
8610
|
+
"sha256": "fc349b40ca4dc25724895e0982b5b689b4ed60e44b1eb567ffc1bbd620977ed9"
|
|
8611
8611
|
},
|
|
8612
8612
|
{
|
|
8613
8613
|
"path": "public-docs/index.html",
|
|
@@ -8627,7 +8627,7 @@
|
|
|
8627
8627
|
{
|
|
8628
8628
|
"path": "release-notes.json",
|
|
8629
8629
|
"mode": "0000644",
|
|
8630
|
-
"sha256": "
|
|
8630
|
+
"sha256": "5a79e67ac4a575bc5d0f4a1d8b2e38e4adc746bacaac066d02cea4698e39d79b"
|
|
8631
8631
|
},
|
|
8632
8632
|
{
|
|
8633
8633
|
"path": "scripts/bongos-mcp.js",
|
|
@@ -9452,12 +9452,12 @@
|
|
|
9452
9452
|
{
|
|
9453
9453
|
"path": "scripts/gds/module-artifact.js",
|
|
9454
9454
|
"mode": "0000644",
|
|
9455
|
-
"sha256": "
|
|
9455
|
+
"sha256": "09211dcd5bae4b935b5f80a2c021a1c10a376236b1c7ea7ebc1f53b84d1ead40"
|
|
9456
9456
|
},
|
|
9457
9457
|
{
|
|
9458
9458
|
"path": "scripts/gds/module.js",
|
|
9459
9459
|
"mode": "0000644",
|
|
9460
|
-
"sha256": "
|
|
9460
|
+
"sha256": "eccf6ccfa68342268d8d63ebde68af4402ff3c6cfcecec2262656801e24bf263"
|
|
9461
9461
|
},
|
|
9462
9462
|
{
|
|
9463
9463
|
"path": "scripts/gds/newcomer-floor.config.json",
|
|
@@ -10497,7 +10497,7 @@
|
|
|
10497
10497
|
{
|
|
10498
10498
|
"path": "src/bongos/module-store.js",
|
|
10499
10499
|
"mode": "0000644",
|
|
10500
|
-
"sha256": "
|
|
10500
|
+
"sha256": "2bc2e05af26a1e416fb083dda7cfce7e7693a56dccd46f7d1f233343ec73d215"
|
|
10501
10501
|
},
|
|
10502
10502
|
{
|
|
10503
10503
|
"path": "src/bongos/module-submissions.js",
|
|
@@ -10632,7 +10632,7 @@
|
|
|
10632
10632
|
{
|
|
10633
10633
|
"path": "src/bongos/routes/modules.js",
|
|
10634
10634
|
"mode": "0000644",
|
|
10635
|
-
"sha256": "
|
|
10635
|
+
"sha256": "bd4e80ff8712d0797a62bddb3577f52f4cf161ac2273028e8a8def0455118e63"
|
|
10636
10636
|
},
|
|
10637
10637
|
{
|
|
10638
10638
|
"path": "src/bongos/routes/my-sessions.js",
|
|
@@ -10702,7 +10702,7 @@
|
|
|
10702
10702
|
{
|
|
10703
10703
|
"path": "src/module-api.js",
|
|
10704
10704
|
"mode": "0000644",
|
|
10705
|
-
"sha256": "
|
|
10705
|
+
"sha256": "b65c0562481a90446f4881d84eeda91c28949f216835e6a0bab6105755403932"
|
|
10706
10706
|
},
|
|
10707
10707
|
{
|
|
10708
10708
|
"path": "src/module-loader/catalog.js",
|
|
@@ -13559,6 +13559,11 @@
|
|
|
13559
13559
|
"mode": "0000644",
|
|
13560
13560
|
"sha256": "b84800d125bff6227c4c47edc0b606ee5c458248cca247b9d9df92568af55d55"
|
|
13561
13561
|
},
|
|
13562
|
+
{
|
|
13563
|
+
"path": "tests/module_install.mjs",
|
|
13564
|
+
"mode": "0000644",
|
|
13565
|
+
"sha256": "7aea6f842ba53a4a00a7857d0e406575ebcd9831cd17eb7f1a1ac88b99af88c6"
|
|
13566
|
+
},
|
|
13562
13567
|
{
|
|
13563
13568
|
"path": "tests/module_loader.mjs",
|
|
13564
13569
|
"mode": "0000644",
|
|
@@ -5,7 +5,7 @@ A **generated**, zero-dependency typed client for the Bongos API — produced fr
|
|
|
5
5
|
by hand; it regenerates when the spec changes, so it can never drift from the routes.
|
|
6
6
|
|
|
7
7
|
- API version: **v1** (served at `/api/bongos/v1`)
|
|
8
|
-
-
|
|
8
|
+
- 439 operations across 67 resource groups
|
|
9
9
|
|
|
10
10
|
## Use it from your project
|
|
11
11
|
|
|
@@ -973,10 +973,16 @@ function createClient(opts = {}) {
|
|
|
973
973
|
"store": {
|
|
974
974
|
// GET /store/entitlements — rank: any-builder — GET /store/entitlements
|
|
975
975
|
getStoreEntitlements: (args) => request("GET", "/store/entitlements", { hasBody: false }, args),
|
|
976
|
+
// POST /store/modules/{key}/acquire — rank: any-builder — POST /store/modules/:key/acquire
|
|
977
|
+
postStoreModulesKeyAcquire: (args) => request("POST", "/store/modules/{key}/acquire", { hasBody: true }, args),
|
|
978
|
+
// POST /store/modules/{key}/acquired — rank: any-builder — POST /store/modules/:key/acquired
|
|
979
|
+
postStoreModulesKeyAcquired: (args) => request("POST", "/store/modules/{key}/acquired", { hasBody: true }, args),
|
|
976
980
|
// GET /store/modules/{key}/entitlement — rank: any-builder — GET /store/modules/:key/entitlement
|
|
977
981
|
getStoreModulesKeyEntitlement: (args) => request("GET", "/store/modules/{key}/entitlement", { hasBody: false }, args),
|
|
978
982
|
// POST /store/modules/{key}/versions — rank: metic+archon — POST /store/modules/:key/versions
|
|
979
983
|
postStoreModulesKeyVersions: (args) => request("POST", "/store/modules/{key}/versions", { hasBody: true }, args),
|
|
984
|
+
// GET /store/modules/{key}/versions/{version}/tarball — rank: any-builder — GET /store/modules/:key/versions/:version/tarball
|
|
985
|
+
getStoreModulesKeyVersionsVersionTarball: (args) => request("GET", "/store/modules/{key}/versions/{version}/tarball", { hasBody: false }, args),
|
|
980
986
|
},
|
|
981
987
|
"taskRecommendations": {
|
|
982
988
|
// POST /task-recommendations — rank: any-builder — POST /task-recommendations
|
|
@@ -972,10 +972,16 @@ function createClient(opts = {}) {
|
|
|
972
972
|
"store": {
|
|
973
973
|
// GET /store/entitlements — rank: any-builder — GET /store/entitlements
|
|
974
974
|
getStoreEntitlements: (args) => request("GET", "/store/entitlements", { hasBody: false }, args),
|
|
975
|
+
// POST /store/modules/{key}/acquire — rank: any-builder — POST /store/modules/:key/acquire
|
|
976
|
+
postStoreModulesKeyAcquire: (args) => request("POST", "/store/modules/{key}/acquire", { hasBody: true }, args),
|
|
977
|
+
// POST /store/modules/{key}/acquired — rank: any-builder — POST /store/modules/:key/acquired
|
|
978
|
+
postStoreModulesKeyAcquired: (args) => request("POST", "/store/modules/{key}/acquired", { hasBody: true }, args),
|
|
975
979
|
// GET /store/modules/{key}/entitlement — rank: any-builder — GET /store/modules/:key/entitlement
|
|
976
980
|
getStoreModulesKeyEntitlement: (args) => request("GET", "/store/modules/{key}/entitlement", { hasBody: false }, args),
|
|
977
981
|
// POST /store/modules/{key}/versions — rank: metic+archon — POST /store/modules/:key/versions
|
|
978
982
|
postStoreModulesKeyVersions: (args) => request("POST", "/store/modules/{key}/versions", { hasBody: true }, args),
|
|
983
|
+
// GET /store/modules/{key}/versions/{version}/tarball — rank: any-builder — GET /store/modules/:key/versions/:version/tarball
|
|
984
|
+
getStoreModulesKeyVersionsVersionTarball: (args) => request("GET", "/store/modules/{key}/versions/{version}/tarball", { hasBody: false }, args),
|
|
979
985
|
},
|
|
980
986
|
"taskRecommendations": {
|
|
981
987
|
// POST /task-recommendations — rank: any-builder — POST /task-recommendations
|
|
@@ -430,6 +430,10 @@ export interface PostSsoMembershipCheckInRequest { client_id: string; client_sec
|
|
|
430
430
|
export interface PostSsoMembershipCheckInResponse { ok: boolean }
|
|
431
431
|
export interface PostSsoTokenRequest { client_id: string; client_secret: string; code: string; redirect_uri: string }
|
|
432
432
|
export interface PostSsoTokenResponse { github_id: unknown; github_login: unknown; display_name: unknown; avatar_url: unknown }
|
|
433
|
+
export interface PostStoreModulesKeyAcquireRequest { version?: string }
|
|
434
|
+
export interface PostStoreModulesKeyAcquireResponse { ok: boolean; module_key: unknown; version: unknown; core_version: unknown; tarball_sha256: unknown; tree_sha256: unknown; tarball_bytes: unknown; channel: unknown; entitlement: unknown }
|
|
435
|
+
export interface PostStoreModulesKeyAcquiredRequest { version: string }
|
|
436
|
+
export interface PostStoreModulesKeyAcquiredResponse { ok: boolean; entitlement: unknown }
|
|
433
437
|
export interface PostStoreModulesKeyVersionsResponse { ok: boolean; created_module: unknown; version: unknown }
|
|
434
438
|
export interface PostTaskRecommendationsRequest { task_id: number; recommended_to: number; reason: string }
|
|
435
439
|
export interface PostTaskRecommendationsResponse { ok: boolean; recommendation: unknown }
|
|
@@ -1373,10 +1377,16 @@ export interface BongosClient {
|
|
|
1373
1377
|
"store": {
|
|
1374
1378
|
/** GET /store/entitlements — rank: any-builder */
|
|
1375
1379
|
getStoreEntitlements(args?: RequestArgs): Promise<GetStoreEntitlementsResponse>;
|
|
1380
|
+
/** POST /store/modules/{key}/acquire — rank: any-builder */
|
|
1381
|
+
postStoreModulesKeyAcquire(args?: RequestArgs & { body?: PostStoreModulesKeyAcquireRequest }): Promise<PostStoreModulesKeyAcquireResponse>;
|
|
1382
|
+
/** POST /store/modules/{key}/acquired — rank: any-builder */
|
|
1383
|
+
postStoreModulesKeyAcquired(args: RequestArgs & { body: PostStoreModulesKeyAcquiredRequest }): Promise<PostStoreModulesKeyAcquiredResponse>;
|
|
1376
1384
|
/** GET /store/modules/{key}/entitlement — rank: any-builder */
|
|
1377
1385
|
getStoreModulesKeyEntitlement(args?: RequestArgs): Promise<ApiResponse>;
|
|
1378
1386
|
/** POST /store/modules/{key}/versions — rank: metic+archon */
|
|
1379
1387
|
postStoreModulesKeyVersions(args?: RequestArgs): Promise<PostStoreModulesKeyVersionsResponse>;
|
|
1388
|
+
/** GET /store/modules/{key}/versions/{version}/tarball — rank: any-builder */
|
|
1389
|
+
getStoreModulesKeyVersionsVersionTarball(args?: RequestArgs): Promise<ApiResponse>;
|
|
1380
1390
|
};
|
|
1381
1391
|
"taskRecommendations": {
|
|
1382
1392
|
/** POST /task-recommendations — rank: any-builder */
|
|
@@ -969,10 +969,16 @@ export function createClient(opts = {}) {
|
|
|
969
969
|
"store": {
|
|
970
970
|
// GET /store/entitlements — rank: any-builder — GET /store/entitlements
|
|
971
971
|
getStoreEntitlements: (args) => request("GET", "/store/entitlements", { hasBody: false }, args),
|
|
972
|
+
// POST /store/modules/{key}/acquire — rank: any-builder — POST /store/modules/:key/acquire
|
|
973
|
+
postStoreModulesKeyAcquire: (args) => request("POST", "/store/modules/{key}/acquire", { hasBody: true }, args),
|
|
974
|
+
// POST /store/modules/{key}/acquired — rank: any-builder — POST /store/modules/:key/acquired
|
|
975
|
+
postStoreModulesKeyAcquired: (args) => request("POST", "/store/modules/{key}/acquired", { hasBody: true }, args),
|
|
972
976
|
// GET /store/modules/{key}/entitlement — rank: any-builder — GET /store/modules/:key/entitlement
|
|
973
977
|
getStoreModulesKeyEntitlement: (args) => request("GET", "/store/modules/{key}/entitlement", { hasBody: false }, args),
|
|
974
978
|
// POST /store/modules/{key}/versions — rank: metic+archon — POST /store/modules/:key/versions
|
|
975
979
|
postStoreModulesKeyVersions: (args) => request("POST", "/store/modules/{key}/versions", { hasBody: true }, args),
|
|
980
|
+
// GET /store/modules/{key}/versions/{version}/tarball — rank: any-builder — GET /store/modules/:key/versions/:version/tarball
|
|
981
|
+
getStoreModulesKeyVersionsVersionTarball: (args) => request("GET", "/store/modules/{key}/versions/{version}/tarball", { hasBody: false }, args),
|
|
976
982
|
},
|
|
977
983
|
"taskRecommendations": {
|
|
978
984
|
// POST /task-recommendations — rank: any-builder — POST /task-recommendations
|
package/docs/api/openapi.json
CHANGED
|
@@ -17750,6 +17750,132 @@
|
|
|
17750
17750
|
]
|
|
17751
17751
|
}
|
|
17752
17752
|
},
|
|
17753
|
+
"/store/modules/{key}/acquire": {
|
|
17754
|
+
"post": {
|
|
17755
|
+
"operationId": "post_store_modules_key_acquire",
|
|
17756
|
+
"tags": [
|
|
17757
|
+
"store"
|
|
17758
|
+
],
|
|
17759
|
+
"summary": "POST /store/modules/:key/acquire",
|
|
17760
|
+
"description": "---- install: acquire → download → record (task 1003785, ADR 0338 D1) ---- The server end of `bongos module install`. Three steps, so the store never records a version as acquired that the caller did not verify and place: 1. POST acquire — resolve the version, and take the entitlement: a free module (no price, or a zero price) is granted here with source 'free'; a priced one needs the buy action, which is area 8's (tasks 1003788/1003789) and answers 402 until then. 2. GET tarball — served only to a LIVE entitlement holder, never for a delisted module (ADR 0338 D2: no further versions served). 3. POST acquired — the CLI has verified the bytes with verifyModuleArtifact and placed them; recordAcquired stamps the exact version. Own-scoped like the entitlement reads: the holder is always the caller (holder_kind 'builder'), never named in the request, so requireBuilder is the gate — any signed-in builder may take a free module for themselves, and nothing here changes what runs on this instance (install never enables; the CLI places files on the CALLER's checkout). Channels: every version is on the general channel until the channel table (task 1003815) and \"install honours the channel\" (task 1003805) land; those add the channel check to step 1 and step 2, beside the entitlement check.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
17761
|
+
"x-rank": "any-builder",
|
|
17762
|
+
"x-source": "src/bongos/routes/modules.js",
|
|
17763
|
+
"parameters": [
|
|
17764
|
+
{
|
|
17765
|
+
"name": "key",
|
|
17766
|
+
"in": "path",
|
|
17767
|
+
"required": true,
|
|
17768
|
+
"schema": {
|
|
17769
|
+
"type": "string"
|
|
17770
|
+
},
|
|
17771
|
+
"description": "Path parameter `key`."
|
|
17772
|
+
}
|
|
17773
|
+
],
|
|
17774
|
+
"requestBody": {
|
|
17775
|
+
"required": false,
|
|
17776
|
+
"content": {
|
|
17777
|
+
"application/json": {
|
|
17778
|
+
"schema": {
|
|
17779
|
+
"$ref": "#/components/schemas/PostStoreModulesKeyAcquireRequest"
|
|
17780
|
+
}
|
|
17781
|
+
}
|
|
17782
|
+
},
|
|
17783
|
+
"x-validated": true
|
|
17784
|
+
},
|
|
17785
|
+
"responses": {
|
|
17786
|
+
"200": {
|
|
17787
|
+
"description": "Success.",
|
|
17788
|
+
"content": {
|
|
17789
|
+
"application/json": {
|
|
17790
|
+
"schema": {
|
|
17791
|
+
"$ref": "#/components/schemas/PostStoreModulesKeyAcquireResponse"
|
|
17792
|
+
}
|
|
17793
|
+
}
|
|
17794
|
+
}
|
|
17795
|
+
},
|
|
17796
|
+
"400": {
|
|
17797
|
+
"$ref": "#/components/responses/ValidationFailed"
|
|
17798
|
+
},
|
|
17799
|
+
"401": {
|
|
17800
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
17801
|
+
},
|
|
17802
|
+
"403": {
|
|
17803
|
+
"$ref": "#/components/responses/Forbidden"
|
|
17804
|
+
},
|
|
17805
|
+
"404": {
|
|
17806
|
+
"$ref": "#/components/responses/NotFound"
|
|
17807
|
+
}
|
|
17808
|
+
},
|
|
17809
|
+
"security": [
|
|
17810
|
+
{
|
|
17811
|
+
"builderSession": []
|
|
17812
|
+
}
|
|
17813
|
+
]
|
|
17814
|
+
}
|
|
17815
|
+
},
|
|
17816
|
+
"/store/modules/{key}/acquired": {
|
|
17817
|
+
"post": {
|
|
17818
|
+
"operationId": "post_store_modules_key_acquired",
|
|
17819
|
+
"tags": [
|
|
17820
|
+
"store"
|
|
17821
|
+
],
|
|
17822
|
+
"summary": "POST /store/modules/:key/acquired",
|
|
17823
|
+
"description": "**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
17824
|
+
"x-rank": "any-builder",
|
|
17825
|
+
"x-source": "src/bongos/routes/modules.js",
|
|
17826
|
+
"parameters": [
|
|
17827
|
+
{
|
|
17828
|
+
"name": "key",
|
|
17829
|
+
"in": "path",
|
|
17830
|
+
"required": true,
|
|
17831
|
+
"schema": {
|
|
17832
|
+
"type": "string"
|
|
17833
|
+
},
|
|
17834
|
+
"description": "Path parameter `key`."
|
|
17835
|
+
}
|
|
17836
|
+
],
|
|
17837
|
+
"requestBody": {
|
|
17838
|
+
"required": true,
|
|
17839
|
+
"content": {
|
|
17840
|
+
"application/json": {
|
|
17841
|
+
"schema": {
|
|
17842
|
+
"$ref": "#/components/schemas/PostStoreModulesKeyAcquiredRequest"
|
|
17843
|
+
}
|
|
17844
|
+
}
|
|
17845
|
+
},
|
|
17846
|
+
"x-validated": true
|
|
17847
|
+
},
|
|
17848
|
+
"responses": {
|
|
17849
|
+
"200": {
|
|
17850
|
+
"description": "Success.",
|
|
17851
|
+
"content": {
|
|
17852
|
+
"application/json": {
|
|
17853
|
+
"schema": {
|
|
17854
|
+
"$ref": "#/components/schemas/PostStoreModulesKeyAcquiredResponse"
|
|
17855
|
+
}
|
|
17856
|
+
}
|
|
17857
|
+
}
|
|
17858
|
+
},
|
|
17859
|
+
"400": {
|
|
17860
|
+
"$ref": "#/components/responses/ValidationFailed"
|
|
17861
|
+
},
|
|
17862
|
+
"401": {
|
|
17863
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
17864
|
+
},
|
|
17865
|
+
"403": {
|
|
17866
|
+
"$ref": "#/components/responses/Forbidden"
|
|
17867
|
+
},
|
|
17868
|
+
"404": {
|
|
17869
|
+
"$ref": "#/components/responses/NotFound"
|
|
17870
|
+
}
|
|
17871
|
+
},
|
|
17872
|
+
"security": [
|
|
17873
|
+
{
|
|
17874
|
+
"builderSession": []
|
|
17875
|
+
}
|
|
17876
|
+
]
|
|
17877
|
+
}
|
|
17878
|
+
},
|
|
17753
17879
|
"/store/modules/{key}/entitlement": {
|
|
17754
17880
|
"get": {
|
|
17755
17881
|
"operationId": "get_store_modules_key_entitlement",
|
|
@@ -17863,6 +17989,60 @@
|
|
|
17863
17989
|
]
|
|
17864
17990
|
}
|
|
17865
17991
|
},
|
|
17992
|
+
"/store/modules/{key}/versions/{version}/tarball": {
|
|
17993
|
+
"get": {
|
|
17994
|
+
"operationId": "get_store_modules_key_versions_version_tarball",
|
|
17995
|
+
"tags": [
|
|
17996
|
+
"store"
|
|
17997
|
+
],
|
|
17998
|
+
"summary": "GET /store/modules/:key/versions/:version/tarball",
|
|
17999
|
+
"description": "**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
18000
|
+
"x-rank": "any-builder",
|
|
18001
|
+
"x-source": "src/bongos/routes/modules.js",
|
|
18002
|
+
"parameters": [
|
|
18003
|
+
{
|
|
18004
|
+
"name": "key",
|
|
18005
|
+
"in": "path",
|
|
18006
|
+
"required": true,
|
|
18007
|
+
"schema": {
|
|
18008
|
+
"type": "string"
|
|
18009
|
+
},
|
|
18010
|
+
"description": "Path parameter `key`."
|
|
18011
|
+
},
|
|
18012
|
+
{
|
|
18013
|
+
"name": "version",
|
|
18014
|
+
"in": "path",
|
|
18015
|
+
"required": true,
|
|
18016
|
+
"schema": {
|
|
18017
|
+
"type": "string"
|
|
18018
|
+
},
|
|
18019
|
+
"description": "Path parameter `version`."
|
|
18020
|
+
}
|
|
18021
|
+
],
|
|
18022
|
+
"responses": {
|
|
18023
|
+
"200": {
|
|
18024
|
+
"description": "Success."
|
|
18025
|
+
},
|
|
18026
|
+
"400": {
|
|
18027
|
+
"$ref": "#/components/responses/BadRequest"
|
|
18028
|
+
},
|
|
18029
|
+
"401": {
|
|
18030
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
18031
|
+
},
|
|
18032
|
+
"403": {
|
|
18033
|
+
"$ref": "#/components/responses/Forbidden"
|
|
18034
|
+
},
|
|
18035
|
+
"404": {
|
|
18036
|
+
"$ref": "#/components/responses/NotFound"
|
|
18037
|
+
}
|
|
18038
|
+
},
|
|
18039
|
+
"security": [
|
|
18040
|
+
{
|
|
18041
|
+
"builderSession": []
|
|
18042
|
+
}
|
|
18043
|
+
]
|
|
18044
|
+
}
|
|
18045
|
+
},
|
|
17866
18046
|
"/task-recommendations": {
|
|
17867
18047
|
"post": {
|
|
17868
18048
|
"operationId": "post_task_recommendations",
|
|
@@ -26947,6 +27127,69 @@
|
|
|
26947
27127
|
"avatar_url"
|
|
26948
27128
|
]
|
|
26949
27129
|
},
|
|
27130
|
+
"PostStoreModulesKeyAcquireRequest": {
|
|
27131
|
+
"type": "object",
|
|
27132
|
+
"properties": {
|
|
27133
|
+
"version": {
|
|
27134
|
+
"type": "string",
|
|
27135
|
+
"maxLength": 32
|
|
27136
|
+
}
|
|
27137
|
+
},
|
|
27138
|
+
"additionalProperties": false
|
|
27139
|
+
},
|
|
27140
|
+
"PostStoreModulesKeyAcquireResponse": {
|
|
27141
|
+
"type": "object",
|
|
27142
|
+
"properties": {
|
|
27143
|
+
"ok": {
|
|
27144
|
+
"type": "boolean"
|
|
27145
|
+
},
|
|
27146
|
+
"module_key": {},
|
|
27147
|
+
"version": {},
|
|
27148
|
+
"core_version": {},
|
|
27149
|
+
"tarball_sha256": {},
|
|
27150
|
+
"tree_sha256": {},
|
|
27151
|
+
"tarball_bytes": {},
|
|
27152
|
+
"channel": {},
|
|
27153
|
+
"entitlement": {}
|
|
27154
|
+
},
|
|
27155
|
+
"required": [
|
|
27156
|
+
"ok",
|
|
27157
|
+
"module_key",
|
|
27158
|
+
"version",
|
|
27159
|
+
"core_version",
|
|
27160
|
+
"tarball_sha256",
|
|
27161
|
+
"tree_sha256",
|
|
27162
|
+
"tarball_bytes",
|
|
27163
|
+
"channel",
|
|
27164
|
+
"entitlement"
|
|
27165
|
+
]
|
|
27166
|
+
},
|
|
27167
|
+
"PostStoreModulesKeyAcquiredRequest": {
|
|
27168
|
+
"type": "object",
|
|
27169
|
+
"properties": {
|
|
27170
|
+
"version": {
|
|
27171
|
+
"type": "string",
|
|
27172
|
+
"maxLength": 32
|
|
27173
|
+
}
|
|
27174
|
+
},
|
|
27175
|
+
"required": [
|
|
27176
|
+
"version"
|
|
27177
|
+
],
|
|
27178
|
+
"additionalProperties": false
|
|
27179
|
+
},
|
|
27180
|
+
"PostStoreModulesKeyAcquiredResponse": {
|
|
27181
|
+
"type": "object",
|
|
27182
|
+
"properties": {
|
|
27183
|
+
"ok": {
|
|
27184
|
+
"type": "boolean"
|
|
27185
|
+
},
|
|
27186
|
+
"entitlement": {}
|
|
27187
|
+
},
|
|
27188
|
+
"required": [
|
|
27189
|
+
"ok",
|
|
27190
|
+
"entitlement"
|
|
27191
|
+
]
|
|
27192
|
+
},
|
|
26950
27193
|
"PostStoreModulesKeyVersionsResponse": {
|
|
26951
27194
|
"type": "object",
|
|
26952
27195
|
"properties": {
|
|
@@ -27829,9 +28072,9 @@
|
|
|
27829
28072
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
27830
28073
|
}
|
|
27831
28074
|
},
|
|
27832
|
-
"x-endpoint-count":
|
|
27833
|
-
"x-schema-count":
|
|
28075
|
+
"x-endpoint-count": 439,
|
|
28076
|
+
"x-schema-count": 471,
|
|
27834
28077
|
"x-undocumented-bodies": 11,
|
|
27835
|
-
"x-response-schemas":
|
|
28078
|
+
"x-response-schemas": 322,
|
|
27836
28079
|
"x-generated-by": "scripts/gds/gen-api-docs.js"
|
|
27837
28080
|
}
|
package/docs/api-reference.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# Bongos API reference
|
|
4
4
|
|
|
5
|
-
> **Generated from the live route files** — the route file is authoritative.
|
|
5
|
+
> **Generated from the live route files** — the route file is authoritative. 439 endpoints across 75 route files.
|
|
6
6
|
> Machine-readable spec: [`docs/api/openapi.json`](api/openapi.json) (OpenAPI 3.1). Rendered docs site: **`/docs`** (e.g. `cloudbongos.com/docs`).
|
|
7
7
|
|
|
8
8
|
Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust-boundary-server-enforced-permissions.md)): `public` < `any-builder` < `metic+archon` < `archon`.
|
|
@@ -694,13 +694,16 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
694
694
|
| GET | `/api/bongos/sso/pubkey` | `public` | — | GET /sso/pubkey — the hub's Ed25519 assertion-verification key (public). |
|
|
695
695
|
| POST | `/api/bongos/sso/token` | `public` | `client_id`, `client_secret`, `code`, `redirect_uri` | POST /sso/token — server-to-server code redemption. |
|
|
696
696
|
|
|
697
|
-
## `store` (
|
|
697
|
+
## `store` (6)
|
|
698
698
|
|
|
699
699
|
| Method | Path | Rank | Body | Description |
|
|
700
700
|
|---|---|---|---|---|
|
|
701
701
|
| GET | `/api/bongos/store/entitlements` | `any-builder` | — | GET /api/bongos/store/entitlements and /store/modules/:key/entitlement — the read side of the entitlement record (task 1003813, ADR 0338 … |
|
|
702
|
+
| POST | `/api/bongos/store/modules/:key/acquire` | `any-builder` | `version` | ---- install: acquire → download → record (task 1003785, ADR 0338 D1) ---- The server end of `bongos module install`. |
|
|
703
|
+
| POST | `/api/bongos/store/modules/:key/acquired` | `any-builder` | `version` | |
|
|
702
704
|
| GET | `/api/bongos/store/modules/:key/entitlement` | `any-builder` | — | |
|
|
703
705
|
| POST | `/api/bongos/store/modules/:key/versions` | `metic+archon` | _undocumented_ | POST /api/bongos/store/modules/:key/versions — publish one module version to the store (task 1004271, ADR 0338 D1). |
|
|
706
|
+
| GET | `/api/bongos/store/modules/:key/versions/:version/tarball` | `any-builder` | — | |
|
|
704
707
|
|
|
705
708
|
## `task-recommendations` (4)
|
|
706
709
|
|
package/docs/architecture.md
CHANGED
|
@@ -247,7 +247,7 @@ module_entitlements(id, module_key, holder_kind IN (builder|instance), holder_re
|
|
|
247
247
|
-- keeping the row.
|
|
248
248
|
```
|
|
249
249
|
|
|
250
|
-
Code: `src/bongos/module-entitlements.js` (`grantEntitlement`, `recordAcquired`, `revokeEntitlement`, `checkEntitlement`, `listEntitlements`). Read routes (own-scoped, `requireBuilder`): `GET /store/entitlements`, `GET /store/modules/:key/entitlement`.
|
|
250
|
+
Code: `src/bongos/module-entitlements.js` (`grantEntitlement`, `recordAcquired`, `revokeEntitlement`, `checkEntitlement`, `listEntitlements`). Read routes (own-scoped, `requireBuilder`): `GET /store/entitlements`, `GET /store/modules/:key/entitlement`. Install (task 1003785) grants a free module through `POST /store/modules/:key/acquire`; the buy action (area 8) will grant a paid one.
|
|
251
251
|
|
|
252
252
|
Bongos views: `claimable_tasks` (rebuilt in 006 to use SELECT t.*; rebuilt again in 014 so the new `discipline` column flows through), `version_progress` (rebuilt in 006 to count only leaf tasks for forward-compat with task hierarchy), `tasks_session_fit` (new in 006: derives `fits_session_modes[]` and `credits_per_minute`; rebuilt in 014 for the same SELECT t.* refresh), `task_grades_with_context` (new in 016: joins task_grades × tasks × builders × cost_log so the V4 optimizer has quality-per-dollar in one read).
|
|
253
253
|
|
|
@@ -261,6 +261,7 @@ Bongos views: `claimable_tasks` (rebuilt in 006 to use SELECT t.*; rebuilt again
|
|
|
261
261
|
- Authenticated CLI/web: `GET /me` (returns `rank`), `GET /versions[/progress]`, `GET /tasks[?version=&status=&kind=&discipline=]`, `GET /tasks/claimable[?version=&discipline=]`, `GET /tasks/:id`, `POST /tasks` (accepts `discipline` + `criterion_ids`; **metic+** — [ADR 0090](adr/0090-metic-task-authoring.md)), `PATCH /tasks/:id` (supports `parent_task_id`, `kind`, `discipline`, `goal_id` — (re)assign the task's goal; must be a goal in the task's own version, task 1763; **metic+**), `POST /tasks/:id/promote` (**metic+**), `POST /claims`, `POST /claims/:id/resolve`, `POST /cost`.
|
|
262
262
|
- Criterion rollup + task↔criterion links ([ADR 0025](adr/0025-structured-criterion-task-link.md), [#435](https://example.com/builders#/task/435)/[#438](https://example.com/builders#/task/438)): `GET /versions/:id/progress` rolls up each done-when criterion → its gating tasks (via `task_criteria`) → live status counts + the not-yet-shipped `remaining[]` + `unattributed_tasks` (the read behind the `/status` skill, in `src/bongos/done-when.js criterionProgress`). The link CRUD mirrors the dependency endpoints: `GET /tasks/:id/criteria`, `POST /tasks/:id/criteria` (**metic+** — [ADR 0090](adr/0090-metic-task-authoring.md)) and `DELETE /tasks/:id/criteria/:criterionId` (**metic+**). A criterion ref is a numeric `done_when_criteria.id`, a positional `"Cn"` token, or a `criterion_id` slug, resolved against the task's version (`POST /tasks` links at create time so `/status` counts the task with no backfill).
|
|
263
263
|
- Module store publish (ADR 0338 D1, task 1004271): `POST /store/modules/:key/versions` (`requireBuilder` + `requirePermission('module.submit')`, Metic floor). The body is the raw gzip tarball `bongos module publish` builds (own `express.raw` parser, 5 MB cap; 16 MB / 2000 files unpacked). `scripts/gds/module-artifact.js` re-verifies every hash and the publish gate, then `src/bongos/module-store.js` keeps the file under `var/module-store/` and inserts the `store_module_versions` row in one transaction. The first publish makes the caller the author; later versions are author-only, newer than the last and never overwritten; a delisted key takes none.
|
|
264
|
+
- Module store install (ADR 0338 D1, task 1003785), all `requireBuilder` and own-scoped (the holder is the caller): `POST /store/modules/:key/acquire` (`{version?}`; grants a free entitlement — no price row, or a zero price, is free — or `402 payment_required` for a priced module; refuses a delisted one), `GET /store/modules/:key/versions/:version/tarball` (served only to a live entitlement holder; `X-Tarball-Sha256`), `POST /store/modules/:key/acquired` (`{version}` → `recordAcquired`). Read side in `src/bongos/module-store.js` (`resolveAcquirable`, `isFreePrice`, `versionArtifactFile`). No channel check yet (tasks 1003815, 1003805).
|
|
264
265
|
- Server-mediated branch publish (ADR 0055 / [#1025](https://example.com/builders#/task/1025) — lets a checkout with no GitHub push credential ship). Owner-gated like ship: `POST /tasks/:id/publish-branch` (`requireBuilder` + `gateTaskOwnership`; own 32 MB json parser for the base64 thin-bundle body, 20 MB decoded cap; the server pushes the branch + opens the PR + auto-merges with a server-side push credential — a **GitHub App** installation token (short-lived, repo-scoped; preferred, [ADR 0055](adr/0055-server-mediated-branch-publish.md) update / task 1028) or the `GITHUB_PUSH_TOKEN` PAT fallback; `503 push_unconfigured` when neither is set; `400 tip_mismatch` if the bundle tip ≠ the claimed `head_sha`) and `GET /tasks/:id/publish-status?branch=…` (polls PR + deploy-prod state derived live from GitHub). `branch` is optional: without it the server finds the task's own PR by its `task <id>: …` title, and the answer names the `branch` it used and its `branch_source` (`query` / `task_pr`, or `null` with a `branch_hint` when there is no such PR) — never a `400` (task 1003764). When the PR is still open it also carries `merge_driver`, whose `reason` says why it has not merged; on a red PR `failing_tests` names the failing unit tests (read from the `unit-report` commit status the `unit` workflow posts) and `checks_unreadable: true` says the check list is blind because the App lacks `Checks: read` — so an empty `checks[]` is never read as "nothing failed" (task 1003988, ADR 0301). Because the server's credential is the PR's AUTHOR, publish also **assigns the PR to the task's claim holder** and names them in the body (`modules/lifecycle/pr-assign.js`, task 1003991) — best-effort: the 201 carries `pr_assignee` (the login, or `null` when GitHub would not assign it) and a failed assignment never fails the publish. `ship.js` uses these in `ci` mode only when `pushVia()` resolves to server (no authenticated `gh` on the machine, or `<PREFIX>_PUSH_VIA_SERVER=1`); a machine with `gh` keeps the local push path unchanged. Implementation in `src/bongos/github-push.js`.
|
|
265
266
|
- Archon monitoring reads backing the `/watch` page (ADR 0036): `GET /builders/roster`, `GET /grades/by-builder[?days=N]` (**archon-only**, [#726](https://example.com/builders#/task/726) — per-builder grade breakdown for the MARKS section; the project-wide aggregate stays public at `/public/grades`), `GET /audit-log`, `GET /override-requests`, `GET /access-requests`, `GET /security/reports`. Personal-prefs writes backing `/settings`: `GET/PATCH /me/skill-prefs`, `PATCH /me/disciplines`.
|
|
266
267
|
- Per-builder "needs" + own Gemini key ([ADR 0073](adr/0073-builder-needs-signal-and-byok-gemini-key.md), [#1013](https://example.com/builders#/task/1013)): `GET /me` now also carries `needs` ({items, action_needed_count} — the consistent "the system needs an input from you" signal; `modules/builder-settings/builder-needs.js` is the SSOT — carved out in BV1.R80, resolved by `GET /me` via the `builder-settings` kernel port — rendered by the hall Standing card + the CLI `printNeedsNudge`). The own-key (pragmatic BYOK) endpoints, all own-scoped: `GET /me/art-key/own` (masked meta — last4 only), `PUT /me/art-key/own` (validate-on-save via a Google list-models call → encrypt with `src/bongos/secret-box.js` → store; `503 storage_not_configured` until `BUILDER_SECRET_KEY` is set, `422 invalid_key` on a bad key), `DELETE /me/art-key/own`. The existing `GET /me/art-key` (shared-key delivery) is extended to also deliver the decrypted own key, which `scripts/gds/fetch-art-key.js` syncs into the local `gemini_api_key` slot (own key wins in the `gen_api.py` cascade).
|
|
@@ -2647,5 +2647,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
2647
2647
|
landed since 1.19.1076 with no explicit bump. run 36558431394. (task 1002620)
|
|
2648
2648
|
1.19.1078 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2649
2649
|
landed since 1.19.1077 with no explicit bump. run 36600137276. (task 1002620)
|
|
2650
|
+
1.19.1079 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2651
|
+
landed since 1.19.1078 with no explicit bump. run 36602720244. (task 1002620)
|
|
2650
2652
|
---------------------------------------------------------------------------
|
|
2651
2653
|
```
|
package/docs/modules-contract.md
CHANGED
|
@@ -357,6 +357,16 @@ Run `bongos upgrade` to confirm coreVersion compatibility, then `node scripts/gd
|
|
|
357
357
|
- The publish denylist applies (ADR 0098), plus a refusal of credential-named files (`.env*`, `*.pem`, `*.key`, `id_rsa`, …) anywhere in the module. The store re-checks every hash and the denylist itself.
|
|
358
358
|
- Gate: Metic+ (`module.submit`) for now. This is not `bongos module submit`, which proposes a module *into* core.
|
|
359
359
|
|
|
360
|
+
### 7. Install from the store
|
|
361
|
+
|
|
362
|
+
`bongos module install <key> [--version X.Y.Z]` acquires a module from the store and places it under the instance's `modules/`. Three calls: `POST /store/modules/:key/acquire` takes your entitlement and names the version (the newest unless you pick one), `GET /store/modules/:key/versions/:version/tarball` downloads it, and once the files are placed, `POST /store/modules/:key/acquired` records the exact version.
|
|
363
|
+
|
|
364
|
+
- The download is checked with `verifyModuleArtifact`, the same checker the store runs on publish, and must match the version and hashes the store described. A failed check places nothing.
|
|
365
|
+
- A module with no price, or a zero price, is free and granted on the spot. A priced one answers 402 until buying exists (area 8). An entitlement is kept for good, even if a price is added later (ADR 0338 D2).
|
|
366
|
+
- Install never enables. Switch the module on from the hall's Modules tab.
|
|
367
|
+
- A module already on disk is refused; moving one to a newer version is `update`. A module this core cannot mount is refused before download.
|
|
368
|
+
- A delisted module cannot be acquired or downloaded. Channels are not checked yet: every version is general until the channel tasks land.
|
|
369
|
+
|
|
360
370
|
## Carving an existing core domain (the `db.js` per-domain pattern)
|
|
361
371
|
|
|
362
372
|
Most BONGOS-V1 module work is not scaffolding a *new* module — it's **carving an existing core domain out of the monolith** (ADR 0091, criterion C7). The reference carve is the kernel slice `src/bongos/db-kernel.js` (BV1.R69); the feature precedents are `modules/discord/db.js` + `modules/game/db.js`. Every later carve (memory R72, grading R73, …) copies this recipe. The invariant is **OTB byte-identical** at every step — you are *moving* code, not changing behavior.
|