EKOS — Enterprise Knowledge Operating System

What breaks if I change this?
Who knew how this worked?

Two questions every engineer inheriting a legacy estate asks, and neither one has a grep-shaped answer. They span an ETL job, a schema, an ORM layer, a service, and eight years of commit history at the same time. EKOS compiles all of that into one evidence-backed ledger and answers from it — every claim traceable to the line it came from. This deck is real output from real runs, unedited, including the places it doesn't work yet.

grep across 5 systems, by hand one compiled ledger, one query multi-hop impact, cited gaps named, never guessed
§ 01 / the real problem
what "legacy" actually means in practice

The knowledge didn't get lost. It got scattered across formats no single tool reads.

A real estate is an ETL repository, a SQL schema, a columnar warehouse, a backend in one language, a frontend in another, a CI config, and a git history — each of which has a tool that reads it well and nothing that reads them together. So the answer to a cross-boundary question lives in an engineer's head, and that engineer left.

A code indexer sees the code. A lineage tool sees the warehouse. Neither sees the Kettle XML, and no one sees all three at once.

Impact analysis

"If I edit step 2 of this 12-step pipeline, what downstream steps and tables am I touching?"

Archaeology

"What does this system contain, who owned which parts, and which parts had exactly one owner?"

§ 02 / why not just ask an LLM
the difference that matters when the answer is wrong

An LLM will answer confidently either way. A ledger tells you where the answer came from.

Every object, relationship, and claim in EKOS carries evidence pointing back to a real file, line, or commit. Nothing in the deterministic path is inferred; the opt-in LLM tier is layered on top of the compiled data, never in place of it, and never silently. When a relationship isn't backed by real compiled evidence, the diagram says so instead of drawing a line that doesn't exist.

a real System Decomposition diagram, when a layer edge isn't yet evidenced
%% No real compiled relationship yet connects these layers to each other.

That comment is generated output, not a caveat added to this slide. The system's posture toward its own gaps is the product.

§ 03 / impact analysis
real MCP call, real Pentaho transformation, unedited

Five hops of downstream impact, without opening the file.

ekos_impact — dependents of an early step
→ tools/call ekos_impact { "id": "f7238521-...", "direction": "dependents", "max_hops": 5 }

← result { "count": 5, "hops": [
  { "hop": 1, "name": "...ktr:4", "via": "FeedsInto" },
  { "hop": 2, "name": "...ktr:6", "via": "FeedsInto" },
  { "hop": 3, "name": "...ktr:8", "via": "FeedsInto" },
  { "hop": 4, "name": "...ktr:7", "via": "FeedsInto" },
  { "hop": 5, "name": "...ktr:3", "via": "FeedsInto" }
]}

Directed and kind-filtered — dependents answers "what do I break," dependencies answers "what do I depend on." The step order is recovered from real Kettle XML, not from a naming convention or a guess.

§ 04 / impact analysis
migration, not just inspection

Rewrite a pipeline in a different technology. Prove exactly one rule changed.

ekos_transformation_diff — Pentaho .ktr vs. a SQL CREATE VIEW redraft
filters:
- status = 'active'
+ status = 'active' AND region = 'EU'

sources, sinks, joins,
aggregates, calculates,
unmapped: unchanged

The exact reassurance a migration needs and code review can't give: the two pipelines are compiled to the same intermediate representation, so the diff is over logic, not over text in two different languages.

This ran as a real end-to-end benchmark, not a demo script — a real Pentaho job and a real SQL redraft through the full pipeline, queried only through the MCP tools. Coverage: zero unmapped nodes on either side, every explanation step evidenced.

§ 05 / impact analysis
the same session, an honest gap

Impact tracing doesn't yet cross the SQL ↔ Pentaho boundary.

ekos_dependents — a SQL-defined fact table
→ tools/call ekos_dependents
   { "id": "a77168f6-..." }

← result {
  "target": { "kind": "Table" },
  "dependents_count": 0,
  "dependencies_count": 0
}

A real .ktr in the same workspace writes exactly this table. But the SQL Table object and the Pentaho Sink node referencing it by name aren't yet resolved to one identity with an edge between them.

Worth knowing before you rely on cross-format impact for a table that only Pentaho touches. It's on the record because a tool you can't calibrate is a tool you can't use for a deploy decision.

§ 06 / archaeology
a real open-source estate, never seen before, from cold

What comes out of an unmodified repo on the first run.

Files observed2,022 — Elixir backend, JS/TS frontend, SQL + ClickHouse
Backend1,231 Elixir files → ~1,260 real modules, ~4,800 real functions
Frontend324 files, real npm dependency data from package.json
Databases57 real SQL tables · 15 real ClickHouse tables (after the parser gaps below were closed)
Git501 commits, 124 contributors compiled into the ledger
CI/CD14 real pipelines parsed from .github/workflows
Issues/PRs1,600 analysed as first-class evidence
Recover stage2.23s wall clock across 9 passes
§ 07 / archaeology
the artifact nobody thinks of as documentation

Git history is the only surviving record of who understood what.

The git analyser compiles change patterns into real graph relationships: files that consistently change together become CoupledWith edges — hidden coupling no import graph shows — and authorship over a path becomes OwnedBy. Commit messages get semantic labels, so "which changes were breaking" is a query rather than an afternoon of scrolling.

On a system whose authors are gone, this is the closest thing to a rationale record that still exists — and unlike a wiki, it can't be stale, because it is the history.

CoupledWith

Files that change together, whether or not they reference each other.

OwnedBy

Who actually touched this path — and which modules only ever had one person.

Point-in-time

EKL supports AS OF <timestamp>: ask what the system looked like before the change.

§ 08 / archaeology
the check that separates real recovery from plausible output

Spot-checked against the source by hand. Not "looks about right."

two real modules, verified against the files directly
// a real auth module
Plausible.Auth.Password
  → exactly its 3 real functions

// a real controller
PlausibleWeb.AuthController
  → exactly 9 real dependency edges

Counts that merely look plausible are the failure mode of every "AI reads your codebase" tool. These were read out of the compiled ledger and then checked against the real source, line by line.

The compiled result also names its own uncertainty: a real ClickHouse dependency with no schema recovered renders as "ClickHouse Database (config only, no tables compiled)" — a genuinely different fact from "no dependency," and kept visibly different.

§ 09 / what doesn't work yet
every one of these was found by running against real data, and published

The gap list is part of the deliverable.

GapStatus
SQL Table ↔ Pentaho Sink identityNot resolved to one identity — cross-format impact returns 0 for these tables
Identity over-merging6 of 15 real ClickHouse tables merged into one by the resolver; found live, reported openly
Data ownership / lifecycleBlocked on a Table→File link and per-file (not per-commit) ownership derivation
Deployment viewNo Terraform/K8s extractors — CI/CD pipelines only
Frontend → Backend edgesDeliberately unattempted; route/fetch matching is lower confidence than the rest
ClickHouse schema without a live connectionConfig-only, and labeled as such rather than inferred

Two real SQL parser gaps in this list were closed after being found this way. The rest are open, and the honest label is what makes the working parts trustworthy.

Point it at your own estate

Compile once. Then ask the questions the docs never answered.

terminal
# compile the estate into one ledger
$ ekos init
$ ekos build && ekos recover && ekos resolve && ekos compile && ekos commit

# what breaks if I touch this?
$ ekos mcp serve   # ekos_impact / ekos_dependents / ekos_transformation_diff

# what did this look like before the change?
$ ekos ekl "... AS OF 2026-01-01"
EKOS · RFC 0018 (impact tracing) · RFC 0028 (Transformation IR diff) · RFC 0096 (point-in-time EKL) · every example on this page is real output, unedited · github.com/alexeyban/EKOS