Tables Trace logo

Tables Trace

Organization
clay-run
tables-trace

Clay tables — locate a record by identifier and snapshot its state: which table(s) hold it and each cell's status. Use when the user has an id and asks "trace {id}", "where is {id}?", "what enrichments ran for this lead?", or "is this record done?".

Overview

Publisherclay-run
Repositoryagent-plugins
Skill nametables-trace
Stars
145
Forks
24
Bundled files
Instructions only
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by clay-run on GitHub. Read the source before you install it.

Installation

Install the Tables Trace AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/clay-run/agent-plugins/tree/main/clay/skills/tables-trace
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/clay-run/agent-plugins.git /tmp/agent-plugins
mkdir -p .claude/skills
cp -r /tmp/agent-plugins/clay/skills/tables-trace .claude/skills/tables-trace
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Tables Trace in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Tables Trace on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Tables Trace is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Trace a record

Use when: you have an identifier and want to find the record and see its overall state — "trace 12345", "where is jane@acme.com?", "what enrichments ran for this lead?", "is this record done?". This is a locate + snapshot: which table(s) hold it, and each cell's status. It does not explain why a cell holds what it holds — that's /tables-value-trace.

Treat each in-scope table independently. Tables may not share identifiers or have any relationship; presence (or absence) in one says nothing about another.

1. Settle scope

Resolve which table(s) to look in as in the tables entry-point skill ("Finding a table"), or pass a t_... id directly. {id} is whatever the user gave (email, HubSpot ID, row id, etc.).

If {id} is already a r_... row id and the table is known, skip discovery and go straight to get the row (step 4).

2. Per table: find the identifier's column and archive linkage

For each in-scope table:

  • clay tables columns list <tableId> — find the column that holds this kind of identifier by matching names (Email for an email, HSID/HubSpot ID for a HubSpot id, etc.). Cache the f_id → name map and note column types. The match column must be basic to value-filter on it. If several columns could match, or none does, show the columns and ask which to search.
  • clay tables get <tableId> — read archive. If archive is non-null, resolve archive.searchableFieldFormula (a {{f_xxx}}) to its column via the columns list. Plan to search the archive only if {id} is the value of that indexed column; otherwise the archive isn't searchable by this identifier.

3. Search for the record

If the active table is queryEnabled, locate the record with tables query — its server-side filter is more forgiving (contains, case-insensitive matching) and scales, so it's the primary tool when query is on. The result carries each matching row's full cell content — value, fields, status, and any error message — so it doubles as the state snapshot; no follow-up call needed:

bash
echo '{"tables":[{"id":"t_abc123"}],"filter":{"field":"f_abc123","op":"contains","value":"jane@acme.com"}}' | clay tables query --query - | jq .

Otherwise, use clay tables rows list with a value filter on the identifier column (shape in the command's --help):

bash
clay tables rows list <tableId> --filter f_abc123="jane@acme.com" | jq .

rows list --filter is exact match, case-sensitive. If it comes back empty ({ "data": [] }), retry once with a single predictable variant (lowercase for emails/domains, trim whitespace, or the casing a row sample shows), then stop guessing — say it wasn't found in this table and ask the user to confirm exact spelling/casing.

Always locate by identifier, never by position: the order rows list returns rows in is not the order they appear in the Clay app, so "the 3rd row" in the output tells you nothing about what the user sees on screen.

Where the archive applies (step 2), search it with rows list — archives are never query-enabled, so tables query is not an option; they're searchable only on the fixed f_archive_index column. Filter it by its indexed value (single filter; single capped page, no cursor; values over 255 characters are rejected — pass the first 255):

bash
clay tables rows list <archiveTableId> --filter f_archive_index="jane@acme.com" | jq .

Respect the rate limits — batch in small groups, back off on exit 4.

Capture each cell's status (and value or error) for the snapshot. A tables query result already includes fields and full error messages. On the rows list path, action cells show fields: null and abbreviated error labels — get the full detail in step 4. (rows list / rows get also carry the row's id and updatedAt, which tables query does not.)

4. Pull full state where it matters

If you located via tables query, you already have the full snapshot from step 3 — skip this. On the rows list path, follow up with clay tables rows get when:

  • any cell is error — you need the full error message (list only carries an abbreviated label), or
  • the user asked for actual values / enrichment output — fields (structured action output) is only populated on rows get.
bash
clay tables rows get <tableId> <rowId> | jq '.cells | to_entries | map({col: .key, status: .value.status, value: .value.value, err: .value.error})'

Map col ids to names from step 2. (err is the message string, present only on error cells.)

5. Report — per table, independent findings

Lead with where it is and its overall state; list action/derived columns with status (and value or error where useful). Label each table active vs archive. Group statuses so the snapshot reads at a glance.

The r_ row id is an internal handle, not a report field — you found the record by its business identifier, so lead with that; only show a r_ id when you already have one (the rows list / rows get path). updatedAt isn't in tables query output either, so fetch it with a single rows list --filter on the identifier only when freshness matters — the active-vs-archive comparison below, or the user asking how recent the data is. Otherwise omit it.

Lead Enrichment — archive (updated 2026-04-10):
  Find Email     success  → "jane@acme.com"
  Enrich Person  success  → {name, title, company}
  Push HubSpot   success

Account Match — active (updated 2026-04-12):
  Match Account  queued
  Map Fields     empty
  • Found in both active and archive → likely re-processed; compare updatedAt and say which is newer.
  • Not found in an in-scope table → say so plainly; it may live in a table you didn't search, or the identifier may be off. Don't treat absence as proof of anything about another table.
  • An error or surprising/empty value the user wants explained → that's where this skill ends and /tables-value-trace begins.

Hand-offs

  • Explain why a specific cell errored, is empty, didn't run, or holds the value it does → /tables-value-trace.
  • Table-wide failures rather than one record → /tables-error-sweep.
  • "It's not here and nothing's being added" → /tables-capacity.

Frequently asked questions

What does the Tables Trace AI skill do?

Clay tables — locate a record by identifier and snapshot its state: which table(s) hold it and each cell's status. Use when the user has an id and asks "trace {id}", "where is {id}?", "what enrichments ran for this lead?", or "is this record done?".

Why use Tables Trace on TypingMind?

Because you install it once and use it with any model. Tables Trace is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Tables Trace in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/clay-run/agent-plugins/tree/main/clay/skills/tables-trace. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Tables Trace?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Tables Trace?

As many as you like. As long as a model supports skills, you can use Tables Trace with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Tables Trace AI skill free?

It is published on GitHub by clay-run. Check the repository for licensing terms. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇