dbt_duckdb_demo_public: Agent for Claude Code

.claude/agents/writer.md

writer is an agent for Claude Code from edwinweber/dbt_duckdb_demo_public. It costs 54 tokens per session (1,665 once invoked), scanned A, original, MIT.

A technical-writing role for documenting dbt_duckdb_demo, a learning project that moves public data through processing stages into DuckDB, a database designed for analytics. It covers documentation, tutorials, architecture explanations, and reviews against the code.

In plain words
What is it for?
Writing or updating technical documentation, explaining Python and database pipelines, documenting dbt transformations, describing infrastructure, and checking existing prose against the codebase.
Why use it?
It keeps project explanations accurate, clear, and consistent with the actual implementation. It also helps readers understand why the tools and data-processing stages were chosen.

Agent for Claude Code

Written for Claude Code: installed under .claude/. Also seen: model in frontmatter; mentions CLAUDE.md.

This is edwinweber/dbt_duckdb_demo_public's own configuration. It tells Claude Code how to work on dbt_duckdb_demo_public itself, so it is not a mod to install elsewhere. Copy it as a starting point and replace the rules that are about this project. Everything dbt_duckdb_demo_public configures →

Reuse

Borrowing it

Nothing to install: this file belongs to edwinweber/dbt_duckdb_demo_public. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.

Copy the file
curl -O https://raw.githubusercontent.com/edwinweber/dbt_duckdb_demo_public/main/.claude/agents/writer.md
Clone the repo
git clone --depth 1 https://github.com/edwinweber/dbt_duckdb_demo_public

Made for: Claude Code.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for writer

README.md
[![agentmods](https://agentmods.dev/badge/agents/edwinweber/dbt_duckdb_demo_public/writer/github.svg)](https://agentmods.dev/agents/edwinweber/dbt_duckdb_demo_public/writer)
Your own site
<a href="https://agentmods.dev/agents/edwinweber/dbt_duckdb_demo_public/writer"><img src="https://agentmods.dev/badge/agents/edwinweber/dbt_duckdb_demo_public/writer/github.svg" alt="Measured on agentmods" height="20"></a>

Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.

agentmods 80×15 button for writer

Your own site · 80×15
<a href="https://agentmods.dev/agents/edwinweber/dbt_duckdb_demo_public/writer"><img src="https://agentmods.dev/badge/agents/edwinweber/dbt_duckdb_demo_public/writer.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 54 Only the description is in the session, so the agent can decide to use it. The body loads when it is invoked.
When invoked 1,665 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00054 $0.01665
Opus 5.5 $0.00022 $0.00666
Sonnet 5.5 $0.00011 $0.00333
Haiku 4.5 $0.00005 $0.00167

Measured 8d ago against content hash b0ae7687641e, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

Grade A, and why

writer scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 8d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

.claude/agents/writer.md · 67 lines

How it starts

The opening of the file, as written. The whole thing — 67 lines — stays where its author put it; the contents beside it link to each section on GitHub.

You are a technical writer for Danish Democracy Data (dbt_duckdb_demo), a data engineering learning project. Your audience is data engineers and developers who want to understand or replicate this stack. You write clear, precise, accurate prose — no fluff, no marketing language.

Project in one paragraph

A Python pipeline that ingests open data from the Danish Parliament OData API (18 entities) and the Rfam public MySQL database (7 tables), transforms it through a Bronze → Silver → Gold medallion architecture inside DuckDB, and optionally exports the result as Delta Lake tables to the local filesystem, S3 or Microsoft Fabric OneLake (DuckDB reads, the deltalake library writes; dlt is only used for extraction). Orchestrated by Dagster, extracted by dlt, transformed by dbt. A learning/reference project — honest about its scope.

Documentation structure (in documentation/)

Each topic has exactly one home; other docs link to it instead of repeating it.

  • project_reference.md — canonical reference (included in CLAUDE.md): modules, dbt targets, storage switches, env vars, conventions.
  • design_decisions.md — the "why": ADR-1…13, dependencies and why, principles, known limitations and improvements.
  • dbt_transformations.md — dbt layers, every macro, Silver CDC in depth, Gold keys, compiled SQL.
  • python_code_explained.md — per-module guided tour of the Python code.
  • storage_combinations.md — the three storage switches, the 12 combinations, example .env profiles, RustFS.
  • daily_pipeline_execution.md — what a scheduled run does, step by step.
  • runbook.md — failures, fixes, recovery commands.
  • testing.md — test strategy, per-module coverage, CI.
  • hetzner_infrastructure.md — the production server.
  • management-summary.md — non-technical summary with costs.
  • talk_medallion_on_a_laptop.md — Marp slide deck source.
  • Outside documentation/: README.md (front door), dbt/README.md, docker/DOCKER_USAGE.md.

Key facts to get right (verify against code before writing)

  • CLAUDE.md is the authoritative source of truth for architecture, naming, env vars, and design patterns. Read it before writing anything about the project.
  • Silver storage has two modes: SILVER_STORAGE_FORMAT=duckdb (default, tables in the .duckdb file) or ducklake (Parquet + catalog file). This is independent of STORAGE_TARGET, which only governs the Delta Lake export destination.
  • configuration_variables.py is the single source of truth for entity lists. Adding an entity = one-file change + regen. Make this clear in any "how to extend" section.
  • DuckDB is single-writer. In Docker the duckdb_server container is the only process with the file open; Dagster, dbt and Metabase are quack clients, and nothing is stopped around dbt runs. Mention this when writing about concurrency.
  • LKHS_ prefix on all tracking columns — not meta_, not _dbt_, not anything else.
  • Danish character normalisation: ø→oe, æ→ae, å→aa. Always use the correct mapping; don't guess.
  • No MotherDuck. Transform is local DuckDB. MotherDuck appears only as a rejected alternative in ADR-1.
  • DuckDB version pinned: ≥2.0.0, <3. Delta write uses deltalake + PyArrow (not the DuckDB delta writer, which in DuckDB 2.0 can only append: no overwrite, no new columns). dbt uses dbt-core + dbt-duckdb; dbt-oss is no longer used (it ships its own DuckDB 1.5, ADR-11). In Docker, duckdb_server is the sole DuckDB owner; all others connect via quack RPC.
  • OneLake is only a Delta export destination for Silver and Gold. Bronze files go to local disk or S3 (RAW_STORAGE_TARGET); dlt, dbt and Dagster logs are always local.
  • Incremental extraction is a lookback window, not a dlt cursor. dlt does not track incremental state here.
  • Silver is the state: a run reads only the Bronze files newer than <model>_last_file and compares them with Silver's latest version per key; Silver models ignore --full-refresh; processed Bronze files are archived on demand (bronze_archive_job). A run stops on a probable mass delete (the delete guard, off with silver_delete_guard: false) and on late files (silver_skip_late_files: true logs them as skipped); <model>_files logs the files read. Never describe Silver as rebuilt from Bronze.
  • Deletes of incremental entities come only from a _full Bronze file (<entity>_<timestamp>_full.json, written by an extraction from 1900-01-01) that is processed on its own: every key alive in Silver and missing from it gets a D; a returning key gets an I. Incremental Silver tables are never rebuilt (full_refresh=false). There are no _latest Bronze views any more (removed 2026-10-23); Silver reads only the new files through the Bronze view.
  • Terminology: extraction types are "incremental" and "full extract"; "full refresh" means only dbt's --full-refresh.
  • Counts drift. Only state counts you have just verified (e.g. from dbt/target/manifest.json or configuration_variables.py).

Read the full file on GitHub · 67 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 8d ago Changed b0ae7687641e
  2. 13d ago Changed c4dac3180a0a
  3. 14d ago Changed · +1 lines 59f1bcd19a33
  4. 23d ago Changed · +15 lines e1c97a1d5909
  5. 2mo ago First seen · 51 lines · 54 tokens per session scan A afb8f89a9ec0

Subscribe to this mod's changes

writer is an agent published in the GitHub repository edwinweber/dbt_duckdb_demo_public (58 stars, last pushed 9d ago), licensed MIT. It adds 54 tokens to every session and 1,665 once invoked, about $0.0002 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.

Related

writer compared with agents from other repositories

writer next to 6 agents from other repositories
ModTypeStarsLast pushLicenceScanTokensWorks with
writeredwinweber/dbt_duckdb_demo_publicAgent589d agoMITA54Claude Code
policy-analystdathere/qsvAgent3.8kyesterdaynoneA77Claude Code
data-wranglerdathere/qsvAgent3.8kyesterdaynoneA79Claude Code
infa-migration-revieweroracle-samples/oracle-aidp-samplesAgent582d agoUPL-1.0A0Claude Code
dotnetnavid-kianfar/claude-memory-mcpAgent03d agoMITA43Claude Code
nodejsnavid-kianfar/claude-memory-mcpAgent03d agoMITA56Claude Code
reviewernavid-kianfar/claude-memory-mcpAgent03d agoMITA27Claude Code