Intent Palettes
From “I Know It When I See It” to Programming with Learned Semantic Primitives
An origin story, related research, and an exploratory specification.
Collaboration note: I developed this article collaboratively with GPT, using it as a research and writing partner. The argument and final editorial decisions are my own. If you want to save some reading see the simplified version here ELI5.
This is not a claim of inventing a new field.
It is a record of a line of thought.
Intent Palettes began as a discussion about helping ordinary people communicate design preferences to AI systems. They subsequently became a way of constraining the solution spaces explored by agents. Then they began to resemble domain grammars. Finally, encountering TypeSafe’s Jev suggested that the semantic distinctions defined by a palette might themselves become directly computable by learned primitives.
At that point the original interface idea had unexpectedly arrived in the neighbourhood of neurosymbolic programming, concept-based machine learning, probabilistic logic and domain-specific languages.
Much of that territory has been explored before.
What follows records how I got there, what appears to exist already, and the current form of the hypothesis.
Part I — Where Intent Palettes Came From
1. “I know it when I see it”
The starting problem was mundane.
People frequently know what they want when they see it while lacking the specialist vocabulary necessary to describe it.
The discussion arose from Ben Tossell’s Design Words idea.
Rather than expecting someone to know terms such as:
neo-grotesk
hard side lighting
high information density
editorial serif
slow spring easing
show them alternatives.
The interaction becomes:
show concrete alternatives
↓
human recognises what they prefer
↓
human selects / combines / adjusts
↓
system attaches semantic descriptions
↓
structured specification
↓
agent builds the result
The important observation was:
When humans possess perceptual judgment but lack domain vocabulary, let them specify intent by manipulating examples and compile their choices into an explicit semantic representation for the agent.
The problem was not really prompting.
It was turning tacit human judgement into machine-operable specification.
2. Why the name “Intent Palette”?
Several possible names were considered.
“Preference elicitation interface” was technically accurate but sounded like a survey.
“Example-based specification” described the mechanism.
“Visual specification” was too narrow because the same interaction could apply to sound, movement, typography, haptics, 3D form and many other things.
“Perceptual specification” seemed useful for the general process:
an interface where a person specifies intent by recognising, selecting, comparing and composing perceptible alternatives.
But the object itself needed a name.
The analogy that worked was a colour palette.
A colour palette presents meaningful things that can be selected and combined.
An Intent Palette would contain selectable pieces of intent:
lighting [A B C D]
composition [A B C D]
texture [A B C D]
motion [A B C D]
Hence the name:
Intent Palette — a palette whose selectable units are pieces of intent.
The interface through which they were assembled could be an Intent Composer.
That origin remains useful because the word palette still carries something important that terms such as ontology, schema or DSL do not.
A palette implies a bounded but composable space of meaningful alternatives.
3. The first abstraction: compile intent
The next step was to realise that the result should not merely be turned into a better prose prompt.
Instead:
human examples / selections
↓
structured intent representation
↓
compiler
↙ ↓ ↘
prompt API tool parameters
The person is expressing intent in a representation convenient for humans.
The system compiles it into a representation convenient for whatever executes it.
That mattered because it stopped the idea being tied to prompting.
A person’s design choice could remain stable while the executor changed from:
LLM
→ image generator
→ Figma agent
→ web coding agent
→ some future system
The human interface had become an abstraction boundary between intent and implementation.
4. From one palette to a Palette Factory
The next change was to stop thinking about creating a new interface for every task.
Palettes could themselves become reusable knowledge artifacts.
That produced:
Palette Factory
↓
Palette Library
↓
Spec Composer
↓
Build Agents
↓
artifact
A mature palette entry might contain:
perceptual examples
semantic identity
applicability
trade-offs
constraints
incompatibilities
executable implementation
verification
A typography choice, for example, would not merely be a picture of some type.
It might encode:
identity:
editorial-serif
appropriate-for:
long-form
magazines
premium publishing
avoid:
dense operational dashboards
implementation:
font family
line height
tracking
Now the human sees the specimen.
The agent sees meaning and constraints.
The renderer sees implementation.
The palette is no longer just a preset collection. It has become a small piece of domain knowledge.
5. The second major shift: palettes for agents
Initially palettes existed because humans lacked vocabulary.
Then the complementary problem became obvious.
Agents possess too much possible vocabulary.
Tell a generative model:
Make this website look good.
and it has an enormous solution space.
Instead I can provide:
available layout vocabulary
available typography vocabulary
available spacing vocabulary
available motion vocabulary
The Intent Palette now serves a second function.
For humans:
“I know it when I see it.”
For agents:
“Here is the space of solutions worth considering.”
The palette becomes a bounded design search space with meaningful alternatives.
This connected the idea to a separate observation about AI-generated software: unconstrained generation tends toward statistically average solutions. Better results can come from first identifying legitimate solution families, their trade-offs and the constraints of the actual problem, then allowing the model to work inside that reduced space.
The palette therefore became not merely a communication device but a prior over useful solutions.
6. Beyond visual design
Once understood that way, nothing required Intent Palettes to remain visual.
Software engineering already contains palette-like knowledge:
design patterns
reference architectures
language idioms
testing matrices
security patterns
framework recipes
refactoring catalogues
standards
Existing knowledge is usually fragmented.
A book explains a pattern.
A framework documents an API.
A template gives one implementation.
A linter enforces a rule.
An ADR records one decision.
An Intent Palette could instead package alternatives as composable decision objects containing their applicability, constraints, trade-offs, implementation and verification.
The idea therefore shifted from perceptual selection toward:
structured solution-space selection.
7. Palettes begin to resemble grammars
Reusable choices naturally form hierarchies.
primitive
↓
composition
↓
pattern
↓
higher-level system
For example:
warm-side-light
↓
warm editorial portrait
↓
founder-profile photography
↓
publication visual language
I noticed at the time that this was beginning to resemble a design grammar.
That is an important step in hindsight.
A palette was ceasing to be simply a set of alternatives.
It was beginning to define which concepts existed and how they could combine.
8. LEAP 71 and layered palettes
A later discussion about LEAP 71 pushed this one step further.
LEAP 71’s broader engineering argument is that conventional CAD still largely asks computers to help humans draw geometry. Their approach instead begins further upstream: describe the engineering intent, constraints and physics, then let computation derive the resulting geometry.
Thinking about that process suggested that an Intent Palette need not be one flat menu of alternatives.
Palettes could form layers of progressively narrower semantic constraint:
mission intent
↓
system intent
↓
subsystem intent
↓
engineering constraints
↓
physics
↓
manufacturing constraints
↓
geometry
Each layer creates the legitimate decision space for the layer beneath it.
A propulsion system, for example, should not begin by exploring every geometry it is capable of generating. Higher-level choices may already have established:
mission:
reusable orbital vehicle
propulsion objective:
high efficiency
propellant:
methane / oxygen
manufacturing:
additive
thermal constraints:
...
material constraints:
...
Only then does a lower-level palette expose the design choices that still make sense.
This suggested a more powerful structure:
Palette A
defines intent and constraints
↓
Palette B
operates inside A's remaining space
↓
Palette C
further constrains B
↓
...
↓
implementation
The important idea is not merely hierarchy.
It is constraint propagation through layers of semantic decision spaces.
A choice made at a higher level changes which choices are valid or useful below it.
This is how a collection of palettes starts to become an engineering stack rather than a set of independent menus.
It also clarified why palettes could be useful to autonomous agents.
Instead of asking an agent to search an enormous undifferentiated possibility space, higher-level palettes progressively starve out irrelevant solution classes:
all possible solutions
↓
solutions compatible with mission
↓
solutions compatible with architecture
↓
solutions compatible with physics
↓
solutions compatible with manufacture
↓
small meaningful design space
The agent gains freedom inside progressively established boundaries, rather than freedom to reinterpret the entire problem at every step.
That layered-constraint model became an important precursor to the later idea of Intent Palettes as semantic boundaries.
9. The shared semantic layer
Another clue came from thinking about computer-use agents.
A computer-use system commonly performs something like:
pixels / DOM / accessibility tree
↓
infer semantics
↓
identify controls
↓
take action
An Intent Palette seemed to perform almost the inverse transformation:
human-facing representation
↓
explicit semantics
↓
machine-operable intent
That suggested a more general architecture:
human-facing projection
↕
shared semantic representation
↕
agent-facing capabilities
Humans and machines do not necessarily need the same representation.
They need different projections of the same underlying meaning.
At this point Intent Palettes had moved substantially beyond UI widgets.
They were becoming a candidate semantic interface layer.
Part II — This Idea Did Not Emerge in a Vacuum
Once I searched using the terminology of neighbouring research fields rather than the phrase “Intent Palette,” a substantial intellectual lineage appeared.
This materially changes how the idea should be presented.
10. Morphological charts: structured possibility spaces
One ancestor predates machine learning entirely.
Fritz Zwicky’s morphological analysis decomposes a design problem into important dimensions, lists possible alternatives for each dimension, and explores combinations of those alternatives.
Modern engineering descriptions still characterise morphological charts as a way of mapping the design space rather than directly solving the problem. They formalise available domain knowledge and expose combinations that might otherwise not be considered. (cambridge.org)
That is recognisably palette-like:
dimension A [a1 a2 a3]
dimension B [b1 b2 b3]
dimension C [c1 c2 c3]
followed by composition.
Intent Palettes did not invent bounded combinatorial design spaces.
11. Design Galleries: “I know it when I see it” in 1997
An even closer HCI ancestor is the 1997 SIGGRAPH paper Design Galleries.
Marks and colleagues were dealing with multidimensional parameter spaces where people might easily recognise a desirable output but find it difficult to specify the parameters that produce it.
Their system automatically generated a broad selection of perceptually different results and arranged them so users could browse the space visually. (vcg.seas.harvard.edu)
That is extraordinarily close to the original perceptual-specification motivation behind Intent Palettes.
The important later difference is that I wanted the selected item to become portable semantic knowledge, not merely a parameter setting inside one application.
12. Neural Module Networks: learned primitives
In 2015–2016, Neural Module Networks explored another piece.
Instead of using one monolithic neural network, the system dynamically composed reusable learned modules corresponding to meaningful subtasks.
The authors explicitly described their goal as finding a small collection of modules capable of being assembled into the configurations needed by the task; the paper even refers to these as composable vision primitives. (openaccess.thecvf.com)
That is extremely close to my later intuition that machine learning might supply computational primitives rather than own the whole program.
13. DeepProbLog: neural predicates
DeepProbLog gets closer still.
It extends probabilistic logic programming with neural predicates.
A neural model can determine a probability associated with a symbolic predicate, while ordinary logical reasoning operates on the resulting probabilistic facts. (sciencedirect.com)
Conceptually:
neural perception
↓
probabilistic predicate
↓
ordinary symbolic program
This is already an implementation of something very much like:
semantic predicate
↓
probability
↓
deterministic composition
So the idea of an “ML if-statement” absolutely has serious precedent.
14. Concept Bottleneck Models: human concepts as an interface
Concept Bottleneck Models, introduced in 2020, force prediction through a layer of human-understandable concepts.
Instead of:
raw input
↓
black-box model
↓
answer
they construct:
raw input
↓
human concepts
↓
answer
Humans can inspect and even intervene on those intermediate concepts. (microsoft.com)
Later work has made those interventions interactive and uncertainty-aware. (ojs.aaai.org)
That is closely related to my notion of an explicit semantic layer shared between human understanding and machine computation.
The difference is orientation.
Concept Bottleneck Models primarily ask:
Can a model make its internal reasoning pass through human-understandable concepts?
Intent Palettes began by asking:
Can humans and machines agree on the domain concepts first and then perform computation through that interface?
Those are neighbouring directions toward a similar boundary.
15. DomiKnowS: perhaps the closest existing architectural relative
DomiKnowS deserves particular attention.
Its authors describe a framework in which users declaratively define domain knowledge as concepts, relations and logical constraints, then associate learning components with that symbolic structure. (aclanthology.org)
The project explicitly seeks abstractions for programs that learn from data while allowing domain knowledge to be formulated separately from the underlying learning algorithms. (hlr.github.io)
That is remarkably close to:
define domain concepts
define relationships
define constraints
↓
attach learned implementation
↓
reason / infer
DomiKnowS therefore already demonstrates a major part of the architecture I have been circling.
My path differs in several ways.
Intent Palettes began with human recognition and specification rather than model training.
They evolved toward reusable domain choice surfaces for both humans and agents.
They treat learned implementations as potentially replaceable runtime providers behind semantic contracts.
And they explicitly separate semantic judgement from permission and side effects in an agentic system.
But those are differences of emphasis and synthesis, not grounds for pretending the surrounding architecture is unprecedented.
16. Neurosymbolic programming and Scallop
There is an established field called neurosymbolic programming.
A major survey describes it as learning or constructing programs that contain neural modules alongside symbolic primitives. (bishtref.com)
Scallop turns this into an actual programming language.
It combines machine-learning components with a Datalog-derived declarative language capable of logical, probabilistic and differentiable reasoning. More recent descriptions state the separation explicitly: a Scallop program decomposes AI computation into learning modules and reasoning modules. (doi.org)
Again:
learned component
+
symbolic program
is established territory.
17. DreamCoder: languages can themselves evolve
Another interesting relative is DreamCoder.
DreamCoder learns not only programs but reusable abstractions that effectively enlarge its domain-specific language over time.
Its authors describe expertise as acquiring languages for thinking about problems, with concepts built compositionally from earlier concepts. (arxiv.org)
This has an obvious connection to my earlier idea that a Palette Factory might notice useful recurring combinations and promote them:
primitive palettes
↓
compositions
↓
patterns
↓
higher-level vocabulary
The palette library itself could evolve.
Again, not an unprecedented idea.
But I arrived at it independently by thinking about reusable design knowledge rather than program synthesis.
18. TalkToModel: human intent compiled into a DSL
TalkToModel provides another striking parallel.
Its conversational interface translates user utterances into logical forms expressed in a structured programming language, which is then executed by the system. (nature.com)
That resembles the original Intent Composer:
human expression
↓
structured semantic representation
↓
execution
The difference is that Intent Palettes originally sought to help humans construct that semantic expression through recognition and bounded choice, rather than requiring language alone.
19. DSPy and LMQL: programming model calls rather than prompts
LLM engineering has independently moved toward similar abstractions.
DSPy replaces manually engineered prompt strings with declarative signatures describing input/output behaviour and reusable modules that determine how the operation is implemented. (arxiv.org)
That is close to my notion of:
semantic operation contract
↓
replaceable implementation
LMQL similarly provides a programming language in which model output can be constrained by types and finite choice sets, with the runtime enforcing those constraints during generation. (lmql.ai)
Neither is an Intent Palette.
But both demonstrate the general movement away from:
“write a clever string and hope”
toward:
“declare the computation and its contract.”
20. Vehicle: specifications in the meaningful problem space
Vehicle is particularly relevant to the semantic-boundary idea.
Its authors propose a typed DSL in which specifications for neural components are written in the semantically meaningful problem and result spaces, then compiled into representations suitable for training and formal verification.
Their stated advantage is that domain experts can read and check specifications without needing to understand the neural representation underneath. (drops.dagstuhl.de)
That is very close to the abstraction boundary I want:
domain meaning
↓
semantic specification
↓
implementation-specific representation
21. What appears to be the synthesis
After this search, it would be unreasonable to claim novelty for most individual pieces.
The following all have substantial precedent:
bounded design spaces
example-driven preference selection
human-readable concept layers
learned composable modules
neural predicates
probabilistic logic
neurosymbolic DSLs
typed model outputs
declarative model signatures
learned domain languages
What I have not yet found as one coherent architecture is the path I arrived at:
human perceptual specification
↓
explicit reusable domain semantics
↓
layered semantic constraints
↓
shared human-machine representation
↓
bounded solution/action spaces for agents
↓
typed learned semantic operations
↓
replaceable implementations
↓
deterministic composition and authority
That may exist under terminology I still have not found.
This document should therefore be understood as a synthesis and exploratory architecture, not a priority claim.
Part III — Jev Changes the Shape of the Idea
22. A missing computational primitive appears
TypeSafe’s September 2026 introduction of Jev supplied a piece that my earlier palette work lacked.
TypeSafe describes Jev as:
a “frontier-intelligence function call”: unstructured state in, typed probabilistic decisions out.
Jev exposes three primitive question forms:
Choice
Score
Noul
and recommends asking atomic questions and composing their answers in ordinary code. (typesafe.ai)
TypeSafe explicitly describes the intended use as “smart if-statements”: fuzzy decisions such as classifying, routing, scoring and branching embedded inside conventional software. (typesafe.ai)
Their architectural documentation goes further:
TypeSafe is designed to sit within a larger system, powering decisions with AI.
and describes complex behaviour as compositions of discrete atomic decisions. (docs.typesafe.ai)
That immediately connected to Intent Palettes.
23. Semantic boundaries and semantic primitives
The clean separation became:
Intent Palette
defines semantic boundaries
Learned Primitive
computes fuzzy meaning within them
Harness
determines consequences
For example, a palette may establish:
NextAction =
inspect
test
edit
explain
escalate
stop
That is the semantic type of the decision.
A learned primitive can then calculate:
Choice<NextAction>(current_state)
inspect .04
test .71
edit .12
explain .05
escalate .07
stop .01
The model did not invent test.
It did not decide that delete_repository should exist.
It did not determine what executing test means.
The semantic environment already established those things.
The learned system performed one fuzzy judgement inside the permitted semantic space.
24. The stronger formulation
At this point the Intent Palette starts looking less like a menu and more like a semantic type/interface system.
The mapping becomes:
| Programming concept | Intent Palette analogue |
|---|---|
| data types | semantic entities and states |
| enums | bounded intents or actions |
| functions | semantic operations |
| signatures | contracts with semantic primitives |
| predicates | learned semantic tests |
| return values | probabilities, scores, choices |
| grammar | valid composition of concepts |
| control flow | deterministic harness |
| runtime | ordinary software plus learned implementations |
For example:
Message
Customer
Risk
Intent
Action
with operations:
classify_intent(Message)
-> Distribution<Intent>
assess_risk(Message, Customer)
-> Score<Risk>
requires_review(Message)
-> Probability
choose_action(Message, AllowedActions)
-> Distribution<Action>
The implementation of assess_risk might be Jev today, another classifier tomorrow, or deterministic software where appropriate.
The contract is more fundamental than the model implementing it.
Part IV — Exploratory Specification
25. Thesis
An Intent Palette is a typed semantic interface that defines the concepts, distinctions, permissible operations and possible outcomes relevant to a bounded problem domain.
Learned computational primitives operate within those semantic boundaries.
Deterministic software remains responsible for composition, control flow, permissions, side effects and consequences.
In compact form:
Intent Palette
defines the semantic world
Learned Primitive
resolves fuzzy meaning within that world
Harness
determines what happens as a consequence
The central claim is:
Machine learning should not necessarily be the program. It can instead supply semantic computational primitives to programs.
26. Core model
DOMAIN
│
▼
┌──────────────────┐
│ INTENT PALETTE │
│ │
│ semantic types │
│ legal concepts │
│ operations │
│ output spaces │
│ constraints │
└────────┬─────────┘
│
semantic contracts
│
┌──────────┼───────────┐
▼ ▼ ▼
Predicate Choice Score
│ │ │
└──────────┼───────────┘
▼
typed semantic result
│
▼
deterministic
harness
│
▼
action
The palette does not need to know which machine-learning system implements an operation.
Possible implementations include deterministic rules, Jev, specialist classifiers, embedding models, rankers, frontier language models, humans, or systems that do not yet exist.
27. Semantic types
An Intent Palette defines domain-relevant types.
Examples:
Message
Customer
CustomerIntent
Urgency
Risk
NextAction
Evidence
InvestmentThesis
A bounded semantic type might be:
CustomerIntent =
BUY
OBJECT
REQUEST_INFORMATION
CANCEL
UNKNOWN
A scale might be:
Urgency =
LOW
MEDIUM
HIGH
CRITICAL
An action space might be:
NextAction =
INSPECT
TEST
EDIT
EXPLAIN
ESCALATE
STOP
An action outside that set does not exist within that palette.
28. Learned computational primitives
The useful initial family appears small.
Predicate
Predicate<T> -> Probability
Example:
requires_human_review(Message) -> 0.92
Intuition:
semantic IF
Choice
Choice<T> -> Distribution<T>
Example:
classify_intent(Message)
BUY .06
OBJECT .72
REQUEST_INFORMATION .18
CANCEL .01
UNKNOWN .03
Intuition:
semantic SWITCH
Score
Score<T, S> -> S
Example:
assess_risk(Action) -> .81
Intuition:
semantic MEASURE
Rank
Rank<T> -> Ordered<T>
Example:
rank(
[inspect_logs, rerun_test, edit_source, ask_human],
by="most useful diagnostic action"
)
Intuition:
semantic COMPARATOR
Retrieve
Retrieve<Q, T> -> Set<T>
Example:
retrieve(
current_problem,
prior_conversations
)
Intuition:
semantic LOOKUP
Other possible primitives include similarity, anomaly detection, policy selection, state-transition prediction and generation.
They should earn their place rather than becoming an excuse to label every AI operation a primitive.
29. Composition remains ordinary computation
Semantic primitives should not replace precise computation.
For example:
urgent =
assess_urgency(message)
refund =
is_refund_request(message)
if refund > .95
AND urgent > HIGH
then
route_to(REFUND_ESCALATION)
AND, OR, arithmetic, thresholds, state machines, loops and permissions remain deterministic where their semantics are already known.
The principle is:
Use learned computation where meaning is fuzzy. Use deterministic computation where the operation is already precise.
30. Semantic contracts
A palette operation is a contract.
assess_risk(
action: Action,
context: CurrentState
) -> Score<Risk>
The caller should not care whether the implementation uses:
Jev
specialist model
LLM
rule system
human judgement
ensemble
This produces an abstraction boundary around intelligence:
application
│
▼
semantic contract
│
┌───┼───────────────┐
▼ ▼ ▼
Jev rules frontier model
Implementations can improve without requiring the domain model to be rewritten.
DSPy’s signatures point toward a similar separation for LLM pipelines, while DomiKnowS already separates domain declarations from learning algorithms. Intent Palettes would extend that style of separation to a reusable domain-facing semantic interface. (dspy.ai)
31. Uncertainty is a first-class value
Instead of:
intent = OBJECT
prefer:
OBJECT .63
REQUEST_INFORMATION .31
UNKNOWN .06
The surrounding system can then decide:
high confidence
automatic action
medium confidence
verification
low confidence
gather evidence / better model / human
The thresholds are domain decisions.
The semantic primitive supplies judgement.
It does not decide how much risk the system is permitted to tolerate.
This is especially compatible with TypeSafe’s emphasis on calibrated probabilities and confidence. (typesafe.ai)
32. Judgement is not authority
Learned primitives should preferably be pure semantic operations.
They answer questions.
They should not automatically possess authority to produce consequences.
Bad boundary:
model:
decides payment is suspicious
blocks account
emails customer
Preferred boundary:
model:
suspicious(payment) -> .93
policy:
if probability > threshold
AND account policy permits action
then request review
The harness owns authority.
The primitive supplies judgement.
33. The invariants
A serious implementation should preserve several principles.
Semantic boundaries should be explicit.
Output spaces should be bounded where the domain permits them to be bounded.
The semantic contract should remain conceptually distinct from the model implementing it.
Uncertainty should not silently become certainty.
Learned judgement should not automatically confer permission to act.
Operations whose meaning is already deterministic should remain deterministic.
And the path from semantic judgement to consequence should remain inspectable:
operation invoked
implementation used
context supplied
result returned
confidence
policy applied
eventual action
34. What this is not
Intent Palettes are not merely prompt templates.
Prompts may implement an operation, but they are not the abstraction.
They are not merely tool schemas.
A tool schema says what an action looks like. A palette describes the semantic distinctions that make an action appropriate.
They are not agent personalities.
They are not an attempt to replace conventional software with AI.
They do not make machine learning infallible.
And they should not become universal ontologies.
The useful unit is probably a bounded domain.
35. Is this a programming language?
Not necessarily.
At the current level an Intent Palette looks more like:
domain vocabulary
+
type system
+
interface definition
+
semantic operation set
than like Python or Lisp.
But add:
composition
binding
branching
sequencing
reuse
modules
execution semantics
and it begins to become a genuine domain-specific language.
For example:
WHEN
requires_review(message) > .90
AND
urgency(message) >= HIGH
THEN
CHOOSE next_action
FROM ReviewActions
At that point the distinction between palette and semantic DSL becomes increasingly thin.
36. Where Lisp fits
The architecture is language-independent.
Lisp is nevertheless an unusually attractive laboratory because Lisp makes it cheap to invent little languages.
Code and symbolic data share the same structural representation.
Macros let new constructs be added without first building a complete compiler and parser.
A possible surface syntax might look like:
(defpalette customer-service
(type intent
buy
object
request-info
cancel
unknown)
(semantic-predicate refund-request?
(message)
:returns probability)
(semantic-choice classify-intent
(message)
:returns intent)
(semantic-score urgency
(message)
:scale '(low medium high critical))
(action next-action
inspect
respond
escalate
stop))
The implementation behind:
(classify-intent message)
could be Jev, an LLM, a conventional classifier or something else.
Lisp is therefore potentially a good prototyping environment for the language-design question.
It is not part of the definition.
37. A repository-agent example
A repository palette might define:
FailureType =
AUTH
NETWORK
DEPENDENCY
TEST
SOURCE
UNKNOWN
NextAction =
INSPECT
TEST
EDIT
EXPLAIN
ESCALATE
STOP
Operations:
classify_failure(logs)
-> Distribution<FailureType>
requires_human_review(state)
-> Probability
rank_diagnostics(actions, state)
-> Ordered<Action>
assess_change_risk(diff)
-> Score<Risk>
Execution:
logs
↓
classify_failure
↓
AUTH .91
↓
deterministic policy
↓
AUTH failures cannot trigger source edits
↓
allowed palette narrows to:
inspect_credentials
explain
escalate
↓
rank permitted actions
↓
harness executes permitted action
The model never possessed an unlimited action space.
38. What remains genuinely difficult
The difficult part is no longer seeing that the pieces can be assembled.
It is deciding where to cut the semantic world into primitives.
Too broad:
decide_what_to_do()
and I have recreated the unconstrained agent.
Too narrow:
is_the_third_word_negative()
and the abstraction becomes unusable.
Semantic granularity may therefore be one of the central design problems.
Several other questions should remain deliberately unresolved.
Does explicit semantic typing genuinely improve reliability, or merely add ceremony?
Are semantic primitives reusable enough to justify the abstraction?
Can implementations really be swapped without changing the meaning of the operation?
Are their probability estimates calibrated well enough to govern consequential actions?
What belongs in the palette and what belongs in the harness?
Can useful complex behaviour actually emerge from composition of bounded operations without simply recreating a giant reasoning loop one layer higher?
39. Falsifiable claims
The idea is useful only if it can fail.
A bounded semantic operation should be easier to test than an open-ended agent prompt.
Explicit output types should eliminate classes of structural failure.
Small semantic operations should sometimes permit cheaper specialised models to replace frontier models.
Separating judgement from authority should reduce the blast radius of model errors.
A well-designed semantic contract should allow implementations to change without rewriting domain logic.
And sufficiently complex intelligent behaviour should be composable from bounded semantic operations in at least some useful domains.
If those claims fail in practice, the concept should change with the evidence.
40. Current working definition
The present formulation is:
An Intent Palette is a typed semantic interface that defines the meaningful concepts, distinctions and permissible operations of a bounded problem domain, allowing humans, deterministic software and learned computational primitives to operate on a shared semantic representation.
The shorter form is:
Intent Palettes are typed interfaces for programming with learned computation.
But that definition should be understood as the end of the journey so far, not its starting point.
The actual evolution was:
“I know it when I see it”
↓
example-based specification
↓
Intent Palette
↓
portable structured intent
↓
Palette Factory / Library
↓
bounded search space for agents
↓
domain decision grammar
↓
layered semantic constraints
↓
shared human-machine semantic layer
↓
typed semantic interface
↓
learned computation inside the boundary
That history is part of the idea.
ELI5 (the simple version)
Normal computers are very good when instructions have exact meanings.
You can write:
if temperature > 30
turn fan on
because the computer knows exactly what 30 and > mean.
But many important decisions are more like:
if this customer sounds genuinely upset
get a human involved
What exactly does genuinely upset mean?
Machine-learning systems are increasingly good at answering questions like that.
Today the problem is often solved by giving one giant AI everything:
Read the message.
Understand what is happening.
Work out the possible choices.
Decide what to do.
Do it.
Intent Palettes propose splitting those responsibilities apart.
First define the little semantic world:
CustomerMood =
calm
confused
annoyed
angry
Then let a learned primitive answer one small fuzzy question:
Which mood best matches this message?
calm 2%
confused 8%
annoyed 25%
angry 65%
Then ordinary software decides what happens:
if angry > 90%
request human review
The AI decides what the message means within the defined space.
The software decides what that judgement is allowed to cause.
The palette might contain nouns:
Customer
Message
Risk
Action
and operations:
classify
score
rank
retrieve
Some of those operations could be powered by machine learning.
Others might be ordinary software.
The program should not care unnecessarily which implementation sits underneath them.
And the palettes themselves can be layered.
A high-level palette might establish the mission.
That constrains the architectural palette beneath it.
That constrains the engineering palette.
That constrains the manufacturing palette.
Eventually:
big possibility space
↓
mission constraints
↓
architecture constraints
↓
engineering constraints
↓
physical constraints
↓
small meaningful possibility space
Each palette does not need to solve the whole problem.
It only needs to define the meaningful possibilities at its level and pass a narrower problem to the next.
So the idea is not:
replace software with AI.
It is closer to:
software
├── arithmetic
├── databases
├── files
├── networking
├── semantic predicate
├── semantic choice
├── semantic score
├── semantic ranking
└── generation
Machine learning becomes another kind of computation available to software.
The Intent Palette defines the bounded language in which that semantic computation is allowed to occur.
And oddly enough, that idea started because somebody wanted an easier way to say:
“Make it look like that one.”