@instruments/taxonomy 0.1.0 → 0.2.0

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.
@@ -0,0 +1,1715 @@
1
+ import {
2
+ defineAlternatives
3
+ } from "../chunk-C2ZPDTOU.js";
4
+
5
+ // src/estate/rows/materia.ts
6
+ var SCENE_MOOD = "materia.scene_mood";
7
+ var INTENT_KEYWORDS = "materia.intent_keywords";
8
+ var OUT_OF_AXIS = "out-of-axis";
9
+ var MATERIAL_PROPERTY = "material-property";
10
+ var QUERY_MARKER = "query-marker";
11
+ var DECOMPOSED = "decomposed";
12
+ var MED_REGION = "place.region.mediterranean";
13
+ var NORDIC_REGION = "place.region.nordic";
14
+ var COASTAL_LANDSCAPE = "place.landscape.coastal";
15
+ var PLAYFUL = "mood.playful";
16
+ var MOODY = "mood.moody";
17
+ var MINIMALISM = "style.minimalism";
18
+ var CONTEMPORARY = "style.contemporary";
19
+ var TRADITIONAL = "style.traditional";
20
+ var RUSTIC = "style.rustic";
21
+ var INDUSTRIAL = "style.industrial";
22
+ var MCM = "style.mid_century_modern";
23
+ var ART_DECO = "style.art_deco";
24
+ var MODERNISM = "style.modernism";
25
+ var LUXURIOUS = "mood.luxurious";
26
+ var SOFT_MOOD = "mood.soft";
27
+ var CALM = "mood.calm";
28
+ var WARM = "palette.temperature.warm";
29
+ var EVOKES_NORDIC = "evokes(place.region.nordic)";
30
+ var EVOKES_COASTAL = "evokes(place.landscape.coastal)";
31
+ var EVOKES_MED = "evokes(place.region.mediterranean)";
32
+ var FADED = "palette.character.faded";
33
+ var AUSTERE = "mood.austere";
34
+ var EVOKES_MONASTERY = "evokes(typology.monastery)";
35
+ var MODERN_ALTERNATIVES = defineAlternatives(
36
+ [
37
+ [{ assertion: MODERNISM, role: "constitutive" }],
38
+ [{ assertion: CONTEMPORARY, role: "constitutive" }]
39
+ ],
40
+ "source-ambiguous"
41
+ );
42
+ var BOUTIQUE_ALTERNATIVES = defineAlternatives(
43
+ [
44
+ [{ assertion: "evokes(typology.hotel)", role: "constitutive" }],
45
+ [{ assertion: "evokes(typology.shop)", role: "constitutive" }]
46
+ ],
47
+ "source-ambiguous"
48
+ );
49
+ var MATERIA_ROWS = [
50
+ // ─── materia · SceneMoodSchema (9) ─────────────────────────────────────────────────────────
51
+ {
52
+ onto: [MINIMALISM, CALM],
53
+ source: SCENE_MOOD,
54
+ term: "serene-minimal",
55
+ verdict: DECOMPOSED
56
+ },
57
+ {
58
+ note: "Temperature welded into a style enum. The exact failure `warm minimalism` exhibits, in a different pairing.",
59
+ onto: [TRADITIONAL, WARM],
60
+ source: SCENE_MOOD,
61
+ term: "warm-traditional",
62
+ verdict: DECOMPOSED
63
+ },
64
+ {
65
+ mintedTerm: ["palette.character.saturated"],
66
+ onto: [MOODY, "palette.character.saturated"],
67
+ source: SCENE_MOOD,
68
+ term: "moody-saturated",
69
+ verdict: DECOMPOSED
70
+ },
71
+ {
72
+ mintedAxis: [MED_REGION],
73
+ mintedTerm: [FADED],
74
+ note: "Four axes in one token. The single worst compound in the estate and it decomposes without residue.",
75
+ onto: [EVOKES_MED, FADED, WARM, "palette.character.light"],
76
+ source: SCENE_MOOD,
77
+ term: "sun-bleached-mediterranean",
78
+ verdict: DECOMPOSED
79
+ },
80
+ {
81
+ mintedAxis: ["place.region.japanese", NORDIC_REGION],
82
+ note: "Japandi is a named fusion with settled conventions of its own. The composition is necessary but not sufficient: it also matches rooms nobody would call japandi. Anchor required alongside.",
83
+ onto: [MINIMALISM, "evokes(place.region.japanese)", EVOKES_NORDIC, SOFT_MOOD],
84
+ source: SCENE_MOOD,
85
+ term: "soft-japandi",
86
+ verdict: "lossy"
87
+ },
88
+ {
89
+ mintedAxis: ["typology.monastery"],
90
+ mintedTerm: [AUSTERE],
91
+ onto: [EVOKES_MONASTERY, AUSTERE, MINIMALISM, "ms_texture (material axis)"],
92
+ source: SCENE_MOOD,
93
+ term: "tactile-monastic",
94
+ verdict: DECOMPOSED
95
+ },
96
+ {
97
+ mintedTerm: [LUXURIOUS],
98
+ onto: [ART_DECO, LUXURIOUS],
99
+ source: SCENE_MOOD,
100
+ term: "art-deco-luxe",
101
+ verdict: DECOMPOSED
102
+ },
103
+ {
104
+ note: "A procurement claim, not an aesthetic: specified to commercial standards. Sits on SECTOR, and only appeared in a mood enum because the enum was the only field available.",
105
+ onto: [],
106
+ reason: "other-canonical-axis",
107
+ source: SCENE_MOOD,
108
+ term: "commercial-spec",
109
+ verdict: OUT_OF_AXIS
110
+ },
111
+ {
112
+ note: "An instruction to the scene planner, not a description of a room. Nothing to classify.",
113
+ onto: [],
114
+ reason: QUERY_MARKER,
115
+ source: SCENE_MOOD,
116
+ term: "material-led",
117
+ verdict: OUT_OF_AXIS
118
+ },
119
+ // ─── materia · INTENT_KEYWORDS (37) ────────────────────────────────────────────────────────
120
+ {
121
+ note: "ms_sheen.",
122
+ onto: [],
123
+ reason: MATERIAL_PROPERTY,
124
+ source: INTENT_KEYWORDS,
125
+ term: "chalky",
126
+ verdict: OUT_OF_AXIS
127
+ },
128
+ {
129
+ mintedAxis: [COASTAL_LANDSCAPE],
130
+ onto: [EVOKES_COASTAL],
131
+ source: INTENT_KEYWORDS,
132
+ term: "coastal",
133
+ verdict: DECOMPOSED
134
+ },
135
+ {
136
+ note: "A colour NAME, not a family. Resolves to a family; the name itself belongs in colorscope, not here.",
137
+ onto: ["palette.hue.brown"],
138
+ source: INTENT_KEYWORDS,
139
+ term: "cognac",
140
+ verdict: DECOMPOSED
141
+ },
142
+ {
143
+ onto: ["palette.hue.brown", "palette.character.muted", WARM],
144
+ source: INTENT_KEYWORDS,
145
+ term: "earthy",
146
+ verdict: DECOMPOSED
147
+ },
148
+ {
149
+ onto: [],
150
+ reason: QUERY_MARKER,
151
+ source: INTENT_KEYWORDS,
152
+ term: "interesting",
153
+ verdict: OUT_OF_AXIS
154
+ },
155
+ { onto: [MOODY], source: INTENT_KEYWORDS, term: "moody", verdict: DECOMPOSED },
156
+ {
157
+ onto: [PLAYFUL],
158
+ source: INTENT_KEYWORDS,
159
+ term: "playful",
160
+ verdict: DECOMPOSED
161
+ },
162
+ { onto: [CALM], source: INTENT_KEYWORDS, term: "quiet", verdict: DECOMPOSED },
163
+ { onto: [SOFT_MOOD], source: INTENT_KEYWORDS, term: "soft", verdict: DECOMPOSED },
164
+ {
165
+ onto: [],
166
+ reason: MATERIAL_PROPERTY,
167
+ source: INTENT_KEYWORDS,
168
+ term: "performance",
169
+ verdict: OUT_OF_AXIS
170
+ },
171
+ {
172
+ onto: [],
173
+ reason: MATERIAL_PROPERTY,
174
+ source: INTENT_KEYWORDS,
175
+ term: "cleanable",
176
+ verdict: OUT_OF_AXIS
177
+ },
178
+ {
179
+ note: "Onto the already-published SECTOR axis.",
180
+ onto: ["sector.healthcare"],
181
+ source: INTENT_KEYWORDS,
182
+ term: "healthcare",
183
+ verdict: DECOMPOSED
184
+ },
185
+ {
186
+ note: "ms_pattern_density.",
187
+ onto: [],
188
+ reason: MATERIAL_PROPERTY,
189
+ source: INTENT_KEYWORDS,
190
+ term: "patterned",
191
+ verdict: OUT_OF_AXIS
192
+ },
193
+ {
194
+ mintedTerm: [FADED],
195
+ onto: [FADED],
196
+ source: INTENT_KEYWORDS,
197
+ term: "faded",
198
+ verdict: DECOMPOSED
199
+ },
200
+ {
201
+ onto: [WARM],
202
+ source: INTENT_KEYWORDS,
203
+ term: "warm",
204
+ verdict: DECOMPOSED
205
+ },
206
+ {
207
+ onto: ["palette.temperature.cool"],
208
+ source: INTENT_KEYWORDS,
209
+ term: "cool",
210
+ verdict: DECOMPOSED
211
+ },
212
+ {
213
+ alternatives: MODERN_ALTERNATIVES,
214
+ note: "THE ambiguity of the whole corpus. See the designshop rows, where it carries a dominant share of that corpus.",
215
+ onto: [],
216
+ source: INTENT_KEYWORDS,
217
+ term: "modern",
218
+ verdict: "ambiguous"
219
+ },
220
+ {
221
+ onto: [RUSTIC],
222
+ source: INTENT_KEYWORDS,
223
+ term: "rustic",
224
+ verdict: DECOMPOSED
225
+ },
226
+ {
227
+ onto: [MINIMALISM],
228
+ source: INTENT_KEYWORDS,
229
+ term: "minimalist",
230
+ verdict: DECOMPOSED
231
+ },
232
+ {
233
+ onto: [INDUSTRIAL],
234
+ source: INTENT_KEYWORDS,
235
+ term: "industrial",
236
+ verdict: DECOMPOSED
237
+ },
238
+ {
239
+ mintedAxis: ["typology.hotel"],
240
+ onto: ["typology.hotel"],
241
+ reason: "other-canonical-axis",
242
+ source: INTENT_KEYWORDS,
243
+ term: "hotel",
244
+ verdict: DECOMPOSED
245
+ },
246
+ {
247
+ note: "Onto SPACE, which already existed upstream as materialgraph ms_room.",
248
+ onto: ["space.hospitality_lobby"],
249
+ source: INTENT_KEYWORDS,
250
+ term: "lobby",
251
+ verdict: DECOMPOSED
252
+ },
253
+ {
254
+ mintedAxis: ["typology.spa"],
255
+ onto: ["typology.spa", "space.spa_pool"],
256
+ source: INTENT_KEYWORDS,
257
+ term: "spa",
258
+ verdict: DECOMPOSED
259
+ },
260
+ {
261
+ alternatives: BOUTIQUE_ALTERNATIVES,
262
+ note: "A boutique hotel and a boutique shop are different claims and the keyword set cannot tell them apart.",
263
+ onto: [],
264
+ source: INTENT_KEYWORDS,
265
+ term: "boutique",
266
+ verdict: "ambiguous"
267
+ },
268
+ {
269
+ note: "US spelling of a term the canon carries as `sheltering`, also called `cosy`.",
270
+ onto: ["mood.sheltering"],
271
+ source: INTENT_KEYWORDS,
272
+ term: "cozy",
273
+ verdict: DECOMPOSED
274
+ },
275
+ {
276
+ mintedTerm: [LUXURIOUS],
277
+ onto: [LUXURIOUS],
278
+ source: INTENT_KEYWORDS,
279
+ term: "luxurious",
280
+ verdict: DECOMPOSED
281
+ },
282
+ {
283
+ onto: [],
284
+ reason: QUERY_MARKER,
285
+ source: INTENT_KEYWORDS,
286
+ term: "vibe",
287
+ verdict: OUT_OF_AXIS
288
+ },
289
+ {
290
+ onto: [],
291
+ reason: QUERY_MARKER,
292
+ source: INTENT_KEYWORDS,
293
+ term: "aesthetic",
294
+ verdict: OUT_OF_AXIS
295
+ },
296
+ {
297
+ onto: [],
298
+ reason: QUERY_MARKER,
299
+ source: INTENT_KEYWORDS,
300
+ term: "feel",
301
+ verdict: OUT_OF_AXIS
302
+ },
303
+ {
304
+ onto: [],
305
+ reason: QUERY_MARKER,
306
+ source: INTENT_KEYWORDS,
307
+ term: "style",
308
+ verdict: OUT_OF_AXIS
309
+ },
310
+ {
311
+ onto: [],
312
+ reason: QUERY_MARKER,
313
+ source: INTENT_KEYWORDS,
314
+ term: "like",
315
+ verdict: OUT_OF_AXIS
316
+ },
317
+ {
318
+ onto: [],
319
+ reason: QUERY_MARKER,
320
+ source: INTENT_KEYWORDS,
321
+ term: "similar",
322
+ verdict: OUT_OF_AXIS
323
+ },
324
+ {
325
+ note: "Reads as the style, not the period, in every query context. `period.mid_century` is the other reading and the axis prefix keeps them apart.",
326
+ onto: [MCM],
327
+ source: INTENT_KEYWORDS,
328
+ term: "mid-century",
329
+ verdict: DECOMPOSED
330
+ },
331
+ {
332
+ onto: [CONTEMPORARY],
333
+ source: INTENT_KEYWORDS,
334
+ term: "contemporary",
335
+ verdict: DECOMPOSED
336
+ },
337
+ {
338
+ onto: [TRADITIONAL],
339
+ source: INTENT_KEYWORDS,
340
+ term: "traditional",
341
+ verdict: DECOMPOSED
342
+ },
343
+ {
344
+ mintedAxis: [NORDIC_REGION],
345
+ onto: [EVOKES_NORDIC],
346
+ source: INTENT_KEYWORDS,
347
+ term: "scandinavian",
348
+ verdict: DECOMPOSED
349
+ },
350
+ {
351
+ mintedAxis: [MED_REGION],
352
+ onto: [EVOKES_MED],
353
+ source: INTENT_KEYWORDS,
354
+ term: "mediterranean",
355
+ verdict: DECOMPOSED
356
+ }
357
+ ];
358
+
359
+ // src/estate/rows/architizer.ts
360
+ var ARCHITIZER = "architizer.styles";
361
+ var OUT_OF_AXIS2 = "out-of-axis";
362
+ var DECOMPOSED2 = "decomposed";
363
+ var MED_REGION2 = "place.region.mediterranean";
364
+ var NORDIC_REGION2 = "place.region.nordic";
365
+ var MINIMALISM2 = "style.minimalism";
366
+ var CONTEMPORARY2 = "style.contemporary";
367
+ var TRADITIONAL2 = "style.traditional";
368
+ var RUSTIC2 = "style.rustic";
369
+ var INDUSTRIAL2 = "style.industrial";
370
+ var MCM2 = "style.mid_century_modern";
371
+ var ART_DECO2 = "style.art_deco";
372
+ var MODERNISM2 = "style.modernism";
373
+ var EVOKES_NORDIC2 = "evokes(place.region.nordic)";
374
+ var EVOKES_MED2 = "evokes(place.region.mediterranean)";
375
+ var ARCHITIZER_ROWS = [
376
+ // ─── architizer · STYLES (25) ──────────────────────────────────────────────────────────────
377
+ {
378
+ onto: [MODERNISM2],
379
+ source: ARCHITIZER,
380
+ term: "Modernist",
381
+ verdict: DECOMPOSED2
382
+ },
383
+ {
384
+ onto: [MCM2],
385
+ source: ARCHITIZER,
386
+ term: "Mid-century modern",
387
+ verdict: DECOMPOSED2
388
+ },
389
+ {
390
+ onto: ["style.brutalism"],
391
+ source: ARCHITIZER,
392
+ term: "Brutalist",
393
+ verdict: DECOMPOSED2
394
+ },
395
+ {
396
+ onto: [MINIMALISM2],
397
+ source: ARCHITIZER,
398
+ term: "Minimalist",
399
+ verdict: DECOMPOSED2
400
+ },
401
+ {
402
+ onto: ["style.rationalism"],
403
+ source: ARCHITIZER,
404
+ term: "Rationalist",
405
+ verdict: DECOMPOSED2
406
+ },
407
+ {
408
+ onto: ["style.postmodernism"],
409
+ source: ARCHITIZER,
410
+ term: "Postmodern",
411
+ verdict: DECOMPOSED2
412
+ },
413
+ {
414
+ onto: ["style.deconstructivism"],
415
+ source: ARCHITIZER,
416
+ term: "Deconstructivist",
417
+ verdict: DECOMPOSED2
418
+ },
419
+ {
420
+ onto: ["style.parametricism"],
421
+ source: ARCHITIZER,
422
+ term: "Parametric",
423
+ verdict: DECOMPOSED2
424
+ },
425
+ {
426
+ onto: ["style.high_tech"],
427
+ source: ARCHITIZER,
428
+ term: "High-tech",
429
+ verdict: DECOMPOSED2
430
+ },
431
+ {
432
+ onto: [INDUSTRIAL2],
433
+ source: ARCHITIZER,
434
+ term: "Industrial",
435
+ verdict: DECOMPOSED2
436
+ },
437
+ {
438
+ onto: ["style.constructivism"],
439
+ source: ARCHITIZER,
440
+ term: "Constructivist",
441
+ verdict: DECOMPOSED2
442
+ },
443
+ {
444
+ note: "Carries no content until a place is supplied. It composes with PLACE rather than duplicating it, which is why the canon keeps both.",
445
+ onto: ["style.vernacular"],
446
+ source: ARCHITIZER,
447
+ term: "Vernacular",
448
+ verdict: DECOMPOSED2
449
+ },
450
+ {
451
+ onto: ["style.critical_regionalism"],
452
+ source: ARCHITIZER,
453
+ term: "Critical regionalist",
454
+ verdict: DECOMPOSED2
455
+ },
456
+ {
457
+ mintedAxis: ["place.landscape.tropical"],
458
+ onto: [MODERNISM2, "evokes(place.landscape.tropical)"],
459
+ source: ARCHITIZER,
460
+ term: "Tropical modernism",
461
+ verdict: DECOMPOSED2
462
+ },
463
+ {
464
+ mintedAxis: [NORDIC_REGION2],
465
+ onto: [MODERNISM2, EVOKES_NORDIC2],
466
+ source: ARCHITIZER,
467
+ term: "Nordic modern",
468
+ verdict: DECOMPOSED2
469
+ },
470
+ {
471
+ mintedAxis: ["place.region.japanese"],
472
+ onto: [CONTEMPORARY2, "evokes(place.region.japanese)"],
473
+ source: ARCHITIZER,
474
+ term: "Japanese contemporary",
475
+ verdict: DECOMPOSED2
476
+ },
477
+ {
478
+ mintedAxis: [MED_REGION2],
479
+ note: "Sat in a STYLE enum with no style component at all. Pure place, and the clearest single piece of evidence that the place gap was real.",
480
+ onto: [EVOKES_MED2],
481
+ source: ARCHITIZER,
482
+ term: "Mediterranean",
483
+ verdict: DECOMPOSED2
484
+ },
485
+ {
486
+ onto: [TRADITIONAL2],
487
+ source: ARCHITIZER,
488
+ term: "Traditional",
489
+ verdict: DECOMPOSED2
490
+ },
491
+ {
492
+ onto: ["style.neoclassical"],
493
+ source: ARCHITIZER,
494
+ term: "Neoclassical",
495
+ verdict: DECOMPOSED2
496
+ },
497
+ { onto: ["style.gothic"], source: ARCHITIZER, term: "Gothic", verdict: DECOMPOSED2 },
498
+ {
499
+ onto: [ART_DECO2],
500
+ source: ARCHITIZER,
501
+ term: "Art Deco",
502
+ verdict: DECOMPOSED2
503
+ },
504
+ {
505
+ onto: ["style.organic_modernism"],
506
+ source: ARCHITIZER,
507
+ term: "Organic",
508
+ verdict: DECOMPOSED2
509
+ },
510
+ {
511
+ note: "A design STRATEGY, not an idiom. Belongs on a strategy axis alongside architizer's own SUSTAINABILITY enum. Declared as a gap rather than absorbed into Style.",
512
+ onto: [],
513
+ reason: "axis-not-authored",
514
+ source: ARCHITIZER,
515
+ term: "Biophilic",
516
+ verdict: OUT_OF_AXIS2
517
+ },
518
+ {
519
+ note: "A formal quality. architizer's own FORMAL_MOVE_EXAMPLES is where it belongs, and that file already separates the two - the enum did not.",
520
+ onto: [],
521
+ reason: "axis-not-authored",
522
+ source: ARCHITIZER,
523
+ term: "Sculptural",
524
+ verdict: OUT_OF_AXIS2
525
+ },
526
+ { onto: [RUSTIC2], source: ARCHITIZER, term: "Rustic", verdict: DECOMPOSED2 }
527
+ ];
528
+
529
+ // src/estate/rows/designround.ts
530
+ var DESIGNROUND = "designround.style_anchors";
531
+ var DECOMPOSED3 = "decomposed";
532
+ var NORDIC_REGION3 = "place.region.nordic";
533
+ var COASTAL_LANDSCAPE2 = "place.landscape.coastal";
534
+ var MOODY2 = "mood.moody";
535
+ var MINIMALISM3 = "style.minimalism";
536
+ var CONTEMPORARY3 = "style.contemporary";
537
+ var RUSTIC3 = "style.rustic";
538
+ var INDUSTRIAL3 = "style.industrial";
539
+ var MCM3 = "style.mid_century_modern";
540
+ var ART_DECO3 = "style.art_deco";
541
+ var LUXURIOUS2 = "mood.luxurious";
542
+ var WARM2 = "palette.temperature.warm";
543
+ var EVOKES_NORDIC3 = "evokes(place.region.nordic)";
544
+ var EVOKES_COASTAL2 = "evokes(place.landscape.coastal)";
545
+ var DESIGNROUND_ROWS = [
546
+ // ─── designround · STYLE_ANCHORS (12) ──────────────────────────────────────────────────────
547
+ {
548
+ note: "The label decomposes exactly. The ANCHOR PROSE behind it does not - it also carries limewash, linen, wabi-sabi and Japanese influence. That gap between label and prose is what an anchor is for, and is the argument for keeping anchors alongside concepts rather than instead of them.",
549
+ onto: [MINIMALISM3, WARM2],
550
+ source: DESIGNROUND,
551
+ term: "Warm Minimalism",
552
+ verdict: DECOMPOSED3
553
+ },
554
+ {
555
+ mintedAxis: ["place.region.english_country"],
556
+ onto: ["evokes(place.region.english_country)"],
557
+ source: DESIGNROUND,
558
+ term: "English Country",
559
+ verdict: DECOMPOSED3
560
+ },
561
+ {
562
+ mintedTerm: ["style.maximalism"],
563
+ onto: ["style.maximalism", CONTEMPORARY3],
564
+ source: DESIGNROUND,
565
+ term: "Modern Maximalism",
566
+ verdict: DECOMPOSED3
567
+ },
568
+ {
569
+ mintedTerm: [LUXURIOUS2],
570
+ onto: [CONTEMPORARY3, LUXURIOUS2],
571
+ source: DESIGNROUND,
572
+ term: "Contemporary Luxury",
573
+ verdict: DECOMPOSED3
574
+ },
575
+ {
576
+ mintedAxis: [COASTAL_LANDSCAPE2],
577
+ onto: [
578
+ EVOKES_COASTAL2,
579
+ "palette.character.muted",
580
+ "ms_character.natural_reading (material axis)"
581
+ ],
582
+ source: DESIGNROUND,
583
+ term: "Coastal & Natural",
584
+ verdict: DECOMPOSED3
585
+ },
586
+ {
587
+ onto: [MCM3],
588
+ source: DESIGNROUND,
589
+ term: "Mid-Century Modern",
590
+ verdict: DECOMPOSED3
591
+ },
592
+ {
593
+ note: '"Raw" is a finish claim on the material axis, not a second style.',
594
+ onto: [INDUSTRIAL3],
595
+ source: DESIGNROUND,
596
+ term: "Industrial & Raw",
597
+ verdict: DECOMPOSED3
598
+ },
599
+ {
600
+ onto: ["style.neoclassical", "mood.monumental"],
601
+ source: DESIGNROUND,
602
+ term: "Classical & Grand",
603
+ verdict: DECOMPOSED3
604
+ },
605
+ {
606
+ mintedAxis: [NORDIC_REGION3],
607
+ onto: [EVOKES_NORDIC3],
608
+ source: DESIGNROUND,
609
+ term: "Scandinavian",
610
+ verdict: DECOMPOSED3
611
+ },
612
+ {
613
+ onto: [RUSTIC3, "ms_character.crafted (material axis)"],
614
+ source: DESIGNROUND,
615
+ term: "Rustic & Artisan",
616
+ verdict: DECOMPOSED3
617
+ },
618
+ {
619
+ mintedTerm: [LUXURIOUS2],
620
+ onto: [ART_DECO3, LUXURIOUS2],
621
+ source: DESIGNROUND,
622
+ term: "Art Deco & Glamour",
623
+ verdict: DECOMPOSED3
624
+ },
625
+ {
626
+ mintedTerm: ["mood.dramatic"],
627
+ note: "Not one mood twice. A pale high-contrast gallery is dramatic and not moody; a dim snug is moody and not dramatic. materialgraph's ms_mood conflates them and this anchor needed both halves.",
628
+ onto: [MOODY2, "mood.dramatic"],
629
+ source: DESIGNROUND,
630
+ term: "Moody & Dramatic",
631
+ verdict: DECOMPOSED3
632
+ }
633
+ ];
634
+
635
+ // src/estate/rows/designshop.ts
636
+ var DS_SCHEMES = "designshop.scheme_styles";
637
+ var DS_PRODUCTS = "designshop.product_styles";
638
+ var DECOMPOSED4 = "decomposed";
639
+ var NORDIC_REGION4 = "place.region.nordic";
640
+ var COASTAL_LANDSCAPE3 = "place.landscape.coastal";
641
+ var MINIMALISM4 = "style.minimalism";
642
+ var CONTEMPORARY4 = "style.contemporary";
643
+ var TRADITIONAL3 = "style.traditional";
644
+ var RUSTIC4 = "style.rustic";
645
+ var INDUSTRIAL4 = "style.industrial";
646
+ var MCM4 = "style.mid_century_modern";
647
+ var ART_DECO4 = "style.art_deco";
648
+ var MODERNISM3 = "style.modernism";
649
+ var TRANSITIONAL = "style.transitional";
650
+ var ECLECTIC = "style.eclectic";
651
+ var EVOKES_NORDIC4 = "evokes(place.region.nordic)";
652
+ var EVOKES_COASTAL3 = "evokes(place.landscape.coastal)";
653
+ var EVOKES_FARMHOUSE = "evokes(typology.farmhouse)";
654
+ var MODERN_ALTERNATIVES2 = defineAlternatives(
655
+ [
656
+ [{ assertion: MODERNISM3, role: "constitutive" }],
657
+ [{ assertion: CONTEMPORARY4, role: "constitutive" }]
658
+ ],
659
+ "source-ambiguous"
660
+ );
661
+ var COUNTRY_ALTERNATIVES = defineAlternatives(
662
+ [
663
+ [{ assertion: "evokes(place.region.english_country)", role: "constitutive" }],
664
+ [{ assertion: EVOKES_FARMHOUSE, role: "constitutive" }]
665
+ ],
666
+ "source-ambiguous"
667
+ );
668
+ var DESIGNSHOP_ROWS = [
669
+ // ─── designshop · roomStyle, 1,922 schemes of usage (9) ────────────────────────────────────
670
+ {
671
+ onto: [CONTEMPORARY4],
672
+ source: DS_SCHEMES,
673
+ term: "Contemporary",
674
+ verdict: DECOMPOSED4
675
+ },
676
+ {
677
+ alternatives: MODERN_ALTERNATIVES2,
678
+ note: "A dominant share of that corpus, sitting beside an almost identical share tagged Contemporary. The merchandisers plainly distinguish the two and nobody wrote down how. The canon preserves a typed disjunction over both readings rather than guessing or dropping the row.",
679
+ onto: [],
680
+ source: DS_SCHEMES,
681
+ term: "Modern",
682
+ verdict: "ambiguous"
683
+ },
684
+ {
685
+ onto: [TRADITIONAL3],
686
+ source: DS_SCHEMES,
687
+ term: "Traditional",
688
+ verdict: DECOMPOSED4
689
+ },
690
+ {
691
+ mintedTerm: [TRANSITIONAL],
692
+ note: "Defined only relative to two other styles, which was nearly grounds to refuse it. Its volume in that corpus is why it stays.",
693
+ onto: [TRANSITIONAL],
694
+ source: DS_SCHEMES,
695
+ term: "Transitional",
696
+ verdict: DECOMPOSED4
697
+ },
698
+ {
699
+ mintedTerm: [ECLECTIC],
700
+ onto: [ECLECTIC],
701
+ source: DS_SCHEMES,
702
+ term: "Eclectic",
703
+ verdict: DECOMPOSED4
704
+ },
705
+ {
706
+ onto: [MINIMALISM4],
707
+ source: DS_SCHEMES,
708
+ term: "Minimalist",
709
+ verdict: DECOMPOSED4
710
+ },
711
+ {
712
+ alternatives: COUNTRY_ALTERNATIVES,
713
+ note: "In a US catalogue this is not the English country idiom, and it sits beside a separate `Farmhouse` value at comparable volume. Two adjacent consumer terms, a meaningful share of the corpus between them, and no recorded difference. Declines.",
714
+ onto: [],
715
+ source: DS_SCHEMES,
716
+ term: "Country",
717
+ verdict: "ambiguous"
718
+ },
719
+ {
720
+ mintedAxis: ["typology.farmhouse"],
721
+ note: "A building type invoked as a look. The clearest case that typology-as-reference is a real mechanism and not a special case of place.",
722
+ onto: [EVOKES_FARMHOUSE, RUSTIC4],
723
+ source: DS_SCHEMES,
724
+ term: "Farmhouse",
725
+ verdict: DECOMPOSED4
726
+ },
727
+ {
728
+ mintedAxis: [COASTAL_LANDSCAPE3],
729
+ note: "The same term architizer carries in its CONTEXTS enum meaning `located-in`. One vocabulary, two predicates.",
730
+ onto: [EVOKES_COASTAL3],
731
+ source: DS_SCHEMES,
732
+ term: "Coastal",
733
+ verdict: DECOMPOSED4
734
+ },
735
+ // ─── designshop · product attributes.Style (14) ────────────────────────────────────────────
736
+ {
737
+ onto: [CONTEMPORARY4],
738
+ source: DS_PRODUCTS,
739
+ term: "Contemporary",
740
+ verdict: DECOMPOSED4
741
+ },
742
+ {
743
+ alternatives: MODERN_ALTERNATIVES2,
744
+ onto: [],
745
+ source: DS_PRODUCTS,
746
+ term: "Modern",
747
+ verdict: "ambiguous"
748
+ },
749
+ {
750
+ onto: [MINIMALISM4],
751
+ source: DS_PRODUCTS,
752
+ term: "Minimalist",
753
+ verdict: DECOMPOSED4
754
+ },
755
+ {
756
+ mintedAxis: [NORDIC_REGION4],
757
+ onto: [EVOKES_NORDIC4],
758
+ source: DS_PRODUCTS,
759
+ term: "Scandinavian",
760
+ verdict: DECOMPOSED4
761
+ },
762
+ {
763
+ mintedTerm: [TRANSITIONAL],
764
+ onto: [TRANSITIONAL],
765
+ source: DS_PRODUCTS,
766
+ term: "Transitional",
767
+ verdict: DECOMPOSED4
768
+ },
769
+ {
770
+ note: "The stray space is verbatim. It stops this value string-matching the same company's own scheme-side `Traditional`, inside the same capture.",
771
+ onto: [TRADITIONAL3],
772
+ source: DS_PRODUCTS,
773
+ term: "Classic/ Traditional",
774
+ verdict: DECOMPOSED4
775
+ },
776
+ {
777
+ onto: [ART_DECO4],
778
+ source: DS_PRODUCTS,
779
+ term: "Art Deco",
780
+ verdict: DECOMPOSED4
781
+ },
782
+ {
783
+ mintedTerm: [ECLECTIC],
784
+ onto: [ECLECTIC],
785
+ source: DS_PRODUCTS,
786
+ term: "Eclectic",
787
+ verdict: DECOMPOSED4
788
+ },
789
+ {
790
+ mintedAxis: [COASTAL_LANDSCAPE3],
791
+ onto: [EVOKES_COASTAL3],
792
+ source: DS_PRODUCTS,
793
+ term: "Coastal",
794
+ verdict: DECOMPOSED4
795
+ },
796
+ {
797
+ onto: [RUSTIC4],
798
+ source: DS_PRODUCTS,
799
+ term: "Rustic",
800
+ verdict: DECOMPOSED4
801
+ },
802
+ {
803
+ mintedAxis: ["typology.cottage"],
804
+ note: "Resolves where the scheme-side `Country` does not, because `Cottage` pins it to a typology. The same company's two vocabularies are not equally mappable.",
805
+ onto: ["evokes(typology.cottage)", TRADITIONAL3],
806
+ source: DS_PRODUCTS,
807
+ term: "Country/ Cottage",
808
+ verdict: DECOMPOSED4
809
+ },
810
+ {
811
+ onto: [INDUSTRIAL4],
812
+ source: DS_PRODUCTS,
813
+ term: "Industrial",
814
+ verdict: DECOMPOSED4
815
+ },
816
+ {
817
+ onto: [MCM4],
818
+ source: DS_PRODUCTS,
819
+ term: "Mid-Century Modern",
820
+ verdict: DECOMPOSED4
821
+ },
822
+ {
823
+ mintedAxis: ["typology.farmhouse"],
824
+ onto: [EVOKES_FARMHOUSE, RUSTIC4],
825
+ source: DS_PRODUCTS,
826
+ term: "Farmhouse",
827
+ verdict: DECOMPOSED4
828
+ }
829
+ ];
830
+
831
+ // src/estate/rows/materialgraph.ts
832
+ var MS_STYLE = "materialgraph.ms_style";
833
+ var MS_MOOD = "materialgraph.ms_mood";
834
+ var MS_CHARACTER = "materialgraph.ms_character";
835
+ var OUT_OF_AXIS3 = "out-of-axis";
836
+ var MATERIAL_PROPERTY2 = "material-property";
837
+ var DECOMPOSED5 = "decomposed";
838
+ var NORDIC_REGION5 = "place.region.nordic";
839
+ var COASTAL_LANDSCAPE4 = "place.landscape.coastal";
840
+ var PLAYFUL2 = "mood.playful";
841
+ var MOODY3 = "mood.moody";
842
+ var MINIMALISM5 = "style.minimalism";
843
+ var CONTEMPORARY5 = "style.contemporary";
844
+ var TRADITIONAL4 = "style.traditional";
845
+ var RUSTIC5 = "style.rustic";
846
+ var INDUSTRIAL5 = "style.industrial";
847
+ var MCM5 = "style.mid_century_modern";
848
+ var LUXURIOUS3 = "mood.luxurious";
849
+ var SOFT_MOOD2 = "mood.soft";
850
+ var CALM2 = "mood.calm";
851
+ var WARM3 = "palette.temperature.warm";
852
+ var EVOKES_NORDIC5 = "evokes(place.region.nordic)";
853
+ var EVOKES_COASTAL4 = "evokes(place.landscape.coastal)";
854
+ var AUSTERE2 = "mood.austere";
855
+ var EVOKES_MONASTERY2 = "evokes(typology.monastery)";
856
+ var MATERIALGRAPH_ROWS = [
857
+ // ─── materialgraph · ms_style (17) ─────────────────────────────────────────────────────────
858
+ {
859
+ note: "One of the two independent mintings of `warm minimalism` across the estate. It composes here, which is the whole point of separating temperature from style.",
860
+ onto: [MINIMALISM5, WARM3],
861
+ source: MS_STYLE,
862
+ term: "minimal_warm",
863
+ verdict: DECOMPOSED5
864
+ },
865
+ {
866
+ onto: [MINIMALISM5, "palette.temperature.cool"],
867
+ source: MS_STYLE,
868
+ term: "minimal_cool",
869
+ verdict: DECOMPOSED5
870
+ },
871
+ {
872
+ note: "Reads as consumer-modern, not Modernism. Mapped to `contemporary` on the strength of the dictionary's own pairing with `classic_tailored`.",
873
+ onto: [CONTEMPORARY5, SOFT_MOOD2],
874
+ source: MS_STYLE,
875
+ term: "soft_modern",
876
+ verdict: DECOMPOSED5
877
+ },
878
+ {
879
+ onto: [TRADITIONAL4, "mood.crisp"],
880
+ source: MS_STYLE,
881
+ term: "classic_tailored",
882
+ verdict: DECOMPOSED5
883
+ },
884
+ {
885
+ mintedTerm: [LUXURIOUS3],
886
+ onto: ["sector.residential", LUXURIOUS3],
887
+ source: MS_STYLE,
888
+ term: "residential_luxury",
889
+ verdict: DECOMPOSED5
890
+ },
891
+ {
892
+ mintedTerm: [LUXURIOUS3],
893
+ note: "Sector welded into style. Both halves land on axes that already existed.",
894
+ onto: ["sector.hospitality", LUXURIOUS3],
895
+ source: MS_STYLE,
896
+ term: "hospitality_luxury",
897
+ verdict: DECOMPOSED5
898
+ },
899
+ {
900
+ onto: ["style.organic_modernism", CALM2],
901
+ source: MS_STYLE,
902
+ term: "quiet_organic",
903
+ verdict: DECOMPOSED5
904
+ },
905
+ {
906
+ mintedAxis: ["typology.monastery"],
907
+ mintedTerm: [AUSTERE2],
908
+ onto: [EVOKES_MONASTERY2, AUSTERE2, MINIMALISM5],
909
+ source: MS_STYLE,
910
+ term: "monastic",
911
+ verdict: DECOMPOSED5
912
+ },
913
+ {
914
+ onto: [INDUSTRIAL5, "ms_character.refined (material axis)"],
915
+ source: MS_STYLE,
916
+ term: "industrial_refined",
917
+ verdict: DECOMPOSED5
918
+ },
919
+ {
920
+ note: "ms_character.crafted. A claim about how a material was made, carried in a style enum.",
921
+ onto: [],
922
+ reason: MATERIAL_PROPERTY2,
923
+ source: MS_STYLE,
924
+ term: "craft_forward",
925
+ verdict: OUT_OF_AXIS3
926
+ },
927
+ {
928
+ onto: [TRADITIONAL4],
929
+ source: MS_STYLE,
930
+ term: "decorative_traditional",
931
+ verdict: DECOMPOSED5
932
+ },
933
+ {
934
+ onto: [PLAYFUL2, "ms_pattern_type.abstract_graphic (material axis)"],
935
+ source: MS_STYLE,
936
+ term: "playful_graphic",
937
+ verdict: DECOMPOSED5
938
+ },
939
+ {
940
+ mintedAxis: ["typology.gallery"],
941
+ onto: [MINIMALISM5, "evokes(typology.gallery)"],
942
+ source: MS_STYLE,
943
+ term: "gallery_minimal",
944
+ verdict: DECOMPOSED5
945
+ },
946
+ {
947
+ mintedAxis: [COASTAL_LANDSCAPE4],
948
+ onto: [EVOKES_COASTAL4, SOFT_MOOD2],
949
+ source: MS_STYLE,
950
+ term: "coastal_soft",
951
+ verdict: DECOMPOSED5
952
+ },
953
+ {
954
+ onto: ["sector.workplace", CONTEMPORARY5],
955
+ source: MS_STYLE,
956
+ term: "workplace_contemporary",
957
+ verdict: DECOMPOSED5
958
+ },
959
+ {
960
+ onto: [MCM5],
961
+ source: MS_STYLE,
962
+ term: "mid_century_modern",
963
+ verdict: DECOMPOSED5
964
+ },
965
+ {
966
+ mintedAxis: [NORDIC_REGION5],
967
+ onto: [EVOKES_NORDIC5, WARM3],
968
+ source: MS_STYLE,
969
+ term: "nordic_warm",
970
+ verdict: DECOMPOSED5
971
+ },
972
+ // ─── materialgraph · ms_mood (14) - the one axis that already worked ───────────────────────
973
+ {
974
+ onto: ["mood.grounded"],
975
+ source: MS_MOOD,
976
+ term: "grounded",
977
+ verdict: DECOMPOSED5
978
+ },
979
+ { onto: [CALM2], source: MS_MOOD, term: "calm", verdict: DECOMPOSED5 },
980
+ { onto: [SOFT_MOOD2], source: MS_MOOD, term: "soft", verdict: DECOMPOSED5 },
981
+ { onto: ["mood.crisp"], source: MS_MOOD, term: "crisp", verdict: DECOMPOSED5 },
982
+ { onto: [MOODY3], source: MS_MOOD, term: "moody", verdict: DECOMPOSED5 },
983
+ { onto: ["mood.airy"], source: MS_MOOD, term: "airy", verdict: DECOMPOSED5 },
984
+ {
985
+ onto: ["mood.sensual"],
986
+ source: MS_MOOD,
987
+ term: "sensual",
988
+ verdict: DECOMPOSED5
989
+ },
990
+ {
991
+ onto: ["mood.serious"],
992
+ source: MS_MOOD,
993
+ term: "serious",
994
+ verdict: DECOMPOSED5
995
+ },
996
+ {
997
+ onto: [PLAYFUL2],
998
+ source: MS_MOOD,
999
+ term: "playful",
1000
+ verdict: DECOMPOSED5
1001
+ },
1002
+ {
1003
+ onto: ["mood.sheltering"],
1004
+ source: MS_MOOD,
1005
+ term: "sheltering",
1006
+ verdict: DECOMPOSED5
1007
+ },
1008
+ {
1009
+ onto: ["mood.quiet_luxury"],
1010
+ source: MS_MOOD,
1011
+ term: "quiet_luxury",
1012
+ verdict: DECOMPOSED5
1013
+ },
1014
+ {
1015
+ onto: ["mood.editorial"],
1016
+ source: MS_MOOD,
1017
+ term: "editorial",
1018
+ verdict: DECOMPOSED5
1019
+ },
1020
+ {
1021
+ onto: ["mood.domestic"],
1022
+ source: MS_MOOD,
1023
+ term: "domestic",
1024
+ verdict: DECOMPOSED5
1025
+ },
1026
+ {
1027
+ onto: ["mood.monumental"],
1028
+ source: MS_MOOD,
1029
+ term: "monumental",
1030
+ verdict: DECOMPOSED5
1031
+ },
1032
+ // ─── materialgraph · ms_character (13) - a MATERIAL axis, swept into a style census ────────
1033
+ {
1034
+ onto: [CALM2],
1035
+ source: MS_CHARACTER,
1036
+ term: "quiet",
1037
+ verdict: DECOMPOSED5
1038
+ },
1039
+ {
1040
+ note: "A material can be expressive in a calm room. Mapping it to a room mood inverts the claim.",
1041
+ onto: [],
1042
+ reason: MATERIAL_PROPERTY2,
1043
+ source: MS_CHARACTER,
1044
+ term: "expressive",
1045
+ verdict: OUT_OF_AXIS3
1046
+ },
1047
+ {
1048
+ onto: [],
1049
+ reason: MATERIAL_PROPERTY2,
1050
+ source: MS_CHARACTER,
1051
+ term: "restrained",
1052
+ verdict: OUT_OF_AXIS3
1053
+ },
1054
+ {
1055
+ onto: [],
1056
+ reason: MATERIAL_PROPERTY2,
1057
+ source: MS_CHARACTER,
1058
+ term: "bold",
1059
+ verdict: OUT_OF_AXIS3
1060
+ },
1061
+ {
1062
+ note: "Genuinely does double duty at both scales.",
1063
+ onto: [RUSTIC5],
1064
+ source: MS_CHARACTER,
1065
+ term: "rustic",
1066
+ verdict: DECOMPOSED5
1067
+ },
1068
+ {
1069
+ onto: [],
1070
+ reason: MATERIAL_PROPERTY2,
1071
+ source: MS_CHARACTER,
1072
+ term: "crafted",
1073
+ verdict: OUT_OF_AXIS3
1074
+ },
1075
+ {
1076
+ onto: [],
1077
+ reason: MATERIAL_PROPERTY2,
1078
+ source: MS_CHARACTER,
1079
+ term: "refined",
1080
+ verdict: OUT_OF_AXIS3
1081
+ },
1082
+ {
1083
+ note: "A formal dining room is a real room-scale claim, but `serious` understates the social convention `formal` carries.",
1084
+ onto: ["mood.serious"],
1085
+ source: MS_CHARACTER,
1086
+ term: "formal",
1087
+ verdict: "lossy"
1088
+ },
1089
+ {
1090
+ onto: ["mood.domestic"],
1091
+ source: MS_CHARACTER,
1092
+ term: "casual",
1093
+ verdict: "lossy"
1094
+ },
1095
+ {
1096
+ onto: [],
1097
+ reason: MATERIAL_PROPERTY2,
1098
+ source: MS_CHARACTER,
1099
+ term: "natural_reading",
1100
+ verdict: OUT_OF_AXIS3
1101
+ },
1102
+ {
1103
+ onto: [],
1104
+ reason: MATERIAL_PROPERTY2,
1105
+ source: MS_CHARACTER,
1106
+ term: "synthetic_reading",
1107
+ verdict: OUT_OF_AXIS3
1108
+ },
1109
+ {
1110
+ onto: [],
1111
+ reason: MATERIAL_PROPERTY2,
1112
+ source: MS_CHARACTER,
1113
+ term: "soft_reading",
1114
+ verdict: OUT_OF_AXIS3
1115
+ },
1116
+ {
1117
+ onto: [],
1118
+ reason: MATERIAL_PROPERTY2,
1119
+ source: MS_CHARACTER,
1120
+ term: "hard_reading",
1121
+ verdict: OUT_OF_AXIS3
1122
+ }
1123
+ ];
1124
+
1125
+ // src/estate/rows/samplize.ts
1126
+ var SAMPLIZE = "samplize.colour_collections";
1127
+ var DECOMPOSED6 = "decomposed";
1128
+ var SAMPLIZE_ROWS = [
1129
+ { onto: ["palette.hue.white"], source: SAMPLIZE, term: "white", verdict: DECOMPOSED6 },
1130
+ { onto: ["palette.hue.beige"], source: SAMPLIZE, term: "beige", verdict: DECOMPOSED6 },
1131
+ { onto: ["palette.hue.taupe"], source: SAMPLIZE, term: "taupe", verdict: DECOMPOSED6 },
1132
+ {
1133
+ note: "US spelling. The canon's id is `gray`, following colorscope verbatim, with the label set in British English. Ids follow the upstream source of truth; the spelling preference lives in the label.",
1134
+ onto: ["palette.hue.gray"],
1135
+ source: SAMPLIZE,
1136
+ term: "gray",
1137
+ verdict: DECOMPOSED6
1138
+ },
1139
+ { onto: ["palette.hue.green"], source: SAMPLIZE, term: "green", verdict: DECOMPOSED6 },
1140
+ { onto: ["palette.hue.blue"], source: SAMPLIZE, term: "blue", verdict: DECOMPOSED6 },
1141
+ { onto: ["palette.hue.red"], source: SAMPLIZE, term: "red", verdict: DECOMPOSED6 },
1142
+ { onto: ["palette.hue.yellow"], source: SAMPLIZE, term: "yellow", verdict: DECOMPOSED6 },
1143
+ { onto: ["palette.hue.orange"], source: SAMPLIZE, term: "orange", verdict: DECOMPOSED6 },
1144
+ {
1145
+ note: "Not a hue. A consumer browsing paint treats neutral as a shelf beside green and blue, and the canon files it as an absence of cast on a different facet - which is the right model and a worse shopping experience.",
1146
+ onto: ["palette.temperature.neutral"],
1147
+ source: SAMPLIZE,
1148
+ term: "neutral",
1149
+ verdict: DECOMPOSED6
1150
+ },
1151
+ {
1152
+ note: "The same compound materia spells `earthy`, arrived at independently by a shopping surface. Two repositories inventing one compound is the pattern this canon exists to stop.",
1153
+ onto: ["palette.hue.brown", "palette.character.muted", "palette.temperature.warm"],
1154
+ source: SAMPLIZE,
1155
+ term: "earthy-tones",
1156
+ verdict: DECOMPOSED6
1157
+ },
1158
+ { onto: ["palette.character.light"], source: SAMPLIZE, term: "light", verdict: DECOMPOSED6 },
1159
+ {
1160
+ note: "The largest band in the catalogue. The canon had no midpoint until this row forced the check - and the check found colorscope already governs one, spelled `mid`. Samplize's `medium` is recorded as a variant rather than minted as a term.",
1161
+ onto: ["palette.character.mid"],
1162
+ source: SAMPLIZE,
1163
+ term: "medium",
1164
+ verdict: DECOMPOSED6
1165
+ },
1166
+ { onto: ["palette.character.dark"], source: SAMPLIZE, term: "dark", verdict: DECOMPOSED6 }
1167
+ ];
1168
+
1169
+ // src/estate/rows/index.ts
1170
+ var DECOMPOSITION = [
1171
+ ...MATERIA_ROWS,
1172
+ ...ARCHITIZER_ROWS,
1173
+ ...DESIGNROUND_ROWS,
1174
+ ...DESIGNSHOP_ROWS,
1175
+ ...MATERIALGRAPH_ROWS,
1176
+ ...SAMPLIZE_ROWS
1177
+ ];
1178
+
1179
+ // src/estate/sources.ts
1180
+ var MS_AESTHETICS = "packages/schema/src/registry/value-dictionaries/material-semantics-aesthetics.ts";
1181
+ var CAPTURED = "captured-free-text";
1182
+ var MATERIALGRAPH = "materialgraph";
1183
+ var SNAPSHOT = "2026-08-21";
1184
+ var DESIGNSHOP_SNAPSHOT = "2026-08-18";
1185
+ var MATERIA_SCENE_MOOD = {
1186
+ file: "packages/vision/src/scene-planner.ts",
1187
+ id: "materia.scene_mood",
1188
+ kind: "enum",
1189
+ name: "materia \xB7 SceneMoodSchema",
1190
+ purpose: "The mood a generated room render should be planned in. Every value is a compound: place, palette and style welded into one token.",
1191
+ repo: "materia",
1192
+ snapshot: SNAPSHOT,
1193
+ terms: [
1194
+ "serene-minimal",
1195
+ "warm-traditional",
1196
+ "moody-saturated",
1197
+ "sun-bleached-mediterranean",
1198
+ "soft-japandi",
1199
+ "tactile-monastic",
1200
+ "art-deco-luxe",
1201
+ "commercial-spec",
1202
+ "material-led"
1203
+ ]
1204
+ };
1205
+ var MATERIA_INTENT_KEYWORDS = {
1206
+ file: "packages/search/src/product-search/classify-query.ts",
1207
+ id: "materia.intent_keywords",
1208
+ kind: "keyword-set",
1209
+ name: "materia \xB7 INTENT_KEYWORDS",
1210
+ purpose: "Words that route a search query to vector retrieval rather than BM25 alone. Not authored as a vocabulary at all - it mixes style, mood, colour, sector, room and bare query-intent markers in one flat set, because any of them signals the same thing to the router.",
1211
+ repo: "materia",
1212
+ snapshot: SNAPSHOT,
1213
+ terms: [
1214
+ "chalky",
1215
+ "coastal",
1216
+ "cognac",
1217
+ "earthy",
1218
+ "interesting",
1219
+ "moody",
1220
+ "playful",
1221
+ "quiet",
1222
+ "soft",
1223
+ "performance",
1224
+ "cleanable",
1225
+ "healthcare",
1226
+ "patterned",
1227
+ "faded",
1228
+ "warm",
1229
+ "cool",
1230
+ "modern",
1231
+ "rustic",
1232
+ "minimalist",
1233
+ "industrial",
1234
+ "hotel",
1235
+ "lobby",
1236
+ "spa",
1237
+ "boutique",
1238
+ "cozy",
1239
+ "luxurious",
1240
+ "vibe",
1241
+ "aesthetic",
1242
+ "feel",
1243
+ "style",
1244
+ "like",
1245
+ "similar",
1246
+ "mid-century",
1247
+ "contemporary",
1248
+ "traditional",
1249
+ "scandinavian",
1250
+ "mediterranean"
1251
+ ]
1252
+ };
1253
+ var ARCHITIZER_STYLES = {
1254
+ file: "packages/db/src/projects/qualities/vocab.ts",
1255
+ id: "architizer.styles",
1256
+ kind: "enum",
1257
+ name: "architizer \xB7 STYLES",
1258
+ purpose: "Architectural idiom, extracted from project prose by an LLM constrained to this enum. Periods, movements and regional schools, deliberately mixed: the prompt calls style the one soft dimension and asks for a defensible reading even where the prose names no movement.",
1259
+ repo: "architizer",
1260
+ snapshot: SNAPSHOT,
1261
+ terms: [
1262
+ "Modernist",
1263
+ "Mid-century modern",
1264
+ "Brutalist",
1265
+ "Minimalist",
1266
+ "Rationalist",
1267
+ "Postmodern",
1268
+ "Deconstructivist",
1269
+ "Parametric",
1270
+ "High-tech",
1271
+ "Industrial",
1272
+ "Constructivist",
1273
+ "Vernacular",
1274
+ "Critical regionalist",
1275
+ "Tropical modernism",
1276
+ "Nordic modern",
1277
+ "Japanese contemporary",
1278
+ "Mediterranean",
1279
+ "Traditional",
1280
+ "Neoclassical",
1281
+ "Gothic",
1282
+ "Art Deco",
1283
+ "Organic",
1284
+ "Biophilic",
1285
+ "Sculptural",
1286
+ "Rustic"
1287
+ ]
1288
+ };
1289
+ var DESIGNROUND_STYLE_ANCHORS = {
1290
+ file: "packages/ingestion/src/seed-anchors.ts",
1291
+ id: "designround.style_anchors",
1292
+ kind: "embedding-anchor",
1293
+ name: "designround \xB7 STYLE_ANCHORS",
1294
+ purpose: "Editorial compounds seeded as embedding anchors for image retrieval. Each label fronts a paragraph of prose; the label is a handle for humans and the prose is what actually matches.",
1295
+ repo: "designround",
1296
+ snapshot: SNAPSHOT,
1297
+ terms: [
1298
+ "Warm Minimalism",
1299
+ "English Country",
1300
+ "Modern Maximalism",
1301
+ "Contemporary Luxury",
1302
+ "Coastal & Natural",
1303
+ "Mid-Century Modern",
1304
+ "Industrial & Raw",
1305
+ "Classical & Grand",
1306
+ "Scandinavian",
1307
+ "Rustic & Artisan",
1308
+ "Art Deco & Glamour",
1309
+ "Moody & Dramatic"
1310
+ ]
1311
+ };
1312
+ var DESIGNSHOP_SCHEME_STYLES = {
1313
+ file: "derived/room-schemes.json (field `style`)",
1314
+ id: "designshop.scheme_styles",
1315
+ kind: CAPTURED,
1316
+ name: "designshop \xB7 roomStyle",
1317
+ // The scheme total is deliberately not repeated here. It lives in the comment on
1318
+ // `DESIGNSHOP_SCHEME_STYLE_COUNTS` below, which is the input the usage bands are computed from
1319
+ // and has to keep its numbers. This field is prose written for a reader, so it takes the band.
1320
+ purpose: "The single style a merchandiser assigned to a published room scheme. The only vocabulary in the estate with real consumer usage behind it, at the scale of a full merchandised catalogue.",
1321
+ repo: "designshop",
1322
+ snapshot: DESIGNSHOP_SNAPSHOT,
1323
+ terms: [
1324
+ "Contemporary",
1325
+ "Modern",
1326
+ "Traditional",
1327
+ "Transitional",
1328
+ "Eclectic",
1329
+ "Minimalist",
1330
+ "Country",
1331
+ "Farmhouse",
1332
+ "Coastal"
1333
+ ]
1334
+ };
1335
+ var DESIGNSHOP_SCHEME_STYLE_COUNTS = {
1336
+ Coastal: 73,
1337
+ Contemporary: 366,
1338
+ Country: 117,
1339
+ Eclectic: 159,
1340
+ Farmhouse: 113,
1341
+ Minimalist: 130,
1342
+ Modern: 348,
1343
+ Traditional: 335,
1344
+ Transitional: 237
1345
+ };
1346
+ var DESIGNSHOP_PRODUCT_STYLES = {
1347
+ file: "derived/products.csv (column `style`)",
1348
+ id: "designshop.product_styles",
1349
+ kind: CAPTURED,
1350
+ name: "designshop \xB7 attributes.Style",
1351
+ purpose: "The styles a product may be tagged with, multi-valued. A DIFFERENT vocabulary from the same company's room schemes, inside the same capture: it is larger, multi-select, and two of its values carry a stray space that stops them string-matching anything.",
1352
+ repo: "designshop",
1353
+ snapshot: DESIGNSHOP_SNAPSHOT,
1354
+ terms: [
1355
+ "Contemporary",
1356
+ "Modern",
1357
+ "Minimalist",
1358
+ "Scandinavian",
1359
+ "Transitional",
1360
+ "Classic/ Traditional",
1361
+ "Art Deco",
1362
+ "Eclectic",
1363
+ "Coastal",
1364
+ "Rustic",
1365
+ "Country/ Cottage",
1366
+ "Industrial",
1367
+ "Mid-Century Modern",
1368
+ "Farmhouse"
1369
+ ]
1370
+ };
1371
+ var MATERIALGRAPH_MS_STYLE = {
1372
+ file: MS_AESTHETICS,
1373
+ id: "materialgraph.ms_style",
1374
+ kind: "enum",
1375
+ name: "materialgraph \xB7 ms_style",
1376
+ purpose: `Coarse style families for retrieval. The dictionary's own description is unusually honest about what it is: "routing handles, not editorial truths".`,
1377
+ repo: MATERIALGRAPH,
1378
+ snapshot: SNAPSHOT,
1379
+ terms: [
1380
+ "minimal_warm",
1381
+ "minimal_cool",
1382
+ "soft_modern",
1383
+ "classic_tailored",
1384
+ "residential_luxury",
1385
+ "hospitality_luxury",
1386
+ "quiet_organic",
1387
+ "monastic",
1388
+ "industrial_refined",
1389
+ "craft_forward",
1390
+ "decorative_traditional",
1391
+ "playful_graphic",
1392
+ "gallery_minimal",
1393
+ "coastal_soft",
1394
+ "workplace_contemporary",
1395
+ "mid_century_modern",
1396
+ "nordic_warm"
1397
+ ]
1398
+ };
1399
+ var MATERIALGRAPH_MS_MOOD = {
1400
+ file: MS_AESTHETICS,
1401
+ id: "materialgraph.ms_mood",
1402
+ kind: "enum",
1403
+ name: "materialgraph \xB7 ms_mood",
1404
+ purpose: "Atmospheric mood descriptors, multi-select. The best-separated axis in the estate.",
1405
+ repo: MATERIALGRAPH,
1406
+ snapshot: SNAPSHOT,
1407
+ terms: [
1408
+ "grounded",
1409
+ "calm",
1410
+ "soft",
1411
+ "crisp",
1412
+ "moody",
1413
+ "airy",
1414
+ "sensual",
1415
+ "serious",
1416
+ "playful",
1417
+ "sheltering",
1418
+ "quiet_luxury",
1419
+ "editorial",
1420
+ "domestic",
1421
+ "monumental"
1422
+ ]
1423
+ };
1424
+ var MATERIALGRAPH_MS_CHARACTER = {
1425
+ file: MS_AESTHETICS,
1426
+ id: "materialgraph.ms_character",
1427
+ kind: "enum",
1428
+ name: "materialgraph \xB7 ms_character",
1429
+ purpose: "The material's presence and reading, held deliberately apart from mood. A material axis, not an interiors one - which is why four of its terms decompose nowhere on the room-scale axes.",
1430
+ repo: MATERIALGRAPH,
1431
+ snapshot: SNAPSHOT,
1432
+ terms: [
1433
+ "quiet",
1434
+ "expressive",
1435
+ "restrained",
1436
+ "bold",
1437
+ "rustic",
1438
+ "crafted",
1439
+ "refined",
1440
+ "formal",
1441
+ "casual",
1442
+ "natural_reading",
1443
+ "synthetic_reading",
1444
+ "soft_reading",
1445
+ "hard_reading"
1446
+ ]
1447
+ };
1448
+ var SAMPLIZE_COLOUR_COLLECTIONS = {
1449
+ file: "raw/samplize-shopify-products.jsonl.gz (Shopify `collections`)",
1450
+ id: "samplize.colour_collections",
1451
+ kind: CAPTURED,
1452
+ name: "samplize \xB7 colour collections",
1453
+ purpose: "How a sampling channel groups its peel-and-stick paint samples for browsing. Not a style vocabulary at all, which is why the first census missed it - it is a COLOUR vocabulary, and the only one in the estate built from what consumers actually shop by rather than from what a designer would say.",
1454
+ repo: "samplize",
1455
+ snapshot: DESIGNSHOP_SNAPSHOT,
1456
+ terms: [
1457
+ "white",
1458
+ "beige",
1459
+ "taupe",
1460
+ "gray",
1461
+ "neutral",
1462
+ "green",
1463
+ "blue",
1464
+ "red",
1465
+ "yellow",
1466
+ "orange",
1467
+ "earthy-tones",
1468
+ "light",
1469
+ "medium",
1470
+ "dark"
1471
+ ]
1472
+ };
1473
+ var ESTATE_VOCABULARIES = [
1474
+ MATERIA_SCENE_MOOD,
1475
+ MATERIA_INTENT_KEYWORDS,
1476
+ ARCHITIZER_STYLES,
1477
+ DESIGNROUND_STYLE_ANCHORS,
1478
+ DESIGNSHOP_SCHEME_STYLES,
1479
+ DESIGNSHOP_PRODUCT_STYLES,
1480
+ MATERIALGRAPH_MS_STYLE,
1481
+ MATERIALGRAPH_MS_MOOD,
1482
+ MATERIALGRAPH_MS_CHARACTER,
1483
+ SAMPLIZE_COLOUR_COLLECTIONS
1484
+ ];
1485
+
1486
+ // src/estate/concepts.ts
1487
+ var ESTATE_REPOS = [
1488
+ "materia",
1489
+ "architizer",
1490
+ "designround",
1491
+ "designshop",
1492
+ "materialgraph",
1493
+ "samplize"
1494
+ ];
1495
+ var REPO_OF = {
1496
+ "architizer.styles": "architizer",
1497
+ "designround.style_anchors": "designround",
1498
+ "designshop.product_styles": "designshop",
1499
+ "designshop.scheme_styles": "designshop",
1500
+ "materia.intent_keywords": "materia",
1501
+ "materia.scene_mood": "materia",
1502
+ "materialgraph.ms_character": "materialgraph",
1503
+ "materialgraph.ms_mood": "materialgraph",
1504
+ "materialgraph.ms_style": "materialgraph",
1505
+ "samplize.colour_collections": "samplize"
1506
+ };
1507
+ var wordForm = (term) => term.toLowerCase().replaceAll(/[_-]+/gu, " ").replaceAll(/[&/]/gu, " ").replaceAll(/\s+/gu, " ").trim();
1508
+ var EVOKES = /^evokes\((?<target>.+)\)$/u;
1509
+ var resolveHead = (assertion) => {
1510
+ if (assertion.includes("(material axis)")) {
1511
+ return void 0;
1512
+ }
1513
+ const match = EVOKES.exec(assertion);
1514
+ return match?.groups?.target === void 0 ? { canonical: assertion, viaEvokes: false } : { canonical: match.groups.target, viaEvokes: true };
1515
+ };
1516
+ var heads = (row) => {
1517
+ const [first] = row.onto;
1518
+ if (first !== void 0) {
1519
+ const resolved2 = resolveHead(first);
1520
+ return resolved2 === void 0 ? [] : [resolved2];
1521
+ }
1522
+ const resolved = row.alternatives?.alternatives.flatMap(
1523
+ (alternative) => alternative.members.flatMap(({ assertion }) => {
1524
+ const candidate = resolveHead(assertion);
1525
+ return candidate === void 0 ? [] : [candidate];
1526
+ })
1527
+ );
1528
+ return resolved ?? [];
1529
+ };
1530
+ var axisOf = (canonical) => canonical.split(".")[0] ?? canonical;
1531
+ var concepts = () => {
1532
+ const grouped = /* @__PURE__ */ new Map();
1533
+ for (const row of DECOMPOSITION) {
1534
+ const resolvedHeads = heads(row);
1535
+ if (resolvedHeads.length === 0) {
1536
+ continue;
1537
+ }
1538
+ const repo = REPO_OF[row.source];
1539
+ if (repo === void 0) {
1540
+ throw new Error(`estate source has no repository: ${row.source}`);
1541
+ }
1542
+ for (const resolved of resolvedHeads) {
1543
+ const existing = grouped.get(resolved.canonical) ?? {
1544
+ cells: [],
1545
+ viaEvokes: resolved.viaEvokes
1546
+ };
1547
+ existing.cells.push({ repo, row, source: row.source, term: row.term });
1548
+ grouped.set(resolved.canonical, existing);
1549
+ }
1550
+ }
1551
+ const reposByAxis = /* @__PURE__ */ new Map();
1552
+ for (const [canonical, { cells }] of grouped) {
1553
+ const axis = axisOf(canonical);
1554
+ const repos = reposByAxis.get(axis) ?? /* @__PURE__ */ new Set();
1555
+ for (const cell of cells) {
1556
+ repos.add(cell.repo);
1557
+ }
1558
+ reposByAxis.set(axis, repos);
1559
+ }
1560
+ return [...grouped].map(([canonical, { cells, viaEvokes }]) => ({
1561
+ anchors: cells.filter((cell) => cell.row.verdict === "lossy").length,
1562
+ canonical,
1563
+ cells,
1564
+ couldReach: reposByAxis.get(axisOf(canonical))?.size ?? 1,
1565
+ declines: cells.filter((cell) => cell.row.verdict === "ambiguous").length,
1566
+ reach: new Set(cells.map((cell) => cell.repo)).size,
1567
+ viaEvokes,
1568
+ wordings: new Set(cells.map((cell) => wordForm(cell.term))).size
1569
+ })).toSorted(
1570
+ (a, b) => b.reach - a.reach || b.cells.length - a.cells.length || a.canonical.localeCompare(b.canonical)
1571
+ );
1572
+ };
1573
+ var disagreementsByAxis = ({
1574
+ minConcepts = 4
1575
+ } = {}) => {
1576
+ const byAxis = /* @__PURE__ */ new Map();
1577
+ for (const concept of concepts()) {
1578
+ const axis = axisOf(concept.canonical);
1579
+ byAxis.set(axis, [...byAxis.get(axis) ?? [], concept]);
1580
+ }
1581
+ const reposSpeaking = (axisConcepts) => {
1582
+ const speaking = /* @__PURE__ */ new Set();
1583
+ for (const concept of axisConcepts) {
1584
+ for (const cell of concept.cells) {
1585
+ speaking.add(cell.repo);
1586
+ }
1587
+ }
1588
+ return ESTATE_REPOS.filter((repo) => speaking.has(repo));
1589
+ };
1590
+ return [...byAxis].map(([axis, axisConcepts]) => ({
1591
+ axis,
1592
+ concepts: axisConcepts,
1593
+ repos: reposSpeaking(axisConcepts),
1594
+ shared: axisConcepts.filter((concept) => concept.reach > 1).length
1595
+ })).filter((entry) => entry.repos.length > 1 && entry.concepts.length >= minConcepts).toSorted((a, b) => b.shared - a.shared || b.concepts.length - a.concepts.length);
1596
+ };
1597
+ var MATRIX_COLUMNS = ESTATE_VOCABULARIES.map((vocabulary) => {
1598
+ const repo = REPO_OF[vocabulary.id];
1599
+ if (repo === void 0) {
1600
+ throw new Error(`estate vocabulary has no repository: ${vocabulary.id}`);
1601
+ }
1602
+ return { id: vocabulary.id, label: vocabulary.name, repo };
1603
+ });
1604
+ var agreementSummary = () => {
1605
+ const all = concepts();
1606
+ const spellings = new Set(DECOMPOSITION.map((row) => row.term.toLowerCase().trim()));
1607
+ const byRepo = /* @__PURE__ */ new Map();
1608
+ for (const row of DECOMPOSITION) {
1609
+ const folded = row.term.toLowerCase().trim();
1610
+ const repos = byRepo.get(folded) ?? /* @__PURE__ */ new Set();
1611
+ const repo = REPO_OF[row.source];
1612
+ if (repo !== void 0) {
1613
+ repos.add(repo);
1614
+ }
1615
+ byRepo.set(folded, repos);
1616
+ }
1617
+ const shared = all.filter((concept) => concept.reach > 1);
1618
+ return {
1619
+ concepts: all.length,
1620
+ distinctSpellings: spellings.size,
1621
+ exactStringMatchesAcrossRepos: [...byRepo.values()].filter((repos) => repos.size > 1).length,
1622
+ reachedByAll: all.filter((concept) => concept.reach === concept.couldReach).length,
1623
+ reachedByFourOrMore: all.filter((concept) => concept.reach >= 4).length,
1624
+ repos: ESTATE_REPOS.length,
1625
+ shared: shared.length,
1626
+ spellingOnly: shared.filter((concept) => concept.wordings === 1).length
1627
+ };
1628
+ };
1629
+ var ambiguousStyleShare = () => {
1630
+ const counts = Object.values(DESIGNSHOP_SCHEME_STYLE_COUNTS);
1631
+ const total = counts.reduce((sum, count) => sum + count, 0);
1632
+ const ambiguous = (DESIGNSHOP_SCHEME_STYLE_COUNTS.Modern ?? 0) + (DESIGNSHOP_SCHEME_STYLE_COUNTS.Contemporary ?? 0);
1633
+ return Math.round(ambiguous / total * 100);
1634
+ };
1635
+
1636
+ // src/estate/residue-report.ts
1637
+ var isExcluded = (row) => row.verdict === "out-of-axis" && (row.reason === "query-marker" || row.reason === "material-property");
1638
+ var AESTHETIC = DECOMPOSITION.filter((row) => !isExcluded(row));
1639
+ var countBy = (rows, verdict) => rows.filter((row) => row.verdict === verdict).length;
1640
+ var needsMinting = (row) => (row.mintedTerm?.length ?? 0) > 0 || (row.mintedAxis?.length ?? 0) > 0;
1641
+ var residueReport = () => {
1642
+ const aesthetic = AESTHETIC.length;
1643
+ const decomposed = countBy(AESTHETIC, "decomposed");
1644
+ const preExisting = AESTHETIC.filter(
1645
+ (row) => row.verdict === "decomposed" && !needsMinting(row)
1646
+ ).length;
1647
+ return {
1648
+ aesthetic,
1649
+ ambiguous: countBy(AESTHETIC, "ambiguous"),
1650
+ cleanRate: decomposed / aesthetic,
1651
+ decomposed,
1652
+ excluded: DECOMPOSITION.length - aesthetic,
1653
+ lossy: countBy(AESTHETIC, "lossy"),
1654
+ neededMintedAxis: DECOMPOSITION.filter((row) => (row.mintedAxis?.length ?? 0) > 0).length,
1655
+ neededMintedTerm: DECOMPOSITION.filter((row) => (row.mintedTerm?.length ?? 0) > 0).length,
1656
+ outOfAxis: countBy(AESTHETIC, "out-of-axis"),
1657
+ preExisting,
1658
+ preExistingRate: preExisting / aesthetic,
1659
+ residue: countBy(AESTHETIC, "residue"),
1660
+ total: DECOMPOSITION.length
1661
+ };
1662
+ };
1663
+ var tally = (pick) => {
1664
+ const counts = /* @__PURE__ */ new Map();
1665
+ for (const row of DECOMPOSITION) {
1666
+ for (const target of pick(row) ?? []) {
1667
+ counts.set(target, (counts.get(target) ?? 0) + 1);
1668
+ }
1669
+ }
1670
+ return [...counts].toSorted((a, b) => b[1] - a[1]);
1671
+ };
1672
+ var mintingDemand = () => ({
1673
+ onExistingAxes: tally((row) => row.mintedTerm),
1674
+ onNewAxes: tally((row) => row.mintedAxis)
1675
+ });
1676
+ var rateBySource = () => {
1677
+ const sources = [...new Set(DECOMPOSITION.map((row) => row.source))];
1678
+ return sources.map((source) => {
1679
+ const rows = AESTHETIC.filter((row) => row.source === source);
1680
+ return {
1681
+ decomposed: rows.filter((row) => row.verdict === "decomposed").length,
1682
+ source,
1683
+ terms: rows.length
1684
+ };
1685
+ });
1686
+ };
1687
+ var unresolved = () => DECOMPOSITION.filter(
1688
+ (row) => row.verdict === "lossy" || row.verdict === "ambiguous" || row.verdict === "residue"
1689
+ );
1690
+ var declaredGaps = () => DECOMPOSITION.filter((row) => row.reason === "axis-not-authored");
1691
+ export {
1692
+ ARCHITIZER_STYLES,
1693
+ DECOMPOSITION,
1694
+ DESIGNROUND_STYLE_ANCHORS,
1695
+ DESIGNSHOP_PRODUCT_STYLES,
1696
+ DESIGNSHOP_SCHEME_STYLES,
1697
+ DESIGNSHOP_SCHEME_STYLE_COUNTS,
1698
+ ESTATE_REPOS,
1699
+ ESTATE_VOCABULARIES,
1700
+ MATERIALGRAPH_MS_CHARACTER,
1701
+ MATERIALGRAPH_MS_MOOD,
1702
+ MATERIALGRAPH_MS_STYLE,
1703
+ MATERIA_INTENT_KEYWORDS,
1704
+ MATERIA_SCENE_MOOD,
1705
+ MATRIX_COLUMNS,
1706
+ agreementSummary,
1707
+ ambiguousStyleShare,
1708
+ concepts,
1709
+ declaredGaps,
1710
+ disagreementsByAxis,
1711
+ mintingDemand,
1712
+ rateBySource,
1713
+ residueReport,
1714
+ unresolved
1715
+ };