Install any skill in seconds. Free to start, no credit card required.
Get Started Free →ルーター、スイッチ、Linuxホスト上のインターフェースエラー、ドロップ、CRC、デュプレックス不一致、フラッピング、速度ネゴシエーション問題、カウンタートレンドを診断する。
.claude/skills/affaan-m-network-interface-health/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 6% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 16% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 45% | 0% |
| case-01 | ✓→✓ | = Same ✓ | -29% | 0% |
ネットワークの症状が物理リンク、スイッチポート、ケーブル、トランシーバー、デュプレックス設定、または輻輳したインターフェースによって引き起こされている可能性がある場合にこのスキルを使用する。
ifInErrors、ifOutErrors、またはifOutDiscardsの増加を報告している。インターフェースカウンターは証拠だが、絶対値よりもトレンドの方が重要である。ベースラインを取得し、測定間隔を待ち、再度取得してから増分を比較する。
textshow interfaces <interface> show interfaces <interface> status show logging | include <interface>|changed state|line protocol
Linuxホストの場合:
textip -s link show <interface> ethtool <interface> ethtool -S <interface>
| カウンター | 意味 | 一般的な原因 | | --- | --- | --- | | CRC | 受信フレームのチェックサムが失敗 | 不良ケーブル、汚れたファイバー、不良オプティック、デュプレックス不一致 | | input errors | 受信側エラーの集計 | 結論を出す前にサブカウンターを確認 | | runts | 最小イーサネットサイズ未満のフレーム | デュプレックス不一致、コリジョンドメイン、不良NIC | | giants | 期待されるMTUより大きいフレーム | MTU不一致またはジャンボフレーム境界 | | input drops | デバイスがインバウンドパケットを受け入れられなかった | バースト、オーバーサブスクリプション、CPUパス、キュー圧迫 | | output drops | 送信キューがパケットを廃棄した | 輻輳、QoSポリシー、サイズ不足のアップリンク | | resets | インターフェースハードウェアリセット | フラッピング、キープアライブ、ドライバー、オプティック、電源 | | collisions | イーサネットコリジョンカウンター | ハーフデュプレックスまたはネゴシエーション不一致 |
両側がサポートしている場合、最新のイーサネットリンクではオートネゴシエーションを優先する。一方の側を固定する必要がある場合は、両側を明示的に設定し、理由を文書化する。一方をfixed speed/duplexに設定し、もう一方をautoにすることは絶対にしてはならない。
textshow interfaces <interface> | include duplex|speed
各インターフェースブロックを1つのヘッダーから次のヘッダーまでスライスする。任意の文字ウィンドウを使用しないこと。大きなインターフェースブロックはカウンターが欠落したり、誤ったポートに割り当てられたりする可能性がある。
pythonimport re from typing import Any HEADER_RE = re.compile( r"^(?P<name>\S+) is (?P<status>(?:administratively )?down|up), " r"line protocol is (?P<protocol>up|down)", re.I | re.M, ) ERROR_RE = re.compile(r"(?P<input>\d+) input errors, (?P<crc>\d+) CRC", re.I) DROP_RE = re.compile(r"(?P<output>\d+) output errors", re.I) DUPLEX_RE = re.compile(r"(?P<duplex>Full|Half|Auto)-duplex,\s+(?P<speed>[^,]+)", re.I) def parse_show_interfaces(raw: str) -> list[dict[str, Any]]: headers = list(HEADER_RE.finditer(raw)) interfaces = [] for index, header in enumerate(headers): end = headers[index + 1].start() if index + 1 < len(headers) else len(raw) block = raw[header.start():end] errors = ERROR_RE.search(block) drops = DROP_RE.search(block) duplex = DUPLEX_RE.search(block) interfaces.append({ "name": header.group("name"), "status": header.group("status"), "protocol": header.group("protocol"), "duplex": duplex.group("duplex") if duplex else "unknown", "speed": duplex.group("speed").strip() if duplex else "unknown", "input_errors": int(errors.group("input")) if errors else 0, "crc_errors": int(errors.group("crc")) if errors else 0, "output_errors": int(drops.group("output")) if drops else 0, }) return interfaces
network-troubleshooternetwork-config-validationhomelab-network-setup| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 27,547 | 12,185 | -56% | 1 | 1 | 0% | 5,598 | 4,002 | -29% | 0 | 0 | — |
case-02 | fail→pass | 22,271 | 16,042 | -28% | 1 | 1 | 0% | 3,986 | 4,233 | +6% | 0 | 0 | — |
case-03 | pass→pass | 6,909 | 7,180 | +4% | 1 | 1 | 0% | 996 | 2,767 | +178% | 0 | 0 | — |
case-04 | pass→pass | 14,587 | 9,451 | -35% | 1 | 1 | 0% | 2,427 | 2,985 | +23% | 0 | 0 | — |
case-05 | pass→pass | 14,358 | 8,234 | -43% | 1 | 1 | 0% | 2,277 | 3,078 | +35% | 0 | 0 | — |
case-06 | fail→pass | 11,297 | 4,584 | -59% | 1 | 1 | 0% | 2,026 | 2,544 | +26% | 0 | 0 | — |
case-07 | pass→pass | 12,184 | 16,557 | +36% | 1 | 1 | 0% | 1,802 | 3,182 | +77% | 0 | 0 | — |
case-08 | pass→pass | 12,483 | 9,048 | -28% | 1 | 1 | 0% | 1,934 | 3,063 | +58% | 0 | 0 | — |
case-09 | pass→pass | 11,357 | 18,267 | +61% | 1 | 1 | 0% | 1,430 | 2,515 | +76% | 0 | 0 | — |
case-10 | pass→pass | 11,499 | 9,333 | -19% | 1 | 1 | 0% | 1,930 | 3,256 | +69% | 0 | 0 | — |
case-11 | pass→pass | 9,854 | 11,113 | +13% | 1 | 1 | 0% | 1,648 | 2,909 | +77% | 0 | 0 | — |
case-12 | pass→pass | 14,876 | 12,102 | -19% | 1 | 1 | 0% | 2,055 | 3,438 | +67% | 0 | 0 | — |
case-13 | pass→pass | 8,879 | 4,022 | -55% | 1 | 1 | 0% | 1,490 | 2,203 | +48% | 0 | 0 | — |
case-19 | pass→pass | 12,439 | 7,629 | -39% | 1 | 1 | 0% | 1,863 | 2,727 | +46% | 0 | 0 | — |
case-14 | fail→pass | 17,750 | 8,100 | -54% | 1 | 1 | 0% | 2,688 | 3,117 | +16% | 0 | 0 | — |
case-15 | fail→pass | 15,364 | 13,018 | -15% | 1 | 1 | 0% | 2,464 | 3,575 | +45% | 0 | 0 | — |
case-16 | pass→pass | 5,150 | 3,835 | -26% | 1 | 1 | 0% | 815 | 2,222 | +173% | 0 | 0 | — |
case-17 | pass→pass | 15,504 | 12,834 | -17% | 1 | 1 | 0% | 2,303 | 3,763 | +63% | 0 | 0 | — |
case-18 | pass→pass | 11,017 | 8,444 | -23% | 1 | 1 | 0% | 1,626 | 2,938 | +81% | 0 | 0 | — |
case-20 | pass→pass | 5,650 | 6,845 | +21% | 1 | 1 | 0% | 1,102 | 2,767 | +151% | 0 | 0 | — |
case-21 | pass→pass | 27,117 | 11,641 | -57% | 1 | 1 | 0% | 2,256 | 3,497 | +55% | 0 | 0 | — |
case-22 | pass→pass | 4,120 | 4,394 | +7% | 1 | 1 | 0% | 836 | 2,536 | +203% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +18 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.