779ba6db59
Brings the §1 bot wrapper, the §4 cache (webhook + reconciler), the §5 schema (six numbered migrations), Gitea OAuth + §6 user provisioning, the §7 catalog left pane, and the propose-to-merge vertical: propose modal opens an idea PR against the meta repo, an owner merges from the pending-idea view, the cache picks it up via webhook or reconciler sweep, and the catalog renders the new super-draft. Per §1 the bot is the only Git writer; every commit, branch creation, and PR merge carries the §6.5 On-behalf-of: trailer and an `actions` audit row. Per §4 the cache is never written from a user action — it's webhook+reconciler only. Covered by `backend/tests/test_propose_vertical.py` against an in-process Gitea simulator. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
229 lines
11 KiB
Markdown
229 lines
11 KiB
Markdown
# Words first
|
||
|
||
*A standards process for shared meaning between humans and machines.*
|
||
|
||
Large language models work brilliantly with programming languages because
|
||
every word in Python or C has a definitive meaning enforced by tooling.
|
||
They struggle with natural language because no such dictionary exists for
|
||
words like *consent*, *trait*, or *agency* — words that do enormous work
|
||
in any system that interacts with humans. Trained on the open corpus,
|
||
LLMs inherit and amplify the ambiguity, producing text that looks crisp
|
||
and is, on inspection, fog.
|
||
|
||
The Wiggleverse RFC framework is a standardization process for natural-
|
||
language vocabulary, modeled on the way ISO C, POSIX, and the IETF RFCs
|
||
produced the standards that underwrite modern computing. Each RFC defines
|
||
one word: its meaning, its relationships to other defined words, and the
|
||
protocol by which humans and machines interact with it. The Open Human
|
||
Model is the first specification this process will produce. Together,
|
||
the graduated RFCs form a stack — a shared vocabulary that digital
|
||
representations of humans, and the systems that interact with them, can
|
||
be built on without re-litigating what every word means.
|
||
|
||
This is public work. Humans and machines are both invited and both
|
||
required. The shared understanding the framework is reaching for — how
|
||
things work, in the physical and digital realms, between humans and
|
||
other humans, between machines and other machines, and between humans
|
||
and machines — cannot be produced by any one of those participants alone,
|
||
and we do not intend to try.
|
||
|
||
---
|
||
|
||
## The asymmetry
|
||
|
||
Large language models have been transformative for code in a way they have
|
||
not been for prose. The gap is wider than enthusiasm; it is structural.
|
||
|
||
When a model writes Python, every word in the language has a definitive
|
||
meaning. `for`, `range`, `await`, `class` — these are not approximations.
|
||
A compiler will refuse to run text that uses them incorrectly. The model
|
||
was trained on millions of examples where these words behave the same way
|
||
every time. Beneath the model is a substrate of agreement: programmer,
|
||
machine, and language designer all converge on what the word does. Output
|
||
flows downhill from that agreement, and the productivity gains are real.
|
||
|
||
When a model writes a strategy memo, none of this is true. *Inclusive*,
|
||
*scalable*, *user-centric*, *ethical* — these words do enormous work, and
|
||
the work they do is to mean different things to different readers. There
|
||
is no compiler. There is no refusal. The model averages across every
|
||
meaning the training data ever held and produces text that looks crisp
|
||
and is, on inspection, fog. Two readers extract two memos. Three months
|
||
later, when someone asks why the decisions diverged from the intent, the
|
||
document cannot answer, because the document never held a single intent
|
||
to begin with.
|
||
|
||
This is not a model failure. It is a *prerequisite* failure. We are
|
||
asking LLMs to compute in a language we never finished defining.
|
||
|
||
## Code's dictionary; natural language's absence of one
|
||
|
||
Programming languages have spent fifty years building the dictionary.
|
||
Every keyword has a specification. Every type has an interface. Every
|
||
API surface has a contract. The dictionary is enforced by tooling: type
|
||
checkers, linters, runtime errors. Drift between what you meant and what
|
||
you wrote is caught at the interface, loudly, by a machine whose job is
|
||
to refuse.
|
||
|
||
Natural language has no such dictionary, except locally, briefly, and by
|
||
accident — within a small team that has worked together long enough to
|
||
triangulate one. Outside that team, the dictionary evaporates. LLMs
|
||
trained on the open corpus inherit that evaporation. They are, at scale,
|
||
drift amplifiers. The more fluent the model, the more confidently the
|
||
drift compounds.
|
||
|
||
This is the entropy the framework is trying to address.
|
||
|
||
## What this actually is
|
||
|
||
What the framework produces is a stack of specifications.
|
||
|
||
The closer analogues are not programming languages — Python, JavaScript —
|
||
but the standards underneath them: ISO C, POSIX, the IETF RFCs that
|
||
define HTTP and TCP, the W3C recommendations that define HTML. Each is a
|
||
document, painstakingly argued and then formally adopted, that other
|
||
systems reference rather than reinvent. POSIX did not write the
|
||
operating systems that use it; it specified the surface those systems
|
||
could agree on. HTTP does not implement any particular web server; it
|
||
specifies the surface every web server has to honor.
|
||
|
||
The Wiggleverse RFC framework is the standardization process. The RFCs
|
||
it produces are the specifications. The Open Human Model is the first
|
||
of them. Together they form a stack — a shared vocabulary that every
|
||
digital representation of a human, and every system that interacts with
|
||
one, can be built on without re-litigating what *consent*, *trait*, or
|
||
*agency* means each time.
|
||
|
||
The analogy stretches in one important way, and the stretch is worth
|
||
naming. POSIX worked because it codified convention that already
|
||
existed in fragmented form across Unix vendors; the committee's job was
|
||
to harmonize working implementations. This framework has the harder
|
||
job. There are no working implementations of *consent* or *agency* to
|
||
harmonize — only twenty arguments per term and no convergence. We are
|
||
specifying the vocabulary in the first place. The reason this is now
|
||
tractable, and was not in any previous attempt, is the LLM as
|
||
participant: it provides the surface area and surfaces the cases humans
|
||
alone could never enumerate, while the humans provide the refusal and
|
||
the judgment. That dyad is what every previous attempt at a natural-
|
||
language standard at this resolution has lacked.
|
||
|
||
## The proposal
|
||
|
||
Before we build *with* LLMs in any domain that touches natural-language
|
||
concepts — identity, consent, value, harm, fairness, intent — we have to
|
||
build the dictionary. And the dictionary has to be built collaboratively,
|
||
with humans and machines together, because neither can do it alone.
|
||
|
||
Humans cannot. The history of dictionary-building by committee is a
|
||
history of dictionaries no one consults. We do not have the labor or the
|
||
patience to enumerate the surface area at the resolution machines need,
|
||
and we do not have the introspective access to our own usage to surface
|
||
the cases that actually matter.
|
||
|
||
Machines cannot either. A model trained on existing text has already
|
||
internalized the ambiguity it is meant to resolve. Asking it to dictate
|
||
definitions is asking the disease to write the cure.
|
||
|
||
But a human and a model in a careful argument can pin down what neither
|
||
could pin down alone. The model proposes; the human refuses or refines;
|
||
the argument is captured; the definition tightens. The transcript of the
|
||
argument becomes a thing both can index against later. This is what the
|
||
RFC framework is for.
|
||
|
||
## What it means to define a word
|
||
|
||
A definition, in the sense this framework cares about, has three parts.
|
||
|
||
The first is the **meaning** — a tight, unambiguous statement of what
|
||
the word picks out in the world. Not a dictionary gloss; a specification,
|
||
written so that a careful reader and a careful model would agree about
|
||
whether any given thing is or is not in the word's extension.
|
||
|
||
The second is the **relationships** — how the word connects to other
|
||
defined words. Definitions in isolation drift. A definition embedded in
|
||
an ontology — *is-a*, *part-of*, *implies*, *excludes* — is anchored.
|
||
The graph of definitions becomes the substrate that future definitions
|
||
stand on. This is the same move programming languages make when they
|
||
let one type be defined in terms of others.
|
||
|
||
The third is the **protocol** — how humans interact with the word, and
|
||
how machines interact with the word. A definition that humans use and a
|
||
definition that machines use are not separately valid; they have to be
|
||
the same definition, expressed in two registers. The RFC document is
|
||
the human register. The structured metadata around it is the machine
|
||
register. Both pass through the same review.
|
||
|
||
A word is "defined" when all three parts exist, have been argued over,
|
||
and have graduated to canonical status. Until then, it is a draft, and
|
||
anything built on top of it inherits the draftness.
|
||
|
||
## How the framework operationalizes this
|
||
|
||
The structural decisions in `SPEC.md` are not arbitrary. Each one is in
|
||
service of the philosophy above.
|
||
|
||
- The **meta-repository** holds the catalog of definitions. Every
|
||
defined word, and every word currently being defined, is one entry.
|
||
The catalog is itself a piece of public infrastructure — version-
|
||
controlled, branchable, auditable.
|
||
- **Super-drafts** are the moment a word enters the conversation.
|
||
Proposing a definition costs nothing in identifier space, because
|
||
most proposals will not survive the argument, and that is fine.
|
||
- **Graduation** is the moment a definition becomes load-bearing. It
|
||
gets a stable identifier (`RFC-NNNN`), its own repository, and a
|
||
permanent home. From that point forward, other RFCs can build on
|
||
it. Graduation is rare and ceremonial because what comes after it
|
||
is dependency.
|
||
- **AI participation in chat** is not a feature; it is the mechanism.
|
||
The model is one of the participants in the argument that produces
|
||
the definition. Its proposals are subject to refusal and refinement,
|
||
the same as any contributor's. The transcript of the argument is
|
||
preserved because the argument is the evidence the definition was
|
||
earned.
|
||
- **Branches, PRs, and tracked changes** exist because definitions
|
||
evolve, and the framework needs to make that evolution legible — to
|
||
humans reading later, and to machines computing against the current
|
||
state.
|
||
|
||
The first RFC the framework will produce is the Open Human Model: a
|
||
shared definition of what we mean by *human*, and the constellation of
|
||
words around it — *trait*, *preference*, *consent*, *harm*, *agency*.
|
||
This is not a small project. It is, in the most literal sense, the
|
||
dictionary that everything else built here will stand on.
|
||
|
||
## An invitation
|
||
|
||
This is public work, and it is meant to be.
|
||
|
||
The vocabulary the framework is producing is for anyone who will need
|
||
to interact across the human–machine boundary, or across the machine–
|
||
machine boundary where the machines are acting on behalf of humans.
|
||
That is, in the limit, everyone. The framework is therefore designed
|
||
as public infrastructure: every entry sits in a public meta-repository,
|
||
every argument lives in a public chat thread, every change to a
|
||
graduated definition is a public PR with a reviewable trail.
|
||
|
||
The invitation is to participate. Propose a word. Argue against a
|
||
draft. Refine a definition. Flag a relationship the current ontology
|
||
is missing. Humans and machines are both invited, and both are
|
||
required. The shared understanding the framework is reaching for —
|
||
how things work, in the physical and digital realms, between humans
|
||
and other humans, between machines and other machines, and between
|
||
humans and machines — cannot be produced by any one of those
|
||
participants alone, and we do not intend to try.
|
||
|
||
## A note on humility
|
||
|
||
This work will not finish. Languages do not finish; they accrete, drift,
|
||
get pruned. The RFC framework is not a one-time act of definition; it is
|
||
a sustained practice of definition, of arguing about words in public, of
|
||
being willing to refine canonical entries when use reveals what spec
|
||
missed.
|
||
|
||
The claim is not that we can finalize meaning. The claim is that we
|
||
cannot build responsibly with LLMs in domains we have not even tried to
|
||
define. The work begins with one word, argued carefully, with a model
|
||
and a human together. Then another. Then the relationships between them.
|
||
Then the systems those definitions enable.
|
||
|
||
Build the dictionary first.
|