@bongos/core 1.20.83 → 1.21.1

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 +151 -61
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +4 -0
  4. package/clients/bongos-client/index.cjs +4 -0
  5. package/clients/bongos-client/index.d.ts +7 -0
  6. package/clients/bongos-client/index.mjs +4 -0
  7. package/docs/adr/0051-full-session-transcript-corpus.md +3 -1
  8. package/docs/adr/0361-merges-publish-as-candidates-release-decides-what-others-are-offered.md +3 -3
  9. package/docs/adr/README.md +1 -1
  10. package/docs/api/openapi.json +153 -4
  11. package/docs/api-reference.md +5 -3
  12. package/docs/architecture.md +3 -0
  13. package/docs/copy-inventory.md +10 -10
  14. package/docs/copy-registry.json +12 -12
  15. package/docs/design/project-startup-direction.md +63 -0
  16. package/docs/file-map.md +2 -0
  17. package/docs/module-api-changelog.md +6 -0
  18. package/docs/page-inventory.json +8 -3
  19. package/docs/page-readings.json +382 -373
  20. package/docs/recipes/private-npm-distribution.md +1 -1
  21. package/migrations/core_269_session_transcripts.sql +35 -0
  22. package/modules/hall-ui/public/genesis-home.js +17 -3
  23. package/modules/hall-ui/public/index-genesis-demo.states.json +13 -0
  24. package/modules/lifecycle/workflow-dispatch.js +21 -11
  25. package/modules/npm-release/release.js +10 -1
  26. package/modules/onboarding/founding-birth.js +116 -0
  27. package/modules/onboarding/genesis-home.js +72 -5
  28. package/modules/onboarding/port.js +9 -2
  29. package/modules/onboarding/routes/onboarding.js +8 -1
  30. package/modules/provisioning/birth.js +64 -0
  31. package/modules/provisioning/dns-resolves.js +54 -0
  32. package/modules/provisioning/migrations/provisioning_036_dns_resolved.sql +30 -0
  33. package/modules/provisioning/pollers/liveness-sweep.js +5 -0
  34. package/modules/provisioning/provisioning.js +7 -6
  35. package/modules/provisioning/routes/provisioning.js +6 -2
  36. package/modules/provisioning/tests/liveness.mjs +48 -0
  37. package/modules/public-landing/public/projects-dns-pending.states.json +85 -0
  38. package/modules/public-landing/public/projects.html +40 -15
  39. package/modules/sessions/db.js +58 -0
  40. package/modules/sessions/routes/sessions.js +97 -0
  41. package/modules/ui-design/kit/fixtures/founding-genesis-demo.json +176 -0
  42. package/modules/ui-design/kit/fixtures/me-founding-demo.json +27 -0
  43. package/modules/ui-design/kit/fixtures/provisioning-instances-demo.json +3 -0
  44. package/modules/ui-design/kit/fixtures/provisioning-instances-dns-pending.json +49 -0
  45. package/modules/ui-design/kit/fixtures/provisioning-instances.json +3 -0
  46. package/package-lock.json +2 -2
  47. package/package.json +1 -1
  48. package/release-notes.json +35 -0
  49. package/scripts/gds/provision.js +77 -53
  50. package/scripts/gds/session-digest.js +11 -3
  51. package/scripts/gds/session-transcript-build.js +155 -0
  52. package/scripts/gds/session-transcript-upload.js +29 -0
  53. package/scripts/gds/ship-session-upload.js +6 -1
  54. package/scripts/gds/upgrade-commit-identity.js +32 -0
  55. package/scripts/gds/upgrade.js +1 -1
  56. package/src/bongos/routes.js +3 -0
  57. package/src/branding.js +9 -0
  58. package/src/module-api.js +1 -1
  59. package/tests/founding_birth.mjs +200 -0
  60. package/tests/founding_mode.mjs +3 -1
  61. package/tests/genesis_home.mjs +71 -2
  62. package/tests/hub_map_orb_states.mjs +5 -1
  63. package/tests/npm_release_release.mjs +37 -2
  64. package/tests/projects_hub.mjs +5 -3
  65. package/tests/projects_hub_dns_ready.mjs +153 -0
  66. package/tests/projects_hub_pre_uat.mjs +9 -5
  67. package/tests/provision_dns_first.mjs +171 -0
  68. package/tests/provision_settings_apply.mjs +6 -1
  69. package/tests/provisioning_settings_env.mjs +49 -0
  70. package/tests/session_transcript.mjs +273 -0
  71. package/tests/ui_design_kit.mjs +1 -1
  72. package/tests/upgrade_commit_identity.mjs +89 -0
  73. package/tests/wizard_demo.mjs +29 -3
@@ -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
- - 494 operations across 73 resource groups
8
+ - 496 operations across 73 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -1013,6 +1013,10 @@ function createClient(opts = {}) {
1013
1013
  postSessions: (args) => request("POST", "/sessions", { hasBody: true }, args),
1014
1014
  // GET /sessions/{id} — rank: any-builder — GET /sessions/:id
1015
1015
  getSessionsId: (args) => request("GET", "/sessions/{id}", { hasBody: false }, args),
1016
+ // GET /sessions/{id}/transcript — rank: any-builder — GET /sessions/:id/transcript
1017
+ getSessionsIdTranscript: (args) => request("GET", "/sessions/{id}/transcript", { hasBody: false }, args),
1018
+ // PUT /sessions/{sid}/transcript — rank: any-builder — PUT /sessions/:sid/transcript
1019
+ putSessionsSidTranscript: (args) => request("PUT", "/sessions/{sid}/transcript", { hasBody: true }, args),
1016
1020
  // GET /sessions/mine — rank: any-builder — GET /sessions/mine
1017
1021
  getSessionsMine: (args) => request("GET", "/sessions/mine", { hasBody: false }, args),
1018
1022
  // GET /sessions/search — rank: metic+archon — GET /sessions/search
@@ -1012,6 +1012,10 @@ function createClient(opts = {}) {
1012
1012
  postSessions: (args) => request("POST", "/sessions", { hasBody: true }, args),
1013
1013
  // GET /sessions/{id} — rank: any-builder — GET /sessions/:id
1014
1014
  getSessionsId: (args) => request("GET", "/sessions/{id}", { hasBody: false }, args),
1015
+ // GET /sessions/{id}/transcript — rank: any-builder — GET /sessions/:id/transcript
1016
+ getSessionsIdTranscript: (args) => request("GET", "/sessions/{id}/transcript", { hasBody: false }, args),
1017
+ // PUT /sessions/{sid}/transcript — rank: any-builder — PUT /sessions/:sid/transcript
1018
+ putSessionsSidTranscript: (args) => request("PUT", "/sessions/{sid}/transcript", { hasBody: true }, args),
1015
1019
  // GET /sessions/mine — rank: any-builder — GET /sessions/mine
1016
1020
  getSessionsMine: (args) => request("GET", "/sessions/mine", { hasBody: false }, args),
1017
1021
  // GET /sessions/search — rank: metic+archon — GET /sessions/search
@@ -157,6 +157,7 @@ export interface GetSecurityDocsSlugResponse { doc: unknown }
157
157
  export interface GetSecurityReportsResponse { reports: unknown; bounty_table: unknown; statuses: unknown }
158
158
  export interface GetSecurityScansResponse { scans: unknown }
159
159
  export interface GetSessionsIdResponse { session: unknown }
160
+ export interface GetSessionsIdTranscriptResponse { transcript: unknown }
160
161
  export interface GetSessionsMineResponse { sessions: unknown; count: unknown }
161
162
  export interface GetSessionsSearchResponse { sessions: unknown; count: unknown; total: unknown; totals: unknown; limit: unknown; offset: unknown; session_types: unknown }
162
163
  export interface GetSoftwareUpdateResponse { ok: boolean; update: unknown; door: unknown; can_update: unknown }
@@ -523,6 +524,8 @@ export interface PutMingleProjectRequest { enabled: boolean }
523
524
  export interface PutProvisioningInstancesIdLogoRequest { image_b64: string; content_type: string }
524
525
  export interface PutRenderDeployAppRequest { ownerId?: string; serviceId?: string }
525
526
  export interface PutRenderDeployAppResponse { app: unknown }
527
+ export interface PutSessionsSidTranscriptRequest { turns: unknown[]; truncated?: boolean }
528
+ export interface PutSessionsSidTranscriptResponse { transcript: unknown }
526
529
  export interface PutSpecialitiesIdSkillsRequest { enabled_skills: string[] }
527
530
  export interface PutSpecialitiesIdSkillsResponse { adoption: unknown }
528
531
  export interface PutTasksIdDependenciesRequest { depends_on_task_ids: unknown[] }
@@ -1470,6 +1473,10 @@ export interface BongosClient {
1470
1473
  postSessions(args: RequestArgs & { body: PostSessionsRequest }): Promise<PostSessionsResponse>;
1471
1474
  /** GET /sessions/{id} — rank: any-builder */
1472
1475
  getSessionsId(args?: RequestArgs): Promise<GetSessionsIdResponse>;
1476
+ /** GET /sessions/{id}/transcript — rank: any-builder */
1477
+ getSessionsIdTranscript(args?: RequestArgs): Promise<GetSessionsIdTranscriptResponse>;
1478
+ /** PUT /sessions/{sid}/transcript — rank: any-builder */
1479
+ putSessionsSidTranscript(args: RequestArgs & { body: PutSessionsSidTranscriptRequest }): Promise<PutSessionsSidTranscriptResponse>;
1473
1480
  /** GET /sessions/mine — rank: any-builder */
1474
1481
  getSessionsMine(args?: RequestArgs): Promise<GetSessionsMineResponse>;
1475
1482
  /** GET /sessions/search — rank: metic+archon */
@@ -1009,6 +1009,10 @@ export function createClient(opts = {}) {
1009
1009
  postSessions: (args) => request("POST", "/sessions", { hasBody: true }, args),
1010
1010
  // GET /sessions/{id} — rank: any-builder — GET /sessions/:id
1011
1011
  getSessionsId: (args) => request("GET", "/sessions/{id}", { hasBody: false }, args),
1012
+ // GET /sessions/{id}/transcript — rank: any-builder — GET /sessions/:id/transcript
1013
+ getSessionsIdTranscript: (args) => request("GET", "/sessions/{id}/transcript", { hasBody: false }, args),
1014
+ // PUT /sessions/{sid}/transcript — rank: any-builder — PUT /sessions/:sid/transcript
1015
+ putSessionsSidTranscript: (args) => request("PUT", "/sessions/{sid}/transcript", { hasBody: true }, args),
1012
1016
  // GET /sessions/mine — rank: any-builder — GET /sessions/mine
1013
1017
  getSessionsMine: (args) => request("GET", "/sessions/mine", { hasBody: false }, args),
1014
1018
  // GET /sessions/search — rank: metic+archon — GET /sessions/search
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Date:** 2026-06-13
4
4
  **Context:** GDS-V4, task [#1004](https://example.com/builders#/task/1004) (full-transcript capture) with hard precondition task [#1003](https://example.com/builders#/task/1003) (transcript-grade scrubber, extends [#723](https://example.com/builders#/task/723)) and coverage task [#965](https://example.com/builders#/task/965). **Amends the privacy/size posture of [ADR 0027](0027-bfg-session-inefficiency-evaluator.md)** (BFG session-inefficiency evaluator) and its schema (`migrations/062_session_records.sql`). Companion to [ADR 0026](0026-bfg-memory-hygiene-and-cross-builder-learning.md) (BFG charter + §6C transparency), [ADR 0020](0020-security-model-public-stub.md) (security-model posture), [ADR 0028](0028-honest-llm-spend-accounting.md), and [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (read access is server-enforced, not a doc claim). Read API: tasks [#541](https://example.com/builders#/task/541)/[#627](https://example.com/builders#/task/627). Coverage history: [#551](https://example.com/builders#/task/551)/[#608](https://example.com/builders#/task/608)/[#617](https://example.com/builders#/task/617)/[#620](https://example.com/builders#/task/620).
5
- **Status:** Proposed. Directive accepted (Lars, 2026-06-13); the **mechanism awaits review, and capture MUST NOT ship until the scrubber precondition (task 1003) is verified.**
5
+ **Status:** Accepted and implemented (task 1001004, 2026-10-01). Directive accepted (Lars, 2026-06-13); the scrubber precondition (task 1003) shipped before capture, as required.
6
6
  **Track:** `internal` (dev-system / BFG).
7
7
 
8
8
  ## Problem
@@ -22,6 +22,8 @@ Lars's directive (2026-06-13): **the BFG must hold the full transcript of every
22
22
  ### 1. Full per-turn content (replaces the thin snippet model)
23
23
  Capture the complete per-turn transcript — user prompts, assistant text, tool calls **and** their results — instead of length-bounded snippets. Stored as scrubbed text on each turn in `session_records` (new `transcript jsonb` column, or a widened `detail`; migration **085** reserved on claim 762). The per-turn *metadata* and `metrics` aggregates ADR 0027 relies on are kept — the evaluator logic is unchanged; only the stored fidelity grows.
24
24
 
25
+ **As built (task 1001004):** a *third* shape beat both options above — a separate `session_transcripts` table (migration `core_269`), one row per `session_id`, joined to `session_records`. The BFG's hot queries (`searchSessions`, `summarizeSessions`, `/mine`) read `session_records` and its KB-sized rows; putting MB of transcript on that row would make every list query carry or have to exclude it. Upload is `PUT /sessions/:sid/transcript` (own 16 MB parser, so a transcript failure can never block a digest or its reward), read is `GET /sessions/:id/transcript`. Thinking blocks are not captured — the directive is what the builder asked and what they were told. The builder's box caps each field and the whole upload (head + tail kept, `truncated` set) so the server is never handed something it must reject.
26
+
25
27
  ### 2. Every session, no silent gaps
26
28
  Coverage is already most of the way there: the `SessionEnd` hook (`scripts/gds/session-digest.js`) fires once per session end (not just on ship) and upserts **one record per `session_id`**, and `ship.js` covers the mid-session tail. This ADR keeps that invariant and pairs it with the coverage-reconciliation work (task 965) + the durable skip-logging (task 617) so a session that fails to upload is *visible*, never silently absent.
27
29
 
@@ -29,7 +29,7 @@ Release is a second job in `publish.yml` (`release`, on `workflow_dispatch` with
29
29
 
30
30
  ### D3 — The button starts the job; the server never holds an npm credential
31
31
 
32
- `POST /api/bongos/npm-release/release` (`core.pin.move`, the deploy page's own atom) dispatches the release job through GitHub's API. The GitHub credential is the server's existing GitHub App; the call reaches it through a one-function port, `lifecycle.workflowDispatch`. The `npm-release` module can start a workflow and do nothing else with that credential. The route applies `releaseDecision` first, the same function the job applies again. So the button cannot promise what the job would refuse, and the job remains the gate.
32
+ `POST /api/bongos/npm-release/release` (`core.pin.move`, the deploy page's own atom) dispatches the release job through GitHub's API. The GitHub credential is whichever one the server already holds: a GitHub App installation token if one is configured, otherwise the `GITHUB_PUSH_TOKEN` access token (cloudbongos.com uses the access token). A permission refusal names the one it used (task 1004518). The call reaches it through a one-function port, `lifecycle.workflowDispatch`. The `npm-release` module can start a workflow and do nothing else with that credential. The route applies `releaseDecision` first, the same function the job applies again. So the button cannot promise what the job would refuse, and the job remains the gate.
33
33
 
34
34
  ### D4 — The button shows the evidence
35
35
 
@@ -45,10 +45,10 @@ The deploy page's **Release** section lists the versions this hall runs that are
45
45
 
46
46
  1. **Platform hall follows candidates.** On the control plane, set the platform's entry in `config/update-subscriptions.json` to `"follow": "candidates"` (ADR 0360). Otherwise, once D1 is on, cloudbongos.com stops updating itself.
47
47
  2. **npm:** on npmjs.com → `@bongos/core` → Settings → Trusted publishing, tick **Allow npm dist-tag** on the `publish.yml` entry.
48
- 3. **GitHub App:** give the server's GitHub App **Actions: Read and write** on this repository, and accept the permission change on the installation.
48
+ 3. **GitHub credential:** give the server's GitHub credential **Actions: Read and write** on this repository. For an access token (`GITHUB_PUSH_TOKEN`; on cloudbongos.com the fine-grained token *cloudbongos-publish-reconciler*): Developer settings → Personal access tokens → Edit → Repository permissions. For a GitHub App: the App's Permissions & events, then accept the change on the installation.
49
49
  4. **Switch on:** set the repository Actions variable `PUBLISH_AS_CANDIDATE=1`.
50
50
 
51
- Until step 4, every version this hall runs is already `latest`, so the Release section reads "Nothing is waiting" and nothing else changes. A press made before steps 2–3 fails with the reason (no dist-tag permission, or the App lacks Actions: write) and moves nothing.
51
+ Until step 4, every version this hall runs is already `latest`, so the Release section reads "Nothing is waiting" and nothing else changes. A press made before steps 2–3 fails with the reason (no dist-tag permission, or the server's GitHub credential lacks Actions: write) and moves nothing.
52
52
 
53
53
  ## Consequences
54
54
 
@@ -479,4 +479,4 @@ These 20 numbers are each shared by exactly two files. They are **accepted histo
479
479
  | 0358 | [**A hall wears a look, and its night takes a tint of it** ([task 1004421](https://cloudbongos.com/builders#/task/1004421), goal 1000121 — BV2.PS06; owner D2 + D8, 2026-09-30). Amends [ADR 0219](0219-a-look-is-a-branding-pack-the-style-library.md) (a look could not carry a dark ground) and DESIGN.md's pure-black rule, for halls only. **D1:** the night tint is a formula over the thirteen — the four dark grounds take 5–6% of the look's accent (src/night-tint.js), emitted after the sheet as both dark twins; no token added. **D2:** on by default, and only a chosen look turns it on — a hall with no look is unchanged. **D3:** the apex and hub stay pure black (ADR 0204). **D4:** a custom look is ONE accent for both modes, its lightness nudged until every pair the hall paints with it reads (lookAdjustAccent, client copy test-pinned). **D5:** look + night_tint join the provisioning settings vocabulary; the accent and logo address ride as companion env; the instance resolves the look from the style library. **D6:** a logo is PNG/JPEG/WebP ≤256 KB, magic-sniffed, never SVG, served content-addressed; it is the hall mark and the favicon. Rejected: per-look dark palettes, two custom accents, refusing an unreadable accent, sending the palette over env.](0358-a-hall-wears-a-look-and-its-night-takes-a-tint.md) | hall / branding / design world |
480
480
  | 0359 | [**Nobody sets a module's score by hand; a Metic+ person can ask for a re-check** ([task 1003796](https://cloudbongos.com/builders#/task/1003796) · goal 1000091, criterion `wa5-quality-assessed`). Amends [ADR 0343](0343-a-module-score-is-a-security-gate-then-an-average-of-visible-parts.md) D6 and [ADR 0347](0347-every-store-module-ships-a-how-to.md) D5 on the owner's ruling: there is no score override. A score only ever comes from its signals. Instead `POST /store/modules/:key/versions/:version/reassess { reason }`, gated by the new `module.assessment.rerun` atom (metic floor, granted to metic + archon by `government_021`), queues the same assessment a publish runs. A reason is required and nothing else is accepted. The delist (task 1003797) is unchanged.](0359-nobody-sets-a-module-score-by-hand-metic-can-ask-for-a-re-check.md) | module store / assessment / permissions |
481
481
  | 0360 | [**Bongos follows every candidate; every other project follows releases** ([task 1004297](https://cloudbongos.com/builders#/task/1004297), goal 1000090 — the owner's 2026-09-26 decision that the Bongos hall takes every candidate automatically). Amends ADR 0136. **D1:** a per-instance `follow` beside the channel — `released` (default: at or below the registry's `latest` label) or `candidates` (every version, the platform hall only). **D2:** released is the `latest` dist-tag, read separately; an unreadable label skips the instance, never a guess. **D3:** the timer period is the lag — 15 min declared, installed by task 1003969. **D4:** a version that failed here is held for a day per instance (recorded in the sweep's config home), while any newer version is taken at once — no restart loop at a 15-minute cadence. **D5:** the deploy page's "Upgrades on this hall" — the core_upgrades ledger, rollbacks flagged, and a published version waiting past 30 min said to be the automation stopping. Rejected: a second runner, CI pushing to the box, a hold only a human clears.](0360-bongos-follows-every-candidate-every-other-project-follows-releases.md) | update channel / deploy / core update |
482
- | 0361 | [**Merges publish as candidates; Release on /deploy decides what other projects are offered** ([task 1004298](https://cloudbongos.com/builders#/task/1004298), goal 1000090). Amends ADR 0161. **D1:** merges publish under `next` when `PUBLISH_AS_CANDIDATE=1` (ships inert). **D2:** a `release` job in publish.yml moves `latest` (release-core.js: published, stable, newer than the release) over the same OIDC trusted publisher — no npm token. **D3:** /deploy's Release button (`core.pin.move`) dispatches it through the one-function `lifecycle.workflowDispatch` port. **D4:** evidence beside each button — hours on this hall, ever rolled back. **D5:** the banner and the hosted-project runner offer only released versions; the control-plane row follows candidates. Arming: roster follow → npm dist-tag permission → App Actions: write → the variable.](0361-merges-publish-as-candidates-release-decides-what-others-are-offered.md) | publish / release / update channel |
482
+ | 0361 | [**Merges publish as candidates; Release on /deploy decides what other projects are offered** ([task 1004298](https://cloudbongos.com/builders#/task/1004298), goal 1000090). Amends ADR 0161. **D1:** merges publish under `next` when `PUBLISH_AS_CANDIDATE=1` (ships inert). **D2:** a `release` job in publish.yml moves `latest` (release-core.js: published, stable, newer than the release) over the same OIDC trusted publisher — no npm token. **D3:** /deploy's Release button (`core.pin.move`) dispatches it through the one-function `lifecycle.workflowDispatch` port. **D4:** evidence beside each button — hours on this hall, ever rolled back. **D5:** the banner and the hosted-project runner offer only released versions; the control-plane row follows candidates. Arming: roster follow → npm dist-tag permission → GitHub credential Actions: write → the variable.](0361-merges-publish-as-candidates-release-decides-what-others-are-offered.md) | publish / release / update channel |
@@ -6092,7 +6092,7 @@
6092
6092
  "founding"
6093
6093
  ],
6094
6094
  "summary": "GET /founding/genesis",
6095
- "description": "**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
6095
+ "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).",
6096
6096
  "x-rank": "any-builder",
6097
6097
  "x-source": "modules/onboarding/routes/onboarding.js",
6098
6098
  "responses": {
@@ -18859,6 +18859,121 @@
18859
18859
  ]
18860
18860
  }
18861
18861
  },
18862
+ "/sessions/{id}/transcript": {
18863
+ "get": {
18864
+ "operationId": "get_sessions_id_transcript",
18865
+ "tags": [
18866
+ "sessions"
18867
+ ],
18868
+ "summary": "GET /sessions/:id/transcript",
18869
+ "description": "the FULL transcript of one session (ADR 0051). Same rule as GET /sessions/:id: the owner reads their own; a cross-builder read is Archon-only, 404 (never 403) for everyone else, and the fail-closed audit row is written BEFORE any transcript content is served — transcripts are the most sensitive thing this module holds. Paged (?offset=&limit=, default 500 turns, max 2000): a transcript is MB-scale and the response carries turn_count so the reader knows how far to go.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
18870
+ "x-rank": "any-builder",
18871
+ "x-source": "modules/sessions/routes/sessions.js",
18872
+ "parameters": [
18873
+ {
18874
+ "name": "id",
18875
+ "in": "path",
18876
+ "required": true,
18877
+ "schema": {
18878
+ "type": "string"
18879
+ },
18880
+ "description": "Path parameter `id`."
18881
+ }
18882
+ ],
18883
+ "responses": {
18884
+ "200": {
18885
+ "description": "Success.",
18886
+ "content": {
18887
+ "application/json": {
18888
+ "schema": {
18889
+ "$ref": "#/components/schemas/GetSessionsIdTranscriptResponse"
18890
+ }
18891
+ }
18892
+ }
18893
+ },
18894
+ "400": {
18895
+ "$ref": "#/components/responses/BadRequest"
18896
+ },
18897
+ "401": {
18898
+ "$ref": "#/components/responses/Unauthorized"
18899
+ },
18900
+ "403": {
18901
+ "$ref": "#/components/responses/Forbidden"
18902
+ },
18903
+ "404": {
18904
+ "$ref": "#/components/responses/NotFound"
18905
+ }
18906
+ },
18907
+ "security": [
18908
+ {
18909
+ "builderSession": []
18910
+ }
18911
+ ]
18912
+ }
18913
+ },
18914
+ "/sessions/{sid}/transcript": {
18915
+ "put": {
18916
+ "operationId": "put_sessions_sid_transcript",
18917
+ "tags": [
18918
+ "sessions"
18919
+ ],
18920
+ "summary": "PUT /sessions/:sid/transcript",
18921
+ "description": "upload the FULL scrubbed transcript of your OWN session (ADR 0051, task 1001004). Separate from POST /sessions on purpose: the digest is KB and carries the reward/evaluator path under a 4 MB parser; the transcript is MB and gets its own larger parser, so a transcript failure can never block a digest. The row is created only FROM the caller's own session_records row (no digest → 404, someone else's session_id → 404, never a confirmation it exists). The content is scrubbed on the uploader's box; the server bounds SHAPE, not secrets — every turn must be a plain object and the whole body is capped.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
18922
+ "x-rank": "any-builder",
18923
+ "x-source": "modules/sessions/routes/sessions.js",
18924
+ "parameters": [
18925
+ {
18926
+ "name": "sid",
18927
+ "in": "path",
18928
+ "required": true,
18929
+ "schema": {
18930
+ "type": "string"
18931
+ },
18932
+ "description": "Path parameter `sid`."
18933
+ }
18934
+ ],
18935
+ "requestBody": {
18936
+ "required": true,
18937
+ "content": {
18938
+ "application/json": {
18939
+ "schema": {
18940
+ "$ref": "#/components/schemas/PutSessionsSidTranscriptRequest"
18941
+ }
18942
+ }
18943
+ },
18944
+ "x-validated": true
18945
+ },
18946
+ "responses": {
18947
+ "200": {
18948
+ "description": "Success.",
18949
+ "content": {
18950
+ "application/json": {
18951
+ "schema": {
18952
+ "$ref": "#/components/schemas/PutSessionsSidTranscriptResponse"
18953
+ }
18954
+ }
18955
+ }
18956
+ },
18957
+ "400": {
18958
+ "$ref": "#/components/responses/ValidationFailed"
18959
+ },
18960
+ "401": {
18961
+ "$ref": "#/components/responses/Unauthorized"
18962
+ },
18963
+ "403": {
18964
+ "$ref": "#/components/responses/Forbidden"
18965
+ },
18966
+ "404": {
18967
+ "$ref": "#/components/responses/NotFound"
18968
+ }
18969
+ },
18970
+ "security": [
18971
+ {
18972
+ "builderSession": []
18973
+ }
18974
+ ]
18975
+ }
18976
+ },
18862
18977
  "/sky": {
18863
18978
  "get": {
18864
18979
  "operationId": "get_sky",
@@ -25177,6 +25292,15 @@
25177
25292
  "session"
25178
25293
  ]
25179
25294
  },
25295
+ "GetSessionsIdTranscriptResponse": {
25296
+ "type": "object",
25297
+ "properties": {
25298
+ "transcript": {}
25299
+ },
25300
+ "required": [
25301
+ "transcript"
25302
+ ]
25303
+ },
25180
25304
  "GetSessionsMineResponse": {
25181
25305
  "type": "object",
25182
25306
  "properties": {
@@ -31417,6 +31541,31 @@
31417
31541
  "app"
31418
31542
  ]
31419
31543
  },
31544
+ "PutSessionsSidTranscriptRequest": {
31545
+ "type": "object",
31546
+ "properties": {
31547
+ "turns": {
31548
+ "type": "array",
31549
+ "maxItems": 20000
31550
+ },
31551
+ "truncated": {
31552
+ "type": "boolean"
31553
+ }
31554
+ },
31555
+ "required": [
31556
+ "turns"
31557
+ ],
31558
+ "additionalProperties": false
31559
+ },
31560
+ "PutSessionsSidTranscriptResponse": {
31561
+ "type": "object",
31562
+ "properties": {
31563
+ "transcript": {}
31564
+ },
31565
+ "required": [
31566
+ "transcript"
31567
+ ]
31568
+ },
31420
31569
  "PutSpecialitiesIdSkillsRequest": {
31421
31570
  "type": "object",
31422
31571
  "properties": {
@@ -31592,9 +31741,9 @@
31592
31741
  "description": "A required dependency/feature is not configured or is temporarily down."
31593
31742
  }
31594
31743
  },
31595
- "x-endpoint-count": 494,
31596
- "x-schema-count": 524,
31744
+ "x-endpoint-count": 496,
31745
+ "x-schema-count": 527,
31597
31746
  "x-undocumented-bodies": 12,
31598
- "x-response-schemas": 349,
31747
+ "x-response-schemas": 351,
31599
31748
  "x-generated-by": "scripts/gds/gen-api-docs.js"
31600
31749
  }
@@ -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. 494 endpoints across 92 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 496 endpoints across 92 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`.
@@ -273,7 +273,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
273
273
  |---|---|---|---|---|
274
274
  | POST | `/api/bongos/founding/alive` | `any-builder` | — | |
275
275
  | 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. |
276
- | GET | `/api/bongos/founding/genesis` | `any-builder` | — | |
276
+ | GET | `/api/bongos/founding/genesis` | `any-builder` | — | A project born through the startup flow enters genesis on its first founding read (founding-birth.js, task 1004506) — here and on GET /me… |
277
277
  | 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… |
278
278
  | POST | `/api/bongos/founding/stages/:stage/close` | `any-builder` | — | |
279
279
  | POST | `/api/bongos/founding/start` | `any-builder` | — | |
@@ -717,12 +717,14 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
717
717
  |---|---|---|---|---|
718
718
  | POST | `/api/bongos/session/optimize` | `any-builder` | `mode`, `time_budget_min`, `max_parallel` | pick own next work; the optimizer reads/recommends only. |
719
719
 
720
- ## `sessions` (5)
720
+ ## `sessions` (7)
721
721
 
722
722
  | Method | Path | Rank | Body | Description |
723
723
  |---|---|---|---|---|
724
724
  | POST | `/api/bongos/sessions` | `any-builder` | `session_id`, `task_ids`, `total_tokens`, `duration_seconds`, `started_at`, `ended_at`, `detail`, `metrics`, `model_usage` | upload your OWN session digest. |
725
725
  | GET | `/api/bongos/sessions/:id` | `any-builder` | — | own session full detail (deep-dive); cross-builder fetch requires Archon + a fail-closed audit row (BFG-principal posture until 6C.1). |
726
+ | GET | `/api/bongos/sessions/:id/transcript` | `any-builder` | — | the FULL transcript of one session (ADR 0051). |
727
+ | PUT | `/api/bongos/sessions/:sid/transcript` | `any-builder` | `turns`, `truncated` | upload the FULL scrubbed transcript of your OWN session (ADR 0051, task 1001004). |
726
728
  | GET | `/api/bongos/sessions/mine` | `any-builder` | — | your OWN sessions (self-serve; no audit needed). |
727
729
  | GET | `/api/bongos/sessions/search` | `metic+archon` | — | cross-builder corpus search (BFG-principal posture until 6C.1). |
728
730
  | GET | `/api/bongos/sessions/upload-health` | `metic+archon` | — | GET /sessions/upload-health — the answer to "has anyone's session upload silently stopped?", which before task 1003865 existed ONLY as a … |
@@ -201,6 +201,9 @@ grade_attempts(id, task_id, builder_id?, passed bool, score NUMERIC(3,1), attemp
201
201
  -- read by the correlation audit (served as grade.attempts on GET /tasks/:id?include=grade)
202
202
  -- mig 064 (6D.6, ADR 0027): APPEND-ONLY, one row per grade run, so
203
203
  -- re-grade thrash is countable (task_grades keeps only the latest)
204
+ session_transcripts(session_id PK, builder_id, turn_count, byte_size, truncated,
205
+ turns jsonb, uploaded_at) -- core_269 (ADR 0051): the FULL secret-scrubbed transcript,
206
+ -- one row per session_records row, in its own table so the BFG's searched rows stay KB
204
207
  session_records(id, session_id UNIQUE, builder_id, task_ids bigint[], example_earned,
205
208
  total_tokens, duration_seconds, started_at, ended_at, uploaded_at,
206
209
  detail jsonb, metrics jsonb) -- mig 062 (6D.1, ADR 0027): per-shipped-session
@@ -291,7 +291,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
291
291
  | `f42cb1edcf1e` | certain | Clone the repository | `modules/hall-ui/public/hall-render.js:809` |
292
292
  | `70f6a704d504` | certain | Close it | `modules/hall-ui/public/copy-desk.html:140` |
293
293
  | `d12a2fb5730d` | certain | Close this flag | `modules/hall-ui/public/copy-desk.html:116` |
294
- | `9b9c2abeae90` | certain | Close this stage | `modules/hall-ui/public/genesis-home.js:206` |
294
+ | `9b9c2abeae90` | certain | Close this stage | `modules/hall-ui/public/genesis-home.js:209` |
295
295
  | `3d148e19e03a` | certain | Closed. | `modules/hall-ui/public/copy-desk.js:510` |
296
296
  | `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` |
297
297
  | `e5548861ad79` | certain | Coach the grader | `modules/hall-ui/public/studio.js:211` |
@@ -302,7 +302,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
302
302
  | `fe4a2b04eda5` | certain | Commands — {{worldName}} | `modules/hall-ui/public/commands.html:6` |
303
303
  | `cfc287c42263` | certain | Complete your profile | `modules/hall-ui/public/profile-nudge.js:79` |
304
304
  | `2867c85d196d` | certain | Confirm that verification for #{…} actually passed? | `modules/hall-ui/public/task.js:895` |
305
- | `e74f4442c338` | certain | Confirm this stage | `modules/hall-ui/public/genesis-home.js:197` |
305
+ | `e74f4442c338` | certain | Confirm this stage | `modules/hall-ui/public/genesis-home.js:200` |
306
306
  | `9b16a22bf24c` | certain | Connect Discord &amp; join the server | `modules/hall-ui/public/hall-render.js:955` |
307
307
  | `9b16a22bf24c` | certain | Connect Discord &amp; join the server | `modules/hall-ui/public/settings.js:683` |
308
308
  | `c07898571b24` | certain | Connects to | `modules/hall-ui/public/atlas.js:290` |
@@ -456,7 +456,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
456
456
  | `8e82771e5b63` | certain | Ending a session takes effect immediately; the token stops working on its very next request. | `modules/hall-ui/public/settings.html:163` |
457
457
  | `58d381535285` | certain | Engagement reports | `modules/hall-ui/public/watch.html:130` |
458
458
  | `690609c8e9a9` | certain | Enter a goal number. | `modules/hall-ui/public/gate.js:470` |
459
- | `4f776bc33d5f` | certain | Enter the builders’ hall | `modules/hall-ui/public/genesis-home.js:219` |
459
+ | `4f776bc33d5f` | certain | Enter the builders’ hall | `modules/hall-ui/public/genesis-home.js:222` |
460
460
  | `1825c9c467d8` | certain | Enter the id of the task this one should wait for. | `modules/hall-ui/public/task.js:951` |
461
461
  | `bd7a40639a1c` | certain | Estimate (min) | `modules/hall-ui/public/task-detail.js:460` |
462
462
  | `c15d1f0ddfb6` | certain | Estimation accuracy | `modules/hall-ui/public/watch.html:148` |
@@ -659,7 +659,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
659
659
  | `7c9b7a89353b` | certain | Leave goal | `modules/hall-ui/public/goals-render.js:967` |
660
660
  | `6137d2679912` | certain | Leave it off | `modules/hall-ui/public/settings-specialities.js:138` |
661
661
  | `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` |
662
- | `e14ebcf3eec5` | certain | Legislation has passed. Genesis is complete. | `modules/hall-ui/public/genesis-home.js:188` |
662
+ | `e14ebcf3eec5` | certain | Legislation has passed. Genesis is complete. | `modules/hall-ui/public/genesis-home.js:191` |
663
663
  | `d6a78b9e5368` | certain | Let it be for now | `modules/hall-ui/public/studio.js:233` |
664
664
  | `d6a78b9e5368` | certain | Let it be for now | `modules/hall-ui/public/studio.js:248` |
665
665
  | `b8ba1fa4457c` | certain | Link a task | `modules/hall-ui/public/blockers.js:148` |
@@ -772,7 +772,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
772
772
  | `084748fd85b4` | certain | No shipped work is recorded between core {…} and {…}. | `modules/hall-ui/public/deploy.js:541` |
773
773
  | `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` |
774
774
  | `545dc44ad427` | certain | No task in this goal depends on another task in this goal. | `modules/hall-ui/public/goal-forest-render.js:126` |
775
- | `da838f6056b1` | certain | No tasks for this stage yet. | `modules/hall-ui/public/genesis-home.js:178` |
775
+ | `da838f6056b1` | certain | No tasks for this stage yet. | `modules/hall-ui/public/genesis-home.js:181` |
776
776
  | `712b64d8273f` | certain | No tasks match these filters. Try widening them. | `modules/hall-ui/public/work.js:427` |
777
777
  | `2302ee46744e` | certain | No terminal commands found. | `modules/hall-ui/public/commands.js:46` |
778
778
  | `78f78d1d1e1f` | certain | No version is in flight right now. | `modules/hall-ui/public/roadmap.js:409` |
@@ -848,8 +848,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
848
848
  | `855277dff074` | certain | Open task #{…} | `modules/hall-ui/public/work.js:835` |
849
849
  | `99c630009152` | certain | Open tasks whose declared files overlap — sequence these before two builders collide. | `modules/hall-ui/public/goals.html:117` |
850
850
  | `99c630009152` | certain | Open tasks whose declared files overlap — sequence these before two builders collide. | `modules/hall-ui/public/goals.html:197` |
851
- | `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:198` |
852
- | `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:203` |
851
+ | `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:201` |
852
+ | `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:206` |
853
853
  | `e073aa0c3847` | certain | Open the conflicts for {…} | `modules/hall-ui/public/goal-inbox.js:112` |
854
854
  | `676361254d92` | certain | Open the idea composer | `modules/hall-ui/public/idea.js:504` |
855
855
  | `29e1cb2d32fc` | certain | Open the recording | `modules/hall-ui/public/criterion-uat-ui.js:121` |
@@ -915,7 +915,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
915
915
  | `abee9a18325d` | certain | Propose wording… | `modules/hall-ui/public/copy-desk.js:179` |
916
916
  | `3f85bdc47099` | certain | Protected module scope — join by request; an Archon admits members | `modules/hall-ui/public/goals-render.js:883` |
917
917
  | `e5c292c8b361` | certain | Provides (seams) | `modules/hall-ui/public/atlas.js:288` |
918
- | `93b836382ec7` | certain | Put it to the board again | `modules/hall-ui/public/genesis-home.js:202` |
918
+ | `93b836382ec7` | certain | Put it to the board again | `modules/hall-ui/public/genesis-home.js:205` |
919
919
  | `4de232a05888` | certain | Raise after | `modules/hall-ui/public/project-settings.js:113` |
920
920
  | `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` |
921
921
  | `b9c6def6b120` | certain | Rank set to {…}. | `modules/hall-ui/public/watch.js:883` |
@@ -1150,7 +1150,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1150
1150
  | `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` |
1151
1151
  | `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` |
1152
1152
  | `f38140e472df` | certain | The board ratified a change that is not in force. | `modules/hall-ui/public/government.js:633` |
1153
- | `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` |
1153
+ | `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:204` |
1154
1154
  | `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` |
1155
1155
  | `2dc061096c48` | certain | The copy desk — every flagged string | `modules/hall-ui/public/studio.html:165` |
1156
1156
  | `325daac25a9a` | certain | The day the sky is drawn for | `modules/hall-ui/public/goal-map.html:127` |
@@ -1359,7 +1359,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1359
1359
  | `b8743d16eab8` | certain | What {…} unlocks | `modules/hall-ui/public/hall-render.js:82` |
1360
1360
  | `6ff24dd04d46` | certain | What\u2019s this? | `modules/hall-ui/public/shell.js:1027` |
1361
1361
  | `ecfd34bf5e6f` | certain | What’s stuck (optional) | `modules/hall-ui/public/blockers.js:308` |
1362
- | `55ef095fe001` | certain | When every task above is finished, this stage can be put to the board. | `modules/hall-ui/public/genesis-home.js:208` |
1362
+ | `55ef095fe001` | certain | When every task above is finished, this stage can be put to the board. | `modules/hall-ui/public/genesis-home.js:211` |
1363
1363
  | `a6e102816e92` | certain | When to reach for it | `modules/hall-ui/public/commands-lib.js:100` |
1364
1364
  | `a6e102816e92` | certain | When to reach for it | `modules/hall-ui/public/settings-specialities.js:130` |
1365
1365
  | `5d73558dae0e` | certain | Where do you begin? | `modules/hall-ui/public/goal-map.html:110` |
@@ -1482,8 +1482,8 @@
1482
1482
  "text": "Open the Board Room",
1483
1483
  "occurrences": 2,
1484
1484
  "at": [
1485
- "modules/hall-ui/public/genesis-home.js:198",
1486
- "modules/hall-ui/public/genesis-home.js:203"
1485
+ "modules/hall-ui/public/genesis-home.js:201",
1486
+ "modules/hall-ui/public/genesis-home.js:206"
1487
1487
  ]
1488
1488
  },
1489
1489
  {
@@ -4324,7 +4324,7 @@
4324
4324
  "surface": "builders-hall",
4325
4325
  "text": "Close this stage",
4326
4326
  "file": "modules/hall-ui/public/genesis-home.js",
4327
- "line": 206,
4327
+ "line": 209,
4328
4328
  "origin": "js-markup",
4329
4329
  "confidence": "certain"
4330
4330
  },
@@ -4423,7 +4423,7 @@
4423
4423
  "surface": "builders-hall",
4424
4424
  "text": "Confirm this stage",
4425
4425
  "file": "modules/hall-ui/public/genesis-home.js",
4426
- "line": 197,
4426
+ "line": 200,
4427
4427
  "origin": "js-markup",
4428
4428
  "confidence": "certain"
4429
4429
  },
@@ -5809,7 +5809,7 @@
5809
5809
  "surface": "builders-hall",
5810
5810
  "text": "Enter the builders’ hall",
5811
5811
  "file": "modules/hall-ui/public/genesis-home.js",
5812
- "line": 219,
5812
+ "line": 222,
5813
5813
  "origin": "js-markup",
5814
5814
  "confidence": "certain"
5815
5815
  },
@@ -7636,7 +7636,7 @@
7636
7636
  "surface": "builders-hall",
7637
7637
  "text": "Legislation has passed. Genesis is complete.",
7638
7638
  "file": "modules/hall-ui/public/genesis-home.js",
7639
- "line": 188,
7639
+ "line": 191,
7640
7640
  "origin": "js-markup",
7641
7641
  "confidence": "certain"
7642
7642
  },
@@ -8653,7 +8653,7 @@
8653
8653
  "surface": "builders-hall",
8654
8654
  "text": "No tasks for this stage yet.",
8655
8655
  "file": "modules/hall-ui/public/genesis-home.js",
8656
- "line": 178,
8656
+ "line": 181,
8657
8657
  "origin": "js-markup",
8658
8658
  "confidence": "certain"
8659
8659
  },
@@ -9337,7 +9337,7 @@
9337
9337
  "surface": "builders-hall",
9338
9338
  "text": "Open the Board Room",
9339
9339
  "file": "modules/hall-ui/public/genesis-home.js",
9340
- "line": 198,
9340
+ "line": 201,
9341
9341
  "origin": "js-markup",
9342
9342
  "confidence": "certain"
9343
9343
  },
@@ -9346,7 +9346,7 @@
9346
9346
  "surface": "builders-hall",
9347
9347
  "text": "Open the Board Room",
9348
9348
  "file": "modules/hall-ui/public/genesis-home.js",
9349
- "line": 203,
9349
+ "line": 206,
9350
9350
  "origin": "js-markup",
9351
9351
  "confidence": "certain"
9352
9352
  },
@@ -9940,7 +9940,7 @@
9940
9940
  "surface": "builders-hall",
9941
9941
  "text": "Put it to the board again",
9942
9942
  "file": "modules/hall-ui/public/genesis-home.js",
9943
- "line": 202,
9943
+ "line": 205,
9944
9944
  "origin": "js-markup",
9945
9945
  "confidence": "certain"
9946
9946
  },
@@ -12055,7 +12055,7 @@
12055
12055
  "surface": "builders-hall",
12056
12056
  "text": "The board sent this stage back. Read why in the Board Room, then put it up again.",
12057
12057
  "file": "modules/hall-ui/public/genesis-home.js",
12058
- "line": 201,
12058
+ "line": 204,
12059
12059
  "origin": "js-markup",
12060
12060
  "confidence": "certain"
12061
12061
  },
@@ -13936,7 +13936,7 @@
13936
13936
  "surface": "builders-hall",
13937
13937
  "text": "When every task above is finished, this stage can be put to the board.",
13938
13938
  "file": "modules/hall-ui/public/genesis-home.js",
13939
- "line": 208,
13939
+ "line": 211,
13940
13940
  "origin": "js-markup",
13941
13941
  "confidence": "certain"
13942
13942
  },