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が、別のエントリへ移動する際に使う識別子です。カタログは最終的な情報源です:会話やインシデントの文脈がカタログと矛盾する場合、カタログが正しく、その旨をお伝えします。
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"])は何も一致せず、エントリが存在しないように見えます。
use_name_as_identifier が真の場合のみ名前で、エントリに一致します。identifier で一致を証明し、そのフラグが偽の場合、表示名を一致する値として提示しないでください。catalog_type_list はスキーマを説明します。エントリではありません:サービス検索では顧客が同じ名前のエントリを持つかは確立されません。「この顧客エントリは一致しない」と言う前に、顧客でその名前または識別子を照会し、has_more: false までページングしてください。そうでなければ、顧客は未確認と述べてください。「このサービスへのスキーマリンクなし」は「一致する顧客エントリなし」と異なります。has_more: true はリスティングが不完全です。リレーションシップは指す側のエントリに存在し、ツールはその方向だけを読みます。 すべてのリレーションシップの質問を、「どの種類のスキーマが属性を保持するか」を問うことで確認してください。
名前(ID) をそのまま読んでください。ターゲットの完全で切り詰められていない属性が必要な場合は catalog_entry_show <id> を使用します。catalog_entry_list を attribute_filters で呼び出します:
[{ "attribute_id": "<参照側属性ID>", "operator": "one_of", "entry_ids": ["<対象ID>"] }]。
これはターゲットのID、外部ID、別名に一致し、マッチするエントリだけをページングします。未知またはアーカイブされたターゲットは、dependentsがないことの証明ではなく、エラーです。operator: "is_blank" で保存されたリレーションシップ属性をフィルターしてください。アーカイブされた所有者へのリレーションシップは 名前(アーカイブ済み)(ID) と読み、設定済みとカウントされるため、is_blank は返しません:空いているもの別に報告し、未設定として扱わないでください。attribute_filters リストに属性ごと1つのフィルターを置きます。ANDで結合されるため、手作業で交差させません。is_blank または is_set スキャンは、現在設定されているもののみを示します。「現在未設定」と言い、履歴読み取りなしに「一度も設定されていない」とは言わないでください。is_blank と is_set の両方を has_more: false までページングしてください。
合わせてアクティブなエントリを分割するため、合計を得るために全種類を再度リストしません。設定側では、(アーカイブ済み) リレーションシップを別に列挙してください:保存された値は必ずしも機能する所有者ではありません。数値のみの場合、属性フィルターなしで 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を除外した後に与えてください。
「サービスまたはコンポーネントのためにページングされるのは誰か」はカタログウォーク(情報検索)で始まります:スケジュールはサービス所有権ではなく、人とシフトについて知ります。
EscalationPath にリンクする属性についてスキーマを確認)。team_show はチームのパスをリストできます;escalation_path_list は名前で検索しますが、同じ名前のパスはそのサービスがそれを使うことの証明ではありません。(アーカイブ済み) と読む場合、それを先に述べてください:チームはアーカイブされており、連絡する現在の所有者ではありません。リレーションシップが全く解決しない場合、そう述べてください。
ライブな所有者がない場合、このサービスについて確認されたパスがないと言い、ユーザーをオーナーの確認と更新に送って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.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.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.
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.
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.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."has_more: true means the listing is incomplete.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?
Name (ID) straight off the entry's attribute value; catalog_entry_show <id> when
you need the target's full, untruncated attributes.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.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.attribute_filters list; they AND together, so no manual intersection.is_blank or is_set scan only shows what is set
now. Say "currently unset"; do not say "never set" without a historical read.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.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_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.
"Who gets paged for a service or component" begins with a catalog walk: schedules know about people and shifts, not service ownership.
EscalationPath).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.(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.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.
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.原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。