-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy paththor-worker-lobe-qwen3-6-35b-a3b.json
More file actions
447 lines (447 loc) · 23.4 KB
/
Copy paththor-worker-lobe-qwen3-6-35b-a3b.json
File metadata and controls
447 lines (447 loc) · 23.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
{
"slug": "thor-worker-lobe-qwen3-6-35b-a3b",
"title": "thor worker lobe (Qwen3.6-35B-A3B)",
"schema_version": 2,
"status": "exported",
"created": "2026-07-31T06:31:54Z",
"updated": "2026-07-31T06:55:18Z",
"claims": [
{
"id": "c1",
"kind": "announcement",
"text": "Thor moves off the Gemma 4 31B muse and hosts unsloth/Qwen3.6-35B-A3B-NVFP4 as 'worker' \u2014 a new fast ground-work lobe with self-draft MTP",
"origin": "user",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h10",
"text": "the announcement is falsifiable against live surfaces: the deployed Thor answers model=worker through the gateway and the acceptance transcript exists under docs/evidence/",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": "ship as a PR chain: catalog entry + eighth-role registry + opt-in gateway/compose/shape wiring + docs, then a live Thor acceptance run (measured budget, MTP acceptance, parser-pair transcript under docs/evidence/); version-bump every PR"
},
{
"id": "c2",
"kind": "requirement",
"text": "lobes/catalog.py gains a NEW SupportedModel entry for unsloth/Qwen3.6-35B-A3B-NVFP4 with role_hint='worker' \u2014 distinct from the existing mmangkad/Qwen3.6-35B-A3B-NVFP4 candidate (32K native, moe_backend=marlin, NO speculative_config: nvidia's MTP config fails on that copy with a weight-shape mismatch). The unsloth export is 262144-token native and ships its OWN MTP module ('can act as its own speculative draft'), card-suggested --speculative-config '{\"method\": \"mtp\", \"num_speculative_tokens\": 2}' \u2014 a different method string than the 27B primary's qwen3_5_mtp",
"origin": "llm",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h1",
"text": "the committed catalog entry's native_max_model_len / quantization / speculative_config are read from the unsloth checkpoint's actual config.json + hf_quant_config.json at implementation time, not the card prose \u2014 and if the checkpoint disagrees with the card (e.g. MTP fails to load), the entry records what was verified",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": ""
},
{
"id": "c3",
"kind": "requirement",
"text": "the role registry widens to an EIGHTH first-class role: lobes/roles.py needs 'worker' entries in ROLES, ROLE_BACKEND, ROLE_ROLE_HINT, ROLE_PATH (/v1/chat/completions), ROLE_RESPONSIBILITIES, ROLE_FORBIDDEN, and ROLE_MAX_MODEL_LEN_ENV (WORKER_MAX_MODEL_LEN); lobes/profiles/schema.py ROLES (the Profile-machinery set) gains 'worker' so shape overrides can declare its budget knobs",
"origin": "llm",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h2",
"text": "every roles surface (lobes capabilities, GET /capabilities, /v1/models alias resolution) lists exactly eight roles with worker present; no stale seven-role literal survives in code, tests, or docs",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": ""
},
{
"id": "c4",
"kind": "requirement",
"text": "worker becomes the SECOND opt-in core role, mirroring muse end-to-end: shapes.OPT_IN_CORE_ROLES += 'worker'; gateway _config.py wires a WORKER_BASE_URL-gated backend, adds 'worker' to OPT_IN_BACKENDS (infeasible-by-default when unwired \u2014 model=worker 404s role_infeasible, never a silent fallback), and adds WORKER_* keys to FEASIBLE_ENV / PEER_ORIGIN_ENV / PEER_PROXY_ENV / PEER_API_KEY_ENV; profiles/builtin/base.toml vetoes worker on unrecognised cards exactly as it vetoes muse",
"origin": "llm",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h3",
"text": "with no WORKER_* env set anywhere, every existing deployment renders byte-identically (goldens prove it); model=worker on a non-hosting box 404s role_infeasible \u2014 never a silent fallback",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": ""
},
{
"id": "c5",
"kind": "requirement",
"text": "the fleet compose template gains a profile-gated vllm-worker service + WORKER_* knobs in env.example, and shape_render.OPT_IN_CORE_ACTIVATION_ENV maps worker \u2192 COMPOSE_PROFILES gate + WORKER_BASE_URL=http://vllm-worker:8000. The worker lane runs on the QWEN-lane image (the vllm-openai nightly pin the primary/minor lanes use), NOT the lobes/vllm-gemma4:local custom image the muse lane needs",
"origin": "llm",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h4",
"text": "the rendered thor-worker deployment boots vllm-worker on the Qwen-lane image on the physical Thor and serves /v1/chat/completions through the gateway",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": ""
},
{
"id": "c6",
"kind": "requirement",
"text": "a new built-in shape (working name thor-worker) hosts ['worker','embedder','reranker','stt','tts'], drops cortex/senses to peers, and carries the FULL worker declaration (model + budget knobs) in its own overrides \u2014 the card profiles stay silent on worker, exactly the thor-muse pattern. Its gpu_mem_util / max_model_len MUST be measured on the physical Thor before commit: shape budgets on unified-memory boxes are measured truths, not arithmetic (thor-muse's 0.55 was measured only after the 0.40 hypothesis was refused live)",
"origin": "llm",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h5",
"text": "the shape TOML's committed budget values are the ones a live Thor boot measured, with any refused hypothesis recorded in the TOML comments (the thor-muse 0.40\u21920.55 pattern)",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": ""
},
{
"id": "c7",
"kind": "requirement",
"text": "the worker lane serves the Qwen-family parser PAIR: --tool-call-parser=qwen3_coder (runtime._parser.infer_parser must resolve the unsloth id to qwen3_coder \u2014 the catalog pairing guard in tests/test_catalog.py enforces it) plus --reasoning-parser=qwen3, mirroring the cortex lane \u2014 never inferred from the model card, and verified live with skip_special_tokens:false per the per-family parser rule",
"origin": "llm",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h6",
"text": "verified live on the worker lane with skip_special_tokens:false \u2014 a tool call parses into a tool_calls array (not content) and the reasoning trace separates via --reasoning-parser=qwen3",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": ""
},
{
"id": "c8",
"kind": "boundary",
"text": "muse stays in-tree and supported (cite-don't-delete): the nvidia/Gemma-4-31B-IT-NVFP4 catalog entry, the muse role, and the thor-muse built-in shape are NOT removed \u2014 this idea changes which lobe the physical Thor HOSTS, not the muse contract. Whether any box still hosts muse afterwards is a deployment decision, not a code deletion",
"origin": "llm",
"status": "rejected",
"honesty_conditions": [],
"hard_questions": [],
"links": [],
"instruction": ""
},
{
"id": "c9",
"kind": "boundary",
"text": "cortex/senses/embedder/reranker contracts are untouched and machine-as-brain stays byte-identical \u2014 worker is opt-in-core like muse: non-hosting shapes render nothing for it, only base.toml's veto emits WORKER_FEASIBLE=false, and a stale pre-worker .env defaults it to infeasible via OPT_IN_BACKENDS",
"origin": "llm",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h11",
"text": "the shape goldens (machine-as-brain / spark / thor / base) render byte-identical before and after the change when no WORKER_* env is set",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": ""
},
{
"id": "c10",
"kind": "boundary",
"text": "the pooling gears + audio overlay keep co-residing on Thor (mesh-brain decision 2: cheap gears co-reside on every box that wants them) \u2014 the new shape hosts embedder/reranker/stt/tts exactly as thor-muse does today",
"origin": "llm",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h12",
"text": "the thor-worker shape's hosts list includes embedder/reranker/stt/tts and the rendered deployment serves them unchanged \u2014 same probes thor-muse passes today",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": ""
},
{
"id": "c11",
"kind": "non_goal",
"text": "the mmangkad/Qwen3.6-35B-A3B-NVFP4 catalog entry stays a candidate unchanged (no promotion, no removal); docs/qwen3.6-35b-a3b-nvfp4.md gains the unsloth variant's story rather than being rewritten away",
"origin": "llm",
"status": "confirmed",
"honesty_conditions": [],
"hard_questions": [],
"links": [],
"instruction": ""
},
{
"id": "c12",
"kind": "assumption",
"text": "the new built-in shape is named thor-worker, mirroring thor-muse's naming (card + hosted-lobe)",
"origin": "llm",
"status": "confirmed",
"honesty_conditions": [],
"hard_questions": [],
"links": [],
"instruction": ""
},
{
"id": "c13",
"kind": "requirement",
"text": "worker's role contract (user decision q1): responsibilities include fast ground-work execution \u2014 tool_use + repo_action allowed, under cortex direction; forbidden_responsibilities: final_decision, security_decision. First role besides cortex permitted repo_action",
"origin": "user",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h7",
"text": "capabilities output for worker lists repo_action among responsibilities and forbidden is exactly [final_decision, security_decision]; docs/colleague-stack.md's division-of-labour records the widening \u2014 every 'cortex is the only lobe that acts' wording is updated",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": "ROLE_RESPONSIBILITIES['worker'] = ground-work execution tokens + tool_use + repo_action; ROLE_FORBIDDEN['worker'] = ('final_decision','security_decision'); update docs/colleague-stack.md division-of-labour table"
},
{
"id": "c14",
"kind": "boundary",
"text": "muse support is dropped as deployment reality (user decision q3): no box hosts the 31B, Thor's new shape declares no MUSE_PEER_ORIGIN, model=muse 404s role_infeasible without referral. The muse role/gear/shape code stays in-tree as dormant (cite-don't-delete; the q2 tier order still ranks worker < muse), with docs updated to say muse is unhosted",
"origin": "user",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h8",
"text": "after the move, model=muse 404s role_infeasible with no hosted_by on every box; the thor-muse shape, catalog entry, and docs stay in-tree explicitly marked dormant/unhosted",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": "leave muse code/shape/catalog in-tree marked dormant; strip muse hosting from the deployed Thor .env; declare no MUSE_PEER_ORIGIN anywhere; docs say muse is unhosted mesh-wide"
},
{
"id": "c15",
"kind": "audience",
"text": "Culture-mesh Colleagues that address the fleet by role/tier alias (model=worker via the gateway, lobes capabilities / GET /capabilities), plus the operator running the physical Thor",
"origin": "llm",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h13",
"text": "the surfaces Colleagues actually consume (capabilities JSON keyed by role, gateway tier aliases) carry worker \u2014 the audience needs no lobes source access to discover it",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": ""
},
{
"id": "c16",
"kind": "after_state",
"text": "Thor serves unsloth/Qwen3.6-35B-A3B-NVFP4 as 'worker' \u2014 the EIGHTH first-class Colleague role, a fast ground-work DOER (repo_action allowed, under cortex direction) with self-draft MTP at 262144 native \u2014 hosted via a thor-worker shape; muse is dormant mesh-wide (unhosted, no referral)",
"origin": "llm",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h14",
"text": "verified live on the deployed Thor: lobes capabilities lists worker feasible+ready serving the unsloth id, and muse feasible:false with no hosted_by",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": ""
},
{
"id": "c17",
"kind": "before_state",
"text": "Thor serves thor-muse (Gemma 4 31B muse at full 256K, util 0.55, gemma4 parser pair); no worker role exists in the contract; the catalog's only 35B-A3B is the 32K-native mmangkad copy with MTP explicitly not carried",
"origin": "llm",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h15",
"text": "matches the recorded present: Thor's deployment runs thor-muse per the 2026-07-17 evidence transcript, and the catalog's mmangkad entry says 32K-native with no speculative_config",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": ""
},
{
"id": "c18",
"kind": "why_it_matters",
"text": "the mesh gains a fast executor \u2014 ~3B-active MoE decode speed with 35B-class knowledge plus MTP self-draft \u2014 so ground work stops queueing on the 27B cortex; the 31B muse's 67 GiB on Thor bought creative divergence the mesh uses less than fast execution",
"origin": "llm",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h16",
"text": "the speed rationale is measured, not assumed: the acceptance run records worker-lane decode tok/s with MTP on (and off, if feasible) via lobes measure/benchmark",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": ""
},
{
"id": "c19",
"kind": "success_signal",
"text": "on the deployed Thor: lobes capabilities shows worker feasible+ready with truthful model/context/mtp; model=worker serves a chat completion whose tool call parses into tool_calls (not content); an acceptance transcript under docs/evidence/ records the measured budget + MTP acceptance; model=muse 404s role_infeasible with no hosted_by",
"origin": "llm",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h17",
"text": "every listed signal is a checkable artifact: capabilities JSON, a chat transcript with a parsed tool_calls array, the docs/evidence/ file, and the muse role_infeasible 404 body",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": ""
},
{
"id": "c20",
"kind": "decision",
"text": "the thor-worker shape ships the thor-muse way: budget knobs (gpu_mem_util / max_model_len), the sm_110 MoE backend choice, and the MTP speculative-config are MEASURED during implementation by a live boot on the physical Thor and committed with the measured evidence in the shape TOML comments; the worker role stays DECLARED/UNVALIDATED (#108) until the acceptance transcript lands under docs/evidence/ \u2014 the spec requires the measurement, it does not guess the values",
"origin": "llm",
"status": "confirmed",
"honesty_conditions": [
{
"id": "h9",
"text": "the exported spec and resulting plan contain an explicit live-measurement task on the physical Thor whose outputs (budget, MoE backend, MTP verdict) are committed as shape TOML + catalog data with evidence under docs/evidence/ \u2014 no committed value precedes its measurement",
"status": "confirmed",
"instruction": ""
}
],
"hard_questions": [],
"links": [],
"instruction": ""
}
],
"open_vagueness": [
{
"id": "v1",
"text": "measured Thor budget for the 35B MoE worker lane: gpu_mem_util and max_model_len (full 262144 or trimmed) can only come from a live boot on the physical Thor \u2014 shape budgets on unified-memory boxes are measured truths, not arithmetic (thor-muse precedent: 0.40 hypothesis refused live, 0.55 measured) [re-parked non-blocking per confirmed decision c20: measured during implementation, role DECLARED/UNVALIDATED until evidence lands]",
"kind": "unknown_nonblocking",
"claim_id": null
},
{
"id": "v2",
"text": "MoE backend on Thor sm_110: the unsloth card recommends --moe-backend flashinfer_b12x with CUTE_DSL_ARCH=sm_121a \u2014 Spark-arch-specific, sm_121 is NOT sm_110; marlin is verified only GB10-solo on the mmangkad sibling. Which backend serves this checkpoint on Thor is a live measurement [re-parked non-blocking per confirmed decision c20: measured during implementation, role DECLARED/UNVALIDATED until evidence lands]",
"kind": "unknown_nonblocking",
"claim_id": null
},
{
"id": "v3",
"text": "does the unsloth copy's self-draft MTP actually load and accept on the deployed vLLM image on Thor? The mmangkad sibling's MTP failed with a weight-shape mismatch, and the card's method string ('mtp', 2 tokens) differs from the 27B's qwen3_5_mtp \u2014 MTP is a headline motivation, so this gates the perf claim [re-parked non-blocking per confirmed decision c20: measured during implementation, role DECLARED/UNVALIDATED until evidence lands]",
"kind": "unknown_nonblocking",
"claim_id": null
},
{
"id": "v4",
"text": "unsloth config.json quant_method (modelopt vs compressed-tensors) sets WORKER_QUANTIZATION \u2014 read from the checkpoint config at implementation time",
"kind": "unknown_nonblocking",
"claim_id": null
},
{
"id": "v5",
"text": "do the cortex-lane-only thinking knobs extend to the worker lane: preserve_thinking (#93), the qwen3_coder_thinking tool-parser plugin (colleague#320), and GATEWAY_FORCE_STRICT_TOOLS \u2014 Qwen3.6 is a thinking model, so the strict+thinking grammar break plausibly applies to worker too",
"kind": "unknown_nonblocking",
"claim_id": null
}
],
"scope_entries": [
{
"id": "s1",
"surface": "lobes/catalog.py + HF card unsloth/Qwen3.6-35B-A3B-NVFP4",
"finding": "catalog already holds the mmangkad sibling of this checkpoint as a candidate (32K native, marlin verified GB10-solo, MTP explicitly NOT carried \u2014 nvidia's config fails on it); the unsloth export verified on HF 2026-07-31: MoE 35B/~3B-active, 262144 native (\u21921M), includes its own MTP draft module, vLLM card syntax method=mtp num_speculative_tokens=2",
"seeds": [
"c2"
]
},
{
"id": "s2",
"surface": "lobes/roles.py + lobes/profiles/schema.py",
"finding": "every role surface is a per-role dict keyed by name \u2014 seven roles today ('cortex','senses','muse','embedder','reranker','stt','tts'); muse (added as the seventh) is the exact structural precedent: generate-lane role, _CHAT_PATH, its own backend name, own MAX_MODEL_LEN env. schema.py ROLES is the 5-core subset shapes can override",
"seeds": [
"c3"
]
},
{
"id": "s3",
"surface": "lobes/profiles/shapes.py + lobes/gateway/_config.py + lobes/profiles/builtin/base.toml",
"finding": "OPT_IN_CORE_ROLES=('muse',) with machine-as-brain's DEFAULT_HOSTED_ROLES derived by exclusion \u2014 adding 'worker' keeps machine-as-brain byte-identical automatically; OPT_IN_BACKENDS=frozenset({'muse'}) implements unwired\u2192infeasible; all four peer-channel env dicts key by backend name; base.toml [roles.muse] feasible=false is the unknown-card veto precedent",
"seeds": [
"c4"
]
},
{
"id": "s4",
"surface": "lobes/templates/fleet/docker-compose.yml + env.example + lobes/profiles/shape_render.py",
"finding": "vllm-muse is the template precedent: profile-gated ('muse' compose profile), no host port, MUSE_* knob family, activation env written by the shape render (OPT_IN_CORE_ACTIVATION_ENV={'muse': {'MUSE_BASE_URL': ...}}); muse rides image lobes/vllm-gemma4:local while the Qwen lanes ride vllm/vllm-openai@sha256:7c5a10e9... (VLLM_NIGHTLY_IMAGE) \u2014 worker is a Qwen3.6 and belongs on the latter",
"seeds": [
"c5"
]
},
{
"id": "s5",
"surface": "lobes/profiles/builtin_shapes/thor-muse.toml + tests/goldens/shapes",
"finding": "thor-muse.toml is the exact structural template: hosts list, [overrides.muse] with model/gpu_mem_util/max_model_len/quantization/attention_backend, header comments recording MEASURED evidence; goldens exist per shape (tests/goldens/shapes + regen.py) so a new shape needs its golden env files regenerated",
"seeds": [
"c6"
]
},
{
"id": "s6",
"surface": "lobes/runtime/_parser.py + tests/test_catalog.py",
"finding": "the mmangkad 35B sibling already carries tool_parser='qwen3_coder' in the catalog and the pairing guard asserts catalog\u2194infer_parser agreement; the gemma4 incident (silent 200-OK failure from a wrong parser pair) is the recorded reason live verification is mandatory",
"seeds": [
"c7"
]
},
{
"id": "s7",
"surface": "lobes/cli/_commands/up.py + capabilities.py + status.py + measure.py + overview.py + init.py",
"finding": "the CLI names roles per-verb: up.py maps role\u2192service ('muse'\u2192'vllm-muse') and its help string enumerates all seven roles + colleague-stack; a worker role needs the same per-verb touch (service map, help text, measure family, capabilities rendering) \u2014 mechanical, all keyed by the same role name",
"seeds": [
"c3"
]
},
{
"id": "s8",
"surface": "lobes/gateway/_pressure_policy.py + lobes/catalog.py TIER_ROLE",
"finding": "tier vocabulary is minor < multimodal < muse < main with muse's role name AS its tier; pressure policy now SHEDS non-minor tiers with 429 under pressure (degrade-to-minor path removed \u2014 CLAUDE.md's 'degrades to minor' wording is stale vs the code) and worker needs a declared position in both dicts (they must stay identical, per the in-code comment)",
"seeds": [
"c3"
]
}
]
}