@bongos/core 1.24.35 → 1.24.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/.bongos-core.json +128 -168
  2. package/.claude/skills/merge-mode/SKILL.md +1 -1
  3. package/docs/adr/0228-the-reading-room-owes-a-reference-content-rules-not-a-second-archetype.md +1 -1
  4. package/docs/copy-inventory.md +164 -219
  5. package/docs/copy-registry.json +323 -892
  6. package/docs/module-api-changelog.md +4 -0
  7. package/docs/onboarding/diagrams/README.md +1 -2
  8. package/docs/onboarding/primer.md +66 -22
  9. package/docs/page-inventory.json +39 -133
  10. package/docs/page-readings.json +882 -1346
  11. package/docs/recipes/ui-look-before-you-ship.md +2 -2
  12. package/modules/design-styles/skills/style/SKILL.md +2 -2
  13. package/modules/hall-ui/public/ai-studio.html +2 -2
  14. package/modules/hall-ui/public/atlas.html +2 -2
  15. package/modules/hall-ui/public/blockers.html +2 -2
  16. package/modules/hall-ui/public/board-room.html +2 -2
  17. package/modules/hall-ui/public/builders.js +8 -6
  18. package/modules/hall-ui/public/city.html +2 -2
  19. package/modules/hall-ui/public/collab.html +2 -2
  20. package/modules/hall-ui/public/commands.html +2 -2
  21. package/modules/hall-ui/public/copy-desk.html +2 -2
  22. package/modules/hall-ui/public/craft-mode.js +2 -2
  23. package/modules/hall-ui/public/deploy.html +2 -2
  24. package/modules/hall-ui/public/diagram-viewer.css +1 -1
  25. package/modules/hall-ui/public/diagram-viewer.js +5 -5
  26. package/modules/hall-ui/public/fleet-costs.js +3 -2
  27. package/modules/hall-ui/public/founding-mark.js +3 -2
  28. package/modules/hall-ui/public/gate.html +2 -2
  29. package/modules/hall-ui/public/goal-map.html +2 -2
  30. package/modules/hall-ui/public/goals.html +2 -2
  31. package/modules/hall-ui/public/government.html +2 -2
  32. package/modules/hall-ui/public/hall-render.js +62 -1
  33. package/modules/hall-ui/public/hall-widgets.js +11 -1
  34. package/modules/hall-ui/public/idea.html +2 -2
  35. package/modules/hall-ui/public/ideas.html +2 -2
  36. package/modules/hall-ui/public/index.html +4 -4
  37. package/modules/hall-ui/public/market-watch-item.html +2 -2
  38. package/modules/hall-ui/public/market-watch-rules.html +2 -2
  39. package/modules/hall-ui/public/market-watch.html +2 -2
  40. package/modules/hall-ui/public/modules.html +2 -2
  41. package/modules/hall-ui/public/money.html +92 -0
  42. package/modules/hall-ui/public/money.js +302 -0
  43. package/modules/hall-ui/public/money.states.json +15 -0
  44. package/modules/hall-ui/public/my-agents.html +2 -2
  45. package/modules/hall-ui/public/palette.js +22 -0
  46. package/modules/hall-ui/public/primer-live.js +101 -0
  47. package/modules/hall-ui/public/primer.html +10 -6
  48. package/modules/hall-ui/public/primer.js +93 -23
  49. package/modules/hall-ui/public/primer.states.json +54 -7
  50. package/modules/hall-ui/public/profile.html +2 -2
  51. package/modules/hall-ui/public/project-settings.css +2 -1
  52. package/modules/hall-ui/public/project-settings.html +6 -16
  53. package/modules/hall-ui/public/project-settings.js +2 -142
  54. package/modules/hall-ui/public/roadmap.html +2 -2
  55. package/modules/hall-ui/public/room.css +23 -121
  56. package/modules/hall-ui/public/roster.html +2 -2
  57. package/modules/hall-ui/public/sessions.html +2 -2
  58. package/modules/hall-ui/public/settings.html +2 -2
  59. package/modules/hall-ui/public/shell.js +21 -26
  60. package/modules/hall-ui/public/street.html +2 -2
  61. package/modules/hall-ui/public/studio.html +2 -2
  62. package/modules/hall-ui/public/style.css +8 -55
  63. package/modules/hall-ui/public/task.html +2 -2
  64. package/modules/hall-ui/public/thinking.html +2 -2
  65. package/modules/hall-ui/public/tweak-editor.html +2 -2
  66. package/modules/hall-ui/public/watch.html +2 -2
  67. package/modules/hall-ui/public/work.html +2 -2
  68. package/modules/hall-ui/records/founding-mark.md +4 -4
  69. package/modules/hall-ui/records/reading-rooms.md +2 -0
  70. package/modules/hall-ui/records/reference-room.md +2 -0
  71. package/modules/onboarding/founding-mode.js +6 -2
  72. package/modules/ui-design/kit/render.js +1 -1
  73. package/modules/ui-design/styles/README.md +2 -2
  74. package/package-lock.json +2 -2
  75. package/package.json +1 -1
  76. package/release-notes.json +12 -0
  77. package/scripts/bongos/gen-hall-sitemap.js +3 -0
  78. package/scripts/hall-preview/server.js +6 -11
  79. package/src/bongos/auth.js +0 -8
  80. package/src/bongos/serve-internal.js +43 -43
  81. package/src/module-api.js +1 -1
  82. package/tests/auth_resolve_failure.mjs +5 -4
  83. package/tests/craft_mode_home.mjs +6 -2
  84. package/tests/fleet_cost_view.mjs +2 -18
  85. package/tests/founding_builders.mjs +6 -5
  86. package/tests/founding_mode.mjs +7 -4
  87. package/tests/hall_board_world.mjs +44 -1
  88. package/tests/hall_fullscreen.mjs +1 -1
  89. package/tests/hall_loading.mjs +1 -1
  90. package/tests/hall_money_page.mjs +272 -0
  91. package/tests/hall_nav.mjs +29 -11
  92. package/tests/hall_oversight_world.mjs +1 -1
  93. package/tests/hall_page_gate_map.mjs +17 -7
  94. package/tests/hall_reading_room.mjs +385 -0
  95. package/tests/hall_reading_world.mjs +36 -30
  96. package/tests/nav_permission_atoms.mjs +3 -2
  97. package/tests/rank_tier_single_source.mjs +0 -1
  98. package/tests/ui_design_kit.mjs +1 -1
  99. package/modules/hall-ui/public/diagrams.css +0 -45
  100. package/modules/hall-ui/public/diagrams.html +0 -106
  101. package/modules/hall-ui/public/diagrams.states.json +0 -28
  102. package/modules/hall-ui/public/drachmae.html +0 -110
  103. package/modules/hall-ui/public/drachmae.js +0 -431
  104. package/modules/hall-ui/public/drachmae.states.json +0 -58
  105. package/modules/hall-ui/public/fleet.html +0 -69
  106. package/modules/hall-ui/public/fleet.js +0 -41
  107. package/modules/hall-ui/public/fleet.states.json +0 -14
  108. package/modules/hall-ui/public/ranks-founding.states.json +0 -12
  109. package/modules/hall-ui/public/ranks.html +0 -83
  110. package/modules/hall-ui/public/ranks.js +0 -229
  111. package/modules/hall-ui/public/ranks.states.json +0 -15
  112. package/tests/hall_reference_world.mjs +0 -352
@@ -1,7 +1,8 @@
1
1
  /* room.css — the READING-ROOM archetype: a long document read end to end
2
- (task 1003306, goal 1000081). Shared by the primer (primer.html), the
3
- diagrams index (diagrams.html) and, as the hall's first REFERENCE, drachmae
4
- (task 1003473; §8 below is what the room owes a document that is scanned).
2
+ (task 1003306, goal 1000081). The primer (primer.html) is the hall's one
3
+ reading room since task 1005046, which folded the diagrams index and the
4
+ Economy reference (drachmae, task 1003473) into it as chapters; the
5
+ reference rules that page switched on (`room--reference`) went with it.
5
6
 
6
7
  THE ARCHETYPE is v3 "the glass hall", the owner's pick from the composition
7
8
  round — docs/design/hall-direction-v2.md §6, mock
@@ -13,13 +14,11 @@
13
14
  topbar, the document is content and belongs on a panel the ground can never
14
15
  reach the ink on.
15
16
 
16
- WHY IT IS ITS OWN SHEET rather than more of primer.css: the primer and the
17
- diagrams index are the same room over different documents — one renders
18
- markdown, one renders five figures — and the framed figure is literally the
19
- same object on both (diagram-viewer.js upgrades `figure.diagram img,
20
- figure.primer-figure img` with one selector). Ranks, Economy, Repo Atlas and
21
- Modules inherit this archetype next. Page-specific shapes stay page-local:
22
- primer.css keeps the acknowledge gate, diagrams.css keeps the legend strip.
17
+ WHY IT IS ITS OWN SHEET rather than more of primer.css: the archetype is the
18
+ room, not the document — the Modules page borrows its article card too — and
19
+ the framed figure is one object wherever it appears (diagram-viewer.js upgrades
20
+ `figure.primer-figure img`).
21
+ Page-specific shapes stay page-local: primer.css keeps the acknowledge gate.
23
22
 
24
23
  WHY THE CLASSES ARE STILL `primer-`: two live surfaces spell them —
25
24
  diagram-viewer.js's upgrade selector and tests/hall_audit.mjs's pinned
@@ -352,20 +351,20 @@ body.room .page-head { max-width: var(--room-max); }
352
351
  .primer-article tr:last-child td { border-bottom: 0; }
353
352
 
354
353
  /* ---- 5. the framed figure ------------------------------------------------
355
- ONE rule, both rooms: diagram-viewer.js upgrades `figure.diagram img,
356
- figure.primer-figure img` into a pannable canvas, and until (or unless) the
357
- SVG fetch succeeds the PNG stays in this frame. Glass rather than a card, so
358
- a figure inside the article reads as inset and a figure on the diagrams index
359
- reads as the same object. */
360
- .primer-figure, figure.diagram {
354
+ diagram-viewer.js upgrades `figure.primer-figure img` into a pannable
355
+ canvas, and until (or unless) the SVG fetch succeeds the PNG stays in this
356
+ frame. Glass rather than a card, so a figure inside the article reads as
357
+ inset. (The diagrams index's `figure.diagram` shared this rule until task
358
+ 1005046 folded that page into the primer's chapters.) */
359
+ .primer-figure {
361
360
  margin: var(--sp-xl) 0;
362
361
  padding: var(--sp-lg) var(--sp-md);
363
362
  background: var(--glass);
364
363
  border: var(--line) solid var(--glass-edge);
365
364
  border-radius: var(--radius);
366
365
  }
367
- .primer-figure:last-child, figure.diagram:last-child { margin-bottom: 0; }
368
- .primer-figure img, figure.diagram img {
366
+ .primer-figure:last-child { margin-bottom: 0; }
367
+ .primer-figure img {
369
368
  display: block;
370
369
  width: 100%;
371
370
  max-width: 100%;
@@ -375,21 +374,21 @@ body.room .page-head { max-width: var(--room-max); }
375
374
  before the SVG arrives and whenever it cannot. Dark turns it the way
376
375
  diagram-viewer.css turns the canvas (task 1003639), so a dark reader never
377
376
  gets a white flash; the PNG keeps its baked ground, which inverts to black. */
378
- html[data-theme="dark"] .primer-figure img, html[data-theme="dark"] figure.diagram img { filter: invert(1) hue-rotate(180deg); }
377
+ html[data-theme="dark"] .primer-figure img { filter: invert(1) hue-rotate(180deg); }
379
378
  @media (prefers-color-scheme: dark) {
380
- html:not([data-theme]) .primer-figure img, html:not([data-theme]) figure.diagram img { filter: invert(1) hue-rotate(180deg); }
379
+ html:not([data-theme]) .primer-figure img { filter: invert(1) hue-rotate(180deg); }
381
380
  }
382
381
  /* diagram-viewer.js inserts its canvas INSIDE the figure and hides the <img>,
383
382
  so the frame has to belong to exactly one of them or the diagram ends up in
384
383
  two nested boxes. The figure keeps it; the canvas gives its own up. (Its
385
384
  fullscreen state re-declares both, and diagram-viewer.css loads after this
386
- sheet on both pages, so the overlay still paints.) */
387
- .primer-figure .dgv, figure.diagram .dgv {
385
+ sheet, so the overlay still paints.) */
386
+ .primer-figure .dgv {
388
387
  background: none;
389
388
  border: 0;
390
389
  border-radius: var(--radius-sm);
391
390
  }
392
- .primer-figure figcaption, figure.diagram figcaption {
391
+ .primer-figure figcaption {
393
392
  margin-top: 14px;
394
393
  max-width: var(--measure);
395
394
  font-size: 13.5px;
@@ -452,7 +451,7 @@ html[data-theme="dark"] .primer-figure img, html[data-theme="dark"] figure.diagr
452
451
  .primer-toc__inner { display: none; margin-top: 8px; }
453
452
  .primer-toc.is-open .primer-toc__inner { display: block; }
454
453
  /* A markdown table's column count is fixed by its source, so its min-content
455
- width outruns a phone (measured: 79px of page overflow on /drachmae). Give
454
+ width outruns a phone (measured: 79px of page overflow on the old /drachmae page). Give
456
455
  the table its own horizontal scroller instead of letting it drag the page
457
456
  sideways. `display: block` is what makes the table box a scrollport; the
458
457
  rows still lay out through the anonymous table box inside it. */
@@ -463,100 +462,3 @@ html[data-theme="dark"] .primer-figure img, html[data-theme="dark"] figure.diagr
463
462
  overflow-x: auto;
464
463
  }
465
464
  }
466
-
467
- /* ---- 8. the reference ----------------------------------------------------
468
- The same room, a second document (task 1003473). The primer is read once,
469
- start to finish, with a gate at the end; drachmae is a REFERENCE that people
470
- open to answer one question about how they get paid. Nothing about the
471
- composition changes — the head, the glass contents beside the card, the
472
- measure — because the room is right for both. What changes is what the room
473
- does for a reader who is looking rather than reading, and `room--reference`
474
- on the body switches those content rules on:
475
- * the counters are off (no numerals in the contents, no "01" over a
476
- heading), because a reference has no order to keep;
477
- * the contents nest h3s under their h2s, since the sub-questions are what
478
- a reader scans for, and the spy lights the entry AND its part (.is-trail);
479
- * every heading carries its own link (.room-anchor), always visible in the
480
- faint ink — an address is part of the content, not a hover secret — and
481
- in the accent when it is the one the reader arrived at (:target);
482
- * the phone toggle's middle names the part the reader is in.
483
- There is no progress hairline on a reference: the page omits the markup and
484
- §1 above stays for the primer, whose gate is fed by it. Why a modifier and
485
- not a second archetype: the third document that is scanned (the ranks, the
486
- API docs) takes these four rules by one body class, and a sheet of its own
487
- would be room.css again with the counter deleted. */
488
- .room--reference .primer-article h2::before,
489
- .room--reference .primer-toc__list a::before { content: none; }
490
- .room--reference .primer-toc__list a.is-trail { color: var(--ink); }
491
- .room--reference .primer-toc__sub {
492
- list-style: none;
493
- margin: 0 0 6px var(--sp-xs);
494
- padding: 0 0 0 10px;
495
- border-left: var(--line) solid var(--rule-soft);
496
- }
497
- .room--reference .primer-toc__sub a {
498
- min-height: 30px;
499
- padding: 6px var(--sp-xs);
500
- font-size: 13px;
501
- color: var(--ink-faint);
502
- }
503
- .room--reference .primer-toc__sub a:hover,
504
- .room--reference .primer-toc__sub a.is-active { color: var(--ink); }
505
-
506
- /* the toggle's middle: the part the reader is in, in the faint ink, cut with an
507
- ellipsis before it can push the chevron off the row. Empty until the spy has
508
- something to say, and then it takes no room at all. */
509
- .room--reference .primer-toc__toggle-label { flex: none; }
510
- .room--reference .primer-toc__current {
511
- flex: 1 1 auto;
512
- min-width: 0;
513
- overflow: hidden;
514
- text-overflow: ellipsis;
515
- white-space: nowrap;
516
- text-align: right;
517
- font-size: 13px;
518
- color: var(--ink-faint);
519
- }
520
- .room--reference .primer-toc__current:empty { display: none; }
521
-
522
- /* the address. Outranks the prose-link rule (.primer-article a): no underline,
523
- no padding, a 24px box of its own so the floor holds without the padding
524
- trick, and the glass under it on hover so the target reads as one. */
525
- .room--reference .primer-article .room-anchor {
526
- display: inline-flex;
527
- align-items: center;
528
- justify-content: center;
529
- width: 24px;
530
- height: 24px;
531
- margin-left: 6px;
532
- padding: 0;
533
- vertical-align: middle;
534
- color: var(--ink-faint);
535
- text-decoration: none;
536
- border-radius: var(--radius-sm);
537
- transition: color 200ms cubic-bezier(.2, .7, .3, 1), background 200ms cubic-bezier(.2, .7, .3, 1);
538
- }
539
- .room--reference .primer-article .room-anchor:hover { color: var(--accent-ink); background: var(--glass); }
540
- /* the one the reader arrived at. :target alone misses a deep link into a
541
- document that renders after load, so drachmae.js marks the landing itself. */
542
- .room--reference .primer-article :is(:target, .is-target) > .room-anchor { color: var(--accent-ink); }
543
-
544
- /* On a phone the collapsed outline rides under the top bar, so the reader can
545
- open it from anywhere in the document and read which part they are in. The
546
- toggle is glass, the same material as the bar it sits under, and below the
547
- bar in the z ladder for the same reason the progress hairline is. */
548
- @media (max-width: 760px) {
549
- .room--reference .primer-toc {
550
- position: sticky;
551
- top: calc(var(--topbar-h) + 8px);
552
- z-index: var(--z-progress);
553
- }
554
- /* Riding over the article, the toggle and the open list take the card's
555
- ground at 92% rather than the bare glass: light's glass has no blur, so
556
- over scrolling prose the bare tint was the prose showing through the pill
557
- (measured on the deep-link render at 390). The edge stays the glass edge. */
558
- .room--reference .primer-toc__toggle,
559
- .room--reference .primer-toc__inner { background: color-mix(in srgb, var(--bg-card) 92%, transparent); }
560
- /* a landed heading has to clear the sticky toggle as well as the top bar */
561
- .room--reference .primer-article :is(h2, h3, h4) { scroll-margin-top: calc(var(--topbar-h) + 72px); }
562
- }
@@ -55,8 +55,8 @@
55
55
  chrome exists before the page script runs. -->
56
56
  <script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
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-30-market-watch"></script>
59
- <script src="/builders/shell.js?v=2026-11-04-one-market-watch"></script>
58
+ <script src="/builders/craft-mode.js?v=2026-11-04-money"></script>
59
+ <script src="/builders/shell.js?v=2026-11-04-money"></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
  <!-- the branding pack's currency label, loaded BEFORE roster.js. -->
@@ -113,8 +113,8 @@
113
113
  chrome exists before the page script runs. -->
114
114
  <script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
115
115
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
116
- <script src="/builders/craft-mode.js?v=2026-10-30-market-watch"></script>
117
- <script src="/builders/shell.js?v=2026-11-04-one-market-watch"></script>
116
+ <script src="/builders/craft-mode.js?v=2026-11-04-money"></script>
117
+ <script src="/builders/shell.js?v=2026-11-04-money"></script>
118
118
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
119
119
  <script src="/builders/palette.js" defer></script>
120
120
  <script src="/builders/task-detail.js?v=2026-07-03-taskdetail"></script>
@@ -393,8 +393,8 @@
393
393
  chrome exists before the page scripts run. -->
394
394
  <script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
395
395
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
396
- <script src="/builders/craft-mode.js?v=2026-10-30-market-watch"></script>
397
- <script src="/builders/shell.js?v=2026-11-04-one-market-watch"></script>
396
+ <script src="/builders/craft-mode.js?v=2026-11-04-money"></script>
397
+ <script src="/builders/shell.js?v=2026-11-04-money"></script>
398
398
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
399
399
  <script src="/builders/palette.js" defer></script>
400
400
  <!-- shared component kit (window.OTBKit) — section rail (task 2166). -->
@@ -2,7 +2,7 @@
2
2
  // (Vanilla hall-ui redesign, task 1723; scope: docs/design/vanilla-hall-ui-redesign-scope.md.)
3
3
  //
4
4
  // Dependency-free by design: it must run on pages that don't load dom-utils.js
5
- // (primer, diagrams, not-ready, atlas), so it reads window.__BRANDING__ /
5
+ // (primer, not-ready, atlas), so it reads window.__BRANDING__ /
6
6
  // window.__MODULES__ directly and defines its own tiny helpers. Loaded with
7
7
  // `defer` BEFORE the page's own script so the chrome it renders (#logout-link,
8
8
  // #welcome-line, #topbar-title, …) exists when page scripts wire events.
@@ -112,10 +112,7 @@
112
112
  roster: '<circle cx="6.5" cy="6.3" r="2.3"/><path d="M2.5 15c.4-2.3 1.9-3.7 4-3.7s3.6 1.4 4 3.7"/><circle cx="12.5" cy="5.8" r="2"/><path d="M11.4 10.5c.4-.1.7-.2 1.1-.2 1.9 0 3.3 1.3 3.7 3.5"/>',
113
113
  // Docs
114
114
  primer: '<path d="M9 5C7.5 3.9 5.5 3.5 2.5 3.5v10c3 0 5 .4 6.5 1.5 1.5-1.1 3.5-1.5 6.5-1.5v-10c-3 0-5 .4-6.5 1.5Z"/><path d="M9 5v10"/>',
115
- ranks: '<path d="M4 7.5 9 4l5 3.5M4 11 9 7.5l5 3.5M4 14.5 9 11l5 3.5"/>',
116
- economy: '<circle cx="9" cy="9" r="6.5"/><path d="M11 6.7c-.4-.6-1.1-.9-2-.9-1.2 0-2 .6-2 1.5 0 2 4 1 4 3.1 0 .9-.9 1.5-2.1 1.5-.9 0-1.7-.4-2.1-1M9 4.7v1.1M9 12.2v1.1"/>',
117
115
  commands: '<rect x="2.5" y="3.5" width="13" height="11" rx="1.5"/><path d="M5.5 7.3 7.7 9l-2.2 1.7M9.5 11.2h3"/>',
118
- diagrams: '<rect x="2.5" y="2.5" width="5.5" height="4" rx="1"/><rect x="10" y="11.5" width="5.5" height="4" rx="1"/><path d="M5.2 6.5v4a1.5 1.5 0 0 0 1.5 1.5H10"/>',
119
116
  atlas: '<circle cx="9" cy="9" r="6.5"/><path d="M2.5 9h13M9 2.5c1.7 1.8 2.6 4 2.6 6.5s-.9 4.7-2.6 6.5c-1.7-1.8-2.6-4-2.6-6.5S7.3 4.3 9 2.5Z"/>',
120
117
  modules: '<rect x="2.5" y="2.5" width="5.5" height="5.5" rx="1"/><rect x="10" y="2.5" width="5.5" height="5.5" rx="1"/><rect x="2.5" y="10" width="5.5" height="5.5" rx="1"/><path d="M12.75 10.5v4.5M10.5 12.75h4.5"/>',
121
118
  apidocs: '<path d="M6.5 3C5 3 4.5 3.7 4.5 5v2c0 1-.6 2-1.5 2 .9 0 1.5 1 1.5 2v2c0 1.3.5 2 2 2M11.5 3c1.5 0 2 .7 2 2v2c0 1 .6 2 1.5 2-.9 0-1.5 1-1.5 2v2c0 1.3-.5 2-2 2"/>',
@@ -125,7 +122,7 @@
125
122
  sessions: '<path d="M7 5h8M7 9h8M7 13h8"/><circle cx="3.8" cy="5" r=".7" fill="currentColor"/><circle cx="3.8" cy="9" r=".7" fill="currentColor"/><circle cx="3.8" cy="13" r=".7" fill="currentColor"/>',
126
123
  settings: '<circle cx="9" cy="9" r="2.5"/><path d="M9 2.5v2m0 9v2M2.5 9h2m9 0h2M4.4 4.4l1.4 1.4m6.4 6.4 1.4 1.4m0-9.2-1.4 1.4M5.8 12.2l-1.4 1.4"/>',
127
124
  deploy: '<path d="M9 12V3M5.5 6.5 9 3l3.5 3.5M3 12.5v2a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1v-2"/>',
128
- fleet: '<path d="M4 2.5h10v13l-1.7-1-1.6 1-1.7-1-1.7 1-1.6-1-1.7 1v-13Z"/><path d="M6.5 6h5M6.5 9h5M6.5 12h3"/>',
125
+ money: '<path d="M4 2.5h10v13l-1.7-1-1.6 1-1.7-1-1.7 1-1.6-1-1.7 1v-13Z"/><path d="M6.5 6h5M6.5 9h5M6.5 12h3"/>',
129
126
  permissions: '<circle cx="6" cy="12" r="3.5"/><path d="M8.5 9.5 15 3M12.5 5.5l2 2M10.5 7.5l1.5 1.5"/>',
130
127
  // The governor city: a pediment over columns, the Governing mode's own glyph.
131
128
  city: '<path d="M2.5 7 9 3l6.5 4M4 7.5v6.5M7 7.5v6.5M11 7.5v6.5M14 7.5v6.5M2.5 15.5h13"/>',
@@ -212,7 +209,7 @@
212
209
  // owner. Lives with the project's own state (Roadmap/Goals/Tasks), not You
213
210
  // or Community, because its subject is the project, not a person. Its one
214
211
  // data source (GET /blockers) is deliberately public, like Roadmap's — but
215
- // the NAV FLAG stays 'signed' on the roster/drachmae precedent: an ungated
212
+ // the NAV FLAG stays 'signed' on the roster precedent: an ungated
216
213
  // page can still gate cosmetically wider in the sidebar than the API it
217
214
  // fronts, showing the link to signed-in builders while a stranger who
218
215
  // already has the URL can still open it.
@@ -333,25 +330,21 @@
333
330
  // /people redirects to /roster.
334
331
  ] },
335
332
  { group: 'Docs', gate: 'signed', items: [
336
- // task 1002710: primer + diagrams were gate:'member' (rank !== xenos) to
337
- // mirror the old thetes+ page gate. That gate is gone — the reading rooms
338
- // are for the first-session newcomer above all — so the links follow it
339
- // down to 'signed'. Leaving them at 'member' would have ungated the pages
333
+ // task 1002710: primer (and the old diagrams page) were gate:'member' (rank
334
+ // !== xenos) to mirror the old thetes+ page gate. That gate is gone — the
335
+ // reading room is for the first-session newcomer above all — so the link
336
+ // follows it down to 'signed'. Leaving them at 'member' would have ungated the pages
340
337
  // while still hiding them from the only readers the change was for.
341
338
  { id: 'primer', label: 'Primer', icon: 'primer', href: '/primer', gate: 'signed' },
342
- { id: 'ranks', label: 'Ranks', icon: 'ranks', href: '/ranks', gate: 'signed' },
343
- // task 2175: /drachmae had no nav entry at all — reachable only from prose
344
- // links since task 2174 moved the bounty rate card onto it. It is reference
345
- // material (the reward schedule + how karma differs), so it belongs in Docs,
346
- // not on personal Standing. Labelled for the TOPIC rather than the instance's
347
- // currency: the page covers karma too, which is not currency, and "Economy"
348
- // stays right whatever `branding.currency.label` is set to. Page is public
349
- // like /ranks — 'signed' is the same cosmetic "show it once you're in".
350
- { id: 'economy', label: 'Economy', icon: 'economy', href: '/drachmae', gate: 'signed' },
339
+ // task 1005046 (owner decision 2026-11-03, idea 1001311): ONE reading room.
340
+ // Ranks, Economy and Diagrams were three more pages explaining what the
341
+ // Primer already explained, so the copies drifted. They are Primer
342
+ // chapters now, each with its diagram beside it; /ranks, /drachmae and
343
+ // /diagrams 302 to the matching chapter (serve-internal.js), and the
344
+ // personal "Where you stand" card moved to Accomplishments.
351
345
  // task 1004473: every skill and every bongos CLI verb, read live. Its page and
352
346
  // both reads behind it are sign-in gated, so 'signed' is the real floor here.
353
347
  { id: 'commands', label: 'Commands', icon: 'commands', href: '/commands', gate: 'signed' },
354
- { id: 'diagrams', label: 'Diagrams', icon: 'diagrams', href: '/diagrams', gate: 'signed' },
355
348
  { id: 'atlas', label: 'Repo Atlas', icon: 'atlas', href: '/atlas', gate: 'member' },
356
349
  { id: 'modules', label: 'Modules', icon: 'modules', href: '/modules', gate: 'member' },
357
350
  // The rendered OpenAPI reference lives on the APEX (/docs), not this builders
@@ -374,6 +367,12 @@
374
367
  // The project's own fundamentals (task 1003280, goal 1000072). Mirrors the
375
368
  // server's requireGovernmentPage floor; cosmetic only, as every item here is.
376
369
  { id: 'project-settings', label: 'Project settings', icon: 'settings', href: '/project-settings', gate: 'government', position: true },
370
+ // task 1005047 (owner decision 2026-11-03, idea 1001312): the owner's one money page —
371
+ // spend and payouts (once on Project settings), the treasury (once the Economy page)
372
+ // and the hosting bills (once 'Fleet costs', /fleet, which now redirects to its
373
+ // #hosting section). It mirrors the server's requireGovernmentPage floor; every
374
+ // section on it is hidden unless its own read answers, so the wall stays per route.
375
+ { id: 'money', label: 'Money', icon: 'money', href: '/money', gate: 'government', position: true },
377
376
  // The deploy door (task 1003159, ADR 0293). Gated 'archon' here to mirror the
378
377
  // `core.pin.move` atom its page and both its routes check — cosmetic only, as
379
378
  // every item in this list is; the wall is server-side.
@@ -384,10 +383,6 @@
384
383
  // is the platform hall's page alone, and every other hall takes its update from
385
384
  // Settings → Software update, whose Update button carries the hub hand-off.
386
385
  { id: 'deploy', label: 'Deploy', icon: 'deploy', href: '/deploy', gate: 'archon', module: 'provisioning render-deploy', position: true },
387
- // task 1001949: what each hosted project costs. 'government' mirrors the metic floor
388
- // of `provisioning.fleet.manage`, the atom its page and its one read check (the
389
- // Deploy precedent above); dropped where the provisioning module is not enabled.
390
- { id: 'fleet', label: 'Fleet costs', icon: 'fleet', href: '/fleet', gate: 'government', module: 'provisioning', position: true },
391
386
  // task 1005045: the owner's Market Watch settings (task 1004938) are an owner-only tab on
392
387
  // /market-watch now, so the sidebar says "Market Watch" once (owner decision 2026-11-03).
393
388
  // BV1.R113: the roles-and-permissions tab (ADR 0151). The one genuinely
@@ -396,8 +391,8 @@
396
391
  // tab's nine data routes (route-rank-check.js); the page SHELL itself is
397
392
  // metic+, because R16 made /government three rooms and only this one is
398
393
  // the archon surface.
399
- { id: 'government', label: 'Permissions', icon: 'permissions', href: '/government', gate: 'archon', position: true } // NOT 'Ranks': /ranks is the signed-in ladder explainer and two nav items
400
- // reading 'Ranks' is the confusion this rename exists to remove. This tab
394
+ { id: 'government', label: 'Permissions', icon: 'permissions', href: '/government', gate: 'archon', position: true } // NOT 'Ranks': the ladder is explained in the Primer, and a nav item
395
+ // reading 'Ranks' beside it is the confusion this rename exists to remove. This tab
401
396
  // is where a rank's permissions are granted, so it says what it does.,
402
397
  ] },
403
398
  ];
@@ -230,8 +230,8 @@
230
230
 
231
231
  <script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
232
232
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
233
- <script src="/builders/craft-mode.js?v=2026-10-30-market-watch"></script>
234
- <script src="/builders/shell.js?v=2026-11-04-one-market-watch"></script>
233
+ <script src="/builders/craft-mode.js?v=2026-11-04-money"></script>
234
+ <script src="/builders/shell.js?v=2026-11-04-money"></script>
235
235
  <script src="/builders/palette.js" defer></script>
236
236
  <script src="/builders/gov-living.js?v=2026-10-09-positions1"></script>
237
237
  <script src="/builders/gov-feeds.js?v=2026-10-09-living3"></script>
@@ -224,8 +224,8 @@
224
224
 
225
225
  <script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
226
226
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
227
- <script src="/builders/craft-mode.js?v=2026-10-30-market-watch"></script>
228
- <script src="/builders/shell.js?v=2026-11-04-one-market-watch"></script>
227
+ <script src="/builders/craft-mode.js?v=2026-11-04-money"></script>
228
+ <script src="/builders/shell.js?v=2026-11-04-money"></script>
229
229
  <script src="/builders/palette.js" defer></script>
230
230
  <!-- The kit, for its ONE renderer: the full-size ship-time visual figure
231
231
  (task 1003829), which the older reviews still show. -->
@@ -747,9 +747,6 @@ html[data-theme="dark"] .brand-mark__mark .mp { fill: #e2e1e4; }
747
747
  }
748
748
  .lb-founding { display: block; margin-top: 4px; }
749
749
  .profile__founding { margin: 2px 0 0; font-size: 13px; color: var(--ink-soft); }
750
- /* The prose-link 24px floor: the target grows by padding, handed back by margin. */
751
- .founding-name { display: inline-block; padding: 3px 6px; margin: -3px -6px; }
752
- .founding-line { display: block; font-size: 12px; color: var(--ink-faint); }
753
750
  .founding-wall { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 14px; }
754
751
  .founding-wall__item { display: grid; justify-items: center; gap: 4px; text-align: center; padding: 12px 8px; }
755
752
  .founding-wall__seed { width: 14px; height: 14px; margin-bottom: 4px; box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 18%, transparent); }
@@ -2880,7 +2877,7 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
2880
2877
  layout, so that happened on every hall page at phone width with nothing even
2881
2878
  visible (measured: 62px of phantom scroll at 390w). Below the breakpoint where
2882
2879
  .profile already reflows, drop it: it is a hover popover, and a touch on the
2883
- badge follows .rank-badge-stretch to /ranks — the full ladder the tip's own
2880
+ badge follows .rank-badge-stretch to the Primer's rank ladder — the full ladder the tip's own
2884
2881
  footer points at. The badge keeps its aria-label, so the rank is still named. */
2885
2882
  @media (max-width: 640px) {
2886
2883
  .rank-tip { display: none; }
@@ -3135,7 +3132,7 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
3135
3132
  /* The FIGURE a plot sits in — a card one tonal step down from the panel (glass
3136
3133
  on the card, like settings' quote), its caption, its live readout, its
3137
3134
  <details> table twin and its foot. Moved here from profile.css in task
3138
- 1003446, when /drachmae's treasury became the second consumer; the `.pchart`
3135
+ 1003446, when the Economy page's treasury (the Primer's since task 1005046) became the second consumer; the `.pchart`
3139
3136
  names are unchanged because they are spelled into profile.js and drachmae.js.
3140
3137
  The kit does NOT emit these — a page composes its own figure and the kit
3141
3138
  draws the series inside it. */
@@ -3923,17 +3920,12 @@ html[data-door="out"] #hall-main { width: 100%; }
3923
3920
  .task__body { grid-column: 1 / -1; }
3924
3921
  }
3925
3922
 
3926
- /* ---------- ranks page ----------
3927
- Re-skinned into the chrome world by task 1003306 (goal 1000081). Ranks is a
3928
- reading room by archetype — a document about the ladder — so it takes the
3929
- room's page head (.page-head--room) and the room's voice on its labels, but
3930
- not room.css: it has no article, no table of contents and no figures, and a
3931
- sheet loaded for one max-width is a request spent on nothing.
3932
- The rank card is `.scroll--quiet`'s level expressed as a list row: a tone one
3933
- step further from the ground than the panel it sits in, with the edge
3934
- reserved as transparent so a modifier can draw one without the base having
3935
- to. The compat aliases are retired here; the badges above still spend them,
3936
- because they render on every page in the hall and belong to 1003308. */
3923
+ /* ---------- where you stand (Accomplishments) ----------
3924
+ The personal half of the retired Ranks page (task 1005046): the viewer's rank,
3925
+ the one above it and how they reach it, as a card in Accomplishments' Progress
3926
+ section. The ladder itself is the Primer's rank-ladder chapter, so the ladder
3927
+ cards that used to live here went with the page. Re-skinned into the chrome
3928
+ world by task 1003306: real token names, no compat aliases. */
3937
3929
 
3938
3930
  .ranks-standing {
3939
3931
  display: grid;
@@ -3947,45 +3939,6 @@ html[data-door="out"] #hall-main { width: 100%; }
3947
3939
  .ranks-standing__next { grid-column: 1 / -1; font-size: 13px; color: var(--ink-faint); }
3948
3940
  @media (max-width: 540px) { .ranks-standing { grid-template-columns: minmax(0, 1fr); } }
3949
3941
 
3950
- .ranks-ladder { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
3951
- .rank-card {
3952
- background: var(--glass);
3953
- border: var(--line) solid transparent;
3954
- border-radius: var(--radius);
3955
- padding: var(--sp-sm) 16px;
3956
- }
3957
- /* the reader's own rung is the one warm thing on the ladder */
3958
- .rank-card--current { background: var(--accent-tint); border-color: color-mix(in srgb, var(--accent) 45%, transparent); }
3959
- .rank-card--next { border-style: dashed; border-color: var(--rule); }
3960
- .rank-card--sealed { opacity: 0.7; }
3961
- .rank-card--placeholder { color: var(--ink-faint); }
3962
- .rank-card__head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
3963
- .rank-card__title { font-family: var(--font-display); font-weight: 400; font-size: 16px; letter-spacing: -0.02em; }
3964
- .rank-card__status {
3965
- margin-left: auto;
3966
- font-family: var(--label-face);
3967
- font-size: var(--label-size);
3968
- font-weight: 400;
3969
- letter-spacing: var(--label-space);
3970
- text-transform: var(--label-case);
3971
- }
3972
- .rank-card__status--current { color: var(--accent-ink); }
3973
- .rank-card__status--next { color: var(--info); }
3974
- .rank-card__status--sealed { color: var(--ink-faint); }
3975
- .rank-card__blurb { font-size: 13px; color: var(--ink-soft); margin: 6px 0; max-width: var(--measure); }
3976
- .rank-card__blurb--sealed { font-style: italic; }
3977
- .rank-card__unlocks-label {
3978
- font-family: var(--label-face);
3979
- font-size: var(--label-size);
3980
- font-weight: 400;
3981
- letter-spacing: var(--label-space);
3982
- text-transform: var(--label-case);
3983
- color: var(--ink-faint);
3984
- margin: 10px 0 4px;
3985
- }
3986
- .rank-card__list { margin: 0; padding-left: 18px; font-size: 13px; color: var(--ink-soft); max-width: var(--measure); }
3987
- .rank-card__list li { margin: 2px 0; }
3988
- .rank-card__list li::marker { color: var(--ink-faint); }
3989
3942
  .ranks-rise__body { font-size: 13.5px; max-width: var(--measure); }
3990
3943
  .ranks-rise__body p { margin: 8px 0; }
3991
3944
 
@@ -58,8 +58,8 @@
58
58
  time so the chrome exists before the deferred page scripts execute. -->
59
59
  <script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
60
60
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
61
- <script src="/builders/craft-mode.js?v=2026-10-30-market-watch"></script>
62
- <script src="/builders/shell.js?v=2026-11-04-one-market-watch"></script>
61
+ <script src="/builders/craft-mode.js?v=2026-11-04-money"></script>
62
+ <script src="/builders/shell.js?v=2026-11-04-money"></script>
63
63
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
64
64
  <script src="/builders/palette.js" defer></script>
65
65
  <!-- task-detail.js still owns the #/idea/N and #/blocker/N deep-link overlay
@@ -140,8 +140,8 @@
140
140
 
141
141
  <script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
142
142
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
143
- <script src="/builders/craft-mode.js?v=2026-10-30-market-watch"></script>
144
- <script src="/builders/shell.js?v=2026-11-04-one-market-watch"></script>
143
+ <script src="/builders/craft-mode.js?v=2026-11-04-money"></script>
144
+ <script src="/builders/shell.js?v=2026-11-04-money"></script>
145
145
  <script src="/builders/palette.js" defer></script>
146
146
 
147
147
  <script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
@@ -144,8 +144,8 @@
144
144
 
145
145
  <script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
146
146
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
147
- <script src="/builders/craft-mode.js?v=2026-10-30-market-watch"></script>
148
- <script src="/builders/shell.js?v=2026-11-04-one-market-watch"></script>
147
+ <script src="/builders/craft-mode.js?v=2026-11-04-money"></script>
148
+ <script src="/builders/shell.js?v=2026-11-04-money"></script>
149
149
  <script src="/builders/palette.js" defer></script>
150
150
  <script src="/builders/brand-holes.js?v=2026-09-29-aqfix"></script>
151
151
  <script src="/builders/tweak-editor-lib.js?v=2026-09-29-tw27"></script>
@@ -167,8 +167,8 @@
167
167
  chrome exists before the page script runs. -->
168
168
  <script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
169
169
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
170
- <script src="/builders/craft-mode.js?v=2026-10-30-market-watch"></script>
171
- <script src="/builders/shell.js?v=2026-11-04-one-market-watch"></script>
170
+ <script src="/builders/craft-mode.js?v=2026-11-04-money"></script>
171
+ <script src="/builders/shell.js?v=2026-11-04-money"></script>
172
172
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
173
173
  <script src="/builders/palette.js" defer></script>
174
174
  <!-- shared component kit (window.OTBKit) — tabs, ledger, pager (task 2166). -->
@@ -173,8 +173,8 @@
173
173
  time so the chrome exists before the deferred page scripts execute. -->
174
174
  <script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
175
175
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
176
- <script src="/builders/craft-mode.js?v=2026-10-30-market-watch"></script>
177
- <script src="/builders/shell.js?v=2026-11-04-one-market-watch"></script>
176
+ <script src="/builders/craft-mode.js?v=2026-11-04-money"></script>
177
+ <script src="/builders/shell.js?v=2026-11-04-money"></script>
178
178
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
179
179
  <script src="/builders/palette.js" defer></script>
180
180
  <!-- task 1004727: the ONE karma vote control every task/idea list renders -->
@@ -1,17 +1,17 @@
1
- # The founding mark — a seed badge on the roster, the profile and the ranks page, and the founding wall on Home (task 1004424)
1
+ # The founding mark — a seed badge on the roster and the profile, and the founding wall on Home (task 1004424)
2
2
 
3
3
  **BV2.PS10 (goal 1000121; spec `docs/specs/<redacted>.md` D1).** The canvas frame is `docs/design/mocks/project-startup/FoundingBuilders.dc.html`. Everyone who joined while the project was being founded is a founding builder, numbered in join order; the project owner is "founder". **It is a mark, not a rank: it grants nothing**, and nothing in the hall or on the server reads it to decide anything.
4
4
 
5
- Files: `founding-mark.js` (`window.OTBFounding`: one shared read of `GET /api/bongos/founding/builders`, the pill, the plain "Joined at scope, day 3 of genesis" sentence), plus a few lines in `roster.js`, `profile.js`, `ranks.js` (+ a hidden `#founding-scroll` section in `ranks.html`) and the `home-founding` widget in `hall-widgets.js`. The CSS sits beside the founding band in `style.css`. The data is `modules/onboarding/founding-builders.js`.
5
+ Files: `founding-mark.js` (`window.OTBFounding`: one shared read of `GET /api/bongos/founding/builders`, the pill, the plain "Joined at scope, day 3 of genesis" sentence), plus a few lines in `roster.js` and `profile.js` and the `home-founding` widget in `hall-widgets.js`. The CSS sits beside the founding band in `style.css`. The data is `modules/onboarding/founding-builders.js`.
6
6
 
7
7
  ## Blended, not re-skinned
8
8
 
9
9
  The canvas draws its own hall chrome: a ranks table, seed images, an emblem wall. The live hall wins (the blend rule), so the mark is built from the hall's own parts:
10
10
 
11
11
  - **The pill is `.rank-badge`'s grammar**: the same 24px height, 11.5px/600 type and full radius, so it sits beside a rank without competing with it. The seed is a dot in `--accent`, the founding band's live-state colour, because the mark is that state made permanent. It is not a link, because it confers nothing.
12
- - **The ranks page has no builders table** (it shows the viewer's own standing), so the canvas's "column on the ranks page" is a `Founding builders` ledger section on that page: builder | rank | mark. It is not a new page.
12
+ - **The ranks page had no builders table**, so the canvas's "column on the ranks page" was a `Founding builders` ledger section there. That page folded into the Primer in task 1005046 and the ledger went with it: the roster and the founding wall already list every founder.
13
13
  - **The wall is a core Home widget in `home-main`**, which brings that zone to its budget of three. It is hidden by default and fills itself from the shared read.
14
14
 
15
15
  ## Off is today's hall
16
16
 
17
- A project that was never founded has no founding window, so the read returns an empty list without querying, and every surface renders exactly as before. The roster row of an unmarked builder is byte-identical, the ranks section stays `hidden`, and the wall never unhides. `tests/founding_builders.mjs` runs the real `roster.js` and `hall-widgets.js` to hold this. A signed-out viewer (the profile is public) gets a 401 on the read, which is the same empty list.
17
+ A project that was never founded has no founding window, so the read returns an empty list without querying, and every surface renders exactly as before. The roster row of an unmarked builder is byte-identical, and the wall never unhides. `tests/founding_builders.mjs` runs the real `roster.js` and `hall-widgets.js` to hold this. A signed-out viewer (the profile is public) gets a 401 on the read, which is the same empty list.
@@ -1,5 +1,7 @@
1
1
  # The reading rooms — the primer and the diagrams (task 1003306)
2
2
 
3
+ > Since task 1005046 the primer is the one reading room: `diagrams.css` and the diagrams index folded into its chapters.
4
+
3
5
  **The READING ROOMS landed next (task 1003306).** `room.css` is the archetype, the second after `record.css`; `primer.css` and `diagrams.css` then hold only what one room has and the other does not. **The classes stay `primer-`-prefixed on purpose**: `diagram-viewer.js` upgrades `figure.diagram img, figure.primer-figure img` with one selector and `hall_audit` pins `.primer-article table`'s 760px scrollport by name, so the sheet is named for the room and the prefix is left alone. Four things it settled:
4
6
 
5
7
  - **ONE markdown parser.** `primer.js` carried its own copy of `md-reader.js`'s grammar *minus blockquotes*, so every `> aside` in the primer silently collapsed into a paragraph. The copy is gone; the primer keeps only the two things that are genuinely its own — the diagram injected after a named h2, and the one rewrite that sends `drachmae-and-karma.md` to `/builders/drachmae` instead of GitHub. **Anything the primer's markdown needs next belongs in `md-reader.js`**, where the economy reader gets it too.
@@ -1,5 +1,7 @@
1
1
  # The reference room — drachmae, at /drachmae (task 1003473)
2
2
 
3
+ > **Retired by task 1005046 (2026-11-04).** The page folded into the Primer as its credits-and-karma chapter, `/drachmae` redirects there, and the `room--reference` rules left `room.css`. Its live sections live on in `primer-live.js`. What follows is the history.
4
+
3
5
  **The REFERENCE room landed last (task 1003473)** — drachmae, the fifth and smallest redesign task under goal 1000081. It is the reading-room archetype (`room.css`) with ONE body modifier, `room--reference`, and not a second archetype: the room's composition — the head, the glass contents beside the `--bg-card` article, the measure — is right for a document people scan as much as for one they read, so what changes is the content rules (`room.css` §8, ADR 0228). Five things it settled:
4
6
 
5
7
  - **A reference has no end to reach, so the linear-read instruments are off.** No progress hairline (the markup is simply absent; §1 of the sheet stays for the primer, whose gate is fed by it), no section counters (`content: none` on the h2's and the contents' `::before`), no "About a five-minute read". `primer.css` is no longer loaded here: it holds only the acknowledge gate.
@@ -37,8 +37,12 @@ const WAKES = Object.freeze({
37
37
  scope: Object.freeze(['roadmap', 'goals', 'goal-map']),
38
38
  strategize: Object.freeze(['work']),
39
39
  charter: Object.freeze(['board-room']),
40
- legalize: Object.freeze(['economy']),
41
- legislation: Object.freeze(['ranks']),
40
+ // task 1005046: legalize woke Economy and legislation woke Ranks. Both pages
41
+ // are Primer chapters now (one reading room), and the Primer never sleeps —
42
+ // it is the newcomer's first read — so these two stages wake no sidebar room.
43
+ // The stages themselves are unchanged; only what they unlock in the nav is.
44
+ legalize: Object.freeze([]),
45
+ legislation: Object.freeze([]),
42
46
  });
43
47
  const WAKES_WHEN_ALIVE = Object.freeze(['collab', 'roster']);
44
48
 
@@ -9,7 +9,7 @@
9
9
  // reduced-motion pass per mode. Writes the shots + a JSON report; exits non-zero on any problem.
10
10
  //
11
11
  // node modules/ui-design/kit/render.js --page /projects (surface defaults to the public-landing module key)
12
- // node modules/ui-design/kit/render.js --page /builders/ranks --surface hall-ui
12
+ // node modules/ui-design/kit/render.js --page /builders/primer --surface hall-ui
13
13
  // node modules/ui-design/kit/render.js --states <file> (explicit file)
14
14
  // --modes dark,light --sizes 1440,390,320 --only a,b --out <dir>
15
15
  // --style <name> render under a look from the style library (STYLE= on the stubs; task 1003323)