@bongos/core 1.25.16 → 1.25.18

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 (93) hide show
  1. package/.bongos-core.json +200 -75
  2. package/bin/bongos.js +1 -0
  3. package/clients/bongos-client/README.md +1 -1
  4. package/clients/bongos-client/bongos-client.global.js +24 -0
  5. package/clients/bongos-client/index.cjs +24 -0
  6. package/clients/bongos-client/index.d.ts +36 -2
  7. package/clients/bongos-client/index.mjs +24 -0
  8. package/docs/adr/0406-every-project-gets-a-sandbox-that-follows-main-and-live-moves-only-when-a-person-promotes.md +8 -0
  9. package/docs/adr/0408-a-genesis-stage-is-three-doors-onto-one-record.md +1 -0
  10. package/docs/api/openapi.json +761 -112
  11. package/docs/api-reference.md +23 -3
  12. package/docs/copy-inventory.md +118 -108
  13. package/docs/copy-registry.json +315 -172
  14. package/docs/file-map.md +2 -1
  15. package/docs/module-api-changelog.md +4 -0
  16. package/docs/page-inventory.json +3 -0
  17. package/docs/page-readings.json +62 -62
  18. package/modules/app-host/CLAUDE.md +15 -0
  19. package/modules/app-host/module.json +20 -0
  20. package/modules/app-host/public/settings-widget.js +143 -0
  21. package/modules/app-host/routes/app-host.js +88 -0
  22. package/modules/government/charter-advice.js +103 -0
  23. package/modules/government/decision-rules.js +1 -0
  24. package/modules/government/presets.js +42 -0
  25. package/modules/government/recommendations.js +102 -7
  26. package/modules/government/routes/government.js +1 -0
  27. package/modules/lifecycle/first-read-catalog.js +62 -0
  28. package/modules/lifecycle/first-read-db.js +190 -0
  29. package/modules/lifecycle/first-read.js +330 -0
  30. package/modules/lifecycle/kickoff-checklist.js +12 -3
  31. package/modules/lifecycle/migrations/lifecycle_022_repo_maps.sql +44 -0
  32. package/modules/lifecycle/migrations/lifecycle_023_repo_map_dismissed.sql +19 -0
  33. package/modules/lifecycle/module.json +2 -1
  34. package/modules/lifecycle/routes/first-read.js +101 -0
  35. package/modules/onboarding/genesis-work.js +101 -4
  36. package/modules/onboarding/routes/genesis-work.js +2 -2
  37. package/modules/platform-identity/module.json +1 -1
  38. package/modules/platform-identity/routes/sso-app-status.js +65 -0
  39. package/modules/provisioning/module.json +1 -0
  40. package/modules/provisioning/pollers/app-liveness.js +23 -1
  41. package/modules/provisioning/render-sandbox.js +113 -0
  42. package/modules/provisioning/render-standup.js +3 -1
  43. package/modules/provisioning/routes/provisioning.js +4 -1
  44. package/modules/provisioning/routes/render-standup.js +49 -1
  45. package/modules/provisioning/seams.js +32 -1
  46. package/modules/provisioning/starter-bundles.js +1 -0
  47. package/modules/public-landing/public/assets/guide-core.js +475 -0
  48. package/modules/public-landing/public/assets/guide-hall.css +121 -0
  49. package/modules/public-landing/public/assets/guide-hall.js +164 -0
  50. package/modules/public-landing/public/assets/guide-scene.css +9 -0
  51. package/modules/public-landing/public/assets/guide-scene.js +58 -381
  52. package/modules/public-landing/public/index.html +46 -1
  53. package/modules/public-landing/public/projects.html +112 -6
  54. package/modules/ui-design/kit/serve.js +1 -1
  55. package/package-lock.json +2 -2
  56. package/package.json +1 -1
  57. package/release-notes.json +28 -0
  58. package/scripts/bongos/first-read.js +150 -0
  59. package/scripts/bongos/genesis.js +21 -1
  60. package/scripts/bongos/government-walk.js +4 -4
  61. package/scripts/bongos/provision-render-sandbox.js +171 -0
  62. package/scripts/bongos/provision-render.js +37 -2
  63. package/scripts/bongos/provision-teardown.js +1 -1
  64. package/scripts/bongos/publish-manifest.js +1 -0
  65. package/scripts/bongos/render-api.js +33 -3
  66. package/scripts/bongos/render-payload.js +39 -1
  67. package/scripts/bongos/seam-wiring-guard.js +3 -2
  68. package/scripts/gds/first-read.js +7 -0
  69. package/scripts/gds/provision-render-sandbox.js +6 -0
  70. package/scripts/hall-preview/server.js +2 -0
  71. package/src/bongos/auth-admission.js +64 -0
  72. package/src/bongos/auth.js +2 -1
  73. package/src/bongos/module-scope-map.js +4 -0
  74. package/src/bongos/routes/core-update.js +3 -16
  75. package/src/bongos/routes/modules.js +11 -0
  76. package/src/bongos/serve-internal.js +20 -6
  77. package/src/module-api.js +6 -1
  78. package/src/module-loader/loader.js +2 -2
  79. package/tests/app_host.mjs +413 -0
  80. package/tests/first_read.mjs +479 -0
  81. package/tests/genesis_work.mjs +74 -3
  82. package/tests/government_act_alone_buildings.mjs +2 -0
  83. package/tests/government_charter_advice.mjs +150 -0
  84. package/tests/landing_guide_hall.mjs +364 -0
  85. package/tests/landing_guide_scene.mjs +8 -5
  86. package/tests/module_api.mjs +1 -0
  87. package/tests/module_loader.mjs +1 -1
  88. package/tests/npm_release_where.mjs +13 -3
  89. package/tests/provisioning_app_status.mjs +3 -2
  90. package/tests/provisioning_render_route.mjs +1 -1
  91. package/tests/provisioning_teardown_intent.mjs +50 -0
  92. package/tests/render_api.mjs +5 -2
  93. package/tests/render_sandbox.mjs +447 -0
@@ -45,6 +45,10 @@
45
45
  "name": "analytics",
46
46
  "description": "Endpoints under `/api/bongos/analytics`."
47
47
  },
48
+ {
49
+ "name": "app-host",
50
+ "description": "Endpoints under `/api/bongos/app-host`."
51
+ },
48
52
  {
49
53
  "name": "artist-gate",
50
54
  "description": "Endpoints under `/api/bongos/artist-gate`."
@@ -137,6 +141,10 @@
137
141
  "name": "feedback",
138
142
  "description": "Endpoints under `/api/bongos/feedback`."
139
143
  },
144
+ {
145
+ "name": "first-read",
146
+ "description": "Endpoints under `/api/bongos/first-read`."
147
+ },
140
148
  {
141
149
  "name": "founding",
142
150
  "description": "Endpoints under `/api/bongos/founding`."
@@ -1744,6 +1752,37 @@
1744
1752
  ]
1745
1753
  }
1746
1754
  },
1755
+ "/app-host": {
1756
+ "get": {
1757
+ "operationId": "get_app_host",
1758
+ "tags": [
1759
+ "app-host"
1760
+ ],
1761
+ "summary": "GET /app-host",
1762
+ "description": "GET /app-host — rank: any signed-in builder; owner-only parts gated on core.pin.move.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
1763
+ "x-rank": "any-builder",
1764
+ "x-source": "modules/app-host/routes/app-host.js",
1765
+ "responses": {
1766
+ "200": {
1767
+ "description": "Success."
1768
+ },
1769
+ "400": {
1770
+ "$ref": "#/components/responses/BadRequest"
1771
+ },
1772
+ "401": {
1773
+ "$ref": "#/components/responses/Unauthorized"
1774
+ },
1775
+ "403": {
1776
+ "$ref": "#/components/responses/Forbidden"
1777
+ }
1778
+ },
1779
+ "security": [
1780
+ {
1781
+ "builderSession": []
1782
+ }
1783
+ ]
1784
+ }
1785
+ },
1747
1786
  "/artist-gate": {
1748
1787
  "get": {
1749
1788
  "operationId": "get_artist_gate",
@@ -7609,19 +7648,26 @@
7609
7648
  "security": []
7610
7649
  }
7611
7650
  },
7612
- "/founding/alive": {
7613
- "post": {
7614
- "operationId": "post_founding_alive",
7651
+ "/first-read/catalog": {
7652
+ "get": {
7653
+ "operationId": "get_first_read_catalog",
7615
7654
  "tags": [
7616
- "founding"
7655
+ "first-read"
7617
7656
  ],
7618
- "summary": "POST /founding/alive",
7619
- "description": "**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
7657
+ "summary": "GET /first-read/catalog",
7658
+ "description": "the modules this project can switch on, the only ones a map may recommend. `available: false` when the list cannot be read here.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
7620
7659
  "x-rank": "any-builder",
7621
- "x-source": "modules/onboarding/routes/onboarding.js",
7660
+ "x-source": "modules/lifecycle/routes/first-read.js",
7622
7661
  "responses": {
7623
7662
  "200": {
7624
- "description": "Success."
7663
+ "description": "Success.",
7664
+ "content": {
7665
+ "application/json": {
7666
+ "schema": {
7667
+ "$ref": "#/components/schemas/GetFirstReadCatalogResponse"
7668
+ }
7669
+ }
7670
+ }
7625
7671
  },
7626
7672
  "400": {
7627
7673
  "$ref": "#/components/responses/BadRequest"
@@ -7640,22 +7686,43 @@
7640
7686
  ]
7641
7687
  }
7642
7688
  },
7643
- "/founding/builders": {
7644
- "get": {
7645
- "operationId": "get_founding_builders",
7689
+ "/first-read/maps": {
7690
+ "post": {
7691
+ "operationId": "post_first_read_maps",
7646
7692
  "tags": [
7647
- "founding"
7693
+ "first-read"
7648
7694
  ],
7649
- "summary": "GET /founding/builders",
7650
- "description": "The founding mark (task 1004424): who joined while the project was founding, in join order, with the stage each joined at. Read by the roster, the profile, the ranks page and the home's founding wall; an empty list on a project that was never founded, so those surfaces render exactly as before. Signed-in, like the hall pages that read it; it carries nothing the roster does not already show.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
7651
- "x-rank": "any-builder",
7652
- "x-source": "modules/onboarding/routes/onboarding.js",
7695
+ "summary": "POST /first-read/maps",
7696
+ "description": ".create — a map is a planning proposal for this project. Stores it pending; files nothing. A malformed map is refused with every error named.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `goal.create` (all required).",
7697
+ "x-rank": "metic+archon",
7698
+ "x-source": "modules/lifecycle/routes/first-read.js",
7699
+ "x-permissions": [
7700
+ "goal.create"
7701
+ ],
7702
+ "requestBody": {
7703
+ "required": true,
7704
+ "content": {
7705
+ "application/json": {
7706
+ "schema": {
7707
+ "$ref": "#/components/schemas/PostFirstReadMapsRequest"
7708
+ }
7709
+ }
7710
+ },
7711
+ "x-validated": true
7712
+ },
7653
7713
  "responses": {
7654
7714
  "200": {
7655
- "description": "Success."
7715
+ "description": "Success.",
7716
+ "content": {
7717
+ "application/json": {
7718
+ "schema": {
7719
+ "$ref": "#/components/schemas/PostFirstReadMapsResponse"
7720
+ }
7721
+ }
7722
+ }
7656
7723
  },
7657
7724
  "400": {
7658
- "$ref": "#/components/responses/BadRequest"
7725
+ "$ref": "#/components/responses/ValidationFailed"
7659
7726
  },
7660
7727
  "401": {
7661
7728
  "$ref": "#/components/responses/Unauthorized"
@@ -7671,16 +7738,30 @@
7671
7738
  ]
7672
7739
  }
7673
7740
  },
7674
- "/founding/context": {
7741
+ "/first-read/maps/{id}": {
7675
7742
  "get": {
7676
- "operationId": "get_founding_context",
7743
+ "operationId": "get_first_read_maps_id",
7677
7744
  "tags": [
7678
- "founding"
7745
+ "first-read"
7746
+ ],
7747
+ "summary": "GET /first-read/maps/:id",
7748
+ "description": ".create — the review is for whoever may accept or reject it.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `goal.create` (all required).",
7749
+ "x-rank": "metic+archon",
7750
+ "x-source": "modules/lifecycle/routes/first-read.js",
7751
+ "x-permissions": [
7752
+ "goal.create"
7753
+ ],
7754
+ "parameters": [
7755
+ {
7756
+ "name": "id",
7757
+ "in": "path",
7758
+ "required": true,
7759
+ "schema": {
7760
+ "type": "string"
7761
+ },
7762
+ "description": "Path parameter `id`."
7763
+ }
7679
7764
  ],
7680
- "summary": "GET /founding/context",
7681
- "description": "**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
7682
- "x-rank": "any-builder",
7683
- "x-source": "modules/onboarding/routes/genesis-work.js",
7684
7765
  "responses": {
7685
7766
  "200": {
7686
7767
  "description": "Success."
@@ -7693,6 +7774,9 @@
7693
7774
  },
7694
7775
  "403": {
7695
7776
  "$ref": "#/components/responses/Forbidden"
7777
+ },
7778
+ "404": {
7779
+ "$ref": "#/components/responses/NotFound"
7696
7780
  }
7697
7781
  },
7698
7782
  "security": [
@@ -7702,22 +7786,36 @@
7702
7786
  ]
7703
7787
  }
7704
7788
  },
7705
- "/founding/enabled": {
7706
- "put": {
7707
- "operationId": "put_founding_enabled",
7789
+ "/first-read/maps/{id}/accept": {
7790
+ "post": {
7791
+ "operationId": "post_first_read_maps_id_accept",
7708
7792
  "tags": [
7709
- "founding"
7793
+ "first-read"
7794
+ ],
7795
+ "summary": "POST /first-read/maps/:id/accept",
7796
+ "description": ".create + act-alone planning — the owner's yes. Files the chosen items as draft goals (open) and tasks (backlog); an item already filed is skipped.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `goal.create` (all required).",
7797
+ "x-rank": "metic+archon",
7798
+ "x-source": "modules/lifecycle/routes/first-read.js",
7799
+ "x-permissions": [
7800
+ "goal.create"
7801
+ ],
7802
+ "parameters": [
7803
+ {
7804
+ "name": "id",
7805
+ "in": "path",
7806
+ "required": true,
7807
+ "schema": {
7808
+ "type": "string"
7809
+ },
7810
+ "description": "Path parameter `id`."
7811
+ }
7710
7812
  ],
7711
- "summary": "PUT /founding/enabled",
7712
- "description": "The Test features panel's genesis switch (task 1005036): a test project only, the owner's call.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
7713
- "x-rank": "any-builder",
7714
- "x-source": "modules/onboarding/routes/onboarding.js",
7715
7813
  "requestBody": {
7716
7814
  "required": false,
7717
7815
  "content": {
7718
7816
  "application/json": {
7719
7817
  "schema": {
7720
- "$ref": "#/components/schemas/PutFoundingEnabledRequest"
7818
+ "$ref": "#/components/schemas/PostFirstReadMapsIdAcceptRequest"
7721
7819
  }
7722
7820
  }
7723
7821
  },
@@ -7735,6 +7833,9 @@
7735
7833
  },
7736
7834
  "403": {
7737
7835
  "$ref": "#/components/responses/Forbidden"
7836
+ },
7837
+ "404": {
7838
+ "$ref": "#/components/responses/NotFound"
7738
7839
  }
7739
7840
  },
7740
7841
  "security": [
@@ -7744,53 +7845,36 @@
7744
7845
  ]
7745
7846
  }
7746
7847
  },
7747
- "/founding/genesis": {
7748
- "get": {
7749
- "operationId": "get_founding_genesis",
7848
+ "/first-read/maps/{id}/dismiss": {
7849
+ "post": {
7850
+ "operationId": "post_first_read_maps_id_dismiss",
7750
7851
  "tags": [
7751
- "founding"
7852
+ "first-read"
7752
7853
  ],
7753
- "summary": "GET /founding/genesis",
7754
- "description": "A project born through the startup flow enters genesis on its first founding read (founding-birth.js, task 1004506) — here and on GET /me through the port.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
7755
- "x-rank": "any-builder",
7756
- "x-source": "modules/onboarding/routes/onboarding.js",
7757
- "responses": {
7758
- "200": {
7759
- "description": "Success."
7760
- },
7761
- "400": {
7762
- "$ref": "#/components/responses/BadRequest"
7763
- },
7764
- "401": {
7765
- "$ref": "#/components/responses/Unauthorized"
7766
- },
7767
- "403": {
7768
- "$ref": "#/components/responses/Forbidden"
7769
- }
7770
- },
7771
- "security": [
7854
+ "summary": "POST /first-read/maps/:id/dismiss",
7855
+ "description": ".create — the owner's no to named items (a module recommendation, usually). Files nothing; a later \"accept all\" passes them by.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `goal.create` (all required).",
7856
+ "x-rank": "metic+archon",
7857
+ "x-source": "modules/lifecycle/routes/first-read.js",
7858
+ "x-permissions": [
7859
+ "goal.create"
7860
+ ],
7861
+ "parameters": [
7772
7862
  {
7773
- "builderSession": []
7863
+ "name": "id",
7864
+ "in": "path",
7865
+ "required": true,
7866
+ "schema": {
7867
+ "type": "string"
7868
+ },
7869
+ "description": "Path parameter `id`."
7774
7870
  }
7775
- ]
7776
- }
7777
- },
7778
- "/founding/plan": {
7779
- "post": {
7780
- "operationId": "post_founding_plan",
7781
- "tags": [
7782
- "founding"
7783
7871
  ],
7784
- "summary": "POST /founding/plan",
7785
- "description": "The plan's ranges and vocabularies are genesis-home.js parsePlan's (one source); this schema only names the fields so an unknown one is refused.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
7786
- "x-rank": "any-builder",
7787
- "x-source": "modules/onboarding/routes/onboarding.js",
7788
7872
  "requestBody": {
7789
- "required": false,
7873
+ "required": true,
7790
7874
  "content": {
7791
7875
  "application/json": {
7792
7876
  "schema": {
7793
- "$ref": "#/components/schemas/PostFoundingPlanRequest"
7877
+ "$ref": "#/components/schemas/PostFirstReadMapsIdDismissRequest"
7794
7878
  }
7795
7879
  }
7796
7880
  },
@@ -7808,6 +7892,9 @@
7808
7892
  },
7809
7893
  "403": {
7810
7894
  "$ref": "#/components/responses/Forbidden"
7895
+ },
7896
+ "404": {
7897
+ "$ref": "#/components/responses/NotFound"
7811
7898
  }
7812
7899
  },
7813
7900
  "security": [
@@ -7817,16 +7904,30 @@
7817
7904
  ]
7818
7905
  }
7819
7906
  },
7820
- "/founding/skip": {
7907
+ "/first-read/maps/{id}/reject": {
7821
7908
  "post": {
7822
- "operationId": "post_founding_skip",
7909
+ "operationId": "post_first_read_maps_id_reject",
7823
7910
  "tags": [
7824
- "founding"
7911
+ "first-read"
7912
+ ],
7913
+ "summary": "POST /first-read/maps/:id/reject",
7914
+ "description": ".create — the owner's no. Files nothing.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `goal.create` (all required).",
7915
+ "x-rank": "metic+archon",
7916
+ "x-source": "modules/lifecycle/routes/first-read.js",
7917
+ "x-permissions": [
7918
+ "goal.create"
7919
+ ],
7920
+ "parameters": [
7921
+ {
7922
+ "name": "id",
7923
+ "in": "path",
7924
+ "required": true,
7925
+ "schema": {
7926
+ "type": "string"
7927
+ },
7928
+ "description": "Path parameter `id`."
7929
+ }
7825
7930
  ],
7826
- "summary": "POST /founding/skip",
7827
- "description": "Skip genesis: the owner opens the full hall from any stage, no sitting, no gate.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
7828
- "x-rank": "any-builder",
7829
- "x-source": "modules/onboarding/routes/onboarding.js",
7830
7931
  "responses": {
7831
7932
  "200": {
7832
7933
  "description": "Success."
@@ -7839,6 +7940,9 @@
7839
7940
  },
7840
7941
  "403": {
7841
7942
  "$ref": "#/components/responses/Forbidden"
7943
+ },
7944
+ "404": {
7945
+ "$ref": "#/components/responses/NotFound"
7842
7946
  }
7843
7947
  },
7844
7948
  "security": [
@@ -7848,30 +7952,26 @@
7848
7952
  ]
7849
7953
  }
7850
7954
  },
7851
- "/founding/stages/{stage}/close": {
7852
- "post": {
7853
- "operationId": "post_founding_stages_stage_close",
7955
+ "/first-read/prompt": {
7956
+ "get": {
7957
+ "operationId": "get_first_read_prompt",
7854
7958
  "tags": [
7855
- "founding"
7959
+ "first-read"
7856
7960
  ],
7857
- "summary": "POST /founding/stages/:stage/close",
7858
- "description": "task 1005121: one call. 200 { closed: true, next_stage } when the stage closed; 202 { ok: false, closed: false, reason: 'sitting_open', waiting, next } when a real sitting is deciding it — never a success for a stage that did not close.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
7961
+ "summary": "GET /first-read/prompt",
7962
+ "description": "the prompt and the shape are instructions, not project data. The prompt carries the live module list (task 1005281), so a session recommends from it.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
7859
7963
  "x-rank": "any-builder",
7860
- "x-source": "modules/onboarding/routes/onboarding.js",
7861
- "parameters": [
7862
- {
7863
- "name": "stage",
7864
- "in": "path",
7865
- "required": true,
7866
- "schema": {
7867
- "type": "string"
7868
- },
7869
- "description": "Path parameter `stage`."
7870
- }
7871
- ],
7964
+ "x-source": "modules/lifecycle/routes/first-read.js",
7872
7965
  "responses": {
7873
7966
  "200": {
7874
- "description": "Success."
7967
+ "description": "Success.",
7968
+ "content": {
7969
+ "application/json": {
7970
+ "schema": {
7971
+ "$ref": "#/components/schemas/GetFirstReadPromptResponse"
7972
+ }
7973
+ }
7974
+ }
7875
7975
  },
7876
7976
  "400": {
7877
7977
  "$ref": "#/components/responses/BadRequest"
@@ -7881,9 +7981,6 @@
7881
7981
  },
7882
7982
  "403": {
7883
7983
  "$ref": "#/components/responses/Forbidden"
7884
- },
7885
- "404": {
7886
- "$ref": "#/components/responses/NotFound"
7887
7984
  }
7888
7985
  },
7889
7986
  "security": [
@@ -7893,13 +7990,13 @@
7893
7990
  ]
7894
7991
  }
7895
7992
  },
7896
- "/founding/start": {
7993
+ "/founding/alive": {
7897
7994
  "post": {
7898
- "operationId": "post_founding_start",
7995
+ "operationId": "post_founding_alive",
7899
7996
  "tags": [
7900
7997
  "founding"
7901
7998
  ],
7902
- "summary": "POST /founding/start",
7999
+ "summary": "POST /founding/alive",
7903
8000
  "description": "**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
7904
8001
  "x-rank": "any-builder",
7905
8002
  "x-source": "modules/onboarding/routes/onboarding.js",
@@ -7924,16 +8021,300 @@
7924
8021
  ]
7925
8022
  }
7926
8023
  },
7927
- "/founding/work": {
8024
+ "/founding/builders": {
7928
8025
  "get": {
7929
- "operationId": "get_founding_work",
8026
+ "operationId": "get_founding_builders",
7930
8027
  "tags": [
7931
8028
  "founding"
7932
8029
  ],
7933
- "summary": "GET /founding/work",
7934
- "description": "The read path for every door and for AI sessions planning a goal or task.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
8030
+ "summary": "GET /founding/builders",
8031
+ "description": "The founding mark (task 1004424): who joined while the project was founding, in join order, with the stage each joined at. Read by the roster, the profile, the ranks page and the home's founding wall; an empty list on a project that was never founded, so those surfaces render exactly as before. Signed-in, like the hall pages that read it; it carries nothing the roster does not already show.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
7935
8032
  "x-rank": "any-builder",
7936
- "x-source": "modules/onboarding/routes/genesis-work.js",
8033
+ "x-source": "modules/onboarding/routes/onboarding.js",
8034
+ "responses": {
8035
+ "200": {
8036
+ "description": "Success."
8037
+ },
8038
+ "400": {
8039
+ "$ref": "#/components/responses/BadRequest"
8040
+ },
8041
+ "401": {
8042
+ "$ref": "#/components/responses/Unauthorized"
8043
+ },
8044
+ "403": {
8045
+ "$ref": "#/components/responses/Forbidden"
8046
+ }
8047
+ },
8048
+ "security": [
8049
+ {
8050
+ "builderSession": []
8051
+ }
8052
+ ]
8053
+ }
8054
+ },
8055
+ "/founding/context": {
8056
+ "get": {
8057
+ "operationId": "get_founding_context",
8058
+ "tags": [
8059
+ "founding"
8060
+ ],
8061
+ "summary": "GET /founding/context",
8062
+ "description": "**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
8063
+ "x-rank": "any-builder",
8064
+ "x-source": "modules/onboarding/routes/genesis-work.js",
8065
+ "responses": {
8066
+ "200": {
8067
+ "description": "Success."
8068
+ },
8069
+ "400": {
8070
+ "$ref": "#/components/responses/BadRequest"
8071
+ },
8072
+ "401": {
8073
+ "$ref": "#/components/responses/Unauthorized"
8074
+ },
8075
+ "403": {
8076
+ "$ref": "#/components/responses/Forbidden"
8077
+ }
8078
+ },
8079
+ "security": [
8080
+ {
8081
+ "builderSession": []
8082
+ }
8083
+ ]
8084
+ }
8085
+ },
8086
+ "/founding/enabled": {
8087
+ "put": {
8088
+ "operationId": "put_founding_enabled",
8089
+ "tags": [
8090
+ "founding"
8091
+ ],
8092
+ "summary": "PUT /founding/enabled",
8093
+ "description": "The Test features panel's genesis switch (task 1005036): a test project only, the owner's call.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
8094
+ "x-rank": "any-builder",
8095
+ "x-source": "modules/onboarding/routes/onboarding.js",
8096
+ "requestBody": {
8097
+ "required": false,
8098
+ "content": {
8099
+ "application/json": {
8100
+ "schema": {
8101
+ "$ref": "#/components/schemas/PutFoundingEnabledRequest"
8102
+ }
8103
+ }
8104
+ },
8105
+ "x-validated": true
8106
+ },
8107
+ "responses": {
8108
+ "200": {
8109
+ "description": "Success."
8110
+ },
8111
+ "400": {
8112
+ "$ref": "#/components/responses/ValidationFailed"
8113
+ },
8114
+ "401": {
8115
+ "$ref": "#/components/responses/Unauthorized"
8116
+ },
8117
+ "403": {
8118
+ "$ref": "#/components/responses/Forbidden"
8119
+ }
8120
+ },
8121
+ "security": [
8122
+ {
8123
+ "builderSession": []
8124
+ }
8125
+ ]
8126
+ }
8127
+ },
8128
+ "/founding/genesis": {
8129
+ "get": {
8130
+ "operationId": "get_founding_genesis",
8131
+ "tags": [
8132
+ "founding"
8133
+ ],
8134
+ "summary": "GET /founding/genesis",
8135
+ "description": "A project born through the startup flow enters genesis on its first founding read (founding-birth.js, task 1004506) — here and on GET /me through the port.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
8136
+ "x-rank": "any-builder",
8137
+ "x-source": "modules/onboarding/routes/onboarding.js",
8138
+ "responses": {
8139
+ "200": {
8140
+ "description": "Success."
8141
+ },
8142
+ "400": {
8143
+ "$ref": "#/components/responses/BadRequest"
8144
+ },
8145
+ "401": {
8146
+ "$ref": "#/components/responses/Unauthorized"
8147
+ },
8148
+ "403": {
8149
+ "$ref": "#/components/responses/Forbidden"
8150
+ }
8151
+ },
8152
+ "security": [
8153
+ {
8154
+ "builderSession": []
8155
+ }
8156
+ ]
8157
+ }
8158
+ },
8159
+ "/founding/plan": {
8160
+ "post": {
8161
+ "operationId": "post_founding_plan",
8162
+ "tags": [
8163
+ "founding"
8164
+ ],
8165
+ "summary": "POST /founding/plan",
8166
+ "description": "The plan's ranges and vocabularies are genesis-home.js parsePlan's (one source); this schema only names the fields so an unknown one is refused.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
8167
+ "x-rank": "any-builder",
8168
+ "x-source": "modules/onboarding/routes/onboarding.js",
8169
+ "requestBody": {
8170
+ "required": false,
8171
+ "content": {
8172
+ "application/json": {
8173
+ "schema": {
8174
+ "$ref": "#/components/schemas/PostFoundingPlanRequest"
8175
+ }
8176
+ }
8177
+ },
8178
+ "x-validated": true
8179
+ },
8180
+ "responses": {
8181
+ "200": {
8182
+ "description": "Success."
8183
+ },
8184
+ "400": {
8185
+ "$ref": "#/components/responses/ValidationFailed"
8186
+ },
8187
+ "401": {
8188
+ "$ref": "#/components/responses/Unauthorized"
8189
+ },
8190
+ "403": {
8191
+ "$ref": "#/components/responses/Forbidden"
8192
+ }
8193
+ },
8194
+ "security": [
8195
+ {
8196
+ "builderSession": []
8197
+ }
8198
+ ]
8199
+ }
8200
+ },
8201
+ "/founding/skip": {
8202
+ "post": {
8203
+ "operationId": "post_founding_skip",
8204
+ "tags": [
8205
+ "founding"
8206
+ ],
8207
+ "summary": "POST /founding/skip",
8208
+ "description": "Skip genesis: the owner opens the full hall from any stage, no sitting, no gate.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
8209
+ "x-rank": "any-builder",
8210
+ "x-source": "modules/onboarding/routes/onboarding.js",
8211
+ "responses": {
8212
+ "200": {
8213
+ "description": "Success."
8214
+ },
8215
+ "400": {
8216
+ "$ref": "#/components/responses/BadRequest"
8217
+ },
8218
+ "401": {
8219
+ "$ref": "#/components/responses/Unauthorized"
8220
+ },
8221
+ "403": {
8222
+ "$ref": "#/components/responses/Forbidden"
8223
+ }
8224
+ },
8225
+ "security": [
8226
+ {
8227
+ "builderSession": []
8228
+ }
8229
+ ]
8230
+ }
8231
+ },
8232
+ "/founding/stages/{stage}/close": {
8233
+ "post": {
8234
+ "operationId": "post_founding_stages_stage_close",
8235
+ "tags": [
8236
+ "founding"
8237
+ ],
8238
+ "summary": "POST /founding/stages/:stage/close",
8239
+ "description": "task 1005121: one call. 200 { closed: true, next_stage } when the stage closed; 202 { ok: false, closed: false, reason: 'sitting_open', waiting, next } when a real sitting is deciding it — never a success for a stage that did not close.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
8240
+ "x-rank": "any-builder",
8241
+ "x-source": "modules/onboarding/routes/onboarding.js",
8242
+ "parameters": [
8243
+ {
8244
+ "name": "stage",
8245
+ "in": "path",
8246
+ "required": true,
8247
+ "schema": {
8248
+ "type": "string"
8249
+ },
8250
+ "description": "Path parameter `stage`."
8251
+ }
8252
+ ],
8253
+ "responses": {
8254
+ "200": {
8255
+ "description": "Success."
8256
+ },
8257
+ "400": {
8258
+ "$ref": "#/components/responses/BadRequest"
8259
+ },
8260
+ "401": {
8261
+ "$ref": "#/components/responses/Unauthorized"
8262
+ },
8263
+ "403": {
8264
+ "$ref": "#/components/responses/Forbidden"
8265
+ },
8266
+ "404": {
8267
+ "$ref": "#/components/responses/NotFound"
8268
+ }
8269
+ },
8270
+ "security": [
8271
+ {
8272
+ "builderSession": []
8273
+ }
8274
+ ]
8275
+ }
8276
+ },
8277
+ "/founding/start": {
8278
+ "post": {
8279
+ "operationId": "post_founding_start",
8280
+ "tags": [
8281
+ "founding"
8282
+ ],
8283
+ "summary": "POST /founding/start",
8284
+ "description": "**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
8285
+ "x-rank": "any-builder",
8286
+ "x-source": "modules/onboarding/routes/onboarding.js",
8287
+ "responses": {
8288
+ "200": {
8289
+ "description": "Success."
8290
+ },
8291
+ "400": {
8292
+ "$ref": "#/components/responses/BadRequest"
8293
+ },
8294
+ "401": {
8295
+ "$ref": "#/components/responses/Unauthorized"
8296
+ },
8297
+ "403": {
8298
+ "$ref": "#/components/responses/Forbidden"
8299
+ }
8300
+ },
8301
+ "security": [
8302
+ {
8303
+ "builderSession": []
8304
+ }
8305
+ ]
8306
+ }
8307
+ },
8308
+ "/founding/work": {
8309
+ "get": {
8310
+ "operationId": "get_founding_work",
8311
+ "tags": [
8312
+ "founding"
8313
+ ],
8314
+ "summary": "GET /founding/work",
8315
+ "description": "The read path for every door and for AI sessions planning a goal or task.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
8316
+ "x-rank": "any-builder",
8317
+ "x-source": "modules/onboarding/routes/genesis-work.js",
7937
8318
  "responses": {
7938
8319
  "200": {
7939
8320
  "description": "Success."
@@ -25358,6 +25739,69 @@
25358
25739
  ]
25359
25740
  }
25360
25741
  },
25742
+ "/provisioning/instances/{id}/render/sandbox": {
25743
+ "post": {
25744
+ "operationId": "post_provisioning_instances_id_render_sandbox",
25745
+ "tags": [
25746
+ "provisioning"
25747
+ ],
25748
+ "summary": "POST /provisioning/instances/:id/render/sandbox",
25749
+ "description": "POST /provisioning/instances/:id/render/sandbox — rank: any authenticated builder, and OWNER ONLY, like every Render route. An app already on Render adds its sandbox with one action (ADR 0406, task 1005289): the owner lends the key once, and the runner sets up a free app that follows main, beside the live one, which it does not touch. A project with no app on Render is told why it has none. The reply is a receipt.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
25750
+ "x-rank": "any-builder",
25751
+ "x-source": "modules/provisioning/routes/render-standup.js",
25752
+ "parameters": [
25753
+ {
25754
+ "name": "id",
25755
+ "in": "path",
25756
+ "required": true,
25757
+ "schema": {
25758
+ "type": "string"
25759
+ },
25760
+ "description": "Path parameter `id`."
25761
+ }
25762
+ ],
25763
+ "requestBody": {
25764
+ "required": true,
25765
+ "content": {
25766
+ "application/json": {
25767
+ "schema": {
25768
+ "$ref": "#/components/schemas/PostProvisioningInstancesIdRenderSandboxRequest"
25769
+ }
25770
+ }
25771
+ },
25772
+ "x-validated": true
25773
+ },
25774
+ "responses": {
25775
+ "200": {
25776
+ "description": "Success.",
25777
+ "content": {
25778
+ "application/json": {
25779
+ "schema": {
25780
+ "$ref": "#/components/schemas/PostProvisioningInstancesIdRenderSandboxResponse"
25781
+ }
25782
+ }
25783
+ }
25784
+ },
25785
+ "400": {
25786
+ "$ref": "#/components/responses/ValidationFailed"
25787
+ },
25788
+ "401": {
25789
+ "$ref": "#/components/responses/Unauthorized"
25790
+ },
25791
+ "403": {
25792
+ "$ref": "#/components/responses/Forbidden"
25793
+ },
25794
+ "404": {
25795
+ "$ref": "#/components/responses/NotFound"
25796
+ }
25797
+ },
25798
+ "security": [
25799
+ {
25800
+ "builderSession": []
25801
+ }
25802
+ ]
25803
+ }
25804
+ },
25361
25805
  "/provisioning/instances/{id}/repo-private": {
25362
25806
  "post": {
25363
25807
  "operationId": "post_provisioning_instances_id_repo_private",
@@ -28970,6 +29414,45 @@
28970
29414
  "security": []
28971
29415
  }
28972
29416
  },
29417
+ "/sso/app-status": {
29418
+ "post": {
29419
+ "operationId": "post_sso_app_status",
29420
+ "tags": [
29421
+ "sso"
29422
+ ],
29423
+ "summary": "POST /sso/app-status",
29424
+ "description": "authenticated by client_id + client_secret, not a builder rank.\n\n**Rank:** `public` — No authentication — any caller.",
29425
+ "x-rank": "public",
29426
+ "x-source": "modules/platform-identity/routes/sso-app-status.js",
29427
+ "requestBody": {
29428
+ "required": true,
29429
+ "content": {
29430
+ "application/json": {
29431
+ "schema": {
29432
+ "$ref": "#/components/schemas/PostSsoAppStatusRequest"
29433
+ }
29434
+ }
29435
+ },
29436
+ "x-validated": true
29437
+ },
29438
+ "responses": {
29439
+ "200": {
29440
+ "description": "Success.",
29441
+ "content": {
29442
+ "application/json": {
29443
+ "schema": {
29444
+ "$ref": "#/components/schemas/PostSsoAppStatusResponse"
29445
+ }
29446
+ }
29447
+ }
29448
+ },
29449
+ "400": {
29450
+ "$ref": "#/components/responses/ValidationFailed"
29451
+ }
29452
+ },
29453
+ "security": []
29454
+ }
29455
+ },
28973
29456
  "/sso/applicant-profile": {
28974
29457
  "post": {
28975
29458
  "operationId": "post_sso_applicant_profile",
@@ -34352,6 +34835,36 @@
34352
34835
  "count"
34353
34836
  ]
34354
34837
  },
34838
+ "GetFirstReadCatalogResponse": {
34839
+ "type": "object",
34840
+ "properties": {
34841
+ "available": {},
34842
+ "modules": {}
34843
+ },
34844
+ "required": [
34845
+ "available",
34846
+ "modules"
34847
+ ]
34848
+ },
34849
+ "GetFirstReadPromptResponse": {
34850
+ "type": "object",
34851
+ "properties": {
34852
+ "schema": {},
34853
+ "file": {},
34854
+ "prompt": {},
34855
+ "example": {},
34856
+ "limits": {},
34857
+ "catalog": {}
34858
+ },
34859
+ "required": [
34860
+ "schema",
34861
+ "file",
34862
+ "prompt",
34863
+ "example",
34864
+ "limits",
34865
+ "catalog"
34866
+ ]
34867
+ },
34355
34868
  "GetFrontDoorGuideMineResponse": {
34356
34869
  "type": "object",
34357
34870
  "properties": {
@@ -35528,6 +36041,7 @@
35528
36041
  "type": "boolean"
35529
36042
  },
35530
36043
  "app": {},
36044
+ "sandbox": {},
35531
36045
  "env_vars": {},
35532
36046
  "values_held": {
35533
36047
  "type": "boolean"
@@ -35536,6 +36050,7 @@
35536
36050
  "required": [
35537
36051
  "ok",
35538
36052
  "app",
36053
+ "sandbox",
35539
36054
  "env_vars",
35540
36055
  "values_held"
35541
36056
  ]
@@ -38845,6 +39360,65 @@
38845
39360
  "hub"
38846
39361
  ]
38847
39362
  },
39363
+ "PostFirstReadMapsIdAcceptRequest": {
39364
+ "type": "object",
39365
+ "properties": {
39366
+ "all": {
39367
+ "type": "boolean"
39368
+ },
39369
+ "items": {
39370
+ "type": "array",
39371
+ "items": {
39372
+ "type": "string"
39373
+ },
39374
+ "maxItems": 500
39375
+ }
39376
+ },
39377
+ "additionalProperties": false
39378
+ },
39379
+ "PostFirstReadMapsIdDismissRequest": {
39380
+ "type": "object",
39381
+ "properties": {
39382
+ "items": {
39383
+ "type": "array",
39384
+ "items": {
39385
+ "type": "string"
39386
+ },
39387
+ "maxItems": 500
39388
+ }
39389
+ },
39390
+ "required": [
39391
+ "items"
39392
+ ],
39393
+ "additionalProperties": false
39394
+ },
39395
+ "PostFirstReadMapsRequest": {
39396
+ "type": "object",
39397
+ "properties": {
39398
+ "map": {
39399
+ "type": "object"
39400
+ }
39401
+ },
39402
+ "required": [
39403
+ "map"
39404
+ ],
39405
+ "additionalProperties": false
39406
+ },
39407
+ "PostFirstReadMapsResponse": {
39408
+ "type": "object",
39409
+ "properties": {
39410
+ "map_id": {},
39411
+ "status": {},
39412
+ "items": {},
39413
+ "next": {}
39414
+ },
39415
+ "required": [
39416
+ "map_id",
39417
+ "status",
39418
+ "items",
39419
+ "next"
39420
+ ]
39421
+ },
38848
39422
  "PostFoundingPlanRequest": {
38849
39423
  "type": "object",
38850
39424
  "properties": {
@@ -42310,6 +42884,42 @@
42310
42884
  "message"
42311
42885
  ]
42312
42886
  },
42887
+ "PostProvisioningInstancesIdRenderSandboxRequest": {
42888
+ "type": "object",
42889
+ "properties": {
42890
+ "key": {
42891
+ "type": "string",
42892
+ "maxLength": 200
42893
+ }
42894
+ },
42895
+ "required": [
42896
+ "key"
42897
+ ],
42898
+ "additionalProperties": false
42899
+ },
42900
+ "PostProvisioningInstancesIdRenderSandboxResponse": {
42901
+ "type": "object",
42902
+ "properties": {
42903
+ "ok": {
42904
+ "type": "boolean"
42905
+ },
42906
+ "queued": {
42907
+ "type": "boolean"
42908
+ },
42909
+ "action": {},
42910
+ "sandbox": {
42911
+ "type": "boolean"
42912
+ },
42913
+ "message": {}
42914
+ },
42915
+ "required": [
42916
+ "ok",
42917
+ "queued",
42918
+ "action",
42919
+ "sandbox",
42920
+ "message"
42921
+ ]
42922
+ },
42313
42923
  "PostProvisioningInstancesIdRepoPrivateResponse": {
42314
42924
  "type": "object",
42315
42925
  "properties": {
@@ -42358,6 +42968,7 @@
42358
42968
  "action": {},
42359
42969
  "status": {},
42360
42970
  "superseded": {},
42971
+ "sandbox_key_lent": {},
42361
42972
  "message": {}
42362
42973
  },
42363
42974
  "required": [
@@ -42366,6 +42977,7 @@
42366
42977
  "action",
42367
42978
  "status",
42368
42979
  "superseded",
42980
+ "sandbox_key_lent",
42369
42981
  "message"
42370
42982
  ]
42371
42983
  },
@@ -43132,6 +43744,43 @@
43132
43744
  "ok"
43133
43745
  ]
43134
43746
  },
43747
+ "PostSsoAppStatusRequest": {
43748
+ "type": "object",
43749
+ "properties": {
43750
+ "client_id": {
43751
+ "type": "string",
43752
+ "maxLength": 200
43753
+ },
43754
+ "client_secret": {
43755
+ "type": "string",
43756
+ "maxLength": 512
43757
+ }
43758
+ },
43759
+ "required": [
43760
+ "client_id",
43761
+ "client_secret"
43762
+ ],
43763
+ "additionalProperties": false
43764
+ },
43765
+ "PostSsoAppStatusResponse": {
43766
+ "type": "object",
43767
+ "properties": {
43768
+ "ok": {
43769
+ "type": "boolean"
43770
+ },
43771
+ "known": {
43772
+ "type": "boolean"
43773
+ },
43774
+ "app": {},
43775
+ "sandbox": {}
43776
+ },
43777
+ "required": [
43778
+ "ok",
43779
+ "known",
43780
+ "app",
43781
+ "sandbox"
43782
+ ]
43783
+ },
43135
43784
  "PostSsoApplicantProfileRequest": {
43136
43785
  "type": "object",
43137
43786
  "properties": {
@@ -44894,9 +45543,9 @@
44894
45543
  "description": "A required dependency/feature is not configured or is temporarily down."
44895
45544
  }
44896
45545
  },
44897
- "x-endpoint-count": 719,
44898
- "x-schema-count": 749,
45546
+ "x-endpoint-count": 729,
45547
+ "x-schema-count": 759,
44899
45548
  "x-undocumented-bodies": 12,
44900
- "x-response-schemas": 468,
45549
+ "x-response-schemas": 473,
44901
45550
  "x-generated-by": "scripts/bongos/gen-api-docs.js"
44902
45551
  }