@instruments/taxonomy 2.5.0 → 2.7.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/dist/index.js CHANGED
@@ -7,6 +7,8 @@ import { createHash } from "crypto";
7
7
  // src/axes/external-search.ts
8
8
  var SEARCHED_ON = "2026-10-21";
9
9
  var SEARCHED_ON_TAX66 = "2026-10-22";
10
+ var SEARCHED_ON_TAX66_COVERAGE = "2026-10-23";
11
+ var SEARCHED_ON_TAX66_GAPS = "2026-10-23";
10
12
  var WIKIDATA_SEARCH = "https://www.wikidata.org/w/api.php?action=wbsearchentities";
11
13
  var GETTY_SPARQL = "https://vocab.getty.edu/sparql";
12
14
  var UNICLASS_SEARCH = "https://uniclass.thenbs.com/search";
@@ -1772,6 +1774,45 @@ var single = (slug, label, terms, governance, holds) => [
1772
1774
  }
1773
1775
  ];
1774
1776
 
1777
+ // src/axes/gaps-shared.ts
1778
+ var GAPS_DATE = SEARCHED_ON_TAX66_GAPS;
1779
+ var GAPS_PROVENANCE = {
1780
+ basis: "authored",
1781
+ source: "TAX-66 vocabulary gaps"
1782
+ };
1783
+ var GAPS_LIFECYCLE = {
1784
+ introducedAt: GAPS_DATE,
1785
+ provenance: GAPS_PROVENANCE,
1786
+ reviewedAt: GAPS_DATE
1787
+ };
1788
+ var gapsTerm = (slug, label, definition, extra = {}) => ({
1789
+ definition,
1790
+ label,
1791
+ slug,
1792
+ ...GAPS_LIFECYCLE,
1793
+ ...extra
1794
+ });
1795
+ var mapping = (scheme, identifier, label, match) => ({ identifier, label, match, scheme });
1796
+ var UNICLASS_TABLES = "July 2026 NBS Ac v1.27, Co v1.22, EF v1.16, En v1.34, Ma v1.1, PC v1.3, PM v1.30, Pr v1.43, SL v1.36 and Ss v1.43 published tables, title search: ";
1797
+ var gapsSearchedUniclass = (query) => ({
1798
+ date: GAPS_DATE,
1799
+ query: `${UNICLASS_TABLES}${query}`,
1800
+ scheme: "uniclass",
1801
+ via: UNICLASS_DOWNLOAD
1802
+ });
1803
+ var gapsSearchedAat = (query) => ({
1804
+ date: GAPS_DATE,
1805
+ query,
1806
+ scheme: "aat",
1807
+ via: `${GETTY_SPARQL}; luc:term search, AAT preferred labels and English scope notes read`
1808
+ });
1809
+ var gapsSearchedWikidata = (query) => ({
1810
+ date: GAPS_DATE,
1811
+ query,
1812
+ scheme: "wikidata",
1813
+ via: `${WIKIDATA_SEARCH}&language=en&format=json; labels and descriptions read`
1814
+ });
1815
+
1775
1816
  // src/axes/pattern-tax57.ts
1776
1817
  var relatedTo4 = (target) => ({
1777
1818
  predicate: "related-to",
@@ -2387,7 +2428,24 @@ var CONSTRUCTION_TERMS = [
2387
2428
  }
2388
2429
  ],
2389
2430
  searchedWithout: [searchedUniclass3(JACQUARD_WEAVING)]
2390
- }
2431
+ },
2432
+ // TAX-66. A construction and not a material: it names how the sheet is made, slit and stretched
2433
+ // into a diamond mesh without waste, the way `woven` and `sintered` name a process. The metal is
2434
+ // a separate meaning on the material axis. Uniclass lists it only as products, so that mapping
2435
+ // is `close` rather than exact.
2436
+ gapsTerm(
2437
+ "expanded-metal",
2438
+ "Expanded metal",
2439
+ "Metal sheet slit and stretched in one operation into an open mesh of diamond-shaped openings, without cutting away or joining any material.",
2440
+ {
2441
+ external: [
2442
+ mapping("aat", "300011061", "expanded metal", "close"),
2443
+ mapping("uniclass", "Pr_25_57_56_27", "Expanded metal mesh", "close"),
2444
+ mapping("wikidata", "Q1424107", "expanded metal", "close")
2445
+ ],
2446
+ related: relatedTo5("material.metal")
2447
+ }
2448
+ )
2391
2449
  ];
2392
2450
 
2393
2451
  // src/axes/element-shared.ts
@@ -2813,6 +2871,31 @@ var ELEMENT_FABRIC_TERMS = [
2813
2871
  provenance: AUTHORED2,
2814
2872
  slug: "pitched-roof"
2815
2873
  },
2874
+ // TAX-66. A kind of roof, since every green roof is a roof whatever its fall; flat and pitched
2875
+ // are the slope, this is the covering. AAT has no green roof concept, only the roof garden it
2876
+ // overlaps, which is a garden people use and so `related` rather than a match.
2877
+ {
2878
+ altLabels: ["living roof", "vegetated roof"],
2879
+ broaderSlug: "roof",
2880
+ definition: "A roof whose waterproofing carries a growing medium and living vegetation as its covering, in place of lapped units or a sheet.",
2881
+ external: [
2882
+ aat4("300008131", "roof gardens", "related"),
2883
+ uniclass4("Ss_45_40_47", "Living roof systems", "close"),
2884
+ {
2885
+ identifier: "Q48741",
2886
+ label: "green roof",
2887
+ match: "close",
2888
+ scheme: "wikidata"
2889
+ }
2890
+ ],
2891
+ introducedAt: GAPS_DATE,
2892
+ label: "Green Roof",
2893
+ placement: "overhead",
2894
+ provenance: GAPS_PROVENANCE,
2895
+ reviewedAt: GAPS_DATE,
2896
+ searchedWithout: [gapsSearchedAat("green roof | living roof | sod roof")],
2897
+ slug: "green-roof"
2898
+ },
2816
2899
  {
2817
2900
  altLabels: ["skylight", "roof light"],
2818
2901
  definition: "A glazed opening in a roof plane, admitting daylight from above rather than from a wall.",
@@ -3337,7 +3420,7 @@ var ELEMENT_TERMS = [
3337
3420
 
3338
3421
  // src/crossover-sources.ts
3339
3422
  var RETRIEVAL_LEXICON_SOURCE = "color-material lexicon in a materials-retrieval system (src-05)";
3340
- var COLORSCOPE_CROSSOVER_SOURCE = "materialinstruments/colorscope@5feb29b267a7954c135976ede8039f37121afd27:packages/core/data/reference/v1/taxonomy.json";
3423
+ var COLORSCOPE_CROSSOVER_SOURCE = "materialinstruments/colorscope@3f490d3cdf26d3af77841a55f0c94cb5e24bb891:packages/core/data/reference/v1/taxonomy.json";
3341
3424
  var BRASS_MATERIAL_SOURCE = "https://archive.copper.org/applications/industrial/DesignGuide/terms.php";
3342
3425
  var BRASS_FINISH_SOURCE = "https://nickelinstitute.org/media/lxxh1zwr/2023-nickelplatinghandbooka5_printablepdf.pdf section 5";
3343
3426
  var NICKEL_MATERIAL_SOURCE = "https://nickelinstitute.org/en/nickel-applications/";
@@ -3691,6 +3774,7 @@ var FINISH_TEXTURE_TERMS = [
3691
3774
  var TEXTURED_TARGET = "finish.texture.textured";
3692
3775
  var TUMBLE_FINISHING = "tumble finishing";
3693
3776
  var ABRASIVE_BLASTING = "abrasive blasting";
3777
+ var POWDER_COATING = "powder coating";
3694
3778
  var CROSSOVER_SNAPSHOT = "2026-08-30";
3695
3779
  var RETRIEVAL_SHEEN = "ms_sheen, a sheen dictionary in a materials-retrieval system (src-05)";
3696
3780
  var MG2435_DATE = "2026-10-02";
@@ -4042,7 +4126,24 @@ var FINISH_TREATMENT_TERMS = [
4042
4126
  }
4043
4127
  ],
4044
4128
  searchedWithout: [searchedUniclass3("distressing")]
4045
- }
4129
+ },
4130
+ // TAX-66. A coating applied, like chrome and nickel above, so it is a treatment; the colour and
4131
+ // sheen of the cured film are separate meanings made on the palette and sheen facets. Every
4132
+ // mapping is `close` because AAT narrows the powder to thermosetting plastic and Wikidata and
4133
+ // Uniclass describe the process and the product rather than the finished surface.
4134
+ gapsTerm(
4135
+ "powder-coat",
4136
+ "Powder coat",
4137
+ "A dry powder of thermoplastic or thermosetting polymer applied electrostatically to a metal surface and cured under heat into a continuous hard film; it names the coating, not the substrate, colour or sheen.",
4138
+ {
4139
+ altLabels: [POWDER_COATING, "powder-coated"],
4140
+ external: [
4141
+ mapping("aat", "300133167", POWDER_COATING, "close"),
4142
+ mapping("uniclass", "Pr_35_31_68_66", "Powder coatings", "close"),
4143
+ mapping("wikidata", "Q445063", POWDER_COATING, "close")
4144
+ ]
4145
+ }
4146
+ )
4046
4147
  ];
4047
4148
  var FINISH_SHEEN_TERMS = [
4048
4149
  {
@@ -4454,6 +4555,522 @@ var FORMAT_TERMS = [
4454
4555
  }
4455
4556
  ];
4456
4557
 
4558
+ // src/axes/certification.ts
4559
+ var EMBODIED_CARBON = "embodied-carbon";
4560
+ var INDOOR_AIR = "indoor-air-quality";
4561
+ var SOURCING = "responsible-sourcing";
4562
+ var WELL_NAME = "WELL Building Standard";
4563
+ var evidences = (...needs) => needs.map((need) => ({
4564
+ predicate: "related-to",
4565
+ target: `requirement.${need}`
4566
+ }));
4567
+ var noAat = (query) => gapsSearchedAat(query);
4568
+ var noUniclass = (query) => gapsSearchedUniclass(query);
4569
+ var CERTIFICATION_TERMS = [
4570
+ gapsTerm(
4571
+ "fsc",
4572
+ "FSC",
4573
+ "A product-level certification, run by the Forest Stewardship Council, that timber and paper products come from forests managed to its standard, with chain-of-custody tracing from forest to product.",
4574
+ {
4575
+ altLabels: ["Forest Stewardship Council"],
4576
+ external: [
4577
+ mapping("wikidata", "Q748367", "Forest Stewardship Council", "close")
4578
+ ],
4579
+ related: evidences(SOURCING),
4580
+ searchedWithout: [
4581
+ noAat("Forest Stewardship Council | forest certification"),
4582
+ noUniclass("FSC | Forest Stewardship Council")
4583
+ ]
4584
+ }
4585
+ ),
4586
+ gapsTerm(
4587
+ "pefc",
4588
+ "PEFC",
4589
+ "A product-level certification, run by the Programme for the Endorsement of Forest Certification, that timber and paper products come from forests managed to a nationally endorsed standard, with chain-of-custody tracing.",
4590
+ {
4591
+ altLabels: ["Programme for the Endorsement of Forest Certification"],
4592
+ external: [
4593
+ mapping(
4594
+ "wikidata",
4595
+ "Q2112204",
4596
+ "Programme for the Endorsement of Forest Certification",
4597
+ "close"
4598
+ )
4599
+ ],
4600
+ related: evidences(SOURCING),
4601
+ searchedWithout: [
4602
+ noAat(
4603
+ "Programme for the Endorsement of Forest Certification | forest certification"
4604
+ ),
4605
+ noUniclass(
4606
+ "PEFC | Programme for the Endorsement of Forest Certification"
4607
+ )
4608
+ ]
4609
+ }
4610
+ ),
4611
+ gapsTerm(
4612
+ "breeam",
4613
+ "BREEAM",
4614
+ "A building-level sustainability assessment and certification scheme, run by BRE, that rates a building across categories such as energy, materials, health and wellbeing, from Pass to Outstanding.",
4615
+ {
4616
+ altLabels: [
4617
+ "Building Research Establishment Environmental Assessment Method"
4618
+ ],
4619
+ external: [
4620
+ mapping(
4621
+ "uniclass",
4622
+ "PM_70_25_10",
4623
+ "BREEAM (Building Research Establishment Environmental Assessment Method) certificate",
4624
+ "close"
4625
+ ),
4626
+ mapping(
4627
+ "uniclass",
4628
+ "PM_35_40_10",
4629
+ "BREEAM (Building Research Establishment Environmental Assessment Method) requirements",
4630
+ "related"
4631
+ ),
4632
+ mapping("wikidata", "Q2620135", "BREEAM", "close")
4633
+ ],
4634
+ related: evidences(EMBODIED_CARBON, INDOOR_AIR, SOURCING),
4635
+ searchedWithout: [noAat("BREEAM")]
4636
+ }
4637
+ ),
4638
+ gapsTerm(
4639
+ "leed",
4640
+ "LEED",
4641
+ "A building-level green building rating system, run by the US Green Building Council, that awards points across categories such as materials, energy and indoor environmental quality towards Certified, Silver, Gold or Platinum.",
4642
+ {
4643
+ altLabels: ["Leadership in Energy and Environmental Design"],
4644
+ external: [
4645
+ mapping(
4646
+ "uniclass",
4647
+ "PM_70_25_45",
4648
+ "LEED (Leadership in Energy and Environmental Design) certificate",
4649
+ "close"
4650
+ ),
4651
+ mapping(
4652
+ "uniclass",
4653
+ "PM_35_40_45",
4654
+ "LEED (Leadership in Energy and Environmental Design) requirements",
4655
+ "related"
4656
+ ),
4657
+ mapping(
4658
+ "wikidata",
4659
+ "Q1521623",
4660
+ "Leadership in Energy and Environmental Design",
4661
+ "close"
4662
+ )
4663
+ ],
4664
+ related: evidences(EMBODIED_CARBON, INDOOR_AIR, SOURCING),
4665
+ searchedWithout: [
4666
+ noAat("LEED | Leadership in Energy and Environmental Design")
4667
+ ]
4668
+ }
4669
+ ),
4670
+ gapsTerm(
4671
+ "well-building-standard",
4672
+ WELL_NAME,
4673
+ "A building-level standard and certification, run by the International WELL Building Institute, for how a building's air, water, light and comfort features support the health and wellbeing of its occupants.",
4674
+ {
4675
+ altLabels: ["WELL certification"],
4676
+ external: [
4677
+ mapping(
4678
+ "uniclass",
4679
+ "PM_70_25_96",
4680
+ "WELL environment certificate",
4681
+ "close"
4682
+ ),
4683
+ mapping(
4684
+ "uniclass",
4685
+ "PM_35_40_96",
4686
+ "WELL environment requirements",
4687
+ "related"
4688
+ ),
4689
+ mapping("wikidata", "Q113253484", WELL_NAME, "close")
4690
+ ],
4691
+ related: evidences(INDOOR_AIR),
4692
+ searchedWithout: [noAat(WELL_NAME)]
4693
+ }
4694
+ ),
4695
+ gapsTerm(
4696
+ "greenguard",
4697
+ "GREENGUARD",
4698
+ "A product-level certification, now run by UL Solutions, that a product's chemical emissions into indoor air stay within stated limits; its Gold level sets stricter limits.",
4699
+ {
4700
+ altLabels: ["UL GREENGUARD"],
4701
+ external: [
4702
+ mapping(
4703
+ "wikidata",
4704
+ "Q5604067",
4705
+ "Greenguard Environmental Institute",
4706
+ "related"
4707
+ )
4708
+ ],
4709
+ note: "The Wikidata item is the institute that first ran the scheme and not the scheme, so the match is only related.",
4710
+ related: evidences(INDOOR_AIR),
4711
+ searchedWithout: [noAat("GREENGUARD"), noUniclass("GREENGUARD")]
4712
+ }
4713
+ ),
4714
+ gapsTerm(
4715
+ "cradle-to-cradle",
4716
+ "Cradle to Cradle Certified",
4717
+ "A product-level certification, run by the Cradle to Cradle Products Innovation Institute, that assesses a product on material health, product circularity, clean air and climate protection, water and soil stewardship and social fairness, at Bronze to Platinum levels.",
4718
+ {
4719
+ altLabels: ["C2C", "Cradle to Cradle"],
4720
+ external: [
4721
+ mapping(
4722
+ "wikidata",
4723
+ "Q116149235",
4724
+ "Cradle to Cradle Certified",
4725
+ "close"
4726
+ )
4727
+ ],
4728
+ related: evidences(EMBODIED_CARBON),
4729
+ searchedWithout: [
4730
+ noAat("Cradle to Cradle"),
4731
+ noUniclass("Cradle to Cradle | C2C")
4732
+ ]
4733
+ }
4734
+ ),
4735
+ gapsTerm(
4736
+ "epd",
4737
+ "Environmental product declaration",
4738
+ "A third-party-verified declaration of a product's life-cycle environmental impacts, such as its embodied carbon, reported to a product-category standard such as ISO 14025 and EN 15804; it states the impacts and sets no threshold.",
4739
+ {
4740
+ altLabels: ["EPD"],
4741
+ external: [
4742
+ mapping(
4743
+ "uniclass",
4744
+ "PC_10_65_26",
4745
+ "Environmental product declaration (EPD)",
4746
+ "close"
4747
+ ),
4748
+ mapping(
4749
+ "wikidata",
4750
+ "Q1345906",
4751
+ "Environmental product declaration",
4752
+ "close"
4753
+ )
4754
+ ],
4755
+ related: evidences(EMBODIED_CARBON),
4756
+ searchedWithout: [
4757
+ noAat("environmental product declaration | life cycle assessment")
4758
+ ]
4759
+ }
4760
+ )
4761
+ ];
4762
+
4763
+ // src/axes/intervention.ts
4764
+ var relatedTo7 = (...targets) => targets.map((target) => ({ predicate: "related-to", target }));
4765
+ var REFURBISHMENT = "intervention.refurbishment";
4766
+ var INTERVENTION_TERMS = [
4767
+ gapsTerm(
4768
+ "new-build",
4769
+ "New build",
4770
+ "Construction of a building from the ground up on a cleared or undeveloped site, rather than work to a building that already stands.",
4771
+ {
4772
+ altLabels: ["new construction", "ground-up construction"],
4773
+ external: [
4774
+ mapping("uniclass", "PC_20_30_56", "New-build", "close"),
4775
+ mapping("wikidata", "Q2202145", "new construction", "close")
4776
+ ],
4777
+ searchedWithout: [
4778
+ gapsSearchedAat("new build | new construction | new building")
4779
+ ]
4780
+ }
4781
+ ),
4782
+ gapsTerm(
4783
+ "refurbishment",
4784
+ "Refurbishment",
4785
+ "Work that renews and updates the fabric, finishes and services of a building that already stands, without changing what it is used for or how large it is.",
4786
+ {
4787
+ altLabels: ["renovation"],
4788
+ external: [
4789
+ mapping("aat", "300389648", "refurbishment", "close"),
4790
+ mapping("aat", "300077781", "renovation (process)", "close"),
4791
+ mapping("uniclass", "Ac_10_70_70", "Renovation", "close"),
4792
+ mapping("wikidata", "Q2144402", "renovation", "close")
4793
+ ]
4794
+ }
4795
+ ),
4796
+ gapsTerm(
4797
+ "retrofit",
4798
+ "Retrofit",
4799
+ "Work that adds new equipment, systems or fabric performance, most often for energy, comfort or safety, to a building that already stands, without redefining what it is for.",
4800
+ {
4801
+ altLabels: ["retrofitting"],
4802
+ external: [
4803
+ mapping("aat", "300109756", "retrofitting", "close"),
4804
+ mapping(
4805
+ "uniclass",
4806
+ "PM_35_40_70",
4807
+ "Retrofit energy requirements",
4808
+ "related"
4809
+ ),
4810
+ mapping("wikidata", "Q24662", "retrofitting", "close")
4811
+ ],
4812
+ related: [...relatedTo7(REFURBISHMENT, "requirement.net-zero")]
4813
+ }
4814
+ ),
4815
+ gapsTerm(
4816
+ "adaptive-reuse",
4817
+ "Adaptive reuse",
4818
+ "Conversion of an existing building to a use other than the one it was built for, keeping its structure and as much of its character as the new use allows.",
4819
+ {
4820
+ altLabels: ["building conversion"],
4821
+ external: [
4822
+ mapping("aat", "300056392", "adaptive reuse", "close"),
4823
+ mapping("wikidata", "Q2086116", "adaptive reuse", "close")
4824
+ ],
4825
+ related: [...relatedTo7(REFURBISHMENT, "requirement.embodied-carbon")],
4826
+ searchedWithout: [
4827
+ gapsSearchedUniclass("Adaptive reuse | conversion | change of use")
4828
+ ]
4829
+ }
4830
+ ),
4831
+ gapsTerm(
4832
+ "historic-preservation",
4833
+ "Historic preservation",
4834
+ "Work to protect a building of historic or cultural value and keep it in use, by maintaining, repairing, restoring or adapting it with its significance as the constraint.",
4835
+ {
4836
+ altLabels: ["heritage conservation"],
4837
+ external: [
4838
+ mapping("aat", "300054166", "historic preservation", "close"),
4839
+ mapping(
4840
+ "uniclass",
4841
+ "Ac_30_60_16",
4842
+ "Conservation activities",
4843
+ "related"
4844
+ ),
4845
+ mapping("wikidata", "Q914856", "historic preservation", "close")
4846
+ ]
4847
+ }
4848
+ ),
4849
+ gapsTerm(
4850
+ "restoration",
4851
+ "Restoration",
4852
+ "Work that returns a building, or part of one, to its form at a chosen earlier period by removing later additions and replacing lost fabric.",
4853
+ {
4854
+ external: [
4855
+ mapping("aat", "300053742", "restoration (process)", "close"),
4856
+ mapping("uniclass", "Ac_30_60_71", "Restoration activities", "close")
4857
+ ],
4858
+ related: relatedTo7("intervention.historic-preservation"),
4859
+ searchedWithout: [
4860
+ gapsSearchedWikidata(
4861
+ "building restoration | architectural restoration"
4862
+ )
4863
+ ]
4864
+ }
4865
+ ),
4866
+ gapsTerm(
4867
+ "extension",
4868
+ "Extension",
4869
+ "Work that adds floor area or volume to a building that already stands, attached to it, rather than altering what is already there.",
4870
+ {
4871
+ altLabels: ["building extension", "addition"],
4872
+ external: [
4873
+ mapping(
4874
+ "aat",
4875
+ "300445666",
4876
+ "additions (built work divisions)",
4877
+ "close"
4878
+ ),
4879
+ mapping("wikidata", "Q112228551", "building extension", "close")
4880
+ ],
4881
+ searchedWithout: [gapsSearchedUniclass("Extension | building extension")]
4882
+ }
4883
+ ),
4884
+ gapsTerm(
4885
+ "fit-out",
4886
+ "Fit-out",
4887
+ "Work that finishes and equips the interior of an existing shell or base-build space for its occupier: partitions, finishes, services terminals, joinery and furniture.",
4888
+ {
4889
+ altLabels: ["fitting out", "interior fit-out", "fitout"],
4890
+ external: [
4891
+ mapping("uniclass", "Ac_10_40_41", "Internal fitting out", "close")
4892
+ ],
4893
+ searchedWithout: [
4894
+ gapsSearchedAat("fit-out | fitting out | interior fit"),
4895
+ gapsSearchedWikidata("fit-out | interior fit out")
4896
+ ]
4897
+ }
4898
+ )
4899
+ ];
4900
+
4901
+ // src/axes/time-of-day.ts
4902
+ var MOODY = "mood.moody";
4903
+ var relatedTo8 = (...targets) => targets.map((target) => ({ predicate: "related-to", target }));
4904
+ var TIME_OF_DAY_HOUR_TERMS = [
4905
+ gapsTerm(
4906
+ "dawn",
4907
+ "Dawn",
4908
+ "The first light before sunrise, when the sky brightens and the sun is not yet up.",
4909
+ {
4910
+ external: [
4911
+ mapping("aat", "300343621", "dawn (time of day)", "close"),
4912
+ mapping("wikidata", "Q11326182", "dawn", "close")
4913
+ ],
4914
+ related: relatedTo8("mood.soft"),
4915
+ searchedWithout: [gapsSearchedUniclass("Dawn")]
4916
+ }
4917
+ ),
4918
+ gapsTerm(
4919
+ "morning",
4920
+ "Morning",
4921
+ "The hours from sunrise towards noon, with the light arriving low from the east and rising.",
4922
+ {
4923
+ altLabels: ["morning light"],
4924
+ external: [
4925
+ mapping("aat", "300343630", "morning", "close"),
4926
+ mapping("wikidata", "Q7722", "morning", "close")
4927
+ ],
4928
+ related: relatedTo8("daylight.aspect.east-facing"),
4929
+ searchedWithout: [gapsSearchedUniclass("Morning | morning light")]
4930
+ }
4931
+ ),
4932
+ gapsTerm(
4933
+ "golden-hour",
4934
+ "Golden hour",
4935
+ "The first and last hour of sunlight in the day, when the sun is low and the light is warm, directional and soft.",
4936
+ {
4937
+ altLabels: ["magic hour"],
4938
+ external: [mapping("wikidata", "Q3238843", "golden hour", "exact")],
4939
+ related: relatedTo8("mood.soft"),
4940
+ searchedWithout: [
4941
+ gapsSearchedAat("golden hour | magic hour"),
4942
+ gapsSearchedUniclass("Golden hour | magic hour")
4943
+ ]
4944
+ }
4945
+ ),
4946
+ gapsTerm(
4947
+ "dusk",
4948
+ "Dusk",
4949
+ "The time after sunset but before full dark, when the sky still holds light and a room's own lamps begin to count.",
4950
+ {
4951
+ external: [
4952
+ mapping("aat", "300343622", "dusk", "close"),
4953
+ mapping("wikidata", "Q11288132", "dusk", "close")
4954
+ ],
4955
+ related: relatedTo8(MOODY),
4956
+ searchedWithout: [gapsSearchedUniclass("Dusk | twilight")]
4957
+ }
4958
+ ),
4959
+ gapsTerm(
4960
+ "evening",
4961
+ "Evening",
4962
+ "The latter part of the day, from about sunset until bedtime, when daylight gives way to lamps.",
4963
+ {
4964
+ altLabels: ["evening light"],
4965
+ external: [
4966
+ mapping("aat", "300343633", "evening", "close"),
4967
+ mapping("wikidata", "Q7725", "evening", "close")
4968
+ ],
4969
+ related: relatedTo8("daylight.aspect.west-facing"),
4970
+ searchedWithout: [gapsSearchedUniclass("Evening | evening light")]
4971
+ }
4972
+ ),
4973
+ gapsTerm(
4974
+ "night",
4975
+ "Night",
4976
+ "The hours between sunset and sunrise, when a room is seen by artificial light or none and the windows are dark.",
4977
+ {
4978
+ external: [
4979
+ mapping("aat", "300133095", "night", "close"),
4980
+ mapping("wikidata", "Q575", "night", "close")
4981
+ ],
4982
+ related: relatedTo8(MOODY),
4983
+ searchedWithout: [gapsSearchedUniclass("Night")]
4984
+ }
4985
+ )
4986
+ ];
4987
+ var TIME_OF_DAY_LIT_BY_TERMS = [
4988
+ gapsTerm(
4989
+ "lamplit",
4990
+ "Lamplit",
4991
+ "Seen by the pools of light from table lamps, floor lamps and wall lights, rather than by one overhead source or by daylight.",
4992
+ {
4993
+ altLabels: ["lamplight", "lamp-lit"],
4994
+ related: relatedTo8("element.luminaire", "mood.sheltering"),
4995
+ searchedWithout: [
4996
+ gapsSearchedAat("lamplight | lamp-lit"),
4997
+ gapsSearchedUniclass("Lamplight | lamplit"),
4998
+ gapsSearchedWikidata("lamplight")
4999
+ ]
5000
+ }
5001
+ ),
5002
+ gapsTerm(
5003
+ "candlelit",
5004
+ "Candlelit",
5005
+ "Seen by the light of candles or open flame: low, warm and unsteady, with deep shadow beyond it.",
5006
+ {
5007
+ altLabels: ["candlelight", "candle-lit"],
5008
+ related: relatedTo8(MOODY),
5009
+ searchedWithout: [
5010
+ gapsSearchedAat("candlelight | candle-lit"),
5011
+ gapsSearchedUniclass("Candlelight | candlelit"),
5012
+ gapsSearchedWikidata("candlelight")
5013
+ ]
5014
+ }
5015
+ )
5016
+ ];
5017
+
5018
+ // src/axes/gaps-axes.ts
5019
+ var CERTIFICATION_AXIS = {
5020
+ boundary: "Certification is the named scheme or declaration that evidences a requirement: FSC for responsible sourcing, GREENGUARD for indoor air quality, an environmental product declaration for embodied carbon. Requirement is the need a project states and may be met by a different scheme or a test report; a scheme is never a kind of requirement, so the two are linked with related-to and never nested. It is not Procurement, which is how a thing is bought, and not Tier, which is where it sits in a market. Holding a certificate is a claim for a source system to evidence, as it is for Requirement.",
5021
+ facets: single(
5022
+ "certification",
5023
+ "Certification",
5024
+ CERTIFICATION_TERMS,
5025
+ GAPS_LIFECYCLE
5026
+ ),
5027
+ governance: GAPS_LIFECYCLE,
5028
+ label: "Certification",
5029
+ question: "What scheme or declaration evidences it?",
5030
+ slug: "certification",
5031
+ status: "authored"
5032
+ };
5033
+ var INTERVENTION_AXIS = {
5034
+ boundary: "Intervention is what a project does to a building: build it new, renew it, convert it, extend it, restore it or fit out its interior. It is not Sector, which is whom the building serves, not Typology, which is what it is, and not Period, which is when it was made: a warehouse converted to flats keeps its typology and carries the intervention adaptive reuse. It is not Strategy, which is what the design sets out to achieve, and not the trade doing the work. A project may carry several, such as a conversion with an extension.",
5035
+ facets: single(
5036
+ "intervention",
5037
+ "Intervention",
5038
+ INTERVENTION_TERMS,
5039
+ GAPS_LIFECYCLE
5040
+ ),
5041
+ governance: GAPS_LIFECYCLE,
5042
+ label: "Intervention",
5043
+ question: "What is being done to the building?",
5044
+ slug: "intervention",
5045
+ status: "authored"
5046
+ };
5047
+ var BRIEF_AXES = [
5048
+ CERTIFICATION_AXIS,
5049
+ INTERVENTION_AXIS
5050
+ ];
5051
+ var TIME_OF_DAY_AXIS = {
5052
+ boundary: "Time of day is the hour a scheme is designed for or evokes, and the kind of light it is seen by after dark, reached by `evokes` like Season, Place and Period are. It is not Season, which is the time of year and which an hour composes with; not Daylight, which records the natural light a room receives and the way it faces, a fact about the room and not about a scheme; and not Mood, where calm and moody are outcomes rather than hours. Lit by names a kind of source and nothing more: luminaires are Element terms, and no lighting design is recorded on any axis.",
5053
+ facets: [
5054
+ {
5055
+ governance: GAPS_LIFECYCLE,
5056
+ label: "Hour",
5057
+ slug: "hour",
5058
+ terms: TIME_OF_DAY_HOUR_TERMS
5059
+ },
5060
+ {
5061
+ governance: GAPS_LIFECYCLE,
5062
+ label: "Lit by",
5063
+ slug: "lit-by",
5064
+ terms: TIME_OF_DAY_LIT_BY_TERMS
5065
+ }
5066
+ ],
5067
+ governance: GAPS_LIFECYCLE,
5068
+ label: "Time of day",
5069
+ question: "Which hour is it meant for, and what is it lit by?",
5070
+ slug: "time-of-day",
5071
+ status: "authored"
5072
+ };
5073
+
4457
5074
  // src/axes/installation-layout.ts
4458
5075
  var REVIEW_DATE5 = "2026-08-31";
4459
5076
  var REVIEW_SOURCE4 = "@instruments/taxonomy TAX-45 reviewed implementation contract";
@@ -4483,7 +5100,7 @@ var mgLayoutTerm = (slug, label, definition, extra = {}) => ({
4483
5100
  ...extra
4484
5101
  });
4485
5102
  var RUNNING_BOND = "installation-layout.running-bond";
4486
- var relatedTo7 = (...targets) => targets.map((target) => ({ predicate: "related-to", target }));
5103
+ var relatedTo9 = (...targets) => targets.map((target) => ({ predicate: "related-to", target }));
4487
5104
  var INSTALLATION_LAYOUT_TERMS = [
4488
5105
  {
4489
5106
  ...term5(
@@ -4491,7 +5108,7 @@ var INSTALLATION_LAYOUT_TERMS = [
4491
5108
  "Stack bond",
4492
5109
  "Equal units align in straight rows and columns with joints continuing across both directions."
4493
5110
  ),
4494
- related: relatedTo7(RUNNING_BOND),
5111
+ related: relatedTo9(RUNNING_BOND),
4495
5112
  searchedWithout: [searchedUniclass3("stack bond")]
4496
5113
  },
4497
5114
  {
@@ -4508,7 +5125,7 @@ var INSTALLATION_LAYOUT_TERMS = [
4508
5125
  "Offset grid",
4509
5126
  "Units occupy a repeated grid whose adjacent rows or columns are displaced, without the directional course identity of running bond."
4510
5127
  ),
4511
- related: relatedTo7(RUNNING_BOND),
5128
+ related: relatedTo9(RUNNING_BOND),
4512
5129
  searchedWithout: [searchedUniclass3("Offset grid flooring")]
4513
5130
  },
4514
5131
  {
@@ -4539,7 +5156,7 @@ var INSTALLATION_LAYOUT_TERMS = [
4539
5156
  }
4540
5157
  }
4541
5158
  ),
4542
- related: relatedTo7("installation-layout.herringbone"),
5159
+ related: relatedTo9("installation-layout.herringbone"),
4543
5160
  searchedWithout: [searchedUniclass3("chevron flooring")]
4544
5161
  },
4545
5162
  {
@@ -4556,7 +5173,7 @@ var INSTALLATION_LAYOUT_TERMS = [
4556
5173
  "Pinwheel",
4557
5174
  "Units rotate around repeated centres, commonly with a smaller central unit."
4558
5175
  ),
4559
- related: relatedTo7("installation-layout.multi-size-modular"),
5176
+ related: relatedTo9("installation-layout.multi-size-modular"),
4560
5177
  searchedWithout: [searchedUniclass3("Pinwheel flooring")]
4561
5178
  },
4562
5179
  {
@@ -4565,7 +5182,7 @@ var INSTALLATION_LAYOUT_TERMS = [
4565
5182
  "Multi-size modular",
4566
5183
  "Two or more unit sizes repeat as one governed modular installation sequence."
4567
5184
  ),
4568
- related: relatedTo7("installation-layout.periodic-multi-shape"),
5185
+ related: relatedTo9("installation-layout.periodic-multi-shape"),
4569
5186
  searchedWithout: [searchedUniclass3("Multi-size modular flooring")]
4570
5187
  },
4571
5188
  {
@@ -4574,7 +5191,7 @@ var INSTALLATION_LAYOUT_TERMS = [
4574
5191
  "Ashlar",
4575
5192
  "Rectangular units of varied lengths or sizes form coursed horizontal joints with controlled vertical-joint displacement."
4576
5193
  ),
4577
- related: relatedTo7(RUNNING_BOND),
5194
+ related: relatedTo9(RUNNING_BOND),
4578
5195
  searchedWithout: [searchedUniclass3("ashlar masonry")]
4579
5196
  },
4580
5197
  {
@@ -4583,7 +5200,7 @@ var INSTALLATION_LAYOUT_TERMS = [
4583
5200
  "Random stagger",
4584
5201
  "Elongated units form courses whose end joints vary without a stable repeating offset."
4585
5202
  ),
4586
- related: relatedTo7(RUNNING_BOND),
5203
+ related: relatedTo9(RUNNING_BOND),
4587
5204
  searchedWithout: [searchedUniclass3("Random stagger flooring")]
4588
5205
  },
4589
5206
  {
@@ -4619,7 +5236,7 @@ var INSTALLATION_LAYOUT_TERMS = [
4619
5236
  "Versailles parquet",
4620
5237
  "Framed square panels, each filled with an interlocking diagonal basketweave lattice, repeat across the surface."
4621
5238
  ),
4622
- related: relatedTo7("installation-layout.basketweave"),
5239
+ related: relatedTo9("installation-layout.basketweave"),
4623
5240
  searchedWithout: [searchedUniclass3("Versailles parquet")]
4624
5241
  },
4625
5242
  {
@@ -4628,7 +5245,7 @@ var INSTALLATION_LAYOUT_TERMS = [
4628
5245
  "Chantilly parquet",
4629
5246
  "Framed square panels, each filled with an interlaced lattice of diamond or cross-shaped units, repeat across the surface."
4630
5247
  ),
4631
- related: relatedTo7("installation-layout.versailles"),
5248
+ related: relatedTo9("installation-layout.versailles"),
4632
5249
  searchedWithout: [searchedUniclass3("Chantilly parquet")]
4633
5250
  },
4634
5251
  // MG-2218. Narrower than herringbone: every double herringbone installation is also a broken
@@ -4650,7 +5267,7 @@ var INSTALLATION_LAYOUT_TERMS = [
4650
5267
  "Hexagonal parquet block",
4651
5268
  "Elongated units arranged radially in groups of six form repeating hexagonal parquet blocks across the surface."
4652
5269
  ),
4653
- related: relatedTo7("installation-layout.versailles"),
5270
+ related: relatedTo9("installation-layout.versailles"),
4654
5271
  searchedWithout: [searchedUniclass3("Hexagonal parquet block flooring")]
4655
5272
  }
4656
5273
  ];
@@ -4888,6 +5505,8 @@ var EN_14080 = "EN 14080:2013";
4888
5505
  var EN_16351 = "EN 16351:2021";
4889
5506
  var EN_14374 = "EN 14374:2004";
4890
5507
  var ENGINEERED_WOOD_SLUG = "engineered-wood";
5508
+ var MASS_TIMBER_SLUG = "mass-timber";
5509
+ var CROSS_LAMINATED_TIMBER = "cross-laminated timber";
4891
5510
  var MATERIAL_ENGINEERED_WOOD_TERMS = [
4892
5511
  // Families.
4893
5512
  compositionTerm(
@@ -4938,16 +5557,14 @@ var MATERIAL_ENGINEERED_WOOD_TERMS = [
4938
5557
  "A structural timber product manufactured from layers of timber boards stacked and bonded together with the grain of each layer rotated orthogonally to the adjacent layers.",
4939
5558
  EN_16351,
4940
5559
  {
4941
- altLabels: ["cross-laminated timber"],
4942
- broaderSlug: ENGINEERED_WOOD_SLUG,
5560
+ altLabels: [CROSS_LAMINATED_TIMBER],
5561
+ broaderSlug: MASS_TIMBER_SLUG,
4943
5562
  external: [
4944
- externalMapping(
4945
- "wikidata",
4946
- "Q911043",
4947
- "cross-laminated timber",
4948
- "close"
4949
- )
5563
+ externalMapping("wikidata", "Q911043", CROSS_LAMINATED_TIMBER, "close"),
5564
+ externalMapping("aat", "300444008", CROSS_LAMINATED_TIMBER, "close")
4950
5565
  ],
5566
+ // Re-parented beneath `mass-timber` on the date that term was added.
5567
+ reviewedAt: GAPS_DATE,
4951
5568
  searchedWithout: searchedUniclass5("CLT | cross-laminated timber | clt"),
4952
5569
  seenAs: ["cross laminated timber"]
4953
5570
  }
@@ -4988,15 +5605,18 @@ var MATERIAL_ENGINEERED_WOOD_TERMS = [
4988
5605
  EN_14080,
4989
5606
  {
4990
5607
  altLabels: ["glued laminated timber", "glue-laminated timber"],
4991
- broaderSlug: ENGINEERED_WOOD_SLUG,
5608
+ broaderSlug: MASS_TIMBER_SLUG,
4992
5609
  external: [
4993
5610
  externalMapping(
4994
5611
  "wikidata",
4995
5612
  "Q643449",
4996
5613
  "glued laminated timber",
4997
5614
  "close"
4998
- )
5615
+ ),
5616
+ externalMapping("aat", "300390588", "glue-laminated timber", "close")
4999
5617
  ],
5618
+ // Re-parented beneath `mass-timber` on the date that term was added.
5619
+ reviewedAt: GAPS_DATE,
5000
5620
  searchedWithout: searchedUniclass5(
5001
5621
  "Glulam | glued laminated timber | glue-laminated timber | glulam"
5002
5622
  )
@@ -5021,6 +5641,26 @@ var MATERIAL_ENGINEERED_WOOD_TERMS = [
5021
5641
  searchedWithout: searchedUniclass5("LVL | laminated veneer lumber | lvl")
5022
5642
  }
5023
5643
  ),
5644
+ // The structural class CLT and glulam sit in. Every CLT and every glulam member is mass timber,
5645
+ // so both nest here; LVL does not, because it is built up from veneers and not from large solid
5646
+ // elements. Added for TAX-66, and no outside vocabulary has it: AAT and Uniclass name the
5647
+ // products and not the class.
5648
+ authoredTerm(
5649
+ MASS_TIMBER_SLUG,
5650
+ "Mass timber",
5651
+ "Structural engineered wood made from large solid timber elements bonded into load-bearing panels, beams and columns, such as cross-laminated timber and glued laminated timber, rather than from small sections or fibre.",
5652
+ {
5653
+ broaderSlug: ENGINEERED_WOOD_SLUG,
5654
+ introducedAt: GAPS_DATE,
5655
+ provenance: GAPS_PROVENANCE,
5656
+ reviewedAt: GAPS_DATE,
5657
+ searchedWithout: [
5658
+ gapsSearchedUniclass("Mass timber | massive timber"),
5659
+ gapsSearchedAat("mass timber"),
5660
+ gapsSearchedWikidata("mass timber")
5661
+ ]
5662
+ }
5663
+ ),
5024
5664
  compositionTerm(
5025
5665
  "osb",
5026
5666
  "OSB",
@@ -7230,6 +7870,29 @@ var MATERIAL_MINERALS_TERMS = [
7230
7870
  externalMapping("wikidata", "Q6549153", "lime plaster", "close")
7231
7871
  ]
7232
7872
  }
7873
+ ),
7874
+ // Added for TAX-66. AAT and Uniclass both name it as a material (Uniclass by its French word,
7875
+ // Pisé), where Wikidata names the building technique, hence `close` on every mapping. Beneath
7876
+ // `mineral` because the body is subsoil, which is mineral whatever it is stabilised with. Not
7877
+ // filed under a material family: stabilised earth is cement-bound only in part, so no shelf holds
7878
+ // for every instance.
7879
+ authoredTerm(
7880
+ "rammed-earth",
7881
+ "Rammed earth",
7882
+ "Subsoil of sand, gravel and clay compacted in layers within formwork to form a monolithic wall or floor, with or without a cement or lime stabiliser.",
7883
+ {
7884
+ altLabels: ["pis\xE9", "pis\xE9 de terre"],
7885
+ broaderSlug: MINERAL_SLUG2,
7886
+ external: [
7887
+ externalMapping("aat", "300014365", "rammed earth", "close"),
7888
+ externalMapping("uniclass", "Ma_20_64", "Pis\xE9", "close"),
7889
+ externalMapping("wikidata", "Q1363009", "rammed earth", "close")
7890
+ ],
7891
+ introducedAt: GAPS_DATE,
7892
+ provenance: GAPS_PROVENANCE,
7893
+ related: [{ predicate: "related-to", target: "material.clay" }],
7894
+ reviewedAt: GAPS_DATE
7895
+ }
7233
7896
  )
7234
7897
  ];
7235
7898
 
@@ -10810,7 +11473,7 @@ var SNAPSHOT4 = "2026-08-21";
10810
11473
  var MS_MOOD = "ms_mood, a mood dictionary in a materials-retrieval system (src-05)";
10811
11474
  var ADR = "@instruments/taxonomy ADR 0001";
10812
11475
  var aat5 = (identifier, label, match) => ({ identifier, label, match, scheme: "aat" });
10813
- var relatedTo8 = (target) => ({
11476
+ var relatedTo10 = (target) => ({
10814
11477
  predicate: "related-to",
10815
11478
  target
10816
11479
  });
@@ -10862,7 +11525,7 @@ var MOOD_TERMS = [
10862
11525
  definition: "Sharp edges and clean contrast; the opposite meaning to soft.",
10863
11526
  label: "Crisp",
10864
11527
  provenance: { basis: "vendored", snapshot: SNAPSHOT4, source: MS_MOOD },
10865
- related: [relatedTo8("mood.soft")],
11528
+ related: [relatedTo10("mood.soft")],
10866
11529
  searchedWithout: [
10867
11530
  {
10868
11531
  date: SEARCHED_ON,
@@ -10877,7 +11540,7 @@ var MOOD_TERMS = [
10877
11540
  definition: "Dark, low-lit and enclosing, without necessarily being theatrical.",
10878
11541
  label: "Moody",
10879
11542
  provenance: { basis: "vendored", snapshot: SNAPSHOT4, source: MS_MOOD },
10880
- related: [relatedTo8("mood.dramatic")],
11543
+ related: [relatedTo10("mood.dramatic")],
10881
11544
  searchedWithout: [
10882
11545
  {
10883
11546
  date: SEARCHED_ON,
@@ -10936,7 +11599,7 @@ var MOOD_TERMS = [
10936
11599
  definition: "Sober and unplayful; the room signals that consequential things happen in it.",
10937
11600
  label: "Serious",
10938
11601
  provenance: { basis: "vendored", snapshot: SNAPSHOT4, source: MS_MOOD },
10939
- related: [relatedTo8("mood.playful")],
11602
+ related: [relatedTo10("mood.playful")],
10940
11603
  searchedWithout: [
10941
11604
  {
10942
11605
  date: SEARCHED_ON,
@@ -10953,7 +11616,7 @@ var MOOD_TERMS = [
10953
11616
  label: "Austere",
10954
11617
  note: "Authored here. Two estate vocabularies carry a monastic register (a rendering pipeline's `tactile-monastic`, a materials-retrieval system's `monastic`) that no ms_mood term reaches: `calm` and `serious` both understate it, and neither carries the renunciation.",
10955
11618
  provenance: { basis: "authored", source: ADR },
10956
- related: [relatedTo8("mood.calm"), relatedTo8("mood.serious")],
11619
+ related: [relatedTo10("mood.calm"), relatedTo10("mood.serious")],
10957
11620
  searchedWithout: [
10958
11621
  {
10959
11622
  date: SEARCHED_ON,
@@ -11006,7 +11669,7 @@ var MOOD_TERMS = [
11006
11669
  ],
11007
11670
  label: "Quiet Luxury",
11008
11671
  provenance: { basis: "vendored", snapshot: SNAPSHOT4, source: MS_MOOD },
11009
- related: [relatedTo8("mood.luxurious")],
11672
+ related: [relatedTo10("mood.luxurious")],
11010
11673
  searchedWithout: [
11011
11674
  {
11012
11675
  date: SEARCHED_ON,
@@ -11070,361 +11733,398 @@ var MOOD_TERMS = [
11070
11733
  }
11071
11734
  ];
11072
11735
 
11736
+ // src/axes/palette.generated.ts
11737
+ var COLORSCOPE_VERSION = "10.4.0";
11738
+ var COLOUR_LAYER = {
11739
+ "basic-tone": [
11740
+ {
11741
+ altLabels: [],
11742
+ definition: "High-lightness colors inside a family.",
11743
+ hex: null,
11744
+ id: "light",
11745
+ label: "Light",
11746
+ uri: "https://colorscope.materialinstruments.com/id/basic-tone/light"
11747
+ },
11748
+ {
11749
+ altLabels: [],
11750
+ definition: "Canonical product-facing colors inside a family.",
11751
+ hex: null,
11752
+ id: "mid",
11753
+ label: "Medium",
11754
+ uri: "https://colorscope.materialinstruments.com/id/basic-tone/mid"
11755
+ },
11756
+ {
11757
+ altLabels: [],
11758
+ definition: "Low-lightness colors inside a family.",
11759
+ hex: null,
11760
+ id: "dark",
11761
+ label: "Dark",
11762
+ uri: "https://colorscope.materialinstruments.com/id/basic-tone/dark"
11763
+ },
11764
+ {
11765
+ altLabels: [],
11766
+ definition: "Lower-chroma colors inside a family.",
11767
+ hex: null,
11768
+ id: "muted",
11769
+ label: "Muted",
11770
+ uri: "https://colorscope.materialinstruments.com/id/basic-tone/muted"
11771
+ },
11772
+ {
11773
+ altLabels: [],
11774
+ definition: "Higher-chroma colors inside a family.",
11775
+ hex: null,
11776
+ id: "vivid",
11777
+ label: "Vivid",
11778
+ uri: "https://colorscope.materialinstruments.com/id/basic-tone/vivid"
11779
+ }
11780
+ ],
11781
+ family: [
11782
+ {
11783
+ altLabels: [],
11784
+ definition: "Light neutral colors spanning crisp whites, cool whites, soft chalks, and paper-like off-whites.",
11785
+ hex: "#f3efe6",
11786
+ id: "white",
11787
+ label: "White",
11788
+ uri: "https://colorscope.materialinstruments.com/id/family/white"
11789
+ },
11790
+ {
11791
+ altLabels: [],
11792
+ definition: "Warm white and pale cream colors spanning ivory, linen white, vanilla, eggshell, and softened cream tones.",
11793
+ hex: "#f3ead8",
11794
+ id: "cream",
11795
+ label: "Cream",
11796
+ uri: "https://colorscope.materialinstruments.com/id/family/cream"
11797
+ },
11798
+ {
11799
+ altLabels: ["Grey"],
11800
+ definition: "Cool and warm grays spanning mist, stone, slate, pewter, and architectural neutrals.",
11801
+ hex: "#8c8d8f",
11802
+ id: "gray",
11803
+ label: "Gray",
11804
+ uri: "https://colorscope.materialinstruments.com/id/family/gray"
11805
+ },
11806
+ {
11807
+ altLabels: [],
11808
+ definition: "Near-black and black-led colors with mineral, ink, soot, and shadow character.",
11809
+ hex: "#232425",
11810
+ id: "black",
11811
+ label: "Black",
11812
+ uri: "https://colorscope.materialinstruments.com/id/family/black"
11813
+ },
11814
+ {
11815
+ altLabels: [],
11816
+ definition: "Light warm neutrals built from sand, linen, oat, ecru, and mellow mineral undertones.",
11817
+ hex: "#d1c2a5",
11818
+ id: "beige",
11819
+ label: "Beige",
11820
+ uri: "https://colorscope.materialinstruments.com/id/family/beige"
11821
+ },
11822
+ {
11823
+ altLabels: [],
11824
+ definition: "Grey-brown and mushroom neutrals sitting between beige, brown, and grey.",
11825
+ hex: "#8b7d6b",
11826
+ id: "taupe",
11827
+ label: "Taupe",
11828
+ uri: "https://colorscope.materialinstruments.com/id/family/taupe"
11829
+ },
11830
+ {
11831
+ altLabels: [],
11832
+ definition: "Earth and wood colors spanning bark, spice, soil, cocoa, leather, and dark timber tones.",
11833
+ hex: "#7b5738",
11834
+ id: "brown",
11835
+ label: "Brown",
11836
+ uri: "https://colorscope.materialinstruments.com/id/family/brown"
11837
+ },
11838
+ {
11839
+ altLabels: [],
11840
+ definition: "Red-led colors spanning crimson, vermilion, tomato, signal red, and deep wine hues.",
11841
+ hex: "#b4403f",
11842
+ id: "red",
11843
+ label: "Red",
11844
+ uri: "https://colorscope.materialinstruments.com/id/family/red"
11845
+ },
11846
+ {
11847
+ altLabels: [],
11848
+ definition: "Orange-led colors spanning terracotta, rust, clay, amber, spice, and peel-bright hues.",
11849
+ hex: "#c77448",
11850
+ id: "orange",
11851
+ label: "Orange",
11852
+ uri: "https://colorscope.materialinstruments.com/id/family/orange"
11853
+ },
11854
+ {
11855
+ altLabels: [],
11856
+ definition: "Yellow-led colors ranging from straw and butter tones through gold, citrus, and saffron.",
11857
+ hex: "#d5b468",
11858
+ id: "yellow",
11859
+ label: "Yellow",
11860
+ uri: "https://colorscope.materialinstruments.com/id/family/yellow"
11861
+ },
11862
+ {
11863
+ altLabels: [],
11864
+ definition: "Green-led colors spanning sage, herb, leaf, forest, mint, and botanical families.",
11865
+ hex: "#5c8a57",
11866
+ id: "green",
11867
+ label: "Green",
11868
+ uri: "https://colorscope.materialinstruments.com/id/family/green"
11869
+ },
11870
+ {
11871
+ altLabels: ["Blue Green", "Blue-Green"],
11872
+ definition: "Blue-green colors spanning aqua, lagoon, patina, seafoam, and mineral teal tones.",
11873
+ hex: "#4e8e8e",
11874
+ id: "teal",
11875
+ label: "Teal",
11876
+ uri: "https://colorscope.materialinstruments.com/id/family/teal"
11877
+ },
11878
+ {
11879
+ altLabels: [],
11880
+ definition: "Blue-led colors spanning sky, sea, teal-leaning, ink, navy, and mineral blue families.",
11881
+ hex: "#4a6e8e",
11882
+ id: "blue",
11883
+ label: "Blue",
11884
+ uri: "https://colorscope.materialinstruments.com/id/family/blue"
11885
+ },
11886
+ {
11887
+ altLabels: [],
11888
+ definition: "Purple-led colors covering lavender, mauve, plum, indigo, and smoke-violet concepts.",
11889
+ hex: "#7a5a88",
11890
+ id: "purple",
11891
+ label: "Purple",
11892
+ uri: "https://colorscope.materialinstruments.com/id/family/purple"
11893
+ },
11894
+ {
11895
+ altLabels: [],
11896
+ definition: "Pink-led colors spanning powder, rose, salmon, blossom, and berry-pink concepts.",
11897
+ hex: "#c98da0",
11898
+ id: "pink",
11899
+ label: "Pink",
11900
+ uri: "https://colorscope.materialinstruments.com/id/family/pink"
11901
+ }
11902
+ ],
11903
+ palette: [
11904
+ {
11905
+ altLabels: [],
11906
+ definition: "A palette of high vibrancy that does not spread across three or more distinct hues.",
11907
+ hex: null,
11908
+ id: "vibrant",
11909
+ label: "Vibrant",
11910
+ uri: "https://colorscope.materialinstruments.com/id/palette/vibrant"
11911
+ },
11912
+ {
11913
+ altLabels: [],
11914
+ definition: "A palette of low vibrancy and middle lightness: the default when no other composition applies.",
11915
+ hex: null,
11916
+ id: "muted",
11917
+ label: "Muted",
11918
+ uri: "https://colorscope.materialinstruments.com/id/palette/muted"
11919
+ },
11920
+ {
11921
+ altLabels: [],
11922
+ definition: "A palette whose proportion-weighted lightness is low, and which is neither monochrome nor vibrant.",
11923
+ hex: null,
11924
+ id: "dark",
11925
+ label: "Dark",
11926
+ uri: "https://colorscope.materialinstruments.com/id/palette/dark"
11927
+ },
11928
+ {
11929
+ altLabels: [],
11930
+ definition: "A palette whose proportion-weighted lightness is high, and which is neither monochrome nor vibrant.",
11931
+ hex: null,
11932
+ id: "light",
11933
+ label: "Light",
11934
+ uri: "https://colorscope.materialinstruments.com/id/palette/light"
11935
+ },
11936
+ {
11937
+ altLabels: [],
11938
+ definition: "A palette built from a single hue with little variety between its colors.",
11939
+ hex: null,
11940
+ id: "monochrome",
11941
+ label: "Monochrome",
11942
+ uri: "https://colorscope.materialinstruments.com/id/palette/monochrome"
11943
+ },
11944
+ {
11945
+ altLabels: [],
11946
+ definition: "A palette of high vibrancy spread across three or more distinct hues.",
11947
+ hex: null,
11948
+ id: "colorful",
11949
+ label: "Colorful",
11950
+ uri: "https://colorscope.materialinstruments.com/id/palette/colorful"
11951
+ }
11952
+ ],
11953
+ temperature: [
11954
+ {
11955
+ altLabels: [],
11956
+ definition: "The strongest cool reading: a highly chromatic color in the cyan to blue-violet hues.",
11957
+ hex: null,
11958
+ id: "cold",
11959
+ label: "Cold",
11960
+ uri: "https://colorscope.materialinstruments.com/id/temperature/cold"
11961
+ },
11962
+ {
11963
+ altLabels: [],
11964
+ definition: "A color that reads cool: blue-green to violet hues at modest chroma, and strongly chromatic greens and magentas.",
11965
+ hex: null,
11966
+ id: "cool",
11967
+ label: "Cool",
11968
+ uri: "https://colorscope.materialinstruments.com/id/temperature/cool"
11969
+ },
11970
+ {
11971
+ altLabels: [],
11972
+ definition: "Neither warm nor cool: achromatic colors, and weakly chromatic ones in the yellow-green, green and magenta hues.",
11973
+ hex: null,
11974
+ id: "neutral",
11975
+ label: "Neutral",
11976
+ uri: "https://colorscope.materialinstruments.com/id/temperature/neutral"
11977
+ },
11978
+ {
11979
+ altLabels: [],
11980
+ definition: "A color that reads warm: red, orange and yellow hues at modest chroma, and strongly chromatic yellow-greens.",
11981
+ hex: null,
11982
+ id: "warm",
11983
+ label: "Warm",
11984
+ uri: "https://colorscope.materialinstruments.com/id/temperature/warm"
11985
+ },
11986
+ {
11987
+ altLabels: [],
11988
+ definition: "The strongest warm reading: a highly chromatic red, orange or yellow.",
11989
+ hex: null,
11990
+ id: "hot",
11991
+ label: "Hot",
11992
+ uri: "https://colorscope.materialinstruments.com/id/temperature/hot"
11993
+ }
11994
+ ]
11995
+ };
11996
+
11073
11997
  // src/axes/palette.ts
11074
- var COLOUR_MOOD = "colour_mood, a mood dictionary in a materials-retrieval system (src-05)";
11075
- var SNAPSHOT5 = "2026-08-21";
11998
+ var COLOUR_LAYER_DATE = "2026-10-23";
11999
+ var V1_BASELINE = "2026-08-30";
11076
12000
  var COLORSCOPE_AUTHORITY_URI = "https://colorscope.materialinstruments.com";
11077
- var PALETTE_MOOD = "palette-mood";
11078
- var colorScopeAuthority = (identifier, referenceKind) => ({
11079
- authority: "colorscope",
11080
- authorityUri: COLORSCOPE_AUTHORITY_URI,
11081
- identifier,
11082
- referenceKind
11083
- });
11084
- var PALETTE_HUE_TERMS = [
11085
- {
11086
- altLabels: ["pure white", "cool white", "soft white"],
11087
- external: [
11088
- {
11089
- identifier: "Q23444",
11090
- label: "white",
11091
- match: "close",
11092
- scheme: "wikidata"
11093
- }
11094
- ],
11095
- label: "White",
11096
- searchedWithout: [searchedUniclass3("White colour")],
11097
- slug: "white"
11098
- },
11099
- {
11100
- altLabels: ["ivory", "warm white", "off-white"],
11101
- external: [
11102
- {
11103
- identifier: "Q2730433",
11104
- label: "cream",
11105
- match: "close",
11106
- scheme: "wikidata"
11107
- }
11108
- ],
11109
- label: "Cream",
11110
- searchedWithout: [searchedUniclass3("Cream colour")],
11111
- slug: "cream"
11112
- },
11113
- {
11114
- altLabels: ["neutral grey", "grey"],
11115
- external: [
11116
- {
11117
- identifier: "Q42519",
11118
- label: "grey",
11119
- match: "close",
11120
- scheme: "wikidata"
11121
- }
11122
- ],
11123
- label: "Grey",
11124
- searchedWithout: [searchedUniclass3("Grey colour")],
11125
- seenAs: ["Gray"],
11126
- slug: "gray"
11127
- },
11128
- {
11129
- altLabels: ["near-black", "ink black", "coal"],
11130
- external: [
11131
- {
11132
- identifier: "Q23445",
11133
- label: "black",
11134
- match: "close",
11135
- scheme: "wikidata"
11136
- }
11137
- ],
11138
- label: "Black",
11139
- searchedWithout: [searchedUniclass3("Black colour")],
11140
- slug: "black"
11141
- },
11142
- {
11143
- altLabels: ["warm neutral", "sand"],
11144
- external: [
11145
- {
11146
- identifier: "Q843607",
11147
- label: "beige",
11148
- match: "close",
11149
- scheme: "wikidata"
11150
- }
11151
- ],
11152
- label: "Beige",
11153
- searchedWithout: [searchedUniclass3("Beige colour")],
11154
- slug: "beige"
11155
- },
11156
- {
11157
- altLabels: ["greige", "mushroom", "putty"],
11158
- external: [
11159
- {
11160
- identifier: "Q2307593",
11161
- label: "taupe",
11162
- match: "close",
11163
- scheme: "wikidata"
11164
- }
11165
- ],
11166
- label: "Taupe",
11167
- searchedWithout: [searchedUniclass3("Taupe colour")],
11168
- slug: "taupe"
11169
- },
11170
- {
11171
- altLabels: ["earth brown", "wood brown", "russet"],
11172
- external: [
11173
- {
11174
- identifier: "Q47071",
11175
- label: "brown",
11176
- match: "close",
11177
- scheme: "wikidata"
11178
- }
11179
- ],
11180
- label: "Brown",
11181
- searchedWithout: [searchedUniclass3("Brown colour")],
11182
- slug: "brown"
11183
- },
11184
- {
11185
- altLabels: ["crimson", "scarlet", "carmine"],
11186
- external: [
11187
- {
11188
- identifier: "Q3142",
11189
- label: "red",
11190
- match: "close",
11191
- scheme: "wikidata"
11192
- }
11193
- ],
11194
- label: "Red",
11195
- searchedWithout: [searchedUniclass3("Red colour")],
11196
- slug: "red"
11197
- },
11198
- {
11199
- altLabels: ["rust"],
11200
- external: [
11201
- {
11202
- identifier: "Q39338",
11203
- label: "orange",
11204
- match: "close",
11205
- scheme: "wikidata"
11206
- }
11207
- ],
11208
- label: "Orange",
11209
- searchedWithout: [searchedUniclass3("Orange colour")],
11210
- slug: "orange"
11211
- },
11212
- {
11213
- altLabels: ["mustard", "ochre"],
11214
- external: [
11215
- {
11216
- identifier: "Q943",
11217
- label: "yellow",
11218
- match: "close",
11219
- scheme: "wikidata"
11220
- }
11221
- ],
11222
- label: "Yellow",
11223
- searchedWithout: [searchedUniclass3("Yellow colour")],
11224
- slug: "yellow"
11225
- },
11226
- {
11227
- altLabels: ["sage", "olive"],
11228
- external: [
11229
- {
11230
- identifier: "Q3133",
11231
- label: "green",
11232
- match: "close",
11233
- scheme: "wikidata"
11234
- }
11235
- ],
11236
- label: "Green",
11237
- searchedWithout: [searchedUniclass3("Green colour")],
11238
- slug: "green"
11239
- },
11240
- {
11241
- altLabels: ["aqua", "turquoise"],
11242
- external: [
11243
- {
11244
- identifier: "Q1078214",
11245
- label: "teal",
11246
- match: "close",
11247
- scheme: "wikidata"
11248
- }
11249
- ],
11250
- label: "Teal",
11251
- searchedWithout: [searchedUniclass3("Teal colour")],
11252
- slug: "teal"
11253
- },
11254
- {
11255
- altLabels: ["navy", "indigo"],
11256
- external: [
11257
- {
11258
- identifier: "Q1088",
11259
- label: "blue",
11260
- match: "close",
11261
- scheme: "wikidata"
11262
- }
11263
- ],
11264
- label: "Blue",
11265
- searchedWithout: [searchedUniclass3("Blue colour")],
11266
- slug: "blue"
11267
- },
11268
- {
11269
- altLabels: ["violet", "mauve"],
11270
- external: [
11271
- {
11272
- identifier: "Q3257809",
11273
- label: "purple",
11274
- match: "close",
11275
- scheme: "wikidata"
11276
- }
11277
- ],
11278
- label: "Purple",
11279
- searchedWithout: [searchedUniclass3("Purple colour")],
11280
- slug: "purple"
11281
- },
11282
- {
11283
- altLabels: ["rose", "blush"],
11284
- external: [
11285
- {
11286
- identifier: "Q429220",
11287
- label: "pink",
11288
- match: "close",
11289
- scheme: "wikidata"
11290
- }
11291
- ],
11292
- label: "Pink",
11293
- searchedWithout: [searchedUniclass3("Pink colour")],
11294
- slug: "pink"
11295
- }
11296
- ].map((term12) => ({
11297
- ...term12,
11298
- canonicalAuthority: colorScopeAuthority(term12.slug, "color-family"),
11299
- provenance: {
11300
- basis: "vendored",
11301
- snapshot: SNAPSHOT5,
11302
- source: "@instruments/colorscope COLOR_FAMILIES"
11303
- }
11304
- }));
11305
- var PALETTE_TEMPERATURE_TERMS = [
11306
- {
11307
- definition: "Dominant color casts to the warm side of the OKLab warmth axis.",
11308
- label: "Warm",
11309
- searchedWithout: [searchedUniclass3("Warm colour")],
11310
- slug: "warm"
11311
- },
11312
- {
11313
- definition: "Dominant color casts to the cool side of the OKLab warmth axis.",
11314
- label: "Cool",
11315
- searchedWithout: [searchedUniclass3("Cool colour")],
11316
- slug: "cool"
11317
- },
11318
- {
11319
- definition: "No decisive cast either way.",
11320
- label: "Neutral",
11321
- searchedWithout: [searchedUniclass3("Neutral colour")],
11322
- slug: "neutral"
11323
- }
11324
- ].map((term12) => ({
11325
- ...term12,
11326
- canonicalAuthority: colorScopeAuthority(term12.slug, "temperature-level"),
11327
- provenance: {
11328
- basis: "vendored",
11329
- snapshot: SNAPSHOT5,
11330
- source: "colour_undertone, an undertone dictionary in a materials-retrieval system (src-05)"
11331
- }
11332
- }));
12001
+ var LAYER_SOURCE = `@materialinstruments/colorscope ${COLORSCOPE_VERSION} identities`;
12002
+ var COLOUR_LAYER_KINDS = {
12003
+ composition: { colorScopeKind: "palette", referenceKind: "palette-mood" },
12004
+ family: { colorScopeKind: "family", referenceKind: "color-family" },
12005
+ temperature: {
12006
+ colorScopeKind: "temperature",
12007
+ referenceKind: "temperature-level"
12008
+ },
12009
+ tone: { colorScopeKind: "basic-tone", referenceKind: "basic-tone" }
12010
+ };
12011
+ var PALETTE_LABEL_OVERRIDES = {
12012
+ "composition/colorful": "Polychrome"
12013
+ };
12014
+ var termFor = (facet, entry) => {
12015
+ const { referenceKind } = COLOUR_LAYER_KINDS[facet];
12016
+ const override = PALETTE_LABEL_OVERRIDES[`${facet}/${entry.id}`];
12017
+ const altLabels = override === void 0 ? entry.altLabels : [entry.label, ...entry.altLabels];
12018
+ return {
12019
+ ...altLabels.length === 0 ? {} : { altLabels },
12020
+ canonicalAuthority: {
12021
+ authority: "colorscope",
12022
+ authorityUri: COLORSCOPE_AUTHORITY_URI,
12023
+ identifier: entry.id,
12024
+ referenceKind,
12025
+ uri: entry.uri
12026
+ },
12027
+ ...entry.definition === null ? {} : { definition: entry.definition },
12028
+ ...entry.hex === null ? {} : { hex: entry.hex },
12029
+ introducedAt: COLOUR_LAYER_DATE,
12030
+ label: override ?? entry.label,
12031
+ ...override === void 0 ? {} : {
12032
+ note: `ColorScope labels this concept ${entry.label}; Taxonomy reads it as ${override}.`
12033
+ },
12034
+ provenance: {
12035
+ basis: "vendored",
12036
+ snapshot: COLOUR_LAYER_DATE,
12037
+ source: LAYER_SOURCE
12038
+ },
12039
+ reviewedAt: COLOUR_LAYER_DATE,
12040
+ slug: entry.id
12041
+ };
12042
+ };
12043
+ var layerTerms = (facet) => COLOUR_LAYER[COLOUR_LAYER_KINDS[facet].colorScopeKind].map(
12044
+ (entry) => termFor(facet, entry)
12045
+ );
12046
+ var PALETTE_FAMILY_TERMS = layerTerms("family");
12047
+ var PALETTE_TEMPERATURE_TERMS = layerTerms("temperature");
12048
+ var PALETTE_TONE_TERMS = layerTerms("tone");
12049
+ var PALETTE_COMPOSITION_TERMS = layerTerms("composition");
12050
+ var COLORSCOPE_WASHED_URI = `${COLORSCOPE_AUTHORITY_URI}/id/modifier/washed`;
11333
12051
  var PALETTE_CHARACTER_TERMS = [
11334
- {
11335
- canonicalAuthority: colorScopeAuthority("vibrant", PALETTE_MOOD),
11336
- definition: "High chroma; color is the loudest thing in the scheme.",
11337
- label: "Vibrant",
11338
- provenance: { basis: "vendored", snapshot: SNAPSHOT5, source: COLOUR_MOOD },
11339
- searchedWithout: [searchedUniclass3("Vibrant colour")],
11340
- slug: "vibrant"
11341
- },
11342
- {
11343
- canonicalAuthority: colorScopeAuthority("muted", PALETTE_MOOD),
11344
- definition: "Chroma held low by design, with the colors still fully present.",
11345
- label: "Muted",
11346
- provenance: { basis: "vendored", snapshot: SNAPSHOT5, source: COLOUR_MOOD },
11347
- searchedWithout: [searchedUniclass3("Muted colour")],
11348
- slug: "muted"
11349
- },
11350
12052
  {
11351
12053
  altLabels: ["sun-bleached", "washed"],
11352
12054
  definition: "Chroma reduced as if by age, wear or light, rather than chosen low. Distinct from muted: faded implies a stronger original.",
11353
12055
  label: "Faded",
11354
- note: "Authored here. Two estate vocabularies need it (a rendering pipeline's `faded` keyword and `sun-bleached-mediterranean`) and colorscope's palette moods do not reach it.",
12056
+ note: "Deprecated in 2.7.0. ColorScope owns colour, and its `washed` modifier now carries faded, sun-bleached and washed as alternate labels. Use the ColorScope concept; this URI keeps resolving.",
11355
12057
  provenance: { basis: "authored", source: "@instruments/taxonomy ADR 0001" },
11356
- searchedWithout: [searchedUniclass3("Faded colour")],
11357
- slug: "faded"
12058
+ reviewedAt: COLOUR_LAYER_DATE,
12059
+ slug: "faded",
12060
+ status: "deprecated",
12061
+ supersededByReference: COLORSCOPE_WASHED_URI
12062
+ }
12063
+ ];
12064
+ var TAXONOMY_FACET_BASE = "https://taxonomy.materialinstruments.com/id/facet";
12065
+ var layerGovernance = (introducedAt) => ({
12066
+ introducedAt,
12067
+ provenance: {
12068
+ basis: "vendored",
12069
+ snapshot: COLOUR_LAYER_DATE,
12070
+ source: LAYER_SOURCE
12071
+ },
12072
+ reviewedAt: COLOUR_LAYER_DATE
12073
+ });
12074
+ var deprecatedFacetGovernance = (successor) => ({
12075
+ introducedAt: V1_BASELINE,
12076
+ provenance: {
12077
+ basis: "authored",
12078
+ source: "@instruments/taxonomy published corpus"
11358
12079
  },
12080
+ reviewedAt: COLOUR_LAYER_DATE,
12081
+ status: "deprecated",
12082
+ supersededByReference: `${TAXONOMY_FACET_BASE}/palette/${successor}`
12083
+ });
12084
+ var PALETTE_FACET_GOVERNANCE = {
12085
+ character: deprecatedFacetGovernance("composition"),
12086
+ composition: layerGovernance(COLOUR_LAYER_DATE),
12087
+ family: layerGovernance(COLOUR_LAYER_DATE),
12088
+ hue: deprecatedFacetGovernance("family"),
12089
+ temperature: layerGovernance(V1_BASELINE),
12090
+ tone: layerGovernance(COLOUR_LAYER_DATE)
12091
+ };
12092
+ var PALETTE_AXIS_FACETS = [
11359
12093
  {
11360
- canonicalAuthority: colorScopeAuthority("mid", "lightness-level"),
11361
- definition: "Mid-range lightness across the scheme: neither pale nor deep. The midpoint that `light` and `dark` imply and neither states.",
11362
- label: "Mid",
11363
- note: "NOT authored here, and the first draft of this term was the exact mistake this package exists to stop. A paint-sample retailer bands every sample as light, medium or dark and the midpoint is its largest band, so a `medium` term was minted for it - without checking that colorscope already governs a five-level lightness scale with `mid` in the middle. An eighth vocabulary coining a word a governed vocabulary already had. Corrected to colorscope's id, with the retailer's spelling recorded under Seen in the wild where it belongs.",
11364
- provenance: {
11365
- basis: "vendored",
11366
- snapshot: SNAPSHOT5,
11367
- source: "@instruments/colorscope COLOR_LIGHTNESS_LEVELS"
11368
- },
11369
- searchedWithout: [searchedUniclass3("Mid colour")],
11370
- seenAs: ["medium", "Medium", "normal"],
11371
- slug: "mid"
12094
+ governance: PALETTE_FACET_GOVERNANCE.family,
12095
+ label: "Family",
12096
+ slug: "family",
12097
+ terms: PALETTE_FAMILY_TERMS
11372
12098
  },
11373
12099
  {
11374
- canonicalAuthority: colorScopeAuthority("dark", PALETTE_MOOD),
11375
- definition: "Low overall lightness across the scheme.",
11376
- label: "Dark",
11377
- provenance: { basis: "vendored", snapshot: SNAPSHOT5, source: COLOUR_MOOD },
11378
- searchedWithout: [searchedUniclass3("Dark colour")],
11379
- slug: "dark"
12100
+ governance: PALETTE_FACET_GOVERNANCE.temperature,
12101
+ label: "Temperature",
12102
+ slug: "temperature",
12103
+ terms: PALETTE_TEMPERATURE_TERMS
11380
12104
  },
11381
12105
  {
11382
- canonicalAuthority: colorScopeAuthority("light", PALETTE_MOOD),
11383
- definition: "High overall lightness across the scheme.",
11384
- label: "Light",
11385
- provenance: { basis: "vendored", snapshot: SNAPSHOT5, source: COLOUR_MOOD },
11386
- searchedWithout: [searchedUniclass3("Light colour")],
11387
- slug: "light"
12106
+ governance: PALETTE_FACET_GOVERNANCE.tone,
12107
+ label: "Tone",
12108
+ slug: "tone",
12109
+ terms: PALETTE_TONE_TERMS
11388
12110
  },
11389
12111
  {
11390
- canonicalAuthority: colorScopeAuthority("monochrome", PALETTE_MOOD),
11391
- definition: "One hue, or none; the scheme varies by lightness rather than by color.",
11392
- external: [
11393
- {
11394
- identifier: "Q10770146",
11395
- label: "monochrome",
11396
- match: "close",
11397
- scheme: "wikidata"
11398
- }
11399
- ],
11400
- label: "Monochrome",
11401
- provenance: { basis: "vendored", snapshot: SNAPSHOT5, source: COLOUR_MOOD },
11402
- searchedWithout: [searchedUniclass3("Monochrome colour")],
11403
- slug: "monochrome"
12112
+ governance: PALETTE_FACET_GOVERNANCE.composition,
12113
+ label: "Composition",
12114
+ slug: "composition",
12115
+ terms: PALETTE_COMPOSITION_TERMS
11404
12116
  },
11405
12117
  {
11406
- altLabels: ["polychrome"],
11407
- canonicalAuthority: colorScopeAuthority("colorful", PALETTE_MOOD),
11408
- definition: "Many hues held together deliberately.",
11409
- label: "Polychrome",
11410
- provenance: { basis: "vendored", snapshot: SNAPSHOT5, source: COLOUR_MOOD },
11411
- searchedWithout: [searchedUniclass3("Polychrome colour")],
11412
- seenAs: ["colorful"],
11413
- slug: "colorful"
12118
+ governance: PALETTE_FACET_GOVERNANCE.hue,
12119
+ label: "Hue",
12120
+ slug: "hue",
12121
+ terms: []
11414
12122
  },
11415
12123
  {
11416
- altLabels: ["jewel-toned"],
11417
- canonicalAuthority: colorScopeAuthority("saturated", "chroma-level"),
11418
- definition: "Deep and fully-loaded color, jewel-toned rather than bright. Vibrant is loud; saturated is rich, and a dark saturated scheme is ordinary while a dark vibrant one is not.",
11419
- label: "Saturated",
11420
- note: "NOT authored here, and the second time this file made that claim. It was written as authored because colorscope's PaletteMood was checked and its COLOR_CHROMA_LEVELS was not - and the chroma scale is muted, soft, vivid, SATURATED. The same failure as `mid`, in the same file, found by an adversarial pass rather than by the check that should have caught it.",
11421
- provenance: {
11422
- basis: "vendored",
11423
- snapshot: SNAPSHOT5,
11424
- source: "@instruments/colorscope COLOR_CHROMA_LEVELS"
11425
- },
11426
- searchedWithout: [searchedUniclass3("Saturated colour")],
11427
- slug: "saturated"
12124
+ governance: PALETTE_FACET_GOVERNANCE.character,
12125
+ label: "Character",
12126
+ slug: "character",
12127
+ terms: PALETTE_CHARACTER_TERMS
11428
12128
  }
11429
12129
  ];
11430
12130
 
@@ -11918,13 +12618,297 @@ var PATTERN_DIRECTIONALITY_TERMS = [
11918
12618
  "Bi-directional",
11919
12619
  "Two axes of equal weight, so the material reads correctly either way up."
11920
12620
  ),
11921
- searchedWithout: [searchedUniclass3("bidirectional pattern")]
12621
+ searchedWithout: [searchedUniclass3("bidirectional pattern")]
12622
+ }
12623
+ ];
12624
+
12625
+ // src/axes/coverage-review.ts
12626
+ var COVERAGE_SOURCE = "Linear TAX-66 coverage review";
12627
+ var coverageTerm = (slug, label, definition, extra = {}) => ({
12628
+ definition,
12629
+ introducedAt: SEARCHED_ON_TAX66_COVERAGE,
12630
+ label,
12631
+ provenance: { basis: "authored", source: COVERAGE_SOURCE },
12632
+ reviewedAt: SEARCHED_ON_TAX66_COVERAGE,
12633
+ slug,
12634
+ ...extra
12635
+ });
12636
+ var referenceFor = (mapping2) => {
12637
+ if (mapping2.scheme === "aat") {
12638
+ return `Getty AAT ${mapping2.identifier} ${mapping2.label}, http://vocab.getty.edu/aat/${mapping2.identifier}`;
12639
+ }
12640
+ if (mapping2.scheme === "wikidata") {
12641
+ return `Wikidata ${mapping2.identifier} ${mapping2.label}, https://www.wikidata.org/wiki/${mapping2.identifier}`;
12642
+ }
12643
+ return void 0;
12644
+ };
12645
+ var grounded = (entry) => {
12646
+ const sources = (entry.external ?? []).map((mapping2) => referenceFor(mapping2)).filter((source) => source !== void 0);
12647
+ if (sources.length === 0) {
12648
+ return entry;
12649
+ }
12650
+ return {
12651
+ ...entry,
12652
+ provenance: {
12653
+ basis: "referenced",
12654
+ snapshot: SEARCHED_ON_TAX66_COVERAGE,
12655
+ source: sources.join("; ")
12656
+ }
12657
+ };
12658
+ };
12659
+ var wikidataMapping = (identifier, label, match) => ({ identifier, label, match, scheme: "wikidata" });
12660
+ var searchedAat2 = (query) => ({
12661
+ date: SEARCHED_ON_TAX66_COVERAGE,
12662
+ query,
12663
+ scheme: "aat",
12664
+ via: `${GETTY_SPARQL}; luc:term search, AAT preferred labels and English scope notes read`
12665
+ });
12666
+ var searchedWikidata2 = (query) => ({
12667
+ date: SEARCHED_ON_TAX66_COVERAGE,
12668
+ query,
12669
+ scheme: "wikidata",
12670
+ via: `${WIKIDATA_SEARCH}&language=en&format=json; labels and descriptions read`
12671
+ });
12672
+ var searchedUniclass11 = (query) => ({
12673
+ date: SEARCHED_ON_TAX66_COVERAGE,
12674
+ query,
12675
+ scheme: "uniclass",
12676
+ via: `${UNICLASS_DOWNLOAD}; every July 2026 table (Ac, Co, EF, En, FI, Ma, PC, PM, Pr, RK, Ro, SL, Ss, TE) searched by title`
12677
+ });
12678
+
12679
+ // src/axes/pattern-motifs.ts
12680
+ var PLAID_CHECK = "plaid-check";
12681
+ var CULTURAL_HERITAGE = "cultural-heritage";
12682
+ var MOTIF_DRAFTS = [
12683
+ {
12684
+ ...coverageTerm(
12685
+ "gingham",
12686
+ "Gingham",
12687
+ "A check of equal-width bands crossing at right angles in white and one colour, so that the crossings read as a third, deeper tone."
12688
+ ),
12689
+ broaderSlug: PLAID_CHECK,
12690
+ external: [
12691
+ {
12692
+ identifier: "300451340",
12693
+ label: "gingham",
12694
+ match: "close",
12695
+ scheme: "aat"
12696
+ },
12697
+ wikidataMapping("Q2289640", "gingham", "close")
12698
+ ],
12699
+ searchedWithout: [searchedUniclass11("gingham")]
12700
+ },
12701
+ {
12702
+ ...coverageTerm(
12703
+ "tartan",
12704
+ "Tartan",
12705
+ "A check of crossing bands in several colours, set out in a fixed sequence called a sett and repeated in both directions, traditionally woven in twill and tied to Scottish clans and districts."
12706
+ ),
12707
+ altLabels: ["tartan plaid"],
12708
+ broaderSlug: PLAID_CHECK,
12709
+ external: [
12710
+ {
12711
+ identifier: "300256600",
12712
+ label: "tartan",
12713
+ match: "close",
12714
+ scheme: "aat"
12715
+ },
12716
+ wikidataMapping("Q216797", "tartan", "close")
12717
+ ],
12718
+ related: [relatedTo4("pattern.type.cultural-heritage")],
12719
+ searchedWithout: [searchedUniclass11("tartan; plaid")]
12720
+ },
12721
+ {
12722
+ ...coverageTerm(
12723
+ "houndstooth",
12724
+ "Houndstooth",
12725
+ "A two-colour broken check in which each square is notched into four-pointed, tooth-like shapes, most often in black and white."
12726
+ ),
12727
+ altLabels: ["dogstooth", "dogtooth", "hounds-tooth"],
12728
+ broaderSlug: PLAID_CHECK,
12729
+ external: [
12730
+ {
12731
+ identifier: "300266442",
12732
+ label: "houndstooth",
12733
+ match: "exact",
12734
+ scheme: "aat"
12735
+ },
12736
+ wikidataMapping("Q911389", "houndstooth", "exact")
12737
+ ],
12738
+ searchedWithout: [searchedUniclass11("houndstooth; dogtooth")]
12739
+ },
12740
+ {
12741
+ ...coverageTerm(
12742
+ "argyle",
12743
+ "Argyle",
12744
+ "A repeat of diamonds in two or more colours, set on the diagonal and crossed by fine diagonal lines, as in knitwear and socks."
12745
+ ),
12746
+ altLabels: ["argyll"],
12747
+ broaderSlug: "geometric",
12748
+ searchedWithout: [
12749
+ searchedAat2("argyle; argyll; diamond pattern"),
12750
+ searchedWikidata2("argyle; argyle pattern; argyle diamond pattern"),
12751
+ searchedUniclass11("argyle; argyll")
12752
+ ]
12753
+ },
12754
+ {
12755
+ ...coverageTerm(
12756
+ "polka-dot",
12757
+ "Polka dot",
12758
+ "A repeat of evenly spaced, equal-sized filled circles on a contrasting ground."
12759
+ ),
12760
+ altLabels: ["polka dots"],
12761
+ broaderSlug: "geometric",
12762
+ external: [
12763
+ {
12764
+ identifier: "300417972",
12765
+ label: "polka dots",
12766
+ match: "exact",
12767
+ scheme: "aat"
12768
+ },
12769
+ wikidataMapping("Q2429962", "polka dot", "exact")
12770
+ ],
12771
+ searchedWithout: [searchedUniclass11("polka dot")]
12772
+ },
12773
+ {
12774
+ ...coverageTerm(
12775
+ "trellis",
12776
+ "Trellis",
12777
+ "A repeat of crossing or interlaced lines forming an open lattice of diamonds or lozenges, in the manner of garden trellis."
12778
+ ),
12779
+ altLabels: ["lattice", "latticework"],
12780
+ broaderSlug: "geometric",
12781
+ searchedWithout: [
12782
+ searchedAat2("trellis; lattice; treillage"),
12783
+ searchedWikidata2("trellis; trellis pattern; lattice pattern"),
12784
+ searchedUniclass11("trellis; lattice")
12785
+ ]
12786
+ },
12787
+ {
12788
+ ...coverageTerm(
12789
+ "fish-scale",
12790
+ "Fish-scale",
12791
+ "A repeat of overlapping rounded arcs set in staggered rows, like the scales of a fish, whether printed, woven or formed by laid units."
12792
+ ),
12793
+ altLabels: ["fish scale", "fishscale", "mermaid scale"],
12794
+ broaderSlug: "geometric",
12795
+ external: [
12796
+ {
12797
+ identifier: "300010142",
12798
+ label: "scale pattern",
12799
+ match: "exact",
12800
+ scheme: "aat"
12801
+ }
12802
+ ],
12803
+ // Scallop on UNIT SHAPE is the outline of one unit; this is the repeat those units, or a print,
12804
+ // can make. A fish-scale tile is a scallop unit, and a printed fish-scale is no unit at all, so
12805
+ // the two are linked and not merged.
12806
+ related: [relatedTo4("unit-shape.scallop")],
12807
+ searchedWithout: [
12808
+ searchedWikidata2("fish scale; fish scale pattern; scale pattern"),
12809
+ searchedUniclass11("fish scale; scallop; imbricated")
12810
+ ]
12811
+ },
12812
+ {
12813
+ ...coverageTerm(
12814
+ "ombre",
12815
+ "Ombre",
12816
+ "A gradient that shades one colour, or two neighbouring colours, from light to deep across the surface."
12817
+ ),
12818
+ altLabels: ["ombr\xE9"],
12819
+ broaderSlug: "gradient",
12820
+ searchedWithout: [
12821
+ searchedAat2("ombre; ombr\xE9; shading; gradation"),
12822
+ searchedWikidata2("ombre; ombr\xE9; ombre dyeing"),
12823
+ searchedUniclass11("ombre; ombr\xE9")
12824
+ ]
12825
+ },
12826
+ {
12827
+ ...coverageTerm(
12828
+ "kilim",
12829
+ "Kilim",
12830
+ "A flat-woven repeat of stepped medallions, diamonds and bands in the manner of the tapestry-woven rugs of Anatolia, Persia and the Balkans."
12831
+ ),
12832
+ broaderSlug: CULTURAL_HERITAGE,
12833
+ external: [
12834
+ {
12835
+ identifier: "300186972",
12836
+ label: "kilims",
12837
+ match: "related",
12838
+ scheme: "aat"
12839
+ },
12840
+ wikidataMapping("Q585358", "kilim", "related")
12841
+ ],
12842
+ related: [relatedTo4("construction.woven")],
12843
+ searchedWithout: [searchedUniclass11("kilim")]
12844
+ },
12845
+ {
12846
+ ...coverageTerm(
12847
+ "ikat",
12848
+ "Ikat",
12849
+ "A repeat of soft, feathered-edge motifs left by tie-dyeing warp or weft threads before they are woven, and imitated in prints."
12850
+ ),
12851
+ broaderSlug: CULTURAL_HERITAGE,
12852
+ external: [
12853
+ {
12854
+ identifier: "300249861",
12855
+ label: "ikat",
12856
+ match: "related",
12857
+ scheme: "aat"
12858
+ },
12859
+ wikidataMapping("Q140101", "Ikat", "related")
12860
+ ],
12861
+ note: "Ikat names a dyeing technique as well as the pattern it leaves. A term sits on one axis, so this is the pattern; both external concepts are the technique and are mapped as related. The technique is not yet a Construction term.",
12862
+ related: [relatedTo4("construction.woven")],
12863
+ searchedWithout: [searchedUniclass11("ikat")]
12864
+ },
12865
+ {
12866
+ ...coverageTerm(
12867
+ "chinoiserie",
12868
+ "Chinoiserie",
12869
+ "A pictorial repeat of pagodas, figures, birds and flowering branches, in a European imitation of Chinese and East Asian decorative art."
12870
+ ),
12871
+ broaderSlug: CULTURAL_HERITAGE,
12872
+ external: [
12873
+ {
12874
+ identifier: "300021167",
12875
+ label: "Chinoiserie",
12876
+ match: "close",
12877
+ scheme: "aat"
12878
+ },
12879
+ wikidataMapping("Q863679", "chinoiserie", "close")
12880
+ ],
12881
+ related: [relatedTo4("pattern.type.scenic")],
12882
+ searchedWithout: [searchedUniclass11("chinoiserie")]
12883
+ },
12884
+ {
12885
+ ...coverageTerm(
12886
+ "craquelure",
12887
+ "Craquelure",
12888
+ "A network of fine, irregular cracks across the surface, as in aged paint and varnish, and made on purpose in crackle glaze, crackle paint and printed imitations."
12889
+ ),
12890
+ altLabels: ["crackle", "crackled", "crackle effect"],
12891
+ external: [
12892
+ {
12893
+ identifier: "300228345",
12894
+ label: "crackle",
12895
+ match: "exact",
12896
+ scheme: "aat"
12897
+ },
12898
+ wikidataMapping("Q1329067", "craquelure", "exact")
12899
+ ],
12900
+ related: [
12901
+ relatedTo4("finish.treatment.antiqued"),
12902
+ relatedTo4("finish.treatment.glazed")
12903
+ ],
12904
+ searchedWithout: [searchedUniclass11("craquelure; crackle")]
11922
12905
  }
11923
12906
  ];
12907
+ var PATTERN_MOTIF_TERMS = MOTIF_DRAFTS.map(grounded);
11924
12908
 
11925
12909
  // src/axes/pattern.ts
11926
12910
  var SOURCE4 = "pattern vocabulary in a furnishings retailer (src-03)";
11927
- var SNAPSHOT6 = "2026-08-25";
12911
+ var SNAPSHOT5 = "2026-08-25";
11928
12912
  var GEOMETRY_REVIEW_DATE = "2026-08-31";
11929
12913
  var GEOMETRY_SOURCE = "Linear TAX-45 reviewed implementation contract";
11930
12914
  var REVIEW_DATE7 = "2026-09-11";
@@ -11935,7 +12919,7 @@ var TAX58_SOURCE = "Linear TAX-58 visual-vocabulary review; MG-2218 reconciliati
11935
12919
  var term7 = (slug, label, definition, extra = {}) => ({
11936
12920
  definition,
11937
12921
  label,
11938
- provenance: { basis: "evidenced", snapshot: SNAPSHOT6, source: SOURCE4 },
12922
+ provenance: { basis: "evidenced", snapshot: SNAPSHOT5, source: SOURCE4 },
11939
12923
  slug,
11940
12924
  ...extra
11941
12925
  });
@@ -12356,7 +13340,8 @@ var PATTERN_TYPE_TERMS = [
12356
13340
  "A surface intended to read as woven threads rather than its construction."
12357
13341
  ),
12358
13342
  searchedWithout: [searchedUniclass3("Woven effect")]
12359
- }
13343
+ },
13344
+ ...PATTERN_MOTIF_TERMS
12360
13345
  ];
12361
13346
  var PATTERN_TERMS = [
12362
13347
  ...PATTERN_TYPE_TERMS,
@@ -12373,7 +13358,7 @@ var AUTHORED4 = {
12373
13358
  source: "@instruments/taxonomy ADR 0001"
12374
13359
  };
12375
13360
  var aat6 = (identifier, label, match) => ({ identifier, label, match, scheme: "aat" });
12376
- var relatedTo9 = (target) => ({
13361
+ var relatedTo11 = (target) => ({
12377
13362
  predicate: "related-to",
12378
13363
  target
12379
13364
  });
@@ -12443,7 +13428,7 @@ var PERIOD_TERMS = [
12443
13428
  label: "Baroque",
12444
13429
  note: "Stuart (1603-1714) is the British dynastic label for nearly the same span, and by this axis's own rule would be the better id; `baroque` is kept because it is what the English-language trade says of a building of this date anywhere in Europe. Jacobean (1603-1625) is a sub-span, not a synonym. Also a style name - see the header.",
12445
13430
  provenance: AUTHORED4,
12446
- related: [relatedTo9("period.renaissance")],
13431
+ related: [relatedTo11("period.renaissance")],
12447
13432
  slug: "baroque",
12448
13433
  span: {
12449
13434
  circa: true,
@@ -12548,7 +13533,7 @@ var PERIOD_TERMS = [
12548
13533
  label: "Edwardian",
12549
13534
  note: "The reign ends in 1910 but the building manner runs to the outbreak of war, and the trade dates it that way. NO US EQUIVALENT EXISTS and none is invented here - the American labels reached for at this date (Craftsman, Arts and Crafts, Prairie) are all styles, and putting one of them here would be the exact error this axis was built to stop.",
12550
13535
  provenance: AUTHORED4,
12551
- related: [relatedTo9("period.victorian")],
13536
+ related: [relatedTo11("period.victorian")],
12552
13537
  slug: "edwardian",
12553
13538
  span: {
12554
13539
  circa: false,
@@ -12636,7 +13621,7 @@ var PERIOD_TERMS = [
12636
13621
  label: "Late Twentieth Century",
12637
13622
  note: "THE WEAKEST TERM ON THIS AXIS, and flagged rather than dressed up. The trade has no settled label for these thirty years - it dates by decade, or reaches for a style name instead - so this is a bucket the axis needs for completeness rather than a period anyone asks for by name. Expect it to be split or renamed once there is usage evidence to split it on.",
12638
13623
  provenance: AUTHORED4,
12639
- related: [relatedTo9("period.mid-century")],
13624
+ related: [relatedTo11("period.mid-century")],
12640
13625
  slug: "late-century",
12641
13626
  span: {
12642
13627
  circa: true,
@@ -12662,7 +13647,7 @@ var PERIOD_TERMS = [
12662
13647
  label: "Contemporary",
12663
13648
  note: "DELIBERATELY OPEN-ENDED, and it will need a successor bracket eventually. Collides by name with `style.contemporary`, which means the prevailing current idiom rather than a date; the axis prefix disambiguates. A 2024 building in full Georgian pastiche is `period.contemporary` and is emphatically not `style.contemporary`, which is the case that shows why the two cannot be merged.",
12664
13649
  provenance: AUTHORED4,
12665
- seenAs: ["Contemporary", "modern", "new build"],
13650
+ seenAs: ["Contemporary", "modern"],
12666
13651
  slug: "contemporary",
12667
13652
  span: {
12668
13653
  circa: true,
@@ -12676,11 +13661,11 @@ var PERIOD_TERMS = [
12676
13661
  ];
12677
13662
 
12678
13663
  // src/axes/place.ts
12679
- var SNAPSHOT7 = "2026-08-21";
13664
+ var SNAPSHOT6 = "2026-08-21";
12680
13665
  var ADR2 = "@instruments/taxonomy ADR 0001";
12681
13666
  var PLATFORM_CONTEXTS = "CONTEXTS in an architecture-projects platform (src-01)";
12682
13667
  var aat7 = (identifier, label, match) => ({ identifier, label, match, scheme: "aat" });
12683
- var relatedTo10 = (target) => ({
13668
+ var relatedTo12 = (target) => ({
12684
13669
  predicate: "related-to",
12685
13670
  target
12686
13671
  });
@@ -12691,7 +13676,7 @@ var PLACE_REGION_TERMS = [
12691
13676
  label: "Mediterranean",
12692
13677
  provenance: {
12693
13678
  basis: "evidenced",
12694
- snapshot: SNAPSHOT7,
13679
+ snapshot: SNAPSHOT6,
12695
13680
  source: "a rendering pipeline (src-08) and an architecture-projects platform (src-01)"
12696
13681
  },
12697
13682
  slug: "mediterranean"
@@ -12743,7 +13728,7 @@ var PLACE_REGION_TERMS = [
12743
13728
  label: "Nordic",
12744
13729
  provenance: {
12745
13730
  basis: "evidenced",
12746
- snapshot: SNAPSHOT7,
13731
+ snapshot: SNAPSHOT6,
12747
13732
  source: "an editorial image library (src-02), an architecture-projects platform (src-01) and a materials-retrieval system (src-05)"
12748
13733
  },
12749
13734
  seenAs: ["Nordic modern", "nordic_warm", "Scandinavian"],
@@ -12763,7 +13748,7 @@ var PLACE_REGION_TERMS = [
12763
13748
  label: "Japanese",
12764
13749
  provenance: {
12765
13750
  basis: "evidenced",
12766
- snapshot: SNAPSHOT7,
13751
+ snapshot: SNAPSHOT6,
12767
13752
  source: "an architecture-projects platform (src-01) and a rendering pipeline (src-08)"
12768
13753
  },
12769
13754
  seenAs: ["Japanese contemporary"],
@@ -12775,7 +13760,7 @@ var PLACE_REGION_TERMS = [
12775
13760
  label: "English Country",
12776
13761
  provenance: {
12777
13762
  basis: "evidenced",
12778
- snapshot: SNAPSHOT7,
13763
+ snapshot: SNAPSHOT6,
12779
13764
  source: "an editorial image library (src-02) and a furnishings retailer (src-03)"
12780
13765
  },
12781
13766
  seenAs: ["English Country", "Country"],
@@ -12896,7 +13881,7 @@ var PLACE_LANDSCAPE_TERMS = [
12896
13881
  label: "Coastal",
12897
13882
  provenance: {
12898
13883
  basis: "evidenced",
12899
- snapshot: SNAPSHOT7,
13884
+ snapshot: SNAPSHOT6,
12900
13885
  source: "CONTEXTS in an architecture-projects platform (src-01), a furnishings retailer (src-03), an editorial image library (src-02), a rendering pipeline (src-08) and a materials-retrieval system (src-05)"
12901
13886
  },
12902
13887
  slug: "coastal",
@@ -12912,10 +13897,10 @@ var PLACE_LANDSCAPE_TERMS = [
12912
13897
  label: "Waterfront",
12913
13898
  provenance: {
12914
13899
  basis: "vendored",
12915
- snapshot: SNAPSHOT7,
13900
+ snapshot: SNAPSHOT6,
12916
13901
  source: PLATFORM_CONTEXTS
12917
13902
  },
12918
- related: [relatedTo10("place.landscape.coastal")],
13903
+ related: [relatedTo12("place.landscape.coastal")],
12919
13904
  slug: "waterfront"
12920
13905
  },
12921
13906
  {
@@ -12924,7 +13909,7 @@ var PLACE_LANDSCAPE_TERMS = [
12924
13909
  label: "Tropical",
12925
13910
  provenance: {
12926
13911
  basis: "evidenced",
12927
- snapshot: SNAPSHOT7,
13912
+ snapshot: SNAPSHOT6,
12928
13913
  source: "an architecture-projects platform (src-01)"
12929
13914
  },
12930
13915
  seenAs: ["Tropical modernism"],
@@ -12944,7 +13929,7 @@ var PLACE_LANDSCAPE_TERMS = [
12944
13929
  label: "Desert",
12945
13930
  provenance: {
12946
13931
  basis: "vendored",
12947
- snapshot: SNAPSHOT7,
13932
+ snapshot: SNAPSHOT6,
12948
13933
  source: PLATFORM_CONTEXTS
12949
13934
  },
12950
13935
  slug: "desert"
@@ -12965,7 +13950,7 @@ var PLACE_LANDSCAPE_TERMS = [
12965
13950
  label: "Mountain",
12966
13951
  provenance: {
12967
13952
  basis: "vendored",
12968
- snapshot: SNAPSHOT7,
13953
+ snapshot: SNAPSHOT6,
12969
13954
  source: PLATFORM_CONTEXTS
12970
13955
  },
12971
13956
  slug: "mountain"
@@ -12984,7 +13969,7 @@ var PLACE_LANDSCAPE_TERMS = [
12984
13969
  label: "Forest",
12985
13970
  provenance: {
12986
13971
  basis: "vendored",
12987
- snapshot: SNAPSHOT7,
13972
+ snapshot: SNAPSHOT6,
12988
13973
  source: PLATFORM_CONTEXTS
12989
13974
  },
12990
13975
  slug: "forest"
@@ -13004,7 +13989,7 @@ var PLACE_LANDSCAPE_TERMS = [
13004
13989
  label: "Rural",
13005
13990
  provenance: {
13006
13991
  basis: "vendored",
13007
- snapshot: SNAPSHOT7,
13992
+ snapshot: SNAPSHOT6,
13008
13993
  source: PLATFORM_CONTEXTS
13009
13994
  },
13010
13995
  slug: "rural"
@@ -13023,10 +14008,10 @@ var PLACE_LANDSCAPE_TERMS = [
13023
14008
  label: "Suburban",
13024
14009
  provenance: {
13025
14010
  basis: "vendored",
13026
- snapshot: SNAPSHOT7,
14011
+ snapshot: SNAPSHOT6,
13027
14012
  source: PLATFORM_CONTEXTS
13028
14013
  },
13029
- related: [relatedTo10("place.landscape.urban")],
14014
+ related: [relatedTo12("place.landscape.urban")],
13030
14015
  slug: "suburban"
13031
14016
  },
13032
14017
  {
@@ -13044,7 +14029,7 @@ var PLACE_LANDSCAPE_TERMS = [
13044
14029
  label: "Urban",
13045
14030
  provenance: {
13046
14031
  basis: "vendored",
13047
- snapshot: SNAPSHOT7,
14032
+ snapshot: SNAPSHOT6,
13048
14033
  source: PLATFORM_CONTEXTS
13049
14034
  },
13050
14035
  seenAs: ["Dense urban", "Urban infill", "downtown"],
@@ -13052,31 +14037,367 @@ var PLACE_LANDSCAPE_TERMS = [
13052
14037
  }
13053
14038
  ];
13054
14039
 
13055
- // src/axes/product-category.ts
14040
+ // src/axes/product-category-shared.ts
13056
14041
  var uniclass5 = (slug, label, match) => ({
13057
14042
  identifier: slug,
13058
14043
  label,
13059
14044
  match,
13060
14045
  scheme: "uniclass"
13061
14046
  });
14047
+ var aat8 = (identifier, label, match) => ({ identifier, label, match, scheme: "aat" });
13062
14048
  var typicallyIn4 = (spaceId) => ({
13063
14049
  predicate: "typically-in",
13064
14050
  target: `space.${spaceId}`
13065
14051
  });
13066
- var relatedTo11 = (...targets) => targets.map((target) => ({ predicate: "related-to", target }));
14052
+ var relatedTo13 = (...targets) => targets.map((target) => ({ predicate: "related-to", target }));
14053
+
14054
+ // src/axes/product-category-furniture.ts
14055
+ var LIVING_ROOM = "living-room";
14056
+ var DINING_ROOM = "dining-room";
14057
+ var CASE_FURNITURE = "case furniture";
14058
+ var AAT_CASE_FURNITURE = aat8("300038860", CASE_FURNITURE, "exact");
14059
+ var FURNITURE_DRAFTS = [
14060
+ coverageTerm(
14061
+ "furniture",
14062
+ "Furniture",
14063
+ "A made-up piece for sitting, reclining, working at or storing things, bought as a product rather than as a material, covering or luminaire, whether it ends up loose or built in.",
14064
+ {
14065
+ external: [
14066
+ aat8("300037680", "furniture", "exact"),
14067
+ wikidataMapping("Q14745", "furniture", "exact"),
14068
+ uniclass5("Pr_40_50", "Furnishings", "related")
14069
+ ],
14070
+ related: relatedTo13("application.furniture")
14071
+ }
14072
+ ),
14073
+ // SEATING
14074
+ coverageTerm(
14075
+ "armchair",
14076
+ "Armchair",
14077
+ "A seat for one person with a back and arms, usually upholstered; not a sofa, which seats two or more, and not a dining chair.",
14078
+ {
14079
+ altLabels: ["easy chair"],
14080
+ broaderSlug: "seating",
14081
+ external: [
14082
+ aat8("300037776", "armchairs", "exact"),
14083
+ wikidataMapping("Q11285759", "armchair", "exact"),
14084
+ uniclass5("Pr_40_50_12_26", "Easy chairs", "close"),
14085
+ uniclass5("Pr_40_50_12_48", "Lounge chairs", "close")
14086
+ ],
14087
+ related: [typicallyIn4(LIVING_ROOM), typicallyIn4("lounge")]
14088
+ }
14089
+ ),
14090
+ coverageTerm(
14091
+ "dining-chair",
14092
+ "Dining chair",
14093
+ "A chair made to be sat in at a dining table, with or without arms, independent of its material and upholstery.",
14094
+ {
14095
+ broaderSlug: "seating",
14096
+ external: [
14097
+ aat8("300038379", "dining chairs", "exact"),
14098
+ wikidataMapping("Q124964396", "dining chair", "exact"),
14099
+ uniclass5("Pr_40_50_12_22", "Dining chairs", "exact")
14100
+ ],
14101
+ related: [typicallyIn4(DINING_ROOM), typicallyIn4("restaurant")]
14102
+ }
14103
+ ),
14104
+ coverageTerm(
14105
+ "bar-stool",
14106
+ "Bar stool",
14107
+ "A tall stool for sitting at a bar, counter or breakfast island, with or without a low back or footrest.",
14108
+ {
14109
+ altLabels: ["barstool", "counter stool"],
14110
+ broaderSlug: "seating",
14111
+ external: [
14112
+ aat8("300038422", "barstools", "exact"),
14113
+ wikidataMapping("Q376339", "bar stool", "exact"),
14114
+ uniclass5("Pr_40_50_12_85", "Stools", "broad")
14115
+ ],
14116
+ related: [typicallyIn4("bar"), typicallyIn4("kitchen")]
14117
+ }
14118
+ ),
14119
+ coverageTerm(
14120
+ "ottoman",
14121
+ "Ottoman",
14122
+ "A low upholstered seat or footrest without back or arms, sometimes hollow for storage; not a long ottoman sofa and not an ottoman bed.",
14123
+ {
14124
+ altLabels: ["pouf", "pouffe"],
14125
+ broaderSlug: "seating",
14126
+ external: [
14127
+ aat8("300038442", "ottoman footstools", "close"),
14128
+ aat8("300038607", "pouffes", "close"),
14129
+ wikidataMapping("Q3545350", "ottoman", "exact"),
14130
+ uniclass5("Pr_40_50_12_59", "Ottomans", "exact")
14131
+ ],
14132
+ related: [typicallyIn4(LIVING_ROOM), typicallyIn4("bedroom")],
14133
+ // Footstool is the narrower thing: AAT and Uniclass file the ottoman footstool beneath
14134
+ // footstools, and a footstool need not be an ottoman, so it is a wild form and not a name.
14135
+ seenAs: ["footstool"]
14136
+ }
14137
+ ),
14138
+ coverageTerm(
14139
+ "bench",
14140
+ "Bench",
14141
+ "A long seat for two or more people, with or without a back, independent of its material and of whether it is upholstered.",
14142
+ {
14143
+ broaderSlug: "seating",
14144
+ external: [
14145
+ aat8("300038494", "benches (furniture)", "exact"),
14146
+ wikidataMapping("Q204776", "bench", "exact"),
14147
+ uniclass5("Pr_40_50_12_07", "Benches", "exact")
14148
+ ],
14149
+ related: [typicallyIn4("entry"), typicallyIn4("boot-room")]
14150
+ }
14151
+ ),
14152
+ coverageTerm(
14153
+ "chaise-longue",
14154
+ "Chaise longue",
14155
+ "An upholstered seat long enough to support the legs, with a back or headrest at one end, for reclining indoors.",
14156
+ {
14157
+ broaderSlug: "seating",
14158
+ external: [
14159
+ aat8("300038151", "chaises longues", "exact"),
14160
+ wikidataMapping("Q1059232", "chaise longue", "exact"),
14161
+ uniclass5("Pr_40_50_12_14", "Chaises longues", "exact")
14162
+ ],
14163
+ related: [typicallyIn4(LIVING_ROOM), typicallyIn4("bedroom")],
14164
+ seenAs: ["chaise lounge"]
14165
+ }
14166
+ ),
14167
+ // BED
14168
+ coverageTerm(
14169
+ "daybed",
14170
+ "Daybed",
14171
+ "An extended seat, generally armless and with one backed end, used for lounging by day and lying on at need; a bed as well as a seat, and not a sofa bed.",
14172
+ {
14173
+ broaderSlug: "bed",
14174
+ external: [
14175
+ aat8("300038586", "daybeds", "exact"),
14176
+ wikidataMapping("Q5243076", "daybed", "exact"),
14177
+ uniclass5("Pr_40_50_06_21", "Daybeds", "exact")
14178
+ ],
14179
+ related: [
14180
+ ...relatedTo13("product-category.seating"),
14181
+ typicallyIn4(LIVING_ROOM),
14182
+ typicallyIn4("guest-bedroom")
14183
+ ]
14184
+ }
14185
+ ),
14186
+ coverageTerm(
14187
+ "headboard",
14188
+ "Headboard",
14189
+ "A board or panel fixed or standing at the head of a bed, upholstered or bare; the bed it belongs to is a separate product.",
14190
+ {
14191
+ altLabels: ["bedhead", "bed head"],
14192
+ broaderSlug: "bed",
14193
+ external: [
14194
+ aat8("300040447", "headboards", "exact"),
14195
+ wikidataMapping("Q5689512", "headboard", "exact"),
14196
+ uniclass5("Pr_40_50_06_37", "Headboards", "exact")
14197
+ ],
14198
+ related: [
14199
+ typicallyIn4("bedroom"),
14200
+ ...relatedTo13("application.furniture-headboard")
14201
+ ]
14202
+ }
14203
+ ),
14204
+ // TABLE
14205
+ coverageTerm(
14206
+ "dining-table",
14207
+ "Dining table",
14208
+ "A table made to eat meals at, whatever its top, base or size, and including extending tables.",
14209
+ {
14210
+ broaderSlug: "table",
14211
+ external: [
14212
+ aat8("300039648", "dining tables", "exact"),
14213
+ wikidataMapping("Q4396855", "dining table", "exact"),
14214
+ uniclass5("Pr_40_50_21_22", "Dining tables", "exact")
14215
+ ],
14216
+ related: [typicallyIn4(DINING_ROOM), typicallyIn4("restaurant")]
14217
+ }
14218
+ ),
14219
+ coverageTerm(
14220
+ "coffee-table",
14221
+ "Coffee table",
14222
+ "A low table set in front of a sofa or among armchairs, at a height to reach from a seat.",
14223
+ {
14224
+ broaderSlug: "table",
14225
+ external: [
14226
+ aat8("300039640", "coffee tables", "exact"),
14227
+ wikidataMapping("Q2407432", "coffee table", "exact"),
14228
+ uniclass5("Pr_40_50_21_14", "Coffee tables", "exact")
14229
+ ],
14230
+ related: [typicallyIn4(LIVING_ROOM), typicallyIn4("lounge")]
14231
+ }
14232
+ ),
14233
+ coverageTerm(
14234
+ "side-table",
14235
+ "Side table",
14236
+ "A small table standing beside a sofa, armchair or bed to hold a lamp, a drink or a book; not a console table, which stands against a wall, and not a bedside cabinet.",
14237
+ {
14238
+ altLabels: ["end table", "lamp table"],
14239
+ broaderSlug: "table",
14240
+ external: [
14241
+ aat8("300039998", "end tables", "close"),
14242
+ wikidataMapping("Q65791322", "end table", "close"),
14243
+ uniclass5("Pr_40_50_21_58", "Occasional tables", "broad")
14244
+ ],
14245
+ related: [typicallyIn4(LIVING_ROOM), typicallyIn4("lounge")]
14246
+ }
14247
+ ),
14248
+ coverageTerm(
14249
+ "console-table",
14250
+ "Console table",
14251
+ "A narrow table made to stand against a wall, in a hall or behind a sofa, with its back left plain or unfinished.",
14252
+ {
14253
+ altLabels: ["hall table", "sofa table"],
14254
+ broaderSlug: "table",
14255
+ external: [
14256
+ aat8("300039580", "console tables", "exact"),
14257
+ wikidataMapping("Q7887380", "console", "close"),
14258
+ uniclass5("Pr_40_50_21_16", "Console tables", "exact")
14259
+ ],
14260
+ related: [typicallyIn4("entry"), typicallyIn4("hallway")]
14261
+ }
14262
+ ),
14263
+ coverageTerm(
14264
+ "desk",
14265
+ "Desk",
14266
+ "A table made for reading, writing or working at, with or without drawers, a hutch or a return; not a fitted counter.",
14267
+ {
14268
+ altLabels: ["writing desk"],
14269
+ broaderSlug: "table",
14270
+ external: [
14271
+ aat8("300039338", "desks", "exact"),
14272
+ wikidataMapping("Q1064858", "desk", "exact"),
14273
+ uniclass5("Pr_40_50_21_21", "Desks", "exact")
14274
+ ],
14275
+ related: [
14276
+ typicallyIn4("study"),
14277
+ typicallyIn4("private-office"),
14278
+ typicallyIn4("open-office")
14279
+ ]
14280
+ }
14281
+ ),
14282
+ // STORAGE
14283
+ coverageTerm(
14284
+ "casegoods",
14285
+ "Casegoods",
14286
+ "Freestanding, non-upholstered storage furniture built as a boxlike carcass with doors, drawers or shelves, such as a sideboard, chest of drawers, wardrobe or bookcase; not fitted joinery.",
14287
+ {
14288
+ altLabels: ["case goods", CASE_FURNITURE],
14289
+ broaderSlug: "storage",
14290
+ external: [
14291
+ AAT_CASE_FURNITURE,
14292
+ wikidataMapping("Q95966197", "case furniture", "exact"),
14293
+ uniclass5("Pr_40_30_87", "Storage units and cupboards", "broad")
14294
+ ]
14295
+ }
14296
+ ),
14297
+ coverageTerm(
14298
+ "sideboard",
14299
+ "Sideboard",
14300
+ "A long, low carcass of cupboards and drawers topped by a surface, standing against a wall to hold tableware and serve from; not a kitchen base unit.",
14301
+ {
14302
+ altLabels: ["buffet", "credenza"],
14303
+ broaderSlug: "casegoods",
14304
+ external: [
14305
+ aat8("300039306", "sideboards (furniture)", "exact"),
14306
+ wikidataMapping("Q1762308", "sideboard", "exact"),
14307
+ uniclass5("Pr_40_30_87_81", "Sideboards", "exact")
14308
+ ],
14309
+ related: [typicallyIn4(DINING_ROOM)]
14310
+ }
14311
+ ),
14312
+ coverageTerm(
14313
+ "chest-of-drawers",
14314
+ "Chest of drawers",
14315
+ "A freestanding carcass fitted with stacked drawers for clothes and linen; not a storage chest with a lid, and not fitted drawer joinery.",
14316
+ {
14317
+ broaderSlug: "casegoods",
14318
+ external: [
14319
+ aat8("300039009", "chests of drawers", "exact"),
14320
+ wikidataMapping("Q14169227", "chest of drawers", "exact"),
14321
+ uniclass5("Pr_40_30_87_25", "Drawer units", "close")
14322
+ ],
14323
+ related: [typicallyIn4("bedroom")],
14324
+ seenAs: ["Dresser", "Drawers"]
14325
+ }
14326
+ ),
14327
+ coverageTerm(
14328
+ "wardrobe",
14329
+ "Wardrobe",
14330
+ "A freestanding upright cabinet for hanging and storing clothes, with doors and often drawers; not the fitted wardrobe built into a room, which is joinery.",
14331
+ {
14332
+ altLabels: ["armoire", "freestanding wardrobe"],
14333
+ broaderSlug: "casegoods",
14334
+ external: [
14335
+ aat8("300039237", "wardrobes (case furniture)", "exact"),
14336
+ wikidataMapping("Q106106", "wardrobe", "exact"),
14337
+ uniclass5("Pr_40_30_87_96", "Wardrobes", "exact")
14338
+ ],
14339
+ related: [
14340
+ typicallyIn4("bedroom"),
14341
+ typicallyIn4("dressing-room"),
14342
+ ...relatedTo13("element.wardrobe")
14343
+ ]
14344
+ }
14345
+ ),
14346
+ coverageTerm(
14347
+ "bookcase",
14348
+ "Bookcase",
14349
+ "A freestanding case of shelves for books and display, open or fronted with doors or glass; not fitted shelving built into a wall.",
14350
+ {
14351
+ altLabels: ["bookshelf"],
14352
+ broaderSlug: "casegoods",
14353
+ external: [
14354
+ aat8("300143716", "bookcases", "close"),
14355
+ wikidataMapping("Q215857", "bookcase", "exact"),
14356
+ uniclass5("Pr_40_30_78_58", "Open bookcases", "narrow"),
14357
+ uniclass5("Pr_40_30_87_33", "Glazed bookcases", "narrow")
14358
+ ],
14359
+ related: [
14360
+ typicallyIn4("study"),
14361
+ typicallyIn4("library"),
14362
+ typicallyIn4(LIVING_ROOM)
14363
+ ]
14364
+ }
14365
+ ),
14366
+ coverageTerm(
14367
+ "shelving",
14368
+ "Shelving",
14369
+ "A freestanding unit or system of open shelves for storing and displaying things, on a frame, a ladder or uprights; not a bookcase with a carcass and not fitted shelving.",
14370
+ {
14371
+ altLabels: ["shelving unit", "shelf unit"],
14372
+ broaderSlug: "storage",
14373
+ external: [
14374
+ aat8("300375206", "shelving units", "close"),
14375
+ wikidataMapping("Q2637814", "rack with shelves", "close"),
14376
+ uniclass5("Pr_40_30_78_78", "Shelves", "close")
14377
+ ],
14378
+ related: [
14379
+ typicallyIn4("library"),
14380
+ typicallyIn4("storage"),
14381
+ ...relatedTo13("element.shelving")
14382
+ ]
14383
+ }
14384
+ )
14385
+ ];
14386
+ var FURNITURE_TERMS = FURNITURE_DRAFTS.map(grounded);
14387
+
14388
+ // src/axes/product-category.ts
13067
14389
  var LUMINAIRES = uniclass5(
13068
14390
  "Pr_70_70_48",
13069
14391
  "Luminaires, lighting track and lighting accessories",
13070
14392
  "broad"
13071
14393
  );
13072
- var aat8 = (identifier, label, match) => ({ identifier, label, match, scheme: "aat" });
13073
- var searchedAat2 = (query) => ({
14394
+ var searchedAat3 = (query) => ({
13074
14395
  date: SEARCHED_ON,
13075
14396
  query,
13076
14397
  scheme: "aat",
13077
14398
  via: "https://vocab.getty.edu:443/sparql; luc:term searches (separated by semicolons), AAT preferred labels and English scope notes, LIMIT 150"
13078
14399
  });
13079
- var searchedUniclass11 = (query) => ({
14400
+ var searchedUniclass12 = (query) => ({
13080
14401
  date: SEARCHED_ON,
13081
14402
  query,
13082
14403
  scheme: "uniclass",
@@ -13143,7 +14464,7 @@ var PRODUCT_CATEGORY_TERMS = [
13143
14464
  )
13144
14465
  ],
13145
14466
  introducedAt: "2026-08-30",
13146
- related: relatedTo11("application.flooring"),
14467
+ related: relatedTo13("application.flooring"),
13147
14468
  reviewedAt: "2026-08-31"
13148
14469
  }
13149
14470
  ),
@@ -13158,7 +14479,7 @@ var PRODUCT_CATEGORY_TERMS = [
13158
14479
  ],
13159
14480
  related: [
13160
14481
  typicallyIn4("kitchen"),
13161
- ...relatedTo11("element.worktop", "application.countertop")
14482
+ ...relatedTo13("element.worktop", "application.countertop")
13162
14483
  ]
13163
14484
  }
13164
14485
  ),
@@ -13171,7 +14492,7 @@ var PRODUCT_CATEGORY_TERMS = [
13171
14492
  aat8("300014866", "flooring", "broad"),
13172
14493
  uniclass5("Pr_35_57_71", "Resilient floor coverings", "narrow")
13173
14494
  ],
13174
- related: relatedTo11("application.flooring", "element.floor-finish")
14495
+ related: relatedTo13("application.flooring", "element.floor-finish")
13175
14496
  }
13176
14497
  ),
13177
14498
  term8(
@@ -13217,7 +14538,7 @@ var PRODUCT_CATEGORY_TERMS = [
13217
14538
  "A light fitting supplied as a unit - housing, light engine and gear - rather than the light it casts.",
13218
14539
  {
13219
14540
  external: [aat8("300180081", "lighting fixtures", "narrow"), LUMINAIRES],
13220
- related: relatedTo11("element.luminaire", "application.lighting")
14541
+ related: relatedTo13("element.luminaire", "application.lighting")
13221
14542
  }
13222
14543
  ),
13223
14544
  fromCorpus(
@@ -13250,6 +14571,7 @@ var PRODUCT_CATEGORY_TERMS = [
13250
14571
  "Seating",
13251
14572
  "A loose furniture product whose purpose is to be sat on.",
13252
14573
  {
14574
+ broaderSlug: "furniture",
13253
14575
  external: [
13254
14576
  aat8("300037769", "seating furniture", "broad"),
13255
14577
  uniclass5("Pr_40_50_12", "Chairs, seats and benches", "broad")
@@ -13261,6 +14583,7 @@ var PRODUCT_CATEGORY_TERMS = [
13261
14583
  "Table",
13262
14584
  "A loose furniture product supplying a raised horizontal surface on its own support.",
13263
14585
  {
14586
+ broaderSlug: "furniture",
13264
14587
  external: [
13265
14588
  aat8("300039548", "tables (support furniture)", "exact"),
13266
14589
  uniclass5("Pr_40_50_21", "Desks and tables", "broad")
@@ -13280,7 +14603,7 @@ var PRODUCT_CATEGORY_TERMS = [
13280
14603
  typicallyIn4("bathroom"),
13281
14604
  typicallyIn4("wc"),
13282
14605
  typicallyIn4("restroom"),
13283
- ...relatedTo11("element.sanitaryware")
14606
+ ...relatedTo13("element.sanitaryware")
13284
14607
  ]
13285
14608
  }
13286
14609
  ),
@@ -13303,7 +14626,7 @@ var PRODUCT_CATEGORY_TERMS = [
13303
14626
  typicallyIn4("kitchen"),
13304
14627
  typicallyIn4("wc"),
13305
14628
  typicallyIn4("restroom"),
13306
- ...relatedTo11("element.tapware")
14629
+ ...relatedTo13("element.tapware")
13307
14630
  ],
13308
14631
  seenAs: ["Faucet", "Fittings"]
13309
14632
  }
@@ -13317,7 +14640,7 @@ var PRODUCT_CATEGORY_TERMS = [
13317
14640
  aat8("300033260", "hardware (components)", "broad"),
13318
14641
  uniclass5("Pr_30_36", "Hardware products", "close")
13319
14642
  ],
13320
- related: relatedTo11("element.ironmongery")
14643
+ related: relatedTo13("element.ironmongery")
13321
14644
  }
13322
14645
  ),
13323
14646
  fromCorpus(
@@ -13327,8 +14650,8 @@ var PRODUCT_CATEGORY_TERMS = [
13327
14650
  {
13328
14651
  altLabels: ["wiring devices"],
13329
14652
  external: [uniclass5("Pr_65_72_97", "Wiring accessories", "broad")],
13330
- related: relatedTo11("element.socket-outlet"),
13331
- searchedWithout: [searchedAat2('wiring; "electrical accessories"')],
14653
+ related: relatedTo13("element.socket-outlet"),
14654
+ searchedWithout: [searchedAat3('wiring; "electrical accessories"')],
13332
14655
  seenAs: ["Electrical"]
13333
14656
  }
13334
14657
  ),
@@ -13337,12 +14660,13 @@ var PRODUCT_CATEGORY_TERMS = [
13337
14660
  "Storage",
13338
14661
  "A furniture product whose purpose is to contain or support stored things, fitted or freestanding.",
13339
14662
  {
13340
- altLabels: ["casegoods", "cabinetry"],
14663
+ altLabels: ["cabinetry"],
14664
+ broaderSlug: "furniture",
13341
14665
  external: [
13342
14666
  aat8("300038860", "case furniture", "narrow"),
13343
14667
  uniclass5("Pr_40_30_87", "Storage units and cupboards", "close")
13344
14668
  ],
13345
- related: relatedTo11(
14669
+ related: relatedTo13(
13346
14670
  "element.cabinetry",
13347
14671
  "element.shelving",
13348
14672
  "application.cabinetry"
@@ -13359,7 +14683,7 @@ var PRODUCT_CATEGORY_TERMS = [
13359
14683
  aat8("300002803", "doors", "close"),
13360
14684
  uniclass5("Pr_30_59_24", "Doorsets", "exact")
13361
14685
  ],
13362
- related: relatedTo11("element.door", "application.door"),
14686
+ related: relatedTo13("element.door", "application.door"),
13363
14687
  seenAs: ["Doors"]
13364
14688
  }
13365
14689
  ),
@@ -13377,9 +14701,9 @@ var PRODUCT_CATEGORY_TERMS = [
13377
14701
  external: [
13378
14702
  uniclass5("Pr_35_93_13_65", "Profiled metal acoustic panels", "narrow")
13379
14703
  ],
13380
- related: relatedTo11("requirement.acoustic-performance"),
14704
+ related: relatedTo13("requirement.acoustic-performance"),
13381
14705
  searchedWithout: [
13382
- searchedAat2('acoustic panel; "sound absorbing panels"')
14706
+ searchedAat3('acoustic panel; "sound absorbing panels"')
13383
14707
  ]
13384
14708
  }
13385
14709
  ),
@@ -13440,7 +14764,7 @@ var PRODUCT_CATEGORY_TERMS = [
13440
14764
  altLabels: ["track lighting", "track light"],
13441
14765
  broaderSlug: "luminaire",
13442
14766
  external: [LUMINAIRES],
13443
- searchedWithout: [searchedAat2("track lighting; track AND lighting")]
14767
+ searchedWithout: [searchedAat3("track lighting; track AND lighting")]
13444
14768
  }
13445
14769
  ),
13446
14770
  fromSearchCorpus(
@@ -13465,7 +14789,7 @@ var PRODUCT_CATEGORY_TERMS = [
13465
14789
  altLabels: ["mosaic"],
13466
14790
  broaderSlug: "tile",
13467
14791
  external: [uniclass5("Pr_35_93_96_53", "Mosaic tiles", "exact")],
13468
- searchedWithout: [searchedAat2("mosaic tile; tesserae")]
14792
+ searchedWithout: [searchedAat3("mosaic tile; tesserae")]
13469
14793
  }
13470
14794
  ),
13471
14795
  fromSearchCorpus(
@@ -13489,8 +14813,8 @@ var PRODUCT_CATEGORY_TERMS = [
13489
14813
  altLabels: ["acoustic ceiling"],
13490
14814
  broaderSlug: "ceiling-system",
13491
14815
  external: [aat8("300073775", "acoustical ceilings", "related")],
13492
- related: relatedTo11("requirement.acoustic-performance"),
13493
- searchedWithout: [searchedUniclass11("acoustic ceiling system")]
14816
+ related: relatedTo13("requirement.acoustic-performance"),
14817
+ searchedWithout: [searchedUniclass12("acoustic ceiling system")]
13494
14818
  }
13495
14819
  ),
13496
14820
  fromSearchCorpus(
@@ -13521,7 +14845,7 @@ var PRODUCT_CATEGORY_TERMS = [
13521
14845
  snapshot: REVIEW_DATE8,
13522
14846
  source: "Wikidata Q321046 window blind, https://www.wikidata.org/wiki/Q321046"
13523
14847
  },
13524
- related: relatedTo11("application.vh-window-shade", "element.window"),
14848
+ related: relatedTo13("application.vh-window-shade", "element.window"),
13525
14849
  reviewedAt: REVIEW_DATE8
13526
14850
  }
13527
14851
  ),
@@ -13566,7 +14890,7 @@ var PRODUCT_CATEGORY_TERMS = [
13566
14890
  ],
13567
14891
  introducedAt: REVIEW_DATE8,
13568
14892
  provenance: { basis: "authored", source: REVIEW_SOURCE7 },
13569
- related: relatedTo11("element.cladding", "application.facade"),
14893
+ related: relatedTo13("element.cladding", "application.facade"),
13570
14894
  reviewedAt: REVIEW_DATE8,
13571
14895
  seenAs: ["Facade", "Rainscreens", "Exterior Panel Systems"]
13572
14896
  }
@@ -13579,6 +14903,7 @@ var PRODUCT_CATEGORY_TERMS = [
13579
14903
  "A furniture product supplied to sleep or lie on, or the frame or headboard made for one, independent of its material and size; not a mattress, bedding or a sofa bed.",
13580
14904
  {
13581
14905
  altLabels: ["bed frame"],
14906
+ broaderSlug: "furniture",
13582
14907
  external: [
13583
14908
  aat8("300038697", "beds (furniture)", "close"),
13584
14909
  uniclass5("Pr_40_50_06", "Beds", "broad")
@@ -13618,28 +14943,29 @@ var PRODUCT_CATEGORY_TERMS = [
13618
14943
  related: [typicallyIn4("living-room"), typicallyIn4("bedroom")],
13619
14944
  reviewedAt: SEARCHED_ON_TAX66
13620
14945
  }
13621
- )
14946
+ ),
14947
+ ...FURNITURE_TERMS
13622
14948
  ];
13623
14949
 
13624
14950
  // src/axes/requirement.ts
13625
14951
  var SOURCE5 = "in-house residential and commercial project requirements";
13626
- var SNAPSHOT8 = "2026-08-25";
14952
+ var SNAPSHOT7 = "2026-08-25";
13627
14953
  var term9 = (slug, label, definition, extra = {}) => ({
13628
14954
  definition,
13629
14955
  label,
13630
- provenance: { basis: "evidenced", snapshot: SNAPSHOT8, source: SOURCE5 },
14956
+ provenance: { basis: "evidenced", snapshot: SNAPSHOT7, source: SOURCE5 },
13631
14957
  slug,
13632
14958
  ...extra
13633
14959
  });
13634
14960
  var uniclass6 = (identifier, label, match) => ({ identifier, label, match, scheme: "uniclass" });
13635
14961
  var aat9 = (identifier, label, match) => ({ identifier, label, match, scheme: "aat" });
13636
- var searchedAat3 = (query) => ({
14962
+ var searchedAat4 = (query) => ({
13637
14963
  date: SEARCHED_ON,
13638
14964
  query,
13639
14965
  scheme: "aat",
13640
14966
  via: "https://vocab.getty.edu:443/sparql; luc:term search, AAT preferred labels and English scope notes, LIMIT 150"
13641
14967
  });
13642
- var searchedUniclass12 = (query) => ({
14968
+ var searchedUniclass13 = (query) => ({
13643
14969
  date: SEARCHED_ON,
13644
14970
  query,
13645
14971
  scheme: "uniclass",
@@ -13652,7 +14978,7 @@ var REQUIREMENT_TERMS = [
13652
14978
  "The allowed monetary cost or cost band for the applicable scope.",
13653
14979
  {
13654
14980
  external: [uniclass6("PM_60_50_10", "Budget", "close")],
13655
- searchedWithout: [searchedAat3("budget")]
14981
+ searchedWithout: [searchedAat4("budget")]
13656
14982
  }
13657
14983
  ),
13658
14984
  term9(
@@ -13661,7 +14987,7 @@ var REQUIREMENT_TERMS = [
13661
14987
  "Whether the thing can be supplied in the required market and time window.",
13662
14988
  {
13663
14989
  external: [uniclass6("PC_20_67_05", "Availability", "close")],
13664
- searchedWithout: [searchedAat3("availability")]
14990
+ searchedWithout: [searchedAat4("availability")]
13665
14991
  }
13666
14992
  ),
13667
14993
  term9(
@@ -13670,7 +14996,7 @@ var REQUIREMENT_TERMS = [
13670
14996
  "The maximum elapsed time acceptable between commitment and supply.",
13671
14997
  {
13672
14998
  external: [uniclass6("PC_20_77_52", "Manufacturing lead time", "narrow")],
13673
- searchedWithout: [searchedAat3("lead time")]
14999
+ searchedWithout: [searchedAat4("lead time")]
13674
15000
  }
13675
15001
  ),
13676
15002
  term9(
@@ -13679,8 +15005,8 @@ var REQUIREMENT_TERMS = [
13679
15005
  "The required measured resistance to pedestrian slipping for the application.",
13680
15006
  {
13681
15007
  searchedWithout: [
13682
- searchedAat3("slip resistance"),
13683
- searchedUniclass12("slip resistance")
15008
+ searchedAat4("slip resistance"),
15009
+ searchedUniclass13("slip resistance")
13684
15010
  ]
13685
15011
  }
13686
15012
  ),
@@ -13690,7 +15016,7 @@ var REQUIREMENT_TERMS = [
13690
15016
  "Whether the product is evidenced as suitable for the stated wet exposure.",
13691
15017
  {
13692
15018
  external: [uniclass6("PC_50_34_82", "Suitability", "broad")],
13693
- searchedWithout: [searchedAat3("wet area")]
15019
+ searchedWithout: [searchedAat4("wet area")]
13694
15020
  }
13695
15021
  ),
13696
15022
  term9(
@@ -13701,7 +15027,7 @@ var REQUIREMENT_TERMS = [
13701
15027
  external: [
13702
15028
  uniclass6("PM_35_30", "Fire performance requirements", "broad")
13703
15029
  ],
13704
- searchedWithout: [searchedAat3("fire resistance")]
15030
+ searchedWithout: [searchedAat4("fire resistance")]
13705
15031
  }
13706
15032
  ),
13707
15033
  term9(
@@ -13721,7 +15047,7 @@ var REQUIREMENT_TERMS = [
13721
15047
  "The allowed cleaning, renewal or routine care burden.",
13722
15048
  {
13723
15049
  external: [uniclass6("PM_80_10_50", "Maintenance requirements", "close")],
13724
- searchedWithout: [searchedAat3("maintenance")]
15050
+ searchedWithout: [searchedAat4("maintenance")]
13725
15051
  }
13726
15052
  ),
13727
15053
  term9(
@@ -13730,7 +15056,7 @@ var REQUIREMENT_TERMS = [
13730
15056
  "A required or prohibited method of fixing, laying or applying the product.",
13731
15057
  {
13732
15058
  external: [uniclass6("PC_50_34_41", "Installation method", "exact")],
13733
- searchedWithout: [searchedAat3("installation")]
15059
+ searchedWithout: [searchedAat4("installation")]
13734
15060
  }
13735
15061
  ),
13736
15062
  term9(
@@ -13769,6 +15095,70 @@ var REQUIREMENT_TERMS = [
13769
15095
  },
13770
15096
  reviewedAt: SEARCHED_ON_TAX66
13771
15097
  }
15098
+ ),
15099
+ // Authored with the TAX-66 vocabulary gaps. These are needs a project states; the schemes that
15100
+ // evidence them (FSC, GREENGUARD, EPD and the rest) are on the certification axis and point back
15101
+ // here with `related-to`, so nothing on this axis names a scheme.
15102
+ term9(
15103
+ "responsible-sourcing",
15104
+ "Responsible sourcing",
15105
+ "The required evidence that a product's raw materials, such as timber, come from lawful and responsibly managed sources, traced through the supply chain.",
15106
+ {
15107
+ altLabels: ["sustainable sourcing"],
15108
+ ...GAPS_LIFECYCLE,
15109
+ searchedWithout: [
15110
+ gapsSearchedAat("responsible sourcing | sustainable sourcing"),
15111
+ gapsSearchedUniclass(
15112
+ "Responsible sourcing | sustainable sourcing | chain of custody"
15113
+ ),
15114
+ gapsSearchedWikidata("responsible sourcing")
15115
+ ]
15116
+ }
15117
+ ),
15118
+ term9(
15119
+ "antimicrobial",
15120
+ "Antimicrobial",
15121
+ "The required resistance of a surface to the growth of bacteria, fungi or mould, stated against a test method and not by the presence of an additive alone.",
15122
+ {
15123
+ altLabels: ["anti-microbial"],
15124
+ external: [
15125
+ uniclass6("PC_35_28_48_06", "Bacterial resistance", "close"),
15126
+ uniclass6("PC_20_67_04_04", "Anti-microbial treatment", "related"),
15127
+ {
15128
+ identifier: "Q4774939",
15129
+ label: "antimicrobial surface",
15130
+ match: "related",
15131
+ scheme: "wikidata"
15132
+ }
15133
+ ],
15134
+ ...GAPS_LIFECYCLE,
15135
+ searchedWithout: [gapsSearchedAat("antimicrobial | antibacterial")],
15136
+ seenAs: ["antibacterial"]
15137
+ }
15138
+ ),
15139
+ term9(
15140
+ "net-zero",
15141
+ "Net zero",
15142
+ "The net greenhouse-gas balance a project is held to over a stated scope and period, once emissions are reduced and any remainder offset or removed; the assertion states the scope.",
15143
+ {
15144
+ altLabels: ["net zero carbon", "net-zero"],
15145
+ external: [
15146
+ uniclass6("PC_35_85_99", "Zero-carbon", "close"),
15147
+ uniclass6("PC_35_85_12", "Carbon-neutral", "related"),
15148
+ {
15149
+ identifier: "Q121734997",
15150
+ label: "Net-zero emissions",
15151
+ match: "close",
15152
+ scheme: "wikidata"
15153
+ }
15154
+ ],
15155
+ ...GAPS_LIFECYCLE,
15156
+ note: "Carbon-neutral, which can be reached by offsets alone, is a different claim; Uniclass keeps it apart from Zero-carbon, and the mapping to it is only related.",
15157
+ related: [
15158
+ { predicate: "related-to", target: "requirement.embodied-carbon" }
15159
+ ],
15160
+ searchedWithout: [gapsSearchedAat("net zero | zero energy")]
15161
+ }
13772
15162
  )
13773
15163
  ];
13774
15164
 
@@ -13881,7 +15271,7 @@ var PROGRAM_SPACES = {
13881
15271
  snapshot: VENDORED_SNAPSHOT,
13882
15272
  source: "PROGRAM_SPACE_TYPES in a project-materials database (src-07)"
13883
15273
  };
13884
- var relatedTo12 = (target) => ({
15274
+ var relatedTo14 = (target) => ({
13885
15275
  predicate: "related-to",
13886
15276
  target
13887
15277
  });
@@ -14182,7 +15572,7 @@ var CIRCULATION_SPACES = [
14182
15572
  // stand on. A neat demonstration of the boundary rule catching a mapping that reads right.
14183
15573
  note: "AAT files landings as a stair component, which is the element sense. This term is the volume sense - the thing you stand on - so the match is `close` and not `exact`.",
14184
15574
  provenance: PROGRAM_SPACES,
14185
- related: [relatedTo12("space.stairwell")],
15575
+ related: [relatedTo14("space.stairwell")],
14186
15576
  slug: "landing"
14187
15577
  },
14188
15578
  {
@@ -14351,7 +15741,7 @@ var CULTURE_SPACES = [
14351
15741
  label: "Theatre",
14352
15742
  note: "Deliberately not a kind of `auditorium`, and the containment runs the other way - the auditorium is the audience chamber INSIDE a theatre. That is a part-of relation and not an ISA edge, so it is carried in `related` where part-of belongs. No AAT mapping: every Getty `theaters` entry is a building or an institution, which is TYPOLOGY's business.",
14353
15743
  provenance: PROGRAM_SPACES,
14354
- related: [typicallyIn5("theatre"), relatedTo12("space.auditorium")],
15744
+ related: [typicallyIn5("theatre"), relatedTo14("space.auditorium")],
14355
15745
  slug: "theater"
14356
15746
  },
14357
15747
  {
@@ -14631,7 +16021,7 @@ var DINING_SPACES = [
14631
16021
  label: "Kitchen",
14632
16022
  note: "`application.kitchen` in the published APPLICATIONS axis is a room sitting inside a surface-use vocabulary, and is superseded by this term. As with `bathroom`, the edge is `related-to` rather than `suitable-for`, because the suitability claim runs from the material to the space and so belongs on the applications side.",
14633
16023
  provenance: MS_ROOM_PROGRAM,
14634
- related: [relatedTo12("application.kitchen")],
16024
+ related: [relatedTo14("application.kitchen")],
14635
16025
  seenAs: ["Kitchen"],
14636
16026
  slug: "kitchen",
14637
16027
  usage: schemeUsage("dominant")
@@ -14695,7 +16085,7 @@ var DINING_SPACES = [
14695
16085
  label: "Scullery",
14696
16086
  note: "Deliberately not a kind of `kitchen`. The parent is defined by preparing and cooking food, and a scullery is defined by the cooking happening next door. In current British practice the word has been reclaimed for the working half of a two-part kitchen, which is the same room by the same test.",
14697
16087
  provenance: AUTHORED6,
14698
- related: [relatedTo12("space.kitchen")],
16088
+ related: [relatedTo14("space.kitchen")],
14699
16089
  slug: "scullery"
14700
16090
  },
14701
16091
  {
@@ -14961,7 +16351,7 @@ var FITNESS_SPACES = [
14961
16351
  // src/axes/space/gathering.ts
14962
16352
  var LIVING_ROOMS = "Living rooms";
14963
16353
  var LOUNGES = "lounges (sitting rooms)";
14964
- var LIVING_ROOM = "living-room";
16354
+ var LIVING_ROOM2 = "living-room";
14965
16355
  var GATHERING_SPACES = [
14966
16356
  // ─── Sitting and gathering ──────────────────────────────────────────────────────────────────
14967
16357
  // The spine's largest single block, and the one where the near-synonym rule earns its keep. Nine
@@ -14983,12 +16373,12 @@ var GATHERING_SPACES = [
14983
16373
  provenance: MS_ROOM_PROGRAM,
14984
16374
  related: [serves("residential")],
14985
16375
  seenAs: ["Living Room", "living_area"],
14986
- slug: LIVING_ROOM,
16376
+ slug: LIVING_ROOM2,
14987
16377
  usage: schemeUsage("common")
14988
16378
  },
14989
16379
  {
14990
16380
  altLabels: ["den"],
14991
- broaderSlug: LIVING_ROOM,
16381
+ broaderSlug: LIVING_ROOM2,
14992
16382
  definition: "A small, enclosed and deliberately low-lit sitting volume held as a retreat from the main `living_room`, rather than as a substitute for it.",
14993
16383
  external: [
14994
16384
  aat11("300004416", "dens (rooms)", "close"),
@@ -15000,7 +16390,7 @@ var GATHERING_SPACES = [
15000
16390
  slug: "snug"
15001
16391
  },
15002
16392
  {
15003
- broaderSlug: LIVING_ROOM,
16393
+ broaderSlug: LIVING_ROOM2,
15004
16394
  definition: "A formal sitting volume kept for receiving guests, held apart from the household's everyday `living_room` and finished to be seen rather than lived in. British usage, and the reason it is a term rather than another name for `living_room`: a house with both uses them differently.",
15005
16395
  external: [
15006
16396
  aat11("300004417", "drawing rooms", "exact"),
@@ -15145,7 +16535,7 @@ var GATHERING_SPACES = [
15145
16535
  label: "Roof Lounge",
15146
16536
  note: "Filed under `lounge` rather than under `outdoor`, and only one of those can be the parent. The lounge-ness is what gets specified - the seating, the lighting, the way it is used - and being outdoors is a condition applied to it. The same call is made on `outdoor_lounge`.",
15147
16537
  provenance: PROGRAM_SPACES,
15148
- related: [relatedTo12("space.roof-deck")],
16538
+ related: [relatedTo14("space.roof-deck")],
15149
16539
  searchedWithout: [
15150
16540
  {
15151
16541
  date: SEARCHED_ON,
@@ -15165,7 +16555,7 @@ var GATHERING_SPACES = [
15165
16555
  ],
15166
16556
  label: "Outdoor Lounge",
15167
16557
  provenance: PROGRAM_SPACES,
15168
- related: [relatedTo12("space.outdoor")],
16558
+ related: [relatedTo14("space.outdoor")],
15169
16559
  slug: "outdoor-lounge"
15170
16560
  },
15171
16561
  {
@@ -15177,7 +16567,7 @@ var GATHERING_SPACES = [
15177
16567
  label: "Clubroom",
15178
16568
  note: "Deliberately not a kind of `lounge`. A lounge is soft-seated and dropped into; a clubroom is booked, tabled, and expected to take a party. The two are neighbours in every brief and they are not the same room, which is why folding them would lose a real difference in floor build-up and acoustic treatment.",
15179
16569
  provenance: PROGRAM_SPACES,
15180
- related: [relatedTo12("space.game-room")],
16570
+ related: [relatedTo14("space.game-room")],
15181
16571
  slug: "clubroom"
15182
16572
  },
15183
16573
  {
@@ -15185,7 +16575,7 @@ var GATHERING_SPACES = [
15185
16575
  label: "Fireplace Area",
15186
16576
  note: "A zone inside another room rather than a room, and deliberately not a child of `living_room` - it occurs in lobbies, lounges and bars as readily as in dwellings. The fire opening and chimneypiece themselves are `element.fireplace` and `element.chimneypiece`; this is the volume in front of them.",
15187
16577
  provenance: PROGRAM_SPACES,
15188
- related: [relatedTo12("element.fireplace")],
16578
+ related: [relatedTo14("element.fireplace")],
15189
16579
  searchedWithout: [
15190
16580
  {
15191
16581
  date: SEARCHED_ON,
@@ -15783,7 +17173,7 @@ var OUTDOOR_SPACES = [
15783
17173
  label: "Facade Zone",
15784
17174
  note: "Names a set of surfaces rather than a volume, and fails the standing-in test the way `home_exterior` does. Retained because the spine carries it and because facade packages really are specified as one zone. If it is ever split, its contents belong in ELEMENT - `element.cladding`, `element.external-wall` - and not here.",
15785
17175
  provenance: PROGRAM_SPACES,
15786
- related: [relatedTo12("element.cladding")],
17176
+ related: [relatedTo14("element.cladding")],
15787
17177
  searchedWithout: [
15788
17178
  {
15789
17179
  date: SEARCHED_ON,
@@ -15948,7 +17338,7 @@ var RETAIL_SPACES = [
15948
17338
  label: "Consultation Room",
15949
17339
  note: "One character from `consult_room`, and deliberately not folded into it. That one is clinical - a GP surgery, examined and prescribed in, with the cleaning and privacy requirements that implies. This one is commercial and is furnished like a small meeting room. Two ids this close is a real trap, and the answer is a note on each rather than a merge that would put retail joinery into a medical specification.",
15950
17340
  provenance: PROGRAM_SPACES,
15951
- related: [relatedTo12("space.consult-room"), serves("retail")],
17341
+ related: [relatedTo14("space.consult-room"), serves("retail")],
15952
17342
  searchedWithout: [
15953
17343
  {
15954
17344
  date: SEARCHED_ON,
@@ -16067,7 +17457,7 @@ var SANITARY_SPACES = [
16067
17457
  label: "Bathroom",
16068
17458
  note: "`application.bath` in the published APPLICATIONS axis is a room sitting inside a surface-use vocabulary, and is superseded by this term. The edge here is `related-to` and not `suitable-for` on purpose: `suitable-for` runs from a material-suitability claim TO a space, so the correct `suitable-for` edge points the other way and belongs on the applications side, alongside the deprecation.",
16069
17459
  provenance: MS_ROOM_PROGRAM,
16070
- related: [relatedTo12("application.bath")],
17460
+ related: [relatedTo14("application.bath")],
16071
17461
  seenAs: ["Bathroom"],
16072
17462
  slug: "bathroom",
16073
17463
  usage: schemeUsage("dominant")
@@ -16150,7 +17540,7 @@ var SANITARY_SPACES = [
16150
17540
  label: "Locker Area",
16151
17541
  note: "Kept apart from `changing_room` rather than folded into it, because the spine files them in different sectors and the difference is real: this one has no showers, no benching and no privacy requirement, and it sits in the open.",
16152
17542
  provenance: PROGRAM_SPACES,
16153
- related: [relatedTo12("space.changing-room")],
17543
+ related: [relatedTo14("space.changing-room")],
16154
17544
  slug: "locker-area"
16155
17545
  },
16156
17546
  {
@@ -16339,7 +17729,7 @@ var SERVICE_SPACES = [
16339
17729
  label: "Electrical Room",
16340
17730
  note: "Deliberately not a kind of `mechanical_room`. Switchgear is not a kind of mechanical plant, the two rooms are kept apart by regulation for exactly that reason, and their clearances, fire compartmentation and access rules are different.",
16341
17731
  provenance: PROGRAM_SPACES,
16342
- related: [relatedTo12("space.mechanical-room")],
17732
+ related: [relatedTo14("space.mechanical-room")],
16343
17733
  searchedWithout: [
16344
17734
  {
16345
17735
  date: SEARCHED_ON,
@@ -16453,7 +17843,7 @@ var SLEEPING_SPACES = [
16453
17843
  label: "Nursery",
16454
17844
  note: 'Deliberately not a kind of `bedroom`, on Getty\'s own evidence: AAT scopes a nursery as serving "as a bedroom or playroom", and AAT mints `night nurseries` separately for the sleeping-only case. If not every nursery is a bedroom, the ISA test fails, and it does. The nursery school is a building and belongs to TYPOLOGY, not here.',
16455
17845
  provenance: AUTHORED6,
16456
- related: [typicallyIn5("house"), relatedTo12("space.playroom")],
17846
+ related: [typicallyIn5("house"), relatedTo14("space.playroom")],
16457
17847
  slug: "nursery"
16458
17848
  },
16459
17849
  {
@@ -16521,8 +17911,8 @@ var SLEEPING_SPACES = [
16521
17911
  note: 'Deliberately not a kind of `closet_storage`, whose definition ends "never to stay in" - which is exactly what a dressing room is for. AAT 300004369 is `exact` here and `close` on `fitting_room`; Getty scopes it as "rooms for dressing and the toilet, usually opening from a bedroom", which is this room and only approximately a shop\'s changing cubicle.',
16522
17912
  provenance: AUTHORED6,
16523
17913
  related: [
16524
- relatedTo12("space.principal-bedroom"),
16525
- relatedTo12("space.closet-storage")
17914
+ relatedTo14("space.principal-bedroom"),
17915
+ relatedTo14("space.closet-storage")
16526
17916
  ],
16527
17917
  slug: "dressing-room"
16528
17918
  }
@@ -16743,7 +18133,7 @@ var WORKING_SPACES = [
16743
18133
  ],
16744
18134
  label: "IT Room",
16745
18135
  provenance: PROGRAM_SPACES,
16746
- related: [typicallyIn5("office"), relatedTo12("space.electrical-room")],
18136
+ related: [typicallyIn5("office"), relatedTo14("space.electrical-room")],
16747
18137
  slug: "it-room"
16748
18138
  },
16749
18139
  {
@@ -16828,7 +18218,7 @@ var SECTOR_IDS = new Set(
16828
18218
 
16829
18219
  // src/axes/style-shared.ts
16830
18220
  var PLATFORM_STYLES_SOURCE = "STYLES in an architecture-projects platform (src-01)";
16831
- var SNAPSHOT9 = "2026-08-21";
18221
+ var SNAPSHOT8 = "2026-08-21";
16832
18222
  var MOVEMENT = "movement";
16833
18223
  var aat12 = (slug, label, match) => ({
16834
18224
  identifier: slug,
@@ -16844,7 +18234,7 @@ var influencedBy = (target) => ({
16844
18234
  predicate: "influenced-by",
16845
18235
  target
16846
18236
  });
16847
- var relatedTo13 = (target) => ({
18237
+ var relatedTo15 = (target) => ({
16848
18238
  predicate: "related-to",
16849
18239
  target
16850
18240
  });
@@ -16866,7 +18256,7 @@ var STYLE_ARCHITECTURAL_TERMS = [
16866
18256
  label: "Postmodernism",
16867
18257
  provenance: {
16868
18258
  basis: "vendored",
16869
- snapshot: SNAPSHOT9,
18259
+ snapshot: SNAPSHOT8,
16870
18260
  source: PLATFORM_STYLES_SOURCE
16871
18261
  },
16872
18262
  related: [influencedBy("style.modernism"), evokes(LATE_CENTURY)],
@@ -16887,7 +18277,7 @@ var STYLE_ARCHITECTURAL_TERMS = [
16887
18277
  label: "Deconstructivism",
16888
18278
  provenance: {
16889
18279
  basis: "vendored",
16890
- snapshot: SNAPSHOT9,
18280
+ snapshot: SNAPSHOT8,
16891
18281
  source: PLATFORM_STYLES_SOURCE
16892
18282
  },
16893
18283
  related: [influencedBy("style.constructivism"), evokes(LATE_CENTURY)],
@@ -16900,7 +18290,7 @@ var STYLE_ARCHITECTURAL_TERMS = [
16900
18290
  label: "Parametricism",
16901
18291
  provenance: {
16902
18292
  basis: "vendored",
16903
- snapshot: SNAPSHOT9,
18293
+ snapshot: SNAPSHOT8,
16904
18294
  source: PLATFORM_STYLES_SOURCE
16905
18295
  },
16906
18296
  related: [evokes("period.contemporary")],
@@ -16929,7 +18319,7 @@ var STYLE_ARCHITECTURAL_TERMS = [
16929
18319
  label: "High-Tech",
16930
18320
  provenance: {
16931
18321
  basis: "vendored",
16932
- snapshot: SNAPSHOT9,
18322
+ snapshot: SNAPSHOT8,
16933
18323
  source: PLATFORM_STYLES_SOURCE
16934
18324
  },
16935
18325
  related: [evokes(LATE_CENTURY)],
@@ -16950,7 +18340,7 @@ var STYLE_ARCHITECTURAL_TERMS = [
16950
18340
  label: "Rationalism",
16951
18341
  provenance: {
16952
18342
  basis: "vendored",
16953
- snapshot: SNAPSHOT9,
18343
+ snapshot: SNAPSHOT8,
16954
18344
  source: PLATFORM_STYLES_SOURCE
16955
18345
  },
16956
18346
  related: [evokes("period.interwar")],
@@ -16971,7 +18361,7 @@ var STYLE_ARCHITECTURAL_TERMS = [
16971
18361
  label: "Constructivism",
16972
18362
  provenance: {
16973
18363
  basis: "vendored",
16974
- snapshot: SNAPSHOT9,
18364
+ snapshot: SNAPSHOT8,
16975
18365
  source: PLATFORM_STYLES_SOURCE
16976
18366
  },
16977
18367
  related: [evokes("period.interwar")],
@@ -16993,7 +18383,7 @@ var STYLE_ARCHITECTURAL_TERMS = [
16993
18383
  label: "Organic Modernism",
16994
18384
  provenance: {
16995
18385
  basis: "vendored",
16996
- snapshot: SNAPSHOT9,
18386
+ snapshot: SNAPSHOT8,
16997
18387
  source: PLATFORM_STYLES_SOURCE
16998
18388
  },
16999
18389
  seenAs: ["Organic", "quiet_organic"],
@@ -17023,7 +18413,7 @@ var STYLE_TERMS = [
17023
18413
  }
17024
18414
  ],
17025
18415
  label: "Minimalism",
17026
- provenance: { basis: "evidenced", snapshot: SNAPSHOT9, source: ESTATE3 },
18416
+ provenance: { basis: "evidenced", snapshot: SNAPSHOT8, source: ESTATE3 },
17027
18417
  seenAs: [
17028
18418
  "serene-minimal",
17029
18419
  "minimal_warm",
@@ -17065,7 +18455,7 @@ var STYLE_TERMS = [
17065
18455
  note: 'NOT the consumer sense of "modern". A consumer calling a room modern usually means it is current and clean-lined, which is `contemporary` here. The two are separate terms and the crosswalk from an ambiguous source label declines rather than guessing. See ADR 0001.',
17066
18456
  provenance: {
17067
18457
  basis: "evidenced",
17068
- snapshot: SNAPSHOT9,
18458
+ snapshot: SNAPSHOT8,
17069
18459
  source: "an architecture-projects platform (src-01) and a rendering pipeline (src-08)"
17070
18460
  },
17071
18461
  slug: "modernism",
@@ -17092,7 +18482,7 @@ var STYLE_TERMS = [
17092
18482
  note: "Style, not period. A reproduction built in 2024 is `style.mid-century-modern` in the `period.contemporary` period, which is why the two axes cannot be one.",
17093
18483
  provenance: {
17094
18484
  basis: "evidenced",
17095
- snapshot: SNAPSHOT9,
18485
+ snapshot: SNAPSHOT8,
17096
18486
  source: "an architecture-projects platform (src-01), an editorial image library (src-02), a furnishings retailer (src-03) and a materials-retrieval system (src-05)"
17097
18487
  },
17098
18488
  related: [{ predicate: "evokes", target: "period.mid-century" }],
@@ -17106,10 +18496,10 @@ var STYLE_TERMS = [
17106
18496
  note: "DELIBERATELY TIME-RELATIVE, and the only term here that is. What it denotes moves; the id does not. Consumers distinguish it from `modern` in practice - a furnishings retailer carries both at similar volume - without anyone having written down how. `period.contemporary` is a different thing on a different axis; the prefix disambiguates.",
17107
18497
  provenance: {
17108
18498
  basis: "evidenced",
17109
- snapshot: SNAPSHOT9,
18499
+ snapshot: SNAPSHOT8,
17110
18500
  source: "a furnishings retailer (src-03), a rendering pipeline (src-08) and a materials-retrieval system (src-05)"
17111
18501
  },
17112
- related: [relatedTo13("period.contemporary")],
18502
+ related: [relatedTo15("period.contemporary")],
17113
18503
  searchedWithout: [
17114
18504
  {
17115
18505
  date: SEARCHED_ON,
@@ -17130,7 +18520,7 @@ var STYLE_TERMS = [
17130
18520
  definition: "Pre-modern decorative conventions carried forward without irony: mouldings, pattern, symmetry, furniture with a period lineage.",
17131
18521
  external: [aat12("300310540", "traditional (style)", "exact")],
17132
18522
  label: "Traditional",
17133
- provenance: { basis: "evidenced", snapshot: SNAPSHOT9, source: ESTATE3 },
18523
+ provenance: { basis: "evidenced", snapshot: SNAPSHOT8, source: ESTATE3 },
17134
18524
  searchedWithout: [
17135
18525
  {
17136
18526
  date: SEARCHED_ON,
@@ -17168,7 +18558,7 @@ var STYLE_TERMS = [
17168
18558
  label: "Neoclassical",
17169
18559
  provenance: {
17170
18560
  basis: "vendored",
17171
- snapshot: SNAPSHOT9,
18561
+ snapshot: SNAPSHOT8,
17172
18562
  source: PLATFORM_STYLES_SOURCE
17173
18563
  },
17174
18564
  seenAs: ["Classical & Grand"],
@@ -17189,7 +18579,7 @@ var STYLE_TERMS = [
17189
18579
  label: "Gothic",
17190
18580
  provenance: {
17191
18581
  basis: "vendored",
17192
- snapshot: SNAPSHOT9,
18582
+ snapshot: SNAPSHOT8,
17193
18583
  source: PLATFORM_STYLES_SOURCE
17194
18584
  },
17195
18585
  related: [evokes("period.medieval"), evokes("typology.church")],
@@ -17210,7 +18600,7 @@ var STYLE_TERMS = [
17210
18600
  label: "Art Deco",
17211
18601
  provenance: {
17212
18602
  basis: "evidenced",
17213
- snapshot: SNAPSHOT9,
18603
+ snapshot: SNAPSHOT8,
17214
18604
  source: "an architecture-projects platform (src-01), an editorial image library (src-02), a furnishings retailer (src-03) and a rendering pipeline (src-08)"
17215
18605
  },
17216
18606
  related: [{ predicate: "evokes", target: "period.interwar" }],
@@ -17232,7 +18622,7 @@ var STYLE_TERMS = [
17232
18622
  label: "Industrial",
17233
18623
  provenance: {
17234
18624
  basis: "evidenced",
17235
- snapshot: SNAPSHOT9,
18625
+ snapshot: SNAPSHOT8,
17236
18626
  source: "a rendering pipeline (src-08), an architecture-projects platform (src-01), a furnishings retailer (src-03) and a materials-retrieval system (src-05)"
17237
18627
  },
17238
18628
  related: [{ predicate: "evokes", target: "typology.warehouse" }],
@@ -17254,7 +18644,7 @@ var STYLE_TERMS = [
17254
18644
  label: "Brutalism",
17255
18645
  provenance: {
17256
18646
  basis: "vendored",
17257
- snapshot: SNAPSHOT9,
18647
+ snapshot: SNAPSHOT8,
17258
18648
  source: PLATFORM_STYLES_SOURCE
17259
18649
  },
17260
18650
  related: [influencedBy("style.modernism"), evokes("period.mid-century")],
@@ -17274,7 +18664,7 @@ var STYLE_TERMS = [
17274
18664
  label: "Maximalism",
17275
18665
  provenance: {
17276
18666
  basis: "evidenced",
17277
- snapshot: SNAPSHOT9,
18667
+ snapshot: SNAPSHOT8,
17278
18668
  source: "an editorial image library (src-02)"
17279
18669
  },
17280
18670
  searchedWithout: [
@@ -17303,10 +18693,10 @@ var STYLE_TERMS = [
17303
18693
  label: "Eclectic",
17304
18694
  provenance: {
17305
18695
  basis: "evidenced",
17306
- snapshot: SNAPSHOT9,
18696
+ snapshot: SNAPSHOT8,
17307
18697
  source: SCHEME_CORPUS2
17308
18698
  },
17309
- related: [relatedTo13("style.maximalism")],
18699
+ related: [relatedTo15("style.maximalism")],
17310
18700
  slug: "eclectic",
17311
18701
  styleKind: MARKET_IDIOM,
17312
18702
  usage: {
@@ -17323,7 +18713,7 @@ var STYLE_TERMS = [
17323
18713
  note: 'Defined only relative to two other terms, which is unusual and was nearly grounds to refuse it. It stays because it is heavily used in the US consumer market and because the relative definition is the honest one - the term genuinely means "between those two" and pretending otherwise would invent content nobody intends.',
17324
18714
  provenance: {
17325
18715
  basis: "evidenced",
17326
- snapshot: SNAPSHOT9,
18716
+ snapshot: SNAPSHOT8,
17327
18717
  source: SCHEME_CORPUS2
17328
18718
  },
17329
18719
  related: [
@@ -17360,7 +18750,7 @@ var STYLE_TERMS = [
17360
18750
  label: "Rustic",
17361
18751
  provenance: {
17362
18752
  basis: "evidenced",
17363
- snapshot: SNAPSHOT9,
18753
+ snapshot: SNAPSHOT8,
17364
18754
  source: "a rendering pipeline (src-08), an architecture-projects platform (src-01), a furnishings retailer (src-03) and a materials-retrieval system (src-05)"
17365
18755
  },
17366
18756
  seenAs: ["Rustic & Artisan"],
@@ -17382,7 +18772,7 @@ var STYLE_TERMS = [
17382
18772
  label: "Vernacular",
17383
18773
  provenance: {
17384
18774
  basis: "vendored",
17385
- snapshot: SNAPSHOT9,
18775
+ snapshot: SNAPSHOT8,
17386
18776
  source: PLATFORM_STYLES_SOURCE
17387
18777
  },
17388
18778
  slug: "vernacular",
@@ -17404,10 +18794,10 @@ var STYLE_TERMS = [
17404
18794
  label: "Critical Regionalism",
17405
18795
  provenance: {
17406
18796
  basis: "vendored",
17407
- snapshot: SNAPSHOT9,
18797
+ snapshot: SNAPSHOT8,
17408
18798
  source: PLATFORM_STYLES_SOURCE
17409
18799
  },
17410
- related: [relatedTo13("style.vernacular")],
18800
+ related: [relatedTo15("style.vernacular")],
17411
18801
  slug: "critical-regionalism",
17412
18802
  styleKind: MOVEMENT
17413
18803
  },
@@ -17426,12 +18816,12 @@ var STYLE_TERMS = [
17426
18816
  label: "Wabi-Sabi",
17427
18817
  provenance: {
17428
18818
  basis: "evidenced",
17429
- snapshot: SNAPSHOT9,
18819
+ snapshot: SNAPSHOT8,
17430
18820
  source: "an editorial image library (src-02)"
17431
18821
  },
17432
18822
  related: [
17433
18823
  { predicate: "evokes", target: "place.region.japanese" },
17434
- relatedTo13("style.rustic")
18824
+ relatedTo15("style.rustic")
17435
18825
  ],
17436
18826
  searchedWithout: [
17437
18827
  {
@@ -17508,7 +18898,7 @@ var searchedWithout = (query) => [
17508
18898
  }
17509
18899
  ];
17510
18900
  var ESTATE_POSITIONING = "brand-positioning vocabulary in a materials-retrieval system (src-05) and project budget bands in a project-materials database (src-07)";
17511
- var SNAPSHOT10 = "2026-08-22";
18901
+ var SNAPSHOT9 = "2026-08-22";
17512
18902
  var ADR3 = "@instruments/taxonomy ADR 0001, amended 22 August 2026";
17513
18903
  var TIER_MARKET_TERMS = [
17514
18904
  {
@@ -17517,7 +18907,7 @@ var TIER_MARKET_TERMS = [
17517
18907
  label: "Value",
17518
18908
  provenance: {
17519
18909
  basis: "evidenced",
17520
- snapshot: SNAPSHOT10,
18910
+ snapshot: SNAPSHOT9,
17521
18911
  source: ESTATE_POSITIONING
17522
18912
  },
17523
18913
  rank: 1,
@@ -17531,7 +18921,7 @@ var TIER_MARKET_TERMS = [
17531
18921
  label: "Mid-market",
17532
18922
  provenance: {
17533
18923
  basis: "evidenced",
17534
- snapshot: SNAPSHOT10,
18924
+ snapshot: SNAPSHOT9,
17535
18925
  source: ESTATE_POSITIONING
17536
18926
  },
17537
18927
  rank: 2,
@@ -17546,7 +18936,7 @@ var TIER_MARKET_TERMS = [
17546
18936
  note: "`upscale` is NOT recorded here as another name for this term, though the trade uses it that way, because `tier.chain-scale.upscale` is a different rung on a longer ladder. Letting the word resolve to both is how the two scales would quietly become one.",
17547
18937
  provenance: {
17548
18938
  basis: "evidenced",
17549
- snapshot: SNAPSHOT10,
18939
+ snapshot: SNAPSHOT9,
17550
18940
  source: ESTATE_POSITIONING
17551
18941
  },
17552
18942
  rank: 3,
@@ -17560,7 +18950,7 @@ var TIER_MARKET_TERMS = [
17560
18950
  note: "NOT `mood.luxurious`, and the distinction is the reason this axis exists. Mood says a space reads as expensive; tier says a thing sits at the top of its market. An Aman is this term and `mood.austere`; a gaudy budget hotel lobby is `mood.luxurious` and `tier.market.value`.",
17561
18951
  provenance: {
17562
18952
  basis: "evidenced",
17563
- snapshot: SNAPSHOT10,
18953
+ snapshot: SNAPSHOT9,
17564
18954
  source: ESTATE_POSITIONING
17565
18955
  },
17566
18956
  rank: 4,
@@ -17639,7 +19029,7 @@ var TIER_PRICE_BAND_TERMS = [
17639
19029
  label: symbols,
17640
19030
  provenance: {
17641
19031
  basis: "vendored",
17642
- snapshot: SNAPSHOT10,
19032
+ snapshot: SNAPSHOT9,
17643
19033
  source: "PRICE_TIERS in a materials-retrieval system (src-05)"
17644
19034
  },
17645
19035
  rank: index + 1,
@@ -18199,7 +19589,7 @@ var term11 = (slug, label, definition, extra = {}) => ({
18199
19589
  ...extra
18200
19590
  });
18201
19591
  var RECTANGLE = "unit-shape.rectangle";
18202
- var relatedTo14 = (...targets) => targets.map((target) => ({ predicate: "related-to", target }));
19592
+ var relatedTo16 = (...targets) => targets.map((target) => ({ predicate: "related-to", target }));
18203
19593
  var UNIT_SHAPE_TERMS = [
18204
19594
  {
18205
19595
  ...term11(
@@ -18221,7 +19611,7 @@ var UNIT_SHAPE_TERMS = [
18221
19611
  scheme: "uniclass"
18222
19612
  }
18223
19613
  ],
18224
- related: relatedTo14(RECTANGLE)
19614
+ related: relatedTo16(RECTANGLE)
18225
19615
  },
18226
19616
  {
18227
19617
  ...term11(
@@ -18318,7 +19708,7 @@ var UNIT_SHAPE_TERMS = [
18318
19708
  scheme: "wikidata"
18319
19709
  }
18320
19710
  ],
18321
- related: relatedTo14("unit-shape.circle"),
19711
+ related: relatedTo16("unit-shape.circle"),
18322
19712
  searchedWithout: [searchedUniclass3("Semicircle")]
18323
19713
  },
18324
19714
  {
@@ -18348,7 +19738,7 @@ var UNIT_SHAPE_TERMS = [
18348
19738
  scheme: "wikidata"
18349
19739
  }
18350
19740
  ],
18351
- related: relatedTo14("installation-layout.chantilly"),
19741
+ related: relatedTo16("installation-layout.chantilly"),
18352
19742
  searchedWithout: [searchedUniclass3("Rhombus")]
18353
19743
  },
18354
19744
  {
@@ -18365,7 +19755,7 @@ var UNIT_SHAPE_TERMS = [
18365
19755
  scheme: "wikidata"
18366
19756
  }
18367
19757
  ],
18368
- related: relatedTo14(RECTANGLE, "unit-shape.rhombus"),
19758
+ related: relatedTo16(RECTANGLE, "unit-shape.rhombus"),
18369
19759
  searchedWithout: [searchedUniclass3("Parallelogram")]
18370
19760
  },
18371
19761
  {
@@ -18378,7 +19768,7 @@ var UNIT_SHAPE_TERMS = [
18378
19768
  scheme: "wikidata"
18379
19769
  }
18380
19770
  ],
18381
- related: relatedTo14("installation-layout.hexagon-block"),
19771
+ related: relatedTo16("installation-layout.hexagon-block"),
18382
19772
  searchedWithout: [searchedUniclass3("Hexagon")]
18383
19773
  },
18384
19774
  {
@@ -18391,7 +19781,7 @@ var UNIT_SHAPE_TERMS = [
18391
19781
  scheme: "wikidata"
18392
19782
  }
18393
19783
  ],
18394
- related: relatedTo14("unit-shape.square"),
19784
+ related: relatedTo16("unit-shape.square"),
18395
19785
  searchedWithout: [searchedUniclass3("Octagon")]
18396
19786
  },
18397
19787
  {
@@ -18423,7 +19813,7 @@ var UNIT_SHAPE_TERMS = [
18423
19813
  }
18424
19814
  }
18425
19815
  ),
18426
- related: relatedTo14(RECTANGLE),
19816
+ related: relatedTo16(RECTANGLE),
18427
19817
  searchedWithout: [searchedUniclass3("picket tile shape")]
18428
19818
  },
18429
19819
  {
@@ -18432,7 +19822,7 @@ var UNIT_SHAPE_TERMS = [
18432
19822
  "Chevron unit",
18433
19823
  "One genuinely V-shaped or boomerang-shaped physical unit; never rectangular units mitred or arranged into a chevron layout."
18434
19824
  ),
18435
- related: relatedTo14("installation-layout.chevron"),
19825
+ related: relatedTo16("installation-layout.chevron"),
18436
19826
  searchedWithout: [searchedUniclass3("chevron shape")]
18437
19827
  },
18438
19828
  {
@@ -18450,7 +19840,7 @@ var UNIT_SHAPE_TERMS = [
18450
19840
  "A fan-like unit with one convex curved edge and a narrower opposing edge.",
18451
19841
  { altLabels: ["Fan"] }
18452
19842
  ),
18453
- related: relatedTo14("unit-shape.semicircle"),
19843
+ related: relatedTo16("unit-shape.semicircle"),
18454
19844
  searchedWithout: [searchedUniclass3("scallop shape")]
18455
19845
  },
18456
19846
  {
@@ -18459,7 +19849,7 @@ var UNIT_SHAPE_TERMS = [
18459
19849
  "Star",
18460
19850
  "A unit with multiple outward-pointing arms around a centre."
18461
19851
  ),
18462
- related: relatedTo14("unit-shape.cross"),
19852
+ related: relatedTo16("unit-shape.cross"),
18463
19853
  searchedWithout: [searchedUniclass3("star polygon")]
18464
19854
  },
18465
19855
  {
@@ -18476,7 +19866,7 @@ var UNIT_SHAPE_TERMS = [
18476
19866
  scheme: "wikidata"
18477
19867
  }
18478
19868
  ],
18479
- related: relatedTo14("installation-layout.chantilly"),
19869
+ related: relatedTo16("installation-layout.chantilly"),
18480
19870
  searchedWithout: [searchedUniclass3("cross shape")]
18481
19871
  },
18482
19872
  {
@@ -18493,7 +19883,7 @@ var UNIT_SHAPE_TERMS = [
18493
19883
  scheme: "uniclass"
18494
19884
  }
18495
19885
  ],
18496
- related: relatedTo14("installation-layout.irregular-field")
19886
+ related: relatedTo16("installation-layout.irregular-field")
18497
19887
  }
18498
19888
  ];
18499
19889
 
@@ -19651,6 +21041,7 @@ var AXES = [
19651
21041
  slug: "requirement",
19652
21042
  status: "authored"
19653
21043
  },
21044
+ ...BRIEF_AXES,
19654
21045
  {
19655
21046
  boundary: "Sector classifies whom the building serves; Typology classifies what the building is. A converted warehouse full of flats is sector residential and typology warehouse plus apartment. Sector moves when the tenant moves; typology does not.",
19656
21047
  facets: single("sector", "Sector", SECTOR_TERMS),
@@ -19716,16 +21107,8 @@ var AXES = [
19716
21107
  status: "authored"
19717
21108
  },
19718
21109
  {
19719
- boundary: "Three facets rather than one flat list, because a flat list cannot say warm green or faded blue. Temperature in particular is the most-welded-in property in the estate: warm minimalism had to be minted twice because no vocabulary could compose it.",
19720
- facets: [
19721
- { label: "Hue", slug: "hue", terms: PALETTE_HUE_TERMS },
19722
- {
19723
- label: "Temperature",
19724
- slug: "temperature",
19725
- terms: PALETTE_TEMPERATURE_TERMS
19726
- },
19727
- { label: "Character", slug: "character", terms: PALETTE_CHARACTER_TERMS }
19728
- ],
21110
+ boundary: "ColorScope owns colour; Taxonomy shows it and authors none. Palette lists ColorScope's families, temperature levels, basic tones and palette compositions under ColorScope's own URIs, so any term can relate to a colour. Named colours and paint colours are not terms here: they stay with ColorScope, reached through the phrase lexicon. Four facets rather than one flat list, because a flat list cannot say warm green or muted blue.",
21111
+ facets: PALETTE_AXIS_FACETS,
19729
21112
  label: "Palette",
19730
21113
  question: "What color is it?",
19731
21114
  slug: "palette",
@@ -19743,7 +21126,7 @@ var AXES = [
19743
21126
  status: "authored"
19744
21127
  },
19745
21128
  {
19746
- boundary: "Daylight is the natural light a space receives and the direction it comes from. Aspect is compass-literal and says nothing about the sun: which side is bright depends on the hemisphere, and that consequence is a separate claim on Light. It is not Palette, which is the color of what is in the room rather than the light falling on it; not Mood, where airy and moody are outcomes a scheme achieves rather than conditions a room has; not Element, which holds the windows, rooflights and luminaires themselves, and artificial lighting is never recorded here; and not Place, which says where a building stands rather than which way a room looks.",
21129
+ boundary: "Daylight is the natural light a space receives and the direction it comes from. Aspect is compass-literal and says nothing about the sun: which side is bright depends on the hemisphere, and that consequence is a separate claim on Light. It is not Palette, which is the color of what is in the room rather than the light falling on it; not Mood, where airy and moody are outcomes a scheme achieves rather than conditions a room has; not Element, which holds the windows, rooflights and luminaires themselves, and artificial lighting is never recorded here; not Time of day, which is the hour a scheme evokes; and not Place, which says where a building stands rather than which way a room looks.",
19747
21130
  facets: [
19748
21131
  {
19749
21132
  governance: TAX48_AUTHORED_GOVERNANCE,
@@ -19773,6 +21156,7 @@ var AXES = [
19773
21156
  slug: "season",
19774
21157
  status: "authored"
19775
21158
  },
21159
+ TIME_OF_DAY_AXIS,
19776
21160
  {
19777
21161
  boundary: "Tier is where a thing sits in a market; Mood is how a room reads. They come apart in both directions - an Aman is luxury tier and austere, a budget hotel lobby can be loudly luxurious - and welding them together loses both. It is also not a channel: trade-only says who may buy, not how much it costs.",
19778
21162
  facets: [
@@ -19861,7 +21245,7 @@ var resolveReference = (reference) => INDEX.byKey.get(canonicalKey(reference));
19861
21245
  // src/v1.ts
19862
21246
  var TAXONOMY_BASE_URI = "https://taxonomy.materialinstruments.com";
19863
21247
  var TAXONOMY_SNAPSHOT = "2026-10-02";
19864
- var TAXONOMY_VERSION = "2.5.0";
21248
+ var TAXONOMY_VERSION = "2.7.0";
19865
21249
  var PUBLISHED_V1_BASELINE = "2026-08-30";
19866
21250
  var TAX45_REVIEW_SNAPSHOT = "2026-08-31";
19867
21251
  var LIMESTONE_INTRODUCED = "2026-09-01";
@@ -19875,6 +21259,8 @@ var compareText = (left, right) => {
19875
21259
  }
19876
21260
  return 0;
19877
21261
  };
21262
+ var COLORSCOPE_BASE_URI = "https://colorscope.materialinstruments.com";
21263
+ var COLORSCOPE_CONCEPT_PREFIX = `${COLORSCOPE_BASE_URI}/id/`;
19878
21264
  var CANONICAL_SEGMENT = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u;
19879
21265
  var canonicalSegment = (segment) => {
19880
21266
  if (!CANONICAL_SEGMENT.test(segment)) {
@@ -19890,15 +21276,30 @@ var DEFAULT_PROVENANCE = {
19890
21276
  basis: "authored",
19891
21277
  source: "@instruments/taxonomy published corpus"
19892
21278
  };
19893
- var lifecycleFor = (term12) => {
19894
- const successor = term12?.supersededByReference === void 0 ? void 0 : resolveReference(term12.supersededByReference);
21279
+ var isTaxonomyConceptUri = (uri) => uri.startsWith(`${TAXONOMY_BASE_URI}/id/`);
21280
+ var isColorScopeConceptUri = (uri) => uri.startsWith(COLORSCOPE_CONCEPT_PREFIX);
21281
+ var isFullUri = (reference) => reference.startsWith("https://");
21282
+ var successorUri = (reference) => {
21283
+ if (reference === void 0) {
21284
+ return void 0;
21285
+ }
21286
+ if (isFullUri(reference)) {
21287
+ if (isTaxonomyConceptUri(reference) || isColorScopeConceptUri(reference)) {
21288
+ return reference;
21289
+ }
21290
+ throw new Error(`Unrecognised successor URI: "${reference}".`);
21291
+ }
21292
+ const successor = resolveReference(reference);
19895
21293
  const successorAxis = successor === void 0 ? void 0 : AXES.find((axis) => axis.slug === successor.axisSlug);
19896
- const supersededBy = successor === void 0 || successorAxis === void 0 ? void 0 : conceptUri(
21294
+ return successor === void 0 || successorAxis === void 0 ? void 0 : conceptUri(
19897
21295
  successor.axisSlug,
19898
21296
  successor.facetSlug,
19899
21297
  successor.termSlug,
19900
21298
  successorAxis.facets.length > 1 || successorAxis.facets[0]?.slug !== successorAxis.slug
19901
21299
  );
21300
+ };
21301
+ var lifecycleFor = (term12) => {
21302
+ const supersededBy = successorUri(term12?.supersededByReference);
19902
21303
  return {
19903
21304
  introducedAt: term12?.introducedAt ?? PUBLISHED_V1_BASELINE,
19904
21305
  reviewedAt: term12?.reviewedAt ?? term12?.introducedAt ?? PUBLISHED_V1_BASELINE,
@@ -19918,18 +21319,23 @@ var inversePredicate = {
19918
21319
  "suitable-for": "supported-by",
19919
21320
  "typically-in": "typically-contains"
19920
21321
  };
19921
- var isColorScopeTerm = (term12) => term12.canonicalAuthority?.authority === "colorscope";
21322
+ var colorScopeConceptUri = (uri) => {
21323
+ if (!isColorScopeConceptUri(uri)) {
21324
+ throw new Error(`Not a ColorScope concept URI: "${uri}".`);
21325
+ }
21326
+ return uri;
21327
+ };
19922
21328
  var governanceFor = (explanation, term12) => ({
19923
21329
  explanation,
19924
21330
  lifecycle: lifecycleFor(term12),
19925
21331
  provenance: term12?.provenance ?? DEFAULT_PROVENANCE,
19926
21332
  steward: "@instruments/taxonomy"
19927
21333
  });
19928
- var externalReferences = (mappings) => mappings?.map((mapping) => ({
19929
- authority: mapping.scheme,
19930
- identifier: mapping.identifier,
19931
- label: mapping.label,
19932
- match: mapping.match
21334
+ var externalReferences = (mappings) => mappings?.map((mapping2) => ({
21335
+ authority: mapping2.scheme,
21336
+ identifier: mapping2.identifier,
21337
+ label: mapping2.label,
21338
+ match: mapping2.match
19933
21339
  }));
19934
21340
  var governedEdge = (from, predicate, to, term12, assertion = "asserted", role) => {
19935
21341
  const governance = governanceFor(
@@ -19972,17 +21378,21 @@ var addTermNodes = (assembly, axis, axisUri) => {
19972
21378
  governedEdge(axisUri, "has-facet", facetUri, facet.governance, "inverse")
19973
21379
  );
19974
21380
  for (const [termOrder, term12] of facet.terms.entries()) {
19975
- if (isColorScopeTerm(term12)) {
19976
- continue;
19977
- }
19978
- const uri = conceptUri(axis.slug, facet.slug, term12.slug, faceted);
21381
+ const external = term12.canonicalAuthority;
21382
+ const uri = external === void 0 ? conceptUri(axis.slug, facet.slug, term12.slug, faceted) : colorScopeConceptUri(external.uri);
19979
21383
  const qualified = faceted ? `${axis.slug}.${facet.slug}.${term12.slug}` : `${axis.slug}.${term12.slug}`;
19980
21384
  assembly.conceptByQualifiedSlug.set(qualified, uri);
19981
21385
  assembly.conceptByAxisAndTerm.set(`${axis.slug}.${term12.slug}`, uri);
19982
- const governance = governanceFor(
21386
+ const governance = external === void 0 ? governanceFor(
19983
21387
  `Taxonomy governs the canonical identity and meaning of ${term12.label}.`,
19984
21388
  term12
19985
- );
21389
+ ) : {
21390
+ ...governanceFor(
21391
+ `ColorScope governs the identity and meaning of ${term12.label}. Taxonomy lists it so that any term can relate to it, and defines nothing about it.`,
21392
+ term12
21393
+ ),
21394
+ steward: "@materialinstruments/colorscope"
21395
+ };
19986
21396
  assembly.nodes.push({
19987
21397
  ...term12.altLabels === void 0 ? {} : { altLabels: term12.altLabels },
19988
21398
  axis: axisUri,
@@ -19990,7 +21400,8 @@ var addTermNodes = (assembly, axis, axisUri) => {
19990
21400
  ...term12.external === void 0 ? {} : { externalReferences: externalReferences(term12.external) },
19991
21401
  facet: facetUri,
19992
21402
  governance,
19993
- governedBy: "taxonomy",
21403
+ governedBy: external === void 0 ? "taxonomy" : "colorscope",
21404
+ ...term12.hex === void 0 ? {} : { hex: term12.hex },
19994
21405
  kind: "concept",
19995
21406
  label: term12.label,
19996
21407
  lifecycle: governance.lifecycle,
@@ -20118,13 +21529,25 @@ var KNOWLEDGE_GRAPH = buildKnowledgeGraph();
20118
21529
  var COLOR_FAMILY_REFERENCE_KIND = "color-family";
20119
21530
  var NAMED_COLOR_REFERENCE_KIND = "named-color";
20120
21531
  var COLOR_SCOPE_REFERENCE_KINDS = [
21532
+ "basic-tone",
20121
21533
  "chroma-level",
20122
21534
  COLOR_FAMILY_REFERENCE_KIND,
20123
21535
  "lightness-level",
21536
+ "modifier",
20124
21537
  NAMED_COLOR_REFERENCE_KIND,
20125
21538
  "palette-mood",
20126
21539
  "temperature-level"
20127
21540
  ];
21541
+ var COLORSCOPE_URI_KIND = {
21542
+ "basic-tone": "basic-tone",
21543
+ "chroma-level": "chroma",
21544
+ "color-family": "family",
21545
+ "lightness-level": "lightness",
21546
+ modifier: "modifier",
21547
+ "named-color": "color",
21548
+ "palette-mood": "palette",
21549
+ "temperature-level": "temperature"
21550
+ };
20128
21551
  var lexicalGovernance = (explanation, provenance, lifecycle = lifecycleFor()) => ({
20129
21552
  explanation,
20130
21553
  lifecycle,
@@ -20133,9 +21556,10 @@ var lexicalGovernance = (explanation, provenance, lifecycle = lifecycleFor()) =>
20133
21556
  });
20134
21557
  var colorScope = (identifier, referenceKind) => ({
20135
21558
  authority: "colorscope",
20136
- authorityUri: "https://colorscope.materialinstruments.com",
21559
+ authorityUri: COLORSCOPE_BASE_URI,
20137
21560
  identifier,
20138
- referenceKind
21561
+ referenceKind,
21562
+ uri: `${COLORSCOPE_CONCEPT_PREFIX}${COLORSCOPE_URI_KIND[referenceKind]}/${identifier}`
20139
21563
  });
20140
21564
  var WALNUT_MATERIAL = {
20141
21565
  authority: "taxonomy",
@@ -20200,7 +21624,7 @@ var TERRA_COTTA_LIFECYCLE = {
20200
21624
  reviewedAt: TERRA_COTTA_DATE,
20201
21625
  status: "active"
20202
21626
  };
20203
- var COLORSCOPE_INSTALLED = "@instruments/colorscope 9.4.0 data/reference/v1/taxonomy.json";
21627
+ var COLORSCOPE_INSTALLED = `@materialinstruments/colorscope ${COLORSCOPE_VERSION} data/reference/v1/taxonomy.json`;
20204
21628
  var reviewedTaxonomy = (path) => ({
20205
21629
  authority: "taxonomy",
20206
21630
  uri: `${TAXONOMY_BASE_URI}/id/${path}`
@@ -20306,7 +21730,96 @@ var crossoverTaxonomyAmbiguity = (phrase, meanings, explanation, source, snapsho
20306
21730
  };
20307
21731
  };
20308
21732
  var MG2620_LEXICAL_REVIEW_DATE = "2026-10-10";
21733
+ var COLOUR_REPOINT_LIFECYCLE = {
21734
+ introducedAt: PUBLISHED_V1_BASELINE,
21735
+ reviewedAt: COLOUR_LAYER_DATE,
21736
+ status: "active"
21737
+ };
21738
+ var colourWordProvenance = (identifier) => ({
21739
+ basis: "referenced",
21740
+ snapshot: COLOUR_LAYER_DATE,
21741
+ source: `${COLORSCOPE_INSTALLED} concept ${identifier}`
21742
+ });
21743
+ var capitalised = (phrase) => `${phrase.slice(0, 1).toUpperCase()}${phrase.slice(1)}`;
21744
+ var NAMED_COLOUR_WORDS = [
21745
+ "aqua",
21746
+ "blush",
21747
+ "carmine",
21748
+ "coal",
21749
+ "crimson",
21750
+ "greige",
21751
+ "ivory",
21752
+ "mauve",
21753
+ "mushroom",
21754
+ "mustard",
21755
+ "navy",
21756
+ "ochre",
21757
+ "off-white",
21758
+ "olive",
21759
+ "putty",
21760
+ "rose",
21761
+ "russet",
21762
+ "rust",
21763
+ "sage",
21764
+ "scarlet",
21765
+ "turquoise",
21766
+ "violet"
21767
+ ];
21768
+ var namedColourEntry = (phrase) => ({
21769
+ explanation: `${capitalised(phrase)} is a ColorScope named colour. Taxonomy hands the word to ColorScope, which owns the colour and the family it sits in.`,
21770
+ governance: lexicalGovernance(
21771
+ "ColorScope governs named colours and the family each belongs to; Taxonomy mints no node for one.",
21772
+ colourWordProvenance(phrase),
21773
+ COLOUR_REPOINT_LIFECYCLE
21774
+ ),
21775
+ outcome: "equivalent",
21776
+ phrase,
21777
+ target: colorScope(phrase, NAMED_COLOR_REFERENCE_KIND)
21778
+ });
21779
+ var INDIGO_ENTRY = {
21780
+ explanation: "Indigo names two ColorScope colours, Indigo Blue in the blue family and Indigo Violet in the purple family; the bare word does not settle which.",
21781
+ governance: lexicalGovernance(
21782
+ AMBIGUITY_GOVERNANCE,
21783
+ colourWordProvenance("indigo-blue and indigo-violet"),
21784
+ COLOUR_REPOINT_LIFECYCLE
21785
+ ),
21786
+ meanings: [
21787
+ colorScope("indigo-blue", NAMED_COLOR_REFERENCE_KIND),
21788
+ colorScope("indigo-violet", NAMED_COLOR_REFERENCE_KIND)
21789
+ ],
21790
+ outcome: "ambiguous",
21791
+ phrase: "indigo"
21792
+ };
21793
+ var washedEntry = (phrase) => ({
21794
+ explanation: `${capitalised(phrase)} is a wording of ColorScope's washed modifier: colour that has lost strength through age, light or wear. Taxonomy's former Faded term is deprecated in its favour.`,
21795
+ governance: lexicalGovernance(
21796
+ "ColorScope governs the washed modifier; the deprecated Taxonomy term it replaces keeps its published URI.",
21797
+ colourWordProvenance("washed"),
21798
+ COLOUR_REPOINT_LIFECYCLE
21799
+ ),
21800
+ outcome: "equivalent",
21801
+ phrase,
21802
+ target: colorScope("washed", "modifier")
21803
+ });
21804
+ var SATURATED_ENTRY = {
21805
+ explanation: "Saturated is a ColorScope chroma level. Taxonomy hands the word to ColorScope, which owns it.",
21806
+ governance: lexicalGovernance(
21807
+ "ColorScope governs its chroma levels; Taxonomy lists no node for one.",
21808
+ colourWordProvenance("saturated"),
21809
+ COLOUR_REPOINT_LIFECYCLE
21810
+ ),
21811
+ outcome: "equivalent",
21812
+ phrase: "saturated",
21813
+ target: colorScope("saturated", "chroma-level")
21814
+ };
21815
+ var COLOUR_PHRASE_ENTRIES = [
21816
+ ...NAMED_COLOUR_WORDS.map(namedColourEntry),
21817
+ INDIGO_ENTRY,
21818
+ ...["faded", "sun-bleached", "washed"].map(washedEntry),
21819
+ SATURATED_ENTRY
21820
+ ];
20309
21821
  var AUTHORED_PHRASE_ENTRIES = [
21822
+ ...COLOUR_PHRASE_ENTRIES,
20310
21823
  {
20311
21824
  explanation: "Matt is the British-English spelling of matte for surface sheen. Qualifiers such as semi-matt and full-matt retain their own meanings; this entry does not strip them.",
20312
21825
  governance: lexicalGovernance(
@@ -20376,20 +21889,6 @@ var AUTHORED_PHRASE_ENTRIES = [
20376
21889
  status: "active"
20377
21890
  }
20378
21891
  ),
20379
- {
20380
- explanation: "Blue is a ColorScope color-family meaning; Taxonomy references that authority rather than minting a rival color identity.",
20381
- governance: lexicalGovernance(
20382
- "The ColorScope family is the single governed meaning of the unqualified color word.",
20383
- {
20384
- basis: "vendored",
20385
- snapshot: PUBLISHED_V1_BASELINE,
20386
- source: "@instruments/colorscope COLOR_FAMILIES"
20387
- }
20388
- ),
20389
- outcome: "equivalent",
20390
- phrase: "blue",
20391
- target: colorScope("blue", COLOR_FAMILY_REFERENCE_KIND)
20392
- },
20393
21892
  crossoverAmbiguity(
20394
21893
  "alabaster",
20395
21894
  `${TAXONOMY_BASE_URI}/id/material/alabaster`,
@@ -21252,10 +22751,43 @@ var lexicalPhrases = (term12) => [term12.slug, term12.label, ...term12.altLabels
21252
22751
  (phrase, index, phrases) => phrase.length > 0 && phrases.indexOf(phrase) === index
21253
22752
  );
21254
22753
  var targetKey = (target) => target.authority === "taxonomy" ? `taxonomy:${target.uri}` : `colorscope:${target.referenceKind}:${target.identifier}`;
21255
- var inferredLifecycle = (meanings) => {
22754
+ var PHRASES_RESOLVED_BEFORE_COLOUR_NODES = /* @__PURE__ */ new Set([
22755
+ "beige",
22756
+ "black",
22757
+ "blue",
22758
+ "brown",
22759
+ "colorful",
22760
+ "cool",
22761
+ "cream",
22762
+ "dark",
22763
+ "gray",
22764
+ "green",
22765
+ "grey",
22766
+ "light",
22767
+ "mid",
22768
+ "medium",
22769
+ "monochrome",
22770
+ "muted",
22771
+ "neutral",
22772
+ "orange",
22773
+ "pink",
22774
+ "polychrome",
22775
+ "purple",
22776
+ "red",
22777
+ "taupe",
22778
+ "teal",
22779
+ "vibrant",
22780
+ "warm",
22781
+ "white",
22782
+ "yellow"
22783
+ ]);
22784
+ var inferredLifecycle = (meanings, phrase) => {
21256
22785
  const terms = meanings.flatMap((meaning) => meaning.terms);
21257
22786
  const lifecycles = terms.map((term12) => lifecycleFor(term12));
21258
- const [introducedAt] = terms.map((term12) => term12.introducedAt ?? PUBLISHED_V1_BASELINE).toSorted(compareText);
22787
+ const [introducedAt] = [
22788
+ ...terms.map((term12) => term12.introducedAt ?? PUBLISHED_V1_BASELINE),
22789
+ ...PHRASES_RESOLVED_BEFORE_COLOUR_NODES.has(phrase) ? [PUBLISHED_V1_BASELINE] : []
22790
+ ].toSorted(compareText);
21259
22791
  const reviewedAt = terms.map(
21260
22792
  (term12) => term12.reviewedAt ?? term12.introducedAt ?? PUBLISHED_V1_BASELINE
21261
22793
  ).toSorted(compareText).at(-1);
@@ -21304,7 +22836,7 @@ var inferredLexicalEntries = () => {
21304
22836
  if (first === void 0) {
21305
22837
  throw new Error(`Lexical phrase "${phrase}" has no meaning.`);
21306
22838
  }
21307
- const lifecycle = inferredLifecycle(meanings);
22839
+ const lifecycle = inferredLifecycle(meanings, phrase);
21308
22840
  if (second === void 0) {
21309
22841
  return {
21310
22842
  explanation: `The published spelling \u201C${phrase}\u201D has one governed meaning.`,
@@ -21512,6 +23044,7 @@ var ASSESSMENT_POLICY_REVISION = `sha256:${createHash2("sha256").update(
21512
23044
  export {
21513
23045
  ASSESSMENT_AUTHORITY_REFERENCES,
21514
23046
  ASSESSMENT_POLICY_REVISION,
23047
+ COLORSCOPE_BASE_URI,
21515
23048
  COLOR_SCOPE_REFERENCE_KINDS,
21516
23049
  CONCEPT_ASSESSMENT_POLICIES,
21517
23050
  KNOWLEDGE_GRAPH,