A small conceptual model
Few primitives, strictly named—so packages, MCP tools, skills exports, and judges can evolve without renaming the world every quarter.
Primary objects
- Taste package
- Distribution unit of the registry: metadata (package.json), constitution, media exemplars, optional context/skills, tool sequences, evals, and provenance. Git-friendly directory; network registry indexes the same shape.
- TasteProfile
- Runtime record derived from a package (or ad-hoc encode): identity, constitution, vibes and anti-vibes, exemplars and anti-exemplars, constraints, domains, metadata. The object score and transfer consume.
- Exemplar
- A concrete artifact (or precise description thereof) that defines the interior of “good” for this standard. Weight allows soft prioritization without turning the set into a single average.
- Anti-exemplar
- A concrete failure mode the standard refuses. Often more informative than another positive reference. Updated as the culture’s failure modes shift (today: empty futurism, AI gloss, urgency theater).
- Constitution
- Short natural-language law of the profile. Must be usable as a critical instrument: a reader should be able to reject work by citing it.
- Candidate
- Anything offered for ruling: copy, layout note, name, image reference, paragraph, product surface. Kind is declared; domain may be declared.
- TasteScore
- Fit in [0, 1], a qualitative verdict, an explanation, a numeric breakdown, and lists of matched vibes / violated anti-vibes. Reasons are mandatory, even when weak.
- TransferResult
- Guidance for applying a profile in a target domain: do / don’t, sample prompts, and a short statement of what is preserved versus translated.
Operations
Four verbs cover the interface. Implementations may be heuristic, embedding-based, learned, or human-in-the-loop. Callers should not need to know which.
| Operation | Input | Output | Invariant |
|---|---|---|---|
| encode | Vibes, exemplars, prose, constraints | TasteProfile | Deterministic schema; constitution non-empty after encode |
| score | Profile + candidate | TasteScore | Score ∈ [0,1]; explanation present; profile id retained in audit logs (callers) |
| transfer | Profile + target domain (+ optional brief) | TransferResult | Preserves constitution intent; re-expresses medium-specific tactics |
| compose | Profiles + blend policy | New profile (future) | Lineage cited; conflicts made explicit |
| search / get | Query · package id | Package metadata · assets | Registry discovery; MCP taste_search / taste_get |
| retrieve | Package + concept query | Exemplars / anti-exemplars | Few-shot context for agents |
Encode, score, and transfer run today. Search, get, retrieve, compose, MCP, and skill export are specified for the open-source roadmap—see Registry.
Lifecycle of a standard
-
1
Elicit
Collect exemplars under time pressure; force anti-exemplars; draft a constitution that could reject last quarter’s work.
-
2
Encode
Produce a profile. Prefer fewer sharp references to a large soft cloud. Record domains of competence.
-
3
Rule
Score real candidates in the wild. Keep a reject pile. Where the profile and the human disagree, update one of them deliberately.
-
4
Transfer
Stress-test the standard in a new medium. If transfer collapses into adjectives, the profile is under-specified.
-
5
Revise
Version bump. Diff constitutions. Retire anti-exemplars that no longer teach; add the new local failure mode.
Evaluation
A taste system is not true by introspection. It is good if high scores predict human acceptance under the same standard, and if disagreements are legible. Suggested evals for any implementation:
Agreement
Blind pairwise tests: does the scorer rank as the profile’s author would, on held-out candidates?
Calibration
Are 0.8s rare and meaningful, or is everything “promising”? Distributions should have shape.
Transfer fidelity
After transfer guidance is applied by a third party, does the author still recognize the standard?
Adversarial anti-exemplars
Can the system still reject today’s slop dialects, or has it overfit last year’s?
HTTP surface (this scaffold)
| Method | Path | Purpose |
|---|---|---|
| POST | /api/encode | Build a profile |
| POST | /api/score | Score candidate against profile |
| POST | /api/transfer | Domain transfer guidance |
| GET | /api/samples/profile | Reference profile |
| GET | /docs | OpenAPI |
pip install -e . python -m taste_api encode -n "House standard" -v "editorial restraint" -a "AI gloss" -o profile.json python -m taste_api score profile.json draft.txt python -m taste_api transfer profile.json research-ui python -m taste_api serve
On compression
The permanent risk is over-compression: turning a living standard into a bland embedding mean. Mitigations built into the model: explicit anti-exemplars, weighted exemplars, hard constraints, natural-language constitutions, and versioned human override. The representation should remain readable by a careful stranger. If only the model understands the profile, the profile has failed socially even if it scores well.