@bongos/core 1.21.113 → 1.21.115
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 +608 -188
- package/.claude/skills/ask-for-help/SKILL.md +1 -1
- package/.claude/skills/bongos-feedback/SKILL.md +1 -1
- package/.claude/skills/builder-sequence/SKILL.md +1 -1
- package/.claude/skills/builder-ship/SKILL.md +1 -0
- package/GOVERNMENT.md +128 -11
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +28 -0
- package/clients/bongos-client/index.cjs +28 -0
- package/clients/bongos-client/index.d.ts +45 -2
- package/clients/bongos-client/index.mjs +28 -0
- package/docs/adr/0372-an-ask-is-stored-per-docket-matter-and-the-server-refuses-slop.md +33 -0
- package/docs/adr/0373-an-ai-session-files-a-blocker-with-an-ask.md +31 -0
- package/docs/adr/0374-a-building-lead-is-a-held-position-appointed-by-a-people-matter.md +30 -0
- package/docs/adr/0375-who-may-build-without-a-vote-comes-from-the-form-of-government.md +38 -0
- package/docs/adr/0376-every-ask-is-routed-to-a-real-seat-on-the-server.md +30 -0
- package/docs/adr/0377-governance-is-a-held-position-read-on-me.md +24 -0
- package/docs/adr/0378-a-leads-build-outs-are-rows-built-at-once-or-by-a-passed-vote.md +33 -0
- package/docs/adr/0379-the-treasury-is-pots-per-goal-a-reserve-and-borrowing-over-real-spend.md +32 -0
- package/docs/adr/0380-a-strictness-preset-is-a-bundle-of-laws-switched-by-one-laws-vote.md +26 -0
- package/docs/adr/README.md +10 -1
- package/docs/api/openapi.json +989 -87
- package/docs/api-reference.md +18 -4
- package/docs/copy-inventory.md +709 -626
- package/docs/copy-registry.json +1673 -858
- package/docs/file-map.md +2 -1
- package/docs/module-api-changelog.md +4 -0
- package/docs/packs/engineer.md +2 -1
- package/docs/page-inventory.json +91 -6
- package/docs/page-readings.json +4875 -4748
- package/modules/builder-settings/law-locks.js +202 -0
- package/modules/builder-settings/routes/settings.js +66 -6
- package/modules/builder-settings/settings.js +7 -0
- package/modules/discord/ship-broadcast.js +22 -13
- package/modules/government/asks-db.js +54 -0
- package/modules/government/asks.js +269 -0
- package/modules/government/board-idea-reads.js +68 -0
- package/modules/government/board.js +21 -57
- package/modules/government/build-rights.js +148 -0
- package/modules/government/buildouts.js +160 -0
- package/modules/government/counts.js +81 -0
- package/modules/government/db.js +242 -0
- package/modules/government/decision-board.js +234 -8
- package/modules/government/decision-rules.js +2 -0
- package/modules/government/docket.js +114 -6
- package/modules/government/law-board.js +131 -0
- package/modules/government/laws.js +241 -0
- package/modules/government/leads.js +170 -0
- package/modules/government/migrations/government_027_laws.sql +143 -0
- package/modules/government/migrations/government_028_asks.sql +57 -0
- package/modules/government/migrations/government_029_leads.sql +135 -0
- package/modules/government/migrations/government_030_buildouts.sql +111 -0
- package/modules/government/migrations/government_031_treasury.sql +107 -0
- package/modules/government/module.json +2 -1
- package/modules/government/pollers/treasury-borrow.js +62 -0
- package/modules/government/positions.js +107 -0
- package/modules/government/presets.js +149 -0
- package/modules/government/routes/government.js +425 -2
- package/modules/government/routing.js +154 -0
- package/modules/government/treasury-db.js +166 -0
- package/modules/government/treasury.js +241 -0
- package/modules/hall-ui/public/atlas.html +2 -2
- package/modules/hall-ui/public/blockers.html +2 -2
- package/modules/hall-ui/public/board-room.html +2 -2
- package/modules/hall-ui/public/board-room.js +2 -0
- package/modules/hall-ui/public/city-draw.js +604 -11
- package/modules/hall-ui/public/city.css +157 -1
- package/modules/hall-ui/public/city.html +37 -7
- package/modules/hall-ui/public/city.js +441 -21
- package/modules/hall-ui/public/city.states.json +110 -5
- package/modules/hall-ui/public/collab.html +2 -2
- package/modules/hall-ui/public/commands.html +2 -2
- package/modules/hall-ui/public/copy-desk.html +2 -2
- package/modules/hall-ui/public/craft-mode.js +112 -29
- package/modules/hall-ui/public/deploy.html +2 -2
- package/modules/hall-ui/public/diagram-viewer.css +12 -0
- package/modules/hall-ui/public/diagram-viewer.js +4 -0
- package/modules/hall-ui/public/diagrams.html +2 -2
- package/modules/hall-ui/public/drachmae.html +2 -2
- package/modules/hall-ui/public/fleet.html +2 -2
- package/modules/hall-ui/public/gate.html +2 -2
- package/modules/hall-ui/public/goal-map.html +2 -2
- package/modules/hall-ui/public/goals.html +2 -2
- package/modules/hall-ui/public/gov-feeds.js +141 -0
- package/modules/hall-ui/public/gov-living.js +1002 -0
- package/modules/hall-ui/public/gov-positions.js +97 -0
- package/modules/hall-ui/public/government.html +2 -2
- package/modules/hall-ui/public/hall-render.js +3 -0
- package/modules/hall-ui/public/idea.html +2 -2
- package/modules/hall-ui/public/ideas.html +2 -2
- package/modules/hall-ui/public/index.html +3 -3
- package/modules/hall-ui/public/modules.html +2 -2
- package/modules/hall-ui/public/my-agents.css +334 -0
- package/modules/hall-ui/public/my-agents.html +72 -0
- package/modules/hall-ui/public/my-agents.js +603 -0
- package/modules/hall-ui/public/my-agents.states.json +37 -0
- package/modules/hall-ui/public/primer.html +2 -2
- package/modules/hall-ui/public/profile-connections.js +40 -28
- package/modules/hall-ui/public/profile.html +2 -2
- package/modules/hall-ui/public/project-settings.html +2 -2
- package/modules/hall-ui/public/ranks.html +2 -2
- package/modules/hall-ui/public/roadmap.html +2 -2
- package/modules/hall-ui/public/room.css +8 -0
- package/modules/hall-ui/public/roster.html +2 -2
- package/modules/hall-ui/public/sessions.html +2 -2
- package/modules/hall-ui/public/settings.html +2 -2
- package/modules/hall-ui/public/shell.js +116 -16
- package/modules/hall-ui/public/street-card.js +18 -1
- package/modules/hall-ui/public/street-deck.css +299 -0
- package/modules/hall-ui/public/street-deck.js +1145 -0
- package/modules/hall-ui/public/street-depth.js +712 -0
- package/modules/hall-ui/public/street-desk.js +5 -2
- package/modules/hall-ui/public/street-draw.js +109 -16
- package/modules/hall-ui/public/street-inside.js +137 -22
- package/modules/hall-ui/public/street-office.js +705 -0
- package/modules/hall-ui/public/street.css +161 -11
- package/modules/hall-ui/public/street.html +41 -11
- package/modules/hall-ui/public/street.js +78 -66
- package/modules/hall-ui/public/street.states.json +129 -21
- package/modules/hall-ui/public/studio.html +2 -2
- package/modules/hall-ui/public/style.css +5 -1
- package/modules/hall-ui/public/task.html +2 -2
- package/modules/hall-ui/public/thinking.html +2 -2
- package/modules/hall-ui/public/tweak-editor.html +2 -2
- package/modules/hall-ui/public/watch.html +2 -2
- package/modules/hall-ui/public/watch.js +14 -1
- package/modules/hall-ui/public/work.html +2 -2
- package/modules/hall-ui/records/living-city.md +57 -0
- package/modules/hall-ui/records/my-agents.md +21 -0
- package/modules/hall-ui/records/oversight-family.md +1 -0
- package/modules/hall-ui/records/profile-connections.md +10 -0
- package/modules/hall-ui/records/reading-rooms.md +2 -0
- package/modules/ideas/routes/blockers.js +92 -3
- package/modules/lifecycle/module.json +2 -1
- package/modules/lifecycle/moving.js +17 -1
- package/modules/lifecycle/routes/moving.js +6 -0
- package/modules/lifecycle/routes/project-settings.js +23 -0
- package/modules/onboarding/approval-broadcast.js +8 -0
- package/modules/onboarding/routes/access-requests.js +16 -6
- package/modules/platform-identity/connections.js +13 -2
- package/modules/platform-identity/routes/connections.js +7 -1
- package/modules/public-landing/public/account-private.states.json +2 -2
- package/modules/public-landing/public/account.html +65 -5
- package/modules/public-landing/public/account.states.json +3 -3
- package/modules/public-landing/public/assets/world/r2-bongos-chrome-b.jpg.json +1 -1
- package/modules/public-landing/public/assets/world/r2-bongos-chrome-b.webp +0 -0
- package/modules/public-landing/public/assets/world/r2-bongos-chrome-b.webp.json +13 -0
- package/modules/public-landing/public/assets/world/r2-chrome-blob-one.jpg.json +1 -1
- package/modules/public-landing/public/assets/world/r2-chrome-blob-one.webp +0 -0
- package/modules/public-landing/public/assets/world/r2-chrome-blob-one.webp.json +13 -0
- package/modules/public-landing/public/assets/world/r2-chrome-blobs-set.jpg.json +1 -1
- package/modules/public-landing/public/assets/world/r2-chrome-blobs-set.webp +0 -0
- package/modules/public-landing/public/assets/world/r2-chrome-blobs-set.webp.json +13 -0
- package/modules/public-landing/public/assets/world.css +4 -4
- package/modules/public-landing/public/connections-empty.states.json +14 -0
- package/modules/public-landing/public/connections-inactive.states.json +14 -0
- package/modules/public-landing/public/connections.html +450 -0
- package/modules/public-landing/public/connections.probes.json +414 -0
- package/modules/public-landing/public/connections.states.json +17 -0
- package/modules/public-landing/public/contact.html +2 -2
- package/modules/public-landing/public/guild.html +2 -2
- package/modules/public-landing/public/index.html +2 -2
- package/modules/public-landing/public/invitations.html +2 -2
- package/modules/public-landing/public/privacy.html +2 -2
- package/modules/public-landing/public/projects-hall-live.states.json +0 -5
- package/modules/public-landing/public/projects.html +169 -6
- package/modules/public-landing/public/projects.probes.json +10 -6
- package/modules/public-landing/public/projects.states.json +13 -13
- package/modules/public-landing/public/terms.html +2 -2
- package/modules/ui-design/kit/fixtures/connections-empty.json +12 -0
- package/modules/ui-design/kit/fixtures/connections-inactive.json +7 -0
- package/modules/ui-design/kit/fixtures/connections.json +22 -0
- package/modules/ui-design/kit/serve.js +95 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +128 -0
- package/scripts/discord/README.md +8 -5
- package/scripts/discord/post.js +12 -1
- package/scripts/gds/artifact-audit.js +20 -3
- package/scripts/gds/ask.js +164 -0
- package/scripts/gds/autobongos-verify.js +21 -2
- package/scripts/gds/government-walk.js +638 -4
- package/scripts/gds/pulse.js +9 -6
- package/scripts/gds/ship-escalation.js +22 -3
- package/scripts/gds/ship-finish.js +5 -4
- package/scripts/gds/ship-merge-gate.js +18 -6
- package/scripts/hall-preview/README.md +41 -1
- package/scripts/hall-preview/pref-writes.js +140 -0
- package/scripts/hall-preview/refresh-fixtures.js +101 -7
- package/scripts/hall-preview/scrub-identity.js +366 -7
- package/scripts/hall-preview/server.js +27 -1
- package/scripts/render-diagrams.sh +4 -2
- package/src/bongos/auth-idp.js +6 -1
- package/src/bongos/project-settings.js +41 -0
- package/src/bongos/route-rank-check.js +27 -0
- package/src/bongos/routes/me.js +68 -7
- package/src/bongos/serve-internal.js +5 -1
- package/src/module-api.js +7 -1
- package/src/platform-server.js +10 -0
- package/tests/application_lifecycle.mjs +47 -5
- package/tests/conductor_main_e2e.mjs +21 -0
- package/tests/connections_api.mjs +18 -0
- package/tests/craft_mode_nav.mjs +5 -3
- package/tests/craft_mode_tallies.mjs +52 -16
- package/tests/discord_approvals.mjs +11 -0
- package/tests/discord_channels.mjs +20 -0
- package/tests/fixtures/gov-seated.mjs +64 -0
- package/tests/fixtures/government-ask-cards.json +1284 -0
- package/tests/government_act_alone_buildings.mjs +1 -0
- package/tests/government_agent_asks.mjs +322 -0
- package/tests/government_asks.mjs +408 -0
- package/tests/government_build_rights.mjs +253 -0
- package/tests/government_buildouts.mjs +382 -0
- package/tests/government_counts.mjs +143 -0
- package/tests/government_decision_rules.mjs +5 -1
- package/tests/government_laws.mjs +488 -0
- package/tests/government_laws_session.mjs +321 -0
- package/tests/government_leads.mjs +375 -0
- package/tests/government_positions.mjs +127 -0
- package/tests/government_presets.mjs +215 -0
- package/tests/government_routes.mjs +8 -1
- package/tests/government_routing.mjs +118 -0
- package/tests/government_seed.mjs +5 -0
- package/tests/government_treasury.mjs +394 -0
- package/tests/governor_docket.mjs +26 -2
- package/tests/hall_buildouts.mjs +208 -0
- package/tests/hall_city.mjs +14 -6
- package/tests/hall_city_living.mjs +617 -0
- package/tests/hall_gov_counts.mjs +336 -0
- package/tests/hall_gov_living.mjs +636 -0
- package/tests/hall_gov_real_site.mjs +655 -0
- package/tests/hall_matter_card.mjs +6 -1
- package/tests/hall_my_agents.mjs +481 -0
- package/tests/hall_nav.mjs +107 -4
- package/tests/hall_page_gate_map.mjs +4 -0
- package/tests/hall_preview_governor_fixtures.mjs +30 -3
- package/tests/hall_preview_scrub.mjs +59 -1
- package/tests/hall_preview_security.mjs +169 -0
- package/tests/hall_reading_world.mjs +44 -0
- package/tests/hall_roster_world.mjs +6 -2
- package/tests/hall_street.mjs +18 -2
- package/tests/hall_street_amend.mjs +1 -1
- package/tests/hall_street_deck.mjs +609 -0
- package/tests/hall_street_depth.mjs +559 -0
- package/tests/hall_street_desk.mjs +1 -1
- package/tests/hall_street_inside.mjs +29 -5
- package/tests/hall_tweak_editor.mjs +4 -1
- package/tests/hub_account_page.mjs +94 -3
- package/tests/hub_connections_page.mjs +507 -0
- package/tests/hub_invite_badge.mjs +1 -1
- package/tests/idp_device_exchange.mjs +18 -0
- package/tests/landing_legal_pages.mjs +8 -5
- package/tests/landing_page.mjs +23 -4
- package/tests/nav_permission_atoms.mjs +4 -1
- package/tests/profile_connections_ui.mjs +88 -25
- package/tests/projects_hub.mjs +15 -0
- package/tests/projects_hub_pre_uat.mjs +4 -2
- package/tests/render_check.mjs +2 -2
- package/tests/ship_broadcast_routing.mjs +57 -16
- package/tests/ship_broadcast_server.mjs +40 -7
- package/tests/ship_merge_gate.mjs +19 -0
- package/tests/ui_design_kit.mjs +2 -2
- package/tests/watch_applications_queue.mjs +23 -0
- package/tests/wizard_physics.mjs +1 -1
- package/tests/wizard_physics_more.mjs +133 -0
|
@@ -59,6 +59,10 @@
|
|
|
59
59
|
"wait",
|
|
60
60
|
900
|
|
61
61
|
],
|
|
62
|
+
[
|
|
63
|
+
"clickIfVisible",
|
|
64
|
+
"[data-craft-close]"
|
|
65
|
+
],
|
|
62
66
|
[
|
|
63
67
|
"click",
|
|
64
68
|
"#fullscreen-toggle"
|
|
@@ -96,6 +100,10 @@
|
|
|
96
100
|
"wait",
|
|
97
101
|
900
|
|
98
102
|
],
|
|
103
|
+
[
|
|
104
|
+
"clickIfVisible",
|
|
105
|
+
"[data-craft-close]"
|
|
106
|
+
],
|
|
99
107
|
[
|
|
100
108
|
"click",
|
|
101
109
|
".street-pin"
|
|
@@ -120,6 +128,10 @@
|
|
|
120
128
|
"wait",
|
|
121
129
|
600
|
|
122
130
|
],
|
|
131
|
+
[
|
|
132
|
+
"clickIfVisible",
|
|
133
|
+
"[data-craft-close]"
|
|
134
|
+
],
|
|
123
135
|
[
|
|
124
136
|
"click",
|
|
125
137
|
"#streetMode"
|
|
@@ -329,13 +341,17 @@
|
|
|
329
341
|
},
|
|
330
342
|
"floor": {
|
|
331
343
|
"auth": true,
|
|
332
|
-
"_": "A floor picked: the lift slides to it, its frame and sign turn
|
|
344
|
+
"_": "A floor picked: the lift slides to it, its frame and sign turn ink (salmon is only what needs you, task 1004718), and its block re-enters with the sign large.",
|
|
333
345
|
"url": "/builders/street#building=people",
|
|
334
346
|
"actions": [
|
|
335
347
|
[
|
|
336
348
|
"wait",
|
|
337
349
|
900
|
|
338
350
|
],
|
|
351
|
+
[
|
|
352
|
+
"clickIfVisible",
|
|
353
|
+
"[data-craft-close]"
|
|
354
|
+
],
|
|
339
355
|
[
|
|
340
356
|
"click",
|
|
341
357
|
".inside-floor[data-floor=\"0\"]"
|
|
@@ -360,6 +376,10 @@
|
|
|
360
376
|
"wait",
|
|
361
377
|
900
|
|
362
378
|
],
|
|
379
|
+
[
|
|
380
|
+
"clickIfVisible",
|
|
381
|
+
"[data-craft-close]"
|
|
382
|
+
],
|
|
363
383
|
[
|
|
364
384
|
"click",
|
|
365
385
|
"#insideAmend"
|
|
@@ -399,8 +419,8 @@
|
|
|
399
419
|
},
|
|
400
420
|
"desk": {
|
|
401
421
|
"auth": true,
|
|
402
|
-
"_": "The floor desk (task 1004558):
|
|
403
|
-
"url": "/builders/street#building=
|
|
422
|
+
"_": "The floor desk (task 1004558): a building opens on the floor that needs you. Over the harness fixtures (the real site since task 1004717) that is Disputes, Security reports: the desk shows its sign, name and salmon status, the tiles, the to-do rows with their two buttons, and the record line; the street header carries the today meter.",
|
|
423
|
+
"url": "/builders/street#building=disputes",
|
|
404
424
|
"actions": [
|
|
405
425
|
[
|
|
406
426
|
"wait",
|
|
@@ -426,8 +446,8 @@
|
|
|
426
446
|
},
|
|
427
447
|
"desk-facts": {
|
|
428
448
|
"auth": true,
|
|
429
|
-
"_": "A row name tapped: at most three facts open in place under it.",
|
|
430
|
-
"url": "/builders/street#building=
|
|
449
|
+
"_": "A row name tapped (Disputes, Security reports): at most three facts open in place under it.",
|
|
450
|
+
"url": "/builders/street#building=disputes",
|
|
431
451
|
"actions": [
|
|
432
452
|
[
|
|
433
453
|
"wait",
|
|
@@ -458,8 +478,8 @@
|
|
|
458
478
|
},
|
|
459
479
|
"desk-quiet": {
|
|
460
480
|
"auth": true,
|
|
461
|
-
"_": "A quiet floor: one line with the lights on, never an empty list.",
|
|
462
|
-
"url": "/builders/street#building=
|
|
481
|
+
"_": "A quiet floor (People: nothing needs you over the harness fixtures): one line with the lights on, never an empty list.",
|
|
482
|
+
"url": "/builders/street#building=people",
|
|
463
483
|
"actions": [
|
|
464
484
|
[
|
|
465
485
|
"wait",
|
|
@@ -620,7 +640,7 @@
|
|
|
620
640
|
},
|
|
621
641
|
"desk-release-core": {
|
|
622
642
|
"auth": true,
|
|
623
|
-
"_": "Task 1004559: Release, Core update. Check first (a dry run); take it is offered only after the check passed for that version.",
|
|
643
|
+
"_": "Task 1004559: Release, Core update. Check first (a dry run); take it is offered only after the check passed for that version. The harness offers no core update, so the floor stands quiet: one line, never an empty list.",
|
|
624
644
|
"url": "/builders/street#building=release",
|
|
625
645
|
"actions": [
|
|
626
646
|
[
|
|
@@ -646,7 +666,8 @@
|
|
|
646
666
|
],
|
|
647
667
|
"expect": {
|
|
648
668
|
"visible": [
|
|
649
|
-
".desk-
|
|
669
|
+
".desk-quiet",
|
|
670
|
+
".desk-record"
|
|
650
671
|
]
|
|
651
672
|
}
|
|
652
673
|
},
|
|
@@ -766,7 +787,7 @@
|
|
|
766
787
|
},
|
|
767
788
|
"desk-planning-ideas": {
|
|
768
789
|
"auth": true,
|
|
769
|
-
"_": "Task 1004560: Planning, Ideas to ratify.
|
|
790
|
+
"_": "Task 1004560: Planning, Ideas to ratify. With a Full Idea in its vote it shows seat pips, a promise to ratify in one tap and a version chip; the harness holds none, so the floor stands quiet: one line, never an empty list.",
|
|
770
791
|
"url": "/builders/street#building=planning",
|
|
771
792
|
"actions": [
|
|
772
793
|
[
|
|
@@ -788,19 +809,12 @@
|
|
|
788
809
|
[
|
|
789
810
|
"wait",
|
|
790
811
|
600
|
|
791
|
-
],
|
|
792
|
-
[
|
|
793
|
-
"focus",
|
|
794
|
-
".desk-rows .desk-row:last-child .desk-name"
|
|
795
|
-
],
|
|
796
|
-
[
|
|
797
|
-
"wait",
|
|
798
|
-
300
|
|
799
812
|
]
|
|
800
813
|
],
|
|
801
814
|
"expect": {
|
|
802
815
|
"visible": [
|
|
803
|
-
".desk-
|
|
816
|
+
".desk-quiet",
|
|
817
|
+
".desk-record"
|
|
804
818
|
]
|
|
805
819
|
}
|
|
806
820
|
},
|
|
@@ -848,7 +862,7 @@
|
|
|
848
862
|
},
|
|
849
863
|
"pins": {
|
|
850
864
|
"auth": true,
|
|
851
|
-
"_": "The street over the
|
|
865
|
+
"_": "The street over the docket (task 1004569): one pin per building in the tier of its most important matter — urgent (needs you within a day) largest and pulsing, needs you salmon, moving small and ink, settled a grey dot — with a count where a building holds more than one open matter. Only urgent and needs-you pins show a label, and no two labels meet. Since task 1004705 salmon is only what waits on the viewer's own seat; the harness fixtures hold no ask on the viewer due within a day, so no pin is urgent here (as in the city).",
|
|
852
866
|
"actions": [
|
|
853
867
|
[
|
|
854
868
|
"wait",
|
|
@@ -866,7 +880,6 @@
|
|
|
866
880
|
"expect": {
|
|
867
881
|
"visible": [
|
|
868
882
|
"#streetBoard",
|
|
869
|
-
".street-pin--urgent",
|
|
870
883
|
".street-pin--needs",
|
|
871
884
|
".street-pin__badge"
|
|
872
885
|
]
|
|
@@ -913,6 +926,101 @@
|
|
|
913
926
|
"[data-act=\"page-next\"]"
|
|
914
927
|
]
|
|
915
928
|
}
|
|
929
|
+
},
|
|
930
|
+
"living": {
|
|
931
|
+
"auth": true,
|
|
932
|
+
"_": "The living street (task 1004685) over the harness fixtures alone (task 1004717 deleted the prototype overlay): the goals' skyline in two hazed rows behind the civic row, one pod per active claim on the skylanes and the road, the plates at street level (the hub seats no Lead, so every one reads owner), the salmon windows on the floors that hold what needs you, the readings as tiles and the deck behind \"to do\".",
|
|
933
|
+
"actions": [
|
|
934
|
+
[
|
|
935
|
+
"wait",
|
|
936
|
+
1500
|
|
937
|
+
],
|
|
938
|
+
[
|
|
939
|
+
"clickIfVisible",
|
|
940
|
+
"[data-craft-close]"
|
|
941
|
+
],
|
|
942
|
+
[
|
|
943
|
+
"wait",
|
|
944
|
+
300
|
|
945
|
+
]
|
|
946
|
+
],
|
|
947
|
+
"expect": {
|
|
948
|
+
"visible": [
|
|
949
|
+
"#streetDepthNear",
|
|
950
|
+
".street-depth-pod",
|
|
951
|
+
".street-depth-plate",
|
|
952
|
+
".street-depth-needs",
|
|
953
|
+
"#hudDeck"
|
|
954
|
+
],
|
|
955
|
+
"href": [
|
|
956
|
+
[
|
|
957
|
+
"#hudDeck",
|
|
958
|
+
"/builders/street#deck"
|
|
959
|
+
]
|
|
960
|
+
]
|
|
961
|
+
}
|
|
962
|
+
},
|
|
963
|
+
"deck": {
|
|
964
|
+
"auth": true,
|
|
965
|
+
"_": "The decision deck over the street (task 1004702, the glass language): the street stays in view under a light hush with the asking building clear, the card a glass panel beside its building with a hairline to its pin and a halo on it, two glass slivers for the cards to come, and the slim dock at the foot (count, today, the keys, back to the street). The harness's first ask has no stored ask, so it shows in its own words with its desk. On a phone (390, 320) the panel is a sheet from the foot and the dock gives way to the sheet's own skip and pass it on.",
|
|
966
|
+
"url": "/builders/street#deck",
|
|
967
|
+
"actions": [
|
|
968
|
+
[
|
|
969
|
+
"wait",
|
|
970
|
+
1500
|
|
971
|
+
],
|
|
972
|
+
[
|
|
973
|
+
"clickIfVisible",
|
|
974
|
+
"[data-craft-close]"
|
|
975
|
+
],
|
|
976
|
+
[
|
|
977
|
+
"wait",
|
|
978
|
+
400
|
|
979
|
+
]
|
|
980
|
+
],
|
|
981
|
+
"expect": {
|
|
982
|
+
"visible": [
|
|
983
|
+
"#streetDeck",
|
|
984
|
+
".deck-panel",
|
|
985
|
+
".gov-halo",
|
|
986
|
+
".ask__desk",
|
|
987
|
+
"#streetBoard"
|
|
988
|
+
]
|
|
989
|
+
}
|
|
990
|
+
},
|
|
991
|
+
"deck-treasury": {
|
|
992
|
+
"auth": true,
|
|
993
|
+
"_": "The Treasury's deck (task 1004702): the dry pot's real stored borrow ask, answered from the glass panel: three tap answers with their keys, the pick marked \"my pick\", the said line in the asker's voice, and the last line as a sentence.",
|
|
994
|
+
"url": "/builders/street#deck=treasury",
|
|
995
|
+
"actions": [
|
|
996
|
+
[
|
|
997
|
+
"wait",
|
|
998
|
+
1500
|
|
999
|
+
],
|
|
1000
|
+
[
|
|
1001
|
+
"clickIfVisible",
|
|
1002
|
+
"[data-craft-close]"
|
|
1003
|
+
],
|
|
1004
|
+
[
|
|
1005
|
+
"wait",
|
|
1006
|
+
400
|
|
1007
|
+
]
|
|
1008
|
+
],
|
|
1009
|
+
"expect": {
|
|
1010
|
+
"visible": [
|
|
1011
|
+
".deck-panel",
|
|
1012
|
+
".ask__opt",
|
|
1013
|
+
".ask__pick",
|
|
1014
|
+
".ask__said",
|
|
1015
|
+
".ask__foot"
|
|
1016
|
+
],
|
|
1017
|
+
"href": [
|
|
1018
|
+
[
|
|
1019
|
+
"#deckBack",
|
|
1020
|
+
"/builders/street#building=treasury"
|
|
1021
|
+
]
|
|
1022
|
+
]
|
|
1023
|
+
}
|
|
916
1024
|
}
|
|
917
1025
|
},
|
|
918
1026
|
"reducedMotion": {
|
|
@@ -189,8 +189,8 @@
|
|
|
189
189
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
190
190
|
|
|
191
191
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
192
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
193
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
192
|
+
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
193
|
+
<script src="/builders/shell.js?v=2026-10-10-hall-keys1"></script>
|
|
194
194
|
<script src="/builders/palette.js" defer></script>
|
|
195
195
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
196
196
|
<!-- The kit, for its ONE renderer: the full-size ship-time visual figure
|
|
@@ -1404,6 +1404,11 @@ html.craft-picker-open { overflow: hidden; }
|
|
|
1404
1404
|
.craft-picker__again input { width: 18px; height: 18px; margin: 0; accent-color: var(--accent); }
|
|
1405
1405
|
.craft-picker__hint { font-size: 13px; color: var(--ink-faint); }
|
|
1406
1406
|
.craft-picker__close:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
|
|
1407
|
+
/* task 1004685 (prototype): Governing is a held seat, so a builder with none sees
|
|
1408
|
+
three doors, not four (craft-mode.js stamps the count). */
|
|
1409
|
+
@media (min-width: 901px) {
|
|
1410
|
+
.craft-picker__doors[data-doors="3"] { grid-template-columns: repeat(3, minmax(0, 1fr)); }
|
|
1411
|
+
}
|
|
1407
1412
|
@media (max-width: 900px) {
|
|
1408
1413
|
.craft-picker__doors { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
1409
1414
|
}
|
|
@@ -2683,7 +2688,6 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
2683
2688
|
padding: 8px 10px; border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface-2);
|
|
2684
2689
|
}
|
|
2685
2690
|
.conn-req__note { flex: 1 1 100%; margin: 0; font-size: 13px; color: var(--ink-soft); }
|
|
2686
|
-
.conn-req__state { font-size: 13px; color: var(--ink-faint); }
|
|
2687
2691
|
.conn-req__acts { margin-left: auto; display: flex; gap: 6px; }
|
|
2688
2692
|
|
|
2689
2693
|
@media (max-width: 640px) {
|
|
@@ -55,8 +55,8 @@
|
|
|
55
55
|
<!-- The app shell (sidebar + top bar + footer). Dependency-free; runs at parse
|
|
56
56
|
time so the chrome exists before the deferred page scripts execute. -->
|
|
57
57
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
58
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
59
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
58
|
+
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
59
|
+
<script src="/builders/shell.js?v=2026-10-10-hall-keys1"></script>
|
|
60
60
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
61
61
|
<script src="/builders/palette.js" defer></script>
|
|
62
62
|
<!-- shared frontend toolkit (window.OTB) — loaded FIRST so task.js can pull from it. -->
|
|
@@ -139,8 +139,8 @@
|
|
|
139
139
|
</div>
|
|
140
140
|
|
|
141
141
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
142
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
143
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
142
|
+
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
143
|
+
<script src="/builders/shell.js?v=2026-10-10-hall-keys1"></script>
|
|
144
144
|
<script src="/builders/palette.js" defer></script>
|
|
145
145
|
|
|
146
146
|
<script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
|
|
@@ -143,8 +143,8 @@
|
|
|
143
143
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
144
144
|
|
|
145
145
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
146
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
147
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
146
|
+
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
147
|
+
<script src="/builders/shell.js?v=2026-10-10-hall-keys1"></script>
|
|
148
148
|
<script src="/builders/palette.js" defer></script>
|
|
149
149
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
150
150
|
<script src="/builders/brand-holes.js?v=2026-09-29-aqfix"></script>
|
|
@@ -166,8 +166,8 @@
|
|
|
166
166
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
167
167
|
chrome exists before the page script runs. -->
|
|
168
168
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
169
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
170
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
169
|
+
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
170
|
+
<script src="/builders/shell.js?v=2026-10-10-hall-keys1"></script>
|
|
171
171
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
172
172
|
<script src="/builders/palette.js" defer></script>
|
|
173
173
|
<!-- shared frontend toolkit (window.OTB) — loaded before watch.js, which pulls from it. -->
|
|
@@ -468,6 +468,17 @@
|
|
|
468
468
|
+ '</div>';
|
|
469
469
|
}
|
|
470
470
|
|
|
471
|
+
// The platform handle the vouch carried (ADR 0333 D5), for a vouched row that
|
|
472
|
+
// drew no profile (the hub was down or answered nothing, or the read was over
|
|
473
|
+
// the queue's cap). It is what the queue can still call the applicant, and
|
|
474
|
+
// nothing more. Plain text: the hub has no person page to link to yet. A row
|
|
475
|
+
// that drew its profile shows the live record instead, and an unvouched row
|
|
476
|
+
// has no handle at all.
|
|
477
|
+
function vouchedHandleHtml(r, drewProfile) {
|
|
478
|
+
if (!r.vouched || drewProfile || !r.applicant_handle) return '';
|
|
479
|
+
return `<span class="ov-row__when">On the platform as <span class="ov-mono">@${escapeHtml(r.applicant_handle)}</span></span>`;
|
|
480
|
+
}
|
|
481
|
+
|
|
471
482
|
// What this row still offers. A waiting request has two decisions; an admitted
|
|
472
483
|
// one can still be rescinded (until they sign in, after which the server
|
|
473
484
|
// refuses and says so); a declined one is terminal here — re-admitting is the
|
|
@@ -503,6 +514,7 @@
|
|
|
503
514
|
? `<span class="ov-row__when">${r.status === 'invited' ? 'Admitted' : 'Declined'} ${escapeHtml(fmtDate(r.resolved_at))}${by}</span>`
|
|
504
515
|
: '';
|
|
505
516
|
const actions = gateRowActions(r);
|
|
517
|
+
const profile = profileHtml(r.profile);
|
|
506
518
|
return (
|
|
507
519
|
`<li class="ov-row" data-req-id="${escapeHtml(r.id)}">` +
|
|
508
520
|
'<div class="ov-row__main">' +
|
|
@@ -511,9 +523,10 @@
|
|
|
511
523
|
// The applicant's own profile sits between what THEY wrote and what the
|
|
512
524
|
// SYSTEM knows — their words first, their record second, the decision
|
|
513
525
|
// facts last. Empty string when the server resolved nothing.
|
|
514
|
-
|
|
526
|
+
profile +
|
|
515
527
|
'<div class="ov-row__facts">' +
|
|
516
528
|
vouchPill(!!r.vouched) +
|
|
529
|
+
vouchedHandleHtml(r, !!profile) +
|
|
517
530
|
`<span class="ov-row__when">Asked ${escapeHtml(fmtDate(r.created_at))}</span>` +
|
|
518
531
|
decided +
|
|
519
532
|
'</div>' +
|
|
@@ -172,8 +172,8 @@
|
|
|
172
172
|
<!-- The app shell (sidebar + top bar + footer). Dependency-free; runs at parse
|
|
173
173
|
time so the chrome exists before the deferred page scripts execute. -->
|
|
174
174
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
175
|
-
<script src="/builders/craft-mode.js?v=2026-10-
|
|
176
|
-
<script src="/builders/shell.js?v=2026-10-
|
|
175
|
+
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
176
|
+
<script src="/builders/shell.js?v=2026-10-10-hall-keys1"></script>
|
|
177
177
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
178
178
|
<script src="/builders/palette.js" defer></script>
|
|
179
179
|
<!-- shared frontend toolkit (window.OTB) — loaded FIRST so work.js can pull from it. -->
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# The living city — /city, /street, the decision deck and the government inside each building (task 1004685, the living-city prototype)
|
|
2
|
+
|
|
3
|
+
Covers: `gov-living.js` (the model), `gov-feeds.js` (its one reader per page), `city.{html,js,css}` + `city-draw.js`, `street.{html,js,css}` + `street-draw.js` + `street-depth.js`, `street-deck.{js,css}`, `street-office.js`, the office storey in `street-inside.js`, and the Governing tally in `craft-mode.js`. My agents and the held-seat nav have their own record ([my-agents.md](my-agents.md)); the street's first build is [governor-street.md](governor-street.md). **It runs on real reads only** (task 1004717): the prototype overlay that once stood in for Leads, laws, pots, presets, build-outs and the human rewrite of each ask is deleted, with its harness fixture, its `data-proto` marks and its keys. A real project's city is complete on its own reads.
|
|
4
|
+
|
|
5
|
+
## The thesis, and the three levels
|
|
6
|
+
|
|
7
|
+
Government is how a project steers its AI. The city and the street draw that in three levels, each with one meaning: the **ground** is the work (one capsule-cluster district per open goal, hazed by depth; the spend conduit in the reserve blue, its width the real spend rate), the **civic** level is the nine buildings (height is structure: a Lead's capsule floor, then one per committee room and per floor a build-out put up, plug into the core), and the **sky** is the agents (one chrome pod per active claim on a lane to its goal's district, at a fixed spacing so they count).
|
|
8
|
+
|
|
9
|
+
## Where each thing comes from
|
|
10
|
+
|
|
11
|
+
| What the hall draws | The read |
|
|
12
|
+
|---|---|
|
|
13
|
+
| every docket matter, blocker and its words; the readings; how each building decides; the board and its sittings | `GET /government/docket`, `/blockers`, `/government/constitution` |
|
|
14
|
+
| who leads each building, their charter, and the owner seat on every unseated one: plates, cards, doors, the Lead's capsule floor | `GET /government/leads` (task 1004709) |
|
|
15
|
+
| what a building's holder may build without a vote | its `build_rights` (task 1004710) |
|
|
16
|
+
| construction (a live site going up, a ghost on its vote), committee rooms and built floors, the office's works | its `structure` (task 1004711, [ADR 0378](../../../docs/adr/0378-a-leads-build-outs-are-rows-built-at-once-or-by-a-passed-vote.md)) |
|
|
17
|
+
| the active claims (pods), the goals and their rollups (districts, skyline) | `GET /tasks/claimable`, `/goals`, `/goals/rollups` |
|
|
18
|
+
| this month's spend, the unattended budget, moving; the pots, the reserve, the spend cap (off: no limit) and a dry pot's borrow ask | `GET /public/cost-summary`, `/moving`, `GET /government/treasury` (task 1004712, [ADR 0379](../../../docs/adr/0379-the-treasury-is-pots-per-goal-a-reserve-and-borrowing-over-real-spend.md)) |
|
|
19
|
+
| the law book, and "the landing rule" the docket reads | `GET /government/laws` (task 1004706) |
|
|
20
|
+
| the laws every session reads and what each lock did to your settings | `GET /me` `laws` (task 1004707) |
|
|
21
|
+
| an ask's card | the matter's stored `ask` (task 1004703); a matter without one shows in its own words |
|
|
22
|
+
| who every matter waits on, so what is "to do" and what "waits on others"; an ask nobody answers settled with its own line; passing a stored ask on | the docket's `route` (task 1004705, [ADR 0376](../../../docs/adr/0376-every-ask-is-routed-to-a-real-seat-on-the-server.md)), `POST /government/asks/:matter/pass` |
|
|
23
|
+
| the strictness preset and a switch | `GET /government/presets`, `POST /government/board/presets` (task 1004715) |
|
|
24
|
+
| the five counts | `GET /government/counts` (task 1004716) |
|
|
25
|
+
|
|
26
|
+
`gov-living.js` labels every field `real`, `derived` or `mixed` in `_sources` — there is no other label — and `tests/hall_gov_living.mjs` walks the whole model to hold it to that, and proves an `overlay` handed in changes nothing. **A feed that is not read leaves its part empty, never invented**: without `GET /government/leads` no Lead, owner, office, build-out or right is drawn and no building is "led by" or "held by the owner"; without the treasury no pot, reserve or limit; without the presets no strip. **A concept no table holds is not drawn**: a Lead's deputies and a committee room's members (rooms stand, unpeopled), the "propose a law" chips (a law is proposed from My agents' "Make it a law", a real vote), and appointing a Lead from the hall (the route exists, `appoint_lead` through a People matter; no hall button files one yet).
|
|
27
|
+
|
|
28
|
+
**Who an ask waits on is routed on the server (task 1004705).** `GET /government/docket` routes every matter to a seat (`modules/government/routing.js`) and says `routed: true`; the hall takes `needs_you` and `waits_on` from the route. A docket that is not routed (an older server) falls back to whether the viewer holds the seat the real Leads resolve, else the docket's own per-viewer word. The hall-preview docket fixture is routed by the same rule (`tests/hall_preview_governor_fixtures.mjs`). Tests that need a seated government (Leads in office, a room, a build-out going up and one on its vote) build it in the routes' own shapes from `tests/fixtures/gov-seated.mjs` and route the docket to it by the server's rule; the past-asks corpus the ask tests use is `tests/fixtures/government-ask-cards.json`. The hall reads neither.
|
|
29
|
+
|
|
30
|
+
**The harness preview is the real site.** It serves the same reads production answers (the hub has seated no Lead, built nothing and passed no law, so every plate reads owner and the law book holds only the docket's rule). `tests/hall_gov_real_site.mjs` boots the city, the street, the deck, every interior and My agents with a stale server still answering the old overlay route, and requires that no page asks for it and nothing shown carries `data-proto` or any phrase the overlay used to invent, with a control that the same scan finds such a phrase when a real read carries it.
|
|
31
|
+
|
|
32
|
+
## One source of counts
|
|
33
|
+
|
|
34
|
+
The city's plaque and door, the street's header and readings, the deck and the shell's Governing tally print the same numbers, defined once in `gov-living.js` `countsOf` with one label each: **to do** (asks on one of your seats; the owner's word for the main count, "24 to do"), **wait on others**, **to decide**, **agents working** (active claims) and **moving** (`GET /moving`: tasks being built or waiting to land, the owner's definition, so it never reads under agents working). `gov-feeds.js` reads each feed once per page view; the deck reads nothing (it draws the street's own living model); the shell's tally reads only `COUNT_FEEDS` (`GET /government/counts` and `/me`), which `tests/hall_gov_counts.mjs` proves give the same counts as every feed, and renders each surface from the same fixture to hold them equal. An answer on the deck leaves every count at once; an act's re-read refreshes the living model once. The top-bar tally stands on the city and the street only (`craft-mode.js` `TALLY_PAGES`, the body's `data-page`); every other page asks for nothing. A desk's own floor line keeps "needs you": that is one matter, not the count.
|
|
35
|
+
|
|
36
|
+
## The surfaces
|
|
37
|
+
|
|
38
|
+
- **The city** (`/city`). The plaque reads the government at a glance (its form, the laws, what is on you, this month's spend); a building opens its card in place, a glass panel beside it (task 1004702) — its name, who holds it ("Your seat.", "Led by …", or the owner until a Lead is seated), one fact and what waits there, then **its first ask, answered in place** (the owner's pick, 2026-10-13, reversing task 1004717's link-only card) through the deck's own sender (`GovDeck.sendAnswer`: the desk row's real route; keys 1/2/3 too), and two doors, "decide all N in a row" to the deck and "go inside" to the street. `city.html` loads the deck's card and sender (`street-draw.js`, `street-card.js`, `street-inside.js`, `street-desk.js`, `street-deck.js`, and `street-deck.css` for the glass). The door is "decide N in a row". Lead plates sit beside seated Leads; an unseated building shows "owner" on hover or focus.
|
|
39
|
+
- **The street** (`/street`). Three planes: a hazed skyline of every open goal behind, the nine buildings with a deeper side face, the road in front. Construction is the city's family: a live site (scaffold at its share built, a crane whose jib swings) for a build-out going up, and a dashed-glass ghost annex with a parked crane and a tally arc for one waiting on its vote; an open sitting is a light shaft. What needs you lights salmon windows on the floor that holds it.
|
|
40
|
+
- **The decision deck** (`/street#deck`, `#deck=<building>`). The street stays in view (task 1004702, the Tweak Mode glass language, mocks in `docs/design/mocks/decision-cards/`): the card is a glass panel beside the building that asks, a hairline to its pin and a halo on it, the scene under a light hush with that building left clear, two glass slivers for the cards still to come, and a slim glass dock at the foot ("1 of 38 to do" — the cards in hand of the to-do count, three for a batch — today's pips, the keys, back to the street). On a phone the panel is a sheet from the foot and the street scrolls so the building stays in view above it; the sheet carries its own skip and pass it on. The words come first and speak as "I", the agent that asked (the owner's pick): the question, the said line (the stored why; one not said as "I" is led by the pick, "I'd keep it off."), the answers with "my pick" in ink, and the last line as a sentence — who it waits on ("Only you can answer this.", the only salmon on it) then "Left alone, …". One card at a time in the ask format (a question of at most twelve words, two or three tap answers each with a one-line result, a pick and why, who it waits on, what happens if nobody answers). Keys 1/2/3 pick, S skips, D passes it on (only over a routed docket with the Leads read, and only a stored ask that waits on you; the server moves it). A card sends what its desk row sends, through the same route; "same answer for these 3?" batches like asks. A matter with no stored ask shows in its own words with its floor's desk beside it. The server holds the ask rules (`modules/government/asks.js`, [ADR 0372](../../../docs/adr/0372-an-ask-is-stored-per-docket-matter-and-the-server-refuses-slop.md)) and refuses a slop ask before it is stored; since task 1004704 an AI session cannot file a blocker without one ([ADR 0373](../../../docs/adr/0373-an-ai-session-files-a-blocker-with-an-ask.md)). A board vote's pips light as its sitting's tally counts them.
|
|
41
|
+
- **A building's card on the street** (a pin): glass beside its pin over the same hush (task 1004702). A matter with a stored ask opens as its building's card — its name, who holds it and what waits, the ask inside answered in place through the deck's path, "go inside", "pass it on" and S to skip to the pin's next matter; one without keeps the matter card's own acts.
|
|
42
|
+
- **Inside a building**: the Lead's row, the building's own stack, and the Lead's office storey once the Leads are read: who holds it, whether it builds without a vote (the server's `build_rights`), its committee rooms and works, and — for the building's holder — BUILD OUT, a capsule tap that is `POST /government/buildouts` (built at once, or filed as a vote whose card carries an iso picture drawn from the building as it stands; the preview stores nothing and says so). Rules holds the law book and what every session reads; the Treasury its pots, reserve, cap and the dry pot's borrow card; the Charter its strictness preset, a switch filing one laws vote.
|
|
43
|
+
|
|
44
|
+
## The rules an edit here must keep
|
|
45
|
+
|
|
46
|
+
- **Nothing is invented.** A field comes from a read or is derived from reads by a rule in `gov-living.js`; a read that fails leaves its part out. No sample data, no prototype mark, no key.
|
|
47
|
+
- **Salmon is spent only on what needs you**, everywhere: a matter routed to another seat stands in ink on the street (pin and windows) as in the city. Ordinary activity is ink, and so is a choice: inside a building the chosen floor, its frame, sign and number, the lift and the desk's plate are ink, salmon only while that floor needs you (task 1004718).
|
|
48
|
+
- **What needs you is never hidden.** The civic quarter's back corner, centre and front corner stand in one screen column, so the Charter (the tallest) takes the back corner and nothing taller stands in front of Planning; a building's salmon windows take its top rows first (task 1004718).
|
|
49
|
+
- **The street band is cropped to what it draws** (`street.js` `BAND_TOP`/`BAND_H`, matched by `street.css`): no empty sky over the skylanes and no bare ground under the brackets; a stage taller than the street needs gives its spare height to the foot of the page, under the readings, never to the sky. Paper haze is a cool sea tone deep enough to read as distance (task 1004718).
|
|
50
|
+
- **Motion is CSS only**, says only "this is live", and carries no data (count, size, position and colour do). Ambient loops are 20 s or longer (the pin's halo breathes on 24 s); growth, build-out and the deck's card (the panel rises once) are class-triggered one-shots; every animation stops under `prefers-reduced-motion`, and the still frame is a complete picture.
|
|
51
|
+
- **Colours are the pack's tokens**, except the iso and front-on drawing palettes, which are drawing data. Dark rules are written twice. Light mode is paper: glows become ink washes.
|
|
52
|
+
- **A tile is one number and two words, hidden at zero**; a row is a name of at most three words, one fact and at most two buttons; choices are one-tap chips.
|
|
53
|
+
- **The files are split on purpose.** `street-depth.js` holds the street's depth model (pure) and the exterior's painters, so `street.js` stays under the 1,500-line ratchet and `street-draw.js` never requires `street-inside.js` (no cycle: `street-depth.js` requires both). `gov-living.js` stays pure; reading belongs to `gov-feeds.js`.
|
|
54
|
+
|
|
55
|
+
## Verifying
|
|
56
|
+
|
|
57
|
+
`node scripts/hall-preview/server.js --port 4620 --fixture-me --rank archon`, then `node modules/ui-design/kit/render.js --page city|street|my-agents` at 1440, 390 and 320 in both modes (restart the harness after editing a page's HTML). The states' expectations are the harness fixtures' (task 1004718 refreshed the ones that went stale when the harness became the real site). Tests: `tests/hall_gov_living.mjs`, `tests/hall_gov_counts.mjs`, `tests/hall_city_living.mjs`, `tests/hall_street_depth.mjs`, `tests/hall_street_deck.mjs`, `tests/hall_buildouts.mjs`, `tests/craft_mode_tallies.mjs`, `tests/hall_gov_real_site.mjs`.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# My agents, and governing as a held seat — /my-agents and the nav (task 1004685, the living-city prototype)
|
|
2
|
+
|
|
3
|
+
Covers: `my-agents.{html,js,css,states.json}`, `gov-positions.js`, the `position` flag in `shell.js` NAV, the seat in `craft-mode.js`, and the harness recorder `scripts/hall-preview/pref-writes.js`. Built on round-3 boards 6 ("the city and My agents"), 7 ("how strict") and 8 ("governance is a position") of the living-city design canvas. **Every row is real since task 1004714**: the settings, the laws' locks and caps, and Make it a law. The strictness preset strip is real too since task 1004715 (`GET /government/presets`, [ADR 0380](../../../docs/adr/0380-a-strictness-preset-is-a-bundle-of-laws-switched-by-one-laws-vote.md)).
|
|
4
|
+
|
|
5
|
+
## What it is
|
|
6
|
+
|
|
7
|
+
- **My agents** (in You, after Profile): every setting that shapes how your own Claude works, one line each — a name of at most three words, one fact, one-tap chips (the owner's desk line rule). Real rows come from `GET /me` (interaction profile, wandering, model allocation, session cards), `GET /me/skill-prefs`, `GET /specialities` and the sounds switch; they write to the real routes. The five settings no table held (when stuck, when it asks, how it asks, at once, going live) were dropped by task 1004714 rather than shown as settings nothing stores or obeys; how an agent asks is a project rule now (the ask shape, ADR 0372-0373).
|
|
8
|
+
- **Only a law in force locks a row** (task 1004714). The rows read gov-living's model, which holds nothing but real reads (task 1004717 deleted the prototype overlay), so nothing else locks, caps or advises one. The strictness strip (real, task 1004715) names the preset the laws in force amount to ("No preset yet" on the hub) and previews what each WOULD lock of these rows — the server's locks after a switch, fixed or capped (Open workshop none, Guild off-task, Factory off-task and the three model slots) — with a tile and one pip per lockable row; it never locks a row. Previewing another preset offers "put it to a vote" to a builder who may open a board item: one real laws vote (`POST /government/board/presets`).
|
|
9
|
+
- **What your agent reads first** quotes the REAL contract text `/me` carries (the Conductor relays it), says plainly when a knob is not sent (permissive wandering is `inject: false`), and puts the project's REAL laws above it: `/me`'s `laws` block, the very words every session gets first (task 1004707). With no law in force that block is not drawn.
|
|
10
|
+
- **A real law's lock is real.** `/me`'s `laws.locks` says what each law in force did to your settings; the server already applied it (the slice's effective value obeys it), so the row is locked, naming the law and its number in the real book, with your own choice underneath. A law that only CAPS a setting (`{ setting, max }`) does not lock the row: the server names every value it still allows (`allowed` on each lock, `law-locks.js` allowedFor — the same list a refused PATCH carries), the chips offer those, and the line says `capped by <law> · Law N`. A cap that leaves one value, or a server that names none, reads as the whole-row lock. A lock the server could not enforce (a setting no table holds yet) locks nothing. A write the law forbids answers 409 `locked_by_law`, and the toast says the law.
|
|
11
|
+
- **Make it a law** lists your own non-default choices that no law already locks or caps; proposing one files a real laws vote (`POST /government/board/laws`, task 1004706): one law, in the desk's voice, locking the setting to your value, sat under the constitution in force. It is offered only to a builder `/me` says may open a board item (`permissions['board.item.open']`, one of `NAV_PERMISSION_ATOMS`); an unreadable map offers nothing. A filed habit links to its vote in the Board Room.
|
|
12
|
+
- **Governing is a held seat** (real since task 1004713, ADR 0377). `GET /me` carries `positions`, resolved by the server (`modules/government/positions.js`: the owner seat, a Lead in office, a seat on a building's sitting, the board under the constitution in force). `gov-positions.js` only reads that block — no constitution or rank. Items flagged `position: true` (the City, the Board Room, the Government group) hide for a builder the server says holds none, and the craft mode names Governing by the seat ("Planning Lead") or drops it. A `/me` with no block is unknown and keeps today's nav.
|
|
13
|
+
|
|
14
|
+
## The rules an edit here must keep
|
|
15
|
+
|
|
16
|
+
- **Cosmetic nav only.** Page gates stay server-side; a seat only ever takes a link away. `/my-agents` itself is `requireBuilderPage` (serve-internal.js, the ORACLE row).
|
|
17
|
+
- **Unknown is today's nav.** A `/me` with no `positions` block (the module off, a failed read) is unknown whatever the constitution says: nothing hides and the craft picker keeps four doors.
|
|
18
|
+
- **`?as=nobody` is a review aid that can only hide**: the stand-in has no seat and a rank no higher than thetes (never above the real one). It is remembered for the browser session; `?as=me` clears it.
|
|
19
|
+
- **Nothing is invented**: `tests/hall_my_agents.mjs` hands the view an overlay of invented settings, laws and presets and requires the whole view to read the same; the page carries no prototype key.
|
|
20
|
+
- **The accent is not spent here**: on the governing surfaces salmon means "needs you". A chosen chip is ink on glass, a lock a dashed hairline, a law band an ink wash. Motion is the lit pip and the saved tick, both one-shot on `transform`, dead under the kill switch.
|
|
21
|
+
- **The harness records the five pref PATCHes** with the real shapers over an in-memory copy and lays them over later reads, so a reload shows the change and the derived card level moves with the profile as it does in production. A restart forgets everything.
|
|
@@ -13,6 +13,7 @@ Also gone, and the one rule in that list: a sealed state is a `.scroll` panel wh
|
|
|
13
13
|
**Watch's access-requests section became the applications REVIEW queue (task 1002332, BV1.R13)** — a project's applications ARE its own `access_requests` rows (ADR 0182 §Scope), and this section is the owner's surface for them until R4's console page absorbs it. Three things it added, all inside `renderGate`/`loadGate`:
|
|
14
14
|
|
|
15
15
|
- **Every row says whether the platform vouched for the name on it** — a `.fact-pill--ok` "Identity vouched" or a `.fact-pill--warn` "Name unvouched", from the `vouched` the queue read already returned (`applicant_github_id IS NOT NULL`, core_230). `POST /access-requests` is the one PUBLIC unauthenticated write, so anyone may apply under anyone's name; ADR 0201 calls the distinction UI-load-bearing, not decoration. It is never authority (ADR 0016) — both classes offer the identical buttons, and `tests/watch_applications_queue.mjs` asserts exactly that.
|
|
16
|
+
- **A vouched row that drew no profile names the handle its vouch carried** (task 1004673; ADR 0333 D5): "On the platform as `@handle`", from the `applicant_handle` the queue read returns, in the facts line after the pill. The live profile is null when the hub is down, answers nothing, or the read falls past the queue's cap, and the stored handle is then what the reviewer can still call the applicant. It shows only on a vouched row with no profile block (a drawn profile is the live record, and an unvouched row has no handle), as plain text, because the hub has no person page to link to yet (`/u/<handle>` is unbuilt). The harness fixture's row 907 is that state.
|
|
16
17
|
- **The three lifecycle states sit behind one `makeFilterBar` switch**, so the decided history is readable and the RESCIND (`invited → dismissed`) the route has always taken is finally offered — ADR 0208 recorded that nothing on this page did. A declined row offers no button: reviving one is the invite form above, which is what the server's own 409 names. The switch is rebuilt each render (the same lifecycle `wireInviteForm` lives with, since `section` replaces the whole body).
|
|
17
18
|
- **The `att-access` tile counts pending only.** Its sub line says "pending", so the count is guarded on the pending view — reading the history must not repaint the board with a number that means something else.
|
|
18
19
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# The profile's Connections tab is this project's cut — your connections who build here, and a link to the hub for the rest (task 1004279)
|
|
2
|
+
|
|
3
|
+
The owner's call of 2026-09-25 (ADR 0337 D5.4) made the hub the home of connections, and the hall's Connections key the in-project cut of them. The hub page came first (`/connections`, task 1004278), so cross-project connections never lost their only page; this tab then narrowed.
|
|
4
|
+
|
|
5
|
+
- **What the own view shows.** Your accepted connections who are also active builders on this project, read as `GET /connections?here=1` (`modules/platform-identity/connections.js` `HERE_SQL`: the edge joined to core's `builders` row on github_id, `status = 'active'`). Nothing new is tracked about where a connection was made; both rows already existed. The lede counts the list beside it ("3 of your connections build on this project."), each row is 1st degree and removable, as before.
|
|
6
|
+
- **What moved to the hub, and the way there.** The request queues (accept, decline, withdraw) and your connections on other projects are on the hub's `/connections`, so the tab draws one line and a `.pbtn` to `${OTB.hubOrigin()}/connections`, the Settings "Open your account page" pattern. No hub origin, no link. Accept and decline stay on another builder's profile, where an incoming request still turns their Connect button into the decision.
|
|
7
|
+
- **It does not read the queues.** `GET /connections/requests` stamps `seen_at` on the incoming rows it returns ("delivered"), so fetching them here only to count or hide them would mark a request seen that nobody saw. `tests/profile_connections_ui.mjs` pins the absence of that read.
|
|
8
|
+
- **"Builders you may know" stays.** ADR 0337 D4.2 puts it on both sides and D5.4 moved only connections and their requests, so it keeps its place under the list, unchanged.
|
|
9
|
+
- **Only the hub's own hall shows this tab.** The connections routes exist where `platform-identity` is on, which is the hub; a hosted project's hall never reveals the key. Giving hosted halls the cut needs a cross-site read and was left out on the owner's pick.
|
|
10
|
+
- **Looked at:** before/after full-page renders of `/profile#connections` against the hall-preview harness (own profile re-keyed to the `--fixture-me` builder, hub origin filled as the hub stamps it), 1440 dark and light, 390 light; floors probed at 1440/390/320 in both modes: no page-level sideways scroll, the link 236x38, no target under 24px. No new CSS; `.conn-req__state` went with the outbox that was its only user.
|
|
@@ -10,3 +10,5 @@
|
|
|
10
10
|
Also gone, and the one rule in that list: **a page-local `:root` is forbidden both ways** (`roadmap.css` had the hall's only one) — the pack's `:root` is spliced at the end of `<head>` at (0,1,0), so a page's own `:root` neither wins reliably nor loses cleanly.
|
|
11
11
|
|
|
12
12
|
**Two page-head voices, one per archetype, and that is the pick, not drift.** `.page-head--board` is quiet because a working surface's own name is the least interesting thing on it; `.page-head--room` is a lowercase display line over the ground with a one-word eyebrow, because in a reading room the document *is* the page. The roadmap deck takes the **board's** voice — it is a figure surface, not a document. The modifier carries the voice only; the room's WIDTH (`--room-max`, 1010px — past that a reading card is more empty ground than page) lives in `room.css`, so Ranks can take the voice without loading the archetype and never ends up with a 1010px head over 1120px cards.
|
|
13
|
+
|
|
14
|
+
**The figures follow the theme ([task 1003639](https://cloudbongos.com/builders#/task/1003639)).** mermaid-cli renders one LIGHT figure per diagram at deploy, so on dark mode the canvas was a white plate on black. The fix is two CSS twins and one JS line, not a second render: `diagram-viewer.js` drops the `background-color: white` mermaid bakes into the SVG root, and in dark `diagram-viewer.css` turns the inline SVG with `filter: invert(1) hue-rotate(180deg)` (invert, then turn the hues back, so dark ink reads light and a purple edge stays purple). `room.css` turns the fallback PNG the same way, so a dark reader gets no white flash before the SVG arrives. A second, dark render per diagram was the alternative; it was not taken because it doubles the deploy's headless-Chrome work on a small host and needs the viewer to swap files on a theme switch, where CSS follows the switch for free. Measured on the rendered page, dark, at 137%: 16.1:1 on a node, 11.4:1 on an edge label, 18.8:1 on the note. `tests/hall_reading_world.mjs` §7b pins both twins and the JS line.
|