Jaco van der Laan

Where Should Data Documentation Live? A Modern Architecture for AI-Enabled Teams

28/02/2026  ·  Data Architecture  ·  Data Engineering  ·  Metadata

contracts
‹ ›

Moving beyond Confluence sprawl to a unified, AI-consumable documentation strategy


Where Should Data Documentation Live? A Modern Architecture for AI-Enabled Teams

Moving beyond Confluence sprawl to a unified, AI-consumable documentation strategy


The Documentation Crisis

Every data team I’ve worked with has the same problem: documentation is everywhere and nowhere.

  • Confluence : Data dictionaries, architecture decisions, meeting notes
  • SharePoint : Business glossaries, compliance documents, data contracts
  • Local drives : ERDs, design documents, “that one Excel with all the mapping rules”
  • Wiki : Runbooks, troubleshooting guides, onboarding docs
  • Code repos : README files, inline comments, YAML configs
  • Slack/Teams : Tribal knowledge, “ask John, he knows”

The result? No one trusts any documentation. It’s easier to ping a colleague than search through five systems for an answer that might be outdated.

Now add AI to this mix. You want Claude or Copilot to help your team, but which documentation should it read? The 2019 data dictionary? The updated-but-not-published SharePoint version? The comments in the SQL that contradict both?


The Three-Layer Documentation Stack

After working with multiple organizations on this problem, a pattern emerges:

Let’s break this down.


Layer 1: Extraction — Let AI Do the Heavy Lifting

Your existing documentation isn’t worthless — it’s just scattered and inconsistent. Instead of manual migration (which never happens), let AI analyze and summarize it.

The Extraction Pipeline

# extraction-config.yaml  
sources:  
  - type: confluence  
    base_url: https://company.atlassian.net  
    spaces: [DATA, ARCH, BI]  
    include_attachments: true  
  - type: sharepoint  
    site: https://company.sharepoint.com/sites/DataTeam  
    libraries: [Documents, DataDictionary]  
  - type: local  
    paths:  
      - //fileserver/data-docs/  
      - C:/Projects/legacy-docs/  
extraction:  
  ai_model: claude-3-opus  
  tasks:  
    - summarize_content  
    - extract_entities        # Tables, columns, systems  
    - identify_relationships  # What references what  
    - detect_staleness       # Last updated, contradictions  
    - classify_type          # Glossary, runbook, architecture, etc.

What AI Extracts

For each document, AI produces structured output:

# extracted/confluence/DATA/customer-data-model.yaml  
source:  
  type: confluence  
  space: DATA  
  page_id: "12345"  
  title: "Customer Data Model v2.1"  
  last_updated: 2024-03-15  
  author: john.smith@company.com  
extraction:  
  summary: |  
    Describes the customer dimension model including SCD2  
    historization. Covers CRM and ERP source mapping.  
  entities_mentioned:  
    - dim_customer  
    - stg_crm_customer  
    - stg_erp_customer  
  relationships:  
    - from: stg_crm_customer  
      to: dim_customer  
      type: feeds  
    - from: stg_erp_customer  
      to: dim_customer  
      type: feeds  
  key_decisions:  
    - "SCD2 chosen over SCD1 for audit requirements"  
    - "CRM takes precedence over ERP for contact data"  
  staleness_indicators:  
    - "References deprecated ERP system (migrated 2025)"  
    - "Column 'legacy_id' mentioned but not in current model"  
  classification: architecture_document  
  confidence: 0.85

Human Review Dashboard

AI extraction isn’t perfect. Build a simple review interface:

Key insight : Humans curate, AI extracts. Don’t ask humans to migrate — ask them to validate.


Layer 2: Curation — Git as Source of Truth

Once extracted and reviewed, documentation lives in Git. Why Git?

Repository Structure

Format Guidelines

When to use Markdown:

  • Narrative documentation (READMEs, runbooks, ADRs)
  • Anything humans will read directly
  • Content that benefits from formatting (headers, lists, code blocks)

When to use YAML:

  • Structured metadata (entities, attributes, relationships)
  • Configuration that tools consume
  • Data that needs validation against schemas

When to use JSON:

  • API contracts (OpenAPI/JSON Schema)
  • Tool-specific formats (VS Code settings)
  • When YAML multiline strings get awkward

The CLAUDE.md Pattern

Every repository has a CLAUDE.md that serves as an AI entry point:

# Data Knowledge Repository

This repository contains documentation for the Enterprise Data Platform.  
## Quick Navigation  
- **Looking for a data source?** → `sources/` directory  
- **Looking for a business term?** → `glossary/` directory  
- **Looking for a table definition?** → `entities/` directory  
- **Looking for how to fix something?** → `runbooks/` directory  
## Key Conventions  
- Entity names follow `layer_domain_name` pattern (e.g., `dim_sales_customer`)  
- All dates are UTC unless specified  
- PII columns are tagged with `classification: pii` in YAML  
## Recent Changes  
- 2026-02-28: Added customer churn metrics (entities/fact_customer_churn/)  
- 2026-02-25: Updated ERP integration after v3 migration  
- 2026-02-20: New data quality rules for order validation  
## How to Update  
1. Create a branch  
2. Edit relevant files  
3. Submit PR for review  
4. CI validates schemas and generates previews

Layer 3: Consumption — Generate, Don’t Duplicate

The curated repository is the source of truth. But different audiences need different views. Generate them.

Confluence/SharePoint Generation

# .github/workflows/generate-docs.yaml  
name: Generate Documentation

on:  
  push:  
    branches: [main]  
    paths: ['entities/**', 'glossary/**', 'architecture/**']  
jobs:  
  generate:  
    runs-on: ubuntu-latest  
    steps:  
      - uses: actions/checkout@v4  
      - name: Generate Confluence pages  
        run: |  
          python scripts/generate_confluence.py \  
            --source entities/ \  
            --target-space DATA \  
            --template templates/entity-page.html  
      - name: Generate data dictionary  
        run: |  
          python scripts/generate_dictionary.py \  
            --source entities/ \  
            --output docs/data-dictionary.xlsx  
      - name: Upload to SharePoint  
        run: |  
          python scripts/upload_sharepoint.py \  
            --file docs/data-dictionary.xlsx \  
            --library "Data Documentation"

What Gets Generated Where

MCP Servers for AI Access

For Claude Code and Copilot, expose documentation via MCP:

# mcp-servers/knowledge/server.py  
from mcp.server import Server

server = Server("data-knowledge")  
@server.resource("entity/{name}")  
async def get_entity(name: str) -> dict:  
    """Return entity documentation."""  
    path = Path(f"entities/{name}/entity.yaml")  
    if path.exists():  
        return yaml.safe_load(path.read_text())  
    return {"error": f"Entity {name} not found"}  
@server.resource("glossary/{term}")  
async def get_term(term: str) -> dict:  
    """Return business term definition."""  
    path = Path(f"glossary/{term}.md")  
    if path.exists():  
        return {"term": term, "definition": path.read_text()}  
    return {"error": f"Term {term} not found"}  
@server.tool("search_knowledge")  
async def search(query: str) -> list[dict]:  
    """Search across all documentation."""  
    results = []  
    for path in Path(".").rglob("*.md"):  
        content = path.read_text()  
        if query.lower() in content.lower():  
            results.append({  
                "path": str(path),  
                "snippet": extract_snippet(content, query)  
            })  
    return results[:10]  
@server.tool("get_entity_lineage")  
async def lineage(entity: str) -> dict:  
    """Get upstream and downstream dependencies."""  
    path = Path(f"entities/{entity}/lineage.yaml")  
    if path.exists():  
        return yaml.safe_load(path.read_text())  
    return {"error": f"No lineage for {entity}"}

Now developers can ask: “What’s the definition of customer churn?” or “Show me the lineage for dim_customer” directly in their IDE.


The Migration Journey

Phase 1: Extraction (Weeks 1–4)

  1. Connect to sources : Confluence API, SharePoint Graph API, file shares
  2. Run AI extraction : Summarize, classify, detect staleness
  3. Build review queue : Simple UI for human validation
  4. Initial triage : Mark documents as current, obsolete, or needs-update

Success metric : 80% of documents classified

Phase 2: Curation (Weeks 5–8)

  1. Set up Git repository : Structure, templates, CI/CD
  2. Migrate priority content : Start with most-accessed documents
  3. Establish review process : PR templates, CODEOWNERS
  4. Train team : How to find, update, and add documentation

Success metric : Top 50 documents migrated and validated

Phase 3: Generation (Weeks 9–12)

  1. Build generators : Confluence, SharePoint, diagrams
  2. Set up MCP servers : Entity, glossary, search
  3. Deprecate old sources : Add banners pointing to new location
  4. Continuous sync : Changes in Git → regenerate downstream

Success metric : Zero manual Confluence updates needed

Phase 4: Steady State (Ongoing)

  1. Monitor freshness : Alert on stale documents
  2. Track usage : Which docs are accessed, which are ignored
  3. Continuous extraction : New Confluence pages → extraction queue
  4. Feedback loop : User corrections improve AI extraction

Handling the “But We Need Confluence” Objection

You’ll hear this. Here’s how to respond:

Objection : “Business users expect Confluence.”

Response : Keep Confluence — as a read-only view. Generate beautiful pages from Git. Users get familiar UI; you get version control and AI access.


Objection : “We can’t make everyone learn Git.”

Response : They don’t need to. Most users only read documentation. The 20% who write documentation already use code tools. For others, build a simple web form that creates PRs.


Objection : “What about comments and discussions?”

Response : Two options:

  1. Keep discussions in Confluence (it’s ephemeral context, not documentation)
  2. Use GitHub Discussions for technical decisions, link from docs

Objection : “Our compliance team requires SharePoint.”

Response : Generate compliant exports to SharePoint. The audit trail is actually better with Git (every change tracked, attributed, and reversible).


The Payoff: AI That Actually Helps

With this architecture in place:

Before

After

The Real Win

It’s not just about AI. This architecture gives you:

  1. Single source of truth : One place to update, multiple views generated
  2. Version control : Who changed what, when, and why
  3. Review process : No more rogue documentation updates
  4. Validation : CI catches broken links, missing fields, schema violations
  5. Searchability : grep > Confluence search, always
  6. Portability : Leave Confluence? Just regenerate to the new platform
  7. AI-readiness : Claude, Copilot, or your own tools can consume directly

Practical First Steps

Don’t boil the ocean. Start here:

Week 1: Prove the Concept

  1. Pick one high-value entity (e.g., dim_customer)
  2. Create a Git repo with the structure above
  3. Write entity.yaml and README.md manually
  4. Set up a simple Confluence generator
  5. Show stakeholders: “This page is generated from Git”

Week 2: Add AI Extraction

  1. Connect to Confluence API
  2. Run extraction on 10–20 related pages
  3. Review AI output, tune prompts
  4. Migrate extracted content to Git

Week 3: Build the Loop

  1. Add CI/CD for validation and generation
  2. Create MCP server with basic search
  3. Demo to developers: “Ask Claude about dim_customer”

Week 4: Scale

  1. Prioritize remaining documents by access frequency
  2. Set up review queue for human curation
  3. Plan rollout by team/domain

Key Takeaways

  1. Documentation architecture matters : Random files in random systems = no one trusts anything
  2. AI extracts, humans curate : Don’t ask people to migrate — ask them to validate AI summaries
  3. Git is the source of truth : Version control, review process, CI/CD, AI access
  4. Generate consumption views : Confluence and SharePoint become read-only outputs, not inputs
  5. MCP enables AI access : Structured documentation in Git = AI assistants that actually know your systems
  6. Start small, prove value : One entity, one pipeline, one demo. Then scale.

The goal isn’t to eliminate Confluence. It’s to make documentation trustworthy, maintainable, and AI-accessible.

Your future self — and your AI assistants — will thank you.


Further Reading


The best documentation is documentation you can trust. Trust comes from process, not promises.