> ## Documentation Index
> Fetch the complete documentation index at: https://arkor-92aeef0e-eng-615.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 学習の開始とジョブの観察

> Studio の Overview / Jobs / Job 詳細ページ: 学習をトリガーし、一覧を眺め、1 つのジョブを掘り下げる。

# 学習の開始とジョブの観察

学習関連の画面は 3 ルートに分かれています: **Overview**（`#/`）に **Run training** アクション、**Jobs**（`#/jobs`）は検索・フィルタ・自動更新付きの一覧、**Job 詳細**（`#/jobs/:id`）はライブイベントストリームと Loss チャート。一覧で行をクリックすると詳細ページに遷移します。

## Run training

Run training パネルはページ読み込み時に `/api/manifest` を 1 度呼びます。レスポンスはプロジェクトの `createArkor({ trainer })` のサマリで、これをもとにアクションをラベル付けします:

* トレーナーが見つかれば `Run training: <trainer name>`。
* バンドルは import されたが何も露出しない場合 `No trainer in src/arkor/index.ts yet. Add createTrainer(...) and pass it to createArkor.`（`src/arkor/index.ts` にトレーナーがまだありません。`createTrainer(...)` を追加して `createArkor` に渡してください）。
* ビルド自体が失敗（`src/arkor/` の typo など）した場合 `Couldn't read manifest: <error>`（マニフェストを読み取れませんでした: `<error>`）。

ボタンは学習の進行中、およびトレーナー未解決のとき無効化されます。

クリックすると Studio は `POST /api/train` を送ります。バックエンドはサブプロセスで `arkor start` を起動し、stdout / stderr を生テキストとしてストリーミングで返します。整形済みログボックスは自動スクロールし、表示されるのはターミナルで `arkor start` を走らせたときの出力そのものです。

トレーナー選択やフラグを渡す入力フォームはありません: Studio は常に `createArkor` で登録されたトレーナーを走らせ、`arkor start` は `.arkor/build/index.mjs` があれば再利用します。同じページで複数回クリックする間に `src/arkor/` の編集は自動では拾われません。編集の合間に Run training ページをリロード（あるいはターミナルから `arkor build`）してから次のクリックをしてください。具体的なリビルドルールは [CLI § build / start](/ja/cli/build-and-start) を参照。

## Jobs リスト

Jobs ページ（`#/jobs`）はマウント時に 1 度、その後 5 秒ごとに `GET /api/jobs` をポーリングします。カードヘッダーの **Refresh** アイコンで手動でも即座に再読込できます（リクエスト中はアイコンが回転します）。

クライアント側で 2 段階のフィルタが働きます:

* **Search**（名前 or ID、大文字小文字を無視）。テキスト入力で `Job.name` または `Job.id` がクエリを含む行に絞ります。
* **Status フィルタ**チップ: `All` / `Running` / `Completed` / `Queued` / `Failed` / `Cancelled`。常に 1 つだけアクティブ。

空状態は 2 種類を区別します: `No jobs yet`（プロジェクトに本当にジョブが 1 件も無い。説明文で Overview に作成導線がある旨を平文で言及するのみで、ボタンやリンクは設けていません）と `No matches`（検索 / フィルタで全行が隠れている。条件を緩めるかクエリをクリア）。

| 列       | ソース                                                                                            |
| ------- | ---------------------------------------------------------------------------------------------- |
| Status  | `Job.status`（`queued` / `running` / `completed` / `failed` / `cancelled`）。セルは色付け用の CSS クラスを持つ。 |
| Name    | `Job.name`。`#/jobs/<id>` にリンク。                                                                 |
| Created | `new Date(Job.createdAt).toLocaleString()`。                                                    |
| ID      | `Job.id`、等幅フォント。                                                                               |

リストはバックエンドが返した順をそのまま表示します。クライアント側のページングはありません（可視行レデューサーはサーバーが完全な一覧を返す前提です）。

## Job 詳細

`#/jobs/:id` は `EventSource` 経由で `GET /api/jobs/:id/events` への `Server-Sent Events` 接続を開きます。ページは 5 つの名前付きイベントとストリーム終端を待ち受けます。

下の各行で、イベントログはイベント名をメッセージとは別カラムで表示します。表内の「メッセージ」は `JobDetail.pushEvent()` が SSE ペイロードから生成する文字列です。

| イベント                 | ページへの効果                                                                                                                                                                                                                                  |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `training.started`   | ステータスが `running` に変わる。イベントログのメッセージは生の JSON ペイロード（イベントごとの整形なし）。                                                                                                                                                                           |
| `training.log`       | `step`、`loss`、そして（含まれていれば）`evalLoss` が Loss チャートのデータ配列に追加。イベントログのメッセージは `step=<n>` で始まり、そのステップで数値である方だけ ` loss=<value>` と ` evalLoss=<value>` が追記される（null / 非数値のフィールドはセグメントごと省略）。eval-only フレームでは `step=<n> evalLoss=<value>` のように描画される。 |
| `checkpoint.saved`   | イベントログのメッセージは `step=<n>`。チャートには影響なし。                                                                                                                                                                                                     |
| `training.completed` | ステータスが `completed` に変わる。イベントログのメッセージは `<n> artifact[s]`。artifact 数自体は Metadata サイドバーの `Artifacts` 行に表示される。                                                                                                                               |
| `training.failed`    | ステータスが `failed` に変わる。イベントログのメッセージはペイロードの `error` 文字列で、同じテキストの赤いバナーがチャート上部にも表示される。                                                                                                                                                        |
| `end`                | ページが EventSource をクローズ。再接続なし。                                                                                                                                                                                                            |

ストリームエラーは `Event stream interrupted.` という別バナーが loss チャート / events ログのカード群の上に表示され（ログ行としては追加されません）、次の SSE フレーム到着でバナーは消えます。再接続はブラウザーの `EventSource` の retry 挙動に任されます。

イベントログは **直近 500 件** だけを保持します（新着につれて古いエントリーが消えていきます）。SSE の名前付きイベントから描画するスクロールリストで、フォレンジック用ではなく素早い目視確認のためのものです。完全な履歴はクラウド API を直接見てください。

Loss チャートは `training.log` イベントから描画される SVG プロットです。Y 軸は最小値と最大値によるスケーリング、X 軸はステップ番号で、最大 2 系列を表示します:

* **Training loss**: 実線のティール色。数値 `loss` を含むイベントごとに 1 頂点。
* **Eval loss**: 破線のピンク色（点マーカー付き）。数値 `evalLoss` を含むイベント（通常は `evalSteps` 刻み）から描画。系列はイベントから直接構築するため、`evalLoss` のみを持ち `loss` を含まない eval-only フレームも線・凡例・統計に反映されます。Eval ポイントが 1 つも来ていない間は凡例にも表示されません。

ホバーすると最寄りステップと、そのステップに含まれる `loss` / `evalLoss` のうち存在する値が表示されます（eval-only ステップでは `loss` 値は出ず、その逆も同様）。チャートは `loss` または `evalLoss` のいずれかが数値であるイベントが 1 件以上届くまで `Waiting for training.log events…`（`training.log` イベント待ち）プレースホルダーを表示します。両方とも null / 省略の `training.log` フレームはカウントされません。

### 上級モード（Advanced metrics）

チャートヘッダーの **Advanced** トグルを ON にすると、系列ごとの統計パネルが現れます。各カードに表示される項目:

* **Mean loss ± 95% CI**: Loss 値の標本平均と 95% 信頼区間の半幅（Student の t 分布。n > 31 では z = 1.96 にフォールバック）。
* **Std dev**（標準偏差）と **Variance**（分散）: Bessel 補正済みの不偏推定量（`ddof=1`）。
* **p90** と **p95**: numpy のデフォルトに合わせた線形補間パーセンタイル。

Eval カードは数値 `evalLoss` を含む `training.log` イベントが届くまでは空のままです。

## このページがしないこと

* **キャンセルボタンなし。** 動作中ジョブを止めるには、トレーナーを実行している自前コードから [`trainer.cancel()`](/ja/sdk/trainer-control#cancel) を呼んでください。現状 Studio は UI でこの機能を公開していません。
* **Artifact ブラウザーなし。** 完了済みジョブの artifact 数は出ますが、個別 artifact をリスト／リンクしません。完全な artifact アクセスにはクラウド API を、あるいは学習中の SDK の `onCompleted({ artifacts })` コールバックを使ってください。
* **学習途中の推論なし。** Playground は完了済みジョブ専用です（[Playground](/ja/studio/playground) 参照）。学習途中のライブ確認には SDK の [`onCheckpoint({ infer })`](/ja/sdk/callbacks) を使ってください。
