Clay tables — テーブル(データの表形式)が何をしているのかを分析します。列同士のつながり方を図解し、処理の流れを整理してから、その列に組み込まれたワークフロー(一連の処理手順)を説明します。 次のような場合に使用: ユーザーが「このテーブルは何をしているの?」「{テーブル}のワークフローを説明して」「このテーブルの処理を順を追って説明してほしい」「ここではどんな設定がされているの?」といった質問をしたとき
Clay tables — analyze what a table does: reconstruct the column DAG, stage it, and narrate the workflow encoded in its columns. Use when the user asks "what does this table do?", "explain the {table} workflow", "walk me through this table", or "what's set up here?".
次のような場合に使用: 「このテーブルは何をしているのか」「{テーブル}のワークフロー(処理の流れ)を説明してください」「このテーブルの処理を順を追って説明してください」「ここでは何が設定されているのか」といった、特定のレコード(行)ではなく、テーブルの構造と列に組み込まれたワークフローについての質問。
Clayのテーブルは列の依存関係グラフ(上流・下流の関係を表した図)です。source列とbasic入力列が起点となり、basicの計算式列やaction(データ拡張)列は設定内の{{f_xxx}}トークンに依存します。テーブルを分析することは、その依存関係グラフを再構築し、処理の段階順に並べ、テーブルが何をしているかを説明することです。処理は軽量で読み取り専用です(約3つのコマンド:メタデータ + 列情報 + サンプル行)。
テーブルを見つける: テーブル入口スキルの「テーブルを見つける」と同じ方法で解決します。
clay tables get出力はtypeで分岐します(詳細はclay tables get --helpを参照)。ワークフローが含まれる枠組みを確認します:
clay tables get <tableId> | jq .
type — "archive"の場合、これはアーカイブ用テーブル(parentTableIdが元のテーブルを指す)です。代わりに親テーブルを分析してください。アーカイブ自体はワークフローを持ちません。rowCount — 現在のサイズ。archive — null以外の場合、処理済み行がarchive.searchableFieldFormulaでインデックス付けされたアーカイブに流出します。データがどこから入るのか、またどの規模で入るのかは列(ステップ2)から分かります:source列は各ソースに付属するnumSourceRecordsを持つsources[]を含みます。
clay tables columns getここにグラフが存在します。テーブル入口スキルのdependency-catalog.mdにあるトークン抽出レシピをclay tables columns get <tableId>の結果に実行します。これにより1列ごとに1つのエントリが得られます — { id, name, type, role, integration, gate, dependsOn: [names] } 。すべての{{f_xxx}}接続(formulaWaterfallとformulaMapキー内のものを含む)を列名に解決します。dependsOnは上流の列。gate(設定されている場合)はアクションが実行される条件です。
既知のデータ一括拡張テーブルの場合は、ソースエントリを調べて出所を特定してください。ソースにaudienceが含まれている場合、そのentityType、segments[].id、isGlobal、entityIdOnlyをソース設定として使用します。isGlobal: trueはグローバルオーディエンス(データセット)を表し、セグメントリソースオブジェクトがありません。それ以外の場合はsegmentsのIDを使用してください。データ一括拡張テーブルはオーディエンス以外の出所を持つことができ、audience-sourceだけではそのテーブルがデータ一括拡張テーブルであることを証明しません。
依存関係の深さ順にカタログを段階化します — 起点から順に、その後は依存関係がすべて前の段階に配置されている列、という具合に進めます:
source列とinput basic列(dependsOnが空)。これは生データです。dependsOnがすべて前のステージにある列。{{f_xxx}}はテーブルを跨がりませんので、グラフ全体が自己完結しています — すべての接続がこの列セット内で解決します。(トークンが列名ではなく単なるf_idに解決された = 削除または名前変更された列。メモしておきます)この左から右への順序はClayの画面内の列順≈パイプライン(処理の流れ)です。
clay tables rows list … --limit 10(別のサンプルコマンドはない)で、列ごとの状態をざっくり確認します — どの列がほぼ動いているか、休止中かエラーか:
clay tables rows list <tableId> --limit 10 | jq '{ truncated, columns: ([ .data[].cells | to_entries[] ] | group_by(.key) | map({ col: .[0].key, n: length, statuses: (group_by(.value.status) | map({ (.[0].value.status): length }) | add) })) }'
colのIDをカタログから列名にマッピングしてください。これは最大10行のサンプルなので、参考情報として扱ってください。真の比率ではありません。ステータスは小文字(success、empty、error、queued/runningなど)です。ステージに大量のerrorが表示される場合は、/tables-error-sweepへの手渡しを提案してください。このコマンドは通常テーブルでは完全スキャンを実行し、データ一括拡張テーブルでは保持されている行のサンプルを実行します。クエリ対応テーブルでは、tables queryのグループ化により正確な値の分布を説明に追加できます — ステータスはサンプルから得られるもの(クエリできません)です。
rows listがtruncated: trueを返す場合、現在保持されている最大20行のフィルタリング・ソート無しのサンプルに意図的に制限されています。カーソルを受け入れたり返したりできず、完了済み行はすでに削除されている可能性があります。したがってサンプルは空の場合があり、ソースデータセットや完全な行リストとして提示されてはいけません。ステップ2のソース設定が信頼できます。
ソース情報から始め、段階化されたグラフを各列の統合内容とゲート条件とともに示し、その後に1段落の平易な英語による要約を追加します。最後にサンプル調査の健全性結果を付加します:
People — 1,543行 · ソース: CSVインポート (1,543) · t_xyz789にアーカイブ(メールでインデックス付け)
ステージ1 Domain (basic, 計算式) ← Company
ステージ2 Find Email (アクション: Prospeo) ← Domain
条件付き実行: {{Domain}}が存在する場合のみ実行
ステージ3 Enrich Person (アクション: Clearbit) ← Find Email
ステージ4 Push to HubSpot (アクション: HubSpot) ← Enrich Person
条件付き実行: {{Find Email}}が存在する場合のみ実行
→ このテーブルはCSVから企業情報を取得し、各企業のドメインを導出し、ドメイン
がある場合はProspeoで担当者メールを検索し、Clearbitで担当者を拡張して、メール
が見つかった場合はHubSpotに結果を同期します。処理済み行はメールでアーカイブ
されます。使用統合: Prospeo、Clearbit、HubSpot。
健全性(サンプル調査、10行): Domain 10/10成功 · Find Email 8成功 / 2空 ·
Enrich Person 7成功 / 1エラー / 2空 · Push HubSpot 7成功 / 3空。
参考情報のみ(小規模サンプル)— より詳しい診断は /tables-error-sweep を実行してください。
報告は誠実にグラフに従ってください。トークンが実際に示している接続のみを主張し、ゲート条件はconditionalRunFormulaTextの表現のとおりに説明します(条件を自分で作り上げないでください)。
/tables-value-trace(同じトークン抽出を使い、1列分遡ります)/tables-error-sweep(データ一括拡張テーブルではサンプルのみ)/tables-capacityUse when: "what does this table do?", "explain the {table} workflow", "walk me through this table", "what's set up here?" — a question about the table's structure and the workflow encoded in its columns, not about any single record.
A Clay table is a column DAG: source and input basic columns are roots; basic formula columns and action (enrichment) columns depend on the {{f_xxx}} tokens in their settings. Analyzing the table = reconstructing that graph, ordering it into stages, and narrating what it does. Cheap and read-only: ~3 commands (metadata + columns + a row sample).
Finding the table: resolve it as in the tables entry-point skill ("Finding a table").
clay tables get(The output is discriminated on type — shape in clay tables get --help.) Read off the frame the workflow sits in:
clay tables get <tableId> | jq .
type — "archive" means this is an archive companion (its parentTableId points at the regular table); analyze the parent instead, the archive has no workflow of its own.rowCount — current size.archive — non-null means processed rows flow out to an archive, indexed on archive.searchableFieldFormula.Where data enters and at what scale comes from the columns (step 2): source columns carry sources[] with each attached source's numSourceRecords.
clay tables columns getThis is where the graph lives. Run the token-extraction recipe in the tables entry-point skill's dependency-catalog.md over clay tables columns get <tableId>. It yields one entry per column — { id, name, type, role, integration, gate, dependsOn: [names] } — resolving every {{f_xxx}} edge (including those in formulaWaterfall and formulaMap keys) to a column name. dependsOn are the upstream columns; gate (when set) is the condition under which an action runs.
For a known bulk enrichment table, inspect the source entries to determine the origin. If a source includes audience, use its entityType, segments[].id, isGlobal, and entityIdOnly as the source configuration when rebuilding it as a workflow. isGlobal: true represents the global Audience and has no segment resource objects; otherwise use the ids from segments. Bulk enrichment tables can have non-Audiences origins, and an audience-source on its own does not prove the table is a bulk enrichment table.
Order the catalog into stages by dependency depth — roots first, then columns whose deps are all already placed, and so on:
source columns and input basics (empty dependsOn). This is the raw data.dependsOn are all in earlier stages.{{f_xxx}} never crosses tables, so the whole graph is self-contained — every edge resolves within this column set. (A token that resolved to a bare f_id rather than a name = a deleted/renamed column; note it.)This left-to-right order ≈ the column order in the Clay UI and gives you the pipeline.
clay tables rows list … --limit 10 (no separate sample command) for a rough per-column status read — which columns mostly run vs sit idle or error:
clay tables rows list <tableId> --limit 10 | jq '{ truncated, columns: ([ .data[].cells | to_entries[] ] | group_by(.key) | map({ col: .[0].key, n: length, statuses: (group_by(.value.status) | map({ (.[0].value.status): length }) | add) })) }'
Map col ids to names from the catalog. This is a sample of ≤10 rows, so treat it as indicative, not a true rate — say so. Statuses are lowercase (success, empty, error, queued/running/…). If a stage shows heavy error, offer to hand off to /tables-error-sweep; it performs a full scan for normal tables and a retained-row sample for bulk enrichment tables. On a query-enabled table, tables query group-bys can add exact value distributions to the narrative — statuses still come from the sample (they aren't queryable).
If rows list returns truncated: true, it is deliberately limited to one unfiltered, unordered sample of at most 20 currently retained passthrough rows. It neither accepts nor returns a cursor, and completed rows may already have been deleted. The sample can therefore be empty and must never be presented as the source dataset or a complete row listing; the source configuration from step 2 is authoritative for migration.
Lead with the source(s), show the staged DAG with each column's integration and gate, then a one-paragraph plain-English summary. Append the sampled health read.
People — 1,543 rows · source: CSV Import (1,543) · archives to t_xyz789 (on Email)
Stage 1 Domain (basic, formula) ← Company
Stage 2 Find Email (action: Prospeo) ← Domain
gated: only runs if {{Domain}} is present
Stage 3 Enrich Person (action: Clearbit) ← Find Email
Stage 4 Push to HubSpot (action: HubSpot) ← Enrich Person
gated: only runs if {{Find Email}} is present
→ This table takes companies from a CSV, derives each company's domain, finds a
contact email via Prospeo (when a domain exists), enriches the person via
Clearbit, and syncs the result to HubSpot when an email was found. Processed
rows are archived by email. Integrations used: Prospeo, Clearbit, HubSpot.
Health (sampled, 10 rows): Domain 10/10 success · Find Email 8 success / 2 empty ·
Enrich Person 7 success / 1 error / 2 empty · Push HubSpot 7 success / 3 empty.
Indicative only (small sample) — run /tables-error-sweep for a deeper diagnosis.
Keep the narrative honest to the graph: only claim an edge the tokens actually show, and describe a gate exactly as its conditionalRunFormulaText reads (don't invent the condition).
/tables-value-trace (uses the same token extraction, walking one column backward)./tables-error-sweep (sample-only for bulk enrichment tables)./tables-capacity.原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。