What M1 ships
The data model and the MCP surface, over seeded data. There is no ingestion pipeline yet — and that is the point.
M1's claim is that the data model is the product. It ships the first CodiQ SDL — the language-neutral core of §4.4 — and lets gopgql do the rest: generate the vertex and edge tables, create theCREATE PROPERTY GRAPH view over them, and serve GraphQL/MCP. Rows come from a committed seed file, because no extractor exists yet. Anyone can insert rows directly; the value on offer is the vocabulary and the read surface, not the ingestion.
What is in the repository
schema/codiq.graphqlThe single source of truth. Three vertex types and the edges between them, annotated for gopgql.schema/migrations/0001_core_tables.sql and 0002_core_graph.sql — generated from the SDL, committed and reviewed, applied with goose.deploy/docker-compose.ymlPostgres 19, a one-shot migrate, a one-shot seed, and the long-running MCP server.deploy/seed/seed.sqlA hand-extracted three-file Go package, shaped the way the M2 extractor will produce it.docs/This site: landing, docs and the demo.features/, test/integration/A godog feature and an integration test that starts the real containers and asserts a seeded descriptor comes back over MCP.deploy/gopgql.Dockerfile builds both binaries from a pinned commit instead — the escape hatch §14 M1 explicitly allows. Swapping back is deleting that file and giving the two services animage: line; nothing else in deploy/ changes.The two migrations
gopgql emits the tables and the property graph as separate, consecutively numbered migrations, so no single file mixes DDL with the graph definition. That ordering matters later: editing the SDL produces a graph-down, tables, graph-up sequence, and one gopgql migrate applies it in order.
Note the absence of --sdl. With it, gopgql regenerates the migration history from the SDL before applying it. Without it, the container applies exactly what is in the tree — so an SDL that has drifted from its migrations fails a review rather than silently reshaping a database. Regenerating is a deliberate, separate step:
What M1 does not ship
No extractor, no orchestration, no protobuf artifacts, no link pass. Every cross-file edge in the seed is written out by hand, in the place where the link pass will later compute it. That is deliberate: the derived edges are part of the model, and M1 is a claim about the model.
The milestones
Every milestone is a working, integration-tested, deployed vertical slice — never a shim. The product works from M1; later milestones optimise the ingestion internals in place without regressing it.
M1M2M3M4M5M6–M7M8M9+Next: the core model — the three vertex tables and the two kinds of edge between them.