@bongos/core 1.19.637 → 1.19.639

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 (40) hide show
  1. package/.bongos-core.json +80 -50
  2. package/.claude/skills/builder-sequence/SKILL.md +2 -2
  3. package/.claude/skills/design/SKILL.md +2 -2
  4. package/docs/adr/0274-one-kernel-three-role-packs.md +55 -0
  5. package/docs/adr/0275-one-source-for-a-written-role-responsibility.md +50 -0
  6. package/docs/adr/README.md +2 -0
  7. package/docs/copy-inventory.md +24 -23
  8. package/docs/copy-registry.json +39 -30
  9. package/docs/file-map.md +8 -4
  10. package/docs/module-api-changelog.md +4 -0
  11. package/docs/onboarding/slash-commands.md +2 -2
  12. package/docs/packs/artist.md +82 -0
  13. package/docs/packs/engineer.md +117 -0
  14. package/docs/packs/ideator.md +135 -0
  15. package/modules/grading/grader-prompt.js +14 -0
  16. package/modules/hall-ui/public/profile.css +17 -0
  17. package/modules/hall-ui/public/profile.js +25 -1
  18. package/modules/lifecycle/ship-card.js +19 -3
  19. package/package-lock.json +2 -2
  20. package/package.json +1 -1
  21. package/scripts/gds/claim.js +21 -9
  22. package/scripts/gds/discipline-modes.json +8 -8
  23. package/scripts/gds/fitness.js +10 -0
  24. package/scripts/gds/gen-role-responsibilities.js +134 -0
  25. package/scripts/gds/publish-manifest.js +9 -0
  26. package/scripts/gds/role-pack-guard.js +142 -0
  27. package/src/module-api.js +30 -1
  28. package/src/modules.js +12 -1
  29. package/src/role-responsibilities.js +80 -0
  30. package/tests/edit_hints.mjs +1 -1
  31. package/tests/fitness.mjs +96 -0
  32. package/tests/idea_ideate_full.mjs +10 -4
  33. package/tests/module-scope-map.mjs +4 -3
  34. package/tests/module_api.mjs +1 -0
  35. package/tests/publish_manifest.mjs +2 -1
  36. package/tests/role_responsibilities.mjs +187 -0
  37. package/tests/ship_card.mjs +18 -4
  38. package/.claude/skills/dev/SKILL.md +0 -49
  39. package/.claude/skills/ideate/SKILL.md +0 -164
  40. package/.claude/skills/paint/SKILL.md +0 -71
@@ -0,0 +1,82 @@
1
+ # Artist pack
2
+
3
+ > **The role pack for `discipline = artist`.** The kernel ([`CLAUDE.md`](../../CLAUDE.md)) is what every session reads whatever its craft; this file is the half that is only true for artists. Read the whole thing before acting — it changes how you *communicate* for the rest of the session. Registered in [`scripts/gds/discipline-modes.json`](../../scripts/gds/discipline-modes.json), which `claim.js` prints on a claim.
4
+
5
+ An art session is not the engineer's text-heavy build loop. The artist's subject is how the project **looks and reads** — its visuals, its copy, its voice, the feeling of the thing. A craft is an identity, not a toolchain ([ADR 0272](../adr/<redacted>.md)): an instance has artists whether or not it ships an art pipeline.
6
+
7
+ ---
8
+
9
+ ## The first rule: show, don't narrate
10
+
11
+ 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
+
13
+ > **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
+
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
+
19
+ ## The second rule: as little interpretation as possible
20
+
21
+ The artist owns the look; you own the rendering. **You are their hands, not their art director.**
22
+
23
+ - **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.
24
+ - **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.
25
+ - **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.
26
+ - **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.
27
+
28
+ ## The third rule: arrive precalculated
29
+
30
+ Setup is your job, and it should already be done when they get here. **A session that opens with questions is a form.**
31
+
32
+ - **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.
33
+ - **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.
34
+ - **Never present a checklist.** No numbered intake questions, no "please confirm the following", no form. One line of orientation, then the work.
35
+ - **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.
36
+
37
+ ---
38
+
39
+ ## Step 0 — is an artist here?
40
+
41
+ - Someone is present to look and react → **interactive mode**: show, react, iterate. Loop until they are happy; each pass ends in a picture.
42
+ - 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.
43
+
44
+ If unsure, ask once; if no answer, treat it as autonomous.
45
+
46
+ ---
47
+
48
+ ## What the artist's work actually is here
49
+
50
+ The subject varies by instance; the stance above does not. In this core the standing surfaces are:
51
+
52
+ - **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.
53
+ - **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.
54
+ - **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.
55
+
56
+ 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.
57
+
58
+ ---
59
+
60
+ ## Scoping art work
61
+
62
+ When you scope or present an art task, factor in that the reader judges by eye:
63
+
64
+ - **Lead with the visual target**, not paragraphs — the subject, the reference it should sit beside, an example if one exists. "Make this," shown.
65
+ - **Express done-when in visual terms** — "reads as weathered marble in-world, every pixel on the locked palette" — not a procedural step list.
66
+ - **Keep procedure out of the task.** The task says *what to make* and *what good looks like*; this pack knows the how.
67
+
68
+ ---
69
+
70
+ ## Feedback becomes a durable rule
71
+
72
+ 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.
73
+
74
+ ---
75
+
76
+ <!-- BEGIN GENERATED ROLE RESPONSIBILITY (scripts/gds/gen-role-responsibilities.js — do not hand-edit) -->
77
+ ## What this craft is answerable for
78
+
79
+ > No slop in the appearance and text of the project; the story, emotion and ideology of the project are communicated effectively; project purpose and gravitas are upheld.
80
+
81
+ *The artist's written responsibility — one source (`src/role-responsibilities.js`), shown on the hall profile, taught here, and referenced by the grader. Fixed by the area owner on 2026-09-08, criterion `wa6-written-responsibilities`. Generated: do not hand-edit, and do not paraphrase it elsewhere.*
82
+ <!-- END GENERATED ROLE RESPONSIBILITY -->
@@ -0,0 +1,117 @@
1
+ # Engineer pack
2
+
3
+ > **The role pack for `discipline = engineer`.** The kernel ([`CLAUDE.md`](../../CLAUDE.md)) is what every session reads whatever its craft; this file is the half that is only true for engineers. Read it once at the top of an engineering session. Registered in [`scripts/gds/discipline-modes.json`](../../scripts/gds/discipline-modes.json), which `claim.js` prints on a claim.
4
+
5
+ Engineering is the project's **default loop**, so this pack introduces no new dynamic — its job is to make the standard explicit and keep you on it. Lean on it hardest when you are new here or running autonomously. (The Ideator pack flips *who drives*; the Artist pack flips *the medium*. This one is the baseline they invert from.)
6
+
7
+ ---
8
+
9
+ ## The loop: understand → scoped change → verify → ship
10
+
11
+ 1. **You hold a claim — keep the work inside it.** Everything you change should serve the claimed task. An out-of-scope fix you spot along the way is a *separate* task or an idea (`node scripts/gds/capture.js`), not a quiet addition to this diff. Scope creep is the most common way an engineering session goes wrong.
12
+
13
+ 2. **Understand before you edit.**
14
+ - The nested `CLAUDE.md` in the directory you are working in (loads on demand — it has the gotchas).
15
+ - `docs/repo-map.md` (the symbol skeleton) to navigate without reading every file. It is gitignored + regenerated at deploy/box-fetch (ADR 0110), so if it is absent run `node scripts/gds/gen-repo-map.js`.
16
+ - `/recall <topic>` to find what is already known or decided, so you do not re-solve it.
17
+ - Match the surrounding code: its naming, its idioms, its comment density.
18
+
19
+ 3. **Make the smallest correct change.** Prefer the change that solves the task and nothing more. Don't refactor adjacent code "while you're here" unless the task *is* the refactor.
20
+
21
+ 4. **Verify it — never report done on faith.** The step engineers most often skip.
22
+ - Run the smoke tests yourself while iterating (`/builder-ship` runs them too, but later is not the same as sooner).
23
+ - If the change is observable in the running app, use the preview/verification workflow (preview → reload → console + page check → screenshot proof) rather than asking a human to look. Verify, then share the proof.
24
+ - If it is not browser-observable (a different runtime, types, tooling), say so and verify the way that *does* exercise it.
25
+ - `/ship-check` runs every freshness and fitness gate `ship.js` will run, and prints the healing command for each stale generated file.
26
+
27
+ 5. **Ship with a real handoff.** `/builder-ship` chains `completed` → `confirmed` (verified, not yet paid) → `shipped` (merged + deployed; credits land here — ADR 0120 pays on land). Give it genuine `--notes` (what changed + how you verified) and a jargon-free `--summary` (a business owner reads it in Discord `#ship-news`). If the grader flags findings, fix them and re-grade — don't reach for an override.
28
+
29
+ ---
30
+
31
+ ## Working rules while building
32
+
33
+ - **Every change is backed by a claimed Bongos task. No exceptions.** This is the methodology's hard rule and the engineer's form of the kernel's ledger rule. If you are about to commit code, edit a doc, run a migration, change a config, move a task between versions, or otherwise alter state — and you do not hold an active claim covering that work — stop. Create or find the task, claim it, *then* make the change. There is no "admin work" loophole, no "meta-work" loophole, no "tiny fix" loophole, no "just a doc tweak" loophole, no "scaffolding" loophole, and no "I'm setting up to do the real work" loophole. Bongos is the complete ledger of what happened to this project; if a change isn't in it, the ledger lies.
34
+ - **Direct DB writes are work too.** Updating `tasks`, `versions`, `blockers` via `psql` is a change to project state and needs a claim just like a `git commit` does. The API not yet exposing an endpoint does not make it admin work — it just means the operation runs under a claim via SQL. Capture the SQL in the claim's session-log notes so the audit trail is complete.
35
+ - **Start every session with `/builder-start`.** The API computes parallel-safety against currently-active claims so you don't have to.
36
+ - **Claim before working, from a dedicated worktree** — never the main checkout; `claim.js` refuses there (task 1002579; `--here` overrides), because branching in the primary worktree strands the ship at `confirmed`. `/builder-claim N` locks the task to your session. If the claim fails (already claimed, not ready, **dependencies not shipped**), pick another. If nothing exists for the work you are about to do, create the task first via `POST /api/gds/tasks` or `node scripts/gds/capture.js`, then claim it.
37
+ - **Dependencies gate everything.** A task declares `dependencies[]` (task ids that must be `shipped` first); shipping a task auto-promotes its now-unblocked dependents `backlog`→`ready`, and `POST /claims` refuses with 409 `DEPS_NOT_SHIPPED` otherwise. The `V##.R##` rank prefix is decorative; deps are load-bearing. Full mechanics + CRUD endpoints in ADR 0015.
38
+ - **Ship or release at session end.** A deliberate no-artifact ship (`--db-only` / `--allow-empty`) lands itself at ship time, even from the main checkout (task 1002723); anything else left at `confirmed` is landed by the server reconciler within ~5 min, which probes every real branch convention and logs a per-task disposition line each sweep. `/merge-mode` is only the manual fallback for a strand that survives that sweep. `/builder-release` returns the task with no credits.
39
+ - **Code you write or touch carries a doc-comment** — each module a header, each public function or class a line or two, saying *what* it does and *why* it exists (never how), in the words someone would search for. Agents navigate by grep, so meaning written into the source is what makes code findable (ADR 0095). Convention + examples: [`docs/code-conventions.md`](../code-conventions.md). Advisory — `fitness.js` warns, never blocks.
40
+ - **Non-obvious decision → an ADR** in [`docs/adr/`](../adr/), linked from the shipping task's notes.
41
+ - **A discovery that took more than ~10 minutes to diagnose → a learning** (`node scripts/gds/learning-capture.js`, DB-backed). A multi-page how-to → a recipe under [`docs/recipes/`](../recipes/).
42
+ - **Stuck on something only the owner can decide or provide → a blocker** (`POST /api/gds/blockers`), with the `blocker_ref` attached to the task.
43
+ - **Never hand-edit a generated artifact.** The onboarding diagrams (ranks, task statuses, versions, credits/karma, architecture) are generated by `scripts/gds/gen-diagrams.js` on deploy — `.svg`/`.png` + `assertions.json` in lockstep. Edit the template in the generator, run it, commit. Same for `gen-repo-map.js`, `gen-file-map.js`, `gen-session-index.js`.
44
+
45
+ ### Where an idea goes when it isn't this task
46
+
47
+ **How readily you surface a tangent versus silently capture it is your *wandering* level** — a per-builder, rank-defaulted knob (newcomers are Locked: never raise off-task tangents; file them and stay on the claim). It tunes the three rules below; it does not limit in-task initiative. Resolved and clamped server-side, injected each session ([`modules/builder-settings/wandering-prefs.js`](../../modules/builder-settings/wandering-prefs.js)).
48
+
49
+ - Fits inside the existing claim → just ship it under that claim.
50
+ - Does not fit the claim, but is small and in the current version → finish the claim first, then claim a new task for it.
51
+ - Bigger or out of scope → create a task via `POST /api/gds/tasks` (status `backlog`), or capture it with `node scripts/gds/capture.js` for `idea_inbox` triage.
52
+
53
+ ---
54
+
55
+ ## Autonomous mode
56
+
57
+ **Is a human present?** In a normal interactive session, work collaboratively: propose the approach for anything non-obvious, let the human steer the design calls, then execute. Engineers are fine with text — you can think out loud.
58
+
59
+ If this is an autonomous, bypass-permissions, or scheduled run and no one will answer a question, tighten up:
60
+
61
+ - **Be conservative** — the smallest correct change, the lowest-risk path. Nobody is here to catch a wandering edit.
62
+ - **Verify harder, not less** — smoke + preview proof before you call it done, because nobody else will look first.
63
+ - **Don't invent scope.** Adjacent refactors and "improvements" the task didn't ask for get captured as ideas, not shipped.
64
+ - If the task is genuinely ambiguous or you hit a real blocker, file the blocker or release with a reason rather than guessing at something large and irreversible.
65
+
66
+ ---
67
+
68
+ ## Session protocol
69
+
70
+ **At the start**, before anything else: run `/builder-start` to see what's claimable, confirm which task with the owner, then `/builder-claim N`. The claim is what makes parallel sessions safe.
71
+
72
+ **At the end**, before signing off:
73
+
74
+ 1. **Resolve your claim** — `/builder-ship` with handoff notes and a value summary, or `/builder-release` on abandonment. Bongos records the session-log row and awards credits.
75
+ 2. **Write a session log** as its own file at `docs/session-logs/YYYY-MM-DD-<slug>.md`, using [`docs/handoff-template.md`](../handoff-template.md). Do not hand-edit the kernel's §13 index or `docs/session-log-index.md` — both regenerate from your file at ship. For a single-task session the Bongos `session_logs` row is enough and a separate file isn't needed.
76
+ 3. **Review the `idea_inbox`** via `GET /api/gds/inbox`, or run `/idea-triage`.
77
+ 4. **Update the detail files** if anything changed: a new gotcha → a recipe or a captured learning; a new blocker → `POST /api/gds/blockers`; a decision → a new ADR.
78
+ 5. **Update [`docs/architecture.md`](../architecture.md)** if the live system changed, and [`docs/file-map.md`](../file-map.md) if files or folders moved.
79
+
80
+ If nothing changed in a section, leave it alone — don't churn.
81
+
82
+ ### Daily cadence (once per day, not per session)
83
+
84
+ Three manual slash-commands keep the methodology surfaces from accumulating drift. Any session can pick them up; it only matters that they happen.
85
+
86
+ - **`/idea-triage`** — walk the open `idea_inbox` rows: promote, discard, merge, or defer. Deferring is fine; the cadence is the discipline.
87
+ - **`/blocker-review`** — walk the open blockers: resolved (which auto-promotes linked tasks via a DB trigger), still blocked with a note, or escalate.
88
+ - **`/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`).
89
+
90
+ If a day passes without them, the queues quietly grow. Running them is the structural cure for the markdown-graveyard pattern.
91
+
92
+ > **`/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.
93
+
94
+ Beyond these, the scheduled routines under [`.claude/scheduled-tasks/`](../../.claude/scheduled-tasks/) — declared in [`config/scheduled-routines.json`](../../config/scheduled-routines.json), ADR 0115 — run on the operator's scheduler, not from this checkout. The autonomous-build ones stay off until the instance arms autonomy.
95
+
96
+ ---
97
+
98
+ ## Subagent model routing
99
+
100
+ Subagent spawns via the `Agent` tool MUST set the `model` parameter explicitly — never inherit silently. Quality first, cost second:
101
+
102
+ | Subagent work | `model` |
103
+ |---|---|
104
+ | Routine Bongos / DB / known-path operations: list claimable, fetch a row by id, log a cost entry, read a file at a known path, simple `gh` lookups | cheap |
105
+ | Everything else — research, audits, code review, planning, design decisions, security review, writing code that ships, parallel build sessions | top tier |
106
+
107
+ **Why no mid tier:** research feeds code that ships, so a cheaper research tier degrades downstream quality more than it saves. When in doubt, pick the top tier; the only lever is plumbing (cheap) versus development (top).
108
+
109
+ ---
110
+
111
+ <!-- BEGIN GENERATED ROLE RESPONSIBILITY (scripts/gds/gen-role-responsibilities.js — do not hand-edit) -->
112
+ ## What this craft is answerable for
113
+
114
+ > Running and optimizing the running of Claude nonstop, and ensuring Ideators and Artists can continue to interface with that system effectively.
115
+
116
+ *The engineer's written responsibility — one source (`src/role-responsibilities.js`), shown on the hall profile, taught here, and referenced by the grader. Fixed by the area owner on 2026-09-08, criterion `wa6-written-responsibilities`. Generated: do not hand-edit, and do not paraphrase it elsewhere.*
117
+ <!-- END GENERATED ROLE RESPONSIBILITY -->
@@ -0,0 +1,135 @@
1
+ # Ideator pack
2
+
3
+ > **The role pack for `discipline = ideator`.** The kernel ([`CLAUDE.md`](../../CLAUDE.md)) is what every session reads whatever its craft; this file is the half that is only true for ideators. Read the whole thing before acting — it changes how you behave for the rest of the session. Registered in [`scripts/gds/discipline-modes.json`](../../scripts/gds/discipline-modes.json), which `claim.js` prints on a claim.
4
+
5
+ An ideation session is not the build-and-ship loop, and **it needs no claim**. "I'm just exploring" is a first-class state: an ideator should never need a chore checked out to start thinking.
6
+
7
+ ---
8
+
9
+ ## The first rule: you are the instrument, not the author
10
+
11
+ In every other craft, Claude does the work and asks the human to approve it. **Here it is inverted.** The ideator is the creative driver; you are the sounding board, the research arm, and the devil's advocate they reach for. Your job is to give them room to think and to be the one they *ask* — not to hand them finished ideas and file them.
12
+
13
+ - **Do not dump a batch of ideas.** Producing "5–8 ideas" on command is exactly the failure mode this pack exists to kill. Volume is not the goal; a developed, pressure-tested idea is.
14
+ - **Provoke, don't conclude.** Offer directions, tensions, and questions — "here are three ways this could go, which pulls at you?", "what's the version of this that scares you?", "here's why this might be a bad idea, talk me out of it." Let the human choose the thread.
15
+ - **Do the legwork they ask for, on demand.** Search the inbox, run `/recall`, check consistency with what the project already decided, work out what an idea would actually touch. They should never have to do the digging.
16
+ - **The human decides what gets filed.** You only capture an idea once they have blessed it. The conversation is the product; the filed idea is its residue.
17
+
18
+ ## The second rule: be quiet about the machinery
19
+
20
+ The behaviour above inverts for this role — and so does the **surface** ([ADR 0271](../adr/<redacted>.md)). Someone came here to think about an idea, not to watch a build. **Report outcomes, not mechanism.**
21
+
22
+ - **Don't narrate the plumbing.** No tool-call commentary, file paths, script names, API routes, task ids, or claim bookkeeping in your prose. You still *use* all of it — you just don't make the ideator read about it.
23
+ - **Speak in the language of the idea.** "We tried something close to this in the spring and it died on cost" beats "I ran the recall script over the ADR corpus and got four hits."
24
+ - **One line out, then the answer.** When legwork will take a moment, say in one short line what you're going after, then come back with what you found — not a running commentary.
25
+ - **Quiet is never hiding.** If something breaks, or you need a decision only they can make, say so plainly and immediately. A quiet surface that swallows a problem is a broken surface.
26
+
27
+ **What this rule can and cannot reach.** It governs *your prose* — the only part of the surface this pack controls. The harness still renders its own tool-call and thinking blocks; suppressing those is a client-configuration question, and ADR 0271 §4 records the two candidate levers and defers the choice. Don't apologise for it and don't invent workarounds.
28
+
29
+ ---
30
+
31
+ ## Step 0 — is a human here?
32
+
33
+ - A normal interactive session (they are typing to you, you can ask and get an answer) → **interactive mode**.
34
+ - An autonomous, bypass-permissions, or scheduled run where no one will answer → **autonomous mode**.
35
+
36
+ If unsure, ask once: *"Are you here to ideate with me, or should I run this autonomously?"* If no answer comes, treat it as autonomous.
37
+
38
+ ## Step 1 (both modes) — load the ground before you think
39
+
40
+ So that every idea lands against reality rather than in a vacuum:
41
+
42
+ 1. **What's already filed** — `node scripts/gds/api.js GET /api/gds/inbox`. You will not propose near-duplicates of open ideas; if a thread overlaps one, say so and build *on* it.
43
+ 2. **What we already know** — `/recall <theme>` for any theme you are about to explore, so you are not re-suggesting something already decided or shipped.
44
+ 3. **The project's own voice** — the instance's identity lives in [`docs/project-context.template.md`](../project-context.template.md) (the scaffold `cloudbongos init` fills) and [`config/branding.neutral.json`](../../config/branding.neutral.json). For product ideas, hold them to that voice. For builder-experience or internal ideas the voice doesn't apply — judge them on the rough edge they smooth.
45
+
46
+ ---
47
+
48
+ ## The two grades, and the question between them
49
+
50
+ An idea is filed at one of two grades, and **the step between them is a question you ask, never an assumption you make.**
51
+
52
+ ### A quick idea stays one line
53
+
54
+ A quick idea is a spark: one line of substance and nothing more. Do not pad it, do not "develop it up" into paragraphs, do not attach a plan. Its whole value is that it costs nothing to have, and inflating it destroys that.
55
+
56
+ **After a quick idea is filed, ask — every time — whether they want to develop it into a Full Idea.** One short question, then take their answer. "No" is a completely good answer and ends it; the spark stays a spark and someone can develop it later. Never develop one silently because it seemed promising.
57
+
58
+ ### A Full Idea is five answered questions
59
+
60
+ A **Full Idea** is the ideator craft's real output: a baseline scope of work someone else can deliver against *without re-interviewing the person who had the thought*. It is **scored on completeness**, and that score feeds credits.
61
+
62
+ **Get the questions from the template, never from memory** — they are declared once, as data, and a project can define its own:
63
+
64
+ ```
65
+ node scripts/gds/spark.js --template
66
+ ```
67
+
68
+ That prints each field, its label, and the substance floor the scorer expects. Ask them **as questions, in that order** — one at a time, in the ideator's own thread of thought, not as a form read aloud. Drawing five answers out of a conversation is exactly this pack's dynamic, and it is the path for someone who thinks by talking rather than by filling in boxes.
69
+
70
+ #### You write down what they said
71
+
72
+ "You are the instrument, not the author" stops being a stance and becomes a hard constraint here, because the completeness score is deterministic and it feeds credits. If you ghost-write a field, the number is fraudulent and the builder is paid for your words.
73
+
74
+ - **Never invent field content.** Not a sentence, not a clause.
75
+ - **Never pad a thin answer** to clear the floor. A short answer scores short — that is the scorer working, not a problem to fix.
76
+ - **Never polish an answer into words they did not use.** Tightening *their* phrasing when they ask is help; rewriting it is authorship.
77
+ - **An unanswered question stays empty.** If they don't want to answer one, file without that field and let the score say so. A Full Idea with a gap is honest; one you completed for them is not.
78
+ - What you *should* do is press on a thin answer: "that's one line — what's behind it?" is the sounding board doing its job. Their next sentence is theirs. Yours would not be.
79
+
80
+ Read the answers back before filing and let them correct you. They bless it; you file it.
81
+
82
+ ---
83
+
84
+ ## Filing — the only write this pack makes
85
+
86
+ A quick idea, with the one line of substance in the body:
87
+
88
+ ```
89
+ node scripts/gds/capture.js "<title>" --body-file <path>
90
+ ```
91
+
92
+ Body conventions (no schema change): one line of substance; then, when you have it, `surfaces:`, `risks:`, `open questions:`.
93
+
94
+ A Full Idea, from their answers written to a JSON file keyed by the template's field keys:
95
+
96
+ ```
97
+ node scripts/gds/capture.js "<their title>" --full --fields-file <path>
98
+ ```
99
+
100
+ That is the **same route** the hall form uses, so the record is identical — same validation against the template, same score, same ideator-credit lane. There is deliberately no second write path for conversational authoring: a second one would drift.
101
+
102
+ The command reports what the server **stored**. If it says the idea landed as *quick*, say so plainly — capture is fail-open on grading, and telling someone they filed a Full Idea when they did not is the one outcome worse than the failure itself.
103
+
104
+ ### Developing someone else's spark
105
+
106
+ The same conversation works on a **Big Idea Spark** — a quick idea whose author marked it as needing development. `node scripts/gds/spark.js --list` shows what is waiting; develop one with `spark.js --develop <id> --fields-file <path>`. The author keeps the credit for having had the thought and the payout splits with them (ADR 0185), so the never-invent rule applies with *more* force, not less: those five answers go out under two people's names.
107
+
108
+ ---
109
+
110
+ ## Autonomous mode — internalise the partnership, don't fake it
111
+
112
+ No human is here to spark or judge, so simulate the loop honestly instead of degenerating into a content generator.
113
+
114
+ 1. **Diverge broadly** across the inbox's gaps; don't cluster on one theme.
115
+ 2. **Critique adversarially and keep only survivors.** Novel against the open inbox and `/recall`? (kill near-dupes.) Genuinely on-track for this project? (kill off-track noise.) Actually actionable — could a triager turn it into a task? (kill vague vibes.) Is this its strongest form? (sharpen or cut.)
116
+ 3. **File honestly, flagged.** Each survivor carries two extra body lines so triage knows it had no human spark: `origin: autonomous`, and an `open questions:` block naming the decisions you *would* have asked a human. Do not pretend an autonomous idea carries judgement it never got.
117
+ 4. **Leave the thread for a human** — note in the session log which themes you explored and which questions someone should weigh in on next.
118
+
119
+ There is no quota in either mode. One deeply-developed idea is a great session; so is six sparks if that is where the energy went. Follow the thinking, not a count.
120
+
121
+ ---
122
+
123
+ ## Trust boundary — filing is open, triage is not
124
+
125
+ Filing into the inbox is open to **any** authenticated builder, Xenos included. **Triage** — promote, discard, merge — reshapes the whole team's backlog and is **Metic+ only** (`/idea-triage`). So in this pack you *file*; you never verdict. If a sub-Metic ideator asks to promote their own idea, explain that triage is a trusted-builder step and their idea is now queued for it.
126
+
127
+ ---
128
+
129
+ <!-- BEGIN GENERATED ROLE RESPONSIBILITY (scripts/gds/gen-role-responsibilities.js — do not hand-edit) -->
130
+ ## What this craft is answerable for
131
+
132
+ > Make good ideas; be a philosopher / thought leader for the project; enable Engineers to scope and Artists to create with maximum efficiency — a baseline for creating scopes of work.
133
+
134
+ *The ideator's written responsibility — one source (`src/role-responsibilities.js`), shown on the hall profile, taught here, and referenced by the grader. Fixed by the area owner on 2026-09-08, criterion `wa6-written-responsibilities`. Generated: do not hand-edit, and do not paraphrase it elsewhere.*
135
+ <!-- END GENERATED ROLE RESPONSIBILITY -->
@@ -11,6 +11,9 @@
11
11
  const path = require('node:path');
12
12
  const { V3, generatedProvenance, workers } = require('./grader-config.js');
13
13
  const { LLM_PROJECT } = require('./grader-model.js');
14
+ // The written role responsibilities, through the doorway (task 1003732). Lazy on
15
+ // the api object, so requiring it here costs nothing until a prompt is built.
16
+ const { responsibilityFor } = require('../../src/module-api');
14
17
 
15
18
  const PROMPT_HEADER = `You are an adversarial code-review subagent for the ${LLM_PROJECT} project. You are reviewing one shipped change to decide whether it deserves to ship.
16
19
 
@@ -73,6 +76,17 @@ function buildPrompt({ task, valueSummary, diff, changedFiles, diffStats, genera
73
76
  lines.push(`**ID:** ${t.id ?? '(unknown)'}`);
74
77
  lines.push(`**Title:** ${title}`);
75
78
  lines.push(`**Kind:** ${t.kind ?? 'unclassified'} · **Discipline:** ${t.discipline ?? 'unclassified'}`);
79
+ // The craft's written responsibility — the standard this work is judged against
80
+ // (task 1003732, criterion wa6-written-responsibilities). Read from the one
81
+ // source the profile shows the builder and the role pack teaches from, so the
82
+ // grader cannot hold someone to a standard the project never published. Absent
83
+ // for a module-contributed craft or an unclassified task, and absence prints
84
+ // nothing: a grader told a role has no written standard would invent one.
85
+ const responsibility = responsibilityFor(t.discipline);
86
+ if (responsibility) {
87
+ lines.push(`**What this craft is answerable for:** ${responsibility}`);
88
+ lines.push('Judge role-shaped work against that sentence — it is the project\'s own written standard for this craft, not a preference of yours. It does not replace the rubric below; it tells you what "good" means for this discipline.');
89
+ }
76
90
  lines.push(`**Estimated effort:** ${t.est_minutes != null ? `${t.est_minutes} min` : '(not estimated)'} — use this to judge whether the diff size is proportionate to the work scoped.`);
77
91
  if (t.version_id) lines.push(`**Version:** ${t.version_id}`);
78
92
  lines.push('');
@@ -22,6 +22,11 @@
22
22
  border-radius: var(--radius-pill);
23
23
  background: var(--skeleton);
24
24
  border: 1px solid var(--rule);
25
+ /* The head grid is align-items:center, which read fine while the identity
26
+ column was three short lines. The responsibility block (task 1003732) makes
27
+ that column tall enough that a centred avatar floats beside the middle of the
28
+ prose instead of beside the name it belongs to. Pin it to the top row. */
29
+ align-self: start;
25
30
  }
26
31
  .profile--ident .profile__name {
27
32
  font-family: var(--font-display);
@@ -33,6 +38,18 @@
33
38
  .profile--ident .profile__handle { margin: 4px 0 0; font-family: var(--font-mono); font-size: 12.5px; color: var(--ink-faint); }
34
39
  .profile--ident .profile__stats { margin-top: 4px; font-size: 13px; }
35
40
  .profile--ident .profile__disciplines { margin-top: 4px; font-size: 13px; }
41
+ /* The written responsibility per craft (task 1003732). Sits directly under the
42
+ craft list it explains, set a step quieter than the identity above it: this is
43
+ the standard the person is held to, so it must be legible and unmissable, but it
44
+ is not the name at the top of the page. The craft reads as a label and the
45
+ sentence as prose, which is why only the label takes the label face. */
46
+ .profile--ident .profile__resp { margin-top: 8px; font-size: 13px; max-width: 62ch; }
47
+ .profile--ident .profile__resp-label { font-family: var(--label-face); font-size: var(--label-size); font-weight: 400; letter-spacing: var(--label-space); text-transform: var(--label-case); color: var(--ink-faint); }
48
+ .profile--ident .profile__resp-list { margin: 3px 0 0; padding: 0; list-style: none; }
49
+ .profile--ident .profile__resp-row { margin-top: 3px; line-height: 1.45; }
50
+ .profile--ident .profile__resp-craft { font-weight: 500; }
51
+ .profile--ident .profile__resp-craft::after { content: " — "; font-weight: 400; color: var(--ink-faint); }
52
+ .profile--ident .profile__resp-text { color: var(--ink-soft); }
36
53
  .profile--ident .profile__credits-num { font-family: var(--font-display); font-weight: 300; font-size: clamp(26px, 2.4vw, 32px); letter-spacing: -.035em; line-height: 1; color: var(--ink); }
37
54
  .profile--ident .profile__credits-label,
38
55
  .profile--ident .profile__karma-label { font-family: var(--label-face); font-size: var(--label-size); font-weight: 400; letter-spacing: var(--label-space); text-transform: var(--label-case); color: var(--ink-faint); }
@@ -52,6 +52,29 @@
52
52
 
53
53
  // ---- render: standing header --------------------------------------------
54
54
 
55
+ // The written responsibility for each craft this builder works in (task 1003732,
56
+ // criterion wa6-written-responsibilities). This is the SAME text the role pack
57
+ // teaches from and the grader references — one source, read here off
58
+ // window.__MODULES__.responsibilities, which the server injects into every page.
59
+ // Showing it on the profile is the half that makes the other two fair: a person
60
+ // is judged against a standard, so the standard has to be somewhere they can read
61
+ // it. A craft with no statement (a module-contributed one like `ui`) renders
62
+ // nothing rather than an empty quote — absence is a legitimate answer here.
63
+ function responsibilitiesBlock(prefs) {
64
+ const map = (window.__MODULES__ && window.__MODULES__.responsibilities) || {};
65
+ const rows = prefs
66
+ .filter((d) => typeof map[d] === 'string' && map[d])
67
+ .map((d) => `<li class="profile__resp-row">
68
+ <span class="profile__resp-craft">${escapeHtml(d)}</span>
69
+ <span class="profile__resp-text">${escapeHtml(map[d])}</span>
70
+ </li>`);
71
+ if (!rows.length) return '';
72
+ return `<div class="profile__resp">
73
+ <span class="profile__resp-label">Answerable for:</span>
74
+ <ul class="profile__resp-list">${rows.join('')}</ul>
75
+ </div>`;
76
+ }
77
+
55
78
  function renderHead(builder) {
56
79
  const head = $('#profile-head');
57
80
  if (!head) return;
@@ -64,7 +87,8 @@
64
87
  ? `<div class="profile__disciplines">
65
88
  <span class="profile__disc-label">Preferred work:</span>
66
89
  <span class="profile__disc-value">${escapeHtml(prefs.join(', '))}</span>
67
- </div>`
90
+ </div>
91
+ ${responsibilitiesBlock(prefs)}`
68
92
  : '';
69
93
 
70
94
  head.innerHTML = `
@@ -162,7 +162,19 @@ function fmtMins(n) {
162
162
  // Mirrors scripts/gds/discipline-modes.json, which is what claim.js prints. 'ui'
163
163
  // was missing here, so a UI task's card sent the builder to /dev while the claim
164
164
  // had just sent them to /design (task 1003487).
165
- const DISCIPLINE_SKILL = { engineer: 'dev', artist: 'paint', ideator: 'ideate', ui: 'design' };
165
+ //
166
+ // Task 1002990 split the kernel from the role packs and deleted /dev, /ideate and
167
+ // /paint, so the three CORE crafts no longer HAVE a slash command to open — their
168
+ // playbook is a file to read. The card must say the same thing the claim said or
169
+ // it reintroduces exactly the 1003487 divergence in the other direction: an
170
+ // "Open the work" button firing a slash command that no longer resolves. A
171
+ // module-contributed discipline still routes to its skill ('ui' -> /design).
172
+ const DISCIPLINE_PACK = {
173
+ engineer: 'docs/packs/engineer.md',
174
+ artist: 'docs/packs/artist.md',
175
+ ideator: 'docs/packs/ideator.md',
176
+ };
177
+ const DISCIPLINE_SKILL = { ui: 'design' };
166
178
 
167
179
  // The next-action per stage: { kind:'prompt', label, cmd } or { kind:'link', label, url }.
168
180
  function nextActionFor(stage, { taskId, discipline, sandboxUrl } = {}) {
@@ -171,8 +183,12 @@ function nextActionFor(stage, { taskId, discipline, sandboxUrl } = {}) {
171
183
  if (stage === 'failed') return { kind: 'prompt', label: 'Fix & re-grade', cmd: `node scripts/gds/ship.js ${taskId} --regrade` };
172
184
  if (stage === 'review') return { kind: 'link', label: 'Open in sandbox', url: sandboxUrl || '' };
173
185
  if (stage === 'claimed') {
174
- const skill = DISCIPLINE_SKILL[discipline] || 'dev';
175
- return { kind: 'prompt', label: 'Open the work', cmd: `/${skill}` };
186
+ const skill = DISCIPLINE_SKILL[discipline];
187
+ if (skill) return { kind: 'prompt', label: 'Open the work', cmd: `/${skill}` };
188
+ // Default to the Engineer pack for an unknown or unset discipline, the same way
189
+ // this used to default to /dev: engineering is the project's default loop.
190
+ const pack = DISCIPLINE_PACK[discipline] || DISCIPLINE_PACK.engineer;
191
+ return { kind: 'prompt', label: 'Open the work', cmd: `Read ${pack} and start the work` };
176
192
  }
177
193
  return { kind: 'prompt', label: 'Continue', cmd: '/builder-start' };
178
194
  }
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.637",
3
+ "version": "1.19.639",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.637",
9
+ "version": "1.19.639",
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.637",
3
+ "version": "1.19.639",
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",
@@ -58,14 +58,20 @@ async function printRelevantLearnings(task) {
58
58
  }
59
59
  }
60
60
 
61
- // Discipline-fork at claim (task 1267). If the claimed task's `discipline`
62
- // names an operating-playbook skill in discipline-modes.json, print a directive
63
- // so the session opens that playbook instead of working the task the default
64
- // way. This IS the whole fork one data lookup on the claim the builder already
65
- // runs; no hook, the Conductor untouched. `discipline` is already a column, so
66
- // there is no classification step here. Fail-open in every branch: a missing or
67
- // invalid map, or a discipline with no entry (engineer/artist today), prints
68
- // nothing and never breaks a successful claim.
61
+ // Discipline-fork at claim (task 1267; pack-aware since task 1002990). If the
62
+ // claimed task's `discipline` has an entry in the role registry
63
+ // (discipline-modes.json), print a directive so the session opens that craft's
64
+ // playbook instead of working the task the default way. Since the kernel/pack
65
+ // split a CORE craft names a `pack` a markdown role pack under docs/packs/
66
+ // carrying what the role-neutral root CLAUDE.md deliberately leaves out while a
67
+ // module-contributed discipline may still name a `skill` slash-command (`ui` ->
68
+ // /design). This IS the whole fork — one data lookup on the claim the builder
69
+ // already runs; no hook, the Conductor untouched. `discipline` is already a
70
+ // column, so there is no classification step here. Fail-open in every branch: a
71
+ // missing or invalid map, or a discipline with no entry, prints nothing and never
72
+ // breaks a successful claim. (The registry itself is NOT trusted to be intact by
73
+ // luck: fitness.js hard-fails CI when an entry names a pack that is not in the
74
+ // tree, so this fail-open path cannot silently swallow a broken registry.)
69
75
  function printDisciplineMode(task) {
70
76
  let mode = null;
71
77
  try {
@@ -75,9 +81,15 @@ function printDisciplineMode(task) {
75
81
  const modes = (JSON.parse(raw) || {}).modes || {};
76
82
  mode = modes[discipline];
77
83
  if (!mode || !mode.directive) return;
84
+ // The pointer a session actually follows. A pack is a file to READ (there is no
85
+ // slash command behind it any more); a skill is one to INVOKE. Naming the wrong
86
+ // verb sends the session hunting for a command that was deleted, so the two
87
+ // shapes print differently and an entry with neither prints only the label.
88
+ const opener = mode.pack ? `read ${mode.pack}` : (mode.skill ? `/${mode.skill}` : null);
78
89
  console.log('');
79
- console.log(`▶ ${mode.label || 'Working mode'} — /${mode.skill}`);
90
+ console.log(`▶ ${mode.label || 'Working mode'}${opener ? ` ${opener}` : ''}`);
80
91
  console.log(` ${mode.directive}`);
92
+ if (mode.pack) console.log(` Your pack: ${mode.pack} (the kernel is CLAUDE.md; this is the half that is only true for your craft)`);
81
93
  } catch (_) {
82
94
  // never let the mode hint break a successful claim
83
95
  return;