@bongos/core 1.19.1067 → 1.19.1069
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 +73 -58
- package/docs/copy-inventory.md +74 -53
- package/docs/copy-registry.json +310 -101
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-inventory.json +10 -2
- package/docs/page-readings.json +566 -536
- package/modules/hall-ui/public/atlas.html +1 -1
- package/modules/hall-ui/public/blockers.html +1 -1
- package/modules/hall-ui/public/board-room.html +1 -1
- package/modules/hall-ui/public/collab.html +1 -1
- package/modules/hall-ui/public/copy-desk.html +1 -1
- package/modules/hall-ui/public/deploy.html +1 -1
- package/modules/hall-ui/public/diagrams.html +1 -1
- package/modules/hall-ui/public/drachmae.html +1 -1
- package/modules/hall-ui/public/fleet.html +1 -1
- package/modules/hall-ui/public/gate.html +1 -1
- package/modules/hall-ui/public/goals.html +1 -1
- package/modules/hall-ui/public/government.html +1 -1
- package/modules/hall-ui/public/idea.html +3 -3
- package/modules/hall-ui/public/ideas.html +1 -1
- package/modules/hall-ui/public/index.html +1 -1
- package/modules/hall-ui/public/modules.html +1 -1
- package/modules/hall-ui/public/primer.html +1 -1
- package/modules/hall-ui/public/profile.html +1 -1
- package/modules/hall-ui/public/project-settings.html +1 -1
- package/modules/hall-ui/public/ranks.html +1 -1
- package/modules/hall-ui/public/roadmap.html +1 -1
- package/modules/hall-ui/public/roster.html +1 -1
- package/modules/hall-ui/public/sessions.html +1 -1
- package/modules/hall-ui/public/settings.html +1 -1
- package/modules/hall-ui/public/shell.js +23 -32
- package/modules/hall-ui/public/studio-lib.js +207 -0
- package/modules/hall-ui/public/studio.css +559 -170
- package/modules/hall-ui/public/studio.html +143 -49
- package/modules/hall-ui/public/studio.js +442 -33
- package/modules/hall-ui/public/studio.states.json +164 -4
- package/modules/hall-ui/public/task.html +1 -1
- package/modules/hall-ui/public/thinking.html +1 -1
- package/modules/hall-ui/public/tweak-editor.html +1 -1
- package/modules/hall-ui/public/watch.html +1 -1
- package/modules/hall-ui/public/work.html +1 -1
- package/modules/hall-ui/records/studio.md +47 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/scripts/hall-preview/server.js +5 -0
- package/src/module-api.js +1 -1
- package/tests/hall_audit.mjs +4 -0
- package/tests/hall_nav.mjs +25 -1
- package/tests/hall_page_gate_map.mjs +2 -0
- package/tests/hall_studio_home.mjs +429 -0
- package/tests/hall_studio_world.mjs +7 -1
- package/tests/hall_tweak_editor.mjs +1 -1
- package/tests/nav_permission_atoms.mjs +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_": "The
|
|
2
|
+
"_": "The studio home (task 1003971 / BV2.TW16), built 1:1 on docs/design/mocks/tweak-mode/Main.dc.html: the night room, the greeting and its sub-line (editable in place as a tweak of builders:studio), the tally, Resume, and three quick actions opening glass panels (the Tweak/CopyWrite Flow, the Approval queue, Artist Review Status). Behind a quiet door, the older reviews (R06 of goal 1000074, task 1003117; retired in TW14) still answer the reviews filed before Tweak Mode. Against the kit's own stub the page renders its unread states (no copy-desk feeds). TO SEE IT POPULATED, point the kit at the hall-preview harness: `node scripts/hall-preview/server.js --port 4636 --fixture-me` then `render.js --base-in http://builders.localhost:4636 --base-out http://builders.localhost:4636`. The harness answers the tally, the pages and the next page from copy-desk__tally.json, copy-desk__pages.json and copy-desk__next.json (built by the real composers), Resume's counter from copy-desk__pages__draft.json, the studio's own lines from copy-desk__pages__draft-studio.json, the claim and the draft save from its CANNED WRITES, and the older reviews from tasks.json (whose first row IS a cascade artist review).",
|
|
3
3
|
"page": "/builders/studio",
|
|
4
4
|
"surface": "hall-ui",
|
|
5
5
|
"stub": {
|
|
@@ -25,8 +25,9 @@
|
|
|
25
25
|
"load failed"
|
|
26
26
|
],
|
|
27
27
|
"states": {
|
|
28
|
-
"
|
|
28
|
+
"home": {
|
|
29
29
|
"auth": true,
|
|
30
|
+
"_": "The home: Resume, the three quick actions, the tally top right.",
|
|
30
31
|
"actions": [
|
|
31
32
|
[
|
|
32
33
|
"wait",
|
|
@@ -35,13 +36,172 @@
|
|
|
35
36
|
],
|
|
36
37
|
"expect": {
|
|
37
38
|
"visible": [
|
|
38
|
-
"#studio-
|
|
39
|
+
"#studio-greet",
|
|
40
|
+
"#st-flow",
|
|
41
|
+
"#studio-approvals",
|
|
42
|
+
"#st-status"
|
|
39
43
|
]
|
|
40
44
|
}
|
|
41
45
|
},
|
|
42
46
|
"out": {
|
|
43
47
|
"auth": false
|
|
44
48
|
},
|
|
49
|
+
"flow": {
|
|
50
|
+
"auth": true,
|
|
51
|
+
"_": "The Tweak/CopyWrite Flow: the recommended page, take it, pick another.",
|
|
52
|
+
"actions": [
|
|
53
|
+
[
|
|
54
|
+
"wait",
|
|
55
|
+
700
|
|
56
|
+
],
|
|
57
|
+
[
|
|
58
|
+
"click",
|
|
59
|
+
"#st-flow"
|
|
60
|
+
],
|
|
61
|
+
[
|
|
62
|
+
"wait",
|
|
63
|
+
300
|
|
64
|
+
]
|
|
65
|
+
],
|
|
66
|
+
"expect": {
|
|
67
|
+
"visible": [
|
|
68
|
+
".st-dialog",
|
|
69
|
+
"[data-take]"
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"flow-pick": {
|
|
74
|
+
"auth": true,
|
|
75
|
+
"_": "Pick another: the other pages as chips.",
|
|
76
|
+
"actions": [
|
|
77
|
+
[
|
|
78
|
+
"wait",
|
|
79
|
+
700
|
|
80
|
+
],
|
|
81
|
+
[
|
|
82
|
+
"click",
|
|
83
|
+
"#st-flow"
|
|
84
|
+
],
|
|
85
|
+
[
|
|
86
|
+
"wait",
|
|
87
|
+
300
|
|
88
|
+
],
|
|
89
|
+
[
|
|
90
|
+
"click",
|
|
91
|
+
"[data-pick]"
|
|
92
|
+
],
|
|
93
|
+
[
|
|
94
|
+
"wait",
|
|
95
|
+
200
|
|
96
|
+
]
|
|
97
|
+
],
|
|
98
|
+
"expect": {
|
|
99
|
+
"visible": [
|
|
100
|
+
"#st-picks"
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"status": {
|
|
105
|
+
"auth": true,
|
|
106
|
+
"_": "Artist Review Status: three surface lines, N of M tweaked.",
|
|
107
|
+
"actions": [
|
|
108
|
+
[
|
|
109
|
+
"wait",
|
|
110
|
+
700
|
|
111
|
+
],
|
|
112
|
+
[
|
|
113
|
+
"click",
|
|
114
|
+
"#st-status"
|
|
115
|
+
],
|
|
116
|
+
[
|
|
117
|
+
"wait",
|
|
118
|
+
300
|
|
119
|
+
]
|
|
120
|
+
],
|
|
121
|
+
"expect": {
|
|
122
|
+
"visible": [
|
|
123
|
+
".st-surfaces"
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
"words-offer": {
|
|
128
|
+
"auth": true,
|
|
129
|
+
"_": "A click on the studio's own words offers to take the studio page.",
|
|
130
|
+
"actions": [
|
|
131
|
+
[
|
|
132
|
+
"wait",
|
|
133
|
+
700
|
|
134
|
+
],
|
|
135
|
+
[
|
|
136
|
+
"click",
|
|
137
|
+
"#studio-greet"
|
|
138
|
+
],
|
|
139
|
+
[
|
|
140
|
+
"wait",
|
|
141
|
+
500
|
|
142
|
+
]
|
|
143
|
+
],
|
|
144
|
+
"expect": {
|
|
145
|
+
"visible": [
|
|
146
|
+
"#st-offer",
|
|
147
|
+
"#st-offer-take"
|
|
148
|
+
]
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
"words-edit": {
|
|
152
|
+
"auth": true,
|
|
153
|
+
"_": "Taken: the lines the studio's reading lists are typed over in place, saved to its draft.",
|
|
154
|
+
"actions": [
|
|
155
|
+
[
|
|
156
|
+
"wait",
|
|
157
|
+
700
|
|
158
|
+
],
|
|
159
|
+
[
|
|
160
|
+
"click",
|
|
161
|
+
"#studio-greet"
|
|
162
|
+
],
|
|
163
|
+
[
|
|
164
|
+
"wait",
|
|
165
|
+
500
|
|
166
|
+
],
|
|
167
|
+
[
|
|
168
|
+
"click",
|
|
169
|
+
"#st-offer-take"
|
|
170
|
+
],
|
|
171
|
+
[
|
|
172
|
+
"wait",
|
|
173
|
+
700
|
|
174
|
+
]
|
|
175
|
+
],
|
|
176
|
+
"expect": {
|
|
177
|
+
"visible": [
|
|
178
|
+
"#st-editing"
|
|
179
|
+
]
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
"reviews": {
|
|
183
|
+
"auth": true,
|
|
184
|
+
"_": "The quiet door: the reviews filed before Tweak Mode, one at a time.",
|
|
185
|
+
"actions": [
|
|
186
|
+
[
|
|
187
|
+
"wait",
|
|
188
|
+
700
|
|
189
|
+
],
|
|
190
|
+
[
|
|
191
|
+
"click",
|
|
192
|
+
"#st-older"
|
|
193
|
+
],
|
|
194
|
+
[
|
|
195
|
+
"wait",
|
|
196
|
+
900
|
|
197
|
+
]
|
|
198
|
+
],
|
|
199
|
+
"expect": {
|
|
200
|
+
"visible": [
|
|
201
|
+
"#studio-focus"
|
|
202
|
+
]
|
|
203
|
+
}
|
|
204
|
+
},
|
|
45
205
|
"full": {
|
|
46
206
|
"auth": true,
|
|
47
207
|
"_": "Full screen (task 1004327): the shell switch pressed — the room fills the window, one button brings the chrome back.",
|
|
@@ -61,7 +221,7 @@
|
|
|
61
221
|
],
|
|
62
222
|
"expect": {
|
|
63
223
|
"visible": [
|
|
64
|
-
"#studio-
|
|
224
|
+
"#studio-greet",
|
|
65
225
|
"#fullscreen-toggle"
|
|
66
226
|
],
|
|
67
227
|
"hidden": [
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
|
|
58
58
|
<!-- The app shell (sidebar + top bar + footer). Dependency-free; runs at parse
|
|
59
59
|
time so the chrome exists before the deferred page scripts execute. -->
|
|
60
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
60
|
+
<script src="/builders/shell.js?v=2026-09-28-archive"></script>
|
|
61
61
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
62
62
|
<script src="/builders/palette.js" defer></script>
|
|
63
63
|
<!-- shared frontend toolkit (window.OTB) — loaded FIRST so task.js can pull from it. -->
|
|
@@ -138,7 +138,7 @@
|
|
|
138
138
|
</div>
|
|
139
139
|
</div>
|
|
140
140
|
|
|
141
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
141
|
+
<script src="/builders/shell.js?v=2026-09-28-archive"></script>
|
|
142
142
|
<script src="/builders/palette.js" defer></script>
|
|
143
143
|
|
|
144
144
|
<script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
|
|
103
103
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
104
104
|
|
|
105
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
105
|
+
<script src="/builders/shell.js?v=2026-09-28-archive"></script>
|
|
106
106
|
<script src="/builders/palette.js" defer></script>
|
|
107
107
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
108
108
|
<script src="/builders/tweak-editor-lib.js?v=2026-09-28-tw10"></script>
|
|
@@ -162,7 +162,7 @@
|
|
|
162
162
|
|
|
163
163
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
164
164
|
chrome exists before the page script runs. -->
|
|
165
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
165
|
+
<script src="/builders/shell.js?v=2026-09-28-archive"></script>
|
|
166
166
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
167
167
|
<script src="/builders/palette.js" defer></script>
|
|
168
168
|
<!-- shared frontend toolkit (window.OTB) — loaded before watch.js, which pulls from it. -->
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
|
|
172
172
|
<!-- The app shell (sidebar + top bar + footer). Dependency-free; runs at parse
|
|
173
173
|
time so the chrome exists before the deferred page scripts execute. -->
|
|
174
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
174
|
+
<script src="/builders/shell.js?v=2026-09-28-archive"></script>
|
|
175
175
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
176
176
|
<script src="/builders/palette.js" defer></script>
|
|
177
177
|
<!-- shared frontend toolkit (window.OTB) — loaded FIRST so work.js can pull from it. -->
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# The studio — /studio, the lofi home with Tweak Mode as its four doors (task 1003971)
|
|
2
|
+
|
|
3
|
+
**BV2.TW16 (goal 1000095; [ADR 0341](../../../docs/adr/0341-the-page-is-the-unit-of-tweak-mode.md) D2, D5, D8, D11).** Built 1:1 on the owner-approved master design [`docs/design/mocks/tweak-mode/Main.dc.html`](../../../docs/design/mocks/tweak-mode/README.md) ("I like the lofi design for now"): the night room (the window with its moon, stars and city lights, the floor, the lamp and its glow, the mug and the plant), the eyebrow and the tally pill, "Good evening." and its sub-line, "click any words here to rewrite them", Resume, and three glass quick actions that open panels in place.
|
|
4
|
+
|
|
5
|
+
Files: `studio.html` (the markup), `studio.css` (the artboard's inline styles, one rule per element, then the older reviews' garden in the hall's tokens), `studio-lib.js` (the pure rules, `window.OTBStudioLib`, node-require-safe) and `studio.js` (the reads, the panels, the words, and the garden). It also loads `tweak-editor-lib.js` for the page names and the draft body, and TW12's Approval queue (`approval-queue*.{js,css}`, `records/approval-queue.md`), unchanged.
|
|
6
|
+
|
|
7
|
+
- **The four reads.** `GET /copy-desk/tally` (the pill: credits, pages tweaked, this week), `GET /copy-desk/next` (the Flow's recommendation and "pick another", and `resume`, the held page), `GET /copy-desk/pages` (Artist Review Status's three surface lines and the whole count), and, when a page is held, `GET /copy-desk/pages/:id/draft` for Resume's "12 of 38 lines". Signed out, none of them is asked.
|
|
8
|
+
- **Resume** links to `/builders/tweak-editor?page=<held page>` (TW10). With nothing held it is not drawn, and the page's own sub-line stands.
|
|
9
|
+
- **The Flow** shows the recommendation (its `why_line`); "pick another" opens the others as chips and a chip swaps the page in place; "take it" is the claim route on THAT page (ADR 0341 D5), then the editor. A refusal stays in the panel in words.
|
|
10
|
+
- **The Approval queue** is TW12's component: `OTBApprovalQueue.mount({ api, apiBase, writes, onCount })`, opened from the quick action, with `onCount` feeding its detail line.
|
|
11
|
+
- **Artist Review Status** is three meters (landing, builders hall, status, "N of M tweaked"), each against its own surface's page count, so studio.js sits in `tests/hall_audit.mjs` `METERS`. The landing line names the instance's own address, stamped by the server from the branding pack (`<main data-apex="{{publicOrigin}}">`).
|
|
12
|
+
|
|
13
|
+
## The studio's own words are a tweak of the studio page
|
|
14
|
+
|
|
15
|
+
The greeting and its sub-line are the studio page's own lines (builders:studio), so rewriting them is a round of that page (ADR 0341 D2), never a live edit. The smallest honest flow:
|
|
16
|
+
|
|
17
|
+
1. A click on the words (or on the hint, which is a button for the keyboard) reads `GET /copy-desk/pages/builders:studio/draft`. If the artist already holds the studio page, the words open for editing at once.
|
|
18
|
+
2. Otherwise a small glass offer says the words are the studio page itself, with "take the studio page" and "not now". Nothing is claimed until the artist says so.
|
|
19
|
+
3. Taken (the claim route), each word on the page is matched to its line in the studio's reading (`matchLine`: a `{…}` hole matches any run of words, the most specific line wins, a line mostly of holes never matches, shell text never), and the matched elements become `contenteditable`, showing the reading's text, holes and all, as the editor does.
|
|
20
|
+
4. Typing autosaves the WHOLE draft of the studio page (the lines typed here and any the editor saved) through `PUT /copy-desk/pages/builders:studio/draft`, debounced and on blur. A strip under the words says "The studio page is yours · N of M rewritten · saved · submit it in the editor". Submit is the editor's: one submit path, not two.
|
|
21
|
+
|
|
22
|
+
The page keeps its words until the round is submitted, applied, approved and shipped like any other. A word the reading does not list (a sentence newer than the last reading) keeps its words and loses the cue.
|
|
23
|
+
|
|
24
|
+
**Why the sub-line's sentence is in studio.js, not studio-lib.js.** The copy registry places a line at its `textContent` assignment. Built inside the lib it read as unplaced, and the reader's pattern tier then matched it to the generic `{…} of {…}` row (sky-panel.js). Written where studio.js assigns it, it is placed on studio.js, which is the page's own file and wins.
|
|
25
|
+
|
|
26
|
+
## The older reviews stay one quiet door away
|
|
27
|
+
|
|
28
|
+
The garden this page used to be (R06 of goal 1000074; retired in TW14) still answers the reviews filed before Tweak Mode, because they may hold a deploy under the strict artist gate. It sits behind a quiet line under the actions ("1 review from before Tweak Mode still waits"), shown only while a review waits, and opens in its own dialog in the hall's tokens with the focus card, the stones and the two links, unchanged. Its verdict writes are unchanged.
|
|
29
|
+
|
|
30
|
+
## What it writes
|
|
31
|
+
|
|
32
|
+
`WRITE_ROUTES` in studio.js, pinned in `tests/hall_studio_world.mjs`: the four verdicts on an older review, the Approval queue's approve and send-back, and TW16's two, `claim` (take a page's round) and `draft` (the studio page's whole draft). Six write sites; none writes a live string.
|
|
33
|
+
|
|
34
|
+
## Where it differs from the artboard, and what forced it
|
|
35
|
+
|
|
36
|
+
- **The words are the ledger's**, not the sample's: 180 credits, 6 pages tweaked, +60 this week, "2 of 75 lines", "6 of 38 pages tweaked" on the harness fixtures (built by the real composers). The artboard's are sample data (the mocks README).
|
|
37
|
+
- **The recommendation order is the spec's** (asked, changed, untweaked), so the chips read Tasks, Goals, Privacy, Terms where the artboard's sample has Work, Privacy, Goals, Explore (ADR 0341 pick 8). "Tasks" is builders:work's own title.
|
|
38
|
+
- **The hint is #85858c, not #6f6f76**: #6f6f76 on the room's #07080d is about 4:1, under the AA floor for 12.5px type.
|
|
39
|
+
- **The panels' scrim is .94 over the light hall and .88 on a phone** (the artboard's .42 over the dark room otherwise), TW12's reason: the glass's grey words fall under AA at .42 over a light page.
|
|
40
|
+
- **A quick action is at least 72px and grows**, with 10px of padding, so a long detail wraps rather than clipping.
|
|
41
|
+
- **The window never slides under the words** (its left edge holds at 680px) when the hall chrome narrows the room.
|
|
42
|
+
- **Resume is not drawn when nothing is held**; the artboard always draws it (sample).
|
|
43
|
+
- **Not on the artboard at all:** the hall chrome view (the full-screen switch off, the default since TW20), the full-screen button top right, light mode, the phone layout (the pill across the top as three stacked figures, the window scaled whole to the top right, the desk on a floor at the bottom), the words' offer, edit strip and refusals, the older reviews' door and dialog, and the panels' loading and could-not-read lines.
|
|
44
|
+
|
|
45
|
+
## The proof
|
|
46
|
+
|
|
47
|
+
`studio.states.json` renders sixteen states (home, out, flow, flow-pick, status, words-offer, words-edit, reviews, full, full-back and TW12's six) against the hall-preview harness (`node scripts/hall-preview/server.js --port 4636 --fixture-me`), which answers the tally, the pages and the next page from `copy-desk__tally.json`, `copy-desk__pages.json` and `copy-desk__next.json`, the studio's own lines from `copy-desk__pages__draft-studio.json` (a new fallback ahead of the editor's catch-all), and the claim and the save from its CANNED WRITES. All clean at 1440, 390 and 320, dark and light. The studio fixture carries only the studio's PLACED lines: the page reader treats every string a page reads as data, so a fixture holding its unplaced lines would make the reading drop them. Behaviour: `tests/hall_studio_home.mjs` (the pure rules over the real composers, and the real page in a mini-DOM: the four reads, the panels, take it, and the words typed over and saved as the whole draft).
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.1069",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.19.
|
|
9
|
+
"version": "1.19.1069",
|
|
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.
|
|
3
|
+
"version": "1.19.1069",
|
|
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/release-notes.json
CHANGED
|
@@ -7703,5 +7703,17 @@
|
|
|
7703
7703
|
"id": "1004325",
|
|
7704
7704
|
"text": "A ship that changes a page's words no longer files an \"Artist review\" task. Those reviews came one per ship, and most were thrown away unread. Instead, the page itself shows \"changed since last tweak\" in Tweak Mode, worked out"
|
|
7705
7705
|
}
|
|
7706
|
+
],
|
|
7707
|
+
"1.19.1068": [
|
|
7708
|
+
{
|
|
7709
|
+
"id": "1003971",
|
|
7710
|
+
"text": "The Studio is now the lofi home from the approved design: a night room with a window, moon, city lights, a lamp and a plant. Top right, your tally: credits, pages tweaked and this week. Resume takes you back into the page you"
|
|
7711
|
+
}
|
|
7712
|
+
],
|
|
7713
|
+
"1.19.1069": [
|
|
7714
|
+
{
|
|
7715
|
+
"id": "1004326",
|
|
7716
|
+
"text": "The Ideas and Copy desk tabs are gone from the hall's sidebar, as you decided. Nothing was deleted: both pages still open from their old links and bookmarks, and every idea and flag is kept. New ideas are filed from Your think"
|
|
7717
|
+
}
|
|
7706
7718
|
]
|
|
7707
7719
|
}
|
|
@@ -135,6 +135,11 @@ const FIXTURE_FALLBACKS = [
|
|
|
135
135
|
// the tweak editor's read (task 1004321): one page's lines and draft serve any
|
|
136
136
|
// page id, since the editor shows one page. A page id carries a colon, which a
|
|
137
137
|
// Windows file name cannot, so there is no per-id file to find first.
|
|
138
|
+
// The studio's own words (task 1003971): the studio reads ITS page's lines to
|
|
139
|
+
// open them for editing in place, so builders:studio answers from its own
|
|
140
|
+
// reading, not the landing page the editor fixture carries. Before the
|
|
141
|
+
// catch-all below, which it would otherwise never reach.
|
|
142
|
+
[/^copy-desk\/pages\/builders:studio\/draft$/, 'copy-desk__pages__draft-studio'],
|
|
138
143
|
[/^copy-desk\/pages\/[a-z0-9-]+:[a-z0-9-]+\/draft$/, 'copy-desk__pages__draft'],
|
|
139
144
|
// the Approval queue's renders (task 1004323): a round's named visuals, one
|
|
140
145
|
// fixture for any task id, as the editor read above serves any page.
|
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.
|
|
74
|
+
const CORE_VERSION = '1.19.1069'; // 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');
|
package/tests/hall_audit.mjs
CHANGED
|
@@ -293,6 +293,10 @@ test('the kit is the ONLY thing in the hall that draws a bar series', () => {
|
|
|
293
293
|
const METERS = new Set([
|
|
294
294
|
'idea.js', // .ig-score — one Full-Idea completeness gauge, banded full/part/thin
|
|
295
295
|
'ideas.js', // .fi-mrow — the composer's per-field completeness, driven imperatively
|
|
296
|
+
// .st-surface__fill — Artist Review Status (task 1003971): each surface's
|
|
297
|
+
// pages tweaked against THAT surface's page count, three separate meters,
|
|
298
|
+
// never compared with each other (ADR 0341 D8, the artboard's 4px lines).
|
|
299
|
+
'studio.js',
|
|
296
300
|
]);
|
|
297
301
|
const handRolled = [];
|
|
298
302
|
for (const f of fs.readdirSync(HALL)) {
|
package/tests/hall_nav.mjs
CHANGED
|
@@ -258,12 +258,16 @@ test('sidebar groups read by audience, in order', () => {
|
|
|
258
258
|
// task 1003455 (goal 1000089): 'blockers' joins the same group, after Tasks —
|
|
259
259
|
// its subject is the project (what's stuck on the owner), not a person or a
|
|
260
260
|
// craft, and its one data source (GET /blockers) is public like Roadmap's.
|
|
261
|
+
// task 1004326 (BV2.TW15, goal 1000095): 'ideas' and 'copy-desk' LEFT the group.
|
|
262
|
+
// Owner call 2026-09-27: both are ARCHIVED, not deleted — the pages and routes
|
|
263
|
+
// stay reachable by URL (the test below holds that), filing happens on Your
|
|
264
|
+
// thinking, and artist work lives in the Studio.
|
|
261
265
|
// task 1004232 (sky part 4, goal 1000095): 'goal-map' — THE PROJECT SKY — joins
|
|
262
266
|
// directly under 'goals'. The goal map that held the URL took no nav slot on
|
|
263
267
|
// purpose (task 1003479, and tests/goal_map_page.mjs pinned it); the owner
|
|
264
268
|
// granted the sky that slot on 2026-09-24 (ADR 0227 §11), under Goals because
|
|
265
269
|
// it is the goals seen as one picture.
|
|
266
|
-
assert.deepEqual(nav[0].items.map((i) => i.id), ['home', 'roadmap', 'goals', 'goal-map', 'work', 'blockers', 'board-room', '
|
|
270
|
+
assert.deepEqual(nav[0].items.map((i) => i.id), ['home', 'roadmap', 'goals', 'goal-map', 'work', 'blockers', 'board-room', 'thinking', 'studio'],
|
|
267
271
|
'the unlabeled group is the project itself (task 1002425 order)');
|
|
268
272
|
assert.deepEqual(nav[1].items.map((i) => i.id), ['standing', 'profile'], 'You = your own numbers');
|
|
269
273
|
// task 1003444: 'people' LEFT the group — the owner deleted the hall's
|
|
@@ -312,6 +316,26 @@ test('every nav link lands on a page that exists', () => {
|
|
|
312
316
|
assert.deepEqual(dead, [], 'no nav item points at a missing page');
|
|
313
317
|
});
|
|
314
318
|
|
|
319
|
+
// task 1004326 (BV2.TW15, goal 1000095): ARCHIVED, not deleted. The owner took
|
|
320
|
+
// the Ideas board and the Copy desk off the nav on 2026-09-27 and kept both
|
|
321
|
+
// pages, so old bookmarks, idea.js's "Develop it" link and the studio's
|
|
322
|
+
// old-reviews dialog still land. Both halves are held here: the nav offers
|
|
323
|
+
// neither (checked in the source too, because the copy-desk item was
|
|
324
|
+
// module-gated and a boot without that module would never render it anyway),
|
|
325
|
+
// and both page files are still served. tests/hall_page_gate_map.mjs keeps
|
|
326
|
+
// their server-side gate rows.
|
|
327
|
+
test('THE ARCHIVE: Ideas and Copy desk are off the nav, and both pages still exist', () => {
|
|
328
|
+
const items = parseNav(boot().sidebarHtml).flatMap((g) => g.items);
|
|
329
|
+
for (const id of ['ideas', 'copy-desk']) {
|
|
330
|
+
assert.equal(items.some((i) => i.id === id), false, `the nav no longer renders '${id}'`);
|
|
331
|
+
assert.doesNotMatch(SRC, new RegExp(`id: '${id}'`), `shell.js NAV declares no '${id}' item`);
|
|
332
|
+
assert.doesNotMatch(SRC, new RegExp(`href: '/${id}'`), `and no item points at /${id}`);
|
|
333
|
+
assert.ok(fs.existsSync(path.join(HALL, `${id}.html`)), `${id}.html is still in the hall, so /${id} still loads`);
|
|
334
|
+
}
|
|
335
|
+
assert.match(fs.readFileSync(path.join(HALL, 'studio.js'), 'utf8'), /href="\/builders\/copy-desk"/,
|
|
336
|
+
'the studio\'s old-reviews dialog still links to the copy desk');
|
|
337
|
+
});
|
|
338
|
+
|
|
315
339
|
test('href check actually CATCHES a dead link', () => {
|
|
316
340
|
assert.equal(hrefResolves({ href: '/no-such-page', external: false }), false);
|
|
317
341
|
assert.equal(hrefResolves({ href: '/drachmae', external: false }), true);
|
|
@@ -56,6 +56,8 @@ const ORACLE = {
|
|
|
56
56
|
// module's pages: copy-desk (task 1003113) and ideas (task 1002928) are open to
|
|
57
57
|
// every rank by design, and collab's reads (task 1003172) are scoped to the
|
|
58
58
|
// caller by the server — so for all three, sign-in IS the whole gate.
|
|
59
|
+
// task 1004326 (BV2.TW15): copy-desk and ideas are ARCHIVED — off the nav, not
|
|
60
|
+
// deleted — so both rows stay: the pages still load by URL, on this tier.
|
|
59
61
|
'/builders/copy-desk': 'requireBuilderPage',
|
|
60
62
|
// task 1003117 (R06 of goal 1000074): the Studio (artist mode) — open to every
|
|
61
63
|
// rank like copy-desk (an artist is a craft, not a rank), so sign-in is the
|