@instruments/taxonomy 0.2.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.
@@ -1,19 +1,13 @@
1
1
  import {
2
2
  defineAlternatives
3
- } from "../chunk-C2ZPDTOU.js";
3
+ } from "../chunk-4ECRPD2I.js";
4
4
 
5
- // src/estate/rows/materia.ts
6
- var SCENE_MOOD = "materia.scene_mood";
7
- var INTENT_KEYWORDS = "materia.intent_keywords";
5
+ // src/estate/rows/architizer.ts
6
+ var ARCHITIZER = "architizer.styles";
8
7
  var OUT_OF_AXIS = "out-of-axis";
9
- var MATERIAL_PROPERTY = "material-property";
10
- var QUERY_MARKER = "query-marker";
11
8
  var DECOMPOSED = "decomposed";
12
9
  var MED_REGION = "place.region.mediterranean";
13
10
  var NORDIC_REGION = "place.region.nordic";
14
- var COASTAL_LANDSCAPE = "place.landscape.coastal";
15
- var PLAYFUL = "mood.playful";
16
- var MOODY = "mood.moody";
17
11
  var MINIMALISM = "style.minimalism";
18
12
  var CONTEMPORARY = "style.contemporary";
19
13
  var TRADITIONAL = "style.traditional";
@@ -22,622 +16,486 @@ var INDUSTRIAL = "style.industrial";
22
16
  var MCM = "style.mid_century_modern";
23
17
  var ART_DECO = "style.art_deco";
24
18
  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
19
  var EVOKES_NORDIC = "evokes(place.region.nordic)";
30
- var EVOKES_COASTAL = "evokes(place.landscape.coastal)";
31
20
  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) ─────────────────────────────────────────────────────────
21
+ var ARCHITIZER_ROWS = [
22
+ // ─── architizer · STYLES (25) ──────────────────────────────────────────────────────────────
51
23
  {
52
- onto: [MINIMALISM, CALM],
53
- source: SCENE_MOOD,
54
- term: "serene-minimal",
24
+ onto: [MODERNISM],
25
+ source: ARCHITIZER,
26
+ term: "Modernist",
55
27
  verdict: DECOMPOSED
56
28
  },
57
29
  {
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",
30
+ onto: [MCM],
31
+ source: ARCHITIZER,
32
+ term: "Mid-century modern",
62
33
  verdict: DECOMPOSED
63
34
  },
64
35
  {
65
- mintedTerm: ["palette.character.saturated"],
66
- onto: [MOODY, "palette.character.saturated"],
67
- source: SCENE_MOOD,
68
- term: "moody-saturated",
36
+ onto: ["style.brutalism"],
37
+ source: ARCHITIZER,
38
+ term: "Brutalist",
69
39
  verdict: DECOMPOSED
70
40
  },
71
41
  {
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",
42
+ onto: [MINIMALISM],
43
+ source: ARCHITIZER,
44
+ term: "Minimalist",
78
45
  verdict: DECOMPOSED
79
46
  },
80
47
  {
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",
48
+ onto: ["style.rationalism"],
49
+ source: ARCHITIZER,
50
+ term: "Rationalist",
94
51
  verdict: DECOMPOSED
95
52
  },
96
53
  {
97
- mintedTerm: [LUXURIOUS],
98
- onto: [ART_DECO, LUXURIOUS],
99
- source: SCENE_MOOD,
100
- term: "art-deco-luxe",
54
+ onto: ["style.postmodernism"],
55
+ source: ARCHITIZER,
56
+ term: "Postmodern",
101
57
  verdict: DECOMPOSED
102
58
  },
103
59
  {
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",
60
+ onto: ["style.deconstructivism"],
61
+ source: ARCHITIZER,
62
+ term: "Deconstructivist",
133
63
  verdict: DECOMPOSED
134
64
  },
135
65
  {
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",
66
+ onto: ["style.parametricism"],
67
+ source: ARCHITIZER,
68
+ term: "Parametric",
140
69
  verdict: DECOMPOSED
141
70
  },
142
71
  {
143
- onto: ["palette.hue.brown", "palette.character.muted", WARM],
144
- source: INTENT_KEYWORDS,
145
- term: "earthy",
72
+ onto: ["style.high_tech"],
73
+ source: ARCHITIZER,
74
+ term: "High-tech",
146
75
  verdict: DECOMPOSED
147
76
  },
148
77
  {
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",
78
+ onto: [INDUSTRIAL],
79
+ source: ARCHITIZER,
80
+ term: "Industrial",
160
81
  verdict: DECOMPOSED
161
82
  },
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
83
  {
179
- note: "Onto the already-published SECTOR axis.",
180
- onto: ["sector.healthcare"],
181
- source: INTENT_KEYWORDS,
182
- term: "healthcare",
84
+ onto: ["style.constructivism"],
85
+ source: ARCHITIZER,
86
+ term: "Constructivist",
183
87
  verdict: DECOMPOSED
184
88
  },
185
89
  {
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",
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",
198
94
  verdict: DECOMPOSED
199
95
  },
200
96
  {
201
- onto: [WARM],
202
- source: INTENT_KEYWORDS,
203
- term: "warm",
97
+ onto: ["style.critical_regionalism"],
98
+ source: ARCHITIZER,
99
+ term: "Critical regionalist",
204
100
  verdict: DECOMPOSED
205
101
  },
206
102
  {
207
- onto: ["palette.temperature.cool"],
208
- source: INTENT_KEYWORDS,
209
- term: "cool",
103
+ mintedAxis: ["place.landscape.tropical"],
104
+ onto: [MODERNISM, "evokes(place.landscape.tropical)"],
105
+ source: ARCHITIZER,
106
+ term: "Tropical modernism",
210
107
  verdict: DECOMPOSED
211
108
  },
212
109
  {
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",
110
+ mintedAxis: [NORDIC_REGION],
111
+ onto: [MODERNISM, EVOKES_NORDIC],
112
+ source: ARCHITIZER,
113
+ term: "Nordic modern",
224
114
  verdict: DECOMPOSED
225
115
  },
226
116
  {
227
- onto: [MINIMALISM],
228
- source: INTENT_KEYWORDS,
229
- term: "minimalist",
117
+ mintedAxis: ["place.region.japanese"],
118
+ onto: [CONTEMPORARY, "evokes(place.region.japanese)"],
119
+ source: ARCHITIZER,
120
+ term: "Japanese contemporary",
230
121
  verdict: DECOMPOSED
231
122
  },
232
123
  {
233
- onto: [INDUSTRIAL],
234
- source: INTENT_KEYWORDS,
235
- term: "industrial",
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",
236
129
  verdict: DECOMPOSED
237
130
  },
238
131
  {
239
- mintedAxis: ["typology.hotel"],
240
- onto: ["typology.hotel"],
241
- reason: "other-canonical-axis",
242
- source: INTENT_KEYWORDS,
243
- term: "hotel",
132
+ onto: [TRADITIONAL],
133
+ source: ARCHITIZER,
134
+ term: "Traditional",
244
135
  verdict: DECOMPOSED
245
136
  },
246
137
  {
247
- note: "Onto SPACE, which already existed upstream as materialgraph ms_room.",
248
- onto: ["space.hospitality_lobby"],
249
- source: INTENT_KEYWORDS,
250
- term: "lobby",
138
+ onto: ["style.neoclassical"],
139
+ source: ARCHITIZER,
140
+ term: "Neoclassical",
251
141
  verdict: DECOMPOSED
252
142
  },
253
143
  {
254
- mintedAxis: ["typology.spa"],
255
- onto: ["typology.spa", "space.spa_pool"],
256
- source: INTENT_KEYWORDS,
257
- term: "spa",
144
+ onto: ["style.gothic"],
145
+ source: ARCHITIZER,
146
+ term: "Gothic",
258
147
  verdict: DECOMPOSED
259
148
  },
260
149
  {
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",
150
+ onto: [ART_DECO],
151
+ source: ARCHITIZER,
152
+ term: "Art Deco",
273
153
  verdict: DECOMPOSED
274
154
  },
275
155
  {
276
- mintedTerm: [LUXURIOUS],
277
- onto: [LUXURIOUS],
278
- source: INTENT_KEYWORDS,
279
- term: "luxurious",
156
+ onto: ["style.organic_modernism"],
157
+ source: ARCHITIZER,
158
+ term: "Organic",
280
159
  verdict: DECOMPOSED
281
160
  },
282
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.",
283
163
  onto: [],
284
- reason: QUERY_MARKER,
285
- source: INTENT_KEYWORDS,
286
- term: "vibe",
164
+ reason: "axis-not-authored",
165
+ source: ARCHITIZER,
166
+ term: "Biophilic",
287
167
  verdict: OUT_OF_AXIS
288
168
  },
289
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.",
290
171
  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",
172
+ reason: "axis-not-authored",
173
+ source: ARCHITIZER,
174
+ term: "Sculptural",
322
175
  verdict: OUT_OF_AXIS
323
176
  },
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
- }
177
+ { onto: [RUSTIC], source: ARCHITIZER, term: "Rustic", verdict: DECOMPOSED }
357
178
  ];
358
179
 
359
- // src/estate/rows/architizer.ts
360
- var ARCHITIZER = "architizer.styles";
361
- var OUT_OF_AXIS2 = "out-of-axis";
180
+ // src/estate/rows/designround.ts
181
+ var DESIGNROUND = "designround.style_anchors";
362
182
  var DECOMPOSED2 = "decomposed";
363
- var MED_REGION2 = "place.region.mediterranean";
364
183
  var NORDIC_REGION2 = "place.region.nordic";
184
+ var COASTAL_LANDSCAPE = "place.landscape.coastal";
185
+ var MOODY = "mood.moody";
365
186
  var MINIMALISM2 = "style.minimalism";
366
187
  var CONTEMPORARY2 = "style.contemporary";
367
- var TRADITIONAL2 = "style.traditional";
368
188
  var RUSTIC2 = "style.rustic";
369
189
  var INDUSTRIAL2 = "style.industrial";
370
190
  var MCM2 = "style.mid_century_modern";
371
191
  var ART_DECO2 = "style.art_deco";
372
- var MODERNISM2 = "style.modernism";
192
+ var LUXURIOUS = "mood.luxurious";
193
+ var WARM = "palette.temperature.warm";
373
194
  var EVOKES_NORDIC2 = "evokes(place.region.nordic)";
374
- var EVOKES_MED2 = "evokes(place.region.mediterranean)";
375
- var ARCHITIZER_ROWS = [
376
- // ─── architizer · STYLES (25) ──────────────────────────────────────────────────────────────
195
+ var EVOKES_COASTAL = "evokes(place.landscape.coastal)";
196
+ var DESIGNROUND_ROWS = [
197
+ // ─── designround · STYLE_ANCHORS (12) ──────────────────────────────────────────────────────
377
198
  {
378
- onto: [MODERNISM2],
379
- source: ARCHITIZER,
380
- term: "Modernist",
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",
381
203
  verdict: DECOMPOSED2
382
204
  },
383
205
  {
384
- onto: [MCM2],
385
- source: ARCHITIZER,
386
- term: "Mid-century modern",
206
+ mintedAxis: ["place.region.english_country"],
207
+ onto: ["evokes(place.region.english_country)"],
208
+ source: DESIGNROUND,
209
+ term: "English Country",
387
210
  verdict: DECOMPOSED2
388
211
  },
389
212
  {
390
- onto: ["style.brutalism"],
391
- source: ARCHITIZER,
392
- term: "Brutalist",
213
+ mintedTerm: ["style.maximalism"],
214
+ onto: ["style.maximalism", CONTEMPORARY2],
215
+ source: DESIGNROUND,
216
+ term: "Modern Maximalism",
393
217
  verdict: DECOMPOSED2
394
218
  },
395
219
  {
396
- onto: [MINIMALISM2],
397
- source: ARCHITIZER,
398
- term: "Minimalist",
220
+ mintedTerm: [LUXURIOUS],
221
+ onto: [CONTEMPORARY2, LUXURIOUS],
222
+ source: DESIGNROUND,
223
+ term: "Contemporary Luxury",
399
224
  verdict: DECOMPOSED2
400
225
  },
401
226
  {
402
- onto: ["style.rationalism"],
403
- source: ARCHITIZER,
404
- term: "Rationalist",
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",
405
235
  verdict: DECOMPOSED2
406
236
  },
407
237
  {
408
- onto: ["style.postmodernism"],
409
- source: ARCHITIZER,
410
- term: "Postmodern",
238
+ onto: [MCM2],
239
+ source: DESIGNROUND,
240
+ term: "Mid-Century Modern",
411
241
  verdict: DECOMPOSED2
412
242
  },
413
243
  {
414
- onto: ["style.deconstructivism"],
415
- source: ARCHITIZER,
416
- term: "Deconstructivist",
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",
417
248
  verdict: DECOMPOSED2
418
249
  },
419
250
  {
420
- onto: ["style.parametricism"],
421
- source: ARCHITIZER,
422
- term: "Parametric",
251
+ onto: ["style.neoclassical", "mood.monumental"],
252
+ source: DESIGNROUND,
253
+ term: "Classical & Grand",
423
254
  verdict: DECOMPOSED2
424
255
  },
425
256
  {
426
- onto: ["style.high_tech"],
427
- source: ARCHITIZER,
428
- term: "High-tech",
257
+ mintedAxis: [NORDIC_REGION2],
258
+ onto: [EVOKES_NORDIC2],
259
+ source: DESIGNROUND,
260
+ term: "Scandinavian",
429
261
  verdict: DECOMPOSED2
430
262
  },
431
263
  {
432
- onto: [INDUSTRIAL2],
433
- source: ARCHITIZER,
434
- term: "Industrial",
264
+ onto: [RUSTIC2, "ms_character.crafted (material axis)"],
265
+ source: DESIGNROUND,
266
+ term: "Rustic & Artisan",
435
267
  verdict: DECOMPOSED2
436
268
  },
437
269
  {
438
- onto: ["style.constructivism"],
439
- source: ARCHITIZER,
440
- term: "Constructivist",
270
+ mintedTerm: [LUXURIOUS],
271
+ onto: [ART_DECO2, LUXURIOUS],
272
+ source: DESIGNROUND,
273
+ term: "Art Deco & Glamour",
441
274
  verdict: DECOMPOSED2
442
275
  },
443
276
  {
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",
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",
448
282
  verdict: DECOMPOSED2
449
- },
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) ────────────────────────────────────
450
326
  {
451
- onto: ["style.critical_regionalism"],
452
- source: ARCHITIZER,
453
- term: "Critical regionalist",
454
- verdict: DECOMPOSED2
327
+ onto: [CONTEMPORARY3],
328
+ source: DS_SCHEMES,
329
+ term: "Contemporary",
330
+ verdict: DECOMPOSED3
455
331
  },
456
332
  {
457
- mintedAxis: ["place.landscape.tropical"],
458
- onto: [MODERNISM2, "evokes(place.landscape.tropical)"],
459
- source: ARCHITIZER,
460
- term: "Tropical modernism",
461
- verdict: DECOMPOSED2
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"
462
339
  },
463
340
  {
464
- mintedAxis: [NORDIC_REGION2],
465
- onto: [MODERNISM2, EVOKES_NORDIC2],
466
- source: ARCHITIZER,
467
- term: "Nordic modern",
468
- verdict: DECOMPOSED2
341
+ onto: [TRADITIONAL2],
342
+ source: DS_SCHEMES,
343
+ term: "Traditional",
344
+ verdict: DECOMPOSED3
469
345
  },
470
346
  {
471
- mintedAxis: ["place.region.japanese"],
472
- onto: [CONTEMPORARY2, "evokes(place.region.japanese)"],
473
- source: ARCHITIZER,
474
- term: "Japanese contemporary",
475
- verdict: DECOMPOSED2
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
476
353
  },
477
354
  {
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
355
+ mintedTerm: [ECLECTIC],
356
+ onto: [ECLECTIC],
357
+ source: DS_SCHEMES,
358
+ term: "Eclectic",
359
+ verdict: DECOMPOSED3
484
360
  },
485
361
  {
486
- onto: [TRADITIONAL2],
487
- source: ARCHITIZER,
488
- term: "Traditional",
489
- verdict: DECOMPOSED2
362
+ onto: [MINIMALISM3],
363
+ source: DS_SCHEMES,
364
+ term: "Minimalist",
365
+ verdict: DECOMPOSED3
490
366
  },
491
367
  {
492
- onto: ["style.neoclassical"],
493
- source: ARCHITIZER,
494
- term: "Neoclassical",
495
- verdict: DECOMPOSED2
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"
496
374
  },
497
- { onto: ["style.gothic"], source: ARCHITIZER, term: "Gothic", verdict: DECOMPOSED2 },
498
375
  {
499
- onto: [ART_DECO2],
500
- source: ARCHITIZER,
501
- term: "Art Deco",
502
- verdict: DECOMPOSED2
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
503
382
  },
504
383
  {
505
- onto: ["style.organic_modernism"],
506
- source: ARCHITIZER,
507
- term: "Organic",
508
- verdict: DECOMPOSED2
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
509
390
  },
391
+ // ─── designshop · product attributes.Style (14) ────────────────────────────────────────────
510
392
  {
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
393
+ onto: [CONTEMPORARY3],
394
+ source: DS_PRODUCTS,
395
+ term: "Contemporary",
396
+ verdict: DECOMPOSED3
517
397
  },
518
398
  {
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.",
399
+ alternatives: MODERN_ALTERNATIVES,
520
400
  onto: [],
521
- reason: "axis-not-authored",
522
- source: ARCHITIZER,
523
- term: "Sculptural",
524
- verdict: OUT_OF_AXIS2
401
+ source: DS_PRODUCTS,
402
+ term: "Modern",
403
+ verdict: "ambiguous"
525
404
  },
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
405
  {
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",
406
+ onto: [MINIMALISM3],
407
+ source: DS_PRODUCTS,
408
+ term: "Minimalist",
552
409
  verdict: DECOMPOSED3
553
410
  },
554
411
  {
555
- mintedAxis: ["place.region.english_country"],
556
- onto: ["evokes(place.region.english_country)"],
557
- source: DESIGNROUND,
558
- term: "English Country",
412
+ mintedAxis: [NORDIC_REGION3],
413
+ onto: [EVOKES_NORDIC3],
414
+ source: DS_PRODUCTS,
415
+ term: "Scandinavian",
559
416
  verdict: DECOMPOSED3
560
417
  },
561
418
  {
562
- mintedTerm: ["style.maximalism"],
563
- onto: ["style.maximalism", CONTEMPORARY3],
564
- source: DESIGNROUND,
565
- term: "Modern Maximalism",
419
+ mintedTerm: [TRANSITIONAL],
420
+ onto: [TRANSITIONAL],
421
+ source: DS_PRODUCTS,
422
+ term: "Transitional",
566
423
  verdict: DECOMPOSED3
567
424
  },
568
425
  {
569
- mintedTerm: [LUXURIOUS2],
570
- onto: [CONTEMPORARY3, LUXURIOUS2],
571
- source: DESIGNROUND,
572
- term: "Contemporary Luxury",
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",
573
430
  verdict: DECOMPOSED3
574
431
  },
575
432
  {
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",
433
+ onto: [ART_DECO3],
434
+ source: DS_PRODUCTS,
435
+ term: "Art Deco",
584
436
  verdict: DECOMPOSED3
585
437
  },
586
438
  {
587
- onto: [MCM3],
588
- source: DESIGNROUND,
589
- term: "Mid-Century Modern",
439
+ mintedTerm: [ECLECTIC],
440
+ onto: [ECLECTIC],
441
+ source: DS_PRODUCTS,
442
+ term: "Eclectic",
590
443
  verdict: DECOMPOSED3
591
444
  },
592
445
  {
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",
446
+ mintedAxis: [COASTAL_LANDSCAPE2],
447
+ onto: [EVOKES_COASTAL2],
448
+ source: DS_PRODUCTS,
449
+ term: "Coastal",
597
450
  verdict: DECOMPOSED3
598
451
  },
599
452
  {
600
- onto: ["style.neoclassical", "mood.monumental"],
601
- source: DESIGNROUND,
602
- term: "Classical & Grand",
453
+ onto: [RUSTIC3],
454
+ source: DS_PRODUCTS,
455
+ term: "Rustic",
603
456
  verdict: DECOMPOSED3
604
457
  },
605
458
  {
606
- mintedAxis: [NORDIC_REGION3],
607
- onto: [EVOKES_NORDIC3],
608
- source: DESIGNROUND,
609
- term: "Scandinavian",
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",
610
464
  verdict: DECOMPOSED3
611
465
  },
612
466
  {
613
- onto: [RUSTIC3, "ms_character.crafted (material axis)"],
614
- source: DESIGNROUND,
615
- term: "Rustic & Artisan",
467
+ onto: [INDUSTRIAL3],
468
+ source: DS_PRODUCTS,
469
+ term: "Industrial",
616
470
  verdict: DECOMPOSED3
617
471
  },
618
472
  {
619
- mintedTerm: [LUXURIOUS2],
620
- onto: [ART_DECO3, LUXURIOUS2],
621
- source: DESIGNROUND,
622
- term: "Art Deco & Glamour",
473
+ onto: [MCM3],
474
+ source: DS_PRODUCTS,
475
+ term: "Mid-Century Modern",
623
476
  verdict: DECOMPOSED3
624
477
  },
625
478
  {
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",
479
+ mintedAxis: ["typology.farmhouse"],
480
+ onto: [EVOKES_FARMHOUSE, RUSTIC3],
481
+ source: DS_PRODUCTS,
482
+ term: "Farmhouse",
631
483
  verdict: DECOMPOSED3
632
484
  }
633
485
  ];
634
486
 
635
- // src/estate/rows/designshop.ts
636
- var DS_SCHEMES = "designshop.scheme_styles";
637
- var DS_PRODUCTS = "designshop.product_styles";
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";
638
493
  var DECOMPOSED4 = "decomposed";
494
+ var MED_REGION2 = "place.region.mediterranean";
639
495
  var NORDIC_REGION4 = "place.region.nordic";
640
496
  var COASTAL_LANDSCAPE3 = "place.landscape.coastal";
497
+ var PLAYFUL = "mood.playful";
498
+ var MOODY2 = "mood.moody";
641
499
  var MINIMALISM4 = "style.minimalism";
642
500
  var CONTEMPORARY4 = "style.contemporary";
643
501
  var TRADITIONAL3 = "style.traditional";
@@ -646,11 +504,16 @@ var INDUSTRIAL4 = "style.industrial";
646
504
  var MCM4 = "style.mid_century_modern";
647
505
  var ART_DECO4 = "style.art_deco";
648
506
  var MODERNISM3 = "style.modernism";
649
- var TRANSITIONAL = "style.transitional";
650
- var ECLECTIC = "style.eclectic";
507
+ var LUXURIOUS2 = "mood.luxurious";
508
+ var SOFT_MOOD = "mood.soft";
509
+ var CALM = "mood.calm";
510
+ var WARM2 = "palette.temperature.warm";
651
511
  var EVOKES_NORDIC4 = "evokes(place.region.nordic)";
652
512
  var EVOKES_COASTAL3 = "evokes(place.landscape.coastal)";
653
- var EVOKES_FARMHOUSE = "evokes(typology.farmhouse)";
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)";
654
517
  var MODERN_ALTERNATIVES2 = defineAlternatives(
655
518
  [
656
519
  [{ assertion: MODERNISM3, role: "constitutive" }],
@@ -658,172 +521,334 @@ var MODERN_ALTERNATIVES2 = defineAlternatives(
658
521
  ],
659
522
  "source-ambiguous"
660
523
  );
661
- var COUNTRY_ALTERNATIVES = defineAlternatives(
524
+ var BOUTIQUE_ALTERNATIVES = defineAlternatives(
662
525
  [
663
- [{ assertion: "evokes(place.region.english_country)", role: "constitutive" }],
664
- [{ assertion: EVOKES_FARMHOUSE, role: "constitutive" }]
526
+ [{ assertion: "evokes(typology.hotel)", role: "constitutive" }],
527
+ [{ assertion: "evokes(typology.shop)", role: "constitutive" }]
665
528
  ],
666
529
  "source-ambiguous"
667
530
  );
668
- var DESIGNSHOP_ROWS = [
669
- // ─── designshop · roomStyle, 1,922 schemes of usage (9) ────────────────────────────────────
531
+ var MATERIA_ROWS = [
532
+ // ─── materia · SceneMoodSchema (9) ─────────────────────────────────────────────────────────
670
533
  {
671
- onto: [CONTEMPORARY4],
672
- source: DS_SCHEMES,
673
- term: "Contemporary",
534
+ onto: [MINIMALISM4, CALM],
535
+ source: SCENE_MOOD,
536
+ term: "serene-minimal",
674
537
  verdict: DECOMPOSED4
675
538
  },
676
539
  {
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.",
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.",
679
592
  onto: [],
680
- source: DS_SCHEMES,
681
- term: "Modern",
682
- verdict: "ambiguous"
593
+ reason: "other-canonical-axis",
594
+ source: SCENE_MOOD,
595
+ term: "commercial-spec",
596
+ verdict: OUT_OF_AXIS2
683
597
  },
684
598
  {
685
- onto: [TRADITIONAL3],
686
- source: DS_SCHEMES,
687
- term: "Traditional",
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",
688
646
  verdict: DECOMPOSED4
689
647
  },
690
648
  {
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",
649
+ onto: [PLAYFUL],
650
+ source: INTENT_KEYWORDS,
651
+ term: "playful",
696
652
  verdict: DECOMPOSED4
697
653
  },
654
+ { onto: [CALM], source: INTENT_KEYWORDS, term: "quiet", verdict: DECOMPOSED4 },
698
655
  {
699
- mintedTerm: [ECLECTIC],
700
- onto: [ECLECTIC],
701
- source: DS_SCHEMES,
702
- term: "Eclectic",
656
+ onto: [SOFT_MOOD],
657
+ source: INTENT_KEYWORDS,
658
+ term: "soft",
703
659
  verdict: DECOMPOSED4
704
660
  },
705
661
  {
706
- onto: [MINIMALISM4],
707
- source: DS_SCHEMES,
708
- term: "Minimalist",
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",
709
680
  verdict: DECOMPOSED4
710
681
  },
711
682
  {
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.",
683
+ note: "ms_pattern_density.",
714
684
  onto: [],
715
- source: DS_SCHEMES,
716
- term: "Country",
717
- verdict: "ambiguous"
685
+ reason: MATERIAL_PROPERTY,
686
+ source: INTENT_KEYWORDS,
687
+ term: "patterned",
688
+ verdict: OUT_OF_AXIS2
718
689
  },
719
690
  {
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",
691
+ mintedTerm: [FADED],
692
+ onto: [FADED],
693
+ source: INTENT_KEYWORDS,
694
+ term: "faded",
725
695
  verdict: DECOMPOSED4
726
696
  },
727
697
  {
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",
698
+ onto: [WARM2],
699
+ source: INTENT_KEYWORDS,
700
+ term: "warm",
733
701
  verdict: DECOMPOSED4
734
702
  },
735
- // ─── designshop · product attributes.Style (14) ────────────────────────────────────────────
736
703
  {
737
- onto: [CONTEMPORARY4],
738
- source: DS_PRODUCTS,
739
- term: "Contemporary",
704
+ onto: ["palette.temperature.cool"],
705
+ source: INTENT_KEYWORDS,
706
+ term: "cool",
740
707
  verdict: DECOMPOSED4
741
708
  },
742
709
  {
743
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.",
744
712
  onto: [],
745
- source: DS_PRODUCTS,
746
- term: "Modern",
713
+ source: INTENT_KEYWORDS,
714
+ term: "modern",
747
715
  verdict: "ambiguous"
748
716
  },
717
+ {
718
+ onto: [RUSTIC4],
719
+ source: INTENT_KEYWORDS,
720
+ term: "rustic",
721
+ verdict: DECOMPOSED4
722
+ },
749
723
  {
750
724
  onto: [MINIMALISM4],
751
- source: DS_PRODUCTS,
752
- term: "Minimalist",
725
+ source: INTENT_KEYWORDS,
726
+ term: "minimalist",
753
727
  verdict: DECOMPOSED4
754
728
  },
755
729
  {
756
- mintedAxis: [NORDIC_REGION4],
757
- onto: [EVOKES_NORDIC4],
758
- source: DS_PRODUCTS,
759
- term: "Scandinavian",
730
+ onto: [INDUSTRIAL4],
731
+ source: INTENT_KEYWORDS,
732
+ term: "industrial",
760
733
  verdict: DECOMPOSED4
761
734
  },
762
735
  {
763
- mintedTerm: [TRANSITIONAL],
764
- onto: [TRANSITIONAL],
765
- source: DS_PRODUCTS,
766
- term: "Transitional",
736
+ mintedAxis: ["typology.hotel"],
737
+ onto: ["typology.hotel"],
738
+ reason: "other-canonical-axis",
739
+ source: INTENT_KEYWORDS,
740
+ term: "hotel",
767
741
  verdict: DECOMPOSED4
768
742
  },
769
743
  {
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",
744
+ note: "Onto SPACE, which already existed upstream as materialgraph ms_room.",
745
+ onto: ["space.hospitality_lobby"],
746
+ source: INTENT_KEYWORDS,
747
+ term: "lobby",
774
748
  verdict: DECOMPOSED4
775
749
  },
776
750
  {
777
- onto: [ART_DECO4],
778
- source: DS_PRODUCTS,
779
- term: "Art Deco",
751
+ mintedAxis: ["typology.spa"],
752
+ onto: ["typology.spa", "space.spa_pool"],
753
+ source: INTENT_KEYWORDS,
754
+ term: "spa",
780
755
  verdict: DECOMPOSED4
781
756
  },
782
757
  {
783
- mintedTerm: [ECLECTIC],
784
- onto: [ECLECTIC],
785
- source: DS_PRODUCTS,
786
- term: "Eclectic",
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",
787
770
  verdict: DECOMPOSED4
788
771
  },
789
772
  {
790
- mintedAxis: [COASTAL_LANDSCAPE3],
791
- onto: [EVOKES_COASTAL3],
792
- source: DS_PRODUCTS,
793
- term: "Coastal",
773
+ mintedTerm: [LUXURIOUS2],
774
+ onto: [LUXURIOUS2],
775
+ source: INTENT_KEYWORDS,
776
+ term: "luxurious",
794
777
  verdict: DECOMPOSED4
795
778
  },
796
779
  {
797
- onto: [RUSTIC4],
798
- source: DS_PRODUCTS,
799
- term: "Rustic",
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",
800
826
  verdict: DECOMPOSED4
801
827
  },
802
828
  {
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",
829
+ onto: [CONTEMPORARY4],
830
+ source: INTENT_KEYWORDS,
831
+ term: "contemporary",
808
832
  verdict: DECOMPOSED4
809
833
  },
810
834
  {
811
- onto: [INDUSTRIAL4],
812
- source: DS_PRODUCTS,
813
- term: "Industrial",
835
+ onto: [TRADITIONAL3],
836
+ source: INTENT_KEYWORDS,
837
+ term: "traditional",
814
838
  verdict: DECOMPOSED4
815
839
  },
816
840
  {
817
- onto: [MCM4],
818
- source: DS_PRODUCTS,
819
- term: "Mid-Century Modern",
841
+ mintedAxis: [NORDIC_REGION4],
842
+ onto: [EVOKES_NORDIC4],
843
+ source: INTENT_KEYWORDS,
844
+ term: "scandinavian",
820
845
  verdict: DECOMPOSED4
821
846
  },
822
847
  {
823
- mintedAxis: ["typology.farmhouse"],
824
- onto: [EVOKES_FARMHOUSE, RUSTIC4],
825
- source: DS_PRODUCTS,
826
- term: "Farmhouse",
848
+ mintedAxis: [MED_REGION2],
849
+ onto: [EVOKES_MED2],
850
+ source: INTENT_KEYWORDS,
851
+ term: "mediterranean",
827
852
  verdict: DECOMPOSED4
828
853
  }
829
854
  ];
@@ -1126,9 +1151,24 @@ var MATERIALGRAPH_ROWS = [
1126
1151
  var SAMPLIZE = "samplize.colour_collections";
1127
1152
  var DECOMPOSED6 = "decomposed";
1128
1153
  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 },
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
+ },
1132
1172
  {
1133
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.",
1134
1174
  onto: ["palette.hue.gray"],
@@ -1136,11 +1176,36 @@ var SAMPLIZE_ROWS = [
1136
1176
  term: "gray",
1137
1177
  verdict: DECOMPOSED6
1138
1178
  },
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 },
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
+ },
1144
1209
  {
1145
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.",
1146
1211
  onto: ["palette.temperature.neutral"],
@@ -1150,12 +1215,21 @@ var SAMPLIZE_ROWS = [
1150
1215
  },
1151
1216
  {
1152
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.",
1153
- onto: ["palette.hue.brown", "palette.character.muted", "palette.temperature.warm"],
1218
+ onto: [
1219
+ "palette.hue.brown",
1220
+ "palette.character.muted",
1221
+ "palette.temperature.warm"
1222
+ ],
1154
1223
  source: SAMPLIZE,
1155
1224
  term: "earthy-tones",
1156
1225
  verdict: DECOMPOSED6
1157
1226
  },
1158
- { onto: ["palette.character.light"], source: SAMPLIZE, term: "light", verdict: DECOMPOSED6 },
1227
+ {
1228
+ onto: ["palette.character.light"],
1229
+ source: SAMPLIZE,
1230
+ term: "light",
1231
+ verdict: DECOMPOSED6
1232
+ },
1159
1233
  {
1160
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.",
1161
1235
  onto: ["palette.character.mid"],
@@ -1163,7 +1237,12 @@ var SAMPLIZE_ROWS = [
1163
1237
  term: "medium",
1164
1238
  verdict: DECOMPOSED6
1165
1239
  },
1166
- { onto: ["palette.character.dark"], source: SAMPLIZE, term: "dark", verdict: DECOMPOSED6 }
1240
+ {
1241
+ onto: ["palette.character.dark"],
1242
+ source: SAMPLIZE,
1243
+ term: "dark",
1244
+ verdict: DECOMPOSED6
1245
+ }
1167
1246
  ];
1168
1247
 
1169
1248
  // src/estate/rows/index.ts
@@ -1592,7 +1671,11 @@ var disagreementsByAxis = ({
1592
1671
  concepts: axisConcepts,
1593
1672
  repos: reposSpeaking(axisConcepts),
1594
1673
  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);
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
+ );
1596
1679
  };
1597
1680
  var MATRIX_COLUMNS = ESTATE_VOCABULARIES.map((vocabulary) => {
1598
1681
  const repo = REPO_OF[vocabulary.id];
@@ -1603,7 +1686,9 @@ var MATRIX_COLUMNS = ESTATE_VOCABULARIES.map((vocabulary) => {
1603
1686
  });
1604
1687
  var agreementSummary = () => {
1605
1688
  const all = concepts();
1606
- const spellings = new Set(DECOMPOSITION.map((row) => row.term.toLowerCase().trim()));
1689
+ const spellings = new Set(
1690
+ DECOMPOSITION.map((row) => row.term.toLowerCase().trim())
1691
+ );
1607
1692
  const byRepo = /* @__PURE__ */ new Map();
1608
1693
  for (const row of DECOMPOSITION) {
1609
1694
  const folded = row.term.toLowerCase().trim();
@@ -1618,7 +1703,9 @@ var agreementSummary = () => {
1618
1703
  return {
1619
1704
  concepts: all.length,
1620
1705
  distinctSpellings: spellings.size,
1621
- exactStringMatchesAcrossRepos: [...byRepo.values()].filter((repos) => repos.size > 1).length,
1706
+ exactStringMatchesAcrossRepos: [...byRepo.values()].filter(
1707
+ (repos) => repos.size > 1
1708
+ ).length,
1622
1709
  reachedByAll: all.filter((concept) => concept.reach === concept.couldReach).length,
1623
1710
  reachedByFourOrMore: all.filter((concept) => concept.reach >= 4).length,
1624
1711
  repos: ESTATE_REPOS.length,
@@ -1635,7 +1722,9 @@ var ambiguousStyleShare = () => {
1635
1722
 
1636
1723
  // src/estate/residue-report.ts
1637
1724
  var isExcluded = (row) => row.verdict === "out-of-axis" && (row.reason === "query-marker" || row.reason === "material-property");
1638
- var AESTHETIC = DECOMPOSITION.filter((row) => !isExcluded(row));
1725
+ var AESTHETIC = DECOMPOSITION.filter(
1726
+ (row) => !isExcluded(row)
1727
+ );
1639
1728
  var countBy = (rows, verdict) => rows.filter((row) => row.verdict === verdict).length;
1640
1729
  var needsMinting = (row) => (row.mintedTerm?.length ?? 0) > 0 || (row.mintedAxis?.length ?? 0) > 0;
1641
1730
  var residueReport = () => {
@@ -1651,8 +1740,12 @@ var residueReport = () => {
1651
1740
  decomposed,
1652
1741
  excluded: DECOMPOSITION.length - aesthetic,
1653
1742
  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,
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,
1656
1749
  outOfAxis: countBy(AESTHETIC, "out-of-axis"),
1657
1750
  preExisting,
1658
1751
  preExistingRate: preExisting / aesthetic,