技術解説: SOLAR LINE 考証の仕組み
本プロジェクトの技術アーキテクチャ — Rust軌道力学コア、WASM、TypeScript静的サイト生成、Claude Codeエージェントループによる自律開発を解説する。
はじめに
「SOLAR LINE」は、ゆえぴこ氏による『良いソフトウェアトーク劇場』のSFアニメシリーズです。太陽系を舞台にした宇宙船の航行が精密に描写されており、本プロジェクトはその軌道遷移の描写を宇宙力学的に検証しています。アニメ本編や分析の概要はトップページをご覧ください。
本ページでは、この考証を支える技術的な仕組みを解説します。AIエージェントが自律的にコードを書き、テストし、分析レポートを生成するプロジェクトの内部構造に興味がある方向けの内容です。
プロジェクト概要
SOLAR LINE 考証は、SFアニメ「SOLAR LINE」に描かれた軌道遷移を宇宙力学的に検証するプロジェクトです。
全5話に登場する24の軌道遷移について、実際の物理法則に基づくΔV計算・加速度分析を行い、描写の妥当性を検証しています。単に「正しい/間違い」を判定するだけでなく、どのような条件なら描写が成立するかをパラメータ空間の探索を通じて明らかにすることを目指しています。
現状サマリー
進捗
| 指標 | 値 |
|---|---|
| 完了タスク | 639 |
| 分析済み軌道遷移 | 24 / 24(全話完了) |
| テスト数 | 5,168(TS 4,261 + Rust 552 + E2E 355、0 failures) |
| コミット数 | 836+ |
| ADR(設計意思決定記録) | 15件 |
| DAGノード | 65(320エッジ)— 分析依存グラフ(詳細は後述) |
判定結果
| 判定 | 件数 |
|---|---|
| plausible(妥当) | 10 |
| conditional(条件付き妥当) | 9 |
| reference(参考) | 5 |
| implausible(非現実的) | 0 |
24件の軌道遷移で 非現実的な判定はゼロ。ただしマージン連鎖分析によると、条件付き判定の連鎖を考慮した場合の全行程成功確率は約30-46%。
「reference(参考)」は作中の描写値と直接比較できない参照計算を指し、plausible/conditionalとは別カテゴリです。
読者向け機能
- 軌道遷移アニメーション: SVGベースの軌道図。時間スライダーで天体位置の変化をアニメーション表示。複数シナリオの同時比較も可能
- DuckDB-WASM データエクスプローラー: SQLクエリによる全分析データの対話的探索
- インタラクティブ計算機: WASMでブラウザ上で軌道計算を再現。読者がパラメータを変更して検証可能
- 用語集ツールチップ: 専門用語にカーソルを合わせると定義をインライン表示
- uPlot時系列チャート: 推力プロファイル・放射線量・質量変化等のインタラクティブグラフ
- タイムスタンプリンク: 台詞引用の時刻表示がYouTube/ニコニコ動画の該当時点へ直接ジャンプ
分析の主要達成項目
- 全5話24軌道遷移の分析完了。クロスエピソード整合性分析(マージン連鎖、質量時系列、反事実分析)
- 3次元軌道解析(軌道傾斜角を考慮した面外ΔV評価)、相対論的効果の評価(光速の1〜2.5%での特殊相対論的補正量の定量化)
- 適応積分手法(RK45 Dormand-Prince + Störmer-Verlet シンプレクティック積分)
- poliastro クロスバリデーション(Python (scipy/poliastro) との三重検証)
- 姿勢制御精度の分析、通信解析、他の宇宙船・インフラ分析
- 誤差範囲可視化(時系列グラフにyLow/yHighバンド表示)
設計意思決定(ADR)
15件のArchitecture Decision Recordsで、プロジェクトの設計ポリシーを文書化しています。
アーキテクチャ全体像
システムは3層構成です:
- Rust 軌道力学コア (
solar-line-core): 軌道計算の正確性を保証 - WASM ブリッジ (
solar-line-wasm): ブラウザでも同じ計算を再現 - TypeScript レポート生成 (
ts/): MDX分析データ → 静的HTMLサイト
この構成により、レポート上のインタラクティブ計算機で読者が自らパラメータを変更して検証でき、計算結果がRustとTypeScript間で一貫していることが保証されます。
Rust 軌道力学コア
ランタイム外部依存ゼロで構築された軌道力学ライブラリです。WASM互換性のために外部クレートを使わず、すべての数学関数を自前で実装しています(テスト用オラクルとして nalgebra を dev-dependency で使用)。
主要モジュール
constants.rs: 太陽系天体の重力定数μ(NASA JPL由来)、物理定数units.rs: ニュータイプパターンによる型安全な単位系(Km, KmPerSec, Seconds, Radians)。km と km/s を混同するバグを型レベルで防止orbits.rs: vis-viva方程式、Hohmann遷移ΔV、Brachistochrone航法(加速度・ΔV・最大距離)、排気速度、質量比、Oberth効果kepler.rs: Kepler方程式の Newton-Raphson 求解、離心近点角・真近点角の変換ephemeris.rs: JPL平均軌道要素による惑星位置計算、位相角、会合周期、Hohmannウィンドウpropagation.rs: RK4 + RK45 Dormand-Prince 適応ステップ + Störmer-Verlet シンプレクティック軌道伝播。2体問題 + 推力モデル、エネルギー・角運動量保存の検証flyby.rs: パッチドコニック重力アシスト(SOI半径、動力/無動力フライバイ、脱出速度計算)attitude.rs: 姿勢制御精度(ミス距離、フリップ機動、RCSトルク、重力傾斜トルク)comms.rs: 光速遅延、自由空間伝搬損失、通信可能性判定mass_timeline.rs: 推進剤消費・コンテナ分離の質量時系列追跡orbital_3d.rs: 3次元軌道解析(軌道傾斜角、面外ΔV)relativistic.rs: ローレンツ因子、時間遅れ、相対論的ロケット方程式。光速の1〜2.5%での特殊相対論補正量の定量化plasmoid.rs: プラズモイド遭遇時の放射線量・軌道摂動推定vec3.rs: 3次元ベクトル演算(no_std対応)dag.rs: DAG依存グラフの分析(影響カスケード、レイアウト)
552のユニットテストで正確性を保証しています。
積分手法の比較
軌道伝播には3種類の数値積分手法を実装しており、場面に応じて使い分けています。
| 手法 | ステップ | 推力対応 | 長所 | 短所 | 主な用途 |
|---|---|---|---|---|---|
| RK4(固定ステップ) | 固定 dt | ✅ | 実装が単純、挙動が予測可能 | dt選択に注意が必要、急変時に精度低下 | 短時間のbrachistochrone遷移、重力捕捉 |
| RK45 Dormand-Prince(適応ステップ) | 自動調整 | ✅ | 精度と効率の自動バランス、加速度急変に対応 | 実装が複雑、ステップ数が非決定的 | トリム推力遷移(EP02)、高離心率軌道 |
| Störmer-Verlet(シンプレクティック) | 固定 dt | ❌(弾道のみ) | エネルギーの永年ドリフトなし | 推力非対応、2次精度 | 長期弾道軌道の検証、1000周回精度テスト |
RK4(Runge-Kutta 4次)
一言で言うと: 最も基本的で信頼性の高い積分法。短〜中距離の遷移に使用。
4次精度の固定ステップ積分器。各ステップで4回の導関数評価を行い、加重平均で次状態を求めます。dt=60s で重力捕捉のエネルギードリフトが ~2.9×10⁻⁹ に収まることを検証済み(Task 219)。単純で信頼性が高く、72時間~143時間程度のbrachistochrone遷移の主力積分器です。
RK45 Dormand-Prince(適応ステップ)
一言で言うと: 状況に応じて計算の細かさを自動調整する賢い積分法。推力のON/OFFが切り替わる場面に最適。
5次精度の埋め込み型適応積分器。4次と5次の解の差からステップ誤差を推定し、PI制御器でステップサイズを自動調整します。推力ON/OFFの不連続点(flipタイム)を検出してステップ境界を合わせる機能を持ち、EP02のトリム推力遷移(3日間推力→合計約87日の遷移)のような動的な場面に適しています。scipy DOP853 との交差検証で遷移時間の差が0.013%未満であることを確認(Task 221)。
Störmer-Verlet(シンプレクティック積分)
一言で言うと: 長期間シミュレーションでもエネルギー誤差が蓄積しない特殊な積分法。何千周回でも安定。
2次精度のleapfrog型シンプレクティック積分器。位相空間の体積を厳密に保存するため、エネルギーが真値の周りを振動するだけで永年的にドリフトしません。RK4では1000周回で ~10⁻⁸ 程度のドリフトが蓄積しますが、Störmer-Verletでは同条件で振動範囲に留まります。ただし推力を含む非保存力には対応せず、弾道軌道の長期精度検証に特化しています。
3手法の結果はRust内部のテストで相互検証されており、さらにPython(scipy/poliastro)との交差検証も実施しています。
WASM ブリッジ
Rust コアを wasm-pack でWebAssemblyにコンパイルし、ブラウザ上のインタラクティブ計算機から利用可能にしています。
設計方針: Flat f64 API
WASM の境界を越える際に複雑なデータ構造の受け渡しを避け、すべての関数が f64 のスカラー値を受け取り返す設計です。ニュータイプの wrapping/unwrapping はWASM境界で行います。
// TypeScript側
const dv = wasm.brachistochrone_dv(distance_km, time_seconds);
// WASM内部
pub fn brachistochrone_dv(distance: f64, time: f64) -> f64 {
core::brachistochrone_dv(Km(distance), Seconds(time)).value()
}
この設計により、TypeScript 側では型変換の複雑さを意識せず、Rust 側では型安全性を維持できます。
レポート生成パイプライン
分析結果はMDX形式(Markdownベース + 構造化データブロック)のファイルとして管理され、TypeScriptの静的サイト生成パイプラインでHTMLに変換されます。
データフロー
- MDX 分析データ (
reports/data/): エピソードごとの軌道遷移、パラメータ探索、台詞引用、軌道図定義をMarkdown + YAML frontmatter + コードフェンスブロックで記述 - MDXパーサー (
ts/src/episode-mdx-parser.ts): frontmatter、diagrams:/timeseries-charts:/dialogue-quotes:等のブロックを解析 - テンプレートエンジン (
ts/src/templates.ts): 純粋な文字列補間による外部依存ゼロのHTML生成 - ビルド (
npm run build): MDXを読み込み、全ページをdist/に出力 - GitHub Pages:
mainへのpush時に自動デプロイ
字幕・対話パイプライン
作中の台詞を正確に引用するための2段階パイプラインです。
Phase 1: 抽出
複数のデータソースから生のテキストを取得:
- YouTube自動字幕 (VTT):
yt-dlpで取得。VOICEROID音声の認識精度に限界あり - Whisper STT: OpenAI Whisper による音声認識。VTTより15-30%多くのテキストを検出
Phase 2: 話者帰属
コンテキストを考慮した話者の特定:
- 各発話に話者ID(きりたん、ケイ、etc.)を割り当て
- シーン分割と発話の文脈的修正
- 完全自動化ではなくAI支援による検証
2つのフェーズを別ファイル(epXX_lines.json / epXX_dialogue.json)で管理することで、Phase 1の再実行がPhase 2の成果を破壊しない設計です。
テスト戦略
TDD(テスト駆動開発)を原則とし、5,168のテストで品質を保証しています。
テストの内訳
- Rust ユニットテスト (552件): 軌道計算の精度検証。エネルギー保存則、角運動量保存、既知解との比較、RK45適応積分、シンプレクティック積分、重力アシスト、3次元軌道、プラズモイド推定、RK4重力捕捉精度
- TypeScript ユニットテスト (4,261件): テンプレート出力、データバリデーション、DAG操作、字幕パーサー、MDXパーサー、WASM結果との整合性、内部リンク検証、分析再現テスト、タイムライン制約テスト、軌道図角度整合テスト、記事内容検証テスト(レポート本文中の数値が計算結果と整合するか、レポート間で同じ値が一貫しているかを検証)、マージンゲージ可視化コンポーネント、文字起こし精度検証テスト(公式脚本に対するVTT/Whisper/OCRの文字精度を計測・検証)、動画OCRデータ検証テスト(Tesseract OCR抽出データの構造整合性を検証)、ソース間一致率テスト(ペアワイズ比較による文字起こしソース間の整合性検証)、PiPインセット描画テスト(軌道図内の小窓サブダイアグラム描画の整合性を検証)
- Playwright E2E テスト (355件): 実際のブラウザでページレンダリング検証。テーブル・KaTeX数式・軌道アニメーション・用語集ツールチップの正常動作、JSエラー検出、内部リンク整合性、文字起こしページ、サイドビューSVG、EP05サブページ、DuckDBエクスプローラー、タスクダッシュボード、PiPインセット
- Python クロスバリデーション (504件): scipy (168件: ケプラー方程式・異常角往復・平均運動・異常角変換・平均近点角伝播・比エネルギー・角運動量・質量流量・ジェット出力・軌道要素→状態ベクトル・日心系脱出速度・惑星間光遅延・RK45適応積分・シンプレクティック積分(Störmer-Verlet)・3D軌道幾何(土星リング交差・天王星接近解析・黄道面Z高度・遷移傾斜角ペナルティ)・プラズモイドサブ関数(力・速度摂動・ミス距離・補正ΔV)・通信距離/遅延レンジ 含む) + poliastro (42件: 重力定数・軌道速度・ホーマン遷移ΔV・軌道周期・SOI半径・遷移時間・軌道エネルギー + 天王星/海王星GM・地球→土星/天王星ホーマン・フライバイ幾何・オベルト効果検証) + EP02トリム推力 (5件) + 補助モジュール (167件: 相対論・姿勢制御・プラズモイド・通信・質量タイムライン・3D軌道幾何・天体暦・位相角・窓探索・軌道要素→状態ベクトル独立検証・推力プロファイル伝搬(ConstantPrograde/Brachistochrone RK4・RK45適応)・天王星/海王星天体暦・伝搬状態初期化関数・到着位置計算・船舶-惑星間通信遅延・通信タイムライン線形補間・面外距離) + DAGグラフアルゴリズム (41件: networkxによるトポロジカルソート・到達可能性・深さ・最長パス・パス探索・孤立ノード・影響分析・サイクル検出・サブグラフ抽出・エッジ交差カウントの検証) によるRust/TS計算結果の多重検証
4つのテスト層が異なる品質側面をカバーしている。TypeScriptが全体の75%を占めるのは、記事内容検証テスト(レポート本文と計算結果の整合性チェック)が大量にあるためであり、単なるユニットテストではなく分析の事実整合性を保証する役割を持つ。
CI パイプライン
GitHub Actions で5つの並列ジョブを実行:
- Rust lint + test:
cargo fmt --check+cargo clippy -D warnings+cargo test - TypeScript typecheck + test:
tsc --noEmit+npm test - Playwright E2E: サイトビルド + ブラウザテスト
- Python クロスバリデーション: poliastro/scipy による軌道計算 + 補助モジュール (相対論・姿勢制御・プラズモイド・通信・質量タイムライン・3D幾何・天体暦・軌道要素変換) + networkx による DAG グラフアルゴリズムの独立検証
- WASM browser build:
wasm-pack build --target webの成功を確認
テスト分布 — 4層の品質保証(Rust精度検証 → TypeScript整合性 → E2Eレンダリング → Python交差検証)
Claude Code エージェントループ
本プロジェクトはAnthropicが提唱するパターンに基づき、Claude Codeエージェントが自律的に開発しています。
ワークフロー
- タスク取得:
current_tasks/から未着手のタスクを選択 - 実装: コード変更、テスト作成、データ更新
- 検証: CI相当のチェックをローカルで実行
- コミット + プッシュ: 次のセッションへのハンドオフノートとして機能するコミットメッセージ
- セッションログ: 会話ログを抽出しGitHub Pagesで公開
品質管理
- 設計判断時に OpenAI Codex(nice-friend skillとして統合)をセカンドオピニオンとして活用
- レポートレビュースキル で可読性・正確性を定期的に検証(外部エージェントによるクロスレビュー)
- コスト分析 でトークン使用量を最適化(キャッシュ効率97.3%)
タスク管理
639の完了タスクファイル(current_tasks/)でプロジェクトの進行を追跡。各タスクにステータス(TODO/IN_PROGRESS/DONE)と完了内容を記録し、セッション間の連続性を確保。さらに DAG(有向非巡回グラフ)で分析間の依存関係を管理し、前提変更時の影響範囲を自動追跡しています。
分析依存グラフ(DAG)
本プロジェクトの分析は相互に依存しています。船体質量パラメータを変更すれば、それに依存する全24の軌道遷移分析と全レポートの再検証が必要になります。
この依存関係を有向非巡回グラフ(DAG)として管理しています。DAGの分析ロジック(トポロジカルソート、Sugiyamaレイアウト、影響カスケード、パス探索、交差最小化)はRustで実装され、WASMにコンパイルしてブラウザ上でリアルタイムに実行されます。ノードをクリックすると詳細を確認できます。
- データソース(青): Whisper STT、YouTube VTT、設定資料
- パラメータ(橙): 船体質量、推力、比推力など共有前提
- 分析(緑): 各エピソードの軌道遷移分析(24件)+ クロスエピソード分析
- レポート(紫): 各話レポート + 総合分析レポート
ノードの枠色は検証状態を示します: 有効(緑)、要再検証(橙)、未処理(灰)。
npm run dag -- invalidate param.ship_mass のように CLI で前提を無効化すると、影響する全ノードが自動的に「要再検証」としてマークされます。
設計原則
外部依存の最小化
Rust コアはランタイム外部クレートゼロ、テンプレートエンジンも外部依存ゼロ。CDN依存は KaTeX(数式レンダリング)、uPlot(時系列チャート)、DuckDB-WASM(データエクスプローラー)のみ。これにより、ビルドの再現性と長期的な保守性を確保。
仮定の明示化
すべての分析には前提条件を明記。「世界設定資料に基づく船体質量48,000 t」「JPL平均軌道要素による惑星位置」など、データの出典をトレース可能に。
SF作品としての評価
物理的に現実的かどうかだけでなく、作品内で一貫しているかを重視。未来の推進技術は受け入れ可能な前提として扱い、経過時間・距離・天体位置の整合性を検証。推進加速度(推進G)と居住環境の重力(居住G)は異なるカテゴリとして分析し、SF作品の慣例に従って推進Gは暗黙に処理されているものとして扱う。
複数シナリオの探索
一つの不一致を見つけて「非現実的」と結論づけるのではなく、パラメータ空間を探索してどの条件なら成立するかを明らかにする。境界条件や許容範囲の議論により、分析の深みを確保。
関連ページ
- AI コスト分析 — エージェントループのトークン使用量・キャッシュ効率の詳細
- ケストレル号の分析 — Rustコアの活用例(ΔV・質量時系列・ノズル寿命分析)
- クロスエピソード分析 — マージン連鎖・反事実分析
- DuckDB-WASM データエクスプローラー — SQLクエリによる全分析データの対話的探索