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