@instruments/taxonomy 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,6 +11,7 @@ The package root exports the governed corpus and its release metadata:
11
11
  - `PHRASE_ENTRIES` - exhaustive declarative `equivalent`, `ambiguous`, and `declined` records for every canonical or observed authored spelling.
12
12
  - `TAXONOMY_CORPUS_METADATA` - deterministic node, edge, and lexical counts with the corpus revision, snapshot, and package version.
13
13
  - `TAXONOMY_CORPUS_REVISION`, `TAXONOMY_SNAPSHOT`, and `TAXONOMY_VERSION` - the exact content fingerprint, source snapshot, and package release identifiers.
14
+ - `CONCEPT_ASSESSMENT_POLICIES`, `ASSESSMENT_POLICY_REVISION`, and `ASSESSMENT_AUTHORITY_REFERENCES` - evidence requirements and explicit applicability-review status for every active concept. These are not measured consumer accuracy or a claim of standards compliance.
14
15
 
15
16
  It also exports the TypeScript types for those values. It does not export a resolver, matcher, ranker, search route, local IDs, semantic IDs, or legacy aliases. Consumers build policy on top of the same data; the repository's private HTTP adapter is one such consumer.
16
17
 
@@ -51,3 +52,5 @@ const walnutReadings = PHRASE_ENTRIES.find(
51
52
  Changes to canonical meaning or identity are governed corpus changes. There is deliberately no backward-compatibility layer in V1; consumers migrate to the canonical URI.
52
53
 
53
54
  Pin the exact package version and compare `TAXONOMY_CORPUS_REVISION` when a deployment needs to detect content drift. The revision is computed from the normalized graph and lexical entries, so it changes when governed corpus content changes even if the V1 API shape does not.
55
+
56
+ In ordered facets, `rank` describes a grade. Broad parents such as `finish/sheen/glossy` have no rank and add no rung to the scale. Glossy is broader than Semi-gloss and High gloss; Satin remains separate. Retain all concepts in vocabulary listings, and count only ranked concepts when displaying scale length. A source stating only gloss or glossy does not establish a narrower grade, a measured gloss value, or a polishing process. Consumers retain source-field context and qualified spellings when interpreting finish words.
@@ -1,7 +1,7 @@
1
1
  import type { Term } from "../term.js";
2
2
  /** How the exposed surface was produced. Unordered. */
3
3
  export declare const FINISH_TREATMENT_TERMS: readonly Term[];
4
- /** How much the surface reflects, least to most. Ordered; see the header. */
4
+ /** Ordered sheen grades plus unranked broader descriptions; see the header. */
5
5
  export declare const FINISH_SHEEN_TERMS: readonly Term[];
6
6
  /** What the surface feels like, or reads as under a raking light. Unordered. */
7
7
  export declare const FINISH_TEXTURE_TERMS: readonly Term[];
package/dist/index.js CHANGED
@@ -1512,6 +1512,8 @@ var TAX57_DATE2 = "2026-09-26";
1512
1512
  var TAX57_SOURCE = "Linear TAX-57 visual-vocabulary review";
1513
1513
  var MG2435_DATE = "2026-10-02";
1514
1514
  var MG2435_SOURCE = "Linear MG-2435 feed-loss review";
1515
+ var GLOSSY = "glossy";
1516
+ var GLOSSY_DATE = "2026-10-10";
1515
1517
  var wikidata2 = (id, label) => `Wikidata ${id} ${label}, https://www.wikidata.org/wiki/${id}`;
1516
1518
  var reviewed2 = (slug, label, definition, source, extra = {}) => ({
1517
1519
  definition,
@@ -1772,20 +1774,40 @@ var FINISH_SHEEN_TERMS = [
1772
1774
  "An even mid sheen, softer than semi-gloss and clearly not matte.",
1773
1775
  5
1774
1776
  ),
1775
- vendored(
1776
- RETRIEVAL_SHEEN,
1777
- "semi-gloss",
1778
- "Semi-gloss",
1779
- "Strongly reflective while still scattering the highlight.",
1780
- 6
1781
- ),
1782
- vendored(
1783
- RETRIEVAL_SHEEN,
1784
- "high-gloss",
1785
- "High gloss",
1786
- "Returns a sharp, mirror-like specular reflection.",
1787
- 7
1788
- )
1777
+ {
1778
+ ...vendored(
1779
+ RETRIEVAL_SHEEN,
1780
+ "semi-gloss",
1781
+ "Semi-gloss",
1782
+ "Strongly reflective while still scattering the highlight.",
1783
+ 6
1784
+ ),
1785
+ broaderSlug: GLOSSY
1786
+ },
1787
+ {
1788
+ ...vendored(
1789
+ RETRIEVAL_SHEEN,
1790
+ "high-gloss",
1791
+ "High gloss",
1792
+ "Returns a sharp, mirror-like specular reflection.",
1793
+ 7
1794
+ ),
1795
+ broaderSlug: GLOSSY
1796
+ },
1797
+ {
1798
+ altLabels: ["gloss"],
1799
+ definition: "A visibly shiny surface with pronounced specular reflection. This broad description does not specify a gloss grade or measured gloss value.",
1800
+ introducedAt: GLOSSY_DATE,
1801
+ label: "Glossy",
1802
+ note: "Use a narrower sheen grade when the source supplies one. Semi-gloss and High gloss are narrower meanings; Satin has no universal broader relation here because suppliers both describe it as a glossy look and contrast it with glossy finishes. This term is not a rung on the ordered sheen scale and does not establish a polishing process.",
1803
+ provenance: {
1804
+ basis: "referenced",
1805
+ snapshot: GLOSSY_DATE,
1806
+ source: "MG-2620 Glossy review; Sherwin-Williams gloss and sheen guide, https://www.sherwin-williams.com/architects-specifiers-designers/inspiration/styles-and-techniques/sw-art-gloss-sheen-differences; Formica glossy versus matte finishes, https://formica.com/en-ca/articles/home-design/2025/glossy-vs-matte-kitchen-cabinets; Tikkurila satin counterexamples, https://tikkurila.com/how-choose-right-paint-your-interior-walls-and-ceilings and https://tikkurila.com/7-tips-painting-fence-old-or-new"
1807
+ },
1808
+ reviewedAt: GLOSSY_DATE,
1809
+ slug: GLOSSY
1810
+ }
1789
1811
  ];
1790
1812
  var FINISH_TEXTURE_TERMS = [
1791
1813
  vendored(
@@ -2731,8 +2753,8 @@ var MATERIAL_EVERYDAY_TERMS = [
2731
2753
  "A transparent, impact-resistant thermoplastic polymer family supplied as sheet or moulding.",
2732
2754
  wikidata3("Q62246", "polycarbonate")
2733
2755
  ),
2734
- broaderSlug: "polymer",
2735
- reviewedAt: COMPOSITION_REVIEW_DATE
2756
+ broaderSlug: "plastic",
2757
+ reviewedAt: "2026-10-14"
2736
2758
  },
2737
2759
  {
2738
2760
  ...reviewed3(
@@ -4249,6 +4271,8 @@ var fibreNames2 = (name, extra = []) => [
4249
4271
  ...extra
4250
4272
  ];
4251
4273
  var POLYMER_SLUG2 = "polymer";
4274
+ var PLASTIC_SLUG = "plastic";
4275
+ var PLASTIC_DATE = "2026-10-14";
4252
4276
  var MATERIAL_POLYMERS_TERMS = [
4253
4277
  compositionTerm(
4254
4278
  POLYMER_SLUG2,
@@ -4257,6 +4281,45 @@ var MATERIAL_POLYMERS_TERMS = [
4257
4281
  STANDARD_ISO_472
4258
4282
  ),
4259
4283
  // Families.
4284
+ //
4285
+ // PLASTIC IS A BROAD TERM FOR A SOURCE THAT SAYS "PLASTIC" AND NO MORE (TAX-60). Material Bank's
4286
+ // material tag Plastic sits on 5,467 catalogue rows and descriptions say "plastic bottles".
4287
+ // ISO 472:2013 defines a plastic as a material with a high polymer as an essential ingredient
4288
+ // that can be shaped by flow at some stage of processing, and notes that elastomers are not
4289
+ // plastics. A polymer is the wider class, so `plastic` sits beneath `polymer`.
4290
+ //
4291
+ // WHICH CHILDREN OF `polymer` MOVE BENEATH IT. A term moves only when every instance of it is a
4292
+ // plastic, because a parent must hold every instance of its children (ADR 0001). Four move:
4293
+ // `abs`, `polycarbonate`, `polyvinyl-chloride` and `polystyrene` are each defined as a
4294
+ // thermoplastic polymer. Every other direct child of `polymer` stays where it is:
4295
+ // - `rubber` (and `latex`, `natural-rubber`) are elastomers, which ISO 472 excludes.
4296
+ // - `acrylic`, `polyolefin`, `polyamide`, `polyester` and `polyurethane` are families that
4297
+ // also cover fibres (acrylic, olefin, nylon, polyester and elastane fibre; ISO 2076), and a
4298
+ // term has one broader edge, so they cannot sit beneath both. Their moulding and sheet
4299
+ // members (PMMA, polyethylene, polypropylene, PET, PBT, TPU) stay beneath the family.
4300
+ // - `resin` is defined against bulk engineering plastic: it is a binder, coating or cast solid.
4301
+ // - `eva` ranges from a flexible thermoplastic to a rubber-like material, `ptfe` is also a
4302
+ // fibre (fluorofibre) and `silicone` covers elastomers and fluids, so none is only plastic.
4303
+ // - The man-made cellulosics are fibres, films and plastics alike.
4304
+ // A search for `plastic` therefore reaches ABS, polycarbonate, PVC and polystyrene, and a source
4305
+ // that names a family or grade keeps the narrower term. This is not a claim that the stayers are
4306
+ // not plastics in some products; it records that the term would be false for some of its
4307
+ // instances.
4308
+ {
4309
+ altLabels: ["plastics"],
4310
+ broaderSlug: POLYMER_SLUG2,
4311
+ definition: "A material that contains a high polymer as an essential ingredient and that can be shaped by flow at some stage of its processing into finished products.",
4312
+ introducedAt: PLASTIC_DATE,
4313
+ label: "Plastic",
4314
+ note: "Use when a source says plastic without naming which; use a narrower term when it names one. Added on 2026-10-14 beneath Polymer. Elastomers are polymers that ISO 472 does not count as plastics, and fibres and coatings are polymers named by their own terms, so Rubber, Resin and the fibre families are not beneath it. A source saying only plastic does not establish a polymer family, a grade, a thermoplastic or thermosetting behaviour, or recycled content.",
4315
+ provenance: {
4316
+ basis: "referenced",
4317
+ snapshot: PLASTIC_DATE,
4318
+ source: "ISO 472:2013 Plastics: Vocabulary; the same wording in the Bureau de normalisation du Qu\xE9bec entry, https://vitrinelinguistique.oqlf.gouv.qc.ca/fiche-gdt/fiche/8355296/plastique; TAX-60 review of Material Bank's Plastic tag"
4319
+ },
4320
+ reviewedAt: PLASTIC_DATE,
4321
+ slug: PLASTIC_SLUG
4322
+ },
4260
4323
  compositionTerm(
4261
4324
  "polyamide",
4262
4325
  "Polyamide",
@@ -4322,14 +4385,15 @@ var MATERIAL_POLYMERS_TERMS = [
4322
4385
  STANDARD_ISO_1043_1,
4323
4386
  {
4324
4387
  altLabels: ["Acrylonitrile butadiene styrene"],
4325
- broaderSlug: POLYMER_SLUG2,
4388
+ broaderSlug: PLASTIC_SLUG,
4326
4389
  external: [
4327
4390
  externalMapping(
4328
4391
  ISO_1043_12,
4329
4392
  "ABS",
4330
4393
  "acrylonitrile-butadiene-styrene plastic"
4331
4394
  )
4332
- ]
4395
+ ],
4396
+ reviewedAt: PLASTIC_DATE
4333
4397
  }
4334
4398
  ),
4335
4399
  compositionTerm(
@@ -4617,11 +4681,12 @@ var MATERIAL_POLYMERS_TERMS = [
4617
4681
  STANDARD_ISO_1043_1,
4618
4682
  {
4619
4683
  altLabels: ["PVC", "poly(vinyl chloride)"],
4620
- broaderSlug: POLYMER_SLUG2,
4684
+ broaderSlug: PLASTIC_SLUG,
4621
4685
  external: [
4622
4686
  externalMapping(ISO_1043_12, "PVC", "poly(vinyl chloride)"),
4623
4687
  externalMapping("cas", "9002-86-2", "Poly(vinyl chloride)")
4624
- ]
4688
+ ],
4689
+ reviewedAt: PLASTIC_DATE
4625
4690
  }
4626
4691
  ),
4627
4692
  compositionTerm(
@@ -4630,8 +4695,9 @@ var MATERIAL_POLYMERS_TERMS = [
4630
4695
  "A thermoplastic polymer of styrene monomer.",
4631
4696
  STANDARD_ISO_1043_1,
4632
4697
  {
4633
- broaderSlug: POLYMER_SLUG2,
4698
+ broaderSlug: PLASTIC_SLUG,
4634
4699
  external: [externalMapping(ISO_1043_12, "PS", "polystyrene")],
4700
+ reviewedAt: PLASTIC_DATE,
4635
4701
  seenAs: ["Poly Styrene"]
4636
4702
  }
4637
4703
  ),
@@ -5433,8 +5499,10 @@ var MATERIAL_TERMS = [
5433
5499
  "Natural fibre",
5434
5500
  "A fibre obtained directly from a plant or animal without chemical regeneration."
5435
5501
  ),
5502
+ altLabels: ["natural fiber"],
5436
5503
  broaderSlug: NATURAL_ORGANIC_SLUG2,
5437
- reviewedAt: COMPOSITION_REVIEW_DATE
5504
+ note: "Use when a source says natural fibre without naming which; use Plant fibre, Animal fibre or the named fibre when it does. Gained the American spelling on 2026-10-14 (TAX-60).",
5505
+ reviewedAt: "2026-10-14"
5438
5506
  },
5439
5507
  reparented(
5440
5508
  crossoverTerm(
@@ -5805,15 +5873,17 @@ var MATERIAL_TERMS = [
5805
5873
  "mineral"
5806
5874
  )
5807
5875
  ),
5808
- reparented(
5809
- crossoverTerm(
5876
+ {
5877
+ ...crossoverTerm(
5810
5878
  "terracotta",
5811
5879
  "Terracotta",
5812
5880
  "A coarse porous earthenware of fired clay.",
5813
5881
  `${CROSSOVER_DEFINITION_SOURCES.terracotta}; ${ASTM_C2422}`,
5814
5882
  "earthenware"
5815
- )
5816
- ),
5883
+ ),
5884
+ altLabels: ["terra cotta"],
5885
+ reviewedAt: "2026-10-14"
5886
+ },
5817
5887
  crossoverTerm(
5818
5888
  "denim",
5819
5889
  "Denim",
@@ -12017,7 +12087,7 @@ var resolveReference = (reference) => INDEX.byKey.get(canonicalKey(reference));
12017
12087
  // src/v1.ts
12018
12088
  var TAXONOMY_BASE_URI = "https://taxonomy.materialinstruments.com";
12019
12089
  var TAXONOMY_SNAPSHOT = "2026-10-02";
12020
- var TAXONOMY_VERSION = "2.0.0";
12090
+ var TAXONOMY_VERSION = "2.2.0";
12021
12091
  var PUBLISHED_V1_BASELINE = "2026-08-30";
12022
12092
  var TAX45_REVIEW_SNAPSHOT = "2026-08-31";
12023
12093
  var LIMESTONE_INTRODUCED = "2026-09-01";
@@ -12349,6 +12419,12 @@ var REVIEW_LIFECYCLE = {
12349
12419
  status: "active"
12350
12420
  };
12351
12421
  var REVIEW_SOURCE9 = "everyday-interiors vocabulary review";
12422
+ var TERRA_COTTA_DATE = "2026-10-14";
12423
+ var TERRA_COTTA_LIFECYCLE = {
12424
+ introducedAt: TERRA_COTTA_DATE,
12425
+ reviewedAt: TERRA_COTTA_DATE,
12426
+ status: "active"
12427
+ };
12352
12428
  var COLORSCOPE_INSTALLED = "@instruments/colorscope 9.4.0 data/reference/v1/taxonomy.json";
12353
12429
  var reviewedTaxonomy = (path) => ({
12354
12430
  authority: "taxonomy",
@@ -12731,6 +12807,29 @@ var AUTHORED_PHRASE_ENTRIES = [
12731
12807
  "Terracotta can name a fired-clay material or a ColorScope named color; firing and composition do not establish orange appearance.",
12732
12808
  crossoverSource("terracotta")
12733
12809
  ),
12810
+ // TAX-60: Material Bank writes the material tag Terra Cotta (1,600 catalogue rows). It is the same
12811
+ // word as terracotta, so it keeps both readings and no default, as the one-word spelling does.
12812
+ {
12813
+ explanation: "Terra cotta, written as two words, is a spelling of terracotta: it can name a fired-clay material or a ColorScope named color, and firing and composition do not establish orange appearance.",
12814
+ governance: lexicalGovernance(
12815
+ AMBIGUITY_GOVERNANCE,
12816
+ {
12817
+ basis: "evidenced",
12818
+ snapshot: TERRA_COTTA_DATE,
12819
+ source: `${crossoverSource("terracotta")}; TAX-60 review of Material Bank's Terra Cotta tag`
12820
+ },
12821
+ TERRA_COTTA_LIFECYCLE
12822
+ ),
12823
+ meanings: [
12824
+ {
12825
+ authority: "taxonomy",
12826
+ uri: `${TAXONOMY_BASE_URI}/id/material/terracotta`
12827
+ },
12828
+ colorScope("terracotta", NAMED_COLOR_REFERENCE_KIND)
12829
+ ],
12830
+ outcome: "ambiguous",
12831
+ phrase: "terra cotta"
12832
+ },
12734
12833
  {
12735
12834
  explanation: "Brick can name fired clay masonry material or a ColorScope named color; the material need not be red and the color is not a substance.",
12736
12835
  governance: lexicalGovernance(
package/dist/term.d.ts CHANGED
@@ -273,8 +273,9 @@ export interface Term {
273
273
  * both sit at 3 on their own ladders and are not the same claim about the world; the ladders
274
274
  * have different lengths and different subjects. Compare within a facet or not at all.
275
275
  *
276
- * Dense from 1 within a facet, and either present on every term there or on none - both checked
277
- * in `axes.test.ts`, because a half-ranked facet silently drops its unranked half from any sort.
276
+ * Dense from 1 across the grades within a facet. Every grade on an ordered scale is ranked;
277
+ * broad parents spanning several grades are unranked. Count ranked terms for the scale's
278
+ * length, and retain unranked parents when listing the vocabulary. Checked in `axes.test.ts`.
278
279
  */
279
280
  rank?: number;
280
281
  /** Present on PERIOD terms only. */
package/dist/v1.d.ts CHANGED
@@ -3,7 +3,7 @@ import type { ElementPlacement, ExternalMapping, ExternalScheme, PeriodSpan, Rel
3
3
  export type { FacetHolds } from "./axes/index.js";
4
4
  export declare const TAXONOMY_BASE_URI: "https://taxonomy.materialinstruments.com";
5
5
  export declare const TAXONOMY_SNAPSHOT: "2026-10-02";
6
- export declare const TAXONOMY_VERSION: "2.0.0";
6
+ export declare const TAXONOMY_VERSION: "2.2.0";
7
7
  export type CanonicalConceptUri = `${typeof TAXONOMY_BASE_URI}/id/${string}`;
8
8
  export type LifecycleStatus = "active" | "deprecated";
9
9
  export interface Lifecycle {
@@ -142,5 +142,5 @@ export declare const TAXONOMY_CORPUS_METADATA: {
142
142
  readonly phraseEntryCount: number;
143
143
  readonly revision: string;
144
144
  readonly snapshot: "2026-10-02";
145
- readonly version: "2.0.0";
145
+ readonly version: "2.2.0";
146
146
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instruments/taxonomy",
3
- "version": "2.0.0",
3
+ "version": "2.2.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": {