Skip to content

Releases: loosephoto/space-finder-mcp

v0.39.2 — 日時解釈・エラー応答・キャッシュ汚染・カレンダー境界処理の一括修正

Choose a tag to compare

@loosephoto loosephoto released this 14 Oct 07:10

全モジュール(全66ツール・補助モジュール・検証ゲート・ドキュメント)の精査と実測で特定した不具合を一括修正しました。

主な変更点

  • sky_map_with_satellites(engine="simple" | "accurate") のエラー応答と TLE 未取得表示の修正 (sky_overlay.py)
    • 不正な when のエラー(scene["error"])を無視して空の星図を描画していた問題を修正し、即座にエラー応答を返すように変更。
    • when の解釈を ground_view._parse_when に統一(+09:00 等の数値オフセットの UTC 変換・空白のみ文字列の「未指定=現在時刻」正規化・存在しない暦日 2026-02-30 等の拒否)。
    • TLE 全機未取得時に「なし(地平線下)」と誤表示していたのを、ground エンジンと同様に satellite_errors へ理由を記録し「なし(TLE を取得できなかったため位置を計算できません)」と明示。
  • solar_system_now / comet_apparition の when 解釈統一と複数彗星パネルのマーカー座標修正 (solar_system.py)
    • _resolve_when を ground_view._parse_when に統一し、数値オフセット(+09:00 等)・空白のみ文字列・存在しない暦日を正しく処理。
    • 複数彗星パネル(view="comet_orbit" で複数指定)の figure.markers で、imgs.append 後に panel=len(imgs)+1 としていたためパネル番号が 2 始まり(1つずれ)になっていた問題と、2枚目以降のマーカー px に合成キャンバスの縦オフセット i*(h+gap) が加算されていなかった問題を修正。
  • planetary_orbiter_track の時刻変換と図内パネル表記の修正 (planetary_map.py)
    • when にタイムゾーンオフセット付き日時を渡した際、astimezone(timezone.utc) を通さず現地時刻の数字のまま "UTC" ラベルを付けていた問題を修正。
    • 図内パネル3行目で tstr(末尾 " UTC")にさらに " UTC" を連結して "UTC UTC" と二重表記されていた問題を修正。
    • 空白のみの when を未指定(現在時刻)として扱うよう正規化。
  • 一時的な通信障害時の @ttl_cache キャッシュ汚染の解消 (oscar.py, jaxa.py, swpc.py, ground_view.py)
    • oscar.satellite_status(エラー応答や failed_pages ありを24時間キャッシュ)および oscar._catalogue(failed_pages ありをメモリに24時間キャッシュ)に skip_if を追加。
    • jaxa.jaxa_dataset_search でカタログ取得失敗時の空配列を「該当0件」の正常応答として10分間キャッシュしていた問題、および空クエリ時にカタログ走査を先に実行していた問題を修正。
    • swpc.fetch_all(10分)と swpc.fetch_forecast(30分)で全項目失敗時の空 sections がキャッシュされる問題を修正。
    • ground_view._star_catalog で初回 VizieR 取得失敗時に16星フォールバック(fallback=True)が24時間キャッシュされる問題を修正。
  • カレンダー・蓄積ストアの境界処理と非推奨 API の修正 (calendar_store.py, space_calendar.py, qzss.py)
    • Windows CRT の time.mktime が 1970 年以前の日付で OverflowError を投げて calendar_store.prune() が落ちる問題を calendar.timegm 化で解消。
    • 月をまたぐ複数日の単発予定(repeat="none")が翌月側で消える問題を修正。
    • space_calendar._computed_month の流星群極大日を off 依存の start_utc から現地暦日の start_local に変更し、最初に呼んだ都市のタイムゾーンで他都市の極大日が前後にずれる問題を解消。
    • Python 3.12+ で非推奨の datetime.utcnow() を datetime.now(timezone.utc) に統一。
  • 検証ゲート scripts/check-tools.py とドキュメントの更新 (scripts/check-tools.py, CLAUDE.md, SKILL.md, README.md, pyproject.toml)
    • --offline / --fuzz が requests.Session.request を遮断しておらず csa_dataset_search が実通信していた問題と、run_all() で calendar_store.STORE_PATH の未復元・一時ファイル残留があった問題を修正。
    • CLAUDE.md のツール数見出しを 66 種に更新。

検証

  • compileall -q src/space_finder_mcp: OK
  • scripts/check-tools.py --dead-code: 0件
  • scripts/check-tools.py --fonts: 3/3 OK
  • scripts/check-tools.py --offline: 66ツール・例外漏れ0
  • scripts/check-tools.py --fuzz: 444組・例外漏れ0
  • scripts/check-tools.py --concurrency: 3/3 OK
  • scripts/check-tools.py --stdio: 7/7 OK
  • scripts/check-tools.py --figures: 描画系 9 + 追加経路 37 = 46件すべて OK
  • unittest discover -s tests: 330件 OK(新規回帰テスト 10件 BugSweepV0392Tests)

Full Changelog: v0.39.1...v0.39.2

v0.39.1 — 地上視点パノラマの不具合修正

Choose a tag to compare

@loosephoto loosephoto released this 13 Oct 02:49

地上視点パノラマ(sky_map_with_satellites(engine="ground"))の不具合修正です。実機で再現し、画素で計測してから直した 11 点をまとめて入れました。

直したもの

  • 遮蔽高さ occl を「描いた地面レイヤの alpha」から測るようにしました。建物矩形の top だけでは塔・段状上層部・アンテナが入らず、実シルエットは最大 70px(6.3°)上・span=30 では 37% の列で上回っていました。このため塔の陰の衛星を verify が「視野内なのに描かれていない」と誤判定し ok=False になっていました(正しい図が --figures ゲートを落ちる)。
  • when に空白だけを渡すと TypeError がツール外へ漏れていたのを「未指定=現在時刻」に正規化しました(契約違反)。
  • when の数値オフセット(+09:00 など)を無視して UTC として読んでいたのを解釈して UTC に変換します(Z だけ置換していたため、9 時間ずれた図が無警告で出ていました)。
  • show= が月・太陽に効かず、show="木星" でも月が円盤+名札で描かれていたのを、他の惑星と同じ扱い(指定外は小さな点のみ)にしました。
  • TLE 取得失敗を無言で落とし、本文が「なし(地平線下)」と嘘を書いていたのを修正。理由を satellite_errors に残し、全機未取得なら「TLE を取得できなかったため位置を計算できません」と明示します。根因は celestrak._fallback_catnr が「1 ホストの一時 5xx + 他ホスト該当なし」で全体を諦めていたことで、5xx は 1 回再試行・全ホストが例外のときだけ送出に変更しました(実測で TLE 6/6 取得。従来はひまわり9号 が約半数失敗)。
  • ヘッダが画像幅に追従せず、span を狭めると題名と右寄せ行が重なり両端が切れていました(W=333 で全幅にインク・タイトル 400px+右寄せ 435px+凡例 1062px)。幅を測って「左右 2 段 ↔ 左寄せで縦積み+折り返し」を選ぶ方式にしました。
  • 「淡い星=天の川の粒」を減光後の等級で判定していたため、地平線近くの明るい星まで大きく明るく描かれていました(描画星の 3.59% が該当)→ 減光前の等級で判定。
  • 視野内外の判定が描画(±30px 許容)・本文・verify で食い違い、図に部分的に描かれる衛星を「図には描かれない」と書いていました → 単一の述語 _in_frame に統一し、地平線上だが視野外の天体は本文に列挙、figure.markers に in_frame を付与。
  • 銀河面が視野に入らないとき milky_way の平均が NaN になり structuredContent が不正 JSON になっていたのを 0.0 にし、本文も「銀河面はこの視野の外」と明示。
  • 衛星の破線が 2 つの可視区間を繋ぎうる(判定は |Δx| < W/4 の経験則で、3 日分のスキャンでは最小 879px 対 閾値 850px=余裕 3% しかなかった)→ 可視区間ごとに分割。
  • draw_ground / _set_lp がモジュールグローバルを書き換えていた(並行呼び出しで色・注記が混ざる)→ 色はパレット引数・光害は引数で伝搬。

併せて _nearest の RA 0h/24h 巻き戻し、地平線閾値の統一(0.6°)、月の注記を月を描いたときだけに、lp 未対応値の本文明示、show が何にも当たらないときの警告を追加しました。

検証

  • 回帰テスト 320件 OK(新規 23 件 tests/test_ground_view.py。ネットワーク断でも検証できる契約テストを含む)
  • check-tools.py: --only sky_map_with_satellites / --figures / --offline / --fuzz(444 組・例外漏れ 0)/ --fonts / --stdio / --concurrency / --dead-code(検出 0)すべて exit 0
  • uv build 0.39.1 成功

補足: check-tools.py の --figures / --offline / --fuzz / --dead-code / --fonts / --concurrency / --stdio / --media-links は排他モードで、複数並べて渡すと最初に一致した 1 つしか走りません(main() が各ブロックで return します)。本リリースからは 1 つずつ別プロセスで実行し、それぞれの exit code を確認しています。

Full Changelog: v0.39.0...v0.39.1

v0.39.0 — ドイツ DLR(EOC)とロシア Roscosmos の地球観測データを追加(認証不要・STAC)

Choose a tag to compare

@loosephoto loosephoto released this 12 Oct 08:43

「ドイツ DLR(EOC)とロシア Roscosmos の地球観測データを追加(認証不要・STAC)」(v0.39.0)。衛星・地球観測 API の候補を調査し、公開 API があり・認証不要で・既存ツールと重複しないと一次情報(実際に HTTP を叩いた結果)で確認できた 2 件を追加しました。見送った候補: Google Earth Engine / Sentinel Hub(資格情報が必要)、KASA・CASC・EU SST・GESTRA・ALCE・AEB・BDS・CONAE(公開 API が無い/未文書化)。

  • 🇩🇪 dlr_collections / dlr_search を新設 — ドイツ航空宇宙センター(DLR)の地球観測センター(EOC / DFD)が公開する STAC 1.0.0 カタログ(geoservice.dlr.de/eoc/ogc/stac/v1・69 コレクション・認証不要)から、Sentinel-2(MAJA 大気補正・WASP 合成)・EnMAP/DESIS ハイパースペクトル・Sentinel-5P/TROPOMI(NO2・O3・AOD・地上 NO2)・MetOp/GOME-2・世界居住域(WSF 2019 / Evolution)・全球 DEM(TanDEM-X 90m)・ドイツ国内プロダクトを検索します。サムネイルとメタデータ(ISO19139)のリンク付き。
    • 雲量フィルタはクライアント側 — DLR の API は filter(CQL2)を受け付けない(実測 400)ため、max_cloud_cover は取得後に絞り込み、excluded_by_cloud(雲量超過)と without_cloud_info(雲量情報なし)を分けて返します(サーバー側フィルタを装いません)。
    • 並び順は日時順とは限らない — DLR の STAC は sortby を無視します(実測: sortby=-datetime を送っても並びが変わらない)。期間で絞るには datetime を指定します(本文にも注記を出します)。
    • ライセンスは混在 — コレクションごとの DLR 申告値(CC-BY-4.0 が最多、CC-BY-NC-4.0 / proprietary もある)を license として返し、注意書きを本文に出します。
  • 🇷🇺 roscosmos_collections / roscosmos_search を新設 — Roscosmos のオープンデータ STAC(s3.gptl.ru/stac-web-free・200TB 超・認証不要)から、Elektro-L(静止・15〜30 分ごとの全球ディスク)・Arktika-M(高楕円)・Meteor-M(極軌道の日次全球モザイク)と、そこから作られた全球モザイク(EL_ARCM / MM)を検索します。
    • 静的カタログなので木を辿る — このカタログは /search も /collections も持たない(実測 404)。catalog.json → コレクション → 年 → 月 → 日 を辿り、日ノードの rel=item から列挙します(日ノードは親を辿らず1 リクエストで直接引けることを実測で確認)。日付を省略すると、今日から最大 lookback 日さかのぼってデータがある最新日を使います。
    • ホストは 2 つ — s3.gptl.ru と s3ext.gptl.ru が同じ内容を返すため、到達できない側は遮断として記憶して他方へ切り替えます(両方だめならエラー結果=例外を漏らしません)。
    • クイックルックと GeoTIFF — 各アイテムのクイックルック(PNG)と GeoTIFF(EPSG:4326 / 3857・サイズ付き)のリンクを返します。EPSG は proj:epsg が無い場合アセットのキー(image.tif.ms.4326._)から読みます。
    • 未知のコレクションは推測しない — 存在しないパスは候補(roscosmos_collections の一覧)を提示して停止します。
  • 🧪 検証 — 回帰テスト 294件(新規 11 件 tests/test_dlr_roscosmos.py=雲量のクライアント側絞り込みと除外内訳・不正 bbox で HTTP を出さない・接続失敗がエラー結果になる・カタログ木の走査・日付解決と EPSG の読み取り・未知コレクションの候補提示・不正日付・ホスト切替と全滅時)/--dead-code 0件/--offline・--fuzz(444 組)・--media-links(問題 0)・--only(新規 4 ツール)すべて exit 0。

同梱の修正(v0.38.5 のリリース後にマージ)

  • sky_map_with_satellites(engine="ground") の自己検証を修正 — span を狭めたとき、視野の方位に入らない人工衛星(例: 静止衛星を span=160 で見たとき)が figure.verify.missing に入って verify.ok=False になっていました。描かれないのが正しい衛星を「欠落」として数えていたのが原因で、画像自体は正しく描かれていました。
    • _ground_verify は 視野外(out_of_frame)・地平線下(below_horizon)を欠落から分離し、missing は「視野内なのにマーカーが無い」場合だけにしました(方位→画素の変換は _frame_x に共通化)。
    • 本文の衛星一覧も視野内/視野外を分け、視野外は「(この視野の方位に入らないため図には描かれない)」と明示。caption に「(視野外)」を付記し、figure.markers に in_frame を追加しました(「見えているのに図に無い」という誤読を防ぐため)。
    • 回帰テスト 5 件を追加(tests/test_ground_view.py::VerifyFrameTests)。

Full Changelog: v0.38.5...v0.39.0

v0.38.5 — 星空マップを地上視点パノラマに一新(実星表・天の川・時間帯で変わる空・依頼表示)

Choose a tag to compare

@loosephoto loosephoto released this 12 Oct 08:43

「星空マップを地上から見上げたパノラマに一新(実星表・天の川・時間帯で変わる空・依頼表示)」(v0.38.5)。

  • 🌌 sky_map_with_satellites の既定を engine="ground" に変更 — 天頂中心の円形図から、地平線が下・方位が横軸の正距円筒パノラマ(地上から見上げた見え方)に一新しました。従来の図は engine="simple"(Pillow)/ "accurate"(matplotlib)で選べます。
  • ⭐ 恒星を実星表に — 16個の固定リストをやめ、Hipparcos 実星表(Vmag<8.5・約6.1万星)を Skyfield で計算。等級・色(B-V)・大気減光を反映し、淡い星ほど減光して注目天体を埋もれさせません。星表は初回だけ VizieR(CDS)から取得してキャッシュします(取得できない環境では名のある明るい恒星のみで描画を続け、star_catalog.source に実際の出典を出します)。
  • 🕐 太陽高度で空の色と見える限界等級が変わる — 昼/朝焼け/夕方/薄明(市民・航海・天文)/夜を太陽高度から自動判定し、天頂色・焼けの色(太陽の方位に出る)・限界等級・天の川の見え方を補間します(昼は星0個、夜は約3,000星)。
  • 🌙 月は位相と距離を反映 — Lambert 球の位相で欠けを描き、明るい側が太陽の方向(方位差と高度差の両方)を向きます。新月前後は○で位置だけ表示します。
  • 👁 今は見えない天体は○で位置を示す — 惑星・主要恒星・代表的な銀河(M31/M33/M42/M45/M8/M13/M27)は、空が明るくて見えない時間帯でも輪郭マーカー+名札で位置が分かります(見えている天体は●)。
  • 🎛 span / az0 / lp / show を追加 — 視野(30〜360°)、左端の方位、光害の程度(都心/郊外/山間)、依頼表示する天体("木星,ベガ,M31")を指定できます。画面下部は手続き生成の街並み+方位目盛り(左右端にその端の方位)。
  • 🧪 検証 — 回帰テスト 278件(新規18件=太陽高度補間の連続性・月の位相と明るい側の向き・銀経銀緯の変換・星の色・依頼表示の一致・出力契約)/--dead-code 0件/--figures・--media-links・--offline・--fuzz・--stdio すべて exit 0。

Full Changelog: v0.38.4...v0.38.5

v0.38.4 — 宇宙天気に予報(フレア発生確率・活動領域別確率・NOAA 3日予報)を追加

Choose a tag to compare

@loosephoto loosephoto released this 12 Oct 08:43

宇宙天気に予報(フレア発生確率・活動領域別確率・NOAA 3日予報)を追加。

  • 🔮 space_weather(kind="forecast") を新設 — これまで space_weather は NASA DONKI の観測・警報の記録しか返せず、予報(フレアの発生確率・3日予報・活動領域別確率)は取得できませんでした(実測: 「今後の太陽フレアは?」に M/X 級の確率で答えるには SWPC を直接叩く必要がありました)。DONKI は予報を提供しない(予報は NOAA SWPC のプロダクト)ため、kind="forecast" は DONKI を経由せず NOAA SWPC を通常経路として使います(障害時のフォールバックとは別物)。
  • 📈 3つの予報プロダクトを1回で返す — solar_probabilities.json(C/M/X 級と 10MeV 陽子の1〜3日確率)/solar_regions.json(活動領域ごとの C/M/X・陽子確率、面積(太陽半球の百万分率)・黒点型・磁場型。最新の観測日のみ)/3-day-forecast.txt(予想最大 Kp と NOAA スケール、S1以上・R1-R2・R3以上の確率、公式の根拠文)。予報プロダクトは1日1回の更新なので 30分キャッシュ(TTL_FORECAST)です。
  • 🧭 誤読させない — 並び順に依存せず日付で最新を選び、複数日分を含む活動領域は最新の観測日だけを使います。予報テキストは折り返された行を繋いで1文にします(実測: 「...likely on 09 / Oct due to ...」「...is 5.67 (NOAA Scale / G2).」)。欠測は failed に残し、1項目も取れなければエラーを返します(空を「予報なし=静穏」と誤読させない)。
  • 🧪 検証 — 回帰テスト 256件(新規8件=確率の最新日選択・活動領域の最新日フィルタ・折り返しの連結・欠測を ? で表示・項目単位の欠測・全滅時のエラー・例外を漏らさない・DONKI を叩かず SWPC へ振り分けること)/--stdio に forecast 経路を追加/--dead-code 0件/全62ツール exit 0。実 API で kind="forecast" が failed=[]・M級 40%(1日)・領域 4549 の M 35%・予想最大 Kp 5.67(G2)・根拠3文を返すことを確認。

Full Changelog: v0.38.3...v0.38.4

v0.38.3 — NASA DONKI の URL 移転に追従し、宇宙天気の取得を復旧

Choose a tag to compare

@loosephoto loosephoto released this 06 Oct 17:17

「NASA DONKI の URL 移転(2026-09-30)に追従し、宇宙天気の取得を復旧」

🛰️ 移転先へ切り替え

NASA が 2026-09-30 に DONKI の URL を移転し、旧 api.nasa.gov/DONKI は 301 で CCMC のお知らせページ(HTML)へ転送されるようになっていました。追跡先の HTML を JSON として読むため Expecting value: line 1 column 1 (char 0) になり、space_weather は常に NOAA SWPC へフォールバックしていました(実際は恒久的な移転)。

取得先を ccmc.gsfc.nasa.gov/DONKI-API/get(認証不要・実測 X-Rate-Limit-Remaining: 9999)へ切り替え、API キーを送らず nasa_budget も通しません(旧枠でゲートすると、無関係な DEMO_KEY の枠切れで呼び出し前に止まり、生きている API まで返せなくなるため。キーを持たないホストへ利用者のキーも渡しません)。

🧭 原因が分かる失敗

301 転送と「JSON でない応答」を明示的に検知し、転送先 URL・HTTP コード・Content-Type・バイト数を添えて失敗させます(原因不明の Expecting value と「NASA API の一時的障害」という誤った理由を廃止。恒久移転を障害と誤診させない)。

🗓️ CME は日付が必須

移転先の CME は startDate/endDate を省くと 400 Bad Request。無指定の側だけ直近30日で自動補完します(旧 URL は 301 で到達していなかったため気付かなかった潜在バグ)。

⏱️ 最新のイベントを返す

DONKI は昇順(古い順)で返すため、data[:lim] は「最近の N 件」ではなく最古の N 件を返していました(実測: 30日窓の CME は95件あり、09-07〜09-09 の最古10件を表示。FLR は30日で10件だったため気付きにくかった)。

時刻で降順ソートし、FLR/CME/GST/SEP の4カテゴリとも新しい順に返します。

🧪 検証

  • 回帰テスト 248件(本リリースで新規7件。NewCraterSiteTests の4件は変更前から失敗しており本変更とは無関係)
  • --offline・--fuzz 例外漏れ 0 / --stdio 6/6 応答 / --dead-code 0件
  • 全62ツール exit 0(space_weather ok 3.77s)
  • 実 API で kind="all" が errors=[]・CME の先頭が 10-06 06:23 の 570 km/s

Full Changelog: v0.31.1...v0.38.3

v0.30.2 — LLMの並列ツール呼び出し対応と無応答バグの修正

Choose a tag to compare

@loosephoto loosephoto released this 17 Sep 05:18

「LLM の並列ツール呼び出しに応えるサーバーへ」(v0.30.2)。同期ツールをワーカースレッドで実行して並列呼び出しを本当に並行化し、同じ引数の並行呼び出しは1回に集約しました。あわせて、stdio 経由でツールが無応答になる不具合と、外部APIの遮断で呼び出しが分単位で固まる不具合を修正しています。

並列ツール呼び出し

  • 全47ツールを anyio のワーカースレッド実行に変更(FastMCP は同期関数をイベントループ上で呼ぶため、これが無いと1つの API 待ちが他の呼び出しを全部止めます)。実測: 同一ツール4並列が wall 2.55s → 2.47s(4.0×)、astronomy_weather を3都市同時で 11.72s → 3.93s(3.0×)。
  • 同一引数の並行呼び出しは single-flight で1回に集約(8並列でも実行1回=共有レート枠を無駄にしない)。matplotlib の描画は img_common.RENDER_LOCK で直列化。

無応答(stdio)の修正

  • サーバー起動後に numpy / matplotlib / skyfield を import すると ツール呼び出しが応答を返さない状態でした(constellation_now / moon_phase_map / accurate エンジンの描画)。関数を直接呼ぶ既存ゲートでは検出できない種類の不具合です。numpy を起動時に import して解消し、--stdio ゲート(実クライアント経路で子プロセスを起動)を追加しました。

外部API遮断で固まらない

  • CelesTrak が TCP を blackhole すると 1回の呼び出しが120秒以上無応答(並列で走る他ツールも待たされました)。接続を (connect 10秒, read 25秒) で打ち切り、遮断を記憶して以降は fail fast(初回 10.0s → 以降 0.0s)。

あわせて修正

  • メディアのリンク: 画像を返す12ツールを全数チェックしたところ4ツールに抜け(eodashboard_detail は画像リンク無し、apod は生URLのみ、astronomy_weather は保存パス無し)。メディア本体より前のアイコン付きリンクを全ツールに揃え、--media-links で機械的に検査します。
  • 図の描画バグ: 情報パネルを現在位置マーカーの後に描いていたため、マーカーが暗幕に隠れる場合がありました(月面 LRO が北緯82°で marker_pixels: 0)。surface_map.panel_placement() でマーカーを隠さない隅へ置き、verify.panel_overlaps_marker を追加(同型の潜在バグを3ツールで修正)。

検証

全47ツール exit 0(39 OK/8 error はいずれも外部の一時制限)/--dead-code 0件/--fuzz 264組合せ 例外漏れ0/--offline exit 0/--figures 描画系8+追加経路18/--media-links 問題0/--concurrency 3/3/--stdio 6/6/unittest 26件 OK。登録ツールは 47本(増減なし)。

v0.30.1 — 衛星カタログの全件走査・一致度順と宇宙天気のフォールバック

Choose a tag to compare

@loosephoto loosephoto released this 16 Sep 08:10

機械的に数えると嘘の答えが出る2件を修正した(走査範囲と並び順/NASA 停止時の代替手段)。

  • oscar.py: カタログ全件(1,044件・35ページ)を並列取得してクライアントサイドで絞り込む。
    以前は先頭10ページ(300件)だけを走査していたため、カタログ後半に固まる国の衛星を
    取りこぼしていた(実測: 「ロシアの気象衛星」で Meteor-M が出てこない)
  • oscar.py: query を一致度順に並べ替え(acronym 完全一致 100 / slug 90 / acronym 前方 80 /
    名称の語境界 50 / 名称の途中のみ 10)。"meteor" が「Meteorological(気象)」を含む
    DMSP・COSMIC 等を92件拾って Meteor-M を埋もれさせていた問題を解消し、弱い一致は
    件数を分けて表示する
  • oscar.py: 取得に失敗したページは failed_pages として本文と structuredContent に明示し、
    不完全なカタログはディスクに固定しない。全件走査は初回38.5秒だが、カタログをディスクにも
    保存するためプロセス再起動後も0.07秒で返す(24時間で更新)
  • swpc.py(新規): 認証不要の NOAA SWPC(Kp・NOAAスケール・GOES X線クラス・太陽風・
    陽子フラックス・警報・黒点相対数)を取得。項目単位で失敗を記録し黙って落とさない
  • donki.py: space_weather は NASA が 429/障害のとき SWPC に自動切替。source=NOAA SWPC・
    fallback=true・nasa_reason(NASA 側の理由)を content と structuredContent の両方に明記し、
    出所の取り違えと「データが無い=静穏」の誤読を防ぐ
  • tests/test_regressions.py: 一致度順・全ページ走査と失敗ページ報告・SWPC フォールバック・
    X線クラス表記と失敗項目記録の4件を追加(計15件)
  • README / SKILL.md / AGENTS.md を v0.30.1 に更新(swpc.py をファイル一覧に追加)

v0.30.0 — 気象庁の雨雲・降水画像と月齢マップ

Choose a tag to compare

@loosephoto loosephoto released this 16 Sep 06:11

astronomy_weather の日本国内向け添付画像を気象庁の天気図から解析雨量・降水短時間予報と
ナウキャストへ差し替え、日食の描画ルーチンを応用した月齢マップ moon_phase_map を追加(47ツール)。

  • jma_rain.py: 解析雨量・降水短時間予報(実況+最大3時刻・+15時間先まで、rasrf と同一の
    画像ファイル)を地方画像(20分割・地点を含む範囲中心が最近傍)で合成し観測地点に十字マーカー。
    ナウキャスト(雨雲の動き・5分更新・+60分)を地理院タイル背景に合成し、雷活動度(thns)を
    検出時は figure.notes で警告。タイルは偶数ズームのみ/time.json はUTC表記の数字をファイル名に
    使う、という気象庁仕様に対応し、URL単位のキャッシュ(エラーは非キャッシュ)で再呼び出しを削減
  • moon_phase.py: 月齢マップ(layout=calendar=1か月の日別格子/lunation=朔望月の時系列パネル)。
    月齢=直前の朔からの経過日数・照度=円盤の輝面の割合で、輝面の向きは月齢から決め打ちせず
    太陽と月の実位置の位置角から計算。明暗境界線の位置を画素から測り直して申告した照度と
    突き合わせる自己検証(figure.verify)を持ち、向きが違えば一致しない
  • figure/1: 雨雲画像はマーカー換算誤差・「降水は雲量そのものではない」等、月齢マップは模式図で
    ある旨・天の北を上にした見え方・朔の日の正午時点との食い違いを、いずれも数値から生成
  • scripts/check-tools.py: 月齢マップを描画系(--figures)と追加経路(月齢カレンダー/朔の日/
    朔望月パネル)に追加
  • tests/test_regressions.py: 月齢の幾何(面積一致)・自己検証が異常を検出すること・日付解析・
    朔望月の月齢リセット・気象庁雨雲画像の換算を含め11件
  • README / SKILL.md / AGENTS.md / CLAUDE.md を v0.30.0 に更新(ツール数47)

v0.29.1 — 失敗を黙って落とさない修正と回帰テスト

Choose a tag to compare

@loosephoto loosephoto released this 15 Sep 12:42

v0.29.1 — 失敗を黙って落とさない修正と回帰テスト

外部データの取得で「一部だけ失敗した」「異常値が返った」ときに、黙って欠落させたり例外をツール外へ漏らしたりする余地があった箇所を修正し、失敗を必ずエラー結果と数値で返すようにしました。

修正

  • 🧯 ISS 時刻の防御的変換 — Open Notify の timestamp が数値でない場合、datetime 変換で例外がツール外へ漏れていました(規約1違反)。異常値は structuredContent.error="bad timestamp" のエラー結果として返します。
  • 🔒 neo_today の content 側 redact 漏れ — 429 の例外文字列が URL ごと api_key=<実際のキー> を含み、structuredContent は伏せ字でも content(人間向け表示)が素通しでした。両チャネルとも nasa_budget.redact() を通します。
  • ♀️ MAVEN の運用終了を正確化 — 「2026年3月に運用終了」から、2025-12-06 に火星の裏側で交信途絶・2026-06-03 に NASA が運用終了を宣言(NASA Science/プレスリリース)へ更新。Horizons のエフェメリス終了日(2026-03-01)は「現在位置を計算できない理由」として区別します。
  • 📉 部分失敗の数値化 — solar_system_now の惑星位置計算(structuredContent.planet_errors)と planetary_orbiter_track の軌道トレイル(trail_errors)で、except: pass により欠落が黙殺されていた箇所を廃止。失敗件数を content と figure.notes に数値から生成して出し、理由は structuredContent に記録します。
  • 🧪 回帰テスト — 上記を tests/test_regressions.py(unittest 3件)で固定し、AGENTS.md/CLAUDE.md の検証ゲートに追加しました。

検証

  • 全46ツール実呼び出し exit 0(DEMO_KEY の429のみ想定内)
  • --dead-code 0件 / --fuzz 252組合せ・例外漏れ0 / --offline exit 0 / --figures 描画系6・figure未対応0
  • python -m unittest discover -s tests 3件 OK

Full Changelog: v0.29.0...v0.29.1