@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
package/bin/bongos.js CHANGED
@@ -82,6 +82,7 @@ const VERBS = {
82
82
  status: { script: 'status.js', group: 'work', summary: 'Version / criterion progress (bongos status C8)', selfHelp: true },
83
83
  recall: { script: 'recall.js', group: 'work', summary: 'Search the docs + project knowledge (bongos recall "x")' },
84
84
  cost: { script: 'cost.js', group: 'work', summary: 'Log a cost entry' },
85
+ 'first-read': { script: 'first-read.js', group: 'work', summary: 'First read-through of an existing project: check, submit and accept the repository map your own AI wrote' },
85
86
  howto: { script: 'howto.js', group: 'work', summary: 'The how-to guide: show the unread steps for a moment (bongos howto moment first_open)' },
86
87
  genesis: { script: 'genesis.js', group: 'work', summary: 'The founder\'s genesis answers: show, answer, or read them for planning (bongos genesis context)' },
87
88
 
@@ -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
- - 719 operations across 86 resource groups
8
+ - 729 operations across 88 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -154,6 +154,10 @@ function createClient(opts = {}) {
154
154
  // GET /analytics/builder/{id} — rank: any-builder — GET /analytics/builder/:id
155
155
  getAnalyticsBuilderId: (args) => request("GET", "/analytics/builder/{id}", { hasBody: false }, args),
156
156
  },
157
+ "appHost": {
158
+ // GET /app-host — rank: any-builder — GET /app-host
159
+ getAppHost: (args) => request("GET", "/app-host", { hasBody: false }, args),
160
+ },
157
161
  "artistGate": {
158
162
  // GET /artist-gate — rank: any-builder — GET /artist-gate
159
163
  getArtistGate: (args) => request("GET", "/artist-gate", { hasBody: false }, args),
@@ -468,6 +472,22 @@ function createClient(opts = {}) {
468
472
  // GET /feedback/receipt/{id} — rank: public — GET /feedback/receipt/:id
469
473
  getFeedbackReceiptId: (args) => request("GET", "/feedback/receipt/{id}", { hasBody: false }, args),
470
474
  },
475
+ "firstRead": {
476
+ // GET /first-read/catalog — rank: any-builder — GET /first-read/catalog
477
+ getFirstReadCatalog: (args) => request("GET", "/first-read/catalog", { hasBody: false }, args),
478
+ // POST /first-read/maps — rank: metic+archon — POST /first-read/maps
479
+ postFirstReadMaps: (args) => request("POST", "/first-read/maps", { hasBody: true }, args),
480
+ // GET /first-read/maps/{id} — rank: metic+archon — GET /first-read/maps/:id
481
+ getFirstReadMapsId: (args) => request("GET", "/first-read/maps/{id}", { hasBody: false }, args),
482
+ // POST /first-read/maps/{id}/accept — rank: metic+archon — POST /first-read/maps/:id/accept
483
+ postFirstReadMapsIdAccept: (args) => request("POST", "/first-read/maps/{id}/accept", { hasBody: true }, args),
484
+ // POST /first-read/maps/{id}/dismiss — rank: metic+archon — POST /first-read/maps/:id/dismiss
485
+ postFirstReadMapsIdDismiss: (args) => request("POST", "/first-read/maps/{id}/dismiss", { hasBody: true }, args),
486
+ // POST /first-read/maps/{id}/reject — rank: metic+archon — POST /first-read/maps/:id/reject
487
+ postFirstReadMapsIdReject: (args) => request("POST", "/first-read/maps/{id}/reject", { hasBody: true }, args),
488
+ // GET /first-read/prompt — rank: any-builder — GET /first-read/prompt
489
+ getFirstReadPrompt: (args) => request("GET", "/first-read/prompt", { hasBody: false }, args),
490
+ },
471
491
  "founding": {
472
492
  // POST /founding/alive — rank: any-builder — POST /founding/alive
473
493
  postFoundingAlive: (args) => request("POST", "/founding/alive", { hasBody: true }, args),
@@ -1307,6 +1327,8 @@ function createClient(opts = {}) {
1307
1327
  getProvisioningInstancesIdRender: (args) => request("GET", "/provisioning/instances/{id}/render", { hasBody: false }, args),
1308
1328
  // POST /provisioning/instances/{id}/render — rank: any-builder — POST /provisioning/instances/:id/render
1309
1329
  postProvisioningInstancesIdRender: (args) => request("POST", "/provisioning/instances/{id}/render", { hasBody: true }, args),
1330
+ // POST /provisioning/instances/{id}/render/sandbox — rank: any-builder — POST /provisioning/instances/:id/render/sandbox
1331
+ postProvisioningInstancesIdRenderSandbox: (args) => request("POST", "/provisioning/instances/{id}/render/sandbox", { hasBody: true }, args),
1310
1332
  // POST /provisioning/instances/{id}/repo-private — rank: any-builder — POST /provisioning/instances/:id/repo-private
1311
1333
  postProvisioningInstancesIdRepoPrivate: (args) => request("POST", "/provisioning/instances/{id}/repo-private", { hasBody: true }, args),
1312
1334
  // POST /provisioning/instances/{id}/restart — rank: any-builder — POST /provisioning/instances/:id/restart
@@ -1501,6 +1523,8 @@ function createClient(opts = {}) {
1501
1523
  "sso": {
1502
1524
  // POST /sso/activity/rollup — rank: public — POST /sso/activity/rollup
1503
1525
  postSsoActivityRollup: (args) => request("POST", "/sso/activity/rollup", { hasBody: true }, args),
1526
+ // POST /sso/app-status — rank: public — POST /sso/app-status
1527
+ postSsoAppStatus: (args) => request("POST", "/sso/app-status", { hasBody: true }, args),
1504
1528
  // POST /sso/applicant-profile — rank: public — POST /sso/applicant-profile
1505
1529
  postSsoApplicantProfile: (args) => request("POST", "/sso/applicant-profile", { hasBody: true }, args),
1506
1530
  // GET /sso/authorize — rank: public — GET /sso/authorize
@@ -153,6 +153,10 @@ function createClient(opts = {}) {
153
153
  // GET /analytics/builder/{id} — rank: any-builder — GET /analytics/builder/:id
154
154
  getAnalyticsBuilderId: (args) => request("GET", "/analytics/builder/{id}", { hasBody: false }, args),
155
155
  },
156
+ "appHost": {
157
+ // GET /app-host — rank: any-builder — GET /app-host
158
+ getAppHost: (args) => request("GET", "/app-host", { hasBody: false }, args),
159
+ },
156
160
  "artistGate": {
157
161
  // GET /artist-gate — rank: any-builder — GET /artist-gate
158
162
  getArtistGate: (args) => request("GET", "/artist-gate", { hasBody: false }, args),
@@ -467,6 +471,22 @@ function createClient(opts = {}) {
467
471
  // GET /feedback/receipt/{id} — rank: public — GET /feedback/receipt/:id
468
472
  getFeedbackReceiptId: (args) => request("GET", "/feedback/receipt/{id}", { hasBody: false }, args),
469
473
  },
474
+ "firstRead": {
475
+ // GET /first-read/catalog — rank: any-builder — GET /first-read/catalog
476
+ getFirstReadCatalog: (args) => request("GET", "/first-read/catalog", { hasBody: false }, args),
477
+ // POST /first-read/maps — rank: metic+archon — POST /first-read/maps
478
+ postFirstReadMaps: (args) => request("POST", "/first-read/maps", { hasBody: true }, args),
479
+ // GET /first-read/maps/{id} — rank: metic+archon — GET /first-read/maps/:id
480
+ getFirstReadMapsId: (args) => request("GET", "/first-read/maps/{id}", { hasBody: false }, args),
481
+ // POST /first-read/maps/{id}/accept — rank: metic+archon — POST /first-read/maps/:id/accept
482
+ postFirstReadMapsIdAccept: (args) => request("POST", "/first-read/maps/{id}/accept", { hasBody: true }, args),
483
+ // POST /first-read/maps/{id}/dismiss — rank: metic+archon — POST /first-read/maps/:id/dismiss
484
+ postFirstReadMapsIdDismiss: (args) => request("POST", "/first-read/maps/{id}/dismiss", { hasBody: true }, args),
485
+ // POST /first-read/maps/{id}/reject — rank: metic+archon — POST /first-read/maps/:id/reject
486
+ postFirstReadMapsIdReject: (args) => request("POST", "/first-read/maps/{id}/reject", { hasBody: true }, args),
487
+ // GET /first-read/prompt — rank: any-builder — GET /first-read/prompt
488
+ getFirstReadPrompt: (args) => request("GET", "/first-read/prompt", { hasBody: false }, args),
489
+ },
470
490
  "founding": {
471
491
  // POST /founding/alive — rank: any-builder — POST /founding/alive
472
492
  postFoundingAlive: (args) => request("POST", "/founding/alive", { hasBody: true }, args),
@@ -1306,6 +1326,8 @@ function createClient(opts = {}) {
1306
1326
  getProvisioningInstancesIdRender: (args) => request("GET", "/provisioning/instances/{id}/render", { hasBody: false }, args),
1307
1327
  // POST /provisioning/instances/{id}/render — rank: any-builder — POST /provisioning/instances/:id/render
1308
1328
  postProvisioningInstancesIdRender: (args) => request("POST", "/provisioning/instances/{id}/render", { hasBody: true }, args),
1329
+ // POST /provisioning/instances/{id}/render/sandbox — rank: any-builder — POST /provisioning/instances/:id/render/sandbox
1330
+ postProvisioningInstancesIdRenderSandbox: (args) => request("POST", "/provisioning/instances/{id}/render/sandbox", { hasBody: true }, args),
1309
1331
  // POST /provisioning/instances/{id}/repo-private — rank: any-builder — POST /provisioning/instances/:id/repo-private
1310
1332
  postProvisioningInstancesIdRepoPrivate: (args) => request("POST", "/provisioning/instances/{id}/repo-private", { hasBody: true }, args),
1311
1333
  // POST /provisioning/instances/{id}/restart — rank: any-builder — POST /provisioning/instances/:id/restart
@@ -1500,6 +1522,8 @@ function createClient(opts = {}) {
1500
1522
  "sso": {
1501
1523
  // POST /sso/activity/rollup — rank: public — POST /sso/activity/rollup
1502
1524
  postSsoActivityRollup: (args) => request("POST", "/sso/activity/rollup", { hasBody: true }, args),
1525
+ // POST /sso/app-status — rank: public — POST /sso/app-status
1526
+ postSsoAppStatus: (args) => request("POST", "/sso/app-status", { hasBody: true }, args),
1503
1527
  // POST /sso/applicant-profile — rank: public — POST /sso/applicant-profile
1504
1528
  postSsoApplicantProfile: (args) => request("POST", "/sso/applicant-profile", { hasBody: true }, args),
1505
1529
  // GET /sso/authorize — rank: public — GET /sso/authorize
@@ -75,6 +75,8 @@ export interface GetCoreUpgradesResponse { ok: boolean; running: unknown; limit:
75
75
  export interface GetDiscordChannelsPlanResponse { ok: boolean; guild_id: unknown; op_count: unknown; ops: unknown; warnings: unknown }
76
76
  export interface GetDiscordChannelsSnapshotResponse { ok: boolean; guild_id: unknown; config: unknown; warnings: unknown }
77
77
  export interface GetDoneWhenPendingReviewResponse { criteria: unknown; count: unknown }
78
+ export interface GetFirstReadCatalogResponse { available: unknown; modules: unknown }
79
+ export interface GetFirstReadPromptResponse { schema: unknown; file: unknown; prompt: unknown; example: unknown; limits: unknown; catalog: unknown }
78
80
  export interface GetFrontDoorGuideMineResponse { ok: boolean; conversation: unknown }
79
81
  export interface GetGithubOrgsOrgResponse { org: unknown }
80
82
  export interface GetGithubRepoResponse { ok: boolean; repo: unknown; private_deployable: boolean }
@@ -164,7 +166,7 @@ export interface GetProvisioningHealthResponse { module: unknown; ok: boolean; c
164
166
  export interface GetProvisioningInstancesIdEnvManifestResponse { instance: unknown; env_vars: unknown; environments: unknown; values_held: boolean; note: unknown }
165
167
  export interface GetProvisioningInstancesIdInviteSuggestionsResponse { suggested: unknown; seeking: unknown; reason: unknown; unavailable?: unknown }
166
168
  export interface GetProvisioningInstancesIdLookResponse { ok: boolean; look: unknown; options: unknown; logo_max_bytes: unknown }
167
- export interface GetProvisioningInstancesIdRenderResponse { ok: boolean; app: unknown; env_vars: unknown; values_held: boolean }
169
+ export interface GetProvisioningInstancesIdRenderResponse { ok: boolean; app: unknown; sandbox: unknown; env_vars: unknown; values_held: boolean }
168
170
  export interface GetProvisioningInstancesIdResponse { instance: unknown; open_intent: unknown; github_app: unknown; github_setup: unknown }
169
171
  export interface GetProvisioningInstancesIdSettingsResponse { ok: boolean; settings: unknown; planet: unknown; options: unknown }
170
172
  export interface GetProvisioningInstancesResponse { instances: unknown }
@@ -389,6 +391,10 @@ export interface PostDoneWhenCriterionIdUnsatisfyRequest { reason?: string }
389
391
  export interface PostDoneWhenCriterionIdUnsatisfyResponse { criterion: unknown }
390
392
  export interface PostFeedbackReceiptRequest { sha256: string; kind?: "bug" | "idea" }
391
393
  export interface PostFeedbackReceiptResponse { ok: boolean; receipt: unknown; hub: unknown }
394
+ export interface PostFirstReadMapsIdAcceptRequest { all?: boolean; items?: string[] }
395
+ export interface PostFirstReadMapsIdDismissRequest { items: string[] }
396
+ export interface PostFirstReadMapsRequest { map: Record<string, unknown> }
397
+ export interface PostFirstReadMapsResponse { map_id: unknown; status: unknown; items: unknown; next: unknown }
392
398
  export interface PostFoundingPlanRequest { days?: Record<string, unknown>; passes?: number; advisors?: string; government?: string; expected_builders?: number; existing?: boolean }
393
399
  export interface PostFrontDoorGuideConversationsIdAttachRequest { token: string }
394
400
  export interface PostFrontDoorGuideConversationsIdAttachResponse { ok: boolean; conversation: unknown }
@@ -607,9 +613,11 @@ export interface PostProvisioningInstancesIdGithubAppRequest { account?: string;
607
613
  export interface PostProvisioningInstancesIdGithubAppResponse { state: unknown; account: unknown; post_url: unknown; personal_url: unknown; org_url: unknown; org_login: unknown; manifest: unknown; redirect_url: unknown; expires_at: unknown }
608
614
  export interface PostProvisioningInstancesIdRenderRequest { key: string; owner_id: string; mode: string; service_id?: string; web_plan?: string; db_plan?: string; region?: string; runtime?: string; build_command?: string; start_command?: string; database?: boolean }
609
615
  export interface PostProvisioningInstancesIdRenderResponse { ok: boolean; queued: boolean; action: unknown; mode: unknown; with_setup: boolean; message: unknown }
616
+ export interface PostProvisioningInstancesIdRenderSandboxRequest { key: string }
617
+ export interface PostProvisioningInstancesIdRenderSandboxResponse { ok: boolean; queued: boolean; action: unknown; sandbox: boolean; message: unknown }
610
618
  export interface PostProvisioningInstancesIdRepoPrivateResponse { ok: boolean; queued: unknown; action: unknown; status: unknown; message: unknown }
611
619
  export interface PostProvisioningInstancesIdRestartResponse { ok: boolean; queued: unknown; action: unknown; status: unknown; message: unknown }
612
- export interface PostProvisioningInstancesIdTeardownResponse { ok: boolean; queued: unknown; action: unknown; status: unknown; superseded: unknown; message: unknown }
620
+ export interface PostProvisioningInstancesIdTeardownResponse { ok: boolean; queued: unknown; action: unknown; status: unknown; superseded: unknown; sandbox_key_lent: unknown; message: unknown }
613
621
  export interface PostProvisioningInstancesIdUpdateSubscriptionRequest { subscribed: boolean }
614
622
  export interface PostProvisioningInstancesIdUpdateSubscriptionResponse { ok: boolean; update_subscribed: unknown; previous: unknown; changed: unknown }
615
623
  export interface PostProvisioningInstancesRequest { slug: string; target_ref?: string; hosting_shape?: string; domain?: string; no_address?: boolean; tier?: string; onboard_mode?: string; type?: string; description?: string; detail?: Record<string, unknown>; modules?: string[]; terms_acknowledged?: boolean; demo?: Record<string, unknown>; ship_mode?: "auto" | "manual"; genesis?: boolean; test?: boolean }
@@ -652,6 +660,8 @@ export interface PostSpecialitiesRequest { name: string; discipline: string; sum
652
660
  export interface PostSpecialitiesResponse { speciality: unknown }
653
661
  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; crafts?: unknown }
654
662
  export interface PostSsoActivityRollupResponse { ok: boolean }
663
+ export interface PostSsoAppStatusRequest { client_id: string; client_secret: string }
664
+ export interface PostSsoAppStatusResponse { ok: boolean; known: boolean; app: unknown; sandbox: unknown }
655
665
  export interface PostSsoApplicantProfileRequest { client_id: string; client_secret: string; github_id: StringifiableId }
656
666
  export interface PostSsoApplicantProfileResponse { profile: unknown; guild: unknown }
657
667
  export interface PostSsoDevicePollRequest { device_code: string }
@@ -836,6 +846,10 @@ export interface BongosClient {
836
846
  /** GET /analytics/builder/{id} — rank: any-builder */
837
847
  getAnalyticsBuilderId(args?: RequestArgs): Promise<ApiResponse>;
838
848
  };
849
+ "appHost": {
850
+ /** GET /app-host — rank: any-builder */
851
+ getAppHost(args?: RequestArgs): Promise<ApiResponse>;
852
+ };
839
853
  "artistGate": {
840
854
  /** GET /artist-gate — rank: any-builder */
841
855
  getArtistGate(args?: RequestArgs): Promise<GetArtistGateResponse>;
@@ -1150,6 +1164,22 @@ export interface BongosClient {
1150
1164
  /** GET /feedback/receipt/{id} — rank: public */
1151
1165
  getFeedbackReceiptId(args?: RequestArgs): Promise<ApiResponse>;
1152
1166
  };
1167
+ "firstRead": {
1168
+ /** GET /first-read/catalog — rank: any-builder */
1169
+ getFirstReadCatalog(args?: RequestArgs): Promise<GetFirstReadCatalogResponse>;
1170
+ /** POST /first-read/maps — rank: metic+archon */
1171
+ postFirstReadMaps(args: RequestArgs & { body: PostFirstReadMapsRequest }): Promise<PostFirstReadMapsResponse>;
1172
+ /** GET /first-read/maps/{id} — rank: metic+archon */
1173
+ getFirstReadMapsId(args?: RequestArgs): Promise<ApiResponse>;
1174
+ /** POST /first-read/maps/{id}/accept — rank: metic+archon */
1175
+ postFirstReadMapsIdAccept(args?: RequestArgs & { body?: PostFirstReadMapsIdAcceptRequest }): Promise<ApiResponse>;
1176
+ /** POST /first-read/maps/{id}/dismiss — rank: metic+archon */
1177
+ postFirstReadMapsIdDismiss(args: RequestArgs & { body: PostFirstReadMapsIdDismissRequest }): Promise<ApiResponse>;
1178
+ /** POST /first-read/maps/{id}/reject — rank: metic+archon */
1179
+ postFirstReadMapsIdReject(args?: RequestArgs): Promise<ApiResponse>;
1180
+ /** GET /first-read/prompt — rank: any-builder */
1181
+ getFirstReadPrompt(args?: RequestArgs): Promise<GetFirstReadPromptResponse>;
1182
+ };
1153
1183
  "founding": {
1154
1184
  /** POST /founding/alive — rank: any-builder */
1155
1185
  postFoundingAlive(args?: RequestArgs): Promise<ApiResponse>;
@@ -1989,6 +2019,8 @@ export interface BongosClient {
1989
2019
  getProvisioningInstancesIdRender(args?: RequestArgs): Promise<GetProvisioningInstancesIdRenderResponse>;
1990
2020
  /** POST /provisioning/instances/{id}/render — rank: any-builder */
1991
2021
  postProvisioningInstancesIdRender(args: RequestArgs & { body: PostProvisioningInstancesIdRenderRequest }): Promise<PostProvisioningInstancesIdRenderResponse>;
2022
+ /** POST /provisioning/instances/{id}/render/sandbox — rank: any-builder */
2023
+ postProvisioningInstancesIdRenderSandbox(args: RequestArgs & { body: PostProvisioningInstancesIdRenderSandboxRequest }): Promise<PostProvisioningInstancesIdRenderSandboxResponse>;
1992
2024
  /** POST /provisioning/instances/{id}/repo-private — rank: any-builder */
1993
2025
  postProvisioningInstancesIdRepoPrivate(args?: RequestArgs): Promise<PostProvisioningInstancesIdRepoPrivateResponse>;
1994
2026
  /** POST /provisioning/instances/{id}/restart — rank: any-builder */
@@ -2183,6 +2215,8 @@ export interface BongosClient {
2183
2215
  "sso": {
2184
2216
  /** POST /sso/activity/rollup — rank: public */
2185
2217
  postSsoActivityRollup(args: RequestArgs & { body: PostSsoActivityRollupRequest }): Promise<PostSsoActivityRollupResponse>;
2218
+ /** POST /sso/app-status — rank: public */
2219
+ postSsoAppStatus(args: RequestArgs & { body: PostSsoAppStatusRequest }): Promise<PostSsoAppStatusResponse>;
2186
2220
  /** POST /sso/applicant-profile — rank: public */
2187
2221
  postSsoApplicantProfile(args: RequestArgs & { body: PostSsoApplicantProfileRequest }): Promise<PostSsoApplicantProfileResponse>;
2188
2222
  /** GET /sso/authorize — rank: public */
@@ -150,6 +150,10 @@ export function createClient(opts = {}) {
150
150
  // GET /analytics/builder/{id} — rank: any-builder — GET /analytics/builder/:id
151
151
  getAnalyticsBuilderId: (args) => request("GET", "/analytics/builder/{id}", { hasBody: false }, args),
152
152
  },
153
+ "appHost": {
154
+ // GET /app-host — rank: any-builder — GET /app-host
155
+ getAppHost: (args) => request("GET", "/app-host", { hasBody: false }, args),
156
+ },
153
157
  "artistGate": {
154
158
  // GET /artist-gate — rank: any-builder — GET /artist-gate
155
159
  getArtistGate: (args) => request("GET", "/artist-gate", { hasBody: false }, args),
@@ -464,6 +468,22 @@ export function createClient(opts = {}) {
464
468
  // GET /feedback/receipt/{id} — rank: public — GET /feedback/receipt/:id
465
469
  getFeedbackReceiptId: (args) => request("GET", "/feedback/receipt/{id}", { hasBody: false }, args),
466
470
  },
471
+ "firstRead": {
472
+ // GET /first-read/catalog — rank: any-builder — GET /first-read/catalog
473
+ getFirstReadCatalog: (args) => request("GET", "/first-read/catalog", { hasBody: false }, args),
474
+ // POST /first-read/maps — rank: metic+archon — POST /first-read/maps
475
+ postFirstReadMaps: (args) => request("POST", "/first-read/maps", { hasBody: true }, args),
476
+ // GET /first-read/maps/{id} — rank: metic+archon — GET /first-read/maps/:id
477
+ getFirstReadMapsId: (args) => request("GET", "/first-read/maps/{id}", { hasBody: false }, args),
478
+ // POST /first-read/maps/{id}/accept — rank: metic+archon — POST /first-read/maps/:id/accept
479
+ postFirstReadMapsIdAccept: (args) => request("POST", "/first-read/maps/{id}/accept", { hasBody: true }, args),
480
+ // POST /first-read/maps/{id}/dismiss — rank: metic+archon — POST /first-read/maps/:id/dismiss
481
+ postFirstReadMapsIdDismiss: (args) => request("POST", "/first-read/maps/{id}/dismiss", { hasBody: true }, args),
482
+ // POST /first-read/maps/{id}/reject — rank: metic+archon — POST /first-read/maps/:id/reject
483
+ postFirstReadMapsIdReject: (args) => request("POST", "/first-read/maps/{id}/reject", { hasBody: true }, args),
484
+ // GET /first-read/prompt — rank: any-builder — GET /first-read/prompt
485
+ getFirstReadPrompt: (args) => request("GET", "/first-read/prompt", { hasBody: false }, args),
486
+ },
467
487
  "founding": {
468
488
  // POST /founding/alive — rank: any-builder — POST /founding/alive
469
489
  postFoundingAlive: (args) => request("POST", "/founding/alive", { hasBody: true }, args),
@@ -1303,6 +1323,8 @@ export function createClient(opts = {}) {
1303
1323
  getProvisioningInstancesIdRender: (args) => request("GET", "/provisioning/instances/{id}/render", { hasBody: false }, args),
1304
1324
  // POST /provisioning/instances/{id}/render — rank: any-builder — POST /provisioning/instances/:id/render
1305
1325
  postProvisioningInstancesIdRender: (args) => request("POST", "/provisioning/instances/{id}/render", { hasBody: true }, args),
1326
+ // POST /provisioning/instances/{id}/render/sandbox — rank: any-builder — POST /provisioning/instances/:id/render/sandbox
1327
+ postProvisioningInstancesIdRenderSandbox: (args) => request("POST", "/provisioning/instances/{id}/render/sandbox", { hasBody: true }, args),
1306
1328
  // POST /provisioning/instances/{id}/repo-private — rank: any-builder — POST /provisioning/instances/:id/repo-private
1307
1329
  postProvisioningInstancesIdRepoPrivate: (args) => request("POST", "/provisioning/instances/{id}/repo-private", { hasBody: true }, args),
1308
1330
  // POST /provisioning/instances/{id}/restart — rank: any-builder — POST /provisioning/instances/:id/restart
@@ -1497,6 +1519,8 @@ export function createClient(opts = {}) {
1497
1519
  "sso": {
1498
1520
  // POST /sso/activity/rollup — rank: public — POST /sso/activity/rollup
1499
1521
  postSsoActivityRollup: (args) => request("POST", "/sso/activity/rollup", { hasBody: true }, args),
1522
+ // POST /sso/app-status — rank: public — POST /sso/app-status
1523
+ postSsoAppStatus: (args) => request("POST", "/sso/app-status", { hasBody: true }, args),
1500
1524
  // POST /sso/applicant-profile — rank: public — POST /sso/applicant-profile
1501
1525
  postSsoApplicantProfile: (args) => request("POST", "/sso/applicant-profile", { hasBody: true }, args),
1502
1526
  // GET /sso/authorize — rank: public — GET /sso/authorize
@@ -106,3 +106,11 @@ Each sibling task's description now opens with a dated note, *"Re-read against A
106
106
  | [task 1005291](https://cloudbongos.com/builders#/task/1005291) | A read-only key is the floor; the gate is an outbound wrapper in the starter active under `BONGOS_SANDBOX=1`, with its limit said plainly; free plan blocks mail ports. |
107
107
  | [task 1005292](https://cloudbongos.com/builders#/task/1005292) | Same rule over the release pin; a second instance takes every release and carries a throwaway test project; owner choice 2 and the patch auto-move question are asked here. |
108
108
  | [task 1005293](https://cloudbongos.com/builders#/task/1005293) | Added checks: no live deploy after a ship, promote refuses without the key, the sandbox band shows, sandbox data is fake, and the lent key is confirmed read-only. |
109
+
110
+ ## 10. Amendment — what setting it up found (2026-11-13, [task 1005289](https://cloudbongos.com/builders#/task/1005289))
111
+
112
+ - **A second database in one server is allowed.** Render's own page ([render.com/docs/postgresql-creating-connecting](https://render.com/docs/postgresql-creating-connecting), section "Adding multiple databases to a single instance", read 2026-11-13) says extra databases can be made in an instance, with plain SQL (`CREATE DATABASE`) over a psql session, and reached on the instance's same addresses with the new name as the last part. Render's API has no call for it, so the runner makes it with SQL over the server's external address. The page names no plan limit and no count limit. **Not yet tried on a real Render account** — no account was available to the session that built it; the walk ([task 1005293](https://cloudbongos.com/builders#/task/1005293)) is the first real run. Owner choice 1 in §6 therefore does not arise unless that run says otherwise; if the database stage fails, the sandbox runs with no database and says why, and nothing paid is bought in its place.
113
+ - **The database starts empty.** The app's own seed fills it (the starter's job under `BONGOS_SANDBOX=1`); the platform cannot know an app's tables.
114
+ - **The live service's switch to manual deploys is left to the promote task** ([task 1005290](https://cloudbongos.com/builders#/task/1005290)), so that live never stops updating before there is a button that moves it.
115
+ - **Teardown needs the owner's key to remove the sandbox**, typed on the teardown screen and used once. The Render client gains one delete, `deleteSandboxService`, which refuses anything not named `…-sandbox` on the free plan. Without the key the sandbox stays on the owner's account and the owner is told exactly what to remove.
116
+
@@ -58,4 +58,5 @@ every stage, not a strategize feature that charter then copies.
58
58
  the hall version (task 1005285). Today a founder works a stage through their AI session
59
59
  and `npx bongos genesis …`.
60
60
  - Task 1005115 renders each stage's record as an editable document from this store.
61
+ - Charter adopted it (task 1005119): how decisions should go and the founder's principles. A question may declare `choices` (a closed answer, stored as its key) where another module reads the answer; the charter stage's read carries the government module's recommendation built from them.
61
62
  - Scope adopted it with the project interview (task 1005114): six questions in three groups. `/goal-create` and `/planning-session` read the answers before planning, through `genesis.js context`.