Skip to content
Agentmart
Submit a tool

malloy-model-as-you-go

After answering a data question, write down what the answer assumed so the next reader can trust the number.

Skill by malloydata

IndexedMIT★ 118
Write a review

Chalk Labs

Need help deploying malloy-model-as-you-go?

Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.

Book a call

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/malloydata-malloy-model-as-you-go

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

After answering a data question, write down what the answer assumed so the next reader can trust the number. A field with a #(doc) in the model when you can edit it, an extend in the notebook when you can only author reports, or a stated assumption plus a Malloy snippet when you can only chat. Use after every answered question that rested on a judgment call, and whenever a question is asked against tables that have no model yet.

Use cases: documents, data, writing

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/malloy-model-as-you-go

What's inside

Skill name
malloy-model-as-you-go
Description
After answering a data question, write down what the answer assumed so the next reader can trust the number. A field with a #(doc) in the model when you can edit it, an extend in the notebook when you can only author reports, or a stated assumption plus a Malloy snippet when you can only chat. Use after every answered question that rested on a judgment call, and whenever a question is asked against tables that have no model yet.
License
MIT
Instructions
302 lines in SKILL.md · view on GitHub

Files (1)

  • SKILL.md

SKILL.md (first lines)

<!--
Copyright (c) Credible Data Inc.
SPDX-License-Identifier: MIT
-->

# Model as you go

An analysis that lives in a chat transcript is not reproducible. The numbers were right, and
six weeks later nobody can say what "revenue" excluded, which of four timestamps was the order
date, or whether the last period was complete. The work is unauditable, so it gets redone.

The fix is to write the assumptions down while the query is still in front of you, in the
most durable place your session can write. Answer the question, codify what the answer
assumed, answer the next one. After a handful of questions there is a model, or a notebook,
where every definition exists because a real question needed it, and every judgment call is
on the record.

This skill is the codify step. `skill:malloy-analysis` answers the question; this skill
decides what to write down afterwards, and where.

> **Tool names** are bare here - `get_context`, `execute_query`, `search_database_schema`. The
> exact prefixed name depends on the host; match against the tools you actually have.

## The loop

```
QUESTION → ANSWER → CODIFY  ⟲
              ↑___________|
```

**The user gets a real answer on question one.** If three tool calls have gone by without
producing an insight they can read, you have drifted into modelling for its own sake. Stop and
answer something.

## 1. Answer the question, with `skill:malloy-analysis`

This skill starts when someone asks a data question. **That question is the unit of work, and
it is theirs.** Do not widen it into a modelling project, and do not swap it for a more
interesting one you found on the way.

**A broad ask is still an ask.** "Analyse the sales data" is a question whose subject is given
and whose metric is not. Pick the most obvious question about that subject, say in one line
which one you picked, and answer it. Never open with a row-count table and a menu of
"analytical domains"; the menu is worth less than the first real answer would have been.

Load `skill:malloy-analysis` and follow it: discover the model, construct the query, run it,
verify it, present it. Two of its rules matter most here:

- **Every number you present comes out of a query.** Adding up the rows of a `limit: 15` table
  by hand drops everything below the cut, and nobody can re-run it.
- **Your first result is a draft.** Work step 5 of `skill:malloy-analysis` (verify before trusting) before presenting.

### Name the decisions the answer rests on

**This is what makes the analysis auditable, and it is the step most easily skipped.**

Almost every query needs at least one judgment call the data cannot settle. Which of four
timestamps is "the order date". Whether returns count as revenue. Whether to count lines or
orders. Whether a partial final period belongs in a trend.

A judgment call made silently becomes a hidden assumption. It will be wrong for someone
eventually, and by then nobody remembers it was a choice rather than a fact. So make the call,
run with it, and **say what you chose and what you rejected**, with the other number attached
whenever it is cheap to get:

> Revenue here excludes cancelled **and** returned orders - that's $8.10M. Counting returns as
> revenue and netting them separately gives $9.18M. I went with the stricter one; say if your
> reporting does it the other way.

Not every choice rises to this. Raise it when **any** of these holds:

| Raise it when | Because |
|---|---|
| The alternative changes the number materially | The user would answer differently depending on which they meant |
| You are about to codify it | It stops being your choice and becomes everyone's definition |
| A reasonable analyst would pick the other one | It is a convention, not a fact |

Otherwise state it in a clause and move on. **Asking about everything is as bad as asking about
nothing**; it turns the loop into a form and trains the reader to skim past it. And **give the
number under each option, not an abstract question**: "$8.10M excluding them, $9.18M
including" lets the user answer in one word.

## 2. When there is no model yet

If the tables have no model, define only enough to run the first query. One line is normal:

```malloy
source: order_items is my_conn.table('ecommerce.order_items')
```

**Read the columns with `run: source -> { select: * limit: 3 }`.** Prefer it to a schema
listing: it returns the columns *and* real values, and the values are what catch the surprises
a column list hides - a date stored as a string, a `total` that excludes tax, a metric column
that is null on every row.

If a schema tool returns something you cannot explain (no columns, or no tables for a filter
you can see matches), that is a bug in the tool. Report it. Do not write the workaround into
your model or your notes as though it were a property of the data.

No `primary_key:`, no dimensions, no measures, no joins, **not yet**. Those arrive in CODIFY,
each one paid for by a question that needed it. Adding fields because the table has them is the
habit this skill exists to break.

Add a join only when *this* question cannot be answered without it, then verify its cardinality
before trusting any aggregate (`group_by: fk, aggregate: n is count(), having: n > 1`).

If a model already exists, ground yourself in it with `get_context` and reuse what is there.

## 3. CODIFY: write the answer's assumptions down

Run this after *every* answered question, while the query is still in front of you. Skipping it
is how a session ends with a transcript and nothing else.

### Where it goes depends on what you can write

The same assumption lands in a different place depending on the session. Pick the **highest
rung your tools allow**, and never skip codifying because the top rung is out of reach.

| You can | Codify as | Who inherits it |

From malloydata/publisher, MIT.

More from malloydata/publisher

Signals

Stars
118
Forks
31
Open issues
106
Last commit (this folder)
Oct 12, 2026 (20 days ago)
Last release
Oct 18, 2026 (13 days ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from malloydata

Done for you

Rather not set it up yourself?

Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.

See how we build AI agents →Read the case studies

Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.

launches shipped
50+
launches shipped
media placements
500+
media placements
founders on every account
2
founders on every account

Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block

Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.

Get malloy-model-as-you-go running in your business

Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.

Goes to the Chalk Labs founders, not the newsletter. Privacy

Need help deploying malloy-model-as-you-go?

CallGet help
Cite this page

malloy-model-as-you-go skill. Agent Mart. https://agentmart.dev/skills/malloydata-malloy-model-as-you-go (last updated 2026-10-24)