コルネの進捗や備忘録が記されたなにか

進捗や成果物や備忘録てきななにかを雑に更新していきます。

Muse のアバターアニメーションを再インストールなしで自作のアニメーションに差し替える

はじめに

Muse でアバターアニメを再インストールなしで自作アニメーションに差し替えることができたので、その備忘録です。

こちらの方の投稿をベースに主に再インストールのとこをアップデートさせていただきました。

内容

手元では Android, PC(Browser) は変化したこと確認済みです。

プロンプト

Muse に作成してもらいました。

以下プロンプトを、そのまま自分の Muse に貼って使ってください。
前提知識・手順・監視スクリプトの型まで含めてあるので、Muse がそのまま実行できます。

使い方の注意:
- 動画のコンセプトやキーフレームの好みは人それぞれなので、Phase 2 は対話しながら進める前提です。
- 実施前に、Muse が Phase 0 の現状確認結果を報告するのを待ってください。

私(Muse)のアバターの「状態アニメ」を自作動画に差し替えてください。
以下は実証済みの仕組みと手順です。この通りに進め、途中で分からないことがあれば止まって私に確認してください。

- 状態は6種類(idle / connecting / working / waiting_for_subagents / making_something / milestone_level_up)だが、実ファイルは4本だけ。
- 待機ファイル(ファイル名に状態名なし)= idle + connecting
- working ファイル = working + waiting_for_subagents
- making_something ファイル、milestone_level_up ファイルが各1本
- ファイルは ~/workspace/avatars/ に avatar-<ID>-…-attempt-<hash>.mp4 の形で置かれる。avatar.get で現在の対応関係を確認できる。
- アプリは状態アニメを「最初に表示する瞬間」に取得し、以後はそのコピーを使い続ける。取得済みのファイルを後から上書きしても、アプリの再起動や再インストールでは表示は切り替わらない(実測)。
- つまり勝敗は「上書きが初回取得より先かどうか」で決まる。アバターを変更すると新しいIDでファイルが再発行されるので、その生成直後が唯一の差し替えチャンス。
- アプリを開いたままだと、表示中の状態(特に作業中)が純正を先に取得してしまう。有効化から上書き完了までの間、アプリを閉じておくのが勝ち筋(この間もファイル生成はサーバー側で進む)。

純正と完全一致させること。
- 720×720、24fps、8.0秒(192フレーム)、H.264 High、yuv420p、音声なし
- 最初と最後のフレームが一致して自然にループすること

Phase 0: 現状確認(読み取り専用)
- avatar.get で現在のアバターと video_variants(状態→ファイル対応)を確認し、~/workspace/avatars/ の状態ファイル4本のハッシュと仕様(ffprobe)を報告する。

Phase 1: バックアップ
- アバターを変更する前に、現在の画像・状態ファイル・ダンス動画の一式を ~/workspace/avatars-backup/<日付>-snapshot/ に退避する。これは恒久ルールとして毎回守る。

Phase 2: 自作動画の用意
- 4状態それぞれのコンセプトを私と相談して決める。
- キーフレーム画像のチェーンを作り、私が外部の動画生成AIで動画化する(その方が手の動きなどが自然になる)。プロンプトは簡潔に:「これらの画像を自然な形で繋げて1つの動画にしてください」「最初と最後が繋がるようなループ動画にしてください」+固定カメラ・ブレやゴースト禁止・8秒・1:1。開始フレームはチェーンの最後にも置く。
- 私がアップロードした動画を受け取り、(a) 仕様、(b) 開始フレームと終了フレームの一致(ループ成立)、(c) 狙った動きが入っているか、をファイルから検証する。
- 変換は ffmpeg で行う。例(横長1280×720・10秒ソースを中央クロップして8秒化する場合):
ffmpeg -i source.mp4 -vf "setpts=0.8*PTS,crop=720:720:280:0,fps=24" -an -c:v libx264 -profile:v high -pix_fmt yuv420p -crf 18 converted.mp4
- 変換後に ffprobe と sha256sum で仕様とハッシュを確認し、4本そろうまでこのフェーズを終えない。

Phase 3: 反映の準備
- avatar.create で新しいアバター候補を作成し、私が1つ選ぶ。まだ avatar.set はしない。候補の見た目は現在のアバターと同一でも問題ない(目的は見た目の変更ではなく、新しいIDで状態ファイルが再発行されること)。
- 下記の監視スクリプトを ~/workspace/avatar-replace-work/deploy-watch.sh として用意し、変換済み4本のパスとハッシュ先頭8文字を自分の環境に合わせて書き換える。IGNORE には現在アクティブなアバターID(と過去のID)を入れる。

Phase 4: 反映(タイミングが全て)
1. 監視スクリプトをバックグラウンドで起動する。
2. 私に「アプリを完全に閉じてください。閉じたら合図を」と伝え、私が閉じたのを確認してから約30秒待つ。
3. avatar.set で選んだ候補を有効化する。
4. 監視スクリプトが新しい状態ファイルの出現を検知し、出現直後(目標0.1秒以内)に純正をバックアップして自作で上書きする。全4本のハッシュが自作と一致し、20秒以上安定したら完了とする。
5. 私に「完了しました。アプリを開いてください」と伝える。

#!/bin/bash
AVDIR="$HOME/workspace/avatars"
BAK="$HOME/workspace/avatars-backup/gen-stock"
mkdir -p "$BAK"
# 状態名 → 変換済みファイルのパス / ハッシュ先頭8文字(自分の環境に合わせて書き換える)
declare -A SRC=( [working]="/path/to/converted-working.mp4" \
[idle]="/path/to/converted-idle.mp4" \
[making_something]="/path/to/converted-making.mp4" \
[milestone_level_up]="/path/to/converted-milestone.mp4")
declare -A SHA=( [working]=xxxxxxxx [idle]=xxxxxxxx [making_something]=xxxxxxxx [milestone_level_up]=xxxxxxxx)
IGNORE="旧アバターID1|旧アバターID2"
declare -A SEEN
START=$SECONDS; STABLE_SINCE=0
while [ $((SECONDS-START)) -lt 420]; do
ALL=1
for f in "$AVDIR"/avatar-*.mp4; do
[ -e "$f"] || continue
base=$(basename "$f")
echo "$base" | grep -Eq "^avatar-([0-9]+)-[0-9]+-(working-|making_something-|milestone_level_up-)?attempt-[0-9a-f]+\.mp4$" || continue
id=$(echo "$base" | sed -E 's/^avatar-([0-9]+)-.*/\1/')
echo "$id" | grep -Eq "^($IGNORE)$" && continue
case "$base" in
*-working-attempt-*) st=working;;
*-making_something-attempt-*) st=making_something;;
*-milestone_level_up-attempt-*) st=milestone_level_up;;
*) st=idle;;
esac
h=$(sha256sum "$f" | cut -c1-8)
if [ "$h"!= "${SHA[$st]}"]; then
if [! -f "$BAK/$base"]; then cp "$f" "$BAK/$base"; fi
cp "${SRC[$st]}" "$f"
echo "$(date +%H:%M:%S.%3N) OVERWROTE $st"
SEEN[$st]=1; STABLE_SINCE=0
else
SEEN[$st]=1
fi
done
for st in working idle making_something milestone_level_up; do [ -n "${SEEN[$st]}"] || ALL=0; done
if [ "$ALL" = 1]; then
[ "$STABLE_SINCE" = 0] && STABLE_SINCE=$SECONDS
if [ $((SECONDS-STABLE_SINCE)) -ge 20]; then echo "ALLDONE"; exit 0; fi
fi
sleep 0.3
done
echo "TIMEOUT"; exit 1

Phase 5: 表示確認
- アプリを開いた後、各状態を実際に発火させて目視確認に付き合う。
- 待機:しばらく放置
- 作業中:長めのタスク(8秒以上かかる処理)を実行
- 作成中:画像生成を1回実行
- レベルアップ:使い捨てのテスト用ゴールを1つ作って即完了させる(ゴール完了で発火する)
- 私が「変わっていた」と報告するまでは、反映できたと断言しない。
- もし一部が純正のままだった場合は、原因(出現→上書きの間隔と、その間アプリで表示されていたか)を時刻で切り分けて報告し、再挑戦するかどうかは私に聞く。
- バックアップなしの上書き。
- 私の確認前に「反映できました」と断言すること。
- 監視対象にダンス動画など状態アニメ以外のファイルを含めること。

おわりに

この方法は公式に案内されたカスタマイズ手順ではなく、実測で判明した仕組みを利用するものです。Muse のアップデートで変わる可能性があります。  

また特に何も仕込んでいないですが、第三者の公開している特に今回のようなスクリプトが含まれたプロンプトを実行する場合は、まずは妥当性のチェックをしてから実行するようにしましょう。

私の環境では問題なかったですが、何か起きても私も責任は取れないので...

Copilot Studio の Microsoft Copilot Harness で Hooks を使ってみる

はじめに

Copilot Studio の GitHub Copilot Harness 改め、Microsoft Copilot Harness では Hooks という機能を利用することができます。

learn.microsoft.com

ちなみに GitHub Copilot Harness ⇒ Microsoft Copilot Harness にリネームされた発表は以下参照。

www.microsoft.com

blogs.microsoft.com

Hooks とは?

ひとことでいうと、セッション開始、ツールの実行、エラーが発生するなどのエージェントの動作の節目に、指定したワークフローを自動実行する機能です。
「AIが必要と判断したら呼ぶ」のではなく、「ツール実行前などのイベントが発生したら毎回呼ぶ」ことで、事前チェックやログ記録などを組み込めます。

なお、この機能は現在 Preview 機能な点にご注意ください。

何ができる?

現在 Hooks が対応するイベントは次の6種類です。

イベント 実行タイミング 代表的な用途
開始(ループ前) 新しい会話が始まるとき 最新の業務情報をエージェントの背景情報に追加
ユーザープロンプト送信済み ユーザー入力を処理する前 入力の書き換え・標準化
エラー ツール呼び出し以外でエラーが発生したとき 再試行・スキップ・中断の指定
ツール使用前 ツールの呼び出し直前 引数の検査・変更・実行拒否
ツール使用後 ツールの実行後 実行結果の加工・監査ログ記録
ツール後の失敗 ツールの呼び出しが失敗したとき 失敗の解釈や次の対応に役立つ補足情報の追加

※「ツール使用後」の実行条件は、画面では「成功または失敗にかかわらず」、Learn では「成功時」と説明されています。失敗時にも実行されるかは、対象環境での確認が必要です。

各イベントで利用できる入力・出力は決まっており、ワークフローの戻り値でエージェントの次の動作を調整します。

Hooks と Tools の違い

  • ツール:名前や説明を基に、エージェントが必要と判断して呼び出す。
  • Hooks:設定したイベントが発生すると、自動的にワークフローを呼び出す。

つまり、任意に使う処理は Tools、毎回適用したい処理は Hooks という使い分けです。
同じワークフローを、Tools と Hooks の両方で使うこともできます。

注意点

「毎回呼ばれる」ことと、「必ず処理が成功して制御できる」ことは別です。
ワークフローが失敗・タイムアウトしたり、戻り値を読み取れなかったりすると、エージェントはフックから何も返らなかったものとして処理を続行します。

また、ツール呼び出しを明示的に拒否できるのは「ツール実行前」のイベントです。実行後の加工では、既に実行された操作を防ぐことはできません。

「AIへの指示だけに任せず、決まったタイミングで業務処理を挟む仕組み」と捉えると分かりやすいです。
ただし、アクセス権限などに代わる強制的なセキュリティ設定ではありません。

設定方法

右上にある三点リーダー(その他のオプション)より、フックを選択して作成します。

今回の例では、Agent が Planner のタスクを更新したら Teams に通知するというシンプルな Hooks を作成してみます。

動作確認

「プレビュー」にて Plan を作成させてみます。

プロセスをみてみると、Tools 実行後に Hooks が呼び出されていることが確認できますね。

まず Tools で実行された結果として、Plan が作成されています。

次に Teams をみてみます。
今回、特にメッセージの整形をしなかったのでちょっとみにくいですが無事投稿されていますね。

参考までに、以下のようなトリガーを設定した場合の出力の結果を記載しておきます。

{
  "event": "PostTool",
  "timestamp": "2026-11-01T00:04:16.183000+00:00",
  "metadata": {
    "conversationId": "********-****-****-****-************",
    "userId": "********-****-****-****-************",
    "userAadObjectId": "********-****-****-****-************",
    "userDisplayName": "korune コルネ",
    "channel": "pva-studio",
    "agentId": "********-****-****-****-************",
    "agentName": "プロジェクト進捗レビューアシスタント",
    "agentSchemaName": "crc53_ProjectProgressReviewAgent"
  },
  "toolName": "create_task_v4",
  "parameters": {
    "body": {
      "create_task_v4_group_id": "********-****-****-****-************",
      "create_task_v4_plan_id": "****************************",
      "create_task_v4_title": "AX推進の対象業務と優先順位を整理する",
      "create_task_v4_due_date_time": "2026-11-13T00:00:00Z",
      "create_task_v4_priority": 5
    }
  },
  "result": {
    "textResultForLlm": "{\r\n  \"@odata.context\": \"https://graph.microsoft.com/beta/$metadata#planner/tasks/$entity\",\r\n  \"@odata.etag\": \"W/\\\"JzEtVGFzayAgQEBAQEBAQEBAQEBAQEBARCc=\\\"\",\r\n  \"isArchived\": false,\r\n  \"planId\": \"****************************\",\r\n  \"bucketId\": null,\r\n  \"title\": \"AX推進の対象業務と優先順位を整理する\",\r\n  \"orderHint\": \"8584081154294189769\",\r\n  \"assigneePriority\": \"\",\r\n  \"isOnMyDay\": false,\r\n  \"percentComplete\": 0,\r\n  \"startDateTime\": null,\r\n  \"createdDateTime\": \"2026-11-01T00:04:16.058617Z\",\r\n  \"lastModifiedDateTime\": \"2026-11-01T00:04:16.0587017Z\",\r\n  \"dueDateTime\": \"2026-11-13T00:00:00Z\",\r\n  \"hasDescription\": false,\r\n  \"hasChat\": false,\r\n  \"specifiedCompletionRequirements\": \"none\",\r\n  \"previewType\": \"automatic\",\r\n  \"completedDateTime\": null,\r\n  \"referenceCount\": 0,\r\n  \"checklistItemCount\": 0,\r\n  \"activeChecklistItemCount\": 0,\r\n  \"goalIds\": [],\r\n  \"conversationThreadId\": null,\r\n  \"priority\": 5,\r\n  \"id\": \"****************************\",\r\n  \"recurrence\": null,\r\n  \"archivalInfo\": null,\r\n  \"completedBy\": null,\r\n  \"creationSource\": null,\r\n  \"createdBy\": {\r\n    \"user\": {\r\n      \"displayName\": null,\r\n      \"id\": \"********-****-****-****-************\"\r\n    },\r\n    \"application\": {\r\n      \"displayName\": null,\r\n      \"id\": \"********-****-****-****-************\"\r\n    }\r\n  },\r\n  \"lastModifiedBy\": {\r\n    \"user\": {\r\n      \"displayName\": null,\r\n      \"id\": \"********-****-****-****-************\"\r\n    },\r\n    \"application\": {\r\n      \"displayName\": null,\r\n      \"id\": \"********-****-****-****-************\"\r\n    }\r\n  },\r\n  \"appliedCategories\": {},\r\n  \"assignments\": {},\r\n  \"_assignments\": []\r\n}",
    "resultType": "success",
    "toolTelemetry": {
      "metrics": {
        "context_token_limit": 667232,
        "context_current_tokens": 31253,
        "large_output_threshold_bytes": 51200
      }
    }
  }
}

一応 ID 系はマスクしてあります。

エージェントへは以下のような応答を返しています。

{
  "statusCode": "200",
  "schema": {
    "type": "object",
    "properties": {
      "modifiedResult": {
        "title": "modifiedResult",
        "type": "object",
        "description": "Replacement result handed to the model. Leave empty to keep the original.",
        "x-ms-dynamically-added": true
      },
      "additionalContext": {
        "title": "additionalContext",
        "type": "string",
        "description": "Extra text passed to the model alongside the result.",
        "x-ms-content-hint": "TEXT",
        "x-ms-dynamically-added": true
      },
      "suppressOutput": {
        "title": "suppressOutput",
        "type": "boolean",
        "description": "Set to true to hide this tool's output from the user.",
        "x-ms-dynamically-added": true
      }
    },
    "additionalProperties": {}
  }
}

おわりに

あまり Hooks を紹介している記事を見かけなかったので、簡単ではありますが Copilot Studio での Hooks の紹介記事でした。

特定のアクションを実行したあとに実行したい、Standard Harness での Topic 利用をイメージしてもらえればわかりやすいと思います。

今回のようなツール実行の記録や、特定の Plan や Teams の投稿先以外に変更や通知を掛けようとしている場合の事前ブロックなどに Hooks は役立ちます。

Instruction, Skill, Tools だけでなく、Hooks も活用することで、より安定した動作を行うことのできるエージェントを作成してみましょう。

Japan Power Platform Community Caravan 2026 開催!

はじめに

今年もやります!
Japan Power Platform Community Caravan!

jppcc.connpass.com

2026年度は前回の会場に加え、兵庫会場での開催も予定されています🎉

  • 東京会場
  • 名古屋会場
  • 沖縄会場
  • 広島会場
  • 佐賀会場
  • 石川会場
  • 大阪会場
  • 兵庫会場

イベント用ホームページの立上

今回からイベント用ホームページを立ち上げました!

koruneko.github.io

こちらでは開催イベントの一覧が確認できる他、各イベントがどのようなイベントを開催したのか?の開催レポートを簡単にまとめていく予定です。

今回分から実施となるので、既存開催分はレポート無しな点はご容赦ください。

また、本イベントではオンサイトならではのここだけのはなしも含まれる可能性があるので、イベントレポートでは、会話内容の詳細までは記載しない予定です。
ざっくりこういう感じの開催だったよー。という雰囲気レポートになる点予めご認識置きください。

コミュニティの趣旨と目的

Japan Power Platform Community Caravan (通称 JPPCC)では、Power Platform を起点に、Microsoft 365 や Microsoft 365 Copilot などのビジネスソリューションで 【つながる】 【ひろげる】 をテーマに日本各地でのイベントの開催を行っています。

ネットワーキングを拡げてもらうことを目的の1つとしているので、イベントは原則オンサイト限定のイベントとしています。
日本各地、そのロケーションでのソリューションの活用状況や興味関心、コミュニティの成熟度に合わせた内容のイベントをオンサイトで開催することで、物理的や現在の取り組み内容が近しい Power Platform / Microsoft 365 Copilot ユーザーとのネットワーキングを参加者の方々に構築してもらいたいと思っています。

参加者の方々には積極的にコミュニケーションをとっていただきたいので、ネットワーキングタイムを設けるなどして会話を行える機会を運営からも提供するようにします!

これにより、各地域でもコミュニティの繋がりを作ってもらい、日本各地でのコミュニティイベントの活性化や Power Platform / Microsoft 365 Copilot の利活用推進が拡がってもらえると嬉しいと思っています!!

直近開催予定のイベント紹介

東京会場

jppcc.connpass.com

開催概要

  • 費用: 無料
  • 提供形態: 対面形式
  • 会場: 日本マイクロソフト株式会社
  • オンライン配信: なし
  • 対象者: Power Platform や Microsoft 365 に関わるまたは関わろうとしている全ての方 (初心者からベテランまで)

当日のテーマ

当日のテーマは、参加者による参加者のための ラウンドテーブル です !

運営がファシリテーターとなり、Power Platform や Microsoft 365 Copilot に関わる全ての人のお悩み・課題を共有いただき、他の参加者・有識者の経験・知識で解決に向けた知見の共有を行う場です。

イベントの対象者は、Power Platform や Microsoft 365 Copilot に興味・関心を持つすべての方を対象としています。

立場の違うメンバーが集まることで、新しい視点が見つかったり、抱えている課題のヒントが得られるかもしれません。

それぞれの「現在地」から、Power Platform や Microsoft 365 Copilot のあり方についてしがらみの無い場で語り合いませんか?

今回は、ラウンドテーブルに入る前に、参加者の皆さんの Power Platform や Microsoft 365 Copilot に対する興味・関心、現在の利用状況などを共有する時間を設けています。

皆さんに回答いただいた内容を一覧で表示し、お互いの関心事や活用状況を知ることで、共通の話題や新たな発見につなげていきます。

これから使ってみたい方も、すでに業務で活用している方も、それぞれの立場からぜひご参加ください。

登壇者の話を聞く "セミナー形式" ではなく、ファシリテーターが全参加者にマイクを向ける場となります。参加される方は、ご自身または所属組織の Power Platform や Microsoft 365 Copilot に関する悩み・課題を必ずお持ちください。
持ち寄る話題は、大きな課題である必要はありません。「みんなの会社はどうしてる?」という素朴な疑問レベルで大丈夫です。

セッション詳細

開始 終了 所要時間 説明 対象者
13:15 13:25 10 集合 :warning:13:30 必着・時間厳守! 全員
13:30 14:00 30 受付対応 運営
14:00 14:15 15 会場からのご案内 & 開会の儀 運営
14:15 14:45 30 自己紹介タイム 全員
14:45 15:05 20 利用状況・興味関心を共有! 全員
15:05 15:45 40 第一部 : 全員参加型ラウンドテーブル 全員
15:45 16:00 15 休憩タイム 全員
16:00 17:00 60 第二部 : PowerAMA を見ながらラウンドテーブル 全員
17:00 17:15 15 休憩タイム 全員
17:15 17:45 30 ネットワーキングタイム 全員
17:45 18:00 15 写真撮影 & 振り返りタイム 全員
18:00 18:10 10 閉会の儀 運営
18:10 18:30 20 撤収 全員

名古屋会場

jppcc.connpass.com

開催概要

  • 費用: 無料
  • 提供形態: 対面形式
  • 会場: 日本マイクロソフト株式会社 中部支店
  • オンライン配信: なし
  • 対象者: Power Platform や Microsoft 365 に関わるまたは関わろうとしている全ての方 (初心者からベテランまで)

当日のテーマ

当日のテーマは、参加者による参加者のための 実装の疑問・お悩み解決 !! です !

運営がファシリテーターとなり、Power Platform や Microsoft 365 Copilot に関わる全ての人のお悩み・課題を共有いただき、他の参加者・有識者の経験・知識で解決に向けた知見の共有を行う場です。

Power Platform や Microsoft 365 Copilot の利用や実装に悩んでいる・うまくいかなくて困っているといったお悩みを共有いただき、有識者からは解決に向けたアドバイスを行い、参加者の皆さんには課題解決を疑似的に体験してもらう会を予定しています。

「できないこと」は恥ずかしいことではありません。完全な Closed 環境ですので、安心してお話しください。
運営も、安心してご登壇いただける環境作りに努めます。

立場の違うメンバーが集まることで、新しい視点が見つかったり、抱えている課題のヒントが得られるかもしれません。

登壇者の話を聞く "セミナー形式" ではなく、ファシリテーターが全参加者にマイクを向ける場となります。参加される方は、ご自身または所属組織の Power Platform や Microsoft 365 Copilot に関する悩み・課題を必ずお持ちください。
持ち寄る話題は、大きな課題である必要はありません。「みんなの会社はどうしてる?」という素朴な疑問レベルで大丈夫です。

セッション詳細

開始 終了 所要時間 説明 対象者
13:30 14:00 30 開場・受付 運営
14:00 14:15 15 会場からのご案内 & 開会の儀 運営
14:15 14:45 30 自己紹介タイム 全員
14:45 15:45 60 第一部 : 全員参加型ラウンドテーブル 全員
15:45 16:00 15 休憩タイム 全員
16:00 17:00 60 第二部 : PowerAMA を見ながらラウンドテーブル 全員
17:00 17:15 15 休憩タイム 全員
17:15 17:45 30 ネットワーキングタイム 全員
17:45 18:00 15 写真撮影 & 振り返りタイム 全員
18:00 18:10 10 閉会の儀 運営
18:10 18:30 20 撤収 全員

おわりに

冒頭でも記載しましたが、本コミュニティでのイベントはオンサイト限定でのイベントであり、後日イベント内容の配信や共有などは予定されておりません。

従って、予定の調整のつく方は是非現地に足をお運びいただければと思います!

私は今回も全会場で参加予定です!!

Copilot Code を Azure DevOps と接続して試してみる

はじめに

日本時間 10/22(木) に Copilot Code が利用可能になりました!

この記事では、登場したばかりの Copilot Code がどんな感じのものなのか?と Azure DevOps を連携することで、できるようになることを簡単にまとめています。

Copilot Code とは?

公式発表からの要約です。


Copilot Code は、自然言語で指示するだけで、アプリやダッシュボード、Web サイト、業務自動化などを作成できる Microsoft Copilot の新機能です。

GitHub Copilot と共通の基盤技術を活用しており、プログラミングの専門知識がなくても、作りたいものを会話で伝えるだけでソフトウェアを生成できます。

主な特徴は次のとおりです。

  • 自然言語による開発:アプリ、ダッシュボード、Web サイト、スクリプトなどを作成
  • 対話しながら改善:生成された画面をプレビューし、追加の指示で修正
  • 業務データとの連携:Microsoft 365 のドキュメントやメールなどを開発時のコンテキストとして活用
  • GitHub 連携:既存リポジトリの利用やコードの変更、Pull Request の作成に対応
  • アプリの共有:Copilot Managed Runtime を利用して、作成したアプリを組織内で公開

現在は Frontier プログラム向けのプレビュー機能として提供されており、利用できる機能や環境には制限があります。

これまでの Copilot が「質問に答える」「資料を作る」「業務を代行する」といった役割を担っていたのに対し、Copilot Code では 「業務に必要なソフトウェアそのものを作る」 ことができるようになります。

そして、今後は Autopilot の展開も控えています!

Autopilot は、ユーザーが指示するたびに動くのではなく、設定した目標に向けて継続的・自律的に業務を進める AI エージェントです。

Copilot が「使う AI」から「作る AI」、そして「自律的に働く AI」へと進化していくのが楽しみですね!

参考情報

Cowork や Copilot Studio のアプリ作成との違いは?

すでに Copilot Cowork や Copilot Studio でも、自然言語からアプリを作成できます。

これらと Copilot Code の違いを整理すると、以下のようになります。

比較項目 Copilot Cowork Copilot Studio Copilot Code
主な目的 業務の一環でアプリを作成 アプリの設計・作成・公開 AI によるソフトウェア開発
主な対象者 一般業務ユーザー アプリ作成者 業務ユーザー・開発者
作成できるもの 業務アプリ 業務アプリ アプリ、Web サイト、スクリプト、自動化など
開発方法 会話から App Skill を実行 専用画面で対話しながら作成 AI コーディングエージェントと対話
開発環境 クラウド クラウド ローカル・クラウド
GitHub 連携 標準の作成手順では案内なし 標準の作成手順では案内なし リポジトリ操作や Pull Request 作成に対応
アプリ実行基盤 Copilot Managed Runtime Copilot Managed Runtime Copilot Managed Runtime
(対応する業務アプリ)

ポイントは、Copilot Code はアプリ作成だけでなく、ソースコードを扱うソフトウェア開発全般に対応していることです。

また、3つの機能で作成する業務アプリは、共通の Copilot Managed Runtime 上で実行できます。つまり、開発の入口や進め方は異なりますが、業務アプリの実行・管理基盤は共通化されています。

参考情報

必要なライセンス

個人アカウントはここでは触れず、職場アカウントの利用想定で記載します。

  • 必要なライセンス:Microsoft 365 Copilot
  • 従量課金:Copilot Credits

上記でも記載していますが、Frontier 機能なので Frontier 機能の利用が有効になっていることが前提です。

Copilot Credits の利用は、Microsoft 365 Admin Center (aka.ms/admin) より、
Copilot > コスト管理
のポリシーにて、以下のように「コード」を有効化してあげる必要があります。

learn.microsoft.com

Web から Copilot Code を試す

Copilot Code は https://copilot.cloud.microsoft/code からアクセスすることが可能です。

10/25 現在利用できるモデルは以下となっています。

Cowork のように Effort Level を変更することも可能です。

次にサンプルのプロンプトを試してみます。

タイトルと開始時刻を使用して、今後 24 時間以内に予定されている時間指定のカレンダー イベントのみを読み上げてください。アニメーション付きの進行状況リング、編集可能なセッション時間、開始、一時停止、リセットの操作機能を備えたデザインの美しい集中タイマーを作成してください。別途、そのイベントまでのカウントダウンも表示してください。イベントがない場合は、会議のカウントダウンなしで作成してください。予定表の内容は変更しないでください。

88 Credits、飲み物1本分ぐらいですかね。

作成したアプリは Cowork や Copilot Studio のアプリ作成機能と同様に https://preview.managedapps.cloud.microsoft/ で確認することができます。

Power Platform Admin Center aka.ms/ppac のインベントリをみてみると、環境ルーティングされた個人開発環境にアプリが作成されていることが確認できます。

正直 Web の Copilot Code からのアプリ作成だと、Cowork や Copilot Studio でのアプリ作成とそんな大差ないですね。

Desktop アプリ(ローカル)から Copilot Code を試す

次に Desktop アプリからの操作です。

Desktop アプリだと、Web と違い設定項目や利用できるモデルにいくつかの違いがあります。

クラウドを選択すると、Web のときと同じ設定になります。(利用できるモデルも同じになる)

現状、利用するとしたら GitHub Enterprise もしくは Azure DevOps と接続させたうえでの Desktop アプリを利用したローカル利用になると思います。

GitHub アカウントと接続するには、Microsoft Admin Center > Copilot > 設定 > コード での GitHub アカウント接続 (Frontier) より、設定を行う必要があります。

ここで、Organization の設定を行ったうえで、各自の設定より、アカウント接続を行うかたちとなります。

learn.microsoft.com

learn.microsoft.com

なお、今回は GHE は個人で用意するのがめんどくさいので、Azure DevOps との接続を行います。

Azure DevOps の場合は管理者や個人による接続や設定は不要です。

ただし、同一テナント上に Azure DevOps が建てられている必要があります。

Azure DevOps への接続は以下から行うことが可能です。

では、リポジトリに接続して試してみましょう。

といっても普通に接続して作成してもらっても面白くないので、AGENTS.md など事前にいくつか仕込んだうえで開発を行ってみましょう。

これらには、先に要件などを確認してから開発を行う SPEC 駆動開発 のルールを主に採用しています。

以下のようなアプリの作成を依頼してみます。

タスク集中アプリを作成したいです。

自分のタスクを管理できるようにし、集中タイマーを使って作業に取り組めるアプリを考えています。

主な希望は以下のとおりです。

- タスク管理: 自分のタスクを登録・管理できる。
- 集中タイマー: 集中時間と休憩時間を任意に設定できる。
- 繰り返し設定: 集中と休憩を任意の回数だけ繰り返せる。
-ゲーミフィケーション: まずは、アプリの利用実績に応じてスタンプを獲得できる機能を追加したい。

これらを出発点として、使いやすいアプリにするための要件を一緒に考えていきたいです。

プロンプトを送ると、いくつかの質問を自律的にしてくれ、要件をまとめてくれました。

## 要件ドラフト(未承認)

これまでの回答は次のとおりです。
- 形態は、PC のブラウザで使う自分専用の Web アプリです。データはローカルに保存します。
- タスクを選んでタイマーを開始し、タスクごとに集中時間を記録します。
- スタンプは、セッション完了回数、タスク完了数の累計、連続利用日数に応じて獲得します。

### 必要な振る舞い
1. **タスク管理**
   - タスクを追加、編集、削除できます。
   - タスクを完了、未完了に切り替えられます。
   - 各タスクの累計集中時間を表示します。
2. **集中タイマー**
   - 集中時間と休憩時間を分単位で任意に設定できます。
   - 開始、一時停止、再開、中止ができます。
   - 集中と休憩の切り替え時に、画面表示と音で通知します。
3. **繰り返し**
   - 「集中+休憩」を指定した回数だけ自動で繰り返します。
   - 最後の集中のあとには休憩を入れず、そこで終了します。
4. **記録**
   - 最後まで完了した集中セッションを、選択したタスクに紐づけて記録します。
5. **スタンプ**
   - 条件を満たすと、スタンプを獲得し、一覧で確認できます。
   - 獲得時に通知します。
   - 初期スタンプの例は次のとおりです。これは仮案です。
     - 初回セッション完了
     - セッション10回、50回、100回
     - タスク完了10件
     - 3日連続、7日連続

### 受け入れ基準(案)
- **AC-01:** タスクを追加、編集、削除、完了でき、ブラウザを再読み込みしても残っています。
- **AC-02:** 集中時間、休憩時間、繰り返し回数を設定でき、設定値どおりに「集中→休憩」が進みます。
- **AC-03:** 一時停止と再開で、残り時間が正しく保たれます。
- **AC-04:** 集中セッションが完了すると、選択タスクの累計集中時間に加算されます。中止したセッションは加算されません。
- **AC-05:** スタンプの獲得条件を満たしたときだけ、スタンプを1回だけ獲得します。
- **AC-06:** 連続利用日数は、1日に1回以上セッションを完了すると加算されます。1日空くとリセットされます。
- **AC-07:** 不正な設定値(0分、負数、空欄)は保存できず、エラーが表示されます。

### 例外、失敗時の挙動
- 実行中にタブを閉じたり再読み込みしたりした場合の扱いは、Q-02 で決めます。
- ブラウザのローカルデータが消えると、記録も失われます。

### 対象外(今回やらないこと)
アカウント、ログイン、クラウド同期、複数端末対応、スマホ対応、チーム共有、ランキング。

### 未決事項
- **Q-01:** セッションを途中で中止したとき、経過時間をタスクに記録しますか。それとも記録しませんか。
- **Q-02:** 実行中にタブを閉じたり再読み込みしたりした場合は、タイマーを復元しますか。それとも中断扱いにしますか。
- **Q-03:** 連続利用日数の「日」の区切りは0時でよいですか。
- **Q-04:** スタンプの種類と条件の最終案は、上の仮案でよいですか。
- **Q-05:** データのバックアップ用に、エクスポートとインポートは必要ですか。

### 次のステップ
Q-01 から順に確認し、承認をいただいたら `docs/features/<slug>/spec.md` に保存します。その後、技術構成を提案します。

まず Q-01 です。途中で中止したセッションの経過時間は、タスクに記録しますか。

Marked files: なし(ファイルは作成していません)
Not marked: なし

追加の確認事項があったので回答しておきます。

確認などの対話を経て、Draft 版が完成したら、PR を作成します。

PR は右上の「PR を作成」から行うことができ、「ドラフト PR を作成」オプションへ切り替えて実施することも可能です。

以上の操作で、AGENTS.md のルールを守らせたうえで、Azure DevOps への push まで行うことができます。

しかし、この操作ではあくまでもコードを生成しただけなので、Managed Runtime (Power Platform 上)にはデプロイされていません。

Managed Runtime 上にデプロイさせるには追加で、Managed Runtime 上へのデプロイ指示が必要です。

ただし、デプロイ指示を行う前に個人開発環境に設定している環境グループにて、以下2つの設定を許可する必要があります。

  • Allow app creation with the Copilot Managed Runtime command line interface (CLI)
  • Allow external artifact deployment

Learn more のリンク先は以下です。

learn.microsoft.com

learn.microsoft.com

これにより Managed Runtime 上へのデプロイまで実行することができます。

参考までに、こちらの操作では 450 Credits ほど消費しました。
要件確認の対話や Azure DevOps の操作などがある分、消費クレジットも増えていますね。

「ほど」と記載したのは、現在ローカル実行では /cost が利用できないからです。

その代わり?他にいくつかのスキルが利用可能になっています。

おわりに

VSCode での Copilot 利用や、GitHub Copilot App などを利用した Agentic Development と比較すると見劣りしますが、

  • Microsoft 365 (Power Platform) のガバナンスコントロール下で開発を行わせたい
  • Copilot Credit と合算させて開発を行わせたい

というようなニーズにはいい感じの機能なのではないかな?と思いました。

(知っておくには越したことはないですが) GitHub や Azure DevOps の操作を理解していなくとも開発が行えるので、AI 活用に慣れてきた業務ユーザーや、簡易な開発を行いたい開発者向け機能といった形ですかね。

こうなってくると、業務アプリ開発には Vibe Coding ではなく Agentic Development のような開発手法が求められてくると思いますので、組織で Agent 開発の Baseline となるテンプレートを構築する需要が高まってきそうですね。
(そもそも Copilot Credits などの従量課金がどこまで利用許可されるのか問題はありますが...)

SharePoint の Plans と Skills を活用して SharePoint の Copilot をカスタマイズする

はじめに

SharePoint では Plans や Skills を利用して SharePoint の Copilot を拡張することが可能です。

今回は Plans に焦点を当てつつ、この機能の紹介とちょっとしたテクニックについてまとめます。

Plans と Skills の違い

10/15 日現在、公式のドキュメントとして Plans のことを紹介しているドキュメントは (多分) まだないです。

Skills であれば、以下ドキュメントで紹介されています。

learn.microsoft.com

ということで、わかんない機能は実際に SharePoint の Copilot にきいちゃえってことで教えてもらった内容をまとめると以下のようになります。

種類 役割 たとえ
Plans 目的を達成するための全体計画。作業の順序、使う Skill、成果物、完了条件を決める。 旅行の旅程表
Skills 特定の作業を確実に行うための専門手順。入力、手順、出力形式、注意点を決める。 料理のレシピ

ではどうやって使い分ければいいの?というと、

  • Plan は「何を、どの順序で、どこまで行うか」を管理します。
  • Skill は「個別の作業を、どう実行するか」を定義します。
  • 1つの Plan の中で、複数の Skills を組み合わせることがあります。
  • Skill は単独でも使えますが、複数工程が必要な依頼では Plan が全体を統括します。

一言でいうと、

  • Plan = 作業全体の設計図
  • Skill = 個別作業の実行手順

となります。

組み込みスキル

SharePoint 内では既定で以下のスキルが組み込まれています。
/Skills で確認できます。

  1. check-skills
    このサイトのスキルについて、選択の適切さ、トークンサイズ、壊れた参照、ツール名、重複、機能の重なりなどを監査します……

  2. create-skill
    ユーザーが手順、形式、パターンを新しいスキルとしてパッケージ化したい場合に使用します。

  3. init
    サイト内のライブラリ、リスト、ページ、利用目的をもとに SHAREPOINT.md の下書きを作成し、SharePoint サイトの初期設定を支援します。サイトの……

  4. sharepoint-automation
    SharePoint の自動化に関する依頼を、クイックステップ、承認、ワークフロー、ルール、監査へ振り分けます。自動化に関する……

  5. improve-skill
    評価基準、テスト入力、スコアリングを使用し、ラウンドごとにプロンプトを1か所ずつ変更しながら、既存のスキルを改善します。スキルの……

/Skills だけだと説明が見切れるうえに、「/Skills で Built-in skills を説明する」みたいにお願いしても同じ結果しか返してくれません。

しかし、「/create-skill について説明する」みたいに、他の組み込みスキルであればスキルの内容を解説してもらうこともできます。

ちなみに /init などで作成できる SHAREPOINT.md は割と大事だったりします。(後述)

Plan には、既定で定義された組み込みの Plan はありません。

Plans と Skills の作成方法

Plans や Skills を作成したい場合は、SharePoint の Copilot に依頼すれば作成することが可能です。

SharePoint の Copilot に欲しい Skill や Plan を伝えてみて作成してみてもらいましょう。

作成した Skill は個人用であれば、個人の OneDrive に保存されます。

サイトの Skill として作成した場合は、対象のサイトの AgentAssets 配下に作成されます。

Plan は個人の Plan としての作成は現状できないので、サイトの資産として AgentAssets 配下に作成されることになります。

もちろん用途にもよりますが、SharePoint はチームのコラボレーションの場になると思うので、チーム間で Skill や Plan を共有のうえ、適宜ブラッシュアップをしていくような運用の方が良いのではないでしょうか?

余談ですが、
Skill は /AgentAssets/Skills/<skill-name>/SKILL.md という構成なのに対し、
Plan は /AgentAssets/Plan/<plan-name>.md という構成で作成されます。

残念なことに、独自で作成した Slill や Plan は /<skill-name> の入力候補に表示されません。

なのでどういうときに呼ばれるか?というのを Skill や Plan の Markdown 内で定義しておくことが大事です。

---
name: english-internal-names
description: |-
  リスト、ドキュメント ライブラリ、列、SharePoint ページを作成する際、内部名を英語の kebab-case で設計・検証します。表示名が日本語でも、内部名は英語に統一します。

  Use when the user says:
  - "リストを作成して"
  - "ライブラリを作成して"
  - "列を追加して"
  - "ページを作成して"
  - "SharePoint のページを作って"
---

どんな感じになる?

たとえば、プロジェクトの進捗・課題レビューをまとめるための Plan と Skill を作成して動かしてみます。

特定のドキュメントライブラリに格納された、課題一覧や、議事メモ、スケジュールなどのファイルを分析し、SharePoint page (HTML page) を更新するような Plan と Skill を作成しました。

作成した Plan:
- project-progress-review

作成した Skill:
- project-progress-issue-analysis
- project-review-html-page
- digital-agency-html-pages

Plan project-progress-review はこの動作になるように Skills たちを呼び出す役目を担います。

Skill の役割はそれぞれざっくり以下のようにしています。

  • project-progress-issue-analysis
    複数のプロジェクト資料を横断して、進捗・課題・リスク・担当者・期限・次アクション・WBSを根拠ファイル付きで構造化する、分析専用の Skill です。情報がない項目は推測せず、「記載なし」や「要確認」として扱います。ページ更新は行いません。
  • project-review-html-page
    構造化済みのレビュー結果を、SitePages/project-progress-review.html にダッシュボード形式で上書き更新する Skill です。KPI、進捗率のデータバー、状態ラベル、詳細フィルター、開始日・終了日を持つWBSの横スクロール式ガントチャートを実装します。作成前に digital-agency-html-pages を読み込む必要があります。
  • digital-agency-html-pages
    このサイトの SitePages 配下で HTML ページを作成・更新する際の共通ルールです。自己完結型HTML、SharePointテーマとの調和、セマンティックHTML、コントラスト、キーボード操作、モバイル表示を求めます。外部CDN・外部スクリプト・fetch は使わず、既存ページは同名上書きでURLを維持します。

最後の digital-agency-html-pages だけが他の Skill と少し違い、このサイトで HTML page を作成する際のデザインガイドラインのような役目を担っています。

ガイドラインはデジ庁公開の「デザインシステム」を参考にしています。

www.digital.go.jp

さて、これで Plan や Skill の作成は完了ではあるのですが、ここで少し注意が必要になってきます。

先程、Skill や Plan は入力候補に表示されないので、どういうときに呼び出されるものなのか定義しましょう。と説明したかと思います。
入力候補にでてこないのであれば、毎回 Skill 名や Plan 名を入力するのは面倒ですからね。

ただここでも困ったことに、Plan の呼び出し条件よりも、どうやら Skill の呼び出し条件の方が優先して参照されてしまう他、「Plan を使って~」や「Plan Agent を使って~」みたいに指示しても、AgentAssets 配下の Plan を見てくれないことが多いです。

そこでこの問題の解決に役立つのが SHAREPOINT.md です。

こいつは AGENTS.md のように、サイトのエージェント固有のルール・手順・制約を記載するファイルなので、SharePoint で Copilot を利用するとまず一番に読みに行ってくれます。

ここに 「Plan をつかって」 などのワードが利用された場合は AgentAssets 内の Plan を参照することを明記してあげれば、期待通りに Plan をみにいってくれるようになります。

例えば以下のように定義します。

## Agent reference rules

- ユーザーが「Plan を使って」「Agent Plan を参照して」などと指示した場合は、AgentAssets 内の Plan を最優先で検索・参照する。
- ユーザーが特定のファイル、フォルダー、URL、または選択中のファイルを明示した場合は、その指定を Plan より優先する。
- AgentAssets 内に複数の Plan 候補がある場合は、内容と更新日を確認し、依頼に最も合うものを根拠として使う。

SHAREPOINT.md も /init で作成ができる他、わざわざ Skill 呼び出さなくとも SHAREPOINT.md を作成したい。って伝えれば作成してくれます。

SHAREPOINT.md は AgentAssets の直下に作成されます。

他にもルールがある場合は SHAREPOINT.md を活用するとよいですね。

さて、ここまで準備ができたら実際に Plan たちを利用してみます。

今回サンプルとして用意しているのは以下5つのファイルたちです。

SharePoint の Copilot にて、今回だと 「Plan を使って今月のプロジェクト進捗と課題まとめて」 と依頼してみます。

すると、SHAREPOINT.md がきちんと参照されていることが確認できるかと思います。

また指定の Skill たちもきちんと参照してくれていますね。

結果として以下のような応答と出力を得ることができました!

なんかいい感じにタスク実行してくれてますね。

おわりに

SharePoint の Copilot を Skill や Plan で拡張してあげることで、チームで利用しやすい形に Copilot をカスタマイズすることができます。

また、最近のアップデートで利用可能になった HTML page と組み合わせることができることがわかったのも今回の検証の収穫でした。

Skill では、SharePoint 内のファイル検索や要約などはもちろん、作成や更新なんかも行うことができます。
ただし、外部 Web サイトを参照させたり、API を実行したりといった操作はできないのと、スクリプトの実行はできない (Markdown Only) な点が Teams や Outlook で通知といった、ちょっと込み入った作業工夫必要になってきますね。

この機能は Microsoft 365 Copilot ライセンスがあれば追加の Copiot Credits などなしで利用可能ですので是非試してみてください!

おまけとして、今回作成した Plan と Skill の内容を貼り付けておきます。
といっても Copilot に作成させたやつなので、参考になるかわからないですが...

おまけ

Plans

project-progress-review

# プロジェクト進捗・課題レビュー運用 Plan

## 適用条件と優先順位

次の依頼では、この Plan を最優先で適用する。ページ更新を指定していない場合でも、分析だけで終了せずレビュー ページを更新する。

- 「今週のプロジェクト進捗と課題をまとめて」
- 「今月のプロジェクト進捗と課題をまとめて」
- 「プロジェクトの進捗と課題をまとめて」

ユーザーが明示的に「チャットだけで」「ページを更新しないで」「分析だけ」と指定した場合のみ、ページ更新を省略する。

## 目的

Routine operations ライブラリの複数資料を分析し、同じレビュー ページを継続更新する。

- 入力ライブラリ: `https://mvpkorune.sharepoint.com/sites/Demo/Routine%20operations`
- 出力ページ: `https://mvpkorune.sharepoint.com/sites/Demo/SitePages/project-progress-review.html`

## 実行順序

1. `project-progress-issue-analysis` を読み込み、指定期間の進捗・課題・リスク・期限・担当者・次アクション・WBS を根拠付きで構造化する。
2. `project-review-html-page` を読み込む。
3. `project-review-html-page` の指示に従い、HTML 作成・更新前に必ず `digital-agency-html-pages` を読み込む。
4. 出力先のライブラリを必ず SitePages として解決し、`/sites/Demo/SitePages` を書き込み先に指定する。現在の入力ライブラリや相対パスを出力先に流用しない。
5. `project-progress-review.html` を SitePages 内で同名上書き更新する。削除、移動、リネーム、削除後の再作成は行わない。
6. 保存後、返却されたファイル URL またはパスが `/sites/Demo/SitePages/project-progress-review.html` と一致することを確認する。`Routine operations/sites/Demo/SitePages` などの入れ子パスなら成功扱いにせず、誤配置として報告する。
7. ページ更新の成功を確認してから、チャットに要約とページ URL を返す。

## 必須のページ内容

### ダッシュボード

- 更新日時と対象期間
- 総合ステータス
- KPI カード: 進捗件数、課題・リスク件数、期限超過・期限接近件数、次アクション件数
- ステータス別の件数・進捗状況を示す集計表またはグラフ
- 指定期間内で開始日・終了日が確認できる WBS は、必ず日付軸付きのガントチャートで表示する。単なる WBS 一覧表では代替しない。
- 進捗率を表示する箇所では、数値に加えて同じセルまたはカード内に実進捗率に対応したデータバーを表示する。
- 遅延、期限超過、期限接近、ブロック中の項目は視覚的に強調する。色だけに依存せず、状態ラベル・アイコンまたは文言も併記する。

### 詳細

- 要約と総合ステータス
- 進捗状況
- 課題・リスク
- 期限超過・期限接近項目
- 次アクション
- 資料間の矛盾・情報不足
- 参照ファイル

## 完了条件

- 関連資料を内容から検索している。
- 各進捗・課題に根拠ファイルがある。
- 未記載の状態、期限、担当者を推測していない。
- 開始日・終了日がある WBS をガントチャートとして表示している。
- 進捗率に数値とデータバーを併記している。
- 遅延・期限超過・期限接近・ブロック中の項目をラベル付きで強調表示している。
- HTML ページを SitePages に上書き更新している。
- 保存先 URL が `/sites/Demo/SitePages/project-progress-review.html` と一致している。
- HTML 更新時に `digital-agency-html-pages` を適用している。
- ページ更新に失敗した場合は、失敗として報告している。
- 元ファイルを変更していない。

## 例外

分析だけを求める明示的な依頼では、Skill 1 のみを使用してチャットで結果を返す。

Skills

project-progress-issue-analysis

---
name: project-progress-issue-analysis
description: |-
  Routine operations ライブラリ内の複数ファイルを内容から検索し、プロジェクトの進捗・課題・リスク・担当者・期限・次アクションを根拠付きで構造化します。HTML ページの更新は行わず、Plan またはページ更新 Skill の入力を作ります。

  Use when the user says:
  - "プロジェクト資料から課題を整理して"
  - "進捗とリスクをレビューして"
  - "プロジェクトの進捗・課題を分析して"
  - "プロジェクトの状況を分析して"
---
# Project Progress and Issue Analysis

## When to use

Routine operations ライブラリにある複数のプロジェクト資料を横断し、進捗、課題、リスク、担当者、期限、決定事項、次アクション、スケジュール情報を構造化して整理する依頼で使用する。

この Skill は分析専用である。HTML ページの掲載・更新は行わない。進捗と課題を「まとめて」と依頼され、レビュー ページの更新を伴う `project-progress-review` Plan が適用される場合は、Plan から呼び出される入力分析として使用する。

## Inputs

- 対象ライブラリ: `https://mvpkorune.sharepoint.com/sites/Demo/Routine%20operations`
- 対象期間: ユーザーが指定した期間。指定がなければ、資料に記載された最新の報告期間と更新日を明記する。

## Steps

1. 対象ライブラリを内容ベースで検索し、進捗報告、会議メモ、課題一覧、リスク一覧、スケジュール、WBS の候補を特定する。
2. 候補ファイルを読み、進捗、課題・リスク、担当者、期限、決定事項、次アクションを情報源ごとに抽出する。資料にない値は推測せず「記載なし」とする。
3. 指定期間に該当する WBS・スケジュール項目が資料にある場合、タスク名、開始日、終了日、状態、担当者、依存関係またはマイルストーン、根拠を構造化する。開始日・終了日のどちらかが欠ける場合は「期間表示不可」とする。
4. 同一と判断できる項目は統合する。ただし、状態・期限・担当者が資料間で異なる場合は、上書きせず矛盾として情報源ごとに示す。
5. 期限超過または期限が近い未完了項目を分けて示す。期限や状態がない項目は判定不能として扱う。
6. 各項目に情報源ファイル名を付ける。根拠が不十分な解釈は、事実と区別して「要確認」とする。
7. 情報源の不足、読み取りエラー、対象期間が不明な場合は明記する。内容を補完・創作しない。

## Output format

次の順序で構造化結果を返す。

1. 対象期間と参照ファイル
2. 要約
3. 進捗状況(項目、状態、担当者、期限、根拠)
4. 指定期間の WBS・スケジュール(タスク、開始日、終了日、状態、担当者、マイルストーン、根拠)
5. 課題・リスク(内容、状態、担当者、期限、影響、根拠)
6. 期限超過・期限接近項目
7. 次アクション(内容、担当者、期限、根拠)
8. 資料間の矛盾・情報不足

## Constraints

- 元ファイルを更新・移動・削除しない。
- 状態、期限、担当者、開始日、終了日を推測しない。
- 出力ページや通知は更新しない。呼び出し元の Plan または専用 Skill が担当する。
- ファイルが見つからない、または読み取りに失敗した場合は、その事実を明記する。

project-review-html-page

---
name: project-review-html-page
description: |-
  構造化済みのプロジェクトレビュー結果を、明示的に指定された SitePages の HTML レビューページへダッシュボード形式で反映・更新します。固定情報列と横スクロール日付軸のガントチャート、ラベル、レコード単位の詳細展開で、進捗・遅延を把握しやすくします。分析・要約だけの依頼には適用しません。

  Use when the user says:
  - "プロジェクトレビュー ページを更新して"
  - "進捗と課題を HTML ページに反映して"
  - "レビュー結果を SitePages に掲載して"
  - "project-progress-review.html を更新して"
---
# Project Review HTML Page

## When to use

構造化済みのプロジェクト進捗・課題レビュー結果を、SharePoint `SitePages` のレビュー用 HTML ページへ掲載または更新する依頼でのみ使用する。分析・要約のみの依頼には適用せず、`project-progress-review` Plan が必要に応じてこの Skill を呼び出す。

## Inputs

- 対象期間、要約、進捗、課題・リスク、期限、次アクション、矛盾・不足、参照ファイル
- WBS・スケジュール情報(タスク名、開始日、終了日、進捗率、状態、担当者、分類、根拠)
- 参照ファイル名と SharePoint URL
- 出力先: `https://mvpkorune.sharepoint.com/sites/Demo/SitePages/project-progress-review.html`

## Steps

1. HTML の作成・更新前に、必ず `digital-agency-html-pages` Skill を読み込む。
2. 情報不足は推測せず「記載なし」または「要確認」と示す。
3. 書き込み先を SitePages として解決し、`/sites/Demo/SitePages` を明示指定する。`project-progress-review.html` は同名で上書き更新し、削除、移動、リネーム、削除後の再作成は行わない。
4. 冒頭は Overview と KPI に絞る。総合ステータス、進捗、課題・リスク、期限超過・接近、次アクションを短く示す。進捗率は数値とデータバーを併記する。
5. WBS に開始日・終了日がある場合は、日付軸付きガントチャートを必ず表示する。HTML の `table` で実装しない。CSS Grid または Flexbox により、左側のタスク情報列を固定し、右側の日付軸だけを横スクロールできる専用コンテナを作る。コンテナに実際の `overflow-x:auto` と、日付軸より広い最小幅を設定する。
6. 状態値はすべてラベル形式に統一する。進行中、注意、遅延、期限超過、期限接近、ブロック中、対応中、未着手などを、テキスト・色・枠線で区別する。遅延、期限超過、ブロック中は特に強調する。色だけで意味を伝えない。
7. 比較・集計が必要な場合以外、表形式を使わない。状態、担当、分類を一列に結合しない。
8. Overview とは別に、状態・担当・分類で絞り込める詳細領域を作る。各レコードは独立したカードまたは `details/summary` のアコーディオンとし、初期状態で個別に閉じる。フィルターは対象レコードを表示・非表示にするだけであり、詳細領域全体を開閉するボタンを作らない。各レコードの詳細には担当、期限・期間、進捗、分類、根拠・対応を表示する。
9. 参照ファイルはファイル名と SharePoint URL のハイパーリンクで掲載する。
10. 保存前に成果物を自己点検する。次をすべて確認する。
    - ガントが `table` ではなく固定情報列+横スクロール日付軸である
    - すべての状態値がラベル化されている
    - 詳細の展開はレコード単位である
    - 状態・担当・分類が別の情報として扱われている
    - 参照ファイルがリンクになっている
11. 更新後、返却 URL またはパスが `/sites/Demo/SitePages/project-progress-review.html` と一致することを確認する。誤った入れ子パスは成功として扱わない。

## Output format

- 更新したページ URL
- 対象期間
- Overview、ガント、状態ラベル、レコード単位詳細、フィルターの実装内容
- 保存先検証結果
- 更新失敗時は失敗理由

## Constraints

- `.aspx` ではなく `SitePages/project-progress-review.html` を更新する。
- 元のプロジェクト資料を更新・移動・削除しない。
- 担当者、期限、状態、開始日、終了日、進捗率、根拠を創作しない。
- 保存先が SitePages と確認できない場合は削除で補正せず、誤配置として報告する。

digital-agency-html-pages

---
name: digital-agency-html-pages
description: |-
  このサイトで SitePages 配下の SharePoint HTML ページを作成・更新するすべての依頼に適用します。デジタル庁デザインシステムを参考に、アクセシビリティ、見出し構造、コントラスト、キーボード操作、モバイル表示を実装します。

  Use when the user says:
  - "HTML ページを作成して"
  - "HTML ページを更新して"
  - "SitePages にページを作成して"
  - "ページを作成して"
  - "ページを更新して"
---
# Digital Agency HTML Pages

## When to use

このサイトで SharePoint の `SitePages` 配下に HTML ページを新規作成または更新する依頼では、必ず使用する。他の Skill がページ内容を作成する場合も、HTML の設計・作成・更新の前にこの Skill を読み込む。デジタル庁デザインシステムの公開方針を参考に、アクセシビリティと情報の分かりやすさを重視する。

## Inputs

- ページの目的、対象読者、掲載する情報
- 出力先の `SitePages` ライブラリ
- 既存ページを更新する場合は、対象 HTML ファイル名または URL
- 必要な操作やデータ更新がある場合は、そのデータソース

## Steps

1. 作成または更新対象を確認する。新規作成時は、ページ URL スラッグに英語 kebab-case を使用する。
2. ページに載せる内容を整理する。外部または SharePoint 内のデータソースを使う場合は、内容を確認してから反映する。
3. 完全な自己完結型 HTML を `SitePages` に作成または同名ファイルで更新する。外部 CDN、外部 JavaScript、ネットワーク取得には依存しない。
4. SharePoint のサイトテーマ用 CSS 変数を利用し、ページがサイトの配色になじむようにする。
5. セマンティック HTML を使う。`main`、`header`、`nav`、`section`、見出し階層、`table` の見出しセル、リスト、言語属性を適切に設定する。
6. 色だけで状態を伝えない。状態名やテキストを併記し、十分なコントラストを確保する。キーボードで操作する要素には見えるフォーカス表示を付ける。
7. 画面幅が狭い場合でも読める余白・文字サイズ・表の表示を設定する。表が長い場合は横スクロール可能にする。
8. 更新後は作成・更新された HTML ページの URL を返す。更新に失敗した場合は、成功したと扱わず理由を明記する。

## Output format

- ページ名
- URL スラッグまたはファイル名
- 作成または更新した SitePages の URL
- 実装した主なアクセシビリティ配慮を最大 3 点

## Constraints

- `.aspx` ページではなく、ユーザーが HTML ページを求める場合は `.html` を `SitePages` 配下に作成する。
- 既存のページを更新する場合、同じ HTML ファイル名で上書きして URL を維持する。
- 外部 CDN、`fetch`、外部スクリプト、外部スタイルシートを使用しない。
- デジタル庁デザインシステムの名称やロゴを、公式提供物でないものとして偽って使用しない。
- ユーザーが指定していない情報を創作しない。

Agent Builder の Skills の GA 予定が発表されたので BPR/BPM を行うエージェントを作成してみた

はじめに

Microsoft 365 Copilot の Agent Builder で Skills が利用可能になりましたね。

learn.microsoft.com

この Skills の Sandbox 環境については以前検証した結果があるので興味のある方はみてみてください。

koruneko.hatenablog.com

さて、そんな Agent Builder の Skills ですが、9月末までに一般公開 (GA) されることが案内されました!

もう来るじゃん!

今回はそんな Agent Builder の Skills を用いてエージェントを作成してみたので、プロトタイプとして公開してみました。

プロトタイプっていってるのは、皆さんのフィードバックもとにアップデート繰り返していきたいと思ってるからです。

ということで、皆さまのフィードバックお待ちしております。

利用する

GitHub 上に Agent Builder の Package (.zip ファイル) を公開していますので、こちらからご利用ください。

github.com

スキル単体も zip に変換してもらえればインポートできるはずです。

利用方法

概要とかは README 見てもらえればいいと思うので、利用サンプルを紹介します。

なお、利用は Think Deeper 系の利用を推奨します。
デフォルトがそうなってますけどね。

BPM Agent

こいつはユーザーとの対話をもとに Business process modeling (BPM) を作成するエージェントです。

こちらでは、現在の業務をエージェントに説明することで業務を整理し、可視化を行ってくれます。

アウトプットは以下5種が出力されます。

github.com

人が主に確認するのは HTML で生成された BPM 図です。

もちろん、対話型エージェントですのでいきなりすべての業務を説明する必要はありません。

生成された結果を確認して、足りないところや意図が誤って伝わっているところは修正を指示することも可能です。

BPR Agent

こいつは BPM Agent の出力結果をもとに BPR (Business Process Re-engineering) を行ってくれるエージェントです。

BPM Agent の成果物である process.yaml を渡して分析を実行してください。

まず作成されるのは以下のような分析レポートです。

To-Be 内容が提案されるので、内容を確認のうえ、「採用」や「見送り」などを選択してください。

「条件付き採用」を選択した際のみ、メモの記載が必須です。

判断をすべて入力したら「判断結果をコピー」を選択して、クリップボードに結果のコピーを行います。

分析ID: bpr-a-72939496e232d2e0
IMP-001: 採用 - 申請時の入力・エビデンス検証を標準化
IMP-002: 採用 - 差し戻し理由と再申請ルールを標準化
IMP-003: 保留 - 5万円基準の承認要否判定を自動化
IMP-004: 採用 - 承認状態・通知・滞留を一元管理
IMP-005: 採用 - 会計システムへの再入力を連携に置換
IMP-006: 条件付き採用 | メモ: 補完先がSharePointでよいのかはまだ定まっていないので、仮置き - エビデンス保管を自動化し申請と関連付け
IMP-007: 保留 - 並行処理の完了・失敗・滞留を統制
IMP-008: 見送り - 振込入力と実行結果の記録を標準化

これを先ほどのエージェントに返します。

メモや追加チャットで返答していたらスキップできますが、決定事項に対しての応答がされてなかったら質問がされるので、内容確認してどれがいいか回答してください。

エージェント側で判断できる内容であれば、推奨項目を教えてくれるはずです。

以上のステップを踏むことで BPR を終えることができます。

人が確認するのは、こちらも HTML ファイルを想定しています。

目標値や先ほどの分析レポートのどれをもとに改善を行ったのか ID で追跡できるようになっています。

こちらのエージェントの成果物は 9 種であるはずです。

github.com

おわりに

To-Be Gap 分析を行うエージェントや、前段の課題分析を行うエージェントもあるといいなーと思ってるので、随時作成していこうかなーって思ってます。

フィードバックはもちろん、使ってみたよーというコメントもお待ちしています!!

Copilot Cowork でアプリを作成する機能(スキル)が登場!

はじめに

Copilot Cowork でアプリ作成を行える機能(スキル)が追加されました!

利用の際は /app というスキルを呼び出して利用します。

公式のアナウンスはこちらをご確認ください。

www.microsoft.com

techcommunity.microsoft.com

今回は Copilot Cowork でのアプリ構築機能に絞って情報や検証した結果をまとめます。

Copilot Studio でのアプリ構築は、9/18(金) では利用できた時間があったのですが、9/21(月) 現在だと画面上から無くなってしまったので検証ができず...

ちなみに Copilot Studio でアプリ作成を行う際の URL は https://copilotstudio.preview.microsoft.com/environments/[Env ID]/apps/new でした。

Cowork でのアプリ作成とは

Cowork でのアプリ作成とは、Cowork 上で自然言語でアプリを作成することができる機能です。
/app というスキルとともに、作成したいアプリを自然言語で伝えることで Cowork がアプリの作成を行ってくれます。

作成されるアプリは React/TypeScript 等をベースにした Web アプリです。

App Builder (Frontier) や new Power Apps vibe experience に近いですかね。

m365.cloud.microsoft

vibe.powerapps.com

ちなみに new Power Apps vibe experience では Copilot Cowork でのアプリ作成がおすすめされていたり、Code Apps への変換方法が紹介されていたりします。

learn.microsoft.com

learn.microsoft.com

おまえ...消えるのか...?

App Builder についてはなんのアナウンスもないです。
そもそもこの子は、ここ最近なんのアップデートのアナウンスもないですし、いつまでも Frontier なので、、、ちょっと心配ですね

話が脱線しましたね。
Copilot Cowork でのアプリ作成に戻します。

この機能は現在 Frontier で利用することができます。

Cowork と自然言語で対話しながらアプリを構築するので、当然開発には Copilot Credits が必要になります。
また、アプリを利用するのにも Copilot Credits が必要になる場合があります。

「場合があります」としたのが少し厄介な点で、こちら Power Apps Premium の所持の有無によって Copilot Credits による従量課金の発生有無が変わってきます。

https://aka.ms/CopilotCredits/LicensingGuide

ライセンスまわりについてはまた後程まとめます。

また、利用にはいくつかの管理設定も必要です。
ここも後程まとめます。

まずはどんな感じで Cowork でアプリ作成が行われるのかをみてみましょう。

Cowork でアプリを作成してみる

以下のようなプロンプトで、備品購入申請を行うアプリを作成してみます。

/app 社内の備品購入申請を管理するアプリを作成してください。

社員が備品の購入申請を登録し、自分の申請状況を確認できるようにしてください。
申請者の情報は、社内の備品購入申請を管理するアプリを利用しているユーザーの Microsoft 365 の情報を利用してください。

一定金額以上の申請は上司の承認を必要とし、承認者は自分に割り当てられた申請を確認して承認または却下できるようにしてください。

申請データはブラウザー内だけではなく、複数のユーザーが共有して継続利用できる場所に保存してください。

その他、この業務に必要な画面、データ、操作や機能は適切に補完し、実際に利用できるアプリとして作成してください。

今回は既定の

  • モデル:自動
  • 負荷:中

で作成を行います。

データの保存が必要なようなプロンプトを入力していたので、申請データをどこに保存するか?ということを聞いてきましたね。

今回は Dataverse を選択してみます。

他にもプロトタイプのアプリの規模なんかもきいてくれました。

で、アプリ作成進めてもらっていたのですが、どうやら現時点では Dataverse への接続が行えないご様子。

仕方ないので SharePoint リストをデータソースとしてもらいます。

しばらく待つと、アプリ作成が一旦完了したようです。

ただ、SharePoint リストの作成場所となる SharePoint サイトの指定がまだなので、それを教えてくれ。とのことなので、利用して欲しい SharePoint サイトのリンクを共有します。

今度こそできたっぽいです。

/cost でここまでかかったコストを算出すると、 996 クレジットを使用していました。

1 Copilot Credit ≒ $0.01 ≒ 1.6円

で計算すると、1593.6 円ですね。

作成されたアプリをみてみましょう。

どうやら、利用するサイト / リストは利用者自身で選択する仕様にした様子。
そうかぁ...

また、必要に応じてリストの作成もできるようです。

そんな機能作ってくれ。なんて頼んでいなかったので、Cowork が気を利かせて足りない要件を補って実装してくれたようですね。

コードを見ることも可能です。
ただし、Read Only であり、編集はできませんし、ここからエクスポートなんてこともできません。

アプリに戻り、リストの作成ボタンを押して、機能がちゃんと動作するのかみてみます。

すると、指定したサイトにきちんとリストは作成されました。

保存して欲しい値とかちゃんと指定していませんでしたが、ここも必要と思われるデータを Cowork 側で考えて作成してくれていますね。

欲をいうとユーザー情報は SharePoint リスト使うならユーザー列にして欲しかったなーとかありますが。

さて、保存先のデータソースも用意できたので、アプリの中身をみていきます。

申請機能も一人で確認できる範囲ではちゃんと動いてはいることが確認できました。

申請データも SharePoint リストに登録されていますね。

設定をみてみます。

アプリ ヘッダーの表示 / 非表示を切り替えられるようですが、ここの設定はまだ利用できないようです。
* 公開後もダメでした

SharePoitn リストに接続をしているのと、ユーザー情報の検索機能をもっているので、

  • SharePoint
  • Office 365 Users

の2つが「接続」(コネクター)として設定されていますね。

「データ ストレージ」には Dataverse を接続したら表示されるようになるのかな...?

プライバシーには、Microsoft プライバシー ステートメント へのリンクが設定されています。

www.microsoft.com

ざっくり動作確認もできたので、アプリを公開してみます。

公開できたので再度、 /cost で利用コストの計測を行います。

996 クレジットを使用とのことなので、公開自体にはコストは(多分)かからないようですね。
/* 多分といっているのは、このアカウントは Power Apps Premium を持っているので。

公開されたアプリを開いてみると、Power Apps では見慣れた接続確認のポップアップが表示されます。

データもちゃんと公開されたアプリから確認することができますね。

次にアプリの共有を行います。

アプリの共有は

  • 組織内のユーザー
  • 追加されたユーザーのみ

の2種を設定することが可能です。

今回は指定したユーザーのみが利用可能にしてみます。

共有されたユーザーでアプリを開いたら、まず表示されたのは SharePoint の場所を確認する画面でした。

やはりこの SharePoint 指定はユーザーごとになっているようですね。

申請データは共有されたユーザーでも確認できました。

申請を承認してみます。

承認も行うことができました。

作成されたアプリ一覧は以下で確認が行えるようです。

https://preview.managedapps.cloud.microsoft/

管理者であれば、Microsoft 365 管理センター上からも確認を行うことができます。

https://admin.cloud.microsoft/?source=applauncher#/apps/all

ちなみに現時点ではインベントリからはアプリの存在を確認することができません。

画面上からコードのエクスポートはできませんでしたが、自然言語で依頼することでコードのエクスポートも可能です。

作成されたアプリのコードを zip でエクスポートしてください

/cost を実行すると 1,101 クレジットを使用しました。となったので、このコードのエクスポートで 105 クレジットの消費ですね。

必要なライセンス

開発者に必要なライセンス

Copilot Cowork で対話しながらアプリを作成することになるので、Cowork でのアプリ開発者には以下のライセンスが必要です。

  • Microsoft 365 Copilot
  • Copilot Credits

対話しながらアプリを作成 / 修正していくことになるので、それに応じた Copilot Credits が消費されます。

Build consumption varies with the language model used, the complexity of the app, and how much iteration is involved.

と記載されていることからも、
使用モデル × アプリの複雑さ × 修正回数
あたりが指標になってきますかね。

アプリ利用者に必要なライセンス

Copilot Cowork で作成されたアプリを利用すると、原則 Copilot Credits が消費されます。

しかし、これは対象ユーザーに Power Apps Premium が付与されているかどうかで変わってきます。

Power Apps Premium を持っていない場合

アプリの利用に応じて Copilot Credits が消費されます。

Power Apps Premium を持っている場合

この場合は、基本 Copilot Credits の消費なしで利用できますが、少々厄介です。

まず Copilot Credits Guide の原文をみてみると、以下のように記載されています。

However, for users licensed with Power Apps Premium User Subscription Licenses (USLs), app usage is included, subject to existing Power Apps Premium request limits.
Runtime usage exceeding those limits is billed through Copilot Credits usage-based billing.
Usage of AI-powered runtime, such as agents and Work IQ APIs, is not included in these limits and consumes Copilot Credits.

日本語訳すると、以下のようになりますかね。

ただし、Power Apps Premium ユーザー サブスクリプション ライセンス(USL)が割り当てられているユーザーについては、既存の Power Apps Premium の要求上限の範囲内で、アプリの利用がライセンスに含まれます。
この上限を超えたランタイムの利用には、Copilot Credits の従量課金が適用されます。また、エージェントや Work IQ API などの AI を利用したランタイムの使用は、この上限には含まれず、Copilot Credits を消費します。

「既存の Power Apps Premium の要求上限の範囲内で」というのは恐らく API 要求の制限のおはなしだと思います。

learn.microsoft.com

また、「エージェントや Work IQ API などの AI を利用したランタイムの使用は、この上限には含まれず、Copilot Credits を消費します」の記載より、Power Apps Premium ライセンスを持っていれば API 制限が来ない限り従量課金は発生しない!というわけではない点に注意が必要ですかね。

アプリ利用で発生するコスト

Cowork や GitHub Copilot Harness の時と同様、そのアプリの利用シナリオによってざっくりコスト判断をすることができます。

日本語訳ver

管理設定で必要なこと

対象者が Cowork を利用できる状態であることや、Frontier ユーザーであることは大前提として話を進めます。

Microsoft 365 管理センター で以下の設定を行う必要があります。

まずは、アプリの利用を許可します。

Copilot > コスト管理
の「構成」より、「エージェントとサービス」を選択して「マネージド アプリケーション」を許可します。

最低限これだけでも設定完了です。

追加でするなら「アプリ」の設定も必要です。

こちらの「設定」を選択すると環境グループの設定を行うことができます。

ここでは、Power Platform 側の環境ルーティングで設定している環境グループが表示されているはずです。

アプリの管理設定ですね。

なお、「ルーティング」は現時点では保存ができない様子。

設定しておいたほうがいいのは「コネクタと MCP サーバー」ですね。

ここでは、高度なコネクタ ポリシー (ACP = Advanced Connector Policies) の設定を行うことができます。

learn.microsoft.com

つまり、利用できるコネクタの制御ですね。

ただし注意したいのは、ここの設定は Power Platform 側の環境グループの ACP と設定を共有します。

Power Platform の環境ルーティングで作成された個人環境で利用する分には OK だけど、Cowork のアプリ開発ではブロックしたい!という風な要望を叶えるのは難しい(というかできない?)のが悩みどころですかね...

残り2つの設定は

このルールを編集すると、ルールのカスタマイズが可能ですが、Microsoft から自動更新を受け取ることはできなくなります。

と記載されている通り、明確な理由がない限りは触らなくていいと思います。

コードをみてわかったこと

実際にコードみてわかったことをざっくりまとめます。
違ってたら教えてください。

Cowork で作成されたアプリは、キャンバスアプリのような YAML 形式ではなく、Code Apps のような React / TypeScript / Vite をベースにした一般的なWebアプリとして生成されていました。

とはいえ、Cowork で作成されたアプリは Code Apps や Vibe Power Apps で作成されたアプリとは異なるようです。

観点 Copilot Cowork で作成したアプリ Power Apps Code Apps Power Apps Vibe experience
主なSDK @microsoft/managed-apps @microsoft/power-apps @microsoft/power-apps
設定ファイル ms.config.json power.config.json power.config.json
CLI @microsoft/managed-apps-cli / ms Power Apps CLI / pa Code Apps系の構成
ローカル起動 ms app dev 系 通常のWeb開発 + Power Apps CLI Code Apps系
データ接続 Managed Apps の Generated Client @microsoft/power-apps が生成する models / services @microsoft/power-apps/data、生成されたデータクライアント
アプリ初期化 Managed Apps側の仕組み Power Apps SDK / Host @microsoft/power-apps/app の initialize()
アプリ管理情報 appId、environmentId、repositoryId、repoType power.config.json にPower Apps用メタデータ power.config.json にPower Apps用メタデータ
ソース構造 React / TypeScript / Vite 任意のSPA。React等を利用可能 React / TypeScript / Vite + AppGen用の生成レイヤー
AI生成用の追加構造 Aether / Managed Apps系テンプレート 原則なし app-gen-sdk、.agent/plans、data model等
実行基盤 Managed Apps Power Apps Host Power Apps / Code Apps系
Power Platformとの関係 Power Platform Environmentに所属するManaged App Power Platform Environmentに所属するCode App Power Apps内で生成され、Code Apps系ランタイムを利用
Code Appsと同じか いいえ ― ランタイムはかなり近い/同系統

特にみるのは SDK の部分ですね。

Cowork は
@microsoft/managed-apps + ms.config.json なのに対し、Code Apps や Vibe Power Apps は
@microsoft/power-apps + power.config.json
でした。

つまり、Cowork も Code Apps や Vibe Power Apps も最終的には React / TypeScript の Web アプリを作っていますが、その上に載る Microsoft 側の SDK・設定・ランタイム が異なります。

次に Cowork 内の ms.config.json に保存されているデータについてです。

ここにはアプリを識別する appId の他、environmentId, repositoryId, repoType などが保存されていました。

この environmentId には、Power Platform の環境ルーティングで作成された開発環境の環境 ID が設定されています。

SharePoint へのアイテム登録なんかは Generated Clien t の SharePointService.GetItems / PostItem / PatchItem を使っていますが、リスト作成や列作成なんかの SharePoint コネクターのアクションにないものは、直接 SharePoint REST API 叩いて操作しているようですね。

src/lib/purchase-requests.ts の provisionList() あたりに処理がありました。

async function sendSpRequest(
  siteUrl: string,
  method: "GET" | "POST",
  uri: string,
  body?: unknown,
): Promise<void> {
  const result = await SharePointService.HttpRequest(siteUrl, {
    method,
    uri,
    headers: {
      Accept: "application/json;odata=verbose",
      "Content-Type": "application/json;odata=verbose",
    },
    body: body === undefined ? undefined : JSON.stringify(body),
  });
}

await sendSpRequest(siteUrl, "POST", "_api/web/lists", {
  __metadata: { type: "SP.List" },
  AllowContentTypes: true,
  BaseTemplate: 100,
  ContentTypesEnabled: false,
  Title: listTitle,
});

await sendSpRequest(
  siteUrl,
  "POST",
  `_api/web/lists/getbytitle('${encodedTitle}')/fields`,
  {
    __metadata: { type: "SP.Field" },
    Title: column.name,
    FieldTypeKind: column.kind,
  },
);

データソースは特段指示がなければ localStorage に保存されるようです。
今回の例ですと、SharePoint の接続先情報の保存場所ですね。

例の動作からもわかる通り、localStorage は Cowork をホストしているクラウド側の保存先ではなく、ユーザー固有の保存先をみています。

ここでいう保存先は、各ブラウザのプロファイル情報になります。

C:\Users\<ユーザー名>\AppData\Local\Microsoft\Edge\User Data\Profile 1\Local Storage\leveldb

で確認することができます。

コードでいうと以下のようなものがあるはずです。

const memoryStore = new Map<string, string>();

const safeStorage = {
  getItem: (name: string): string | null => {
    let raw: string | null = null;

    try {
      raw = window.localStorage.getItem(name);
    } catch {
      raw = memoryStore.get(name) ?? null;
    }

    if (raw === null) return null;

    try {
      JSON.parse(raw);
      return raw;
    } catch {
      return null;
    }
  },

  setItem: (name: string, value: string): void => {
    try {
      window.localStorage.setItem(name, value);
    } catch {
      memoryStore.set(name, value);
    }
  },

  removeItem: (name: string): void => {
    try {
      window.localStorage.removeItem(name);
    } catch {
      memoryStore.delete(name);
    }
  },
};

このような保存先なので、より正確にいうとユーザー固有のデータではなく、端末のユーザー固有のデータとなりますね。
なので他のユーザーとのデータの共有はできませんし、キャッシュ削除とかしたら消えちゃいます。

最後に Cowork との通信です。

コードから確認できた、アプリ側で明示的に実装された通信は大きく4系統ありました。

通信 主なコード 送るもの 呼び出されるタイミング
App mounted app-mounted-transport.ts 初回描画完了 + timestamp アプリ初回描画時に1回
Runtime error cowork-parent-transport.ts 固定の「アプリがクラッシュした」通知 Reactの致命的な実行時エラー
App view app-view-* 現在画面のルートと意味構造 初回表示、画面遷移、DOM変化後
Console forwarding console-capture.ts console.log/warn/error の内容 Console APIが呼ばれたとき

まずは、App mounted について

main.tsx では次のコンポーネントが追加されています。

function MountSignal() {
  useEffect(() => {
    requestAnimationFrame(() => {
      performance.mark("aether:app-mounted");
      postAppMountedToCoworkParent();
    });
  }, []);

  return null;
}

実際の送信処理は app-mounted-transport.ts で行われています。

export function postAppMountedToCoworkParent(): void {
  if (window.parent === window || appMountedSignalSent) {
    return;
  }

  appMountedSignalSent = true;

  const message: AppMountedMessage = {
    type: APP_MOUNTED_TYPE,
    timestamp: Date.now(),
  };

  for (const targetOrigin of COWORK_PARENT_ORIGINS) {
    window.parent.postMessage(message, targetOrigin);
  }
}

送信内容は単純で

{
  "type": "app-mounted",
  "timestamp": 1234567890
}

というようなデータを送ります。

なぜこのようなことをしているか?についてはコードコメントでは、

iframeの load では実際にReactの画面が表示されたタイミングを正確に測れないため、実際の初回描画完了をCoworkに通知する

が、目的だと説明されています。

次に Runtime error について
こちらはアプリが致命的なエラーを起こした場合も Cowork に通知します。

送信処理は cowork-parent-transport.ts です。

export function postAppRuntimeErrorToCoworkParent(): void {
  if (window.parent === window) {
    return;
  }

  for (const targetOrigin of COWORK_PARENT_ORIGINS) {
    window.parent.postMessage(CRASH_MESSAGE, targetOrigin);
  }
}

送られるのは固定値だけのようです。

{
  "type": "preview-error",
  "code": "APP_RUNTIME_ERROR"
}

これだけだと、アプリ自身がデバッグする情報が取得されませんが、エラーの取得は別で行っています。

ざっくりこんな感じの流れのようです。

アプリでエラー発生
        │
        ├─ ① Cowork 親フレーム
        │      → 「アプリがクラッシュした」という固定通知だけ
        │
        ├─ ② Preview の開発用診断経路
        │      → message / stack / componentStack / URL 等
        │      → ./__dev/console
        │      → Vite dev server
        │      → .browser-errors.log
        │
        └─ ③ アプリ自身の ErrorBoundary
               → 画面上にエラー表示

中心になるのは src/lib/console-capture.ts であり、こちらの冒頭のコメントでも以下のように記載されています。

/**
 * Console + runtime-error capture.
 *
 *  (1) Forwards console.log/warn/error to the Cowork parent frame via
 *      postMessage so the UX can display console output alongside the
 *      preview.
 *  (2) POSTs errors (console.error, window.onerror, unhandledrejection)
 *      to the Vite dev server at `./__dev/console`
 *      ...
 *      appends them to `.browser-errors.log` in the app root so the
 *      app-builder agent can inspect runtime failures
 */

実際にエラー詳細を送っている箇所は以下です。

const DEV_CONSOLE_PATH = "./__dev/console";

function postToDevServer(
  kind: string,
  payload: Record<string, unknown>
) {
  // ...

  void fetch(DEV_CONSOLE_PATH, {
    method: "POST",
    headers: {
      "Content-Type": "application/json"
    },
    body: scrubPreviewToken(
      JSON.stringify({
        kind,
        time: now,
        url: location.href,
        ...payload,
      }),
    ),
    keepalive: true,
  }).catch(() => {
    /* dev server may be restarting — drop silently */
  });
}

受け取ったエラーは .browser-errors.log へ記録しているようです。

const entry =
  JSON.parse(scrubPreviewToken(body));

browserErrorSeq += 1;

const stamped = {
  ...entry,
  seq: browserErrorSeq,
  server_time: Date.now()
};

const line =
  JSON.stringify(stamped) + "\n";

fs.appendFileSync(
  browserErrorsLogPath,
  line
);

こんな感じの情報が保存されるはず

{
  "kind": "app.error",
  "time": 17899...,
  "url": "...",
  "label": "[App Error]",
  "message": "Cannot read properties ...",
  "stack": "TypeError: ...",
  "componentStack": "...",
  "seq": 7,
  "server_time": 17899...
}

この仕組みは Vite の開発サーバー上で動作するプレビュー用の診断機構であり、公開後のアプリに提供される本番監視機能ではありません。

次に App view
こちらの関連ファイルは app-view-signal.tsx, app-view-serializer.ts, app-view-transport.ts の3つあります。

役割としては以下のような設計です。

app-view-signal  
「いつ取得するか」  
       ↓  
app-view-serializer  
「何を取得してよいか」  
       ↓
app-view-transport  
「Coworkへ送る」  

app-view-transport.ts では、

const message: AppViewMessage = {
  type: APP_VIEW_TYPE,
  v: APP_VIEW_PROTOCOL_VERSION,
  timestamp: Date.now(),
  route: snapshot.route,
  tree: snapshot.tree,
  truncated: snapshot.truncated,
};

を送信しています。

例えば、

{
  "type": "app-view",
  "v": 1,
  "timestamp": 1234567890,
  "route": "/requests/:id",
  "tree": "...",
  "truncated": false
}

みたいなデータです。

AppViewSignal は BrowserRouter の中に配置されています。

<BrowserRouter basename={ROUTER_BASENAME}>
  ...
  {APP_VIEW_PREVIEW_MOUNT && (
    <AppViewSignal
      patterns={APP_VIEW_ROUTE_PATTERNS}
    />
  )}
</BrowserRouter>

となっており、APP_VIEW_PREVIEW_MOUNT の判定コードは

export function isPreviewMount(baseUrl: string): boolean {
  return baseUrl.startsWith("/v1/");
}

となっています。

つまり、App view は Cowork の作成・プレビュー環境でだけ有効になるようです。

app-view-serializer.ts では送信対象のデータを制限しています。

/**
 * App-view serialiser: what the user can see, as an accessible-name tree.
 *
 * ...
 * the BOUND of the app-view channel, so its allow-lists are the security
 * contract: it emits roles, accessible names and visible text, one node per
 * line, and nothing else.
 *
 * It never reads a form control's text value, a link
 * target, an image source, an id, a class, a `data-*` attribute, storage, or
 * the location;
 */

まず許可しているのは以下の allow-list です。

const ALLOWED_ATTRIBUTES = new Set([
  "role",
  "aria-label",
  "aria-labelledby",
  "aria-hidden",
  "aria-checked",
  "aria-expanded",
  "aria-selected",
  "aria-disabled",
  "aria-required",
  "alt",
  "title",
  "type",
  "hidden",
  "inert",
  "contenteditable",
  "disabled",
  "required",
]);

次に以下のような実装により、入力値が送られないように制御されています。

const VALUE_BEARING_TAGS = new Set([
  "input",
  "textarea",
  "select",
  "option",
  "optgroup",
  "datalist",
  "output",
  "progress",
  "meter",
]);
function isValueBearing(element: Element): boolean {
  return (
    VALUE_BEARING_TAGS.has(
      element.tagName.toLowerCase()
    ) ||
    isEditable(element)
  );
}

他にも要素によっていくつか制御がなされているのですが、さすがに長くなるので割愛

このように App view では DOM をそのまま Cowork へ送信しているわけではありません。生成コード内の app-view-serializer.ts が送信可能な情報を明示的に制限しており、主に要素の role、accessible name、画面上に表示されているテキスト、一部の UI 状態をアクセシビリティツリーに近い形式へ変換しています。

Serializer が読み取り可能な HTML 属性も allow-list で限定されており、href、src、class、data-*、フォームの value などは対象に含まれていません。また、input、textarea、select などは「値を持つ要素」として特別扱いされ、入力中の値が周囲のラベルや表示テキストとして混入しないよう除外する処理も実装されています。

一方、保存されたデータなどが通常のテキストとして画面上に表示されている場合、その文字列は App view に含まれ得ます。そのため「フォーム入力値を送信しない」と「画面上の業務データを送信しない」は同じ意味ではありません。

また、送信先についても明示的に制限がなされており、

export const COWORK_PARENT_ORIGINS = [
  "https://agentbuilder.local.microsoft.com:44300",
  "http://localhost:44300",
  "https://local.loop.microsoft.com:8080",
  "https://m365.cloud.microsoft",
];

という許可リストをもっており、それぞれ以下によって検証が行われています。

window.parent.postMessage(message, targetOrigin);

最後に Console forwarding

生成されたアプリでは、通常の console.log、console.warn、console.error がそのまま使われるのではなく、元の Console 出力を維持しつつ、その内容を Cowork の親フレームにも postMessage で転送するようにラップされています。

該当コードは src/lib/console-capture.ts です。

まず元の Console API を退避させています。

const originalConsole = {
  log: console.log.bind(console),
  warn: console.warn.bind(console),
  error: console.error.bind(console),
};

その後、各 API を上書きしています。

console.log = (...args: unknown[]) => {
  originalConsole.log(...args);
  postToParent("log", args);
};

console.warn = (...args: unknown[]) => {
  originalConsole.warn(...args);
  postToParent("warn", args);
};

console.error = (...args: unknown[]) => {
  originalConsole.error(...args);
  postToParent("error", args);

  const { message, stack } = serializeArgs(args);
  postToDevServer("console.error", { message, stack });
};

つまり、

  1. アプリコード
  2. console.log / warn / error
  3. ブラウザーのDevTools Consoleにも表示 + Coworkの親フレームにも転送

という動きになっています。

Cowork へは以下のような情報を送信しています。

function postToParent(level: string, args: unknown[]) {
  try {
    const message = args
      .map((a) =>
        typeof a === "object"
          ? JSON.stringify(a, null, 2)
          : String(a)
      )
      .join(" ");

    window.parent.postMessage(
      {
        type: "console",
        level,
        message,
        timestamp: Date.now()
      },
      PARENT_ORIGIN
    );
  } catch {
    /* ignore serialization errors */
  }
}

例えば以下のようなデータ

{
  "type": "console",
  "level": "log",
  "message": "データ取得完了",
  "timestamp": 1234567890
}

これらはアプリのどこかで

console.log(...)
console.warn(...)
console.error(...)

が呼び出されるたびに呼ばれます。

console.log、console.warn、console.error も Cowork との通信対象になっています。
console-capture.ts でブラウザー標準の Console API をラップし、通常どおり DevTools へ出力すると同時に、内容を postMessage で Cowork の親フレームへ転送しています。

これにより、Cowork のプレビュー側でもアプリの Console 出力を確認できます。ただし、App view のような厳格な Serializer を通すのではなく、console.* に渡されたオブジェクトも JSON 文字列化して送信されます。そのため、機密情報や業務データを安易に Console へ出力しない方がよさそうです。

なお、console.error は Cowork への転送に加えて開発用の ./__dev/console にも送信されます。一方、 React のクラッシュ時に取得した詳細な Stack Trace や Component Stack は originalConsole.error を利用してこの転送経路を迂回し、Cowork 親フレームには送らない設計になっています。

おわりに

Cowork でのアプリ開発は、GitHub Copilot や Codex などの他コーディング AI サービスと契約することなく、Microsoft 365 Copilot + Copilot Credit の範囲で開発を行うことができ、また開発環境の構築なんてものも不要で、セキュリティ面も Power Platform や Microsoft 365 Entra のものを利用してくれるので比較的セキュアに開発を行うことが可能です。

しかし、やはりコスト面が少し高くつきそうかなーという印象と、Microsoft 365 と Power Platform に跨るので管理が大変。
そしてコスト予測しにくいよなーというのが悩みになってきそうだと思っています。

比較対象となるのは Code Apps だと思いますので、誰がどういう目的でアプリを開発 / 運用していくのか?を検討したうえで利用方針考えていく必要があると思います。

Agent Builder と Copilot Studio (GitHub Copilot Harness) の Skills 実行環境を比較してみる

はじめに

Microsoft 365 Copilot の Agent Builder でも Skills が利用できるようになりました!

Agent Builder での Skills の作成方法や制限事項、いくつかの挙動については以前の記事で紹介していますのでそちらをご確認ください。

koruneko.hatenablog.com

Skills では SKILL.md に指示を記載するだけでなく、Python や JavaScript などの Script を含めて実行することもできます。

公式ドキュメントでは、Agent Builder の Custom Skills に含まれる Script は Secure Sandbox 上で実行され、Sandbox にあらかじめ用意されている Packages を利用できると説明されています。

learn.microsoft.com

一方、新しい Copilot Studio の GitHub Copilot Harness でも Skills を利用することができ、こちらも Sandbox 上で Script を実行できます。

ということで今回は、Agent Builder で作成した Agent と、Copilot Studio の GitHub Copilot Harness で Runtime の情報を取得する Skill を実行し、それぞれの実行環境を比較してみた結果を備忘録としてまとめます。

なお、こちらは 2026/9/9 時点で私の環境から確認した実際の挙動をまとめた検証記事です。

Agent Builder の Custom Skills や GitHub Copilot Harness は今後変更される可能性もありますので、最新の情報や正確な仕様については Microsoft Learn などの公式情報をご確認ください。

Agent Builder はどの Harness で動作しているのか

実行環境を比較する前に、まず Agent Builder がどの Harness として扱われているのかを確認しておきましょう。

おさらいになりますが、現在 Copilot Studio では以下の 3 種類の Harness が存在しています。

  1. GitHub Copilot Harness
  2. Standard Harness
  3. Copilot Chat Harness

公式ドキュメントでは Harness について、Agent や Workflow と Model の間に存在する Runtime として説明されています。

Harness によって Orchestration の仕組みや利用できる機能、課金方法などが異なるわけですね。

learn.microsoft.com

では Microsoft 365 Copilot や Agent Builder で作成した Agent は、どの Harness になるのでしょうか?

Power Platform Inventory の Sample Query を確認すると、Agent を Harness ごとに分類するための Query が公開されています。

現時点では Harness 自体は Agent の Metadata として返されていないため、公式ドキュメントでは以下のように説明されています。

Harness isn't yet returned as agent metadata, so this query derives it from the fields the inventory returns.

つまり、現在は Inventory から取得できる以下の情報を利用して Harness を判定しています。

  • properties.isCLIAgent
  • properties.model
  • properties.createdIn

実際に公開されている判定部分がこちらです。

| extend harness = case(
    isCLIAgent == true, "GitHub Copilot",
    model =~ "Microsoft 365 Copilot" or createdIn =~ "Microsoft 365 Copilot Agent Builder", "Copilot Chat",
    "Standard")

learn.microsoft.com

これを見ると、

isCLIAgent == true
    → GitHub Copilot

model == "Microsoft 365 Copilot"
または
createdIn == "Microsoft 365 Copilot Agent Builder"
    → Copilot Chat

それ以外
    → Standard

という判定になっています。

つまり、Microsoft が公開している Inventory の Sample Query 上では、Microsoft 365 Copilot の Agent や Microsoft 365 Copilot Agent Builder で作成した Agent は "Copilot Chat Harness" として分類されるようです。

一方、isCLIAgent == true の Agent は GitHub Copilot Harness として分類されています。

なお、これはあくまで現時点で公開されている Inventory の Sample Query による分類なので、実際の内部基盤を確定する情報ではない点に注意。

公式ドキュメントにも記載されている通り、Harness はまだ Agent の Metadata として直接返されておらず、将来的に properties.harness が利用可能になった場合は直接取得できるようになる予定です。

You can see an agent's harness in the Harness column in the Power Platform admin center, under Manage > Copilot Studio. That column is a user interface column only. Harness isn't yet returned as agent metadata, so this query derives it from the fields the inventory returns: properties.isCLIAgent, properties.model, and properties.createdIn. When the properties.harness field becomes available, you can query it directly instead. For the field definitions, see Microsoft Copilot Studio Agent inventory schema.

learn.microsoft.com

Skills の実行環境を比較してみる

さて、それでは実際の環境を確認してみます。

今回は実行環境を確認するために、Runtime Probe という検証用の Skill を作成しました。

Agent Builder への Skills の追加方法などについては以前の記事で紹介しているので、今回は割愛します。

検証方法

Runtime Probe の構成はこんな感じです。

runtime-probe
├─ SKILL.md
├─ resources
│  └─ probe_marker.txt
└─ scripts
   └─ runtime_probe.py

runtime_probe.py を実行し、Sandbox から取得できる情報をまとめて確認します。

主に確認した内容はこちら。

確認項目 確認内容
Python 実装、Version、Executable、sys.path など
OS Kernel、Architecture、glibc など
Python Packages Installed Distribution の Name / Version
Python Library 主要 Library を実際に Import できるか
Commands Python、Node.js、npm、Git、GCC、Java など
File System 一時ファイルの Write / Read / Delete
subprocess 子 Process を実行できるか
Network DNS 名前解決、外向き TCP 接続
Resources CPU 数、POSIX Resource Limits など
Environment Variables 環境変数の名称
Skill Skill Package の配置場所

Python Packages については、単純に件数を取得するだけではありません。

Installed Distribution を、

package-name==version

の形式に正規化して Sort し、その一覧全体から SHA-256 を生成しました。

これによって、件数だけではなく Package Name と Version の組み合わせ全体が同じかを比較できます。

また、主要な Library については Metadata の存在確認だけではなく、実際に import できるかも確認しています。

File System についても、単に Directory の存在を見るだけではなく、

  1. 一時ファイルを Write
  2. Write した内容を Read
  3. 元データと SHA-256 が一致するか確認
  4. 一時ファイルを Delete

というところまで実施しています。

Network については、

  • example.com の DNS 名前解決
  • example.com:443 への TCP 接続

を確認しました。

また、パッケージの追加インストールや環境設定の変更などは行っていません。

Agent Builder で Runtime Probe を実行する

まずは Agent Builder で作成したエージェントを Copilot Chat から実行してみます。

取得した結果から主なものを抜き出すとこんな感じ。

Python:
CPython 3.12.14

Python executable:
/opt/pyvenv/bin/python

Platform:
Linux-6.1.158.2-microsoft-standard-x86_64-with-glibc2.38

Architecture:
x86_64

Python distributions:
380

CPU:
2

Python は CPython 3.12.14。

/opt/pyvenv 配下の Python Virtual Environment から実行されています。

Installed Python Distribution は 380件でした。

全 Distribution の Name / Version から作成した SHA-256 はこちら。

3f20aa7078de97d5b95dadab829f6f4f08d38359cab0574bd37cedfc35baa0e4

また、例えば以下のような Packages が確認できました。

numpy==1.26.4
pandas==2.2.2
openpyxl==3.1.5
python-pptx==1.0.2
pymupdf==1.26.7
scipy==1.13.1
scikit-learn==1.5.1
playwright==1.57.0

全部で380件なので結構入っていますね。

Python 以外の Commands についても、

  • Node.js
  • npm / npx
  • Git
  • GCC
  • Java
  • curl
  • wget

などを利用できることが確認できました。

一方 Network については、example.com の DNS 名前解決には成功したものの、example.com:443 への TCP 接続は、

[Errno 101] Network is unreachable

となりました。

Agent Builder の Custom Skills に関する公式ドキュメントでも、Script からの Internet / Network Access はサポートされていないと案内されています。

learn.microsoft.com

GitHub Copilot Harness で Runtime Probe を実行する

続いて GitHub Copilot Harness で同じ runtime_probe.py を実行してみます。

こちらで取得した主な情報はこちら。

Python:
CPython 3.12.14

Python executable:
/usr/bin/python

Platform:
Linux-6.12.8+-x86_64-with-glibc2.38

Architecture:
x86_64

Python distributions:
100

CPU:
1

Python の Version 自体は Agent Builder と同じ 3.12.14 です。

ただし、実行されている Python は、

/usr/bin/python

となっており、この時点で Agent Builder の /opt/pyvenv/bin/python とは異なっています。

OS Kernel も、

Agent Builder
6.1.158.2-microsoft-standard

GitHub Copilot Harness
6.12.8+

と異なります。

そして Installed Python Distribution は 100件でした。

SHA-256 はこちらでした。

ad3d24ef1d64a75d3e5c8c3f636716a8bc6b5bd28ebef8d2a258dad9120a0bed

Agent Builder の380件とは大きく異なっていますね。

実行環境を比較する

Python Packages

まず一番分かりやすく違いが出た Python Packages から。

2つの環境から取得した Distribution 一覧を比較した結果はこちらです。

比較 件数
Agent Builder 380
GitHub Copilot Harness 100
両方に同じ Name の Package が存在 77
Name / Version ともに一致 49
同名だが Version が異なる 28
Agent Builder のみに存在 303
GitHub Copilot Harness のみに存在 23

かなり違いますね。

GitHub Copilot Harness の100件のうち、Agent Builder にも同じ Name の Package が存在したものは77件。

さらに Version まで同じだったものは49件でした。

共通して存在している Package でも、例えば以下のように Version が異なっています。

Package Agent Builder GitHub Copilot Harness
numpy 1.26.4 2.5.2
pandas 2.2.2 3.0.5
matplotlib 3.8.4 3.11.1
requests 2.33.1 2.34.2
pydantic 2.12.5 2.14.0b1
reportlab 4.4.6 5.0.1
lxml 6.1.0 6.1.2
onnxruntime 1.25.0 1.29.0

一方、

openpyxl==3.1.5
python-docx==1.2.0
python-pptx==1.0.2
pyyaml==6.0.3
cryptography==50.0.0

など、Name / Version ともに一致しているものもあります。

また、GitHub Copilot Harness 側にのみ存在していた Package としては、

dracarys==0.1.0
fastembed==0.8.0
github-copilot-sdk==1.0.11
plotly==6.9.0
seaborn==0.13.2
sympy==1.14.0
tokenizers==0.23.1
uvloop==0.22.1
websockets==17.0.1

などがありました。

単純に Package の数が違うだけではなく、構成や Version も結構違っていそうです。

Runtime / OS / 利用可能な Commands

Python Packages 以外も比較してみます。

項目 Agent Builder GitHub Copilot Harness
Python 3.12.14 3.12.14
Python executable /opt/pyvenv/bin/python /usr/bin/python
Kernel 6.1.158.2-microsoft-standard 6.12.8+
glibc 2.38 2.38
Architecture x86_64 x86_64
Node.js 24.16.0 24.18.1
pip 26.2.1 利用不可
npm / npx 11.18.0 利用不可
Git 2.45.4 利用不可
GCC 13.2.0 利用不可
Java 17.0.20.1 利用不可
wget 利用可 利用不可
curl 8.11.1 8.11.1

Python の Version や glibc、Architecture、bash、curl など一致するものもあります。

ただし、Python の配置場所や Kernel、Node.js の Version は異なっています。

また、Agent Builder では利用できた、

pip
npm
npx
git
gcc
java
wget

などの Commands が、GitHub Copilot Harness では確認できませんでした。

Script から利用できる実行環境として見ると、ここも結構違いますね。

File System / Network / Resources

File System についても異なります。

Agent Builder では、

Skill:
/home/oai/skills/appCatalog/.../runtime-probe

Working directory:
/mnt/data

Temporary directory:
/tmp

となっており、/mnt/data と /tmp への Write / Read が成功しました。

一方、GitHub Copilot Harness では、

Skill:
/app/skills/runtime-probe

Working directory:
/app/skills/runtime-probe

Temporary directory:
/app/workspace

となっています。

/app/skills/runtime-probe への Write は、

PermissionError: [Errno 13] Permission denied

となりましたが、/app/workspace への Write / Read は成功しました。

つまり Skill Package 自体が配置されている領域については Read-only になっているようですね。

Network の結果はこちら。

確認内容 Agent Builder GitHub Copilot Harness
example.com DNS 成功 成功
example.com:443 TCP 失敗 成功

Agent Builder では DNS の名前解決には成功するものの、外向き TCP 接続は Network is unreachable となりました。

一方、GitHub Copilot Harness では同じ example.com:443 への TCP 接続に成功しています。

今回確認した1つの宛先だけで Network 全体の仕様を判断することはできませんが、少なくとも同じ Probe に対して異なる結果になりました。

Resources についても、

項目 Agent Builder GitHub Copilot Harness
CPU 2 1
Environment Variables 96 15
RLIMIT_NOFILE soft 1024 1024
RLIMIT_NOFILE hard 1048576 4096
RLIMIT_NPROC soft / hard 17315 256

となっています。

ここまで見ると、Python Packages だけではなく、OS、Commands、File System、Network、Resource Limits など複数の観点で違いが確認できますね。

GitHub Copilot Harness のみに存在する Packages は Agent Builder でも利用できるのか

ここまでの検証で、Installed Python Distribution の一覧が異なることは確認できました。

ただ、これだけでは少し気になる点があります。

Agent Builder の Python の sys.path を確認すると、

/home/oai/skills/appCatalog/.../runtime-probe/scripts
/opt/oai-pkgs
/usr/lib/python312.zip
/usr/lib/python3.12
/usr/lib/python3.12/lib-dynload
/opt/pyvenv/lib/python3.12/site-packages

となっていました。

通常の Virtual Environment の site-packages 以外に、

/opt/oai-pkgs

という Path もあります。

ということは、

Installed Distribution の Metadata には存在しないけど、別の Path から実際には Import できる Package もあるのでは?

という疑問が出てきます。

ということで、ここも追加で確認してみました。

追加検証の方法

GitHub Copilot Harness の Distribution 一覧に存在し、Agent Builder の一覧には存在しなかった23件を対象に、Agent Builder から実際に利用できるか確認します。

今回は以下の3段階で確認しました。

Distribution Metadata

まず importlib.metadata を利用して、Agent Builder 側に Distribution Metadata が存在するか確認します。

find_spec

続いて、

importlib.util.find_spec()

を利用して、Python が対象 Module を検索できるか確認します。

実際に Import

最後に、

importlib.import_module()

を利用して、実際に Module を Import できるか確認します。

つまり、

Distribution Metadata にない

だけでは利用不可と判断せず、

Metadata
    ↓
find_spec
    ↓
実 Import

まで確認しています。

この検証も追加の Skill として作成し、1回の実行で23 Distribution をまとめて確認しています。

Package の Install や Environment の変更、Network Access などは行っていません。

追加検証の結果

結果はこちら。

項目 件数
対象 Distribution 23
Import できた 0
Import できなかった 22
Import による判定保留 1

Import 対象を持つ22 Distribution については、すべて Agent Builder から Import できませんでした。

例えば plotly。

distribution_metadata_present: False
find_spec: False
import_status: error
error: No module named 'plotly'

seaborn も同様です。

distribution_metadata_present: False
find_spec: False
import_status: error
error: No module named 'seaborn'

その他、

dracarys
fastembed
github-copilot-sdk
grpcio-tools
httptools
mammoth
mmh3
mpmath
py-rust-stemmers
pyclipper
rank-bm25
rapidocr-onnxruntime
sympy
tokenizers
truststore
uvloop
watchfiles
websockets
wheel

などについても、確認した候補 Module の Import はすべて失敗しました。

残る noto-cjk-fonts は Python Module を直接 Import することを前提とした Distribution ではないため、今回の方法では判定保留としています。

Distribution Metadata が存在しないことだけではなく、find_spec と実際の Import まで失敗しているため、今回確認した22 Distribution については Agent Builder の実行環境から利用できないことが確認できました。

これで、少なくとも今回確認した環境では、Agent Builder と GitHub Copilot Harness で 実際に利用できる Python Modules にも差があることが分かりますね。

今回の検証結果まとめ

ここまでの結果をまとめるとこんな感じです。

項目 Agent Builder GitHub Copilot Harness
Python 3.12.14 3.12.14
Python distributions 380 100
Python executable /opt/pyvenv/bin/python /usr/bin/python
Kernel 6.1.158.2-microsoft-standard 6.12.8+
CPU 2 1
pip / npm / Git / GCC / Java 利用可 利用不可
Writable area /mnt/data, /tmp /app/workspace
example.com:443 TCP 失敗 成功
GitHub Copilot Harness のみに存在した22 Distribution Import 不可 存在

ということで、今回確認した範囲では Agent Builder と GitHub Copilot Harness の Skills の Script 実行環境にはかなり違いがあることが確認できました。

特に Python Packages に依存する Skill を作成する場合は注意が必要そうです。

例えば GitHub Copilot Harness で、

import plotly

を利用する Skill が動作したとしても、今回確認した Agent Builder の環境では同じ plotly を Import することができません。

逆に Agent Builder には GitHub Copilot Harness に存在しない Distribution もかなり多く含まれています。

そのため、Skill Package の構成自体を移植できたとしても、

Script が依存している Library や Command まで同じように利用できるとは限らないというところは意識しておいた方がよさそうですね。

なお、今回の検証で分かるのはあくまでも Sandbox から観測できた Runtime の違いです。

Microsoft 内部でどのような Sandbox Image や共通コンポーネントを利用しているのか?など、内部実装についてまで今回の結果から判断することはできません。

また、Preview 中の機能も含まれているため、Packages や Runtime の構成は今後変わる可能性があります。

おわりに

今回は Microsoft 365 Copilot の Agent Builder で作成して Copilot Chat に展開した Agent と、Copilot Studio の GitHub Copilot Harness で Skills の Script 実行環境を比較してみました。

結果として、今回確認した環境では、

  • Python Distribution の数や構成
  • 各 Package の Version
  • Python Runtime の配置
  • OS Kernel
  • 利用可能な Commands
  • File System
  • Network
  • Resource Limits
  • 実際に Import できる Python Modules

など、結構いろいろな違いが確認できました。

同じ Skills という仕組みを利用する場合でも、Script の実行環境についてはそれぞれ確認しておいた方がよさそうです。

特に Python Packages に依存する処理を含める場合は、対象の環境に必要な Library が存在するか?実際に Import できるか?まで確認しておくのがよさそうですね。

実際に検証を行うスキルの作成や、検証結果のまとめなど人の手でやってたらそこそこ時間掛かってしまうので、私はやりたいことと方針と簡単なレビューだけ行い、あとは Copilot くんに任せて実行しました。
便利な時代になりましたね。

さて、今回は比較のために取得した情報を、今後 Runtime が更新されたときに見返せるよう、各 Probe の実行結果全文も残しておきます。

検証結果全文

Agent Builder - Runtime Probe

出力

Runtime Probe Skill 実行結果

Runtime Probe Skill を実行し、現在の Custom Skill 実行環境を実測しました。

Skill 本体の検証スクリプトは、結果を正常に生成した実行について 1回だけ実行しています。以下は、生成されたレポートに記録された値を省略・丸め・言い換えずに整理したものです。

生成ファイル

  • runtime_probe_report.json
  • runtime_probe_report.txt
  • runtime_probe_packages.txt

Python パッケージ全件、各コマンドの詳細な stdout・stderr、各検査の経過時間、環境変数名一覧などは、上記レポートに完全な形で含まれています。

実際に観測できた事実

1. 実行日時

timestamp_utc:

2026-09-08T23:38:22.258450+00:00

追加のプローブ情報:

version: 1.0.0 elapsed_ms: 24175.4 cwd: /mnt/data temp_dir: /tmp pid: 5273

2. Python の実装、バージョン、実行パス

implementation: CPython version: 3.12.14 (main, Aug 18 2026, 15:00:50) [GCC 13.2.0] executable: /opt/pyvenv/bin/python base_prefix: /usr prefix: /opt/pyvenv byteorder: little default_encoding: utf-8 filesystem_encoding: utf-8 preferred_encoding: utf-8 maxsize: 9223372036854775807 version_info: [3, 12, 14, "final", 0]

sys.path:

/home/oai/skills/appCatalog/T_c7684bbd-22d7-09b6-98d1-b677a58b0593/runtime-probe/scripts /opt/oai-pkgs /usr/lib/python312.zip /usr/lib/python3.12 /usr/lib/python3.12/lib-dynload /opt/pyvenv/lib/python3.12/site-packages

3. OS、プラットフォーム、アーキテクチャ

system: Linux platform: Linux-6.1.158.2-microsoft-standard-x86_64-with-glibc2.38 release: 6.1.158.2-microsoft-standard version: #1 SMP Tue Nov 25 00:36:57 UTC 2025 machine: x86_64 processor: x86_64 architecture: ["64bit", "ELF"] libc_ver: ["glibc", "2.38"]

uname:

["Linux", "SandboxHost-639245018762368315", "6.1.158.2-microsoft-standard", "#1 SMP Tue Nov 25 00:36:57 UTC 2025", "x86_64", "x86_64"]

4. インストール済み Python パッケージ数

count: 380 duplicate_normalized_names: {}

全380件は runtime_probe_packages.txt に記録されています。

5. Python パッケージ一覧の SHA-256

3f20aa7078de97d5b95dadab829f6f4f08d38359cab0574bd37cedfc35baa0e4

6. 利用可能な主要コマンドとバージョン

利用可能

python: available=True path=/opt/pyvenv/bin/python status=ok stdout=Python 3.12.14 stderr=

python3: available=True path=/opt/pyvenv/bin/python3 status=ok stdout=Python 3.12.14 stderr=

pip: available=True path=/opt/pyvenv/bin/pip status=ok stdout=pip 26.2.1 from /opt/pyvenv/lib/python3.12/site-packages/pip (python 3.12) stderr=

pip3: available=True path=/opt/pyvenv/bin/pip3 status=ok stdout=pip 26.2.1 from /opt/pyvenv/lib/python3.12/site-packages/pip (python 3.12) stderr=

node: available=True path=/opt/nvm/versions/node/v24.16.0/bin/node status=ok stdout=v24.16.0 stderr=

npm: available=True path=/opt/nvm/versions/node/v24.16.0/bin/npm status=ok stdout=11.18.0 stderr=

npx: available=True path=/opt/nvm/versions/node/v24.16.0/bin/npx status=ok stdout=11.18.0 stderr=

git: available=True path=/usr/bin/git status=ok stdout=git version 2.45.4 stderr=

gcc: available=True path=/usr/bin/gcc status=ok stdout=gcc (GCC) 13.2.0 stderr=

bash: available=True path=/usr/bin/bash status=ok stdout=GNU bash, version 5.2.15(1)-release (x86_64-pc-linux-gnu) stderr=

sh: available=True path=/usr/bin/sh status=ok stdout=sh-ok stderr=

curl: available=True path=/usr/bin/curl status=ok stdout=curl 8.11.1 (x86_64-pc-linux-gnu) libcurl/8.11.1 OpenSSL/3.3.7 zlib/1.3.2 zstd/1.5.5 libssh2/1.11.1 nghttp2/1.61.0 stderr=

wget: available=True path=/usr/bin/wget status=ok stdout=GNU Wget2 2.1.0 - multithreaded metalink/file/website downloader stderr=

java: available=True path=/usr/bin/java status=ok stdout= stderr=openjdk version "17.0.20.1" 2026-08-18 LTS OpenJDK Runtime Environment Microsoft-14940695 (build 17.0.20.1+1-LTS) OpenJDK 64-Bit Server VM Microsoft-14940695 (build 17.0.20.1+1-LTS, mixed mode, sharing)

利用不可

clang: available=False path=None

dotnet: available=False path=None

7. 主要ライブラリの import 成否

すべて status: ok でした。

numpy: ok version=1.26.4 error=None pandas: ok version=2.2.2 error=None openpyxl: ok version=3.1.5 error=None pptx: ok version=1.0.2 error=None fitz: ok version=1.26.7 error=None PIL: ok version=12.3.0 error=None matplotlib: ok version=3.8.4 error=None scipy: ok version=1.13.1 error=None sklearn: ok version=1.5.1 error=None requests: ok version=2.33.1 error=None yaml: ok version=6.0.3 error=None jinja2: ok version=3.1.6 error=None lxml: ok version=6.1.0 error=None bs4: ok version=4.14.3 error=None docx: ok version=1.2.0 error=None reportlab: ok version=4.4.6 error=None pydantic: ok version=2.12.5 error=None cryptography: ok version=50.0.0 error=None

8. ファイルシステムの読み書き結果

/mnt/data

base: /mnt/data bytes: 28 cleanup: true read: true sha256_matches: true status: ok write: true

/tmp

base: /tmp bytes: 28 cleanup: true read: true sha256_matches: true status: ok write: true

レポート出力先:

directory: /mnt/data write_probe_errors: []

生成されたパス:

/mnt/data/runtime_probe_report.json /mnt/data/runtime_probe_report.txt /mnt/data/runtime_probe_packages.txt

9. subprocess の実行結果

elapsed_ms: 1438.8 returncode: 0 status: ok stderr: stdout: subprocess-ok 3.12.14

10. DNS・ネットワーク接続の確認結果

DNS

host: example.com status: ok returncode: 0 elapsed_ms: 1419.7 stderr: addresses: ["104.20.23.154", "172.66.147.243", "2606:4700:10::6814:179a", "2606:4700:10::ac42:93f3"] stdout: ["104.20.23.154", "172.66.147.243", "2606:4700:10::6814:179a", "2606:4700:10::ac42:93f3"]

TCP 接続

host: example.com port: 443 status: error elapsed_ms: 3021.6 error_type: OSError error: [Errno 101] Network is unreachable

11. リソース制限

cpu_count: 2

カレントディレクトリのディスク使用量:

total: 52844855296 used: 1436893184 free: 48706830336

POSIX resource limits:

RLIMIT_AS: soft=-1 hard=-1

RLIMIT_CPU: soft=-1 hard=-1

RLIMIT_DATA: soft=-1 hard=-1

RLIMIT_FSIZE: soft=-1 hard=-1

RLIMIT_NOFILE: soft=1024 hard=1048576

RLIMIT_NPROC: soft=17315 hard=17315

RLIMIT_STACK: soft=8388608 hard=-1

12. その他の取得情報

プロセス ID

uid: 1000 euid: 1000 gid: 1000 egid: 1000

Skill パッケージリソース

status: ok package_root: /home/oai/skills/appCatalog/T_c7684bbd-22d7-09b6-98d1-b677a58b0593/runtime-probe script_path: /home/oai/skills/appCatalog/T_c7684bbd-22d7-09b6-98d1-b677a58b0593/runtime-probe/scripts/runtime_probe.py marker_path: /home/oai/skills/appCatalog/T_c7684bbd-22d7-09b6-98d1-b677a58b0593/runtime-probe/resources/probe_marker.txt marker_text: RUNTIME_PROBE_MARKER_v1 marker_size: 24 marker_sha256: 17186346e17afd81a458b149b66c465943d88a6b55c23003eef842124795b151 package_root_entries: ["SKILL.md", "resources", "scripts"]

環境変数については、値は取得・公開されておらず、変数名のみ96件がレポートに記録されています。

観測結果からの推定

以下は実測値そのものではなく、実測値に基づく限定的な判断です。

  • Python は /opt/pyvenv を prefix とする仮想環境で動作していると考えられます。
  • DNS 名前解決は成功していますが、example.com:443 への TCP 接続は Network is unreachable で失敗しています。この1回の観測では、名前解決と外向きTCP接続に異なる制御が適用されている可能性があります。ただし、ネットワーク全般が常に遮断されることまでは、この結果だけでは確定できません。
  • /mnt/data と /tmp では、28バイトのテストデータについて書き込み、読み取り、内容の SHA-256 一致、クリーンアップが成功しています。
  • パッケージ数 380 と SHA-256 3f20aa7078de97d5b95dadab829f6f4f08d38359cab0574bd37cedfc35baa0e4 は、今回観測された正規化済み Python distribution name/version 集合のフィンガープリントです。
  • このフィンガープリントが別環境と一致しても、サンドボックスイメージ、オーケストレーション層、実行ハーネス全体が同一であることまでは証明しません。

runtime_probe_packages.txt

affine==3.0.0
aiofiles==24.1.0
aiohappyeyeballs==2.7.1
aiohttp==3.14.3
aiosignal==1.4.0
altair==6.2.2
annotated-doc==0.0.5
annotated-types==0.7.0
anyio==4.14.2
anytree==2.13.0
arcade==3.3.3
artifact-tool-v2==2.2.6
artifact-tool==0.1.0
artifact-validator==3.2.1
arviz==0.22.0
asgiref==3.12.1
asn1crypto==1.5.1
asttokens==3.0.2
asyncpg==0.31.0
asyncssh==2.23.1
attrs==26.1.0
audioread==3.1.0
basemap-data==1.3.2
basemap==1.4.0
beautifulsoup4==4.14.3
biopython==1.86
blinker==1.9.0
blis==1.3.3
boto3==1.43.81
botocore==1.43.81
brotli==1.2.0
cachetools==6.2.4
cairocffi==1.7.1
cairosvg==2.9.0
camelot-py==2.0.0
catalogue==2.0.10
certifi==2026.7.22
cffi==2.1.1
cfgv==3.5.0
cftime==1.6.5
charset-normalizer==3.5.1
choreographer==1.3.0
click-plugins==1.1.1.2
click==8.5.0
cligj==0.7.2
cloudpathlib==0.25.0
cloudpickle==3.1.2
comm==0.2.3
confection==0.1.5
cons==0.4.7
contourpy==1.3.3
countryinfo==0.1.2
cowork-ooxml==0.1.0
coworker-py-proto==0.1.0
cryptography==50.0.0
cssselect2==0.8.0
cycler==0.12.1
cymem==2.0.13
databricks-sql-connector==4.2.2
dearpygui==2.1.1
debugpy==1.8.21
decorator==5.3.1
defusedxml==0.7.1
deprecation==2.1.0
diagrams==0.25.1
distlib==0.4.3
django==6.0.5
dnspython==2.8.0
docker==7.1.0
docstring-parser==0.17.0
docutils==0.23
et-xmlfile==2.0.0
etuples==0.3.10
exchange-calendars==4.11.3
executing==2.2.1
faker==38.2.0
fastapi==0.136.3
ffmpeg-python==0.2.0
filelock==3.32.4
filetype==1.2.0
fiona==1.10.1
flatbuffers==25.12.19
flet==0.28.3
fonttools==4.63.0
formulaic==1.2.2
fpdf==1.7.2
frozenlist==1.8.0
fsspec==2026.7.0
future==1.0.0
gensim==4.3.3
geopandas==1.1.2
gitdb==4.0.12
gitpython==3.1.60
google-auth-oauthlib==1.4.1
google-auth==2.57.0
googleapis-common-protos==1.75.2
gradio-client==2.5.0
gradio==6.19.0
graphviz==0.20.3
greenlet==3.5.5
groovy==0.1.2
grpcio==1.83.0
gspread==6.2.1
h11==0.16.0
h2==4.4.1
h5netcdf==1.8.1
hf-gradio==0.4.1
hf-xet==1.6.0
hpack==4.2.0
httpcore==1.0.9
httpx==0.28.1
huggingface-hub==1.29.0
hypercorn==0.18.0
hyperframe==6.1.0
identify==2.6.19
idna==3.19
imageio==2.33.1
img2pdf==0.6.3
inflect==7.5.0
iniconfig==2.3.0
interface-meta==2.0.1
ipykernel==7.2.0
ipython-pygments-lexers==1.1.1
ipython==9.12.0
jedi==0.19.2
jinja2==3.1.6
jmespath==1.1.0
joblib==1.5.3
jsonschema-specifications==2025.9.1
jsonschema==4.26.0
jupyter-client==8.8.0
jupyter-core==5.9.1
kaleido==1.2.0
keyboard==0.13.5
kivy-garden==0.1.5
kivy==2.3.1
kiwisolver==1.5.0
korean-lunar-calendar==0.4.0
lazy-loader==0.5
librosa==0.11.0
lightgbm==4.6.0
llvmlite==0.49.0
logical-unification==0.4.7
logistro==2.0.1
loguru==0.7.3
lumina-fuse==0.1.0
lxml==6.1.0
lz4==4.4.5
magika==0.6.3
markdown-it-py==4.2.0
markdownify==1.2.3
markitdown==0.1.2
markupsafe==3.0.3
matplotlib-inline==0.2.1
matplotlib-venn==1.1.2
matplotlib==3.8.4
matplotx==0.3.10
mdurl==0.1.2
microsoft-lumina-auth==1.0.0
microsoft-lumina-configs==0.1.0
microsoft-lumina-filesystem==0.1.0
microsoft-lumina-telemetry==0.1.0
minikanren==1.0.5
mizani==0.14.4
mne==1.11.0
more-itertools==11.1.0
mouseinfo==0.1.3
msgpack==1.2.2
mtcnn==1.0.0
multidict==6.7.1
multipledispatch==1.0.0
murmurhash==1.0.15
mypy-extensions==1.1.0
narwhals==2.25.0
nest-asyncio==1.6.0
netcdf4==1.7.3
nltk==3.10.3
nodeenv==1.10.0
numba==0.67.0
numpy==1.26.4
nvidia-nccl-cu12==2.31.2
oauthlib==3.3.1
ocrmypdf==16.13.0
onnxruntime==1.25.0
opencv-python-headless==4.11.0.86
openpyxl==3.1.5
opentelemetry-api==1.43.0
opentelemetry-exporter-otlp-proto-common==1.43.0
opentelemetry-exporter-otlp-proto-grpc==1.43.0
opentelemetry-exporter-otlp-proto-http==1.43.0
opentelemetry-exporter-otlp==1.43.0
opentelemetry-instrumentation-asgi==0.64b0
opentelemetry-instrumentation-fastapi==0.64b0
opentelemetry-instrumentation-httpx==0.64b0
opentelemetry-instrumentation-requests==0.64b0
opentelemetry-instrumentation==0.64b0
opentelemetry-proto==1.43.0
opentelemetry-sdk==1.43.0
opentelemetry-semantic-conventions==0.64b0
opentelemetry-util-http==0.64b0
orjson==3.12.0
outcome==1.3.0.post0
packaging==23.2
pandas==2.2.2
parso==0.8.7
patsy==1.0.2
pdf2image==1.17.0
pdfkit==1.0.0
pdfminer.six==20251230
pdfplumber==0.11.9
pdfrw==0.4
pexpect==4.9.0
pg8000==1.31.5
pi-heif==1.4.0
pikepdf==10.12.0
pillow==12.3.0
pip==26.2.1
platformdirs==4.9.6
playa-pdf==1.1.0
playwright==1.57.0
plotnine==0.15.2
pluggy==1.6.0
pooch==1.9.0
pre-commit==4.6.2
preshed==3.0.13
priority==2.0.0
prompt-toolkit==3.0.52
propcache==0.5.2
protobuf==7.34.0
psutil==7.2.2
ptyprocess==0.7.0
pure-eval==0.2.3
pyarrow==25.0.1
pyasn1-modules==0.4.2
pyasn1==0.6.4
pyautogui==0.9.54
pybreaker==1.4.1
pycparser==3.0
pydantic-core==2.41.5
pydantic-settings==2.10.1
pydantic==2.12.5
pydeck==0.9.3
pydub==0.25.1
pydyf==0.12.1
pyee==13.0.1
pyfuse3==3.5.0
pygetwindow==0.0.9
pyglet==2.1.16
pygments==2.21.0
pyhumps==3.8.0
pyjwt==2.13.0
pyluach==2.3.0
pymc==5.25.1
pymongo==4.15.5
pymsgbox==2.0.1
pymunk==6.9.0
pymupdf==1.26.7
pyodbc==5.1.0
pyogrio==0.13.0
pyopenssl==26.4.0
pypandoc==1.16.2
pyparsing==3.3.2
pypdf==6.15.0
pypdfium2==5.2.0
pyperclip==1.11.0
pyphen==0.18.1
pyproj==3.6.1
pyrect==0.2.0
pyscreeze==1.0.1
pyshp==2.3.1
pysocks==1.7.1
pytensor==2.31.7
pytesseract==0.3.13
pytest-timeout==2.5.0
pytest==9.1.1
python-dateutil==2.9.0.post0
python-discovery==1.5.3
python-docx==1.2.0
python-dotenv==1.2.2
python-json-logger==3.3.0
python-multipart==0.0.32
python-pdf==0.40
python-pptx==1.0.2
python3-xlib==0.15
pytiled-parser==2.2.9
pyttsx3==2.99
pytweening==1.2.0
pytz==2026.3.post1
pyyaml==6.0.3
pyzbar==0.1.9
pyzmq==27.1.0
qrcode==8.2
rasterio==1.4.4
referencing==0.37.0
regex==2026.7.19
repath==0.9.0
reportlab==4.4.6
requests-oauthlib==2.0.0
requests==2.33.1
rich==15.0.0
rpds-py==2026.6.3
s3transfer==0.19.2
safehttpx==0.1.7
sandbox-terminal-service==0.1.0
scikit-learn==1.5.1
scipy==1.13.1
scramp==1.4.17
selenium==4.39.0
semantic-version==2.10.0
setuptools==84.0.0
shap==0.49.1
shapely==2.1.2
shellingham==1.5.4
simplejson==4.1.2
six==1.17.0
slicer==0.0.8
smart-open==7.7.1
smmap==5.0.3
sniffio==1.3.1
snowflake-connector-python==4.7.2
sortedcontainers==2.4.0
soundfile==0.13.1
soupsieve==2.9.2
soxr==1.1.0
spacy-legacy==3.0.12
spacy-loggers==1.0.5
spacy==3.8.11
speechrecognition==3.14.4
sqlparse==0.6.0
srsly==2.5.3
stack-data==0.6.3
starlette==1.6.0
statsmodels==0.15.0
streamlit==1.53.1
structlog==25.4.0
tabulate==0.10.0
tenacity==9.1.4
terminal-runtime==0.1.0
textstat==0.7.12
thinc==8.3.11
threadpoolctl==3.6.0
thrift==0.20.0
tika==3.1.0
tiktoken==0.12.0
tinycss2==1.5.1
tinyhtml5==2.1.0
toml==0.10.2
tomlkit==0.14.0
toolz==1.1.0
tornado==6.5.7
tqdm==4.70.0
traitlets==5.14.3
trio-websocket==0.12.2
trio==0.34.0
typeguard==4.6.0
typer-slim==0.24.0
typer==0.27.1
typing-extensions==4.15.0
typing-inspection==0.4.2
tzdata==2026.3
urllib3==2.7.0
uvicorn==0.35.0
virtualenv==21.7.5
wasabi==1.1.3
watchdog==6.0.0
wcwidth==0.8.2
weasel==0.4.3
weasyprint==68.0
webencodings==0.6.1
websocket-client==1.9.0
wordcloud==1.9.4
wrapt==2.3.0
wsproto==1.3.2
xarray-einstats==0.9.1
xarray==2025.6.1
xgboost==3.1.2
xlrd==2.0.2
xlsxwriter==3.2.9
yarl==1.24.5
zopfli==0.4.3

runtime_probe_report.txt

Runtime Probe v1.0.0
timestamp_utc: 2026-09-08T23:38:22.258450+00:00
elapsed_ms: 24175.4

[Python]
implementation: CPython
version: 3.12.14 (main, Aug 18 2026, 15:00:50) [GCC 13.2.0]
executable: /opt/pyvenv/bin/python

[Platform]
platform: Linux-6.1.158.2-microsoft-standard-x86_64-with-glibc2.38
system: Linux
release: 6.1.158.2-microsoft-standard
machine: x86_64

[Installed Python distributions]
count: 380
sha256: 3f20aa7078de97d5b95dadab829f6f4f08d38359cab0574bd37cedfc35baa0e4
full_list_file: runtime_probe_packages.txt

[Major imports]
numpy: ok version=1.26.4 error=None
pandas: ok version=2.2.2 error=None
openpyxl: ok version=3.1.5 error=None
pptx: ok version=1.0.2 error=None
fitz: ok version=1.26.7 error=None
PIL: ok version=12.3.0 error=None
matplotlib: ok version=3.8.4 error=None
scipy: ok version=1.13.1 error=None
sklearn: ok version=1.5.1 error=None
requests: ok version=2.33.1 error=None
yaml: ok version=6.0.3 error=None
jinja2: ok version=3.1.6 error=None
lxml: ok version=6.1.0 error=None
bs4: ok version=4.14.3 error=None
docx: ok version=1.2.0 error=None
reportlab: ok version=4.4.6 error=None
pydantic: ok version=2.12.5 error=None
cryptography: ok version=50.0.0 error=None

[Commands]
python: available=True path=/opt/pyvenv/bin/python status=ok stdout=Python 3.12.14 stderr=
python3: available=True path=/opt/pyvenv/bin/python3 status=ok stdout=Python 3.12.14 stderr=
pip: available=True path=/opt/pyvenv/bin/pip status=ok stdout=pip 26.2.1 from /opt/pyvenv/lib/python3.12/site-packages/pip (python 3.12) stderr=
pip3: available=True path=/opt/pyvenv/bin/pip3 status=ok stdout=pip 26.2.1 from /opt/pyvenv/lib/python3.12/site-packages/pip (python 3.12) stderr=
node: available=True path=/opt/nvm/versions/node/v24.16.0/bin/node status=ok stdout=v24.16.0 stderr=
npm: available=True path=/opt/nvm/versions/node/v24.16.0/bin/npm status=ok stdout=11.18.0 stderr=
npx: available=True path=/opt/nvm/versions/node/v24.16.0/bin/npx status=ok stdout=11.18.0 stderr=
bash: available=True path=/usr/bin/bash status=ok stdout=GNU bash, version 5.2.15(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. stderr=
sh: available=True path=/usr/bin/sh status=ok stdout=sh-ok stderr=
git: available=True path=/usr/bin/git status=ok stdout=git version 2.45.4 stderr=
curl: available=True path=/usr/bin/curl status=ok stdout=curl 8.11.1 (x86_64-pc-linux-gnu) libcurl/8.11.1 OpenSSL/3.3.7 zlib/1.3.2 zstd/1.5.5 libssh2/1.11.1 nghttp2/1.61.0
Release-Date: 2024-12-11
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS GSS-API HSTS HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz NTLM SPNEGO SSL threadsafe TLS-SRP UnixSockets zstd stderr=
wget: available=True path=/usr/bin/wget status=ok stdout=GNU Wget2 2.1.0 - multithreaded metalink/file/website downloader

+digest +https +ssl/openssl +ipv6 +iri +large-file +nls -ntlm -opie -psl -hsts
+iconv -idn +zlib -lzma +brotlidec +zstd -bzip2 -lzip +http2 +gpgme

Copyright (C) 2012-2015 Tim Ruehsen
Copyright (C) 2015-2021 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later
<http://www.gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please send bug reports and questions to <bug-wget@gnu.org>. stderr=
java: available=True path=/usr/bin/java status=ok stdout= stderr=openjdk version "17.0.20.1" 2026-08-18 LTS
OpenJDK Runtime Environment Microsoft-14940695 (build 17.0.20.1+1-LTS)
OpenJDK 64-Bit Server VM Microsoft-14940695 (build 17.0.20.1+1-LTS, mixed mode, sharing)
dotnet: available=False path=None status=None stdout=None stderr=None
gcc: available=True path=/usr/bin/gcc status=ok stdout=gcc (GCC) 13.2.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. stderr=
clang: available=False path=None status=None stdout=None stderr=None

[Packaged resource]
{"marker_path": "/home/oai/skills/appCatalog/T_c7684bbd-22d7-09b6-98d1-b677a58b0593/runtime-probe/resources/probe_marker.txt", "marker_sha256": "17186346e17afd81a458b149b66c465943d88a6b55c23003eef842124795b151", "marker_size": 24, "marker_text": "RUNTIME_PROBE_MARKER_v1", "package_root": "/home/oai/skills/appCatalog/T_c7684bbd-22d7-09b6-98d1-b677a58b0593/runtime-probe", "package_root_entries": ["SKILL.md", "resources", "scripts"], "script_path": "/home/oai/skills/appCatalog/T_c7684bbd-22d7-09b6-98d1-b677a58b0593/runtime-probe/scripts/runtime_probe.py", "status": "ok"}

[Filesystem]
{"/mnt/data": {"base": "/mnt/data", "bytes": 28, "cleanup": true, "read": true, "sha256_matches": true, "status": "ok", "write": true}, "/tmp": {"base": "/tmp", "bytes": 28, "cleanup": true, "read": true, "sha256_matches": true, "status": "ok", "write": true}}

[Subprocess]
{"elapsed_ms": 1438.8, "returncode": 0, "status": "ok", "stderr": "", "stdout": "subprocess-ok\n3.12.14"}

[Network]
{"dns_example_com": {"addresses": ["104.20.23.154", "172.66.147.243", "2606:4700:10::6814:179a", "2606:4700:10::ac42:93f3"], "elapsed_ms": 1419.7, "host": "example.com", "returncode": 0, "status": "ok", "stderr": "", "stdout": "[\"104.20.23.154\", \"172.66.147.243\", \"2606:4700:10::6814:179a\", \"2606:4700:10::ac42:93f3\"]"}, "tcp_example_com_443": {"elapsed_ms": 3021.6, "error": "[Errno 101] Network is unreachable", "error_type": "OSError", "host": "example.com", "port": 443, "status": "error"}}

[Resources]
{"cpu_count": 2, "cwd_disk_usage_bytes": {"free": 48706830336, "total": 52844855296, "used": 1436893184}, "posix_rlimits": {"RLIMIT_AS": {"hard": -1, "soft": -1}, "RLIMIT_CPU": {"hard": -1, "soft": -1}, "RLIMIT_DATA": {"hard": -1, "soft": -1}, "RLIMIT_FSIZE": {"hard": -1, "soft": -1}, "RLIMIT_NOFILE": {"hard": 1048576, "soft": 1024}, "RLIMIT_NPROC": {"hard": 17315, "soft": 17315}, "RLIMIT_STACK": {"hard": -1, "soft": 8388608}}}

[Environment variable names only]
count: 96
APP_HOSTING_PORT_RANGE_END, APP_HOSTING_PORT_RANGE_START, ARTIFACT_TOOL_GRANOLA_CLI_PATH, BASE_API_PORT, BASH_FUNC_pathappend%%, BASH_FUNC_pathprepend%%, BASH_FUNC_pathremove%%, DISABLE_AUTH, ENABLE_FILESYSTEM_API, ENABLE_MITMPROXY, ENABLE_MULTI_RUNTIME_ENVIRONMENTS, ENVIRONMENT, EPS_BROKER_API_ENDPOINT, EXT_API_PORT, FEATURE_KIND, FEATURE_NAME, FEATURE_VERSION, Fabric_ApplicationName, Fabric_CodePackageName, Fabric_Id, Fabric_NET-0-[Delegated], Fabric_NetworkingMode, Fabric_NodeIPOrFQDN, Fabric_ServiceDnsName, Fabric_ServiceName, HISTFILE, HISTIGNORE, HISTSIZE, HOME, HOSTNAME, HTTPS_PROXY, HTTP_PROXY, INPUTRC, KMP_DUPLICATE_LIB_OK, KMP_INIT_AT_FORK, LANG, LC_CTYPE, LOGNAME, LOG_LEVEL, LS_COLORS, LUMINA_FUSE_BACKING_DIR, LUMINA_FUSE_MODE, LUMINA_FUSE_MOUNT, NAMESPACE_NAME, NODE_EXTRA_CA_CERTS, NODE_INSTALL_PATH, NODE_PATH, NO_PROXY, NPM_CONFIG_PREFIX, NVM_DIR, OLDPWD, OTEL_ENABLE_LOGGING, OTEL_ENABLE_METRICS, OTEL_ENABLE_TRACING, OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_GRPC_ENDPOINT, OTEL_EXPORTER_OTLP_HTTP_ENDPOINT, OTEL_TRACE_SAMPLING_RATE, PARTNER_NAME, PATH, PIP_CONSTRAINT, PIP_TARGET, PKG_CONFIG_PATH, PLAYWRIGHT_BROWSERS_PATH, PWD, PYTHONPATH, REQUESTS_CA_BUNDLE, SANDBOX_COLLECTION_NAME, SANDBOX_ENV, SANDBOX_NAME, SANDBOX_REGION, SANDBOX_VERSION, SERVICE_INSTANCE_ID, SERVICE_NAME, SERVICE_VERSION, SHARED_MITMPROXY_CERT_PATH, SHARED_NON_SECURITY_PATH, SHARED_VOLUME_PATH, SHLVL, SSL_CERT_FILE, TELEMETRY_EXPORT_MODE, TERM, TERMINAL_SHELL_BASE_API_ENDPOINT, TERMINAL_SHELL_EXT_API_ENDPOINT, TERMINAL_SHELL_HOSTNAME, TESSDATA_PREFIX, USER, VIRTUAL_ENV, WORKING_DIRS_CONFIG, XDG_CONFIG_DIRS, XDG_DATA_DIRS, X_MS_TRACE_ID, _, http_proxy, https_proxy, no_proxy

runtime_probe_report.json

{
  "commands": {
    "bash": {
      "available": true,
      "path": "/usr/bin/bash",
      "version_probe": {
        "elapsed_ms": 1.7,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "GNU bash, version 5.2.15(1)-release (x86_64-pc-linux-gnu)\nCopyright (C) 2022 Free Software Foundation, Inc.\nLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n\nThis is free software; you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law."
      }
    },
    "clang": {
      "available": false,
      "path": null
    },
    "curl": {
      "available": true,
      "path": "/usr/bin/curl",
      "version_probe": {
        "elapsed_ms": 13.5,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "curl 8.11.1 (x86_64-pc-linux-gnu) libcurl/8.11.1 OpenSSL/3.3.7 zlib/1.3.2 zstd/1.5.5 libssh2/1.11.1 nghttp2/1.61.0\nRelease-Date: 2024-12-11\nProtocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp ws wss\nFeatures: alt-svc AsynchDNS GSS-API HSTS HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz NTLM SPNEGO SSL threadsafe TLS-SRP UnixSockets zstd"
      }
    },
    "dotnet": {
      "available": false,
      "path": null
    },
    "gcc": {
      "available": true,
      "path": "/usr/bin/gcc",
      "version_probe": {
        "elapsed_ms": 18.1,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "gcc (GCC) 13.2.0\nCopyright (C) 2023 Free Software Foundation, Inc.\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
      }
    },
    "git": {
      "available": true,
      "path": "/usr/bin/git",
      "version_probe": {
        "elapsed_ms": 13.4,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "git version 2.45.4"
      }
    },
    "java": {
      "available": true,
      "path": "/usr/bin/java",
      "version_probe": {
        "elapsed_ms": 228.2,
        "returncode": 0,
        "status": "ok",
        "stderr": "openjdk version \"17.0.20.1\" 2026-08-18 LTS\nOpenJDK Runtime Environment Microsoft-14940695 (build 17.0.20.1+1-LTS)\nOpenJDK 64-Bit Server VM Microsoft-14940695 (build 17.0.20.1+1-LTS, mixed mode, sharing)",
        "stdout": ""
      }
    },
    "node": {
      "available": true,
      "path": "/opt/nvm/versions/node/v24.16.0/bin/node",
      "version_probe": {
        "elapsed_ms": 371.4,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "v24.16.0"
      }
    },
    "npm": {
      "available": true,
      "path": "/opt/nvm/versions/node/v24.16.0/bin/npm",
      "version_probe": {
        "elapsed_ms": 621.3,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "11.18.0"
      }
    },
    "npx": {
      "available": true,
      "path": "/opt/nvm/versions/node/v24.16.0/bin/npx",
      "version_probe": {
        "elapsed_ms": 234.6,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "11.18.0"
      }
    },
    "pip": {
      "available": true,
      "path": "/opt/pyvenv/bin/pip",
      "version_probe": {
        "elapsed_ms": 2432.9,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "pip 26.2.1 from /opt/pyvenv/lib/python3.12/site-packages/pip (python 3.12)"
      }
    },
    "pip3": {
      "available": true,
      "path": "/opt/pyvenv/bin/pip3",
      "version_probe": {
        "elapsed_ms": 2371.3,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "pip 26.2.1 from /opt/pyvenv/lib/python3.12/site-packages/pip (python 3.12)"
      }
    },
    "python": {
      "available": true,
      "path": "/opt/pyvenv/bin/python",
      "version_probe": {
        "elapsed_ms": 3.3,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "Python 3.12.14"
      }
    },
    "python3": {
      "available": true,
      "path": "/opt/pyvenv/bin/python3",
      "version_probe": {
        "elapsed_ms": 5.3,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "Python 3.12.14"
      }
    },
    "sh": {
      "available": true,
      "path": "/usr/bin/sh",
      "version_probe": {
        "elapsed_ms": 6.7,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "sh-ok"
      }
    },
    "wget": {
      "available": true,
      "path": "/usr/bin/wget",
      "version_probe": {
        "elapsed_ms": 21.2,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "GNU Wget2 2.1.0 - multithreaded metalink/file/website downloader\n\n+digest +https +ssl/openssl +ipv6 +iri +large-file +nls -ntlm -opie -psl -hsts\n+iconv -idn +zlib -lzma +brotlidec +zstd -bzip2 -lzip +http2 +gpgme\n\nCopyright (C) 2012-2015 Tim Ruehsen\nCopyright (C) 2015-2021 Free Software Foundation, Inc.\n\nLicense GPLv3+: GNU GPL version 3 or later\n<http://www.gnu.org/licenses/gpl.html>.\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n\nPlease send bug reports and questions to <bug-wget@gnu.org>."
      }
    }
  },
  "environment": {
    "variable_count": 96,
    "variable_names_only": [
      "APP_HOSTING_PORT_RANGE_END",
      "APP_HOSTING_PORT_RANGE_START",
      "ARTIFACT_TOOL_GRANOLA_CLI_PATH",
      "BASE_API_PORT",
      "BASH_FUNC_pathappend%%",
      "BASH_FUNC_pathprepend%%",
      "BASH_FUNC_pathremove%%",
      "DISABLE_AUTH",
      "ENABLE_FILESYSTEM_API",
      "ENABLE_MITMPROXY",
      "ENABLE_MULTI_RUNTIME_ENVIRONMENTS",
      "ENVIRONMENT",
      "EPS_BROKER_API_ENDPOINT",
      "EXT_API_PORT",
      "FEATURE_KIND",
      "FEATURE_NAME",
      "FEATURE_VERSION",
      "Fabric_ApplicationName",
      "Fabric_CodePackageName",
      "Fabric_Id",
      "Fabric_NET-0-[Delegated]",
      "Fabric_NetworkingMode",
      "Fabric_NodeIPOrFQDN",
      "Fabric_ServiceDnsName",
      "Fabric_ServiceName",
      "HISTFILE",
      "HISTIGNORE",
      "HISTSIZE",
      "HOME",
      "HOSTNAME",
      "HTTPS_PROXY",
      "HTTP_PROXY",
      "INPUTRC",
      "KMP_DUPLICATE_LIB_OK",
      "KMP_INIT_AT_FORK",
      "LANG",
      "LC_CTYPE",
      "LOGNAME",
      "LOG_LEVEL",
      "LS_COLORS",
      "LUMINA_FUSE_BACKING_DIR",
      "LUMINA_FUSE_MODE",
      "LUMINA_FUSE_MOUNT",
      "NAMESPACE_NAME",
      "NODE_EXTRA_CA_CERTS",
      "NODE_INSTALL_PATH",
      "NODE_PATH",
      "NO_PROXY",
      "NPM_CONFIG_PREFIX",
      "NVM_DIR",
      "OLDPWD",
      "OTEL_ENABLE_LOGGING",
      "OTEL_ENABLE_METRICS",
      "OTEL_ENABLE_TRACING",
      "OTEL_EXPORTER_OTLP_ENDPOINT",
      "OTEL_EXPORTER_OTLP_GRPC_ENDPOINT",
      "OTEL_EXPORTER_OTLP_HTTP_ENDPOINT",
      "OTEL_TRACE_SAMPLING_RATE",
      "PARTNER_NAME",
      "PATH",
      "PIP_CONSTRAINT",
      "PIP_TARGET",
      "PKG_CONFIG_PATH",
      "PLAYWRIGHT_BROWSERS_PATH",
      "PWD",
      "PYTHONPATH",
      "REQUESTS_CA_BUNDLE",
      "SANDBOX_COLLECTION_NAME",
      "SANDBOX_ENV",
      "SANDBOX_NAME",
      "SANDBOX_REGION",
      "SANDBOX_VERSION",
      "SERVICE_INSTANCE_ID",
      "SERVICE_NAME",
      "SERVICE_VERSION",
      "SHARED_MITMPROXY_CERT_PATH",
      "SHARED_NON_SECURITY_PATH",
      "SHARED_VOLUME_PATH",
      "SHLVL",
      "SSL_CERT_FILE",
      "TELEMETRY_EXPORT_MODE",
      "TERM",
      "TERMINAL_SHELL_BASE_API_ENDPOINT",
      "TERMINAL_SHELL_EXT_API_ENDPOINT",
      "TERMINAL_SHELL_HOSTNAME",
      "TESSDATA_PREFIX",
      "USER",
      "VIRTUAL_ENV",
      "WORKING_DIRS_CONFIG",
      "XDG_CONFIG_DIRS",
      "XDG_DATA_DIRS",
      "X_MS_TRACE_ID",
      "_",
      "http_proxy",
      "https_proxy",
      "no_proxy"
    ]
  },
  "filesystem": {
    "/mnt/data": {
      "base": "/mnt/data",
      "bytes": 28,
      "cleanup": true,
      "read": true,
      "sha256_matches": true,
      "status": "ok",
      "write": true
    },
    "/tmp": {
      "base": "/tmp",
      "bytes": 28,
      "cleanup": true,
      "read": true,
      "sha256_matches": true,
      "status": "ok",
      "write": true
    }
  },
  "major_imports": {
    "PIL": {
      "elapsed_ms": 0.0,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/PIL/__init__.py",
      "status": "ok",
      "version": "12.3.0"
    },
    "bs4": {
      "elapsed_ms": 276.0,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/bs4/__init__.py",
      "status": "ok",
      "version": "4.14.3"
    },
    "cryptography": {
      "elapsed_ms": 5.3,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/cryptography/__init__.py",
      "status": "ok",
      "version": "50.0.0"
    },
    "docx": {
      "elapsed_ms": 160.2,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/docx/__init__.py",
      "status": "ok",
      "version": "1.2.0"
    },
    "fitz": {
      "elapsed_ms": 1915.5,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/fitz/__init__.py",
      "status": "ok",
      "version": "1.26.7"
    },
    "jinja2": {
      "elapsed_ms": 224.7,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/jinja2/__init__.py",
      "status": "ok",
      "version": "3.1.6"
    },
    "lxml": {
      "elapsed_ms": 0.0,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/lxml/__init__.py",
      "status": "ok",
      "version": "6.1.0"
    },
    "matplotlib": {
      "elapsed_ms": 0.3,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/matplotlib/__init__.py",
      "status": "ok",
      "version": "3.8.4"
    },
    "numpy": {
      "elapsed_ms": 0.0,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/numpy/__init__.py",
      "status": "ok",
      "version": "1.26.4"
    },
    "openpyxl": {
      "elapsed_ms": 291.9,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/openpyxl/__init__.py",
      "status": "ok",
      "version": "3.1.5"
    },
    "pandas": {
      "elapsed_ms": 2582.7,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/pandas/__init__.py",
      "status": "ok",
      "version": "2.2.2"
    },
    "pptx": {
      "elapsed_ms": 343.0,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/pptx/__init__.py",
      "status": "ok",
      "version": "1.0.2"
    },
    "pydantic": {
      "elapsed_ms": 41.5,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/pydantic/__init__.py",
      "status": "ok",
      "version": "2.12.5"
    },
    "reportlab": {
      "elapsed_ms": 4.3,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/reportlab/__init__.py",
      "status": "ok",
      "version": "4.4.6"
    },
    "requests": {
      "elapsed_ms": 120.6,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/requests/__init__.py",
      "status": "ok",
      "version": "2.33.1"
    },
    "scipy": {
      "elapsed_ms": 272.2,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/scipy/__init__.py",
      "status": "ok",
      "version": "1.13.1"
    },
    "sklearn": {
      "elapsed_ms": 4543.6,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/sklearn/__init__.py",
      "status": "ok",
      "version": "1.5.1"
    },
    "yaml": {
      "elapsed_ms": 183.7,
      "file": "/opt/pyvenv/lib/python3.12/site-packages/yaml/__init__.py",
      "status": "ok",
      "version": "6.0.3"
    }
  },
  "network": {
    "dns_example_com": {
      "addresses": [
        "104.20.23.154",
        "172.66.147.243",
        "2606:4700:10::6814:179a",
        "2606:4700:10::ac42:93f3"
      ],
      "elapsed_ms": 1419.7,
      "host": "example.com",
      "returncode": 0,
      "status": "ok",
      "stderr": "",
      "stdout": "[\"104.20.23.154\", \"172.66.147.243\", \"2606:4700:10::6814:179a\", \"2606:4700:10::ac42:93f3\"]"
    },
    "tcp_example_com_443": {
      "elapsed_ms": 3021.6,
      "error": "[Errno 101] Network is unreachable",
      "error_type": "OSError",
      "host": "example.com",
      "port": 443,
      "status": "error"
    }
  },
  "output": {
    "directory": "/mnt/data",
    "files": [
      "/mnt/data/runtime_probe_report.json",
      "/mnt/data/runtime_probe_report.txt",
      "/mnt/data/runtime_probe_packages.txt"
    ],
    "write_probe_errors": []
  },
  "packaged_resource": {
    "marker_path": "/home/oai/skills/appCatalog/T_c7684bbd-22d7-09b6-98d1-b677a58b0593/runtime-probe/resources/probe_marker.txt",
    "marker_sha256": "17186346e17afd81a458b149b66c465943d88a6b55c23003eef842124795b151",
    "marker_size": 24,
    "marker_text": "RUNTIME_PROBE_MARKER_v1",
    "package_root": "/home/oai/skills/appCatalog/T_c7684bbd-22d7-09b6-98d1-b677a58b0593/runtime-probe",
    "package_root_entries": [
      "SKILL.md",
      "resources",
      "scripts"
    ],
    "script_path": "/home/oai/skills/appCatalog/T_c7684bbd-22d7-09b6-98d1-b677a58b0593/runtime-probe/scripts/runtime_probe.py",
    "status": "ok"
  },
  "packages": {
    "count": 380,
    "duplicate_normalized_names": {},
    "sha256": "3f20aa7078de97d5b95dadab829f6f4f08d38359cab0574bd37cedfc35baa0e4"
  },
  "platform": {
    "architecture": [
      "64bit",
      "ELF"
    ],
    "libc_ver": [
      "glibc",
      "2.38"
    ],
    "machine": "x86_64",
    "platform": "Linux-6.1.158.2-microsoft-standard-x86_64-with-glibc2.38",
    "processor": "x86_64",
    "release": "6.1.158.2-microsoft-standard",
    "system": "Linux",
    "uname": [
      "Linux",
      "SandboxHost-639245018762368315",
      "6.1.158.2-microsoft-standard",
      "#1 SMP Tue Nov 25 00:36:57 UTC 2025",
      "x86_64",
      "x86_64"
    ],
    "version": "#1 SMP Tue Nov 25 00:36:57 UTC 2025"
  },
  "probe": {
    "cwd": "/mnt/data",
    "elapsed_ms": 24175.4,
    "pid": 5273,
    "temp_dir": "/tmp",
    "timestamp_utc": "2026-09-08T23:38:22.258450+00:00",
    "version": "1.0.0"
  },
  "process_identity": {
    "egid": 1000,
    "euid": 1000,
    "gid": 1000,
    "uid": 1000
  },
  "python": {
    "base_prefix": "/usr",
    "byteorder": "little",
    "default_encoding": "utf-8",
    "executable": "/opt/pyvenv/bin/python",
    "filesystem_encoding": "utf-8",
    "implementation": "CPython",
    "maxsize": 9223372036854775807,
    "preferred_encoding": "utf-8",
    "prefix": "/opt/pyvenv",
    "sys_path": [
      "/home/oai/skills/appCatalog/T_c7684bbd-22d7-09b6-98d1-b677a58b0593/runtime-probe/scripts",
      "/opt/oai-pkgs",
      "/usr/lib/python312.zip",
      "/usr/lib/python3.12",
      "/usr/lib/python3.12/lib-dynload",
      "/opt/pyvenv/lib/python3.12/site-packages"
    ],
    "version": "3.12.14 (main, Aug 18 2026, 15:00:50) [GCC 13.2.0]",
    "version_info": [
      3,
      12,
      14,
      "final",
      0
    ]
  },
  "resources": {
    "cpu_count": 2,
    "cwd_disk_usage_bytes": {
      "free": 48706830336,
      "total": 52844855296,
      "used": 1436893184
    },
    "posix_rlimits": {
      "RLIMIT_AS": {
        "hard": -1,
        "soft": -1
      },
      "RLIMIT_CPU": {
        "hard": -1,
        "soft": -1
      },
      "RLIMIT_DATA": {
        "hard": -1,
        "soft": -1
      },
      "RLIMIT_FSIZE": {
        "hard": -1,
        "soft": -1
      },
      "RLIMIT_NOFILE": {
        "hard": 1048576,
        "soft": 1024
      },
      "RLIMIT_NPROC": {
        "hard": 17315,
        "soft": 17315
      },
      "RLIMIT_STACK": {
        "hard": -1,
        "soft": 8388608
      }
    }
  },
  "subprocess": {
    "elapsed_ms": 1438.8,
    "returncode": 0,
    "status": "ok",
    "stderr": "",
    "stdout": "subprocess-ok\n3.12.14"
  }
}

GitHub Copilot Harness - Runtime Probe

出力

Runtime Probe Skill を1回実行しました。生成された3ファイル(runtime_probe_report.json / runtime_probe_report.txt / runtime_probe_packages.txt)は添付として返却します。以下、観測値をそのまま報告します。

Runtime Probe メタ情報(実測)

  • バージョン: 1.0.0
  • 実行時刻(UTC): 2026-09-08T23:53:07.563395+00:00
  • 実行elapsed: 1432.8ms、PID: 155、実行時cwd: /app/skills/runtime-probe
  • temp_dir: /app/workspace

Python(実測)

  • 実装: CPython
  • バージョン: 3.12.14 (main, Aug 18 2026, 15:00:50) [GCC 13.2.0] / version_info [3, 12, 14, 'final', 0]
  • 実行パス(executable): /usr/bin/python
  • base_prefix / prefix: /usr
  • byteorder: little、maxsize: 9223372036854775807
  • default/filesystem/preferred encoding: すべて utf-8
  • sys.path:
    1. /app/skills/runtime-probe/scripts
    2. /usr/lib/python312.zip
    3. /usr/lib/python3.12
    4. /usr/lib/python3.12/lib-dynload
    5. /usr/lib/python3.12/site-packages

OS / Platform(実測)

  • system: Linux、release: 6.12.8+、version: #1 SMP Thu Jul 30 23:01:31 UTC 2026
  • platform文字列: Linux-6.12.8+-x86_64-with-glibc2.38
  • machine/processor: x86_64
  • architecture: ["64bit", ""]
  • libc_ver: ["glibc", "2.38"]
  • uname: ["Linux", "adc-sandbox", "6.12.8+", "#1 SMP Thu Jul 30 23:01:31 UTC 2026", "x86_64", "x86_64"]

インストール済みPythonパッケージ(実測)

  • 件数: 100
  • SHA-256: ad3d24ef1d64a75d3e5c8c3f636716a8bc6b5bd28ebef8d2a258dad9120a0bed
  • 重複正規化名: なし({})
  • 全件一覧は runtime_probe_packages.txt に格納(添付)。主な内訳例(全リストはファイル参照): annotated-doc 0.0.5, anyio 4.14.2, beautifulsoup4 4.15.0, certifi 2026.7.22, cryptography 50.0.0, fastapi 0.141.1, fastembed 0.8.0, huggingface-hub 1.28.0, matplotlib 3.11.1, numpy 2.5.2, onnxruntime 1.29.0, openpyxl 3.1.5, pandas 3.0.5, pillow 12.3.0, plotly 6.9.0, pydantic 2.14.0b1, python-docx 1.2.0, python-pptx 1.0.2, pyyaml 6.0.3, reportlab 5.0.1, requests 2.34.2, seaborn 0.13.2, xlsxwriter 3.2.9 ほか計100件。

主要コマンド(実測、可否/パス/バージョン)

コマンド 有無 パス バージョン
bash あり /usr/bin/bash GNU bash, version 5.2.15(1)-release (x86_64-pc-linux-gnu)
curl あり /usr/bin/curl curl 8.11.1 (libcurl/8.11.1 OpenSSL/3.3.7)
node あり /usr/bin/node v24.18.1
python あり /usr/bin/python Python 3.12.14
python3 あり /usr/bin/python3 Python 3.12.14
sh あり /usr/bin/sh sh-ok
clang なし - -
dotnet なし - -
gcc なし - -
git なし - -
java なし - -
npm なし - -
npx なし - -
pip なし - -
pip3 なし - -
wget なし - -

主要ライブラリ import 結果(実測)

成功(status: ok): - PIL 12.3.0、bs4 4.15.0、cryptography 50.0.0、docx 1.2.0、jinja2 3.1.6、lxml 6.1.2、matplotlib 3.11.1、numpy 2.5.2、openpyxl 3.1.5、pandas 3.0.5、pptx 1.0.2、pydantic 2.14.0b1、reportlab 5.0.1、requests 2.34.2、yaml 6.0.3

失敗(status: error / ModuleNotFoundError): - fitz: No module named 'fitz' - scipy: No module named 'scipy' - sklearn: No module named 'sklearn'

ファイルシステム 読み書き結果(実測)

  • /app/skills/runtime-probe: status error(PermissionError: [Errno 13] Permission denied、テンポラリファイル作成不可)
  • /app/workspace: status ok、write: true、read: true、sha256_matches: true、bytes: 28、cleanup: true
  • 注: プローブスクリプトは /mnt/data を検査対象にしておらず、/app/skills/runtime-probe と /app/workspace の2箇所を検証しています。

subprocess 実行結果(実測)

  • status: ok、returncode: 0、elapsed_ms: 12.0
  • stdout: subprocess-ok / 3.12.14、stderr: なし

DNS / ネットワーク接続 検証結果(実測)

  • DNS(example.com): status ok、returncode 0、elapsed_ms 134.7
    • 解決アドレス: 104.20.23.154, 172.66.147.243, 2606:4700:10::6814:179a, 2606:4700:10::ac42:93f3
  • TCP接続(example.com:443): status ok、elapsed_ms 5.9

CPU数 / リソース制限(実測)

  • cpu_count: 1
  • cwd disk usage: total 1020702720 bytes, used 991232 bytes, free 949248000 bytes
  • posix rlimits:
    • RLIMIT_AS: soft -1 / hard -1
    • RLIMIT_CPU: soft -1 / hard -1
    • RLIMIT_DATA: soft -1 / hard -1
    • RLIMIT_FSIZE: soft -1 / hard -1
    • RLIMIT_NOFILE: soft 1024 / hard 4096
    • RLIMIT_NPROC: soft 256 / hard 256
    • RLIMIT_STACK: soft 8388608 / hard -1

Skill package 配置パス(実測)

  • package_root: /app/skills/runtime-probe
  • package_root_entries: SKILL.md, resources, scripts
  • script_path: /app/skills/runtime-probe/scripts/runtime_probe.py
  • marker_path: /app/skills/runtime-probe/resources/probe_marker.txt
  • marker_sha256: 17186346e17afd81a458b149b66c465943d88a6b55c23003eef842124795b151
  • marker_size: 24、marker_text: RUNTIME_PROBE_MARKER_v1

環境変数(実測、名称のみ)

  • variable_count: 15
  • 変数名一覧: DRACARYS_FASTEMBED_CACHE, DRACARYS_PERSISTENT_ROOT, HF_HOME, HOME, LC_CTYPE, LOGNAME, OLDPWD, PATH, PWD, REQUESTS_CA_BUNDLE, SHLVL, SSL_CERT_FILE, TMPDIR, USER, _
  • (値は取得ポリシー上非開示)

プロセスアイデンティティ(実測、参考情報)

  • uid/euid: 999、gid/egid: 999

実測 vs 推定の切り分け

  • 上記の数値・文字列・パス・ステータス・SHA-256はすべてスクリプトの直接出力(実測値)であり、丸め・補正は行っていません。
  • 推定として述べられる事項: なし(本タスクでは他環境との比較・評価は行わず、観測結果の報告のみ)。

添付ファイル: runtime_probe_report.json、runtime_probe_report.txt、runtime_probe_packages.txt(全100パッケージの完全な一覧を含む)。

runtime_probe_packages.txt

annotated-doc==0.0.5
annotated-types==0.8.0
anyio==4.14.2
beautifulsoup4==4.15.0
certifi==2026.7.22
cffi==2.1.1
charset-normalizer==3.5.1
click==8.4.2
cobble==0.1.4
contourpy==1.3.3
cryptography==50.0.0
cycler==0.12.1
defusedxml==0.7.1
dracarys==0.1.0
et-xmlfile==2.0.0
fastapi==0.141.1
fastembed==0.8.0
filelock==3.32.4
flatbuffers==25.12.19
fonttools==4.63.0
fsspec==2026.7.0
github-copilot-sdk==1.0.11
grpcio-tools==1.80.0
grpcio==1.83.0
h11==0.16.0
hf-xet==1.6.0
httpcore==1.0.9
httptools==0.8.0
httpx==0.28.1
huggingface-hub==1.28.0
idna==3.19
jinja2==3.1.6
kiwisolver==1.5.0
loguru==0.7.3
lxml==6.1.2
magika==0.6.3
mammoth==1.12.1
markdownify==1.2.3
markitdown==0.1.7
markupsafe==3.0.3
matplotlib==3.11.1
mmh3==5.2.1
mpmath==1.3.0
narwhals==2.25.0
noto-cjk-fonts==1.0.0
numpy==2.5.2
onnxruntime==1.29.0
opencv-python-headless==5.0.0.93
openpyxl==3.1.5
orjson==3.12.0
packaging==26.3
pandas==3.0.5
pdfminer.six==20260107
pdfplumber==0.11.10
pillow==12.3.0
plotly==6.9.0
protobuf==6.33.6
py-rust-stemmers==0.1.8
pyarrow==25.0.1
pyclipper==1.4.0
pycparser==3.0
pydantic-core==2.48.0
pydantic-settings==2.15.0
pydantic==2.14.0b1
pyjwt==2.13.0
pyparsing==3.3.2
pypdf==6.16.2
pypdfium2==5.13.0
python-dateutil==2.9.0.post0
python-docx==1.2.0
python-dotenv==1.2.3
python-pptx==1.0.2
pyyaml==6.0.3
rank-bm25==0.2.2
rapidocr-onnxruntime==1.4.4
regex==2026.7.19
reportlab==5.0.1
requests==2.34.2
seaborn==0.13.2
setuptools==84.0.0
shapely==2.1.2
six==1.17.0
soupsieve==2.9.2
starlette==1.6.0
sympy==1.14.0
tabulate==0.10.0
tiktoken==0.14.0
tokenizers==0.23.1
tqdm==4.70.0
truststore==0.10.4
typing-extensions==4.16.0
typing-inspection==0.4.4
tzdata==2026.3
urllib3==2.7.0
uvicorn==0.52.4
uvloop==0.22.1
watchfiles==1.2.0
websockets==17.0.1
wheel==0.43.0
xlsxwriter==3.2.9

runtime_probe_report.txt

Runtime Probe v1.0.0
timestamp_utc: 2026-09-08T23:53:07.563395+00:00
elapsed_ms: 1432.8

[Python]
implementation: CPython
version: 3.12.14 (main, Aug 18 2026, 15:00:50) [GCC 13.2.0]
executable: /usr/bin/python

[Platform]
platform: Linux-6.12.8+-x86_64-with-glibc2.38
system: Linux
release: 6.12.8+
machine: x86_64

[Installed Python distributions]
count: 100
sha256: ad3d24ef1d64a75d3e5c8c3f636716a8bc6b5bd28ebef8d2a258dad9120a0bed
full_list_file: runtime_probe_packages.txt

[Major imports]
numpy: ok version=2.5.2 error=None
pandas: ok version=3.0.5 error=None
openpyxl: ok version=3.1.5 error=None
pptx: ok version=1.0.2 error=None
fitz: error version=None error=No module named 'fitz'
PIL: ok version=12.3.0 error=None
matplotlib: ok version=3.11.1 error=None
scipy: error version=None error=No module named 'scipy'
sklearn: error version=None error=No module named 'sklearn'
requests: ok version=2.34.2 error=None
yaml: ok version=6.0.3 error=None
jinja2: ok version=3.1.6 error=None
lxml: ok version=6.1.2 error=None
bs4: ok version=4.15.0 error=None
docx: ok version=1.2.0 error=None
reportlab: ok version=5.0.1 error=None
pydantic: ok version=2.14.0b1 error=None
cryptography: ok version=50.0.0 error=None

[Commands]
python: available=True path=/usr/bin/python status=ok stdout=Python 3.12.14 stderr=
python3: available=True path=/usr/bin/python3 status=ok stdout=Python 3.12.14 stderr=
pip: available=False path=None status=None stdout=None stderr=None
pip3: available=False path=None status=None stdout=None stderr=None
node: available=True path=/usr/bin/node status=ok stdout=v24.18.1 stderr=
npm: available=False path=None status=None stdout=None stderr=None
npx: available=False path=None status=None stdout=None stderr=None
bash: available=True path=/usr/bin/bash status=ok stdout=GNU bash, version 5.2.15(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. stderr=
sh: available=True path=/usr/bin/sh status=ok stdout=sh-ok stderr=
git: available=False path=None status=None stdout=None stderr=None
curl: available=True path=/usr/bin/curl status=ok stdout=curl 8.11.1 (x86_64-pc-linux-gnu) libcurl/8.11.1 OpenSSL/3.3.7 zlib/1.3.2 zstd/1.5.5 libssh2/1.11.1 nghttp2/1.61.0
Release-Date: 2024-12-11
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS GSS-API HSTS HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz NTLM SPNEGO SSL threadsafe TLS-SRP UnixSockets zstd stderr=
wget: available=False path=None status=None stdout=None stderr=None
java: available=False path=None status=None stdout=None stderr=None
dotnet: available=False path=None status=None stdout=None stderr=None
gcc: available=False path=None status=None stdout=None stderr=None
clang: available=False path=None status=None stdout=None stderr=None

[Packaged resource]
{"marker_path": "/app/skills/runtime-probe/resources/probe_marker.txt", "marker_sha256": "17186346e17afd81a458b149b66c465943d88a6b55c23003eef842124795b151", "marker_size": 24, "marker_text": "RUNTIME_PROBE_MARKER_v1", "package_root": "/app/skills/runtime-probe", "package_root_entries": ["SKILL.md", "resources", "scripts"], "script_path": "/app/skills/runtime-probe/scripts/runtime_probe.py", "status": "ok"}

[Filesystem]
{"/app/skills/runtime-probe": {"base": "/app/skills/runtime-probe", "cleanup": true, "error": "[Errno 13] Permission denied: '/app/skills/runtime-probe/runtime_probe_155_1788911588735.tmp'", "error_type": "PermissionError", "status": "error"}, "/app/workspace": {"base": "/app/workspace", "bytes": 28, "cleanup": true, "read": true, "sha256_matches": true, "status": "ok", "write": true}}

[Subprocess]
{"elapsed_ms": 12.0, "returncode": 0, "status": "ok", "stderr": "", "stdout": "subprocess-ok\n3.12.14"}

[Network]
{"dns_example_com": {"addresses": ["104.20.23.154", "172.66.147.243", "2606:4700:10::6814:179a", "2606:4700:10::ac42:93f3"], "elapsed_ms": 134.7, "host": "example.com", "returncode": 0, "status": "ok", "stderr": "", "stdout": "[\"104.20.23.154\", \"172.66.147.243\", \"2606:4700:10::6814:179a\", \"2606:4700:10::ac42:93f3\"]"}, "tcp_example_com_443": {"elapsed_ms": 5.9, "host": "example.com", "port": 443, "status": "ok"}}

[Resources]
{"cpu_count": 1, "cwd_disk_usage_bytes": {"free": 949248000, "total": 1020702720, "used": 991232}, "posix_rlimits": {"RLIMIT_AS": {"hard": -1, "soft": -1}, "RLIMIT_CPU": {"hard": -1, "soft": -1}, "RLIMIT_DATA": {"hard": -1, "soft": -1}, "RLIMIT_FSIZE": {"hard": -1, "soft": -1}, "RLIMIT_NOFILE": {"hard": 4096, "soft": 1024}, "RLIMIT_NPROC": {"hard": 256, "soft": 256}, "RLIMIT_STACK": {"hard": -1, "soft": 8388608}}}

[Environment variable names only]
count: 15
DRACARYS_FASTEMBED_CACHE, DRACARYS_PERSISTENT_ROOT, HF_HOME, HOME, LC_CTYPE, LOGNAME, OLDPWD, PATH, PWD, REQUESTS_CA_BUNDLE, SHLVL, SSL_CERT_FILE, TMPDIR, USER, _

runtime_probe_report.json

{
  "commands": {
    "bash": {
      "available": true,
      "path": "/usr/bin/bash",
      "version_probe": {
        "elapsed_ms": 2.4,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "GNU bash, version 5.2.15(1)-release (x86_64-pc-linux-gnu)\nCopyright (C) 2022 Free Software Foundation, Inc.\nLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n\nThis is free software; you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law."
      }
    },
    "clang": {
      "available": false,
      "path": null
    },
    "curl": {
      "available": true,
      "path": "/usr/bin/curl",
      "version_probe": {
        "elapsed_ms": 8.4,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "curl 8.11.1 (x86_64-pc-linux-gnu) libcurl/8.11.1 OpenSSL/3.3.7 zlib/1.3.2 zstd/1.5.5 libssh2/1.11.1 nghttp2/1.61.0\nRelease-Date: 2024-12-11\nProtocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp ws wss\nFeatures: alt-svc AsynchDNS GSS-API HSTS HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz NTLM SPNEGO SSL threadsafe TLS-SRP UnixSockets zstd"
      }
    },
    "dotnet": {
      "available": false,
      "path": null
    },
    "gcc": {
      "available": false,
      "path": null
    },
    "git": {
      "available": false,
      "path": null
    },
    "java": {
      "available": false,
      "path": null
    },
    "node": {
      "available": true,
      "path": "/usr/bin/node",
      "version_probe": {
        "elapsed_ms": 34.4,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "v24.18.1"
      }
    },
    "npm": {
      "available": false,
      "path": null
    },
    "npx": {
      "available": false,
      "path": null
    },
    "pip": {
      "available": false,
      "path": null
    },
    "pip3": {
      "available": false,
      "path": null
    },
    "python": {
      "available": true,
      "path": "/usr/bin/python",
      "version_probe": {
        "elapsed_ms": 2.0,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "Python 3.12.14"
      }
    },
    "python3": {
      "available": true,
      "path": "/usr/bin/python3",
      "version_probe": {
        "elapsed_ms": 2.8,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "Python 3.12.14"
      }
    },
    "sh": {
      "available": true,
      "path": "/usr/bin/sh",
      "version_probe": {
        "elapsed_ms": 2.5,
        "returncode": 0,
        "status": "ok",
        "stderr": "",
        "stdout": "sh-ok"
      }
    },
    "wget": {
      "available": false,
      "path": null
    }
  },
  "environment": {
    "variable_count": 15,
    "variable_names_only": [
      "DRACARYS_FASTEMBED_CACHE",
      "DRACARYS_PERSISTENT_ROOT",
      "HF_HOME",
      "HOME",
      "LC_CTYPE",
      "LOGNAME",
      "OLDPWD",
      "PATH",
      "PWD",
      "REQUESTS_CA_BUNDLE",
      "SHLVL",
      "SSL_CERT_FILE",
      "TMPDIR",
      "USER",
      "_"
    ]
  },
  "filesystem": {
    "/app/skills/runtime-probe": {
      "base": "/app/skills/runtime-probe",
      "cleanup": true,
      "error": "[Errno 13] Permission denied: '/app/skills/runtime-probe/runtime_probe_155_1788911588735.tmp'",
      "error_type": "PermissionError",
      "status": "error"
    },
    "/app/workspace": {
      "base": "/app/workspace",
      "bytes": 28,
      "cleanup": true,
      "read": true,
      "sha256_matches": true,
      "status": "ok",
      "write": true
    }
  },
  "major_imports": {
    "PIL": {
      "elapsed_ms": 0.0,
      "file": "/usr/lib/python3.12/site-packages/PIL/__init__.py",
      "status": "ok",
      "version": "12.3.0"
    },
    "bs4": {
      "elapsed_ms": 27.3,
      "file": "/usr/lib/python3.12/site-packages/bs4/__init__.py",
      "status": "ok",
      "version": "4.15.0"
    },
    "cryptography": {
      "elapsed_ms": 0.3,
      "file": "/usr/lib/python3.12/site-packages/cryptography/__init__.py",
      "status": "ok",
      "version": "50.0.0"
    },
    "docx": {
      "elapsed_ms": 43.7,
      "file": "/usr/lib/python3.12/site-packages/docx/__init__.py",
      "status": "ok",
      "version": "1.2.0"
    },
    "fitz": {
      "elapsed_ms": 0.1,
      "error": "No module named 'fitz'",
      "error_type": "ModuleNotFoundError",
      "status": "error"
    },
    "jinja2": {
      "elapsed_ms": 52.8,
      "file": "/usr/lib/python3.12/site-packages/jinja2/__init__.py",
      "status": "ok",
      "version": "3.1.6"
    },
    "lxml": {
      "elapsed_ms": 0.0,
      "file": "/usr/lib/python3.12/site-packages/lxml/__init__.py",
      "status": "ok",
      "version": "6.1.2"
    },
    "matplotlib": {
      "elapsed_ms": 129.6,
      "file": "/usr/lib/python3.12/site-packages/matplotlib/__init__.py",
      "status": "ok",
      "version": "3.11.1"
    },
    "numpy": {
      "elapsed_ms": 47.6,
      "file": "/usr/lib/python3.12/site-packages/numpy/__init__.py",
      "status": "ok",
      "version": "2.5.2"
    },
    "openpyxl": {
      "elapsed_ms": 146.3,
      "file": "/usr/lib/python3.12/site-packages/openpyxl/__init__.py",
      "status": "ok",
      "version": "3.1.5"
    },
    "pandas": {
      "elapsed_ms": 490.1,
      "file": "/usr/lib/python3.12/site-packages/pandas/__init__.py",
      "status": "ok",
      "version": "3.0.5"
    },
    "pptx": {
      "elapsed_ms": 90.4,
      "file": "/usr/lib/python3.12/site-packages/pptx/__init__.py",
      "status": "ok",
      "version": "1.0.2"
    },
    "pydantic": {
      "elapsed_ms": 17.1,
      "file": "/usr/lib/python3.12/site-packages/pydantic/__init__.py",
      "status": "ok",
      "version": "2.14.0b1"
    },
    "reportlab": {
      "elapsed_ms": 0.6,
      "file": "/usr/lib/python3.12/site-packages/reportlab/__init__.py",
      "status": "ok",
      "version": "5.0.1"
    },
    "requests": {
      "elapsed_ms": 56.6,
      "file": "/usr/lib/python3.12/site-packages/requests/__init__.py",
      "status": "ok",
      "version": "2.34.2"
    },
    "scipy": {
      "elapsed_ms": 0.1,
      "error": "No module named 'scipy'",
      "error_type": "ModuleNotFoundError",
      "status": "error"
    },
    "sklearn": {
      "elapsed_ms": 0.1,
      "error": "No module named 'sklearn'",
      "error_type": "ModuleNotFoundError",
      "status": "error"
    },
    "yaml": {
      "elapsed_ms": 13.2,
      "file": "/usr/lib/python3.12/site-packages/yaml/__init__.py",
      "status": "ok",
      "version": "6.0.3"
    }
  },
  "network": {
    "dns_example_com": {
      "addresses": [
        "104.20.23.154",
        "172.66.147.243",
        "2606:4700:10::6814:179a",
        "2606:4700:10::ac42:93f3"
      ],
      "elapsed_ms": 134.7,
      "host": "example.com",
      "returncode": 0,
      "status": "ok",
      "stderr": "",
      "stdout": "[\"104.20.23.154\", \"172.66.147.243\", \"2606:4700:10::6814:179a\", \"2606:4700:10::ac42:93f3\"]"
    },
    "tcp_example_com_443": {
      "elapsed_ms": 5.9,
      "host": "example.com",
      "port": 443,
      "status": "ok"
    }
  },
  "output": {
    "directory": "/app/workspace",
    "files": [
      "/app/workspace/runtime_probe_report.json",
      "/app/workspace/runtime_probe_report.txt",
      "/app/workspace/runtime_probe_packages.txt"
    ],
    "write_probe_errors": [
      {
        "directory": "/app/skills/runtime-probe",
        "error": "[Errno 13] Permission denied: '/app/skills/runtime-probe/.runtime_probe_write_test_155'",
        "error_type": "PermissionError"
      }
    ]
  },
  "packaged_resource": {
    "marker_path": "/app/skills/runtime-probe/resources/probe_marker.txt",
    "marker_sha256": "17186346e17afd81a458b149b66c465943d88a6b55c23003eef842124795b151",
    "marker_size": 24,
    "marker_text": "RUNTIME_PROBE_MARKER_v1",
    "package_root": "/app/skills/runtime-probe",
    "package_root_entries": [
      "SKILL.md",
      "resources",
      "scripts"
    ],
    "script_path": "/app/skills/runtime-probe/scripts/runtime_probe.py",
    "status": "ok"
  },
  "packages": {
    "count": 100,
    "duplicate_normalized_names": {},
    "sha256": "ad3d24ef1d64a75d3e5c8c3f636716a8bc6b5bd28ebef8d2a258dad9120a0bed"
  },
  "platform": {
    "architecture": [
      "64bit",
      ""
    ],
    "libc_ver": [
      "glibc",
      "2.38"
    ],
    "machine": "x86_64",
    "platform": "Linux-6.12.8+-x86_64-with-glibc2.38",
    "processor": "x86_64",
    "release": "6.12.8+",
    "system": "Linux",
    "uname": [
      "Linux",
      "adc-sandbox",
      "6.12.8+",
      "#1 SMP Thu Jul 30 23:01:31 UTC 2026",
      "x86_64",
      "x86_64"
    ],
    "version": "#1 SMP Thu Jul 30 23:01:31 UTC 2026"
  },
  "probe": {
    "cwd": "/app/skills/runtime-probe",
    "elapsed_ms": 1432.8,
    "pid": 155,
    "temp_dir": "/app/workspace",
    "timestamp_utc": "2026-09-08T23:53:07.563395+00:00",
    "version": "1.0.0"
  },
  "process_identity": {
    "egid": 999,
    "euid": 999,
    "gid": 999,
    "uid": 999
  },
  "python": {
    "base_prefix": "/usr",
    "byteorder": "little",
    "default_encoding": "utf-8",
    "executable": "/usr/bin/python",
    "filesystem_encoding": "utf-8",
    "implementation": "CPython",
    "maxsize": 9223372036854775807,
    "preferred_encoding": "utf-8",
    "prefix": "/usr",
    "sys_path": [
      "/app/skills/runtime-probe/scripts",
      "/usr/lib/python312.zip",
      "/usr/lib/python3.12",
      "/usr/lib/python3.12/lib-dynload",
      "/usr/lib/python3.12/site-packages"
    ],
    "version": "3.12.14 (main, Aug 18 2026, 15:00:50) [GCC 13.2.0]",
    "version_info": [
      3,
      12,
      14,
      "final",
      0
    ]
  },
  "resources": {
    "cpu_count": 1,
    "cwd_disk_usage_bytes": {
      "free": 949248000,
      "total": 1020702720,
      "used": 991232
    },
    "posix_rlimits": {
      "RLIMIT_AS": {
        "hard": -1,
        "soft": -1
      },
      "RLIMIT_CPU": {
        "hard": -1,
        "soft": -1
      },
      "RLIMIT_DATA": {
        "hard": -1,
        "soft": -1
      },
      "RLIMIT_FSIZE": {
        "hard": -1,
        "soft": -1
      },
      "RLIMIT_NOFILE": {
        "hard": 4096,
        "soft": 1024
      },
      "RLIMIT_NPROC": {
        "hard": 256,
        "soft": 256
      },
      "RLIMIT_STACK": {
        "hard": -1,
        "soft": 8388608
      }
    }
  },
  "subprocess": {
    "elapsed_ms": 12.0,
    "returncode": 0,
    "status": "ok",
    "stderr": "",
    "stdout": "subprocess-ok\n3.12.14"
  }
}

Agent Builder - GitHub Library Compatibility Probe

出力

GitHub Library Compatibility Probe 実行結果

実行条件

  • GitHub Library Compatibility Probe Skill のプローブ本体を1回だけ実行
  • パッケージのインストール: なし
  • 構成変更: なし
  • ネットワークアクセス: なし
  • Skill 以外の方法による追加調査: なし
  • 判定方法:
    • importlib.metadata による distribution metadata の確認
    • 各候補 module に対する importlib.util.find_spec
    • 各候補 module に対する実際の importlib.import_module

集計

項目 件数
対象数 23
import できた数 0
import できなかった数 22
import module を直接持たないため判定保留となった数 1

観測結果

distribution 名 GitHub Copilot Harness で観測された version Agent Builder の distribution metadata 確認した import module 名 find_spec / import 結果 Agent Builder で取得できた module version module file path エラー内容
cobble 0.1.4 なし cobble find_spec: なし / import: 失敗 取得不可 なし No module named 'cobble'
dracarys 0.1.0 なし dracarys find_spec: なし / import: 失敗 取得不可 なし No module named 'dracarys'
fastembed 0.8.0 なし fastembed find_spec: なし / import: 失敗 取得不可 なし No module named 'fastembed'
github-copilot-sdk 1.0.11 なし github_copilot_sdk find_spec: なし / import: 失敗 取得不可 なし No module named 'github_copilot_sdk'
github-copilot-sdk 1.0.11 なし github.copilot find_spec: なし / import: 失敗 取得不可 なし No module named 'github'
github-copilot-sdk 1.0.11 なし copilot find_spec: なし / import: 失敗 取得不可 なし No module named 'copilot'
grpcio-tools 1.80.0 なし grpc_tools find_spec: なし / import: 失敗 取得不可 なし No module named 'grpc_tools'
httptools 0.8.0 なし httptools find_spec: なし / import: 失敗 取得不可 なし No module named 'httptools'
mammoth 1.12.1 なし mammoth find_spec: なし / import: 失敗 取得不可 なし No module named 'mammoth'
mmh3 5.2.1 なし mmh3 find_spec: なし / import: 失敗 取得不可 なし No module named 'mmh3'
mpmath 1.3.0 なし mpmath find_spec: なし / import: 失敗 取得不可 なし No module named 'mpmath'
noto-cjk-fonts 1.0.0 なし 候補なし direct import の確認対象なし 該当なし 該当なし なし。data/resource-only distribution の可能性があるため判定保留
plotly 6.9.0 なし plotly find_spec: なし / import: 失敗 取得不可 なし No module named 'plotly'
py-rust-stemmers 0.1.8 なし rust_stemmers find_spec: なし / import: 失敗 取得不可 なし No module named 'rust_stemmers'
py-rust-stemmers 0.1.8 なし py_rust_stemmers find_spec: なし / import: 失敗 取得不可 なし No module named 'py_rust_stemmers'
pyclipper 1.4.0 なし pyclipper find_spec: なし / import: 失敗 取得不可 なし No module named 'pyclipper'
rank-bm25 0.2.2 なし rank_bm25 find_spec: なし / import: 失敗 取得不可 なし No module named 'rank_bm25'
rapidocr-onnxruntime 1.4.4 なし rapidocr_onnxruntime find_spec: なし / import: 失敗 取得不可 なし No module named 'rapidocr_onnxruntime'
rapidocr-onnxruntime 1.4.4 なし rapidocr find_spec: なし / import: 失敗 取得不可 なし No module named 'rapidocr'
seaborn 0.13.2 なし seaborn find_spec: なし / import: 失敗 取得不可 なし No module named 'seaborn'
sympy 1.14.0 なし sympy find_spec: なし / import: 失敗 取得不可 なし No module named 'sympy'
tokenizers 0.23.1 なし tokenizers find_spec: なし / import: 失敗 取得不可 なし No module named 'tokenizers'
truststore 0.10.4 なし truststore find_spec: なし / import: 失敗 取得不可 なし No module named 'truststore'
uvloop 0.22.1 なし uvloop find_spec: なし / import: 失敗 取得不可 なし No module named 'uvloop'
watchfiles 1.2.0 なし watchfiles find_spec: なし / import: 失敗 取得不可 なし No module named 'watchfiles'
websockets 17.0.1 なし websockets find_spec: なし / import: 失敗 取得不可 なし No module named 'websockets'
wheel 0.43.0 なし wheel find_spec: なし / import: 失敗 取得不可 なし No module named 'wheel'

観測からの推定

  1. 22個の distribution については、Agent Builder の distribution metadata が存在しないだけでなく、指定された候補 module の find_spec および実際の import にも成功しなかった。

  2. このため、確認対象となった22個の distribution は、現在の Agent Builder Custom Skill 実行環境から利用可能とは判断できない。

  3. noto-cjk-fonts は候補 import module を直接持たない対象として定義されているため、import による利用可否の判定は保留となる。

  4. noto-cjk-fonts の distribution metadata が存在しないという結果だけでは、フォントファイルや関連リソースが実行環境内に存在しないとは断定できない。

  5. このプローブ結果だけを根拠として、GitHub Copilot Harness と Agent Builder の実装全体が同一、または異なると断定することはできない。

生成ファイル

  • library_compat_probe_report.json
  • library_compat_probe_report.txt

1.json

{
  "probe": {
    "version": "1.0.0",
    "timestamp_utc": "2026-09-09T00:10:53.819661+00:00",
    "python": "3.12.14 (main, Aug 18 2026, 15:00:50) [GCC 13.2.0]",
    "executable": "/opt/pyvenv/bin/python",
    "cwd": "/mnt/data",
    "sys_path": [
      "/home/oai/skills/appCatalog/T_c7684bbd-22d7-09b6-98d1-b677a58b0593/github-library-compat-probe/scripts",
      "/opt/oai-pkgs",
      "/usr/lib/python312.zip",
      "/usr/lib/python3.12",
      "/usr/lib/python3.12/lib-dynload",
      "/opt/pyvenv/lib/python3.12/site-packages"
    ]
  },
  "target_count": 23,
  "summary": {
    "importable_target_distributions": [],
    "importable_count": 0,
    "no_candidate_import_or_data_only": [
      "noto-cjk-fonts"
    ],
    "unavailable_by_candidate_import": [
      "cobble",
      "dracarys",
      "fastembed",
      "github-copilot-sdk",
      "grpcio-tools",
      "httptools",
      "mammoth",
      "mmh3",
      "mpmath",
      "plotly",
      "py-rust-stemmers",
      "pyclipper",
      "rank-bm25",
      "rapidocr-onnxruntime",
      "seaborn",
      "sympy",
      "tokenizers",
      "truststore",
      "uvloop",
      "watchfiles",
      "websockets",
      "wheel"
    ],
    "unavailable_count": 22
  },
  "targets": {
    "cobble": {
      "github_copilot_harness_observed_version": "0.1.4",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for cobble"
      },
      "candidate_modules": [
        "cobble"
      ],
      "module_probes": [
        {
          "module": "cobble",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'cobble'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "dracarys": {
      "github_copilot_harness_observed_version": "0.1.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for dracarys"
      },
      "candidate_modules": [
        "dracarys"
      ],
      "module_probes": [
        {
          "module": "dracarys",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'dracarys'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "fastembed": {
      "github_copilot_harness_observed_version": "0.8.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for fastembed"
      },
      "candidate_modules": [
        "fastembed"
      ],
      "module_probes": [
        {
          "module": "fastembed",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'fastembed'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "github-copilot-sdk": {
      "github_copilot_harness_observed_version": "1.0.11",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for github-copilot-sdk"
      },
      "candidate_modules": [
        "github_copilot_sdk",
        "github.copilot",
        "copilot"
      ],
      "module_probes": [
        {
          "module": "github_copilot_sdk",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'github_copilot_sdk'"
        },
        {
          "module": "github.copilot",
          "find_spec": false,
          "find_spec_error_type": "ModuleNotFoundError",
          "find_spec_error": "No module named 'github'",
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'github'"
        },
        {
          "module": "copilot",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'copilot'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/opt/pyvenv/lib/python3.12/site-packages/PIL",
        "/opt/pyvenv/lib/python3.12/site-packages/git"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "grpcio-tools": {
      "github_copilot_harness_observed_version": "1.80.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for grpcio-tools"
      },
      "candidate_modules": [
        "grpc_tools"
      ],
      "module_probes": [
        {
          "module": "grpc_tools",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'grpc_tools'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/opt/pyvenv/lib/python3.12/site-packages/grpc"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "httptools": {
      "github_copilot_harness_observed_version": "0.8.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for httptools"
      },
      "candidate_modules": [
        "httptools"
      ],
      "module_probes": [
        {
          "module": "httptools",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'httptools'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/usr/lib/python3.12/http"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "mammoth": {
      "github_copilot_harness_observed_version": "1.12.1",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for mammoth"
      },
      "candidate_modules": [
        "mammoth"
      ],
      "module_probes": [
        {
          "module": "mammoth",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'mammoth'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "mmh3": {
      "github_copilot_harness_observed_version": "5.2.1",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for mmh3"
      },
      "candidate_modules": [
        "mmh3"
      ],
      "module_probes": [
        {
          "module": "mmh3",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'mmh3'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "mpmath": {
      "github_copilot_harness_observed_version": "1.3.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for mpmath"
      },
      "candidate_modules": [
        "mpmath"
      ],
      "module_probes": [
        {
          "module": "mpmath",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'mpmath'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "noto-cjk-fonts": {
      "github_copilot_harness_observed_version": "1.0.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for noto-cjk-fonts"
      },
      "candidate_modules": [],
      "module_probes": [],
      "no_direct_import_expected": true,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "plotly": {
      "github_copilot_harness_observed_version": "6.9.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for plotly"
      },
      "candidate_modules": [
        "plotly"
      ],
      "module_probes": [
        {
          "module": "plotly",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'plotly'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "py-rust-stemmers": {
      "github_copilot_harness_observed_version": "0.1.8",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for py-rust-stemmers"
      },
      "candidate_modules": [
        "rust_stemmers",
        "py_rust_stemmers"
      ],
      "module_probes": [
        {
          "module": "rust_stemmers",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'rust_stemmers'"
        },
        {
          "module": "py_rust_stemmers",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'py_rust_stemmers'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "pyclipper": {
      "github_copilot_harness_observed_version": "1.4.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for pyclipper"
      },
      "candidate_modules": [
        "pyclipper"
      ],
      "module_probes": [
        {
          "module": "pyclipper",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'pyclipper'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "rank-bm25": {
      "github_copilot_harness_observed_version": "0.2.2",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for rank-bm25"
      },
      "candidate_modules": [
        "rank_bm25"
      ],
      "module_probes": [
        {
          "module": "rank_bm25",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'rank_bm25'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "rapidocr-onnxruntime": {
      "github_copilot_harness_observed_version": "1.4.4",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for rapidocr-onnxruntime"
      },
      "candidate_modules": [
        "rapidocr_onnxruntime",
        "rapidocr"
      ],
      "module_probes": [
        {
          "module": "rapidocr_onnxruntime",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'rapidocr_onnxruntime'"
        },
        {
          "module": "rapidocr",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'rapidocr'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/opt/pyvenv/lib/python3.12/site-packages/onnxruntime"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "seaborn": {
      "github_copilot_harness_observed_version": "0.13.2",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for seaborn"
      },
      "candidate_modules": [
        "seaborn"
      ],
      "module_probes": [
        {
          "module": "seaborn",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'seaborn'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "sympy": {
      "github_copilot_harness_observed_version": "1.14.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for sympy"
      },
      "candidate_modules": [
        "sympy"
      ],
      "module_probes": [
        {
          "module": "sympy",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'sympy'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "tokenizers": {
      "github_copilot_harness_observed_version": "0.23.1",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for tokenizers"
      },
      "candidate_modules": [
        "tokenizers"
      ],
      "module_probes": [
        {
          "module": "tokenizers",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'tokenizers'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "truststore": {
      "github_copilot_harness_observed_version": "0.10.4",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for truststore"
      },
      "candidate_modules": [
        "truststore"
      ],
      "module_probes": [
        {
          "module": "truststore",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'truststore'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/usr/lib/python3.12/re"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "uvloop": {
      "github_copilot_harness_observed_version": "0.22.1",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for uvloop"
      },
      "candidate_modules": [
        "uvloop"
      ],
      "module_probes": [
        {
          "module": "uvloop",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'uvloop'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "watchfiles": {
      "github_copilot_harness_observed_version": "1.2.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for watchfiles"
      },
      "candidate_modules": [
        "watchfiles"
      ],
      "module_probes": [
        {
          "module": "watchfiles",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'watchfiles'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "websockets": {
      "github_copilot_harness_observed_version": "17.0.1",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for websockets"
      },
      "candidate_modules": [
        "websockets"
      ],
      "module_probes": [
        {
          "module": "websockets",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'websockets'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/opt/pyvenv/lib/python3.12/site-packages/websocket"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "wheel": {
      "github_copilot_harness_observed_version": "0.43.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for wheel"
      },
      "candidate_modules": [
        "wheel"
      ],
      "module_probes": [
        {
          "module": "wheel",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'wheel'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    }
  }
}

1 (1).json

{
  "probe": {
    "version": "1.0.0",
    "timestamp_utc": "2026-09-09T00:10:53.819661+00:00",
    "python": "3.12.14 (main, Aug 18 2026, 15:00:50) [GCC 13.2.0]",
    "executable": "/opt/pyvenv/bin/python",
    "cwd": "/mnt/data",
    "sys_path": [
      "/home/oai/skills/appCatalog/T_c7684bbd-22d7-09b6-98d1-b677a58b0593/github-library-compat-probe/scripts",
      "/opt/oai-pkgs",
      "/usr/lib/python312.zip",
      "/usr/lib/python3.12",
      "/usr/lib/python3.12/lib-dynload",
      "/opt/pyvenv/lib/python3.12/site-packages"
    ]
  },
  "target_count": 23,
  "summary": {
    "importable_target_distributions": [],
    "importable_count": 0,
    "no_candidate_import_or_data_only": [
      "noto-cjk-fonts"
    ],
    "unavailable_by_candidate_import": [
      "cobble",
      "dracarys",
      "fastembed",
      "github-copilot-sdk",
      "grpcio-tools",
      "httptools",
      "mammoth",
      "mmh3",
      "mpmath",
      "plotly",
      "py-rust-stemmers",
      "pyclipper",
      "rank-bm25",
      "rapidocr-onnxruntime",
      "seaborn",
      "sympy",
      "tokenizers",
      "truststore",
      "uvloop",
      "watchfiles",
      "websockets",
      "wheel"
    ],
    "unavailable_count": 22
  },
  "targets": {
    "cobble": {
      "github_copilot_harness_observed_version": "0.1.4",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for cobble"
      },
      "candidate_modules": [
        "cobble"
      ],
      "module_probes": [
        {
          "module": "cobble",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'cobble'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "dracarys": {
      "github_copilot_harness_observed_version": "0.1.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for dracarys"
      },
      "candidate_modules": [
        "dracarys"
      ],
      "module_probes": [
        {
          "module": "dracarys",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'dracarys'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "fastembed": {
      "github_copilot_harness_observed_version": "0.8.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for fastembed"
      },
      "candidate_modules": [
        "fastembed"
      ],
      "module_probes": [
        {
          "module": "fastembed",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'fastembed'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "github-copilot-sdk": {
      "github_copilot_harness_observed_version": "1.0.11",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for github-copilot-sdk"
      },
      "candidate_modules": [
        "github_copilot_sdk",
        "github.copilot",
        "copilot"
      ],
      "module_probes": [
        {
          "module": "github_copilot_sdk",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'github_copilot_sdk'"
        },
        {
          "module": "github.copilot",
          "find_spec": false,
          "find_spec_error_type": "ModuleNotFoundError",
          "find_spec_error": "No module named 'github'",
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'github'"
        },
        {
          "module": "copilot",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'copilot'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/opt/pyvenv/lib/python3.12/site-packages/PIL",
        "/opt/pyvenv/lib/python3.12/site-packages/git"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "grpcio-tools": {
      "github_copilot_harness_observed_version": "1.80.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for grpcio-tools"
      },
      "candidate_modules": [
        "grpc_tools"
      ],
      "module_probes": [
        {
          "module": "grpc_tools",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'grpc_tools'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/opt/pyvenv/lib/python3.12/site-packages/grpc"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "httptools": {
      "github_copilot_harness_observed_version": "0.8.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for httptools"
      },
      "candidate_modules": [
        "httptools"
      ],
      "module_probes": [
        {
          "module": "httptools",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'httptools'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/usr/lib/python3.12/http"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "mammoth": {
      "github_copilot_harness_observed_version": "1.12.1",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for mammoth"
      },
      "candidate_modules": [
        "mammoth"
      ],
      "module_probes": [
        {
          "module": "mammoth",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'mammoth'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "mmh3": {
      "github_copilot_harness_observed_version": "5.2.1",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for mmh3"
      },
      "candidate_modules": [
        "mmh3"
      ],
      "module_probes": [
        {
          "module": "mmh3",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'mmh3'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "mpmath": {
      "github_copilot_harness_observed_version": "1.3.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for mpmath"
      },
      "candidate_modules": [
        "mpmath"
      ],
      "module_probes": [
        {
          "module": "mpmath",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'mpmath'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "noto-cjk-fonts": {
      "github_copilot_harness_observed_version": "1.0.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for noto-cjk-fonts"
      },
      "candidate_modules": [],
      "module_probes": [],
      "no_direct_import_expected": true,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "plotly": {
      "github_copilot_harness_observed_version": "6.9.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for plotly"
      },
      "candidate_modules": [
        "plotly"
      ],
      "module_probes": [
        {
          "module": "plotly",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'plotly'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "py-rust-stemmers": {
      "github_copilot_harness_observed_version": "0.1.8",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for py-rust-stemmers"
      },
      "candidate_modules": [
        "rust_stemmers",
        "py_rust_stemmers"
      ],
      "module_probes": [
        {
          "module": "rust_stemmers",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'rust_stemmers'"
        },
        {
          "module": "py_rust_stemmers",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'py_rust_stemmers'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "pyclipper": {
      "github_copilot_harness_observed_version": "1.4.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for pyclipper"
      },
      "candidate_modules": [
        "pyclipper"
      ],
      "module_probes": [
        {
          "module": "pyclipper",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'pyclipper'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "rank-bm25": {
      "github_copilot_harness_observed_version": "0.2.2",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for rank-bm25"
      },
      "candidate_modules": [
        "rank_bm25"
      ],
      "module_probes": [
        {
          "module": "rank_bm25",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'rank_bm25'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "rapidocr-onnxruntime": {
      "github_copilot_harness_observed_version": "1.4.4",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for rapidocr-onnxruntime"
      },
      "candidate_modules": [
        "rapidocr_onnxruntime",
        "rapidocr"
      ],
      "module_probes": [
        {
          "module": "rapidocr_onnxruntime",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'rapidocr_onnxruntime'"
        },
        {
          "module": "rapidocr",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'rapidocr'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/opt/pyvenv/lib/python3.12/site-packages/onnxruntime"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "seaborn": {
      "github_copilot_harness_observed_version": "0.13.2",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for seaborn"
      },
      "candidate_modules": [
        "seaborn"
      ],
      "module_probes": [
        {
          "module": "seaborn",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'seaborn'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "sympy": {
      "github_copilot_harness_observed_version": "1.14.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for sympy"
      },
      "candidate_modules": [
        "sympy"
      ],
      "module_probes": [
        {
          "module": "sympy",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'sympy'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "tokenizers": {
      "github_copilot_harness_observed_version": "0.23.1",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for tokenizers"
      },
      "candidate_modules": [
        "tokenizers"
      ],
      "module_probes": [
        {
          "module": "tokenizers",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'tokenizers'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "truststore": {
      "github_copilot_harness_observed_version": "0.10.4",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for truststore"
      },
      "candidate_modules": [
        "truststore"
      ],
      "module_probes": [
        {
          "module": "truststore",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'truststore'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/usr/lib/python3.12/re"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "uvloop": {
      "github_copilot_harness_observed_version": "0.22.1",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for uvloop"
      },
      "candidate_modules": [
        "uvloop"
      ],
      "module_probes": [
        {
          "module": "uvloop",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'uvloop'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "watchfiles": {
      "github_copilot_harness_observed_version": "1.2.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for watchfiles"
      },
      "candidate_modules": [
        "watchfiles"
      ],
      "module_probes": [
        {
          "module": "watchfiles",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'watchfiles'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "websockets": {
      "github_copilot_harness_observed_version": "17.0.1",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for websockets"
      },
      "candidate_modules": [
        "websockets"
      ],
      "module_probes": [
        {
          "module": "websockets",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'websockets'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/opt/pyvenv/lib/python3.12/site-packages/websocket"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "wheel": {
      "github_copilot_harness_observed_version": "0.43.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for wheel"
      },
      "candidate_modules": [
        "wheel"
      ],
      "module_probes": [
        {
          "module": "wheel",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'wheel'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    }
  }
}

library_compat_probe_report.txt

GitHub Library Compatibility Probe v1.0.0
timestamp_utc: 2026-09-09T00:10:53.819661+00:00
target_count: 23
importable_count: 0
unavailable_count: 22
no_direct_import_expected_count: 1

[cobble==0.1.4]
distribution_metadata_present: False version=None error=No package metadata was found for cobble
candidate_modules: ['cobble']
  cobble: find_spec=False import_status=error module_version=None module_file=None error=No module named 'cobble'
matching_sys_path_entries: []
matching_top_level_modules: []

[dracarys==0.1.0]
distribution_metadata_present: False version=None error=No package metadata was found for dracarys
candidate_modules: ['dracarys']
  dracarys: find_spec=False import_status=error module_version=None module_file=None error=No module named 'dracarys'
matching_sys_path_entries: []
matching_top_level_modules: []

[fastembed==0.8.0]
distribution_metadata_present: False version=None error=No package metadata was found for fastembed
candidate_modules: ['fastembed']
  fastembed: find_spec=False import_status=error module_version=None module_file=None error=No module named 'fastembed'
matching_sys_path_entries: []
matching_top_level_modules: []

[github-copilot-sdk==1.0.11]
distribution_metadata_present: False version=None error=No package metadata was found for github-copilot-sdk
candidate_modules: ['github_copilot_sdk', 'github.copilot', 'copilot']
  github_copilot_sdk: find_spec=False import_status=error module_version=None module_file=None error=No module named 'github_copilot_sdk'
  github.copilot: find_spec=False import_status=error module_version=None module_file=None error=No module named 'github'
  copilot: find_spec=False import_status=error module_version=None module_file=None error=No module named 'copilot'
matching_sys_path_entries: ['/opt/pyvenv/lib/python3.12/site-packages/PIL', '/opt/pyvenv/lib/python3.12/site-packages/git']
matching_top_level_modules: []

[grpcio-tools==1.80.0]
distribution_metadata_present: False version=None error=No package metadata was found for grpcio-tools
candidate_modules: ['grpc_tools']
  grpc_tools: find_spec=False import_status=error module_version=None module_file=None error=No module named 'grpc_tools'
matching_sys_path_entries: ['/opt/pyvenv/lib/python3.12/site-packages/grpc']
matching_top_level_modules: []

[httptools==0.8.0]
distribution_metadata_present: False version=None error=No package metadata was found for httptools
candidate_modules: ['httptools']
  httptools: find_spec=False import_status=error module_version=None module_file=None error=No module named 'httptools'
matching_sys_path_entries: ['/usr/lib/python3.12/http']
matching_top_level_modules: []

[mammoth==1.12.1]
distribution_metadata_present: False version=None error=No package metadata was found for mammoth
candidate_modules: ['mammoth']
  mammoth: find_spec=False import_status=error module_version=None module_file=None error=No module named 'mammoth'
matching_sys_path_entries: []
matching_top_level_modules: []

[mmh3==5.2.1]
distribution_metadata_present: False version=None error=No package metadata was found for mmh3
candidate_modules: ['mmh3']
  mmh3: find_spec=False import_status=error module_version=None module_file=None error=No module named 'mmh3'
matching_sys_path_entries: []
matching_top_level_modules: []

[mpmath==1.3.0]
distribution_metadata_present: False version=None error=No package metadata was found for mpmath
candidate_modules: ['mpmath']
  mpmath: find_spec=False import_status=error module_version=None module_file=None error=No module named 'mpmath'
matching_sys_path_entries: []
matching_top_level_modules: []

[noto-cjk-fonts==1.0.0]
distribution_metadata_present: False version=None error=No package metadata was found for noto-cjk-fonts
candidate_modules: []
matching_sys_path_entries: []
matching_top_level_modules: []

[plotly==6.9.0]
distribution_metadata_present: False version=None error=No package metadata was found for plotly
candidate_modules: ['plotly']
  plotly: find_spec=False import_status=error module_version=None module_file=None error=No module named 'plotly'
matching_sys_path_entries: []
matching_top_level_modules: []

[py-rust-stemmers==0.1.8]
distribution_metadata_present: False version=None error=No package metadata was found for py-rust-stemmers
candidate_modules: ['rust_stemmers', 'py_rust_stemmers']
  rust_stemmers: find_spec=False import_status=error module_version=None module_file=None error=No module named 'rust_stemmers'
  py_rust_stemmers: find_spec=False import_status=error module_version=None module_file=None error=No module named 'py_rust_stemmers'
matching_sys_path_entries: []
matching_top_level_modules: []

[pyclipper==1.4.0]
distribution_metadata_present: False version=None error=No package metadata was found for pyclipper
candidate_modules: ['pyclipper']
  pyclipper: find_spec=False import_status=error module_version=None module_file=None error=No module named 'pyclipper'
matching_sys_path_entries: []
matching_top_level_modules: []

[rank-bm25==0.2.2]
distribution_metadata_present: False version=None error=No package metadata was found for rank-bm25
candidate_modules: ['rank_bm25']
  rank_bm25: find_spec=False import_status=error module_version=None module_file=None error=No module named 'rank_bm25'
matching_sys_path_entries: []
matching_top_level_modules: []

[rapidocr-onnxruntime==1.4.4]
distribution_metadata_present: False version=None error=No package metadata was found for rapidocr-onnxruntime
candidate_modules: ['rapidocr_onnxruntime', 'rapidocr']
  rapidocr_onnxruntime: find_spec=False import_status=error module_version=None module_file=None error=No module named 'rapidocr_onnxruntime'
  rapidocr: find_spec=False import_status=error module_version=None module_file=None error=No module named 'rapidocr'
matching_sys_path_entries: ['/opt/pyvenv/lib/python3.12/site-packages/onnxruntime']
matching_top_level_modules: []

[seaborn==0.13.2]
distribution_metadata_present: False version=None error=No package metadata was found for seaborn
candidate_modules: ['seaborn']
  seaborn: find_spec=False import_status=error module_version=None module_file=None error=No module named 'seaborn'
matching_sys_path_entries: []
matching_top_level_modules: []

[sympy==1.14.0]
distribution_metadata_present: False version=None error=No package metadata was found for sympy
candidate_modules: ['sympy']
  sympy: find_spec=False import_status=error module_version=None module_file=None error=No module named 'sympy'
matching_sys_path_entries: []
matching_top_level_modules: []

[tokenizers==0.23.1]
distribution_metadata_present: False version=None error=No package metadata was found for tokenizers
candidate_modules: ['tokenizers']
  tokenizers: find_spec=False import_status=error module_version=None module_file=None error=No module named 'tokenizers'
matching_sys_path_entries: []
matching_top_level_modules: []

[truststore==0.10.4]
distribution_metadata_present: False version=None error=No package metadata was found for truststore
candidate_modules: ['truststore']
  truststore: find_spec=False import_status=error module_version=None module_file=None error=No module named 'truststore'
matching_sys_path_entries: ['/usr/lib/python3.12/re']
matching_top_level_modules: []

[uvloop==0.22.1]
distribution_metadata_present: False version=None error=No package metadata was found for uvloop
candidate_modules: ['uvloop']
  uvloop: find_spec=False import_status=error module_version=None module_file=None error=No module named 'uvloop'
matching_sys_path_entries: []
matching_top_level_modules: []

[watchfiles==1.2.0]
distribution_metadata_present: False version=None error=No package metadata was found for watchfiles
candidate_modules: ['watchfiles']
  watchfiles: find_spec=False import_status=error module_version=None module_file=None error=No module named 'watchfiles'
matching_sys_path_entries: []
matching_top_level_modules: []

[websockets==17.0.1]
distribution_metadata_present: False version=None error=No package metadata was found for websockets
candidate_modules: ['websockets']
  websockets: find_spec=False import_status=error module_version=None module_file=None error=No module named 'websockets'
matching_sys_path_entries: ['/opt/pyvenv/lib/python3.12/site-packages/websocket']
matching_top_level_modules: []

[wheel==0.43.0]
distribution_metadata_present: False version=None error=No package metadata was found for wheel
candidate_modules: ['wheel']
  wheel: find_spec=False import_status=error module_version=None module_file=None error=No module named 'wheel'
matching_sys_path_entries: []
matching_top_level_modules: []

library_compat_probe_report.json

{
  "probe": {
    "version": "1.0.0",
    "timestamp_utc": "2026-09-09T00:10:53.819661+00:00",
    "python": "3.12.14 (main, Aug 18 2026, 15:00:50) [GCC 13.2.0]",
    "executable": "/opt/pyvenv/bin/python",
    "cwd": "/mnt/data",
    "sys_path": [
      "/home/oai/skills/appCatalog/T_c7684bbd-22d7-09b6-98d1-b677a58b0593/github-library-compat-probe/scripts",
      "/opt/oai-pkgs",
      "/usr/lib/python312.zip",
      "/usr/lib/python3.12",
      "/usr/lib/python3.12/lib-dynload",
      "/opt/pyvenv/lib/python3.12/site-packages"
    ]
  },
  "target_count": 23,
  "summary": {
    "importable_target_distributions": [],
    "importable_count": 0,
    "no_candidate_import_or_data_only": [
      "noto-cjk-fonts"
    ],
    "unavailable_by_candidate_import": [
      "cobble",
      "dracarys",
      "fastembed",
      "github-copilot-sdk",
      "grpcio-tools",
      "httptools",
      "mammoth",
      "mmh3",
      "mpmath",
      "plotly",
      "py-rust-stemmers",
      "pyclipper",
      "rank-bm25",
      "rapidocr-onnxruntime",
      "seaborn",
      "sympy",
      "tokenizers",
      "truststore",
      "uvloop",
      "watchfiles",
      "websockets",
      "wheel"
    ],
    "unavailable_count": 22
  },
  "targets": {
    "cobble": {
      "github_copilot_harness_observed_version": "0.1.4",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for cobble"
      },
      "candidate_modules": [
        "cobble"
      ],
      "module_probes": [
        {
          "module": "cobble",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'cobble'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "dracarys": {
      "github_copilot_harness_observed_version": "0.1.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for dracarys"
      },
      "candidate_modules": [
        "dracarys"
      ],
      "module_probes": [
        {
          "module": "dracarys",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'dracarys'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "fastembed": {
      "github_copilot_harness_observed_version": "0.8.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for fastembed"
      },
      "candidate_modules": [
        "fastembed"
      ],
      "module_probes": [
        {
          "module": "fastembed",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'fastembed'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "github-copilot-sdk": {
      "github_copilot_harness_observed_version": "1.0.11",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for github-copilot-sdk"
      },
      "candidate_modules": [
        "github_copilot_sdk",
        "github.copilot",
        "copilot"
      ],
      "module_probes": [
        {
          "module": "github_copilot_sdk",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'github_copilot_sdk'"
        },
        {
          "module": "github.copilot",
          "find_spec": false,
          "find_spec_error_type": "ModuleNotFoundError",
          "find_spec_error": "No module named 'github'",
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'github'"
        },
        {
          "module": "copilot",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'copilot'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/opt/pyvenv/lib/python3.12/site-packages/PIL",
        "/opt/pyvenv/lib/python3.12/site-packages/git"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "grpcio-tools": {
      "github_copilot_harness_observed_version": "1.80.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for grpcio-tools"
      },
      "candidate_modules": [
        "grpc_tools"
      ],
      "module_probes": [
        {
          "module": "grpc_tools",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'grpc_tools'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/opt/pyvenv/lib/python3.12/site-packages/grpc"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "httptools": {
      "github_copilot_harness_observed_version": "0.8.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for httptools"
      },
      "candidate_modules": [
        "httptools"
      ],
      "module_probes": [
        {
          "module": "httptools",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'httptools'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/usr/lib/python3.12/http"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "mammoth": {
      "github_copilot_harness_observed_version": "1.12.1",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for mammoth"
      },
      "candidate_modules": [
        "mammoth"
      ],
      "module_probes": [
        {
          "module": "mammoth",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'mammoth'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "mmh3": {
      "github_copilot_harness_observed_version": "5.2.1",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for mmh3"
      },
      "candidate_modules": [
        "mmh3"
      ],
      "module_probes": [
        {
          "module": "mmh3",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'mmh3'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "mpmath": {
      "github_copilot_harness_observed_version": "1.3.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for mpmath"
      },
      "candidate_modules": [
        "mpmath"
      ],
      "module_probes": [
        {
          "module": "mpmath",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'mpmath'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "noto-cjk-fonts": {
      "github_copilot_harness_observed_version": "1.0.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for noto-cjk-fonts"
      },
      "candidate_modules": [],
      "module_probes": [],
      "no_direct_import_expected": true,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "plotly": {
      "github_copilot_harness_observed_version": "6.9.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for plotly"
      },
      "candidate_modules": [
        "plotly"
      ],
      "module_probes": [
        {
          "module": "plotly",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'plotly'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "py-rust-stemmers": {
      "github_copilot_harness_observed_version": "0.1.8",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for py-rust-stemmers"
      },
      "candidate_modules": [
        "rust_stemmers",
        "py_rust_stemmers"
      ],
      "module_probes": [
        {
          "module": "rust_stemmers",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'rust_stemmers'"
        },
        {
          "module": "py_rust_stemmers",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'py_rust_stemmers'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "pyclipper": {
      "github_copilot_harness_observed_version": "1.4.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for pyclipper"
      },
      "candidate_modules": [
        "pyclipper"
      ],
      "module_probes": [
        {
          "module": "pyclipper",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'pyclipper'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "rank-bm25": {
      "github_copilot_harness_observed_version": "0.2.2",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for rank-bm25"
      },
      "candidate_modules": [
        "rank_bm25"
      ],
      "module_probes": [
        {
          "module": "rank_bm25",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'rank_bm25'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "rapidocr-onnxruntime": {
      "github_copilot_harness_observed_version": "1.4.4",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for rapidocr-onnxruntime"
      },
      "candidate_modules": [
        "rapidocr_onnxruntime",
        "rapidocr"
      ],
      "module_probes": [
        {
          "module": "rapidocr_onnxruntime",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'rapidocr_onnxruntime'"
        },
        {
          "module": "rapidocr",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'rapidocr'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/opt/pyvenv/lib/python3.12/site-packages/onnxruntime"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "seaborn": {
      "github_copilot_harness_observed_version": "0.13.2",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for seaborn"
      },
      "candidate_modules": [
        "seaborn"
      ],
      "module_probes": [
        {
          "module": "seaborn",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'seaborn'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "sympy": {
      "github_copilot_harness_observed_version": "1.14.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for sympy"
      },
      "candidate_modules": [
        "sympy"
      ],
      "module_probes": [
        {
          "module": "sympy",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'sympy'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "tokenizers": {
      "github_copilot_harness_observed_version": "0.23.1",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for tokenizers"
      },
      "candidate_modules": [
        "tokenizers"
      ],
      "module_probes": [
        {
          "module": "tokenizers",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'tokenizers'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "truststore": {
      "github_copilot_harness_observed_version": "0.10.4",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for truststore"
      },
      "candidate_modules": [
        "truststore"
      ],
      "module_probes": [
        {
          "module": "truststore",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'truststore'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/usr/lib/python3.12/re"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "uvloop": {
      "github_copilot_harness_observed_version": "0.22.1",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for uvloop"
      },
      "candidate_modules": [
        "uvloop"
      ],
      "module_probes": [
        {
          "module": "uvloop",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'uvloop'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "watchfiles": {
      "github_copilot_harness_observed_version": "1.2.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for watchfiles"
      },
      "candidate_modules": [
        "watchfiles"
      ],
      "module_probes": [
        {
          "module": "watchfiles",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'watchfiles'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    },
    "websockets": {
      "github_copilot_harness_observed_version": "17.0.1",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for websockets"
      },
      "candidate_modules": [
        "websockets"
      ],
      "module_probes": [
        {
          "module": "websockets",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'websockets'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [
        "/opt/pyvenv/lib/python3.12/site-packages/websocket"
      ],
      "matching_enumerated_top_level_modules": []
    },
    "wheel": {
      "github_copilot_harness_observed_version": "0.43.0",
      "distribution_metadata": {
        "present": false,
        "version": null,
        "error_type": "PackageNotFoundError",
        "error": "No package metadata was found for wheel"
      },
      "candidate_modules": [
        "wheel"
      ],
      "module_probes": [
        {
          "module": "wheel",
          "find_spec": false,
          "spec_origin": null,
          "import_status": "error",
          "import_error_type": "ModuleNotFoundError",
          "import_error": "No module named 'wheel'"
        }
      ],
      "no_direct_import_expected": false,
      "matching_sys_path_entries": [],
      "matching_enumerated_top_level_modules": []
    }
  }
}

Microsoft 365 Copilot の Agent Builder で Skills が利用可能になりました🎉

はじめに

Agnet Builder にて Skills が作成可能になりました!

私が確認した限りでは、9/4(金) に利用可能になっていました。

まだ Preview なので動作が若干若干怪しいところがあるのはご愛敬ですかね

また、こちらの機能現時点 (9/6) ではという点に注意した方が良いと思いますが、Copilot Chat (Basic) = Microsoft 365 Copilot ライセンスを持っていないユーザーも利用可能となっています!

現時点ではと記載している通り、Preview 外れたらどうなるかわからないので本番導入を考えている方は公式の最新情報をウォッチしておいた方が良いと思います。

また、公式ドキュメントもこのアップデートも更新されています。
Last updated on 2026/09/06 !!

learn.microsoft.com

learn.microsoft.com

カスタムスキルを作成する

カスタムスキルは現在2パターンの作成方法があります。

  1. 説明から作成する
    • ゼロから
    • 作成中のエージェントから
  2. パッケージをアップロードする

UI 変わる可能性もあるので、それぞれ簡単に説明します。

説明から作成する

ゼロから

公式ドキュメントでも案内されてるプロンプトを利用します。

learn.microsoft.com

ただ、記載のプロンプトサンプルだと日本語になってないので、翻訳した以下を利用してみます。

チームのリリースノート作成を支援するエージェントを作成してください。毎回同じ手順に従う、再利用可能なスキルを追加します。

  1. マージ済みの変更一覧を受け取ります。変更一覧は、直接貼り付けるか、PRタイトルを記載した .csv ファイルをアップロードして提供できるようにします。
  2. 変更内容を「新機能」「修正」「その他」に分類します。
  3. スクリプトを実行し、バージョン見出しと本日の日付を含む、読みやすい Markdown形式の変更履歴に整形します。

出力形式が毎回統一されるように、明確な手順と整形用スクリプトを含むスキルとしてパッケージ化してください。

できた!
説明からも Skills もまとめて作成できるのは便利ですねー

ただ、折角日本語で作成指示だしたのに、英語で Instractions が生成されてるのが残念

こちらのスキルは SKILL.md にあたる箇所であればこのまま修正可能です。

他ファイル (例えば今回だと main.py )は編集できないので注意です。

編集したい場合は Skills をダウンロードしてローカルで修正を行う必要がありますが、こちらは一度保存しないといけないので注意です。

保存前

保存後

作成中のエージェントから

作成したエージェントからもチャットでスキルの作成を始めることができます。
「Create with chat」 から始めることができます。

選択すると

エージェントの新しいスキルを作成したいです。スキル名、説明、カテゴリ、指示の設定を案内してください。

というプロンプトが入力されたので、そのまま利用してみます。

できた!

チャットベースで簡単にスキルの作成ができるのは便利ですねー

また、修正も左のチャット欄で行うことができます!

今回は私のプロンプトが悪かったw

パッケージをアップロードする

パッケージ(zip ファイル)をアップロードすることでもスキルの登録を行うことが可能です。

スキルの構成はこんな感じ

my-skill.zip
|-- SKILL.md              # required
|-- <resource files>      # optional
`-- <scripts or folders>  # optional

アップロードしたスキルはチャットから作成したスキルと同じように扱うことができます。

制限事項

現在公式ドキュメントで案内されている制限事項はこちらです

項目 Agent Builder の制限
Skills 数 1 Agent あたり最大8個
Skill package ZIP、最大50 MB
1ファイル 最大25 MB
ファイル数 全 Skills 合計350ファイル
ディレクトリ階層 最大3階層
SKILL.md Instructions 20,000文字未満
Skill の再利用 別 Agent への再利用は現Previewでは未対応
個別ファイル追加 不可。完成した ZIP 全体をアップロード
Embedded files との併用 現時点では非対応
Script のネット接続 不可
Script からの API / Connector / MCP 呼び出し 不可
Runtime package install 不可
スクリプト .py, .js, .ts, .sh などをサポート
Skill file 保存先 Tenant-scoped SharePoint Embedded
Sensitivity label 保持・適用。ただし user-defined permissions / DKE は非対応

検証した挙動

スキルからスキルの呼び出し

複数のスキルが登録できるんだから、スキルからスキルを呼び出せるか検証してみました。

作成したのはこんな感じの簡単なエージェント

出力結果はこんな感じ

スキル間の呼び出しもできてそうですね。

タイムアウト

タイムアウトもみてみます。

Command execution timed out, expect: 180.0, used: 180.21402287483215

とのことで、タイムアウトは 180 秒のようです。

そしてこのタイムアウト、もうちょっと踏み込んで検証してみます。

スキル単体が 180 秒制限なのか?全体で 180 秒制限なのか?の検証です。

まぁ、ただ結論からいうとこの検証はあんまりうまくいかなったです...

とりあえず、スキル全体で 180 秒制限が掛かってそう。ということはなんとなく予測できます。
ただその制限に達した場合の挙動がいまいち安定しないです。

一律エラー返してくれるのか、途中までで上手くいった内容は返してくれるのか...

まぁ、実行時間が 180 秒超えるようなスキルはいまのところ Agent Builder で作成するべきではなさそうですね


追記

これエージェント公開した ver で実施したらどうなるんだ??と思ってやったら成功してしまったwww

わからない!
もしかするとモデルにもよるのかもしれない...


おわりに

Agent Builder でもスキルの作成ができるようになったことで、エージェント作成の幅が広がりそうですね!

ただ、こちらの機能はまだプレビューなので正式にライセンス形態が発表されるまでは本番運用はちょっと怖いなぁ...という思いも少しあります。
蘇る GitHub Copilot Harness の記憶...!!

Agent Builder の立ち位置や作成導線てきに大丈夫な気もしますけどね
※ 個人の感想

Copilot Studio (GitHub Copilot Harness) でエージェントの閲覧・編集を行うのに必要な権限

はじめに

こちらは私が実際の挙動から確認した検証記事です。
最新の情報や正確な情報は公式ドキュメントや Microsoft 公式に問い合わせることをおすすめします。

Copilot Studio の GitHub Copilot Harness では Standard Harness とは異なり、エージェントの共有時に編集権限の共有を行うことができません。

閲覧者は、エージェントを自分のエージェント一覧で確認し、詳細を表示したりテストしたりできますが、エージェントやその内容を編集することはできません。

他の人がエージェントを編集できるようにするには、Copilot Studioのホームページで「Use GitHub Copilot harness」をオフにして共有時に編集を有効にしたり、環境内のユーザーにエディターの役割を割り当てることができます。

もしエージェントを他の人に共有したい場合は、閲覧やテストなしで、 組織設定のドロップダウンメニューを開き、 エンドユーザーアクセスを選択します。 この操作により、組織内の誰でもエージェントを見つけて利用できますが、エージェントの詳細を見たり編集したりすることはできません。

learn.microsoft.com

リンク先のドキュメントでは以下設定を行えば、編集権限を渡せるようなことが記載されていますが、少なくとも私はこれで編集権限を渡すことはできませんでした。
※ Standard Harness のはなしじゃないかな?これ

learn.microsoft.com

じゃあなに設定必要なの?というと、現時点では セキュリティロール を付与する必要があります。

必要なセキュリティロール

GitHub Copilot Harness のエージェントを閲覧・編集する権限は、マネージド環境であるか否かによって変わってくるようです。

セキュリティロールは Basic User をベースに作成しています。

閲覧権限

エージェントの閲覧権限をもっていると Monitor と Evalute が閲覧可能になります。

マネージド環境でない場合

マネージド環境でない場合は、以下テーブルに対して閲覧権限が必要です。

  • solution
  • bot
  • botcomponent

これらのテーブルの「読み取り」に適切な特権を付与してください。
たとえば環境内のすべてのエージェントを読み取りたいのであれば「組織」ですね。

マネージド環境の場合

マネージド環境の場合は下記テーブルに対しての特権設定が必要になります。

  • connectionreference
  • publisher
  • solution
  • bot
  • botcomponent
  • botcomponentcollection
  • aiplugin
  • aipluginoperation
  • dvtablesearch
  • dvtablesearchentity
  • copilotglossaryterm
  • copilotsynonyms

編集権限

編集権限を付与したい場合は閲覧権限で紹介したテーブルの「作成」や「書き込み」に対しても特権を付与する必要があります。

付与する特権は Environment Maker を参考に上記テーブルに対して特権を付与します。
しかし、Environment Maker では新規作成や自身のエージェントの編集はできても他のエージェントの編集はできないので、一部カスタマイズが必要です。

マネージド環境でない場合

マネージド環境でない場合は、以下テーブルに対して作成・編集のための特権を付与する必要があります。
solution テーブルは Environment Maker はフルアクセスを既に持っているので、記載していません。

  • bot
  • botcomponent

マネージド環境の場合

マネージド環境の場合は、以下テーブルに対して作成・編集のための特権を付与する必要があります。

  • bot
  • botcomponent
  • botcomponentcollection

これでエージェントの新規作成や編集を行う権限を付与できるはずです。

おわりに

記載内容に誤りや補足あればコメントしてもらえると助かりますー


スポンサードリンク