@instruments/taxonomy 1.6.0 → 1.8.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.
@@ -23,7 +23,7 @@ export { KNOWLEDGE_GRAPH, LEXICAL_ENTRIES, TAXONOMY_BASE_URI, type AxisNode, typ
23
23
  export declare const MATERIAL_FAMILIES: readonly ["paint", "wall-finish", "wallcovering", "textile", "upholstery", "carpet", "wood", "stone", "tile", "terrazzo", "metal", "glass", "resilient-flooring", "composite", "concrete", "leather", "other"];
24
24
  export type MaterialFamily = (typeof MATERIAL_FAMILIES)[number];
25
25
  export declare const isMaterialFamily: (value: string) => value is MaterialFamily;
26
- export declare const SECTORS: readonly ["hospitality", "healthcare", "workplace", "residential", "retail", "education", "civic", "mixed-use", "transportation", "other", "commercial", "industrial"];
26
+ export declare const SECTORS: readonly ["hospitality", "healthcare", "workplace", "residential", "retail", "education", "civic", "mixed-use", "transportation", "other", "commercial", "industrial", "senior-living", "government", "science-technology", "cultural", "sports-recreation", "marine"];
27
27
  export type Sector = (typeof SECTORS)[number];
28
28
  export declare const isSector: (value: string) => value is Sector;
29
29
  export declare const APPLICATIONS: readonly ["wall", "flooring", "ceiling", "bath", "kitchen", "furniture", "lighting", "door", "window", "facade", "countertop", "fireplace", "stair-elevator", "bedding", "decor", "vertically-hanging", "transportation", "pool-fountain", "paving-deck", "partition", "millwork", "cabinetry", "masonry", "roof", "garage", "bar", "awning-umbrella", "recreation-sport", "ornamentation", "aquatic-environments", "upholstery", "trim", "wall-backsplash", "wall-upholstered", "wall-wet-shower", "flooring-wet-area", "flooring-entrance", "flooring-radiant-heat", "flooring-or-lab", "flooring-anti-fatigue", "flooring-esd", "flooring-safety-slip", "flooring-raised-access", "flooring-rigid-core", "flooring-dining-area", "flooring-subject-oil", "flooring-walk-in-freezer", "flooring-ramps-inclines", "furniture-seating", "furniture-headboard", "furniture-slipcover", "furniture-systems", "furniture-tackboard", "furniture-throw-pillow", "fireplace-firebox", "fireplace-hearth", "fireplace-mantel", "fireplace-surround", "bedding-bed-scarf", "bedding-sheets", "bedding-skirt", "bedding-bedspread", "bedding-box-spring-cover", "stair-riser", "stair-tread", "stair-railing", "stair-elevator-cladding", "vh-drapery", "vh-privacy-curtain", "vh-shower-curtain", "vh-theatrical-curtain", "vh-window-shade", "transportation-automotive", "transportation-aviation", "transportation-marine", "pool-coping", "pool-decking", "pool-lining", "paving-covered-areas", "paving-patio", "partition-toilet", "masonry-structural", "masonry-veneer", "recreation-gymnasium", "recreation-playground", "recreation-weightlifting", "awning", "tensile-structure", "umbrella", "countertop-chemical-resistant"];
@@ -13,7 +13,7 @@ export { FORMAT_TERMS } from "./format.js";
13
13
  export { INSTALLATION_LAYOUT_TERMS } from "./installation-layout.js";
14
14
  export { MATERIAL_TERMS } from "./material.js";
15
15
  export { MOOD_TERMS } from "./mood.js";
16
- export { PATTERN_TERMS } from "./pattern.js";
16
+ export { PATTERN_FIGURE_TERMS, PATTERN_TERMS } from "./pattern.js";
17
17
  export { PRODUCT_CATEGORY_TERMS } from "./product-category.js";
18
18
  export { REQUIREMENT_TERMS } from "./requirement.js";
19
19
  export { SEASON_TERMS } from "./season.js";
@@ -9,5 +9,12 @@ export declare const PATTERN_DENSITY_TERMS: readonly Term[];
9
9
  export declare const PATTERN_REGULARITY_TERMS: readonly Term[];
10
10
  /** Which way the pattern runs. Unordered: see the header on why this is not a ladder. */
11
11
  export declare const PATTERN_DIRECTIONALITY_TERMS: readonly Term[];
12
+ /**
13
+ * The natural variation of a stone, stone-effect or timber surface, independent of motif. See
14
+ * ADR 0008. Unranked, for the reason type is: veined is not more figured than speckled, only
15
+ * differently so. Evidenced from the Material Bank PIM's surface-figure column (non-Samplize
16
+ * SKUs, 2026-09-26); the PIM's own spelling is preserved in `seenAs`.
17
+ */
18
+ export declare const PATTERN_FIGURE_TERMS: readonly Term[];
12
19
  /** Kept for consumers importing the axis as one list; prefer the facets. */
13
20
  export declare const PATTERN_TERMS: readonly Term[];
package/dist/index.js CHANGED
@@ -10,6 +10,12 @@ var AUTHORED_SECTOR = {
10
10
  basis: "authored",
11
11
  source: "@instruments/taxonomy - umbrella authored over the vendored sector dictionary, against the local `commercial` and `industrial` extension in a materials-retrieval system (src-05), 2026-09-19"
12
12
  };
13
+ var MARKETPLACE_SECTOR = {
14
+ basis: "evidenced",
15
+ snapshot: "2026-09-20",
16
+ source: "the industry_sector column in a materials-marketplace catalogue (src-04)"
17
+ };
18
+ var MARKETPLACE_SECTOR_REVIEW = "2026-09-23";
13
19
  var MATERIAL_FAMILY_TERMS = [
14
20
  { label: "Paint", slug: "paint" },
15
21
  {
@@ -78,6 +84,82 @@ var SECTOR_TERMS = [
78
84
  note: "The market, never the idiom. `style.industrial` is the aesthetic a converted mill lends a flat, and the corpus publishes the spelling as ambiguous between the two rather than merging them.",
79
85
  provenance: AUTHORED_SECTOR,
80
86
  slug: "industrial"
87
+ },
88
+ {
89
+ // EVIDENCED, and a ROOT. The largest sector value the marketplace catalogue carries that had
90
+ // no term here; a consumer had been filing it under `residential`, which is true of independent
91
+ // living and false of memory care.
92
+ definition: "A project housing older adults with services or care on site: independent living, assisted living, memory care and continuing-care communities.",
93
+ introducedAt: MARKETPLACE_SECTOR_REVIEW,
94
+ label: "Senior Living",
95
+ note: "Under neither `residential` nor `healthcare`. Independent living is a home with services and not a care setting; memory care is a care setting and not an ordinary home; so an ISA edge to either parent is true of one end of the market and false of the other. A project that is also plainly one of those carries both terms. A hospital's geriatric ward is healthcare, not this.",
96
+ provenance: MARKETPLACE_SECTOR,
97
+ reviewedAt: MARKETPLACE_SECTOR_REVIEW,
98
+ seenAs: ["Senior Living"],
99
+ slug: "senior-living"
100
+ },
101
+ {
102
+ // EVIDENCED, and the one new term that takes a vendored parent's name for its own ISA edge:
103
+ // every government project is a civic one. The reverse is not true, which is why `civic` is
104
+ // not relabelled: a community centre or a public square is civic and has no public authority
105
+ // for a client.
106
+ broaderSlug: "civic",
107
+ definition: "A project for a public authority's own premises: legislatures, courthouses, town and city halls, government offices, embassies, and police and fire stations.",
108
+ introducedAt: MARKETPLACE_SECTOR_REVIEW,
109
+ label: "Government",
110
+ note: "Beneath `civic`, which also covers public buildings with no authority as client. Defence estate is not named here; nothing in the evidence asked for it. `typology.civic-building` is the building, this is the market, and a council office in a converted warehouse is government whatever the building was.",
111
+ provenance: MARKETPLACE_SECTOR,
112
+ reviewedAt: MARKETPLACE_SECTOR_REVIEW,
113
+ seenAs: ["Government"],
114
+ slug: "government"
115
+ },
116
+ {
117
+ // EVIDENCED, and a ROOT. A consumer had been filing it under `other`.
118
+ definition: "A project whose premises exist for research, development and testing: laboratories, research institutes, cleanrooms and research-and-development buildings.",
119
+ introducedAt: MARKETPLACE_SECTOR_REVIEW,
120
+ label: "Science & Technology",
121
+ note: "Not under `commercial`: a university or state research institute is not let or run as revenue-earning premises. A teaching laboratory in a school is `education` and a hospital's pathology laboratory is `healthcare`; a building that exists for research carries this term whoever owns it, and may carry either of those as well.",
122
+ provenance: MARKETPLACE_SECTOR,
123
+ reviewedAt: MARKETPLACE_SECTOR_REVIEW,
124
+ seenAs: ["Science + Technology"],
125
+ slug: "science-technology"
126
+ },
127
+ {
128
+ // EVIDENCED, and a ROOT rather than a child of `civic`, which is where a consumer had been
129
+ // filing it.
130
+ definition: "A project for keeping, showing or performing culture: museums, galleries, libraries, archives, theatres and concert halls.",
131
+ introducedAt: MARKETPLACE_SECTOR_REVIEW,
132
+ label: "Cultural",
133
+ note: "Not beneath `civic`. A civic museum or a public library is both and carries both terms, but a commercial gallery or a privately run theatre is cultural and not civic, so the ISA edge would be false of part of the market. The building types are `typology.museum`, `typology.gallery`, `typology.library` and `typology.theatre`; this is the market they serve.",
134
+ provenance: MARKETPLACE_SECTOR,
135
+ reviewedAt: MARKETPLACE_SECTOR_REVIEW,
136
+ seenAs: ["Cultural"],
137
+ slug: "cultural"
138
+ },
139
+ {
140
+ // EVIDENCED, and a ROOT. A consumer had been filing it under `other`.
141
+ definition: "A project for sport, fitness and active recreation: stadiums, arenas, sports and leisure centres, gyms, pools and clubhouses.",
142
+ introducedAt: MARKETPLACE_SECTOR_REVIEW,
143
+ label: "Sports & Recreation",
144
+ note: "The market. `application.recreation-sport` is the product-facing claim that a material may be specified for a sports use, and `typology.gym` and `typology.stadium` are the buildings. Not under `commercial`: a municipal leisure centre or a school sports hall is not run as revenue-earning premises. A hotel gym is `hospitality`.",
145
+ provenance: MARKETPLACE_SECTOR,
146
+ reviewedAt: MARKETPLACE_SECTOR_REVIEW,
147
+ seenAs: ["Sports + Recreation"],
148
+ slug: "sports-recreation"
149
+ },
150
+ {
151
+ // EVIDENCED, and beneath the vendored `transportation`, whose vehicle sense the APPLICATION
152
+ // axis already spells out as automotive, aviation and marine. A consumer had been filing it
153
+ // under `other`.
154
+ broaderSlug: "transportation",
155
+ definition: "A project fitting out a vessel: yachts, cruise ships, ferries and other boats, their interiors and exposed decks.",
156
+ introducedAt: MARKETPLACE_SECTOR_REVIEW,
157
+ label: "Marine",
158
+ note: "Beneath `transportation`, which covers the vehicle as well as the station. `application.transportation-marine` is the product-facing claim under the same word, and the corpus publishes the spelling as ambiguous between the two rather than merging them. A cruise ship's hotel decks may carry `hospitality` as well. A waterfront building is not marine: it takes the sector of what it is.",
159
+ provenance: MARKETPLACE_SECTOR,
160
+ reviewedAt: MARKETPLACE_SECTOR_REVIEW,
161
+ seenAs: ["Marine"],
162
+ slug: "marine"
81
163
  }
82
164
  ];
83
165
  var APPLICATION_TERMS = [
@@ -398,6 +480,16 @@ var term = (slug, label, definition) => ({
398
480
  provenance: { basis: "evidenced", snapshot: SNAPSHOT, source: SOURCE },
399
481
  slug
400
482
  });
483
+ var TAX57_DATE = "2026-09-26";
484
+ var reviewedTax57 = (slug, label, definition, source, extra = {}) => ({
485
+ definition,
486
+ introducedAt: TAX57_DATE,
487
+ label,
488
+ provenance: { basis: "referenced", snapshot: TAX57_DATE, source },
489
+ reviewedAt: TAX57_DATE,
490
+ slug,
491
+ ...extra
492
+ });
401
493
  var CONSTRUCTION_TERMS = [
402
494
  term(
403
495
  "encaustic",
@@ -562,6 +654,61 @@ var CONSTRUCTION_TERMS = [
562
654
  "Chenille",
563
655
  "A fabric woven from chenille yarn, a fuzzy pile yarn cut from a leno-woven strip; fibre and backing remain unspecified.",
564
656
  wikidata("Q1070065", "chenille")
657
+ ),
658
+ // TAX-57 pile family. `cut-pile` is loop pile's sibling rather than its parent: both sit directly
659
+ // under the same distinction (whether the loop was cut), and neither loop pile nor cut pile is a
660
+ // kind of the other.
661
+ reviewedTax57(
662
+ "cut-pile",
663
+ "Cut pile",
664
+ "A textile or carpet pile construction whose loops have been cut or shorn, so the yarn ends stand free rather than remaining looped.",
665
+ wikidata("Q64160809", "cut pile")
666
+ ),
667
+ reviewedTax57(
668
+ "plush",
669
+ "Plush",
670
+ "A dense cut-pile fabric with a pile longer than velvet's.",
671
+ wikidata("Q1057522", "plush"),
672
+ { broaderSlug: "cut-pile" }
673
+ ),
674
+ // Velour is not velvet: velvet is woven only, and velour is shorter and denser than plush.
675
+ reviewedTax57(
676
+ "velour",
677
+ "Velour",
678
+ "A knitted or woven cut-pile fabric with a shorter, denser pile than plush; distinct from velvet, which is woven only.",
679
+ wikidata("Q621044", "velour"),
680
+ { broaderSlug: "cut-pile" }
681
+ ),
682
+ reviewedTax57(
683
+ "corduroy",
684
+ "Corduroy",
685
+ "A cut-pile fabric whose pile stands in parallel ridges, called wales, running the length of the cloth.",
686
+ wikidata("Q1132110", "corduroy"),
687
+ { broaderSlug: "cut-pile" }
688
+ ),
689
+ reviewedTax57(
690
+ "tweed",
691
+ "Tweed",
692
+ "A rough-surfaced woven fabric made from mixed-colour yarns, traditionally wool.",
693
+ wikidata("Q40601", "tweed"),
694
+ { broaderSlug: "woven" }
695
+ ),
696
+ reviewedTax57(
697
+ "grasscloth",
698
+ "Grasscloth",
699
+ "A wallcovering woven from natural grass or plant-fibre strands and laminated to a paper backing; the fibre itself is a separate material claim.",
700
+ wikidata("Q106946072", "grass cloth"),
701
+ { related: [{ predicate: "related-to", target: "material.grass" }] }
702
+ ),
703
+ // Jacquard is a woven figure, narrower than `woven`: every jacquard is woven, and the mechanism
704
+ // (independently controlled warps) is what makes complex figured repeats possible on a loom that
705
+ // a simple shed cannot produce.
706
+ reviewedTax57(
707
+ "jacquard",
708
+ "Jacquard",
709
+ "A woven figure produced on a loom that raises each warp thread under individual mechanical control, rather than through a single repeating shed.",
710
+ wikidata("Q589613", "Jacquard weaving"),
711
+ { broaderSlug: "woven" }
565
712
  )
566
713
  ];
567
714
 
@@ -1314,6 +1461,8 @@ var CORPUS_SNAPSHOT = "2026-08-27";
1314
1461
  var DROPPED = "Restored 2026-08-27. Dropped in normalisation.";
1315
1462
  var REVIEW_DATE3 = "2026-09-11";
1316
1463
  var REVIEW_SOURCE2 = "everyday-interiors vocabulary review";
1464
+ var TAX57_DATE2 = "2026-09-26";
1465
+ var TAX57_SOURCE = "Linear TAX-57 visual-vocabulary review";
1317
1466
  var wikidata2 = (id, label) => `Wikidata ${id} ${label}, https://www.wikidata.org/wiki/${id}`;
1318
1467
  var reviewed2 = (slug, label, definition, source, extra = {}) => ({
1319
1468
  definition,
@@ -1575,7 +1724,27 @@ var FINISH_TEXTURE_TERMS = [
1575
1724
  "heavily-reliefed",
1576
1725
  "Heavily reliefed",
1577
1726
  "Deep, strongly modelled relief."
1578
- )
1727
+ ),
1728
+ // TAX-57: Material Bank PIM leather-finish textures, non-Samplize SKUs, measured 2026-09-26.
1729
+ {
1730
+ broaderSlug: "embossed",
1731
+ definition: "A fine, uniform cross-hatch grain embossed into leather to increase scratch resistance and give a formal, structured surface.",
1732
+ introducedAt: TAX57_DATE2,
1733
+ label: "Saffiano",
1734
+ // AUTHORED. No Wikidata item for saffiano leather on the review date.
1735
+ provenance: { basis: "authored", source: TAX57_SOURCE },
1736
+ reviewedAt: TAX57_DATE2,
1737
+ slug: "saffiano"
1738
+ },
1739
+ // AUTHORED. No Wikidata item for hair-on hide on the review date.
1740
+ {
1741
+ definition: "A hide finished with the hair left on rather than removed in tanning.",
1742
+ introducedAt: TAX57_DATE2,
1743
+ label: "Hair-on",
1744
+ provenance: { basis: "authored", source: TAX57_SOURCE },
1745
+ reviewedAt: TAX57_DATE2,
1746
+ slug: "hair-on"
1747
+ }
1579
1748
  ];
1580
1749
  var FINISH_TERMS = [
1581
1750
  ...FINISH_TREATMENT_TERMS,
@@ -4763,6 +4932,7 @@ var MATERIAL_TIMBERS_TERMS = [
4763
4932
  var SOURCE3 = "material vocabularies in a furnishings retailer (src-03) and in-house";
4764
4933
  var SNAPSHOT3 = "2026-08-25";
4765
4934
  var CROSSOVER_SNAPSHOT2 = "2026-08-30";
4935
+ var TAX57_REVIEW_DATE = "2026-09-26";
4766
4936
  var NATURAL_FIBRE_SLUG2 = "natural-fibre";
4767
4937
  var STONE_SLUG2 = "stone";
4768
4938
  var HARDWOOD_SLUG2 = "hardwood";
@@ -5124,6 +5294,21 @@ var MATERIAL_TERMS = [
5124
5294
  broaderSlug: "leather",
5125
5295
  reviewedAt: COMPOSITION_REVIEW_DATE
5126
5296
  },
5297
+ // TAX-57. Nubuck sits beside suede: both are a leather surface mechanically finished to a nap,
5298
+ // told apart by which side of the hide carries it.
5299
+ {
5300
+ broaderSlug: "leather",
5301
+ definition: "Top-grain leather whose grain side is sanded or buffed to a short nap of protein fibres, producing a velvet-like surface distinct from suede's flesh-side nap.",
5302
+ introducedAt: TAX57_REVIEW_DATE,
5303
+ label: "Nubuck",
5304
+ provenance: {
5305
+ basis: "referenced",
5306
+ snapshot: TAX57_REVIEW_DATE,
5307
+ source: `Wikidata Q28864 nubuck, https://www.wikidata.org/wiki/Q28864; ${CROSSOVER_DEFINITION_SOURCES.suede}`
5308
+ },
5309
+ reviewedAt: TAX57_REVIEW_DATE,
5310
+ slug: "nubuck"
5311
+ },
5127
5312
  reparented(
5128
5313
  crossoverTerm(
5129
5314
  "concrete",
@@ -5640,6 +5825,30 @@ var GEOMETRY_SOURCE = "Linear TAX-45 reviewed implementation contract";
5640
5825
  var REVIEW_DATE7 = "2026-09-11";
5641
5826
  var REVIEW_SOURCE6 = "everyday-interiors vocabulary review";
5642
5827
  var GEOMETRY_EVIDENCE_SOURCE = "Linear TAX-45 reviewed implementation contract; herringbone and chevron product-language audit in a materials-retrieval system (src-05)";
5828
+ var TAX57_DATE3 = "2026-09-26";
5829
+ var TAX57_SOURCE2 = "Linear TAX-57 visual-vocabulary review";
5830
+ var PIM_MOTIF_SOURCE = "the pattern-motif column in a materials-marketplace catalogue (src-04), non-Samplize SKUs";
5831
+ var PIM_FIGURE_SOURCE = "the surface-figure column in a materials-marketplace catalogue (src-04), non-Samplize SKUs";
5832
+ var ANIMAL_PRINT_SLUG = "animal-print";
5833
+ var pimTerm = (slug, label, definition, source, extra = {}) => ({
5834
+ definition,
5835
+ introducedAt: TAX57_DATE3,
5836
+ label,
5837
+ provenance: { basis: "evidenced", snapshot: TAX57_DATE3, source },
5838
+ reviewedAt: TAX57_DATE3,
5839
+ slug,
5840
+ ...extra
5841
+ });
5842
+ var authoredTax57 = (slug, label, definition, extra = {}) => ({
5843
+ definition,
5844
+ introducedAt: TAX57_DATE3,
5845
+ label,
5846
+ provenance: { basis: "authored", source: TAX57_SOURCE2 },
5847
+ reviewedAt: TAX57_DATE3,
5848
+ slug,
5849
+ ...extra
5850
+ });
5851
+ var wikidata4 = (id, label) => `Wikidata ${id} ${label}, https://www.wikidata.org/wiki/${id}`;
5643
5852
  var term7 = (slug, label, definition, extra = {}) => ({
5644
5853
  definition,
5645
5854
  label,
@@ -5666,14 +5875,84 @@ var PATTERN_TYPE_TERMS = [
5666
5875
  "Non-representational marks organised with irregular or biomorphic movement."
5667
5876
  ),
5668
5877
  term7(
5669
- "animal-print",
5878
+ ANIMAL_PRINT_SLUG,
5670
5879
  "Animal print",
5671
5880
  "A motif derived from animal markings or skins."
5672
5881
  ),
5882
+ // Faux Crocodile, Faux Snake Skin, Faux Ostrich, Leopard, Zebra and Faux Lizard in the Material
5883
+ // Bank PIM (non-Samplize SKUs, 2026-09-26) name six distinct skin or hide motifs the single
5884
+ // `animal-print` concept could not distinguish. Narrower rather than a rename: every one of these
5885
+ // is still an animal print.
5886
+ pimTerm(
5887
+ "crocodile",
5888
+ "Crocodile",
5889
+ "A motif derived from crocodile or alligator skin's raised, roughly rectangular scale blocks.",
5890
+ PIM_MOTIF_SOURCE,
5891
+ { broaderSlug: ANIMAL_PRINT_SLUG, seenAs: ["Faux Crocodile"] }
5892
+ ),
5893
+ pimTerm(
5894
+ "snakeskin",
5895
+ "Snakeskin",
5896
+ "A motif derived from snake skin's overlapping diamond or lozenge-shaped scales.",
5897
+ PIM_MOTIF_SOURCE,
5898
+ { broaderSlug: ANIMAL_PRINT_SLUG, seenAs: ["Faux Snake Skin"] }
5899
+ ),
5900
+ pimTerm(
5901
+ "ostrich",
5902
+ "Ostrich",
5903
+ "A motif derived from ostrich skin's raised quill-follicle bumps.",
5904
+ PIM_MOTIF_SOURCE,
5905
+ { broaderSlug: ANIMAL_PRINT_SLUG, seenAs: ["Faux Ostrich"] }
5906
+ ),
5907
+ pimTerm(
5908
+ "lizard",
5909
+ "Lizard",
5910
+ "A motif derived from lizard skin's small, irregular, close-set scales.",
5911
+ PIM_MOTIF_SOURCE,
5912
+ { broaderSlug: ANIMAL_PRINT_SLUG, seenAs: ["Faux Lizard"] }
5913
+ ),
5914
+ pimTerm(
5915
+ "leopard",
5916
+ "Leopard",
5917
+ "A motif derived from leopard fur's dark, irregular rosette markings on a tawny ground.",
5918
+ PIM_MOTIF_SOURCE,
5919
+ { broaderSlug: ANIMAL_PRINT_SLUG }
5920
+ ),
5921
+ pimTerm(
5922
+ "zebra",
5923
+ "Zebra",
5924
+ "A motif derived from zebra hide's alternating dark and pale parallel stripes.",
5925
+ PIM_MOTIF_SOURCE,
5926
+ { broaderSlug: ANIMAL_PRINT_SLUG }
5927
+ ),
5673
5928
  term7(
5674
5929
  "botanical",
5675
5930
  "Botanical",
5676
- "A representational motif of plants, flowers, foliage or fruit."
5931
+ "A representational motif of plants, flowers, foliage or fruit.",
5932
+ // Botanical's definition already reaches flowers; floral is an observed spelling of the same
5933
+ // concept rather than a second correct name for it, so it is `seenAs`, not an alt label.
5934
+ { seenAs: ["floral"] }
5935
+ ),
5936
+ // Heather in the trade names the same mixed-colour-yarn effect Wikidata records; melange, marled
5937
+ // and heathered are its correct names, none more canonical than another.
5938
+ {
5939
+ altLabels: ["heathered", "marled"],
5940
+ definition: "A mixed-colour yarn effect that gives the surface a flecked, uneven tone rather than one solid colour.",
5941
+ introducedAt: TAX57_DATE3,
5942
+ label: "Melange",
5943
+ provenance: {
5944
+ basis: "referenced",
5945
+ snapshot: TAX57_DATE3,
5946
+ source: wikidata4("Q5693696", "heather (fabric)")
5947
+ },
5948
+ reviewedAt: TAX57_DATE3,
5949
+ slug: "melange"
5950
+ },
5951
+ // AUTHORED. No Wikidata item for strie as a fabric or surface pattern on the review date.
5952
+ authoredTax57(
5953
+ "strie",
5954
+ "Strie",
5955
+ "Fine, irregular streaks running in one direction across the surface."
5677
5956
  ),
5678
5957
  term7(
5679
5958
  "damask",
@@ -5759,7 +6038,8 @@ var PATTERN_TYPE_TERMS = [
5759
6038
  term7(
5760
6039
  "marbleised",
5761
6040
  "Marbleised",
5762
- "Veining or clouding arranged to evoke marble."
6041
+ "Veining or clouding arranged to evoke marble.",
6042
+ { altLabels: ["marbleized"] }
5763
6043
  ),
5764
6044
  term7(
5765
6045
  "metal-effect",
@@ -5991,12 +6271,133 @@ var PATTERN_DIRECTIONALITY_TERMS = [
5991
6271
  "Two axes of equal weight, so the material reads correctly either way up."
5992
6272
  )
5993
6273
  ];
6274
+ var PATTERN_FIGURE_TERMS = [
6275
+ pimTerm(
6276
+ "unvaried",
6277
+ "Unvaried",
6278
+ "No visible natural variation across the surface.",
6279
+ PIM_FIGURE_SOURCE,
6280
+ { seenAs: ["No Variation"] }
6281
+ ),
6282
+ pimTerm(
6283
+ "speckled",
6284
+ "Speckled",
6285
+ "Fine flecks and speckles scattered across the surface.",
6286
+ PIM_FIGURE_SOURCE,
6287
+ { seenAs: ["Flecks & Speckles"] }
6288
+ ),
6289
+ pimTerm(
6290
+ "linear-veining",
6291
+ "Linear veining",
6292
+ "Veining running in one consistent direction across the surface.",
6293
+ PIM_FIGURE_SOURCE,
6294
+ { seenAs: ["Linear Veins"] }
6295
+ ),
6296
+ pimTerm(
6297
+ "multi-directional-veining",
6298
+ "Multi-directional veining",
6299
+ "Veining running in more than one direction across the surface, with no single dominant axis.",
6300
+ PIM_FIGURE_SOURCE,
6301
+ { seenAs: ["Multi-Directional Veins"] }
6302
+ ),
6303
+ pimTerm(
6304
+ "mottled",
6305
+ "Mottled",
6306
+ "Uneven patches or blotches of tone breaking up an otherwise even surface.",
6307
+ PIM_FIGURE_SOURCE
6308
+ ),
6309
+ pimTerm(
6310
+ "cloudy",
6311
+ "Cloudy",
6312
+ "Soft, diffuse variation in tone with no distinct veins or edges, reading as drifting cloud.",
6313
+ PIM_FIGURE_SOURCE
6314
+ ),
6315
+ pimTerm(
6316
+ "breccia",
6317
+ "Breccia",
6318
+ "Angular fragments of stone bound within a contrasting matrix.",
6319
+ `${PIM_FIGURE_SOURCE}; ${wikidata4("Q191250", "breccia")}`,
6320
+ { seenAs: ["Angular Fragments"] }
6321
+ ),
6322
+ pimTerm(
6323
+ "swirling",
6324
+ "Swirling",
6325
+ "Variation that curls and eddies across the surface rather than running in straight lines or veins.",
6326
+ PIM_FIGURE_SOURCE
6327
+ ),
6328
+ pimTerm(
6329
+ "fossiliferous",
6330
+ "Fossil",
6331
+ "Visible shells or fossil forms embedded in the surface.",
6332
+ PIM_FIGURE_SOURCE,
6333
+ { seenAs: ["Shells & Fossils"] }
6334
+ ),
6335
+ pimTerm(
6336
+ "pitted",
6337
+ "Pitted",
6338
+ "Surface holes and pitting left unfilled, as in unfilled travertine.",
6339
+ PIM_FIGURE_SOURCE,
6340
+ { seenAs: ["Holes & Pitting"] }
6341
+ ),
6342
+ pimTerm(
6343
+ "brindled",
6344
+ "Brindled",
6345
+ "Irregular streaky variation running through the surface, as in a brindled coat.",
6346
+ PIM_FIGURE_SOURCE,
6347
+ { seenAs: ["Brindle"] }
6348
+ ),
6349
+ pimTerm(
6350
+ "mineral-inclusions",
6351
+ "Mineral inclusions",
6352
+ "Visible mineral deposits embedded within the surface.",
6353
+ PIM_FIGURE_SOURCE,
6354
+ { seenAs: ["Mineral Deposits"] }
6355
+ ),
6356
+ // `rustic` is deliberately not an alt label: it names a style, and prominent knots do not make a
6357
+ // timber rustic in the style sense, so treating the words as interchangeable would smuggle a
6358
+ // STYLE claim into a FIGURE one.
6359
+ pimTerm(
6360
+ "knotty",
6361
+ "Knotty",
6362
+ "Timber figure carrying prominent, frequent knots.",
6363
+ PIM_FIGURE_SOURCE,
6364
+ { seenAs: ["Knots"] }
6365
+ ),
6366
+ // AUTHORED. No Material Bank PIM column value names the absence of figure; clear grain is the
6367
+ // un-figured baseline that gives knotty, burl, fiddleback and bird's-eye something to contrast
6368
+ // against. It is not their parent: figure is unranked and unordered, and a plain surface is not
6369
+ // a kind of knotty one, only its absence.
6370
+ authoredTax57(
6371
+ "clear-grain",
6372
+ "Clear grain",
6373
+ "Timber figure free of knots, with an even, minimally figured grain."
6374
+ ),
6375
+ pimTerm(
6376
+ "burl",
6377
+ "Burl",
6378
+ "A swirling, densely clustered grain figure cut from a tree's burl growth.",
6379
+ `${PIM_FIGURE_SOURCE}; ${wikidata4("Q1483529", "burl")}`
6380
+ ),
6381
+ // AUTHORED. No Wikidata item for fiddleback figure on the review date.
6382
+ authoredTax57(
6383
+ "fiddleback",
6384
+ "Fiddleback",
6385
+ "A tight, uniform rippled figure running across the grain, historically prized for violin backs."
6386
+ ),
6387
+ pimTerm(
6388
+ "birds-eye",
6389
+ "Bird's eye",
6390
+ "Small, round, eye-like figure dots scattered through the grain, as in bird's-eye maple.",
6391
+ `${PIM_FIGURE_SOURCE}; ${wikidata4("Q164973", "bird's eye figure")}`
6392
+ )
6393
+ ];
5994
6394
  var PATTERN_TERMS = [
5995
6395
  ...PATTERN_TYPE_TERMS,
5996
6396
  ...PATTERN_SCALE_TERMS,
5997
6397
  ...PATTERN_DENSITY_TERMS,
5998
6398
  ...PATTERN_REGULARITY_TERMS,
5999
- ...PATTERN_DIRECTIONALITY_TERMS
6399
+ ...PATTERN_DIRECTIONALITY_TERMS,
6400
+ ...PATTERN_FIGURE_TERMS
6000
6401
  ];
6001
6402
 
6002
6403
  // src/axes/period.ts
@@ -6885,7 +7286,7 @@ var AUTHORED5 = {
6885
7286
  basis: "authored",
6886
7287
  source: "@instruments/taxonomy ADR 0006"
6887
7288
  };
6888
- var wikidata4 = (identifier, label) => ({
7289
+ var wikidata5 = (identifier, label) => ({
6889
7290
  identifier,
6890
7291
  label,
6891
7292
  match: "exact",
@@ -6905,25 +7306,25 @@ var SEASON_TERMS = [
6905
7306
  "spring",
6906
7307
  "Spring",
6907
7308
  "The temperate season between winter and summer, when the days lengthen.",
6908
- { external: [wikidata4("Q1312", "spring")] }
7309
+ { external: [wikidata5("Q1312", "spring")] }
6909
7310
  ),
6910
7311
  term10(
6911
7312
  "summer",
6912
7313
  "Summer",
6913
7314
  "The temperate season between spring and autumn, when the days are longest.",
6914
- { external: [wikidata4("Q1313", "summer")] }
7315
+ { external: [wikidata5("Q1313", "summer")] }
6915
7316
  ),
6916
7317
  term10(
6917
7318
  "autumn",
6918
7319
  "Autumn",
6919
7320
  "The temperate season between summer and winter, when the days shorten.",
6920
- { altLabels: ["fall"], external: [wikidata4("Q1314", "autumn")] }
7321
+ { altLabels: ["fall"], external: [wikidata5("Q1314", "autumn")] }
6921
7322
  ),
6922
7323
  term10(
6923
7324
  "winter",
6924
7325
  "Winter",
6925
7326
  "The temperate season between autumn and spring, when the days are shortest.",
6926
- { external: [wikidata4("Q1311", "winter")] }
7327
+ { external: [wikidata5("Q1311", "winter")] }
6927
7328
  )
6928
7329
  ];
6929
7330
 
@@ -10840,7 +11241,8 @@ var AXES = [
10840
11241
  label: "Directionality",
10841
11242
  slug: "directionality",
10842
11243
  terms: PATTERN_DIRECTIONALITY_TERMS
10843
- }
11244
+ },
11245
+ { label: "Figure", slug: "figure", terms: PATTERN_FIGURE_TERMS }
10844
11246
  ],
10845
11247
  label: "Pattern",
10846
11248
  question: "What motif or surface organisation does it carry?",
@@ -11120,8 +11522,8 @@ var resolveReference = (reference) => INDEX.byKey.get(canonicalKey(reference));
11120
11522
 
11121
11523
  // src/v1.ts
11122
11524
  var TAXONOMY_BASE_URI = "https://taxonomy.materialinstruments.com";
11123
- var TAXONOMY_SNAPSHOT = "2026-09-22";
11124
- var TAXONOMY_VERSION = "1.6.0";
11525
+ var TAXONOMY_SNAPSHOT = "2026-09-26";
11526
+ var TAXONOMY_VERSION = "1.8.0";
11125
11527
  var PUBLISHED_V1_BASELINE = "2026-08-30";
11126
11528
  var TAX45_REVIEW_SNAPSHOT = "2026-08-31";
11127
11529
  var LIMESTONE_INTRODUCED = "2026-09-01";
@@ -11424,6 +11826,15 @@ var HIERARCHY_REVIEW_LIFECYCLE = {
11424
11826
  status: "active"
11425
11827
  };
11426
11828
  var AMBIGUITY_GOVERNANCE = "Taxonomy preserves the governed readings without assigning a default, role, contextual preference, or consumer route.";
11829
+ var ORDERED_READING_GOVERNANCE = "The two readings are deliberately separate; the default records trade usage and does not merge the concepts.";
11830
+ var TAX57_DATE4 = "2026-09-26";
11831
+ var TAX57_LIFECYCLE = {
11832
+ introducedAt: TAX57_DATE4,
11833
+ reviewedAt: TAX57_DATE4,
11834
+ status: "active"
11835
+ };
11836
+ var TAX57_SHAPE_SOURCE = "the tile-shape column in a materials-marketplace catalogue (src-04), non-Samplize SKUs";
11837
+ var TAX57_REVIEW_SOURCE = "Linear TAX-57 visual-vocabulary review";
11427
11838
  var REVIEW_DATE12 = "2026-09-11";
11428
11839
  var REVIEW_LIFECYCLE = {
11429
11840
  introducedAt: REVIEW_DATE12,
@@ -11845,7 +12256,7 @@ var AUTHORED_LEXICAL_ENTRIES = [
11845
12256
  defaultTarget: ENGINEERED_QUARTZ_SURFACING,
11846
12257
  explanation: "Quartz can name the engineered quartz surfacing sold for worktops or the mineral silicon dioxide; the trade means the surfacing first, and neither is a child of the other.",
11847
12258
  governance: lexicalGovernance(
11848
- "The two readings are deliberately separate; the default records trade usage and does not merge the concepts.",
12259
+ ORDERED_READING_GOVERNANCE,
11849
12260
  {
11850
12261
  basis: "evidenced",
11851
12262
  snapshot: HIERARCHY_REVIEW_DATE,
@@ -11861,7 +12272,7 @@ var AUTHORED_LEXICAL_ENTRIES = [
11861
12272
  defaultTarget: MELAMINE_BOARD,
11862
12273
  explanation: "Melamine can name melamine-faced board, the panel, or melamine-formaldehyde resin, the polymer its facing is made of; joinery and retail mean the board first.",
11863
12274
  governance: lexicalGovernance(
11864
- "The two readings are deliberately separate; the default records trade usage and does not merge the concepts.",
12275
+ ORDERED_READING_GOVERNANCE,
11865
12276
  {
11866
12277
  basis: "evidenced",
11867
12278
  snapshot: HIERARCHY_REVIEW_DATE,
@@ -12040,6 +12451,131 @@ var AUTHORED_LEXICAL_ENTRIES = [
12040
12451
  reviewedTaxonomy("product-category/countertop")
12041
12452
  ]
12042
12453
  },
12454
+ // TAX-57 unit-shape compounds. Each names two governed shapes in one phrase, which the current
12455
+ // lexical contract cannot express as a single multi-target reading, so the alternatives are kept
12456
+ // as an explicit ambiguity or, where one alternative is already an alt label of the other, an
12457
+ // equivalent - never a silently chosen shape.
12458
+ {
12459
+ defaultTarget: {
12460
+ authority: "taxonomy",
12461
+ role: "primary",
12462
+ uri: `${TAXONOMY_BASE_URI}/id/unit-shape/arabesque`
12463
+ },
12464
+ explanation: "Arabesque can name the taxonomy's bilaterally organised ornamental unit shape or, in Material Bank PIM usage, the star and cross units of a Moroccan tile assortment; the bare word does not settle which.",
12465
+ governance: lexicalGovernance(
12466
+ "The default records the taxonomy's own governed shape; the PIM-evidenced star and cross readings are recorded as secondary rather than merged into one multi-concept reading.",
12467
+ { basis: "evidenced", snapshot: TAX57_DATE4, source: TAX57_SHAPE_SOURCE },
12468
+ TAX57_LIFECYCLE
12469
+ ),
12470
+ outcome: "ambiguous",
12471
+ phrase: "arabesque",
12472
+ readings: [
12473
+ {
12474
+ authority: "taxonomy",
12475
+ role: "primary",
12476
+ uri: `${TAXONOMY_BASE_URI}/id/unit-shape/arabesque`
12477
+ },
12478
+ {
12479
+ authority: "taxonomy",
12480
+ role: "secondary",
12481
+ uri: `${TAXONOMY_BASE_URI}/id/unit-shape/star`
12482
+ },
12483
+ {
12484
+ authority: "taxonomy",
12485
+ role: "secondary",
12486
+ uri: `${TAXONOMY_BASE_URI}/id/unit-shape/cross`
12487
+ }
12488
+ ]
12489
+ },
12490
+ ...["round & oval", "round and oval"].map(
12491
+ (phrase) => ({
12492
+ explanation: "The compound phrase does not settle whether a round or an oval unit is meant.",
12493
+ governance: lexicalGovernance(
12494
+ AMBIGUITY_GOVERNANCE,
12495
+ {
12496
+ basis: "evidenced",
12497
+ snapshot: TAX57_DATE4,
12498
+ source: TAX57_SHAPE_SOURCE
12499
+ },
12500
+ TAX57_LIFECYCLE
12501
+ ),
12502
+ outcome: "ambiguous",
12503
+ phrase,
12504
+ readings: [
12505
+ {
12506
+ authority: "taxonomy",
12507
+ uri: `${TAXONOMY_BASE_URI}/id/unit-shape/circle`
12508
+ },
12509
+ {
12510
+ authority: "taxonomy",
12511
+ uri: `${TAXONOMY_BASE_URI}/id/unit-shape/oval`
12512
+ }
12513
+ ]
12514
+ })
12515
+ ),
12516
+ {
12517
+ explanation: "The compound phrase names one shape: rhombus, for which diamond is already a governed alt label.",
12518
+ governance: lexicalGovernance(
12519
+ "Taxonomy records the evidenced compound phrase without assigning a consumer route.",
12520
+ { basis: "evidenced", snapshot: TAX57_DATE4, source: TAX57_SHAPE_SOURCE },
12521
+ TAX57_LIFECYCLE
12522
+ ),
12523
+ outcome: "equivalent",
12524
+ phrase: "diamond & rhombus",
12525
+ target: {
12526
+ authority: "taxonomy",
12527
+ uri: `${TAXONOMY_BASE_URI}/id/unit-shape/rhombus`
12528
+ }
12529
+ },
12530
+ {
12531
+ explanation: "The compound phrase does not settle whether a parallelogram unit or a genuine chevron unit is meant.",
12532
+ governance: lexicalGovernance(
12533
+ AMBIGUITY_GOVERNANCE,
12534
+ { basis: "evidenced", snapshot: TAX57_DATE4, source: TAX57_SHAPE_SOURCE },
12535
+ TAX57_LIFECYCLE
12536
+ ),
12537
+ outcome: "ambiguous",
12538
+ phrase: "parallelogram & chevron",
12539
+ readings: [
12540
+ {
12541
+ authority: "taxonomy",
12542
+ uri: `${TAXONOMY_BASE_URI}/id/unit-shape/parallelogram`
12543
+ },
12544
+ {
12545
+ authority: "taxonomy",
12546
+ uri: `${TAXONOMY_BASE_URI}/id/unit-shape/chevron`
12547
+ }
12548
+ ]
12549
+ },
12550
+ // TAX-57 ordered reading. Paint and tile makers use "velvet" as a finish name for a soft-touch,
12551
+ // light-absorbing surface; the trade means the woven cut-pile construction first.
12552
+ {
12553
+ defaultTarget: {
12554
+ authority: "taxonomy",
12555
+ role: "primary",
12556
+ uri: `${TAXONOMY_BASE_URI}/id/construction/velvet`
12557
+ },
12558
+ explanation: "Velvet can name the woven cut-pile construction or a finish name paint and tile makers use for a soft-touch surface; the trade means the construction first.",
12559
+ governance: lexicalGovernance(
12560
+ ORDERED_READING_GOVERNANCE,
12561
+ { basis: "authored", source: TAX57_REVIEW_SOURCE },
12562
+ TAX57_LIFECYCLE
12563
+ ),
12564
+ outcome: "ambiguous",
12565
+ phrase: "velvet",
12566
+ readings: [
12567
+ {
12568
+ authority: "taxonomy",
12569
+ role: "primary",
12570
+ uri: `${TAXONOMY_BASE_URI}/id/construction/velvet`
12571
+ },
12572
+ {
12573
+ authority: "taxonomy",
12574
+ role: "secondary",
12575
+ uri: `${TAXONOMY_BASE_URI}/id/finish/texture/velvety`
12576
+ }
12577
+ ]
12578
+ },
12043
12579
  {
12044
12580
  explanation: "The phrase makes an environmental performance claim that needs product evidence, not a terminology-only mapping.",
12045
12581
  governance: lexicalGovernance(
package/dist/v1.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { ElementPlacement, ExternalMapping, ExternalScheme, PeriodSpan, RelationPredicate, SearchedWithout, StyleKind, TermProvenance, TermUsage, UsageWithheld } from "./term.js";
2
2
  export declare const TAXONOMY_BASE_URI: "https://taxonomy.materialinstruments.com";
3
- export declare const TAXONOMY_SNAPSHOT: "2026-09-22";
4
- export declare const TAXONOMY_VERSION: "1.6.0";
3
+ export declare const TAXONOMY_SNAPSHOT: "2026-09-26";
4
+ export declare const TAXONOMY_VERSION: "1.8.0";
5
5
  export type CanonicalConceptUri = `${typeof TAXONOMY_BASE_URI}/id/${string}`;
6
6
  export type LifecycleStatus = "active" | "deprecated";
7
7
  export interface Lifecycle {
@@ -135,7 +135,7 @@ export declare const TAXONOMY_CORPUS_METADATA: {
135
135
  readonly lexicalEntryCount: number;
136
136
  readonly nodeCount: number;
137
137
  readonly revision: string;
138
- readonly snapshot: "2026-09-22";
139
- readonly version: "1.6.0";
138
+ readonly snapshot: "2026-09-26";
139
+ readonly version: "1.8.0";
140
140
  };
141
141
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instruments/taxonomy",
3
- "version": "1.6.0",
3
+ "version": "1.8.0",
4
4
  "description": "Canonical data-only interiors and architecture knowledge graph and lexical corpus.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "repository": {
@@ -24,13 +24,13 @@
24
24
  "access": "public"
25
25
  },
26
26
  "devDependencies": {
27
- "@howells/lint": "^2.2.0",
28
- "@instruments/colorscope": "7.6.0",
27
+ "@howells/lint": "^3.5.1",
28
+ "@instruments/colorscope": "7.8.0",
29
29
  "@taxonomy/lint-policy": "npm:@howells/lint@1.0.0",
30
- "@types/node": "^26.4.1",
30
+ "@types/node": "^26.6.2",
31
31
  "tsup": "^8.5.1",
32
32
  "typescript": "^7.0.2",
33
- "vitest": "^5.0.0"
33
+ "vitest": "^5.0.1"
34
34
  },
35
35
  "scripts": {
36
36
  "build": "tsup && tsc -p tsconfig.build.json && node ../../scripts/finalize-declarations.mjs dist",