@instruments/taxonomy 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,6 @@
1
1
  import { MaterialFamily, Sector, Application } from '../index.js';
2
+ import '../match-BDI6Evro.js';
3
+ import '../taste.js';
2
4
 
3
5
  declare const MIU_MATERIAL_FAMILIES: readonly ["wood", "wood_veneer", "engineered_wood", "bamboo", "cork", "natural_stone", "terrazzo", "ceramic_porcelain", "glass", "metal", "concrete", "plaster", "clay", "brick", "paint_coating", "wallcovering", "laminate", "solid_surface", "mineral_composite", "resin", "linoleum", "vinyl", "rubber", "carpet", "rug", "textile", "leather", "acoustic_felt", "acoustic_composite", "recycled_composite", "paper_cardboard", "biobased_composite", "greenery_planting", "lighting", "hardware", "digital_media", "water_feature", "mixed_material", "color_palette_only", "unknown"];
4
6
  type MiuMaterialFamily = (typeof MIU_MATERIAL_FAMILIES)[number];
@@ -0,0 +1,233 @@
1
+ import { C as CanonicalAlternatives } from '../match-BDI6Evro.js';
2
+
3
+ declare const DECOMPOSITION: readonly Row[];
4
+
5
+ type Verdict =
6
+ /** Maps faithfully onto one or more canonical terms. Nothing is lost. */
7
+ "decomposed"
8
+ /** Decomposes, but the compound carries meaning the parts do not. Needs an anchor as well. */
9
+ | "lossy"
10
+ /** The canon can express both readings; the source cannot be safely mapped to one. Declines. */
11
+ | "ambiguous"
12
+ /** A real term, but answering a question outside the interiors aesthetic axes. */
13
+ | "out-of-axis"
14
+ /** Resists decomposition. Must be carried as an anchor, not a concept. */
15
+ | "residue";
16
+ /** Why an `out-of-axis` term is out of axis. */
17
+ type OutOfAxisReason =
18
+ /** Describes a material, not a room. Belongs on the material half of the canon. */
19
+ "material-property"
20
+ /** A query-router marker with no descriptive content at all. */
21
+ | "query-marker"
22
+ /** Answers an axis that already exists here (sector, space, typology). */
23
+ | "other-canonical-axis"
24
+ /** A real question no axis here answers yet, and the gap is declared rather than absorbed. */
25
+ | "axis-not-authored";
26
+ interface Row {
27
+ /** The vocabulary id from `./sources.ts`. */
28
+ source: string;
29
+ /** The source term, verbatim. */
30
+ term: string;
31
+ verdict: Verdict;
32
+ /** Canonical targets asserted together. `evokes(...)` marks a relation rather than a term. */
33
+ onto: readonly string[];
34
+ /** Typed disjunction when the source is known to mean one of several bundles but cannot say which. */
35
+ alternatives?: CanonicalAlternatives;
36
+ /** Canonical terms that had to be minted on an EXISTING axis to hold this source term. */
37
+ mintedTerm?: readonly string[];
38
+ /** Canonical terms that only exist because a WHOLE AXIS had to be created. */
39
+ mintedAxis?: readonly string[];
40
+ reason?: OutOfAxisReason;
41
+ note?: string;
42
+ }
43
+
44
+ declare const ESTATE_REPOS: readonly ["materia", "architizer", "designround", "designshop", "materialgraph", "samplize"];
45
+ type EstateRepo = (typeof ESTATE_REPOS)[number];
46
+ interface ConceptCell {
47
+ source: string;
48
+ repo: EstateRepo;
49
+ /** The source's own spelling, verbatim. This is the thing the page exists to show. */
50
+ term: string;
51
+ row: Row;
52
+ }
53
+ interface Concept {
54
+ /** The canonical head term, fully qualified. `evokes(...)` wrappers are stripped. */
55
+ canonical: string;
56
+ /** True when the canon reaches this concept by a relation rather than by assertion. */
57
+ viaEvokes: boolean;
58
+ /** Distinct repositories carrying a term that heads here. The row's sort key. */
59
+ reach: number;
60
+ /**
61
+ * How many repositories could plausibly have reached this concept: those carrying any vocabulary
62
+ * on the same axis.
63
+ *
64
+ * NOT the repository count, and the difference started mattering the moment samplize joined the
65
+ * census. Samplize's vocabulary is colour and nothing else, so it can never reach `style.rustic`
66
+ * and counting it against that row would report a disagreement where there is only a different
67
+ * subject. Six repositories, but only five of them have anything to say about style, and only
68
+ * three about colour.
69
+ */
70
+ couldReach: number;
71
+ cells: readonly ConceptCell[];
72
+ /** Rows whose crosswalk declines, and rows carried as anchors. The page marks both. */
73
+ declines: number;
74
+ anchors: number;
75
+ /**
76
+ * How many distinct WORDINGS the sources use, after folding case and separators.
77
+ *
78
+ * The number that says whether a row is a real disagreement. `reach` of 5 with one wording means
79
+ * five repositories writing the same word five ways, which a crosswalk fixes trivially. `reach`
80
+ * of 5 with five wordings means five different ideas about what to call the thing, which it does
81
+ * not. Measured across the whole corpus, only one of the twenty shared concepts is spelling-only,
82
+ * so casing turns out to be a rounding error rather than the story - but a reader looking at
83
+ * `rustic / Rustic / Rustic & Artisan` cannot tell that without being told.
84
+ */
85
+ wordings: number;
86
+ }
87
+ declare const concepts: () => readonly Concept[];
88
+ /** One axis's worth of the matrix: its concepts, and only the repositories that speak about it. */
89
+ interface AxisDisagreement {
90
+ axis: string;
91
+ concepts: readonly Concept[];
92
+ repos: readonly EstateRepo[];
93
+ /** Concepts on this axis that more than one repository reaches. */
94
+ shared: number;
95
+ }
96
+ /**
97
+ * The disagreement matrix, split one table per axis.
98
+ *
99
+ * ONE TABLE MIXING AXES IS SPARSE BY CONSTRUCTION, and the sparseness is not a finding. Each
100
+ * repository speaks about some axes and not others: samplize's vocabulary is colour and nothing
101
+ * else, so against every style concept it is a column of dashes. Rendered as one table that reads
102
+ * as six repositories disagreeing when it is really six repositories talking about different
103
+ * subjects, and it costs enough width to break the canonical identifiers across three lines.
104
+ *
105
+ * Split by axis, every table is dense and each makes its own point. Style is the argument, at five
106
+ * repositories and twenty-three concepts. Place is the sharpest, because every repository reaches
107
+ * it and every concept on it is shared - which is the axis the design review said was the gap.
108
+ *
109
+ * An axis is only worth a table if more than one repository speaks about it and there is more than
110
+ * a handful to show; the rest are reported as a count rather than drawn.
111
+ */
112
+ declare const disagreementsByAxis: ({ minConcepts, }?: {
113
+ minConcepts?: number;
114
+ }) => readonly AxisDisagreement[];
115
+ /** The dictionaries as columns, in the order the matrix renders them. */
116
+ declare const MATRIX_COLUMNS: readonly {
117
+ id: string;
118
+ repo: EstateRepo;
119
+ label: string;
120
+ }[];
121
+ /** The headline the disagreement page opens with, computed rather than asserted. */
122
+ declare const agreementSummary: () => {
123
+ concepts: number;
124
+ reachedByAll: number;
125
+ reachedByFourOrMore: number;
126
+ distinctSpellings: number;
127
+ exactStringMatchesAcrossRepos: number;
128
+ /** Concepts more than one repository reaches. */
129
+ shared: number;
130
+ /** Repositories in the census. Not every one speaks about every axis. */
131
+ repos: number;
132
+ /** Of those, the ones where every source uses the same word and differs only in spelling. */
133
+ spellingOnly: number;
134
+ };
135
+ /**
136
+ * The share of the DesignShop corpus the two ambiguous style values account for, as a percentage.
137
+ *
138
+ * A SHARE AND NOT A COUNT, and the distinction is the whole reason this function exists rather than
139
+ * a consumer reading `DESIGNSHOP_SCHEME_STYLE_COUNTS` directly. The underlying figures are a third
140
+ * party's catalogue volumes and are not ours to publish. The claim anything downstream actually
141
+ * needs is that `Modern` and `Contemporary` sit at comparable volume and together account for a
142
+ * large slice of the corpus - which a percentage carries exactly as well and a count carries no
143
+ * better.
144
+ *
145
+ * Exported so no page has to hand-type the number. A figure typed by hand is a figure that drifts
146
+ * from its data, and one derived from counts nobody may publish is the same disclosure a layer
147
+ * down.
148
+ */
149
+ declare const ambiguousStyleShare: () => number;
150
+
151
+ interface ResidueReport {
152
+ /** Every term across all seven estate vocabularies. */
153
+ total: number;
154
+ /** Terms that were never aesthetic vocabulary: query markers and material properties. */
155
+ excluded: number;
156
+ /** The denominator the headline is quoted against. */
157
+ aesthetic: number;
158
+ decomposed: number;
159
+ lossy: number;
160
+ ambiguous: number;
161
+ /** Terms that resist decomposition entirely and can only be carried as anchors. */
162
+ residue: number;
163
+ outOfAxis: number;
164
+ /** `decomposed` as a share of `aesthetic`. TAX-14's threshold was 80 per cent. */
165
+ cleanRate: number;
166
+ /**
167
+ * The circularity guard. The axes here were authored after reading these terms, so the headline
168
+ * rate is partly fitted to its own inputs. This is the share that decomposes onto canon that
169
+ * existed BEFORE the test - vendored from materialgraph, colorscope and architizer, or already
170
+ * published in this package. It is the floor the design would have reached with no new authoring
171
+ * at all, and it is the number to argue with.
172
+ */
173
+ preExistingRate: number;
174
+ preExisting: number;
175
+ /** Source terms that needed a term minted on an axis that already existed. */
176
+ neededMintedTerm: number;
177
+ /** Source terms that needed a whole axis that did not exist. */
178
+ neededMintedAxis: number;
179
+ }
180
+ declare const residueReport: () => ResidueReport;
181
+ declare const mintingDemand: () => {
182
+ onExistingAxes: readonly (readonly [string, number])[];
183
+ onNewAxes: readonly (readonly [string, number])[];
184
+ };
185
+ /** Per-source decomposition rate, over the aesthetic subset. */
186
+ declare const rateBySource: () => readonly {
187
+ source: string;
188
+ decomposed: number;
189
+ terms: number;
190
+ }[];
191
+ /** Every row the canon could not take cleanly. The site publishes this list in full. */
192
+ declare const unresolved: () => readonly Row[];
193
+ /** Real questions the estate asks that no axis here answers yet. Declared, never absorbed. */
194
+ declare const declaredGaps: () => readonly Row[];
195
+
196
+ type VocabularyKind =
197
+ /** A closed enum a writer must choose from. */
198
+ "enum"
199
+ /** A keyword set matched against free text. */
200
+ | "keyword-set"
201
+ /** Free-text prose used as an embedding anchor; the label is a handle, not a value. */
202
+ | "embedding-anchor"
203
+ /** Uncontrolled free text captured from a third party's index. */
204
+ | "captured-free-text";
205
+ interface EstateVocabulary {
206
+ id: string;
207
+ name: string;
208
+ repo: string;
209
+ file: string;
210
+ snapshot: string;
211
+ kind: VocabularyKind;
212
+ /** What question the vocabulary was built to answer, in the authors' own framing. */
213
+ purpose: string;
214
+ terms: readonly string[];
215
+ }
216
+ declare const MATERIA_SCENE_MOOD: EstateVocabulary;
217
+ declare const MATERIA_INTENT_KEYWORDS: EstateVocabulary;
218
+ declare const ARCHITIZER_STYLES: EstateVocabulary;
219
+ declare const DESIGNROUND_STYLE_ANCHORS: EstateVocabulary;
220
+ declare const DESIGNSHOP_SCHEME_STYLES: EstateVocabulary;
221
+ /**
222
+ * Scheme counts over the 1,922 schemes carrying at least one product. Bands, not counts, are what
223
+ * gets published (see `Term.usage`); the raw figures live here because the decomposition test has
224
+ * to weight by usage and cannot do that from a band.
225
+ */
226
+ declare const DESIGNSHOP_SCHEME_STYLE_COUNTS: Readonly<Record<string, number>>;
227
+ declare const DESIGNSHOP_PRODUCT_STYLES: EstateVocabulary;
228
+ declare const MATERIALGRAPH_MS_STYLE: EstateVocabulary;
229
+ declare const MATERIALGRAPH_MS_MOOD: EstateVocabulary;
230
+ declare const MATERIALGRAPH_MS_CHARACTER: EstateVocabulary;
231
+ declare const ESTATE_VOCABULARIES: readonly EstateVocabulary[];
232
+
233
+ export { ARCHITIZER_STYLES, type AxisDisagreement, type Concept, type ConceptCell, DECOMPOSITION, DESIGNROUND_STYLE_ANCHORS, DESIGNSHOP_PRODUCT_STYLES, DESIGNSHOP_SCHEME_STYLES, DESIGNSHOP_SCHEME_STYLE_COUNTS, ESTATE_REPOS, ESTATE_VOCABULARIES, type EstateRepo, type EstateVocabulary, MATERIALGRAPH_MS_CHARACTER, MATERIALGRAPH_MS_MOOD, MATERIALGRAPH_MS_STYLE, MATERIA_INTENT_KEYWORDS, MATERIA_SCENE_MOOD, MATRIX_COLUMNS, type OutOfAxisReason, type ResidueReport, type Row, type Verdict, type VocabularyKind, agreementSummary, ambiguousStyleShare, concepts, declaredGaps, disagreementsByAxis, mintingDemand, rateBySource, residueReport, unresolved };