@instruments/taxonomy 1.0.0 → 1.1.1

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.
package/dist/index.d.ts CHANGED
@@ -33,6 +33,8 @@ type SourceBasis =
33
33
  | "authored"
34
34
  /** Written here, but derived from measured usage in a named corpus. */
35
35
  | "evidenced"
36
+ /** Written here from one or more named authoritative references, without adopting their term. */
37
+ | "referenced"
36
38
  /** Adopted from a published external standard, with its identifier carried. */
37
39
  | "standard";
38
40
  interface TermProvenance {
@@ -199,8 +201,8 @@ type RelationPredicate =
199
201
  | "related-to";
200
202
 
201
203
  declare const TAXONOMY_BASE_URI: "https://taxonomy.materialinstruments.com";
202
- declare const TAXONOMY_SNAPSHOT: "2026-08-30";
203
- declare const TAXONOMY_VERSION: "1.0.0";
204
+ declare const TAXONOMY_SNAPSHOT: "2026-08-31";
205
+ declare const TAXONOMY_VERSION: "1.1.1";
204
206
  type CanonicalConceptUri = `${typeof TAXONOMY_BASE_URI}/id/${string}`;
205
207
  type LifecycleStatus = "active" | "deprecated";
206
208
  interface Lifecycle {
@@ -333,8 +335,8 @@ declare const TAXONOMY_CORPUS_METADATA: {
333
335
  readonly lexicalEntryCount: number;
334
336
  readonly nodeCount: number;
335
337
  readonly revision: string;
336
- readonly snapshot: "2026-08-30";
337
- readonly version: "1.0.0";
338
+ readonly snapshot: "2026-08-31";
339
+ readonly version: "1.1.1";
338
340
  };
339
341
 
340
342
  export { type AxisNode, COLOR_SCOPE_REFERENCE_KINDS, type CanonicalConceptUri, type ColorScopeReferenceKind, type ColorScopeTarget, type ConceptNode, type ExternalReference, type FacetNode, type Governance, type GraphPredicate, KNOWLEDGE_GRAPH, type KnowledgeGraph, type KnowledgeGraphEdge, type KnowledgeGraphNode, LEXICAL_ENTRIES, type LexicalContext, type LexicalEntry, type LexicalTarget, type Lifecycle, type LifecycleStatus, type PeriodSpan, type SearchedWithout, type StyleKind, TAXONOMY_BASE_URI, TAXONOMY_CORPUS_METADATA, TAXONOMY_CORPUS_REVISION, TAXONOMY_SNAPSHOT, TAXONOMY_VERSION, type TaxonomyTarget, type TermProvenance, type TermUsage, type UsageWithheld };
package/dist/index.js CHANGED
@@ -982,9 +982,64 @@ var ELEMENT_TERMS = [
982
982
  ...ELEMENT_FITOUT_TERMS
983
983
  ];
984
984
 
985
+ // src/materialgraph-crossover-sources.ts
986
+ var MATERIALGRAPH_CROSSOVER_SOURCE = "materialgraph@b55d7ad33807d9653bd4838b7908fb1d100440a8:packages/products/src/search/colour-material-lexicon.ts:46-102";
987
+ var COLORSCOPE_CROSSOVER_SOURCE = "materialinstruments/colorscope@c0662caabe7cd8604241a8a7b2608fa5bc71de51:packages/core/data/reference/v1/taxonomy.json";
988
+ var BRASS_MATERIAL_SOURCE = "https://archive.copper.org/applications/industrial/DesignGuide/terms.php";
989
+ var BRASS_FINISH_SOURCE = "https://nickelinstitute.org/media/lxxh1zwr/2023-nickelplatinghandbooka5_printablepdf.pdf section 5";
990
+ var NICKEL_MATERIAL_SOURCE = "https://nickelinstitute.org/en/nickel-applications/";
991
+ var NICKEL_FINISH_SOURCE = "https://nickelinstitute.org/en/nickel-applications/plating";
992
+ var WOOD_HANDBOOK_SOURCE = "https://research.fs.usda.gov/download/treesearch/37440.pdf";
993
+ var FAO_NATURAL_FIBRES_SOURCE = "https://www.fao.org/docrep/pdf/012/i0987e/i0987e00.pdf";
994
+ var CROSSOVER_DEFINITION_SOURCES = {
995
+ alabaster: "https://webapps.bgs.ac.uk/memoirs/docs/B06070.html",
996
+ brass: `${BRASS_MATERIAL_SOURCE}; ${BRASS_FINISH_SOURCE}`,
997
+ bronze: "https://archive.copper.org/applications/industrial/DesignGuide/terms.php; https://archive.copper.org/applications/architecture/arch_dhb/technical-discussion/copper_alloys/",
998
+ cherry: WOOD_HANDBOOK_SOURCE,
999
+ chestnut: WOOD_HANDBOOK_SOURCE,
1000
+ chrome: "ISO 1456:2009, https://www.iso.org/standard/50237.html; ISO 6158:2018, https://www.iso.org/standard/72269.html",
1001
+ clay: "https://pubs.usgs.gov/info/clays/",
1002
+ concrete: "https://www.concrete.org/frequentlyaskedquestions.aspx?faqid=640",
1003
+ copper: "https://archive.copper.org/applications/industrial/DesignGuide/selection/elect02.php",
1004
+ cork: "https://apcor.pt/en/what-it-is",
1005
+ cotton: FAO_NATURAL_FIBRES_SOURCE,
1006
+ denim: "https://cottonworks.com/encyclopedia-item/denim/",
1007
+ ebony: WOOD_HANDBOOK_SOURCE,
1008
+ gold: "https://www.usgs.gov/centers/national-minerals-information-center/gold-statistics-and-information",
1009
+ gunmetal: "https://live.copper.org/applications/marine/cuni/alloys/pub-206-copper-alloys-for-marine-environments.pdf",
1010
+ iron: "https://www.usgs.gov/centers/national-minerals-information-center/iron-and-steel-statistics-and-information",
1011
+ jade: "https://www.gia.edu/jade-description",
1012
+ jute: "https://www.fao.org/markets-and-trade/commodities-overview/fibres/jute-and-hard-fibres/",
1013
+ leather: "ISO 15115, https://www.iso.org/obp/ui?_escaped_fragment_=iso%3Astd%3Aiso%3A15115%3Aed-1%3Av1%3Aen",
1014
+ linen: "https://allianceflaxlinenhemp.eu/en/document_resources/35/download",
1015
+ mahogany: WOOD_HANDBOOK_SOURCE,
1016
+ marble: "https://www.naturalstoneinstitute.org/designprofessionals/varieties/definition/; ASTM C503 via https://www.naturalstoneinstitute.org/stoneprofessionals/astm/",
1017
+ nickel: `${NICKEL_MATERIAL_SOURCE}; ${NICKEL_FINISH_SOURCE}`,
1018
+ oak: WOOD_HANDBOOK_SOURCE,
1019
+ obsidian: "https://www.usgs.gov/glossary/volcano-hazards-program-glossary",
1020
+ onyx: "https://www.naturalstoneinstitute.org/consumers/varieties/marble/",
1021
+ pewter: "Getty AAT 300010979, https://www.getty.edu/vow/AATFullDisplay?find=&logic=AND&note=&page=1&subjectid=300010979",
1022
+ platinum: "https://www.usgs.gov/centers/national-minerals-information-center/platinum-group-metals-statistics-and-information",
1023
+ rosewood: WOOD_HANDBOOK_SOURCE,
1024
+ silver: "https://silverinstitute.org/silver-element-essentials/",
1025
+ sisal: FAO_NATURAL_FIBRES_SOURCE,
1026
+ slate: "ASTM C629 via https://www.naturalstoneinstitute.org/stoneprofessionals/astm/",
1027
+ steel: "https://worldsteel.org/about-steel/what-is-steel/",
1028
+ stone: "https://www.naturalstoneinstitute.org/about/sponsorship-and-advertising/sponsored-content-guidelines/",
1029
+ suede: "ISO 15115, https://www.iso.org/obp/ui?_escaped_fragment_=iso%3Astd%3Aiso%3A15115%3Aed-1%3Av1%3Aen",
1030
+ teak: WOOD_HANDBOOK_SOURCE,
1031
+ terracotta: "Getty AAT 300047296, https://www.getty.edu/vow/AATFullDisplay?find=building&logic=AND&note=&subjectid=300047296",
1032
+ travertine: "https://www.naturalstoneinstitute.org/about/sponsorship-and-advertising/sponsored-content-guidelines/",
1033
+ walnut: "https://research.fs.usda.gov/treesearch/32210",
1034
+ wood: WOOD_HANDBOOK_SOURCE,
1035
+ wool: FAO_NATURAL_FIBRES_SOURCE
1036
+ };
1037
+ var crossoverSource = (phrase) => `${MATERIALGRAPH_CROSSOVER_SOURCE}; ${CROSSOVER_DEFINITION_SOURCES[phrase]}; ${COLORSCOPE_CROSSOVER_SOURCE}`;
1038
+
985
1039
  // src/axes/finish.ts
986
1040
  var ESTATE = "DesignShop frozen estate finish vocabulary";
987
1041
  var ESTATE_SNAPSHOT = "2026-08-25";
1042
+ var CROSSOVER_SNAPSHOT = "2026-08-30";
988
1043
  var MG_SHEEN = "materialgraph ms_sheen";
989
1044
  var MG_TEXTURE = "materialgraph ms_texture";
990
1045
  var MG_SNAPSHOT = "2026-08-27";
@@ -1013,6 +1068,26 @@ var repaired = (slug, label, definition, band, note) => ({
1013
1068
  usage: { band, corpus: CORPUS, snapshot: CORPUS_SNAPSHOT }
1014
1069
  });
1015
1070
  var FINISH_TREATMENT_TERMS = [
1071
+ {
1072
+ definition: "An exposed brass final surface applied over nickel-plated underlayers; it does not establish that the substrate or bulk material is brass.",
1073
+ label: "Brass",
1074
+ provenance: {
1075
+ basis: "referenced",
1076
+ snapshot: CROSSOVER_SNAPSHOT,
1077
+ source: BRASS_FINISH_SOURCE
1078
+ },
1079
+ slug: "brass"
1080
+ },
1081
+ {
1082
+ definition: "An electrodeposited chromium finish used in decorative nickel-plus-chromium coating systems or as an engineering-purpose chromium coating; it does not normalize the source word to chromium as a substance.",
1083
+ label: "Chrome",
1084
+ provenance: {
1085
+ basis: "standard",
1086
+ snapshot: CROSSOVER_SNAPSHOT,
1087
+ source: CROSSOVER_DEFINITION_SOURCES.chrome
1088
+ },
1089
+ slug: "chrome"
1090
+ },
1016
1091
  term2("glazed", "Glazed", "Covered by a fused vitreous surface layer."),
1017
1092
  term2(
1018
1093
  "honed",
@@ -1024,6 +1099,16 @@ var FINISH_TREATMENT_TERMS = [
1024
1099
  "Natural",
1025
1100
  "Left close to the material's formed or worked state without an appearance-changing top finish."
1026
1101
  ),
1102
+ {
1103
+ definition: "An electrodeposited nickel coating; bright, satin, pearl, and black appearances require qualifiers, and the coating does not establish the substrate or bulk material.",
1104
+ label: "Nickel",
1105
+ provenance: {
1106
+ basis: "referenced",
1107
+ snapshot: CROSSOVER_SNAPSHOT,
1108
+ source: NICKEL_FINISH_SOURCE
1109
+ },
1110
+ slug: "nickel"
1111
+ },
1027
1112
  term2(
1028
1113
  "polished",
1029
1114
  "Polished",
@@ -1166,14 +1251,28 @@ var FINISH_TERMS = [
1166
1251
  ...FINISH_TEXTURE_TERMS
1167
1252
  ];
1168
1253
 
1254
+ // src/search-corpus-source.ts
1255
+ var MATERIALGRAPH_SEARCH_CORPUS_COMMIT = "53df40868bfb09bfe69bc66c455c051e34005ae1";
1256
+ var MATERIALGRAPH_SEARCH_CORPUS_PATH = "packages/products/src/benchmark/fixtures/benchmark-cases-2026-07-31.1.json";
1257
+ var MATERIALGRAPH_SEARCH_CORPUS_SNAPSHOT = "2026-07-31";
1258
+ var MATERIALGRAPH_SEARCH_CORPUS = `materialgraph@${MATERIALGRAPH_SEARCH_CORPUS_COMMIT}:${MATERIALGRAPH_SEARCH_CORPUS_PATH}`;
1259
+ var searchCorpusEvidence = (phrases) => `${MATERIALGRAPH_SEARCH_CORPUS} (244-query external search corpus; phrase and admission evidence: ${phrases}; canonical boundary authored by Taxonomy)`;
1260
+
1169
1261
  // src/axes/format.ts
1170
1262
  var SOURCE2 = "DesignShop frozen estate format vocabulary";
1171
1263
  var SNAPSHOT2 = "2026-08-25";
1172
- var term3 = (slug, label, definition) => ({
1264
+ var SEARCH_REVIEW_DATE = "2026-08-31";
1265
+ var searchCorpusProvenance = (evidence) => ({
1266
+ basis: "evidenced",
1267
+ snapshot: MATERIALGRAPH_SEARCH_CORPUS_SNAPSHOT,
1268
+ source: searchCorpusEvidence(evidence)
1269
+ });
1270
+ var term3 = (slug, label, definition, extra = {}) => ({
1173
1271
  definition,
1174
1272
  label,
1175
1273
  provenance: { basis: "evidenced", snapshot: SNAPSHOT2, source: SOURCE2 },
1176
- slug
1274
+ slug,
1275
+ ...extra
1177
1276
  });
1178
1277
  var FORMAT_TERMS = [
1179
1278
  term3("area-rug", "Area rug", "A bounded loose-laid textile floor covering."),
@@ -1197,6 +1296,16 @@ var FORMAT_TERMS = [
1197
1296
  "Mural",
1198
1297
  "Supplied as a multi-panel image composed into one continuous scene."
1199
1298
  ),
1299
+ term3(
1300
+ "mosaic",
1301
+ "Mosaic",
1302
+ "Supplied as small pieces assembled or mounted together to install as one composed field, independent of material and visible motif.",
1303
+ {
1304
+ introducedAt: SEARCH_REVIEW_DATE,
1305
+ provenance: searchCorpusProvenance("mosaic"),
1306
+ reviewedAt: SEARCH_REVIEW_DATE
1307
+ }
1308
+ ),
1200
1309
  term3(
1201
1310
  "panel",
1202
1311
  "Panel",
@@ -1218,6 +1327,28 @@ var FORMAT_TERMS = [
1218
1327
  "A large rigid sheet intended to minimise joints or be fabricated to shape."
1219
1328
  ),
1220
1329
  term3("tile", "Tile", "A discrete modular surface unit."),
1330
+ term3(
1331
+ "penny-round",
1332
+ "Penny round",
1333
+ "A small round tile unit supplied for installation as a field, independent of its material and the layout made from it.",
1334
+ {
1335
+ altLabels: ["penny tile"],
1336
+ broaderSlug: "tile",
1337
+ introducedAt: SEARCH_REVIEW_DATE,
1338
+ provenance: searchCorpusProvenance("penny-tile"),
1339
+ reviewedAt: SEARCH_REVIEW_DATE
1340
+ }
1341
+ ),
1342
+ term3(
1343
+ "veneer",
1344
+ "Veneer",
1345
+ "A thin facing layer supplied to be bonded or fixed to a substrate, independent of the material from which the facing is made.",
1346
+ {
1347
+ introducedAt: SEARCH_REVIEW_DATE,
1348
+ provenance: searchCorpusProvenance("veneer"),
1349
+ reviewedAt: SEARCH_REVIEW_DATE
1350
+ }
1351
+ ),
1221
1352
  term3(
1222
1353
  "wide-plank",
1223
1354
  "Wide plank",
@@ -1228,13 +1359,60 @@ var FORMAT_TERMS = [
1228
1359
  // src/axes/material.ts
1229
1360
  var SOURCE3 = "DesignShop frozen estate and Material Instruments material vocabularies";
1230
1361
  var SNAPSHOT3 = "2026-08-25";
1362
+ var CROSSOVER_SNAPSHOT2 = "2026-08-30";
1363
+ var NATURAL_FIBRE_SLUG = "natural-fibre";
1364
+ var STONE_SLUG = "stone";
1231
1365
  var term4 = (slug, label, definition) => ({
1232
1366
  definition,
1233
1367
  label,
1234
1368
  provenance: { basis: "evidenced", snapshot: SNAPSHOT3, source: SOURCE3 },
1235
1369
  slug
1236
1370
  });
1371
+ var crossoverTerm = (slug, label, definition, source, broaderSlug) => ({
1372
+ ...broaderSlug === void 0 ? {} : { broaderSlug },
1373
+ definition,
1374
+ label,
1375
+ provenance: {
1376
+ basis: "referenced",
1377
+ snapshot: CROSSOVER_SNAPSHOT2,
1378
+ source
1379
+ },
1380
+ slug
1381
+ });
1382
+ var standardCrossoverTerm = (slug, label, definition, source) => ({
1383
+ ...crossoverTerm(slug, label, definition, source),
1384
+ provenance: {
1385
+ basis: "standard",
1386
+ snapshot: CROSSOVER_SNAPSHOT2,
1387
+ source
1388
+ }
1389
+ });
1390
+ var searchCorpusMaterial = (slug, label, definition, broaderSlug, referenceSource) => ({
1391
+ broaderSlug,
1392
+ definition,
1393
+ introducedAt: "2026-08-31",
1394
+ label,
1395
+ provenance: {
1396
+ basis: "evidenced",
1397
+ snapshot: MATERIALGRAPH_SEARCH_CORPUS_SNAPSHOT,
1398
+ source: `${searchCorpusEvidence(label)}; ${referenceSource}`
1399
+ },
1400
+ reviewedAt: "2026-08-31",
1401
+ slug
1402
+ });
1237
1403
  var MATERIAL_TERMS = [
1404
+ crossoverTerm(
1405
+ "brass",
1406
+ "Brass",
1407
+ "A copper alloy whose principal alloying element is zinc.",
1408
+ BRASS_MATERIAL_SOURCE
1409
+ ),
1410
+ crossoverTerm(
1411
+ "bronze",
1412
+ "Bronze",
1413
+ "A copper-alloy family historically associated with copper and tin; unmodified bronze does not identify a specific modern composition.",
1414
+ CROSSOVER_DEFINITION_SOURCES.bronze
1415
+ ),
1238
1416
  term4(
1239
1417
  "ceramic",
1240
1418
  "Ceramic",
@@ -1250,16 +1428,28 @@ var MATERIAL_TERMS = [
1250
1428
  "Composite",
1251
1429
  "An engineered material whose performance comes from two or more bound constituents."
1252
1430
  ),
1431
+ crossoverTerm(
1432
+ "copper",
1433
+ "Copper",
1434
+ "A metal with a designated minimum copper content of 99.3 percent in the UNS wrought-copper designation system.",
1435
+ CROSSOVER_DEFINITION_SOURCES.copper
1436
+ ),
1253
1437
  term4(
1254
1438
  "laminate",
1255
1439
  "Laminate",
1256
1440
  "A layered sheet material consolidated around a decorative or protective face."
1257
1441
  ),
1258
1442
  term4(
1259
- "natural-fibre",
1443
+ NATURAL_FIBRE_SLUG,
1260
1444
  "Natural fibre",
1261
1445
  "A material whose visible fibre is plant- or animal-derived."
1262
1446
  ),
1447
+ crossoverTerm(
1448
+ "nickel",
1449
+ "Nickel",
1450
+ "The metallic chemical element Ni used in solid metals and alloys; the bare term does not establish alloy, grade, or bulk composition.",
1451
+ NICKEL_MATERIAL_SOURCE
1452
+ ),
1263
1453
  term4(
1264
1454
  "paper",
1265
1455
  "Paper",
@@ -1270,24 +1460,257 @@ var MATERIAL_TERMS = [
1270
1460
  "Solid surface",
1271
1461
  "A homogeneous or near-homogeneous cast sheet made from resin and mineral filler."
1272
1462
  ),
1273
- term4(
1274
- "stone",
1463
+ crossoverTerm(
1464
+ "silver",
1465
+ "Silver",
1466
+ "The metallic chemical element Ag, atomic number 47.",
1467
+ CROSSOVER_DEFINITION_SOURCES.silver
1468
+ ),
1469
+ crossoverTerm(
1470
+ "slate",
1471
+ "Slate",
1472
+ "A commercial dimension-stone group separately specified for use as slate dimension stone.",
1473
+ CROSSOVER_DEFINITION_SOURCES.slate,
1474
+ STONE_SLUG
1475
+ ),
1476
+ crossoverTerm(
1477
+ STONE_SLUG,
1275
1478
  "Stone",
1276
- "Naturally occurring rock quarried and worked for use as a finish or component."
1479
+ "Naturally occurring rock quarried and worked for use as a finish or component.",
1480
+ CROSSOVER_DEFINITION_SOURCES.stone
1277
1481
  ),
1278
- term4(
1482
+ crossoverTerm(
1483
+ "marble",
1484
+ "Marble",
1485
+ "A commercial dimension-stone group that includes stone worked and sold as marble, including some dense or partially metamorphosed limestone.",
1486
+ CROSSOVER_DEFINITION_SOURCES.marble,
1487
+ STONE_SLUG
1488
+ ),
1489
+ crossoverTerm(
1490
+ "steel",
1491
+ "Steel",
1492
+ "An iron-carbon alloy family spanning many grades rather than one uniform product.",
1493
+ CROSSOVER_DEFINITION_SOURCES.steel
1494
+ ),
1495
+ searchCorpusMaterial(
1496
+ "stainless-steel",
1497
+ "Stainless steel",
1498
+ "A corrosion-resistant steel alloy family containing sufficient chromium to form a protective passive layer, named as a bulk material rather than a surface finish or colour.",
1499
+ "steel",
1500
+ CROSSOVER_DEFINITION_SOURCES.steel
1501
+ ),
1502
+ crossoverTerm(
1279
1503
  "wood",
1280
1504
  "Wood",
1281
- "Lignocellulosic material obtained from the trunk or branches of a tree or shrub."
1505
+ "Lignocellulosic material obtained from the trunk or branches of a tree or shrub.",
1506
+ CROSSOVER_DEFINITION_SOURCES.wood
1507
+ ),
1508
+ crossoverTerm(
1509
+ "oak",
1510
+ "Oak",
1511
+ "Wood from trees in the Quercus genus, including distinct red-oak and white-oak species groups.",
1512
+ CROSSOVER_DEFINITION_SOURCES.oak,
1513
+ "wood"
1514
+ ),
1515
+ searchCorpusMaterial(
1516
+ "white-oak",
1517
+ "White oak",
1518
+ "Timber from the white-oak species group within the genus Quercus, named as a wood material rather than a colour or surface finish.",
1519
+ "oak",
1520
+ CROSSOVER_DEFINITION_SOURCES.oak
1521
+ ),
1522
+ crossoverTerm(
1523
+ "teak",
1524
+ "Teak",
1525
+ "Wood from Tectona grandis, named as timber rather than as a colour or surface treatment.",
1526
+ CROSSOVER_DEFINITION_SOURCES.teak,
1527
+ "wood"
1282
1528
  ),
1283
1529
  {
1284
- ...term4(
1530
+ ...crossoverTerm(
1285
1531
  "walnut",
1286
1532
  "Walnut",
1287
- "Wood obtained from a tree in the genus Juglans, named as a material rather than as a colour."
1533
+ "Wood obtained from a tree in the genus Juglans, named as a material rather than as a colour.",
1534
+ CROSSOVER_DEFINITION_SOURCES.walnut
1288
1535
  ),
1289
1536
  broaderSlug: "wood"
1290
1537
  },
1538
+ crossoverTerm(
1539
+ "clay",
1540
+ "Clay",
1541
+ "A naturally occurring fine-grained earthy material composed largely of clay minerals; the bare term does not mean fired ceramic.",
1542
+ CROSSOVER_DEFINITION_SOURCES.clay
1543
+ ),
1544
+ crossoverTerm(
1545
+ "cotton",
1546
+ "Cotton",
1547
+ "A natural seed-hair textile fibre; the fibre identity does not establish weave, blend, dye, or finish.",
1548
+ CROSSOVER_DEFINITION_SOURCES.cotton,
1549
+ NATURAL_FIBRE_SLUG
1550
+ ),
1551
+ standardCrossoverTerm(
1552
+ "leather",
1553
+ "Leather",
1554
+ "Tanned animal hide or skin that retains its fibrous structure; animal, layer, tanning, coating, and finish remain unspecified.",
1555
+ CROSSOVER_DEFINITION_SOURCES.leather
1556
+ ),
1557
+ crossoverTerm(
1558
+ "linen",
1559
+ "Linen",
1560
+ "A flax-derived yarn or fabric material; fibre, yarn, and finished fabric are distinct forms.",
1561
+ CROSSOVER_DEFINITION_SOURCES.linen,
1562
+ NATURAL_FIBRE_SLUG
1563
+ ),
1564
+ crossoverTerm(
1565
+ "jute",
1566
+ "Jute",
1567
+ "A plant bast fibre used as a textile and industrial fibre; the word does not establish construction, blend, treatment, or colour.",
1568
+ CROSSOVER_DEFINITION_SOURCES.jute,
1569
+ NATURAL_FIBRE_SLUG
1570
+ ),
1571
+ crossoverTerm(
1572
+ "sisal",
1573
+ "Sisal",
1574
+ "A natural leaf fibre, distinct from a floorcovering or other product made from it.",
1575
+ CROSSOVER_DEFINITION_SOURCES.sisal,
1576
+ NATURAL_FIBRE_SLUG
1577
+ ),
1578
+ crossoverTerm(
1579
+ "cork",
1580
+ "Cork",
1581
+ "Bark of the cork oak, Quercus suber; natural cork, agglomerate, backing, veneer, and cork-look appearance remain distinct.",
1582
+ CROSSOVER_DEFINITION_SOURCES.cork
1583
+ ),
1584
+ crossoverTerm(
1585
+ "wool",
1586
+ "Wool",
1587
+ "A natural animal fibre; species, grade, blend, textile construction, and finish remain unspecified.",
1588
+ CROSSOVER_DEFINITION_SOURCES.wool,
1589
+ NATURAL_FIBRE_SLUG
1590
+ ),
1591
+ standardCrossoverTerm(
1592
+ "suede",
1593
+ "Suede",
1594
+ "Leather or split leather whose wearing surface is mechanically finished to a velvet-like nap.",
1595
+ CROSSOVER_DEFINITION_SOURCES.suede
1596
+ ),
1597
+ crossoverTerm(
1598
+ "concrete",
1599
+ "Concrete",
1600
+ "A composite of hydraulic cement, aggregates, water, and optional additions; mix, reinforcement, coating, polish, and imitation remain distinct.",
1601
+ CROSSOVER_DEFINITION_SOURCES.concrete
1602
+ ),
1603
+ crossoverTerm(
1604
+ "mahogany",
1605
+ "Mahogany",
1606
+ "A commercially named wood represented by more than one botanical group; the bare name does not establish species or construction.",
1607
+ CROSSOVER_DEFINITION_SOURCES.mahogany,
1608
+ "wood"
1609
+ ),
1610
+ crossoverTerm(
1611
+ "ebony",
1612
+ "Ebony",
1613
+ "Wood traded under ebony names across Diospyros species; the trade name is not a botanical identity or proof of black colour.",
1614
+ CROSSOVER_DEFINITION_SOURCES.ebony,
1615
+ "wood"
1616
+ ),
1617
+ crossoverTerm(
1618
+ "cherry",
1619
+ "Cherry",
1620
+ "A timber reading that includes black cherry, Prunus serotina, in the North American trade; the common name alone does not establish species.",
1621
+ CROSSOVER_DEFINITION_SOURCES.cherry,
1622
+ "wood"
1623
+ ),
1624
+ crossoverTerm(
1625
+ "chestnut",
1626
+ "Chestnut",
1627
+ "A timber reading that includes American chestnut, Castanea dentata; the common name does not establish species or construction.",
1628
+ CROSSOVER_DEFINITION_SOURCES.chestnut,
1629
+ "wood"
1630
+ ),
1631
+ crossoverTerm(
1632
+ "rosewood",
1633
+ "Rosewood",
1634
+ "A trade-name wood reading spanning distinct Dalbergia timbers; species and trade substitution require separate evidence.",
1635
+ CROSSOVER_DEFINITION_SOURCES.rosewood,
1636
+ "wood"
1637
+ ),
1638
+ crossoverTerm(
1639
+ "gold",
1640
+ "Gold",
1641
+ "The metallic chemical element Au; solid metal, alloy, leaf, plating, coating, and gold-coloured appearance are not interchangeable.",
1642
+ CROSSOVER_DEFINITION_SOURCES.gold
1643
+ ),
1644
+ crossoverTerm(
1645
+ "pewter",
1646
+ "Pewter",
1647
+ "A tin-alloy family with historically variable lead, antimony, and copper content; the bare term does not identify a finish.",
1648
+ CROSSOVER_DEFINITION_SOURCES.pewter
1649
+ ),
1650
+ crossoverTerm(
1651
+ "iron",
1652
+ "Iron",
1653
+ "The metallic chemical element Fe; bare usage may instead denote cast iron, wrought iron, steel, oxide, or an iron-look finish.",
1654
+ CROSSOVER_DEFINITION_SOURCES.iron
1655
+ ),
1656
+ crossoverTerm(
1657
+ "gunmetal",
1658
+ "Gunmetal",
1659
+ "A copper-tin-zinc casting-alloy family with grade-dependent composition.",
1660
+ CROSSOVER_DEFINITION_SOURCES.gunmetal
1661
+ ),
1662
+ crossoverTerm(
1663
+ "platinum",
1664
+ "Platinum",
1665
+ "A platinum-group metal; solid metal, alloy, plating, and platinum-coloured appearance require separate evidence.",
1666
+ CROSSOVER_DEFINITION_SOURCES.platinum
1667
+ ),
1668
+ crossoverTerm(
1669
+ "onyx",
1670
+ "Onyx",
1671
+ "A commercial architectural stone, commonly translucent and distinct from commercial marble; the name does not settle every mineralogical use.",
1672
+ CROSSOVER_DEFINITION_SOURCES.onyx,
1673
+ STONE_SLUG
1674
+ ),
1675
+ crossoverTerm(
1676
+ "travertine",
1677
+ "Travertine",
1678
+ "A named natural dimension-stone material; quarry, grade, fill, cut, and surface treatment remain unspecified.",
1679
+ CROSSOVER_DEFINITION_SOURCES.travertine,
1680
+ STONE_SLUG
1681
+ ),
1682
+ crossoverTerm(
1683
+ "alabaster",
1684
+ "Alabaster",
1685
+ "A fine-grained, often translucent gypsum used as decorative stone; historical oriental alabaster can denote carbonate stone.",
1686
+ CROSSOVER_DEFINITION_SOURCES.alabaster,
1687
+ STONE_SLUG
1688
+ ),
1689
+ crossoverTerm(
1690
+ "jade",
1691
+ "Jade",
1692
+ "An umbrella gem-material term for nephrite, jadeite, and, under defined conditions, green omphacite; it is not one mineral.",
1693
+ CROSSOVER_DEFINITION_SOURCES.jade
1694
+ ),
1695
+ crossoverTerm(
1696
+ "obsidian",
1697
+ "Obsidian",
1698
+ "Naturally occurring dense volcanic glass, usually rhyolitic and typically but not necessarily black.",
1699
+ CROSSOVER_DEFINITION_SOURCES.obsidian
1700
+ ),
1701
+ crossoverTerm(
1702
+ "terracotta",
1703
+ "Terracotta",
1704
+ "A coarse porous fired-clay material; raw clay, fired body, glaze, object type, and colour remain distinct.",
1705
+ CROSSOVER_DEFINITION_SOURCES.terracotta,
1706
+ "ceramic"
1707
+ ),
1708
+ crossoverTerm(
1709
+ "denim",
1710
+ "Denim",
1711
+ "A woven fabric conventionally made with indigo-dyed warp and undyed filling yarns in a twill construction; blends and non-blue denim exist.",
1712
+ CROSSOVER_DEFINITION_SOURCES.denim
1713
+ ),
1291
1714
  term4(
1292
1715
  "vinyl",
1293
1716
  "Vinyl",
@@ -1447,7 +1870,7 @@ var PALETTE_HUE_TERMS = [
1447
1870
  slug: "black"
1448
1871
  },
1449
1872
  {
1450
- altLabels: ["warm neutral", "sand", "linen"],
1873
+ altLabels: ["warm neutral", "sand"],
1451
1874
  label: "Beige",
1452
1875
  slug: "beige"
1453
1876
  },
@@ -1467,12 +1890,12 @@ var PALETTE_HUE_TERMS = [
1467
1890
  slug: "red"
1468
1891
  },
1469
1892
  {
1470
- altLabels: ["terracotta", "rust"],
1893
+ altLabels: ["rust"],
1471
1894
  label: "Orange",
1472
1895
  slug: "orange"
1473
1896
  },
1474
1897
  {
1475
- altLabels: ["gold", "mustard", "ochre"],
1898
+ altLabels: ["mustard", "ochre"],
1476
1899
  label: "Yellow",
1477
1900
  slug: "yellow"
1478
1901
  },
@@ -2323,8 +2746,8 @@ var uniclass2 = (slug, label, match) => ({
2323
2746
  match,
2324
2747
  scheme: "uniclass"
2325
2748
  });
2326
- var searchedUniclass = (query) => ({
2327
- date: "2026-08-27",
2749
+ var searchedUniclass = (query, date = "2026-08-27") => ({
2750
+ date,
2328
2751
  query,
2329
2752
  scheme: "uniclass",
2330
2753
  via: "uniclass.thenbs.com/taxon, Pr table walked from Pr_20 to Pr_90"
@@ -2333,6 +2756,7 @@ var ESTATE2 = "DesignShop frozen estate and Material Instruments product vocabul
2333
2756
  var ESTATE_SNAPSHOT2 = "2026-08-25";
2334
2757
  var CORPUS2 = "Material Bank catalogue, us_hierarchy_category_v2 level-2 rollup";
2335
2758
  var CORPUS_SNAPSHOT2 = "2026-08-27";
2759
+ var SEARCH_REVIEW_DATE2 = "2026-08-31";
2336
2760
  var term6 = (slug, label, definition, extra = {}) => ({
2337
2761
  definition,
2338
2762
  label,
@@ -2347,6 +2771,19 @@ var fromCorpus = (slug, label, definition, extra = {}) => ({
2347
2771
  slug,
2348
2772
  ...extra
2349
2773
  });
2774
+ var fromSearchCorpus = (slug, label, definition, extra = {}) => ({
2775
+ definition,
2776
+ introducedAt: SEARCH_REVIEW_DATE2,
2777
+ label,
2778
+ provenance: {
2779
+ basis: "evidenced",
2780
+ snapshot: MATERIALGRAPH_SEARCH_CORPUS_SNAPSHOT,
2781
+ source: searchCorpusEvidence(label)
2782
+ },
2783
+ reviewedAt: SEARCH_REVIEW_DATE2,
2784
+ slug,
2785
+ ...extra
2786
+ });
2350
2787
  var PRODUCT_CATEGORY_TERMS = [
2351
2788
  term6(
2352
2789
  "tile",
@@ -2361,13 +2798,16 @@ var PRODUCT_CATEGORY_TERMS = [
2361
2798
  "Carpet and rug",
2362
2799
  "A textile floor covering, fixed or loose laid.",
2363
2800
  {
2801
+ altLabels: ["carpet", "rug"],
2364
2802
  external: [
2365
2803
  uniclass2(
2366
2804
  "Pr_35_57_11",
2367
2805
  "Carpets, carpet tiles, coverings, underlays and mats",
2368
2806
  "exact"
2369
2807
  )
2370
- ]
2808
+ ],
2809
+ introducedAt: "2026-08-30",
2810
+ reviewedAt: "2026-08-31"
2371
2811
  }
2372
2812
  ),
2373
2813
  term6(
@@ -2536,6 +2976,113 @@ var PRODUCT_CATEGORY_TERMS = [
2536
2976
  "Ceiling system",
2537
2977
  "A suspended or applied ceiling product supplied with its own grid, carrier or fixing method.",
2538
2978
  { external: [uniclass2("Pr_35_93_13", "Ceiling infill units", "close")] }
2979
+ ),
2980
+ fromSearchCorpus(
2981
+ "sconce",
2982
+ "Sconce",
2983
+ "A wall-mounted luminaire supplied as a complete light fitting, not the wall it mounts to or the light effect it produces.",
2984
+ {
2985
+ altLabels: ["wall sconce", "wall light"],
2986
+ broaderSlug: "luminaire",
2987
+ searchedWithout: [
2988
+ searchedUniclass("sconce, wall sconce, wall light", SEARCH_REVIEW_DATE2)
2989
+ ]
2990
+ }
2991
+ ),
2992
+ fromSearchCorpus(
2993
+ "chandelier",
2994
+ "Chandelier",
2995
+ "A suspended decorative luminaire with multiple arms, branches or light sources, independent of the ceiling system supporting it.",
2996
+ {
2997
+ broaderSlug: "luminaire",
2998
+ external: [uniclass2("Pr_70_70_48_13", "Chandeliers", "exact")]
2999
+ }
3000
+ ),
3001
+ fromSearchCorpus(
3002
+ "pendant-luminaire",
3003
+ "Pendant luminaire",
3004
+ "A luminaire suspended from above as an individual fitting, distinct from its cable, track or ceiling support.",
3005
+ {
3006
+ altLabels: ["pendant", "pendant light"],
3007
+ broaderSlug: "luminaire",
3008
+ external: [uniclass2("Pr_70_70_48_62", "Pendant luminaires", "exact")]
3009
+ }
3010
+ ),
3011
+ fromSearchCorpus(
3012
+ "track-luminaire",
3013
+ "Track luminaire",
3014
+ "A luminaire made to attach to and draw power from a lighting track, distinct from the track and its electrical accessories.",
3015
+ {
3016
+ altLabels: ["track lighting", "track light"],
3017
+ broaderSlug: "luminaire",
3018
+ searchedWithout: [
3019
+ searchedUniclass("track luminaire, track light", SEARCH_REVIEW_DATE2)
3020
+ ]
3021
+ }
3022
+ ),
3023
+ fromSearchCorpus(
3024
+ "sofa",
3025
+ "Sofa",
3026
+ "An upholstered seating product for two or more people, independent of its upholstery material or room placement.",
3027
+ {
3028
+ altLabels: ["couch"],
3029
+ broaderSlug: "seating",
3030
+ external: [uniclass2("Pr_40_50_12_81", "Sofas", "exact")]
3031
+ }
3032
+ ),
3033
+ fromSearchCorpus(
3034
+ "mosaic-tile",
3035
+ "Mosaic tile",
3036
+ "A tile product composed of small tesserae supplied loose or mounted for installation as a field, independent of their material or visible motif.",
3037
+ {
3038
+ altLabels: ["mosaic"],
3039
+ broaderSlug: "tile",
3040
+ external: [uniclass2("Pr_35_93_96_53", "Mosaic tiles", "exact")]
3041
+ }
3042
+ ),
3043
+ fromSearchCorpus(
3044
+ "wall-panel",
3045
+ "Wall panel",
3046
+ "A panel product supplied to form or cover the visible face of a wall, independent of the panel material and the wall element behind it.",
3047
+ {
3048
+ altLabels: ["wall panelling", "wall paneling"],
3049
+ broaderSlug: "wallcovering",
3050
+ searchedWithout: [
3051
+ searchedUniclass(
3052
+ "wall panel, wall panelling, wall paneling",
3053
+ SEARCH_REVIEW_DATE2
3054
+ )
3055
+ ]
3056
+ }
3057
+ ),
3058
+ fromSearchCorpus(
3059
+ "acoustic-ceiling-system",
3060
+ "Acoustic ceiling system",
3061
+ "A ceiling system specified to absorb or control sound, independent of the material, module format or space in which it is installed.",
3062
+ {
3063
+ altLabels: ["acoustic ceiling"],
3064
+ broaderSlug: "ceiling-system",
3065
+ searchedWithout: [
3066
+ searchedUniclass(
3067
+ "acoustic ceiling system, acoustic ceiling",
3068
+ SEARCH_REVIEW_DATE2
3069
+ )
3070
+ ]
3071
+ }
3072
+ ),
3073
+ fromSearchCorpus(
3074
+ "upholstery-textile",
3075
+ "Upholstery textile",
3076
+ "A textile product supplied for covering furniture, distinct from the furniture, the upholstery application and the fibre or hide material.",
3077
+ {
3078
+ broaderSlug: "textile",
3079
+ searchedWithout: [
3080
+ searchedUniclass(
3081
+ "upholstery textile, upholstery fabric",
3082
+ SEARCH_REVIEW_DATE2
3083
+ )
3084
+ ]
3085
+ }
2539
3086
  )
2540
3087
  ];
2541
3088
 
@@ -6566,8 +7113,9 @@ var resolveReference = (reference) => INDEX.byKey.get(canonicalKey(reference));
6566
7113
 
6567
7114
  // src/v1.ts
6568
7115
  var TAXONOMY_BASE_URI = "https://taxonomy.materialinstruments.com";
6569
- var TAXONOMY_SNAPSHOT = "2026-08-30";
6570
- var TAXONOMY_VERSION = "1.0.0";
7116
+ var TAXONOMY_SNAPSHOT = "2026-08-31";
7117
+ var TAXONOMY_VERSION = "1.1.1";
7118
+ var PUBLISHED_V1_BASELINE = "2026-08-30";
6571
7119
  var compareText = (left, right) => {
6572
7120
  if (left < right) {
6573
7121
  return -1;
@@ -6602,8 +7150,8 @@ var lifecycleFor = (term8) => {
6602
7150
  successorAxis.facets.length > 1 || successorAxis.facets[0]?.slug !== successorAxis.slug
6603
7151
  );
6604
7152
  return {
6605
- introducedAt: TAXONOMY_SNAPSHOT,
6606
- reviewedAt: TAXONOMY_SNAPSHOT,
7153
+ introducedAt: term8?.introducedAt ?? PUBLISHED_V1_BASELINE,
7154
+ reviewedAt: term8?.reviewedAt ?? term8?.introducedAt ?? PUBLISHED_V1_BASELINE,
6607
7155
  status: term8?.status ?? "active",
6608
7156
  ...supersededBy === void 0 ? {} : { supersededBy }
6609
7157
  };
@@ -6813,17 +7361,18 @@ var buildKnowledgeGraph = () => {
6813
7361
  };
6814
7362
  var KNOWLEDGE_GRAPH = buildKnowledgeGraph();
6815
7363
  var COLOR_FAMILY_REFERENCE_KIND = "color-family";
7364
+ var NAMED_COLOR_REFERENCE_KIND = "named-color";
6816
7365
  var COLOR_SCOPE_REFERENCE_KINDS = [
6817
7366
  "chroma-level",
6818
7367
  COLOR_FAMILY_REFERENCE_KIND,
6819
7368
  "lightness-level",
6820
- "named-color",
7369
+ NAMED_COLOR_REFERENCE_KIND,
6821
7370
  "palette-mood",
6822
7371
  "temperature-level"
6823
7372
  ];
6824
- var lexicalGovernance = (explanation, provenance) => ({
7373
+ var lexicalGovernance = (explanation, provenance, lifecycle = lifecycleFor()) => ({
6825
7374
  explanation,
6826
- lifecycle: lifecycleFor(),
7375
+ lifecycle,
6827
7376
  provenance,
6828
7377
  steward: "@instruments/taxonomy"
6829
7378
  });
@@ -6839,17 +7388,88 @@ var WALNUT_MATERIAL = {
6839
7388
  uri: `${TAXONOMY_BASE_URI}/id/material/walnut`
6840
7389
  };
6841
7390
  var WALNUT_COLOUR = {
6842
- ...colorScope("brown-grayish-walnut", "named-color"),
7391
+ ...colorScope("brown-grayish-walnut", NAMED_COLOR_REFERENCE_KIND),
6843
7392
  role: "secondary"
6844
7393
  };
7394
+ var crossoverAmbiguity = (phrase, taxonomyUri, colorScopeIdentifier, explanation, source, additionalTaxonomyUris = []) => ({
7395
+ explanation,
7396
+ governance: lexicalGovernance(
7397
+ "Taxonomy preserves the evidenced readings without assigning a default, role, contextual preference, or consumer route.",
7398
+ {
7399
+ basis: "evidenced",
7400
+ snapshot: PUBLISHED_V1_BASELINE,
7401
+ source
7402
+ }
7403
+ ),
7404
+ outcome: "ambiguous",
7405
+ phrase,
7406
+ readings: [
7407
+ { authority: "taxonomy", uri: taxonomyUri },
7408
+ colorScope(colorScopeIdentifier, NAMED_COLOR_REFERENCE_KIND),
7409
+ ...additionalTaxonomyUris.map((uri) => ({
7410
+ authority: "taxonomy",
7411
+ uri
7412
+ }))
7413
+ ]
7414
+ });
7415
+ var crossoverEquivalent = (phrase, taxonomyUri, explanation, source) => ({
7416
+ explanation,
7417
+ governance: lexicalGovernance(
7418
+ "Taxonomy records the evidenced material reading without assigning a consumer route.",
7419
+ {
7420
+ basis: "evidenced",
7421
+ snapshot: PUBLISHED_V1_BASELINE,
7422
+ source
7423
+ }
7424
+ ),
7425
+ outcome: "equivalent",
7426
+ phrase,
7427
+ target: { authority: "taxonomy", uri: taxonomyUri }
7428
+ });
7429
+ var crossoverTaxonomyAmbiguity = (phrase, readings, explanation, source, snapshot = PUBLISHED_V1_BASELINE, lifecycle = lifecycleFor()) => {
7430
+ const [first, second] = readings;
7431
+ return {
7432
+ explanation,
7433
+ governance: lexicalGovernance(
7434
+ "Taxonomy preserves the evidenced readings without assigning a default, role, contextual preference, or consumer route.",
7435
+ {
7436
+ basis: "evidenced",
7437
+ snapshot,
7438
+ source
7439
+ },
7440
+ lifecycle
7441
+ ),
7442
+ outcome: "ambiguous",
7443
+ phrase,
7444
+ readings: [
7445
+ { authority: "taxonomy", uri: first },
7446
+ { authority: "taxonomy", uri: second }
7447
+ ]
7448
+ };
7449
+ };
6845
7450
  var AUTHORED_LEXICAL_ENTRIES = [
7451
+ crossoverTaxonomyAmbiguity(
7452
+ "mosaic",
7453
+ [
7454
+ `${TAXONOMY_BASE_URI}/id/product-category/mosaic-tile`,
7455
+ `${TAXONOMY_BASE_URI}/id/format/mosaic`
7456
+ ],
7457
+ "Mosaic can name a purchasable mosaic-tile product or the small-piece supply format; it is neither inherently a pattern nor a substance. Consumers must union any exact ColorScope named-paint reading with these domain readings rather than let an exact Taxonomy phrase shadow the external identity.",
7458
+ `${searchCorpusEvidence("mosaic")}; Uniclass Pr_35_93_96_53 Mosaic tiles; consumer authority-union boundary reviewed 2026-08-31`,
7459
+ MATERIALGRAPH_SEARCH_CORPUS_SNAPSHOT,
7460
+ {
7461
+ introducedAt: TAXONOMY_SNAPSHOT,
7462
+ reviewedAt: TAXONOMY_SNAPSHOT,
7463
+ status: "active"
7464
+ }
7465
+ ),
6846
7466
  {
6847
7467
  explanation: "Blue is a ColorScope colour-family reading; Taxonomy references that authority rather than minting a rival colour identity.",
6848
7468
  governance: lexicalGovernance(
6849
7469
  "The ColorScope family is the single governed reading of the unqualified colour word.",
6850
7470
  {
6851
7471
  basis: "vendored",
6852
- snapshot: TAXONOMY_SNAPSHOT,
7472
+ snapshot: PUBLISHED_V1_BASELINE,
6853
7473
  source: "@instruments/colorscope COLOR_FAMILIES"
6854
7474
  }
6855
7475
  ),
@@ -6857,6 +7477,285 @@ var AUTHORED_LEXICAL_ENTRIES = [
6857
7477
  phrase: "blue",
6858
7478
  target: colorScope("blue", COLOR_FAMILY_REFERENCE_KIND)
6859
7479
  },
7480
+ crossoverAmbiguity(
7481
+ "alabaster",
7482
+ `${TAXONOMY_BASE_URI}/id/material/alabaster`,
7483
+ "cream-soft-cream-white",
7484
+ "Alabaster can name decorative gypsum stone or an explicit ColorScope alias for Cream White; neither reading establishes the other.",
7485
+ crossoverSource("alabaster")
7486
+ ),
7487
+ crossoverAmbiguity(
7488
+ "brass",
7489
+ `${TAXONOMY_BASE_URI}/id/material/brass`,
7490
+ "yellow-warm-brass",
7491
+ "Brass can name a copper-zinc alloy, an exposed applied brass finish, or a ColorScope named colour; none establishes either of the others.",
7492
+ crossoverSource("brass"),
7493
+ [`${TAXONOMY_BASE_URI}/id/finish/treatment/brass`]
7494
+ ),
7495
+ crossoverAmbiguity(
7496
+ "bronze",
7497
+ `${TAXONOMY_BASE_URI}/id/material/bronze`,
7498
+ "brown-mid-bronze",
7499
+ "Bronze can name a copper-alloy family or a ColorScope named colour; the unmodified word does not identify a specific composition.",
7500
+ crossoverSource("bronze")
7501
+ ),
7502
+ crossoverAmbiguity(
7503
+ "chrome",
7504
+ `${TAXONOMY_BASE_URI}/id/finish/treatment/chrome`,
7505
+ "gray-pale-chrome",
7506
+ "Chrome can name a metallic chromium coating or a ColorScope named colour; it is not silently normalized to chromium as a material.",
7507
+ crossoverSource("chrome")
7508
+ ),
7509
+ crossoverAmbiguity(
7510
+ "cherry",
7511
+ `${TAXONOMY_BASE_URI}/id/material/cherry`,
7512
+ "red-warm-cherry-red",
7513
+ "Cherry can name timber or an explicit ColorScope alias for Cherry Red; the common name does not prove species or colour.",
7514
+ crossoverSource("cherry")
7515
+ ),
7516
+ crossoverAmbiguity(
7517
+ "chestnut",
7518
+ `${TAXONOMY_BASE_URI}/id/material/chestnut`,
7519
+ "brown-warm-chestnut",
7520
+ "Chestnut can name timber or a ColorScope named colour; neither reading proves species, construction, or appearance.",
7521
+ crossoverSource("chestnut")
7522
+ ),
7523
+ crossoverAmbiguity(
7524
+ "clay",
7525
+ `${TAXONOMY_BASE_URI}/id/material/clay`,
7526
+ "orange-warm-clay",
7527
+ "Clay can name a fine-grained earthy material or a ColorScope named colour; the word alone proves neither firing nor appearance.",
7528
+ crossoverSource("clay")
7529
+ ),
7530
+ crossoverAmbiguity(
7531
+ "copper",
7532
+ `${TAXONOMY_BASE_URI}/id/material/copper`,
7533
+ "brown-mid-copper",
7534
+ "Copper can name a metal or a ColorScope named colour; colour resemblance does not establish copper content.",
7535
+ crossoverSource("copper")
7536
+ ),
7537
+ crossoverAmbiguity(
7538
+ "denim",
7539
+ `${TAXONOMY_BASE_URI}/id/material/denim`,
7540
+ "blue-vivid-denim",
7541
+ "Denim can name a woven fabric construction or a ColorScope named colour; denim need not be blue.",
7542
+ crossoverSource("denim")
7543
+ ),
7544
+ crossoverAmbiguity(
7545
+ "ebony",
7546
+ `${TAXONOMY_BASE_URI}/id/material/ebony`,
7547
+ "black-warm-ebony",
7548
+ "Ebony can name traded timber or a ColorScope named colour; the trade name does not prove botanical identity or black colour.",
7549
+ crossoverSource("ebony")
7550
+ ),
7551
+ crossoverAmbiguity(
7552
+ "gold",
7553
+ `${TAXONOMY_BASE_URI}/id/material/gold`,
7554
+ "yellow-bright-gold",
7555
+ "Gold can name the metallic element or a ColorScope named colour; appearance does not establish composition or coating.",
7556
+ crossoverSource("gold")
7557
+ ),
7558
+ crossoverAmbiguity(
7559
+ "gunmetal",
7560
+ `${TAXONOMY_BASE_URI}/id/material/gunmetal`,
7561
+ "gray-muted-gunmetal",
7562
+ "Gunmetal can name a casting-alloy family or a ColorScope named colour; grade and appearance remain separate claims.",
7563
+ crossoverSource("gunmetal")
7564
+ ),
7565
+ crossoverAmbiguity(
7566
+ "iron",
7567
+ `${TAXONOMY_BASE_URI}/id/material/iron`,
7568
+ "gray-dark-iron",
7569
+ "Iron can name the metallic element or a ColorScope named colour; the bare word does not settle material form or appearance.",
7570
+ crossoverSource("iron")
7571
+ ),
7572
+ crossoverAmbiguity(
7573
+ "jade",
7574
+ `${TAXONOMY_BASE_URI}/id/material/jade`,
7575
+ "green-mid-jade",
7576
+ "Jade can name an umbrella gem material or a ColorScope named colour; jade is not one mineral and need not be green.",
7577
+ crossoverSource("jade")
7578
+ ),
7579
+ crossoverAmbiguity(
7580
+ "linen",
7581
+ `${TAXONOMY_BASE_URI}/id/material/linen`,
7582
+ "cream-pale-linen",
7583
+ "Linen can name a flax-derived material or a ColorScope named colour; colour does not establish fibre composition.",
7584
+ crossoverSource("linen")
7585
+ ),
7586
+ crossoverAmbiguity(
7587
+ "mahogany",
7588
+ `${TAXONOMY_BASE_URI}/id/material/mahogany`,
7589
+ "brown-dark-mahogany",
7590
+ "Mahogany can name commercially grouped timber or a ColorScope named colour; neither reading proves species or appearance.",
7591
+ crossoverSource("mahogany")
7592
+ ),
7593
+ crossoverAmbiguity(
7594
+ "nickel",
7595
+ `${TAXONOMY_BASE_URI}/id/material/nickel`,
7596
+ "gray-muted-nickel",
7597
+ "Nickel can name a bulk metallic material, an electrodeposited finish, or a ColorScope named colour; the bare word does not select among them.",
7598
+ crossoverSource("nickel"),
7599
+ [`${TAXONOMY_BASE_URI}/id/finish/treatment/nickel`]
7600
+ ),
7601
+ crossoverAmbiguity(
7602
+ "obsidian",
7603
+ `${TAXONOMY_BASE_URI}/id/material/obsidian`,
7604
+ "black-cool-obsidian",
7605
+ "Obsidian can name volcanic glass or a ColorScope named colour; the material is not necessarily black.",
7606
+ crossoverSource("obsidian")
7607
+ ),
7608
+ crossoverAmbiguity(
7609
+ "onyx",
7610
+ `${TAXONOMY_BASE_URI}/id/material/onyx`,
7611
+ "black-warm-onyx",
7612
+ "Onyx can name commercial architectural stone or a ColorScope named colour; architectural onyx is not necessarily black.",
7613
+ crossoverSource("onyx")
7614
+ ),
7615
+ crossoverAmbiguity(
7616
+ "pewter",
7617
+ `${TAXONOMY_BASE_URI}/id/material/pewter`,
7618
+ "gray-soft-pewter",
7619
+ "Pewter can name a variable tin-alloy family or a ColorScope named colour; composition and appearance remain separate.",
7620
+ crossoverSource("pewter")
7621
+ ),
7622
+ crossoverAmbiguity(
7623
+ "platinum",
7624
+ `${TAXONOMY_BASE_URI}/id/material/platinum`,
7625
+ "gray-light-platinum",
7626
+ "Platinum can name a metal or a ColorScope named colour; solid metal, plating, and appearance require separate evidence.",
7627
+ crossoverSource("platinum")
7628
+ ),
7629
+ crossoverAmbiguity(
7630
+ "rosewood",
7631
+ `${TAXONOMY_BASE_URI}/id/material/rosewood`,
7632
+ "red-dark-rosewood",
7633
+ "Rosewood can name traded timber or a ColorScope named colour; species and appearance remain separate claims.",
7634
+ crossoverSource("rosewood")
7635
+ ),
7636
+ crossoverAmbiguity(
7637
+ "silver",
7638
+ `${TAXONOMY_BASE_URI}/id/material/silver`,
7639
+ "gray-light-silver",
7640
+ "Silver can name the metallic element or a ColorScope named colour; appearance does not establish elemental silver.",
7641
+ crossoverSource("silver")
7642
+ ),
7643
+ crossoverAmbiguity(
7644
+ "slate",
7645
+ `${TAXONOMY_BASE_URI}/id/material/slate`,
7646
+ "gray-muted-slate",
7647
+ "Slate can name dimension stone or a ColorScope named colour; neither reading implies the other.",
7648
+ crossoverSource("slate")
7649
+ ),
7650
+ crossoverAmbiguity(
7651
+ "steel",
7652
+ `${TAXONOMY_BASE_URI}/id/material/steel`,
7653
+ "gray-cool-steel",
7654
+ "Steel can name an iron-carbon alloy family or a ColorScope named colour; appearance does not identify a steel grade.",
7655
+ crossoverSource("steel")
7656
+ ),
7657
+ crossoverAmbiguity(
7658
+ "stone",
7659
+ `${TAXONOMY_BASE_URI}/id/material/stone`,
7660
+ "taupe-warm-stone",
7661
+ "Stone can name a specific building material, a retrieval-oriented material family, or a ColorScope named colour; none is a consumer route.",
7662
+ crossoverSource("stone"),
7663
+ [`${TAXONOMY_BASE_URI}/id/material-family/stone`]
7664
+ ),
7665
+ crossoverAmbiguity(
7666
+ "terracotta",
7667
+ `${TAXONOMY_BASE_URI}/id/material/terracotta`,
7668
+ "orange-mid-terracotta",
7669
+ "Terracotta can name a fired-clay material or a ColorScope named colour; firing and composition do not establish orange appearance.",
7670
+ crossoverSource("terracotta")
7671
+ ),
7672
+ crossoverEquivalent(
7673
+ "cotton",
7674
+ `${TAXONOMY_BASE_URI}/id/material/cotton`,
7675
+ "Cotton has one governed material reading in this corpus; fibre identity does not establish weave, blend, dye, or finish, and ColorScope 7.3 has no exact named-colour identity.",
7676
+ crossoverSource("cotton")
7677
+ ),
7678
+ crossoverTaxonomyAmbiguity(
7679
+ "leather",
7680
+ [
7681
+ `${TAXONOMY_BASE_URI}/id/material-family/leather`,
7682
+ `${TAXONOMY_BASE_URI}/id/material/leather`
7683
+ ],
7684
+ "Leather names both a retrieval-oriented material family and a specific hide-derived material; neither reading establishes animal, layer, tanning, coating, or finish, and ColorScope 7.3 has no exact named-colour identity.",
7685
+ crossoverSource("leather")
7686
+ ),
7687
+ crossoverTaxonomyAmbiguity(
7688
+ "wood",
7689
+ [
7690
+ `${TAXONOMY_BASE_URI}/id/material-family/wood`,
7691
+ `${TAXONOMY_BASE_URI}/id/material/wood`
7692
+ ],
7693
+ "Wood names both a retrieval-oriented material family and a specific lignocellulosic material; neither reading establishes species, construction, stain, oil, or coating, and ColorScope 7.3 has no exact named-colour identity.",
7694
+ crossoverSource("wood")
7695
+ ),
7696
+ crossoverEquivalent(
7697
+ "jute",
7698
+ `${TAXONOMY_BASE_URI}/id/material/jute`,
7699
+ "Jute has one governed material reading in this corpus; construction, blend, treatment, and colour remain unspecified, and ColorScope 7.3 has no exact named-colour identity.",
7700
+ crossoverSource("jute")
7701
+ ),
7702
+ crossoverEquivalent(
7703
+ "sisal",
7704
+ `${TAXONOMY_BASE_URI}/id/material/sisal`,
7705
+ "Sisal has one governed material reading in this corpus; fibre and products made from it remain distinct, and ColorScope 7.3 has no exact named-colour identity.",
7706
+ crossoverSource("sisal")
7707
+ ),
7708
+ crossoverEquivalent(
7709
+ "cork",
7710
+ `${TAXONOMY_BASE_URI}/id/material/cork`,
7711
+ "Cork has one governed material reading in this corpus; natural cork, agglomerate, backing, veneer, and cork-look appearance remain distinct, and ColorScope 7.3 has no exact named-colour identity.",
7712
+ crossoverSource("cork")
7713
+ ),
7714
+ crossoverEquivalent(
7715
+ "wool",
7716
+ `${TAXONOMY_BASE_URI}/id/material/wool`,
7717
+ "Wool has one governed material reading in this corpus; species, grade, blend, construction, and finish remain unspecified, and ColorScope 7.3 has no exact named-colour identity.",
7718
+ crossoverSource("wool")
7719
+ ),
7720
+ crossoverEquivalent(
7721
+ "suede",
7722
+ `${TAXONOMY_BASE_URI}/id/material/suede`,
7723
+ "Suede has one governed leather-material reading in this corpus; it does not establish a suede-look finish on another substrate, and ColorScope 7.3 has no exact named-colour identity.",
7724
+ crossoverSource("suede")
7725
+ ),
7726
+ crossoverTaxonomyAmbiguity(
7727
+ "concrete",
7728
+ [
7729
+ `${TAXONOMY_BASE_URI}/id/material-family/concrete`,
7730
+ `${TAXONOMY_BASE_URI}/id/material/concrete`
7731
+ ],
7732
+ "Concrete names both a retrieval-oriented material family and a specific cement-and-aggregate composite; neither reading establishes mix, reinforcement, coating, polish, or imitation, and ColorScope 7.3 has no exact named-colour identity.",
7733
+ crossoverSource("concrete")
7734
+ ),
7735
+ crossoverEquivalent(
7736
+ "travertine",
7737
+ `${TAXONOMY_BASE_URI}/id/material/travertine`,
7738
+ "Travertine has one governed dimension-stone reading in this corpus; quarry, grade, fill, cut, and surface treatment remain unspecified, and ColorScope 7.3 has no exact named-colour identity.",
7739
+ crossoverSource("travertine")
7740
+ ),
7741
+ crossoverEquivalent(
7742
+ "marble",
7743
+ `${TAXONOMY_BASE_URI}/id/material/marble`,
7744
+ "Marble has one governed commercial dimension-stone reading in this corpus; its scientific and commercial boundaries remain explicit, and ColorScope 7.3 has no exact named-colour identity.",
7745
+ crossoverSource("marble")
7746
+ ),
7747
+ crossoverEquivalent(
7748
+ "oak",
7749
+ `${TAXONOMY_BASE_URI}/id/material/oak`,
7750
+ "Oak has one governed timber reading in this corpus; species group, cut, stain, coating, and appearance remain distinct, and ColorScope 7.3 has no exact named-colour identity.",
7751
+ crossoverSource("oak")
7752
+ ),
7753
+ crossoverEquivalent(
7754
+ "teak",
7755
+ `${TAXONOMY_BASE_URI}/id/material/teak`,
7756
+ "Teak has one governed timber reading in this corpus; timber, finish, and colour remain distinct, and ColorScope 7.3 has no exact named-colour identity.",
7757
+ crossoverSource("teak")
7758
+ ),
6860
7759
  {
6861
7760
  contextualPreferences: [
6862
7761
  { context: "material", target: WALNUT_MATERIAL },
@@ -6868,8 +7767,8 @@ var AUTHORED_LEXICAL_ENTRIES = [
6868
7767
  "The two readings are deliberately separate and context may select only the preference declared here.",
6869
7768
  {
6870
7769
  basis: "evidenced",
6871
- snapshot: TAXONOMY_SNAPSHOT,
6872
- source: "Material Graph search vocabulary review"
7770
+ snapshot: PUBLISHED_V1_BASELINE,
7771
+ source: crossoverSource("walnut")
6873
7772
  }
6874
7773
  ),
6875
7774
  outcome: "ambiguous",
@@ -6910,6 +7809,17 @@ var lexicalPhrases = (term8) => [term8.slug, term8.label, ...term8.altLabels ??
6910
7809
  (phrase, index, phrases) => phrase.length > 0 && phrases.indexOf(phrase) === index
6911
7810
  );
6912
7811
  var targetKey = (target) => target.authority === "taxonomy" ? `taxonomy:${target.uri}` : `colorscope:${target.referenceKind}:${target.identifier}`;
7812
+ var inferredLifecycle = (readings) => {
7813
+ const terms = readings.flatMap((reading) => reading.terms);
7814
+ const [introducedAt] = terms.map((term8) => term8.introducedAt ?? PUBLISHED_V1_BASELINE).toSorted(compareText);
7815
+ const reviewedAt = terms.map(
7816
+ (term8) => term8.reviewedAt ?? term8.introducedAt ?? PUBLISHED_V1_BASELINE
7817
+ ).toSorted(compareText).at(-1);
7818
+ if (introducedAt === void 0 || reviewedAt === void 0) {
7819
+ throw new Error("Inferred lexical reading has no source term lifecycle.");
7820
+ }
7821
+ return { introducedAt, reviewedAt, status: "active" };
7822
+ };
6913
7823
  var inferredLexicalEntries = () => {
6914
7824
  const authored = new Set(
6915
7825
  AUTHORED_LEXICAL_ENTRIES.map((entry) => entry.phrase)
@@ -6918,18 +7828,24 @@ var inferredLexicalEntries = () => {
6918
7828
  for (const location of AUTHORING_LOCATIONS) {
6919
7829
  const target = targetForLocation(location);
6920
7830
  for (const phrase of lexicalPhrases(location.term)) {
6921
- const targets = targetsByPhrase.get(phrase) ?? [];
6922
- if (!targets.some((candidate) => targetKey(candidate) === targetKey(target))) {
6923
- targets.push(target);
7831
+ const readings = targetsByPhrase.get(phrase) ?? [];
7832
+ const existing = readings.find(
7833
+ (candidate) => targetKey(candidate.target) === targetKey(target)
7834
+ );
7835
+ if (existing === void 0) {
7836
+ readings.push({ target, terms: [location.term] });
7837
+ } else {
7838
+ existing.terms.push(location.term);
6924
7839
  }
6925
- targetsByPhrase.set(phrase, targets);
7840
+ targetsByPhrase.set(phrase, readings);
6926
7841
  }
6927
7842
  }
6928
- return [...targetsByPhrase].filter(([phrase]) => !authored.has(phrase)).map(([phrase, targets]) => {
6929
- const [first, second, ...rest] = targets;
7843
+ return [...targetsByPhrase].filter(([phrase]) => !authored.has(phrase)).map(([phrase, readings]) => {
7844
+ const [first, second, ...rest] = readings;
6930
7845
  if (first === void 0) {
6931
7846
  throw new Error(`Lexical phrase "${phrase}" has no reading.`);
6932
7847
  }
7848
+ const lifecycle = inferredLifecycle(readings);
6933
7849
  if (second === void 0) {
6934
7850
  return {
6935
7851
  explanation: `The published spelling \u201C${phrase}\u201D has one governed reading.`,
@@ -6937,13 +7853,14 @@ var inferredLexicalEntries = () => {
6937
7853
  "The reading is derived from a canonical label, slug, alternate label, or observed source spelling.",
6938
7854
  {
6939
7855
  basis: "evidenced",
6940
- snapshot: TAXONOMY_SNAPSHOT,
7856
+ snapshot: lifecycle.reviewedAt,
6941
7857
  source: "Taxonomy V1 authored term dictionaries"
6942
- }
7858
+ },
7859
+ lifecycle
6943
7860
  ),
6944
7861
  outcome: "equivalent",
6945
7862
  phrase,
6946
- target: first
7863
+ target: first.target
6947
7864
  };
6948
7865
  }
6949
7866
  return {
@@ -6952,13 +7869,18 @@ var inferredLexicalEntries = () => {
6952
7869
  "No context-independent primary reading has been governed.",
6953
7870
  {
6954
7871
  basis: "evidenced",
6955
- snapshot: TAXONOMY_SNAPSHOT,
7872
+ snapshot: lifecycle.reviewedAt,
6956
7873
  source: "Colliding Taxonomy V1 authored term spellings"
6957
- }
7874
+ },
7875
+ lifecycle
6958
7876
  ),
6959
7877
  outcome: "ambiguous",
6960
7878
  phrase,
6961
- readings: [first, second, ...rest]
7879
+ readings: [
7880
+ first.target,
7881
+ second.target,
7882
+ ...rest.map(({ target }) => target)
7883
+ ]
6962
7884
  };
6963
7885
  });
6964
7886
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instruments/taxonomy",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "description": "Canonical data-only interiors and architecture knowledge graph and lexical corpus.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "repository": {
@@ -23,20 +23,20 @@
23
23
  "publishConfig": {
24
24
  "access": "public"
25
25
  },
26
- "scripts": {
27
- "build": "rm -rf dist && tsup",
28
- "lint": "howells-check .",
29
- "prepare": "[ -d dist ] || pnpm build",
30
- "sync:colorscope": "vitest run src/colorscope-sync.test.ts",
31
- "test": "vitest run",
32
- "typecheck": "tsc --noEmit"
33
- },
34
26
  "devDependencies": {
35
27
  "@howells/lint": "^1.0.0",
36
- "@instruments/colorscope": "^5.0.0",
28
+ "@instruments/colorscope": "7.3.0",
37
29
  "@types/node": "^24.0.0",
38
30
  "tsup": "^8.5.1",
39
31
  "typescript": "^5.7.0",
40
32
  "vitest": "^4.0.0"
33
+ },
34
+ "scripts": {
35
+ "build": "rm -rf dist && tsup",
36
+ "lint": "howells-check .",
37
+ "smoke:packed": "node --experimental-strip-types scripts/smoke-packed-core.ts",
38
+ "sync:colorscope": "vitest run src/colorscope-sync.test.ts",
39
+ "test": "vitest run",
40
+ "typecheck": "tsc --noEmit"
41
41
  }
42
- }
42
+ }