1仕組みと動作原理
プロセスの関門:まずDecision Contract(ユーザーの目的/決定スコープ/変更不能な事実/既存のデザイン言語/ファーストビューの不変条件/インタラクション状態/終了条件)を凍結し、その後に3つの独立したインタラクション設計候補(コマンド優先/キュー詳細/オブジェクト主導/比較主導/レジャー優先などのファミリ)を提案します。各候補は単なる見た目の差し替えではなく1つのインタラクション仮説であり、変数として変更するのはナビゲーション/選択/開示/アクションの帰属/情報順序のみに限定します。
Each candidate embodies a distinct interaction hypothesis rather than a skin.
build_board.py はコンプライアンスのゲートウェイ:board.json(schemaVersion=interaction-design-board/v1)を読み込み、2〜8個のバリアントであること、バリアントファイルがmanifestのディレクトリを逸脱せずシンボリックリンクでないこと、sha256による重複排除(バイト単位で同一なものは拒否)、各バリアントが自己完結型HTMLであること(外部script/img/link/poster/url()リソースの禁止、CSS @importの禁止、title必須、<base>禁止)を検証した上で、テンプレートを埋めて単一ファイルのBoardを出力します。
f"{field} depends on external resource {locator!r}; inline it as CSS, JS, or data URL"
実行時分離=テンプレート注入CSP + srcdoc sandbox iframe:各候補はsrcdocフレーム内にカプセル化され、Boardは default-src 'none' のCSP(unsafe-inline のスタイル/スクリプトおよび data:/blob: メディアのみ許可、connect-src/frame-src/object-src/form-action は全面禁止)を注入し、さらに sandbox='allow-scripts allow-forms allow-modals' を重ねて適用します。
policy.content = "default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'; img-src data: blob:; media-src data: blob:; font-src data:; connect-src 'none'; frame-src 'none'; object-src 'none'; base-uri 'none'; form-action 'none'"
テスト時スケーリング(test-time scaling):独立したワーカーコンテキストが存在する場合、1つの候補に対して1つのワーカーを割り当て、同一の凍結されたContractを共有しつつ、相互の出力を不可視に保つことで、類似案への収束を防ぎます。ワーカーが存在しない場合は直列に生成しますが、直前の候補ではなく凍結されたContractを再読み込みして処理します。
assign one candidate to each worker with the same frozen decision contract and only that candidate's hypothesis. Do not let workers see one another's output.
フィードバックループ:Boardが feedback.json / feedback-pending.json(regenerated:true の場合は regenerateAction iterate|remix を含む)を送信 → エージェントは承認された部分を保持し、失敗した軸を変更して、影響を受ける候補のみを再生成 → Boardファイルをバージョン管理 → gstack serve が既に存在する場合は POST /api/reload(レスポンス: {"reloaded":true})を実行。重複して serve を起動してもリロードとは見なされません。
curl -sS -X POST "${BOARD_URL%/}/api/reload" \ -H 'Content-Type: application/json' \ -d '{"html":"<absolute-versioned-board-path>"}'
プロダクション実装の関門:ユーザーがフィードバック要約を確認した後に初めて approved.json(選択結果/承認されたインタラクションルール/ファーストビューの不変条件/却下されたトレードオフ/実際に検証された状態/残された未知の事項/プロトタイプファイルの識別情報)を書き込み、その後にプロダクト実装へと進み、実ブラウザで同一の代表タスクを検証します——ピクセル単位の類似性だけでは完了と見なされません。
Then—and only then—implement in the product.
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| cli | python3(build_board.py,纯 stdlib) |
| cli | gstack design 可执行(可选:serve Board + /api/feedback + /api/reload;未装则开文件直用) |
| cli | curl(可选:Board 重载探测/触发) |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: python3 build_board.py(標準ライブラリのみ使用;manifestとバリアントHTMLを読み込み、design-board.htmlを出力)
- 环境变量 / API Key: ベンダーサービスAPIキーの読み取り: なし
- 本地工作目录: ファイルの読み書きと成果物の出力: build_board.py が session-dir/design-board.html を書き出し、エージェントがプロセスに従って session-dir に boa を書き出す
5二重目の独立検証
- [ok] 穿越/symlink/外部资源拒绝 — resolve_variant: symlink 拒 + relative_to(root) 校验;validate_self_contained: RESOURCE_PATTERNS 扫 script/img/link/video/url(),仅放行 data:/blob:/about:。
- [ok] CSP 断网声明 — 模板 241 行 CSP 含 connect-src 'none'; frame-src 'none'; object-src 'none';srcdoc + sandbox allow-scripts allow-forms allow-modals 双保险。
- [ok] sha256 去重与变体数上限 — seen_hashes 重复即 ContractError;'2 <= len(variants) <= 8'。
- [ok] 无网络外发/凭证 — build_board.py imports 仅 stdlib(argparse/hashlib/html/json/re/sys/html.parser/pathlib);无 http/密钥。
- [unlocatable] gstack serve/reload 集成 — 依赖外部 gstack 工具(仓库外),本环境未安装;SKILL 中 serve/reload/反馈端点语义无法端到端验证,代码侧仅见模板对 __GSTACK_SERVER_URL 与 ./api/feedback 的 POST。
- [unlocatable] Board 内候选交互可用性(UI 层) — 模板 434 行含 tab/对比视图/反馈面板 JS,未在浏览器实测;fixtures+test_build_board.py 覆盖构建层而非视觉层。
6結論
bb7d5b878d07fe8e…