@bongos/core 1.19.815 → 1.19.817

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 (36) hide show
  1. package/.bongos-core.json +50 -40
  2. package/.claude/skills/worktree-clean/SKILL.md +3 -2
  3. package/clients/bongos-client/README.md +1 -1
  4. package/clients/bongos-client/bongos-client.global.js +6 -0
  5. package/clients/bongos-client/index.cjs +6 -0
  6. package/clients/bongos-client/index.d.ts +9 -0
  7. package/clients/bongos-client/index.mjs +6 -0
  8. package/docs/api/openapi.json +178 -3
  9. package/docs/api-reference.md +5 -2
  10. package/docs/copy-inventory.md +41 -38
  11. package/docs/copy-registry.json +67 -40
  12. package/docs/module-api-changelog.md +4 -0
  13. package/modules/dev-box/app/src/vendor/bongos-client.cjs +6 -0
  14. package/modules/government/catalog.js +1 -1
  15. package/modules/hall-ui/public/settings-specialities.js +56 -2
  16. package/modules/hall-ui/public/settings.html +1 -0
  17. package/modules/lifecycle/db-goals.js +36 -0
  18. package/modules/lifecycle/db.js +2 -0
  19. package/modules/lifecycle/goal-suggest.js +75 -9
  20. package/modules/lifecycle/routes/task-route-helpers.js +50 -3
  21. package/modules/specialities/db.js +41 -2
  22. package/modules/specialities/migrations/specialities_002_offered.sql +57 -0
  23. package/modules/specialities/routes/specialities.js +64 -0
  24. package/modules/specialities/specialities.js +30 -1
  25. package/package-lock.json +2 -2
  26. package/package.json +1 -1
  27. package/scripts/gds/capture.js +43 -8
  28. package/scripts/gds/category-advisory-guard.js +49 -8
  29. package/scripts/gds/stale-worktrees.js +50 -6
  30. package/src/module-api.js +1 -1
  31. package/tests/capture_goal_routing.mjs +65 -1
  32. package/tests/goal_suggest.mjs +148 -1
  33. package/tests/government_require_permission.mjs +90 -14
  34. package/tests/migration_allocation.mjs +70 -0
  35. package/tests/speciality_offered.mjs +212 -0
  36. package/tests/stale_worktrees.mjs +54 -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.815",
6
- "core_contract": "1.19.815",
7
- "source_commit": "49e12ef5bf0e0f642be16e2d07f3a8e4126088a3",
5
+ "core_version": "1.19.817",
6
+ "core_contract": "1.19.817",
7
+ "source_commit": "2cd2ebaa97da0505de1aa9f67f9c0448f99fb48d",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-09-17T07:58:43.512Z",
9
+ "built_at": "2026-09-17T08:31:54.468Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 489,
13
13
  "agent_docs_stubbed": 26,
14
- "functional_verbatim": 2215,
14
+ "functional_verbatim": 2217,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 2730,
20
- "tree_sha256": "8f4f7be2444b6e33f3772cc07af105a80fdd6a416ab122c91973dcb9600c0cf4",
19
+ "file_count": 2732,
20
+ "tree_sha256": "0b07201d08f28e66901393208deb86879c60a66d8729e32a7dd7da80ffdd7aef",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -252,7 +252,7 @@
252
252
  {
253
253
  "path": ".claude/skills/worktree-clean/SKILL.md",
254
254
  "mode": "0000644",
255
- "sha256": "4819fe448f4e35c3c7c3f4784718d51a7a4469f3c644d1b6c57b693b79da129e"
255
+ "sha256": "6548fe1de89c6909def02b76f022cae739c5b129d179a63538b9a1ab252e5030"
256
256
  },
257
257
  {
258
258
  "path": ".devcontainer/Dockerfile",
@@ -347,12 +347,12 @@
347
347
  {
348
348
  "path": "clients/bongos-client/README.md",
349
349
  "mode": "0000644",
350
- "sha256": "1921cca49d6df56968c7def2350d5b3bc2497d8ca1a7b616fccebf40c1cb16b1"
350
+ "sha256": "3db2ef5abdfe42a0e950339728759742ac017fdbcae1ed1b8e8b00798773df09"
351
351
  },
352
352
  {
353
353
  "path": "clients/bongos-client/bongos-client.global.js",
354
354
  "mode": "0000644",
355
- "sha256": "5753830b87cce7612cb6c6799ea3807fa5c2e9eaf1b1e5f137af21fb3692a3c4"
355
+ "sha256": "cd6c84faa0f4d65498108d2681fff1b7089c6ee80212af6d7bf29c5d29c77ee1"
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": "233ade028d8fb2334e0cd2e17d10d695a5c873a8ebe5589407cccac6dd023bd5"
365
+ "sha256": "0b9c1a362adc59ce61f6b0b6f92f47103f6060810cbcf90ee87391b255a1d96f"
366
366
  },
367
367
  {
368
368
  "path": "clients/bongos-client/index.d.ts",
369
369
  "mode": "0000644",
370
- "sha256": "e713625480afabdcda10f665beabb91cccaa3bce0268371a6ee780daea626b6d"
370
+ "sha256": "d2b1b59658899d95484cea739fad158009c1d5365881854b117e8350e09521d3"
371
371
  },
372
372
  {
373
373
  "path": "clients/bongos-client/index.mjs",
374
374
  "mode": "0000644",
375
- "sha256": "e8592cf9783404ce849e1c234a06c716993ef9c9f4d5b066a456eeeec002b0c0"
375
+ "sha256": "9cf6c38c64ba9a7f753ba393daddd7c3f76e246f34b713130eb81e77973e23de"
376
376
  },
377
377
  {
378
378
  "path": "clients/bongos-client/package.json",
@@ -1982,12 +1982,12 @@
1982
1982
  {
1983
1983
  "path": "docs/api-reference.md",
1984
1984
  "mode": "0000644",
1985
- "sha256": "16b812b3d5df71ecd9c8908fcd724345cee9ebe36bdf445fedd623e8d3572498"
1985
+ "sha256": "74c345407b073635a4b9eaa54b72a92e543a1d4e9a893b0a3c688ef32bdc86b0"
1986
1986
  },
1987
1987
  {
1988
1988
  "path": "docs/api/openapi.json",
1989
1989
  "mode": "0000644",
1990
- "sha256": "d062ab3925ae7919f1f0e32a2da4974cae41ee409d914ea6fb49bfd3591b91d2"
1990
+ "sha256": "28a4aec3929aefa72cfdffc1bcad6eba5ce1d3bb00518e28eddee631f219dfe5"
1991
1991
  },
1992
1992
  {
1993
1993
  "path": "docs/architecture.md",
@@ -2012,12 +2012,12 @@
2012
2012
  {
2013
2013
  "path": "docs/copy-inventory.md",
2014
2014
  "mode": "0000644",
2015
- "sha256": "b0fb481aa86ab8ad8b2bf37bfdf09e6aba00f611156d92002632384cddc40cb2"
2015
+ "sha256": "4e21dfe9140f8da88b5ba49d7d2c380196408073253e915198ab5f9cdbeab933"
2016
2016
  },
2017
2017
  {
2018
2018
  "path": "docs/copy-registry.json",
2019
2019
  "mode": "0000644",
2020
- "sha256": "a21e7da139c5593f452509692e3f17b945f99eb5013f9a0e7ec4ceedc8c8b50e"
2020
+ "sha256": "cb8da77e04f8fa238c513bf2fc04f4f00a13527022e2fbb34dd607ddced16bdd"
2021
2021
  },
2022
2022
  {
2023
2023
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2542,7 +2542,7 @@
2542
2542
  {
2543
2543
  "path": "docs/module-api-changelog.md",
2544
2544
  "mode": "0000644",
2545
- "sha256": "0f668e27938e73ba4769f2c5a1ee40205ffb350b25ad5c09bc7d660e2bb90b1d"
2545
+ "sha256": "7311b40a7f58f9a8e6467a1e97a51154c728ba9e91c1486cd06bd5b1b388371d"
2546
2546
  },
2547
2547
  {
2548
2548
  "path": "docs/modules-contract.md",
@@ -4077,7 +4077,7 @@
4077
4077
  {
4078
4078
  "path": "modules/dev-box/app/src/vendor/bongos-client.cjs",
4079
4079
  "mode": "0000644",
4080
- "sha256": "233ade028d8fb2334e0cd2e17d10d695a5c873a8ebe5589407cccac6dd023bd5"
4080
+ "sha256": "0b9c1a362adc59ce61f6b0b6f92f47103f6060810cbcf90ee87391b255a1d96f"
4081
4081
  },
4082
4082
  {
4083
4083
  "path": "modules/dev-box/app/test/unit.mjs",
@@ -4327,7 +4327,7 @@
4327
4327
  {
4328
4328
  "path": "modules/government/catalog.js",
4329
4329
  "mode": "0000644",
4330
- "sha256": "409e2309bdfcf4b3bb60cfde69e8854af9cd280a205cca2f7640103e08a56c84"
4330
+ "sha256": "da48187e485a7528bdd705c49df7a28c4ce6a3aad3c2885589f06dd4c8214840"
4331
4331
  },
4332
4332
  {
4333
4333
  "path": "modules/government/config.js",
@@ -5257,7 +5257,7 @@
5257
5257
  {
5258
5258
  "path": "modules/hall-ui/public/settings-specialities.js",
5259
5259
  "mode": "0000644",
5260
- "sha256": "194358e6da084b0ed61af334ec5caa50cff64ae2d74b55291d48a2ed98c519d2"
5260
+ "sha256": "384aa465d951e97d8d3e2b7633eff49d1d82e63bdd63baf0b38cf81482c4716d"
5261
5261
  },
5262
5262
  {
5263
5263
  "path": "modules/hall-ui/public/settings.css",
@@ -5267,7 +5267,7 @@
5267
5267
  {
5268
5268
  "path": "modules/hall-ui/public/settings.html",
5269
5269
  "mode": "0000644",
5270
- "sha256": "88ce1d42d1a40fccb87da1c353a2649e01c7f6ef6241d34a53b7260cb46cec31"
5270
+ "sha256": "4bea1273047e2fbb90f76f01892cb82da7aeaa1417f91a267249512a5e216993"
5271
5271
  },
5272
5272
  {
5273
5273
  "path": "modules/hall-ui/public/settings.js",
@@ -5557,7 +5557,7 @@
5557
5557
  {
5558
5558
  "path": "modules/lifecycle/db-goals.js",
5559
5559
  "mode": "0000644",
5560
- "sha256": "b4d1c8bd2254f93519a88302072c2f524a1acb4152382fb09bdc22b1ef95f0ed"
5560
+ "sha256": "1b229bd4bf18563dd772c0be46f320ae533e71a5c7ba32aaa4b523ac9f97a4dc"
5561
5561
  },
5562
5562
  {
5563
5563
  "path": "modules/lifecycle/db-grade.js",
@@ -5597,7 +5597,7 @@
5597
5597
  {
5598
5598
  "path": "modules/lifecycle/db.js",
5599
5599
  "mode": "0000644",
5600
- "sha256": "a568b425560d8d8f4523995442454233b69016a31934810c5d4b7d83baab0b09"
5600
+ "sha256": "30c8884948a8dee8213c55279c12f06e104c7d95ab3d7fad9dc67506ed1ac1ab"
5601
5601
  },
5602
5602
  {
5603
5603
  "path": "modules/lifecycle/dead-deps.js",
@@ -5657,7 +5657,7 @@
5657
5657
  {
5658
5658
  "path": "modules/lifecycle/goal-suggest.js",
5659
5659
  "mode": "0000644",
5660
- "sha256": "85117db645accd023f4f61735f9f22a8c5f6ef08a29c61db99fbade51d081147"
5660
+ "sha256": "cdbfa36b58dc26b7ce9d7a3d1f2812edd0ea050c2b27fe3837be6b6edf7d9ac5"
5661
5661
  },
5662
5662
  {
5663
5663
  "path": "modules/lifecycle/help-requests.js",
@@ -5842,7 +5842,7 @@
5842
5842
  {
5843
5843
  "path": "modules/lifecycle/routes/task-route-helpers.js",
5844
5844
  "mode": "0000644",
5845
- "sha256": "e7e709127d13bdbe0333adaae6c9ed97afc6ca66d9476ccc0239c3ec2bbeacce"
5845
+ "sha256": "c82bfa19da18a2b952ad4e2a0311ef983050fd0a4c8a095c8fb3f3581f3a4801"
5846
5846
  },
5847
5847
  {
5848
5848
  "path": "modules/lifecycle/routes/task-write-routes.js",
@@ -7297,13 +7297,18 @@
7297
7297
  {
7298
7298
  "path": "modules/specialities/db.js",
7299
7299
  "mode": "0000644",
7300
- "sha256": "9fbd7dea94f5e4dae305f453961ad896c97113109d196dd42d077cfd6dd3b44a"
7300
+ "sha256": "3e060dfa1aa11f4ca6c1949bb36599e24c33cfca6ba983c1ce740de67f6e1152"
7301
7301
  },
7302
7302
  {
7303
7303
  "path": "modules/specialities/migrations/specialities_001_specialities.sql",
7304
7304
  "mode": "0000644",
7305
7305
  "sha256": "055210da2726c1d17457900a9b44566c58f371b3206365c5352474114be57251"
7306
7306
  },
7307
+ {
7308
+ "path": "modules/specialities/migrations/specialities_002_offered.sql",
7309
+ "mode": "0000644",
7310
+ "sha256": "5d2c6a648b0a7eb85893c2a3302af721206cc0ca0f58420cb4281e427b86de7a"
7311
+ },
7307
7312
  {
7308
7313
  "path": "modules/specialities/module.json",
7309
7314
  "mode": "0000644",
@@ -7312,12 +7317,12 @@
7312
7317
  {
7313
7318
  "path": "modules/specialities/routes/specialities.js",
7314
7319
  "mode": "0000644",
7315
- "sha256": "0454b2f40cd8c08ee49af494dd46ec94045a3a19a1c788341fe94048b6b67d0b"
7320
+ "sha256": "132b28199202c742045c17bd930889d1a3327af1b17445d45d592bfc472bed76"
7316
7321
  },
7317
7322
  {
7318
7323
  "path": "modules/specialities/specialities.js",
7319
7324
  "mode": "0000644",
7320
- "sha256": "af69cd2808d9abc16a8d611348a632132f37876f4688e76ab244eab81afecb23"
7325
+ "sha256": "413477a716f3a60abc0763bccfb10a593c4eb19301131de0230eb3d72ffee299"
7321
7326
  },
7322
7327
  {
7323
7328
  "path": "modules/status-ui/CLAUDE.md",
@@ -7792,12 +7797,12 @@
7792
7797
  {
7793
7798
  "path": "package-lock.json",
7794
7799
  "mode": "0000644",
7795
- "sha256": "48fba5427217aab544717eef126aa155f404dc6ba71ad21e2b2c4db586da9be7"
7800
+ "sha256": "73cd517987ad21a5984113cb38b81cd9221d3247574a773a5f8d1f47a9908921"
7796
7801
  },
7797
7802
  {
7798
7803
  "path": "package.json",
7799
7804
  "mode": "0000644",
7800
- "sha256": "abc68f18878f7339c9dba180f3b965c6b2cb253f91255b509ccb9fbd47c3b21b"
7805
+ "sha256": "1243bf07a179e236a3e11fd4d64c5c4545609883f59448022ac9d36901d9eaca"
7801
7806
  },
7802
7807
  {
7803
7808
  "path": "public-docs/index.html",
@@ -8057,12 +8062,12 @@
8057
8062
  {
8058
8063
  "path": "scripts/gds/capture.js",
8059
8064
  "mode": "0000644",
8060
- "sha256": "6779ebc36d51762777cb55352489a05ca9974f29c49d874b40c7486be83496ff"
8065
+ "sha256": "7320809dacf61454d114d5c55c244e7eac3314f36302eab879950355540573f6"
8061
8066
  },
8062
8067
  {
8063
8068
  "path": "scripts/gds/category-advisory-guard.js",
8064
8069
  "mode": "0000644",
8065
- "sha256": "008fc7268a1e58b7e87b5454d0ca698e25cba3229172031587e934fe73fc33da"
8070
+ "sha256": "a71ac076299b9e37bf8e0a6ff8761f8ba3059271b2596b6ee8941fc24533357d"
8066
8071
  },
8067
8072
  {
8068
8073
  "path": "scripts/gds/cf-tunnel.js",
@@ -9182,7 +9187,7 @@
9182
9187
  {
9183
9188
  "path": "scripts/gds/stale-worktrees.js",
9184
9189
  "mode": "0000644",
9185
- "sha256": "b615f8cdf4b1e74d997fff9e8eaa7f5c77276eefaa02f1a0c0becd80f8697620"
9190
+ "sha256": "9f6ce80e5325f4cfe68cfa6cb82bec52d594af7e461b6734724819b23cbb0d37"
9186
9191
  },
9187
9192
  {
9188
9193
  "path": "scripts/gds/start.js",
@@ -9687,7 +9692,7 @@
9687
9692
  {
9688
9693
  "path": "src/module-api.js",
9689
9694
  "mode": "0000644",
9690
- "sha256": "15e7fcbcb8377bea7245c66e4784accaecd09d92bd9baf3ecda20aab73faadac"
9695
+ "sha256": "36b08b101d2abb1c85207dedcc0ff4f6893496731afb19b10e6c4680c1c303c4"
9691
9696
  },
9692
9697
  {
9693
9698
  "path": "src/module-loader/catalog.js",
@@ -10312,7 +10317,7 @@
10312
10317
  {
10313
10318
  "path": "tests/capture_goal_routing.mjs",
10314
10319
  "mode": "0000644",
10315
- "sha256": "30c86ef5ae46c698b621dbe90e15210d162cc88d8b33bd0889330ff8686a065e"
10320
+ "sha256": "2ddceb37d46eda5c3ab2a56b54c86f3cf55596479b5fe7f30646f45b1ac11ac2"
10316
10321
  },
10317
10322
  {
10318
10323
  "path": "tests/cascade-dispatch.mjs",
@@ -11102,7 +11107,7 @@
11102
11107
  {
11103
11108
  "path": "tests/goal_suggest.mjs",
11104
11109
  "mode": "0000644",
11105
- "sha256": "d61e2bd5b5a65239f1410011a5035b124bf8e20c41eac08018635ec8cd3a49c7"
11110
+ "sha256": "41cf7774b86acabe7621563430fc4784152dea05f6cd3136b00081eca876e74d"
11106
11111
  },
11107
11112
  {
11108
11113
  "path": "tests/goal_tier.mjs",
@@ -11287,7 +11292,7 @@
11287
11292
  {
11288
11293
  "path": "tests/government_require_permission.mjs",
11289
11294
  "mode": "0000644",
11290
- "sha256": "8ae3eaaf0b7d9a0e93d58eda3d877abe4f59bed25ffbcdc4e42a67497398debf"
11295
+ "sha256": "95a5215153c5d98f4fe9ecd3d36ca1ce76d9c486abef8f69dfca0ce3d5cfb006"
11291
11296
  },
11292
11297
  {
11293
11298
  "path": "tests/government_resolver.mjs",
@@ -11977,7 +11982,7 @@
11977
11982
  {
11978
11983
  "path": "tests/migration_allocation.mjs",
11979
11984
  "mode": "0000644",
11980
- "sha256": "e9271b1a67d201cfd075ce272b1a5a4f3b66c80dcfa5798ca3ea0d3f5048be43"
11985
+ "sha256": "adc1a84f0b251a99471bd4f14367d949432476b0d504bff4de3ae0167eadfb30"
11981
11986
  },
11982
11987
  {
11983
11988
  "path": "tests/migration_namespace.mjs",
@@ -13239,6 +13244,11 @@
13239
13244
  "mode": "0000644",
13240
13245
  "sha256": "9de6fbffd858190096bc22d556ccae101a6206adeee05bb146bd2a0a1a59d15c"
13241
13246
  },
13247
+ {
13248
+ "path": "tests/speciality_offered.mjs",
13249
+ "mode": "0000644",
13250
+ "sha256": "13d7be30c41855ac4a39689bc88ea2be2c896ca071b884bbd0e81cc9c29bc180"
13251
+ },
13242
13252
  {
13243
13253
  "path": "tests/spike_task_map.mjs",
13244
13254
  "mode": "0000644",
@@ -13267,7 +13277,7 @@
13267
13277
  {
13268
13278
  "path": "tests/stale_worktrees.mjs",
13269
13279
  "mode": "0000644",
13270
- "sha256": "97ca351bc03b3d56b99239739818c11fea384691ee597b54a0c4bef60be196f6"
13280
+ "sha256": "3cc48273341fe8e71ba928ec7c474533d510b74d5b107cad6e3af278219ccd41"
13271
13281
  },
13272
13282
  {
13273
13283
  "path": "tests/start_env_guard.mjs",
@@ -8,8 +8,9 @@ description: >-
8
8
 
9
9
  ## What this skill does
10
10
 
11
- 1. `node scripts/gds/stale-worktrees.js` — the list. A worktree is **stale** when its branch is an ancestor of `origin/main` (the land happened) or the branch is gone (the ship deleted it). Detached worktrees and unmerged branches are **live** and never touched. Run `git fetch origin` first so "merged into main" reflects today's main, not the last fetch. The same call also names **husks** — directories under `.claude/worktrees/` that git does not list as worktrees at all (step 6).
12
- 2. Show the stale list to the builder (names + why). The worktree holding the **current claim** is never stale by construction (its branch is unmerged), but say so if the builder asks.
11
+ 1. `node scripts/gds/stale-worktrees.js` — the list. A worktree is **stale** when its branch is an ancestor of `origin/main` (the land happened) or the branch is gone (the ship deleted it). Detached worktrees, unmerged branches, and branches sitting exactly at `origin/main` (a claim worktree with no commits yet — task 1003912) are **live** and never touched. Run `git fetch origin` first so "merged into main" reflects today's main, not the last fetch. The same call also names **husks** — directories under `.claude/worktrees/` that git does not list as worktrees at all (step 6).
12
+ 2. Show the stale list to the builder (names + why). A worktree holding a **live claim** should not appear: an unmerged branch is live, and since task 1003912 so is a branch still sitting exactly at `origin/main` — the window between `worktree.js add` and the builder's first commit, during which a live claim's tree really did read as "merged into main".
13
+ - Do not treat that as a guarantee. This list is derived from git alone, with no knowledge of who holds what, so **if a name on it looks like someone's live claim, ask before removing it.** The assurance this replaced — that a current claim could not possibly be listed — is exactly what would stop an agent double-checking.
13
14
  3. For each stale name: `node scripts/gds/worktree.js remove <name>`. That helper unlinks any node_modules junction BEFORE `git worktree remove`, which is the whole reason raw git is off-limits here (learning in `scripts/gds/CLAUDE.md` → "Gotchas / invariants"; the `git-guard.js` PreToolUse hook blocks the raw form).
14
15
  - A worktree with untracked leftovers (`.playwright-mcp/`, a stray screenshot) refuses without `--force`. Show the `git -C <path> status --porcelain` output; if it is only untracked junk, re-run with `--force`. If it shows **modified tracked files**, skip it and report — someone's uncommitted work is not this skill's to delete.
15
16
  4. `git worktree prune` — clears any registrations whose directory is already gone.
@@ -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
- - 390 operations across 59 resource groups
8
+ - 393 operations across 59 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -857,6 +857,12 @@ function createClient(opts = {}) {
857
857
  postSpecialitiesIdDocuments: (args) => request("POST", "/specialities/{id}/documents", { hasBody: true }, args),
858
858
  // DELETE /specialities/{id}/documents/{docId} — rank: any-builder — DELETE /specialities/:id/documents/:docId
859
859
  deleteSpecialitiesIdDocumentsDocId: (args) => request("DELETE", "/specialities/{id}/documents/{docId}", { hasBody: false }, args),
860
+ // POST /specialities/{id}/offer — rank: metic+archon — POST /specialities/:id/offer
861
+ postSpecialitiesIdOffer: (args) => request("POST", "/specialities/{id}/offer", { hasBody: true }, args),
862
+ // POST /specialities/{id}/unoffer — rank: metic+archon — POST /specialities/:id/unoffer
863
+ postSpecialitiesIdUnoffer: (args) => request("POST", "/specialities/{id}/unoffer", { hasBody: true }, args),
864
+ // GET /specialities/offered — rank: any-builder — GET /specialities/offered
865
+ getSpecialitiesOffered: (args) => request("GET", "/specialities/offered", { hasBody: false }, args),
860
866
  },
861
867
  "sso": {
862
868
  // POST /sso/activity/rollup — rank: public — POST /sso/activity/rollup
@@ -856,6 +856,12 @@ function createClient(opts = {}) {
856
856
  postSpecialitiesIdDocuments: (args) => request("POST", "/specialities/{id}/documents", { hasBody: true }, args),
857
857
  // DELETE /specialities/{id}/documents/{docId} — rank: any-builder — DELETE /specialities/:id/documents/:docId
858
858
  deleteSpecialitiesIdDocumentsDocId: (args) => request("DELETE", "/specialities/{id}/documents/{docId}", { hasBody: false }, args),
859
+ // POST /specialities/{id}/offer — rank: metic+archon — POST /specialities/:id/offer
860
+ postSpecialitiesIdOffer: (args) => request("POST", "/specialities/{id}/offer", { hasBody: true }, args),
861
+ // POST /specialities/{id}/unoffer — rank: metic+archon — POST /specialities/:id/unoffer
862
+ postSpecialitiesIdUnoffer: (args) => request("POST", "/specialities/{id}/unoffer", { hasBody: true }, args),
863
+ // GET /specialities/offered — rank: any-builder — GET /specialities/offered
864
+ getSpecialitiesOffered: (args) => request("GET", "/specialities/offered", { hasBody: false }, args),
859
865
  },
860
866
  "sso": {
861
867
  // POST /sso/activity/rollup — rank: public — POST /sso/activity/rollup
@@ -137,6 +137,7 @@ export interface GetSessionsMineResponse { sessions: unknown; count: unknown }
137
137
  export interface GetSessionsSearchResponse { sessions: unknown; count: unknown; total: unknown; totals: unknown; limit: unknown; offset: unknown }
138
138
  export interface GetSpecialitiesIdDocumentsResponse { documents: unknown }
139
139
  export interface GetSpecialitiesIdResponse { speciality: unknown }
140
+ export interface GetSpecialitiesOfferedResponse { suggestions: unknown }
140
141
  export interface GetSpecialitiesResponse { specialities: unknown }
141
142
  export interface GetSsoPubkeyResponse { alg: unknown; format: unknown; public_key_b64: unknown }
142
143
  export interface GetTaskRecommendationsForMeResponse { recommendations: unknown; count: unknown }
@@ -385,6 +386,8 @@ export interface PostSpecialitiesIdAbandonResponse { ok: boolean; was_active: un
385
386
  export interface PostSpecialitiesIdAdoptResponse { adoption: unknown }
386
387
  export interface PostSpecialitiesIdDocumentsRequest { title: string; body_md: string; source?: string }
387
388
  export interface PostSpecialitiesIdDocumentsResponse { skipped?: boolean; reason?: unknown; document?: unknown }
389
+ export interface PostSpecialitiesIdOfferResponse { speciality: unknown }
390
+ export interface PostSpecialitiesIdUnofferResponse { speciality: unknown }
388
391
  export interface PostSpecialitiesRequest { name: string; discipline: string; summary?: string; contract_md?: string; visibility?: string; sellable?: boolean }
389
392
  export interface PostSpecialitiesResponse { speciality: unknown }
390
393
  export interface PostSsoActivityRollupRequest { client_id: string; client_secret: string; github_id: StringifiableId; credits?: number; tasks_shipped?: number; karma?: number; rank?: string; disciplines?: unknown; recent_ships?: unknown }
@@ -1219,6 +1222,12 @@ export interface BongosClient {
1219
1222
  postSpecialitiesIdDocuments(args: RequestArgs & { body: PostSpecialitiesIdDocumentsRequest }): Promise<PostSpecialitiesIdDocumentsResponse>;
1220
1223
  /** DELETE /specialities/{id}/documents/{docId} — rank: any-builder */
1221
1224
  deleteSpecialitiesIdDocumentsDocId(args?: RequestArgs): Promise<DeleteSpecialitiesIdDocumentsDocIdResponse>;
1225
+ /** POST /specialities/{id}/offer — rank: metic+archon */
1226
+ postSpecialitiesIdOffer(args?: RequestArgs): Promise<PostSpecialitiesIdOfferResponse>;
1227
+ /** POST /specialities/{id}/unoffer — rank: metic+archon */
1228
+ postSpecialitiesIdUnoffer(args?: RequestArgs): Promise<PostSpecialitiesIdUnofferResponse>;
1229
+ /** GET /specialities/offered — rank: any-builder */
1230
+ getSpecialitiesOffered(args?: RequestArgs): Promise<GetSpecialitiesOfferedResponse>;
1222
1231
  };
1223
1232
  "sso": {
1224
1233
  /** POST /sso/activity/rollup — rank: public */
@@ -853,6 +853,12 @@ export function createClient(opts = {}) {
853
853
  postSpecialitiesIdDocuments: (args) => request("POST", "/specialities/{id}/documents", { hasBody: true }, args),
854
854
  // DELETE /specialities/{id}/documents/{docId} — rank: any-builder — DELETE /specialities/:id/documents/:docId
855
855
  deleteSpecialitiesIdDocumentsDocId: (args) => request("DELETE", "/specialities/{id}/documents/{docId}", { hasBody: false }, args),
856
+ // POST /specialities/{id}/offer — rank: metic+archon — POST /specialities/:id/offer
857
+ postSpecialitiesIdOffer: (args) => request("POST", "/specialities/{id}/offer", { hasBody: true }, args),
858
+ // POST /specialities/{id}/unoffer — rank: metic+archon — POST /specialities/:id/unoffer
859
+ postSpecialitiesIdUnoffer: (args) => request("POST", "/specialities/{id}/unoffer", { hasBody: true }, args),
860
+ // GET /specialities/offered — rank: any-builder — GET /specialities/offered
861
+ getSpecialitiesOffered: (args) => request("GET", "/specialities/offered", { hasBody: false }, args),
856
862
  },
857
863
  "sso": {
858
864
  // POST /sso/activity/rollup — rank: public — POST /sso/activity/rollup
@@ -14901,6 +14901,44 @@
14901
14901
  ]
14902
14902
  }
14903
14903
  },
14904
+ "/specialities/offered": {
14905
+ "get": {
14906
+ "operationId": "get_specialities_offered",
14907
+ "tags": [
14908
+ "specialities"
14909
+ ],
14910
+ "summary": "GET /specialities/offered",
14911
+ "description": "GET /specialities/offered — the suggestions for THIS builder. Mounted before '/specialities/:id' would otherwise capture 'offered' as an id.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14912
+ "x-rank": "any-builder",
14913
+ "x-source": "modules/specialities/routes/specialities.js",
14914
+ "responses": {
14915
+ "200": {
14916
+ "description": "Success.",
14917
+ "content": {
14918
+ "application/json": {
14919
+ "schema": {
14920
+ "$ref": "#/components/schemas/GetSpecialitiesOfferedResponse"
14921
+ }
14922
+ }
14923
+ }
14924
+ },
14925
+ "400": {
14926
+ "$ref": "#/components/responses/BadRequest"
14927
+ },
14928
+ "401": {
14929
+ "$ref": "#/components/responses/Unauthorized"
14930
+ },
14931
+ "403": {
14932
+ "$ref": "#/components/responses/Forbidden"
14933
+ }
14934
+ },
14935
+ "security": [
14936
+ {
14937
+ "builderSession": []
14938
+ }
14939
+ ]
14940
+ }
14941
+ },
14904
14942
  "/specialities/{id}": {
14905
14943
  "get": {
14906
14944
  "operationId": "get_specialities_id",
@@ -15292,6 +15330,116 @@
15292
15330
  ]
15293
15331
  }
15294
15332
  },
15333
+ "/specialities/{id}/offer": {
15334
+ "post": {
15335
+ "operationId": "post_specialities_id_offer",
15336
+ "tags": [
15337
+ "specialities"
15338
+ ],
15339
+ "summary": "POST /specialities/:id/offer",
15340
+ "description": "── offering: a project puts its name behind a speciality ───────────────── OFFERING IS CURATION, NOT OWNERSHIP, so it is gated differently from every other write here. Editing your own speciality is yours; recommending one to everybody on the instance is a claim on their attention and their sessions, which is the same act `project.curate` already governs for featuring a project (metic floor). An owner may therefore edit a speciality they cannot offer, and a curator may offer one they do not own — which is correct: the two decisions are about different things.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `project.curate` (all required).",
15341
+ "x-rank": "metic+archon",
15342
+ "x-source": "modules/specialities/routes/specialities.js",
15343
+ "x-permissions": [
15344
+ "project.curate"
15345
+ ],
15346
+ "parameters": [
15347
+ {
15348
+ "name": "id",
15349
+ "in": "path",
15350
+ "required": true,
15351
+ "schema": {
15352
+ "type": "string"
15353
+ },
15354
+ "description": "Path parameter `id`."
15355
+ }
15356
+ ],
15357
+ "responses": {
15358
+ "200": {
15359
+ "description": "Success.",
15360
+ "content": {
15361
+ "application/json": {
15362
+ "schema": {
15363
+ "$ref": "#/components/schemas/PostSpecialitiesIdOfferResponse"
15364
+ }
15365
+ }
15366
+ }
15367
+ },
15368
+ "400": {
15369
+ "$ref": "#/components/responses/BadRequest"
15370
+ },
15371
+ "401": {
15372
+ "$ref": "#/components/responses/Unauthorized"
15373
+ },
15374
+ "403": {
15375
+ "$ref": "#/components/responses/Forbidden"
15376
+ },
15377
+ "404": {
15378
+ "$ref": "#/components/responses/NotFound"
15379
+ }
15380
+ },
15381
+ "security": [
15382
+ {
15383
+ "builderSession": []
15384
+ }
15385
+ ]
15386
+ }
15387
+ },
15388
+ "/specialities/{id}/unoffer": {
15389
+ "post": {
15390
+ "operationId": "post_specialities_id_unoffer",
15391
+ "tags": [
15392
+ "specialities"
15393
+ ],
15394
+ "summary": "POST /specialities/:id/unoffer",
15395
+ "description": "**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `project.curate` (all required).",
15396
+ "x-rank": "metic+archon",
15397
+ "x-source": "modules/specialities/routes/specialities.js",
15398
+ "x-permissions": [
15399
+ "project.curate"
15400
+ ],
15401
+ "parameters": [
15402
+ {
15403
+ "name": "id",
15404
+ "in": "path",
15405
+ "required": true,
15406
+ "schema": {
15407
+ "type": "string"
15408
+ },
15409
+ "description": "Path parameter `id`."
15410
+ }
15411
+ ],
15412
+ "responses": {
15413
+ "200": {
15414
+ "description": "Success.",
15415
+ "content": {
15416
+ "application/json": {
15417
+ "schema": {
15418
+ "$ref": "#/components/schemas/PostSpecialitiesIdUnofferResponse"
15419
+ }
15420
+ }
15421
+ }
15422
+ },
15423
+ "400": {
15424
+ "$ref": "#/components/responses/BadRequest"
15425
+ },
15426
+ "401": {
15427
+ "$ref": "#/components/responses/Unauthorized"
15428
+ },
15429
+ "403": {
15430
+ "$ref": "#/components/responses/Forbidden"
15431
+ },
15432
+ "404": {
15433
+ "$ref": "#/components/responses/NotFound"
15434
+ }
15435
+ },
15436
+ "security": [
15437
+ {
15438
+ "builderSession": []
15439
+ }
15440
+ ]
15441
+ }
15442
+ },
15295
15443
  "/sso/activity/rollup": {
15296
15444
  "post": {
15297
15445
  "operationId": "post_sso_activity_rollup",
@@ -19685,6 +19833,15 @@
19685
19833
  "speciality"
19686
19834
  ]
19687
19835
  },
19836
+ "GetSpecialitiesOfferedResponse": {
19837
+ "type": "object",
19838
+ "properties": {
19839
+ "suggestions": {}
19840
+ },
19841
+ "required": [
19842
+ "suggestions"
19843
+ ]
19844
+ },
19688
19845
  "GetSpecialitiesResponse": {
19689
19846
  "type": "object",
19690
19847
  "properties": {
@@ -23733,6 +23890,24 @@
23733
23890
  "document": {}
23734
23891
  }
23735
23892
  },
23893
+ "PostSpecialitiesIdOfferResponse": {
23894
+ "type": "object",
23895
+ "properties": {
23896
+ "speciality": {}
23897
+ },
23898
+ "required": [
23899
+ "speciality"
23900
+ ]
23901
+ },
23902
+ "PostSpecialitiesIdUnofferResponse": {
23903
+ "type": "object",
23904
+ "properties": {
23905
+ "speciality": {}
23906
+ },
23907
+ "required": [
23908
+ "speciality"
23909
+ ]
23910
+ },
23736
23911
  "PostSpecialitiesRequest": {
23737
23912
  "type": "object",
23738
23913
  "properties": {
@@ -24759,9 +24934,9 @@
24759
24934
  "description": "A required dependency/feature is not configured or is temporarily down."
24760
24935
  }
24761
24936
  },
24762
- "x-endpoint-count": 390,
24763
- "x-schema-count": 429,
24937
+ "x-endpoint-count": 393,
24938
+ "x-schema-count": 432,
24764
24939
  "x-undocumented-bodies": 9,
24765
- "x-response-schemas": 293,
24940
+ "x-response-schemas": 296,
24766
24941
  "x-generated-by": "scripts/gds/gen-api-docs.js"
24767
24942
  }