Institution Mode: オペレーターリファレンス
マルチエージェント投資委員会のアナリストリカバリ契約と正規化アセット preflight
minara_institution_analyze は、Minara の標準委員会フロー、または
Web UI でセッションに保存した Roundtable を実行します。本ページは
標準アナリスト経路が使う低レベルのリカバリと資産解決を扱います。
フェーズ構成、Agent 設定、テンプレート、変更不能な実行スナップ
ショットは Institution Mode
を参照してください。
標準フローには並列分析、強気と弱気の討論、調査統合、取引計画、 リスク討論、最終ポートフォリオ判断があります。カスタム Roundtable はこの構成を置き換えても、同じ読み取り専用の安全境界を保ちます。
パイプラインのタイムアウトとベンチマーク設定は 環境変数: Institution Mode を参照してください。
Roundtable の状態とスナップショット
Builder は Institution セッションごとに有効なパイプラインを保存します。 保存時に期待リビジョンを確認するため、別のブラウザウィンドウが新しい 変更を黙って上書きすることはなく、競合が返されます。保存済みパイプライン がない場合、ゲートウェイは最新実行スナップショット、次に組み込み標準を 使います。
Agent、フェーズ、Roundtable テンプレートは別々に保存され、組み込み テンプレートは変更できません。実行開始時には、フェーズ結果、Agent 使用量、 最終状態、レポートファイルを含む完全なパイプラインが変更不能なスナップ ショットへコピーされます。関連 API は次のとおりです。
- セッションパイプラインを取得
- セッションパイプラインを保存
- セッション実行を一覧表示
- 実行スナップショットを取得
- Agent テンプレートを一覧表示
- Roundtable テンプレートを一覧表示
- 利用可能な Institution スキルを一覧表示
アナリストリカバリ : synthesis-and-parse
各 Phase-1 アナリスト slot はまず自由な tool 呼び出しループで
モデルを動かします(submit_analyst_report は常にロールの
データツールと並べて公開されます)。メインループが本物の
non-stub レポートを提出した場合、slot は捕捉した
tool_outputs[] を添付してそのまま返します。
メインループが提出しなかった(ターン上限到達、モデルが散文を 書いて提出を忘れた)、または空・プレースホルダー引数を提出 した場合、オーケストレーターは synthesis ターンを 1 回 だけ 実行します。
-
ツールも
tool_choiceも付けない。thinking は有効 : これは 以前tool_choice: { type: "tool" }下で失敗していた呼び出し です。Anthropic がその組み合わせを拒否するため、モデルが 引数を埋める推論余地がゼロになるからです。 -
ユーザーメッセージは厳密な 3 セクション散文フォーマットを 要求します:
HEADLINE: <1 文の結論> KEY FINDINGS: - <finding 1, ツール名 + 具体的な数値を引用> - <finding 2, ...> CONFIDENCE: <0.0 から 1.0 の数値>
オーケストレーターは parseSynthesisProseToReport でサーバー
サイドで散文を直接 AnalystReport にパースします。パーサーは
bullet スタイルの混在、セクションマーカー周りの markdown
強調、レンジ外の confidence([0, 1] にクランプ)に寛容です。
synthesis ターンの散文が空、フォーマット崩壊、または全 bullet
がプレースホルダー形状("tried X: ok")の場合、
オーケストレーターは buildSubagentSummaryReport : 普遍的な
「常に使えるものを出す」ビルダー : にフォールバックします。
2 分岐:
| 分岐 | 起動条件 | Headline | Confidence |
|---|---|---|---|
| 一部 tool 成功 | toolsTried.some(t => t.status === "ok") | "<ticker> (<role>): raw tool summary (model synthesis unavailable)" | 0.3 |
| 全 tool 失敗/tool 呼び出しなし | toolsTried.every(t => t.status !== "ok") または空 | "<ticker> (<role>): no data gathered this session" / "... no tools available this session" | 0.1 |
一部 tool が成功した場合、レポートは捕捉したツールデータを
引用(1 ツールあたり 1 bullet、preview から派生)するので
下流フェーズは何が返ってきたか見えます。全て失敗した場合は
試行した tool を列挙し、最後にロールのドメインデフォルト推論を
1 文で締めます(ロールごとに 1 文、roles.ts のロール定義
近くに定義)。
どちらの分岐でも slot の ok は true です : 旧 "data-gap"
コンセプトは退役しました。各 Phase 1 slot は常にメイン
エージェントに使えるサマリーを出すので、Phase 2-6 は常に
実行されます。
Tool outputs : 捕捉した戻り値の出口
各 AnalystReport はオプションの tool_outputs[] を保持し、
slot の会話からオーケストレーターが埋めます。tool 呼び出し
ごとに 1 エントリ:
{
tool: string; // ツール名
ok: boolean; // 成功した呼び出しなら true
preview: string; // 成功: 切り詰められた JSON / テキスト(~1500 文字)
// 失敗: エラーメッセージ文字列
args_summary?: string; // 呼び出し入力の 1 行要約
error_code?: string; // 構造化された失敗カテゴリ(あれば)
}成功した呼び出しは pretty-print された JSON プレビューを
携えます。失敗した呼び出しは失敗理由をそのまま preview に
入れるので、オペレーターはなぜ呼び出しがデータを返さなかった
かを直接見られます(返さなかったという事実だけではなく)。
web-ui の PersonaOutputRenderer がこれを構造化アウトプット
ポップアップ内の "Tool outputs" セクションとしてレンダリングし、
各行はクリックで展開できます。
正規化アセット preflight
Phase 1 ディスパッチ前、classifyAsset(ticker) === "unknown"
(または INSTITUTION_FORCE_RESOLVER_PREFLIGHT=true)の場合、
オーケストレーターはサーバーサイド preflight を実行します:
- SQLite キャッシュ(
canonical_asset_cacheテーブル)を確認。 - キャッシュミスまたは期限切れの場合: 並列で CoinGecko / CMC /
DexScreener を引き、chain+contract アイデンティティ
(CAIP-19 風の
evm/native/solana/cosmos/polkadot/equityの discriminated union) に正規化。 outcome 別 TTL で永続化。 - outcome ルーティング:
resolved(一意な chain+contract):meta.resolved_tickerを強化、アナリストは preamble で正規アイデンティティを 確認できる。multi(マルチチェーン展開): 同上、ただし候補配列が 曖昧性解消コンテキストに渡る。ambiguous(provider 間で食い違い): 中央集権的な曖昧性 解消イベントを発火(並列 4 つの "どのトークン?" プロンプト ではなく)。none: Phase 1 前に中止、LLM 呼び出しゼロ。これが オーケストレーターが現在唯一発する abort kind です。
正規アイデンティティは chain+contract であり CoinGecko id
ではありません。CoinGecko の内部 id は彼らのキュレーションに
依存する中央集権インデックスなので、それを bootstrap 出力に
使うとエージェントを単一 provider の世界観に縛り付けてしまい
ます。on-chain クエリを受け取る下流ツールは CAIP-19 を直接
受け付けます。provider 固有ツール(CoinGecko の価格チャート
など)は正規アイデンティティが確定した 後 に sources から
自分の id を読みます。
outcome 別 TTL
キャッシュは outcome ごとに異なる TTL を使います。outcome の 鮮度の劣化速度が違うためです:
| outcome | デフォルト TTL | 理由 |
|---|---|---|
resolved | 30 日 | 安定した chain+contract、めったに変わらない |
multi | 14 日 | ユーザー曖昧性解消で特定チェーンに pin される可能性 |
ambiguous | 7 日 | provider データが収束しうる |
none | 1 日 | provider は毎日更新、すぐ再試行 |
user_supplied | 365 日 | オペレーター上書き、人間を信用 |
クラスごとの TTL は CANONICAL_ASSET_CACHE_TTL_*_DAYS 環境
変数で調整(env-vars リファレンス参照)。
ライブアグリゲーターが失敗した場合(provider ダウン、レート
リミット)、CANONICAL_ASSET_CACHE_FALLBACK_TO_EXPIRED=true
(デフォルト)は from_expired_fallback: true でタグ付け
された期限切れキャッシュを返します。デプロイがいかなる
ドリフトも許容できないなら false に設定。
未登録 ticker の追加
エージェントは新しい ticker に初めて遭遇したとき、 ticker → 正規アイデンティティのマッピングを学習します。新トー クンのためのコードデプロイは不要。2 つの経路:
- ライブ解決: 次の
/institution <ticker>呼び出しで preflight が走り、結果がキャッシュされ、以降すべてのロール が正規アイデンティティを見られます。 - オペレーター上書き: CoinGecko / CMC / DexScreener に
トークンがない場合(例: 新規リリース)、オペレーターは
正規アイデンティティを直接 pin できます。UI: 中止バナーに
コントラクトアドレスフォーム。CLI:
minara assets pin <ticker> --chain <chain> --contract <0x...>(デプロイで assets CLI が有効な場合)。
methodology-store の TICKER_TO_CLASS テーブルは存続して
いますが用途が変わりました(リスク/ポートフォリオコード
向けの asset-class ルックアップ)。正規リゾルバーは
asset_class フィールドが新情報を提供するときに書き戻し
ますが、TICKER_TO_CLASS は正規アイデンティティの真理源では
なくなりました。
実運用でのリカバリ検査
institution_role_outputs.data_gap カラムは data-gap コン
セプト退役前に書き込まれたレガシー行のためにスキーマに残って
います。新規書き込みは常に 0 です。メトリクス集計器
InstitutionStore.getAnalystStubMetrics はヒストリカル
レポーティング向けに今もこれを読みますが、現行リカバリパス
では負荷を持ちません。
run 別監査:
# run のすべてのアナリスト行(legacy の retry_count + data_gap 含む)。
minara learning methodology cases --run-id <run_id>