@bongos/core 1.20.57 → 1.20.59

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 (73) hide show
  1. package/.bongos-core.json +188 -53
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +10 -0
  4. package/clients/bongos-client/index.cjs +10 -0
  5. package/clients/bongos-client/index.d.ts +14 -4
  6. package/clients/bongos-client/index.mjs +10 -0
  7. package/docs/api/openapi.json +220 -20
  8. package/docs/api-reference.md +8 -3
  9. package/docs/architecture.md +1 -0
  10. package/docs/copy-inventory.md +21 -5
  11. package/docs/copy-registry.json +169 -15
  12. package/docs/module-api-changelog.md +4 -0
  13. package/docs/page-inventory.json +8 -3
  14. package/docs/page-readings.json +72 -72
  15. package/migrations/core_268_builders_main_discipline.sql +35 -0
  16. package/modules/copy-desk/artist-stats.js +56 -0
  17. package/modules/copy-desk/module.json +1 -1
  18. package/modules/copy-desk/page-status.js +39 -0
  19. package/modules/copy-desk/routes/copy-desk.js +7 -16
  20. package/modules/copy-desk/tests/copy_no_cms.mjs +10 -1
  21. package/modules/economy/credits-by-craft.js +208 -0
  22. package/modules/economy/reward.js +8 -0
  23. package/modules/hall-ui/public/genesis/r5-life-1-primordial-sea-cut.webp +0 -0
  24. package/modules/hall-ui/public/genesis/r5-life-1-primordial-sea.jpg +0 -0
  25. package/modules/hall-ui/public/genesis/r5-life-2-first-cells-cut.webp +0 -0
  26. package/modules/hall-ui/public/genesis/r5-life-2-first-cells.jpg +0 -0
  27. package/modules/hall-ui/public/genesis/r5-life-3-genome-cut.webp +0 -0
  28. package/modules/hall-ui/public/genesis/r5-life-3-genome.jpg +0 -0
  29. package/modules/hall-ui/public/genesis/r5-life-4-membrane-cut.webp +0 -0
  30. package/modules/hall-ui/public/genesis/r5-life-4-membrane.jpg +0 -0
  31. package/modules/hall-ui/public/genesis/r5-life-5-nervous-system-cut.webp +0 -0
  32. package/modules/hall-ui/public/genesis/r5-life-5-nervous-system.jpg +0 -0
  33. package/modules/hall-ui/public/genesis-home.js +349 -0
  34. package/modules/hall-ui/public/hall-render.js +2 -2
  35. package/modules/hall-ui/public/index-genesis-decide.states.json +13 -0
  36. package/modules/hall-ui/public/index-genesis.states.json +13 -0
  37. package/modules/hall-ui/public/index.html +2 -0
  38. package/modules/hall-ui/public/profile.js +1 -1
  39. package/modules/hall-ui/public/style.css +65 -0
  40. package/modules/hall-ui/records/genesis-home.md +18 -0
  41. package/modules/ideas/ideator-stats.js +149 -0
  42. package/modules/ideas/module.json +2 -1
  43. package/modules/ideas/routes/inbox.js +7 -0
  44. package/modules/lifecycle/activity.js +5 -2
  45. package/modules/lifecycle/db-analytics.js +4 -2
  46. package/modules/lifecycle/db-tasks.js +49 -1
  47. package/modules/lifecycle/db.js +3 -2
  48. package/modules/lifecycle/kickoff-checklist.js +54 -1
  49. package/modules/lifecycle/kickoff-seed.js +61 -2
  50. package/modules/lifecycle/page-tweak-reads.js +23 -5
  51. package/modules/lifecycle/routes/kickoff-seed.js +7 -1
  52. package/modules/onboarding/genesis-home.js +274 -0
  53. package/modules/onboarding/routes/onboarding.js +56 -0
  54. package/modules/ui-design/kit/fixtures/founding-genesis-decide.json +108 -0
  55. package/modules/ui-design/kit/fixtures/founding-genesis-stage.json +162 -0
  56. package/modules/ui-design/kit/fixtures/government-constitution-sample.json +205 -0
  57. package/modules/ui-design/kit/serve.js +7 -1
  58. package/package-lock.json +2 -2
  59. package/package.json +1 -1
  60. package/release-notes.json +12 -0
  61. package/scripts/gds/run-unit-tests.js +5 -0
  62. package/src/bongos/db.js +44 -6
  63. package/src/bongos/role-stats.js +155 -0
  64. package/src/bongos/routes/builders.js +15 -2
  65. package/src/bongos/routes/me.js +11 -3
  66. package/src/module-api.js +1 -1
  67. package/tests/copy_desk_page_reads.mjs +1 -1
  68. package/tests/fixtures/page-ledger.mjs +1 -1
  69. package/tests/genesis_home.mjs +288 -0
  70. package/tests/main_discipline.mjs +81 -0
  71. package/tests/profile_role_stats.mjs +416 -0
  72. package/tests/role_stats_db.mjs +237 -0
  73. package/tests/tweak_replaces_artist_review.mjs +1 -1
@@ -378,8 +378,18 @@ function createClient(opts = {}) {
378
378
  postFeedback: (args) => request("POST", "/feedback", { hasBody: true }, args),
379
379
  },
380
380
  "founding": {
381
+ // POST /founding/alive — rank: any-builder — POST /founding/alive
382
+ postFoundingAlive: (args) => request("POST", "/founding/alive", { hasBody: true }, args),
381
383
  // GET /founding/builders — rank: any-builder — GET /founding/builders
382
384
  getFoundingBuilders: (args) => request("GET", "/founding/builders", { hasBody: false }, args),
385
+ // GET /founding/genesis — rank: any-builder — GET /founding/genesis
386
+ getFoundingGenesis: (args) => request("GET", "/founding/genesis", { hasBody: false }, args),
387
+ // POST /founding/plan — rank: any-builder — POST /founding/plan
388
+ postFoundingPlan: (args) => request("POST", "/founding/plan", { hasBody: true }, args),
389
+ // POST /founding/stages/{stage}/close — rank: any-builder — POST /founding/stages/:stage/close
390
+ postFoundingStagesStageClose: (args) => request("POST", "/founding/stages/{stage}/close", { hasBody: true }, args),
391
+ // POST /founding/start — rank: any-builder — POST /founding/start
392
+ postFoundingStart: (args) => request("POST", "/founding/start", { hasBody: true }, args),
383
393
  },
384
394
  "gateApprovals": {
385
395
  // GET /gate-approvals — rank: metic+archon — GET /gate-approvals
@@ -43,7 +43,7 @@ export interface GetBuildersDirectoryResponse { builders: unknown }
43
43
  export interface GetBuildersIdActiveClaimsResponse { builder_id: unknown; claims: unknown; stale_hours: unknown; stale_hours_source: unknown }
44
44
  export interface GetBuildersIdActivityResponse { builder_id: unknown; section: unknown; role: unknown; rows: unknown; total: unknown }
45
45
  export interface GetBuildersIdOnboardingResponse { builder_id: unknown; onboarding: unknown }
46
- export interface GetBuildersIdProfileResponse { builder: unknown; shipped_count: unknown; recent_ships: unknown; achievements: unknown; cross_project?: unknown; handle?: unknown }
46
+ export interface GetBuildersIdProfileResponse { builder: unknown; shipped_count: unknown; recent_ships: unknown; achievements: unknown; roles: unknown; cross_project?: unknown; handle?: unknown }
47
47
  export interface GetBuildersMePendingRankChangeResponse { change: unknown; greeting?: unknown }
48
48
  export interface GetBuildersRosterResponse { builders: unknown; stale_hours: unknown; stale_hours_source: unknown }
49
49
  export interface GetCliCommandsResponse { version: unknown; groups: unknown }
@@ -61,7 +61,6 @@ export interface GetCoreUpgradesResponse { ok: boolean; running: unknown; limit:
61
61
  export interface GetDiscordChannelsPlanResponse { ok: boolean; guild_id: unknown; op_count: unknown; ops: unknown; warnings: unknown }
62
62
  export interface GetDiscordChannelsSnapshotResponse { ok: boolean; guild_id: unknown; config: unknown; warnings: unknown }
63
63
  export interface GetDoneWhenPendingReviewResponse { criteria: unknown; count: unknown }
64
- export interface GetFoundingBuildersResponse { builders: unknown }
65
64
  export interface GetGithubRepoResponse { ok: boolean; repo: unknown; private_deployable: boolean }
66
65
  export interface GetGithubReposResponse { repos: unknown }
67
66
  export interface GetGoalTaskRelevancePendingResponse { flags: unknown; count: unknown }
@@ -205,7 +204,7 @@ export interface PatchInboxIdRequest { status?: "open" | "promoted" | "discarded
205
204
  export interface PatchInboxIdResponse { idea: unknown }
206
205
  export interface PatchMeCrossProjectRequest { hide_stats?: boolean; account_visibility?: string; recruiter_discoverable?: boolean }
207
206
  export interface PatchMeCrossProjectResponse { hide_stats: boolean; account_visibility: unknown; recruiter_discoverable: unknown; recruiter_discoverable_effective: unknown }
208
- export interface PatchMeDisciplinesRequest { preferred_disciplines: string[] }
207
+ export interface PatchMeDisciplinesRequest { preferred_disciplines: string[]; main_discipline?: string }
209
208
  export interface PatchMeDisciplinesResponse { builder: unknown; onboarding: unknown }
210
209
  export interface PatchMeDisplayNameResponse { display_name: unknown; max_length: unknown }
211
210
  export interface PatchMeEventSoundPrefsResponse { prefs: unknown; effective: unknown; effective_wav: unknown; events: unknown }
@@ -298,6 +297,7 @@ export interface PostDoneWhenCriterionIdUatRequest { kind: string; recording?: s
298
297
  export interface PostDoneWhenCriterionIdUatResponse { ok: boolean; signoff: unknown; criterion_closed: unknown; achieved_goals: unknown; closed_versions: unknown }
299
298
  export interface PostDoneWhenCriterionIdUnsatisfyResponse { criterion: unknown }
300
299
  export interface PostFeedbackRequest { message: string; kind?: "bug" | "idea"; context?: unknown }
300
+ export interface PostFoundingPlanRequest { days?: Record<string, unknown>; passes?: number; advisors?: string; government?: string; expected_builders?: number; existing?: boolean }
301
301
  export interface PostGateApprovalsPrApproveResponse { ok: boolean; pr: unknown; already_clear?: boolean; message: unknown; head_sha?: unknown; status_set?: boolean; recheck?: unknown; held_for_artist?: unknown }
302
302
  export interface PostGithubRepoVisibilityRequest { repo: string; visibility: "public" | "private" }
303
303
  export interface PostGithubRepoVisibilityResponse { ok: boolean; repo: unknown; private_deployable: boolean }
@@ -818,8 +818,18 @@ export interface BongosClient {
818
818
  postFeedback(args: RequestArgs & { body: PostFeedbackRequest }): Promise<ApiResponse>;
819
819
  };
820
820
  "founding": {
821
+ /** POST /founding/alive — rank: any-builder */
822
+ postFoundingAlive(args?: RequestArgs): Promise<ApiResponse>;
821
823
  /** GET /founding/builders — rank: any-builder */
822
- getFoundingBuilders(args?: RequestArgs): Promise<GetFoundingBuildersResponse>;
824
+ getFoundingBuilders(args?: RequestArgs): Promise<ApiResponse>;
825
+ /** GET /founding/genesis — rank: any-builder */
826
+ getFoundingGenesis(args?: RequestArgs): Promise<ApiResponse>;
827
+ /** POST /founding/plan — rank: any-builder */
828
+ postFoundingPlan(args?: RequestArgs & { body?: PostFoundingPlanRequest }): Promise<ApiResponse>;
829
+ /** POST /founding/stages/{stage}/close — rank: any-builder */
830
+ postFoundingStagesStageClose(args?: RequestArgs): Promise<ApiResponse>;
831
+ /** POST /founding/start — rank: any-builder */
832
+ postFoundingStart(args?: RequestArgs): Promise<ApiResponse>;
823
833
  };
824
834
  "gateApprovals": {
825
835
  /** GET /gate-approvals — rank: metic+archon */
@@ -375,8 +375,18 @@ export function createClient(opts = {}) {
375
375
  postFeedback: (args) => request("POST", "/feedback", { hasBody: true }, args),
376
376
  },
377
377
  "founding": {
378
+ // POST /founding/alive — rank: any-builder — POST /founding/alive
379
+ postFoundingAlive: (args) => request("POST", "/founding/alive", { hasBody: true }, args),
378
380
  // GET /founding/builders — rank: any-builder — GET /founding/builders
379
381
  getFoundingBuilders: (args) => request("GET", "/founding/builders", { hasBody: false }, args),
382
+ // GET /founding/genesis — rank: any-builder — GET /founding/genesis
383
+ getFoundingGenesis: (args) => request("GET", "/founding/genesis", { hasBody: false }, args),
384
+ // POST /founding/plan — rank: any-builder — POST /founding/plan
385
+ postFoundingPlan: (args) => request("POST", "/founding/plan", { hasBody: true }, args),
386
+ // POST /founding/stages/{stage}/close — rank: any-builder — POST /founding/stages/:stage/close
387
+ postFoundingStagesStageClose: (args) => request("POST", "/founding/stages/{stage}/close", { hasBody: true }, args),
388
+ // POST /founding/start — rank: any-builder — POST /founding/start
389
+ postFoundingStart: (args) => request("POST", "/founding/start", { hasBody: true }, args),
380
390
  },
381
391
  "gateApprovals": {
382
392
  // GET /gate-approvals — rank: metic+archon — GET /gate-approvals
@@ -2939,7 +2939,7 @@
2939
2939
  "builders"
2940
2940
  ],
2941
2941
  "summary": "GET /builders/:id/profile",
2942
- "description": "GET /builders/:id/profile — the viewable builder profile page's read (task 1467, goal 25 \"bx-identity\"). Returns ONE builder's public portfolio: identity + rank + economy counters + shipped-work count + recent ships + unlocked achievements. Backs the shareable /builders/profile page. rank: public — every field returned here is ALREADY world-readable: the leaderboard (GET /public/leaderboard, no auth) exposes rank, total_credits, karma, and the top achievement ids; GET /builders/:id/onboarding is likewise an unauthenticated roster-visible read. This route is a per-builder re- presentation of the SAME already-public data, so a portfolio link is shareable without a sign-in wall (that IS the feature). It deliberately WHITELISTS the public column subset off the full builder row — the private columns getBuilderById also returns (anthropic_email / anthropic_user_id / monthly_budget_usd / system_role) are NEVER spread into the JSON. A leak-prevention unit test (tests/profile_route.mjs) asserts their absence + the 404-on-unknown-id behaviour. THROTTLED since task 1002804. The global limiter meters WRITES only (rateLimitMiddleware returns early for GET) and the public read limiter is mounted under /public/*, which this is not — so this route answered at line rate. That was tolerable while it re-presented leaderboard data; it is not now that it also carries `handle`, because an id walk then yields the builder → canonical-profile-handle map in one call per builder. modules/platform-identity/routes/public-profile.js caps /profiles/:handle for exactly that mapping, so the two routes that publish it get the same ceiling. The EXISTING shared /public/* budget (120/60s per IP), not a new one — ADR 0209's rule that routes answering one question spend one budget.\n\n**Rank:** `public` — No authentication — any caller.",
2942
+ "description": "GET /builders/:id/profile — the viewable builder profile page's read (task 1467, goal 25 \"bx-identity\"). Returns ONE builder's public portfolio: identity + rank + economy counters + shipped-work count + recent ships + unlocked achievements. Backs the shareable /builders/profile page. rank: public — every field returned here is ALREADY world-readable: the leaderboard (GET /public/leaderboard, no auth) exposes rank, total_credits, karma, and the top achievement ids; GET /builders/:id/onboarding is likewise an unauthenticated roster-visible read. This route is a per-builder re- presentation of the SAME already-public data, so a portfolio link is shareable without a sign-in wall (that IS the feature). It deliberately WHITELISTS the public column subset off the full builder row — the private columns getBuilderById also returns (anthropic_email / anthropic_user_id / monthly_budget_usd / system_role) are NEVER spread into the JSON. A leak-prevention unit test (tests/profile_route.mjs) asserts their absence + the 404-on-unknown-id behaviour. `roles` (task 1004433) is the one block that is NOT a re-presentation of the leaderboard: per-craft counts and sums. The owner made them public on 2026-09-30 (RP01 decision (a): the tally and By the numbers stay public, the trail, the earnings and every Activity tab need a sign-in), so the block carries counts only — no idea title, no page wording, no task list. THROTTLED since task 1002804. The global limiter meters WRITES only (rateLimitMiddleware returns early for GET) and the public read limiter is mounted under /public/*, which this is not — so this route answered at line rate. That was tolerable while it re-presented leaderboard data; it is not now that it also carries `handle`, because an id walk then yields the builder → canonical-profile-handle map in one call per builder. modules/platform-identity/routes/public-profile.js caps /profiles/:handle for exactly that mapping, so the two routes that publish it get the same ceiling. The EXISTING shared /public/* budget (120/60s per IP), not a new one — ADR 0209's rule that routes answering one question spend one budget.\n\n**Rank:** `public` — No authentication — any caller.",
2943
2943
  "x-rank": "public",
2944
2944
  "x-source": "src/bongos/routes/builders.js",
2945
2945
  "parameters": [
@@ -5774,6 +5774,37 @@
5774
5774
  ]
5775
5775
  }
5776
5776
  },
5777
+ "/founding/alive": {
5778
+ "post": {
5779
+ "operationId": "post_founding_alive",
5780
+ "tags": [
5781
+ "founding"
5782
+ ],
5783
+ "summary": "POST /founding/alive",
5784
+ "description": "**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
5785
+ "x-rank": "any-builder",
5786
+ "x-source": "modules/onboarding/routes/onboarding.js",
5787
+ "responses": {
5788
+ "200": {
5789
+ "description": "Success."
5790
+ },
5791
+ "400": {
5792
+ "$ref": "#/components/responses/BadRequest"
5793
+ },
5794
+ "401": {
5795
+ "$ref": "#/components/responses/Unauthorized"
5796
+ },
5797
+ "403": {
5798
+ "$ref": "#/components/responses/Forbidden"
5799
+ }
5800
+ },
5801
+ "security": [
5802
+ {
5803
+ "builderSession": []
5804
+ }
5805
+ ]
5806
+ }
5807
+ },
5777
5808
  "/founding/builders": {
5778
5809
  "get": {
5779
5810
  "operationId": "get_founding_builders",
@@ -5786,15 +5817,157 @@
5786
5817
  "x-source": "modules/onboarding/routes/onboarding.js",
5787
5818
  "responses": {
5788
5819
  "200": {
5789
- "description": "Success.",
5790
- "content": {
5791
- "application/json": {
5792
- "schema": {
5793
- "$ref": "#/components/schemas/GetFoundingBuildersResponse"
5794
- }
5820
+ "description": "Success."
5821
+ },
5822
+ "400": {
5823
+ "$ref": "#/components/responses/BadRequest"
5824
+ },
5825
+ "401": {
5826
+ "$ref": "#/components/responses/Unauthorized"
5827
+ },
5828
+ "403": {
5829
+ "$ref": "#/components/responses/Forbidden"
5830
+ }
5831
+ },
5832
+ "security": [
5833
+ {
5834
+ "builderSession": []
5835
+ }
5836
+ ]
5837
+ }
5838
+ },
5839
+ "/founding/genesis": {
5840
+ "get": {
5841
+ "operationId": "get_founding_genesis",
5842
+ "tags": [
5843
+ "founding"
5844
+ ],
5845
+ "summary": "GET /founding/genesis",
5846
+ "description": "**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
5847
+ "x-rank": "any-builder",
5848
+ "x-source": "modules/onboarding/routes/onboarding.js",
5849
+ "responses": {
5850
+ "200": {
5851
+ "description": "Success."
5852
+ },
5853
+ "400": {
5854
+ "$ref": "#/components/responses/BadRequest"
5855
+ },
5856
+ "401": {
5857
+ "$ref": "#/components/responses/Unauthorized"
5858
+ },
5859
+ "403": {
5860
+ "$ref": "#/components/responses/Forbidden"
5861
+ }
5862
+ },
5863
+ "security": [
5864
+ {
5865
+ "builderSession": []
5866
+ }
5867
+ ]
5868
+ }
5869
+ },
5870
+ "/founding/plan": {
5871
+ "post": {
5872
+ "operationId": "post_founding_plan",
5873
+ "tags": [
5874
+ "founding"
5875
+ ],
5876
+ "summary": "POST /founding/plan",
5877
+ "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).",
5878
+ "x-rank": "any-builder",
5879
+ "x-source": "modules/onboarding/routes/onboarding.js",
5880
+ "requestBody": {
5881
+ "required": false,
5882
+ "content": {
5883
+ "application/json": {
5884
+ "schema": {
5885
+ "$ref": "#/components/schemas/PostFoundingPlanRequest"
5795
5886
  }
5796
5887
  }
5797
5888
  },
5889
+ "x-validated": true
5890
+ },
5891
+ "responses": {
5892
+ "200": {
5893
+ "description": "Success."
5894
+ },
5895
+ "400": {
5896
+ "$ref": "#/components/responses/ValidationFailed"
5897
+ },
5898
+ "401": {
5899
+ "$ref": "#/components/responses/Unauthorized"
5900
+ },
5901
+ "403": {
5902
+ "$ref": "#/components/responses/Forbidden"
5903
+ }
5904
+ },
5905
+ "security": [
5906
+ {
5907
+ "builderSession": []
5908
+ }
5909
+ ]
5910
+ }
5911
+ },
5912
+ "/founding/stages/{stage}/close": {
5913
+ "post": {
5914
+ "operationId": "post_founding_stages_stage_close",
5915
+ "tags": [
5916
+ "founding"
5917
+ ],
5918
+ "summary": "POST /founding/stages/:stage/close",
5919
+ "description": "**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
5920
+ "x-rank": "any-builder",
5921
+ "x-source": "modules/onboarding/routes/onboarding.js",
5922
+ "parameters": [
5923
+ {
5924
+ "name": "stage",
5925
+ "in": "path",
5926
+ "required": true,
5927
+ "schema": {
5928
+ "type": "string"
5929
+ },
5930
+ "description": "Path parameter `stage`."
5931
+ }
5932
+ ],
5933
+ "responses": {
5934
+ "200": {
5935
+ "description": "Success."
5936
+ },
5937
+ "400": {
5938
+ "$ref": "#/components/responses/BadRequest"
5939
+ },
5940
+ "401": {
5941
+ "$ref": "#/components/responses/Unauthorized"
5942
+ },
5943
+ "403": {
5944
+ "$ref": "#/components/responses/Forbidden"
5945
+ },
5946
+ "404": {
5947
+ "$ref": "#/components/responses/NotFound"
5948
+ }
5949
+ },
5950
+ "security": [
5951
+ {
5952
+ "builderSession": []
5953
+ }
5954
+ ]
5955
+ }
5956
+ },
5957
+ "/founding/start": {
5958
+ "post": {
5959
+ "operationId": "post_founding_start",
5960
+ "tags": [
5961
+ "founding"
5962
+ ],
5963
+ "summary": "POST /founding/start",
5964
+ "description": "**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
5965
+ "x-rank": "any-builder",
5966
+ "x-source": "modules/onboarding/routes/onboarding.js",
5967
+ "responses": {
5968
+ "200": {
5969
+ "description": "Success."
5970
+ },
5798
5971
  "400": {
5799
5972
  "$ref": "#/components/responses/BadRequest"
5800
5973
  },
@@ -11388,7 +11561,7 @@
11388
11561
  "me"
11389
11562
  ],
11390
11563
  "summary": "PATCH /me/disciplines",
11391
- "description": "Self-service edit of the authenticated builder's preferred disciplines (migrations 027 + 086 / V3.R80). Body: { preferred_disciplines: [\"artist\", ...] }. Valid elements are whatever enabledDisciplines() offers — engineer|ideator core plus any enabled module's (artist, ui); [] clears the preference (a multi-element set just means several lanes). No rank gate — a builder owns their own profile. 422 invalid_discipline if any element is out of range. rank: any-builder — self-service profile edit; documented \"no rank gate\" in the handler comment above (a builder owns their own preference).\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
11564
+ "description": "Self-service edit of the authenticated builder's preferred disciplines (migrations 027 + 086 / V3.R80). Body: { preferred_disciplines: [\"artist\", ...] }. Valid elements are whatever enabledDisciplines() offers — engineer|ideator core plus any enabled module's (artist, ui); [] clears the preference (a multi-element set just means several lanes). No rank gate — a builder owns their own profile. 422 invalid_discipline if any element is out of range. rank: any-builder — self-service profile edit; documented \"no rank gate\" in the handler comment above (a builder owns their own preference). `main_discipline` (optional, task 1004433): the builder's own MAIN role, one of the crafts in the same body; null clears it, absent keeps it (see db.updateBuilderDisciplines). 422 invalid_main_discipline otherwise.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
11392
11565
  "x-rank": "any-builder",
11393
11566
  "x-source": "src/bongos/routes/me.js",
11394
11567
  "requestBody": {
@@ -22671,6 +22844,7 @@
22671
22844
  "shipped_count": {},
22672
22845
  "recent_ships": {},
22673
22846
  "achievements": {},
22847
+ "roles": {},
22674
22848
  "cross_project": {},
22675
22849
  "handle": {}
22676
22850
  },
@@ -22678,7 +22852,8 @@
22678
22852
  "builder",
22679
22853
  "shipped_count",
22680
22854
  "recent_ships",
22681
- "achievements"
22855
+ "achievements",
22856
+ "roles"
22682
22857
  ]
22683
22858
  },
22684
22859
  "GetBuildersMePendingRankChangeResponse": {
@@ -22919,15 +23094,6 @@
22919
23094
  "count"
22920
23095
  ]
22921
23096
  },
22922
- "GetFoundingBuildersResponse": {
22923
- "type": "object",
22924
- "properties": {
22925
- "builders": {}
22926
- },
22927
- "required": [
22928
- "builders"
22929
- ]
22930
- },
22931
23097
  "GetGithubRepoResponse": {
22932
23098
  "type": "object",
22933
23099
  "properties": {
@@ -24808,6 +24974,10 @@
24808
24974
  "type": "string"
24809
24975
  },
24810
24976
  "maxItems": 16
24977
+ },
24978
+ "main_discipline": {
24979
+ "type": "string",
24980
+ "maxLength": 32
24811
24981
  }
24812
24982
  },
24813
24983
  "required": [
@@ -26371,6 +26541,36 @@
26371
26541
  ],
26372
26542
  "additionalProperties": false
26373
26543
  },
26544
+ "PostFoundingPlanRequest": {
26545
+ "type": "object",
26546
+ "properties": {
26547
+ "days": {
26548
+ "type": "object"
26549
+ },
26550
+ "passes": {
26551
+ "type": "integer",
26552
+ "minimum": 1,
26553
+ "maximum": 2
26554
+ },
26555
+ "advisors": {
26556
+ "type": "string",
26557
+ "maxLength": 16
26558
+ },
26559
+ "government": {
26560
+ "type": "string",
26561
+ "maxLength": 40
26562
+ },
26563
+ "expected_builders": {
26564
+ "type": "integer",
26565
+ "minimum": 1,
26566
+ "maximum": 100000
26567
+ },
26568
+ "existing": {
26569
+ "type": "boolean"
26570
+ }
26571
+ },
26572
+ "additionalProperties": false
26573
+ },
26374
26574
  "PostGateApprovalsPrApproveResponse": {
26375
26575
  "type": "object",
26376
26576
  "properties": {
@@ -30276,9 +30476,9 @@
30276
30476
  "description": "A required dependency/feature is not configured or is temporarily down."
30277
30477
  }
30278
30478
  },
30279
- "x-endpoint-count": 473,
30479
+ "x-endpoint-count": 478,
30280
30480
  "x-schema-count": 506,
30281
30481
  "x-undocumented-bodies": 12,
30282
- "x-response-schemas": 341,
30482
+ "x-response-schemas": 340,
30283
30483
  "x-generated-by": "scripts/gds/gen-api-docs.js"
30284
30484
  }
@@ -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. 473 endpoints across 86 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 478 endpoints across 86 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`.
@@ -262,11 +262,16 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
262
262
  |---|---|---|---|---|
263
263
  | POST | `/api/bongos/feedback` | `any-builder` | `message`, `kind`, `context` | signed-in builder — reporting a problem with Bongos grants nothing here, and the hub files every report at 'backlog' behind a Metic+ nod. |
264
264
 
265
- ## `founding` (1)
265
+ ## `founding` (6)
266
266
 
267
267
  | Method | Path | Rank | Body | Description |
268
268
  |---|---|---|---|---|
269
+ | POST | `/api/bongos/founding/alive` | `any-builder` | — | |
269
270
  | GET | `/api/bongos/founding/builders` | `any-builder` | — | The founding mark (task 1004424): who joined while the project was founding, in join order, with the stage each joined at. |
271
+ | GET | `/api/bongos/founding/genesis` | `any-builder` | — | |
272
+ | POST | `/api/bongos/founding/plan` | `any-builder` | `days`, `passes`, `advisors`, `government`, `expected_builders`, `existing` | 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 r… |
273
+ | POST | `/api/bongos/founding/stages/:stage/close` | `any-builder` | — | |
274
+ | POST | `/api/bongos/founding/start` | `any-builder` | — | |
270
275
 
271
276
  ## `gate-approvals` (2)
272
277
 
@@ -466,7 +471,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
466
471
  | GET | `/api/bongos/me/credits` | `any-builder` | — | GET /me/credits — the caller's own ledger. |
467
472
  | GET | `/api/bongos/me/cross-project` | `any-builder` | — | the caller's OWN cross-project record + privacy flags (own data). |
468
473
  | PATCH | `/api/bongos/me/cross-project` | `any-builder` | `hide_stats`, `account_visibility`, `recruiter_discoverable` | flip the caller's OWN privacy flags (C2's self-serve opt-out plus the task-1002966 pair; own data, keyed on the authenticated github_id —… |
469
- | PATCH | `/api/bongos/me/disciplines` | `any-builder` | `preferred_disciplines` | Self-service edit of the authenticated builder's preferred disciplines (migrations 027 + 086 / V3.R80). |
474
+ | PATCH | `/api/bongos/me/disciplines` | `any-builder` | `preferred_disciplines`, `main_discipline` | Self-service edit of the authenticated builder's preferred disciplines (migrations 027 + 086 / V3.R80). |
470
475
  | GET | `/api/bongos/me/display-name` | `any-builder` | — | Per-builder DISPLAY NAME (task 1669). |
471
476
  | PATCH | `/api/bongos/me/display-name` | `any-builder` | _undocumented_ | PATCH the display name. |
472
477
  | GET | `/api/bongos/me/event-sound-prefs` | `any-builder` | — | Per-builder per-event sound variant selection (task 582, migration 164). |
@@ -101,6 +101,7 @@ builders(id, github_id UNIQUE, github_login, display_name, avatar_url, total_cre
101
101
  (system: can't claim/earn/log-in). The cross-builder memory WRITE gate keys on this
102
102
  EXACT value, not on rank (ADR 0026 §6C) — an Archon token is rejected.
103
103
  + skill_model_prefs jsonb (mig 037), preferred_disciplines text[] (mig 027), timezone (PMS-V2),
104
+ main_discipline text NULL (core_268 — the builder chosen MAIN role; NULL = not chosen, inferred from credits),
104
105
  deactivated_at/reactivated_at/deactivated_reason (mig 025 — the /builder-exit flow; #307 guard)
105
106
  tasks ... + xenos_claimable boolean NOT NULL DEFAULT false (mig 029) -- Xenos may claim only these
106
107
  versions(id PK 'V1'|'PMS-V1'..., name, track, status, scope_doc_path, ...) -- track is free text (the product|internal CHECK was dropped in mig 112, task 1191); the valid set is instance config (config/branding.json "tracks"), not a DB constraint
@@ -4,13 +4,13 @@
4
4
  > Deterministic on a given tree — regenerate and commit rather than hand-editing.
5
5
  > Machine-readable twin: [`copy-registry.json`](copy-registry.json).
6
6
 
7
- **2292 strings** across 3 surfaces · 1976 distinct pieces of copy · 2292 certain, 0 heuristic · 220 shown in more than one place.
7
+ **2308 strings** across 3 surfaces · 1991 distinct pieces of copy · 2308 certain, 0 heuristic · 221 shown in more than one place.
8
8
 
9
9
  ## Surfaces
10
10
 
11
11
  | surface | lives at | files | strings |
12
12
  |---|---|---|---|
13
- | `builders-hall` | `modules/hall-ui/public` | 115 | 1701 |
13
+ | `builders-hall` | `modules/hall-ui/public` | 116 | 1717 |
14
14
  | `status-dashboard` | `modules/status-ui/public` | 4 | 100 |
15
15
  | `landing` | `modules/public-landing/public` | 6 | 491 |
16
16
 
@@ -76,9 +76,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
76
76
  | `0efa2f18bb6c` | 3x | What it does | modules/hall-ui/public/commands-lib.js:100, modules/hall-ui/public/commands-lib.js:122, modules/hall-ui/public/settings-specialities.js:130 |
77
77
  | `ed394c66d49c` | 3x | What the choice changes | modules/public-landing/public/projects.html:995, modules/public-landing/public/projects.html:1072, modules/public-landing/public/projects.html:1084 |
78
78
  | `4e25e6872321` | 3x | Your projects | modules/public-landing/public/index.html:691, modules/public-landing/public/projects.html:547, modules/public-landing/public/projects.html:709 |
79
- | … | | _180 more in the JSON registry_ | |
79
+ | … | | _181 more in the JSON registry_ | |
80
80
 
81
- ## `builders-hall` — 1701 strings
81
+ ## `builders-hall` — 1717 strings
82
82
 
83
83
  | id | conf | text | where |
84
84
  |---|---|---|---|
@@ -289,6 +289,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
289
289
  | `f42cb1edcf1e` | certain | Clone the repository | `modules/hall-ui/public/hall-render.js:809` |
290
290
  | `70f6a704d504` | certain | Close it | `modules/hall-ui/public/copy-desk.html:140` |
291
291
  | `d12a2fb5730d` | certain | Close this flag | `modules/hall-ui/public/copy-desk.html:116` |
292
+ | `9b9c2abeae90` | certain | Close this stage | `modules/hall-ui/public/genesis-home.js:206` |
292
293
  | `3d148e19e03a` | certain | Closed. | `modules/hall-ui/public/copy-desk.js:510` |
293
294
  | `2654dc3ded21` | certain | Closing is a judgement too — say what you decided, so the next person does not re-litigate it. | `modules/hall-ui/public/copy-desk.js:495` |
294
295
  | `e5548861ad79` | certain | Coach the grader | `modules/hall-ui/public/studio.js:211` |
@@ -299,6 +300,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
299
300
  | `fe4a2b04eda5` | certain | Commands — {{worldName}} | `modules/hall-ui/public/commands.html:6` |
300
301
  | `cfc287c42263` | certain | Complete your profile | `modules/hall-ui/public/profile-nudge.js:79` |
301
302
  | `2867c85d196d` | certain | Confirm that verification for #{…} actually passed? | `modules/hall-ui/public/task.js:872` |
303
+ | `e74f4442c338` | certain | Confirm this stage | `modules/hall-ui/public/genesis-home.js:197` |
302
304
  | `9b16a22bf24c` | certain | Connect Discord &amp; join the server | `modules/hall-ui/public/hall-render.js:955` |
303
305
  | `9b16a22bf24c` | certain | Connect Discord &amp; join the server | `modules/hall-ui/public/settings.js:683` |
304
306
  | `c07898571b24` | certain | Connects to | `modules/hall-ui/public/atlas.js:290` |
@@ -446,6 +448,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
446
448
  | `8e82771e5b63` | certain | Ending a session takes effect immediately; the token stops working on its very next request. | `modules/hall-ui/public/settings.html:163` |
447
449
  | `58d381535285` | certain | Engagement reports | `modules/hall-ui/public/watch.html:130` |
448
450
  | `690609c8e9a9` | certain | Enter a goal number. | `modules/hall-ui/public/gate.js:315` |
451
+ | `4f776bc33d5f` | certain | Enter the builders’ hall | `modules/hall-ui/public/genesis-home.js:219` |
449
452
  | `1825c9c467d8` | certain | Enter the id of the task this one should wait for. | `modules/hall-ui/public/task.js:928` |
450
453
  | `bd7a40639a1c` | certain | Estimate (min) | `modules/hall-ui/public/task-detail.js:460` |
451
454
  | `c15d1f0ddfb6` | certain | Estimation accuracy | `modules/hall-ui/public/watch.html:148` |
@@ -516,6 +519,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
516
519
  | `c93912bbad76` | certain | Gathering the reviews and flagged copy that wait for you. | `modules/hall-ui/public/studio.html:160` |
517
520
  | `4638e024f0af` | certain | Generated from the code on the last deploy · | `modules/hall-ui/public/atlas.js:431` |
518
521
  | `3c1a5d27ef0b` | certain | Generated from the code on the last deploy. | `modules/hall-ui/public/atlas.js:431` |
522
+ | `e79fe220b0fc` | certain | Genesis stages | `modules/hall-ui/public/genesis-home.js:71` |
519
523
  | `2ae2114b61db` | certain | Get a free key ↗ | `modules/hall-ui/public/settings.js:800` |
520
524
  | `4794a991de3d` | certain | Getting started | `modules/hall-ui/public/hall-widgets.js:59` |
521
525
  | `a28b1a567f1a` | certain | GitHub username | `modules/hall-ui/public/hall-render.js:297` |
@@ -556,6 +560,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
556
560
  | `68382894d8f9` | certain | How a planning session seeds each version's task pool, and how a version closes and archives its scope. | `modules/hall-ui/public/diagrams.html:85` |
557
561
  | `0bab9286ea38` | certain | How each builder's shipped work has been graded over the past thirty days. | `modules/hall-ui/public/watch.html:76` |
558
562
  | `fb7489e8b67c` | certain | How it has changed | `modules/hall-ui/public/government.js:971` |
563
+ | `1afadcefd6ea` | certain | How many passes | `modules/hall-ui/public/genesis-home.js:105` |
559
564
  | `d76a5fcbde7c` | certain | How much the claim and ship cards show. Richer cards explain more and cost more tokens; the confirmation line | `modules/hall-ui/public/settings-render.js:84` |
560
565
  | `160adde1e398` | certain | How much your session cards — what | `modules/hall-ui/public/settings.html:298` |
561
566
  | `ec3f26ff8137` | certain | How planning sessions feed each version's task pool and how a version closes. | `modules/hall-ui/public/diagrams.html:84` |
@@ -646,6 +651,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
646
651
  | `7c9b7a89353b` | certain | Leave goal | `modules/hall-ui/public/goals-render.js:961` |
647
652
  | `6137d2679912` | certain | Leave it off | `modules/hall-ui/public/settings-specialities.js:138` |
648
653
  | `f192ff6563f9` | certain | Leave your GitHub username and an Archon will let you in. No coding needed to start — once you're approved, si | `modules/hall-ui/public/hall-render.js:297` |
654
+ | `e14ebcf3eec5` | certain | Legislation has passed. Genesis is complete. | `modules/hall-ui/public/genesis-home.js:188` |
649
655
  | `d6a78b9e5368` | certain | Let it be for now | `modules/hall-ui/public/studio.js:233` |
650
656
  | `d6a78b9e5368` | certain | Let it be for now | `modules/hall-ui/public/studio.js:248` |
651
657
  | `b8ba1fa4457c` | certain | Link a task | `modules/hall-ui/public/blockers.js:148` |
@@ -756,6 +762,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
756
762
  | `084748fd85b4` | certain | No shipped work is recorded between core {…} and {…}. | `modules/hall-ui/public/deploy.js:541` |
757
763
  | `4485497d87bb` | certain | No specialities yet. Create one below — it takes a name and a craft, and you can train it afterwards. | `modules/hall-ui/public/settings-specialities.js:416` |
758
764
  | `545dc44ad427` | certain | No task in this goal depends on another task in this goal. | `modules/hall-ui/public/goal-forest-render.js:126` |
765
+ | `da838f6056b1` | certain | No tasks for this stage yet. | `modules/hall-ui/public/genesis-home.js:178` |
759
766
  | `712b64d8273f` | certain | No tasks match these filters. Try widening them. | `modules/hall-ui/public/work.js:427` |
760
767
  | `2302ee46744e` | certain | No terminal commands found. | `modules/hall-ui/public/commands.js:46` |
761
768
  | `78f78d1d1e1f` | certain | No version is in flight right now. | `modules/hall-ui/public/roadmap.js:409` |
@@ -829,6 +836,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
829
836
  | `855277dff074` | certain | Open task #{…} | `modules/hall-ui/public/work.js:835` |
830
837
  | `99c630009152` | certain | Open tasks whose declared files overlap — sequence these before two builders collide. | `modules/hall-ui/public/goals.html:117` |
831
838
  | `99c630009152` | certain | Open tasks whose declared files overlap — sequence these before two builders collide. | `modules/hall-ui/public/goals.html:197` |
839
+ | `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:198` |
840
+ | `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:203` |
832
841
  | `e073aa0c3847` | certain | Open the conflicts for {…} | `modules/hall-ui/public/goal-inbox.js:112` |
833
842
  | `676361254d92` | certain | Open the idea composer | `modules/hall-ui/public/idea.js:504` |
834
843
  | `29e1cb2d32fc` | certain | Open the recording | `modules/hall-ui/public/criterion-uat-ui.js:121` |
@@ -895,6 +904,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
895
904
  | `abee9a18325d` | certain | Propose wording… | `modules/hall-ui/public/copy-desk.js:179` |
896
905
  | `3f85bdc47099` | certain | Protected module scope — join by request; an Archon admits members | `modules/hall-ui/public/goals-render.js:877` |
897
906
  | `e5c292c8b361` | certain | Provides (seams) | `modules/hall-ui/public/atlas.js:288` |
907
+ | `93b836382ec7` | certain | Put it to the board again | `modules/hall-ui/public/genesis-home.js:202` |
898
908
  | `4de232a05888` | certain | Raise after | `modules/hall-ui/public/project-settings.js:113` |
899
909
  | `0608f71f78fe` | certain | Rank is earned by shipping work. The founding mark is for good: it is numbered in the order people joined whil | `modules/hall-ui/public/ranks.html:47` |
900
910
  | `b9c6def6b120` | certain | Rank set to {…}. | `modules/hall-ui/public/watch.js:883` |
@@ -1073,6 +1083,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1073
1083
  | `9d4372b173cf` | certain | Standing sections | `modules/hall-ui/public/index.html:83` |
1074
1084
  | `ec1c2dae4a90` | certain | Standing there | `modules/hall-ui/public/profile.js:331` |
1075
1085
  | `eaad12cacb9d` | certain | Start over | `modules/hall-ui/public/studio.js:264` |
1086
+ | `b01258e8242a` | certain | Starting government | `modules/hall-ui/public/genesis-home.js:131` |
1076
1087
  | `efe530c0e3a7` | certain | Still open | `modules/hall-ui/public/profile.js:511` |
1077
1088
  | `490a3cbb8c1c` | certain | Still working on core {…}. It keeps going without this page — reload to see where it got to. | `modules/hall-ui/public/deploy.js:761` |
1078
1089
  | `9a4ced1afb6c` | certain | Stop waiting on task {…} | `modules/hall-ui/public/task.js:287` |
@@ -1122,6 +1133,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1122
1133
  | `4462dcaaaa7d` | certain | The artist reads this instead of guessing. A pointer with no judgement costs them a look and tells them nothin | `modules/hall-ui/public/copy-desk.html:103` |
1123
1134
  | `195b295d0bf3` | certain | The atlas regenerates itself on the server every time code ships; it has not been generated on this deploy yet | `modules/hall-ui/public/atlas.html:63` |
1124
1135
  | `f38140e472df` | certain | The board ratified a change that is not in force. | `modules/hall-ui/public/government.js:633` |
1136
+ | `ecc7215524c0` | certain | The board sent this stage back. Read why in the Board Room, then put it up again. | `modules/hall-ui/public/genesis-home.js:201` |
1125
1137
  | `e8f011fdaa6b` | certain | The complete architecture: your machine (the worker, the code, and local memory), the server (authority and pr | `modules/hall-ui/public/diagrams.html:76` |
1126
1138
  | `2dc061096c48` | certain | The copy desk — every flagged string | `modules/hall-ui/public/studio.html:165` |
1127
1139
  | `325daac25a9a` | certain | The day the sky is drawn for | `modules/hall-ui/public/goal-map.html:127` |
@@ -1159,6 +1171,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1159
1171
  | `74bc22f38140` | certain | The platform confirmed this request came from the account it names. | `modules/hall-ui/public/watch.js:396` |
1160
1172
  | `6c3d88de42de` | certain | The primer | `modules/hall-ui/public/primer.html:41` |
1161
1173
  | `dea378cd4837` | certain | The primer did not load | `modules/hall-ui/public/primer.html:88` |
1174
+ | `dc2d6fd0350a` | certain | The project’s life so far | `modules/hall-ui/public/genesis-home.js:145` |
1162
1175
  | `3bc5ec5f35ec` | certain | The ranks, lowest to highest | `modules/hall-ui/public/ranks.html:55` |
1163
1176
  | `c0034db3281c` | certain | The reason is recorded in the audit log. This is recoverable: a retired task can be restored to the backlog wi | `modules/hall-ui/public/task.js:802` |
1164
1177
  | `1ce78006fe00` | certain | The reference did not load | `modules/hall-ui/public/drachmae.html:85` |
@@ -1232,6 +1245,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1232
1245
  | `9a685b01e2c6` | certain | This page opens at a higher rank. | `modules/hall-ui/public/project-settings.html:36` |
1233
1246
  | `9a685b01e2c6` | certain | This page opens at a higher rank. | `modules/hall-ui/public/watch.html:40` |
1234
1247
  | `e7a289134dc3` | certain | This page shows no words the reader could find. | `modules/hall-ui/public/tweak-editor.js:246` |
1248
+ | `5368a0140fa4` | certain | This project already exists, so start by gathering what it has | `modules/hall-ui/public/genesis-home.js:113` |
1235
1249
  | `5bdcbec770dd` | certain | This project has no slash commands yet. | `modules/hall-ui/public/commands.js:38` |
1236
1250
  | `fcd43f045614` | certain | This project is upgraded on the server that runs it: | `modules/hall-ui/public/settings-software-update.js:76` |
1237
1251
  | `3c8aaec39c40` | certain | This project's code expects {…} database change{…} that its database has not applied yet. Anything that relies | `modules/hall-ui/public/deploy.js:579` |
@@ -1275,6 +1289,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1275
1289
  | `67fbc770b3b3` | certain | Upvote (+1) | `modules/hall-ui/public/builders.js:777` |
1276
1290
  | `16d7f809be8a` | certain | Use the control below to take it. | `modules/hall-ui/public/shell.js:844` |
1277
1291
  | `e7e2a99a2bea` | certain | Use this | `modules/hall-ui/public/settings-specialities.js:395` |
1292
+ | `fe0f438b2ff9` | certain | Use this plan | `modules/hall-ui/public/genesis-home.js:115` |
1278
1293
  | `e1ecd543a2ca` | certain | Using this speciality. | `modules/hall-ui/public/settings-specialities.js:454` |
1279
1294
  | `6200bac6bdca` | certain | View all sessions | `modules/hall-ui/public/watch.html:99` |
1280
1295
  | `9b92aa01516d` | certain | View all {…} {…} → | `modules/hall-ui/public/goals-render.js:611` |
@@ -1326,6 +1341,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1326
1341
  | `b8743d16eab8` | certain | What {…} unlocks | `modules/hall-ui/public/hall-render.js:82` |
1327
1342
  | `6ff24dd04d46` | certain | What\u2019s this? | `modules/hall-ui/public/shell.js:1023` |
1328
1343
  | `ecfd34bf5e6f` | certain | What’s stuck (optional) | `modules/hall-ui/public/blockers.js:308` |
1344
+ | `55ef095fe001` | certain | When every task above is finished, this stage can be put to the board. | `modules/hall-ui/public/genesis-home.js:208` |
1329
1345
  | `a6e102816e92` | certain | When to reach for it | `modules/hall-ui/public/commands-lib.js:100` |
1330
1346
  | `a6e102816e92` | certain | When to reach for it | `modules/hall-ui/public/settings-specialities.js:130` |
1331
1347
  | `5d73558dae0e` | certain | Where do you begin? | `modules/hall-ui/public/goal-map.html:110` |
@@ -1723,9 +1739,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1723
1739
  | `d73256fbc395` | certain | {…} · who votes, and how it {…} | `modules/hall-ui/public/board-room.js:449` |
1724
1740
  | `cab2a4296aec` | certain | {…} · {…} · {…}{…} | `modules/hall-ui/public/goal-inbox.js:458` |
1725
1741
  | `1ac723849449` | certain | {…} · {…}{…} | `modules/hall-ui/public/sky-interaction.js:33` |
1742
+ | `f9958dc71904` | certain | {…} — everything earned: shipped work, approved pages and ideas. | `modules/hall-ui/public/profile.js:94` |
1726
1743
  | `ddd2bfc1fb60` | certain | {…} — how to use it | `modules/hall-ui/public/modules.js:385` |
1727
1744
  | `085f93f3f775` | certain | {…} — see all standings | `modules/hall-ui/public/hall-render.js:80` |
1728
- | `f75ee96a7511` | certain | {…} — total payout from shipped work. | `modules/hall-ui/public/profile.js:94` |
1729
1745
  | `2a2728a4ec4f` | certain | {…}% of tasks complete | `modules/hall-ui/public/roadmap.js:63` |
1730
1746
  | `15e545eb3ce2` | certain | {…}, no such task | `modules/hall-ui/public/task.js:1015` |
1731
1747
  | `8944d0dcf563` | certain | {…}, on the {…} page, is where you left it. | `modules/hall-ui/public/studio.js:658` |