@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,83 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <title>Ranks — {{worldName}}</title>
7
- <meta name="description" content="The ranks a builder of {{worldName}} can hold, what each unlocks, and how to advance.">
8
- <link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
9
- <link rel="preconnect" href="https://fonts.googleapis.com">
10
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
12
- </head>
13
- <body data-page="ranks" data-page-title="Ranks">
14
-
15
- <div class="app">
16
- <aside class="app-sidebar" id="app-sidebar" aria-label="Primary"></aside>
17
- <div class="app-scrim" id="app-scrim" hidden></div>
18
- <div class="app-body">
19
- <header class="app-topbar" id="app-topbar"></header>
20
- <div class="app-content">
21
- <!-- The page's one h1, for screen readers: no page shows its head (task
22
- 1004836), so its eyebrow and sub-line went in task 1004828. -->
23
- <div class="page-head page-head--room">
24
- <h1 class="page-head__h">Ranks</h1>
25
- </div>
26
-
27
- <main id="hall-main">
28
- <!-- Current rank summary — filled by ranks.js once /me resolves. -->
29
- <section class="scroll" id="standing-scroll" aria-labelledby="standing-h">
30
- <h2 id="standing-h" class="scroll__h">Where you stand</h2>
31
- <div class="ranks-standing" id="standing-body">
32
- <div class="hall-loading" role="status">Loading…</div>
33
- </div>
34
- </section>
35
-
36
- <!-- The founding builders (task 1004424) — everyone who joined while the
37
- project was founding, with their mark beside their rank. Hidden, and
38
- never fetched into view, on a project that was never founded. -->
39
- <section class="scroll" id="founding-scroll" aria-labelledby="founding-h" hidden>
40
- <h2 id="founding-h" class="scroll__h">Founding builders</h2>
41
- <p class="scroll__lede">The founding mark is numbered in the order people joined while the project was founded. It is kept for good and grants nothing.</p>
42
- <div id="founding-body"></div>
43
- </section>
44
-
45
- <!-- The ladder — one card per rank. Current + next are shown in full;
46
- ranks beyond the next keep their unlock details hidden until the
47
- builder is one rank below them. -->
48
- <section class="scroll" id="ladder-scroll" aria-labelledby="ladder-h">
49
- <h2 id="ladder-h" class="scroll__h">The ranks, lowest to highest</h2>
50
- <p class="scroll__lede">Each rank opens more of the system. Yours and the one above are shown in full; the rest open as you get closer.</p>
51
- <ol class="ranks-ladder" id="ladder-body">
52
- <li class="hall-loading" role="status">Loading…</li>
53
- </ol>
54
- </section>
55
-
56
- <!-- How promotion works — filled in by ranks.js, tailored to the next rank. -->
57
- <section class="scroll" id="rise-scroll" aria-labelledby="rise-h">
58
- <h2 id="rise-h" class="scroll__h">How you advance</h2>
59
- <div class="ranks-rise" id="rise-body">
60
- <div class="hall-loading" role="status">Loading…</div>
61
- </div>
62
- </section>
63
- </main>
64
-
65
- <footer class="app-foot" id="app-foot"></footer>
66
- </div>
67
- </div>
68
- </div>
69
-
70
- <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
71
-
72
- <!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
73
- chrome exists before the page script runs. -->
74
- <script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
75
- <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
76
- <script src="/builders/craft-mode.js?v=2026-10-30-market-watch"></script>
77
- <script src="/builders/shell.js?v=2026-11-04-one-market-watch"></script>
78
- <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
79
- <script src="/builders/palette.js" defer></script>
80
- <script src="/builders/founding-mark.js?v=2026-09-30-founding"></script>
81
- <script src="/builders/ranks.js?v=2026-09-30-founding"></script>
82
- </body>
83
- </html>
@@ -1,229 +0,0 @@
1
- // public-builders/ranks.js — the ranks page (/builders/ranks).
2
- //
3
- // Read-only. Fetches /api/bongos/me to learn the viewer's rank, then renders the
4
- // rank ladder with the "reveal only as far as the next rank" rule: the current
5
- // rank and the one directly above it show their full unlocks; higher ranks
6
- // keep their unlock details hidden until the builder is one rank below them
7
- // (named, but details withheld). On a 401 it redirects into the web sign-in
8
- // flow, exactly like the hall index — the page personalises to the viewer, so
9
- // it needs a session.
10
- //
11
- // The rank model is the four live ranks of ADR 0018 + ADR 0034:
12
- // xenos < thetes < metic < archon. RANK_UNLOCKS is mirrored from builders.js /
13
- // docs/canonical-permissions.md.
14
-
15
- (() => {
16
- 'use strict';
17
-
18
- const API = '/api/bongos';
19
- // Generated typed client (task 1996 / R09), served as window.BongosClient by
20
- // /lib/bongos-client.js. baseUrl:'' passes the full `${API}/...` URLs below
21
- // through unchanged; result-mode ({ status, ok, data }) preserves control flow 1:1.
22
- const api = window.BongosClient.createClient({ baseUrl: '', credentials: 'same-origin', throwOnError: false });
23
-
24
- // escapeHtml / $ / rankLabel / toast now come from the shared window.OTB
25
- // toolkit (dom-utils.js, loaded first). Thin wrappers keep this file's exact
26
- // variants ('—' rankLabel empty; a 2600ms clearing toast). badge() +
27
- // RANK_UNLOCKS + RANK_LADDER stay local below.
28
- const { escapeHtml, $ } = window.OTB;
29
- const rankLabel = (rank) => window.OTB.rankLabel(rank);
30
- const toast = (msg) => window.OTB.toast(msg, { duration: 2600, clear: true });
31
- const curLabel = (caps) => { const l = (window.__BRANDING__ && window.__BRANDING__.currency && window.__BRANDING__.currency.label) || 'credits'; return caps ? l.charAt(0).toUpperCase() + l.slice(1) : l; };
32
-
33
- // Lowest → highest. Index is the rung number.
34
- const RANK_LADDER = ['xenos', 'thetes', 'metic', 'archon'];
35
-
36
- // Plain title + one-line character for each rank.
37
- const RANK_TITLE = {
38
- xenos: 'The newcomer',
39
- thetes: 'The proven builder',
40
- metic: 'The trusted builder',
41
- archon: 'The steward',
42
- };
43
- const RANK_BLURB = {
44
- xenos: 'A newcomer with a deliberately small surface: onboarding, safe starter tasks, and your own standing.',
45
- thetes: 'A builder who has shipped their first work — the day-to-day surfaces are open.',
46
- metic: 'A trusted builder: triage, reviews, planning sessions, and security reporting are open.',
47
- archon: 'The steward of the whole system — approvals, the roster, budgets, and the Archon pages.',
48
- };
49
-
50
- // What each rank unlocks. Mirror of builders.js RANK_UNLOCKS — sourced from
51
- // docs/canonical-permissions.md. Keep the two in sync.
52
- const RANK_UNLOCKS = {
53
- xenos: [
54
- 'Read every public page.',
55
- 'Claim and ship tasks an Archon has flagged newcomer-friendly.',
56
- `Earn ${curLabel()} for shipped work and karma for ratified ideas.`,
57
- ],
58
- thetes: [
59
- 'Claim and ship any task in the general queue — no longer only newcomer-friendly work.',
60
- `Keep earning ${curLabel()} and karma for every clean ship.`,
61
- 'No triage, blockers, planning, or task-shaping yet — those levers open at Metic.',
62
- ],
63
- metic: [
64
- 'Claim and ship any task in the ready queue.',
65
- 'Triage the idea inbox; resolve blockers; run planning sessions.',
66
- 'Propose new version criteria for Archon ratification.',
67
- ],
68
- archon: [
69
- 'Create, promote, and edit tasks; reshape the dependency graph.',
70
- 'Grant or revoke ranks; close versions; confirm ships past the grader.',
71
- 'Adjudicate vulnerability reports and override requests.',
72
- ],
73
- };
74
-
75
- // How a builder rises FROM their current rank. Keyed by current rank; the
76
- // value describes the climb to the next rung. Archon is the top — no climb.
77
- // NB: these strings INTENTIONALLY contain markup (<strong>) and are injected
78
- // via innerHTML below without escaping. That is safe only because they are
79
- // author-controlled constants. Never source RISE_FROM from server/user data
80
- // without switching the render site to escapeHtml — it would become XSS.
81
- const RISE_FROM = {
82
- xenos:
83
- `Claim and ship the newcomer-friendly tasks an Archon has opened to newcomers. Each clean ship earns ${curLabel()}; each ratified idea earns karma. On your <strong>third</strong> clean ship you are promoted automatically to <strong>Thetes</strong> — out of the newcomer sandbox, with the whole queue open to you. No fee, no application; the third ship does it.`,
84
- thetes:
85
- 'You have the run of the queue. Promotion to <strong>Metic</strong> — triage, blockers, planning, the shaping of work — is granted by a standing Archon alone, to a builder whose judgment has earned the project’s trust. Keep shipping; rank is granted, never bought.',
86
- metic:
87
- 'The <strong>Archon</strong> rank is granted rarely, by a standing Archon alone, to a Metic who has shaped the project’s direction and earned its deepest trust. There is no checklist — only the weight of what you have built.',
88
- archon:
89
- 'You hold the highest rank. There is no rank above it — only the care of everything below.',
90
- };
91
-
92
- function badge(rank) {
93
- const variant = RANK_LADDER.includes(rank) ? `rank-badge--${rank}` : 'rank-badge--unknown';
94
- return `<span class="rank-badge ${variant}">${escapeHtml(rankLabel(rank))}</span>`;
95
- }
96
-
97
- function unlockList(rank) {
98
- const items = (RANK_UNLOCKS[rank] || []).map((u) => `<li>${escapeHtml(u)}</li>`).join('');
99
- return `<ul class="rank-card__list">${items}</ul>`;
100
- }
101
-
102
- // Render one revealed rank. `state` is 'attained' | 'current' | 'next'.
103
- function revealedCard(rank, state) {
104
- const statusText = {
105
- attained: 'Attained',
106
- current: 'You are here',
107
- next: 'Next rank',
108
- }[state];
109
- return `
110
- <li class="rank-card rank-card--${state}">
111
- <div class="rank-card__head">
112
- ${badge(rank)}
113
- <span class="rank-card__status rank-card__status--${state}">${statusText}</span>
114
- </div>
115
- <p class="rank-card__title">${escapeHtml(RANK_TITLE[rank] || rankLabel(rank))}</p>
116
- <p class="rank-card__blurb">${escapeHtml(RANK_BLURB[rank] || '')}</p>
117
- <p class="rank-card__unlocks-label">What it unlocks</p>
118
- ${unlockList(rank)}
119
- </li>`;
120
- }
121
-
122
- // Render one hidden rank — named, but its details withheld until the builder
123
- // is one rank below it. (Per Lars: show the name, keep the unlocks a mystery.)
124
- function sealedCard(rank) {
125
- return `
126
- <li class="rank-card rank-card--sealed">
127
- <div class="rank-card__head">
128
- ${badge(rank)}
129
- <span class="rank-card__status rank-card__status--sealed">Hidden</span>
130
- </div>
131
- <p class="rank-card__title">${escapeHtml(RANK_TITLE[rank] || rankLabel(rank))}</p>
132
- <p class="rank-card__blurb rank-card__blurb--sealed">A higher rank. Its details are hidden until you reach the rank directly below it.</p>
133
- </li>`;
134
- }
135
-
136
- function render(builder) {
137
- const rank = (builder && RANK_LADDER.includes(builder.rank)) ? builder.rank : 'xenos';
138
- const curIdx = RANK_LADDER.indexOf(rank);
139
- const nextIdx = curIdx < RANK_LADDER.length - 1 ? curIdx + 1 : -1;
140
- // Reveal everything up to and including the next rung; seal what's above.
141
- const revealUpTo = Math.max(curIdx, nextIdx);
142
-
143
- // No header sub-line: no page shows its head (task 1004836), and "Where
144
- // you stand" below already names the rank and its title (task 1004828).
145
-
146
- // ---- "where you stand" summary ----
147
- const standing = $('#standing-body');
148
- if (standing) {
149
- const nextLine = nextIdx >= 0
150
- ? `The rank above yours is ${badge(RANK_LADDER[nextIdx])}. See below what it grants.`
151
- : 'You hold the highest rank.';
152
- standing.innerHTML = `
153
- <div class="ranks-standing__badge">${badge(rank)}</div>
154
- <div class="ranks-standing__text">
155
- <p class="ranks-standing__title">${escapeHtml(RANK_TITLE[rank] || rankLabel(rank))}</p>
156
- <p class="ranks-standing__blurb">${escapeHtml(RANK_BLURB[rank] || '')}</p>
157
- <p class="ranks-standing__next">${nextLine}</p>
158
- </div>`;
159
- }
160
-
161
- // ---- the ladder ----
162
- const ladder = $('#ladder-body');
163
- if (ladder) {
164
- ladder.innerHTML = RANK_LADDER.map((r, i) => {
165
- if (i > revealUpTo) return sealedCard(r);
166
- if (i === curIdx) return revealedCard(r, 'current');
167
- if (i === nextIdx) return revealedCard(r, 'next');
168
- return revealedCard(r, 'attained');
169
- }).join('');
170
- }
171
-
172
- // ---- how you advance ----
173
- const rise = $('#rise-body');
174
- if (rise) {
175
- rise.innerHTML = `<p class="ranks-rise__body">${RISE_FROM[rank] || RISE_FROM.xenos}</p>`;
176
- }
177
- }
178
-
179
- async function load() {
180
- let payload;
181
- try {
182
- const res = await api.request('GET', `${API}/me`);
183
- if (res.status === 401) {
184
- window.location.assign(`${API}/auth/web/start`);
185
- return;
186
- }
187
- if (!res.ok) throw new Error(`me → ${res.status}`);
188
- payload = res.data;
189
- } catch (err) {
190
- console.error('[ranks] failed to load standing', err);
191
- // The message sits where the rank would have been — the head that used
192
- // to carry it is hidden (task 1004828).
193
- const standing = $('#standing-body');
194
- if (standing) standing.innerHTML = '<div class="profile__placeholder">Could not load your rank. Reload to try again.</div>';
195
- toast('Could not load the ranks.');
196
- return;
197
- }
198
- // /me may return the builder under `.builder` or at the top level.
199
- const builder = (payload && payload.builder) ? payload.builder : payload;
200
- render(builder || {});
201
- renderFounding();
202
- }
203
-
204
- // ---- the founding builders (task 1004424) ----
205
- // A ledger of everyone who joined while the project was founding: builder, rank,
206
- // and the mark. The section stays hidden when nobody carries one, so a project
207
- // that was never founded shows today's page.
208
- function renderFounding() {
209
- const section = $('#founding-scroll');
210
- const body = $('#founding-body');
211
- if (!section || !body || !window.OTBFounding) return;
212
- window.OTBFounding.load().then((list) => {
213
- if (!list.length) return;
214
- const rows = list.map((m) => {
215
- const name = escapeHtml(m.display_name || m.github_login || 'builder');
216
- return `<tr>
217
- <td><a class="founding-name" href="/profile?id=${encodeURIComponent(m.builder_id)}">${name}</a>
218
- <span class="founding-line">${escapeHtml(window.OTBFounding.joinedLine(m))}</span></td>
219
- <td>${badge(m.rank)}</td>
220
- <td>${window.OTBFounding.chipHtml(m)}</td>
221
- </tr>`;
222
- }).join('');
223
- body.innerHTML = `<table class="ledger"><thead><tr><th>Builder</th><th>Rank</th><th>Mark</th></tr></thead><tbody>${rows}</tbody></table>`;
224
- section.hidden = false;
225
- });
226
- }
227
-
228
- load();
229
- })();
@@ -1,15 +0,0 @@
1
- {
2
- "_": "The hall's Ranks page as the SECOND surface through modules/ui-design/kit/render.js (task 1003320): the hall serves under /builders/, signed out and in.",
3
- "page": "/builders/ranks",
4
- "surface": "hall-ui",
5
- "stub": { "prefix": "/builders/" },
6
- "modeQuery": false,
7
- "_feeds": "The hall's shell polls goals + inbox + profile feeds on every page; the stub fixtures only the public feeds, so those 404s are declared here, not hidden by the kit. (The 24px-floor and h1 findings this file used to carry in the open are FIXED, not silenced: the badge grew to 24px in task 1003304, and the page got its <h1> with the reading-room re-skin in task 1003306. The render is clean; nothing here ignores a floor.)",
8
- "ignoreRequests": ["/api/(gds|bongos)/me$", "/api/(gds|bongos)/goals", "/api/(gds|bongos)/inbox/", "/api/(gds|bongos)/me/"],
9
- "ignoreConsole": ["/api/(gds|bongos)/me", "\\b401\\b", "Unauthorized", "404 \\(Not Found\\)", "goals load failed"],
10
- "states": {
11
- "out": { "auth": false },
12
- "in": { "auth": true }
13
- },
14
- "reducedMotion": { "auth": true }
15
- }