Skip to content

Commit 6646e23

Browse files
committed
Merge branch 'v4-planning' of https://github.com/lizard-isana/orb.js into v4-planning
2 parents 60f7eee + d045644 commit 6646e23

80 files changed

Lines changed: 10748 additions & 84 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ log/
44
.DS_Store
55
Thumbs.db
66
docs/annotated/
7-
ref/
7+
src/bodies/data/vsop87a-*.full.js
8+
ref/

DESIGN.md

Lines changed: 116 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,27 @@ v4 は v3 の機能とポリシーを引き継いだ再設計である。
3030

3131
- **初学者向け学習コンテンツとしての価値**(§7)。v3 が「コードを読んで天文計算を
3232
学ぶ教材」として使われている実態を、偶然ではなく設計目標に格上げする。
33+
- **出力の自己記述**(§4.8)。戻り値が単位・座標系・補正・出典・精度を携え、
34+
関数から切り離しても意味が保たれる。v2/v3 の `unit_keywords` の思想の構造化。
35+
36+
### 1.1 AI から使われること、とその線引き
37+
38+
生成 AI は「今夜 東京から木星は見える?」のような **問いは単純だが答えに至る計算が
39+
多段**の問いを苦手とする(時刻変換・座標変換・各種補正)。決定論的にそれを計算し、
40+
**自己記述的に**(§4.8)返すこのライブラリは、AI が推測する代わりに委譲できる
41+
「信頼できる計算」になり得る。ただし価値の源泉が *計算の信頼性* である以上、
42+
自然言語や対話に踏み込むと逆にそれを薄める。そこで線を引く:
43+
44+
> **AI 以外の利用者(星図描画・プラネタリウム・研究)も欲しがるか?**
45+
> Yes → ライブラリ。AI に奉仕するためだけ → アダプタ(別リポ/例)。
46+
47+
|| 内容 | 置き場所 |
48+
|---|---|---|
49+
| 計算コア | 時刻・座標変換・天体/カタログの位置・イベント | orb.js |
50+
| 自己記述 | 値が単位・座標系・補正・出典・精度を携える / 機械可読な能力記述 | orb.js(§4.8) |
51+
| アダプタ | MCP、ツール定義、自然言語の解釈と生成、地名→緯度経度、TZ、プロンプト設計 | **** |
52+
53+
判定基準は §4.8 の原則そのもの:**識別する(IN)、論評しない(OUT)**
3354

3455
## 2. v3 から得た教訓(設計の根拠)
3556

@@ -151,6 +172,66 @@ riseSet(sun, tokyo, date)
151172

152173
ブラウザ用途の本命機能であり、コア API の実地テストにもなる。
153174

175+
### 4.8 出力の自己記述(meta)・共有語彙・provenance
176+
177+
v2/v3 は戻り値に `unit_keywords` / `coordinate_keywords` を添えていた。狙いは
178+
「関数を並べて戻り値を順に渡すだけで欲しい数値が得られる」— **出力を関数から
179+
切り離しても、それが何の数値か分かる**状態にすることだった。良い方針だったが、
180+
v4 は型付き状態ベクトルでこれを *ベクトル* には保った一方、スカラーを返す境界
181+
(`observe()` 等)で素の数値に退化していた。§4.8 はこれを構造化して取り戻す。
182+
183+
**設計原則:出力は自己識別する(identify, not narrate)**
184+
185+
> すべての出力は自己識別的である。何の量で、単位・基準系・原点は何で、どんな
186+
> 条件(適用した補正・出典・精度)の下で有効かが、値自身から読める。
187+
188+
この原則が「計算ライブラリに徹する」線引きと一致する点が重要:**meta は値を
189+
*識別* する(IN)が、値を *論評* しない(OUT)**。「Vega が見頃」のような散文・
190+
自然言語・推薦は識別を超えた *消費者向けの語り* であり、アダプタ層(§1)に出す。
191+
192+
**共有語彙 `src/vocab.js`(単一の真実)**
193+
194+
meta が使う語は全てここに一度だけ定義する。7つの閉じたリスト —
195+
`QUANTITIES` / `UNITS`(+`UNIT_DIMENSION`)/ `FRAMES` / `CENTERS` /
196+
`CORRECTIONS` / `EFFECTS` / `SOURCES`。規約:
197+
198+
- 全トークン **kebab-case**(グラフの frame 名と一致)、**単位はフル綴り**
199+
(`kilometer`, 曖昧さ排除)
200+
- **歳差・章動は correction ではなく frame が表す**(mean/true of date か J2000 か)
201+
- `requireToken()` で、**未登録の語は meta から出せない**
202+
- 既存コードは読みやすいリテラルのまま。vocab を権威にし、**ドリフトはテストで封じる**
203+
(`GRAPH_FRAMES ⊆ FRAMES` 等)— 生成データの自己検証と同じ流儀
204+
205+
**meta ブロックの構成**
206+
207+
```js
208+
observe(body, t) // -> { azimuth, elevation, ra, dec, range, distance, refraction,
209+
// meta: {
210+
// t: { utc, jd_tt },
211+
// quantities: { <field>: { quantity, unit, frame?, center?, corrections?[] } },
212+
// source: [ ...vocab SOURCES ], // 天体の理論 + パイプラインの座標モデル
213+
// accuracy: { value, unit, basis }, // 主誤差項
214+
// ignored: [ ...未モデル化の effect ] // 誠実さフィールド
215+
// } }
216+
```
217+
218+
- `corrections` は推測しない。`apparentGeocentric`**実際に効かせた補正**を報告
219+
(惑星・月=光行時間+光行差、恒星=固有運動+光行差で光行時間なし、`lightTime:false`
220+
で空)。測心の場は日周視差を、elevation は屈折(適用時のみ)を足す。
221+
- `range`(測心)と `distance`(地心)は別 center として区別。
222+
- **固定源(恒星)は距離を持たない**`range`/`distance``null`、meta 側は
223+
`applicable:false`。方角は有効。
224+
- 既定 on。ホットループ(全天スイープ等)は `{ meta: false }` で省略。
225+
226+
**provenance(天体が出典を名乗る)**
227+
228+
各 body は `provenance: { source:[…], accuracy:{value,unit,basis} }` を宣言する
229+
(moon→`meeus-moon` 15″、惑星→`vsop87a`、太陽/地球→`erfa-epv00`、衛星→`sgp4`
230+
恒星→`bright-star-catalogue`)。`observe()`**天体の source とパイプライン自身の
231+
座標モデル**(iau2006 歳差・iau2000b 章動・iau1982 恒星時・wgs84・屈折時 saemundsson)
232+
**union** して `meta.source` に、天体の精度を主誤差項として `meta.accuracy` に畳む。
233+
これで「差が説明できる」という §6 の検証哲学が、実行時の出力にも現れる。
234+
154235
## 5. 言語・配布
155236

156237
- **ソースは JavaScript + JSDoc 型注釈**。「JavaScript のみ」というプロジェクトの
@@ -196,9 +277,18 @@ minifier はコメントを除去するので、**豊富なコメントは配布
196277
2. **式番号コメント**: 実装行を教科書の式に対応付ける
197278
(例: `// Meeus (47.1): 平均黄経 L'`, `// Vallado eq. 3-45`)
198279
3. **「なぜ」コメント**: 数値上の工夫(桁落ち回避、収束判定、特異点処理)は
199-
理由を書く。v3 レビューで発見した落とし穴(`Date.UTC` の小数秒切り捨て、
200-
TEME と GMST82 の対応など)は、再発防止としてコード中に残す
201-
4. コメント言語は**英語**(国際的なコントリビュータと教材翻訳の起点)。
280+
理由を書く
281+
4. **普遍性**: コメントは「そこで何が行われているか」を、その場で完結する
282+
**普遍的な記述**として書く。扱っているアルゴリズムは普遍的なものであり、
283+
説明は手法とプロセスの中だけで完結できる — このプロジェクトの経緯
284+
(「v3 では」「以前は」)に依存した書き方をしない。落とし穴は
285+
「このコードで過去に起きたこと」ではなく「この手法で誰にでも起きること」
286+
として記述する(例: 「`Date.UTC` は小数秒を黙って捨てる」は書く、
287+
「v3 ではこれが原因で 1.4 km ずれていた」は書かない)。
288+
開発の経緯・発見の記録は本書(DESIGN.md)とコミットログに置く。
289+
ガイド(§7.2)にも同じ規約を適用し、コードもドキュメントも
290+
単体で成立させる(オーナー決定、2026-07)
291+
5. コメント言語は**英語**(国際的なコントリビュータと教材翻訳の起点)。
202292
日本語の解説は §7.2 のガイドが担う
203293

204294
この規約が守られるよう、モジュールは「1ファイル=1概念」の粒度に保つ
@@ -209,7 +299,7 @@ minifier はコメントを除去するので、**豊富なコメントは配布
209299
`docs/guide/` に章立ての解説を置く。章 = 学習単位:
210300

211301
1. 時刻系(UTC/TT/ΔT/恒星時)— なぜ69秒ずらすのか
212-
2. 座標系(黄道/赤道/分点/歳差章動)— 24′ずれた実話から始める
302+
2. 座標系(黄道/赤道/分点/歳差章動)— 「いつの春分点か」の24′から始める
213303
3. 太陽と月の位置(級数展開の考え方)
214304
4. ケプラー問題(ユニバーサル変数法)
215305
5. 観測(光行時間差・光行差・視差・大気差)
@@ -254,20 +344,24 @@ npm 配布のデフォルトを「コメント保持の未 minify ESM」にす
254344

255345
```
256346
src/
347+
vocab.js 共有語彙(単一の真実、§4.8)
257348
time/ instant.js, scales.js, sidereal.js
258349
math/ vec3.js, angles.js, kepler.js
259350
frames/ frames.js, precession.js, nutation.js, geodetic.js
260-
bodies/ sun.js, moon.js, mercury.js ... neptune.js, data/(生成物)
261-
sgp4/ propagation.js(v3 から搬入), tle.js, omm.js
262-
observer/ observer.js, lighttime.js, aberration.js, refraction.js
263-
events/ riseset.js, phases.js, passes.js
351+
bodies/ sun.js, moon.js, earth.js, mercury.js ... neptune.js,
352+
star.js(固定天体), vsop.js, data/(生成物)
353+
catalog/ stars.js(恒星表 API), data/(生成: bright-stars, constellations)
354+
sgp4/ propagation.js(v3 から搬入), tle.js, satellite.js
355+
observer/ observer.js, apparent.js(光行時間差+光行差), refraction.js
356+
events/ riseset.js, phases.js, passes.js, search.js
357+
sky/ visible.js(可視天体スイープ = 意味づけラッパー)
264358
compat/ v3.js(旧 API シム)
265359
docs/
266360
guide/ 教材章(ja/en)、snippet 参照で本体ソースを引用
267-
examples/ 段階的縮小実装+ブラウザデモ
268-
tools/ vsop-compile.js, annotate.js(注釈付きソース生成),
269-
snippets.js(抜粋差し込み+CI 検査), reference-gen/
270-
test/ 参照値テスト・プロパティテスト・v3 等価性テスト
361+
examples/ 段階的縮小実装+ブラウザデモ(sun-in-50-lines, iss-passes, tonight-sky)
362+
tools/ vsop-compile.js, catalog-compile.js, snippets.js(抜粋差し込み+CI 検査),
363+
bench.mjs, annotate.js(注釈付きソース生成), data/(vendored 生データ)
364+
test/ 参照値テスト・プロパティテスト・v3 等価性テスト・vocab/meta テスト
271365
```
272366

273367
## 9. マイルストーン
@@ -288,6 +382,16 @@ test/ 参照値テスト・プロパティテスト・v3 等価性テス
288382

289383
- 基本方針は §1〜§6 のとおり(オーナー承認済み: 2026-07-19)
290384
- Educational 版は「別コピー」ではなく「source as textbook」方式(§7)
385+
- **コメント/ドキュメントは普遍的・自己完結で書く**(§7.1)。プロジェクトの経緯や
386+
v3 への逆依存を書かず、履歴は本書とコミットログに置く(オーナー決定: 2026-07)
387+
- **出力は自己識別する。identify, not narrate**(§4.8, §1.1)。値は単位・座標系・
388+
補正・出典・精度を携える(IN)が論評はしない(OUT)。自然言語・MCP・地名/TZ 解決
389+
等はアダプタ層(ライブラリ外)。判定基準は「AI 以外の利用者も欲しがるか」
390+
(オーナー決定: 2026-07)
391+
- **共有語彙は `src/vocab.js` に一元化**(§4.8)。単位はフル綴り、歳差章動は
392+
correction でなく frame、ドリフトはテストで封じる(オーナー決定: 2026-07)
393+
- **恒星表・星座表を v4 に収録**(`tools/data/catalog/``catalog-compile.js` で生成)。
394+
固定天体プリミティブ `bodies/star.js` はコアの汎用追加(星図用途も想定)
291395

292396
**推奨として提示済み・実装開始までに確定したいもの**
293397

docs/guide/01-time.ja.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,17 +57,17 @@ orb.js が内部で使っている時刻の考え方を、実際のソースコ
5757
// fit of Delta T = TT - UT1.
5858
//
5959
// Skipping this correction shifts every computed position by the motion
60-
// of the body over ~69 s: about 38 arcseconds for the Moon. (v3 shipped
61-
// for years with the correction commented out — hence this long comment.)
60+
// of the body over ~69 s: about 38 arcseconds for the Moon.
6261
```
6362
<!-- /snippet -->
6463

6564
## 1.2 ずらし忘れると何が起きるか
6665

6766
現在 TT−UTC ≈ 69秒。この69秒の間に月は約38″(視直径の約2%)動きます。
6867
つまり UTC のまま月の理論式に代入すると、**月の位置が常に38″ずれます**
69-
orb.js v3 には長い間この補正が(コメントアウトされたまま)抜けており、
70-
v4 では `Instant` 型が入口で必ず変換する設計にしました。
68+
このずれは「だいたい合っている」ように見えるため、天文プログラムでは
69+
気づかれないまま残りやすい定番のバグです。orb.js では `Instant` 型が
70+
入口で必ず変換するので、以後のコードは時刻系を意識せずに済みます。
7171

7272
逆方向の間違いもあります。恒星時(地球の自転角)は UT1 の関数なので、
7373
こちらに TT を入れると方位角が約17″ずれます。「**天体暦には TT、自転には
@@ -81,8 +81,9 @@ UT**」— この使い分けが時刻系のすべてです。
8181

8282
ここに JavaScript 特有の罠があります。JD は 246万日のオーダーなので、
8383
64bit 浮動小数の1つの数値で持つと分解能が約20マイクロ秒になります。さらに
84-
`Date.UTC()`**秒引数の小数部を黙って捨てます**(v3 ではこれが原因で
85-
ISS の位置が1.4 km ずれていました)。orb.js v4 の `Instant` は JD を
84+
`Date.UTC()`**秒引数の小数部を黙って捨てます**。低軌道衛星は毎秒約
85+
7.7 km 進むので、秒未満を落とすだけで位置はキロメートル単位でずれます。
86+
orb.js の `Instant` は JD を
8687
「大きい部分+小さい部分」の2つの double に分けて持つことで、この問題を
8788
構造的に回避しています(`src/time/instant.js`):
8889

@@ -147,4 +148,4 @@ gmst82(t); // 地球の自転角(ラジアン)
147148

148149
---
149150

150-
次章: [第2章 座標系 — 24分角ずれた実話](02-frames.ja.md)
151+
次章: [第2章 座標系 — 「いつの春分点か」で24分角変わる](02-frames.ja.md)

0 commit comments

Comments
 (0)