AI-DE

A model with many surfaces

An IDE is organised around files because, historically, a file was expensive to produce and expensive to change. Generation inverts that. When a file can be rewritten on request, the file is the cheap part, and organising the whole tool around it means organising it around the one thing that no longer holds still.

AI-DE puts the model at the centre instead. A repository is indexed into an append-only store of attributed facts; every view is a projection over those facts; and the code viewer is one projection among fifteen, with no more claim to being the real thing than the class diagram or the search index.

The pipeline

Seven extractor families read a repository. Each emits immutable evidence assertions of the form subject, predicate, object, against a scope snapshot pinned to the exact source revision it read. Nothing is written in place. Projections are built from those facts and can be deleted and rebuilt at any time; a test does exactly that on every run, rebuilding every current projection from an empty cache and comparing it to the stored one.

The AI-DE extraction pipeline Seven extractor families write evidence assertions into an append-only fact store, pinned by a scope snapshot. Projections are derived from the store, and fifteen surface kinds render the projections. Agents write back through the store, never through a surface. EXTRACTORS C# TypeScript Python Bicep EF schema SQL schema Knowledge docs 7 families APPEND-ONLY STORE evidence_assertion_fact subject · predicate · object scope_snapshot_committed pinned to a source revision UPDATE → ABORT DELETE → ABORT a correction is a new fact PROJECTIONS · REBUILDABLE graph paths & impact node content content search context map joins interaction / sequence deletable; replayed from facts SURFACES code viewer · graph canvas class diagram · sequence context map · joins · search evidence · inspector · terminal sessions · board · leaderboard prompt · diagnostics 15 kinds · read-only over the model agents change the repository → re-extraction → new facts never: a surface edit writing back into the model
The dashed return path is the whole argument of this page. A surface is a lens, and a lens that could be written through would make the model editable in two places at once, which this repository classifies as a defect, not a feature.

One node, seven surfaces

Below is a single node from this codebase, the class WeaveScorer, rendered the way each surface would ask about it. Nothing about the node changes. What changes is the question the surface is asking.

AiDe.Core.Watcher.WeaveScorer

7 of 15 surface kinds

Code viewer: “show me the text”

/// The deterministic Weave scorer. Pure, model-free: it turns a closed
/// Work Episode's deterministic evidence into an honest Scorecard.
public sealed class WeaveScorer
{
    public Scorecard Score(
        WorkEpisode episode,
        DeterministicEpisodeSignals signals,
        ScoreSchema schema,
        TimeProvider time)
    {
        // 1. Not Scored gate: no goal, no done-condition,
        //    not closed, or no verification path.
        var notScored = NotScoredReason(episode, signals);
        ...
    }
}

The only surface that shows the characters on disk, and the only one a generator can invalidate wholesale. src/AiDe.Core/Watcher/WeaveScore.cs

An illustration, not a screenshot. The node, its file, its members, and the predicate vocabulary are read from this repository. The layout is drawn for the web; the application renders these in docked panes.


The fifteen surfaces

A surface's identity, state and content are independent of where it is docked. One factory maps a surface kind to its content, so adding a kind never means touching the layout model, and an unknown kind still gets an honest pane rather than a blank one.

KindThe question it answersReads
codeviewerWhat does the text say?node content projection
canvasWhat is this near, and what reaches it?graph + paths projections
classdiagramWhat shape is this type, and what does it inherit?has_member, has_type
sequenceIn what order do these components talk?calls_at interaction projection
contextsWhich bounded context owns this language?context projection
joinsWhere do two models meet, and on what key?join projection
searchWhere does this string live, and why did it match?content search projection
view / inspectorWhat is asserted about this node, and how confident is it?evidence read
terminalWhat is the agent doing right now?ConPTY session
promptWhat am I about to send, and to which session?prompt drafts
sessionsWhich agents are alive, in which repositories?watcher liveness
boardWhat have the agents told each other?message board
leaderboardWhich harness and model does better here?scored episodes
diagnosticsIs the machinery itself healthy?daemon, health, MCP

Fourteen rows for fifteen kinds: view and inspector share a row because they share a reader. The list is a published constant the application checks itself against, so a surface cannot exist without appearing here.


Why the model is edited through agents, not surfaces

The temptation with a diagram tool is to make the diagram editable. Drag a box, rename a class, and have the code follow. It is the feature everyone asks for, and it is the one this project refuses.

A derived view that can be written through is a second source of truth. The moment two places can define the same thing, they disagree, and the disagreement is silent, because both look authoritative. The repository carries this as a standing rule with its own architecture decision record, and the modelling reviewer holds a veto over any editable derived view.

Fact tables reject UPDATE and DELETE through BEFORE UPDATE / BEFORE DELETE RAISE(ABORT) triggers, and the writer forbids INSERT OR REPLACE / upsert conflict resolution on fact tables. This is required, not optional: with the default recursive_triggers=0, INSERT OR REPLACE silently deletes-and-replaces a fact row without firing the delete trigger.

docs/design/conceptual-model.md · verified by spike sqlite-fact-store, case S4

So the write path runs the other way. You direct an agent; the agent changes the repository; the extractors observe the change and append new facts; the projections rebuild; every surface updates because every surface was only ever a question asked of the same store. The model is transient in the sense that any particular state of it can be thrown away and reconstructed, and durable in the sense that the facts, and the record of how they got there, are the thing that is kept.

Read further