@bongos/core 1.17.2 → 1.17.3

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 (77) hide show
  1. package/.bongos-core.json +292 -32
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +2 -0
  4. package/clients/bongos-client/index.cjs +2 -0
  5. package/clients/bongos-client/index.d.ts +4 -2
  6. package/clients/bongos-client/index.mjs +2 -0
  7. package/docs/api/openapi.json +65 -26
  8. package/docs/api-reference.md +3 -2
  9. package/modules/hall-ui/public/builders.js +96 -646
  10. package/modules/hall-ui/public/goal-inbox.js +67 -26
  11. package/modules/hall-ui/public/goals-page.js +4 -1
  12. package/modules/hall-ui/public/goals.html +8 -0
  13. package/modules/hall-ui/public/hall-kit.js +474 -0
  14. package/modules/hall-ui/public/hall-widgets.js +11 -15
  15. package/modules/hall-ui/public/instances-panel.js +24 -3
  16. package/modules/hall-ui/public/new-project-wizard.js +6 -5
  17. package/modules/hall-ui/public/style.css +125 -0
  18. package/modules/hall-ui/public/work.css +194 -0
  19. package/modules/hall-ui/public/work.html +46 -374
  20. package/modules/hall-ui/public/work.js +137 -102
  21. package/modules/lifecycle/criterion-suggest.js +80 -0
  22. package/modules/lifecycle/db.js +42 -5
  23. package/modules/lifecycle/routes/goals.js +26 -0
  24. package/modules/lifecycle/routes/tasks.js +21 -0
  25. package/package-lock.json +2 -2
  26. package/package.json +1 -1
  27. package/scripts/hall-preview/README.md +103 -0
  28. package/scripts/hall-preview/fixtures/access-requests.json +1 -0
  29. package/scripts/hall-preview/fixtures/achievements.json +76 -0
  30. package/scripts/hall-preview/fixtures/analytics__builder.json +251 -0
  31. package/scripts/hall-preview/fixtures/audit-log.json +1 -0
  32. package/scripts/hall-preview/fixtures/boxes__cost-ledger.json +1 -0
  33. package/scripts/hall-preview/fixtures/builders__active-claims.json +1 -0
  34. package/scripts/hall-preview/fixtures/builders__directory.json +81 -0
  35. package/scripts/hall-preview/fixtures/builders__roster.json +1 -0
  36. package/scripts/hall-preview/fixtures/goals.json +502 -0
  37. package/scripts/hall-preview/fixtures/goals__25.json +96 -0
  38. package/scripts/hall-preview/fixtures/goals__26.json +67 -0
  39. package/scripts/hall-preview/fixtures/goals__3.json +103 -0
  40. package/scripts/hall-preview/fixtures/goals__35.json +49 -0
  41. package/scripts/hall-preview/fixtures/goals__conflicts.json +154 -0
  42. package/scripts/hall-preview/fixtures/goals__detail.json +96 -0
  43. package/scripts/hall-preview/fixtures/goals__inbox.json +5 -0
  44. package/scripts/hall-preview/fixtures/goals__requests.json +3 -0
  45. package/scripts/hall-preview/fixtures/grades__by-builder.json +1 -0
  46. package/scripts/hall-preview/fixtures/inbox.json +330 -0
  47. package/scripts/hall-preview/fixtures/instance.json +124 -0
  48. package/scripts/hall-preview/fixtures/leaderboard.json +184 -0
  49. package/scripts/hall-preview/fixtures/me.json +476 -0
  50. package/scripts/hall-preview/fixtures/me__recent-ships.json +304 -0
  51. package/scripts/hall-preview/fixtures/override-requests.json +1 -0
  52. package/scripts/hall-preview/fixtures/provisioning__fleet.json +1 -0
  53. package/scripts/hall-preview/fixtures/provisioning__fleet__cost-ledger.json +1 -0
  54. package/scripts/hall-preview/fixtures/provisioning__instances.json +1 -0
  55. package/scripts/hall-preview/fixtures/public__analytics__ecosystem.json +516 -0
  56. package/scripts/hall-preview/fixtures/public__bounty-table.json +37 -0
  57. package/scripts/hall-preview/fixtures/public__cost-summary.json +742 -0
  58. package/scripts/hall-preview/fixtures/public__estimation-drift.json +41 -0
  59. package/scripts/hall-preview/fixtures/public__grades.json +50 -0
  60. package/scripts/hall-preview/fixtures/public__progress.json +124 -0
  61. package/scripts/hall-preview/fixtures/public__recent-shipped.json +426 -0
  62. package/scripts/hall-preview/fixtures/public__repo-health.json +160 -0
  63. package/scripts/hall-preview/fixtures/public__repo-info.json +5 -0
  64. package/scripts/hall-preview/fixtures/security__docs.json +1 -0
  65. package/scripts/hall-preview/fixtures/security__reports.json +1 -0
  66. package/scripts/hall-preview/fixtures/sessions__search.json +1 -0
  67. package/scripts/hall-preview/fixtures/tasks.json +2420 -0
  68. package/scripts/hall-preview/fixtures/tasks__claimable.json +2555 -0
  69. package/scripts/hall-preview/fixtures/tasks__detail.json +111 -0
  70. package/scripts/hall-preview/fixtures/tasks__peer-votes__feed.json +330 -0
  71. package/scripts/hall-preview/fixtures/versions.json +89 -0
  72. package/scripts/hall-preview/refresh-fixtures.js +77 -0
  73. package/scripts/hall-preview/server.js +178 -0
  74. package/scripts/migrate.sh +29 -4
  75. package/src/bongos/optimizer.js +37 -2
  76. package/tests/criterion_suggest.mjs +106 -0
  77. package/tests/migrate_root_resolution.mjs +97 -0
@@ -0,0 +1,184 @@
1
+ {
2
+ "leaderboard": [
3
+ {
4
+ "id": "1",
5
+ "github_login": "lars589",
6
+ "display_name": "lars589",
7
+ "avatar_url": "https://avatars.githubusercontent.com/u/283020391?v=4",
8
+ "total_credits": 38644,
9
+ "karma": 10,
10
+ "rank": "archon",
11
+ "achievements": [
12
+ "first-ship",
13
+ "first-claim",
14
+ "first-parallel-claim",
15
+ "streak-3",
16
+ "streak-7"
17
+ ],
18
+ "tokens_used": "38866453596"
19
+ },
20
+ {
21
+ "id": "95",
22
+ "github_login": "jaxri",
23
+ "display_name": "Jackson Rini",
24
+ "avatar_url": "https://avatars.githubusercontent.com/u/64553469?v=4",
25
+ "total_credits": 4630,
26
+ "karma": 1,
27
+ "rank": "metic",
28
+ "achievements": [
29
+ "first-ship",
30
+ "first-claim",
31
+ "first-parallel-claim",
32
+ "streak-3",
33
+ "gds-shipper"
34
+ ],
35
+ "tokens_used": "2485218160"
36
+ },
37
+ {
38
+ "id": "94",
39
+ "github_login": "scootermack",
40
+ "display_name": "scootermack",
41
+ "avatar_url": "https://avatars.githubusercontent.com/u/295990394?v=4",
42
+ "total_credits": 2422,
43
+ "karma": 0,
44
+ "rank": "metic",
45
+ "achievements": [
46
+ "first-ship",
47
+ "first-claim",
48
+ "first-parallel-claim",
49
+ "streak-3",
50
+ "art-pipeline-shipper"
51
+ ],
52
+ "tokens_used": "966367590"
53
+ },
54
+ {
55
+ "id": "25",
56
+ "github_login": "IAMMASTERQUA",
57
+ "display_name": "IAMMASTERQUA",
58
+ "avatar_url": "https://avatars.githubusercontent.com/u/290184380?v=4",
59
+ "total_credits": 286,
60
+ "karma": 37,
61
+ "rank": "metic",
62
+ "achievements": [
63
+ "first-ship",
64
+ "first-claim",
65
+ "first-parallel-claim",
66
+ "art-pipeline-shipper",
67
+ "gds-shipper"
68
+ ],
69
+ "tokens_used": "322340908"
70
+ },
71
+ {
72
+ "id": "70",
73
+ "github_login": "kingaonline",
74
+ "display_name": "kingaonline",
75
+ "avatar_url": "https://avatars.githubusercontent.com/u/293641659?v=4",
76
+ "total_credits": 160,
77
+ "karma": 0,
78
+ "rank": "thetes",
79
+ "achievements": [
80
+ "first-ship",
81
+ "first-claim",
82
+ "art-pipeline-shipper",
83
+ "breaking-the-100c-bar"
84
+ ],
85
+ "tokens_used": "66829858"
86
+ },
87
+ {
88
+ "id": "3",
89
+ "github_login": "LarsCode",
90
+ "display_name": "LarsCode",
91
+ "avatar_url": "https://avatars.githubusercontent.com/u/35337514?v=4",
92
+ "total_credits": 71,
93
+ "karma": 0,
94
+ "rank": "xenos",
95
+ "achievements": [
96
+ "first-ship",
97
+ "first-claim",
98
+ "art-pipeline-shipper"
99
+ ],
100
+ "tokens_used": "25527381"
101
+ },
102
+ {
103
+ "id": "24",
104
+ "github_login": "bfg-system",
105
+ "display_name": "The BFG (system)",
106
+ "avatar_url": null,
107
+ "total_credits": 0,
108
+ "karma": 0,
109
+ "rank": "xenos",
110
+ "achievements": [],
111
+ "tokens_used": "0"
112
+ },
113
+ {
114
+ "id": "27",
115
+ "github_login": "willHermesLines",
116
+ "display_name": "willHermesLines",
117
+ "avatar_url": "https://avatars.githubusercontent.com/u/267458743?v=4",
118
+ "total_credits": 0,
119
+ "karma": 0,
120
+ "rank": "xenos",
121
+ "achievements": [],
122
+ "tokens_used": "0"
123
+ },
124
+ {
125
+ "id": "28",
126
+ "github_login": "discord-bot-system",
127
+ "display_name": "Discord Bot (system)",
128
+ "avatar_url": null,
129
+ "total_credits": 0,
130
+ "karma": 0,
131
+ "rank": "xenos",
132
+ "achievements": [],
133
+ "tokens_used": "0"
134
+ },
135
+ {
136
+ "id": "50",
137
+ "github_login": "Svensson-CMD",
138
+ "display_name": "Svensson-CMD",
139
+ "avatar_url": "https://avatars.githubusercontent.com/u/290959655?v=4",
140
+ "total_credits": 0,
141
+ "karma": 0,
142
+ "rank": "xenos",
143
+ "achievements": [],
144
+ "tokens_used": "0"
145
+ },
146
+ {
147
+ "id": "51",
148
+ "github_login": "MrTenkpro",
149
+ "display_name": "MrTenkpro",
150
+ "avatar_url": "https://avatars.githubusercontent.com/u/291558470?v=4",
151
+ "total_credits": 0,
152
+ "karma": 0,
153
+ "rank": "xenos",
154
+ "achievements": [],
155
+ "tokens_used": "0"
156
+ },
157
+ {
158
+ "id": "57",
159
+ "github_login": "largekristensen-svg",
160
+ "display_name": "largekristensen-svg",
161
+ "avatar_url": "https://avatars.githubusercontent.com/u/292408002?v=4",
162
+ "total_credits": 0,
163
+ "karma": 0,
164
+ "rank": "xenos",
165
+ "achievements": [],
166
+ "tokens_used": "0"
167
+ },
168
+ {
169
+ "id": "71",
170
+ "github_login": "erikwils",
171
+ "display_name": "erikwils",
172
+ "avatar_url": "https://avatars.githubusercontent.com/u/51457175?v=4",
173
+ "total_credits": 0,
174
+ "karma": 0,
175
+ "rank": "xenos",
176
+ "achievements": [],
177
+ "tokens_used": "0"
178
+ }
179
+ ],
180
+ "page": {
181
+ "limit": 100,
182
+ "offset": 0
183
+ }
184
+ }
@@ -0,0 +1,476 @@
1
+ {
2
+ "builder": {
3
+ "id": "95",
4
+ "github_id": "64553469",
5
+ "github_login": "jaxri",
6
+ "display_name": "Jackson Rini",
7
+ "avatar_url": "https://avatars.githubusercontent.com/u/64553469?v=4",
8
+ "total_credits": 4630,
9
+ "karma": 1,
10
+ "created_at": "2026-06-22T22:49:07.833Z",
11
+ "rank": "metic",
12
+ "status": "active",
13
+ "deactivated_at": null,
14
+ "reactivated_at": null,
15
+ "deactivated_reason": null,
16
+ "preferred_disciplines": [
17
+ "engineer"
18
+ ],
19
+ "system_role": null,
20
+ "anthropic_email": null,
21
+ "anthropic_user_id": null,
22
+ "monthly_budget_usd": null,
23
+ "box_blocked": false,
24
+ "box_blocked_reason": null,
25
+ "box_blocked_at": null,
26
+ "box_blocked_by": null
27
+ },
28
+ "active_claims": [
29
+ {
30
+ "claim_id": "1845",
31
+ "task_id": "2167",
32
+ "worktree_name": "frontend-redesign-ux-746bdd",
33
+ "claimed_at": "2026-07-10T18:29:41.871Z",
34
+ "head_sha": "7119fa2124f4570fc9502b2f12411cc054a7e4fc",
35
+ "reserved_migration_number": null,
36
+ "release_requested_by": null,
37
+ "release_requested_at": null,
38
+ "release_requested_note": null,
39
+ "title": "Check in the hall preview harness (fixture server + screenshot runbook)",
40
+ "touches": [
41
+ "scripts/hall-preview/server.js",
42
+ "scripts/hall-preview/README.md"
43
+ ],
44
+ "priority": 2,
45
+ "credits_reward": 50,
46
+ "version_id": "BONGOS-V1",
47
+ "module_key": null,
48
+ "streak_preview": {
49
+ "current_streak": 1,
50
+ "projected_streak": 1,
51
+ "qualifies": true,
52
+ "reason": "today-already-counted"
53
+ }
54
+ }
55
+ ],
56
+ "active_claim": {
57
+ "claim_id": "1845",
58
+ "task_id": "2167",
59
+ "worktree_name": "frontend-redesign-ux-746bdd",
60
+ "claimed_at": "2026-07-10T18:29:41.871Z",
61
+ "head_sha": "7119fa2124f4570fc9502b2f12411cc054a7e4fc",
62
+ "reserved_migration_number": null,
63
+ "release_requested_by": null,
64
+ "release_requested_at": null,
65
+ "release_requested_note": null,
66
+ "title": "Check in the hall preview harness (fixture server + screenshot runbook)",
67
+ "touches": [
68
+ "scripts/hall-preview/server.js",
69
+ "scripts/hall-preview/README.md"
70
+ ],
71
+ "priority": 2,
72
+ "credits_reward": 50,
73
+ "version_id": "BONGOS-V1",
74
+ "module_key": null,
75
+ "streak_preview": {
76
+ "current_streak": 1,
77
+ "projected_streak": 1,
78
+ "qualifies": true,
79
+ "reason": "today-already-counted"
80
+ }
81
+ },
82
+ "est_vs_actual": {
83
+ "median": 0.08,
84
+ "sample_size": 10
85
+ },
86
+ "unlocked": [
87
+ {
88
+ "builder_id": "95",
89
+ "achievement_id": "first-ship",
90
+ "unlocked_at": "2026-06-30T00:26:01.980Z",
91
+ "unlocked_by_task_id": null,
92
+ "name": "First Ship",
93
+ "description": "Ship your first task.",
94
+ "icon": "📦",
95
+ "credit_bonus": 1,
96
+ "sort_order": 10
97
+ },
98
+ {
99
+ "builder_id": "95",
100
+ "achievement_id": "first-claim",
101
+ "unlocked_at": "2026-06-22T23:04:49.435Z",
102
+ "unlocked_by_task_id": null,
103
+ "name": "First Claim",
104
+ "description": "Claim your first task.",
105
+ "icon": "🪙",
106
+ "credit_bonus": 1,
107
+ "sort_order": 20
108
+ },
109
+ {
110
+ "builder_id": "95",
111
+ "achievement_id": "first-parallel-claim",
112
+ "unlocked_at": "2026-06-30T00:26:01.980Z",
113
+ "unlocked_by_task_id": null,
114
+ "name": "First Parallel Claim",
115
+ "description": "Hold two simultaneous claims; ship both successfully.",
116
+ "icon": "⚓",
117
+ "credit_bonus": 2,
118
+ "sort_order": 30
119
+ },
120
+ {
121
+ "builder_id": "95",
122
+ "achievement_id": "streak-3",
123
+ "unlocked_at": "2026-06-30T00:51:29.738Z",
124
+ "unlocked_by_task_id": "1680",
125
+ "name": "Streak: 3 Nights",
126
+ "description": "Ship a task in 3 consecutive local-time nights (>=15min; cleanup/refactor now counts).",
127
+ "icon": "🔥",
128
+ "credit_bonus": 2,
129
+ "sort_order": 40
130
+ },
131
+ {
132
+ "builder_id": "95",
133
+ "achievement_id": "gds-shipper",
134
+ "unlocked_at": "2026-06-30T00:26:01.980Z",
135
+ "unlocked_by_task_id": null,
136
+ "name": "GDS Shipper",
137
+ "description": "Ship a task whose touches[] include src/gds/ or scripts/gds/.",
138
+ "icon": "⚙️",
139
+ "credit_bonus": 2,
140
+ "sort_order": 70
141
+ },
142
+ {
143
+ "builder_id": "95",
144
+ "achievement_id": "breaking-the-100c-bar",
145
+ "unlocked_at": "2026-06-30T00:26:01.980Z",
146
+ "unlocked_by_task_id": null,
147
+ "name": "Breaking the 100c Bar",
148
+ "description": "Cross 100 total credits.",
149
+ "icon": "💯",
150
+ "credit_bonus": 5,
151
+ "sort_order": 80
152
+ }
153
+ ],
154
+ "locked_with_progress": [
155
+ {
156
+ "achievement_id": "streak-7",
157
+ "name": "Streak: 7 Nights",
158
+ "description": "Ship a task in 7 consecutive local-time nights (>=15min; cleanup/refactor now counts).",
159
+ "icon": "🌋",
160
+ "progress_text": "track 7 consecutive ship-days"
161
+ },
162
+ {
163
+ "achievement_id": "art-pipeline-shipper",
164
+ "name": "Art Pipeline Shipper",
165
+ "description": "Ship a task whose touches[] include the art/ pipeline.",
166
+ "icon": "🎨",
167
+ "progress_text": "needs one shipped task touching art/"
168
+ },
169
+ {
170
+ "achievement_id": "subtractor",
171
+ "name": "Subtractor",
172
+ "description": "Earn the net-negative ship bonus on 3 ships — across your work you have deleted more than you have added.",
173
+ "icon": "🪓",
174
+ "progress_text": "keep building"
175
+ }
176
+ ],
177
+ "streak": {
178
+ "current": 1,
179
+ "longest": 5,
180
+ "last_ship_day": "2026-07-10",
181
+ "started_on": "2026-07-10",
182
+ "timezone": "America/New_York",
183
+ "today": "2026-07-10"
184
+ },
185
+ "grades": {
186
+ "recent": [],
187
+ "rolling": {
188
+ "n": 0,
189
+ "avg_score": "0.0",
190
+ "n_passed": 0
191
+ }
192
+ },
193
+ "karma": {
194
+ "recent": [
195
+ {
196
+ "id": "11",
197
+ "delta": 1,
198
+ "reason": "peer_vote_weekly",
199
+ "recorded_at": "2026-07-01T09:26:29.519Z",
200
+ "granted_by": null,
201
+ "granted_by_login": null,
202
+ "granted_by_display_name": null
203
+ }
204
+ ],
205
+ "delta_30d": 1
206
+ },
207
+ "onboarding": {
208
+ "current_stage": "graduated",
209
+ "completed_stages": [
210
+ "auth_complete",
211
+ "pick_disciplines",
212
+ "first_start",
213
+ "first_claim",
214
+ "ship_three"
215
+ ],
216
+ "started_at": "2026-06-22T22:49:07.839Z",
217
+ "completed_at": "2026-06-23T18:52:07.021Z",
218
+ "progress": {
219
+ "cleared": 5,
220
+ "total": 5
221
+ },
222
+ "stages": [
223
+ {
224
+ "id": "box_connect",
225
+ "source": "box",
226
+ "label": "Connect to thy dev box",
227
+ "hint": "Follow the steps in the welcome scroll above to get Claude running on thy dev box — this ticks itself the moment thou art connected.",
228
+ "detail": "",
229
+ "cleared": true,
230
+ "is_current": false
231
+ },
232
+ {
233
+ "id": "join_discord",
234
+ "source": "discord",
235
+ "label": "Join the Discord server",
236
+ "hint": "Connect Discord — thou art auto-joined to the city's server and given thy rank.",
237
+ "detail": "",
238
+ "cleared": true,
239
+ "is_current": false
240
+ },
241
+ {
242
+ "id": "pick_disciplines",
243
+ "source": "stage",
244
+ "label": "Choose thy craft — engineer, artist, or ideator",
245
+ "hint": "Pick the work that calls thee — engineer, artist, ideator, or any mix.",
246
+ "detail": "",
247
+ "cleared": true,
248
+ "is_current": false
249
+ },
250
+ {
251
+ "id": "cli_setup",
252
+ "source": "cli",
253
+ "label": "Run /builder-setup on thy dev box",
254
+ "hint": "Sign the GDS in on thy dev box with /builder-setup — this ticks itself once thou art signed in.",
255
+ "detail": "",
256
+ "cleared": true,
257
+ "is_current": false
258
+ },
259
+ {
260
+ "id": "ship_three",
261
+ "source": "stage",
262
+ "label": "Ship three works — and rise to Thetes",
263
+ "hint": "Carry three tasks through with /builder-ship — the third makes thee a Thetes.",
264
+ "detail": "3 of 3 works shipped",
265
+ "cleared": true,
266
+ "is_current": false
267
+ }
268
+ ],
269
+ "graduated": true
270
+ },
271
+ "discord": {
272
+ "linked": true,
273
+ "configured": true
274
+ },
275
+ "grader_bypass": true,
276
+ "cost": {
277
+ "spend_mtd_usd": 711.03,
278
+ "budget_mtd_usd": null,
279
+ "pct_used": 0,
280
+ "level": "ok"
281
+ },
282
+ "wandering": {
283
+ "rank": "metic",
284
+ "levels": [
285
+ {
286
+ "n": 0,
287
+ "key": "locked",
288
+ "label": "Locked",
289
+ "blurb": "Strictly the claimed task. Off-task notes are filed silently, never raised.",
290
+ "allowed": true
291
+ },
292
+ {
293
+ "n": 1,
294
+ "key": "focused",
295
+ "label": "Focused",
296
+ "blurb": "On task, full in-task initiative; at most one captured follow-up at the end.",
297
+ "allowed": true
298
+ },
299
+ {
300
+ "n": 2,
301
+ "key": "balanced",
302
+ "label": "Balanced",
303
+ "blurb": "May surface a high-value tangent mid-task as \"capture or pursue?\" — your call.",
304
+ "allowed": true
305
+ },
306
+ {
307
+ "n": 3,
308
+ "key": "exploratory",
309
+ "label": "Exploratory",
310
+ "blurb": "A thinking partner — actively surfaces adjacent work and investigations.",
311
+ "allowed": true
312
+ }
313
+ ],
314
+ "default_level": 2,
315
+ "default_key": "balanced",
316
+ "max_level": 3,
317
+ "max_key": "exploratory",
318
+ "override_level": null,
319
+ "effective_level": 2,
320
+ "effective_key": "balanced",
321
+ "effective_label": "Balanced",
322
+ "contract": "Wandering: Balanced. Stay anchored to your claim, but if you hit a genuinely high-value or blocking tangent you may surface it briefly and ask \"capture or pursue?\" — leave the call to the user. Note anomalies as observations; don't rabbit-hole.",
323
+ "inject": false
324
+ },
325
+ "interaction": {
326
+ "fields": [
327
+ {
328
+ "field": "technical_level",
329
+ "label": "Technical level",
330
+ "blurb": "How much software-engineering vocabulary to assume.",
331
+ "default_value": "non_technical",
332
+ "values": [
333
+ {
334
+ "value": "non_technical",
335
+ "label": "Non-technical (default)"
336
+ },
337
+ {
338
+ "value": "mixed",
339
+ "label": "Some technical background"
340
+ },
341
+ {
342
+ "value": "engineer",
343
+ "label": "Engineer"
344
+ }
345
+ ]
346
+ },
347
+ {
348
+ "field": "toolchain_familiarity",
349
+ "label": "Local-toolchain familiarity",
350
+ "blurb": "Whether local dev tools (package managers, ports, env vars) need step-by-step help.",
351
+ "default_value": "new",
352
+ "values": [
353
+ {
354
+ "value": "new",
355
+ "label": "New to local tooling (default)"
356
+ },
357
+ {
358
+ "value": "comfortable",
359
+ "label": "Comfortable with local tooling"
360
+ }
361
+ ]
362
+ },
363
+ {
364
+ "field": "verbosity",
365
+ "label": "Reply length",
366
+ "blurb": "How much prose to return by default.",
367
+ "default_value": "concise",
368
+ "values": [
369
+ {
370
+ "value": "concise",
371
+ "label": "Concise (default)"
372
+ },
373
+ {
374
+ "value": "detailed",
375
+ "label": "Detailed"
376
+ }
377
+ ]
378
+ }
379
+ ],
380
+ "stored": {},
381
+ "effective": {
382
+ "technical_level": "non_technical",
383
+ "toolchain_familiarity": "new",
384
+ "verbosity": "concise"
385
+ },
386
+ "contract": "",
387
+ "inject": false
388
+ },
389
+ "model_allocation": {
390
+ "slots": [
391
+ {
392
+ "slot": "main",
393
+ "label": "Main interactive session",
394
+ "blurb": "The session the builder sits in front of.",
395
+ "code_default": "opus",
396
+ "tiers": [
397
+ "haiku",
398
+ "sonnet",
399
+ "opus",
400
+ "fable"
401
+ ]
402
+ },
403
+ {
404
+ "slot": "subagentDefault",
405
+ "label": "Subagents (default)",
406
+ "blurb": "Research, audits, code review, design, code that ships, parallel build sessions.",
407
+ "code_default": "opus",
408
+ "tiers": [
409
+ "haiku",
410
+ "sonnet",
411
+ "opus",
412
+ "fable"
413
+ ]
414
+ },
415
+ {
416
+ "slot": "subagentRoutine",
417
+ "label": "Subagents (routine plumbing)",
418
+ "blurb": "Mechanical known-path GDS/DB ops: list, fetch-by-id, log a cost row, read a known file.",
419
+ "code_default": "haiku",
420
+ "tiers": [
421
+ "haiku",
422
+ "sonnet",
423
+ "opus",
424
+ "fable"
425
+ ]
426
+ }
427
+ ],
428
+ "allowed_tiers": [
429
+ "haiku",
430
+ "sonnet",
431
+ "opus",
432
+ "fable"
433
+ ],
434
+ "code_defaults": {
435
+ "main": "opus",
436
+ "subagentDefault": "opus",
437
+ "subagentRoutine": "haiku"
438
+ },
439
+ "instance_default": {
440
+ "main": "opus",
441
+ "subagentDefault": "opus",
442
+ "subagentRoutine": "haiku"
443
+ },
444
+ "override": {},
445
+ "effective": {
446
+ "main": "opus",
447
+ "subagentDefault": "opus",
448
+ "subagentRoutine": "haiku"
449
+ },
450
+ "contract": "Model allocation — main session: opus; subagents default: opus, routine plumbing: haiku. Set the Agent `model` param explicitly per this allocation."
451
+ },
452
+ "render": {
453
+ "widgets_enabled": false,
454
+ "default_enabled": true,
455
+ "override": false
456
+ },
457
+ "needs": {
458
+ "items": [
459
+ {
460
+ "id": "art_key",
461
+ "title": "Image-generation key",
462
+ "what": "The art pipeline draws your tiles and sprites with Google AI Studio (Gemini).",
463
+ "learn_more_url": "https://aistudio.google.com/app/apikey",
464
+ "state": "action_needed",
465
+ "severity": "action",
466
+ "message": "Your free art coverage has ended, so image generation now runs on your own key (you pay only for what you make). Add it to keep making art.",
467
+ "action": {
468
+ "label": "Add your key",
469
+ "href": "/settings#art-key"
470
+ }
471
+ }
472
+ ],
473
+ "action_needed_count": 1,
474
+ "has_action_needed": true
475
+ }
476
+ }