@bongos/core 1.19.1068 → 1.19.1070

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 (49) hide show
  1. package/.bongos-core.json +59 -54
  2. package/.claude/skills/design/SKILL.md +1 -1
  3. package/docs/adr/0342-module-categories-are-eight-parents-with-approved-sub-categories.md +83 -0
  4. package/docs/adr/README.md +1 -0
  5. package/docs/copy-inventory.md +12 -12
  6. package/docs/copy-registry.json +22 -22
  7. package/docs/module-api-changelog.md +4 -0
  8. package/docs/packs/artist.md +55 -31
  9. package/docs/packs/engineer.md +2 -0
  10. package/docs/page-readings.json +494 -488
  11. package/modules/hall-ui/public/atlas.html +1 -1
  12. package/modules/hall-ui/public/blockers.html +1 -1
  13. package/modules/hall-ui/public/board-room.html +1 -1
  14. package/modules/hall-ui/public/collab.html +1 -1
  15. package/modules/hall-ui/public/copy-desk.html +1 -1
  16. package/modules/hall-ui/public/deploy.html +1 -1
  17. package/modules/hall-ui/public/diagrams.html +1 -1
  18. package/modules/hall-ui/public/drachmae.html +1 -1
  19. package/modules/hall-ui/public/fleet.html +1 -1
  20. package/modules/hall-ui/public/gate.html +1 -1
  21. package/modules/hall-ui/public/goals.html +1 -1
  22. package/modules/hall-ui/public/government.html +1 -1
  23. package/modules/hall-ui/public/idea.html +3 -3
  24. package/modules/hall-ui/public/ideas.html +1 -1
  25. package/modules/hall-ui/public/index.html +1 -1
  26. package/modules/hall-ui/public/modules.html +1 -1
  27. package/modules/hall-ui/public/primer.html +1 -1
  28. package/modules/hall-ui/public/profile.html +1 -1
  29. package/modules/hall-ui/public/project-settings.html +1 -1
  30. package/modules/hall-ui/public/ranks.html +1 -1
  31. package/modules/hall-ui/public/roadmap.html +1 -1
  32. package/modules/hall-ui/public/roster.html +1 -1
  33. package/modules/hall-ui/public/sessions.html +1 -1
  34. package/modules/hall-ui/public/settings.html +1 -1
  35. package/modules/hall-ui/public/shell.js +23 -32
  36. package/modules/hall-ui/public/studio.html +1 -1
  37. package/modules/hall-ui/public/task.html +1 -1
  38. package/modules/hall-ui/public/thinking.html +1 -1
  39. package/modules/hall-ui/public/tweak-editor.html +1 -1
  40. package/modules/hall-ui/public/watch.html +1 -1
  41. package/modules/hall-ui/public/work.html +1 -1
  42. package/package-lock.json +2 -2
  43. package/package.json +1 -1
  44. package/release-notes.json +16 -0
  45. package/src/module-api.js +1 -1
  46. package/tests/hall_nav.mjs +25 -1
  47. package/tests/hall_page_gate_map.mjs +2 -0
  48. package/tests/hall_tweak_editor.mjs +1 -1
  49. package/tests/nav_permission_atoms.mjs +1 -1
@@ -192,7 +192,7 @@
192
192
  "modules/hall-ui/public/hall-render.js:367",
193
193
  "modules/hall-ui/public/hall-render.js:391",
194
194
  "modules/hall-ui/public/hall-render.js:461",
195
- "modules/hall-ui/public/shell.js:455"
195
+ "modules/hall-ui/public/shell.js:446"
196
196
  ]
197
197
  },
198
198
  {
@@ -1510,8 +1510,8 @@
1510
1510
  "text": "Sign out",
1511
1511
  "occurrences": 2,
1512
1512
  "at": [
1513
- "modules/hall-ui/public/shell.js:473",
1514
- "modules/hall-ui/public/shell.js:785"
1513
+ "modules/hall-ui/public/shell.js:464",
1514
+ "modules/hall-ui/public/shell.js:776"
1515
1515
  ]
1516
1516
  },
1517
1517
  {
@@ -3265,20 +3265,20 @@
3265
3265
  "confidence": "certain"
3266
3266
  },
3267
3267
  {
3268
- "id": "b3c1c5615971",
3268
+ "id": "ef2fab4901d6",
3269
3269
  "surface": "builders-hall",
3270
- "text": "Back to ideas",
3271
- "file": "modules/hall-ui/public/idea.html",
3272
- "line": 31,
3270
+ "text": "Back to tasks",
3271
+ "file": "modules/hall-ui/public/task.html",
3272
+ "line": 34,
3273
3273
  "origin": "html-text",
3274
3274
  "confidence": "certain"
3275
3275
  },
3276
3276
  {
3277
- "id": "ef2fab4901d6",
3277
+ "id": "64e2fbc2c072",
3278
3278
  "surface": "builders-hall",
3279
- "text": "Back to tasks",
3280
- "file": "modules/hall-ui/public/task.html",
3281
- "line": 34,
3279
+ "text": "Back to your thinking",
3280
+ "file": "modules/hall-ui/public/idea.html",
3281
+ "line": 31,
3282
3282
  "origin": "html-text",
3283
3283
  "confidence": "certain"
3284
3284
  },
@@ -6824,7 +6824,7 @@
6824
6824
  "surface": "builders-hall",
6825
6825
  "text": "Its details are below.",
6826
6826
  "file": "modules/hall-ui/public/shell.js",
6827
- "line": 743,
6827
+ "line": 734,
6828
6828
  "origin": "js-markup",
6829
6829
  "confidence": "certain"
6830
6830
  },
@@ -6905,7 +6905,7 @@
6905
6905
  "surface": "builders-hall",
6906
6906
  "text": "Jump to a page or record",
6907
6907
  "file": "modules/hall-ui/public/shell.js",
6908
- "line": 494,
6908
+ "line": 485,
6909
6909
  "origin": "js-markup",
6910
6910
  "confidence": "certain"
6911
6911
  },
@@ -6914,7 +6914,7 @@
6914
6914
  "surface": "builders-hall",
6915
6915
  "text": "Jump to…",
6916
6916
  "file": "modules/hall-ui/public/shell.js",
6917
- "line": 496,
6917
+ "line": 487,
6918
6918
  "origin": "js-markup",
6919
6919
  "confidence": "certain"
6920
6920
  },
@@ -8588,7 +8588,7 @@
8588
8588
  "surface": "builders-hall",
8589
8589
  "text": "Open navigation",
8590
8590
  "file": "modules/hall-ui/public/shell.js",
8591
- "line": 485,
8591
+ "line": 476,
8592
8592
  "origin": "js-markup",
8593
8593
  "confidence": "certain"
8594
8594
  },
@@ -10460,7 +10460,7 @@
10460
10460
  "surface": "builders-hall",
10461
10461
  "text": "Sign in with GitHub",
10462
10462
  "file": "modules/hall-ui/public/shell.js",
10463
- "line": 455,
10463
+ "line": 446,
10464
10464
  "origin": "js-markup",
10465
10465
  "confidence": "certain"
10466
10466
  },
@@ -10469,7 +10469,7 @@
10469
10469
  "surface": "builders-hall",
10470
10470
  "text": "Sign out",
10471
10471
  "file": "modules/hall-ui/public/shell.js",
10472
- "line": 473,
10472
+ "line": 464,
10473
10473
  "origin": "js-markup",
10474
10474
  "confidence": "certain"
10475
10475
  },
@@ -10478,7 +10478,7 @@
10478
10478
  "surface": "builders-hall",
10479
10479
  "text": "Sign out",
10480
10480
  "file": "modules/hall-ui/public/shell.js",
10481
- "line": 785,
10481
+ "line": 776,
10482
10482
  "origin": "js-markup",
10483
10483
  "confidence": "certain"
10484
10484
  },
@@ -10505,7 +10505,7 @@
10505
10505
  "surface": "builders-hall",
10506
10506
  "text": "Skip to content",
10507
10507
  "file": "modules/hall-ui/public/shell.js",
10508
- "line": 776,
10508
+ "line": 767,
10509
10509
  "origin": "js-text-assign",
10510
10510
  "confidence": "certain"
10511
10511
  },
@@ -10757,7 +10757,7 @@
10757
10757
  "surface": "builders-hall",
10758
10758
  "text": "Switch theme",
10759
10759
  "file": "modules/hall-ui/public/shell.js",
10760
- "line": 500,
10760
+ "line": 491,
10761
10761
  "origin": "js-markup",
10762
10762
  "confidence": "certain"
10763
10763
  },
@@ -10955,7 +10955,7 @@
10955
10955
  "surface": "builders-hall",
10956
10956
  "text": "Text size",
10957
10957
  "file": "modules/hall-ui/public/shell.js",
10958
- "line": 499,
10958
+ "line": 490,
10959
10959
  "origin": "js-markup",
10960
10960
  "confidence": "certain"
10961
10961
  },
@@ -12359,7 +12359,7 @@
12359
12359
  "surface": "builders-hall",
12360
12360
  "text": "Use the control below to take it.",
12361
12361
  "file": "modules/hall-ui/public/shell.js",
12362
- "line": 740,
12362
+ "line": 731,
12363
12363
  "origin": "js-markup",
12364
12364
  "confidence": "certain"
12365
12365
  },
@@ -2623,5 +2623,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
2623
2623
  landed since 1.19.1066 with no explicit bump. run 36458843914. (task 1002620)
2624
2624
  1.19.1068 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2625
2625
  landed since 1.19.1067 with no explicit bump. run 36467481353. (task 1002620)
2626
+ 1.19.1069 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2627
+ landed since 1.19.1068 with no explicit bump. run 36470192310. (task 1002620)
2628
+ 1.19.1070 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2629
+ landed since 1.19.1069 with no explicit bump. run 36472133987. (task 1002620)
2626
2630
  ---------------------------------------------------------------------------
2627
2631
  ```
@@ -6,71 +6,95 @@ An art session is not the engineer's text-heavy build loop. The artist's subject
6
6
 
7
7
  ---
8
8
 
9
+ ## Where the artist works: the studio
10
+
11
+ The artist's whole loop is one page in the hall, **`/builders/studio`**: Tweak Mode ([ADR 0341](../adr/0341-the-page-is-the-unit-of-tweak-mode.md)). The unit is a **page** (an id such as `landing:index` or `builders:studio`, from [`docs/page-inventory.json`](../page-inventory.json)): the artist takes one whole page, rewrites its words as one document, submits it, and approves the applied result before it ships. No terminal, no claim command, no diff. Your first move is to open the studio in their browser and let them look.
12
+
13
+ **The studio.** A calm night room. Top right, the **tally**: credits, pages tweaked, this week. Under the greeting, Resume and three quick actions, each opening a glass panel in place:
14
+
15
+ - **Resume** — shown only while they hold a page; back into the editor on it, with "N of M lines" rewritten so far.
16
+ - **Tweak/CopyWrite Flow** — the page to do next, with its reason ("2 people asked for it", "4 lines changed since your last pass", "untweaked"). **take it** claims that page and opens the editor; **pick another** shows four more as chips. The order is: asked for, then changed since the last tweak, then untweaked.
17
+ - **Approval queue** — the pages a session has applied, waiting for them (below).
18
+ - **Artist Review Status** — three lines, landing, builders hall and status, each "N of M tweaked".
19
+
20
+ The studio's own words (the greeting and its sub-line) are the studio page itself: clicking them offers to take `builders:studio`, and then they type over them where they stand.
21
+
22
+ **The editor: `/builders/tweak-editor?page=<id>`.** Every line of the page, in page order, on one sheet of paper, typed over in place and **autosaved**. A changed line keeps a faint "was:". A line marked "changes this on every page" is shared shell text; one marked "goes to an engineer" cannot be placed in the code, so submitting files it as an engineer task and the page does not wait for it. The top bar holds:
23
+
24
+ - **open the page ↗** — the live page in a new tab, to read it in place;
25
+ - **download .docx / upload .docx** — work offline in Word, then upload; it merges into the draft, never straight to the site. Keep the paragraphs as they are: added, dropped or reordered lines are refused by name, and a page that changed since the download asks for a fresh one;
26
+ - **submit page** — freezes the words and puts the page in the queue. Then "The page is in." with **take next**, **pick another**, or back to the studio.
27
+
28
+ Only the holder writes. A page someone else holds is read-only and names them. A draft left unsubmitted keeps its words and can be taken up again.
29
+
30
+ **Between submit and approval, a session applies it.** Submitted pages wait for a builder session running `/tweak` ([the skill](../../.claude/skills/tweak/SKILL.md), Metic+). It transcribes every line, renders the page before and after, and parks it. **It never lands the page.**
31
+
32
+ **The Approval queue.** Pictures of the applied page, desktop or phone, light or dark, flipped **before / after**. Beside them, the changed lines ("was:" / "becomes:"); a line the applier could not apply says why. Then:
33
+
34
+ - **approve and ship** — it lands, the page's count goes up, and the artist is paid **30 credits** for the page, shown in the tally;
35
+ - **send it back** — with a note of at least ten characters; it returns to the `/tweak` queue and comes back once it is re-applied.
36
+
37
+ **Gone from the artist's loop:** the per-ship "Artist review" task (a ship that changes a page's words now marks it "changed since last tweak", and the Flow raises it) and flagging single strings on the copy desk (archived; a page is the unit now). Reviews filed before Tweak Mode are still answered behind the studio's quiet door under the actions ("1 review from before Tweak Mode still waits"), shown only while one does.
38
+
39
+ **When the artist is at the terminal instead.** You are their hands. The same routes the pages use are on `node scripts/gds/api.js` under `/api/bongos/copy-desk/`: `GET next`, `POST pages/<id>/claim`, `GET pages/<id>/draft`, `PUT pages/<id>/draft` (the whole draft, `{ reading_hash, lines: [{ key, after }] }`), `POST pages/<id>/submit`, `GET approvals`, `POST pages/<id>/approve`, `POST pages/<id>/send-back` (`{ note }`). Put *their* words in, then open the editor or the queue so they see the result. Never approve on their behalf.
40
+
41
+ ---
42
+
9
43
  ## The first rule: show, don't narrate
10
44
 
11
45
  In every other craft Claude narrates — diffs, logs, paragraphs about what it is doing. **Here that is the failure mode.** An artist judges with their eyes.
12
46
 
13
47
  > **Show, then briefly caption. Never narrate the pipeline at length.** Every step ends in something the artist can *look at*, with at most a one-line caption. The plumbing still runs; it runs quietly.
14
48
 
15
- - **End every step with something visual.** After a generation, display the image. After a copy change, show the rendered text in place, not a diff. After a check, show the scorecard, not a prose summary. They should see the result before they read a word.
16
- - **Collapse the plumbing to one-liners.** Budget checks, config edits, retry tiers, atlas rebuilds — do them, report them as a single line or a number. "Generated, scored 0.91, on-palette, staged ✓" beats three paragraphs.
17
- - **Verification is looking, not reading.** Surface the rendered surface and the sandbox preview, not console logs. Logs are for when something breaks, not for routine success.
18
- - **Nothing that changes a page ships until they have seen it** (the project default, owner 2026-09-23). Show the before and after in both modes at desktop and phone width, opened in their browser with `node scripts/gds/review-sheet.js` (a terminal shows no images), and ship on their OK.
49
+ - **End every step with something visual.** After a generation, display the image. After a copy change, show the rendered text in place (the studio, the editor, the Approval queue), not a diff. After a check, show the scorecard, not a prose summary.
50
+ - **Collapse the plumbing to one-liners.** "Saved, 12 of 38 lines rewritten" beats three paragraphs.
51
+ - **Verification is looking, not reading.** Surface the rendered page, not console logs. Logs are for when something breaks.
52
+ - **Nothing that changes a page ships until they have seen it** (owner, 2026-09-23). In Tweak Mode the Approval queue is that look. For other work, show the before and after in both modes at desktop and phone width with `node scripts/gds/review-sheet.js` (a terminal shows no images), and ship on their OK.
19
53
 
20
54
  ## The second rule: as little interpretation as possible
21
55
 
22
56
  The artist owns the look; you own the rendering. **You are their hands, not their art director.**
23
57
 
24
- - **Take the brief literally.** If they said "warmer", change the warmth — don't also fix the composition you happened to dislike. An unrequested improvement is an interpretation, and interpretation is what this rule is against.
25
- - **Don't explain your reasoning about taste.** They did not ask why; they asked to see it. If a request is genuinely impossible, say what stopped you in one line and show the nearest thing you could make.
26
- - **Don't offer a critique they didn't ask for.** When they want a second opinion they will ask, and there are graded review loops for it.
27
- - **Ask at most one question, and only when you truly cannot proceed.** Everything else you resolve by making something and showing it — a wrong first attempt they can react to is worth more than a right question they have to answer.
58
+ - **Take the brief literally.** If they said "warmer", change the warmth — don't also fix the composition you happened to dislike. Put their words on the page exactly; an unrequested improvement is an interpretation.
59
+ - **Don't explain your reasoning about taste.** They did not ask why; they asked to see it. If a request is impossible, say what stopped you in one line and show the nearest thing you could make.
60
+ - **Don't offer a critique they didn't ask for.** When they want a second opinion they will ask.
61
+ - **Ask at most one question, and only when you truly cannot proceed.** A wrong first attempt they can react to is worth more than a right question they have to answer.
28
62
 
29
63
  ## The third rule: arrive precalculated
30
64
 
31
65
  Setup is your job, and it should already be done when they get here. **A session that opens with questions is a form.**
32
66
 
33
- - **Load the look before you make anything.** The instance's palette, tokens, voice and style rules live in [`config/branding.neutral.json`](../../config/branding.neutral.json) ([contract](../branding-contract.md)), `DESIGN.md`, and the instance's own identity scaffold [`docs/project-context.template.md`](../project-context.template.md). Read them first, silently.
34
- - **Have the options ready.** Where a choice is coming, generate the candidates before you ask, so the question is "which of these" over pictures — never "what would you like" over a blank.
35
- - **Never present a checklist.** No numbered intake questions, no "please confirm the following", no form. One line of orientation, then the work.
36
- - **Locked things stay locked.** A palette, a rubric, or a token contract is not edited to make one asset pass — that is whole-project drift. Changing one needs an ADR.
67
+ - **Load the look before you make anything.** The palette, tokens, voice and style rules live in [`config/branding.neutral.json`](../../config/branding.neutral.json) ([contract](../branding-contract.md)), `DESIGN.md`, and the identity scaffold [`docs/project-context.template.md`](../project-context.template.md). Read them first, silently.
68
+ - **Have the options ready.** Where a choice is coming, make the candidates before you ask, so the question is "which of these" over pictures — never "what would you like" over a blank.
69
+ - **Never present a checklist.** One line of orientation, then the work.
70
+ - **Locked things stay locked.** A palette, a rubric, or a token contract is not edited to make one asset pass. Changing one needs an ADR.
37
71
 
38
72
  ---
39
73
 
40
74
  ## Step 0 — is an artist here?
41
75
 
42
- - Someone is present to look and react → **interactive mode**: show, react, iterate. Loop until they are happy; each pass ends in a picture.
43
- - Autonomous, bypass-permissions, or scheduled → **autonomous mode**: nobody is watching the images, so do not narrate into the void and do not lower the bar. Make it, gate it hard against whatever standard the surface has, stage the passes for review, and park them. In the session log give the preview URL and one line per asset — so the first thing the returning artist does is *look*, not read.
76
+ - Someone is present to look and react → **interactive mode**: show, react, iterate, each pass ending in a picture.
77
+ - Autonomous, bypass-permissions, or scheduled → **autonomous mode**: nobody is watching, so do not narrate into the void and do not lower the bar. Make it, gate it hard, stage it for review, and park it. **Never approve a page in the Approval queue for an absent artist.** In the session log give the preview URL and one line per item, so the returning artist's first act is to *look*.
44
78
 
45
79
  If unsure, ask once; if no answer, treat it as autonomous.
46
80
 
47
81
  ---
48
82
 
49
- ## What the artist's work actually is here
50
-
51
- The subject varies by instance; the stance above does not. In this core the standing surfaces are:
52
-
53
- - **The project's user-facing text** — the copy desk (`modules/copy-desk/`) is the artist's review loop over live copy. It is deliberately **not a CMS**: nothing on that page edits a string. A bad line becomes a claimed, graded task like any other change.
54
- - **The project's interface** — visual and layout work is the `ui` discipline and has its own playbook (`/design`), contributed by `modules/ui-design/`. Adjacent craft, separate lane.
55
- - **A pixel-art or asset pipeline**, when the instance ships one. It is a host module and is **not** part of the portable core, so its commands, palette, and rubric live with that module rather than here; on a core-only checkout those files are simply absent. Drive whatever pipeline the instance has via its own skills — never freelance around it, and never hand-edit its locked palette or rubric without an ADR.
83
+ ## The other surfaces
56
84
 
57
- The artist role also carries a deploy-time gate of its own in some instances (ADR 0241) — the artist's authority over what the project looks like when it goes out.
58
-
59
- ---
85
+ - **The interface's form** — visual and layout work is the `ui` discipline with its own playbook (`/design`, from `modules/ui-design/`). Adjacent craft, separate lane.
86
+ - **A pixel-art or asset pipeline**, when the instance ships one. It is a host module, not the portable core, so its commands, palette and rubric live with it; on a core-only checkout they are absent. Drive it via its own skills, and never hand-edit its locked palette or rubric without an ADR.
87
+ - The artist role can carry a deploy-time gate in some instances (ADR 0241).
60
88
 
61
89
  ## Scoping art work
62
90
 
63
- When you scope or present an art task, factor in that the reader judges by eye:
64
-
65
- - **Lead with the visual target**, not paragraphs — the subject, the reference it should sit beside, an example if one exists. "Make this," shown.
66
- - **Express done-when in visual terms** — "reads as weathered marble in-world, every pixel on the locked palette" — not a procedural step list.
91
+ - **Lead with the visual target**, not paragraphs — the subject, the reference it should sit beside, an example. "Make this," shown.
92
+ - **Express done-when in visual terms**, not a procedural step list.
67
93
  - **Keep procedure out of the task.** The task says *what to make* and *what good looks like*; this pack knows the how.
68
94
 
69
- ---
70
-
71
95
  ## Feedback becomes a durable rule
72
96
 
73
- When the artist reacts — "too saturated", "that reads as modern", "weather the marble" — don't just tweak once. Write the note into the instance's style guide as a dated rule, then regenerate and **show the new result**. The loop is see → react → see again, and the guide gets smarter every pass. A tweak that lives only in one asset is a tweak you will be asked for again.
97
+ When the artist reacts — "too saturated", "that reads as modern" — don't just tweak once. Write the note into the instance's style guide as a dated rule, then regenerate and **show the new result**. A tweak that lives only in one asset is a tweak you will be asked for again.
74
98
 
75
99
  ---
76
100
 
@@ -88,6 +88,8 @@ Three manual slash-commands keep the methodology surfaces from accumulating drif
88
88
  - **`/blocker-review`** — walk the open blockers: resolved (which auto-promotes linked tasks via a DB trigger), still blocked with a note, or escalate.
89
89
  - **`/backlog-review`** — walk `status='backlog'`, the pre-workable state a human must say go on. Rows waiting on a **person** get walked (promote / kill / water); rows waiting on a **trigger** are counted, never walked (a satisfied dep auto-promotes). It also surfaces rows stranded behind an abandoned dep, which the trigger can never fire for. `/demote` is invalid on a backlog row (409 `cannot_demote` — it requires `ready`).
90
90
 
91
+ **`/tweak`** (Metic+) works a fourth queue: pages an artist submitted from the studio wait there until a session applies them. It never lands one; the artist approves first (ADR 0341).
92
+
91
93
  If a day passes without them, the queues quietly grow. Running them is the structural cure for the markdown-graveyard pattern.
92
94
 
93
95
  > **`/merge-mode` is not a daily chore** — don't run it on a schedule or tell builders to. The server lands merges itself: green PRs auto-merge, a 5-min reconciler flips `confirmed → shipped`, and the ADR 0082 resolver self-heals generated-file conflicts. It is the rare manual fallback for a strand still stuck after that sweep.