Skip to content

fix(url-loader): 特定 Scratch プロジェクト URL が読み込めず初期画面に戻る #972

Description

@smalruby3-editor-bot

概要(ユーザー不具合報告・2 件)

smalruby.app で Scratch プロジェクト URL を入力して読み込む機能(URL ローダー)で、特定のプロジェクトが読み込めない報告が 2 件届いた(同一報告者・2026/07/11)。

一般の URL 読み込みは動作する(過去に修正済み)ため、この 2 プロジェクト固有の内容(未対応ブロック / 拡張機能 / 新しい Scratch フォーマット等)が VM ロードで失敗している疑いが強い。

関連コード(読み込みパイプライン)

  • packages/scratch-gui/src/lib/url-loader-hoc.jsx — 入力 → fetchProjectInfoapi.smalruby.app/scratch-api-proxy で project_token 取得)→ scratchStorage.load(project.json 取得)→ loadProjectWithChecks → 成功でモーダル閉じ、失敗で formatLoadError を表示。
  • packages/scratch-gui/src/lib/project-loader-utils.jsloadProjectWithChecks: vm.hasMeshV1Projectvm.loadProjectvm.hasKoshienProject
  • packages/scratch-gui/src/lib/url-loader.js — エラー分類(404/403/5xx/network/汎用)。
  • packages/scratch-gui/src/lib/url-parser.js — URL → projectId 抽出(標準 projects/<id> は対応済み)。

推定原因

  1. 「初期の画面に戻ってしまう」: vm.loadProject現在のプロジェクトをクリアしてから読み込むため、対象プロジェクトのデシリアライズ/ブロック変換で例外が出ると、クリア後・ロード未完了=空(初期)状態のまま残る。エラーは .catch されメッセージは出るが、状態が初期化されたままリセットされるのが「初期画面に戻る」症状。
  2. 「開かれない」: fetch 失敗(403=未共有 / 404 / network / proxy)または vm.loadProject の例外で、エラー表示のみでプロジェクトが開かない。
  3. 2 プロジェクト固有 → smalruby fork の VM/変換が対応しない要素(拡張機能・新ブロック・Ruby 変換不能ブロック等)を含む可能性。

調査方針(worker 向け)

  • 再現: 2 つの projectId を api.smalruby.app/scratch-api-proxy/projects/<id> 経由で取得し vm.loadProject に流して実際の例外/失敗地点を特定する。
    • ⚠️ 注意: コンテナの egress allowlist で scratch.mit.edu / api.smalruby.app に到達できない可能性がある。到達不可なら、失敗する sb3 サンプルの添付を人間に依頼する(本 Issue にコメント)か、コードベースからの推定 + 下記の堅牢化を先行実装する。
  • 切り分け: fetch 段階の失敗か、vm.loadProject の例外か、変換段階か。ログ(log.warn('URL loader error:', error))の実エラーを確認。

修正方針(案)

  1. 堅牢化(プロジェクト固有の原因に依存せず実装できる本命): URL 読み込みが失敗しても UI を空の初期状態のまま放置しないvm.loadProject が throw したら、(a)明確な理由をユーザーに表示し、(b)可能なら直前のプロジェクト状態を保持/復元する(少なくとも「読み込みに失敗した/このプロジェクトは対応していない可能性がある」と分かる文言にする)。「何も言わず初期画面に戻る」を無くす。
  2. 原因対応: 特定できた未対応要素(拡張機能・ブロック)について、対応 or グレースフルにスキップして読み込む。
  3. 失敗 sb3 が入手できれば回帰テストを追加url-loader / project-loader-utils のユニット or integration)。

DoD

  • 2 プロジェクトの失敗地点を特定(到達不可の場合はその旨を記録し、堅牢化を先行)
  • 読み込み失敗時に初期画面へ黙ってリセットしない(明確なエラー表示、可能なら状態保持)
  • 原因が特定できた場合は対応 or グレースフル処理
  • 可能なら失敗ケースの回帰テストを追加
  • npm run lint

関連

Metadata

Metadata

Assignees

Labels

🙋 HITL人間の対応待ち(Project HITL=Yes の投影)🤖 autopilotautopilot が処理対象にした Issue/PR(daemon が付与)

Type

No type

Fields

No fields configured for issues without a type.

Projects

Status
Review

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions