Posession- A study for AI and Vedic Astrology (Ver.1 1101 2026)
憑依 — AIとヴェーダ占星術のための習作（Ver.1 1101 2026）

指定地点：42.25108764235713, -74.39923545273686

作品の動作
ページの最初の描画フレームで閲覧端末のUTC時刻を記録し、その時刻と固定座標から空を計算します。右上には同じ瞬間をAmerica/New_Yorkの時刻で表示します。閲覧者の位置は取得しません。
英語を左、日本語を右に置き、対応する文を同時に順番に表示します。最後の文がフェードインしきってから8秒間、詩篇全体を表示し、その後に詩を消して作品マップへ移ります。通常は最後の文の表示開始から計9.15秒後、動きを減らす設定では8秒後です。Skipはいつでも作品マップへ移動します。
作品マップ：https://map.tomoakihata.photos/
読み始めた詩は途中で差し替えません。タブが非表示の間は文の逐次表示を進めません。生成済みの詩篇をサーバーに保存する機能はありません。

言葉と選択
現在はLLM APIを呼び出す方式ではなく、天体の状態に対応する完成句を選ぶルール方式です。
地球・水星・金星・火星・木星・土星・天王星・海王星・冥王星に各24組、計216組の基本詩句があります。太陽・月・満ち欠け・順逆行などを含め、互換用の旧句も保持した翻訳辞書の日英対応文は全475組です。
9天体の語彙帳216分類項目と、場所・方向・時間の質を表す108項目を収録しています。重複を除いた単語数ではありません。惑星の素材と完成句はplanet-corpus.json、太陽・月・水星と金星の逆行の句はcontext-corpus.json、その他の訳文はtranslations.pyで編集します。
各元素の6句から、天体の0.25度帯、月のナクシャトラ、地方恒星時の0.5度区分に応じて3候補を定め、各天体で1句をOSの乱数源から選びます。9天体の基本句だけでも同じ空の条件で最大3^9=19,683通りの組み合わせがあります。以下の文脈句も抽選するため、詩篇全体の選択幅はさらに広がっています。同じ結果が再度選ばれる可能性もあります。
冒頭の太陽の高度は−36、−18、−12、−6、0、15、35度を境に8段階に分け、上昇・下降それぞれ2候補、計32句から選びます。これに24種類の毎時の句を1句組み合わせます。毎時の句は到達UTC時刻の1時間区分で切り替わるため、参照地点の時計の正時ごとに冒頭の後半が変わります。夏時間終了時の繰り返す1時台も異なる句になります。高度が同じ段階にとどまっていても1時間ごとの違いを保つための創作上の時間構成であり、高度が一定幅ずつ動くことを保証するものではありません。24時間後には毎時の句の枠が巡回します。
月は各ナクシャトラ6候補、27区分で計162候補から選びます。元の句1候補に新しい5候補を加えています。水星・金星の逆行の前置きはそれぞれ10候補から抽選します。順行・留付近には逆行用の句を付けません。他の惑星の逆行の前置きは従来どおりです。
太陽の2候補、月の6候補、対象となる逆行の10候補も訪問時に一度だけ選び、読み始めた詩は毎時の境界を越えても途中で差し替えません。APIのcontext_selectionに実際に選んだ句IDと候補IDを残します。満ち欠けによる末尾の2区分は従来どおりです。
象徴と場所・方向・時間の言葉は作者による創作上の連想です。伝統的な占星術の語彙や実際の地形・方位をそのまま翻訳したものではありません。季節・天候・現地植生の判定は追加していません。
英語は自然への呼びかけや祈りの静けさを手がかりにしたオリジナルの文で、既存の詩の引用・翻訳は使っていません。日本語は現代仮名遣いの簡潔で硬質な書き言葉です。

天文計算
pyswisseph 2.10.3.2、Swiss EphemerisのMoshier計算、Lahiriアヤナーンシャを使います。
8惑星すべてに太陽・月・冥王星を加えた11天体を詩に使用します。地球は太陽中心、ほかは地球中心の座標です。地球の地平高度は定義しません。
月の黄経から27ナクシャトラ、太陽との離角から30ティティを求めます。太陽の幾何学的高度とその増減から昼・薄明・夜を区別します。惑星の黄経速度も使います。
留付近の区分は速度の絶対値0.005度/日未満という創作上の閾値で、厳密な留の時刻ではありません。外惑星や地球の象徴化は伝統的なインド占星術への創作上の拡張です。
「この声の背景」とAPIのphrase_selection・context_selectionで、数値・選択条件・句IDを確認できます。計算に失敗した場合は詩を作らず、失敗を表示します。

ローカル起動
Python 3.9以降で bash start.command を実行し、http://127.0.0.1:8765/ を開きます。HTMLを直接開いても天体計算APIは動きません。
終了はターミナルでCtrl+Cです。開発用の依存はrequirements.txtにあります。

本番起動
Python 3.12.14で pip install -r requirements-production.txt を実行し、gunicorn --config gunicorn.conf.py production:application で起動します。
PORT環境変数の既定値は10000です。/healthzを稼働確認に使います。render.yamlはRenderの標準Python環境に対応しています。Dockerfileも同梱しています。
production.pyはwelcome、JSON API、許可したCSS/JS、対応するソースZIPのみを配信します。ディレクトリ一覧や任意のローカルファイルは配信しません。
生成API：GET /possession-api/poem?at=<タイムゾーン付きISO時刻>
atがない場合はサーバー受信時刻です。時刻の有効範囲は1900〜2100年です。HTTP APIから乱数シードは指定できません。

入口と既存作品の接続
入口をRenderへ移す場合はPORTFOLIO_URL=https://tomoakihata.myportfolio.comを設定します。welcomeやAPI以外の旧パスを、パス・クエリを保ったままAdobe標準URLへ302転送します。
Adobe標準URLが独自ドメインへ再転送する状態では循環するため、Renderの入口のHTTPS確認後にAdobeの独自ドメイン接続を外し、標準URLで公開作品が表示されることを必ず確認します。
作品マップは既存Netlifyのままです。Adobeで未公開に設定されている作品は公開しません。
無料Renderプランでは休止後の初回に待ち時間があります。常時起動プランへの変更は所有者の料金承認が必要です。

編集と検証
詩句の作者向け一覧：python tools/export_library.py
対応するソースZIP：python tools/export_source.py
テスト：python -m unittest discover -s tests
コード・辞書・HTML/CSS/JSを更新したらソースZIPも再生成し、同じバージョンを配信します。
タイトルは日英併記です。本文は既存サイトと同じAdobe Fontsキットを参照し、対象文字がない場合はシステムのサンセリフ体を使います。フォントのバイナリは同梱していません。

ライセンスとソース提供
所有者の承認に基づき、この実装と内蔵の詩句辞書をGNU AGPL version 3で提供します。LICENSE.txtとSOURCE-NOTICE.txtを参照してください。
公開画面の「Source · AGPLv3」から、その配信版に対応するソース一式を取得できます。pyswissephの対応するソースはvendor/pyswisseph-2.10.3.2.tar.gzに含まれます。既存写真・作品マップの素材・Adobe Fontsのバイナリはこのソース配布に含めません。
Swiss Ephemeris公式資料：https://www.astro.com/swisseph/swephprg.htm
pyswisseph：https://pypi.org/project/pyswisseph/2.10.3.2/
