Learning Datagraph — SLM trajectory loop and apprenticeship queue
The platform builds a compounding substrate: every operator interaction with an AI session becomes a structured training tuple, routed through a single auditable boundary (Doorman), captured to an append-only ledger, and folded back into the local SLM via periodic fine-tuning. The result is a development environment that learns from how it gets used — code completions improve toward the patterns this operator writes, draft suggestions align closer to the editorial voice this house produces, entity extractions tighten as the graph thickens.
Key Takeaways
-
The substrate accumulates training signal through four distinct legs: trajectory capture at session end, an apprenticeship queue that fires on every commit, editorial DPO pairs from the reverse-funnel editorial pipeline, and negative-trajectory distillation from operator corrections. Each leg captures a different dimension of operator intent.
-
All training signal passes through the same auditable boundary — Doorman — and lands in the append-only audit ledger. Nothing bypasses the ledger; nothing leaves the local environment. The learning loop is air-gapped and self-contained.
-
The corpus accumulates with every session. As of mid-2026 the apprenticeship corpus held 502 tuples and the editorial DPO corpus held 34 pairs. These numbers grow without manual curation — the model floor rises as the operator uses the environment.
-
Correction (2026-08-02): this leg understates real progress. The
POST /v1/draft/generateendpoint is already built and deployed —service-content/src/http.rs:176-280implements it in full (LadybugDB query, prompt packaging, Doorman proxy call), and a live probe returns HTTP 422 (validation error), not 404, confirming the route is live. Perservice-content/CLAUDE.md's own status table, the actual remaining gap is a Tier C provider-authentication configuration step, not a multi-week Rust engineering effort building the endpoint from scratch. Flagged, not resolved — needs updating to reflect the endpoint's real (built, not-yet-authenticated) status. -
The one leg not yet wired is the structured-entity loop: a
POST /v1/draft/generateendpoint in service-content — entity extraction and knowledge-graph host that would ground generation in graph entities. The supporting infrastructure (queue, ledger, hooks, audit routing) is already in place; what remains is a multi-week Rust engineering effort.
Four legs of training signal
The substrate has four legs.
Trajectory capture. A session-end hook fires at session close, writing a structured JSONL entry to the audit ledger: branch state, uncommitted-file count, head SHA, and a promotion-pending flag (Correction, 2026-08-02: the real capture-trajectory.sh posts a free-text session summary wrapped in an apprenticeship-brief JSON — brief_id/senior_role/task_type/body — not this specific field set; flagged, not resolved). A nightly harvest copies the day's session transcripts into the same ledger, tagged by operator and archive.
Apprenticeship queue. A post-commit hook emits a brief for every workspace commit. A 15-minute queue drainer calls the local SLM (OLMo-2 7B Q4) against each brief, captures the model's attempt, and writes the (brief, attempt, actual_diff) tuple to the apprenticeship corpus. 502 tuples had accumulated as of 2026-05-18.
Editorial DPO pairs. Every draft that passes through the reverse-funnel editorial pattern — raw to refined to creative-edited — emits two DPO (direct preference optimisation) pairs to the prose-edit corpus. The pair captures the editorial improvement deltas. 34 pairs had accumulated to that date.
Negative-trajectory distillation. An inbox-scanner script reads operator corrections from archived messages and emits negative-trajectory signals to the feedback corpus. This fourth leg captures what the model should not do.
Structured-entity loop — the remaining leg
Correction (2026-08-02): see the Key Takeaways correction above — this endpoint is already built and live, not "remains to wire." The description of what it does is otherwise accurate.
What remains to wire — multi-week Rust engineering effort: the structured-entity loop. service-content — entity extraction and knowledge-graph host (LadybugDB-backed graph) needs a POST /v1/draft/generate endpoint that queries the graph for relevant entities, assembles a 2K-token grounded prompt, calls the Doorman, and writes the response as a graph-grounded corpus tuple. A LoRA scheduler then wakes Tier B GPU compute for nightly adapter training. The supporting infrastructure — queue, ledger, hooks, audit-routing — is already in place.
The substrate compounds in two directions: structurally (citation density and supersedence chains thicken with each draft) and generatively (each adapter raises the floor of "raw" so each refinement cycle starts closer to publish-ready).
See also
- Compounding substrate — the substrate discipline this architecture instantiates
- AI inference service — the local SLM service that executes model inference in the loop
- Totebox session — the session model that trajectory capture instruments at session end
- Mailbox atomicity — flock-based prepend and msg-id idempotency — the atomic prepend discipline that protects the audit ledger from concurrent write races