@bongos/core 1.17.3 → 1.18.0

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 (95) hide show
  1. package/.bongos-core.json +161 -91
  2. package/.devcontainer/healthcheck.sh +0 -0
  3. package/.devcontainer/init-firewall.sh +0 -0
  4. package/.devcontainer/post-create.sh +0 -0
  5. package/GOVERNANCE.md +1 -1
  6. package/README.md +26 -22
  7. package/bin/bongos.js +0 -0
  8. package/docker-entrypoint.sh +0 -0
  9. package/docs/adr/0139-platform-history-migration-to-cloudbongos.md +94 -0
  10. package/docs/adr/0140-cloudbongos-standalone-reprovision.md +43 -0
  11. package/docs/adr/README.md +3 -0
  12. package/docs/api/openapi.json +4 -345
  13. package/docs/api-reference.md +5 -17
  14. package/docs/file-map.md +7 -25
  15. package/docs/onboarding/diagrams/05-versioning.mmd +4 -6
  16. package/docs/onboarding/diagrams/assertions.json +5 -9
  17. package/modules/hall-ui/public/builders.js +37 -0
  18. package/modules/hall-ui/public/goals-page.js +98 -176
  19. package/modules/hall-ui/public/goals.css +183 -0
  20. package/modules/hall-ui/public/goals.html +35 -261
  21. package/modules/hall-ui/public/goals.js +7 -2
  22. package/modules/hall-ui/public/hall-widgets.js +12 -4
  23. package/modules/hall-ui/public/settings.css +355 -0
  24. package/modules/hall-ui/public/settings.html +86 -414
  25. package/modules/hall-ui/public/settings.js +96 -35
  26. package/modules/hall-ui/public/style.css +31 -0
  27. package/modules/hall-ui/public/watch.css +184 -0
  28. package/modules/hall-ui/public/watch.html +111 -285
  29. package/modules/hall-ui/public/watch.js +59 -21
  30. package/package-lock.json +2 -2
  31. package/package.json +1 -1
  32. package/public-landing/create.html +83 -7
  33. package/public-landing/index.html +11 -76
  34. package/scripts/cron/style_guide_audit.sh +0 -0
  35. package/scripts/gds/api.js +0 -0
  36. package/scripts/gds/architect-audit.js +0 -0
  37. package/scripts/gds/audit-authorship.sh +0 -0
  38. package/scripts/gds/audit-replay.sh +0 -0
  39. package/scripts/gds/box.js +0 -0
  40. package/scripts/gds/capture.js +0 -0
  41. package/scripts/gds/conductor-dispatch.js +0 -0
  42. package/scripts/gds/coreB-carve-proof.sh +0 -0
  43. package/scripts/gds/db-backup-nightly.sh +0 -0
  44. package/scripts/gds/db-backup-offsite.sh +0 -0
  45. package/scripts/gds/doctor.js +0 -0
  46. package/scripts/gds/grade-smoke.js +0 -0
  47. package/scripts/gds/hooks/pre-push.js +0 -0
  48. package/scripts/gds/install-git-hooks.js +0 -0
  49. package/scripts/gds/main-audit.js +0 -0
  50. package/scripts/gds/oauth-secret.js +0 -0
  51. package/scripts/gds/onboarding-analyze.js +0 -0
  52. package/scripts/gds/onboarding-ship.js +0 -0
  53. package/scripts/gds/paste-token.js +0 -0
  54. package/scripts/gds/portability-smoke-art.sh +0 -0
  55. package/scripts/gds/portability-smoke-memory.sh +0 -0
  56. package/scripts/gds/provision.js +125 -4
  57. package/scripts/gds/push-main.js +0 -0
  58. package/scripts/gds/render-ideas.js +0 -0
  59. package/scripts/gds/security-baseline-check.sh +0 -0
  60. package/scripts/gds/session.js +0 -0
  61. package/scripts/gds/ship.js +11 -1
  62. package/scripts/gds/smoke-batch-claim.sh +0 -0
  63. package/scripts/gds/smoke-batch-release.sh +0 -0
  64. package/scripts/gds/smoke-box.sh +0 -0
  65. package/scripts/gds/smoke-claim-consistency.sh +0 -0
  66. package/scripts/gds/smoke-dependencies.sh +0 -0
  67. package/scripts/gds/smoke-write.sh +0 -0
  68. package/scripts/hall-preview/fixtures/access-requests.json +20 -1
  69. package/scripts/hall-preview/fixtures/audit-log.json +68 -1
  70. package/scripts/hall-preview/fixtures/blockers__detail.json +12 -0
  71. package/scripts/hall-preview/fixtures/box__me.json +5 -0
  72. package/scripts/hall-preview/fixtures/boxes__cost-ledger.json +69 -1
  73. package/scripts/hall-preview/fixtures/builders__roster.json +48 -1
  74. package/scripts/hall-preview/fixtures/grades__by-builder.json +32 -1
  75. package/scripts/hall-preview/fixtures/inbox__detail.json +15 -0
  76. package/scripts/hall-preview/fixtures/me__art-key__own.json +6 -0
  77. package/scripts/hall-preview/fixtures/me__event-sound-prefs.json +209 -0
  78. package/scripts/hall-preview/fixtures/me__render.json +5 -0
  79. package/scripts/hall-preview/fixtures/me__skill-prefs.json +143 -0
  80. package/scripts/hall-preview/fixtures/me__sound-prefs.json +67 -0
  81. package/scripts/hall-preview/fixtures/me__wandering.json +43 -0
  82. package/scripts/hall-preview/fixtures/override-requests.json +15 -1
  83. package/scripts/hall-preview/fixtures/security__docs.json +10 -1
  84. package/scripts/hall-preview/fixtures/security__reports.json +31 -1
  85. package/scripts/hall-preview/fixtures/sessions__search.json +9 -1
  86. package/scripts/hall-preview/server.js +18 -1
  87. package/scripts/migrate.sh +0 -0
  88. package/scripts/migrate_cost_ledger.sh +0 -0
  89. package/scripts/render-diagrams.sh +0 -0
  90. package/scripts/security/dep-audit.js +0 -0
  91. package/scripts/setup-builder.js +0 -0
  92. package/scripts/setup-builder.sh +0 -0
  93. package/scripts/snapshots/maybe-render-on-deploy.sh +0 -0
  94. package/src/module-api.js +20 -1
  95. package/tests/provision.mjs +69 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
- "title": "Off the Boats — GDS API",
4
+ "title": "Cloud Bongos — GDS API",
5
5
  "version": "0.0.2",
6
6
  "license": {
7
7
  "name": "AGPL-3.0-or-later",
@@ -77,10 +77,6 @@
77
77
  "name": "cost",
78
78
  "description": "Endpoints under `/api/bongos/cost`."
79
79
  },
80
- {
81
- "name": "demo",
82
- "description": "Endpoints under `/api/bongos/demo`."
83
- },
84
80
  {
85
81
  "name": "dependencies",
86
82
  "description": "Endpoints under `/api/bongos/dependencies`."
@@ -3007,83 +3003,6 @@
3007
3003
  ]
3008
3004
  }
3009
3005
  },
3010
- "/demo/health": {
3011
- "get": {
3012
- "operationId": "get_demo_health",
3013
- "tags": [
3014
- "demo"
3015
- ],
3016
- "summary": "GET /demo/health",
3017
- "description": "READ — liveness + the core version this module was mounted against. No rank gate beyond the requireBuilder the loader composes around every module route. rank: public\n\n**Rank:** `public` — No authentication — any caller.",
3018
- "x-rank": "public",
3019
- "x-source": "modules/demo/routes/demo.js",
3020
- "responses": {
3021
- "200": {
3022
- "description": "Success.",
3023
- "content": {
3024
- "application/json": {
3025
- "schema": {
3026
- "$ref": "#/components/schemas/GetDemoHealthResponse"
3027
- }
3028
- }
3029
- }
3030
- },
3031
- "400": {
3032
- "$ref": "#/components/responses/BadRequest"
3033
- }
3034
- },
3035
- "security": []
3036
- }
3037
- },
3038
- "/demo/ping": {
3039
- "post": {
3040
- "operationId": "post_demo_ping",
3041
- "tags": [
3042
- "demo"
3043
- ],
3044
- "summary": "POST /demo/ping",
3045
- "description": "WRITE — EVERY module write route MUST be rank-gated (the BV1.R44 fitness check reds the build on an ungated module write route). `requireRank('metic', 'archon')` is Metic-and-above (the route-rank classifier records it as metic+archon). This records a ping into the module's own namespaced table (demo_pings) via the doorway pool.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).",
3046
- "x-rank": "metic+archon",
3047
- "x-source": "modules/demo/routes/demo.js",
3048
- "requestBody": {
3049
- "required": false,
3050
- "content": {
3051
- "application/json": {
3052
- "schema": {
3053
- "$ref": "#/components/schemas/PostDemoPingRequest"
3054
- }
3055
- }
3056
- },
3057
- "x-validated": true
3058
- },
3059
- "responses": {
3060
- "200": {
3061
- "description": "Success.",
3062
- "content": {
3063
- "application/json": {
3064
- "schema": {
3065
- "$ref": "#/components/schemas/PostDemoPingResponse"
3066
- }
3067
- }
3068
- }
3069
- },
3070
- "400": {
3071
- "$ref": "#/components/responses/ValidationFailed"
3072
- },
3073
- "401": {
3074
- "$ref": "#/components/responses/Unauthorized"
3075
- },
3076
- "403": {
3077
- "$ref": "#/components/responses/Forbidden"
3078
- }
3079
- },
3080
- "security": [
3081
- {
3082
- "builderSession": []
3083
- }
3084
- ]
3085
- }
3086
- },
3087
3006
  "/dependencies": {
3088
3007
  "post": {
3089
3008
  "operationId": "post_dependencies",
@@ -5475,182 +5394,6 @@
5475
5394
  ]
5476
5395
  }
5477
5396
  },
5478
- "/me/art-key": {
5479
- "get": {
5480
- "operationId": "get_me_art_key",
5481
- "tags": [
5482
- "me"
5483
- ],
5484
- "summary": "GET /me/art-key",
5485
- "description": "Shared art key for newcomers (task 1281 / ADR 0068). Hands a SHARED Google AI Studio (Gemini) key to rank=xenos builders so their first art task works without their own key — we pay up front. The session-start sync (scripts/gds/fetch-art-key.js) calls this and writes/removes the local shared_gemini_api_key slot from the response. Thetes+ get a 200 with entitled:false (NOT a 403) — the sync needs an unambiguous \"remove the shared key\" signal it can tell apart from an auth failure, and the rank is the gate, not the route. The secret is attached ONLY when entitled && configured; the response is no-store and the key is never logged. Rank is read live from the DB (no caching, per ADR 0016). rank: any-builder — any authenticated builder may ask; `entitled` in the body is the server-enforced gate. A non-newcomer never receives the secret.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
5486
- "x-rank": "any-builder",
5487
- "x-source": "modules/art-pipeline/routes/art-key.js",
5488
- "responses": {
5489
- "200": {
5490
- "description": "Success."
5491
- },
5492
- "400": {
5493
- "$ref": "#/components/responses/BadRequest"
5494
- },
5495
- "401": {
5496
- "$ref": "#/components/responses/Unauthorized"
5497
- },
5498
- "403": {
5499
- "$ref": "#/components/responses/Forbidden"
5500
- }
5501
- },
5502
- "security": [
5503
- {
5504
- "builderSession": []
5505
- }
5506
- ]
5507
- }
5508
- },
5509
- "/me/art-key/own": {
5510
- "get": {
5511
- "operationId": "get_me_art_key_own",
5512
- "tags": [
5513
- "me"
5514
- ],
5515
- "summary": "GET /me/art-key/own",
5516
- "description": "Masked metadata for the browser: { set, last4, set_at, storage_configured }.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
5517
- "x-rank": "any-builder",
5518
- "x-source": "modules/art-pipeline/routes/art-key.js",
5519
- "responses": {
5520
- "200": {
5521
- "description": "Success.",
5522
- "content": {
5523
- "application/json": {
5524
- "schema": {
5525
- "$ref": "#/components/schemas/GetMeArtKeyOwnResponse"
5526
- }
5527
- }
5528
- }
5529
- },
5530
- "400": {
5531
- "$ref": "#/components/responses/BadRequest"
5532
- },
5533
- "401": {
5534
- "$ref": "#/components/responses/Unauthorized"
5535
- },
5536
- "403": {
5537
- "$ref": "#/components/responses/Forbidden"
5538
- }
5539
- },
5540
- "security": [
5541
- {
5542
- "builderSession": []
5543
- }
5544
- ]
5545
- },
5546
- "put": {
5547
- "operationId": "put_me_art_key_own",
5548
- "tags": [
5549
- "me"
5550
- ],
5551
- "summary": "PUT /me/art-key/own",
5552
- "description": "Set or replace the builder's own key. Body: { key }. Validates the key with one cheap call to Google (catches typos), encrypts it, stores it. Returns the masked metadata — never the key.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
5553
- "x-rank": "any-builder",
5554
- "x-source": "modules/art-pipeline/routes/art-key.js",
5555
- "requestBody": {
5556
- "required": true,
5557
- "content": {
5558
- "application/json": {
5559
- "schema": {
5560
- "$ref": "#/components/schemas/PutMeArtKeyOwnRequest"
5561
- }
5562
- }
5563
- },
5564
- "x-validated": true
5565
- },
5566
- "responses": {
5567
- "200": {
5568
- "description": "Success."
5569
- },
5570
- "400": {
5571
- "$ref": "#/components/responses/ValidationFailed"
5572
- },
5573
- "401": {
5574
- "$ref": "#/components/responses/Unauthorized"
5575
- },
5576
- "403": {
5577
- "$ref": "#/components/responses/Forbidden"
5578
- }
5579
- },
5580
- "security": [
5581
- {
5582
- "builderSession": []
5583
- }
5584
- ]
5585
- },
5586
- "delete": {
5587
- "operationId": "delete_me_art_key_own",
5588
- "tags": [
5589
- "me"
5590
- ],
5591
- "summary": "DELETE /me/art-key/own",
5592
- "description": "Remove the builder's own key (back to \"not set\"). The session-start sync then withdraws the managed local copy on its next run.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
5593
- "x-rank": "any-builder",
5594
- "x-source": "modules/art-pipeline/routes/art-key.js",
5595
- "responses": {
5596
- "200": {
5597
- "description": "Success."
5598
- },
5599
- "400": {
5600
- "$ref": "#/components/responses/BadRequest"
5601
- },
5602
- "401": {
5603
- "$ref": "#/components/responses/Unauthorized"
5604
- },
5605
- "403": {
5606
- "$ref": "#/components/responses/Forbidden"
5607
- }
5608
- },
5609
- "security": [
5610
- {
5611
- "builderSession": []
5612
- }
5613
- ]
5614
- }
5615
- },
5616
- "/me/art-key/storage-init": {
5617
- "post": {
5618
- "operationId": "post_me_art_key_storage_init",
5619
- "tags": [
5620
- "me"
5621
- ],
5622
- "summary": "POST /me/art-key/storage-init",
5623
- "description": "Archon-only: provision the server's secret-box master key so per-builder key storage can turn on (task 1398, blocker 41). Idempotent — NEVER overwrites an existing key. Lives under /me/art-key/* for client locality, but is a server-wide admin action — hence the requireRank('archon') gate.\n\n**Rank:** `archon` — Archon only (the single owner — ratification, infra, rank changes).",
5624
- "x-rank": "archon",
5625
- "x-source": "modules/art-pipeline/routes/art-key.js",
5626
- "responses": {
5627
- "200": {
5628
- "description": "Success.",
5629
- "content": {
5630
- "application/json": {
5631
- "schema": {
5632
- "$ref": "#/components/schemas/PostMeArtKeyStorageInitResponse"
5633
- }
5634
- }
5635
- }
5636
- },
5637
- "400": {
5638
- "$ref": "#/components/responses/BadRequest"
5639
- },
5640
- "401": {
5641
- "$ref": "#/components/responses/Unauthorized"
5642
- },
5643
- "403": {
5644
- "$ref": "#/components/responses/Forbidden"
5645
- }
5646
- },
5647
- "security": [
5648
- {
5649
- "builderSession": []
5650
- }
5651
- ]
5652
- }
5653
- },
5654
5397
  "/me/disciplines": {
5655
5398
  "patch": {
5656
5399
  "operationId": "patch_me_disciplines",
@@ -10456,21 +10199,6 @@
10456
10199
  "stale_hours"
10457
10200
  ]
10458
10201
  },
10459
- "GetDemoHealthResponse": {
10460
- "type": "object",
10461
- "properties": {
10462
- "module": {},
10463
- "ok": {
10464
- "type": "boolean"
10465
- },
10466
- "coreVersion": {}
10467
- },
10468
- "required": [
10469
- "module",
10470
- "ok",
10471
- "coreVersion"
10472
- ]
10473
- },
10474
10202
  "GetDiscordChannelsPlanResponse": {
10475
10203
  "type": "object",
10476
10204
  "properties": {
@@ -10635,21 +10363,6 @@
10635
10363
  "unlocked"
10636
10364
  ]
10637
10365
  },
10638
- "GetMeArtKeyOwnResponse": {
10639
- "type": "object",
10640
- "properties": {
10641
- "set": {},
10642
- "last4": {},
10643
- "set_at": {},
10644
- "storage_configured": {}
10645
- },
10646
- "required": [
10647
- "set",
10648
- "last4",
10649
- "set_at",
10650
- "storage_configured"
10651
- ]
10652
- },
10653
10366
  "GetMeDisplayNameResponse": {
10654
10367
  "type": "object",
10655
10368
  "properties": {
@@ -12314,30 +12027,6 @@
12314
12027
  "recorded_at": {}
12315
12028
  }
12316
12029
  },
12317
- "PostDemoPingRequest": {
12318
- "type": "object",
12319
- "properties": {
12320
- "note": {
12321
- "type": "string"
12322
- }
12323
- },
12324
- "additionalProperties": false
12325
- },
12326
- "PostDemoPingResponse": {
12327
- "type": "object",
12328
- "properties": {
12329
- "module": {},
12330
- "ok": {
12331
- "type": "boolean"
12332
- },
12333
- "ping": {}
12334
- },
12335
- "required": [
12336
- "module",
12337
- "ok",
12338
- "ping"
12339
- ]
12340
- },
12341
12030
  "PostDependenciesResponse": {
12342
12031
  "type": "object",
12343
12032
  "properties": {
@@ -13048,23 +12737,6 @@
13048
12737
  "linked"
13049
12738
  ]
13050
12739
  },
13051
- "PostMeArtKeyStorageInitResponse": {
13052
- "type": "object",
13053
- "properties": {
13054
- "ok": {
13055
- "type": "boolean"
13056
- },
13057
- "created": {},
13058
- "reason": {},
13059
- "storage_configured": {}
13060
- },
13061
- "required": [
13062
- "ok",
13063
- "created",
13064
- "reason",
13065
- "storage_configured"
13066
- ]
13067
- },
13068
12740
  "PostMemoryBuildersBuilderIdBfgWriteRequest": {
13069
12741
  "type": "object",
13070
12742
  "properties": {
@@ -13896,19 +13568,6 @@
13896
13568
  "criteria"
13897
13569
  ]
13898
13570
  },
13899
- "PutMeArtKeyOwnRequest": {
13900
- "type": "object",
13901
- "properties": {
13902
- "key": {
13903
- "type": "string",
13904
- "maxLength": 400
13905
- }
13906
- },
13907
- "required": [
13908
- "key"
13909
- ],
13910
- "additionalProperties": false
13911
- },
13912
13571
  "PutTasksIdDependenciesRequest": {
13913
13572
  "type": "object",
13914
13573
  "properties": {
@@ -14060,9 +13719,9 @@
14060
13719
  "description": "A required dependency/feature is not configured or is temporarily down."
14061
13720
  }
14062
13721
  },
14063
- "x-endpoint-count": 230,
14064
- "x-schema-count": 250,
13722
+ "x-endpoint-count": 223,
13723
+ "x-schema-count": 244,
14065
13724
  "x-undocumented-bodies": 8,
14066
- "x-response-schemas": 170,
13725
+ "x-response-schemas": 166,
14067
13726
  "x-generated-by": "scripts/gds/gen-api-docs.js"
14068
13727
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  # GDS API reference
4
4
 
5
- > **Generated from the live route files** — the route file is authoritative. 230 endpoints across 38 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 223 endpoints across 36 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/<redacted>.md)): `public` < `any-builder` < `metic+archon` < `archon`.
@@ -145,13 +145,6 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
145
145
  |---|---|---|---|---|
146
146
  | POST | `/api/bongos/cost` | `any-builder` | `task_id`, `amount_usd`, `category`, `description`, `source`, `source_ref`, `recorded_at`, `fresh_input_usd`, `cache_read_usd`, `cache_write_usd`, `output_usd`, `builder_id`, `skill_name` | log cost on own claim (idempotent via source/source_ref). |
147
147
 
148
- ## `demo` (2)
149
-
150
- | Method | Path | Rank | Body | Description |
151
- |---|---|---|---|---|
152
- | GET | `/api/bongos/demo/health` | `public` | — | READ — liveness + the core version this module was mounted against. |
153
- | POST | `/api/bongos/demo/ping` | `metic+archon` | `note` | WRITE — EVERY module write route MUST be rank-gated (the BV1.R44 fitness check reds the build on an ungated module write route). |
154
-
155
148
  ## `dependencies` (2)
156
149
 
157
150
  | Method | Path | Rank | Body | Description |
@@ -220,7 +213,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
220
213
 
221
214
  | Method | Path | Rank | Body | Description |
222
215
  |---|---|---|---|---|
223
- | GET | `/api/bongos/healthz` | `public` | — | liveness probe; status.example.com hits this anonymously. |
216
+ | GET | `/api/bongos/healthz` | `public` | — | liveness probe; status.amazonprimea.com hits this anonymously. |
224
217
 
225
218
  ## `inbox` (4)
226
219
 
@@ -263,18 +256,13 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
263
256
  | POST | `/api/bongos/llm-cache/lookup` | `metic+archon` | `cache_key`, `tokens_saved_est` | POST /llm-cache/lookup — hit/miss + atomic hit_count bump. |
264
257
  | POST | `/api/bongos/llm-cache/store` | `metic+archon` | `spec`, `result_stdout`, `result_cost_usd` | POST /llm-cache/store — upsert a freshly-produced result. |
265
258
 
266
- ## `me` (26)
259
+ ## `me` (21)
267
260
 
268
261
  | Method | Path | Rank | Body | Description |
269
262
  |---|---|---|---|---|
270
263
  | GET | `/api/bongos/me` | `any-builder` | — | PMS-V2 task 188: response now also carries `unlocked` (server-joined achievement metadata) + `locked_with_progress` (server-computed huma… |
271
264
  | GET | `/api/bongos/me/achievements` | `any-builder` | — | The builder's unlocked achievements (joined to achievement metadata). |
272
265
  | POST | `/api/bongos/me/anthropic-link` | `any-builder` | `anthropic_email`, `anthropic_user_id` | V3.R10 (task 235), criterion C3 — link the authed builder's Anthropic account. |
273
- | GET | `/api/bongos/me/art-key` | `any-builder` | — | Shared art key for newcomers (task 1281 / ADR 0068). |
274
- | GET | `/api/bongos/me/art-key/own` | `any-builder` | — | Masked metadata for the browser: { set, last4, set_at, storage_configured }. |
275
- | PUT | `/api/bongos/me/art-key/own` | `any-builder` | `key` | Set or replace the builder's own key. |
276
- | DELETE | `/api/bongos/me/art-key/own` | `any-builder` | — | Remove the builder's own key (back to "not set"). |
277
- | POST | `/api/bongos/me/art-key/storage-init` | `archon` | — | Archon-only: provision the server's secret-box master key so per-builder key storage can turn on (task 1398, blocker 41). |
278
266
  | PATCH | `/api/bongos/me/disciplines` | `any-builder` | `preferred_disciplines` | Self-service edit of the authenticated builder's preferred disciplines (migrations 027 + 086 / V3.R80). |
279
267
  | GET | `/api/bongos/me/display-name` | `any-builder` | — | Per-builder DISPLAY NAME (task 1669). |
280
268
  | PATCH | `/api/bongos/me/display-name` | `any-builder` | _undocumented_ | PATCH the display name. |
@@ -361,7 +349,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
361
349
  | GET | `/api/bongos/public/repo-info` | `public` | — | GitHub URL bases for the deployed checkout (V3.R13-followup-2 task 411). |
362
350
  | GET | `/api/bongos/public/tasks/:id` | `public` | — | Single-task resolver for "#NNN" deep links. |
363
351
  | GET | `/api/bongos/public/uptime` | `public` | — | Uptime: current status + 90-day history bucketed by hour. |
364
- | GET | `/api/bongos/public/versions` | `public` | — | read-only surface for status.example.com. |
352
+ | GET | `/api/bongos/public/versions` | `public` | — | read-only surface for status.amazonprimea.com. |
365
353
 
366
354
  ## `search` (2)
367
355
 
@@ -431,7 +419,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
431
419
  |---|---|---|---|---|
432
420
  | GET | `/api/bongos/versions` | `public` | — | read-only version list; mirrors /public/versions. |
433
421
  | POST | `/api/bongos/versions` | `archon` | `id`, `name`, `status`, `done_when`, `scope_doc_path`, `criteria` | POST /versions — create a version + its done-when criteria in one call. |
434
- | GET | `/api/bongos/versions/:id/done-when` | `public` | — | Public: status.example.com fetches this every 60s alongside other public/* surfaces. |
422
+ | GET | `/api/bongos/versions/:id/done-when` | `public` | — | Public: status.amazonprimea.com fetches this every 60s alongside other public/* surfaces. |
435
423
  | POST | `/api/bongos/versions/:id/done-when` | `archon` | `criterion_id`, `criterion_md`, `goal_id`, `sort_order` | Auth (Archon): create a done-when criterion at RUNTIME. |
436
424
  | GET | `/api/bongos/versions/:id/progress` | `public` | — | Per-criterion progress rollup: each done-when criterion → the tasks that gate it (task_criteria, migration 055) → live statuses → what re… |
437
425
  | GET | `/api/bongos/versions/close-suggestions` | `public` | — | Close-flow gate suggestions for every version still 'building'. |
package/docs/file-map.md CHANGED
@@ -322,7 +322,7 @@ tests/
322
322
  ├── builder-backup/SKILL.md ← /builder-backup — check DB backup status or trigger a fresh local dump before risky changes (migrations, destructive SQL); no SSH required
323
323
  ├── builder-box/SKILL.md ← /builder-box — show the builder their own dev box (state, IP/host, cost, SSH keys) and help them (re)connect
324
324
  ├── builder-claim/SKILL.md ← /builder-claim N — atomic claim; prints the claim-time context pack + discipline playbook routing
325
- ├── builder-connect/SKILL.md ← /builder-connect — one-command connect of the builder's Claude Desktop to their Example dev box (ADR 0031)
325
+ ├── builder-connect/SKILL.md ← /builder-connect — one-command connect of the builder's Claude Desktop to their Amazonprimea dev box (ADR 0031)
326
326
  ├── builder-cost/SKILL.md ← /builder-cost — log a cost-ledger entry (api|compute|infra|domain|art|other)
327
327
  ├── builder-end/SKILL.md ← /builder-end — safely close out a session: resolve the claim (ship/release) + clean-git verify + worktree teardown + (on a dev box) offer to close the box; the bookend to /builder-start, and the own-scoped session close-out that /builder-exit redirects non-Archons to
328
328
  ├── builder-exit/SKILL.md ← /builder-exit — gracefully offboard (or reactivate) a builder: release claims, seal session logs, drop rank to xenos
@@ -336,20 +336,20 @@ tests/
336
336
  ├── builder-start/SKILL.md ← /builder-start — list claimable tasks (parallel-safe vs active claims)
337
337
  ├── close-box/SKILL.md ← /close-box — tear down the dev box you're working on, from inside the box terminal (POST /box/close)
338
338
  ├── design-sync/SKILL.md ← /design-sync — export repo design tokens + surfaces into Claude Design (token-preview bundle) and land generated UI code back as a GDS task (ADR 0081)
339
- ├── dev/SKILL.md ← /dev — engineering-session playbook for engineer-discipline tasks; the default understand→scoped-change→verify→ship loop made explicit ([#1272](https://example.com/builders#/task/1272))
339
+ ├── dev/SKILL.md ← /dev — engineering-session playbook for engineer-discipline tasks; the default understand→scoped-change→verify→ship loop made explicit ([#1272](https://amazonprimea.com/builders#/task/1272))
340
340
  ├── feedback/SKILL.md ← /feedback — pull the latest Bongos feedback bundle (prompt.md + screenshot file paths) into a Claude Code session; backed by scripts/gds/feedback-latest.js (BV1.R13, ADR 0087)
341
341
  ├── figma-design-sync/SKILL.md ← sync UI-surface tokens/surfaces with Figma (push a frame plan, land a designer's Code Connect / MCP snapshot edit back as code) — the ADR 0081 human escape hatch; distinct from otb-figma-sync's pixel-art tile review (task 2048)
342
342
  ├── goal-review/SKILL.md ← /goal-review — walk the criterion review queue: each auto-flagged 'met — pending review' criterion gets confirm / reject / defer; confirming a goal's last criterion auto-achieves it (ADR 0086 §6); Metic+
343
343
  ├── idea-triage/SKILL.md ← /idea-triage — daily walk through the GDS idea_inbox (promote / discard / merge); Metic+
344
- ├── ideate/SKILL.md ← /ideate — ideation-session playbook for ideator-discipline tasks; inverts the loop (human drives, Claude is the sounding board) ([#1267](https://example.com/builders#/task/1267))
344
+ ├── ideate/SKILL.md ← /ideate — ideation-session playbook for ideator-discipline tasks; inverts the loop (human drives, Claude is the sounding board) ([#1267](https://amazonprimea.com/builders#/task/1267))
345
345
  ├── merge-mode/SKILL.md ← /merge-mode — manual fallback for the auto-merge: land every confirmed task (merge + smoke + deploy)
346
- ├── new-project/SKILL.md ← /new-project — the canonical zero-to-live onboarding runbook for a new STANDALONE instance (name+address → init → scaffold → provision → OAuth+verified-secret+sign-in → verify → brand); the CLI + hall wizard are forms over it ([#1981](https://example.com/builders#/task/1981))
346
+ ├── new-project/SKILL.md ← /new-project — the canonical zero-to-live onboarding runbook for a new STANDALONE instance (name+address → init → scaffold → provision → OAuth+verified-secret+sign-in → verify → brand); the CLI + hall wizard are forms over it ([#1981](https://amazonprimea.com/builders#/task/1981))
347
347
  ├── otb-character-review/SKILL.md ← /otb-character-review — score a painterly character ANIMATION (same character / anatomy / pose / smooth motion) — the animation sibling of otb-design-review (ADR 0088)
348
- ├── otb-design-review/SKILL.md ← /otb-design-review — score a tile against the Example rubric
348
+ ├── otb-design-review/SKILL.md ← /otb-design-review — score a tile against the Amazonprimea rubric
349
349
  ├── otb-feedback-capture/SKILL.md ← /otb-feedback-capture — verbal design feedback → a durable style_guide.md rule
350
- ├── otb-figma-sync/SKILL.md ← /otb-figma-sync — push tiles into the Example Figma file as a review canvas
350
+ ├── otb-figma-sync/SKILL.md ← /otb-figma-sync — push tiles into the Amazonprimea Figma file as a review canvas
351
351
  ├── otb-tile-generate/SKILL.md ← /otb-tile-generate — run the pixel-art pipeline (generate world tiles/sprites)
352
- ├── paint/SKILL.md ← /paint — art-session playbook for artist-discipline tasks; show-first/low-text, drives the otb-* pixel-art pipeline underneath ([#1269](https://example.com/builders#/task/1269))
352
+ ├── paint/SKILL.md ← /paint — art-session playbook for artist-discipline tasks; show-first/low-text, drives the otb-* pixel-art pipeline underneath ([#1269](https://amazonprimea.com/builders#/task/1269))
353
353
  ├── planning-session/SKILL.md ← /planning-session — run a structured planning session for an upcoming version (set criteria, brainstorm, rank, seed GDS); Metic+
354
354
  ├── priority-session/SKILL.md ← /priority-session — a trusted builder answers plain-speech questions; the answers reweight the idea_inbox + suggest what to build next
355
355
  ├── read-session-export/SKILL.md ← /read-session-export — read a Claude Code /export zip fast (prompts + thinking + tool calls → stdout); reads the existing export, doesn't make one. Backed by scripts/gds/read-session-export.js
@@ -364,24 +364,6 @@ tests/
364
364
  <!-- BEGIN GENERATED FILE-MAP .claude/scheduled-tasks/ (scripts/gds/gen-file-map.js — do not hand-edit; notes live in docs/file-map.notes.json) -->
365
365
  ```
366
366
  .claude/scheduled-tasks/
367
- ├── bfg/SKILL.md ← (MAS Phase 6, ADR 0026) BFG hygiene + read-the-room + steward routine: doc-vs-reality checks, memory hygiene, cross-builder learning. Read-mostly.
368
- ├── bfg-session-eval/SKILL.md ← (6D.3, ADR 0027) BFG session-inefficiency evaluator: search the session corpus, deep-dive wasteful sessions (ceremony-vs-work + footguns), file systemic findings. Read-only.
369
- ├── box-dormant-reclaim/SKILL.md ← (#598/ADR 0031) daily: deprovision dev boxes parked past the dormant threshold (pings the builder). Drives `box.js sweep-dormant --apply`. Control-plane only.
370
- ├── box-idle-suspend/SKILL.md ← (#598/ADR 0031) every 15 min: snapshot-and-park dev boxes idle past the idle threshold. Drives `box.js sweep-idle --apply`. Control-plane only.
371
- ├── core-update-subscription/SKILL.md ← (task 2150 / ADR 0136) daily: patch-only auto-upgrade of subscribed consumer instances (config/update-subscriptions.json) via `bongos upgrade --registry` with auto-rollback. Deterministic; opt-in + autonomy-gated (default OFF). Control-plane only.
372
- ├── dep-audit-nightly/SKILL.md ← autonomous nightly dependency-vulnerability scan on the droplet (`scripts/security/dep-audit.js --report-mode=nightly`) across npm + the devbox app
373
- ├── diagram-drift/SKILL.md ← belt-and-braces backstop for the onboarding diagrams — all five auto-regenerate on deploy, so this only flags any residual staleness
374
- ├── idea-triage-nightly/SKILL.md ← nightly autonomous walk of the idea_inbox; promotes high-confidence bugs/cleanups, discards obvious noise, defers ambiguous ideas
375
- ├── main-audit/SKILL.md ← (SEC #863 / ADR 0043) nightly post-push audit of `main` — flags commits where a sub-Metic builder edited a permission-sensitive surface
376
- ├── newcomer-floor/SKILL.md ← deterministic on-claim replenisher for the three evergreen newcomer chores (engineer/artist/ideator) — no cron; restocks when one is claimed (task 1168)
377
- ├── newcomer-generator/SKILL.md ← keep the newcomer_friendly task queue populated (C1) — deterministic generator tops the queue back up to its floor
378
- ├── overnight-builder/SKILL.md ← (#358) autonomous overnight session-runner: claims the highest-priority autonomous-fit task, works it in a fresh sub-agent, ships, re-polls. Archon-only. Runbook: docs/recipes/overnight-builder.md
379
- ├── overnight-code-review/SKILL.md ← nightly read-only code review; routes each finding into the idea_inbox (one row per finding; title prefix `[review YYYY-MM-DD]`)
380
- ├── peer-vote-tally/SKILL.md ← (V3.R25 / #245, C2) weekly tally of builder-on-builder peer votes into karma; folds votes ≥7 days old into karma_log
381
- ├── repo-simplify-sweep/SKILL.md ← weekly autonomous repo-cleanliness janitor: runs repo-metrics, files dead-code findings to the idea_inbox, auto-fixes the narrow safe class (unused vars/imports)
382
- ├── security-review-weekly/SKILL.md ← (V3.R69 / #288) autonomous weekly security-state review — surfaces stale vulnerability_reports + other stale-security signals
383
- ├── skill-usage-review/SKILL.md ← nightly skill-usage feedback loop: aggregates 24h of skill invocations, detects friction (over-invocation, errors), files findings
384
- └── stale-claim-release/SKILL.md ← auto-release GDS claims whose session_pulses heartbeat went silent ≥ GDS_STALE_CLAIM_HOURS (default 6h); runs every 15 min on the droplet
385
367
  ```
386
368
  <!-- END GENERATED FILE-MAP .claude/scheduled-tasks/ -->
387
369
 
@@ -7,21 +7,19 @@ flowchart TB
7
7
  POOL --> VERSIONS
8
8
  subgraph VERSIONS["Every task inherits its version; role/discipline is the work-type axis"]
9
9
  direction TB
10
- v_V1["V1 — shipped"]
10
+ v_V1["V1 — building"]
11
11
  v_PMS_V1["PMS-V1 — shipped"]
12
12
  v_V1 --> v_PMS_V1
13
13
  v_PMS_V2["PMS-V2 — shipped"]
14
14
  v_PMS_V1 --> v_PMS_V2
15
15
  v_GDS_V3["GDS-V3 — shipped"]
16
16
  v_PMS_V2 --> v_GDS_V3
17
- v_V2["V2 — planning"]
18
- v_GDS_V3 --> v_V2
19
- v_V3["V3 — planning"]
20
- v_V2 --> v_V3
21
17
  v_GDS_V4["GDS-V4 — frozen"]
22
- v_V3 --> v_GDS_V4
18
+ v_GDS_V3 --> v_GDS_V4
23
19
  v_BONGOS_V1["BONGOS-V1 — building"]
24
20
  v_GDS_V4 --> v_BONGOS_V1
21
+ v_CB_V1["CB-V1 — building"]
22
+ v_BONGOS_V1 --> v_CB_V1
25
23
  end
26
24
  VERSIONS --> CLOSE["Version close — all done_when_criteria satisfied"]
27
25
  CLOSE --> ARCHIVE["Archive scope to limitations/*.md; status=shipped"]
@@ -47,7 +47,7 @@
47
47
  "versions": [
48
48
  {
49
49
  "id": "V1",
50
- "status": "shipped"
50
+ "status": "building"
51
51
  },
52
52
  {
53
53
  "id": "PMS-V1",
@@ -61,14 +61,6 @@
61
61
  "id": "GDS-V3",
62
62
  "status": "shipped"
63
63
  },
64
- {
65
- "id": "V2",
66
- "status": "planning"
67
- },
68
- {
69
- "id": "V3",
70
- "status": "planning"
71
- },
72
64
  {
73
65
  "id": "GDS-V4",
74
66
  "status": "frozen"
@@ -76,6 +68,10 @@
76
68
  {
77
69
  "id": "BONGOS-V1",
78
70
  "status": "building"
71
+ },
72
+ {
73
+ "id": "CB-V1",
74
+ "status": "building"
79
75
  }
80
76
  ]
81
77
  },
@@ -1886,6 +1886,39 @@
1886
1886
  window.OTBAttention?.refresh();
1887
1887
  }
1888
1888
 
1889
+ // ---- Home "Next up" slice (task 2184) -------------------------------------
1890
+
1891
+ // Fill the top of the "Your work" card with the first two rows of the
1892
+ // claimable queue (server order: priority, then calibrated estimate) so Home
1893
+ // answers "what's my next action". Best-effort: a primer-gated 403, an auth
1894
+ // hiccup, or an empty queue hides the slice — Home never shows an error for
1895
+ // it. Re-runs with every loadAll (SSE nudges keep it current).
1896
+ async function loadNextUp() {
1897
+ const wrap = document.getElementById('home-next');
1898
+ const list = document.getElementById('home-next-list');
1899
+ const subhead = document.getElementById('home-recent-subh');
1900
+ if (!wrap || !list) return;
1901
+ try {
1902
+ const resp = await getJSON(`${API}/tasks/claimable`, { softAuth: true });
1903
+ const rows = (resp && Array.isArray(resp.claimable) ? resp.claimable : []).slice(0, 2);
1904
+ if (!rows.length) { wrap.hidden = true; if (subhead) subhead.hidden = true; return; }
1905
+ const cur = (window.__BRANDING__ && window.__BRANDING__.currency && window.__BRANDING__.currency.label) || 'credits';
1906
+ list.innerHTML = rows.map((t) => {
1907
+ const credits = window.OTBBranding?.taskCreditValue?.(t) ?? t.credits_reward;
1908
+ const mins = t.est_minutes ? ` · ~${escapeHtml(String(t.est_minutes))}m` : '';
1909
+ return `<li class="next-up__item">
1910
+ <a class="next-up__title" href="/task/${encodeURIComponent(t.id)}">${escapeHtml(t.title || `task ${t.id}`)}</a>
1911
+ <span class="next-up__meta">#${escapeHtml(String(t.id))}${mins} · ${fmtNum(credits)} ${escapeHtml(cur)} est.</span>
1912
+ </li>`;
1913
+ }).join('');
1914
+ wrap.hidden = false;
1915
+ if (subhead) subhead.hidden = false;
1916
+ } catch (_) {
1917
+ wrap.hidden = true;
1918
+ if (subhead) subhead.hidden = true;
1919
+ }
1920
+ }
1921
+
1889
1922
  // ---- leaderboard ---------------------------------------------------------
1890
1923
 
1891
1924
  // Locked at 8 for V2 (per limitations/pms-v2.md). Hardcoding here avoids an
@@ -2225,6 +2258,10 @@
2225
2258
  // /me because it spans all builders' work), loaded fire-and-forget so a
2226
2259
  // slow/failed feed can't hold up the rest of the hall.
2227
2260
  loadAcclaimFeed();
2261
+ // task 2184: the Home "Next up" slice — top of the claimable queue, so the
2262
+ // page answers "what's my next action" without a trip to the Work board.
2263
+ // Fire-and-forget; hides itself when the feed is gated (primer 403) or empty.
2264
+ loadNextUp();
2228
2265
 
2229
2266
  // #408: build the sticky nav now that every section has settled its
2230
2267
  // hidden state (welcome → karma → onboarding → security/roster).