概要
ルビータブで表示・編集していたプログラムが、コードタブ(ブロック)側で消えてしまうことがある、という不具合報告。間欠的に発生し、安定再現には至っていないが、ユーザー報告に加えてメンテナ側でも 1 度発生を確認したため、本格的に調査する。
特徴的なのは、ルビータブにはプログラムが残っているのに、コードタブのブロックだけが消えるという非対称な症状。報告者の手元でもルビータブにはプログラムが残っていた。
ユーザー報告
再現状況
- 複数のユーザーから類似の報告あり
- メンテナの手元でも 1 回だけ 発生を確認。その後の再現確認では再発していない
- 現時点で安定した再現手順は未確立(間欠的に発生)
再現手順(仮説・現状まだ再現できていない)
tools/playwright-verify/ の調査スクリプトに、現時点で最有力と考えている再現シナリオをエンコードしてある。いずれもこの手順では手元でまだ再現できていない(= 仮説段階)。
repro-costume-clears-blocks.mjs(VM 注入でブロックを用意)
workspaceUpdate の発火回数・XML 内のトップブロック数・deleteBlock 呼び出しを計測しながら、以下を実行する:
- スプライト 1 つにプログラム(
event_whenflagclicked → motion_movesteps(10))を用意し、コスチュームを 2 枚にする
- コードタブを開く(baseline)
- ルビータブ を開く(プログラムが Ruby として生成され、ルビータブ側に保持される状態を作る = 報告者の状況に合わせる)
- コードタブへ戻る
- コスチュームタブ を開く
- 2 枚目のコスチュームを選択(
setCostume(1))
- コードタブへ戻り、ブロックが消えていないか確認
仮説: コスチューム切り替えに伴うタブ再構築・workspaceUpdate の過程で、ルビータブには残るのにブロックワークスペースが空で上書きされる経路があるのではないか。
repro-costume-realdrag.mjs(パレットからの実ドラッグ)
上記が VM 注入でブロックを作るのに対し、こちらはパレットからの実ドラッグでネイティブな Blockly ワークスペース状態を作ってから、「コスチュームタブ → 別コスチューム選択 → コードタブ」を行う。実ユーザーの操作に近い状態で再現するかを確認する目的。
現状
- 上記 2 シナリオを実行しても、手元ではブロック消失を再現できていない
- そのため、抜けている条件(特定のブロック構成 / ルビータブでの編集有無 / タイミング / 端末・ブラウザ差)を引き続き探る必要がある
想定される発生箇所・調査の出発点
ルビータブ ↔ コードタブ(Blockly ワークスペース)間の同期処理周辺が疑わしい。特にタブ切り替え時にワークスペースが再構築される過程でブロックが失われるパターンを重点的に調べる。
調査対象の候補:
packages/scratch-gui/src/containers/ruby-tab.jsx — ルビータブ ↔ ブロック変換、タブ切り替えロジック
packages/scratch-gui/src/lib/ruby-to-blocks-converter/ — Ruby → ブロック変換
packages/scratch-gui/src/lib/ruby-generator/ — ブロック → Ruby 生成
- タブ切り替え時の
workspaceUpdate / Blockly ワークスペース再構築タイミング(コスチューム/音タブからコードタブへ戻った際の getBBox() 問題など、既知の Playwright 固有挙動とは別に、実機での消失を確認する)
調査方針
- 上記 repro スクリプトを足がかりに、ブロックが消失する具体的な操作シーケンス(抜けている条件)を特定する
- ルビータブ ↔ コードタブの相互変換・タブ切り替え時に、空のプログラムでブロックワークスペースが上書きされる経路がないか確認する
- 再現手順が確立できたら RED テスト(integration test)を追加し、TDD で修正する
関連
概要
ルビータブで表示・編集していたプログラムが、コードタブ(ブロック)側で消えてしまうことがある、という不具合報告。間欠的に発生し、安定再現には至っていないが、ユーザー報告に加えてメンテナ側でも 1 度発生を確認したため、本格的に調査する。
特徴的なのは、ルビータブにはプログラムが残っているのに、コードタブのブロックだけが消えるという非対称な症状。報告者の手元でもルビータブにはプログラムが残っていた。
ユーザー報告
フィードバック: 【修正済み】2026/05/30 14:44 [不具合報告] ルビー内に表示されているプログラムがコード内で消えている smalruby3-develop#91
報告内容(原文):
再現状況
再現手順(仮説・現状まだ再現できていない)
tools/playwright-verify/の調査スクリプトに、現時点で最有力と考えている再現シナリオをエンコードしてある。いずれもこの手順では手元でまだ再現できていない(= 仮説段階)。repro-costume-clears-blocks.mjs(VM 注入でブロックを用意)workspaceUpdateの発火回数・XML 内のトップブロック数・deleteBlock呼び出しを計測しながら、以下を実行する:event_whenflagclicked→motion_movesteps(10))を用意し、コスチュームを 2 枚にするsetCostume(1))仮説: コスチューム切り替えに伴うタブ再構築・
workspaceUpdateの過程で、ルビータブには残るのにブロックワークスペースが空で上書きされる経路があるのではないか。repro-costume-realdrag.mjs(パレットからの実ドラッグ)上記が VM 注入でブロックを作るのに対し、こちらはパレットからの実ドラッグでネイティブな Blockly ワークスペース状態を作ってから、「コスチュームタブ → 別コスチューム選択 → コードタブ」を行う。実ユーザーの操作に近い状態で再現するかを確認する目的。
現状
想定される発生箇所・調査の出発点
ルビータブ ↔ コードタブ(Blockly ワークスペース)間の同期処理周辺が疑わしい。特にタブ切り替え時にワークスペースが再構築される過程でブロックが失われるパターンを重点的に調べる。
調査対象の候補:
packages/scratch-gui/src/containers/ruby-tab.jsx— ルビータブ ↔ ブロック変換、タブ切り替えロジックpackages/scratch-gui/src/lib/ruby-to-blocks-converter/— Ruby → ブロック変換packages/scratch-gui/src/lib/ruby-generator/— ブロック → Ruby 生成workspaceUpdate/ Blockly ワークスペース再構築タイミング(コスチューム/音タブからコードタブへ戻った際のgetBBox()問題など、既知の Playwright 固有挙動とは別に、実機での消失を確認する)調査方針
関連