@bongos/core 1.19.1008 → 1.19.1009

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 CHANGED
@@ -2,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/gds/package-core.js",
5
- "core_version": "1.19.1008",
6
- "core_contract": "1.19.1008",
7
- "source_commit": "e583787f8d0336097d7d222b97215439dc14af27",
5
+ "core_version": "1.19.1009",
6
+ "core_contract": "1.19.1009",
7
+ "source_commit": "f333a382d30859ea9dd83b8e0413b1bcf4e38b66",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-09-24T20:09:45.504Z",
9
+ "built_at": "2026-09-24T20:42:02.062Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 521,
12
+ "docs_redacted": 522,
13
13
  "agent_docs_stubbed": 26,
14
- "functional_verbatim": 2417,
14
+ "functional_verbatim": 2420,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 2964,
20
- "tree_sha256": "6758f1a3f507c3dbda7433c115fecd8580630e00ab560c84bb7021951cc24e93",
19
+ "file_count": 2968,
20
+ "tree_sha256": "aa0d298bf24c87953cdd7448f2b0a543b2fbcbbdde10b5f805773313dd535202",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -2722,7 +2722,7 @@
2722
2722
  {
2723
2723
  "path": "docs/module-api-changelog.md",
2724
2724
  "mode": "0000644",
2725
- "sha256": "70b574fec22d599e3301b9f53d0710f57842eb04f7fb641ea89adc0f4a1737c0"
2725
+ "sha256": "6edfd1a8650655c13f38f17ce919839b0ff0d2412f64dd8c0bb2c415d594450c"
2726
2726
  },
2727
2727
  {
2728
2728
  "path": "docs/modules-contract.md",
@@ -8217,12 +8217,12 @@
8217
8217
  {
8218
8218
  "path": "package-lock.json",
8219
8219
  "mode": "0000644",
8220
- "sha256": "bf1d76df4fece9153f951a23a4ff641653f334bda04faced44eb6de8a24d6191"
8220
+ "sha256": "19c087c0a7b0792f92c2de05f05d8aec5c231d14c79d31cdecc3d4c0c90fa51b"
8221
8221
  },
8222
8222
  {
8223
8223
  "path": "package.json",
8224
8224
  "mode": "0000644",
8225
- "sha256": "ed55e75f15d377f4174476d8e74c973b4a111597872a33c3e5ac44979a3e6f26"
8225
+ "sha256": "fb7688b54f3876cd4282c13c0d192ee507646c83f6348a4ec761534b7dc8d5a4"
8226
8226
  },
8227
8227
  {
8228
8228
  "path": "public-docs/index.html",
@@ -10267,7 +10267,7 @@
10267
10267
  {
10268
10268
  "path": "src/module-api.js",
10269
10269
  "mode": "0000644",
10270
- "sha256": "ee01cc7f65d099be7ec9803c9c43ec6df476f129a39e37d1efb948173055f8ff"
10270
+ "sha256": "7e3b7c7ffca3404a92e817e76b48a4963a9da6c72c1723318d45761c65ae97ad"
10271
10271
  },
10272
10272
  {
10273
10273
  "path": "src/module-loader/catalog.js",
@@ -11599,6 +11599,21 @@
11599
11599
  "mode": "0000644",
11600
11600
  "sha256": "8fd3ae3efc2a2c7f47e605925fec881c76dabe1fe8242ca67354b0a6a346e5e6"
11601
11601
  },
11602
+ {
11603
+ "path": "tests/fixtures/ideator-prefold/README.md",
11604
+ "mode": "0000644",
11605
+ "sha256": "d7f6de3e72863a605f75f1de7b8e73bdac7e6dce13c1e89afd9cb314a4c2aa66"
11606
+ },
11607
+ {
11608
+ "path": "tests/fixtures/ideator-prefold/ideas.html.baseline",
11609
+ "mode": "0000644",
11610
+ "sha256": "d7a88db7d9c561dc923a6e80b0573ad7d95aec8ab9ff5a7013eb1c946a8a5827"
11611
+ },
11612
+ {
11613
+ "path": "tests/fixtures/ideator-prefold/ideas.js.baseline",
11614
+ "mode": "0000644",
11615
+ "sha256": "2f532cacb06f0f074c15101c16578f3183104042644d6c8aa0d2e80fdb425b2f"
11616
+ },
11602
11617
  {
11603
11618
  "path": "tests/fixtures/session-506-digest.json",
11604
11619
  "mode": "0000644",
@@ -12554,6 +12569,11 @@
12554
12569
  "mode": "0000644",
12555
12570
  "sha256": "7b13dcdfb215890100a37f7a88722e4dd937b761fe9fa527b1a549de7016b7e8"
12556
12571
  },
12572
+ {
12573
+ "path": "tests/ideator_one_line_path_proof.mjs",
12574
+ "mode": "0000644",
12575
+ "sha256": "f1a131105d64c1c0490c814c13e2e6d067e6649c488c33ad60d9c046bb3d29a9"
12576
+ },
12557
12577
  {
12558
12578
  "path": "tests/ideator_traceable_proof.mjs",
12559
12579
  "mode": "0000644",
@@ -2490,5 +2490,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
2490
2490
  landed since 1.19.1006 with no explicit bump. run 36043267244. (task 1002620)
2491
2491
  1.19.1008 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2492
2492
  landed since 1.19.1007 with no explicit bump. run 36052924171. (task 1002620)
2493
+ 1.19.1009 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2494
+ landed since 1.19.1008 with no explicit bump. run 36056558236. (task 1002620)
2493
2495
  ---------------------------------------------------------------------------
2494
2496
  ```
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.1008",
3
+ "version": "1.19.1009",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.1008",
9
+ "version": "1.19.1009",
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.19.1008",
3
+ "version": "1.19.1009",
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",
package/src/module-api.js CHANGED
@@ -71,7 +71,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
71
71
  // there. scripts/gds/bump-version.js still rewrites the literal below; it appends
72
72
  // the entry to that file. Look for a version's history there, not here.
73
73
  // ---------------------------------------------------------------------------
74
- const CORE_VERSION = '1.19.1008'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
74
+ const CORE_VERSION = '1.19.1009'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
75
75
 
76
76
  // A namespaced logger so a module's log lines are attributable + consistent.
77
77
  // Usage: const log = api.logger('dev-box'); log.info('mounted');
@@ -0,0 +1,36 @@
1
+ # The pre-fold ideas page — a frozen baseline
2
+
3
+ Byte copies of `modules/hall-ui/public/ideas.html` and `ideas.js` as they stood at commit
4
+ **`f375a1f9`**, the commit immediately before the Full Idea form was folded behind a
5
+ disclosure (task [#1004087](https://cloudbongos.com/builders#/task/1004087), spec R04).
6
+
7
+ They exist so `tests/ideator_one_line_path_proof.mjs` can measure the current filing path
8
+ against **the page that actually existed**, rather than against a description of it. A
9
+ described baseline agrees with the current page because whoever wrote it made it agree;
10
+ these can only agree if the code does.
11
+
12
+ Re-cut them to check they have not drifted:
13
+
14
+ ```bash
15
+ git show f375a1f9:modules/hall-ui/public/ideas.js > tests/fixtures/ideator-prefold/ideas.js.baseline
16
+ git show f375a1f9:modules/hall-ui/public/ideas.html > tests/fixtures/ideator-prefold/ideas.html.baseline
17
+ ```
18
+
19
+ ## Do not edit these, and do not "fix" them
20
+
21
+ They are **evidence, not source**. Every finding in
22
+ [`docs/governance/<redacted>.md`](../../../docs/governance/<redacted>.md)
23
+ is a comparison against them, so editing one silently turns a measurement into a tautology.
24
+ The proof's last claim exists for exactly that: it asserts the baseline still fetches the
25
+ template unconditionally, still knows nothing about a disclosure, and is still a different
26
+ file from the live page — so tidying these into agreement reds the suite instead of passing
27
+ quietly.
28
+
29
+ ## Why the `.baseline` extension
30
+
31
+ Not decoration, and not a way around a gate. `scripts/gds/fitness-ratchets.js` measures
32
+ cross-file duplication over `git ls-files '*.js'`, and a frozen copy of a live file is, by
33
+ construction, ~500 duplicate windows against it. That metric exists to find copy/paste a
34
+ maintainer should collapse; collapsing *this* copy would destroy the only thing it is for.
35
+ The extension states what the file is — recorded evidence, never loaded, never edited — and
36
+ keeps the duplication ratchet honest about the code it was written to police.
@@ -0,0 +1,210 @@
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>Ideas — {{worldName}}</title>
7
+ <meta name="description" content="Write a Full Idea: five questions that turn a thought into a baseline scope of work someone else can deliver against, with a live completeness score.">
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
+ <link rel="stylesheet" href="/builders/ideas.css">
13
+ </head>
14
+ <body data-page="ideas" data-page-title="Ideas">
15
+
16
+ <div class="app">
17
+ <aside class="app-sidebar" id="app-sidebar" aria-label="Primary"></aside>
18
+ <div class="app-scrim" id="app-scrim" hidden></div>
19
+ <div class="app-body">
20
+ <header class="app-topbar" id="app-topbar"></header>
21
+ <!-- --railed reserves the room the meter occupies (style.css, "the right
22
+ rail"). This page used to take that room by overriding
23
+ `.app-content > main` from its own sheet, which is a page editing shell
24
+ layout — invisible from the shell, and it hard-coded a topbar height. -->
25
+ <div class="app-content app-content--railed">
26
+ <!-- The page's own name, in the LABEL voice — the display face is saved for
27
+ section headings (the work.html precedent, task 1003304). The page had
28
+ no h1 at all, so it failed one-header-main-h1 on every render. -->
29
+ <div class="page-head page-head--board">
30
+ <h1 class="page-head__h">Ideas</h1>
31
+ <p class="page-head__sub" id="fi-sub">Loading the idea template…</p>
32
+ </div>
33
+
34
+ <main id="hall-main">
35
+ <!-- The spark queue (task 1002930 / R154). ABOVE the composer, because
36
+ "what is already waiting" is the thing to scan before starting
37
+ something new — and because a queue nobody sees is not a pickup
38
+ surface. Collapsed to a single line when empty so it never pushes the
39
+ composer down the page for nothing. -->
40
+ <section class="scroll" id="fi-queue-scroll" aria-labelledby="fi-queue-h">
41
+ <h2 id="fi-queue-h" class="scroll__h">Waiting to be developed</h2>
42
+ <p class="scroll__lede">
43
+ Ideas whose author has said "I had the thought but not the full picture".
44
+ Anyone can develop one — the author keeps the credit for having had it,
45
+ and you are recorded as its developer.
46
+ </p>
47
+ <div id="fi-queue"><p class="fi-note">Loading…</p></div>
48
+ </section>
49
+
50
+ <!-- Quick filing (task 1003069 / R08, goal 1000071 "Idea routing") —
51
+ the hall's first bug/idea report, separate from the Full Idea
52
+ composer below: title + kind + optional body + a goal picker fed
53
+ by the R07 suggester. A routed capture must never carry
54
+ grade='full' (routing.js NEVER_ROUTE_GRADE), so this cannot share
55
+ a submit with the form below it. Hidden while developing a spark
56
+ (?develop=<id>) — that surface always turns someone else's
57
+ existing thought into a Full Idea, never a fresh quick report. -->
58
+ <section class="scroll" id="fq-compose-scroll" aria-labelledby="fq-compose-h">
59
+ <h2 id="fq-compose-h" class="scroll__h">File a bug or idea</h2>
60
+ <p class="scroll__lede">
61
+ A quick report — title, what's going on, and where it belongs. Pick a goal
62
+ and it lands there as a task the moment you file; leave it on "no goal" and
63
+ it waits in the inbox for triage.
64
+ </p>
65
+
66
+ <form id="fq-form" novalidate>
67
+ <label class="fi-label" for="fq-title">Title</label>
68
+ <input type="text" id="fq-title" class="fi-input" maxlength="200" autocomplete="off"
69
+ placeholder="what's wrong, or what you'd like to see">
70
+
71
+ <label class="fi-label" for="fq-kind">Kind</label>
72
+ <!-- task 1003453: the options are FILLED from /me.task_kinds at boot
73
+ (ideas.js), not written here. This markup used to spell the whole
74
+ vocabulary and had gone stale against the DB CHECK exactly as the
75
+ two board filters had — a third copy nobody was watching. The one
76
+ option left is the degraded fallback: if the read never lands, a
77
+ bug can still be filed. -->
78
+ <select id="fq-kind" class="fi-input">
79
+ <option value="bug" selected>Bug</option>
80
+ </select>
81
+
82
+ <label class="fi-label" for="fq-body">Details <span class="fi-hint">(optional)</span></label>
83
+ <textarea id="fq-body" class="fi-text" rows="4"
84
+ placeholder="repro steps, context, anything that helps…"></textarea>
85
+
86
+ <label class="fi-label" for="fq-goal">
87
+ Goal
88
+ <span class="fi-hint">Suggested as you type; leave it on "no goal" and it waits for triage.</span>
89
+ </label>
90
+ <select id="fq-goal" class="fi-input"></select>
91
+
92
+ <!-- GRAVITY (task 1004083 / spec R02) — what will actually catch this
93
+ thought, stated before it is released. It sits under the picker
94
+ because it is the picker's consequence, and because the picker's
95
+ own option labels cannot carry it: "No goal (homeless)" is false
96
+ for a bug (ADR 0262 routes it to the maintenance goal), and a
97
+ named goal is false for a judgment kind (routing.js
98
+ NEVER_ROUTE_KINDS). The verdict comes from the server's real
99
+ landing matrix — see POST /inbox/preview-landing — never from a
100
+ second copy of the rules in ideas.js. Hidden until there is
101
+ something true to say. -->
102
+ <p class="fi-gravity" id="fq-gravity" role="status" aria-live="polite" hidden></p>
103
+
104
+ <p class="fi-err" id="fq-err" role="alert"></p>
105
+ <p class="fi-result" id="fq-result" role="status" aria-live="polite"></p>
106
+
107
+ <!-- The receipt that outlives the confirmation above (task 1004082 /
108
+ spec R01). #fq-result is the live announcement for the filing
109
+ just made and dies with the page; this list is the durable
110
+ record of the last few, read back from localStorage on load so
111
+ a thought filed before a reload is still traceable here. -->
112
+ <section class="fi-receipts" id="fq-receipts" aria-labelledby="fq-receipts-h" hidden>
113
+ <h3 class="fi-receipts__h" id="fq-receipts-h">Recent filings</h3>
114
+ <ol class="fi-receipts__list" id="fq-receipts-list"></ol>
115
+ <p class="fi-receipts__note" id="fq-receipts-note" hidden></p>
116
+ </section>
117
+
118
+ <div class="fi-actions">
119
+ <button type="submit" class="btn" id="fq-submit">File it</button>
120
+ </div>
121
+ </form>
122
+ </section>
123
+
124
+ <!-- The composer. The idea detail view lives on its own page (R153). -->
125
+ <section class="scroll" id="fi-compose-scroll" aria-labelledby="fi-compose-h">
126
+ <h2 id="fi-compose-h" class="scroll__h">Write a Full Idea</h2>
127
+ <p class="scroll__lede">
128
+ A Full Idea answers five questions, so that someone else can deliver against it
129
+ without having to interview you first. Open to every role — the score below is
130
+ the only filter, and it counts substance, not who you are.
131
+ </p>
132
+
133
+ <form id="fi-form" novalidate>
134
+ <!-- DEVELOP MODE (R154): when the composer was opened from a spark,
135
+ this block carries the spark's own words and the title becomes a
136
+ read-only fact rather than a field — developing an idea must not
137
+ quietly rename it out from under its author. -->
138
+ <div class="fi-develop" id="fi-develop" hidden>
139
+ <p class="fi-develop__label">Developing a Big Idea Spark</p>
140
+ <p class="fi-develop__title" id="fi-develop-title"></p>
141
+ <p class="fi-develop__body" id="fi-develop-body"></p>
142
+ <p class="fi-develop__who" id="fi-develop-who"></p>
143
+ </div>
144
+
145
+ <label class="fi-label" for="fi-title" id="fi-title-label">
146
+ Title
147
+ <span class="fi-hint">One line. This is what the idea is called everywhere else.</span>
148
+ </label>
149
+ <input type="text" id="fi-title" class="fi-input" maxlength="200" autocomplete="off"
150
+ placeholder="what the idea is, in one line">
151
+
152
+ <!-- The five fields are rendered from GET /inbox/template — the R141
153
+ declaration — never hand-written here. A hard-coded form is the
154
+ same "second copy of the rules" defect as a hard-coded scorer,
155
+ one step earlier, and it would silently ignore a per-project
156
+ template (R156). -->
157
+ <div id="fi-fields" class="fi-fields">
158
+ <p class="fi-note">Loading the five questions…</p>
159
+ </div>
160
+
161
+ <!-- The scope recommendation (BV2.R13). Rendered from the same
162
+ GET /inbox/template read as the fields above, and for the same
163
+ reason: the two values are a closed vocabulary the database
164
+ enforces, so a hand-written pair of radios here would be a
165
+ second copy of it, free to drift. -->
166
+ <div id="fi-rec" class="fi-rec"></div>
167
+
168
+ <p class="fi-err" id="fi-err" role="alert"></p>
169
+
170
+ <div class="fi-actions">
171
+ <button type="submit" class="btn" id="fi-submit" disabled>File this idea</button>
172
+ <button type="button" class="btn btn--ghost" id="fi-clear">Discard draft</button>
173
+ <span class="fi-draft" id="fi-draft" role="status" aria-live="polite"></span>
174
+ </div>
175
+ </form>
176
+ </section>
177
+ </main>
178
+
179
+ <footer class="app-foot" id="app-foot"></footer>
180
+ </div>
181
+ </div>
182
+ </div>
183
+
184
+ <!-- The meter rides along beside the form on a wide screen and above it on a
185
+ narrow one (the shell's .app-rail decides). It is a READOUT, never an input:
186
+ every number in it comes from the server's own scorer. -->
187
+ <aside class="fi-meter app-rail" id="fi-meter" aria-labelledby="fi-meter-h" hidden>
188
+ <h2 class="fi-meter__h" id="fi-meter-h">Completeness</h2>
189
+ <div class="fi-gauge">
190
+ <div class="fi-gauge__track"><div class="fi-gauge__fill" id="fi-gauge-fill"></div></div>
191
+ <p class="fi-gauge__n" id="fi-gauge-n" role="status" aria-live="polite">—</p>
192
+ </div>
193
+ <ul class="fi-meter__list" id="fi-meter-list"></ul>
194
+ <p class="fi-meter__note">
195
+ Counted, not judged: each question is worth the same, and earns its share in
196
+ proportion to how much real text it carries. Whitespace and padding score nothing.
197
+ </p>
198
+ </aside>
199
+
200
+ <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
201
+
202
+ <script src="/builders/shell.js?v=2026-09-22-movefeedback1"></script>
203
+ <script src="/builders/palette.js" defer></script>
204
+ <script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
205
+ <!-- task 1003069 (R08) — the quick-filing form's routed result links a task
206
+ through window.OTBTaskDetail.href(); guarded if this ever loads without it. -->
207
+ <script src="/builders/task-detail.js?v=2026-07-03-taskdetail2" defer></script>
208
+ <script src="/builders/ideas.js?v=2026-08-22-r154"></script>
209
+ </body>
210
+ </html>