@bongos/core 1.19.88 → 1.19.90

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.88",
6
- "core_contract": "1.19.88",
7
- "source_commit": "c8c0a186e2cb9d4b138aff7e5b7b8e982140299e",
5
+ "core_version": "1.19.90",
6
+ "core_contract": "1.19.90",
7
+ "source_commit": "45d0b3918cf244fda1eb923ed5d62224bc5885cb",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-08-13T01:05:59.928Z",
9
+ "built_at": "2026-08-13T15:51:02.618Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 296,
12
+ "docs_redacted": 298,
13
13
  "agent_docs_stubbed": 21,
14
- "functional_verbatim": 1234,
14
+ "functional_verbatim": 1239,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 1551,
20
- "tree_sha256": "97f1e5d8f01e72085d52764e6954b927d3cfe325ec7d0a44d82cab2401ac61af",
19
+ "file_count": 1558,
20
+ "tree_sha256": "7dc9f0a0062008bfdc80372316b3d7ff5ce73181237509094f584b99efe5573d",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/blocker-review/SKILL.md",
@@ -382,7 +382,7 @@
382
382
  {
383
383
  "path": "config/branding.neutral.json",
384
384
  "mode": "0000644",
385
- "sha256": "d7e12cadd0e4cbcbe3b03e5ff0aedcd55f9ec592c754d258e6ac85e9b98c0009"
385
+ "sha256": "48460f6fba8d39293c091cc1cd908896bd670c5eae5bab8665f755211e0f5790"
386
386
  },
387
387
  {
388
388
  "path": "config/design-tokens.neutral.json",
@@ -1354,16 +1354,41 @@
1354
1354
  "mode": "0000644",
1355
1355
  "sha256": "a86af6a923ed70bb8ea0846266f232f31a5fc9709d286362bcd37104d683342b"
1356
1356
  },
1357
+ {
1358
+ "path": "docs/design/front-door-and-hub-direction.md",
1359
+ "mode": "0000644",
1360
+ "sha256": "e3026e23472629a7d4f1bebe883f9bc84263a849e22eab627f7a5b5ace9dd110"
1361
+ },
1357
1362
  {
1358
1363
  "path": "docs/design/gate-navigation-direction.md",
1359
1364
  "mode": "0000644",
1360
- "sha256": "b56c2394f695b64c567c581203901036222927f6c8e0d49fffceb2365f01e96b"
1365
+ "sha256": "90bed9a9f3859f7cfc6dd8a0e23e70adeda5854be0b10f8208d60a96c83403b3"
1366
+ },
1367
+ {
1368
+ "path": "docs/design/landing-page-direction.md",
1369
+ "mode": "0000644",
1370
+ "sha256": "445344b91eee651e2831fe74ce30d317a4fd4f6310475cb8fd924edd883f9f95"
1371
+ },
1372
+ {
1373
+ "path": "docs/design/mocks/_schemes.css",
1374
+ "mode": "0000644",
1375
+ "sha256": "b765820040413ebe4f123f5d67f6daaf5955ccbc76d16f34eb8fc8bd65d7bb21"
1361
1376
  },
1362
1377
  {
1363
1378
  "path": "docs/design/mocks/component-sheet.html",
1364
1379
  "mode": "0000644",
1365
1380
  "sha256": "c77dbf2152c6109b6ce925e2badf6dfaa74f74c2d0cb7eb76fa1101eec7b3310"
1366
1381
  },
1382
+ {
1383
+ "path": "docs/design/mocks/landing-page-mock.html",
1384
+ "mode": "0000644",
1385
+ "sha256": "89106dce576bc0777aa63ec6ac0dde61a68317bef53de0fb6edf47870f0cdd04"
1386
+ },
1387
+ {
1388
+ "path": "docs/design/mocks/landing-palettes.html",
1389
+ "mode": "0000644",
1390
+ "sha256": "c277f432a0d3e23e481bae01355f5f11648ee9a6593f665a809d8f406ebbe033"
1391
+ },
1367
1392
  {
1368
1393
  "path": "docs/design/mocks/projects-page-mock.html",
1369
1394
  "mode": "0000644",
@@ -2417,22 +2442,22 @@
2417
2442
  {
2418
2443
  "path": "modules/dev-box/app/assets/tray/win-alert.png",
2419
2444
  "mode": "0000644",
2420
- "sha256": "a3f2818d0d0e6ddb7a661b6fe7aba034159cb45237fc16666a29bd2040f5c71d"
2445
+ "sha256": "ce381ff0ae4d29c684d0e864c4f05806548b24da4c17b900a4b87fb7d7b977a7"
2421
2446
  },
2422
2447
  {
2423
2448
  "path": "modules/dev-box/app/assets/tray/win-busy.png",
2424
2449
  "mode": "0000644",
2425
- "sha256": "2cd13825a32e2db24d333e5693976ad257b5cfb29afec6deeba618727e44e29e"
2450
+ "sha256": "f330901daeb01ba88b60622dfb04030bce131807c0b8ec488d628c1710b16c9c"
2426
2451
  },
2427
2452
  {
2428
2453
  "path": "modules/dev-box/app/assets/tray/win-off.png",
2429
2454
  "mode": "0000644",
2430
- "sha256": "9280082a9a01ad3aeb217f105e3aa3bcecaa8ee8eb2172e86605c63364a5211f"
2455
+ "sha256": "f3ad8ff1f1d31228699133d9b6fc64f5f09cad4cd3e7a69fa68643a554a50d30"
2431
2456
  },
2432
2457
  {
2433
2458
  "path": "modules/dev-box/app/assets/tray/win-on.png",
2434
2459
  "mode": "0000644",
2435
- "sha256": "248c66afd5eaed026443828b14cbbead2c434fa66051779521e7ef5650eeb0f0"
2460
+ "sha256": "6611cb8cbe81102028705085ec5f093d056f7b4f82220cefe25acdab68156367"
2436
2461
  },
2437
2462
  {
2438
2463
  "path": "modules/dev-box/app/build-resources/dmg-background.png",
@@ -2447,7 +2472,7 @@
2447
2472
  {
2448
2473
  "path": "modules/dev-box/app/build-resources/icon.png",
2449
2474
  "mode": "0000644",
2450
- "sha256": "738d433ed87fb81b3397183adcccedab85599e703fb91de3519bd95bd9282780"
2475
+ "sha256": "03edf4c2ad4d5059f28e641e37b5b932087b508aeca23f64251b00ec1eea29f0"
2451
2476
  },
2452
2477
  {
2453
2478
  "path": "modules/dev-box/app/electron-builder.tmpl.yml",
@@ -2487,7 +2512,7 @@
2487
2512
  {
2488
2513
  "path": "modules/dev-box/app/renderer/theme.generated.css",
2489
2514
  "mode": "0000644",
2490
- "sha256": "51d6f3172c84f223aad44cf3deecfa215c615708ce99152123564af0018b3599"
2515
+ "sha256": "579376e7f7bccc9632a739942d20f3dfe6fb3a75e7118bf0f2503ea315faa574"
2491
2516
  },
2492
2517
  {
2493
2518
  "path": "modules/dev-box/app/scripts/apply-dmg-backdrop.sh",
@@ -2502,17 +2527,17 @@
2502
2527
  {
2503
2528
  "path": "modules/dev-box/app/scripts/gen-brand.js",
2504
2529
  "mode": "0000644",
2505
- "sha256": "e8b3881dbb0682a59da9d87d3e83947e3666367d53b990185a17444a69aafcc0"
2530
+ "sha256": "37d7b4d6c3ea5e0cfa7e280353b3adb9f68b7c5e7bababfe1c1ba809706dd145"
2506
2531
  },
2507
2532
  {
2508
2533
  "path": "modules/dev-box/app/scripts/gen-dmg-backdrop.py",
2509
2534
  "mode": "0000644",
2510
- "sha256": "f60e668536f6ba03e5df4e81fcb5ce0a3edbb90dcafeb787c33fd794793b518a"
2535
+ "sha256": "8493db368ac3364f559f166eea3421a4e85c11503d056e8eb3e41e70ac1198cc"
2511
2536
  },
2512
2537
  {
2513
2538
  "path": "modules/dev-box/app/scripts/gen-icons.js",
2514
2539
  "mode": "0000644",
2515
- "sha256": "97859dc44a5786f7cc691368d110587934e1c4e55fdc5bbdc919493d6700ab00"
2540
+ "sha256": "b6dd666505d4c0c3d28b69082945792c88a78cc40ac79191921dec196a904d28"
2516
2541
  },
2517
2542
  {
2518
2543
  "path": "modules/dev-box/app/scripts/vendor-client.js",
@@ -4087,12 +4112,12 @@
4087
4112
  {
4088
4113
  "path": "package-lock.json",
4089
4114
  "mode": "0000644",
4090
- "sha256": "ee871b7fe7f5f5b855c766487d04af28b66213cb018fffa9ecf87146b1127f9a"
4115
+ "sha256": "e2360c5ef62eeb078207fc6b3e1230d4f7099a58f2c78c6b204d5de6df1a4ba2"
4091
4116
  },
4092
4117
  {
4093
4118
  "path": "package.json",
4094
4119
  "mode": "0000644",
4095
- "sha256": "3b60b19b3d6f3ce6601f14cb118d79e6438673feb228a6221c18f94da6032a68"
4120
+ "sha256": "34e9ad3018b2d905c6cf60f10bb9ddc6db4b9547facf4df8ee6284f646c93201"
4096
4121
  },
4097
4122
  {
4098
4123
  "path": "public-docs/index.html",
@@ -4332,7 +4357,7 @@
4332
4357
  {
4333
4358
  "path": "public-landing/assets/cosmos.css",
4334
4359
  "mode": "0000644",
4335
- "sha256": "571c051fbd678d17a35202785ee42092886b9ffb17222e7d8dc21d97f20bf1e5"
4360
+ "sha256": "d38bef9066bf2cc7cf2fbe493af5e9dd7a4f4b20f7f051460e72fc6c0d98012d"
4336
4361
  },
4337
4362
  {
4338
4363
  "path": "public-landing/buddha.png",
@@ -4342,7 +4367,7 @@
4342
4367
  {
4343
4368
  "path": "public-landing/create.html",
4344
4369
  "mode": "0000644",
4345
- "sha256": "5f8dda878cea216fad95f722c4d17e8d35629e7e6040cf547eafcae1fb86d001"
4370
+ "sha256": "efcc1894c06d1f4755028ae554707a61f8ef6e6753d7d7554f94e3748910f155"
4346
4371
  },
4347
4372
  {
4348
4373
  "path": "public-landing/gate/README.md",
@@ -4367,7 +4392,7 @@
4367
4392
  {
4368
4393
  "path": "public-landing/gate/index.html",
4369
4394
  "mode": "0000644",
4370
- "sha256": "7e9e68da92493b0a728de0a4ff4d1a036d888df6b47267e5a5ac628ac55fcd07"
4395
+ "sha256": "4fabebb37446cb55803332d89909dd25b905ebbff5f3dd7d607d383122095800"
4371
4396
  },
4372
4397
  {
4373
4398
  "path": "public-landing/gate/previews/cloud-bongos.jpg",
@@ -5727,7 +5752,7 @@
5727
5752
  {
5728
5753
  "path": "src/module-api.js",
5729
5754
  "mode": "0000644",
5730
- "sha256": "592a0682457594b8192024b85aea705d3ab3e31f318bf6558c9af7a0399aced0"
5755
+ "sha256": "fb1e1a8efafde2d29df7b9dd4e9de53a985a858b7f0a26517baf1632c4227d96"
5731
5756
  },
5732
5757
  {
5733
5758
  "path": "src/module-loader/loader.js",
@@ -6197,7 +6222,7 @@
6197
6222
  {
6198
6223
  "path": "tests/cloud_bongos_pack.mjs",
6199
6224
  "mode": "0000644",
6200
- "sha256": "7d4277afa6566c6287d71e9ca31333ebf0f6d8532d299537bbc7fa64ab73d86d"
6225
+ "sha256": "edfa4f2dad99e969d45b3fe37bc88aa9d0926d24d907cd8dade2ca0ee467ab11"
6201
6226
  },
6202
6227
  {
6203
6228
  "path": "tests/conductor.mjs",
@@ -6224,6 +6249,11 @@
6224
6249
  "mode": "0000644",
6225
6250
  "sha256": "55bd70efd8067e39d6220d14f78c743ce80d8a8ff37988acf00136b5108dc004"
6226
6251
  },
6252
+ {
6253
+ "path": "tests/cosmos_token_contrast.mjs",
6254
+ "mode": "0000644",
6255
+ "sha256": "f295115dbefe49aef1ac4cb9b34404952fb92c858d45f00af2caacee580ec9ce"
6256
+ },
6227
6257
  {
6228
6258
  "path": "tests/cost.mjs",
6229
6259
  "mode": "0000644",
@@ -6494,6 +6524,11 @@
6494
6524
  "mode": "0000644",
6495
6525
  "sha256": "df503f198853f6fe3497a2e0317d90bee69cc275f024027ad569ee1cef0155b6"
6496
6526
  },
6527
+ {
6528
+ "path": "tests/gate_launch_metadata.mjs",
6529
+ "mode": "0000644",
6530
+ "sha256": "235dfa1ea341b596ea4981fe8375650150387a60c9093c3a1a7b761222ee259a"
6531
+ },
6497
6532
  {
6498
6533
  "path": "tests/gate_review.mjs",
6499
6534
  "mode": "0000644",
@@ -35,9 +35,9 @@
35
35
  "ui": {
36
36
  "colors": {
37
37
  "bg": "#fff7ed", "bgCard": "#ffffff", "bgDeep": "#ffedd5", "bgFrame": "#fde4c8",
38
- "ink": "#2a1f17", "inkSoft": "#6b5d52", "inkFaint": "#857567",
38
+ "ink": "#2a1f17", "inkSoft": "#6b5d52", "inkFaint": "#756a60",
39
39
  "rule": "#fdba74", "ruleSoft": "#fed7aa",
40
- "accent": "#f97316", "accentDeep": "#ea580c", "sea": "#38bdf8", "terracotta": "#fb7185"
40
+ "accent": "#ce4806", "accentDeep": "#9e3406", "sea": "#38bdf8", "terracotta": "#fb7185"
41
41
  },
42
42
  "fonts": {
43
43
  "display": "\"Baloo 2\", \"Quicksand\", system-ui, sans-serif",
@@ -0,0 +1,155 @@
1
+ # The Front Door and the Project Hub — Direction
2
+
3
+ > **Task 1002746** (goal 1000059), promoted from idea 1000713 · decided with the owner 2026-08-13.
4
+ > Surfaced by the gate-navigation session (task 1002741) and **revises it** — see §6.
5
+ > Time-sensitive: whichever page answers `/` when the pre-launch lock comes off becomes the
6
+ > product's first impression.
7
+
8
+ Scope: what `cloudbongos.com/` serves at launch, what happens to the `index.html` placeholder, and
9
+ how the project surfaces are organised. Deliberately **not** in scope: the visual design of any of
10
+ it — the owner plans a whole-site UI pass once the projects work completes, and this direction
11
+ settles structure so that pass inherits a clean shape rather than a decision.
12
+
13
+ ---
14
+
15
+ ## 0. Starting point — what exists today
16
+
17
+ Verified live on core 1.19.85 and read from `origin/main`.
18
+
19
+ **Two landing pages, and the wrong one answers the domain.**
20
+
21
+ | Path | Live | Notes |
22
+ |---|---|---|
23
+ | `/` | **302 → `/gate/` → 401** | the orb sky, behind the pre-launch `basic_auth` |
24
+ | `/index.html` | 200, public | reachable only if you type the filename |
25
+ | `/create`, `/projects` | 200, public | link only to each other |
26
+
27
+ `public-landing/index.html` declares what it is in its own source: *"a deliberately MINIMAL
28
+ placeholder home — just the mascot + a way into the Hall. The full landing page is a separate
29
+ task."* It is a pre-gate stub, not a competing design.
30
+
31
+ **The metadata is inverted.** The placeholder nobody reaches has a real product title and a meta
32
+ description. The gate that actually answers `/` shipped with `<title>Cloud Bongos — landing gate</title>`,
33
+ **no** description, **no** `og:`/`twitter:` tags, and **no** `<noscript>` — and the sky is entirely
34
+ JS-built, so a non-executing crawler or a JS-off visitor got a blank page. None of it bit yet only
35
+ because `X-Robots-Tag: noindex, nofollow` covers the whole host pre-launch. All of it bites at once
36
+ when the lock comes off.
37
+
38
+ **`index.html` is shared, not platform-specific.** It is the default landing every instance serves
39
+ (a child instance like `spike-harbor.cloudbongos.com` has no gate, so it already answers `/` with
40
+ this page). `/projects` is apex-only. That asymmetry constrains what may be hardcoded into it (§4).
41
+
42
+ ---
43
+
44
+ ## 1. Decisions (owner, 2026-08-13)
45
+
46
+ 1. **`/` serves a real landing page** — proper title, meta description, `og:`/social tags, and the
47
+ rest of the landing information. Not a redirect into an interactive experience.
48
+ 2. **`/projects` becomes the project hub.** One surface absorbs *all* project-related actions:
49
+ viewing the map/grid of projects, managing the signed-in owner's own projects, and creating new
50
+ ones. `/create` redirects into it. The orb sky stops being a front door and becomes a **view
51
+ inside the hub**.
52
+ 3. **Launch-safety is fixed now; the visual build is deferred** to the whole-site UI pass.
53
+ 4. **The pre-launch `basic_auth` is temporary** (carried over from task 1002741 §1).
54
+
55
+ ## 2. The hub model
56
+
57
+ `/projects` is the single place a person goes for anything project-shaped:
58
+
59
+ | Inside the hub | Comes from today's |
60
+ |---|---|
61
+ | the map / grid of projects (orb sky + the sortable table) | `/gate/` (`view-space`, `view-table`) |
62
+ | your own projects — status, address, teardown, revive | `/projects` |
63
+ | creating a project | `/create` (redirects in) |
64
+
65
+ - **No new vocabulary.** The hub keeps the `/projects` URL rather than inventing `/projects-hub`;
66
+ every existing link and bookmark keeps working, and "projects" already means projects to anyone
67
+ who has seen the surface. (An underscore form — `/projects_hub` — was considered and rejected:
68
+ underscores are unconventional in URLs and read poorly in search results.)
69
+ - **The map and the manage list are two views of one truth.** Both must render the verification
70
+ overlay the task 1002696 direction established (`live · checked Xm ago` / `live?` / `unreachable`).
71
+ A project cannot look alive on the map and unreachable in the list.
72
+ - **Signed-out visitors get the map** as a showcase, plus a way in. Signed-in owners additionally get
73
+ their own projects — which is where owner-orbs (§6) land.
74
+
75
+ ## 3. Sequencing — why the flip is NOT in this task
76
+
77
+ The apex flip is deliberately **not** shipped here, for a reason worth recording:
78
+
79
+ - `/` today at least reaches the sky, which carries a (weak) corner door to `/projects`. The shared
80
+ `index.html` has **no** door into the hub at all — its only outbound link is the builders' hall.
81
+ Flipping `/` to that page before it has doors would leave navigation **worse** than today, not
82
+ better.
83
+ - The flip also has an **infra half**: `/` is redirected in two places — the app
84
+ (`src/platform-server.js:115-121`) and the live Caddyfile (`redir / /gate/ 302` inside the `@gate`
85
+ block, which also carries the `basic_auth`). Changing code alone moves nothing on prod. The Caddy
86
+ edit is an operator act on the live box tied to launch, not a surface task.
87
+
88
+ So the flip ships **with** the hub build, once the landing page has doors, and is paired with the
89
+ Caddy change. What ships now is the part that is safe and useful regardless (§4).
90
+
91
+ ## 4. What ships in this task (the launch-safety fix)
92
+
93
+ Because the gate is what answers `/` **today**, the launch-safety fix is applied to the gate — not to
94
+ a page that does not yet hold the door:
95
+
96
+ - **`public-landing/gate/index.html`**: a real `<title>`, a meta description, `canonical`,
97
+ `og:type/site_name/url/title/description/image`, and `twitter:` card tags. Absolute
98
+ `cloudbongos.com` URLs, matching the domain `space.js` already pins.
99
+ - **A `<noscript>` block** stating plainly what Cloud Bongos is and linking to `/projects`,
100
+ `/create`, and the hall. Inline-styled, because every rule in `space.css` is scoped to a body
101
+ view-class this block must ignore. **No visual change for a JS visitor** — it renders only when
102
+ scripting is off.
103
+
104
+ **Explicitly not done, and why:** `og:` tags were *not* added to `public-landing/index.html`. It ships
105
+ to every instance, and social tags are read before JS runs — so its `window.__BRANDING__` fill cannot
106
+ populate them, and hardcoding `cloudbongos.com` would make every child instance advertise the wrong
107
+ site. Per-instance social tags need server-side injection; filed as **idea 1000715** rather than
108
+ hacked in here.
109
+
110
+ ## 5. Findings surfaced while deciding this
111
+
112
+ - **`tests/platform_boot.mjs` is parked in `KNOWN_FAILING` and has rotted.** Its apex test asserts
113
+ `/` returns 200 with the landing page; the gate redirect (task 1002408) made it 302, and the test
114
+ was never updated. It sits in `run-unit-tests.js`'s `KNOWN_FAILING` set (parked by task 1002617 so
115
+ the `unit` check could be made required), which is why CI is green. A `known_failing_ratchet.mjs`
116
+ pairs with it and fails the suite if a parked test starts passing — so **the hub flip must unpark
117
+ this test in the same change that makes it pass**. Filed as **idea 1000716**.
118
+ - Note the test also asserts an identity chip (`id="who"`, task 2094) that `index.html` does not
119
+ contain — a second, independent rot in the same file.
120
+ - The assertion the repo already carries (`/` → 200, the landing page) is exactly the behaviour this
121
+ direction decides. The test was right; the code drifted past it.
122
+
123
+ ## 6. Revision of the gate-navigation direction (task 1002741)
124
+
125
+ That direction was written hours earlier on the premise that **the gate is the front door**. This
126
+ direction supersedes that premise. What survives and what changes:
127
+
128
+ | Decision there | Status now |
129
+ |---|---|
130
+ | The `basic_auth` wall is temporary | **stands** |
131
+ | The type-`bongos` entry ritual is removed; land on the sky | **stands** — the sky is now a hub view, and the ritual should not gate a view any more than it should gate a front door |
132
+ | A persistent door in every gate view | **becomes hub navigation** — the same requirement, relocated: the door is now the hub's own nav between map / your projects / create, not a link out of the gate |
133
+ | A signed-in owner's projects get a distinct identity in the sky | **stands** — and lands inside the hub's map view |
134
+ | The sky is the public front door | **superseded** — `/` is the landing page; the sky is a view of `/projects` |
135
+
136
+ Both carriers are re-scoped accordingly: **task 1002743** (ritual removal + hub navigation, plus the
137
+ apex flip and unparking `platform_boot`) and **task 1002744** (owner-scoped feed + owned-orb identity
138
+ inside the hub map).
139
+
140
+ ## 7. Boundary with the coming UI pass
141
+
142
+ This direction settles **structure**: which URL serves what, what the hub contains, and what
143
+ redirects where. It settles **no** visual design — not the landing page's layout, not the hub's
144
+ chrome, not how the map and list views sit together. Those belong to the whole-site UI pass the owner
145
+ plans after the projects work completes, and that pass should be able to take this structure as given
146
+ and change only how it looks.
147
+
148
+ ## 8. Sign-off dispositions (owner, 2026-08-13)
149
+
150
+ 1. **`/` = a real landing page**; the map/project list is a separate surface.
151
+ 2. **That surface is `/projects`**, absorbing map, manage, and create — chosen over a new
152
+ `/projects-hub` URL so no vocabulary or bookmarks are lost.
153
+ 3. **Amend task 1002741's direction and re-scope its two carriers** rather than letting them ship
154
+ against a premise that changed (§6).
155
+ 4. **Decide + do the launch-safety fix now** — hence §4, and hence the flip deferred to §3.
@@ -1,5 +1,22 @@
1
1
  # Gate Navigation — Direction
2
2
 
3
+ > ## ⚠ REVISED the same day — read this first
4
+ >
5
+ > This document's central premise — **the gate is the front door** — was **superseded within hours**
6
+ > by [`front-door-and-hub-direction.md`](front-door-and-hub-direction.md) (task 1002746, owner,
7
+ > 2026-08-13). Under that decision `/` serves a real landing page, and **`/projects` becomes a project
8
+ > hub** that absorbs the map/grid, managing your projects, and creating them. The orb sky is no longer
9
+ > a front door — it is a **view inside the hub**.
10
+ >
11
+ > **What still stands:** the temporary `basic_auth` wall, removing the type-`bongos` entry ritual, the
12
+ > requirement for persistent navigation, and owner-orbs. **What changed:** those land inside the hub
13
+ > rather than on a standalone gate, and the "door out to `/projects`" becomes the hub's own internal
14
+ > navigation. The full disposition is in that document's §6.
15
+ >
16
+ > Everything below is preserved as the **evidence base** — the live navigation trace, the five-view
17
+ > map, the sign-in-awareness findings, and the shipped-door analysis are all still accurate and still
18
+ > load-bearing for the build. Only the framing changed.
19
+
3
20
  > **Task 1002741** (goal 1000059 "Projects surface revamp") · direction decided with the owner 2026-08-13.
4
21
  > Owner finding, 2026-08-12, minutes after the task 1002696 redesign went live: *"cloudbongos.com/gate
5
22
  > is the landing page and there's no way to get there from the landing page."*
@@ -0,0 +1,176 @@
1
+ # The Landing Page — Direction
2
+
3
+ > **Task 1002747** (goal 1000061 "Apex UI pass") · decided with the owner 2026-08-13.
4
+ > The mock this approves: [`mocks/landing-page-mock.html`](mocks/landing-page-mock.html).
5
+ > Palette comparison sheet: [`mocks/landing-palettes.html`](mocks/landing-palettes.html) ·
6
+ > candidate tokens: <redacted>
7
+
8
+ Scope: the **look and content spine** of the page that answers `cloudbongos.com/`. Structure was
9
+ already settled by [`front-door-and-hub-direction.md`](front-door-and-hub-direction.md), whose §7
10
+ deferred the visual design to this pass and told it to take the structure as given. This document
11
+ does not reopen structure. It also does **not** cover the hub — that is the next surface.
12
+
13
+ ---
14
+
15
+ ## 1. Decisions (owner, 2026-08-13)
16
+
17
+ 1. **The hero is the bongo pair, not the buddha.** Animated, pulsing on a beat.
18
+ 2. **The palette is `ember marigold`** — the existing sunrise with the milk taken out.
19
+ 3. **One file, with a server-side apex conditional.** `public-landing/index.html` renders two
20
+ shapes rather than the platform getting its own landing file.
21
+ 4. **`landingPage()` gains server-side head injection** — `og:`/`twitter:`/`canonical` are stamped
22
+ from the server-side `branding()`, in this pass. This closes idea 1000715.
23
+
24
+ ## 2. The hero — why the drums beat the buddha
25
+
26
+ The mascot was the obvious hero and is not the right one.
27
+
28
+ - **The bongo pair is already the brand mark.** `config/branding.neutral.json`'s favicon is two
29
+ circles, big and small, with lighter heads. The hero is that mark made dimensional, so the tab
30
+ icon and the hero are the same object rather than two unrelated illustrations.
31
+ - **It re-themes.** It is inline SVG whose every fill is a token, so it follows the palette. The
32
+ buddha is a fixed raster and would have pinned one instance's art onto every instance's landing
33
+ page — the same portability problem as the social tags.
34
+ - **It is ~3KB against 1.3MB.** The buddha hero is 44 webp frames above the fold.
35
+ - **It animates the tagline.** "Building software is laying down a beat" is a claim about rhythm;
36
+ a drum being played states it, a seated figure only implies it.
37
+
38
+ The beat is a 1.6s loop: the big drum on 0.0 and 0.8, the small one syncopating at 0.4, 1.0 and
39
+ 1.25, with ripples crossing each head, a shell bob, and a matching pulse in the glow and shadow. It
40
+ holds a static pose under `prefers-reduced-motion`.
41
+
42
+ > **Gotcha worth keeping.** The drum head is *skin*, not a card. An early version had it inherit
43
+ > `--bg-card` and it turned black in dark mode. The head carries its own `--skin-hi/mid/lo` tokens
44
+ > that stay a light parchment in both modes.
45
+
46
+ The buddha is **not retired** — it stays the brand's character, and the interactive widget
47
+ (task 1001523, still gated on two unshipped art shoots) has a home in goal 1000031. It is simply
48
+ not what answers `/`.
49
+
50
+ ## 3. The palette — `ember marigold`
51
+
52
+ Six palettes were designed against distinct moods and ranked by a brand critique; the sheet and all
53
+ six token sets are preserved in `mocks/`. Marigold won on the thing the light mode most needed:
54
+
55
+ - **A genuinely pigmented backdrop.** Today's light mode has page, sky and cards all within a few
56
+ points of white, so nothing has a figure/ground relationship and the page reads as fog. Marigold
57
+ keeps the backdrop golden all the way to the footer and makes the cards the only near-white
58
+ surfaces, so every panel lifts.
59
+ - **A fired accent.** `#ce4806` instead of `#f97316` — unmistakably the same bongo orange, but with
60
+ heat behind it, and it clears contrast (see §4) where the current one does not.
61
+ - **Dark mode is not an inversion.** Cards are `#2c1710`, a deep saturated umber, and the accent
62
+ pair flips direction — the hover/link tone goes *brighter* (`#ffab63`), which is how warm schemes
63
+ actually behave on a dark ground.
64
+
65
+ **Its risk, recorded so the build can watch for it:** the palette is almost entirely warm and
66
+ almost entirely orange. The ivory cards and the lagoon `--sea` (`#0f7a96`) are the only relief
67
+ valves. If either gets crowded out the page tips into a single amber wash. If that happens in the
68
+ build, the fix already identified is to borrow adobe clay's move and give the scheme a real second
69
+ hue rather than to desaturate the first.
70
+
71
+ ## 4. The contrast defect this pass found — fix it in the build
72
+
73
+ Every candidate palette was checked with a WCAG contrast calculator across twelve pairs, and the
74
+ calculator was pointed at the **current** tokens too. The palette shipping today fails AA:
75
+
76
+ | Pair | Ratio | Required | |
77
+ |---|---|---|---|
78
+ | white on `--accent` `#f97316` | **2.80:1** | 4.5 | **fail** |
79
+ | white on `--accent-deep` `#ea580c` | **3.56:1** | 4.5 | **fail** |
80
+ | `--accent-deep` as link text on a card | **3.56:1** | 4.5 | **fail** |
81
+
82
+ This is **not** limited to the landing page — `--accent` is the fill of every primary `.btn` and
83
+ `--accent-deep` is the link color on `/create` and `/projects` right now. Marigold's `#ce4806`
84
+ (4.61:1) and `#9e3406` (6.86:1) clear it. Tracked as its own task so the fix is not buried inside a
85
+ landing-page commit.
86
+
87
+ **`--chrome-accent` must follow `--accent` in the same change.** It is hardcoded `#f97316`/`#fb923c`
88
+ in `cosmos.css`, so a re-themed instance gets an orange wordmark and orange glass borders beside its
89
+ own accent. Marigold is orange enough that this is subtle, but it is wrong for every other pack and
90
+ it is a one-line fix per mode.
91
+
92
+ ## 5. The content spine
93
+
94
+ Ordered. **Portable** = true on every instance; **apex-only** = true of Cloud Bongos the platform.
95
+ Press `S` in the mock to outline the apex-only blocks, `C` to see the child-instance shape.
96
+
97
+ | | Section | Portable? |
98
+ |---|---|---|
99
+ | S0 | Head metadata — title, description, canonical, `og:`, `twitter:` | server-stamped |
100
+ | S1 | Header — wordmark, Projects, Hall, mode toggle, identity chip | portable |
101
+ | S2 | Hero — self-typing eyebrow, tagline, sub, two CTAs, the drums | portable (2nd CTA apex-only) |
102
+ | S3 | The mechanism — the ledger · the gates · the grade | portable |
103
+ | S4 | The lifecycle — claim → build → grade → ship → credit | portable |
104
+ | S5 | Living proof — the real project catalog | **apex-only**, self-hides on empty |
105
+ | S6 | What you own — AGPL, capture-resistant | **apex-only** |
106
+ | S7 | Two doors — build a project · join as a builder | portable |
107
+ | S8 | Footer | split (see below) |
108
+
109
+ Copy notes:
110
+ - The sub is verbatim from `space.js:34` and the §S6 paragraph verbatim from `create.html:391` —
111
+ both already public-facing and owner-approved. Not newly invented.
112
+ - **The footer line splits.** `index.html:104` currently ships *"A non-profit, capture-resistant
113
+ commons"* to every instance, including ones that are neither. That half is apex-only; *"Built by
114
+ agents, on Cloud Bongos"* is the portable attribution.
115
+ - **S3 is the differentiator, not "AI writes code."** That claim is crowded. What is actually
116
+ enforced — a complete ledger, a server-checked rank ladder, an adversarial grade — is not.
117
+ - **No CLI download block.** `/downloads/bongos/*` only mounts when `config/bongos-cli.json` exists.
118
+ It does not, and the live URL 404s. Do not design copy around it.
119
+
120
+ ## 6. The design system
121
+
122
+ The page **links `cosmos.css`** and adds a page-local sheet. It does not fork it and does not start
123
+ a fourth design system. The lifecycle rail is literally `.strip`, the catalog chips are the same
124
+ `.chip` verification vocabulary the hub uses — the marketing page and the working page share
125
+ components rather than resembling each other.
126
+
127
+ `cosmos.css` was built for `/create` and `/projects` and is missing things a marketing page needs.
128
+ The build should add these to the shared layer, not to the page: a `.wrap` container, a type scale
129
+ below `h1`, a spacing scale, one grid primitive, and a mid (~900px) breakpoint. The mock authors all
130
+ five page-locally; they are marked in its stylesheet.
131
+
132
+ ## 7. Constraints the build must respect
133
+
134
+ - **C1 · One `:root`.** `injectBrandingGlobal` splices the pack's theme `<style>` at the end of
135
+ `<head>`; a page-local `:root` block silently outranks it and defeats re-branding. Page-local
136
+ custom properties stay scoped to their component.
137
+ - **C2 · Dark changes are made twice.** `:root[data-mode="dark"]` and the
138
+ `prefers-color-scheme` twin are byte-identical duplicates in `cosmos.css`. Both, every time.
139
+ - **C3 · The page must ship a `.sky` element.** The pack's `theme.backdrop` emits a
140
+ `body{background:…}` that overrides `--page-bg` in both modes; `.sky` is the opaque fixed layer
141
+ that paints over it.
142
+ - **C4 · `id="who"` is required.** `tests/platform_boot.mjs:120` asserts `/id="who"/` on the apex
143
+ landing, and that test must leave `KNOWN_FAILING` in the same change that makes it pass — the
144
+ ratchet fails the suite otherwise (idea 1000716).
145
+ - **C5 · Nothing about cloudbongos.com is hardcoded.** `public-landing/` ships wholesale to every
146
+ instance.
147
+ - **C6 · Outbound links cannot be client-filled.** `clientBranding()` does not project `domains`, so
148
+ `[data-link-hall]` never re-points and every child instance currently sends visitors to
149
+ `builders.cloudbongos.com`. The §1.4 server-side injection is the fix that respects the branding
150
+ contract's decision to keep origins server-side.
151
+ - **C7 · Real markup, not JS-built.** The page must read correctly to a crawler and with JavaScript
152
+ off — the failure the gate shipped with and task 1002746 had to repair.
153
+
154
+ ## 8. Follow-on tasks this direction produced
155
+
156
+ | Task | Goal | What it does |
157
+ |---|---|---|
158
+ | **task 1002748** | 1000061 | **The build carrier.** Builds this direction into `public-landing/index.html`: the content spine, the bongo hero, the apex conditional, and the server-stamped head tags. This document plus the mock are its contract. |
159
+ | **task 1002749** | 1000059 | **The WCAG defect** found in §4. Filed separately from the build because it is a live fault on `/create` and `/projects`, not a landing-page issue, and should not be buried inside a landing-page commit. |
160
+
161
+ Both are promoted and claimable. Neither is started.
162
+
163
+ Already existing, and gated on the build: **task 1002743** part 3 is the apex flip — it does not run
164
+ until the landing page carries a door into the hub, which §5's header now does, *and* the hub itself
165
+ exists.
166
+
167
+ ## 9. What is deliberately still open
168
+
169
+ - **The hub is not designed.** `/projects` is the next surface and gets its own mock and direction.
170
+ - **The apex flip does not happen here.** `/` keeps redirecting until the hub exists; the flip is
171
+ task 1002743 part 3 and is paired with an operator Caddy edit.
172
+ - **Whether the catalog band survives at three projects.** It reads thin today. The band self-hides
173
+ on an empty feed, so shipping it is safe, but if the catalog stays this small the honest options
174
+ are a threshold or cutting S5 and letting the hub carry the showcase.
175
+ - **The proof band's effect is weaker in dark mode.** In light it reads as a window into the hub; in
176
+ dark the whole page is already dark and it separates only by tint.