@bongos/core 1.21.55 → 1.21.56

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.
@@ -289,7 +289,6 @@
289
289
  // the tiers whose label shows without a hover, most important first
290
290
  const LABEL_TIERS = Object.freeze(['urgent', 'needs', 'queue']);
291
291
  const MAX_CRATES = 3;
292
- const HINT = 'work moves left to right · orange waits on you · white is moving without you';
293
292
  const READING_KEYS = Object.freeze(['flow', 'promises', 'money', 'people', 'fairness', 'rules']);
294
293
  const READING_LABELS = Object.freeze({ flow: 'flow', promises: 'promises', money: 'money', people: 'people', fairness: 'fairness', rules: 'rules at work' });
295
294
  const READING_BUILDING = Object.freeze({ flow: 'review', promises: 'planning', money: 'treasury', people: 'people', fairness: 'disputes', rules: 'rules' });
@@ -626,7 +625,6 @@
626
625
  flat: flat, blds: blds, crates: crates, cols: cols, groups: groups, pins: pins, doors: doors, signs: signs,
627
626
  hud: { needs: docket ? String(needs) : '—', moving: docket ? String(moving) : '—', share: money(share), hot: needs > 0 },
628
627
  line: docket ? String(docket.line || '') : FALLBACK_LINE,
629
- hint: docket && !evening ? HINT : '',
630
628
  eveningLine: 'this month · ' + moving + ' moving · ' + settled + ' settled · ' + money(share) + ' to your share',
631
629
  label: 'The street: the nine civic buildings in the order work moves, and '
632
630
  + (goals.length === 1 ? 'one district' : goals.length + ' districts') + ', one for each open goal'
@@ -661,7 +659,7 @@
661
659
  whenWord: whenWord, reviewHeldOf: reviewHeldOf, monthShare: monthShare, money: money, parseHash: parseHash, buildingHref: buildingHref, districtHref: districtHref,
662
660
  streetModel: streetModel, cardFor: cardFor, placeLabels: placeLabels, labelBox: labelBox, shownLabels: shownLabels, pinLabel: pinLabel,
663
661
  G: G, SEGS: SEGS, GROUP_NAMES: GROUP_NAMES, CIVIC_KEYS: CIVIC_KEYS, READING_KEYS: READING_KEYS, ARTBOARD_W: ARTBOARD_W,
664
- PIN_W: PIN_W, PIN_LABEL: PIN_LABEL, LABEL_MAX_W: LABEL_MAX_W, PIN_STACK: PIN_STACK, MAX_CRATES: MAX_CRATES, MAX_DISTRICTS: MAX_DISTRICTS, GOALS_HREF: GOALS_HREF, HINT: HINT, FALLBACK_LINE: FALLBACK_LINE, HOME_HREF: '/builders/city',
662
+ PIN_W: PIN_W, PIN_LABEL: PIN_LABEL, LABEL_MAX_W: LABEL_MAX_W, PIN_STACK: PIN_STACK, MAX_CRATES: MAX_CRATES, MAX_DISTRICTS: MAX_DISTRICTS, GOALS_HREF: GOALS_HREF, FALLBACK_LINE: FALLBACK_LINE, HOME_HREF: '/builders/city',
665
663
  };
666
664
  root.GovStreet = api;
667
665
  if (typeof module !== 'undefined' && module.exports) module.exports = api;
@@ -93,7 +93,6 @@ html[data-fullscreen="on"] .street-top { padding-right: 184px; }
93
93
  .street-layer { position: absolute; left: 0; top: 0; width: 100%; height: 900px; pointer-events: none; }
94
94
  .street-layer > * { pointer-events: auto; }
95
95
 
96
- .street-hint { position: absolute; left: 0; right: 0; top: 84px; margin: 0; text-align: center; font-size: 11.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint); pointer-events: none; z-index: 2; }
97
96
  .street-evening { position: absolute; left: 0; right: 0; top: 104px; display: flex; flex-direction: column; align-items: center; gap: 10px; pointer-events: none; z-index: 2; }
98
97
  .street-evening[hidden] { display: none; }
99
98
  .street-evening__h { margin: 0; font-size: 46px; font-weight: 300; letter-spacing: -0.042em; line-height: 1; }
@@ -96,7 +96,6 @@
96
96
  <div class="street-window" id="streetWindow">
97
97
  <div class="street-sizer" id="streetSizer">
98
98
  <div class="street-board" id="streetBoard" role="group" aria-label="The street">
99
- <p class="street-hint" id="streetHint"></p>
100
99
  <div class="street-evening" id="streetEvening" hidden>
101
100
  <p class="street-evening__h">nothing waits on you.</p>
102
101
  <p class="street-evening__line" id="streetEveningLine"></p>
@@ -377,8 +377,6 @@
377
377
  var signs = $('streetSigns'); clear(signs);
378
378
  m.signs.forEach(function (sg) { signs.appendChild(drawSign(sg)); });
379
379
 
380
- var hint = $('streetHint');
381
- if (hint) { hint.textContent = m.hint; hint.hidden = !m.hint || !!view.open || showInside; }
382
380
  var eve = $('streetEvening');
383
381
  if (eve) eve.hidden = !(m.evening && !view.open) || showInside;
384
382
  var eveLine = $('streetEveningLine');
@@ -96,3 +96,13 @@ Owner decision 2026-10-04: Work categories was the last floor row that still lef
96
96
  Walked in the hall preview harness at 1440 and 375, light and dark: the rows, an open detail with its move chips, the rename and add fields, and a rename sent (the write answered inside the page, since the harness refuses writes) with its pip, toast and record line. Nothing was changed on the live site. The old Project settings page keeps its own category list.
97
97
 
98
98
  Tests: `tests/hall_street_desk.mjs` (the `1004580` cases) hold the server rows and their gates, every act's route, the move arithmetic, and on the page rename, retire and bring back, a move from the open detail, an add, and a refused act and a refused move that count nothing. `tests/goal_category.mjs` holds the grouped count.
99
+
100
+ ## No legend hint (task 1004581)
101
+
102
+ Owner decision 2026-10-04: the street should read at a glance without words, so the small grey line over the sky ("work moves left to right · orange waits on you · white is moving without you") is gone, in both themes and at every width. This is a deliberate departure from the prototype, whose `Street.dc.html` still draws the line; everything else on the reference board stands. The line was also wrong in light mode, where moving pins are black, not white.
103
+
104
+ - **Gone with it:** the `streetHint` element, the `.street-hint` style, the `HINT` constant and the model's `hint` field in `street-draw.js`, the code in `street.js` that showed and hid it, and its entry in `docs/page-readings.json` (regenerated).
105
+ - **No gap where it stood.** The line was laid over the sky, not in the flow, so the header and the reading band keep their places; walked in the hall preview harness at 1440 and 375, light and dark.
106
+ - **The evening view is unchanged** ("nothing waits on you." and its line still show when nothing needs you).
107
+
108
+ Tests: `tests/hall_street.mjs` asserts the model has no hint field, the module exports no `HINT`, and none of the street's four files carries the line; putting the markup or the constant back reds it.
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.21.55",
3
+ "version": "1.21.56",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.21.55",
9
+ "version": "1.21.56",
10
10
  "license": "AGPL-3.0-or-later",
11
11
  "dependencies": {
12
12
  "express": "^4.21.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.21.55",
3
+ "version": "1.21.56",
4
4
  "description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "main": "src/platform-server.js",
@@ -9102,5 +9102,11 @@
9102
9102
  "id": "1004580",
9103
9103
  "text": "Work categories can now be managed right on the Rules floor of the Governor City, with no trip to the old settings page. Each category is its own line showing how many goals use it. You can rename it, retire it or bring it bac"
9104
9104
  }
9105
+ ],
9106
+ "1.21.56": [
9107
+ {
9108
+ "id": "1004581",
9109
+ "text": "The street no longer shows the small grey line of words above the buildings. The owner wants the city to read at a glance from its look alone, and the line was also wrong in light mode. It is gone in light and dark and on phon"
9110
+ }
9105
9111
  ]
9106
9112
  }
package/src/module-api.js CHANGED
@@ -75,7 +75,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
75
75
  // MAJOR (see allowBoxScope below): passes the request through untouched.
76
76
  function deprecatedNoopMiddleware(_req, _res, next) { next(); }
77
77
 
78
- const CORE_VERSION = '1.21.55'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
78
+ const CORE_VERSION = '1.21.56'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
79
79
 
80
80
  // A namespaced logger so a module's log lines are attributable + consistent.
81
81
  // Usage: const log = api.logger('discord'); log.info('mounted');
@@ -245,7 +245,7 @@ function fakeDom() {
245
245
  get innerHTML() { throw new Error('the card must not read innerHTML'); },
246
246
  set innerHTML(v) { throw new Error('the card must not write innerHTML'); },
247
247
  });
248
- const ids = ['streetMode', 'streetModeIcon', 'streetModeWord', 'streetWindow', 'streetSizer', 'streetBoard', 'streetSvg', 'streetFlat', 'streetBlds', 'streetCrates', 'streetCols', 'streetGroups', 'streetDoors', 'streetPins', 'streetSigns', 'streetHint', 'streetEvening', 'streetEveningLine', 'hudNeeds', 'hudMoving', 'hudShare', 'hudDot', 'streetHome', 'streetCard', 'streetCardWhere', 'streetCardWhen', 'streetCardTitle', 'streetCardBody', 'streetCardOpen', 'streetCardClose', 'streetToast'];
248
+ const ids = ['streetMode', 'streetModeIcon', 'streetModeWord', 'streetWindow', 'streetSizer', 'streetBoard', 'streetSvg', 'streetFlat', 'streetBlds', 'streetCrates', 'streetCols', 'streetGroups', 'streetDoors', 'streetPins', 'streetSigns', 'streetEvening', 'streetEveningLine', 'hudNeeds', 'hudMoving', 'hudShare', 'hudDot', 'streetHome', 'streetCard', 'streetCardWhere', 'streetCardWhen', 'streetCardTitle', 'streetCardBody', 'streetCardOpen', 'streetCardClose', 'streetToast'];
249
249
  for (const id of ids) mk('x').setAttribute('id', id);
250
250
  byId.get('streetToast').hidden = true; // as the page ships it
251
251
  const document = { documentElement: mk('html'), getElementById: (id) => byId.get(id) || null, createElement: (t) => mk(t), createElementNS: (_ns, t) => mk(t) };
@@ -382,9 +382,18 @@ test('the windows light (evening) only when the docket was read and nothing need
382
382
  assert.equal(model({ docket: docket([matter({ state: 'moving' })]) }).evening, true);
383
383
  assert.equal(model({ docket: docket([matter({ state: 'needs' })]) }).evening, false);
384
384
  const m = model({ docket: docket([matter({ state: 'moving' }), matter({ id: 'x:2', state: 'settled' })]), earnings: { days: [{ day: '2026-10-01', credits: 24 }] } });
385
- assert.equal(m.hint, '', 'the hint gives way to the evening');
386
385
  assert.equal(m.eveningLine, 'this month · 1 moving · 1 settled · $24 to your share');
387
- assert.equal(model({ docket: docket([matter()]) }).hint, S.HINT);
386
+ });
387
+
388
+ test('the street carries no legend hint line (owner decision 2026-10-04, task 1004581)', () => {
389
+ for (const m of [model(), model({ docket: docket([matter()]) }), model({ docket: docket([matter({ state: 'moving' })]) })]) {
390
+ assert.equal('hint' in m, false, 'the model has no hint field');
391
+ }
392
+ assert.equal('HINT' in S, false, 'street-draw exports no HINT');
393
+ for (const f of ['street.html', 'street.css', 'street.js', 'street-draw.js']) {
394
+ const src = fs.readFileSync(path.join(ROOT, 'modules/hall-ui/public', f), 'utf8');
395
+ assert.doesNotMatch(src, /street-hint|streetHint|orange waits on you/, f + ' carries no hint line');
396
+ }
388
397
  });
389
398
 
390
399
  // ── districts: one door per open goal ───────────────────────────────────────
@@ -539,7 +548,7 @@ function fakeDom() {
539
548
  };
540
549
  const focused = { el: null };
541
550
  const html = mk('html');
542
- const ids = ['streetMode', 'streetModeIcon', 'streetModeWord', 'streetWindow', 'streetSizer', 'streetBoard', 'streetSvg', 'streetFlat', 'streetBlds', 'streetCrates', 'streetCols', 'streetGroups', 'streetDoors', 'streetPins', 'streetSigns', 'streetHint', 'streetEvening', 'streetEveningLine', 'hudNeeds', 'hudMoving', 'hudShare', 'hudDot', 'streetHome', 'streetCard', 'streetCardWhere', 'streetCardWhen', 'streetCardTitle', 'streetCardBody', 'streetCardOpen', 'streetCardClose', 'streetToast'];
551
+ const ids = ['streetMode', 'streetModeIcon', 'streetModeWord', 'streetWindow', 'streetSizer', 'streetBoard', 'streetSvg', 'streetFlat', 'streetBlds', 'streetCrates', 'streetCols', 'streetGroups', 'streetDoors', 'streetPins', 'streetSigns', 'streetEvening', 'streetEveningLine', 'hudNeeds', 'hudMoving', 'hudShare', 'hudDot', 'streetHome', 'streetCard', 'streetCardWhere', 'streetCardWhen', 'streetCardTitle', 'streetCardBody', 'streetCardOpen', 'streetCardClose', 'streetToast'];
543
552
  for (const id of ids) mk('x').setAttribute('id', id);
544
553
  const document = { documentElement: html, getElementById: (id) => byId.get(id) || null, createElement: (t) => mk(t), createElementNS: (_ns, t) => mk(t) };
545
554
  return { document, byId, html, focused };