Website Rebuild(受賞クリエイティブサイト 1:1 再構築)
受賞歴のあるクリエイティブサイト(WebGL / スクロールナラティブ / ポートフォリオサイト)を、フォレンジック手法を用いて、独立して実行可能かつ検証可能な形で再構築します。「似せて作る」のではなく、元サイトのバンドルを唯一の仕様書とし、定量的な検証ゲートを通過した1行単位の移植を行います。
本手法は6つの連続した実践プロジェクト(工期が6.5週間から1日に収束)から抽出され、その後22件の完全な再構築 + 5件の消失サイトのアーカイブ救出で継続的にフィードバックされ、43サイトの境界探査テストで適用範囲が校正されています(一覧はリポジトリのREADME「検証済みサイト」参照)。
使用前提とライセンス ⛔ 必読
本スキルは、学習・研究目的での忠実な再構築を目的としており、受賞クリエイティブサイトの実装手法を研究するためのものです。適用対象は、あなた自身が所有する、ライセンスを得ている、または公開されており学習・模倣が許可されているサイトです。保護されたコンテンツの無許可収集、アクセス制御の回避、または他者の作品の商業的な盗用を目的としたツールではありません。
実行時には以下の境界を遵守します:
- ターゲットサイトのルールを尊重:
robots.txt、利用規約、著作権を遵守します。クロールは低頻度、単一セッションで行い、対象サイトに異常な負荷をかけません。⛔robots.txtはパス単位の許可宣言であり、サイト全体のスイッチではありません - URLごとに判定します(選択グループ → 最長一致 → 不一致なら許可)。Disallow行が存在するだけで「サイト全体禁止」と判断してはいけません(ほぼすべての商用サイトに/cart、/checkout、/adminのDisallowがあります)。禁止は動作カテゴリごとに分類し、「クロール」に対する禁止のみがミラーリング範囲に影響します。取引に対する禁止は「チェックアウトをクリックしてはいけない」という意味に過ぎません。⭐ 「読めない/わからない」は「禁止」と同じではありません: 判断できない場合は「呈交」し、作業を停止したり、クロール範囲を自分で狭めたりしてはいけません。読み方については references/legal-and-deploy.md §0.3 を参照してください。 - 保護された境界に触れない: ログイン、ペイウォール、またはライセンスが必要なコンテンツは収集しません。本スキルは匿名で公開アクセス可能なリソースのみを処理します。ターゲットサイトがこのような複製を明示的に禁止している場合は、処理を停止しユーザーに通知します - 「明示的禁止」とは何かについては
legal-and-deploy.md§0.3.6 にハードコードされた4つの閾値を参照し、それ以外の不確実性はすべて「呈交」とし、作業を停止しません。 - 成果物はデフォルトで非公開: デフォルトで noindex、公開デプロイは行いません。公開前には必ずアセットごとの著作権調査を完了し、「非公式の再構築」であることと原作者の帰属を明記する必要があります(references/legal-and-deploy.md 参照)。
⛔ 法的判断はユーザーの責任であり、スキルは調査と提示のみを行います(3つのルール、全工程で有効):
- 決定権はユーザーにあります: スキルは事実(アセットごとの帰属、ライセンス状態、第三者の権利者、元サイトがまだ営業中か、成果物内の第三者識別子)を収集し、オプションとそれぞれのリスク境界を列挙し、推奨事項とその理由を提示します。「公開/デプロイ/再配布/対外表示できるか」に関する事項については、以下の「User Input Tools」を使用して明示的にユーザーに判断を委ねなければならず、エージェントが自ら法的結論を下して処理を進めてはいけません。
- ユーザーから明確な決定を得るまでは安全なデフォルトに従います: プライベートリポジトリ +
noindex+ 公開デプロイしない + 再配布しない。ユーザーに説明する際は、これがデフォルトの動作であること(「あなたが決定するまで、私はこれを公開しません」)を伝え、エージェントが法的結論を下したものではないことを明確にします - 両者の責任は全く異なります。エージェントは保守的な側面でのみデフォルトを実行でき、公開側に進むにはユーザーの明確な決定が必要です。 - ⛔ 法的考慮によってミラーリングの完全性やゲートの適用範囲を減らしてはいけません: ミラーリングは証拠基盤であり、完全性は技術的不変条件です(四回法、クロージャーゲート、GAP=0 はすべてこれに基づいています)。取得しない理由は技術的理由のみ(ファイル/サーバーが提供しない、ライセンスやログインが必要、元サイトが明示的に禁止)でなければならず、すべて記録します。「どうせ公開しない」「余分に保存すべきでない」といった法的理由で穴を残してはいけません。実証例: あるプロジェクトで「成果物は決して公開しない」という理由でアセットの一種を「記録のみ、再取得しない」とし、約60%のアセットが欠落したまま5つのゲートがすべて緑であり続け、4つのマイルストーンを隠していました【objectarchive】。法的決定は成果物がどのように使用されるかに影響するのであって、証拠基盤が完全であるかどうかに影響するものではありません。
適用範囲 ⛔ 必読
本拠地(A クラス): コンテンツが静的にホストされ、署名動作(アニメーション/インタラクション)がすべてクライアント側の静的アセットに格納されているサイト - 命令型 WebGL/Canvas シーン、GSAP タイムライン、ベイク処理されたデータファイル(GLB/.buf/.riv)、minified または難読化されていないバンドル。ほとんどの Awwwards スタイルのクリエイティブサイトはこのカテゴリに該当します。
条件付きサポート(B クラス): パイプラインは成立するが、追加のシーン処理が必要(Shopify プラットフォームレイヤーの分離、サードパーティストレージバケットのアセット、ランタイム API スナップショット、SSG ペイロードの展開)。現在のバージョンのガイドはほとんどの B クラスシーンをカバーしていますが、カバーされていないものについてはユーザーにリスクを明示する必要があります。
明確に拒否(C/D クラス):
- C1(v0.3 以降で対応: リファクタリングによるリバースエンジニアリング): サーバーサイドコンポーネントのソース自体は配信されませんが、その完全な出力(フライトストリーム)は各ページの HTML にインライン化されており、比較可能な仕様書となります。手順: flight-decode で座標系を構築 → 構築可能な Next プロジェクトをリファクタリング(クライアントサイドコンポーネントは C2 に従って逐語的に翻訳、サーバーサイドコンポーネントはフライトツリーから明示的に登録された推論として逆推論) → verify-flight セマンティックゲートで検収(モジュール ID の全単射)。rauchg.com(Next 16/Turbopack)で実証: 18/18 ルートでセマンティック一致、ブラインドリバースエンジニアリングでの対答案構造 ≈95%/動作 ≈98%。⚠ C1 では L2/L3 が統合されます - 最初の成果物が「人間が書いたソースコード + ゲートによる等価性の証明」となります。全手順は references/rsc-reconstruction.md を参照してください。
- C2(対応可能、A クラスと同じ手順で実行): ⭐ 宣言的な書き方ですが、ソースコードが配信される(R3F / Theatre / Vue SFC コンパイル成果物)。実証された R3F サイト:
useFrameコールバック内はMathUtils.damp(x, y, 7, t)のような通常の命令型コードで、18 モジュールを逐語的にスライスしてページに差し込んだ後、CLEAN、8 つのキャンバスがすべて揃い、サイド間 99.5%。スライサーはパラダイムを気にしません - スライスするのはバイトです。レンダラーはプラットフォームレイヤーとしてミラーからサーブします。⛔ 判別器はライブラリ名ではなく、「クライアントが動作のソースを保持しているか」です(scope-and-fingerprint.md§4.0.1)。 - D: 主要な動作がサーバーサイドにあるもの(CMS コンテンツサイト、EC カート/在庫、A/B テストバケット、パーソナライゼーションインジェクション)- クライアントには移植可能な対象物がなく、決定論的な検収の基準もありません。
X クラス(救出可能): 元サイトが既に消失している(ドメイン移転、プラットフォームによる削除、パスの削除、別のコンテンツへの置き換え)が、Internet Archive にキャプチャが存在することが多い - scripts/wayback-mirror.mjs が CDX インデックスからアンカーと時間枠に基づいて一貫した瞬間を選択し、id_ の生のバイトで標準ミラーとして取得(下流のゲートはそのまま機能)。穴は既知の事実として wayback-holes.txt に記録します(読み方と手順については references/archival-rescue.md を参照)。⭐ 救出成果物は標準ミラーです - X クラスは L3 全体を完了できます(実績 first-launch: 戦略 A シェル + 数値ゲート 9,856 サンプル全等価 + ピクセル帯域内 + 自己完結ゲート、どのゲートもセマンティックの変更を必要としません)。⛔ 「CDX にカバレッジがないことが真に不可能であることの証拠」は、アセットレベルで読み、サイトレベルで読んではいけません: IA クローラーは JS を実行しないため、マニフェスト/連結駆動のサイトではコードレベルで 100% カバレッジでも画面レベルではゼロになる可能性があります(実証例: 157/160 アセットがどの年代でもゼロキャプチャ、オフラインで白画面)- Step 0 ではまずレイヤー別カバレッジ偵察(推論 + CDX プレフィックス検索)を行い、救出の深さを予測します。詳細は archival-rescue.md §1.9 を参照。歴代受賞サイトの消失率は約 29% です - これが「最初の瞬間にミラーリングする」ことが本スキルの第一の規律である理由です。
クラスの判定は Step 0 のフィンガープリント偵察によって決定されます。完全な判定ツリーは references/scope-and-fingerprint.md を参照してください。拒否する場合は、理由とそのサイトがどのクラスに属するかを説明し、無理に実行しないでください。
User Input Tools
ユーザーに質問する必要がある場合(範囲の確認、法的決定、外部依存関係の決定): 現在のランタイムの組み込み質問ツール(AskUserQuestion など)を優先して使用します。ない場合は、番号付きの質問リストを出力し、ユーザーに番号で回答させます。複数の質問をマージして一度に質問できる場合はそうします。法的な質問は legal-and-deploy.md §0.1 の5段落形式に従って書きます: 事実 / 調査できないこと / オプション / 各オプションのリスク境界 / 推奨事項と現在のデフォルト動作。
憲法(6つの規律、全工程で有効)
以下の6つは6つのソースプロジェクトで「憲法レベル」と呼ばれ、いずれかに違反すると後の段階でバグとして返済されることになります:
- ミラーリングは神聖で、汚してはならない:
mirror/ディスクファイルは決して変更しません。すべてのローカライズ適応(CDN 書き換え、外部リンク stub)は、サービスレイヤーがレスポンス時に動的に行います。 - 元サイトのコードが唯一の判断基準であり、見た目で修正してはならない: 各変更は、バンドル/CSS/ミラー HTML 内で該当する行番号を見つけてから実装します。ビジュアル、モーション、インタラクションを目視で調整してはいけません。
- 元サイトにあるものはすべて含め、元サイトにないものは作成しない: 補償的な CSS/JS を自分で作成してはいけません。たとえ似ていなくても、ルールを発明してはいけません - 自作のパッチはメカニズムの調整後にバグとして逆転します。
- バグ/デッドコード/奇妙な書き方はそのままコピーし、修正しない: 圧縮コード内の奇妙な書き方のそれぞれが、動作そのものである可能性があります。no-op バグを「親切に修正」した結果、トランジションがクラッシュした事例があります(実証は porting-discipline.md を参照)。
- 意図的な差異は必ず記録する: 「元サイトがどうしているか / 私たちがどうしているか / なぜ / どのような条件で再検討するか」を明確に書きます。記録されていない差異はすべてバグとみなされます。
- コードとドキュメントは同じコミットで: 各マイルストーンはペアでコミットします(
Port xxx+Update rebuild plan: xxx)。ログには必ず成果物、検収、教訓、次のステップのブレークポイント(行番号付き)を含めます。
⭐ 規律 3 の M(n+1) における境界: src/ は明示的に登録された派生物であり、元サイトに対する主張ではありません。したがって、src/ 内でのリネーム、モジュール分割、コメントの追加は「発明」にはあたりません - 規律 3 が制約するのは「見た目を似せるために動作を自作すること」であり、「等価であることが証明されたコードを読みやすくすること」ではありません。ただし、2つのハードな境界は変更できません: ① 構造的な書き換えはデフォルトで禁止(重複の統合、共通関数の抽出、アルゴリズムの変更 - これらは等価性を判断不可能にします);② コメント内の推測は推測であると明記しなければならず、リバースエンジニアリングノートの推測を平叙文で書いてはいけません。port/ と mirror/ は依然として1バイトも変更してはいけません。詳細は references/readable-source.md §3.4 と §5 を参照してください。
ワークフロー
進捗チェックリスト
[ ] Step 0 フィンガープリント偵察と範囲ゲート ⛔(クラス判定 A/B/C/D/X;C/D/X は拒否またはガイドし、次のステップに進まない)
[ ] Step 1 作業開始評価(アーキテクチャの反証、項目ごとの難易度評価、工数見積もり、ユーザーとの範囲確認 + 終了点 L1/L2/L3)
[ ] M0 ミラーリングフォレンジック ⛔(BFS クローラー + CDP 補足録 + マニフェスト台帳;GAP=0)
[ ] M0.5 ミラーリングをオフラインで動作確認 ⛔(ゼロ 404 / ゼロコンソールエラー / ゼロ外部リンク;serve.mjs でサーブ)← L1 ミラーリングアーカイブ 終了点
[ ] M1 リバースエンジニアリングで座標系を構築 ⛔(_pretty でバージョンを固定して展開;engine-notes をコードより先に記述;技術スタックを固定;REBUILD_PLAN を作成)
[ ] M2+ 厳密なソーストレース移植(依存関係順のマイルストーン進行;最初にエンドツーエンドのパスを1つ垂直に切る;各マイルストーンでコールドスタート実測 + CLEAN ゲート)
[ ] M(n-1) 比較検証(verification-gates.md の決定木に従ってゲートタイプを選択;根本原因を修正し、パラメータ調整でごまかさない)
[ ] M(n) 収束 ⛔(コールドヘッドレビュー / モジュールリストの突合せ;著作権調査 + ユーザーへの判断委任 - 公開デプロイ前に完了必須)← L2 エンジニアリング再構築 終了点
[ ] M(n+1) ソースコード化(port/ → src/: モジュール分割、難読化解除とリネーム、コメント追加、自己完結)← L3 ソースコード化 終了点
⛔ = ブロッキングゲート: 検収基準を達成しない限り、次の段階に進むことはできません。
フロー
Step 0 — フィンガープリント偵察と範囲ゲート。references/scope-and-fingerprint.md を読み込み、ユーザーから指定された URL に対して探知プロトコルを実行します(GET をパス単位で、最終 URL の同一性、2回取得の diff、種別/年代検証、バンドル初回検査)。クラス判定とその根拠を出力します。A/B クラスは継続、C/D/X クラスはユーザーに説明した後、停止またはガイドします。
Step 1 — 作業開始評価。references/recon-and-rating.md を読み込みます。アーキテクチャ仮説をまず反証します(依存関係テーブルは嘘をつく可能性があります)。項目ごとの難易度評価(素材/3D/スクロールオーケストレーション/プライベート形式/プラットフォームレイヤー)を行います。ユーザーに再構築範囲(サイト全体または特定のページ)と期待値を確認します。
⭐ 同じ質問内でユーザーに終了点を選択させます(3段階の梯子、クラス判定結果とレベル別のコスト見積もりを添えて質問し、選択肢を素っ気なく列挙しないでください):
| 終了点 | 答える質問 | 停止点 | 典型的な用途 |
|---|---|---|---|
| L1 ミラーリングアーカイブ | それがどのように見えるか | M0.5 | アーカイブ、オフライン鑑賞(受賞サイトの年間消失率約 29%) |
| L2 エンジニアリング再構築 | それが何をしているか | M(n) | デプロイ可能で検証可能な 1:1(著作権調査とデプロイ評価を含む) |
| L3 ソースコード化 | それがどのように動作するか | M(n+1) | 実装手法の研究と学習 |
梯子は単調であり、低い方を選んでも損はありません: 各レベルは次のレベルのプレフィックスであり、ミラーリングの規律により、時間に敏感な部分が常に最初に完了します - 今日 L1 を選んでも、後でアップグレードしたい場合はいつでも続行できます(この点をユーザーに説明してください)。「それを自分のプロジェクトに使う」(足場化)は本スキルのフェーズではありません - ユーザーから質問があった場合は references/beyond-the-rebuild.md を参照するように伝えて引き継ぎます。それはユーザーのエンジニアリングであり、スキルは「人間が読める真実」までです。
M0 / M0.5 — ミラーリングフォレンジック。references/mirroring.md を読み込みます。scripts/mirror-site.mjs で BFS クロール + scripts/netcapture.mjs で実際のブラウザによる補足録を行います。マニフェストにファイルごとの sha256 を記録します。redirect: manual の規律を守ります。外部依存関係は項目ごとに決定します。scripts/verify-mirror.mjs はミラーリング自体のゲートです(5つのアサーション、オフラインゲートの前に実行 - 下流のすべてのゲートは「レンダリングできるか」を問い、間違ったミラーでもそれらがすべて緑になる可能性があります;HTTP 200 は「そのリソースを取得した」ことの証拠にはなりません)。scripts/serve.mjs でミラーをサーブし、オフラインで検証します。このステップは常に最初に行います - 元サイトはいつでも消失または変更される可能性があり、ミラーはプロジェクト全体で唯一の証拠基盤であり、以降のすべての比較のための参照サーバーとなります。
M1 — リバースエンジニアリングで座標系を構築。references/reverse-engineering.md を読み込みます。⛔ 最初のアクションはバンドルの形態を判定することです(フラット連結 / モジュラーバンドル / マルチチャンク)。その後、ツールを選択します - 階層テーブルでトップレベルの宣言をスキャンします。webpack バンドル成果物のトップレベル宣言数は 0 であり、境界と依存関係のエッジはバンドラーによって与えられます(実績: 24,378 行 → 569 の既成モジュール、scripts/module-map.mjs を使用)。コンテナを認識できない場合は FATAL とし、階層テーブルにフォールバックしてはいけません(§0.5)。scripts/beautify-bundle.mjs(js-beautify 1.15.1 固定)でバンドルを _pretty/ に展開します。以降、行番号がプロジェクト全体で唯一のソーストレース座標系となります。docs/engine-notes.md を最初に書き(テンプレート: assets/templates/engine-notes.md)、その後でコードを書きます。技術スタックはバンドルからフォレンジックして正確なバージョンを特定します。データ駆動型アニメーションはまず数値元帳をダンプします。REBUILD_PLAN.md(テンプレート: assets/templates/rebuild-plan.md)を作成します。
M2+ — 厳密なソーストレース移植。references/porting-discipline.md を読み込み、ブランチルートテーブルに従って対応するシナリオガイドを読み込みます。移植された各ファイルの先頭には、元の行番号範囲を明記します。GLSL/マジックナンバー/データは逐語的に抽出します。データアセットはスクリプトで抽出してリポジトリに格納し、手書きはしません。
M(n-1) — 比較検証。references/verification-gates.md と references/determinism.md を読み込みます。サイト全体のレンダリングの幅は scripts/sweep-routes.mjs で行います(全ルートを1つのブラウザで、ルートごとに0エラー/0失敗/0外部リンク + インタラクションフックとルートごとの収集)。単一ルートの深さには probe.mjs を使用します - ⛔ ルートごとに Chrome を起動するループを手書きしてはいけません。コストはブラウザの起動回数に比例し、同時プローブはお互いの孤児プロセスを刈り取ります。⚠ 残差を帰属する前に、まず自己比較帯域幅を構築します(pixelcompare --self、サイドごとに ≥4 回、インタリーブ実行)- 帯域幅のない残差はすべて UNCLASSIFIED となり、UNCLASSIFIED は合格ではなく失敗です。ゲートタイプの選択: SSR/静的 HTML 成果物がある場合はまずバイトゲートを構築 → DOM 静的シーンはエントロピー源を凍結して byte-equal → 動的シーン(WebGL/ビデオ/ランダムフェーズ)は定量指標にダウングレード + ノイズ分類 → データ駆動型アニメーションは数値プローブゲートを追加 → CLEAN ゲートが全体をカバー。タイミングバグを判定する前に、まずプローブを校正します(references/environment-traps.md)。
M(n) — 収束。コールドヘッドレビュー: バンドルのトップレベルのクラス/モジュールリストを1つ1つ照合し、実装箇所を確認します(機能テストではブロック全体の欠落を検出できません。リストの突合せのみが可能です)。references/legal-and-deploy.md を読み込み、著作権の調査を完了し、決定をユーザーに委ねます - ユーザーが決定するまでは安全なデフォルトに従います(プライベート + noindex + デプロイしない)。公開前には必ずアセットごとの著作権調査を完了し、非公式の再構築であることを明記します。
M(n+1) — ソースコード化。references/readable-source.md を読み込みます。M(n) までの成果物は正しいことが証明されているが、人間には読めません(実績: 14,271 行が1つのファイルに詰め込まれ、e が 2962 回出現し、コメントは 0.2%)。このフェーズでは port/ を src/ に書き換えます: モジュール分割 → スコープセーフに難読化解除してリネーム → セクション別コメント追加 → アセットをコピーして自己完結させる。⛔ 分割の粒度は自由に選択できません - フラットスクリプトの宣言順序が評価順序であり、粒度は3つのハード制約(相互参照 / 評価順序 / import バインディングは代入不可)によって決定されます。まず分割案を作成し、レビューを受けてから、実際に分割します。巨大なモジュールに遭遇した場合は、まず「少数の末尾シングルトンの遅延バインディング」の効果曲線を測定してから決定します(実績: 6つのバインディングで 11,246 行が 1,013 行に減少。一方、モジュールシステムを変更するにはツールチェーン全体を犠牲にして同じ粒度を得る必要があります)。⭐ 「これはできない」という判断は非常に信頼できません - 構造的に不可能と2回判定されたケースで、実際の原因は2回とも自身のツールの1行のバグでした。まず対象を測定するツールを疑い、次に対象そのものを疑います(readable-source.md §3.1–3.1.3)。⛔ 前提条件は交渉不可: まずすべて緑のゲートが必要です。 審判のいないリファクタリングは盲目的な変更です。meanAbsDiff 0.00 の審判があれば、各ステップが証明可能になります - これがリファクタリングに最も適した条件であり、最後に行わなければならない理由でもあります。既存のゲートはすべてそのまま再利用します(ターゲットを src/ のビルド成果物に変更し、許容範囲は緩めてはいけません)。さらに、シンボルマッピングゲートと自己完結ゲートを追加します。⛔ 構造的な書き換え(重複の統合、共通関数の抽出、アルゴリズムの変更)はデフォルトで禁止です - ゲートが「等価性の証明」から「不等価性を検出していない」に退化します。⭐ 規律 4 はこのフェーズでも依然として有効です: 今やコードを読めるようになり、「これは明らかにバグだ」という衝動がどのフェーズよりも強くなりますが、それでも動作そのものである可能性があります。
⭐ コンテナのない scope-hoisted 成果物(Vite/esbuild、逐語的に階層配信されるサイト)は別の道を辿ります: 書き換えず、スライスします - 拼接型分解(scripts/census-bundles.mjs でチャンク図と座標を出力 → scripts/slice-esm.mjs で宣言単位でセマンティックに名前付けられたパーツにスライスし、順序通りに連結してバイト単位で元のファイルと等しくする → scripts/verify-reassembly.mjs で1つのゲートで確定、バイト等価が成立すれば、すべてのランタイムゲートの判断が無料で移譲されます)。実行側は変更せず、ブラウザは引き続き元のチャンクを実行します。詳細は readable-source.md §3.0.6 を参照してください。
ブランチルートテーブル
Step 1 の偵察結果に基づいて、どのシナリオガイドを読み込むかが決まります(必要に応じて、すべてを読み込まないでください):
| 偵察結果 | 読み込み先 |
|---|---|
Next.js App Router / RSC(self.__next_f フライトストリーム)- C1 リファクタリング型リバースエンジニアリング | references/rsc-reconstruction.md |
| WebGL / Canvas シーン(three.js、自社エンジン、GLSL) | references/webgl-scenes.md |
| GSAP / ベイク処理されたアニメーションデータ / CSS 変数アニメーション / 自社入力ステートマシン | references/animation-recovery.md |
| プライベートバイナリ形式(.buf / .sog / VAT / GLB タイムライン / .riv) | references/binary-formats.md |
Shopify ストア(フィンガープリント: cdn/shop、Shopify.theme、cdn.shopify.com) | references/shopify-platform.md |
Sanity CMS(フィンガープリント: cdn.sanity.io/images/<projectId>/、*.api.sanity.io、ペイロード内の _key/_type/_ref)- ⛔ クラス判定はコンテンツのベイクタイミングに基づき、ライブラリ名には基づかない。auto=format アセットは Accept ヘッダーに応じて異なるバイトを返す | references/sanity-platform.md |
| DOM レイヤー戦略の選択(すべてのサイトが通過; Webflow エクスポート / 静的シングルページ / フレームワーク SSR でブランチが異なり、「DOM が 3D エンジンによって座標ソースとして読み取られる」という直交制約もある) | references/dom-shell-strategies.md |
| 大規模アセット(数百 MB のメディア / ライセンスフォント) | references/asset-management.md |
| ヘッドレスプローブで動作異常 / 環境問題の疑い | references/environment-traps.md |
Step Summary
| フェーズ | 主要なアクション | ブロッキングゲート検収 | 成果物 |
|---|---|---|---|
| Step 0 | フィンガープリント探知でクラス判定 | クラスが明確でユーザーに通知済み | クラス判定結果と根拠 |
| Step 1 | 反証 + 評価 + 範囲確認 | ユーザー確認 | 難易度評価表、範囲合意 |
| M0/M0.5 | ミラーリング + 台帳 + オフライン動作確認 | verify-mirror 5項目すべて緑;GAP=0;ゼロ404/ゼロエラー/ゼロ外部リンク | mirror/(読み取り専用)、マニフェスト、serve.mjs 参照サーバー |
| M1 | バンドル展開、リバースエンジニアリングノート、スタック固定 | engine-notes 完了;バージョン固定表完了 | _pretty/、docs/engine-notes.md、REBUILD_PLAN.md |
| M2+ | ソーストレース移植、マイルストーンペアコミット | 各マイルストーンでコールドスタート実測 + CLEAN ゲート緑 | 行番号コメント付きソースコード、3つの登録表を更新 |
| M(n-1) | 比較検証 | 選択されたゲートタイプがすべて緑、または差異がすべて登録済み | 検証スクリプト + 比較成果物をリポジトリに保存(docs/compare/) |
| M(n) | コールドヘッドレビュー + 著作権調査 + ユーザーへの判断委任 | リスト突合せでゼロギャップ;ユーザーがデプロイ決定済み(未決定の場合は安全なデフォルトを維持) | 監査記録、DEPLOY.md |
| M(n+1) | モジュール分割 + 難読化解除 + コメント + 自己完結 | 既存ゲートすべて緑かつ許容範囲の緩和なし;シンボルゲートが双方向単射で孤児ゼロ;自己完結ゲート(コピーして、オフラインで、ビルド)通過 | src/(可読なプロジェクト)、docs/rename-map.json、src/README.md |
スクリプトディレクトリ
Node 22+、パスは本スキルディレクトリからの相対パス。使用方法と成熟度の詳細は scripts/README.md を参照してください。
⭐⭐ 依存関係の規律はディレクトリではなくフェーズに基づいています: ソースコード化の前は、パイプライン全体が依存関係ゼロです。
Step 0 → M(n) までは何もインストールしません;再構築プロジェクトが devDependencies を取得するのは M(n+1) になってからです(スコープセーフなリネームには本物のパーサーが必要)。scripts/(依存関係ゼロ)と tools/(devDeps 許可)は、このフェーズラインをディレクトリに投影したものに過ぎません - 判別基準は scripts/ に、ソースコード化フェーズのリファクタリングツールは tools/ に配置します。
⛔ どのゲートもツールを import してはいけません(verification-gates.md §2.1.2)- 検査者は生産者であってはいけません。
⭐ 以前のフェーズで本物のパーサーが必要な場合はどうすればよいですか?外部ツールとして呼び出し、import しないでください。 beautify-bundle.mjs(js-beautify)と module-map.mjs(acorn)は両方とも、バージョンを固定した npx を spawn で呼び出します。スクリプト自体は依然として依存関係ゼロで、独立してレビュー可能です。⛔ 手書きの字句解析器に変更しないでください - 本スキル内で試みられ、引用符を含む正規表現リテラルにより 16,177 行も誤った結果になりました(F27)。トークンストリーム上の括弧マッチングは正確ですが、テキスト上の括弧マッチングは文字列/正規表現/コメントに対する推測です。
⚠ この線は違反された後に初めて発見されました: module-map.mjs は @babel/* に依存していましたが、scripts/ 内に8つのバージョンにわたって存在し、同じ規律の原文がその3行上に書かれていました。ドキュメントにのみ書かれ、何もチェックしていないルールは、静かに機能しなくなります。
| スクリプト | 用途 | 使用フェーズ |
|---|---|---|
scripts/fingerprint.mjs | Step 0 の6ステップ探知プロトコルのクロスプラットフォーム等価実装(GET 存活確認 + リダイレクトチェーンと終点ドメイン同一性、2回取得 diff、種別/年代、HTML 技術フィンガープリント、バンドル初回検査;出現回数カウントと <1KB Referer リトライを内蔵;Sanity CMS 証拠収集 - projectId/dataset/API ホスト/auto=format/_key、3つの綴りを正規化、ヒットしたら sanity-platform.md を参照)。証拠のみ収集し、クラス判定は出力しない - クラス判定は scope-and-fingerprint.md §3 の決定木に従う | Step 0(POSIX ツールチェーンがない場合) |
scripts/mirror-site.mjs | BFS クローラーミラーリング(アセットホワイトリスト + 不動点まで反復;redirect:manual + 3つの台帳、ファイルごとの sha256 を含む;⭐ redirects.tsv はマニフェストと同様に実行をまたいで累積 - --scope でページを補足すると、以前にヘッダーのみに切り詰められ、ペイロードゲートが /work で 404 に当たって初めて発見された)。--scope <プレフィックス> でページキューを対象パスの下に制限します(サブサイトが企業 CMS ドメイン下にある場合に必須;⛔ ページのみを制限し、アセットは制限しない)。台帳は累積(--seeds で漏れを補足しても、前のラウンドの行は切り詰めない)+ オフホスト調査(フォローしないホストを個別にカウントし、警告 - サイレントな破棄により、827 のメディア参照が消失し、レポートには「57 files saved」と記録された) | M0 最初のパス |
scripts/netcapture.mjs | 実際のブラウザ CDP キャプチャでランタイムリソースの突合せと補足(CDN サイトでは --hosts を必須、そうしないと同一オリジントラフィックのみを監視し、誤った GAP=0 を報告する) | M0 2回目のパス |
scripts/verify-mirror.mjs | ミラーリング自体のゲート、オフラインゲートの前に実行。5つのアサーション: マッピング単射性 / 台帳とディスクの sha256 / 真正性(チャレンジページの本文と宣言されたタイプをマジックナンバーと照合 - 200 は「そのリソースを取得した」ことの証拠ではない) / クロージャー / オプションのサンプリングによるソースへの再確認。下流のすべてのゲートは「レンダリングできるか」を問い、間違ったミラーでもそれらがすべて緑になる可能性がある | M0 の帳簿締め前、ミラーを再取得するたびに |
scripts/gapfill-video.mjs | HLS/DASH ストリーミングメディアの段階的補足(マスター → レンディション → セグメント)、静的クローラーの構造的ブラインドスポット | M0(ストリーミングメディアがある場合) |
scripts/reconcile-gaps.mjs | ランタイムギャップ突合せツール: netcapture が記録した GAP 行と、バイトから導出された完全なリスト(例: next/image の srcset 階段の全列挙 - 実績 1,078 vs ブラウザが到達した 217)を1行ずつミラーに補足します。⭐ リクエストヘッダー梯子(標準プロファイル 4xx → ベアプロファイルでリトライ: 同じ 403 に2つの相反する対処法がある、landonorris は Referer を必要とし、video.twimg は Referer を嫌う)+ URL ごとのフォールトトレランス + バッチ別の台帳管理(1回のクラッシュで台帳外のファイルを残さない)。⛔ 画像 URL の標準プロファイルはブラウザと同様の画像 Accept ヘッダーを送信します(lib/negotiate.mjs)- auto=format 系 CDN は Accept ヘッダーに応じて形式をネゴシエートし、*/* はフォールバックバイトを取得します(basement D5: 391 バリアントすべてがフォールバックし、ゲートはすべて緑)。台帳には profile+vary を記録 | M0(ランタイムリソースが多いサイト) |
scripts/flight-decode.mjs | C1 の座標系: 各ページの self.__next_f.push ストリームを、モジュール参照テーブル(I 行のエクスポート名 = 無料の tier-1 命名証拠)、HL プリロード、参照解決済みの要素ツリー + JSX アウトラインにデコードします。T 行は宣言のバイト数に従います;:HL の空 id 行はチェーンを切断してはいけません | M1(C1) |
scripts/verify-flight.mjs | C1 セマンティックゲート: ビルド成果物のフライトツリー ≟ ミラーのフライトツリー。独自のパーサーを内蔵(⛔ flight-decode を import しない - 検査者は生産者であってはいけません)。正規化は「動作を持ち込まないことが証明できる」ビルドハッシュ名前空間のみを対象とします(チャンク名/css-module クラス/メディアハッシュ/プロミス可能リソースマウントポイント/エンコーディング自由度)。モジュール ID はグローバルな全単射(1対多は即座にレッド)。サイト登録項目は --normalize-props(ISR エポックフィールド)と --normalize-class(ライブラリレンダリングサブツリー)を介します。その他のすべての差異はそのままレッドにします | M(n-1)(C1) |
scripts/serve.mjs | 依存関係ゼロの静的サーバー(MIME/Range/サービスレイヤー書き換え/リダイレクト再生)、元サイトの参照サーバーを兼ねる。--rewrite FROM::TO は登録型リテラル置換であり、ローカリゼーションでは対応できない種類の問題(ソースプログラムが自身のドメイン名で分岐し、ミラーがそのドメイン名にないため、...) | 全フェーズ |
...(以降、scripts/serve.mjs の説明が続きますが、原文が切り詰められているため、ここまでとします)
...