datapipelines.co — Specification Index
Spec-first project: these documents ARE the product definition; implementation follows them. Consistency is enforced mechanically — any change here must pass ../scripts/docs-audit.sh (exit 0) before merging. The August 2026 consistency campaign and its ratified decisions are recorded in SPEC-REVIEW-2026-08.
What the product is
A self-hosted server that executes declarative JSON pipelines — DAGs of templated-SQL nodes — against heterogeneous databases, staging intermediate results in a per-execution in-memory H2, and returning results through a uniform Redis-backed cursor. It is MCP-native: LLM agents author and execute pipelines as first-class clients alongside the REST API and the browser UI.
┌────────────── auth (OIDC users · API-key agents · scopes) ──────────────┐
Browser UI ────┤ │
REST client ───┼──► pipeline-contract ──► dag-executor ──► datasources (JDBC dialects) │
MCP agent ─────┤ │ │ │ └──► staging (per-execution H2) │
│ │ └── templates (Freemarker SQL, versioned, libraries) │
│ └─────── type-system (canonical types, per-dialect mappers) │
│ │
└── results/events → Redis (cursor, TTL) · metadata → Postgres (Flyway) ───┘
Reading order
New to the project? Read in this order: type-system → pipeline-contract → templates → datasources → staging → dag-executor (the engine), then rest-api → mcp-server → auth (the surfaces), then the rest as needed.
The documents
Contract authorities (read these before anything that cites them)
| Doc |
Status |
One line |
| type-system.md |
v1.1 frozen |
11 canonical logical types, wire encodings (BIG* = string), per-dialect JDBC mapping tables, UTC normalization |
| pipeline-contract.md |
v1.3 frozen |
Pipeline/Node JSON schema, caller-node result model, validation rules, the single error-code catalog (§13) |
| enums.md |
v1.2 living |
Every enum's wire value + serialization convention; error-code domain registry |
| configuration.md |
v1.2 |
The only place config keys are defined — YAML path, env derivation rule, defaults, validation |
| auth.md |
v2.5 |
Generic OIDC login, internal JWT, API keys, the scope↔operation matrix (§7.6), Spring Security chain |
| metadata-db.md |
v1.1 frozen |
The only doc that writes DDL — full Postgres schema, Flyway V1 source, operational jobs |
Engine
| Doc |
Status |
One line |
| templates.md |
v1.6 frozen |
Freemarker SQL templates: versioning, library imports ({id, version, alias}), SSTI hardening, parse-only save validation |
| datasources.md |
v1.8 |
Named connections, 8 dialects (incl. LAKE — dp-lake, §8C), Hikari/JDBC property passthrough (§5.6 refusal sets), AES-GCM credential storage |
| staging.md |
v1.10 frozen |
Per-execution in-memory H2: lifecycle, identifier safety, mutex-guarded connection behind withConnection, memory limits |
| dag-executor.md |
v1.3 |
Coroutine executor: topological execution, fail-fast, cancellation (Redis flag), result materialization |
| calculators.md |
v1.0 |
The calculator catalogue: 23 pure kinds a CALCULATOR node can run (calendar/fiscal periods, date arithmetic, rounding, percent change, coalesce/map), the eight always-present Context keys (org_*, current_date, …), $name references vs literals, the topology rule. calculators_list returns the same catalogue live; drift-guarded against the registry. |
| template-hierarchy-design.md |
normative |
The name-is-the-path grammar (2–10 segments since 077, the root holds folders only), virtual folders with no identity, typed templates (sql needs a dialect, html does not) and the explorer's tree contract |
Surfaces
| Doc |
Status |
One line |
| rest-api.md |
v1.4 frozen |
Endpoints, envelopes, SSE execution stream, uniform result-delivery cursor (§7), auth/user-admin endpoints (§16) |
| mcp-server.md |
v1.3 frozen |
Streamable HTTP MCP: 35 tools, resources, prompts, the agent skill's four deliveries (§15) — a thin adapter over REST. There is deliberately no datasource-write tool (§6.2.22): no credential travels through an agent |
| ui-screens.md |
v1.1 |
12 CRUD screens: Thymeleaf + htmx, /partials/** convention, standard states |
| pipeline-editor.md |
v1.2 |
Cytoscape execution/visualization surface: vendored assets, SSE wiring, canvas a11y model |
| versioning.md |
v1.4 ratified |
Draft/release lifecycle (copy-on-write drafts in the version tables, content-hash preconditions, UI-only release), version numbers as cross-env identities, UI-driven promotion with two-sided guards |
Operations
| Doc |
Status |
One line |
| deployment.md |
v1.2 |
Docker image, compose/k8s, multi-instance model, Redis requirements, graceful shutdown, sizing |
| environments.md |
v1.0 |
The two variables an org sets — DATAPIPELINES_ENV (their name) and DATAPIPELINES_POSTURE (development | hardened) — the posture table, the env-var contract, loader recipes, demo as a flag, secrets, first login |
| observability.md |
v1.1 draft |
JSON logs + correlation IDs, metric naming/cardinality rules, redaction (normative), health endpoints |
| module-structure.md |
v1.2 |
Gradle modules, exhaustive dependency table, persistence ownership, version catalog + implementation gates |
| key-providers.md |
v1.0 normative |
Where the AES keys that encrypt datasource credentials come from: the KeyProvider contract, the envelope design, the AWS-KMS recipe, and the provider status table (§7 — only env ships today) |
| Doc |
Purpose |
| ROADMAP.md |
Deferred (v1.1/v2), rejected-with-reasoning, operator responsibilities — prevents re-litigation |
| SPEC-REVIEW-2026-08.md |
The 2026-08 consistency campaign: findings, ratified decisions D1–D15, per-doc resolutions |
| ARCH-AUDIT-2026-08.md |
Service-layer gap + multi-instance readiness audit (2026-08-31): findings M1–M10, S1–S5, drift list — pending review |
| TEST-GAP-2026-09.md |
Behaviour-coverage and browser-suite gap audit (2026-09): backfill tiers and the golden-path backlog — findings record, proposed not ratified |
| semantic-layer-research.md |
Research brief (pre-spec) on semantic layers for agent-facing data — input to a future semantic-layer.md, not a commitment |
| ../DEVELOPMENT.md |
Developer setup: local infra, OIDC setup, build/run/test, git workflow |
| ../.agents/skills/datapipelines/ |
The agent skill — SKILL.md (the operating core) + references/. Its references/tools.md is GENERATED from the tool catalog (./gradlew :modules:mcp-server:skillArtifacts), and every derived copy is drift-tested. Not a spec: it tells an AGENT how to use the product, while these docs define what the product is |
| ../plugins/datapipelines/ |
The Claude Code plugin — the same skill plus the MCP server entry, installed with /plugin marketplace add msabiransari/datapipelines. Its skills/ directory is a build-time copy of the skill, never a second source |
House rules (cross-cutting)
- Single authority per fact. Config keys → configuration.md. DDL → metadata-db.md. Error codes → pipeline-contract §13. Enum wire values → enums.md. Scopes per operation → auth §7.6. Other docs link; they never restate.
- Universal save-time validation. Nothing invalid ever reaches the database (pipeline-contract §2.8).
- Custom headers carry the
DP- prefix (rest-api §3.6).
- Docs are the contract. Frozen docs change additively only; every change lands with a Change Log row and a green
docs-audit.sh.
This is the documentation packaged with the running version. The same files live in the
repository on GitHub.