• Projects
  • Service
  • About
  • branding.bz
  • Podcast
  • Tips
  • FAQ
  • Recruit
  • Download
  • Contact
  • branding.bz(ブランド構築SaaS)
  • DESIGN NOW(デザインメディア)
  • X
  • LinkedIn
  • Spotify
  • Facebook

213-0011 神奈川県川崎市高津区久本3-6-7-303

© 2026 ID INC. All rights reserved

claude-skills/スキル
SKILLKnowledge Workmonitoring

catalog

プラグイン
incident.io
ソース
GitHub で見る ↗
説明

incident.ioの組織カタログ:そこに登録されている各種情報(サービス、チーム、コンポーネント、顧客、ユーザー、その他のあらゆるもの)、それらの属性、そして情報同士のつながり。 **次のような場合に使用:** - 「チェックアウト機能の所有者は誰?」「Atlasとは何?」「サーチ機能に依存しているものは?」「プラットフォームチームのメンバーは?」といった単純な検索 - 設定項目を変更したり対応を上げたりする前に、対象となる情報のIDを調べる - これらの情報を何らかの方法で扱う、あらゆる場面 **重要:** カタログツールやチーム関連ツールを最初に呼び出す前にこのスキルを読み込んでください。これらのツールは生のデータと参照情報を返しますが、このスキルでは、それらが正しく一致していることを確認する方法と参照をたどる手順を説明しています。 **対象外:** - 当番表やシフト管理(オンコール(当番対応管理)スキルで対応) - システムの内部動作原理(アーキテクチャドキュメント参照、ただしまずはここで主な対象を確認すること)

原文を表示

The organisation's catalog in incident.io: its types and entries (services, teams, components, customers, users and whatever else it models), their attributes, and the references between them. Use whenever you're working with any of these in any way, including plain reads ("who owns checkout?", "what is Atlas?", "what depends on search?", "who's in the platform team?") and finding an entry's ID before setting a field or escalating. Load it before the first catalog or team tool call: the tools return raw entries and references, and this skill says how to prove a match and walk a reference. Not for schedule rotas and shifts (the on-call skill), nor how a system works internally (architecture docs, but ground the subject here first).

ユースケース
  • 組織カタログの情報を検索するとき
  • 対象情報のIDを調べるとき
  • 情報の属性や関連性を確認するとき
  • カタログツールやチーム関連ツール利用前の参照
本文(日本語訳)

カタログ

カタログは、組織自身を体系的にまとめた地図です:種類(サービス、チーム、顧客など)があり、それぞれ属性のスキーマ(定義)を持ち、エントリ(検索インデクサー、データプラットフォームなど)がそれらの属性に値を保持しています。別のエントリを参照する属性は 名前(ID) として表示されます。括弧内のIDが、別のエントリへ移動する際に使う識別子です。カタログは最終的な情報源です:会話やインシデントの文脈がカタログと矛盾する場合、カタログが正しく、その旨をお伝えします。

type_name で区別される3つの種類があります:

  • Custom["…"] — 組織が定義した種類で、組織固有の質問に最適なことが多いです。まずこれらを検索してください。ただし、エントリが必ずしも手作業で追加されたとは限りません。
  • ネイティブ(EscalationPath、Schedule、User、AlertPriority など)— incident.io自体のリソースです。チームはネイティブではなく、通常 Custom["Team"] という組織定義の種類に存在するため、名前を推測するのではなく team_list と team_show を使用してください。個人の連絡先(メール、および組織が公開している電話番号)はその User エントリに記録されています:まず人を特定し、そのエントリを確認してください。
  • 統合連携型(GitHubRepository、PagerDutyService、SlackChannel など)— 他のツールのコピーで、数千ものエントリがあることがあります。ユーザーが統合の名前を明示した場合のみ検索してください。「インジェストサービス」は組織のサービスエントリを指し、GitHubリポジトリではありません。

種類のエントリがどこから来るのか。 type_name はその種類がどの分類かを示しますが、誰がエントリを管理するかは示しません。それには、catalog_type_list から registry_type と is_editable を確認してください。registry_type を持つ種類はincident.ioが管理しており、独自リソースまたは連携統合で、編集不可です。registry_type を持たない種類はincident.ioが同期していませんが、catalog-importer や Terraform などの外部ツールが API経由で書き込むことはあります。これらのツールはそれを認識できないため、統合連携型ではなく「手作業維持」と呼んでください。属性の mode はそのフィールド1つについて説明しています。出所(どこからデータが来たか)の質問には、ソースと編集可能性の判定を先に述べ、その注記を付け、属性一覧とエントリ数は求められない限り省略してください。

incident.ioの接続で catalog_type_list、catalog_entry_list、catalog_entry_show ツールを直接使用してください。初回使用前に各ツールの入力スキーマを確認してください。接続が利用できない場合は、何がチェックできなかったかを述べてください。エントリを作り話することはしないでください。

検索前の確認

1回の catalog_type_list 呼び出しで、属性スキーマを含むすべての種類が返されます。会話ごとに1回、最初の検索前に確認し、そこから全体の流れを計画してください:どの種類が対象を保持でき、どの属性の連鎖が答えに到達するか。すべての組織のカタログは独特です。ここに示される種類名や属性名は例であり、推測した type_name(Service ではなく Custom["Service"])は何も一致せず、エントリが存在しないように見えます。

エントリを探す

  • 質問に含まれる種類のヒントを基に検索範囲を設定してください。具体的な種類の言及(「チェックアウトサービス」「請求を担当するチーム」)はその種類と周辺に限定;ただの名前(「Atlasとは何?」)は種類について何も示さないため、組織のカスタム種類を並行して検索してください。精選された種類は少数です。その後、ネイティブまたは統合連携型を検索してください。単一種類の検索は、質問が種類を明記した場合のみ正当化されます。
  • 検索は名前と識別子のみに一致します。説明や属性値には一致しません。検索漏れは「検索した種類に含まれない」を意味し、「存在しない」ではありません。小規模な種類は全部リストしてから、エントリがないと結論づけてください。
  • 検索ヒットは完全な識別子ではありません。 アラートやフィールド値は、ID、外部ID、または別名で、そして種類の use_name_as_identifier が真の場合のみ名前で、エントリに一致します。identifier で一致を証明し、そのフラグが偽の場合、表示名を一致する値として提示しないでください。
  • 不在は種類ごとローカルです。 catalog_type_list はスキーマを説明します。エントリではありません:サービス検索では顧客が同じ名前のエントリを持つかは確立されません。「この顧客エントリは一致しない」と言う前に、顧客でその名前または識別子を照会し、has_more: false までページングしてください。そうでなければ、顧客は未確認と述べてください。「このサービスへのスキーマリンクなし」は「一致する顧客エントリなし」と異なります。
  • 1つの名前が複数の種類のエントリに一致する場合(「Atlas」コンポーネントと「Atlas」プロジェクト)、両方の候補、その種類とIDを先に述べてください。その間のリンクは、アラートがどちらを指すかを証明しません;区別が重要なら、アラートまたはその識別子を求めてください。1つを答えとして見出しに示し、もう1つを後に言及しないでください。
  • フィルター検索の結果は種類の規模ではありません。検索した種類のマッチ(一致数)と呼んでください。種類の合計を主張するのは、確実な数値またはフィルターなしリストを最後までページングした場合のみです。has_more: true はリスティングが不完全です。

リレーションシップを辿る

リレーションシップは指す側のエントリに存在し、ツールはその方向だけを読みます。 すべてのリレーションシップの質問を、「どの種類のスキーマが属性を保持するか」を問うことで確認してください。

  • 順方向(対象がその属性を保持 — 「検索インデクサーの所有者は?」):エントリの属性値から 名前(ID) をそのまま読んでください。ターゲットの完全で切り詰められていない属性が必要な場合は catalog_entry_show <id> を使用します。
  • 逆方向(他のエントリが対象を指す — 「メッセージバスを呼び出すのは何?」、「データプラットフォームチームが所有するのは?」):リレーションシップは指す側のエントリに存在し、対象自身の発信属性には存在しません。スキーマから参照側の種類と属性IDを探し、その後 catalog_entry_list を attribute_filters で呼び出します: [{ "attribute_id": "<参照側属性ID>", "operator": "one_of", "entry_ids": ["<対象ID>"] }]。 これはターゲットのID、外部ID、別名に一致し、マッチするエントリだけをページングします。未知またはアーカイブされたターゲットは、dependentsがないことの証明ではなく、エラーです。
  • 未割り当てまたは未設定(「所有者がないサービスはどれ?」):operator: "is_blank" で保存されたリレーションシップ属性をフィルターしてください。アーカイブされた所有者へのリレーションシップは 名前(アーカイブ済み)(ID) と読み、設定済みとカウントされるため、is_blank は返しません:空いているもの別に報告し、未設定として扱わないでください。
  • 複合条件(「未割り当ての重要度1サービス」):同じ attribute_filters リストに属性ごと1つのフィルターを置きます。ANDで結合されるため、手作業で交差させません。
  • 現在の状態、履歴ではない: is_blank または is_set スキャンは、現在設定されているもののみを示します。「現在未設定」と言い、履歴読み取りなしに「一度も設定されていない」とは言わないでください。
  • 完全な所有者の内訳: 同じ保存されたリレーションシップ属性について is_blank と is_set の両方を has_more: false までページングしてください。 合わせてアクティブなエントリを分割するため、合計を得るために全種類を再度リストしません。設定側では、(アーカイブ済み) リレーションシップを別に列挙してください:保存された値は必ずしも機能する所有者ではありません。
  • 複数ホップ(「Xが停止すると、どの顧客が影響を受けるか?」):フィルター逆ホップを意図的に連鎖させます — Xの dependents へ、その後サービスから、それらを参照する種類へ。各ホップでスキーマを確認し、チェーンが何を確立し、何をしなかったかを述べてください。

数値のみの場合、属性フィルターなしで include_total_count: true をリクエストしてください。小さい page_size は、その数値だけのためにページ全体を取得することを避けます。カウントはオプションでタイムアウトする可能性があります。不在の場合、合計を主張する前に has_more: false までページングしてください。search からのカウントはその検索のみで、種類全体ではありません。

チームメンバーシップ

team_show.members.items は設定されたチーム属性のユーザーIDと名前を持つ直属メンバーを保持します。完全な名簿を取得するまで members.pagination.next_cursor を has_more が偽になるまで辿ってください;members.configured: false は空のチームではありません。これらは直属メンバーであり、子チームを通じて継承されたすべての人ではありません。個人のチームについては、その User エントリを探し、設定されたチーム種類をメンバー属性で catalog_entry_list の one_of 属性フィルターでフィルターしてください。職務名またはSlackグループをチームエントリで代用しないでください。team_show.resources.items は、チームを指すカタログエントリではなく、リンクされた運用リソースをリストします:空のリストは、チームがサービスを所有していないことを証明しません。このクレームを作る前に、上記の逆引きを使用してください。

チーム階層について、親リレーションシップは子に保存されることを思い出してください:チームから前方に読むことで、その祖先を得ます。子孫については、チーム種類を親属性の one_of 属性フィルターで開始チームについてフィルターし、見つかった各チームについて繰り返し、各レベルを has_more: false までページングしてください。開始チームはそれ自体の子孫ではありません:その下の異なるチームをIDと共にリストしてください。子孫カウントは求められた場合のみ、完全なセットから開始チームのIDを除外した後に与えてください。

サービスのエスカレーションパス(段階的対応経路)を探す

「サービスまたはコンポーネントのためにページングされるのは誰か」はカタログウォーク(情報検索)で始まります:スケジュールはサービス所有権ではなく、人とシフトについて知ります。

  1. サービスエントリを探し、そのオーナーリレーションシップを辿ってください(チームまたは EscalationPath にリンクする属性についてスキーマを確認)。
  2. そのリレーションシップに支えられているチームとパスを名前にしてください。team_show はチームのパスをリストできます;escalation_path_list は名前で検索しますが、同じ名前のパスはそのサービスがそれを使うことの証明ではありません。
  3. オーナーリレーションシップが (アーカイブ済み) と読む場合、それを先に述べてください:チームはアーカイブされており、連絡する現在の所有者ではありません。リレーションシップが全く解決しない場合、そう述べてください。 ライブな所有者がない場合、このサービスについて確認されたパスがないと言い、ユーザーをオーナーの確認と更新に送って
原文(English)を表示

Catalog

The catalog is the organisation's structured map of itself: types (Service, Team, Customer…) each with a schema of attributes, and entries (search-indexer, Data Platform…) holding values for those attributes. Attributes that reference other entries render as Name (ID) — the ID in parentheses is how you hop. The catalog is authoritative: when conversation or incident context disagrees with it, the catalog wins, and you say so.

Three kinds of type, told apart by type_name:

  • Custom["…"] — org-defined types, often the best match for an organisational question. Search these first, but do not assume their entries were added by hand.
  • Native (EscalationPath, Schedule, User, AlertPriority…) — incident.io's own resources. Teams are not native: they live on an org-defined type, usually Custom["Team"], so use team_list and team_show rather than guessing its name. Contact details for a person (email, and phone numbers where the org exposes them) live on their User entry: resolve the person, then read the entry.
  • Integration-synced (GitHubRepository, PagerDutyService, SlackChannel…) — mirrors of other tools, often thousands of entries. Only search these when the user names the integration; "the ingest service" means the org's Service entry, not its GitHub repo.

Where a type's entries come from. type_name tells you which kind a type is, not who maintains its entries. For that, read registry_type and is_editable from catalog_type_list. A type with a registry_type is managed by incident.io, as its own resources or an integration it syncs, and isn't editable. A type without one isn't synced by incident.io, but an external job such as catalog-importer or Terraform may still write it through the API, and these tools can't see that: call it not integration-synced rather than hand-maintained. An attribute's mode describes that one field. For provenance questions, lead with the source and editability verdict plus that caveat; omit attribute inventories and entry counts unless asked.

Use the incident.io connection's catalog_type_list, catalog_entry_list and catalog_entry_show tools directly. Inspect a tool's input schema before first use. If the connection is unavailable, say what could not be checked; do not invent an entry.

Orient before you search

One catalog_type_list call returns every type with its attribute schema. Orient once per conversation, before your first search, and plan the whole walk from it: which types could hold the subject, which attribute chain reaches the answer. Every org's catalog is bespoke — type and attribute names here are examples, and a guessed type_name (Service instead of Custom["Service"]) matches nothing and looks like the entry doesn't exist.

Finding an entry

  • Let the question's own type hint set your search breadth. A typed mention ("the checkout service", "the team that owns billing") narrows to that type and its neighbours; a bare name ("what is Atlas?") tells you nothing about kind, so sweep the org's custom types in parallel — curated types are few — before native or integration ones. A single-type search is only justified when the question named the type.
  • Search matches entry names and identifiers only — not descriptions or attribute values. A miss means "not in the types searched", never "doesn't exist". List a small type outright before concluding an entry isn't there.
  • A search hit is not an exact identifier. An alert or field value matches an entry by its ID, external ID or an alias, and by its name only when the type's use_name_as_identifier is true. Prove a match with identifier, and never offer the display name as a value that will match when that flag is false.
  • Absence is type-local. catalog_type_list describes schemas, not entries: a Service search cannot establish whether Customer has a similarly named entry. Before saying "no Customer entry matches", query Customer for that name or identifier and page to has_more: false; otherwise say Customer was not checked. "No schema link to this service" is different from "no matching Customer entries."
  • When one name matches entries in several types (an "Atlas" component and an "Atlas" project), lead with both candidates, their types and IDs. A reference between them does not prove which one an alert names; ask for the alert or its identifier if the distinction matters. Don't headline one as the answer and mention the other later.
  • A filtered search's hits are not the size of a type. Call them matches in the types searched; claim a type total only from an authoritative count or an unfiltered list paged to the end. has_more: true means the listing is incomplete.

Walking relationships

The reference lives on the entry that points, and the tools only read that direction. Orient every relationship question by asking: which type's schema holds the attribute?

  • Forward (the subject holds the attribute — "who owns the search-indexer?"): read the Name (ID) straight off the entry's attribute value; catalog_entry_show <id> when you need the target's full, untruncated attributes.
  • Reverse (other entries point at the subject — "what calls the message-bus?", "what does the Data Platform team own?"): the reference lives on the entries that point, never on the subject's own outgoing attributes. Find the referencing type and attribute ID in the schema, then call catalog_entry_list with attribute_filters: [{ "attribute_id": "<referencing-attribute-id>", "operator": "one_of", "entry_ids": ["<subject-id>"] }]. It matches the target's ID, external ID and aliases and pages only the matching entries. An unknown or archived target is an error, not proof it has no dependents.
  • Unowned or unset ("which services have no Owner?"): filter the referencing type with operator: "is_blank" on the stored reference attribute. A reference to an archived owner reads Name (Archived) (ID) and counts as set, so is_blank never returns it: report those apart from the empty ones, not as unset.
  • Combined conditions ("unowned tier-1 services"): put one filter per attribute in the same attribute_filters list; they AND together, so no manual intersection.
  • Current state, not history: an is_blank or is_set scan only shows what is set now. Say "currently unset"; do not say "never set" without a historical read.
  • Complete owner breakdown: page both is_blank and is_set for the same stored reference attribute to has_more: false. Together they partition active entries, so their counts give the total without listing the entire type again. On the set side, list (Archived) references separately: a stored value is not necessarily a working owner.
  • Multi-hop ("which customers are affected if X goes down?"): chain the filtered reverse hops deliberately — to X's dependents, then from services to the type that references them. Check the schema at each hop, and name what the chain did and did not establish.

For a count alone, request include_total_count: true without an attribute filter; a small page_size avoids pulling a whole page just for that figure. The count is optional and can time out; when absent, page to has_more: false before claiming a total. A count from search is only for that search, not the type.

Team membership

team_show.members.items holds direct members with user IDs and names from the configured team attribute. Follow members.pagination.next_cursor until has_more is false for a full roster; members.configured: false is not an empty team. These are direct members, not everyone inherited through child teams. For a person's teams, find their User entry and filter the configured Team type by its members attribute with a catalog_entry_list one_of attribute filter; don't substitute a job title or Slack group for a Team entry. team_show.resources.items lists linked operational resources, not catalog entries pointing at the team: an empty list never proves the team owns no services. Use the reverse lookup above before making that claim.

For a team hierarchy, remember the parent reference is stored on the child: reading it forward from a team gives its ancestors. For descendants, filter the Team type with a one_of attribute filter on the parent attribute for the starting team, then repeat for each team found, paging each level to has_more: false. The starting team is not its own descendant: list the distinct teams below it with IDs. Give a descendant count only if asked, and only after excluding the starting team's ID from the complete set.

Finding a service's escalation path

"Who gets paged for a service or component" begins with a catalog walk: schedules know about people and shifts, not service ownership.

  1. Find the service entry and follow its owner reference (check the schema for the attribute linking to a Team or EscalationPath).
  2. Name the team and path backed by that reference. team_show can list a team's paths; escalation_path_list searches by name, but a similarly named path is not proof that the service uses it.
  3. If the Owner reference reads (Archived), lead with that: the team is archived and is not a current owner to contact. If the reference does not resolve at all, say so. Without a live owner, say no path for this service was verified, and send the user to confirm and update the Owner. Do not suggest a former parent, lead, successor, default path or platform on-call unless a read links it to this service.
  4. If the team resolves but has no linked path, say so. Members and similarly named paths do not establish routing; do not offer to page them.
  5. If the user asked for the current person or a future shift, hand the identified path to the on-call skill. The catalog's job ends at naming the path.

Resolving values for writes

This read skill cannot edit catalog entries or types. Explain the needed change, but do not offer to set Owner or edit a catalog entry. An incident custom-field write through another available tool is a separate action.

Before setting a catalog-typed custom field or escalating: resolve the name to an identifier with a catalog read, and pass the identifier, never the display name — names are ambiguous and case-drifted, and a write against the wrong entry lands on a real incident or pages a real person. If the resolution was fuzzy (several candidates, or a weak match), confirm with the user before the write, not after.

Answering

  • Asked to describe an org resource ("tell me about X", "what is X"), the catalog is the grounding: what X is in this org, who owns it, what it connects to. Documentation can add how it works — it never substitutes, because docs found by keyword may describe a different X than the entry the org actually operates.
  • Include IDs alongside names (Data Platform (01ABC…)) for anything the user might act on next — the next step, yours or theirs, needs the ID and shouldn't re-resolve it.
  • When asked for a complete list, deliver every matching entry's name and catalog ID after paging. Do not compress rows into a range or offer to give IDs later. If output is partial, state what is missing; count-only answers need not print entries.

原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。