@bongos/core 1.19.359 → 1.19.360
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 +41 -21
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +8 -0
- package/clients/bongos-client/index.cjs +8 -0
- package/clients/bongos-client/index.d.ts +11 -0
- package/clients/bongos-client/index.mjs +8 -0
- package/docs/api/openapi.json +170 -3
- package/docs/api-reference.md +9 -1
- package/modules/dev-box/app/src/vendor/bongos-client.cjs +8 -0
- package/modules/lifecycle/closeness-weights.json +64 -0
- package/modules/lifecycle/closeness.js +363 -0
- package/modules/lifecycle/module.json +1 -0
- package/modules/lifecycle/routes/closeness.js +118 -0
- package/modules/platform-identity/platform-identity.js +28 -0
- package/modules/platform-identity/routes/sso.js +4 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/module-api.js +3 -1
- package/tests/closeness.mjs +324 -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.360",
|
|
6
|
+
"core_contract": "1.19.360",
|
|
7
|
+
"source_commit": "5bf79048217d490a0d571e749290b110875a0bc8",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-25T17:
|
|
9
|
+
"built_at": "2026-08-25T17:58:51.325Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 330,
|
|
13
13
|
"agent_docs_stubbed": 22,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 1523,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 1875,
|
|
20
|
+
"tree_sha256": "15871fd570e735b51bbfd212b53fcc55faa1479569e51e6d2c7179f407bb58d3",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -347,12 +347,12 @@
|
|
|
347
347
|
{
|
|
348
348
|
"path": "clients/bongos-client/README.md",
|
|
349
349
|
"mode": "0000644",
|
|
350
|
-
"sha256": "
|
|
350
|
+
"sha256": "b94bec08062d2f3374043a6ce93bca31b27073e51da47f9477e67e2602565701"
|
|
351
351
|
},
|
|
352
352
|
{
|
|
353
353
|
"path": "clients/bongos-client/bongos-client.global.js",
|
|
354
354
|
"mode": "0000644",
|
|
355
|
-
"sha256": "
|
|
355
|
+
"sha256": "827ffa492b7035169b0734807208d45dc898d86b7d52570b55f7050d83e0aba3"
|
|
356
356
|
},
|
|
357
357
|
{
|
|
358
358
|
"path": "clients/bongos-client/examples/hello-world.mjs",
|
|
@@ -362,17 +362,17 @@
|
|
|
362
362
|
{
|
|
363
363
|
"path": "clients/bongos-client/index.cjs",
|
|
364
364
|
"mode": "0000644",
|
|
365
|
-
"sha256": "
|
|
365
|
+
"sha256": "7f601b37bb8acad773f55b5e5200cf1efeb40cdcc2694570b58c336cdcf9b3ad"
|
|
366
366
|
},
|
|
367
367
|
{
|
|
368
368
|
"path": "clients/bongos-client/index.d.ts",
|
|
369
369
|
"mode": "0000644",
|
|
370
|
-
"sha256": "
|
|
370
|
+
"sha256": "3834aed054469417cecbd8c1786cbc5400ec1a0e7871ac3bc41c8044f2f97aae"
|
|
371
371
|
},
|
|
372
372
|
{
|
|
373
373
|
"path": "clients/bongos-client/index.mjs",
|
|
374
374
|
"mode": "0000644",
|
|
375
|
-
"sha256": "
|
|
375
|
+
"sha256": "d3f455fe0a335606c10ec92fc151f4767bf37d9c40c423f7635c642dd5b1e298"
|
|
376
376
|
},
|
|
377
377
|
{
|
|
378
378
|
"path": "clients/bongos-client/package.json",
|
|
@@ -1452,12 +1452,12 @@
|
|
|
1452
1452
|
{
|
|
1453
1453
|
"path": "docs/api-reference.md",
|
|
1454
1454
|
"mode": "0000644",
|
|
1455
|
-
"sha256": "
|
|
1455
|
+
"sha256": "d076deeab4cc5690b2fd8081b3ea885d2e6c414267ff4cacb43d71e9b3d92d8c"
|
|
1456
1456
|
},
|
|
1457
1457
|
{
|
|
1458
1458
|
"path": "docs/api/openapi.json",
|
|
1459
1459
|
"mode": "0000644",
|
|
1460
|
-
"sha256": "
|
|
1460
|
+
"sha256": "88484f046d52c6ff605fbecd5c32d14542279f487586b8c371de3ce6de50e812"
|
|
1461
1461
|
},
|
|
1462
1462
|
{
|
|
1463
1463
|
"path": "docs/architecture.md",
|
|
@@ -2877,7 +2877,7 @@
|
|
|
2877
2877
|
{
|
|
2878
2878
|
"path": "modules/dev-box/app/src/vendor/bongos-client.cjs",
|
|
2879
2879
|
"mode": "0000644",
|
|
2880
|
-
"sha256": "
|
|
2880
|
+
"sha256": "7f601b37bb8acad773f55b5e5200cf1efeb40cdcc2694570b58c336cdcf9b3ad"
|
|
2881
2881
|
},
|
|
2882
2882
|
{
|
|
2883
2883
|
"path": "modules/dev-box/app/test/unit.mjs",
|
|
@@ -3934,6 +3934,16 @@
|
|
|
3934
3934
|
"mode": "0000644",
|
|
3935
3935
|
"sha256": "3586cc2aa07913870ad99073c534e70ef2e2c5ff6a5ef2ddeb141cfd397269cd"
|
|
3936
3936
|
},
|
|
3937
|
+
{
|
|
3938
|
+
"path": "modules/lifecycle/closeness-weights.json",
|
|
3939
|
+
"mode": "0000644",
|
|
3940
|
+
"sha256": "76d285de14e43744c5b74fc26c60c48bfc329c297f9b682eaf8abfa69866bc72"
|
|
3941
|
+
},
|
|
3942
|
+
{
|
|
3943
|
+
"path": "modules/lifecycle/closeness.js",
|
|
3944
|
+
"mode": "0000644",
|
|
3945
|
+
"sha256": "f5668020c115a6d356a74603dc4a7229ddfdb8d5015a22f871a35386a869fe58"
|
|
3946
|
+
},
|
|
3937
3947
|
{
|
|
3938
3948
|
"path": "modules/lifecycle/conflict-resolve.js",
|
|
3939
3949
|
"mode": "0000644",
|
|
@@ -4097,7 +4107,7 @@
|
|
|
4097
4107
|
{
|
|
4098
4108
|
"path": "modules/lifecycle/module.json",
|
|
4099
4109
|
"mode": "0000644",
|
|
4100
|
-
"sha256": "
|
|
4110
|
+
"sha256": "30653b4064be8933894679ac4e272711edcc629e151d87017e2b2e45be96d78f"
|
|
4101
4111
|
},
|
|
4102
4112
|
{
|
|
4103
4113
|
"path": "modules/lifecycle/pollers/publish-reconciler.js",
|
|
@@ -4119,6 +4129,11 @@
|
|
|
4119
4129
|
"mode": "0000644",
|
|
4120
4130
|
"sha256": "fb5dda00e0c378e2fb8b3190fdeaf4562be65097895bd67b68e67428a14c8297"
|
|
4121
4131
|
},
|
|
4132
|
+
{
|
|
4133
|
+
"path": "modules/lifecycle/routes/closeness.js",
|
|
4134
|
+
"mode": "0000644",
|
|
4135
|
+
"sha256": "1950ba9d20f925fa1ecbe7fb37d35a5b80045c556c6f76caa90b82e213b7db88"
|
|
4136
|
+
},
|
|
4122
4137
|
{
|
|
4123
4138
|
"path": "modules/lifecycle/routes/dependencies.js",
|
|
4124
4139
|
"mode": "0000644",
|
|
@@ -4397,7 +4412,7 @@
|
|
|
4397
4412
|
{
|
|
4398
4413
|
"path": "modules/platform-identity/platform-identity.js",
|
|
4399
4414
|
"mode": "0000644",
|
|
4400
|
-
"sha256": "
|
|
4415
|
+
"sha256": "8e51d1b28d33534e04dffd0ac139aecb85b9f2a8e1c5a0adbd2847893b650f24"
|
|
4401
4416
|
},
|
|
4402
4417
|
{
|
|
4403
4418
|
"path": "modules/platform-identity/pollers/code-sweep.js",
|
|
@@ -4437,7 +4452,7 @@
|
|
|
4437
4452
|
{
|
|
4438
4453
|
"path": "modules/platform-identity/routes/sso.js",
|
|
4439
4454
|
"mode": "0000644",
|
|
4440
|
-
"sha256": "
|
|
4455
|
+
"sha256": "68f2b69706f30de35c94749e8733a00da2737ecad37e93ea4965c7a45a6d7e5b"
|
|
4441
4456
|
},
|
|
4442
4457
|
{
|
|
4443
4458
|
"path": "modules/platform-identity/tests/platform-identity.mjs",
|
|
@@ -4832,12 +4847,12 @@
|
|
|
4832
4847
|
{
|
|
4833
4848
|
"path": "package-lock.json",
|
|
4834
4849
|
"mode": "0000644",
|
|
4835
|
-
"sha256": "
|
|
4850
|
+
"sha256": "26d9ebcd21d9fa6f7634d877e028131c6beb6e144d3055645e159d81e94c64a3"
|
|
4836
4851
|
},
|
|
4837
4852
|
{
|
|
4838
4853
|
"path": "package.json",
|
|
4839
4854
|
"mode": "0000644",
|
|
4840
|
-
"sha256": "
|
|
4855
|
+
"sha256": "2f3161d67426337fc350354987df123ccc867ebbb15ae4bf28e3082f80edbdcd"
|
|
4841
4856
|
},
|
|
4842
4857
|
{
|
|
4843
4858
|
"path": "public-docs/index.html",
|
|
@@ -6697,7 +6712,7 @@
|
|
|
6697
6712
|
{
|
|
6698
6713
|
"path": "src/module-api.js",
|
|
6699
6714
|
"mode": "0000644",
|
|
6700
|
-
"sha256": "
|
|
6715
|
+
"sha256": "4cb8b8e962fd1891d9fbbb446048dba025754a73b1a3c313e2e586f14f843b13"
|
|
6701
6716
|
},
|
|
6702
6717
|
{
|
|
6703
6718
|
"path": "src/module-loader/catalog.js",
|
|
@@ -7219,6 +7234,11 @@
|
|
|
7219
7234
|
"mode": "0000644",
|
|
7220
7235
|
"sha256": "6cc4e7e38c26ff13644e714dd4bf76bfe0fbde984df9fd37f6b1695ae990a569"
|
|
7221
7236
|
},
|
|
7237
|
+
{
|
|
7238
|
+
"path": "tests/closeness.mjs",
|
|
7239
|
+
"mode": "0000644",
|
|
7240
|
+
"sha256": "b5c4791d84aa3126714c7b3188320dc4df984e282a086196ded2394f825295d1"
|
|
7241
|
+
},
|
|
7222
7242
|
{
|
|
7223
7243
|
"path": "tests/cloud_bongos_pack.mjs",
|
|
7224
7244
|
"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
|
+
- 315 operations across 51 resource groups
|
|
9
9
|
|
|
10
10
|
## Install
|
|
11
11
|
|
|
@@ -252,6 +252,14 @@ function createClient(opts = {}) {
|
|
|
252
252
|
// POST /claims/batch/validate — rank: any-builder — POST /claims/batch/validate
|
|
253
253
|
postClaimsBatchValidate: (args) => request("POST", "/claims/batch/validate", { hasBody: true }, args),
|
|
254
254
|
},
|
|
255
|
+
"closeness": {
|
|
256
|
+
// GET /closeness/for-me — rank: any-builder — GET /closeness/for-me
|
|
257
|
+
getClosenessForMe: (args) => request("GET", "/closeness/for-me", { hasBody: false }, args),
|
|
258
|
+
// GET /closeness/weights — rank: any-builder — GET /closeness/weights
|
|
259
|
+
getClosenessWeights: (args) => request("GET", "/closeness/weights", { hasBody: false }, args),
|
|
260
|
+
// GET /closeness/with/{builderId} — rank: any-builder — GET /closeness/with/:builderId
|
|
261
|
+
getClosenessWithBuilderId: (args) => request("GET", "/closeness/with/{builderId}", { hasBody: false }, args),
|
|
262
|
+
},
|
|
255
263
|
"copyDesk": {
|
|
256
264
|
// POST /copy-desk/flags — rank: any-builder — POST /copy-desk/flags
|
|
257
265
|
postCopyDeskFlags: (args) => request("POST", "/copy-desk/flags", { hasBody: true }, args),
|
|
@@ -251,6 +251,14 @@ function createClient(opts = {}) {
|
|
|
251
251
|
// POST /claims/batch/validate — rank: any-builder — POST /claims/batch/validate
|
|
252
252
|
postClaimsBatchValidate: (args) => request("POST", "/claims/batch/validate", { hasBody: true }, args),
|
|
253
253
|
},
|
|
254
|
+
"closeness": {
|
|
255
|
+
// GET /closeness/for-me — rank: any-builder — GET /closeness/for-me
|
|
256
|
+
getClosenessForMe: (args) => request("GET", "/closeness/for-me", { hasBody: false }, args),
|
|
257
|
+
// GET /closeness/weights — rank: any-builder — GET /closeness/weights
|
|
258
|
+
getClosenessWeights: (args) => request("GET", "/closeness/weights", { hasBody: false }, args),
|
|
259
|
+
// GET /closeness/with/{builderId} — rank: any-builder — GET /closeness/with/:builderId
|
|
260
|
+
getClosenessWithBuilderId: (args) => request("GET", "/closeness/with/{builderId}", { hasBody: false }, args),
|
|
261
|
+
},
|
|
254
262
|
"copyDesk": {
|
|
255
263
|
// POST /copy-desk/flags — rank: any-builder — POST /copy-desk/flags
|
|
256
264
|
postCopyDeskFlags: (args) => request("POST", "/copy-desk/flags", { hasBody: true }, args),
|
|
@@ -35,6 +35,9 @@ export interface GetBuildersIdOnboardingResponse { builder_id: unknown; onboardi
|
|
|
35
35
|
export interface GetBuildersIdProfileResponse { builder: unknown; shipped_count: unknown; recent_ships: unknown; achievements: unknown; cross_project?: unknown }
|
|
36
36
|
export interface GetBuildersMePendingRankChangeResponse { change: unknown; greeting?: unknown }
|
|
37
37
|
export interface GetBuildersRosterResponse { builders: unknown; stale_hours: unknown }
|
|
38
|
+
export interface GetClosenessForMeResponse { closeness: unknown; count: unknown }
|
|
39
|
+
export interface GetClosenessWeightsResponse { weights: unknown; window_days: unknown; note: unknown }
|
|
40
|
+
export interface GetClosenessWithBuilderIdResponse { closeness: unknown; why: unknown }
|
|
38
41
|
export interface GetDiscordChannelsPlanResponse { ok: boolean; guild_id: unknown; op_count: unknown; ops: unknown; warnings: unknown }
|
|
39
42
|
export interface GetDoneWhenPendingReviewResponse { criteria: unknown; count: unknown }
|
|
40
43
|
export interface GetGithubRepoResponse { ok: boolean; repo: unknown; private_deployable: boolean }
|
|
@@ -535,6 +538,14 @@ export interface BongosClient {
|
|
|
535
538
|
/** POST /claims/batch/validate — rank: any-builder */
|
|
536
539
|
postClaimsBatchValidate(args: RequestArgs & { body: PostClaimsBatchValidateRequest }): Promise<ApiResponse>;
|
|
537
540
|
};
|
|
541
|
+
"closeness": {
|
|
542
|
+
/** GET /closeness/for-me — rank: any-builder */
|
|
543
|
+
getClosenessForMe(args?: RequestArgs): Promise<GetClosenessForMeResponse>;
|
|
544
|
+
/** GET /closeness/weights — rank: any-builder */
|
|
545
|
+
getClosenessWeights(args?: RequestArgs): Promise<GetClosenessWeightsResponse>;
|
|
546
|
+
/** GET /closeness/with/{builderId} — rank: any-builder */
|
|
547
|
+
getClosenessWithBuilderId(args?: RequestArgs): Promise<GetClosenessWithBuilderIdResponse>;
|
|
548
|
+
};
|
|
538
549
|
"copyDesk": {
|
|
539
550
|
/** POST /copy-desk/flags — rank: any-builder */
|
|
540
551
|
postCopyDeskFlags(args: RequestArgs & { body: PostCopyDeskFlagsRequest }): Promise<PostCopyDeskFlagsResponse>;
|
|
@@ -248,6 +248,14 @@ export function createClient(opts = {}) {
|
|
|
248
248
|
// POST /claims/batch/validate — rank: any-builder — POST /claims/batch/validate
|
|
249
249
|
postClaimsBatchValidate: (args) => request("POST", "/claims/batch/validate", { hasBody: true }, args),
|
|
250
250
|
},
|
|
251
|
+
"closeness": {
|
|
252
|
+
// GET /closeness/for-me — rank: any-builder — GET /closeness/for-me
|
|
253
|
+
getClosenessForMe: (args) => request("GET", "/closeness/for-me", { hasBody: false }, args),
|
|
254
|
+
// GET /closeness/weights — rank: any-builder — GET /closeness/weights
|
|
255
|
+
getClosenessWeights: (args) => request("GET", "/closeness/weights", { hasBody: false }, args),
|
|
256
|
+
// GET /closeness/with/{builderId} — rank: any-builder — GET /closeness/with/:builderId
|
|
257
|
+
getClosenessWithBuilderId: (args) => request("GET", "/closeness/with/{builderId}", { hasBody: false }, args),
|
|
258
|
+
},
|
|
251
259
|
"copyDesk": {
|
|
252
260
|
// POST /copy-desk/flags — rank: any-builder — POST /copy-desk/flags
|
|
253
261
|
postCopyDeskFlags: (args) => request("POST", "/copy-desk/flags", { hasBody: true }, args),
|
package/docs/api/openapi.json
CHANGED
|
@@ -73,6 +73,10 @@
|
|
|
73
73
|
"name": "claims",
|
|
74
74
|
"description": "Endpoints under `/api/bongos/claims`."
|
|
75
75
|
},
|
|
76
|
+
{
|
|
77
|
+
"name": "closeness",
|
|
78
|
+
"description": "Endpoints under `/api/bongos/closeness`."
|
|
79
|
+
},
|
|
76
80
|
{
|
|
77
81
|
"name": "copy-desk",
|
|
78
82
|
"description": "Endpoints under `/api/bongos/copy-desk`."
|
|
@@ -3195,6 +3199,134 @@
|
|
|
3195
3199
|
]
|
|
3196
3200
|
}
|
|
3197
3201
|
},
|
|
3202
|
+
"/closeness/for-me": {
|
|
3203
|
+
"get": {
|
|
3204
|
+
"operationId": "get_closeness_for_me",
|
|
3205
|
+
"tags": [
|
|
3206
|
+
"closeness"
|
|
3207
|
+
],
|
|
3208
|
+
"summary": "GET /closeness/for-me",
|
|
3209
|
+
"description": ", and OWN-SCOPED — your own graph, never someone else's. Reading another builder's graph would expose who THEY are close to, which is a fact about third parties they did not consent to share.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
3210
|
+
"x-rank": "any-builder",
|
|
3211
|
+
"x-source": "modules/lifecycle/routes/closeness.js",
|
|
3212
|
+
"responses": {
|
|
3213
|
+
"200": {
|
|
3214
|
+
"description": "Success.",
|
|
3215
|
+
"content": {
|
|
3216
|
+
"application/json": {
|
|
3217
|
+
"schema": {
|
|
3218
|
+
"$ref": "#/components/schemas/GetClosenessForMeResponse"
|
|
3219
|
+
}
|
|
3220
|
+
}
|
|
3221
|
+
}
|
|
3222
|
+
},
|
|
3223
|
+
"400": {
|
|
3224
|
+
"$ref": "#/components/responses/BadRequest"
|
|
3225
|
+
},
|
|
3226
|
+
"401": {
|
|
3227
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
3228
|
+
},
|
|
3229
|
+
"403": {
|
|
3230
|
+
"$ref": "#/components/responses/Forbidden"
|
|
3231
|
+
}
|
|
3232
|
+
},
|
|
3233
|
+
"security": [
|
|
3234
|
+
{
|
|
3235
|
+
"builderSession": []
|
|
3236
|
+
}
|
|
3237
|
+
]
|
|
3238
|
+
}
|
|
3239
|
+
},
|
|
3240
|
+
"/closeness/weights": {
|
|
3241
|
+
"get": {
|
|
3242
|
+
"operationId": "get_closeness_weights",
|
|
3243
|
+
"tags": [
|
|
3244
|
+
"closeness"
|
|
3245
|
+
],
|
|
3246
|
+
"summary": "GET /closeness/weights",
|
|
3247
|
+
"description": "the MODEL is not private, and publishing it is the whole point of the weights being data. It describes how the system scores people; a builder ranked by it is entitled to read it.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
3248
|
+
"x-rank": "any-builder",
|
|
3249
|
+
"x-source": "modules/lifecycle/routes/closeness.js",
|
|
3250
|
+
"responses": {
|
|
3251
|
+
"200": {
|
|
3252
|
+
"description": "Success.",
|
|
3253
|
+
"content": {
|
|
3254
|
+
"application/json": {
|
|
3255
|
+
"schema": {
|
|
3256
|
+
"$ref": "#/components/schemas/GetClosenessWeightsResponse"
|
|
3257
|
+
}
|
|
3258
|
+
}
|
|
3259
|
+
}
|
|
3260
|
+
},
|
|
3261
|
+
"400": {
|
|
3262
|
+
"$ref": "#/components/responses/BadRequest"
|
|
3263
|
+
},
|
|
3264
|
+
"401": {
|
|
3265
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
3266
|
+
},
|
|
3267
|
+
"403": {
|
|
3268
|
+
"$ref": "#/components/responses/Forbidden"
|
|
3269
|
+
}
|
|
3270
|
+
},
|
|
3271
|
+
"security": [
|
|
3272
|
+
{
|
|
3273
|
+
"builderSession": []
|
|
3274
|
+
}
|
|
3275
|
+
]
|
|
3276
|
+
}
|
|
3277
|
+
},
|
|
3278
|
+
"/closeness/with/{builderId}": {
|
|
3279
|
+
"get": {
|
|
3280
|
+
"operationId": "get_closeness_with_builderId",
|
|
3281
|
+
"tags": [
|
|
3282
|
+
"closeness"
|
|
3283
|
+
],
|
|
3284
|
+
"summary": "GET /closeness/with/:builderId",
|
|
3285
|
+
"description": "One pair — \"why am I close to THEM\", asked directly rather than by paging the graph. Always relative to the CALLER: the pair is (you, them). rank: any-builder.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
3286
|
+
"x-rank": "any-builder",
|
|
3287
|
+
"x-source": "modules/lifecycle/routes/closeness.js",
|
|
3288
|
+
"parameters": [
|
|
3289
|
+
{
|
|
3290
|
+
"name": "builderId",
|
|
3291
|
+
"in": "path",
|
|
3292
|
+
"required": true,
|
|
3293
|
+
"schema": {
|
|
3294
|
+
"type": "string"
|
|
3295
|
+
},
|
|
3296
|
+
"description": "Path parameter `builderId`."
|
|
3297
|
+
}
|
|
3298
|
+
],
|
|
3299
|
+
"responses": {
|
|
3300
|
+
"200": {
|
|
3301
|
+
"description": "Success.",
|
|
3302
|
+
"content": {
|
|
3303
|
+
"application/json": {
|
|
3304
|
+
"schema": {
|
|
3305
|
+
"$ref": "#/components/schemas/GetClosenessWithBuilderIdResponse"
|
|
3306
|
+
}
|
|
3307
|
+
}
|
|
3308
|
+
}
|
|
3309
|
+
},
|
|
3310
|
+
"400": {
|
|
3311
|
+
"$ref": "#/components/responses/BadRequest"
|
|
3312
|
+
},
|
|
3313
|
+
"401": {
|
|
3314
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
3315
|
+
},
|
|
3316
|
+
"403": {
|
|
3317
|
+
"$ref": "#/components/responses/Forbidden"
|
|
3318
|
+
},
|
|
3319
|
+
"404": {
|
|
3320
|
+
"$ref": "#/components/responses/NotFound"
|
|
3321
|
+
}
|
|
3322
|
+
},
|
|
3323
|
+
"security": [
|
|
3324
|
+
{
|
|
3325
|
+
"builderSession": []
|
|
3326
|
+
}
|
|
3327
|
+
]
|
|
3328
|
+
}
|
|
3329
|
+
},
|
|
3198
3330
|
"/copy-desk/flags": {
|
|
3199
3331
|
"post": {
|
|
3200
3332
|
"operationId": "post_copy_desk_flags",
|
|
@@ -14620,6 +14752,41 @@
|
|
|
14620
14752
|
"stale_hours"
|
|
14621
14753
|
]
|
|
14622
14754
|
},
|
|
14755
|
+
"GetClosenessForMeResponse": {
|
|
14756
|
+
"type": "object",
|
|
14757
|
+
"properties": {
|
|
14758
|
+
"closeness": {},
|
|
14759
|
+
"count": {}
|
|
14760
|
+
},
|
|
14761
|
+
"required": [
|
|
14762
|
+
"closeness",
|
|
14763
|
+
"count"
|
|
14764
|
+
]
|
|
14765
|
+
},
|
|
14766
|
+
"GetClosenessWeightsResponse": {
|
|
14767
|
+
"type": "object",
|
|
14768
|
+
"properties": {
|
|
14769
|
+
"weights": {},
|
|
14770
|
+
"window_days": {},
|
|
14771
|
+
"note": {}
|
|
14772
|
+
},
|
|
14773
|
+
"required": [
|
|
14774
|
+
"weights",
|
|
14775
|
+
"window_days",
|
|
14776
|
+
"note"
|
|
14777
|
+
]
|
|
14778
|
+
},
|
|
14779
|
+
"GetClosenessWithBuilderIdResponse": {
|
|
14780
|
+
"type": "object",
|
|
14781
|
+
"properties": {
|
|
14782
|
+
"closeness": {},
|
|
14783
|
+
"why": {}
|
|
14784
|
+
},
|
|
14785
|
+
"required": [
|
|
14786
|
+
"closeness",
|
|
14787
|
+
"why"
|
|
14788
|
+
]
|
|
14789
|
+
},
|
|
14623
14790
|
"GetDiscordChannelsPlanResponse": {
|
|
14624
14791
|
"type": "object",
|
|
14625
14792
|
"properties": {
|
|
@@ -19794,9 +19961,9 @@
|
|
|
19794
19961
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
19795
19962
|
}
|
|
19796
19963
|
},
|
|
19797
|
-
"x-endpoint-count":
|
|
19798
|
-
"x-schema-count":
|
|
19964
|
+
"x-endpoint-count": 315,
|
|
19965
|
+
"x-schema-count": 353,
|
|
19799
19966
|
"x-undocumented-bodies": 8,
|
|
19800
|
-
"x-response-schemas":
|
|
19967
|
+
"x-response-schemas": 237,
|
|
19801
19968
|
"x-generated-by": "scripts/gds/gen-api-docs.js"
|
|
19802
19969
|
}
|
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. 315 endpoints across 52 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/<redacted>.md)): `public` < `any-builder` < `metic+archon` < `archon`.
|
|
@@ -143,6 +143,14 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
|
|
|
143
143
|
| POST | `/api/bongos/claims/batch/release` | `any-builder` | `claim_ids`, `force` | Bulk release (task 1758) — the batch twin of resolve(outcome='abandoned'). |
|
|
144
144
|
| POST | `/api/bongos/claims/batch/validate` | `any-builder` | `task_ids` | Dry-run validate (task 1758) — read-only twin of claimTasksBatch's pre-flight checks. |
|
|
145
145
|
|
|
146
|
+
## `closeness` (3)
|
|
147
|
+
|
|
148
|
+
| Method | Path | Rank | Body | Description |
|
|
149
|
+
|---|---|---|---|---|
|
|
150
|
+
| GET | `/api/bongos/closeness/for-me` | `any-builder` | — | , and OWN-SCOPED — your own graph, never someone else's. |
|
|
151
|
+
| GET | `/api/bongos/closeness/weights` | `any-builder` | — | the MODEL is not private, and publishing it is the whole point of the weights being data. |
|
|
152
|
+
| GET | `/api/bongos/closeness/with/:builderId` | `any-builder` | — | One pair — "why am I close to THEM", asked directly rather than by paging the graph. |
|
|
153
|
+
|
|
146
154
|
## `copy-desk` (4)
|
|
147
155
|
|
|
148
156
|
| Method | Path | Rank | Body | Description |
|
|
@@ -251,6 +251,14 @@ function createClient(opts = {}) {
|
|
|
251
251
|
// POST /claims/batch/validate — rank: any-builder — POST /claims/batch/validate
|
|
252
252
|
postClaimsBatchValidate: (args) => request("POST", "/claims/batch/validate", { hasBody: true }, args),
|
|
253
253
|
},
|
|
254
|
+
"closeness": {
|
|
255
|
+
// GET /closeness/for-me — rank: any-builder — GET /closeness/for-me
|
|
256
|
+
getClosenessForMe: (args) => request("GET", "/closeness/for-me", { hasBody: false }, args),
|
|
257
|
+
// GET /closeness/weights — rank: any-builder — GET /closeness/weights
|
|
258
|
+
getClosenessWeights: (args) => request("GET", "/closeness/weights", { hasBody: false }, args),
|
|
259
|
+
// GET /closeness/with/{builderId} — rank: any-builder — GET /closeness/with/:builderId
|
|
260
|
+
getClosenessWithBuilderId: (args) => request("GET", "/closeness/with/{builderId}", { hasBody: false }, args),
|
|
261
|
+
},
|
|
254
262
|
"copyDesk": {
|
|
255
263
|
// POST /copy-desk/flags — rank: any-builder — POST /copy-desk/flags
|
|
256
264
|
postCopyDeskFlags: (args) => request("POST", "/copy-desk/flags", { hasBody: true }, args),
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": [
|
|
3
|
+
"The closeness scoring model, as DATA (task 1003174 / C04, goal 1000075; criterion",
|
|
4
|
+
"collab-closeness-consented, ADR 0187 §2). The owner's decision was explicit that the",
|
|
5
|
+
"weights are data rather than constants buried in a function, so they can be reviewed",
|
|
6
|
+
"and changed without a code-archaeology dig. This file IS that review surface, and it",
|
|
7
|
+
"is served verbatim by GET /closeness/weights so the number can always be audited",
|
|
8
|
+
"against the model that produced it.",
|
|
9
|
+
"",
|
|
10
|
+
"HOW A SCORE IS BUILT. Each signal counts real events between two builders. That count",
|
|
11
|
+
"is divided by the signal's `saturation` and clamped to 1, so a signal is 'full' once",
|
|
12
|
+
"it has happened `saturation` times and no single runaway count can dominate. The",
|
|
13
|
+
"closeness score is the weighted sum of those clamped values, expressed 0..1.",
|
|
14
|
+
"",
|
|
15
|
+
"WEIGHTS ARE RENORMALISED OVER AVAILABLE SIGNALS. A signal with `available: false`",
|
|
16
|
+
"cannot be measured yet, and its weight is redistributed across the rest rather than",
|
|
17
|
+
"counted as zero. Counting it as zero would depress every pair's score identically and,",
|
|
18
|
+
"worse, the explanation would read as 'you never talk' when the truth is 'nothing here",
|
|
19
|
+
"can see whether you talk'. The explanation names every excluded signal for this reason.",
|
|
20
|
+
"",
|
|
21
|
+
"CHANGING A WEIGHT is a product decision about how the system describes real people to",
|
|
22
|
+
"each other. Weights should sum to 1 across ALL signals (the test asserts it); the",
|
|
23
|
+
"renormalisation handles the available subset at read time."
|
|
24
|
+
],
|
|
25
|
+
|
|
26
|
+
"version": 1,
|
|
27
|
+
"scale": "0..1, rendered as 0..100 on any surface that shows a number",
|
|
28
|
+
|
|
29
|
+
"signals": [
|
|
30
|
+
{
|
|
31
|
+
"key": "co_claim",
|
|
32
|
+
"label": "Worked the same goal at the same time",
|
|
33
|
+
"description": "You each held an active claim on a task in the same goal, and those claims overlapped in time. This is the live version of working alongside someone: you were both holding work in the same place at once.",
|
|
34
|
+
"weight": 0.3,
|
|
35
|
+
"saturation": 5,
|
|
36
|
+
"available": true
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"key": "co_build_session",
|
|
40
|
+
"label": "Sat down to it in the same stretch",
|
|
41
|
+
"description": "You logged work sessions on tasks in the same goal that overlapped in time. A claim can sit open for days; a session is the hours actually spent, so this is the closer measure of being present together. The owner's decision (ADR 0187 §3) is that the unit of collaboration is the GOAL, never a shared claim — nobody co-runs a claim, and this signal does not pretend they do.",
|
|
42
|
+
"weight": 0.3,
|
|
43
|
+
"saturation": 5,
|
|
44
|
+
"available": true
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"key": "shipped_together_goal",
|
|
48
|
+
"label": "Shipped into the same goal",
|
|
49
|
+
"description": "Distinct goals where you have each shipped at least one task. Unlike the two above, this ignores timing entirely — it is the durable record that you both built the same thing, even months apart.",
|
|
50
|
+
"weight": 0.25,
|
|
51
|
+
"saturation": 3,
|
|
52
|
+
"available": true
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"key": "comms_mention",
|
|
56
|
+
"label": "Talked to or mentioned each other",
|
|
57
|
+
"description": "Messages and mentions between you. NOT MEASURABLE YET: this needs the Discord-into-the-hall mirror, which is C06 of this goal (task 1003176) and is still an open decision. Until it lands this signal is unavailable and its weight is redistributed across the others — it is never silently counted as zero, because 'we cannot see your conversations' and 'you never speak' are different facts and only one of them is true.",
|
|
58
|
+
"weight": 0.15,
|
|
59
|
+
"saturation": 20,
|
|
60
|
+
"available": false,
|
|
61
|
+
"blocked_by": "task 1003176 (C06 — Discord chat mirrors INTO the hall)"
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
}
|