Primitives
Six primitives, one contract
Small, independent engines you can call alone or combine. Each has one door (app, API, MCP, CLI) and the same four parts.
- 1ConstraintsWhat can I configure?
What a caller declares, as data: one config file per endpoint plus per-call options. One schema, read the same way whoever set it.
- 2MechanismWhat always happens?
What runs on every call no matter who asked. Enforced once, at the door, so an API key gets exactly what the app gets.
- 3IntelligenceWho picks the values?
You set them, or Letterstory derives them from your workspace. Both go through the same door.
- 4VerificationDid it hold?
After the run, each constraint is checked against the output and recorded. Failures are shown, never hidden.
The primitives
A brief, outline, notes or draft in; a finished article out, in the kernel's voice and passed by adversarial judges.
Each paragraph is rewritten by a different model from a pool of providers, so no single model's mark survives. Structure, links, figures and quotes stay untouched.
Passes after the writer: internal links, citations, visuals and tables, and metadata. Each adds; none rewrites your prose.
A seer watches a source and reports what's new and relevant, deduplicated and ready to become headlines or drafts.
A research agent that gathers sources, weighs competing theses and fact-checks every claim. Each arena is one versioned file, like a kernel.
The content engine as a primitive. A collection sources, writes, gates and publishes a post each run. A Phantomstory is a collection Letterstory hosts as its own publication.
Openers picks the best opening line for each prospect from a library of handwritten, human-approved lines. Nothing is generated: the model only chooses and fills placeholders that must pass a check.
What every primitive shares
- An endpoint with one config file. Read it, replace it, version it. Per-call options win over its defaults, field by field.
- Runs, not requests. Long work is asynchronous: submit, get a
run_idback, poll until it settles. Openers, the one fast primitive, answers inline. - Every run records the request and its verification.
- One capability pair per primitive on your API key (
:readand:write), and its own balance.