"""Readers that turn a codebase into facts for the `code` reasoning module. Each reader walks a tree in one language and produces the rows; `core` turns rows into a program and owns the CLI. Adding a language is a walker, not a second copy of the emitter. dke-ingest-python ./src > facts.dpy dke-ingest-cpp ./src ./include > facts.dpy Both are lower bounds by construction: every edge they record is one the source makes plain, and dynamic dispatch is not visible to a reader. Each module says where its own limits are — read that before trusting a count. """