@bongos/core 1.19.910 → 1.19.912
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 +62 -37
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +2 -0
- package/clients/bongos-client/index.cjs +2 -0
- package/clients/bongos-client/index.d.ts +3 -0
- package/clients/bongos-client/index.mjs +2 -0
- package/docs/adr/0314-module-protection-is-per-path-not-per-module.md +7 -2
- package/docs/adr/0315-a-plane-with-no-proxy-is-refused-not-given-a-no-op-ingress.md +96 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +62 -2
- package/docs/api-reference.md +3 -2
- package/docs/copy-inventory.md +25 -25
- package/docs/copy-registry.json +29 -29
- package/docs/module-api-changelog.md +5 -1
- package/docs/recipes/self-host.md +1 -1
- package/modules/hall-ui/public/ideas.css +25 -0
- package/modules/hall-ui/public/ideas.html +12 -0
- package/modules/hall-ui/public/ideas.js +115 -2
- package/modules/ideas/landing-preview.js +180 -0
- package/modules/ideas/routes/inbox.js +47 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/api-alias-caller-scan.js +213 -0
- package/scripts/gds/fitness-ratchets.js +31 -0
- package/scripts/gds/provision-net.js +41 -0
- package/scripts/gds/provision.js +11 -3
- package/scripts/hall-preview/server.js +14 -1
- package/src/bongos/module-scope-map.js +43 -5
- package/src/module-api.js +1 -1
- package/tests/api_alias_caller_ratchet.mjs +130 -0
- package/tests/idea_landing_preview.mjs +337 -0
- package/tests/idea_spark_hall.mjs +183 -0
- package/tests/module-scope-map.mjs +87 -3
- package/tests/provision_caddy_wiring.mjs +76 -2
- package/tests/quarantine_canonical.mjs +32 -4
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.912",
|
|
6
|
+
"core_contract": "1.19.912",
|
|
7
|
+
"source_commit": "d9093cd602f014a948cee8ac7ea27f36d4be922b",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-
|
|
9
|
+
"built_at": "2026-09-20T16:20:10.208Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 504,
|
|
13
13
|
"agent_docs_stubbed": 26,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 2287,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 2817,
|
|
20
|
+
"tree_sha256": "e4f492bda78fcddcc35a433c3f5c7ca4b3e193298e923da342a7326e182fb695",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -347,12 +347,12 @@
|
|
|
347
347
|
{
|
|
348
348
|
"path": "clients/bongos-client/README.md",
|
|
349
349
|
"mode": "0000644",
|
|
350
|
-
"sha256": "
|
|
350
|
+
"sha256": "3d49c3ab2ec849b4b6b8856fc33161dae6d4728565afc3e781c9f9b8c00068c5"
|
|
351
351
|
},
|
|
352
352
|
{
|
|
353
353
|
"path": "clients/bongos-client/bongos-client.global.js",
|
|
354
354
|
"mode": "0000644",
|
|
355
|
-
"sha256": "
|
|
355
|
+
"sha256": "2697c2c2ca3b5ede19b7f5511eb51ae6173973b4db01d20183ef560a95315c42"
|
|
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": "b80472a5a66e342b8dc9c09c61a570cc3272756cf311eb16f77a125d8ae66afd"
|
|
366
366
|
},
|
|
367
367
|
{
|
|
368
368
|
"path": "clients/bongos-client/index.d.ts",
|
|
369
369
|
"mode": "0000644",
|
|
370
|
-
"sha256": "
|
|
370
|
+
"sha256": "de24c22270e6a95dcf5674aac3b445e08fce3cd1982d0e922d84ca9e199a36e0"
|
|
371
371
|
},
|
|
372
372
|
{
|
|
373
373
|
"path": "clients/bongos-client/index.mjs",
|
|
374
374
|
"mode": "0000644",
|
|
375
|
-
"sha256": "
|
|
375
|
+
"sha256": "084e5d2634ec4a5ddbc4a537ad32ec88296bb55f0439c7c4dc8e534eaad5fd71"
|
|
376
376
|
},
|
|
377
377
|
{
|
|
378
378
|
"path": "clients/bongos-client/package.json",
|
|
@@ -2062,22 +2062,27 @@
|
|
|
2062
2062
|
{
|
|
2063
2063
|
"path": "docs/adr/0314-module-protection-is-per-path-not-per-module.md",
|
|
2064
2064
|
"mode": "0000644",
|
|
2065
|
-
"sha256": "
|
|
2065
|
+
"sha256": "accaba461051e427c251e9c4ec4ff74304447fd6cd68f940311f4b978ff234c2"
|
|
2066
|
+
},
|
|
2067
|
+
{
|
|
2068
|
+
"path": "docs/adr/0315-a-plane-with-no-proxy-is-refused-not-given-a-no-op-ingress.md",
|
|
2069
|
+
"mode": "0000644",
|
|
2070
|
+
"sha256": "bc9dde45a33790e4fbce47682a5734a1adaf4fdd7f9347bb0128c6cca6fcf4e5"
|
|
2066
2071
|
},
|
|
2067
2072
|
{
|
|
2068
2073
|
"path": "docs/adr/README.md",
|
|
2069
2074
|
"mode": "0000644",
|
|
2070
|
-
"sha256": "
|
|
2075
|
+
"sha256": "a6bf1805ee02ca941a1910d722cfc61e4f0e519aa79c9d102aadfb8bf7d95a5a"
|
|
2071
2076
|
},
|
|
2072
2077
|
{
|
|
2073
2078
|
"path": "docs/api-reference.md",
|
|
2074
2079
|
"mode": "0000644",
|
|
2075
|
-
"sha256": "
|
|
2080
|
+
"sha256": "dfc37d531b880bc87d6d4e1b09eae50ef3e0301781ed84923304bc77b878b9b9"
|
|
2076
2081
|
},
|
|
2077
2082
|
{
|
|
2078
2083
|
"path": "docs/api/openapi.json",
|
|
2079
2084
|
"mode": "0000644",
|
|
2080
|
-
"sha256": "
|
|
2085
|
+
"sha256": "8ab5797e6b515965da750890ab78ae16d61326d19a26751a0dde3bc2f72b6797"
|
|
2081
2086
|
},
|
|
2082
2087
|
{
|
|
2083
2088
|
"path": "docs/architecture.md",
|
|
@@ -2102,12 +2107,12 @@
|
|
|
2102
2107
|
{
|
|
2103
2108
|
"path": "docs/copy-inventory.md",
|
|
2104
2109
|
"mode": "0000644",
|
|
2105
|
-
"sha256": "
|
|
2110
|
+
"sha256": "cadfe92b87eaf4f2bb952debc703c53b833fd83badbefcce40e7203a0d150c95"
|
|
2106
2111
|
},
|
|
2107
2112
|
{
|
|
2108
2113
|
"path": "docs/copy-registry.json",
|
|
2109
2114
|
"mode": "0000644",
|
|
2110
|
-
"sha256": "
|
|
2115
|
+
"sha256": "f6571a42a27d5cfeef058d06937fc669a31da076bc26972c5e29a8fa1d156b5d"
|
|
2111
2116
|
},
|
|
2112
2117
|
{
|
|
2113
2118
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2637,7 +2642,7 @@
|
|
|
2637
2642
|
{
|
|
2638
2643
|
"path": "docs/module-api-changelog.md",
|
|
2639
2644
|
"mode": "0000644",
|
|
2640
|
-
"sha256": "
|
|
2645
|
+
"sha256": "1dfb3933a3ce48499941b71978e9f462fe97c49e7d472b71022b654850093e3b"
|
|
2641
2646
|
},
|
|
2642
2647
|
{
|
|
2643
2648
|
"path": "docs/modules-contract.md",
|
|
@@ -2857,7 +2862,7 @@
|
|
|
2857
2862
|
{
|
|
2858
2863
|
"path": "docs/recipes/self-host.md",
|
|
2859
2864
|
"mode": "0000644",
|
|
2860
|
-
"sha256": "
|
|
2865
|
+
"sha256": "2a8a4075086fbcc2815c7b809f38dd887726e53561755e65a7990a687772cf7c"
|
|
2861
2866
|
},
|
|
2862
2867
|
{
|
|
2863
2868
|
"path": "docs/recipes/server-bring-up.md",
|
|
@@ -4917,17 +4922,17 @@
|
|
|
4917
4922
|
{
|
|
4918
4923
|
"path": "modules/hall-ui/public/ideas.css",
|
|
4919
4924
|
"mode": "0000644",
|
|
4920
|
-
"sha256": "
|
|
4925
|
+
"sha256": "57a41781c81b02cbac7b30a0a13f50f4a913e55f348d84cfc4244a99372932c2"
|
|
4921
4926
|
},
|
|
4922
4927
|
{
|
|
4923
4928
|
"path": "modules/hall-ui/public/ideas.html",
|
|
4924
4929
|
"mode": "0000644",
|
|
4925
|
-
"sha256": "
|
|
4930
|
+
"sha256": "c59e5f293b4dcabd01e2cd17c983b42184bb17468654888f4adf2243a506623b"
|
|
4926
4931
|
},
|
|
4927
4932
|
{
|
|
4928
4933
|
"path": "modules/hall-ui/public/ideas.js",
|
|
4929
4934
|
"mode": "0000644",
|
|
4930
|
-
"sha256": "
|
|
4935
|
+
"sha256": "54fa21caf9ab7173952e9b84d60e6334743f749044c8b226cd21277f7dec574e"
|
|
4931
4936
|
},
|
|
4932
4937
|
{
|
|
4933
4938
|
"path": "modules/hall-ui/public/ideas.states.json",
|
|
@@ -5344,6 +5349,11 @@
|
|
|
5344
5349
|
"mode": "0000644",
|
|
5345
5350
|
"sha256": "ff6c0346215d1b88309c4c9360cd60c59299b21b45e27cce09c4b748bf3411e1"
|
|
5346
5351
|
},
|
|
5352
|
+
{
|
|
5353
|
+
"path": "modules/ideas/landing-preview.js",
|
|
5354
|
+
"mode": "0000644",
|
|
5355
|
+
"sha256": "912c7007c534a198adce9c83a56e39da8a1475bfe5b09b2a6fe1ff8914d775c9"
|
|
5356
|
+
},
|
|
5347
5357
|
{
|
|
5348
5358
|
"path": "modules/ideas/migrations/ideas_001_grades.sql",
|
|
5349
5359
|
"mode": "0000644",
|
|
@@ -5397,7 +5407,7 @@
|
|
|
5397
5407
|
{
|
|
5398
5408
|
"path": "modules/ideas/routes/inbox.js",
|
|
5399
5409
|
"mode": "0000644",
|
|
5400
|
-
"sha256": "
|
|
5410
|
+
"sha256": "5ec576c26e46c8a27cd3b40d400abd177f4bdf1f2124e286a294fa58a809489a"
|
|
5401
5411
|
},
|
|
5402
5412
|
{
|
|
5403
5413
|
"path": "modules/ideas/routing.js",
|
|
@@ -7787,12 +7797,12 @@
|
|
|
7787
7797
|
{
|
|
7788
7798
|
"path": "package-lock.json",
|
|
7789
7799
|
"mode": "0000644",
|
|
7790
|
-
"sha256": "
|
|
7800
|
+
"sha256": "d424dadd5439bf9883d9e0e44a938ed30a2e5c63f4dd1ed336e6130dbef959e6"
|
|
7791
7801
|
},
|
|
7792
7802
|
{
|
|
7793
7803
|
"path": "package.json",
|
|
7794
7804
|
"mode": "0000644",
|
|
7795
|
-
"sha256": "
|
|
7805
|
+
"sha256": "ffdc1c047d136b67d5443336e8c8874b9cf7c13868a908a486470ffdcc780f3c"
|
|
7796
7806
|
},
|
|
7797
7807
|
{
|
|
7798
7808
|
"path": "public-docs/index.html",
|
|
@@ -7884,6 +7894,11 @@
|
|
|
7884
7894
|
"mode": "0000644",
|
|
7885
7895
|
"sha256": "7a639c73f8d2f4f523899ab737641174ca7b5ed5409427238d7fc397cdba65ed"
|
|
7886
7896
|
},
|
|
7897
|
+
{
|
|
7898
|
+
"path": "scripts/gds/api-alias-caller-scan.js",
|
|
7899
|
+
"mode": "0000644",
|
|
7900
|
+
"sha256": "bdb23756d2dcf4f9a3f22a8c64151f70aee5c62b82601672f5e8fb6adbc367ed"
|
|
7901
|
+
},
|
|
7887
7902
|
{
|
|
7888
7903
|
"path": "scripts/gds/api.js",
|
|
7889
7904
|
"mode": "0000644",
|
|
@@ -8367,7 +8382,7 @@
|
|
|
8367
8382
|
{
|
|
8368
8383
|
"path": "scripts/gds/fitness-ratchets.js",
|
|
8369
8384
|
"mode": "0000644",
|
|
8370
|
-
"sha256": "
|
|
8385
|
+
"sha256": "ab08226e81589231f0704c304a1abcd0f25c24ff48dc1cd0ecc7b3d088536055"
|
|
8371
8386
|
},
|
|
8372
8387
|
{
|
|
8373
8388
|
"path": "scripts/gds/fitness.js",
|
|
@@ -8742,7 +8757,7 @@
|
|
|
8742
8757
|
{
|
|
8743
8758
|
"path": "scripts/gds/provision-net.js",
|
|
8744
8759
|
"mode": "0000644",
|
|
8745
|
-
"sha256": "
|
|
8760
|
+
"sha256": "734ae6982953f2474d424bf16789adfb709b5657ce62014df5c29a791506a988"
|
|
8746
8761
|
},
|
|
8747
8762
|
{
|
|
8748
8763
|
"path": "scripts/gds/provision-process.js",
|
|
@@ -8772,7 +8787,7 @@
|
|
|
8772
8787
|
{
|
|
8773
8788
|
"path": "scripts/gds/provision.js",
|
|
8774
8789
|
"mode": "0000644",
|
|
8775
|
-
"sha256": "
|
|
8790
|
+
"sha256": "8722cf581fac65b5839f2b44987c9b09b721452d8f20d2079f2029b386841396"
|
|
8776
8791
|
},
|
|
8777
8792
|
{
|
|
8778
8793
|
"path": "scripts/gds/publish-credential-check.js",
|
|
@@ -9387,7 +9402,7 @@
|
|
|
9387
9402
|
{
|
|
9388
9403
|
"path": "scripts/hall-preview/server.js",
|
|
9389
9404
|
"mode": "0000644",
|
|
9390
|
-
"sha256": "
|
|
9405
|
+
"sha256": "f66f32220b4090f4dd29e0446ac4c2b68e8ac8dbf46a0f64487cadc68fc1a1b1"
|
|
9391
9406
|
},
|
|
9392
9407
|
{
|
|
9393
9408
|
"path": "scripts/hall-preview/task-visual.js",
|
|
@@ -9597,7 +9612,7 @@
|
|
|
9597
9612
|
{
|
|
9598
9613
|
"path": "src/bongos/module-scope-map.js",
|
|
9599
9614
|
"mode": "0000644",
|
|
9600
|
-
"sha256": "
|
|
9615
|
+
"sha256": "b82d3257c27689e53b3d491251cc46d474c8f4da944e2e8f73242525df878484"
|
|
9601
9616
|
},
|
|
9602
9617
|
{
|
|
9603
9618
|
"path": "src/bongos/module-submissions.js",
|
|
@@ -9787,7 +9802,7 @@
|
|
|
9787
9802
|
{
|
|
9788
9803
|
"path": "src/module-api.js",
|
|
9789
9804
|
"mode": "0000644",
|
|
9790
|
-
"sha256": "
|
|
9805
|
+
"sha256": "b0f164fe792662f67fe4184880ea2197ae4b22bec2696fdcb1693778caf44999"
|
|
9791
9806
|
},
|
|
9792
9807
|
{
|
|
9793
9808
|
"path": "src/module-loader/catalog.js",
|
|
@@ -9979,6 +9994,11 @@
|
|
|
9979
9994
|
"mode": "0000644",
|
|
9980
9995
|
"sha256": "f4c30504e6240d68774e8960d031888616074d90e60e0edb5adddec2c820ac75"
|
|
9981
9996
|
},
|
|
9997
|
+
{
|
|
9998
|
+
"path": "tests/api_alias_caller_ratchet.mjs",
|
|
9999
|
+
"mode": "0000644",
|
|
10000
|
+
"sha256": "58e78fbcfada9df14fee87c526d225bdcc0e6f65a5e9085a4b6ea382a8041eb2"
|
|
10001
|
+
},
|
|
9982
10002
|
{
|
|
9983
10003
|
"path": "tests/api_alias_exceptions.mjs",
|
|
9984
10004
|
"mode": "0000644",
|
|
@@ -11854,6 +11874,11 @@
|
|
|
11854
11874
|
"mode": "0000644",
|
|
11855
11875
|
"sha256": "d7dd04f3e4678295ddf89897ab360f1931794228de3ce5ee8a3dd86e9385cbc9"
|
|
11856
11876
|
},
|
|
11877
|
+
{
|
|
11878
|
+
"path": "tests/idea_landing_preview.mjs",
|
|
11879
|
+
"mode": "0000644",
|
|
11880
|
+
"sha256": "ba21a652edd95d5e1a88f9c5b48d27e68610e4d89508efcd343a063c6d8c3169"
|
|
11881
|
+
},
|
|
11857
11882
|
{
|
|
11858
11883
|
"path": "tests/idea_quick_guard.mjs",
|
|
11859
11884
|
"mode": "0000644",
|
|
@@ -11882,7 +11907,7 @@
|
|
|
11882
11907
|
{
|
|
11883
11908
|
"path": "tests/idea_spark_hall.mjs",
|
|
11884
11909
|
"mode": "0000644",
|
|
11885
|
-
"sha256": "
|
|
11910
|
+
"sha256": "997437b9259fdbc0583080dee18026be40c0369809b26de0b918b9c0f034bb2d"
|
|
11886
11911
|
},
|
|
11887
11912
|
{
|
|
11888
11913
|
"path": "tests/idea_spark_mark.mjs",
|
|
@@ -12277,7 +12302,7 @@
|
|
|
12277
12302
|
{
|
|
12278
12303
|
"path": "tests/module-scope-map.mjs",
|
|
12279
12304
|
"mode": "0000644",
|
|
12280
|
-
"sha256": "
|
|
12305
|
+
"sha256": "fae747eaeea8e9d657de097a72e5f8d244bd2ece6c7e890ff4c9756787721bc5"
|
|
12281
12306
|
},
|
|
12282
12307
|
{
|
|
12283
12308
|
"path": "tests/module_api.mjs",
|
|
@@ -12762,7 +12787,7 @@
|
|
|
12762
12787
|
{
|
|
12763
12788
|
"path": "tests/provision_caddy_wiring.mjs",
|
|
12764
12789
|
"mode": "0000644",
|
|
12765
|
-
"sha256": "
|
|
12790
|
+
"sha256": "2eb850e431c5355d2645eec48554c686ad5b57222ee863489a29b78d945b7a26"
|
|
12766
12791
|
},
|
|
12767
12792
|
{
|
|
12768
12793
|
"path": "tests/provision_disconnect.mjs",
|
|
@@ -12947,7 +12972,7 @@
|
|
|
12947
12972
|
{
|
|
12948
12973
|
"path": "tests/quarantine_canonical.mjs",
|
|
12949
12974
|
"mode": "0000644",
|
|
12950
|
-
"sha256": "
|
|
12975
|
+
"sha256": "672096eb5917d45b1c77e1d07c4b7a6613a0714eb4b38327057fcea11a41b7ad"
|
|
12951
12976
|
},
|
|
12952
12977
|
{
|
|
12953
12978
|
"path": "tests/rank_floor_wiring.mjs",
|
|
@@ -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
|
+
- 401 operations across 60 resource groups
|
|
9
9
|
|
|
10
10
|
## Use it from your project
|
|
11
11
|
|
|
@@ -521,6 +521,8 @@ function createClient(opts = {}) {
|
|
|
521
521
|
getInboxAwaitingNod: (args) => request("GET", "/inbox/awaiting-nod", { hasBody: false }, args),
|
|
522
522
|
// GET /inbox/by-builder/{id} — rank: any-builder — GET /inbox/by-builder/:id
|
|
523
523
|
getInboxByBuilderId: (args) => request("GET", "/inbox/by-builder/{id}", { hasBody: false }, args),
|
|
524
|
+
// POST /inbox/preview-landing — rank: any-builder — POST /inbox/preview-landing
|
|
525
|
+
postInboxPreviewLanding: (args) => request("POST", "/inbox/preview-landing", { hasBody: true }, args),
|
|
524
526
|
// GET /inbox/rotting — rank: any-builder — GET /inbox/rotting
|
|
525
527
|
getInboxRotting: (args) => request("GET", "/inbox/rotting", { hasBody: false }, args),
|
|
526
528
|
// POST /inbox/score — rank: any-builder — POST /inbox/score
|
|
@@ -520,6 +520,8 @@ function createClient(opts = {}) {
|
|
|
520
520
|
getInboxAwaitingNod: (args) => request("GET", "/inbox/awaiting-nod", { hasBody: false }, args),
|
|
521
521
|
// GET /inbox/by-builder/{id} — rank: any-builder — GET /inbox/by-builder/:id
|
|
522
522
|
getInboxByBuilderId: (args) => request("GET", "/inbox/by-builder/{id}", { hasBody: false }, args),
|
|
523
|
+
// POST /inbox/preview-landing — rank: any-builder — POST /inbox/preview-landing
|
|
524
|
+
postInboxPreviewLanding: (args) => request("POST", "/inbox/preview-landing", { hasBody: true }, args),
|
|
523
525
|
// GET /inbox/rotting — rank: any-builder — GET /inbox/rotting
|
|
524
526
|
getInboxRotting: (args) => request("GET", "/inbox/rotting", { hasBody: false }, args),
|
|
525
527
|
// POST /inbox/score — rank: any-builder — POST /inbox/score
|
|
@@ -325,6 +325,7 @@ export interface PostInboxIdDevelopRequest { field_values: Record<string, unknow
|
|
|
325
325
|
export interface PostInboxIdRatifyRequest { notes_md?: string }
|
|
326
326
|
export interface PostInboxIdResubmitRequest { field_values: Record<string, unknown>; template_key?: string }
|
|
327
327
|
export interface PostInboxIdSparkResponse { idea: unknown; sparked: boolean; unchanged: boolean }
|
|
328
|
+
export interface PostInboxPreviewLandingRequest { goal_id?: number; kind?: string; grade?: string }
|
|
328
329
|
export interface PostInboxRequest { title: string; body_md?: string; kind?: string; suggested_version?: string; suggested_priority?: number; goal_id?: number; grade?: string; template_key?: string; field_values?: Record<string, unknown> }
|
|
329
330
|
export interface PostInboxScoreRequest { field_values: Record<string, unknown>; template_key?: string }
|
|
330
331
|
export interface PostInboxScoreResponse { score: unknown; fields: unknown; template_key: unknown }
|
|
@@ -893,6 +894,8 @@ export interface BongosClient {
|
|
|
893
894
|
getInboxAwaitingNod(args?: RequestArgs): Promise<GetInboxAwaitingNodResponse>;
|
|
894
895
|
/** GET /inbox/by-builder/{id} — rank: any-builder */
|
|
895
896
|
getInboxByBuilderId(args?: RequestArgs): Promise<GetInboxByBuilderIdResponse>;
|
|
897
|
+
/** POST /inbox/preview-landing — rank: any-builder */
|
|
898
|
+
postInboxPreviewLanding(args?: RequestArgs & { body?: PostInboxPreviewLandingRequest }): Promise<ApiResponse>;
|
|
896
899
|
/** GET /inbox/rotting — rank: any-builder */
|
|
897
900
|
getInboxRotting(args?: RequestArgs): Promise<GetInboxRottingResponse>;
|
|
898
901
|
/** POST /inbox/score — rank: any-builder */
|
|
@@ -517,6 +517,8 @@ export function createClient(opts = {}) {
|
|
|
517
517
|
getInboxAwaitingNod: (args) => request("GET", "/inbox/awaiting-nod", { hasBody: false }, args),
|
|
518
518
|
// GET /inbox/by-builder/{id} — rank: any-builder — GET /inbox/by-builder/:id
|
|
519
519
|
getInboxByBuilderId: (args) => request("GET", "/inbox/by-builder/{id}", { hasBody: false }, args),
|
|
520
|
+
// POST /inbox/preview-landing — rank: any-builder — POST /inbox/preview-landing
|
|
521
|
+
postInboxPreviewLanding: (args) => request("POST", "/inbox/preview-landing", { hasBody: true }, args),
|
|
520
522
|
// GET /inbox/rotting — rank: any-builder — GET /inbox/rotting
|
|
521
523
|
getInboxRotting: (args) => request("GET", "/inbox/rotting", { hasBody: false }, args),
|
|
522
524
|
// POST /inbox/score — rank: any-builder — POST /inbox/score
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ADR 0314 — A module owns a protected path without the whole module becoming protected
|
|
2
2
|
|
|
3
|
-
- **Status:** accepted
|
|
3
|
+
- **Status:** accepted — **implemented** by [task 1004109](https://cloudbongos.com/builders#/task/1004109) (2026-09-20)
|
|
4
4
|
- **Date:** 2026-09-20
|
|
5
5
|
- **Task:** [task 1004070](https://cloudbongos.com/builders#/task/1004070), goal 1000095 — BONGOS-V2
|
|
6
6
|
- **From:** idea 1000689; owner decision 2026-09-19 — *option 1, narrow what counts as protected*
|
|
@@ -105,7 +105,12 @@ Three reasons this is the honest shape rather than the convenient one:
|
|
|
105
105
|
Per the task: an ADR first, implementation as a follow-up. This decision builds no
|
|
106
106
|
new derivation mechanism. Filed separately:
|
|
107
107
|
|
|
108
|
-
- The implementation of the per-path goal-scope wall
|
|
108
|
+
- ~~The implementation of the per-path goal-scope wall.~~ **Landed** in
|
|
109
|
+
[task 1004109](https://cloudbongos.com/builders#/task/1004109): `isProtected` now
|
|
110
|
+
filters a module's protecting globs to those that are not CLI entrypoints (a
|
|
111
|
+
structural path test — directories under `scripts/` are territory and still
|
|
112
|
+
protect), narrowing the derived set from twelve to the nine predicted below.
|
|
113
|
+
Nothing was unprotected to achieve it and the path wall did not move.
|
|
109
114
|
- **`builder-settings`, deliberately out of scope.** Its overlap is
|
|
110
115
|
`src/bongos/routes/me.js` caught by the blanket `src/bongos/routes/` prefix, so
|
|
111
116
|
narrowing it means either finishing the strangler move of `me.js` into
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# ADR 0315 — A plane with no proxy is refused, not given a no-op ingress
|
|
2
|
+
|
|
3
|
+
**Status:** accepted · **Date:** 2026-09-20 · **Task:** [task 1004017](https://cloudbongos.com/builders#/task/1004017) (goal 1000106 — BONGOS-V2)
|
|
4
|
+
|
|
5
|
+
**Related:** [ADR 0303](0303-provisioning-verifies-the-base-caddyfile-and-never-edits-it.md) (detect-and-refuse on the base Caddyfile — the check this one sits in front of) · [ADR 0306](0306-instance-supervision-is-a-seam-with-systemd-as-the-default.md) (the supervision seam that explicitly deferred Caddy reload to this task) · [ADR 0285](0285-a-shared-box-holds-about-twelve-projects-per-gb-and-memory-is-the-wall.md) (the capacity preflight this one is ordered behind) · [ADR 0111](0111-instance-hosting-provisioning-module.md) (the standup runbook both checks live inside)
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Provisioning step 6 writes a per-instance `<slug>.caddy` snippet and runs
|
|
10
|
+
`systemctl reload caddy`. The self-host image installs `postgresql-client bash tini curl
|
|
11
|
+
ca-certificates git`, runs `USER node`, and ships no proxy of any kind — so on a compose
|
|
12
|
+
self-host that step cannot work, and a child instance provisioned there has no front door.
|
|
13
|
+
|
|
14
|
+
ADR 0306 named this explicitly as the piece its seam does not cover: *"`systemctl reload
|
|
15
|
+
caddy` is shared-proxy config, governed by ADR 0303, and the container has no Caddy at
|
|
16
|
+
all — that is task 1004017, not this seam."*
|
|
17
|
+
|
|
18
|
+
**Two failure shapes, and only one of them was visible.** ADR 0303's preflight is gated on
|
|
19
|
+
`inst.domain`, so:
|
|
20
|
+
|
|
21
|
+
- A **domained** child already half-refused — `caddy adapt` fails with no binary, which
|
|
22
|
+
ADR 0303's own `catch` turns into a gap string. But the message told the operator to add
|
|
23
|
+
a directive to `/etc/caddy/Caddyfile`: a file the container does not have and that
|
|
24
|
+
provisioning will never create (ADR 0303 §1 forbids writing it).
|
|
25
|
+
- A **domainless** child skipped the preflight entirely, walked to step 6, and died on
|
|
26
|
+
`boxWriteFile('/etc/caddy/sites/<slug>.caddy', …, {sudo: true})`. That throw is uncaught,
|
|
27
|
+
so it bypasses the `{ok:false}` pending-retry path and hard-errors the instance on attempt
|
|
28
|
+
one. The runner recorded a crash where the honest answer was a refusal.
|
|
29
|
+
|
|
30
|
+
## Decision
|
|
31
|
+
|
|
32
|
+
**A plane with no reverse proxy is refused before anything is attempted, and the refusal
|
|
33
|
+
names what the plane lacks.**
|
|
34
|
+
|
|
35
|
+
`ingressPlaneGap(exec)` in `scripts/gds/provision-net.js` probes the plane with
|
|
36
|
+
`caddy version` — one cheap, unprivileged, read-only command, the same posture as
|
|
37
|
+
`checkCaddyWiring`'s `caddy adapt`. It returns `null` when a proxy answers, or a string
|
|
38
|
+
naming the missing proxy. Both standup legs (`provisionInstance` step 6's owner, and
|
|
39
|
+
`domainAttachInstance`) call it and return `{ok:false, error: 'Ingress preflight failed: …'}`.
|
|
40
|
+
|
|
41
|
+
**It is deliberately NOT domain-gated.** That is the whole point: the domainless child is
|
|
42
|
+
the one ADR 0303 could not see.
|
|
43
|
+
|
|
44
|
+
**A missing binary is the only failure that proves there is no proxy.** Under remote exec
|
|
45
|
+
`boxExec` is `ssh <host> bash -s`, so a briefly-unreachable co-hosting box throws here too —
|
|
46
|
+
and answering that with "this plane has no reverse proxy, provision from a host that runs
|
|
47
|
+
Caddy" would be a confident wrong diagnosis, burning the intent's retry budget on a network
|
|
48
|
+
blip. Exit 127 (and the `command not found` / `is not recognized` wordings) is read as proof;
|
|
49
|
+
anything else returns *"could not confirm a reverse proxy on this plane"* with the real cause
|
|
50
|
+
leading. ssh reports its own failures as 255 and otherwise propagates the remote command's
|
|
51
|
+
status, so 127 still means "no caddy" across the hop.
|
|
52
|
+
|
|
53
|
+
**The three refusals are ordered capacity → ingress → wiring**, cheapest and most
|
|
54
|
+
fundamental first, and all three return before anything on the box changes:
|
|
55
|
+
|
|
56
|
+
1. `capacityPreflight` measures locally (ADR 0285 promises a full box is measured first and
|
|
57
|
+
refuses before anything else runs);
|
|
58
|
+
2. ingress asks whether this plane has a proxy **at all**;
|
|
59
|
+
3. ADR 0303 then asks whether that proxy is wired for **this domain**.
|
|
60
|
+
|
|
61
|
+
Asking 0303 first is what produced the "edit a Caddyfile you do not have" answer, so this
|
|
62
|
+
ADR moves 0303's preflight behind the capacity measurement to make room. Both still refuse
|
|
63
|
+
before any mutation, so neither guarantee is weakened — only the precedence between two
|
|
64
|
+
refusals changes.
|
|
65
|
+
|
|
66
|
+
**No ingress seam, and no no-op backend.** The obvious symmetry with ADR 0306 would be a
|
|
67
|
+
`resolveIngress()` registry with a `none` implementation whose `writeSite`/`reload` are
|
|
68
|
+
no-ops. That is rejected: a no-op backend lets the standup **succeed** while leaving the
|
|
69
|
+
child unreachable, which is neither "reachable at a documented address" nor "refuses with a
|
|
70
|
+
clear error" — it is the silently-broken instance this task exists to prevent. ADR 0306's
|
|
71
|
+
seam exists because two real planes both need supervising; here the second plane cannot
|
|
72
|
+
serve a child at all, and the honest encoding of that is a refusal, not an implementation.
|
|
73
|
+
|
|
74
|
+
## Consequences
|
|
75
|
+
|
|
76
|
+
- **A compose self-host still cannot provision a child instance — it now says so.** This
|
|
77
|
+
closes the failure mode, not the capability. Giving the container a real front door
|
|
78
|
+
(a published port, a bundled proxy, an explicit localhost-only shape) remains unbuilt, and
|
|
79
|
+
a future ADR that adds one replaces this refusal rather than extending it.
|
|
80
|
+
|
|
81
|
+
- **One extra `caddy version` per applied standup.** Read-only, unprivileged, and it runs
|
|
82
|
+
after the capacity measurement, so a full box still refuses without it. A dry run never
|
|
83
|
+
probes, and a dedicated droplet is skipped — Caddy comes from cloud-init there.
|
|
84
|
+
|
|
85
|
+
- **ADR 0303's territory is untouched.** "Caddy is here but mis-wired" is still its question
|
|
86
|
+
and still its message; this ADR only answers the prior one. Every command string ADR 0303
|
|
87
|
+
pins in `tests/provision_caddy_wiring.mjs`, `tests/provision.mjs` and
|
|
88
|
+
`tests/provision_teardown_address.mjs` is unchanged.
|
|
89
|
+
|
|
90
|
+
- **Teardown is not covered.** `provision-teardown.js` removes the snippet and reloads with
|
|
91
|
+
`allowFail: true`, so it already degrades rather than crashing. Left alone deliberately: a
|
|
92
|
+
refusal on the teardown path would strand a row instead of cleaning it.
|
|
93
|
+
|
|
94
|
+
- **The probe is a capability question, not a configuration knob.** There is no
|
|
95
|
+
`PROVISION_INGRESS` env var. A plane either answers `caddy version` or it does not, and an
|
|
96
|
+
operator who wants provisioning to proceed needs a proxy, not a flag that says to pretend.
|
package/docs/adr/README.md
CHANGED
|
@@ -406,3 +406,4 @@ This keeps the decision history honest and traceable.
|
|
|
406
406
|
| 0312 | [**Provenance is a SECOND ideas-owned edge table, written by the seams that already know** ([task 1004080](https://cloudbongos.com/builders#/task/1004080), goal 1000095 — BONGOS-V2). The spike [ADR 0311](0311-an-idea-is-a-permanent-origin-tag.md) deferred: how the descent edges are physically recorded. A descent (`idea → task → rewrite → split → removal`) is four levels deep and crosses a version boundary, and the task hierarchy refuses both — `attachParent` enforces `SELF_PARENT`, `VERSION_MISMATCH`, `PARENT_HAS_PARENT` and `TARGET_HAS_CHILDREN`, all load-bearing for ship rollup and claim safety. The spike was told to CONFIRM `ideas_task_lineage` rather than assume it, and confirmed one half while refuting the other: the table is right as the **idea→task anchor** (bipartite, no depth cap, no version predicate) but CANNOT carry the task→task edge, because a derivation is a property of the task PAIR and [ADR 0236](0236-many-ideas-one-task-the-lineage-key-is-the-pair.md) made co-source ideas both legal and common — a `derived_from_task_id` column would write the same derivation once per co-source idea and let two rows disagree about where a task came from, the same under-keying that silently lost attribution on prod once already. A merge also gives a task SEVERAL parents, so the relation is a **DAG, not a tree**. Decision: a new `ideas_task_descent` (`task_id`, `parent_task_id`, CHECK'd `relation`, PK on the pair, indexed both ways), with NO depth cap and NO version predicate, and **cycles refused at write time** because the payout walks this graph and a cycle is a non-terminating walk rather than a cosmetic error. On who writes it — the question the task actually set, since an edge depending on memory will have holes — **three seams already know and none is telling anyone**: `cascade.js` encodes the originating task id inside `source_ref` as a STRING nothing can join on, `tasks.merged_into_task_id` already records the fold, and `parent_task_id` already records the split. Only `rewrite` and cross-version `merge` stay manual, which is honest — they are editorial acts with no automatic signal, and their absence degrades the picture rather than corrupting it. What it fixes: `sourceIdeaForTask` and `awardIdeaTaskShipCredit` are both one-hop `LIMIT 1` point reads, so a DERIVED task resolves to `no_source_idea` and the origin is not paid at all. Does not decide: the decay rate beyond its default, what counts as removed ([ADR 0313](0313-a-removal-is-proposed-by-the-ship-and-confirmed-by-a-person.md)), or how any of it is drawn.](0312-provenance-is-a-second-ideas-owned-edge-table.md) | ideas / lifecycle |
|
|
407
407
|
| 0313 | [**A removal is derived from the SERVER's own merge diff and confirmed by a person** ([task 1004081](https://cloudbongos.com/builders#/task/1004081), goal 1000095 — BONGOS-V2). The other half [ADR 0311](0311-an-idea-is-a-permanent-origin-tag.md) deferred: what counts as removed, so that brightness can fall at all. Nothing records it today — `shipped` is terminal (`rot.js` says so outright) and `merged_into_task_id` is CHECK'd to `abandoned` rows, describing only work cut BEFORE it landed. Owner decision 13 set the shape (system proposes, person confirms); this settles the detail, and corrects two premises the task was written on. **`cascade.js` is no longer empty** — it carries a production rule and [ADR 0242](0242-a-cascade-is-a-declaration-table-on-the-event-that-already-exists.md) fixed the contract (append an entry, never touch the runner), so there is a precedent to copy including its anti-recursion guard. **`netNegativeBonusAmount` cannot be the trigger** despite being the named nearest signal: it is an aggregate with NO TARGET (it says deletion happened, never what or whose), it is CLIENT-SUPPLIED via `signals.diff_stats`, and `grader-score.js` already documents the forgery it defends against — and brightness sits beside a payout, so a forgeable target-less counter cannot carry it. **Nothing durable records what any ship touched**: `committed_files` and `diff_stats` are client-supplied at grade time and never persisted, `touches[]` is advisory ([ADR 0049](0049-split-parallel-safety-contract.md)), so a removal cannot be reconstructed from history — only derived as a ship lands. Decision: derive it from the SERVER's own merge diff ([ADR 0055](0055-server-mediated-branch-publish.md) — the server holds the repo and does the merge, so it computes the diff rather than being told one), and attribute the deleted hunks through **`claims.published_head_sha`** (`migrations/171`), NOT by parsing `(task NNNN)` out of commit text — only 7 of `main`'s last 15 commits carry a task id, and a convention that holds most of the time cannot underwrite a payout. An UNATTRIBUTABLE deletion files nothing: a wrong proposal costs attention and dims a real star. A rename, a move and a rewrite-in-place are NOT removals, and a cold body is not a remnant — removal applies only below a task that actually shipped. The proposal is an appended `CASCADES` entry filing a QUESTION; confirmation is Metic+/`task.promote` on the existing awaiting-nod surface; an unanswered one rots on the normal clock. Only a CONFIRMED proposal dims a star. The derivation must be NON-BLOCKING — landing work matters more than dimming a star on time. Brightness can only fall forward from here, so historical sizes need a marker or the number lies.](0313-a-removal-is-proposed-by-the-ship-and-confirmed-by-a-person.md) | ideas / lifecycle |
|
|
408
408
|
| 0314 | [**A module owns a protected path without the whole module becoming protected** ([task 1004070](https://cloudbongos.com/builders#/task/1004070), goal 1000095 — BONGOS-V2). Three modules derive `protected` — and so are Archon-only to scope a goal to — because of ONE file that is not their domain: `onboarding` on `scripts/gds/setup.js`, `autonomy` on `scripts/gds/conductor-dispatch.js`, `copy-desk` on `scripts/gds/copy-inventory.js`. The owner chose *narrow what counts as protected*; the task set the fork and required the choice be justified before any glob moved. **Deleting the glob is out**: `MODULE_GLOBS` is also the territory deciding who may AUTHOR a task on a path, and the shared floor is only `tests/`, so an unowned path is authorable by no goal at all. That left reassigning each CLI to an already-protected module — **measured, not reasoned about**, by applying the edit to the source and re-requiring in a fresh process (`MODULE_SCOPE_MAP` is frozen and built from a COPY of `MODULE_GLOBS` at load, so an in-process mutation proves nothing and passes green). The measurement kills it: `copy-desk` and `autonomy` lose the ability to author on their own generator and their own conductor, and — the row that decides it — `devsecops` as the new owner **cannot author the generator together with the two artifacts it writes**, because `docs/copy-registry.json` and `docs/copy-inventory.md` stay `copy-desk`'s. So *change a UI string, regenerate the registry* becomes authorable by no single goal, and that is the ship-check freshness gate every UI task hits. Decision: **protection becomes per-path at the goal-scope wall, as it already is at the other three** — `matchProtected` decides task-authoring, the grader and gate decide ship, the post-push audit decides the dishonest case; only goal-creation asked about the MODULE, and that inconsistency is the whole defect. The derivation stays computed from `PROTECTED_GLOBS` and no flag is hand-set ([ADR 0086](0086-goal-scoped-work-hierarchy.md) §7 / SEC #863), and the Metic floor on those paths does not move. **Corrects the task's own numbers**: 12 of 26 modules derive protected, not 11, and `agents` (protected by `modules/agents/`, itself a protected glob) is absent from its list of seven — which is why the one thing this ADR SHIPS is a test pinning the full protected key set **by name**, a count assertion passing on the wrong twelve being exactly how that drifted. Implementation is deferred to task 1004109, per the task's own instruction to stop after the ADR. Also filed: `builder-settings` (task 1004110), whose overlap rides the blanket `src/bongos/routes/` prefix and so needs either the `me.js` strangler move or its own security ADR; and **nine protected paths owned by no module at all** (task 1004111) — the freshness generators, the merge-driver pair and `cli-lib.js` among them — found while checking whether deletion was viable, a pre-existing hole rather than one this opens. Does not decide: the floor a protected path carries, whether `scripts/gds/` deserves a shared-floor entry the way `tests/` has one, or how the nine unowned paths get a home.](0314-module-protection-is-per-path-not-per-module.md) | modules / permissions |
|
|
409
|
+
| 0315 | [**A plane with no proxy is refused, not given a no-op ingress** ([task 1004017](https://cloudbongos.com/builders#/task/1004017), goal 1000106 — BONGOS-V2). The piece [ADR 0306](0306-instance-supervision-is-a-seam-with-systemd-as-the-default.md) explicitly deferred: the self-host image ships no proxy, so provisioning step 6's `<slug>.caddy` snippet write and `systemctl reload caddy` cannot work there and a child instance gets no front door. **Two failure shapes, only one visible**: a DOMAINED child already half-refused, because `caddy adapt` fails with no binary and [ADR 0303](0303-provisioning-verifies-the-base-caddyfile-and-never-edits-it.md)'s own catch turns that into a gap — but the message told the operator to add a directive to `/etc/caddy/Caddyfile`, a file the container does not have and that ADR 0303 §1 forbids provisioning from creating; a DOMAINLESS child skipped that preflight entirely (it is gated on `inst.domain`), reached step 6 and died on the `sudo` write, an uncaught throw that bypasses the `{ok:false}` pending-retry path and hard-errors the instance on attempt one — a crash recorded where a refusal was the honest answer. Decision: `ingressPlaneGap(exec)` probes the plane with `caddy version` — one cheap unprivileged read, the same posture as `checkCaddyWiring` — and both standup legs refuse with `Ingress preflight failed: …`, deliberately NOT domain-gated, because the domainless child is the one 0303 could not see. **Only a missing binary proves there is no proxy**: under remote exec `boxExec` is `ssh <host> bash -s`, so an unreachable co-hosting box throws here too, and diagnosing a network blip as 'this plane has no proxy, provision elsewhere' would be a confident wrong answer that burns the intent's retry budget — exit 127 is read as proof, anything else answers 'could not confirm a reverse proxy on this plane' with the real cause leading. The three refusals are ordered **capacity → ingress → wiring**, cheapest and most fundamental first and all before any mutation, which moves 0303's preflight behind the ADR 0285 capacity measurement; both still refuse before anything changes, so only the precedence between two refusals moves. **No ingress seam and no no-op backend**, despite the obvious symmetry with 0306: a `none` implementation whose `writeSite`/`reload` are no-ops lets the standup SUCCEED while leaving the child unreachable — neither half of the task's done-when, and exactly the silently-broken instance it exists to prevent. Does not decide: what a child's front door IS on a container plane (a published port, a bundled proxy, an explicit localhost-only shape) — a future ADR that adds one replaces this refusal rather than extending it. Teardown is left alone on purpose: it already reloads `allowFail`, and refusing there would strand a row instead of cleaning it.](0315-a-plane-with-no-proxy-is-refused-not-given-a-no-op-ingress.md) | provisioning / ingress |
|
package/docs/api/openapi.json
CHANGED
|
@@ -8476,6 +8476,48 @@
|
|
|
8476
8476
|
]
|
|
8477
8477
|
}
|
|
8478
8478
|
},
|
|
8479
|
+
"/inbox/preview-landing": {
|
|
8480
|
+
"post": {
|
|
8481
|
+
"operationId": "post_inbox_preview_landing",
|
|
8482
|
+
"tags": [
|
|
8483
|
+
"inbox"
|
|
8484
|
+
],
|
|
8485
|
+
"summary": "POST /inbox/preview-landing",
|
|
8486
|
+
"description": "POST /inbox/preview-landing — GRAVITY, MADE VISIBLE (task 1004083, BV2.R02). What pressing \"File it\" would do, without doing it. The composer draws one line from this so a filer can see which goal will catch the thought, change it, or deliberately let it float — the criterion's done-when, read literally. A DRY RUN IN THE SHAPE OF /inbox/score DIRECTLY ABOVE: same POST-with-a-body reason (the draft is the input, not an id), same \"a half-formed draft is a legal state\" contract. It differs in one way worth naming, because the file header above claims /score is pure: this one READS (the goal row, the building version). It still WRITES NOTHING — see ../landing-preview.js, which calls `currentBuildingVersionId` and deliberately never `ensureMaintenanceGoal`, so previewing a homeless bug cannot mint a goal as a side effect of typing. THE RANK AND THE VECTOR ARE NOT READ FROM THE BODY, exactly as POST /inbox refuses to read them: the rank comes off the authenticated builder and the vector is hardcoded to 'api'. A preview is only worth having if it is the same question the capture will be asked — one that answered a rank the filer does not hold would teach them a landing they cannot have. NEVER A 4xx FOR A DRAFT. Only the input SHAPE is validated; an unknown kind, an absent title, a goal that vanished all come back as `outcome: null` (\"nothing to say yet\"), because a composer redrawing on every keystroke must degrade to silence rather than to a red error under a half-typed thought. rank: any-builder — it answers only about the caller's own prospective filing, and filing itself is open to every rank.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
8487
|
+
"x-rank": "any-builder",
|
|
8488
|
+
"x-source": "modules/ideas/routes/inbox.js",
|
|
8489
|
+
"requestBody": {
|
|
8490
|
+
"required": false,
|
|
8491
|
+
"content": {
|
|
8492
|
+
"application/json": {
|
|
8493
|
+
"schema": {
|
|
8494
|
+
"$ref": "#/components/schemas/PostInboxPreviewLandingRequest"
|
|
8495
|
+
}
|
|
8496
|
+
}
|
|
8497
|
+
},
|
|
8498
|
+
"x-validated": true
|
|
8499
|
+
},
|
|
8500
|
+
"responses": {
|
|
8501
|
+
"200": {
|
|
8502
|
+
"description": "Success."
|
|
8503
|
+
},
|
|
8504
|
+
"400": {
|
|
8505
|
+
"$ref": "#/components/responses/ValidationFailed"
|
|
8506
|
+
},
|
|
8507
|
+
"401": {
|
|
8508
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
8509
|
+
},
|
|
8510
|
+
"403": {
|
|
8511
|
+
"$ref": "#/components/responses/Forbidden"
|
|
8512
|
+
}
|
|
8513
|
+
},
|
|
8514
|
+
"security": [
|
|
8515
|
+
{
|
|
8516
|
+
"builderSession": []
|
|
8517
|
+
}
|
|
8518
|
+
]
|
|
8519
|
+
}
|
|
8520
|
+
},
|
|
8479
8521
|
"/inbox/rotting": {
|
|
8480
8522
|
"get": {
|
|
8481
8523
|
"operationId": "get_inbox_rotting",
|
|
@@ -23123,6 +23165,24 @@
|
|
|
23123
23165
|
"unchanged"
|
|
23124
23166
|
]
|
|
23125
23167
|
},
|
|
23168
|
+
"PostInboxPreviewLandingRequest": {
|
|
23169
|
+
"type": "object",
|
|
23170
|
+
"properties": {
|
|
23171
|
+
"goal_id": {
|
|
23172
|
+
"type": "integer",
|
|
23173
|
+
"minimum": 1
|
|
23174
|
+
},
|
|
23175
|
+
"kind": {
|
|
23176
|
+
"type": "string",
|
|
23177
|
+
"maxLength": 64
|
|
23178
|
+
},
|
|
23179
|
+
"grade": {
|
|
23180
|
+
"type": "string",
|
|
23181
|
+
"maxLength": 16
|
|
23182
|
+
}
|
|
23183
|
+
},
|
|
23184
|
+
"additionalProperties": false
|
|
23185
|
+
},
|
|
23126
23186
|
"PostInboxRequest": {
|
|
23127
23187
|
"type": "object",
|
|
23128
23188
|
"properties": {
|
|
@@ -25361,8 +25421,8 @@
|
|
|
25361
25421
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
25362
25422
|
}
|
|
25363
25423
|
},
|
|
25364
|
-
"x-endpoint-count":
|
|
25365
|
-
"x-schema-count":
|
|
25424
|
+
"x-endpoint-count": 401,
|
|
25425
|
+
"x-schema-count": 440,
|
|
25366
25426
|
"x-undocumented-bodies": 9,
|
|
25367
25427
|
"x-response-schemas": 300,
|
|
25368
25428
|
"x-generated-by": "scripts/gds/gen-api-docs.js"
|
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. 401 endpoints across 64 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`.
|
|
@@ -337,7 +337,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
337
337
|
| GET | `/api/bongos/help-requests/for-me` | `any-builder` | — | The addressed read — C01's answer to "and fires a notification". |
|
|
338
338
|
| GET | `/api/bongos/help-requests/mine` | `any-builder` | — | your own asks, so you can settle them. |
|
|
339
339
|
|
|
340
|
-
## `inbox` (
|
|
340
|
+
## `inbox` (17)
|
|
341
341
|
|
|
342
342
|
| Method | Path | Rank | Body | Description |
|
|
343
343
|
|---|---|---|---|---|
|
|
@@ -353,6 +353,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
353
353
|
| DELETE | `/api/bongos/inbox/:id/spark` | `any-builder` | — | Withdraw the Big Idea Spark mark — the reversibility half of R144. |
|
|
354
354
|
| GET | `/api/bongos/inbox/awaiting-nod` | `metic+archon` | — | GET /inbox/awaiting-nod — the NOD QUEUE (task 1003066, BV1.R05). |
|
|
355
355
|
| GET | `/api/bongos/inbox/by-builder/:id` | `any-builder` | — | THE IDEA TRAIL: every idea one builder filed, newest first, with what became of each (task 1003281, goal 1000072, criterion legibility-ac… |
|
|
356
|
+
| POST | `/api/bongos/inbox/preview-landing` | `any-builder` | `goal_id`, `kind`, `grade` | POST /inbox/preview-landing — GRAVITY, MADE VISIBLE (task 1004083, BV2.R02). |
|
|
356
357
|
| GET | `/api/bongos/inbox/rotting` | `any-builder` | — | GET /inbox/rotting — what is quietly rotting, for this caller. |
|
|
357
358
|
| POST | `/api/bongos/inbox/score` | `any-builder` | `field_values`, `template_key` | |
|
|
358
359
|
| GET | `/api/bongos/inbox/sparks` | `any-builder` | — | GET /inbox/sparks — THE SPARK QUEUE (task 1002921 / BV1.R145, goal 1000062). |
|