@bongos/core 1.19.725 → 1.19.727
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 +179 -494
- package/.devcontainer/Dockerfile +1 -1
- package/.devcontainer/devcontainer.json +2 -2
- package/.devcontainer/healthcheck.sh +1 -1
- package/.devcontainer/init-firewall.sh +1 -1
- package/.devcontainer/post-create.sh +2 -2
- package/.env.local.example +1 -1
- package/Dockerfile +1 -1
- package/docs/copy-inventory.md +1 -1
- package/docs/copy-registry.json +9 -9
- package/docs/module-api-changelog.md +4 -0
- package/docs/recipes/devbox-app-release.md +4 -4
- package/modules/dev-box/app/scripts/dmgbuild-settings.py +5 -5
- package/modules/dev-box/app/scripts/gen-brand.js +1 -1
- package/modules/dev-box/app/src/brand.js +1 -1
- package/modules/dev-box/app/test/unit.mjs +16 -16
- package/modules/dev-box/box-access.js +1 -1
- package/modules/dev-box/routes/box.js +1 -1
- package/modules/discord/discord-approvals.js +1 -1
- package/modules/grading/grader-model.js +1 -1
- package/modules/grading/grader-prompt.js +1 -1
- package/modules/grading/grader-workers/quality.js +1 -1
- package/modules/hall-ui/module.json +1 -1
- package/modules/hall-ui/public/brand-apply.js +1 -1
- package/modules/hall-ui/public/shell.js +1 -1
- package/modules/hall-ui/public/work.js +1 -1
- package/modules/lifecycle/conflict-resolve.js +1 -1
- package/modules/lifecycle/db-analytics.js +1 -1
- package/modules/lifecycle/routes/analytics.js +1 -1
- package/modules/onboarding/approval-broadcast.js +1 -1
- package/modules/onboarding/onboarding.js +1 -1
- package/modules/provisioning/tests/liveness.mjs +1 -1
- package/modules/public-landing/public/index.html +1 -1
- package/modules/public-landing/public/projects-floor.states.json +2 -2
- package/modules/public-landing/public/projects.probes.json +4 -4
- package/modules/public-landing/public/projects.states.json +2 -2
- package/modules/status-ui/module.json +1 -1
- package/modules/status-ui/public/status.js +4 -4
- package/modules/status-ui/public/style.css +1 -1
- package/modules/ui-design/kit/fixtures/cost-summary.json +1 -1
- package/modules/ui-design/kit/fixtures/featured-hub.json +1 -1
- package/modules/ui-design/kit/fixtures/featured.json +1 -1
- package/modules/ui-design/kit/fixtures/leaderboard.json +1 -1
- package/modules/ui-design/kit/fixtures/my-projects.json +1 -1
- package/modules/ui-design/kit/fixtures/progress.json +1 -1
- package/modules/ui-design/kit/fixtures/recent-shipped.json +1 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/cron/style_guide_audit.sh +1 -1
- package/scripts/discord/lib.js +1 -1
- package/scripts/discord/post.js +1 -1
- package/scripts/gds/audit-authorship.sh +1 -1
- package/scripts/gds/audit-replay.sh +29 -2
- package/scripts/gds/audit-ships.js +1 -1
- package/scripts/gds/backfill-sessions.js +2 -2
- package/scripts/gds/cf-tunnel.js +4 -4
- package/scripts/gds/claude-materialize.js +2 -2
- package/scripts/gds/cli-lib.js +6 -6
- package/scripts/gds/cutover-codemod.js +1 -1
- package/scripts/gds/dev-lib.js +2 -2
- package/scripts/gds/diagnose-achievements.js +2 -2
- package/scripts/gds/fitness-checks-identity.js +6 -4
- package/scripts/gds/gate-review.js +14 -6
- package/scripts/gds/gen-diagrams.js +1 -1
- package/scripts/gds/leak-scan-allowlist.js +293 -0
- package/scripts/gds/learning-capture.js +1 -1
- package/scripts/gds/linkify-refs.js +2 -2
- package/scripts/gds/local-preview-lib.js +1 -1
- package/scripts/gds/mirror-lineage-check.js +1 -1
- package/scripts/gds/mirror-redact.js +17 -2
- package/scripts/gds/newcomer-floor.templates.json +1 -1
- package/scripts/gds/package-core.js +18 -1
- package/scripts/gds/paste-token.js +1 -1
- package/scripts/gds/provision-units.js +2 -2
- package/scripts/gds/publish-manifest.js +15 -0
- package/scripts/gds/repo-metrics.js +1 -1
- package/scripts/gds/sandbox-stage.js +1 -1
- package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +1 -1
- package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +1 -1
- package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +1 -1
- package/scripts/gds/seed-bongos-tasks.js +2 -2
- package/scripts/gds/seed-gds-v4-tasks.js +1 -1
- package/scripts/gds/seed-medusa-tasks.js +10 -10
- package/scripts/gds/seed-module-upstreaming.js +1 -1
- package/scripts/gds/seed-productization-tasks.js +6 -6
- package/scripts/gds/seed-provisioning-tasks.js +2 -2
- package/scripts/gds/seed-staging.sh +19 -6
- package/scripts/gds/ship-deploy-target.js +1 -1
- package/scripts/gds/ship-flow.js +1 -1
- package/scripts/gds/smoke-gds.js +1 -1
- package/scripts/status-probe.mjs +2 -2
- package/src/bongos/auth-discord.js +2 -2
- package/src/bongos/live-channel.js +1 -1
- package/src/bongos/permission-path-check.js +80 -3
- package/src/bongos/pool.js +1 -1
- package/src/bongos/routes/auth.js +11 -11
- package/src/bongos/routes/security.js +1 -1
- package/src/bongos/routes.js +1 -1
- package/src/branding.js +1 -1
- package/src/devbox-downloads.js +1 -1
- package/src/instance-config.js +2 -2
- package/src/module-api.js +1 -1
- package/src/module-loader/provenance.js +2 -2
- package/tests/art_stage.mjs +2 -2
- package/tests/auth_anthropic_identity.mjs +1 -1
- package/tests/auth_duplicate_cookie.mjs +1 -1
- package/tests/auth_error_brand.mjs +1 -1
- package/tests/auth_inactive_builder.mjs +1 -1
- package/tests/backup_cli.mjs +4 -4
- package/tests/bongos_box_connect.mjs +2 -2
- package/tests/bongos_downloads.mjs +2 -2
- package/tests/bongos_login.mjs +5 -5
- package/tests/box_connect_e2e.mjs +2 -2
- package/tests/box_dns_repoint.mjs +10 -10
- package/tests/box_host_keys.mjs +1 -1
- package/tests/box_onboard.mjs +9 -9
- package/tests/box_scope_session.mjs +1 -1
- package/tests/box_terminal_ssrf.mjs +7 -7
- package/tests/boxes.mjs +9 -9
- package/tests/branding.mjs +2 -2
- package/tests/bump_version.mjs +2 -2
- package/tests/cf_tunnel.mjs +40 -40
- package/tests/cli_token_reissue.mjs +7 -7
- package/tests/cloud_bongos_pack.mjs +1 -1
- package/tests/currency_label.mjs +8 -8
- package/tests/dev_lib.mjs +4 -4
- package/tests/devbox_dmg_backdrop.mjs +1 -1
- package/tests/devbox_downloads.mjs +2 -2
- package/tests/devbox_icons.mjs +1 -1
- package/tests/discord_approvals.mjs +1 -1
- package/tests/discord_oauth.mjs +2 -2
- package/tests/executed_closure.mjs +6 -1
- package/tests/first_admin_bootstrap.mjs +1 -1
- package/tests/gate_approvals.mjs +5 -5
- package/tests/government_protected_surfaces.mjs +137 -0
- package/tests/grade_aggregates_unavailable.mjs +1 -1
- package/tests/hook_user_agents.mjs +2 -2
- package/tests/init.mjs +6 -6
- package/tests/instance_config.mjs +1 -1
- package/tests/instance_manifest.mjs +5 -5
- package/tests/instance_mismatch_guard.mjs +13 -13
- package/tests/leak_scan_allowlist.mjs +94 -0
- package/tests/migrate_root_resolution.mjs +4 -4
- package/tests/mirror_redact.mjs +28 -4
- package/tests/module_catalog.mjs +5 -5
- package/tests/module_submissions.mjs +3 -3
- package/tests/package_core.mjs +1 -1
- package/tests/parallel-load.mjs +6 -6
- package/tests/projects_hub.mjs +2 -2
- package/tests/provision.mjs +50 -50
- package/tests/provisioning_github_app_routes.mjs +1 -1
- package/tests/provisioning_onboard_mode.mjs +2 -2
- package/tests/publish_reconciler.mjs +4 -4
- package/tests/sandbox_stage.mjs +1 -1
- package/tests/scrubber_corpus.mjs +3 -3
- package/tests/search_isolation.mjs +1 -1
- package/tests/session_records.mjs +1 -1
- package/tests/ship_card.mjs +6 -6
- package/tests/ship_ci_deploy.mjs +1 -1
- package/tests/single_host_hall.mjs +9 -9
- package/tests/smoke_preflight.mjs +1 -1
- package/tests/smoke_target.mjs +1 -1
- package/tests/status-probe.mjs +1 -1
- package/tests/status_mirror_sync.mjs +1 -1
- package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +0 -45
- package/docs/design/mocks/_schemes.css +0 -604
- package/docs/design/mocks/component-sheet.html +0 -428
- package/docs/design/mocks/hall/_tokens.css +0 -370
- package/docs/design/mocks/hall/board/v1.html +0 -846
- package/docs/design/mocks/hall/board/v2.html +0 -858
- package/docs/design/mocks/hall/board/v3.html +0 -884
- package/docs/design/mocks/hall/goals/v1.html +0 -1212
- package/docs/design/mocks/hall/goals/v2.html +0 -1192
- package/docs/design/mocks/hall/goals/v3.html +0 -1205
- package/docs/design/mocks/hall/hall-sheet.html +0 -244
- package/docs/design/mocks/hall/reading/v1.html +0 -1125
- package/docs/design/mocks/hall/reading/v2.html +0 -1177
- package/docs/design/mocks/hall/reading/v3.html +0 -1150
- package/docs/design/mocks/hall/settings/v1.html +0 -1238
- package/docs/design/mocks/hall/settings/v2.html +0 -1235
- package/docs/design/mocks/hall/settings/v3.html +0 -1299
- package/docs/design/mocks/hall/task/v1.html +0 -633
- package/docs/design/mocks/hall/task/v2.html +0 -646
- package/docs/design/mocks/hall/task/v3.html +0 -647
- package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg +0 -0
- package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg.json +0 -13
- package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg +0 -0
- package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg.json +0 -13
- package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg +0 -0
- package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg.json +0 -13
- package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg +0 -0
- package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg.json +0 -13
- package/docs/design/mocks/hub/hub-sheet.html +0 -192
- package/docs/design/mocks/hub/mine.html +0 -465
- package/docs/design/mocks/hub/picker.html +0 -421
- package/docs/design/mocks/hub/planets.html +0 -356
- package/docs/design/mocks/hub/v1.html +0 -1209
- package/docs/design/mocks/hub/v2.html +0 -1257
- package/docs/design/mocks/hub/v3.html +0 -1496
- package/docs/design/mocks/hub/wizard.html +0 -421
- package/docs/design/mocks/landing/landing-sheet.html +0 -131
- package/docs/design/mocks/landing/v1.html +0 -956
- package/docs/design/mocks/landing/v2.html +0 -708
- package/docs/design/mocks/landing/v3.html +0 -911
- package/docs/design/mocks/landing-page-mock.html +0 -687
- package/docs/design/mocks/landing-palettes.html +0 -103
- package/docs/design/mocks/projects-hub-mock.html +0 -991
- package/docs/design/mocks/projects-hub-variants.html +0 -146
- package/docs/design/mocks/projects-page-mock.html +0 -167
- package/docs/design/mocks/world/blue-hud/_tokens.css +0 -246
- package/docs/design/mocks/world/blue-hud/hall.html +0 -595
- package/docs/design/mocks/world/blue-hud/landing.html +0 -424
- package/docs/design/mocks/world/blue-hud/status.html +0 -410
- package/docs/design/mocks/world/chrome-blobs/_tokens.css +0 -479
- package/docs/design/mocks/world/chrome-blobs/hall.html +0 -553
- package/docs/design/mocks/world/chrome-blobs/landing-b.html +0 -581
- package/docs/design/mocks/world/chrome-blobs/landing.html +0 -328
- package/docs/design/mocks/world/chrome-blobs/status.html +0 -416
- package/docs/design/mocks/world/natgeo-editorial/_tokens.css +0 -377
- package/docs/design/mocks/world/natgeo-editorial/hall.html +0 -649
- package/docs/design/mocks/world/natgeo-editorial/landing-b.html +0 -743
- package/docs/design/mocks/world/natgeo-editorial/landing.html +0 -475
- package/docs/design/mocks/world/natgeo-editorial/status.html +0 -437
- package/docs/design/mocks/world/organic-cards/_tokens.css +0 -462
- package/docs/design/mocks/world/organic-cards/hall.html +0 -625
- package/docs/design/mocks/world/organic-cards/landing-b.html +0 -736
- package/docs/design/mocks/world/organic-cards/landing.html +0 -420
- package/docs/design/mocks/world/organic-cards/status.html +0 -458
- package/docs/design/mocks/world/world-sheet.html +0 -156
package/.devcontainer/Dockerfile
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Example Dev Box — the OTB builder environment as code (ADR 0031 §3).
|
|
2
2
|
# Base Ubuntu 24.04 ships Python 3.12 (matches CI's art-pipeline cert) + a non-root
|
|
3
3
|
# `vscode` sudo user. Node 22 / gh / Claude Code arrive as version-pinned features
|
|
4
4
|
# (devcontainer.json); this Dockerfile covers the OS bits features don't: firewall
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
|
-
//
|
|
2
|
+
// Example Dev Box — the OTB builder environment as code (ADR 0031 §3).
|
|
3
3
|
//
|
|
4
4
|
// This is the single box spec every builder runs, reached via Claude Desktop
|
|
5
5
|
// → SSH or the web → Remote Control (ADR 0031 §1). It builds identically on a
|
|
6
6
|
// DigitalOcean box and on a laptop via Docker Desktop. The pre-distributed
|
|
7
7
|
// Desktop "managed settings" that lock a non-technical builder to exactly this
|
|
8
8
|
// box are a separate task (#599); this file is the box itself.
|
|
9
|
-
"name": "
|
|
9
|
+
"name": "Example Dev Box",
|
|
10
10
|
|
|
11
11
|
"build": {
|
|
12
12
|
"dockerfile": "Dockerfile",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# healthcheck.sh — image-level toolchain integrity check for the
|
|
2
|
+
# healthcheck.sh — image-level toolchain integrity check for the Example
|
|
3
3
|
# Dev Box (ADR 0031 §3).
|
|
4
4
|
#
|
|
5
5
|
# This is the IMAGE half of "doctor.js as the health check": it answers "was the
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# init-firewall.sh — default-deny outbound firewall for the
|
|
2
|
+
# init-firewall.sh — default-deny outbound firewall for the Example Dev Box.
|
|
3
3
|
#
|
|
4
4
|
# ADR 0031 §3 + §6: the box is an org-controlled, egress-restricted surface. This
|
|
5
5
|
# script flips the container to default-DROP and then allow-lists ONLY the hosts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# post-create.sh — first-run provisioning for the
|
|
2
|
+
# post-create.sh — first-run provisioning for the Example Dev Box.
|
|
3
3
|
#
|
|
4
4
|
# Runs once, as the `vscode` user, after the container is created and the repo is
|
|
5
5
|
# mounted at /workspace (devcontainer.json: postCreateCommand). This is where
|
|
@@ -28,7 +28,7 @@ cd /workspace 2>/dev/null || cd "$(git rev-parse --show-toplevel 2>/dev/null ||
|
|
|
28
28
|
bold=$'\033[1m'; green=$'\033[32m'; yellow=$'\033[33m'; dim=$'\033[2m'; reset=$'\033[0m'
|
|
29
29
|
say() { echo "${bold}$*${reset}"; }
|
|
30
30
|
|
|
31
|
-
say "
|
|
31
|
+
say "Example Dev Box — first-run provisioning"
|
|
32
32
|
echo
|
|
33
33
|
|
|
34
34
|
# git trusts the mounted workspace even though its owner differs from the
|
package/.env.local.example
CHANGED
|
@@ -28,6 +28,6 @@ GOOGLE_AI_STUDIO_KEY=
|
|
|
28
28
|
# --- GitHub OAuth (server only) -----------------------------------------------
|
|
29
29
|
# Needed only if you are running the GDS server yourself (server.js) and want
|
|
30
30
|
# Device Flow auth to work. The production droplet has these in
|
|
31
|
-
# /etc/
|
|
31
|
+
# /etc/example/ — builders do NOT need these for normal day-to-day work.
|
|
32
32
|
# BONGOS_GITHUB_CLIENT_ID=
|
|
33
33
|
# BONGOS_GITHUB_CLIENT_SECRET=
|
package/Dockerfile
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# Cloud Bongos brand with every feature module off). Brand/configure an instance
|
|
8
8
|
# by mounting your own config/*.json (see docs/recipes/self-host.md).
|
|
9
9
|
#
|
|
10
|
-
# No prod topology is referenced anywhere here: no droplet IP, no
|
|
10
|
+
# No prod topology is referenced anywhere here: no droplet IP, no example
|
|
11
11
|
# domain, no peer-auth socket. The DB is reached over TCP via PG* env vars,
|
|
12
12
|
# supplied by docker-compose.yml (or your own orchestrator).
|
|
13
13
|
|
package/docs/copy-inventory.md
CHANGED
|
@@ -1541,6 +1541,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1541
1541
|
| `b1cf8460ad34` | certain | Every project is a real GitHub repository that you own. Start from a clean slate, or bring a repo you already | `modules/public-landing/public/projects.html:1127` |
|
|
1542
1542
|
| `71b0ef2552c4` | certain | Every project you own, in one place — its live status, its address, and the controls that matter. Sign in with | `modules/public-landing/public/projects.html:619` |
|
|
1543
1543
|
| `478bc7f0e492` | certain | Every project you own: what it is, whether it is answering, and the controls that matter. Each row says what t | `modules/public-landing/public/projects.html:611` |
|
|
1544
|
+
| `1b5a6cfc494c` | certain | Example World | `modules/public-landing/public/index.html:741` |
|
|
1544
1545
|
| `7c8dcf228e70` | certain | Extras for this project | `modules/public-landing/public/projects.html:1100` |
|
|
1545
1546
|
| `2585087f4873` | certain | Fair use | `modules/public-landing/public/terms.html:72` |
|
|
1546
1547
|
| `fec69b6c7458` | certain | Filter by state | `modules/public-landing/public/projects.html:641` |
|
|
@@ -1599,7 +1600,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1599
1600
|
| `fad4acf2aba6` | certain | Not Sure | `modules/public-landing/public/projects.html:1037` |
|
|
1600
1601
|
| `f8665480baf6` | certain | Nothing is sold, and nothing is shared for advertising. | `modules/public-landing/public/privacy.html:67` |
|
|
1601
1602
|
| `837fdaa0936a` | certain | Nothing matches that. | `modules/public-landing/public/projects.html:649` |
|
|
1602
|
-
| `2c951d1c7f72` | certain | Example | `modules/public-landing/public/index.html:741` |
|
|
1603
1603
|
| `1bc11853e893` | certain | On the map | `modules/public-landing/public/projects.html:824` |
|
|
1604
1604
|
| `b4ac8f44710c` | certain | On the public map | `modules/public-landing/public/projects.html:742` |
|
|
1605
1605
|
| `69400ca12477` | certain | Once you have signed in here and accepted these terms, your profile and that record are public by default: at | `modules/public-landing/public/terms.html:68` |
|
package/docs/copy-registry.json
CHANGED
|
@@ -13893,6 +13893,15 @@
|
|
|
13893
13893
|
"origin": "html-text",
|
|
13894
13894
|
"confidence": "certain"
|
|
13895
13895
|
},
|
|
13896
|
+
{
|
|
13897
|
+
"id": "1b5a6cfc494c",
|
|
13898
|
+
"surface": "landing",
|
|
13899
|
+
"text": "Example World",
|
|
13900
|
+
"file": "modules/public-landing/public/index.html",
|
|
13901
|
+
"line": 741,
|
|
13902
|
+
"origin": "html-text",
|
|
13903
|
+
"confidence": "certain"
|
|
13904
|
+
},
|
|
13896
13905
|
{
|
|
13897
13906
|
"id": "7c8dcf228e70",
|
|
13898
13907
|
"surface": "landing",
|
|
@@ -14415,15 +14424,6 @@
|
|
|
14415
14424
|
"origin": "html-text",
|
|
14416
14425
|
"confidence": "certain"
|
|
14417
14426
|
},
|
|
14418
|
-
{
|
|
14419
|
-
"id": "2c951d1c7f72",
|
|
14420
|
-
"surface": "landing",
|
|
14421
|
-
"text": "Off the Boats",
|
|
14422
|
-
"file": "modules/public-landing/public/index.html",
|
|
14423
|
-
"line": 741,
|
|
14424
|
-
"origin": "html-text",
|
|
14425
|
-
"confidence": "certain"
|
|
14426
|
-
},
|
|
14427
14427
|
{
|
|
14428
14428
|
"id": "1bc11853e893",
|
|
14429
14429
|
"surface": "landing",
|
|
@@ -1924,5 +1924,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
1924
1924
|
landed since 1.19.723 with no explicit bump. run 34759302425. (task 1002620)
|
|
1925
1925
|
1.19.725 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1926
1926
|
landed since 1.19.724 with no explicit bump. run 34760272743. (task 1002620)
|
|
1927
|
+
1.19.726 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1928
|
+
landed since 1.19.725 with no explicit bump. run 34763380132. (task 1002620)
|
|
1929
|
+
1.19.727 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1930
|
+
landed since 1.19.726 with no explicit bump. run 34763937238. (task 1002620)
|
|
1927
1931
|
---------------------------------------------------------------------------
|
|
1928
1932
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Releasing the Dev Box desktop app
|
|
2
2
|
|
|
3
|
-
How a new version of
|
|
3
|
+
How a new version of the Dev Box app (`devbox-app/`, ADR 0045) reaches builders.
|
|
4
4
|
The chain: CI builds installers → operator publishes them to the PUBLIC
|
|
5
5
|
releases repo → a one-line config bump re-points the branded
|
|
6
6
|
`/downloads/devbox/*` redirects. Nothing binary ever rides the git deploy.
|
|
@@ -21,8 +21,8 @@ releases repo → a one-line config bump re-points the branded
|
|
|
21
21
|
(302 → release asset; targets `mac-arm64`, `mac-x64`, `win-x64`, `win-arm64` + aliases)
|
|
22
22
|
and `/downloads/devbox/latest.json` (what the app's update check reads).
|
|
23
23
|
Server side: `src/devbox-downloads.js`, mounted in `server.js`.
|
|
24
|
-
- **Install-window backdrop ([#912](https://example.com/builders#/task/912), fixed in [#1235](https://example.com/builders#/task/1235)):** the
|
|
25
|
-
|
|
24
|
+
- **Install-window backdrop ([#912](https://example.com/builders#/task/912), fixed in [#1235](https://example.com/builders#/task/1235)):** the backdrop
|
|
25
|
+
art is `build-resources/dmg-background.png` (+ `@2x`), drawn by
|
|
26
26
|
`scripts/gen-dmg-backdrop.py`. Committed art — re-run that script + commit if you change
|
|
27
27
|
the layout/copy. **The DMG is NOT styled by electron-builder.** electron-builder writes a
|
|
28
28
|
`.DS_Store` whose background reference includes a modern `pBBk` bookmark that Finder on
|
|
@@ -64,7 +64,7 @@ releases repo → a one-line config bump re-points the branded
|
|
|
64
64
|
`src/devbox-downloads.js` composes):
|
|
65
65
|
```
|
|
66
66
|
gh release create v1.1.0 -R example-owner/example-devbox \
|
|
67
|
-
--title "
|
|
67
|
+
--title "Dev Box v1.1.0" --notes "…" /tmp/devbox-rel/*.dmg /tmp/devbox-rel/*.exe
|
|
68
68
|
```
|
|
69
69
|
5. Update `config/devbox-app.json`: `version` + the four asset filenames
|
|
70
70
|
(they embed the version — `tests/devbox_downloads.mjs` fails the gate on a
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# dmgbuild settings for the
|
|
1
|
+
# dmgbuild settings for the Dev Box install window (task 1235).
|
|
2
2
|
#
|
|
3
3
|
# WHY dmgbuild and not electron-builder's own DMG styling:
|
|
4
4
|
# electron-builder writes a .DS_Store whose background reference includes a
|
|
5
5
|
# modern security-scoped bookmark (`pBBk`). Finder on macOS >= Sonoma/Sequoia
|
|
6
6
|
# (verified white on 15.7.4) cannot resolve that bookmark, so it falls back to a
|
|
7
|
-
# solid white window — the embedded
|
|
7
|
+
# solid white window — the embedded backdrop (task 912) is present
|
|
8
8
|
# but never drawn. dmgbuild writes an alias-only `.DS_Store` (no `pBBk`) that
|
|
9
9
|
# Finder DOES resolve, so the backdrop renders. The OS is not the problem; the
|
|
10
10
|
# bookmark electron-builder emits is. scripts/apply-dmg-backdrop.sh re-packages
|
|
@@ -16,16 +16,16 @@
|
|
|
16
16
|
|
|
17
17
|
import os.path
|
|
18
18
|
|
|
19
|
-
# -D app=<path to
|
|
19
|
+
# -D app=<path to the Dev Box .app> -D bg=<path to the hidpi backdrop tiff>
|
|
20
20
|
application = defines["app"]
|
|
21
21
|
backdrop = defines["bg"]
|
|
22
|
-
appname = os.path.basename(application) # "
|
|
22
|
+
appname = os.path.basename(application) # e.g. "<Product> Dev Box.app"
|
|
23
23
|
|
|
24
24
|
# Contents of the disk image.
|
|
25
25
|
files = [application]
|
|
26
26
|
symlinks = {"Applications": "/Applications"}
|
|
27
27
|
|
|
28
|
-
# Window + icon layout — matched to the backdrop art
|
|
28
|
+
# Window + icon layout — matched to the two icon wells the backdrop art draws.
|
|
29
29
|
background = backdrop
|
|
30
30
|
window_rect = ((150, 150), (660, 400)) # ((x, y), (w, h)); w/h match the 660x400 art
|
|
31
31
|
icon_size = 100
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
// renderer/theme.generated.css — the :root design tokens (palette + fonts)
|
|
11
11
|
// electron-builder.yml — rendered from electron-builder.tmpl.yml
|
|
12
12
|
//
|
|
13
|
-
// So ONE source tree builds a "Cloud Bongos Dev Box" here and an "
|
|
13
|
+
// So ONE source tree builds a "Cloud Bongos Dev Box" here and an "Example
|
|
14
14
|
// Dev Box" on the OTB instance — the brand is a build input, not baked into code
|
|
15
15
|
// (the ADR 0004 posture, generalised: no instance's name is hardcoded anywhere).
|
|
16
16
|
//
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// GENERATED, not hardcoded: scripts/gen-brand.js writes src/brand.generated.json
|
|
4
4
|
// from the instance's config/branding.json at build time (prestart / pretest /
|
|
5
5
|
// predist), so the SAME source tree renders a "Cloud Bongos Dev Box" here and an
|
|
6
|
-
// "
|
|
6
|
+
// "Example Dev Box" on the OTB instance — no instance name is baked into
|
|
7
7
|
// code (the ADR 0004 posture, generalised to every instance). The generated file
|
|
8
8
|
// is committed (the Cloud Bongos default) so a fresh checkout runs without a
|
|
9
9
|
// generate step; every build regenerates it from the local branding.
|
|
@@ -91,8 +91,8 @@ console.log('terminalAuthUrl:');
|
|
|
91
91
|
|
|
92
92
|
t('embeds otb:<credential> userinfo in the terminal URL', () => {
|
|
93
93
|
assert.equal(
|
|
94
|
-
terminalAuthUrl({ url: 'https://term-
|
|
95
|
-
`https://${TERMINAL_USER}:abc123@term-
|
|
94
|
+
terminalAuthUrl({ url: 'https://term-example-owner.example.com', credential: 'abc123' }),
|
|
95
|
+
`https://${TERMINAL_USER}:abc123@term-example-owner.example.com/`
|
|
96
96
|
);
|
|
97
97
|
});
|
|
98
98
|
|
|
@@ -165,11 +165,11 @@ t('an rsa-only scan is NOT complete (#925 — Desktop ssh2 negotiates ed25519)',
|
|
|
165
165
|
console.log('hostKeyLinesFor (task 1187 / idea 235 — authoritative host keys):');
|
|
166
166
|
|
|
167
167
|
t('builds <host> <type> <base64> lines from the reported keys, ed25519 present', () => {
|
|
168
|
-
const r = hostKeyLinesFor('box-x.dev.
|
|
168
|
+
const r = hostKeyLinesFor('box-x.dev.example.com', 'ssh-ed25519 AAAA\necdsa-sha2-nistp256 BBBB');
|
|
169
169
|
assert.equal(r.ok, true);
|
|
170
170
|
assert.deepEqual(r.lines, [
|
|
171
|
-
'box-x.dev.
|
|
172
|
-
'box-x.dev.
|
|
171
|
+
'box-x.dev.example.com ssh-ed25519 AAAA',
|
|
172
|
+
'box-x.dev.example.com ecdsa-sha2-nistp256 BBBB',
|
|
173
173
|
]);
|
|
174
174
|
});
|
|
175
175
|
|
|
@@ -196,32 +196,32 @@ t('empty report / missing hostname are rejected', () => {
|
|
|
196
196
|
console.log('knownHostsHasKey + verifyKnownHosts (idea 264 — self-verify the on-disk pin):');
|
|
197
197
|
|
|
198
198
|
const HKEY = 'AAAAC3NzaC1lZDI1NTE5AAAAIBh0r5JKa722SY0UXjqHv2'; // sample ed25519 blob
|
|
199
|
-
const EXPECTED = hostKeyLinesFor('box-x.dev.
|
|
199
|
+
const EXPECTED = hostKeyLinesFor('box-x.dev.example.com', `ssh-ed25519 ${HKEY}\necdsa-sha2-nistp256 BBBB`).lines;
|
|
200
200
|
|
|
201
201
|
t('authoritative key present in file → true', () => {
|
|
202
|
-
const file = `box-x.dev.
|
|
203
|
-
assert.equal(knownHostsHasKey(file, 'box-x.dev.
|
|
202
|
+
const file = `box-x.dev.example.com ssh-ed25519 ${HKEY}\nother.example.com ssh-rsa K`;
|
|
203
|
+
assert.equal(knownHostsHasKey(file, 'box-x.dev.example.com', EXPECTED), true);
|
|
204
204
|
});
|
|
205
205
|
|
|
206
206
|
t('STALE ed25519 (rebuild minted a new key) → false, even though a host line exists', () => {
|
|
207
|
-
const file = 'box-x.dev.
|
|
208
|
-
assert.equal(knownHostsHasKey(file, 'box-x.dev.
|
|
207
|
+
const file = 'box-x.dev.example.com ssh-ed25519 OLDOLDOLD';
|
|
208
|
+
assert.equal(knownHostsHasKey(file, 'box-x.dev.example.com', EXPECTED), false);
|
|
209
209
|
});
|
|
210
210
|
|
|
211
211
|
t('MISSING (ssh-keygen -R removed it / empty file) → false', () => {
|
|
212
|
-
assert.equal(knownHostsHasKey('unrelated.example.com ssh-ed25519 ZZZZ', 'box-x.dev.
|
|
213
|
-
assert.equal(knownHostsHasKey('', 'box-x.dev.
|
|
212
|
+
assert.equal(knownHostsHasKey('unrelated.example.com ssh-ed25519 ZZZZ', 'box-x.dev.example.com', EXPECTED), false);
|
|
213
|
+
assert.equal(knownHostsHasKey('', 'box-x.dev.example.com', EXPECTED), false);
|
|
214
214
|
});
|
|
215
215
|
|
|
216
216
|
t('no authoritative key → any ed25519 line for the host counts (keyscan fallback)', () => {
|
|
217
|
-
assert.equal(knownHostsHasKey('box-x.dev.
|
|
217
|
+
assert.equal(knownHostsHasKey('box-x.dev.example.com ssh-ed25519 WHATEVER', 'box-x.dev.example.com', []), true);
|
|
218
218
|
// ...but an rsa-only pin (no ed25519, the algo Desktop verifies) is NOT enough.
|
|
219
|
-
assert.equal(knownHostsHasKey('box-x.dev.
|
|
219
|
+
assert.equal(knownHostsHasKey('box-x.dev.example.com ssh-rsa RRRR', 'box-x.dev.example.com', []), false);
|
|
220
220
|
});
|
|
221
221
|
|
|
222
222
|
t('host,ip combined first field + comments/blanks are handled', () => {
|
|
223
|
-
const file = `# a comment\n\nbox-x.dev.
|
|
224
|
-
assert.equal(knownHostsHasKey(file, 'box-x.dev.
|
|
223
|
+
const file = `# a comment\n\nbox-x.dev.example.com,1.2.3.4 ssh-ed25519 ${HKEY}`;
|
|
224
|
+
assert.equal(knownHostsHasKey(file, 'box-x.dev.example.com', EXPECTED), true);
|
|
225
225
|
});
|
|
226
226
|
|
|
227
227
|
t('no hostname → false (fail-closed)', () => {
|
|
@@ -58,7 +58,7 @@ const {
|
|
|
58
58
|
// SANDBOX-FOR-EVERYONE (ADR 0052, task #1001 — Lars, 2026-06-13): the PRODUCT/game
|
|
59
59
|
// code is now in the starter scope too — `src/world`, `src/rooms`, and the
|
|
60
60
|
// `public/` game client — so EVERY box (not just Metic+ full-clone boxes) can run
|
|
61
|
-
// the live sandbox (sandbox-<login>.
|
|
61
|
+
// the live sandbox (sandbox-<login>.example.com, ADR 0044). The box serves
|
|
62
62
|
// the game from a GAME-ONLY entry (src/preview-server.js) that never mounts
|
|
63
63
|
// /api/gds, so the privacy boundary that matters for a PUBLIC sandbox URL is the
|
|
64
64
|
// RUNTIME (what the box process exposes), NOT source exclusion. That is consistent
|
|
@@ -96,7 +96,7 @@ function provisionFloor() { return process.env.BOX_PROVISION_MIN_RANK || 'xenos'
|
|
|
96
96
|
// metadata), [::1], *.local/*.internal — so a builder could make the prod server
|
|
97
97
|
// probe arbitrary internal endpoints. A legitimate terminal URL is ALWAYS one of
|
|
98
98
|
// exactly two shapes (see cf-tunnel.js terminalHostname + the quick-tunnel
|
|
99
|
-
// default): the named tunnel `term-<login>.<zone>` under
|
|
99
|
+
// default): the named tunnel `term-<login>.<zone>` under example.com, or a
|
|
100
100
|
// Cloudflare quick tunnel `*.trycloudflare.com`. We bind the named form to the
|
|
101
101
|
// CALLER's own login so one builder can't even name another's terminal host.
|
|
102
102
|
// PURE + exported for unit tests (no network, no DB).
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Discord reaction → Archon approval (task 1100).
|
|
4
4
|
//
|
|
5
5
|
// An Archon's 👍/👎 on a request line in #member-approvals fires the SAME server
|
|
6
|
-
// action the
|
|
6
|
+
// action the example hall fires:
|
|
7
7
|
// #member-approvals 👍 → access_requests → 'invited' (PATCH /access-requests/:id)
|
|
8
8
|
// 👎 → access_requests → 'dismissed'
|
|
9
9
|
//
|
|
@@ -125,7 +125,7 @@ function workerModelFor(kind, graderModel, builderModel) {
|
|
|
125
125
|
|
|
126
126
|
// The instance's project name, injected into the grader's identity line so a
|
|
127
127
|
// non-OTB Cloud Bongos instance is graded against ITS OWN project, never a
|
|
128
|
-
// hardcoded "
|
|
128
|
+
// hardcoded "Example World" (ADR 0062 §3/§5; the branding contract's
|
|
129
129
|
// llmProjectName field). Reached through the doorway like every other host-
|
|
130
130
|
// context read in this module — never a deep core require. Resolved once at
|
|
131
131
|
// module load (the brand is a per-process singleton); falls back to a neutral
|
|
@@ -22,7 +22,7 @@ Your job is to FIND WHAT IS WRONG with this change. **The default verdict is FAI
|
|
|
22
22
|
Begin by hunting for these specific failure modes. When you find one, CITE the diff line or name the failing acceptance criterion:
|
|
23
23
|
|
|
24
24
|
- TODOs, FIXMEs, "for now", "temporary" or "stub" comments left in shipped code.
|
|
25
|
-
- Hardcoded shortcuts: assuming one builder, one user, one project root, one tenant, one environment, or one identity. Look for literal "lars", "
|
|
25
|
+
- Hardcoded shortcuts: assuming one builder, one user, one project root, one tenant, one environment, or one identity. Look for literal "lars", "example-owner", absolute /Users paths, hardcoded ports, hardcoded IDs.
|
|
26
26
|
- Scope gaps: acceptance criteria in the description that the diff DOES NOT satisfy. Read the description's "Acceptance" section line by line.
|
|
27
27
|
- Demo / dummy / mock code that lies: returns a fixed value, fakes a successful result, mocks at the wrong layer, or pretends to call something it doesn't.
|
|
28
28
|
- Missing tests for new logic: any non-trivial new function, route handler, branch, or aggregation that ships without a covering test.
|
|
@@ -31,7 +31,7 @@ You do NOT score whether the description was implemented — that's the Narc's j
|
|
|
31
31
|
You begin by hunting for these specific failure modes. When you find one, CITE the diff line or quote the offending code:
|
|
32
32
|
|
|
33
33
|
- TODOs, FIXMEs, "for now", "temporary" or "stub" comments left in shipped code.
|
|
34
|
-
- Hardcoded shortcuts assuming one builder, one user, one project root, one tenant. Look for literal "lars", "
|
|
34
|
+
- Hardcoded shortcuts assuming one builder, one user, one project root, one tenant. Look for literal "lars", "example-owner", absolute /Users paths, hardcoded ports, hardcoded IDs that should be lookups.
|
|
35
35
|
- Dead code: helpers, exports, branches, or files added but never called from anywhere in the post-merge tree. Use Read on the receiving site if unsure.
|
|
36
36
|
- Broken invariants: methodology rules in CLAUDE.md (the "every change is backed by a claimed GDS task" rule, no-hardcoded-Archon-identity per V3.R12, server-enforced permissions per ADR 0016), cross-verified Python/JS lookups, ground-vs-object cell split per ADR 0012.
|
|
37
37
|
- Missing tests for new logic: any non-trivial new function, route handler, branch, or aggregation that ships without a covering test.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"key": "hall-ui",
|
|
3
3
|
"title": "Builders' Hall",
|
|
4
|
-
"description": "The authenticated builders' hall served at builders.<apex> (builders.
|
|
4
|
+
"description": "The authenticated builders' hall served at builders.<apex> (builders.example.com) — the roster, work board, standing/karma, leaderboard, achievements, primer, system maps, settings, dev-box pair page, and the Archon-only watch/harbor/gate pages, all polling /api/gds/* and the read-only /api/gds/public/* surface. The largest WEB-SURFACE core-domain module (~13k LOC), carved out of the GDS core in BV1.R85 (ADR 0093 §1; 02-module-map §6). default-on: a Cloud Bongos instance ships its hall like it ships its status page. Registers no port and contributes no routes — it declares a webSurface (host prefix + static dir). Unlike the generic status surface, the hall keeps its dedicated serving block in serve-internal.js (the builders.<apex> + apex /builders/* shim, canonical redirects, the citizen/Archon page gates, asset-stamping, and the module hall-widget injection) — the webSurfaces declaration is the discovery + scope-map + window.__MODULES__ record; serve-internal serves it from this module's public/ dir with that richer machinery. The me/public/leaderboard read endpoints it renders stay SHARED core in routes/{me,public,builders}.js (the status surface + the off-box mirror read them too).",
|
|
5
5
|
"coreVersion": "^1.11.0",
|
|
6
6
|
"default": true,
|
|
7
7
|
"maintenance": { "status": "core-maintained" },
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
// BV1.R75 (ADR 0062 §4): drive the hall index page's chrome — <title>, <h1>, and
|
|
42
42
|
// meta description — from the branding pack so the reskin reaches the browser tab,
|
|
43
43
|
// not just the page body. copy.hallName is the hall's name ("Builders' Hall");
|
|
44
|
-
// identity.productName / worldName is the instance ("
|
|
44
|
+
// identity.productName / worldName is the instance ("Example World" / "Example").
|
|
45
45
|
// The static markup is the no-JS / pre-load fallback. SCOPED to the hall index via
|
|
46
46
|
// the #hall-h1 marker: the other hall pages (sessions/watch/work) carry their own
|
|
47
47
|
// page-specific titles + headings and must keep them — gating on #hall-h1 leaves
|
|
@@ -354,7 +354,7 @@
|
|
|
354
354
|
if (!el) return;
|
|
355
355
|
// Apex origin for external links (the API docs live on the apex, not this
|
|
356
356
|
// builders./status. subdomain). Derived from the current host so it's correct
|
|
357
|
-
// on any instance (
|
|
357
|
+
// on any instance (example.com, cloudbongos.com, localhost).
|
|
358
358
|
var APEX_ORIGIN = window.location.origin.replace('://builders.', '://').replace('://status.', '://');
|
|
359
359
|
// Instance product/world name for the "back to home" wayfinding link — same
|
|
360
360
|
// source renderFoot() uses, so the core carries no hardcoded identity.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// public-builders/work.js — the Work Board (/builders/work, served at
|
|
2
|
-
// builders.
|
|
2
|
+
// builders.example.com/work).
|
|
3
3
|
//
|
|
4
4
|
// Signed-in builders only. The page is the builder-facing SOURCE OF TRUTH for
|
|
5
5
|
// "works in progress"; it gathers two views the hall + status dashboard used to
|
|
@@ -70,7 +70,7 @@ const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
|
70
70
|
|
|
71
71
|
// The merge-bot git identity, derived from the instance branding pack so a non-OTB
|
|
72
72
|
// Cloud Bongos instance signs its auto-resolved merge commits with ITS OWN name +
|
|
73
|
-
// apex, never a hardcoded "
|
|
73
|
+
// apex, never a hardcoded "Example World GDS" / "example.com" (ADR 0062 §3/§5;
|
|
74
74
|
// the branding contract). Falls back to a neutral identity if branding fails to
|
|
75
75
|
// resolve so the resolver never crashes on a config error. NEVER a real person.
|
|
76
76
|
function botIdentity() {
|
|
@@ -234,7 +234,7 @@ async function gradeByBuilder(days = 30) {
|
|
|
234
234
|
}
|
|
235
235
|
|
|
236
236
|
// Public grade-trend timeline — array of { day, n, avg_score }. Powers a
|
|
237
|
-
// chart on status.
|
|
237
|
+
// chart on status.example.com.
|
|
238
238
|
|
|
239
239
|
async function gradeTrendByDay(days = 30) {
|
|
240
240
|
// A day whose rows are all outages keeps its row (n=0, avg_score NULL,
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// OWN curve; an Archon may read any builder's (the cross-builder aggregate
|
|
6
6
|
// is just every builder's own page, plus the ecosystem feed below).
|
|
7
7
|
// - GET /public/analytics/ecosystem — no auth. Ecosystem-wide aggregate with
|
|
8
|
-
// NO per-builder identity, for status.
|
|
8
|
+
// NO per-builder identity, for status.example.com. Individual curves
|
|
9
9
|
// never cross onto the open web (mirrors the public-task privacy gate).
|
|
10
10
|
//
|
|
11
11
|
// All data derives from existing columns (see db.builderAnalytics /
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// When a new-builder access request (access_requests, status='pending') needs an
|
|
4
4
|
// Archon's go-ahead, the GDS posts a one-line request to the Archon-only
|
|
5
5
|
// #member-approvals Discord channel so the Archon can approve it WITHOUT opening
|
|
6
|
-
// the
|
|
6
|
+
// the example hall.
|
|
7
7
|
//
|
|
8
8
|
// The Archon then 👍 (approve) or 👎 (decline) the message; the in-process bot's
|
|
9
9
|
// reaction handler (src/bongos/discord-approvals.js) re-derives the reactor's LIVE
|
|
@@ -295,7 +295,7 @@ function compactTranscript(turns) {
|
|
|
295
295
|
|
|
296
296
|
// The instance's project name, injected into the analysis prompt so a non-OTB
|
|
297
297
|
// Cloud Bongos instance onboards against ITS OWN project rather than a hardcoded
|
|
298
|
-
// "
|
|
298
|
+
// "Example World" (ADR 0062 §3/§5; the branding contract's llmProjectName field).
|
|
299
299
|
// Resolved LAZILY (inside the header builder, not at module load) so this module
|
|
300
300
|
// stays side-effect-free at require time — it is the *pure* half of the pipeline.
|
|
301
301
|
// Falls back to a neutral phrase if branding fails to resolve.
|
|
@@ -189,7 +189,7 @@ t('private/reserved addresses are recognized; public ones are not', () => {
|
|
|
189
189
|
'fe80::1', 'fd00::5', '::ffff:10.0.0.5', 'garbage']) {
|
|
190
190
|
assert.equal(liveness.isPrivateAddress(bad), true, `${bad} must be private/refused`);
|
|
191
191
|
}
|
|
192
|
-
for (const ok of ['93.184.216.34', '
|
|
192
|
+
for (const ok of ['93.184.216.34', '1.2.3.4', '2606:2800:220:1:248:1893:25c8:1946']) {
|
|
193
193
|
assert.equal(liveness.isPrivateAddress(ok), false, `${ok} must be public`);
|
|
194
194
|
}
|
|
195
195
|
});
|
|
@@ -738,7 +738,7 @@ composition A; landing composition v3, picked by the owner 2026-08-27. No roll,
|
|
|
738
738
|
<ul class="orbs" data-orbs>
|
|
739
739
|
<li class="orb-item o1">
|
|
740
740
|
<span class="orb-bead" aria-hidden="true"></span>
|
|
741
|
-
<span class="orb-name">
|
|
741
|
+
<span class="orb-name">Example World</span>
|
|
742
742
|
<span class="orb-meta">a game, 11 builders</span>
|
|
743
743
|
</li>
|
|
744
744
|
<li class="orb-item o2">
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_": "The all-null floor card (task 1003301) on the hub's own catalog (task 1003345): the same page, the same stub, the catalog aliased to featured-hub.json — the landing's three plus Tidewater, a null row nobody owns. Demo, the landing catalog's floor row, is owned by the signed-in stub, and an owned orb's plain click opens its manage view, never its card. Since task 1003352 it also carries the card BACKDROP state: featured-hub gives
|
|
2
|
+
"_": "The all-null floor card (task 1003301) on the hub's own catalog (task 1003345): the same page, the same stub, the catalog aliased to featured-hub.json — the landing's three plus Tidewater, a null row nobody owns. Demo, the landing catalog's floor row, is owned by the signed-in stub, and an owned orb's plain click opens its manage view, never its card. Since task 1003352 it also carries the card BACKDROP state: featured-hub gives Example World a card_backdrop, so the owner's plate can be seen standing in front of the project's own picture. Rendered by name: node modules/ui-design/kit/render.js --states public-landing/projects-floor.states.json",
|
|
3
3
|
"page": "/projects",
|
|
4
4
|
"surface": "public-landing",
|
|
5
5
|
"modes": [
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"actions": [
|
|
65
65
|
[
|
|
66
66
|
"dispatchClick",
|
|
67
|
-
"#orbField a.worldOrb[data-origin=\"https://
|
|
67
|
+
"#orbField a.worldOrb[data-origin=\"https://example.com\"]"
|
|
68
68
|
],
|
|
69
69
|
[
|
|
70
70
|
"wait",
|
|
@@ -53,12 +53,12 @@
|
|
|
53
53
|
"steps": [["press", "Escape"], ["wait", 150]],
|
|
54
54
|
"expect": { "dialog": false } },
|
|
55
55
|
{ "name": "the poster (task 1003301): art, five faces and +N, two figures on the art, the address, a member's hall door", "continue": true,
|
|
56
|
-
"steps": [["dispatchClick", "#orbField a.worldOrb[data-origin=\"https://
|
|
56
|
+
"steps": [["dispatchClick", "#orbField a.worldOrb[data-origin=\"https://example.com\"]"], ["wait", 900]],
|
|
57
57
|
"expect": { "dialog": true, "hasClass": [["#projCard", "has-art"]],
|
|
58
58
|
"visible": ["#cardArt", "#cardFaces", "#cardBuildersFig", "#cardShippedFig", "#cardOpen", "#cardHall"],
|
|
59
59
|
"count": [["#cardFaces img", 5], ["#projCard > div", 1]],
|
|
60
|
-
"text": [["#cardBuilders", "11"], ["#cardShipped", "0"], ["#cardRel", "you build here"], ["#cardRuns", "
|
|
61
|
-
"href": [["#cardHall", "https://builders.
|
|
60
|
+
"text": [["#cardBuilders", "11"], ["#cardShipped", "0"], ["#cardRel", "you build here"], ["#cardRuns", "example.com"], ["#cardFaces .facesMore", "+6"], ["#cardHall", "Builders' hall"]],
|
|
61
|
+
"href": [["#cardHall", "https://builders.example.com/"], ["#cardOpen", "https://example.com/"]] } },
|
|
62
62
|
{ "name": "the ladder: a project that answered nothing is the card that shipped before (disc, name, tagline, address, listed, one door)", "continue": true,
|
|
63
63
|
"steps": [["press", "Escape"], ["wait", 150], ["dispatchClick", "#orbField a.worldOrb[data-origin=\"https://tidewater.cloudbongos.com\"]"], ["wait", 500]],
|
|
64
64
|
"expect": { "dialog": true, "hasClass": [["#projCard", "has-art", false]],
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
{ "name": "the table: the hall glyph rides the door cell on the one member row whose hall is elsewhere, and on the platform's row", "continue": true,
|
|
77
77
|
"steps": [["press", "Escape"], ["wait", 150], ["click", "#projTrig"], ["wait", 120], ["click", "a[data-sub=\"table\"]"], ["wait", 300]],
|
|
78
78
|
"expect": { "dialog": false, "visible": ["#selfHall"], "count": [["#mapRows li[data-generated] .rowHall", 1], ["#mapRows li[data-generated] .facts", 7], ["#mapRows li[data-generated] .runs", 7], ["#mapRows li[data-generated] .rowDoors", 7]],
|
|
79
|
-
"href": [["#mapRows li[data-generated] .rowHall", "https://builders.
|
|
79
|
+
"href": [["#mapRows li[data-generated] .rowHall", "https://builders.example.com/"]] } },
|
|
80
80
|
{ "name": "the table: the sort left the column head — the pills carry the order, and the sentence under the list states it (task 1003356)", "continue": true,
|
|
81
81
|
"steps": [["click", ".tblSort button[data-sort=\"builders\"]"], ["wait", 200]],
|
|
82
82
|
"expect": { "attr": [[".tblSort button[data-sort=\"builders\"]", "aria-pressed", "true"], [".tblSort button[data-sort=\"name\"]", "aria-pressed", "false"]],
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"ignoreControls": [".skip", ".vh"],
|
|
10
10
|
"states": {
|
|
11
11
|
"out-map": { "auth": false, "expect": { "expanded": false } },
|
|
12
|
-
"in-map": { "auth": true, "expect": { "expanded": false, "count": [["#orbField .worldOrb[data-shape][data-style]", 7]], "attr": [["#selfOrb", "data-template", "pair-chrome"], ["#orbField a.worldOrb[data-origin=\"https://
|
|
12
|
+
"in-map": { "auth": true, "expect": { "expanded": false, "count": [["#orbField .worldOrb[data-shape][data-style]", 7]], "attr": [["#selfOrb", "data-template", "pair-chrome"], ["#orbField a.worldOrb[data-origin=\"https://example.com\"]", "data-template", "bead-wash"], ["#orbField a.worldOrb[data-origin=\"https://demo.cloudbongos.com\"]", "data-shape", "pair"], ["#orbField a.worldOrb[data-origin=\"https://demo.cloudbongos.com\"]", "data-material", "obsidian"], ["#orbField a.worldOrb[data-origin=\"https://demo.cloudbongos.com\"]", "data-template", "pair-obsidian-tint"], ["#orbField a.worldOrb[data-origin=\"https://emersonian-circles.cloudbongos.com\"]", "data-template", "bead-obsidian-plain"]] } },
|
|
13
13
|
"in-map-projects": { "auth": true, "actions": [["click", "#projTrig"], ["wait", 350]], "expect": { "expanded": true, "open": "#menuProjects" } },
|
|
14
14
|
"in-map-profile": { "auth": true, "actions": [["click", "#who"], ["wait", 350]], "expect": { "expanded": true, "open": "#menuProfile" } },
|
|
15
15
|
"in-map-kbd": { "auth": true, "actions": [["focus", "#projTrig"], ["press", "Enter"], ["wait", 350], ["press", "ArrowDown"], ["wait", 120]], "expect": { "expanded": true, "activeText": "Table" } },
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"in-new-done": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500]], "expect": {"visible":["#panel-done","#liveProgress .prog","#humanSteps li"],"hidden":["#panel-review","#qWrap"]} },
|
|
41
41
|
"in-new-resume-offer": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500],["click","#projTrig"],["wait",350],["click","#menuProjects [data-nav=\"new\"]"],["wait",500]], "expect": {"visible":["#panel-name","#wizResume","#wizResumeGo"],"hidden":["#panel-done"],"text":[["#wizResumeName","Mercury"]]} },
|
|
42
42
|
"out-map-projects": { "auth": false, "actions": [["click", "#projTrig"], ["wait", 350]], "expect": { "expanded": true, "hidden": ["#menuProjects [data-nav=\"mine\"]"] } },
|
|
43
|
-
"card": { "auth": true, "actions": [["dispatchClick", "#orbField a.worldOrb[data-origin=\"https://
|
|
43
|
+
"card": { "auth": true, "actions": [["dispatchClick", "#orbField a.worldOrb[data-origin=\"https://example.com\"]"], ["wait", 900]], "expect": { "dialog": true, "hasClass": [["#projCard", "has-art"]], "visible": ["#cardArt", "#cardFaces", "#cardBuildersFig", "#cardShippedFig", "#cardOpen", "#cardHall"], "text": [["#cardBuilders", "11"], ["#cardShipped", "0"], ["#cardRel", "you build here"], ["#cardRuns", "example.com"], ["#cardFaces .facesMore", "+6"]], "count": [["#cardFaces img", 5]], "href": [["#cardHall", "https://builders.example.com/"]] } },
|
|
44
44
|
"card-noart": { "auth": true, "actions": [["dispatchClick", "#orbField a.worldOrb[data-origin=\"https://emersonian-circles.cloudbongos.com\"]"], ["wait", 600]], "expect": { "dialog": true, "hasClass": [["#projCard", "has-art", false]], "hidden": ["#cardArt", "#cardFaces", "#cardHall"], "visible": ["#cardBuildersFig", "#cardShippedFig", "#cardOpen"], "text": [["#cardShipped", "30+"], ["#cardRel", "you build here"]] } },
|
|
45
45
|
"card-self": { "auth": true, "actions": [["dispatchClick", "#selfOrb"], ["wait", 600]], "expect": { "dialog": true, "hidden": ["#cardArt"], "visible": ["#cardBuildersFig", "#cardShippedFig", "#cardFaces", "#cardOpen", "#cardHall"], "text": [["#cardRel", "yours"]] } }
|
|
46
46
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"key": "status-ui",
|
|
3
3
|
"title": "Status dashboard (\"The Watch\")",
|
|
4
|
-
"description": "The public build-status dashboard served at status.<apex> (status.
|
|
4
|
+
"description": "The public build-status dashboard served at status.<apex> (status.example.com) — the live up/down banner, version-progress rollups, cost summary, recent ships, leaderboard, and the ecosystem fingerprint, all polling the read-only /api/gds/public/* surface every 60s. A WEB-SURFACE core-domain module carved out of the GDS core in BV1.R84 (ADR 0093 §1; 02-module-map §6 — a web surface is first-class). default-on: a Cloud Bongos instance ships its status page like it ships its hall. Registers no port and contributes no routes — it declares a webSurface (host prefix + static dir) the loader hands serve-internal, which serves the module's public/ dir on the matching host exactly as it served public-status/ before. The public read endpoints it renders stay SHARED core in routes/public.js (the hall + the off-box mirror read them too).",
|
|
5
5
|
"coreVersion": "^1.11.0",
|
|
6
6
|
"default": true,
|
|
7
7
|
"maintenance": { "status": "core-maintained" },
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
// status.
|
|
1
|
+
// status.example.com — public dashboard JS.
|
|
2
2
|
// Polls /api/bongos/public/* every 60 seconds. No auth, no SPA framework.
|
|
3
3
|
|
|
4
4
|
// API base for the public read endpoints (#737). Empty = same-origin, the case
|
|
5
|
-
// when this file is served by the droplet itself (status.
|
|
5
|
+
// when this file is served by the droplet itself (status.example.com
|
|
6
6
|
// proxies /api/* to the same Node process). The OFF-BOX GitHub Pages mirror
|
|
7
7
|
// (the owner's status-mirror repo, ADR 0029) injects window.STATUS_API_BASE =
|
|
8
|
-
// 'https://
|
|
8
|
+
// 'https://example.com' in its <head> so the same byte-identical file
|
|
9
9
|
// fetches cross-origin from the droplet there (CORS is open). Keeping this file
|
|
10
10
|
// identical on both hosts is what lets the mirror sync be a pure copy.
|
|
11
11
|
const API = (typeof window !== 'undefined' && window.STATUS_API_BASE) || '';
|
|
@@ -1275,7 +1275,7 @@ document.addEventListener('visibilitychange', () => {
|
|
|
1275
1275
|
|
|
1276
1276
|
// ---------- deep-link resolver (#654) ----------
|
|
1277
1277
|
// A bare doc ref like "#173" links into the Builders' Hall, but a viewer can also
|
|
1278
|
-
// land on the PUBLIC status dashboard at status.
|
|
1278
|
+
// land on the PUBLIC status dashboard at status.example.com/#/idea/173 (or
|
|
1279
1279
|
// /#/task/N, /#/blocker/N). Resolve it to a MINIMAL card — id + status + type
|
|
1280
1280
|
// only; an idea/blocker title is NEVER shown here (the public endpoints withhold
|
|
1281
1281
|
// it), and a task title only when the projection already marked it public
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* status.
|
|
1
|
+
/* status.example.com — public ledger of an ancient-Greek city.
|
|
2
2
|
Form factor: weathered marble + parchment, Cinzel inscription headings,
|
|
3
3
|
EB Garamond body. Square corners, hairline double-rules, no SaaS softness.
|
|
4
4
|
Palette stays inside the locked Mediterranean range. */
|