Skip to content

fix(koshien): Test AI のURL最大長超過にファイル出力フォールバックを追加 (#845)#846

Merged
takaokouji merged 2 commits into
developfrom
topic/autopilot-845
Jun 30, 2026
Merged

fix(koshien): Test AI のURL最大長超過にファイル出力フォールバックを追加 (#845)#846
takaokouji merged 2 commits into
developfrom
topic/autopilot-845

Conversation

@smalruby3-editor-bot

Copy link
Copy Markdown

Summary

ルビータブの「AIを試す」で、複雑な(=ソースが長い)AI が URL 最大長を超えてビューア起動に失敗する 問題を修正する(#845)。

AI ソースを base64 化して ?player1=data:<base64> クエリパラメータに詰める方式のため、AI が長くなるほど URL が肥大化し、ブラウザ/ビューア/iframe の URL 長制限に引っかかってロードできなくなっていた。

Issue の修正方針のうち、editor 単独で完結する案C(ファイル出力フォールバック) を実装した(案A: postMessage / 案B: 圧縮 はビューア側=別リポジトリの対応が必要なため別途検討)。

Changes Made

  • lib/koshien-test-url.js:
    • MAX_KOSHIEN_TEST_URL_LENGTH(8000 文字)と isKoshienTestUrlTooLong(url) を追加。
    • buildKoshienTestPlan(code) を追加。URL が長すぎる場合は tooLong: true を返し、AI 無しの base URLurl として返す(ビューアはデフォルト AI で起動)。
  • components/koshien-test-modal/koshien-test-modal.jsx:
    • buildKoshienTestPlan を使い、tooLong のときは AI 無し URL でビューアをロードしつつ、AI を .rb ファイルとして保存する導線(バナー + ダウンロードボタン)を表示。
    • ファイル名は編集中スプライト名(<sprite>.rb、不正文字は _ 置換、フォールバック koshien_ai.rb)。
    • テスト用に非接続コンポーネントを named export(KoshienTestModal)。
  • バナーの CSS / 日本語ロケール(ja.js / ja-Hira.js)を追加。
  • docs/extension-koshien/README.md にフォールバック挙動を追記。

短い AI の従来挙動(URL 直結)は維持される。

Test Coverage

  • test/unit/lib/koshien-test-url.test.js: isKoshienTestUrlTooLong の境界、buildKoshienTestPlan(短い AI は player1 埋め込み / 大きい AI は too long + base URL フォールバック / カスタム base URL)。
  • test/unit/components/koshien-test-modal.test.jsx(新規): 短い AI は iframe に player1= を含みバナー非表示 / 大きい AI はバナー表示・iframe に AI 無し / ダウンロードボタンが <sprite>.rb を保存。
  • ローカルで該当ユニットテスト(16 件)pass、Prettier format:check pass、変更ファイルの eslint 0 errors を確認。

注: 本 worktree は src/generated/*.cjs(microbit hex URL)が未生成のため npm run test:lint 全体は 2 件の build-artifact 由来 import エラーで止まるが、本 PR の変更とは無関係(CI は build 後に lint する)。

DoD(実機確認の観点)

  • 単純な AI で「AIを試す」が従来どおり自分の AI で動く。
  • 10KB 程度の経路探索 AI で「AIを試す」を実行 → ビューアが白画面にならず起動し、.rb 保存導線が出る。保存した .rb をビューアから読み込んで AI を動かせる。

Related Issues

Closes #845
関連: Epic #738(甲子園拡張)、#840(「AIを試す」の保存処理)

Complex AIs (e.g. path-finding) produce a base64 player1 query parameter that

overflows the viewer URL length limit, so the iframe fails to load. Add

buildKoshienTestPlan: when the URL exceeds MAX_KOSHIEN_TEST_URL_LENGTH (8000),

load the viewer without the AI (default AI) and show a banner letting the user

save the AI as a .rb file to load into the viewer manually. Short AIs keep the

previous URL-embedded behavior. This is the editor-only fallback (案C of #845).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@smalruby3-editor-bot smalruby3-editor-bot Bot added the 🤖 autopilot autopilot(AI)が管理する PR/Issue(AI処理対象) label Jun 30, 2026
@smalruby3-editor-bot

smalruby3-editor-bot Bot commented Jun 30, 2026

Copy link
Copy Markdown
Author

🤖 autopilot status

field value
Status Review
AI Status
HITL Yes
Size middle

Linked issue #845. Maintained by autopilot (single writer); do not edit.

@github-actions

Copy link
Copy Markdown

🚀 Preview deployed: https://smalruby.jp/smalruby3-editor/topic/autopilot-845/

@smalruby3-editor-bot

Copy link
Copy Markdown
Author

🤖 autopilot 敵対的レビュー (review フェーズ)

別の批判的レビュアーとして差分をレビューしました。ブロッカーなし。自動修正が必要な明白な問題は見つかりませんでした。

確認済み(良い点)

  • 正確性: buildKoshienTestPlan は full URL を組んでから長さ判定し、超過時のみ AI 無し base URL にフォールバック。tooLongcode 非空のときだけ true で、空コードは従来どおり base URL を維持。境界(> MAX)も unit test で担保。
  • 回帰なし: 短い AI は従来どおり player1= 直結。buildKoshienTestUrl は残置され既存呼び出しと整合。consumer (gui.jsx) は default(connected) export を import しており、named export 追加による二重 injectIntl はなし。
  • テスト: koshien-test-url.test.js(境界 / プラン分岐 / カスタム base URL)と新規 koshien-test-modal.test.jsx(短い AI=バナー非表示・iframe に player1 / 大きい AI=バナー表示・iframe に AI 無し / ダウンロードが <sprite>.rb)。ローカルで 16 件 pass。
  • 規約: 対象ファイルは Smalruby 固有(.prettierignore ホワイトリスト)でマーカー不要。新規テストを whitelist へ追加済み。eslint(src) 0 error、prettier OK、ロケール ja / ja-Hira 両方更新、docs/extension-koshien/README.md も追記済み。CI 9 ジョブ緑。
  • セキュリティ: base URL はハードコード HTTPS、埋め込むのはユーザー自身のコードのみ、ダウンロードは text/plain Blob。情報漏洩・認可・入力検証の懸念なし。

非ブロッキングの指摘(人間判断 / 任意)

  1. しきい値 8000 文字の意味づけ: 一般的な nginx/Apache のリクエストライン上限(~8190)に整合的で妥当。ただし URL がこの範囲〜実上限の AI は「以前はビューア起動できた可能性があるが今はダウンロード導線」になる。受け入れ条件(ファイル出力導線で可)は満たすが、将来ビューア側(案A postMessage / 案B 圧縮)が入れば撤廃候補。
  2. DoD スクリーンショット: 新しい UI 状態(koshien-test-too-long-banner + ダウンロードボタン)の追加に対し docs/extension-koshien/screenshots/ 未更新。ただしこのバナーは外部ビューア(netlab.jp)への iframe + 10KB 級 AI が必要で、本環境では headless 撮影が非現実的。公開タイミングで追補を推奨(任意)。
  3. 軽微: koshien-test-modal.test.jsx// eslint-disable-next-line import/first は、全行が import かつ test ディレクトリは eslint 対象外のため実質不要(無害)。

人間レビューへ引き継ぎます。

@smalruby3-editor-bot smalruby3-editor-bot Bot added the 🙋 HITL 人間の対応待ち(レビュー/判断/マージ) label Jun 30, 2026
@smalruby3-editor-bot smalruby3-editor-bot Bot marked this pull request as ready for review June 30, 2026 16:25
@takaokouji

Copy link
Copy Markdown

ファイルサイズが大きいAIを指定して、AIを試すを選択したが、
strongest_ai.rb.txt

AI を .rb ファイルとして保存する導線(バナー + ダウンロードボタン)を表示

とは、なりませんでした。AIもバナー + ダウンロードボタンが表示されるかどうかためしてください。表示されなければ、表示されるように改修してください。

@takaokouji takaokouji removed the 🙋 HITL 人間の対応待ち(レビュー/判断/マージ) label Jun 30, 2026
'gui.alerts.thumbnailError': 'サムネイルを設定できませんでした。あとでもう一度お試しください。',

'gui.koshienTestModal.title': 'スモウルビー甲子園のAIを試す',
'gui.koshienTestModal.tooLong':

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

en.js も修正が必要です。

…banner shows (#845)

The "Test AI" modal generated code only from the editing target
(`generatePreviewCode(vm.editingTarget)`), while the actual AI — what
"Save AI" writes — is the whole project (stage + every sprite, plus any
unsaved Ruby-tab edits). For a multi-class AI whose logic lives in a
sprite (or when the stage is selected, or before edits are converted
back to blocks), the editing target's slice is small, so the viewer URL
stayed under the length limit and the download-fallback banner never
appeared.

Make "Test AI" generate the full-project code via a new shared
`generateProjectCode` helper, and refactor "Save AI" (RubyDownloader) to
use the same helper so testing and saving can never diverge again (the
divergence was the root cause). The test path keeps the preview format
(no `forSave`) that the game viewer URL has always accepted; save keeps
`forSave: true`.

- ruby-script-preview.js: add `generateProjectCode(vm, {stage, sprites,
  version, rubyCode, forSave})` (all targets, stage-first, pending Ruby
  injected via targetsCode).
- koshien-test-modal.jsx: use it; connect stage/sprites/rubyCode.
- ruby-downloader.jsx: saveRuby() delegates to the shared helper.
- Tests: full-project generation includes sprite code with an empty
  stage, pending edits are injected, modal calls the whole-project
  generator and still shows/hides the banner correctly + a
  generation-throws fallback case.
- docs/extension-koshien/README.md updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@smalruby3-editor-bot

Copy link
Copy Markdown
Author

@takaokouji ご指摘ありがとうございます。原因を特定して修正しました(bc4e6e9)。

原因

「AIを試す」モーダルは 編集中スプライト単体 のコードしか生成していませんでした
generatePreviewCode(vm.editingTarget))。一方、実際の AI(=「AIを保存」が書き出す .rb)は
プロジェクト全体(ステージ + すべてのスプライト) です。

添付いただいた strongest_ai.rb(約 10KB)は、ロジックの大半が class Sprite1class Stage
ほぼ空(set_backdrops のみ)という構成でした。このため次のような場合に「中身の小さい AI」と
誤判定され、URL が 8000 文字を超えず、バナー + ダウンロードボタンが出ませんでした:

  • ステージを選択した状態で「AIを試す」を実行した(ステージ単体は数十文字)
  • AI 本体が別スプライトにあり、編集中スプライトには無かった
  • Ruby タブで編集したコードがまだブロックに反映されていなかった(「AIを保存」は変換してから
    保存するが、「AIを試す」はしていなかった)

strongest_ai.rb 全体を URL 化すると 14,231 文字(> 8000)になるので、全体を出力すれば
必ず too long 判定
になります。

修正

「AIを試す」を 「AIを保存」と同一のコード生成(プロジェクト全体 + 未保存の Ruby 編集も反映)に
変更しました。共通ヘルパー generateProjectCode を新設し、Test AISave AI の両方がこれを
使うことで、「試した AI」と「保存する AI」が二度とズレないようにしています(今回のズレが根本原因でした)。

  • ビューア URL に渡す形式(forSave なし)は従来どおり維持(短い AI の URL 直結は不変)。
  • 単体テスト追加: 全体生成がステージ空でもスプライトのコードを含むこと、未保存編集の取り込み、
    モーダルが全体生成を呼びバナー表示/非表示が正しいこと。
  • 関連ユニットテスト 37 件 pass、変更 src の eslint 0 error。

再確認のお願い

プレビュー(このブランチの再デプロイ後)で、添付の strongest_ai.rb を読み込んで「AIを試す」を
実行 → バナー + 「AIをファイルに保存」ボタンが表示されることをご確認ください。どのスプライト/
ステージを選択中でも、また Ruby を編集した直後でも表示されるはずです。

@smalruby3-editor-bot smalruby3-editor-bot Bot added the 🙋 HITL 人間の対応待ち(レビュー/判断/マージ) label Jun 30, 2026
@takaokouji takaokouji merged commit e2cb6e3 into develop Jun 30, 2026
9 checks passed
@takaokouji takaokouji deleted the topic/autopilot-845 branch June 30, 2026 23:29
github-actions Bot pushed a commit that referenced this pull request Jun 30, 2026
…ot-845

fix(koshien): Test AI のURL最大長超過にファイル出力フォールバックを追加 (#845)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🤖 autopilot autopilot(AI)が管理する PR/Issue(AI処理対象) 🙋 HITL 人間の対応待ち(レビュー/判断/マージ)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(koshien): 「AIを試す」が複雑なAIでURL最大長超過により失敗する

1 participant