Community研究&データ分析github.com

2016judea/vertical-market-agent

特定の業界と都市に特化したチャットエージェントを構築します。事前計算された公開記録やレビューコーパスを基盤とし、会話中に最新記録を取得することで、汎用モデルを凌駕する精度を実現します。

vertical-market-agent とは?

このスキルは、公開記録やレビューデータに基づいた専門的なチャットエージェントを構築するための包括的なガイドです。特定の都市の一つの業界に焦点を当て、事前コンパイルされたデータダイジェストをシステムプロンプトに注入し、会話中にリアルタイムで記録を取得することで、汎用モデルでは不可能な正確な回答を提供します。実用的なアドバイスとして、データの落とし穴(もっともらしい誤った数値を生成するバグ)、決定論的な計算をツールに委ねる方法、プロンプトのコスト管理、広告先としての出荷方法、空間レイヤー(「これは何の隣か」)の実装などが含まれています。このスキルは、Claude Code、Cursor、CodexなどのAIエージェントプラットフォームで使用でき、業界特化型の垂直エージェントを構築したい開発者にとって貴重なリソースです。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/2016judea/brick-mortar-skills/tree/HEAD/skills/vertical-market-agent

Installed? Explore more 研究&データ分析 skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

垂直市場エージェントの構築

特定の業界と都市において汎用モデルを凌駕するチャットエージェント。事前計算された実際のデータダイジェストを保持し、会話中にライブレコードを取得できます。完了 = URL上で稼働し、基盤データに基づいた数値を回答し、保持していない数値は生成せず、実際のプローブ(ローカルテストではない)で本番環境で検証された状態です。

ステップ0: オーナーが答える2つの質問

  1. どの都市か、そしてなぜその都市か? すでに現地調査や、そこで文字通り真実であるデータがある場所を選んでください。都市をマイニングし、その後 そこで広告を出します。
  2. 広告が行われ、リンクされるのか? これには4つのエンジニアリング上の判断がかかっています(ピクセル、キャッシュTTL、バニティURL、アトリビューション)。ステップ7を参照してください。

ステップ1: コードを書く前に堀を見つける

2つの種類: マイニングして所有するコーパス(例: 数万件のレビュー)、またはジョイン(販売中のライブフィードと郡の区画、評価、税務記録の結合: 誰も組み合わせようとしない2つの無料ソース)。有料の一括列挙はしばしば失敗します(クレジット切れ、所有者検索がない)。

一括列挙が壁に囲まれている場合、エントリーポイントはデータではなく制約です。 任意の住所には答えるが何もリストしない郡のアプリは、他の場所で住所を列挙できれば問題ありません(ステップ3)。

非開示州はチャンスです: 競合他社を含め誰も販売比較データを持っていないため、郡自身の算術をうまく整理したものが最良のアンカーになります。

ステップ2: 基盤を構築する

すべてのメッセージでサーバー側でシステムプロンプトに注入される、固定されたJSONダイジェスト。

  • まずパネルサイズを確認(レビューコーパスエージェントの場合)。「あなたのような場所でのランキング」には、それぞれ50件以上のレビューを持つ約50以上のビジネスが必要です。それ以下の場合は、ランキングを出荷しないでください。
  • モデルが書いたセクタープロファイルは基盤ではありません。 モデルが書いた散文をロードすることは、モデルがすでに知っていることを伝え、堀を一切作りません。基盤は測定されたものです。
  • 欠落データはバックログであり、ブロッカーではありません: パネルをマイニングする手段を所有しているなら、マイニングしてください。
  • マイニング前にライセンスを確認してください。 一部のソースのデータは再配布できず、マイニングされたパネルがダウンロード可能になるかどうかが決まります。
  • すべてのブロックには_interpretationが含まれます: それが何を意味し、専門家がどのように使用するかについての2〜4文。バイトあたりの価値が最も高く、暗唱と推論の違いです。
  • バイト安定出力: sort_keys=True、同点は一意のフィールドで解決される完全ソート、generated_onを除いてタイムスタンプなし。1バイトの変動があると、すべてのメッセージでキャッシュされたプレフィックスが再請求されます。
  • レイヤー化し、より優れたレイヤーが古いものを置き換えることを許可します。2つのブロックが1つの質問に対して異なる数値を与えると、モデルは回答の途中で調停します。ブロックが混在している場合は、サブキーレベルで置き換えます。
  • 完全版をアーカイブし、コンパクト版を出荷します(.compact.jsonツイン)。ツインがない場合はアーカイブにフォールバックします。
  • 個人のメールアドレスをマージされた調査からスクラブします: 広告規模では、モデルが一人の公務員の受信トレイをあなたのアウトバウンドチャネルに変えます。部署+電話で同じことを伝えられます。

ステップ3: 記録がカバーできないものを列挙する

薄いリスティングフィードはほとんど何も見えません。**小さな円のグリッドで「近くを検索」**し、各ヒットを郡の記録にジョインします(1回の実行: 307の複合施設 -> 208の一致した区画 -> 9,736ユニット)。

  • 小さな円(約3.9kmグリッド上で約3.5km): APIは1回の呼び出しあたりの結果を制限するため、1つの都市全体のクエリは、最もよく知られた場所のみを静かに返します。
  • 公開記録に何かを決定させる、列挙したソースではなく(ディレクトリで「アパート」とされていても郡の記録では介護施設となっているもの; 「多世帯」とタグ付けされた中古車販売店)。
  • 何もリストされていない市場では、話す価値のある人々は売っていない人々です。

ステップ4: データの落とし穴(2回読むこと)

ここでのすべてのバグは、エラーではなく、もっともらしい誤った数値を生成しました。既知の正しいフィクスチャに対してQA時間を予算化してください。

  1. 説明に基づいて計画する前に、ソースに再クエリを実行してください。 ドキュメント内のレイヤー名は仮説です。サービスのメタデータ(ArcGISの場合は?f=json、editingInfo.dataLastEditDate)と実際のフィールド値を読み、フィールド名を信頼する前に確認してください。
  2. 既知のものに対して検証してください。 36ユニットあることがわかっている建物が10ユニットとしてパースされた: 1つのフィクスチャが最悪のバグを発見しました。さらに良いのは、出力のサンプルを異なる座標フレームで発行元の独自APIに送り返し、比較することです。
  3. 外れ値だけでなく、逆転にも注意してください: 大規模な物件よりも1戸あたりの評価額が高い小規模物件は、市場ではなくパーサーが間違っていることを意味します。
  4. データ自体をチェックさせてください。 クロスチェックが存在する場合(ユニットあたりの平方フィート)、あいまいなフィールドの両方の読み取り値を計算し、もっともらしい範囲に選択させます。どちらも適合しない場合は、フラグを立てて除外します。
  5. 集約する前に重複排除してください。 1つの物件を、それが該当するすべての資産タイプでリストするフィード: 623行が206の物件でした。
  6. パース済みではなく、RAWをキャッシュしてください。そうしないと、パーサーの修正は小さな郡のサーバーの再クロールを意味します。
  7. 住所フォーマットはレコードインデックスと異なります。 方向を省略し、接尾辞を削除します。バリアントラダーで約半数のミスを回復しました。
  8. 小さなサンプルにはそのnをラベル付けしてください。薄さ自体が発見である場合があります。
  9. レビューコーパスでは、シェアではなくMATCHESを読んでください。 すべてのタクソノミ正規表現を実際の1〜3つ星のテキストに対して実行し、マッチしたものを読んでください。セクターのサービス動詞は、しばしば害の動詞です: cut (me|my)に対する「傷害」パターンは、サロンの苦情の10.7%にマッチし、ほとんどは「自分の髪を切るために$40払った」というものでした。drill(歯科)、pull(レッカー)、strip( detailing)、break(ガラス)、shave/clip(理容、グルーミング)、stick(採血)を確認してください。そして、誰も提起しないテーマは残ります。
  10. 発行元の語彙は購入者の語彙ではありません。 郡の「幹線」クラスは、何も面していない高速道路ネットワークである可能性があり、ブローカーが意味する商業通りは「集散道路」である可能性があります。マッピングする前に各バケットの内容をリストし、それらが含むものに基づいてフィールドに名前を付けます。
  11. 共有スキーマは列名を共有しますが、規則は共有しません。 郡をまたがって、1つのフィールドが4つの分類システム、-9999 vs 0、3つ目の固定資産税評価額を運ぶことができます。郡ごとに各フィールドを調査します。ある郡からのゼロは、証明されるまでクエリバグとして扱います。派生テストを優先します(空室の場合、建物価格=0かつ土地価格>0)。
  12. 1つの名前は複数のものを指します(高速道路とそのフロンテージロードが名前を共有しています)。代替案を返し、モデルにどれを使用したかを言わせます。
  13. 「一度」交わるべきものが何度も交わります(2つの道路が6か所で交差しています)。点を平均化するとフィールドに着地します。クラスタリングし、各場所を保持し、指定されたルールで選択します。
  14. 派生合計値は、計算しなかった行を静かにドロップします。 部分的な入力がある合計値とともにカバレッジカウントを出荷し、それを下限として読み取らせます。

ステップ5: 決定論的な計算はツールに、プロンプトには決して入れない

DSCR、IRR、キャッシュオンキャッシュ、投与量、税金: ツールで計算し、その前提と警告を返します。モデルの算術はもっともらしく間違っています(実際は1.09のDSCRが1.19と出て貸し手に送られます)。これにより、実際のエージェントループ(ストリーム -> ツール実行 -> フィードバック -> ストリーム)が強制され、pause_turnとmax_tokensの処理も含まれます。

ステップ6: プロンプトコストの測定

  • APIでトークンをカウントしてください。 密なJSONは約4ではなく、約2.4バイト/トークンで動作します。
  • テストでバイト/トークンの上限を強制してください: コンパクトツインの代わりにアーカイブを出荷しても、請求書以外に症状は現れません。
  • キャッシュTTLはトラフィックに従います。 まばらで手動共有: 5分のデフォルト(1時間書き込みは、誰も再利用しない追加料金です)。継続的な有料トラフィック: 1時間。訪問者がプレフィックスを共有するためです。

ステップ7: 出荷

  • 1つのジェネレーターからページを派生させてください。すべての置換は、そのアンカーが存在することをアサートし、ガードは両方向をチェックします(削除されたコンテンツはなくなったことと、機能が存続したこと)。
  • 広告先の場合: バニティURLは一時的リダイレクトとして(恒久的なものは広告プラットフォームによってキャッシュされます)、クエリ文字列が存続することを確認します。キャンペーンごとのピクセルイベント名。キャッシュTTL 1時間。そしてアトリビューションはランディングヒットのsessionStorageに固定され、すべてのターンで運ばれます(localStorageではありません。そうしないと、来週のオーガニック訪問が今日の広告のクレジットになります)。
  • ビルドログではなく、デプロイ状態を確認してください。サーバーレス関数の制限やトレースされていないファイルが、緑色のログの背後で失敗する可能性があります。バンドラーが含めるように、データファイルを静的にインポートします。

プロンプトの厳格なルール

  1. 数値を決してでっち上げないこと。 基盤、実際に実行されたツール呼び出し、またはフラグ付きの推定値のみ。
  2. 公開記録の値を市場価値として提示しないこと。 どちらを提供しているかを述べてください。
  3. ツールの説明とプロンプトの両方にカバレッジ境界(どの郡か)を記載すること。 片方だけのルールは回避されます。
  4. 公開記録は1つずつ、一覧では提供しないこと。 質問された物件の所有者検索は問題ありませんが、一括の名前と住所の名簿は、営利目的での使用において州の公開記録法に違反する可能性があります。
  5. プロンプトが不可能と述べていることを再確認すること。 知り得ないことについての自信に満ちた虚偽は、ギャップよりも悪いです。

コンテキストレイヤーのためのリサーチエージェント

並行リサーチエージェントにトークン予算(および2.4バイト/トークンの比率)を与え、注意書きよりも数値を削るように指示し、以前の作業を修正することを期待します。

ステップ8: セクター外のエンディング

一部の訪問者はそのユーザーではありません(レストランエージェントでの古着屋)。デフォルトの「それはありません」は、次に構築するセクターを挙げる実際のオーナーという、得られる最高のシグナルを失います。

  • flag_out_of_scope(sector)ツール: クライアントは3つのタップ可能なオプションをレンダリングします。submit_feature_requestツールがタップをファイルします。
  • 最初の返信ですべてを: セッション深度の中央値は1ターンです。
  • 代わりにエージェントが何を保持しているかを列挙しない(1つのカットで返信が1,275文字から124文字になりました)。
  • オプションはクライアントレンダリングされ、散文の番号付きリストではありません(裸の「2」はスキル2をトリガーする可能性があります)。
  • オプションがどこにレンダリングされるかをモデルに伝えてください。モデルはクライアントを見ることができません。
  • オプションをユニバーサルな機能にマッピングして、ファイルされたリクエストがセクターのための機能に名前を付けるようにします。

ステップ9: 空間レイヤー(「これは何の隣か」)

  • 郡のArcGIS Online組織を見つけてください、WAFでブロックされたGISホストではなく。ホストされたサービスはしばしば匿名で提供されます。レイヤーのネイティブ空間参照系でジオメトリをリクエストしてください。
  • 2つのソースが出会うとき、最初のソースのフレームで2番目のソースをリクエストし(outSR)、行を出力する前に範囲が重なっていることをアサートしてください。フレームの不一致は何も交差せず、「すべての区画が非ゾーニング」と報告します。DuckDBでは、ST_Transformはalways_xy := trueが必要です。そうしないと、静かにPOINT(inf inf)を返します。
  • セントロイドによるゾーニング; 分割ゾーニングにはシェアしきい値が必要です(区画の5%以上)。地区ではなくポリゴンを比較します。単純な交差は区画の37%を分割と呼びました。しきい値は約4%を与えました。
  • 都市のゾーニングコードはその都市のものです。 同じコードが隣接する異なる地区を意味します。すべてのコードとともに都市と公開名を出荷してください。
  • オフラインで事前計算し、ジオメトリフリーのインデックスを出荷し、APIルートを追加しないでください: 郡GIS -> DuckDB空間ミラー -> 1つのコミットされたJSONインデックス。ランタイムはルックアップとhaversineのみを行います。失敗する空間依存関係は、空の隣接リスト、または自信に満ちた誤った回答に劣化します。ロード時にインデックスを検証し、エラーをスローしてください。
  • 空間ジョイン内のどこかに不等式があると、空間述語がポストフィルターに格下げされます(ON a.id < b.id AND ST_Intersects(...)は約290億ペアをテストしました)。述語を単独で立て、EXPLAINでSPATIAL_JOINを確認し、キーを出力してから重複排除します。7分で未完了が19秒になりました。
  • 出荷するインデックスの範囲は、購入者が取引するものとその直接の隣接物に限定し、「コンテキスト」区画にはより少ないデータが含まれることをフラグ付けします。

Individual skills in this repo

This repo contains 7 individual skills — each has its own dedicated page.

2016judea/ascii-charts

Build charts as plain Unicode-block text — bar, range, bullet, gap-bracket, star-histogram, heatmap, line, Venn, pie, donut and scatter — with a dependency-free Python script, for anywhere only monospace text survives (newsletter code blocks, Markdown, terminals, plain-text email, chat). Use when a chart has to embed as literal text instead of an image or a third-party chart service, or when you want a hand-made terminal look with no branding footer.

2016judea/buffett-checklist

Apply Warren Buffett's investment framework as a discipline lens when weighing a buy, hold, or sell decision — circle of competence, economic moat, owner earnings & intrinsic value, margin of safety, management/capital-allocation quality, and market psychology (Mr. Market, fear vs greed, temperament). Use when asked to "run this through Buffett", "what would Buffett say", "does this pass the moat test", "is this cheap enough", or for a second, more skeptical read on a name being evaluated or already held. This is a discipline overlay, not a replacement for a strategy — it applies the Buffett lens to how someone actually invests, rather than issuing generic advice.

2016judea/image-riff

Turn one or more reference images into original art in that reference's own visual language, then cut it to whatever surface it's for. Use when you paste or point at art and say "use this as the base image", "generate art from this", "riff on this", "some creative ideation with these images", "make me a channel banner / avatar / cover / plate", "wilder version of this", or want a spread of options off one piece of reference. This is the TASK skill; the engine is the `make-art` tool skill.

2016judea/leonardo

Draw the way Leonardo da Vinci drew — a study sheet, a notebook folio, a red-chalk or silverpoint study, a machine cutaway, a storm of vortices — in his real materials and page-logic, generated with the make-art engine and anchored on fifteen of his actual (public-domain) sheets. Use when you say "Leonardo", "da Vinci", "like his notebooks", "a codex page of X", "draw this as one of his study sheets", "sanguine", "silverpoint", or wants a design, diagram, or illustration in that hand. Also a reading guide to his notebooks (Richter's 1883 public-domain translation) for "what did Leonardo say about shadow / trees / water". This is a TASK skill; the engine is `make-art`.

2016judea/mcp-stack

Which free MCP server or framework to reach for, and its traps — finance/gov data (SEC EDGAR, Yahoo, SAM.gov, USAspending), web research (Exa, Firecrawl, Crawl4AI, Jina reader), design/art/brand (Canva, Inkscape, Penpot, Figma, Orshot, Hugging Face image gen, vectorizing, charts), data/spatial (DuckDB spatial, live ArcGIS layers, OpenStreetMap/Overpass, Census, MapLibre), and ops (PostHog, iMessage, context7 docs). Use when making a social post, OG card, poster, logo/vector, chart, map, or brand asset; when querying parquet/geojson/duckdb or a city's open-data layer; when an MCP "needs authentication" or fails; or when asked "what tools do we have", "is there an MCP for X", "should we add X".

2016judea/records-request

Get a specific record out of a US government office by public-records request — "request the assessor's model", "file a data practices request", "FOIA this", "open records request", "can we just ask the county for it", "who do I write to at <county>", "chase that request", "did they ever answer". Covers checking the website first, finding the right office and statute, the carve-out paragraph that makes a request answerable instead of refused, web-form traps (hidden character caps, WAFs that reject apostrophes), chasing (there is usually no deadline), whether what comes back may be republished, and parsing multi-year tables without silent errors.

2016judea/sms-native-product

Build a product whose interface is text messages rather than an app or a website — "no app, no website", "they just text a number", "chat with our agent natively in Text Messages", "can we do this over text", "an SMS bot", "a Telegram bot", "make it a group chat", "minimum viable friction". Fires equally when it has already gone wrong — "my campaign got rejected", "our number is blocked", "the texts aren't arriving", "why do I need to register". Covers the gate that decides whether such a product can send at all (US A2P 10DLC registration, SHAFT content rules, permanent rejection codes), group MMS from code, what each channel can't do, an architecture that survives losing the channel, and guarding model-rewritten user content.

関連スキル