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