Skip to content

AskUserQuestion の複数質問表示 (2026-08-05)

This content is not available in your language yet.

ユーザー報告: (1) 複数質問が1画面に収まらない。(2) ウィンドウ表示モードにスクロールが無く、 ウィンドウを広げるしかない。(3) 選択肢が表示される関係で、現状のカードでは狭すぎる。 Claude Desktop のように表示してほしい。

実物形状の4問リクエスト(選択肢 4+2+4+2、説明付き)を合成し、PermissionWindow と同じ 420x360・同じ USS チェーンのウィンドウに PermissionCard(HostKind.Window) で構築して測った。

指標実測値
ウィンドウ内容の高さ360px
カードルートの実高さ736px — ウィンドウの2倍にあふれる
_details(ScrollView)のビューポート707px
同・コンテンツ699px
スクロール発生しない(ビューポート≒コンテンツ)

「スクロールが実装されていない」のではない。 _details は最初から ScrollView である。 誰もその高さを制約しないため、カードがコンテンツなりに伸び、ウィンドウからあふれ、 ScrollView は一度も作動しない。原因は UITK の flex 既定(flex-shrink:0)で、 このプロジェクトで3回目の同型再発(前2回: リスト行の整列、履歴フィルタバー)。 インラインホストだけは ComputeMaxCardHeight(40%キャップ)が外から高さを与えるので 偶然スクロールが効いていた — ウィンドウホストにはキャップに相当するものが無い。

質問1問あたり約175px。4問積み上げで699px。1問ずつ表示すれば約1/4になる。

2a. ステッパー(複数質問時のみ)

Section titled “2a. ステッパー(複数質問時のみ)”
  • 質問が2つ以上のとき、カード上部にタブ列(質問の header、無ければ “Q1” 形式)。 本文には現在の1問だけを表示する。1問のときは従来どおりタブ無し。
  • タブは自由にクリックで行き来できる。回答済みタブには回答済みスタイル。
  • 単一選択の質問は、選択した瞬間に次の未回答の質問へ自動前進(Claude Desktop と同じ)。 multiSelect はトグル式なので自動前進しない(いつ選び終わったかをUIは知り得ない)。
  • Submit の有効化条件(全質問に1つ以上の選択)は変更しない。Skip も変更しない。
  • ステップ状態(現在位置・回答集合・前進先の決定)は純粋クラス QuestionStepperModel に切り出し、EditMode で直接テストする。

2b. ウィンドウホストの高さ制約(ステッパーとは独立に必要)

Section titled “2b. ウィンドウホストの高さ制約(ステッパーとは独立に必要)”

ステッパーで通常は収まるようになるが、1問でも選択肢が多ければあふれるし、 ツール変種のカードでも同じ欠陥がある。修正はステッパーに依存させない: .uap-perm--windowhost のチェーン(カードルート → _body → _details)に flex-shrink:1 / min-height:0 / flex-grow:1 を通し、_details の高さが ウィンドウ残高さで制約されるようにする。修正後、同じ合成4問で 「ビューポート < コンテンツ」かつ「カードルート <= ウィンドウ高さ」を実測で確認する。

  • 質問変種のウィンドウ既定サイズを 420x360 → 560x520 に(ツール変種は従来どおり)。 選択肢ボタンはラベル+説明の2行構成で、420px では説明が3行に折れて縦を食う。
  • インラインカードは従来どおりチャット幅いっぱい+40%キャップ。ステッパーで 1問あたりの高さが約1/4になるため、キャップ内に収まるようになる。
  • 全質問を積んだままウィンドウにスクロールを付けるだけ: 報告(1)(3)が残る。 スクロールの修正は入れるが、それを解法とはしない。
  • Next/Back ボタン式ウィザード: タブより操作数が増え、Claude Desktop とも違う。 自動前進+クリック可能なタブが同じ役割を少ない操作で果たす。
  • インラインカードの40%キャップ撤廃: 質問中にトランスクリプトが読めなくなる。 キャップは 0.3.0 で圧壊対策として入れた実測済みの決定であり、触らない。
  • QuestionStepperModel の純テスト(自動前進が未回答のみを対象にすること、 multiSelect で前進しないこと、全回答で CanSubmit)。
  • ウィンドウホストの高さ制約は USS に依存するため、EditMode では 「質問変種のとき _details に flex-grow が入る」等の構造をテストし、 実寸の検証は本番エディタでの実測(上記 2b)を必須とする。

2b の高さチェーンには1リンク不足があった。 本ノートは「カードルート → _body → _details」と書いたが、実装エージェントの検証で .uap-permwin-root 自身(ウィンドウ ルートとカードの間のホスト)も flex-shrink: 0 既定のままであり、そこが縮まない限り 配下をいくら制約しても親ごとあふれることが判明した。修正はチェーン全体: .uap-permwin-root / .uap-perm--windowhost / 同スコープの _body / _details に flex-shrink: 1; min-height: 0;(+必要箇所に flex-grow: 1)。

なお基底 .uap-perm の flex-shrink: 0 は意図的に残す — これは 0.3.0 の 折りたたみ圧壊対策(インラインカードの要約行を守るガード)であり、ウィンドウホストは 常に展開状態なので同一詳細度・後勝ちの .uap-perm--windowhost で上書きする。

5. 差分レビューと実装後の実測(2026-08-05)

Section titled “5. 差分レビューと実装後の実測(2026-08-05)”

差分に3面×3レンズの敵対的レビューを回した(10件提起、9件生存)。処理:

製品修正 3件: (a) 質問切り替え時に共有 ScrollView の scrollOffset が残り、次の質問が 途中スクロール状態で現れる(3/3) — 切り替え時に 0 へリセット。実測: 手動で 60 に スクロール → 切り替え → 0 を確認。(b) 自動前進後、クリックした選択肢ボタンが display:none のセクション内でフォーカスを保持し続ける(2/3) — このファイル自身が SetShownInWindow で文書化して防いでいる危険と同型。セクションを隠すとき、その中に フォーカスがあればセクション限定で Blur する(タブや他の可視要素からは奪わない)。 (c) タブの空判定がサニタイズ前(3/3) — 絵文字だけの header が空白タブになる。 サニタイズ後に判定。

テスト修正 4件: ソーススキャンが (high) ルール内コメントで満たされる/(medium) コメントアウトされた規則にも一致する — コメント除去後に照合し、宣言全体 (property: value;)で照合する形へ。(medium)「ウィンドウのサイズ判定はカードの変種 判定と一致すべき」というテストが一致を実際には固定していなかった — 同じリクエストから カードも構築して両方向を固定。(low) ボタン配線が未検証 — UapUiClickDispatcher (本日実測済みの、デタッチ要素で実際に発火する唯一の経路)でタブと選択肢の実デリゲートを 駆動するテストを追加。

却下 1件: ウィンドウサイズが OpenForPending 時点の pending で決まり、描画時点と ずれうる(2/3) — 反証側の指摘どおり、到達には sub-tick の競合が必要で、起きても 高さ鎖の修正によりスクロールする窮屈なカードになるだけ(装飾的劣化)。再利用パスで リサイズしない設計は維持する。

最終実測(修正後に再測定): 560x520 でカード 504px(収まる)/ 240px の極小窓で ビューポート169 < コンテンツ238(スクロール作動)/ タブ4・表示1・タブ高さ21px単一 / 単一質問はタブ無し / scrollOffset リセット確認。サンドボックス 2011 tests / 0 failed。