@bongos/core 1.19.86 → 1.19.88

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.
package/.bongos-core.json CHANGED
@@ -2,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/gds/package-core.js",
5
- "core_version": "1.19.86",
6
- "core_contract": "1.19.86",
7
- "source_commit": "d492268af911f3775f9577d12281d2c38399727f",
5
+ "core_version": "1.19.88",
6
+ "core_contract": "1.19.88",
7
+ "source_commit": "c8c0a186e2cb9d4b138aff7e5b7b8e982140299e",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-08-13T00:41:13.561Z",
9
+ "built_at": "2026-08-13T01:05:59.928Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 295,
12
+ "docs_redacted": 296,
13
13
  "agent_docs_stubbed": 21,
14
14
  "functional_verbatim": 1234,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 1550,
20
- "tree_sha256": "6f0e9235712ce2021a2856ab9a969734a249d91bd64b367f1341555824ea03b8",
19
+ "file_count": 1551,
20
+ "tree_sha256": "97f1e5d8f01e72085d52764e6954b927d3cfe325ec7d0a44d82cab2401ac61af",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/blocker-review/SKILL.md",
@@ -1354,6 +1354,11 @@
1354
1354
  "mode": "0000644",
1355
1355
  "sha256": "a86af6a923ed70bb8ea0846266f232f31a5fc9709d286362bcd37104d683342b"
1356
1356
  },
1357
+ {
1358
+ "path": "docs/design/gate-navigation-direction.md",
1359
+ "mode": "0000644",
1360
+ "sha256": "b56c2394f695b64c567c581203901036222927f6c8e0d49fffceb2365f01e96b"
1361
+ },
1357
1362
  {
1358
1363
  "path": "docs/design/mocks/component-sheet.html",
1359
1364
  "mode": "0000644",
@@ -2592,7 +2597,7 @@
2592
2597
  {
2593
2598
  "path": "modules/dev-box/box-access.js",
2594
2599
  "mode": "0000644",
2595
- "sha256": "8d2dc69a139a5a658866a18527efeb5d9ae989e05883fa6cbd0ea63db0ba9476"
2600
+ "sha256": "9357b423836c4e8d2cd3c9144d294c3cd3b498ac30755a9e6f62b5bbaa2add5e"
2596
2601
  },
2597
2602
  {
2598
2603
  "path": "modules/dev-box/box-credential.js",
@@ -4082,12 +4087,12 @@
4082
4087
  {
4083
4088
  "path": "package-lock.json",
4084
4089
  "mode": "0000644",
4085
- "sha256": "2bd4658aa54dea1a2ee6fdd04989f69633896a45aa8461017ad6b48abeb95579"
4090
+ "sha256": "ee871b7fe7f5f5b855c766487d04af28b66213cb018fffa9ecf87146b1127f9a"
4086
4091
  },
4087
4092
  {
4088
4093
  "path": "package.json",
4089
4094
  "mode": "0000644",
4090
- "sha256": "719540bff50475655aee54cfa4ca4f261e04ec1039b6e4b7d0428b6843420fc5"
4095
+ "sha256": "3b60b19b3d6f3ce6601f14cb118d79e6438673feb228a6221c18f94da6032a68"
4091
4096
  },
4092
4097
  {
4093
4098
  "path": "public-docs/index.html",
@@ -5722,7 +5727,7 @@
5722
5727
  {
5723
5728
  "path": "src/module-api.js",
5724
5729
  "mode": "0000644",
5725
- "sha256": "0a7e91c72a110593259da6dca1a15fbdc2b474a5016d6ddfbb129311909ac292"
5730
+ "sha256": "592a0682457594b8192024b85aea705d3ab3e31f318bf6558c9af7a0399aced0"
5726
5731
  },
5727
5732
  {
5728
5733
  "path": "src/module-loader/loader.js",
@@ -6002,7 +6007,7 @@
6002
6007
  {
6003
6008
  "path": "tests/box_access.mjs",
6004
6009
  "mode": "0000644",
6005
- "sha256": "06e8afe871803c92b20c28b918e39804a1616ee3b5773517f5ac804118d2de1d"
6010
+ "sha256": "694153e377a78d4325aa4ff9b947f691d71362f843da25815b9740821903802c"
6006
6011
  },
6007
6012
  {
6008
6013
  "path": "tests/box_auth_check.mjs",
@@ -0,0 +1,271 @@
1
+ # Gate Navigation — Direction
2
+
3
+ > **Task 1002741** (goal 1000059 "Projects surface revamp") · direction decided with the owner 2026-08-13.
4
+ > Owner finding, 2026-08-12, minutes after the task 1002696 redesign went live: *"cloudbongos.com/gate
5
+ > is the landing page and there's no way to get there from the landing page."*
6
+ > Evidence base: the acceptance re-walk (task 1002697) finding **N9**, plus a live trace of every
7
+ > public path on the apex.
8
+
9
+ Scope: how a human arriving at **cloudbongos.com** reaches the owner surfaces — `/projects` and
10
+ `/create`. Covers the gate's entry ritual, a persistent navigation door, sign-in-aware states, and
11
+ whether an owner's own projects get an identity in the sky. Does **not** cover how the sky moves or
12
+ feels — that is goal 1000031 (§7).
13
+
14
+ ---
15
+
16
+ ## 0. Starting point — what exists today
17
+
18
+ Every claim here was verified live on core 1.19.85 (the version prod serves) or read from
19
+ `origin/main`.
20
+
21
+ ### The public navigation map
22
+
23
+ | Path | Live status | Links out to |
24
+ |---|---|---|
25
+ | `/` — what a person types | **302 → `/gate/` → 401** | — |
26
+ | `/gate/`, `/world/*` | **401** Caddy `basic_auth` (realm "restricted") | — |
27
+ | `/index.html` | 200, public | only `builders.cloudbongos.com` |
28
+ | `/create` | 200, public | `/projects` |
29
+ | `/projects` | 200, public | `/create` |
30
+
31
+ **Nothing public links into `/create` or `/projects`.** They link only to each other. An owner
32
+ reaches their projects today by typing a URL from memory, via the `sessionStorage`-bound done panel,
33
+ or through a corner pill inside one view of a password-walled gate.
34
+
35
+ There is also a public landing page at `/index.html` that no one can reach by typing the domain —
36
+ the apex redirects straight past it into the walled gate.
37
+
38
+ ### The wall
39
+
40
+ `/etc/caddy/Caddyfile` on the live host matches `@gate path / /gate /gate/* /world/*` and applies
41
+ `basic_auth` (user `cloudbongos`), with `X-Robots-Tag: noindex, nofollow` on the whole host.
42
+ `/create` and `/projects` fall through to the unprotected handler. Caddy runs its `redir` **before**
43
+ `basic_auth`, which is why `/` answers 302 unauthenticated and the visitor meets the 401 at `/gate/`
44
+ (the ordering ADR 0152 §:44-46 documents). The app carries its own apex redirect as well —
45
+ `src/platform-server.js:115-121`, conditional only on `isApexHost(req)` and the gate file existing,
46
+ with no session check and no query bypass.
47
+
48
+ **The live Caddyfile is not mirrored in this repo** (`infra/` holds only `box-*.sh`); ADR 0152 gives
49
+ the intended shape as prose and marks the lock *"optional pre-launch"*, and several references to
50
+ `infra/Caddyfile` elsewhere in the tree are dead. Treat the host config as the source of truth.
51
+
52
+ **Owner's call (2026-08-13): the wall is temporary and comes off at launch** — so this direction
53
+ designs the gate as the real front door for strangers and owners alike, not as a private preview.
54
+
55
+ ### The gate itself
56
+
57
+ - **Five views**, switched by a whole-value `body` class assignment (no state-machine object), so
58
+ they are mutually exclusive by construction: `view-entry`, `view-space`, **`view-table`**,
59
+ `view-download`, `view-detail` (`public-landing/gate/space.js`). The page loads in `view-entry`
60
+ (`index.html:141`, re-asserted `space.js:1827`). `view-table` is a full peer **browse view** — a
61
+ sortable project directory with its own search and create button (`space.js:1248`) — and any
62
+ navigation decision has to answer for it, not just for the sky.
63
+ - **The entry ritual runs on every visit.** `ENTRY_TARGET = 'bongos'` (`:1339`); keystrokes are
64
+ matched one at a time (`entryKey()` `:1347-1356`), a wrong key shakes the bar, Enter fires
65
+ `enterSite()` (`:1359`). ESC in `view-space` returns to it (`:1736`, `backToEntry` `:1394`).
66
+ **There is no cookie or storage anywhere in the gate** — a returning signed-in owner re-types
67
+ `bongos` every single time. A skip flag exists (`?entered=1` → `openSpaceDirect()` `:1402-1417`),
68
+ but **it cannot survive an apex arrival: the `/` redirect drops the query string** (`:155-159`).
69
+ So for anyone who types `cloudbongos.com`, the ritual is effectively unskippable.
70
+ - **The gate already knows who you are, and already acts on it.** `space.js:1124-1139` fetches
71
+ `/api/bongos/me` same-origin and resolves `signedIn`/`ME` (`:1047-1049`, task 2094). That flag
72
+ already drives four behaviours through `refreshCreateAffordances()` (`:1099-1104`): the identity
73
+ chip, the ghost orb's label + `.locked` state, the table's create button, and the create
74
+ interception that opens a sign-in prompt (`openCreate()` `:1160`).
75
+ - **The orbs are real projects** — one seeded self-orb (Cloud Bongos, `:30-36`) plus
76
+ `loadProjects()` fetching `/api/bongos/projects/featured` (`:1812`, task 1002260). But the feed is
77
+ a **curated public catalog**: it returned 3 projects (Demo, Emersonian Circles, Example),
78
+ and the server projection selects exactly four columns — `origin, name, tagline, art_url`
79
+ (`modules/platform-identity/platform-identity.js:242-250`). The route is `rank: public` and takes
80
+ `_req` — **it never reads the request, so it cannot vary by viewer**. No owner, no slug, no
81
+ membership. "This orb is yours" does not exist in any form.
82
+ - **The door that shipped** is `.space-projects` (`index.html:203-205`), static markup hidden by
83
+ `body:not(.view-space){ display:none }` (`space.css:285-296`) — a pill in the corner of a drifting
84
+ field, in one view, rendered regardless of sign-in state. `space.js` never references it: **zero
85
+ matches**. That is finding N9.
86
+
87
+ **The precise shape of the bug.** The gate is sign-in aware *everywhere except this door*. Every
88
+ other affordance was wired into `refreshCreateAffordances()`; the `/projects` link landed as static
89
+ markup and was never added. Meanwhile the sign-in chip renders across four views
90
+ (`space.css:562-563`) while the door renders in one — so on the Table view a visitor sees their own
91
+ avatar and **no way to reach their projects**. This is a gap in a working mechanism, not a missing
92
+ capability. Note also that the task 1002696 direction already specified *"the gate gets a **signed-in**
93
+ 'Your projects' door"* (`projects-surfaces-redesign-direction.md:108`) — the implementation diverged
94
+ from its own written direction, which is what produced this task.
95
+
96
+ ### The asymmetry that explains the bug
97
+
98
+ Goal 1000031 already shipped a first-class **spatial** affordance for *creating*: a ghost
99
+ "create a project" orb in idle empty space, a live preview orb while creating, and a `?name=`
100
+ handover into `/create`. The *managing* path got a text pill in one view. Create earned a place in
101
+ the world; manage did not.
102
+
103
+ ---
104
+
105
+ ## 1. Decisions (owner, 2026-08-13)
106
+
107
+ 1. **The entry ritual is removed.** Every visitor lands directly in the sky. The
108
+ "type bongos in any AI" metaphor is not lost — the self-typing logo already cycles
109
+ `claude / gemini / chatgpt …` and retypes **bongos** (`space.js:1477-1478`), which is where the
110
+ idea belongs. The ritual stops being a toll gate in front of the projects.
111
+ 2. **A persistent header door, carried by every view.** Not a corner pill and not one view — a real
112
+ navigation element present in every view the gate can be in. With `view-entry` retired (decision 1)
113
+ that means `view-space`, **`view-table`**, `view-download`, and `view-detail` — matching the reach
114
+ the sign-in chip already has, so a visitor never sees their own avatar without a way home.
115
+ 3. **A signed-in owner's own projects get a distinct identity in the sky** — worth building the
116
+ owner-scoped data path for. The sky stops being purely someone else's showcase.
117
+ 4. **The gate's password wall is temporary** (§0) — design for a public front door.
118
+
119
+ ---
120
+
121
+ ## 2. Principles
122
+
123
+ 1. **The way home is always visible.** From any view, at any scroll position, a person can see how to
124
+ reach their own projects. Wayfinding is not a reward for reaching a particular view.
125
+ 2. **The door states what it does for *this* visitor.** Signed-out and signed-in are different
126
+ sentences, never the same generic link.
127
+ 3. **Nothing stands between a visitor and the projects.** No ritual, no toll, no required keystroke.
128
+ Theatre may accompany the sky; it may not gate it.
129
+ 4. **Create and manage are peers.** The sky already offers a way to make a project; it owes an equally
130
+ real way to return to one.
131
+ 5. **The sky tells the truth about ownership.** An orb marked as yours must actually be yours,
132
+ resolved from the server — never inferred client-side.
133
+
134
+ ---
135
+
136
+ ## 3. Surface · the entry ritual (removal)
137
+
138
+ - The page loads directly into `view-space`. `view-entry` and its typed terminal are **retired**, not
139
+ merely skipped — the `?entered=1` branch collapses into the default path, and with it go the
140
+ door-visitor special case (`:1079`), the `<head>` anti-flash script (`index.html:15-25`), and the
141
+ two flows that set the flag on the user's behalf (sign-out `:1086`, sign-in return `:1061`), which
142
+ become redundant once the sky is the default.
143
+ - `<body class="view-entry">` in `index.html:141` must change too — the boot class is asserted in
144
+ **two** places (markup and `space.js:1827`), and leaving the markup behind would flash the dead view.
145
+ - **ESC no longer returns to an entry gate.** In `view-space` it should do nothing (or clear an open
146
+ search); `backToEntry()` is removed. A visitor must not be able to fall back into a view that no
147
+ longer exists.
148
+ - The self-typing logo **stays** — it is now the sole carrier of the "type bongos in any AI"
149
+ metaphor, and its job gets more important, not less.
150
+ - **Verify on removal:** `fitToView()` was previously mis-measuring because it ran while
151
+ `body.view-entry` was active and the sky measured 0×0 (`space.js:1570`). Removing the entry view
152
+ changes that timing — the fix must be re-verified, not assumed to survive.
153
+
154
+ ## 4. Surface · the persistent door
155
+
156
+ **Which surface it points at.** The apex **`/projects`** (`public-landing/projects.html`, the owner's
157
+ provisioning instances) — *not* the hall's `my-projects` (`modules/hall-ui/`, federation memberships
158
+ via `GET /my-projects`). Two different pages answer to "your projects"; the task 1002696 direction
159
+ put the hall one out of scope and fixed the apex surface on the apex host. This door inherits that
160
+ boundary.
161
+
162
+ **Form.** A header element belonging to the page shell rather than to the orb field, so it does not
163
+ drift, scale, or pan with the sky, and does not depend on `view-space`. It replaces
164
+ `.space-projects`; the `body:not(.view-space)` hide rule is deleted rather than extended.
165
+
166
+ **States** (resolved from the existing `/api/bongos/me` call, never guessed):
167
+
168
+ | Visitor | The door reads | Goes to |
169
+ |---|---|---|
170
+ | Signed out | **Sign in** + a secondary **Start a project** | `auth/web/start?return=…` · `/create` |
171
+ | Signed in, has projects | **Your projects** (the primary door) | `/projects` |
172
+ | Signed in, no projects yet | **Start a project** | `/create` |
173
+
174
+ - **Wire it into `refreshCreateAffordances()`** (`space.js:1099-1104`) rather than inventing a second
175
+ mechanism. That function already relabels the ghost orb and the table's create button off the same
176
+ `signedIn` flag; the door is the one affordance that was never added to it. This is the smallest
177
+ correct change, not a rebuild.
178
+ - While `/me` is still in flight the door renders in its signed-out form and settles when the answer
179
+ arrives — it never renders a "Your projects" link it has not earned. (Principle 2, and the same
180
+ truth discipline the projects surfaces adopted in the task 1002696 direction §3.)
181
+ - The door is present in all four remaining views, including **`view-table`**, where today a visitor
182
+ sees their signed-in avatar and no route to their projects. In `view-download` and `view-detail` it
183
+ keeps the same position and wording — a person deep in a project's detail page can still get home.
184
+ - **Signed-out click-through is currently a doubled ask:** `/projects` renders its own sign-in gate
185
+ (`projects.html:71-72`, identity-only per ADR 0143) even though the gate already knew the visitor
186
+ was signed out. With the door stating sign-in up front, that second prompt becomes the expected
187
+ continuation rather than a surprise — but the door must send a signed-out visitor to
188
+ `auth/web/start?return=/projects` directly, not to `/projects` to be asked again.
189
+
190
+ ## 5. Surface · the owner's own orbs
191
+
192
+ **The data path is the work.** `/api/bongos/projects/featured` is a public catalog and cannot answer
193
+ "is this mine" — it carries no owner and no slug. So this needs an owner-scoped source: either a
194
+ signed-in variant of the feed, or the gate merging `GET /provisioning/instances` (which the owner
195
+ already reads on `/projects`, and which carries `slug`, `domain`, `status`, and the
196
+ `last_verified_at`/`last_verified_up` overlay).
197
+
198
+ **Design:**
199
+
200
+ - A signed-in owner's projects appear in the sky as orbs **visually marked as theirs** — a distinct
201
+ treatment, not a duplicate of a catalog orb. If a project is both featured and owned, it renders
202
+ once, marked as owned.
203
+ - Clicking an owned orb goes to **manage** (`/projects`, anchored on that project), not to the
204
+ project's public site — that is the difference between an owned orb and a catalog orb, and it is the
205
+ "click-to-manage path" the task asked for.
206
+ - An owned orb should carry the same **verification truth** the manage view shows (live · checked Xm
207
+ ago / live? / unreachable). An orb that looks alive for a project that stopped answering is exactly
208
+ the failure the task 1002696 direction existed to kill; the overlay already exists, so the orb must
209
+ use it rather than invent a second story.
210
+ - Signed-out visitors see the catalog exactly as today.
211
+
212
+ **Delivery:** this is the largest piece and is **spun out as its own task** (§6) — the header door
213
+ (§4) and the ritual removal (§3) must not wait on it.
214
+
215
+ ## 6. Delivery split
216
+
217
+ | Piece | Where |
218
+ |---|---|
219
+ | Entry-ritual removal (§3) + persistent door with sign-in states (§4) | **task 1002743** — the implementation carrier |
220
+ | Owner-scoped feed + owned-orb identity + click-to-manage + verification overlay on orbs (§5) | **task 1002744** — spun out; gated on nothing, but sequenced after 1002743 |
221
+ | Removing the Caddy `basic_auth` at launch | **infra, not this direction** — an owner/operator act, tracked with the launch, not by a surface task |
222
+ | `/index.html` being publicly served but unreachable from `/` | **idea 1000713** — a launch-shape question (retire it, or make it the public front with the sky behind), deliberately not decided here |
223
+ | `gate/README.md` + `space.css` claiming space-bar opens search when the shipped trigger is SHIFT | **idea 1000714** — doc drift left by task 1001901, unrelated to navigation |
224
+
225
+ Nothing in §§3–5 is promised without a task id above. If a later reader finds a commitment in this
226
+ doc with no carrier, that is a bug in the doc.
227
+
228
+ ## 7. Boundary with goal 1000031
229
+
230
+ Goal 1000031 ("landing page — interactive polish") is nearly all shipped: panning, scroll/pinch zoom,
231
+ SHIFT search + spotlight, the self-typing logo, hover-card lifecycle, the ghost create orb, the
232
+ minimap, the space-whale.
233
+
234
+ **The rule:** if it changes how the sky *moves, looks, or feels*, it belongs to **goal 1000031**. If
235
+ it changes where a person can *go*, it belongs to **this direction**.
236
+
237
+ - The **ghost "create a project" orb** stays 1000031's (it is an existing shipped behaviour); this
238
+ direction only observes that it is the create-side twin of the door we are adding.
239
+ - **Owned-orb identity (§5)** is this direction's, because it is about reaching your own project —
240
+ even though it renders in 1000031's sky. Its *visual polish* once it exists is 1000031's again.
241
+ - The **entry ritual's removal** is this direction's: it is a barrier to reaching the projects, not a
242
+ polish item.
243
+
244
+ ## 8. What this direction does not decide
245
+
246
+ - **The gate catalog's contents and curation** — which projects are featured, and how a project earns
247
+ a place in the sky. That is goal 1000031's surface and a separate product question.
248
+ - **The launch-shape question** of `/index.html` vs the sky as the public front door (idea 1000713).
249
+ - **The wall's removal date** — an owner/operator decision tied to launch.
250
+
251
+ ## 9. Sign-off dispositions (owner, 2026-08-13)
252
+
253
+ Four calls were made in session; none are left open.
254
+
255
+ 1. **The gate's password wall is temporary** and comes off at launch — so this direction designs a
256
+ public front door rather than a private preview. (Had the answer been "the wall stays", the right
257
+ move would have been the opposite: invest in `/create` and `/projects` as the real front doors and
258
+ leave the gate alone — building a hallway behind a locked door is the failure mode this question
259
+ was asked to avoid.)
260
+ 2. **The entry ritual is removed outright** — land on the sky. The owner declined the softer options
261
+ (skip-for-returning-visitors, auto-complete); the metaphor lives on in the self-typing logo.
262
+ 3. **The door is a persistent header carried by every view**, not a signed-in-only element and not a
263
+ corner pill.
264
+ 4. **Owner-orbs are worth the data path** — the owner explicitly chose to build the owner-scoped feed
265
+ rather than defer it, accepting that it is the larger half of the work (task 1002744).
266
+
267
+ **One correction landed during the session and is reflected above:** the premise that the gate is
268
+ sign-in blind was wrong. It already resolves `/me` and already gates the create path on it — so the
269
+ door is a one-line omission from a working mechanism, and the build in task 1002743 should be
270
+ correspondingly small. The premise that the gate has four views was also wrong; there are five, and
271
+ `view-table` is the view where the gap is most visible (avatar present, door absent).
@@ -151,6 +151,13 @@ const BASE_SPARSE_PATHS = [
151
151
  // so a box holding the module source but not tests/ cannot verify a change.
152
152
  // A cone-mode directory; it carries no product runtime, only test code.
153
153
  'tests',
154
+ // clients/ — the generated bongos-client (ADR 0118) that cli-lib.js hard-imports
155
+ // since task 1996 made it the CLI's one HTTP client. Without it EVERY /builder-*
156
+ // command on the box dies at import, and the builder cannot self-heal: the
157
+ // workspace is a token-less blob:none clone (sparse-checkout add can't fetch)
158
+ // and box-source-fetch re-applies this server-computed list every tick
159
+ // (task 1002745). Generated ESM only, no product runtime.
160
+ 'clients',
154
161
  ];
155
162
 
156
163
  // sparsePathsForScopeKeys — PURE. Given the module KEYS a builder's active claims
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.86",
3
+ "version": "1.19.88",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.86",
9
+ "version": "1.19.88",
10
10
  "license": "AGPL-3.0-or-later",
11
11
  "dependencies": {
12
12
  "express": "^4.21.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.86",
3
+ "version": "1.19.88",
4
4
  "description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "main": "src/platform-server.js",
package/src/module-api.js CHANGED
@@ -599,8 +599,12 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
599
599
  // landed since 1.19.84 with no explicit bump. run 31651469729. (task 1002620)
600
600
  // 1.19.86 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
601
601
  // landed since 1.19.85 with no explicit bump. run 31655210981. (task 1002620)
602
+ // 1.19.87 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
603
+ // landed since 1.19.86 with no explicit bump. run 31656188572. (task 1002620)
604
+ // 1.19.88 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
605
+ // landed since 1.19.87 with no explicit bump. run 31656577595. (task 1002620)
602
606
  // ---------------------------------------------------------------------------
603
- const CORE_VERSION = '1.19.86'; // CI auto-patch carrier (ADR 0161); see changelog above
607
+ const CORE_VERSION = '1.19.88'; // CI auto-patch carrier (ADR 0161); see changelog above
604
608
 
605
609
  // A namespaced logger so a module's log lines are attributable + consistent.
606
610
  // Usage: const log = api.logger('dev-box'); log.info('mounted');
@@ -194,7 +194,9 @@ const BASE = access.BASE_SPARSE_PATHS;
194
194
  console.log('\nBASE_SPARSE_PATHS — the non-product base a task-scoped box layers on:');
195
195
 
196
196
  t('BASE carries the methodology + tooling, NOT the product/game', () => {
197
- for (const p of ['.devcontainer', '.claude', 'scripts', 'src/bongos', 'docs', 'infra', 'tests']) {
197
+ // clients/ is load-bearing: cli-lib.js hard-imports clients/bongos-client, so a
198
+ // cone without it has a fully dead builder CLI on the box (task 1002745).
199
+ for (const p of ['.devcontainer', '.claude', 'scripts', 'src/bongos', 'docs', 'infra', 'tests', 'clients']) {
198
200
  assert.ok(BASE.includes(p), `BASE must include ${p}`);
199
201
  }
200
202
  for (const p of ['src/world', 'src/rooms', 'public', 'art', 'modules/status-ui']) {