Whose Culture Is the Classifier Judging?
A single fixed threshold, measured against real output, fired on 4.3% of artefacts at one setting and 48.1% at another. The rule hadn't changed. The culture had. This page is about the fix, and about a tag the fix retired entirely.
The failure, measured
Every threshold in data/classification.ts started as an absolute constant: a wall thickness, a decoration count, a size band. Durability testing measured how those constants behaved across the range of cultures the generator can actually produce, and the applied-element rule (the one that awards elite) fired on 4.3% of output at decorativeEmphasis 0.1 and 48.1% at 1.0. A near-identical craft-specialisation rule went from 2.3% to 74.5% across the same range.
The consequence isn't a rounding error. It means elite reported one culture's aesthetics rather than any real distinction inside it: a decorative culture read as composed almost entirely of elites, an austere one as having none. That's a violation of Simulation Honesty (doc 02): a tag is supposed to say something true about the object's standing in its own world, and this one was quietly saying something about how the generator's decoration dial happened to be set.
The fix: cut by what a tag awards, not by what its condition reads
Doc 11 §2.9 draws the boundary on the award side. An artefact's physical affordances are objective: an edge cuts, a heavy object is heavy, a pedestal base is a pedestal base, and these read the same in any culture. Standing is a social judgement, and a social judgement means nothing without knowing what that culture treats as ordinary.
The membership test the ruling states directly: could a scholar from any culture, shown only the object, reach this tag from its physical affordances alone? If yes, the tag is absolute. If the tag instead asserts something about the artefact's standing among its culture's own output, it's relative, and gets scored against a baseline sampled from the producing culture, not a constant.
| Vocabulary | Count | Members |
|---|---|---|
AbsoluteTag | 10 | weapon, tool, container, fastener, ornament, domestic, agricultural, maritime, trade-good, currency |
RelativeTag | 11 | personal, communal, elite, utilitarian, ceremonial, everyday, military, artisanal, ritual, votive, funerary |
All 43 shipped rules score into this vocabulary; 34 of them award at least one relative tag, only 9 award purely absolute ones. That split is wider than decoration alone touches, because the boundary runs through some genuinely surprising places.
The surprising inclusions
A cut made on the rule's condition would have kept several rules absolute that the tag-side cut correctly moves to relative. The thin-walled container rule reads wallThickness, a purely physical measurement, and awards elite, a standing claim. Its sibling, the thick-walled rule, reads the same axis and awards utilitarian, equally relative, for the same reason: leaving one absolute and the other relative on an identical feature would reintroduce the exact incoherence the ruling exists to remove.
ornament stays absolute despite sitting right next to this problem: it's awarded on morphology (isWearable, perforation, ringGap), never on decorative volume. “Is a wearable thing” is a fact; “is a lavish wearable thing” is elite, and that's exactly the sentence that moves a tag from one vocabulary to the other.
ritual, votive and funerary read like purposes rather than registers, and it would be reasonable to expect them absolute. They're relative: each is an inference from morphology or decorative excess about intent, and what counts as elaborated beyond ordinary use, or as a burial deposit rather than a storage vessel, is a per-culture question. The objective deposition fact stays on a separate axis entirely (DepositionType, doc 05 §3.5); these three tags are the interpretive layer sitting above it.
Baselines are sampled, not calculated
A relative tag needs to know what a culture's ordinary output looks like, and that answer comes from running the actual generator, not from an analytic formula. A calibration pass runs stages 1–7 for each culture-phase, collects the raw feature distribution, and derives percentile baselines cached in world state. The sample size is 400 artefacts per culture-phase, and that number is measured rather than assumed: a percentile is noisier than the proportion a fire-rate measurement needs, and five reseeded runs found the worst-case spread was 20–28% at n=100, 8–17% at n=400, 0–6% at n=800 with no further gain above that. 400 is the point past which more sampling stops buying accuracy.
The alternative, a closed-form estimate of what a culture's output should look like, was rejected because it drifts silently the moment the decoration generator changes underneath it. A sampled baseline is always accurate to the generator that actually exists, and determinism still holds: the same world seed reproduces the same baselines every time.
The tag that didn't survive
MaterialTag faced the same problem from the material side, and its fix was more drastic: precious-metal and precious-stone are retired from the vocabulary entirely, not relativised. The test the ruling applies to any candidate member is whether two cultures looking at the same material would agree on it. metal passes that test in every culture. precious-metal doesn't: a static tag stamped Earth's judgement about gold onto every generated culture regardless of whether that culture's world had abundant gold or none, while genuinely scarce obsidian in a culture with no volcanic geology read as merely ordinary.
Everything the retired tags were doing turned out to be modelled elsewhere already. Gilding's real requirement is physical, workability plus resistance to tarnish, and metallurgy && formability ≥ 5 && oxidisation ≤ 3 reproduces the old tag's candidate pool exactly: gold and silver pass, bronze and iron fail on oxidisation. Scarcity itself lives in the geological availability model, and a specific material's reachability lives in trade-flow data. Nothing the tag did was lost; the tag was simply redundant with mechanisms that already existed and modelled the same fact more honestly.
The retirement did cost something, and there is now a ruling on how to repay it. Keying material affinities by tag alone meant a culture could say it prized metal in general but not that it specifically prized gold; one authored culture lost a real preference that way, because restating it as a preference for metal would have newly favoured the bronze and iron that culture was never meant to favour. The ruling re-keys affinities by a tagged union accepting either a class or a single named material, resolved most-specific-wins: metal: 1.5 alongside gold: 0.8 would read as “all metals are 1.5, except gold, which is 0.8”. A specific entry can lower as well as raise, and one written without any class entry is well-formed, which is what recovers the dropped preference exactly. The type is still tag-keyed in the code; this is a decided contract awaiting implementation, not a description of what runs today.
This is the boundary the retirement was always drawing, now visible from both sides. precious-metal was struck because it stamped one world's judgement onto every culture as a fact about the material itself. { id: 'gold' }: 1.2 makes a claim about the culture doing the prizing, which is exactly the kind of thing a cultural profile exists to hold.
docs/11-deferred-design-questions.md §2.9 · Types: src/lib/types/tags.ts (ABSOLUTE_TAGS, RELATIVE_TAGS, MaterialTag) · Rules: src/lib/data/classification.ts