instruments / wink / ADR/0000-bootstrap-design-note.md · raw
0000 — Bootstrap Design Note
Status: standing unless objected (researcher delegated, 2026-08-21) — implementation proceeding Answers the nine questions of constitution §114. Everything here is provisional (§42: nothing below is settled; at most it will become implemented and then validated).
1. Smallest experimental kernel worth building
A file-based research object store plus a thin CLI, capable of exactly the §98 verb list — STORE / DERIVE / LINK / PROPOSE / ANNOTATE / PERTURB / COMPARE / DEFINE / FREEZE / RUN / RETAIN — over the five bootstrap objects (§59–63: artifact, representation, transformation, claim, experiment).
Substrate: plain JSON files in this git repository, content-addressed, with git commits as the freeze mechanism. An optional SQLite index may be added later strictly as a rebuildable cache — files are truth, the index is convenience. Rationale: inspectable by humans and agents with zero tooling (§99); immutability is enforceable by content-hash discipline; disagreement is diffable; frozen predictions get tamper-evidence for free (§55: the commit hash IS the freeze); the whole substrate is trivially replaceable (§47). Python for the CLI because it is the box's lingua franca; nothing in the data layer depends on it.
Explicitly NOT in the kernel: any similarity function. The kernel stores mappings that generators (human or model) propose; it never computes affinity itself. This is the structural guard against §71 — the system cannot quietly become embedding-retrieval-plus-explanation if the kernel has no notion of proximity.
2. What data remain immutable
artifacts/— raw source material: bytes, provenance, ordering, timestamps, temporal uncertainty. Content-addressed; a write with an existing id is an error, never an update (§48).- Frozen experiment predictions, once committed (§55). Results append; predictions never rewrite.
genesis.txt(already committed as the Layer-0 artifact of the project itself).
Everything else is derived and may be superseded — but never deleted: supersession is a recorded operation pointing at what it replaces (§7).
3. How competing representations coexist
A representation is an independent addressable object keyed by (source object, scheme@version, producer, id). There is no canonical slot, no "current" pointer, no uniqueness constraint on (source, scheme). Reads return sets. Synthesis, when produced, is one more representation whose producer field records the synthesis operation and inputs — the originals remain (§5, §51, §75). Nothing in the storage layer can express "the" parse of an artifact; that sentence is unwritable by construction.
4. How transformation lineage is stored
Transformations are first-class records (§10, §61): inputs, outputs, operation description (freeform prose + optional tags drawn from the §25 bootstrap vocabulary, which is data, not an enum), parameters, assumptions, and mandatory producer metadata — for model-produced objects that means model id/version, prompt reference, settings (§50: the LLM is measurement apparatus; its identity is instrument metadata). Every derived object carries parent references. Lineage is reconstructed by walking, and a kernel invariant test asserts every object is walkable back to artifacts.
5. How preservation/loss stays inspectable
The loss record on a transformation is a vector, never a scalar (§11, §27): preserved / destroyed / invented / merged / split / unresolved / assumption-dependent, each a list of references to named relations or structures, plus prose where reference is premature. Scoring functions, if any ever exist, live outside stored records as versioned objects applied at read time — weighting is part of the model, stored, versioned, perturbable (§27). The kernel refuses to store a bare number as a loss record.
6. How experiments and frozen predictions are represented
EXPERIMENTS/<id>/ holds a spec (question, hypothesis, inputs, permitted transformations, controls, perturbations, evaluation procedure — §54, §63), a predictions.json whose content hash is recorded in the freezing commit before any holdout is revealed, and append-only run results — failures retained with the same fidelity as successes (§53: negative results are product).
7. Deliberately provisional choices (expected to die)
- JSON encodings of every object (
schema_versionon all of them; §8 demands migration-from-birth). - The §25 transformation tag vocabulary (tags are data).
- File layout and the files-as-substrate choice itself.
- Artifact segmentation policy (currently: whatever the ingester chose, recorded as a lineage operation so it can be redone — §16).
- Representation
schemeas a string field — a deliberate placeholder for §64's Basis object; when we need bases to be comparable/criticizable objects, the string becomes a reference. Markedscheme_v0in code. - Python, the CLI shape, everything about the tooling.
8. First experiment that forces the architecture to prove useful
Experiment 0 (§78): a handful of deliberately ambiguous passages; several independent parses each, stored without collapse; questions asked conditional on each parse; a synthesis added without deleting anything; every downstream claim traceable to its parse. Success = disagreement is inspectable rather than annoying. This tests the architecture, costs almost nothing, and cannot be faked by semantic fluency.
Then Experiment 1 + 2 (§79–80): constructed artifacts with known ground truth (cycle, tree, feedback, inversion, containment, branching) rendered as prose / pseudocode / event-sequence; test structural recovery; then label-destruction (§13) and measure degradation. The first real research output of the apparatus is intended to be a calibration table: how much of apparent correspondence is carried by labels. If our first exciting mapping dies under label destruction, that is a success condition (§70).
9. What we are explicitly refusing to solve yet
Search/matching beyond naive enumeration; embeddings (later, as baseline only, §88); null-model construction machinery (§33 — design placeholder in OPEN_QUESTIONS, acknowledged as research, not plumbing); graph algorithms; the transformation algebra (§25); any UI; PKD ingestion; occult corpora; scoring scalars; multi-model orchestration; autonomous agents. Each enters only when an experiment demands it.
What would kill this design
Recorded per §92 so reconsideration has triggers:
- Experiments need cross-object queries that file-walking can't serve → add the SQLite index (still cache, not truth). If even that fails, the substrate decision reopens.
- Loss vectors prove unrepresentable as lists of relation references → the relation encoding (not the vector principle) reopens.
- Multiple-representation reads become so awkward that agents route around them → the coexistence mechanism failed its own §78 test; redesign before any further experiments.