spillwavesolutions/data-engineering-knowledge-capture
Data Engineering Knowledge Capture: schemas, lineage, medallion, semantic models, and glossary into a durable OKF knowledge graph. Multi-host bindings and write isolation.
Changelog
Unreleased
0.5.3 — 2026-09-12
Breadth-first reverse-engineering plan, matching SAC 0.5.6’s plan → task list → signal-gated specialist fan-out, without replacing DEKC’s adversarial judges.
Added
dekc_plan.py: cheap map of scan roots + optional export paths. Writes.dekc/re-plan.md/.json/ progress (ranked areas, checklists, suggested sub-agents).mark/showfor done/blocked. Signal-gated: no Airflow markers → noairflow-scout.dekc_orchestrate.py --plan-onlyand--from-plan --area. Same flags ondekc_walk.py. Unattended orchestrate plans first, then captures only domains the plan detected.- Skill
dekc-plan/ command/dekc-plan. Orchestrators teach plan → ranked task list → producer specialists → existing skeptics →re-adversary-judge. Query-timedata-retrieverstays separate. - Signal-gated specialists:
airflow-scout,glue-job-scout,fabric-pipeline-scout, thinadf-scout/stepfunctions-scout/composer-scout/cron-loader-scout,dbt-elt-scout,duckdb-scout,notebook-scout,dq-scout. - Cheap walk capture for DuckDB,
.ipynbSQL cells, Delta_delta_log, orchestration job stubs, and DQ markers (GE / Soda / dbt tests — no runtime).
Notes
- DEKC owns data orchestration + ELT/ETL. SAC owns CI/CD. Actions that only trigger Glue/dbt are a cross-link note, not a Pipeline noun.
- No live Glue/S3/Fabric control-plane calls. Exports/mirrors only.
0.5.2 — 2026-09-12
Query-time retrieval sub-agent, matching the PKC/SAC parity pattern: search + score + pack + deepen stay off the parent; the parent gets a summary card only.
Added
data-retrieveragent — retrieval-only. No capture, walk, reverse engineer, or knowledge writes. Returns a retrieval card (seed, fit, engine, pack stats, lead nodes, lineage note, gaps, next)./dekc-retrieveskill + slash command. Parent must spawndata-retrieverand must not rundekc_search.py/dekc_pack.pyin-process for Q&A. Orthogonal fan-out: PKCknowledge-retriever, SACarchitecture-retriever.dekc_pack.py --summary— compact card-friendly output, bodies off (root included), fail-closed token budget. Retriever prefers--tiny --summary.
Notes
- Reverse-engineering agents (
data-lake-walker,lineage-tracer, …) are unchanged. Query-time is a separate section on the RE orchestrator.
0.5.1 — 2026-08-31
Correctness patch for catalog rendering and the rg-backed reverse index. Both defects were found by porting the system-architecture-capture v0.5.4 fixes to the shared DEKC code.
Fixed
refresh_catalog_index()no longer crashes on a YAML scalar title.title: 421parses as an int, and_escape_link_label()assumed a string, so one legacy title aborted the refresh after capture had already written concepts. A falsy-but-real title (0,false) also no longer falls back to the file stem. (#51)- The rg-backed lineage pack no longer drops matches when the bundle is
addressed through a symlink.
rg_list_files()resolves its hits, sopath.relative_to(bundle)raised and the handler silently discarded a real lineage neighbor while the pack still reportedreverse_index: rg. (#52)
0.5.0 — 2026-08-30
Retrieval ladder: Git + Markdown stays source of truth. Accelerators are disposable.
Replaces the JSON knowledge/.index/ inverted index (which was committed by accident).
Added
- ripgrep accelerator for search and pack.
dekc_search.pyusesrg -las a candidate prefilter whenrgis on PATH (orDEKC_RG_PATH/PKC_RG_PATH/OKF_RG_PATH). Ranking stays in Python, so scores match a full scan.--no-rgforces the linear walk. Missing rg is not an error. Never installed from a hook. - rg-backed reverse index in
dekc_pack.py. Inbound discovery isrg -lFof the concept path; the current file is always parsed for outbound typed-flow + SQL lineage (the file almost never contains its own path). dekc_doctor.pyreports a toolchain section (rg found/missing, FTS5, index).- SQLite/FTS5 incremental index.
scripts/dekc_index.pywritesknowledge/.dekc/index.sqlite(gitignored). Search and pack self-heal via mtime+size on every call. LIKE on a stored haystack is the default candidate prefilter so Python scores stay identical to a scan.--engine ftsis the FTS5 MATCH opt-in.--no-index/DEKC_NO_INDEX=1fall through to rg then scan./dekc-indexskill for status/refresh/drop.buildremains an alias forrefresh --force(CI / existing skills). - SQL lineage edges store
origin(the file that authored them) so incremental delete does not leak table-to-table edges after the source file vanishes. - Retrieval ladder locked in
docs/designs/retrieval-ladder.md.
Changed
- Host manifests (
.opencode/plugin/dekc.json,public/data/catalog.json) lockstep with rootplugin.json0.5.0. They were still labeled 0.4.2.
Notes
- Pack identity: lineage is undirected for every visited node; extra non-lineage
links[]still attach to the focus only. Graphs match a scan unless--engine fts. dekc_pack.py --mermaidstill callsbuild_graph(full scan). Accepted leftover.- Do not ignore the whole
.dekc/directory —.dekc/config.example.ymlis committed. Gitignore only**/.dekc/index.sqlite*.
0.4.3 — 2026-08-30
dekc_doctor.pyreports toolchain (ripgrep / SQLite FTS5). Search already goes throughknowledge/.index; rg is optional, not a second index.
0.4.2 — 2026-08-25
Fabric reverse-engineering walk fixes (#44).
Fixed
- #26 YAML
description: >/|is a block scalar, not a nested map._patchno longer eatstimestamp/rel/status. - #27
dekc_grade.pycoerces non-string descriptions instead of TypeError. - #28 Schema
containsmerges; last table no longer wins. - #29
slugifykeeps apipetoken;--slug/--fabric-id; colliding titles suffix-2. - #30 Generated captures default
verified: falseunless--verifiedor SQL/columns. - #31
--sourcewithout SQL/evidence isrelated_to, notsourced_from. - #32 LineagePath accepts absolute paths; BI hops use
queries; no automatictransforms_to. - #33 IngestionJob layer
writes_toonly with--lands-as;--refreshesfor semantic refresh. - #34 DataLake mermaid lists only the layers passed.
- #35
workflowsubcommand errors and points atingestion/transformation. - #36 Vacuous SemanticModel body sentence removed.
- #37 WriteEvents opt-in (
DEKC_WRITE_EVENTS=1/--write-event); gitignore fragment. - #40
build_graphreads PKCrel:maps as well aslinks[]. - #42
vw*/x_vw*/CREATE VIEWcapture as View. - #43 One
log.mdline per CLI invocation.
Added
- #38
dekc_walk.py --fabric-items/--pbi-bindings/--inventory(filesystem walk remains). - #39
dekc_grade.py/dekc_doctor.pydefault to the 29 DEKC nouns;--prefix/--tag/--since/--all. - #41
--fabric-id/--workspace/--dataset-id/--fabric-typeon capture CLIs.
0.4.1 — 2026-08-24
- Noun-ownership migration guide:
docs/user_guide/noun-ownership-migration.md(dataWorkflow→IngestionJob; mixed Diagram/AgentNode stay with SAC/AGER).
0.4.0 — 2026-08-24
Changed
- Noun ownership. DEKC keeps the data plane. Removed leaked types:
AgentNode,Workflow(AGER),ContextPack/BaseConcept(okf-plugin),Diagram/Wireframe(SAC). - Registry 0.3.0 lists the 29 DEKC nouns. README has the full table.
- Dual-owned names documented:
Dashboard,DataLake,GlossaryTerm(also SAC).
0.3.5
- WikiTicket SDD (worklog) is the tracking system for this plugin.
0.3.4
- Three-host hooks: Codex + Cursor-native when Claude hooks exist.
0.3.3 — 2026-08-17
- Cursor host.
.cursor-plugin/plugin.json(Cursor Plugins) plus.cursor/rules/second-brain.mdc. Docs:docs/CURSOR.md.docs/GROK_BOT.mdnow covers Grok Bot spawning Cursor cloud agents.
Notable changes to data-engineering-knowledge-capture. Newest first.
0.3.2 — 2026-08-16
Added
- ContextPack token budget matches second-brain-core 0.3.3 / PKC 0.7.2: default 1/4 of
SECOND_BRAIN_WINDOW_TOKENS(128000 → 32000). Override with--max-tokensorSECOND_BRAIN_PACK_MAX_TOKENS. - Pack is fail-closed when the rendered subgraph exceeds the budget.
--writeis skipped. - Bodies off unless that node is the pack root. Neighbors keep title, type, path, and frontmatter
descriptiononly. - Node clip (
--max-nodes/--tiny) is not a token budget. - Implements part of okf-plugin#55.
0.3.1 — 2026-08-16
Added
- Required identity on every knowledge write:
--authororSECOND_BRAIN_IDENTITY. write_knowledge()stampsauthorand emits aWriteEvent.write_conceptstays pure.- Wired through capture, walk, platform, diagram, business, brain
--write, pack--write, grade--write, and link. - Fail-closed tests. Scan / pack / grade / brain print-only paths do not require identity.
0.3.0 — 2026-08-15
Added
- Multi-host bindings + write isolation. Root Agent Plugins 1.0
plugin.json, Grok Bot / Deep Agents / isolation / onboarding docs, host wrappers, vendoredscripts/brain_session.py, anddekc-sessionskill/command. - Concurrent writers read
mainand writebrain/<actor>/<session-id>. Close via PR against the checkout's existing remote. - Isolation tests use fictional lumenfield-detector / northstar-console actors only.
0.2.1 — 2026-08-13
Changed
- Aligned BaseConcept with the shared okf-plugin envelope. Required frontmatter
is now
type+titleonly (descriptionandtimestampstay recommended).dekc_validate.pyand every type schema were updated so a mixed second brain with PKC/SAC nodes that omit those fields still validates. truth_stateunion. Accepts PKC/SAC values (snapshot,superseded,archived) in addition to DEKC'scurrent | historical | proposed.
0.2.0 — 2026-08-10
Six fixes, all found by running this plugin alongside project-knowledge-capture
and system-architecture-capture against a single shared bundle.
Fixed
-
Frontmatter round-trip doubled backslash escaping. The dumper escaped backslashes and quotes; the reader stripped only the surrounding quotes. Every write-modify-write cycle re-escaped already-escaped text, doubling the backslash count each pass. Worse here than in the sibling plugins, because both
write_conceptandrefresh_catalog_indexdo a read-modify-write and the latter is driven by the curate hook — so ordinary editing compounded it. It was also self-concealing: reading back with the same parser returned a value that looked correct. (#3) -
A bracketed concept title dropped the catalog edge.
Fact [Sales]rendered as[Fact [Sales]](/tables/a.md), which the graph reader's link regex cannot match. That produces a missing edge rather than a broken one, andvalidatereports only broken edges — so the concept lost its catalog backlink silently. Note this half needs the matching reader change to take effect: backslash escaping does not rescue a reader whose label class is[^\]]+. (#2) -
The
· <layer>annotation broke shared bundles. It fired for any concept with alayerkey in any of the 32 catalogs, including the 8 thatsystem-architecture-capturealso declares — whose renderer emits a bare- [label](path). So a shared catalog flipped on every alternation between plugins. Now scoped to catalogs only this plugin owns; all three plugins render a shared catalog byte-identically. (#4) -
refresh_catalog_indexaccepted any catalog name. It now refuses catalogs this plugin does not declare, so an outside caller cannot drive this renderer over a sibling's catalog. On its own this does not stabilise a shared bundle — for a catalog two plugins both declare it passes in both — which is why the annotation scoping above is the load-bearing change. (#4) -
resolve_knowledge_rootfell through tosample-knowledge/in silence. When the configured root is not an initialized bundle, resolution probes other candidates. That is reasonable; not saying so was not. There are 16 call sites and onlydekc_doctorannounced the bundle it used — and this repo ships asample-knowledge/, so a capture run inside a clone wrote there. (#5) -
The curate hook refreshed all 32 catalogs on every edit. Each refresh is a whole-file read-modify-write, so rapid edits raced by construction. Now scoped to the catalog containing the edited file. (#6)
-
dekc_link --helpadvertised eight relations, none of which produced a lineage edge. The intersection ofDEFAULT_RELATIONS[:8]with the setbuild_graphhonours was empty, and--relis unvalidated. Four relations the plugin itself emits and documents as flow —lands_as,lands_into,visualizes,consumes_stream— were also ignored, so packs built from them were incomplete. The honoured set is now named constants, those four are honoured, and the help names what actually works.implements/documentsstill produce no edge:graph.jsonis lineage adjacency by design. (#7)
Added
-
A
.gitignorefragment attemplates/gitignore-fragmentand a README note, since nothing previously told users the derived.index/should not be committed. Uses**/.index/, which holds at any depth and for every bundle rather than one hardcoded name. (#8) -
dekc_indexnow explains a zero-edge lineage graph instead of writing a bare0that is indistinguishable from a failed build.
0.1.0
Initial release.