@bongos/core 1.19.638 → 1.19.640

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.
@@ -3,9 +3,9 @@
3
3
  "generator": "scripts/gds/copy-inventory.js",
4
4
  "goal": 1000074,
5
5
  "counts": {
6
- "strings": 1742,
7
- "unique_ids": 1506,
8
- "certain": 1742,
6
+ "strings": 1743,
7
+ "unique_ids": 1507,
8
+ "certain": 1743,
9
9
  "heuristic": 0,
10
10
  "duplicate_ids": 165
11
11
  },
@@ -13,7 +13,7 @@
13
13
  "builders-hall": {
14
14
  "at": "modules/hall-ui/public",
15
15
  "files": 80,
16
- "strings": 1269
16
+ "strings": 1270
17
17
  },
18
18
  "status-dashboard": {
19
19
  "at": "modules/status-ui/public",
@@ -946,7 +946,7 @@
946
946
  "occurrences": 2,
947
947
  "at": [
948
948
  "modules/hall-ui/public/hall-render.js:512",
949
- "modules/hall-ui/public/profile.js:70"
949
+ "modules/hall-ui/public/profile.js:94"
950
950
  ]
951
951
  },
952
952
  {
@@ -996,7 +996,7 @@
996
996
  "occurrences": 2,
997
997
  "at": [
998
998
  "modules/hall-ui/public/builders.js:480",
999
- "modules/hall-ui/public/profile.js:120"
999
+ "modules/hall-ui/public/profile.js:144"
1000
1000
  ]
1001
1001
  },
1002
1002
  {
@@ -1015,7 +1015,7 @@
1015
1015
  "text": "Nothing shipped yet.",
1016
1016
  "occurrences": 2,
1017
1017
  "at": [
1018
- "modules/hall-ui/public/profile.js:218",
1018
+ "modules/hall-ui/public/profile.js:242",
1019
1019
  "modules/hall-ui/public/work.js:1016"
1020
1020
  ]
1021
1021
  },
@@ -1086,7 +1086,7 @@
1086
1086
  "occurrences": 2,
1087
1087
  "at": [
1088
1088
  "modules/hall-ui/public/hall-render.js:526",
1089
- "modules/hall-ui/public/profile.js:64"
1089
+ "modules/hall-ui/public/profile.js:87"
1090
1090
  ]
1091
1091
  },
1092
1092
  {
@@ -1295,7 +1295,7 @@
1295
1295
  "text": "Sign in",
1296
1296
  "occurrences": 2,
1297
1297
  "at": [
1298
- "modules/hall-ui/public/profile.js:184",
1298
+ "modules/hall-ui/public/profile.js:208",
1299
1299
  "modules/hall-ui/public/settings.html:42"
1300
1300
  ]
1301
1301
  },
@@ -1456,7 +1456,7 @@
1456
1456
  "occurrences": 2,
1457
1457
  "at": [
1458
1458
  "modules/hall-ui/public/builders.js:487",
1459
- "modules/hall-ui/public/profile.js:127"
1459
+ "modules/hall-ui/public/profile.js:151"
1460
1460
  ]
1461
1461
  },
1462
1462
  {
@@ -1919,7 +1919,7 @@
1919
1919
  "surface": "builders-hall",
1920
1920
  "text": "+ {…} more project{…} not publicly listed.",
1921
1921
  "file": "modules/hall-ui/public/profile.js",
1922
- "line": 296,
1922
+ "line": 320,
1923
1923
  "origin": "js-markup",
1924
1924
  "confidence": "certain"
1925
1925
  },
@@ -2418,6 +2418,15 @@
2418
2418
  "origin": "js-text-assign",
2419
2419
  "confidence": "certain"
2420
2420
  },
2421
+ {
2422
+ "id": "0293418d5e8e",
2423
+ "surface": "builders-hall",
2424
+ "text": "Answerable for:",
2425
+ "file": "modules/hall-ui/public/profile.js",
2426
+ "line": 72,
2427
+ "origin": "js-markup",
2428
+ "confidence": "certain"
2429
+ },
2421
2430
  {
2422
2431
  "id": "52ed0e2e3470",
2423
2432
  "surface": "builders-hall",
@@ -3791,7 +3800,7 @@
3791
3800
  "surface": "builders-hall",
3792
3801
  "text": "Could not load the profile.",
3793
3802
  "file": "modules/hall-ui/public/profile.js",
3794
- "line": 766,
3803
+ "line": 790,
3795
3804
  "origin": "js-notice",
3796
3805
  "confidence": "certain"
3797
3806
  },
@@ -5780,7 +5789,7 @@
5780
5789
  "surface": "builders-hall",
5781
5790
  "text": "Karma — peer recognition and approvals, a separate counter from {…}.",
5782
5791
  "file": "modules/hall-ui/public/profile.js",
5783
- "line": 70,
5792
+ "line": 94,
5784
5793
  "origin": "js-markup",
5785
5794
  "confidence": "certain"
5786
5795
  },
@@ -6239,7 +6248,7 @@
6239
6248
  "surface": "builders-hall",
6240
6249
  "text": "Member since {…}",
6241
6250
  "file": "modules/hall-ui/public/profile.js",
6242
- "line": 70,
6251
+ "line": 94,
6243
6252
  "origin": "js-markup",
6244
6253
  "confidence": "certain"
6245
6254
  },
@@ -6248,7 +6257,7 @@
6248
6257
  "surface": "builders-hall",
6249
6258
  "text": "Merged into",
6250
6259
  "file": "modules/hall-ui/public/profile.js",
6251
- "line": 382,
6260
+ "line": 406,
6252
6261
  "origin": "js-markup",
6253
6262
  "confidence": "certain"
6254
6263
  },
@@ -6500,7 +6509,7 @@
6500
6509
  "surface": "builders-hall",
6501
6510
  "text": "No achievements earned yet.",
6502
6511
  "file": "modules/hall-ui/public/profile.js",
6503
- "line": 120,
6512
+ "line": 144,
6504
6513
  "origin": "js-markup",
6505
6514
  "confidence": "certain"
6506
6515
  },
@@ -6518,7 +6527,7 @@
6518
6527
  "surface": "builders-hall",
6519
6528
  "text": "No cross-project activity reported yet.",
6520
6529
  "file": "modules/hall-ui/public/profile.js",
6521
- "line": 299,
6530
+ "line": 323,
6522
6531
  "origin": "js-markup",
6523
6532
  "confidence": "certain"
6524
6533
  },
@@ -6896,7 +6905,7 @@
6896
6905
  "surface": "builders-hall",
6897
6906
  "text": "Nothing shipped yet.",
6898
6907
  "file": "modules/hall-ui/public/profile.js",
6899
- "line": 218,
6908
+ "line": 242,
6900
6909
  "origin": "js-markup",
6901
6910
  "confidence": "certain"
6902
6911
  },
@@ -7391,7 +7400,7 @@
7391
7400
  "surface": "builders-hall",
7392
7401
  "text": "Preferred work:",
7393
7402
  "file": "modules/hall-ui/public/profile.js",
7394
- "line": 64,
7403
+ "line": 87,
7395
7404
  "origin": "js-markup",
7396
7405
  "confidence": "certain"
7397
7406
  },
@@ -8642,7 +8651,7 @@
8642
8651
  "surface": "builders-hall",
8643
8652
  "text": "Sign in",
8644
8653
  "file": "modules/hall-ui/public/profile.js",
8645
- "line": 184,
8654
+ "line": 208,
8646
8655
  "origin": "js-markup",
8647
8656
  "confidence": "certain"
8648
8657
  },
@@ -8876,7 +8885,7 @@
8876
8885
  "surface": "builders-hall",
8877
8886
  "text": "Standing there",
8878
8887
  "file": "modules/hall-ui/public/profile.js",
8879
- "line": 290,
8888
+ "line": 314,
8880
8889
  "origin": "js-markup",
8881
8890
  "confidence": "certain"
8882
8891
  },
@@ -8894,7 +8903,7 @@
8894
8903
  "surface": "builders-hall",
8895
8904
  "text": "Still open",
8896
8905
  "file": "modules/hall-ui/public/profile.js",
8897
- "line": 387,
8906
+ "line": 411,
8898
8907
  "origin": "js-markup",
8899
8908
  "confidence": "certain"
8900
8909
  },
@@ -9137,7 +9146,7 @@
9137
9146
  "surface": "builders-hall",
9138
9147
  "text": "That project's own standing, as reported by that project.",
9139
9148
  "file": "modules/hall-ui/public/profile.js",
9140
- "line": 290,
9149
+ "line": 314,
9141
9150
  "origin": "js-markup",
9142
9151
  "confidence": "certain"
9143
9152
  },
@@ -9695,7 +9704,7 @@
9695
9704
  "surface": "builders-hall",
9696
9705
  "text": "This builder keeps their track record private.",
9697
9706
  "file": "modules/hall-ui/public/profile.js",
9698
- "line": 270,
9707
+ "line": 294,
9699
9708
  "origin": "js-markup",
9700
9709
  "confidence": "certain"
9701
9710
  },
@@ -9803,7 +9812,7 @@
9803
9812
  "surface": "builders-hall",
9804
9813
  "text": "This is you —",
9805
9814
  "file": "modules/hall-ui/public/profile.js",
9806
- "line": 266,
9815
+ "line": 290,
9807
9816
  "origin": "js-markup",
9808
9817
  "confidence": "certain"
9809
9818
  },
@@ -10460,7 +10469,7 @@
10460
10469
  "surface": "builders-hall",
10461
10470
  "text": "Won {…}",
10462
10471
  "file": "modules/hall-ui/public/profile.js",
10463
- "line": 127,
10472
+ "line": 151,
10464
10473
  "origin": "js-markup",
10465
10474
  "confidence": "certain"
10466
10475
  },
@@ -11576,7 +11585,7 @@
11576
11585
  "surface": "builders-hall",
11577
11586
  "text": "manage its visibility in Settings → Cross-project record",
11578
11587
  "file": "modules/hall-ui/public/profile.js",
11579
- "line": 266,
11588
+ "line": 290,
11580
11589
  "origin": "js-markup",
11581
11590
  "confidence": "certain"
11582
11591
  },
@@ -12179,7 +12188,7 @@
12179
12188
  "surface": "builders-hall",
12180
12189
  "text": "to see the full record.",
12181
12190
  "file": "modules/hall-ui/public/profile.js",
12182
- "line": 184,
12191
+ "line": 208,
12183
12192
  "origin": "js-markup",
12184
12193
  "confidence": "certain"
12185
12194
  },
@@ -12566,7 +12575,7 @@
12566
12575
  "surface": "builders-hall",
12567
12576
  "text": "{…} of {…} shipped",
12568
12577
  "file": "modules/hall-ui/public/profile.js",
12569
- "line": 488,
12578
+ "line": 512,
12570
12579
  "origin": "js-markup",
12571
12580
  "confidence": "certain"
12572
12581
  },
@@ -12800,7 +12809,7 @@
12800
12809
  "surface": "builders-hall",
12801
12810
  "text": "{…} — total payout from shipped work.",
12802
12811
  "file": "modules/hall-ui/public/profile.js",
12803
- "line": 70,
12812
+ "line": 94,
12804
12813
  "origin": "js-markup",
12805
12814
  "confidence": "certain"
12806
12815
  },
package/docs/file-map.md CHANGED
@@ -201,6 +201,8 @@
201
201
  │ ├── doc-comment-coverage.js ← ADR 0095 / task 1001654: the ADVISORY doc-comment nudge (fitness Check 28) — reports source files under src/·scripts/·modules/ that open with no module header. Never hard-fails: a doc-comment gate that blocks a ship buys filler prose, and making it blocking needs owner sign-off + its own ADR. CRLF-safe (unlike docs-entropy.js); an empty enumeration throws as a scan defect
202
202
  │ ├── copy-inventory.js ← R01 of goal 1000074 (the artist's loop): the COPY REGISTRY — every user-facing string across the hall / status / landing surfaces, each row naming the render path that shows it (html-text · html-attr · js-markup · js-notice · js-text-assign) + a stable id that survives a move. Writes docs/copy-registry.json + docs/copy-inventory.md; `--check` fails on drift. Precision over recall: a JS literal with no render path is not listed
203
203
  │ ├── copy-apply.js ← R03 of goal 1000074 (ADR 0233): lands a copy proposal as a REAL DIFF under a claim — the design half’s adapter.export() applied to text. Reads the fenced copy-proposal patch off a task (--task N; --dry-run, --patch-file), RE-DERIVES the string’s position by re-running copy-inventory’s own extractor over the working tree (the registry commits no offsets — they go stale, the id does not), re-injects the source’s own ${expr} into the proposal’s {…} holes, writes, regenerates the registry and verifies its own edit. Refuses BY NAME on target_gone / ambiguous_target / no_exact_span / placeholder_mismatch / path_outside_surface. The ONLY writer in the copy feature, and deliberately a command rather than a route
204
+ │ ├── gen-role-responsibilities.js ← writes each role pack's written-responsibility block from src/role-responsibilities.js (task 1003732, ADR 0275). Targets come from the role registry, not a hardcoded list, so a renamed pack or a fourth craft needs no edit here; the block takes the pack's own line ending (the packs are CRLF on Windows, LF in CI). `--check` is the CI gate, run by role-pack-guard.js — never hand-edit a block
205
+ │ ├── role-pack-guard.js ← the fitness check over the role packs (task 1002990, ADR 0274): every registry entry resolves to a real pack, every pack fits its char budget, three crafts carry one, and each pack's responsibility block is current. HARD-fails because claim.js reads the registry fail-open, so a broken pack path is silent at runtime
204
206
  │ ├── gen-diagrams.js ← generates the 5 onboarding diagrams (`.mmd`/`.svg`/`.png` + `assertions.json`) from templates in this file — never hand-edit a `.mmd`/assertions.json; runs on deploy
205
207
  │ ├── gen-api-docs.js ← ADR 0109: generates `docs/api/openapi.json` + `docs/api-reference.md` from the live route files via `route-rank-check.js` introspection, so the API reference cannot drift from what the server actually mounts
206
208
  │ ├── architect-audit.js ← MAS Phase 5 (ADR 0024): the Architect's bounded first-principles `--scope`/`--paths` audit CLI → `docs/audits/`
@@ -213,6 +215,7 @@
213
215
  │ ├── branding.js ← the branding contract resolver (env → config/branding.json → branding.neutral.json); single source for instance-identity strings + the configurable track set + db.database (ADR 0062 §3)
214
216
  │ ├── modules.js ← back-compat facade over src/module-loader/loader.js; stable exports: isModuleEnabled/enabledModules/enabledDisciplines/clientModules/resolveModules; vanilla=all off (ADR 0062 §4; ADR 0083; docs/modules-contract.md)
215
217
  │ ├── module-api.js ← THE PUBLISHED, SEMVER'D DOORWAY (ADR 0083): the ONLY core file a module may `require`. Re-exports kernel capabilities (auth gates, pool, db helpers, branding, seams, logger, CORE_VERSION). MINOR bump = additive export; MAJOR = breaking change; `bongos upgrade` pre-checks. The release ledger is NOT here — it moved to docs/module-api-changelog.md (ADR 0203); only the `const CORE_VERSION` literal lives in this file.
218
+ │ ├── role-responsibilities.js ← the ONE source of each craft's written responsibility — the owner's verbatim sentences (fixed 2026-09-08, criterion `wa6-written-responsibilities`; task 1003732, ADR 0275). Three consumers and no second copy: the hall profile via clientModules() → window.__MODULES__, the grader via the module-api doorway, and the role packs via a GENERATED block (scripts/gds/gen-role-responsibilities.js, freshness gated by role-pack-guard.js). A KERNEL_FILES entry (modules.js reads it) and exempt from the no-module-keys scan, because the ideator's statement contains the English word "ideas". Do not paraphrase the statements
216
219
  │ ├── module-seams.js ← kernel seam registry (ADR 0083 / design 04§1): PORTS (registerProvider/resolve/resolveOptional — single-provider required capabilities) + EVENTS (emit/on — optional reactions, isolated errors). Modules cooperate through here, never by importing each other. Re-exported through module-api.js.
217
220
  │ ├── module-loader/ ← the loader that makes `modules/<key>/` discoverable (BV1.R38–R41)
218
221
  │ │ ├── loader.js ← discover modules/*/module.json → validate manifest → coreVersion-check → enabled-filter → mount routes behind kernel auth → start pollers. <redacted> on empty modules/. Used by modules.js + routes.js.
@@ -1725,5 +1725,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
1725
1725
  landed since 1.19.636 with no explicit bump. run 34436870653. (task 1002620)
1726
1726
  1.19.638 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1727
1727
  landed since 1.19.637 with no explicit bump. run 34438897721. (task 1002620)
1728
+ 1.19.639 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1729
+ landed since 1.19.638 with no explicit bump. run 34502609272. (task 1002620)
1730
+ 1.19.640 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1731
+ landed since 1.19.639 with no explicit bump. run 34506041899. (task 1002620)
1728
1732
  ---------------------------------------------------------------------------
1729
1733
  ```
@@ -73,6 +73,10 @@ When the artist reacts — "too saturated", "that reads as modern", "weather the
73
73
 
74
74
  ---
75
75
 
76
- ## Responsibilities
76
+ <!-- BEGIN GENERATED ROLE RESPONSIBILITY (scripts/gds/gen-role-responsibilities.js — do not hand-edit) -->
77
+ ## What this craft is answerable for
77
78
 
78
- The artist's written responsibility the text this pack teaches to and the grader judges by — lives on the role's responsibility statement rather than here, so there is one source shown on the profile, injected into the pack, and referenced by grading. Until that statement lands, hold to its subject: no slop in the appearance and text of the project.
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 -->
@@ -105,3 +105,13 @@ Subagent spawns via the `Agent` tool MUST set the `model` parameter explicitly
105
105
  | Everything else — research, audits, code review, planning, design decisions, security review, writing code that ships, parallel build sessions | top tier |
106
106
 
107
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 -->
@@ -123,3 +123,13 @@ There is no quota in either mode. One deeply-developed idea is a great session;
123
123
  ## Trust boundary — filing is open, triage is not
124
124
 
125
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 -->
@@ -174,10 +174,13 @@ function boardVotesNeed(ctx) {
174
174
  if (n <= 0) return null;
175
175
  const firstId = pending && pending.first_item_id;
176
176
  // Deep-link the named sitting when we know it (?item=<id> — the Board Room
177
- // panel scrolls to and highlights it; the hash stays the tab), else the room.
177
+ // page scrolls to and highlights it), else the room itself. The Board Room is
178
+ // its own page since ADR 0266; the retired hash form it replaced is a fragment
179
+ // the server never sees, so it survives only as government.js's client-side
180
+ // redirect and nothing here emits it any more.
178
181
  const href = firstId
179
- ? `/government?item=${encodeURIComponent(firstId)}#board-room`
180
- : '/government#board-room';
182
+ ? `/board-room?item=${encodeURIComponent(firstId)}`
183
+ : '/board-room';
181
184
  const subject = n === 1 ? 'An idea is' : `${n} ideas are`;
182
185
  return {
183
186
  id: 'board_votes',
@@ -151,11 +151,18 @@ function subjectLabel(subjectType) {
151
151
  return subjectType === 'constitutional_amendment' ? 'A constitutional amendment' : 'A Full Idea';
152
152
  }
153
153
 
154
- // Straight to THAT item: ?item=<id> — the Board Room panel reads it and scrolls
155
- // to / highlights the named sitting (the hash stays the tab).
154
+ // Straight to THAT item: ?item=<id> — the Board Room page reads it and scrolls
155
+ // to / highlights the named sitting.
156
+ //
157
+ // POINTS AT `/board-room`, the room's own page since ADR 0266. This is the link
158
+ // a member is most likely to click (ADR 0175 §8 makes the mention the "vote
159
+ // within X" notice), and it is also the one that outlives the code: an
160
+ // announcement already in channel history keeps whatever URL it was posted with
161
+ // forever. That is why government.js's `#board-room` redirect stays a release
162
+ // regardless — it serves the old messages, not this writer.
156
163
  function itemLink(itemId) {
157
164
  const origin = ((api.branding && api.branding().domains) || {}).buildersOrigin || '';
158
- return `${origin ? origin.replace(/\/$/, '') : ''}/government?item=${encodeURIComponent(itemId)}#board-room`;
165
+ return `${origin ? origin.replace(/\/$/, '') : ''}/board-room?item=${encodeURIComponent(itemId)}`;
159
166
  }
160
167
 
161
168
  // ── the close (BV1.R22 of goal 1000069) ──────────────────────────────────────
@@ -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 = `
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.638",
3
+ "version": "1.19.640",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.638",
9
+ "version": "1.19.640",
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.638",
3
+ "version": "1.19.640",
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",
@@ -188,6 +188,8 @@ function checkGeneratedArtifactsFresh() {
188
188
  } catch {
189
189
  violations.push('docs/api/openapi.json + docs/api-reference.md + docs/routes-permissions.md are STALE (or the spec is not valid OpenAPI 3.1) — run `node scripts/gds/gen-api-docs.js` and commit (task 1918).');
190
190
  }
191
+ // NB the role packs' responsibility blocks are generated too, but their freshness
192
+ // is asserted by role-pack-guard.js — one check owns "the packs are correct".
191
193
  return { name: 'generated artifacts fresh', ok: violations.length === 0, hardFail: violations.length > 0, violations, warnings: [], note: 'Tracked generated content matches source: nested CLAUDE.md symbol blocks (code) + the CLAUDE.md §13 snippet (sessions) via --check-block, plus docs/file-map.md skills/scheduled-tasks sections and docs/api/openapi.json + api-reference.md (API). The gitignored docs/repo-map.md + docs/session-log-index.md are deploy-regenerated (ADR 0110), not gated here.' };
192
194
  }
193
195
 
@@ -455,6 +457,7 @@ const KERNEL_FILES = [
455
457
  'src/module-api.js', // the published doorway
456
458
  'src/modules.js', // the registry/resolver facade
457
459
  'src/module-seams.js', // the seam registry (ports/events/contributions)
460
+ 'src/role-responsibilities.js', // the owner's written role statements (task 1003732) — modules.js reads it; imports nothing
458
461
  'src/module-loader/loader.js', // the disk loader (discover → validate → mount)
459
462
  'src/module-loader/manifest-schema.js', // the manifest validator
460
463
  'src/module-loader/semver.js', // coreVersion compatibility
@@ -562,6 +565,7 @@ const KERNEL_NAMES_MODULES_OK = new Set([
562
565
  'src/bongos/auth-discord.js', // the Discord account-link flow itself
563
566
  'src/bongos/permission-path-check.js', // names module path subtrees to PROTECT them
564
567
  'src/bongos/route-rank-check.js', // names module route dirs to rank-gate them
568
+ 'src/role-responsibilities.js', // the ideator's VERBATIM statement reads "Make good ideas" — the English word, colliding with the `ideas` key. Owner text; unparaphrasable.
565
569
  ]);
566
570
 
567
571
  // The discovered module keys = the directory names under modules/ (a manifest's