Repository navigation
Releases: loosephoto/space-finder-mcp
Release list
v0.39.2 — 日時解釈・エラー応答・キャッシュ汚染・カレンダー境界処理の一括修正
全モジュール(全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)に統一。
- Windows CRT の
- 検証ゲート
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: OKscripts/check-tools.py --dead-code: 0件scripts/check-tools.py --fonts: 3/3 OKscripts/check-tools.py --offline: 66ツール・例外漏れ0scripts/check-tools.py --fuzz: 444組・例外漏れ0scripts/check-tools.py --concurrency: 3/3 OKscripts/check-tools.py --stdio: 7/7 OKscripts/check-tools.py --figures: 描画系 9 + 追加経路 37 = 46件すべて OKunittest discover -s tests: 330件 OK(新規回帰テスト 10件BugSweepV0392Tests)
Full Changelog: v0.39.1...v0.39.2
v0.39.1 — 地上視点パノラマの不具合修正
地上視点パノラマ(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 0uv build0.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)
「ドイツ 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として返し、注意書きを本文に出します。
- 雲量フィルタはクライアント側 — DLR の API は
- 🇷🇺
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-code0件/--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 — 星空マップを地上視点パノラマに一新(実星表・天の川・時間帯で変わる空・依頼表示)
「星空マップを地上から見上げたパノラマに一新(実星表・天の川・時間帯で変わる空・依頼表示)」(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-code0件/--figures・--media-links・--offline・--fuzz・--stdioすべて exit 0。
Full Changelog: v0.38.4...v0.38.5
v0.38.4 — 宇宙天気に予報(フレア発生確率・活動領域別確率・NOAA 3日予報)を追加
宇宙天気に予報(フレア発生確率・活動領域別確率・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-code0件/全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 移転に追従し、宇宙天気の取得を復旧
「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 /--stdio6/6 応答 /--dead-code0件- 全62ツール exit 0(
space_weatherok 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の並列ツール呼び出し対応と無応答バグの修正
「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 — 衛星カタログの全件走査・一致度順と宇宙天気のフォールバック
機械的に数えると嘘の答えが出る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 — 気象庁の雨雲・降水画像と月齢マップ
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 — 失敗を黙って落とさない修正と回帰テスト
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-code0件 /--fuzz252組合せ・例外漏れ0 /--offlineexit 0 /--figures描画系6・figure未対応0python -m unittest discover -s tests3件 OK
Full Changelog: v0.29.0...v0.29.1