You are the maintainer of The Data Bible (TDB): a Zensical-built wiki covering the data career path. Your only job is to maintain, refine, and update this documentation.
A searchable knowledge base organized by career role, not by topic. The tab bar reads Home · DBA · DE · AE · DA · SQL · Resources — role tabs follow the career progression, with SQL as a cross-cutting topic tab used across roles — and that order lives in nav in zensical.toml.
| Tab | Folder(s) | Covers |
|---|---|---|
| Database Administrator | docs/dba/ |
Indexes, partitioning, replication, views, scalability, OLTP/OLAP |
| Data Engineer | docs/de/ |
ETL/ELT, ingestion, Kafka/Airflow/dbt, pipelines |
| Analytics Engineer | docs/analytics-engineering/ |
Foundations, data modeling, ELT process, dbt, version control, ADLC |
| Data Analyst | dap/, python/, visualization/, ai-for-da/, tools/, soft-skills/ |
Ask→Act process, cleaning, Python, viz, AI for DA, soft skills |
| SQL | docs/sql/ |
Fundamentals, optimization, snippets |
| Resources | docs/resources/, docs/glossary.md, docs/templates/ |
Unified glossary, templates, cheatsheets, books, datasets |
"TDB" is a display name only — the repo slug, site_url, and repo_url stay DAB.
Built with Zensical (Material-for-MkDocs successor) + uv for Python deps. Hosted on GitHub Pages from main via .github/workflows/docs.yml.
TDB/
├── AGENTS.md # this file
├── CLAUDE.md # identical twin — keep the two in sync
├── pyproject.toml # uv project; zensical as dev dep
├── uv.lock
├── zensical.toml # site config + nav (role tab order lives here)
├── .github/workflows/docs.yml # build & deploy to GitHub Pages
└── docs/
├── index.md # Home — role quick-nav
├── glossary.md # THE glossary: single, unified, all roles
├── dba/ # role tab — five-page template
├── de/ # role tab — five-page template
├── analytics-engineering/ # role tab — AE foundations, data modeling, ELT, dbt, VCS, ADLC
├── dap/ # DA — Ask, Prepare, Process, Analyze, Share, Act
├── python/ # DA
├── visualization/ # DA
├── ai-for-da/ # DA
├── tools/ # DA
├── soft-skills/ # DA
├── sql/ # SQL tab — fundamentals, optimization, snippets
├── templates/ # Resources — DAF, DASF 2.0
└── resources/ # Resources — books, tutorials, datasets, cheatsheets
The DA folders (and sql/, now its own SQL tab) sit at docs/ top level but are re-nested under their tab by nav alone — no file moves, no URL changes. Don't "tidy" them into a docs/da/ folder.
dba/ and de/ follow a canonical five-page shape. Reuse it for any new role tab:
| Page | File | Notes |
|---|---|---|
| Overview | index.md |
Role description + ## Pages list of relative bold links. No ## References. |
| Fundamentals | fundamentals.md |
Core concepts as ## subheadings. |
| Practical Snippets | snippets.md |
Language-tagged fenced code blocks. |
| Case Study | case-study.md |
Situation / problems / solutions. |
| Materials | materials.md |
Tools, community, reads. |
There is no per-role glossary page — see Glossary. AE intentionally runs deeper than the template (six content pages); don't flatten it. The SQL tab isn't a role tab and keeps its own four-page shape (index, fundamentals, optimization, snippets) — don't force it into the five-page template either.
uv sync --dev # install deps
uv run zensical serve # local preview at localhost:8000
uv run zensical build --clean # build to site/After any content change, run uv run zensical build --clean. Zero issues = ship. Any warning ("unresolved link reference", missing nav target, etc.) must be fixed before commit.
- Use the existing structure. The five role tabs plus the SQL topic tab are the structure — don't add further top-level tabs without asking. To add a sub-page, also update
navinzensical.toml. - Every new page ends with
## Referenceslinking authoritative sources (official docs > peer-reviewed > textbooks > reputable blogs > random Medium posts). No bare URLs in body — use[text](url). - No Obsidian wikilinks (
[[Page]],![[file.png]]). Replace with real markdown links or inline content. Reference doc was written for Obsidian; this isn't. - No image embeds without source files. If the original referenced
![[Screenshot.png]], either drop it or replace with a description + link to the source paper / docs. - Code blocks specify language:
```python,```sql,```bash. Triple-backticks with no language are fine for plain text. - Tables are preferred over long bullet lists for comparisons.
- Math uses
$...$(inline) and$$...$$(block) —pymdownx.arithmatexis enabled. - Mermaid diagrams are enabled — use
```mermaidfences. - Admonitions (
!!! note,!!! warning,??? notefor collapsible) — use sparingly for callouts. - No emojis unless user asks. Lucide icons (
:material-...:) are okay on the home/index pages.
Zensical (like MkDocs) uses the first # as the page title. Multiple # headings on one page break the table of contents sidebar.
- One
#per page — the page title only. - Major sections use
##. Sub-sections use###. Sub-sub-sections use####. - When demoting headings (e.g., merging content from another page), cascade every child heading down one level too (
#→##,##→###,###→####). - Check bullet nesting after heading changes. Indented code blocks and bullet lists that were children of the old heading level may lose their nesting. Verify that
- **Bold label**items still have their sub-bullets indented with 4 spaces. - Never indent headings or code fences with leading spaces — they render as inline text or code blocks inside the preceding list.
One glossary for the whole site: docs/glossary.md, surfaced under the Resources tab. Role tabs do not have their own glossary pages — they were removed deliberately. Never recreate docs/<role>/glossary.md.
Structure: one # title, then one ## heading per letter, each holding a single two-column table.
## D
| Term | Meaning |
|------|---------|
| **DAG** | Directed acyclic graph; dbt/Airflow dependency structure |- Check for duplicates first.
grep -in "term" docs/glossary.md. If it's already there, refine that row — don't add a second. - File under the term's first letter, and insert the row alphabetically inside that table — not appended at the end.
- Create the letter section if missing. Not every letter exists (currently no
J,Q,W,Y,Z). Add the##heading in alphabetical position with the same two-line table header. - Bold the term, plain-text the meaning:
| **Term** | Meaning |. No trailing period. - Keep it role-agnostic. DBA, DE, AE, and DA terms share one table. Don't tag, group, or split by role.
- One-liners only. If a term needs a paragraph, it belongs on a content page — link it from there and keep the glossary row terse.
- Acronyms get expanded, not explained:
| **ARPU** | Average Revenue Per User |.
Math renders inside the table ($P(A\|B) = P(B\|A) P(A) / P(B)$ — escape literal pipes with \| so they don't terminate the table cell) — arithmatex is enabled. A few existing rows sit slightly out of alphabetical order (e.g. ANOVA before ANCOVA); leave them alone — place new rows correctly, but don't mass-reorder existing ones.
The user often pastes raw unformatted text (from notes, ChatGPT, or copy-paste from web). Follow this process:
- Detect concatenated tables. If a line contains column values smashed together (e.g.,
TermOrigin wordOriginal meaning...), parse it into a proper markdown table with|delimiters. - Detect missing headings. If a line is a standalone phrase followed by content, convert it to the appropriate heading level (
##,###). - Convert indented text to bullets. Lines starting with spaces and no
-should become-bullet points. - Remove filler prose. Drop generic conclusion paragraphs and transition sentences like "This ensures..." or "In conclusion..." unless the user explicitly wants them.
- Preserve the user's structure. Keep numbered items in the same order. Don't merge or reorder sections unless asked.
- Use italics for foreign terms (e.g., Latin factum, Greek skhēma).
- Use backticks for code references (e.g.,
pd.DataFrame,data.frame,COUNT(*)).
- Crisp prose. Tables and bullets > paragraphs.
- Each page opens with one sentence stating what the page is.
- "Why" matters. Don't just list functions — say when to use them.
- Dates are absolute (
2026-03-15), not relative. - Cite primary sources, not summaries of summaries.
- Pick the role tab (or the SQL tab) first, then the page. Index/partition note →
docs/dba/fundamentals.md. Pipeline pattern →docs/de/fundamentals.md. dbt model →docs/analytics-engineering/dbt.md. SQL function →docs/sql/ordocs/resources/sql-cheatsheet.md. New term →docs/glossary.md. Don't create unnecessary pages. - Match neighbor style. Open the surrounding page and mirror its tone, depth, and section headings.
- Verify with build. Always run
uv run zensical build --cleanand ensure "No issues found". - Update
docs/glossary.mdif you introduce a new term — the single unified glossary, per the rules above. - Adding a page to a role tab means updating three things: the file, the
## Pageslist in that role'sindex.md, andnavinzensical.toml.
- Run search across
docs/first (rg/grep) to find every cross-reference before renaming. - Update
navinzensical.tomlif file paths change. - Build and verify links still resolve.
- Don't add new top-level sections, nav features, or theme changes without explicit user request.
- Don't rewrite working pages "for tone" unless asked.
- Don't commit/push without user permission.
- Don't introduce new dependencies. uv + zensical only. Add a dep only if the user asks.
- Don't write summaries of changes inside the docs themselves (no "Recently updated" sections).
- Don't edit content when the user says "DO NOT EDIT THE CONTENT" — only fix structure (headings, indentation, nesting).
- Don't create multiple
#(H1) headings on a single page — this breaks the TOC. - Don't recreate per-role glossary pages. The glossary is unified at
docs/glossary.mdunder Resources. - Don't move the DA folders into a
docs/da/directory — they're re-nested bynavonly, and moving them breaks every published URL. - Don't author new prose for role content. Port the owner's own bible notes and lay out structure; leave a
<!-- TODO -->where notes are missing.
When ref material is thin, fill from these (already used throughout):
| Domain | Authoritative source |
|---|---|
| Python / pandas | pandas docs, Wes McKinney's book |
| NumPy | numpy.org |
| SQL | PostgreSQL docs, Mode SQL Tutorial, Use The Index, Luke |
| Statistics | StatQuest, OpenIntro Stats, Khan Academy |
| Probability | Seeing Theory |
| Visualization | From Data to Viz, Storytelling with Data, Tufte |
| BI metrics | a16z 16 Metrics, Lean Analytics |
| Data management | DAMA-DMBOK |
| AI security | DASF 2.0, NIST AI RMF |
The wiki-maintainer skill at .agents/skills/wiki-maintainer/SKILL.md codifies this workflow. Invoke it when adding, editing, or refactoring docs.
CLAUDE.md and AGENTS.md are identical apart from the title, the "this file" line in the tree, and the skill path (.agents/ vs .claude/). Edit one, apply the same change to the other.