← 一覧に戻る

mahjong-lab

GitHub ↗ HTML 最終push: 2026/10/15 17:53

WIP(現在進行中)

Work In Progress

このプロジェクトで現在進行中の作業と、過去のスナップショットを記録する。

現在の状況

今どこまで進んだか:

  • 振り返りの流れ(天鳳 → NAGA → レポート URL を送る → サーバーで自動でレポート → 麻雀タブ)は動いている。10/05 の2半荘はサーバーがレポートを作って push 済み
  • 学習メール「カベ週間」(ノーチャンス・ワンチャンス・カベ、全7通)を配信中。1通目は 10/09 15:00 に送信済み。2〜7通目は 10/10〜10/15 の毎朝7時に、多目的サーバー1 の cron と Resend で送られる
    • 本文は lessons/kabe-week/、送信は tools/lesson_mail.py。Claude と GPT のレビューで直した版が送られる

次に何をするか:

  • 10/10 朝に2通目が届いたか確認する(届かなければサーバーの /var/log/mahjong-lab-lesson-mail.log と ~/.local/state/mahjong-lab/lesson-mail.json)
  • 10/15 にカベ週間が終わったら感想を聞いて、次の学習テーマを決める(候補: 押し引き、七対子・対々和の河読み)
  • 振り返りが数半荘溜まったら、弱点の集計を作る

詰まっていること・未決事項:

  • 1通目が Gmail の受信箱に届いたか(迷惑メールに入っていないか)は未確認
  • 3日目の HAZ の節と4日目の多面待ちの節は GPT の再レビューを反映済み。それ以降の変更はない
  • 以前からの持ち越し: worker の最後の修正3件は Codex に再レビューしていない/CtxCapture のキャプチャ画面の既存の問題は別タスク/ctx-bucket 側の .devnotes/ に麻雀タブ追加分が未記録
  • サーバーがコミットするので、手元で作業する前に git pull する

過去のWIPアーカイブ

(新しい「現在の状況」を書く前に、古いものをここに追記でアーカイブする。新しいものが上)

2026-10-09 15:52 時点のスナップショット

今どこまで進んだか:

  • 「天鳳で打つ → NAGA で解析 → レポート URL を送る → 自動でレポート → 麻雀タブで読む」の流れを一通り作った
    • 振り返りツール(tools/naga_review.py ほか)、HTML レポート、公開スクリプト、サーバーの worker(cron 2分ごと)
    • CtxCapture の麻雀タブ(実機にインストール済み、通知から開くことを確認済み)
  • 最初の半荘(2026-10-04 一般東風)のレポートは公開済み

次に何をするか:

  • 次の東南戦で、レポート URL の送信からサーバーでの作成・通知までの通し動作を確認する
    • 来なければ サーバーの /var/log/mahjong-lab-worker.log と ~/.local/state/mahjong-lab/worker.json を見る
  • 振り返りが数半荘溜まったら、弱点の集計を作る

詰まっていること・未決事項:

  • 通し動作は未確認。digest が新ルールどおり NAGA の URL を daily に記録するかもまだ分からない
  • worker の最後の修正3件(タイムアウトの持ち方、zlib エラー、初回の状態保存)は Codex に再レビューしていない
  • CtxCapture のキャプチャ画面の既存の問題(保存失敗でも「送信しました」と出る)は別タスクとして切り出したまま
  • ctx-bucket 側の .devnotes/ は今回の麻雀タブ追加分をまだ記録していない
  • サーバーがコミットするので、手元で作業する前に git pull する

2026-10-04 18:09 時点のスナップショット

今どこまで進んだか:

  • リポジトリ作成と GitHub 連携まで完了。コードはまだない

次に何をするか:

  • 何を作るか方向性を決める。候補:
    • 何切る問題のドリル
    • 雀魂などの牌譜の振り返り・分析
    • 学習メモ・ログ
    • Claude に相談しながら打つ相棒
  • 決まったら CLAUDE.md の「プロジェクト概要」と README の「概要」を記入し、ROADMAP を具体化

詰まっていること・未決事項:

  • 方向性が未決
  • 既存の hinata-mahjong との関係(派生か独立か)が未確認
  • README の日本語タイトル「麻雀上達ラボ」は仮

ROADMAP(計画)

ロードマップ

今週

  • 何を作るか方向性を決める(→ 天鳳で打って NAGA で解析し、振り返る流れを作る)
  • CLAUDE.md・README の概要を記入
  • 次の東南戦で、レポート URL の送信からサーバーでの作成・通知までの通し動作を確認する(10/05 の2半荘でサーバーがレポートを作って push したことを git log で確認。通知の受信は未確認)
  • 学習メール「カベ週間」(10/09〜10/15、毎朝7時)が届いているか確認し、終わったら感想を聞く

今月

  • 振り返りが数半荘溜まったら、弱点の集計を作る(場面別の減点、悪手率・NAGA度の推移など)
  • 1〜2週間回してから、NAGA を Diamond に上げるか決める
  • 学習メールの次のテーマを決める(候補: 押し引き、七対子・対々和の河読み)

今四半期

  • 溜まった弱点から、何切る・押し引きの練習問題を作る

いつか

  • NAGA への解析依頼の自動化(ログイン状態の保存が必要なので、今回は半自動で見送り)

DECISIONS(意思決定)

意思決定記録

このプロジェクトで下した重要な意思決定を記録する。 最新が上に来る。


2026-10-09: NAGA の危険度予測は確率としてそのまま読まず、同じ局面の中での比較に使う

背景: 学習メールの材料として、You の牌譜のリーチ場面で NAGA の危険度予測(danger_s/t/k)を集計したところ、無スジの平均が 50% を超えるなど、確率としては大きすぎる値が出た。

決定: 危険度予測は「その局面で、どの牌がどの牌より危ないか」の比較に使う。複数局面をまたいだ平均や、確率としての読み方はしない。メールやレポートで数値を出すときもそう断る。

理由: 1局面で34種を足すと6〜7になり(通常の待ちは1〜3種)、確率として校正されていない。一方、実際の待ち牌の平均は 45.9、待ちでない牌は 24.6 で、順位付けには使える。3半荘ぶんでは局面数も少なく、平均を出しても偏りが大きい。

2026-10-09: 学習メールはリポジトリにテキストで置き、サーバーの cron と Resend で送る

背景: ノーチャンス・ワンチャンス・カベを1週間で学ぶメールを、1日1通送ってほしいと頼まれた。

決定: 本文を lessons/<テーマ>/*.txt(send_at と subject のヘッダー付き)に置き、多目的サーバー1 の cron(5分ごと)が tools/lesson_mail.py で予定時刻に送る。送信は review-antenna と共用の Resend(onboarding@resend.dev)。

理由: You が Resend の流用を選んだ。サーバーなら Mac を閉じていても届く(Gmail コネクタとデスクトップアプリの予約タスクでは、Mac が起きているときしか動かない)。7通を先に書いておけば、送る前に読んだり直したりでき、レビューも済ませられる。サーバーの作業コピーは worker が2分ごとに origin/main に合わせているので、push すればそのまま反映される。

2026-10-04: サーバーの Claude は Read / Write / Edit だけで動かす

背景: 解釈を書かせる claude -p が動くサーバーには、通知の鍵や SSH 鍵、Claude のログイン用トークンがある。

決定: Claude には Read / Write / Edit だけを渡し(Bash なし)、局面の情報は Python 側で作ってプロンプトに入れる。許可外の操作は dontAsk で拒否し、鍵のある場所は明示的に拒否、通知の鍵は環境変数から外す。実行前後でファイルを比べ、解釈ファイル以外が変わっていたら成果を捨てる。

理由: Codex のレビューで、--allowedTools は禁止ではなく、Bash があれば環境変数からトークンを読めると指摘された。サーバーで試し、鍵ファイルを読めないことと、解釈は Bash なしでも書けることを確認した。

2026-10-04: NAGA への解析依頼は自動化せず、レポート URL を送る半自動にする

背景: 「天鳳の牌譜 URL を送るだけで、解析からレポートまで」できないか検討した。

決定: 解析依頼は天鳳アプリの「Analyze/AI → NAGA」から自分で出し、終わったら NAGA のレポート URL を CtxCapture から送る。そこから先(レポート作成・解釈・公開・通知)を自動にする。

理由: You が選んだ。全自動は、NAGA のログイン状態をサーバーに置く必要があり、ログインが切れるたびに入り直しが要る。依頼の送信も画面の裏の仕組みに頼るので壊れやすい。レポートの JSON は認証なしで取れるので、半自動ならログイン状態が要らない。

2026-10-04: レポートは CtxCapture の麻雀タブで HTML で読む(置き場は ctx-bucket の mahjong/)

背景: 見やすい形でスマホから読みたい。候補は GitHub で Markdown を読む、専用の Web ページ、CtxCapture のタブだった。

決定: CtxCapture に麻雀タブを足し、HTML のレポートを WKWebView で表示する。データは mahjong-lab が作り、ctx-bucket の mahjong/ に公開する。タブは TODO・カレンダー・麻雀・Message・その他(メディア・キャプチャ)の並び。

理由: You の指定。置き場は「アプリの GitHub トークンを mahjong-lab にも広げる」案と比べ、設定変更が要らない ctx-bucket へのコピー(b)を You が選んだ。

2026-10-04: 牌の絵は FluffyStuff/riichi-mahjong-tiles(CC0)をじゃんたま風に加工して使う

背景: レポートの牌をじゃんたま風にしたい。参考画像からの切り出しも検討した。

決定: FluffyStuff の CC0 素材を使い、東南西北を黒にし、下にオレンジの厚みを付ける(tools/build_tiles.py)。

理由: 参考画像は正面を向いた牌が8枚ほどしかなく、37種そろわない。じゃんたまの牌の絵は運営会社の権利物。自作の簡略な絵は「全然違う」と不評だった。

2026-10-04: レポートは NAGA の数値を基準に作る

背景: 最初のまとめで、Claude の見立て(放銃率の目安など)から「押し引きの差が一番大きい」と書いた。NAGA の数値で集計し直すと逆だった。

決定: 重要度は「類似度の減点」(その1打で NAGA度が何点下がったか)で並べ、場面分け(手組み/押し引き)も NAGA 予測の他家テンパイ確率とリーチ者の有無だけで決める。Claude の解釈は「Claude の解釈」と明記して分ける。

理由: You の要望(NAGA の判断を元にレポートを作ってほしい)。類似度は「100 − 推奨度の差の合計 ÷ 打牌回数」なので、NAGA の数値だけで差の大きさを出せる。

2026-10-04: 天鳳は東南戦、NAGA の解析は1日1半荘、主に見るタイプはニシキ

背景: NAGA の Platinum は東南戦で月30半荘ぶん。1日5半荘打つと、全部は解析できない。

決定: 天鳳は東南戦を打つ。解析は1日1半荘ほどにして、1〜2週間回してから Diamond に上げるかを考える。主に見るタイプはニシキ(東風戦ではニュー・シグマのみ)。

理由: You の選択。複数タイプで解析しても消費 NP は変わらなかった(東風戦2タイプで30NP)。

2026-10-04: プロジェクト名を mahjong-lab にする

背景: 麻雀上達のための新規プロジェクトを作るにあたり、リポジトリ名を決める必要があった。

決定: mahjong-lab にした。

理由: You の指定。候補として mahjong-dojo / mahjong-training / mahjong-study / tenpai-lab / riichi-lab / pai-log も出していた。既存の hinata-mahjong と紛らわしくない名前になっている。

DEVLOG(作業ログ)

開発日誌

このプロジェクトでの作業を時系列で記録する。 最新のエントリが上に来る。


2026-10-09

15:52 - 学習メール「カベ週間」(ノーチャンス・ワンチャンス・カベ)を作って配信開始

やったこと:

  • ノーチャンス・ワンチャンス・カベを1週間で理解する学習メール7通を lessons/kabe-week/day1〜7.txt に作った(1日1つの切り口、末尾に確認問題、答えは翌日の冒頭)
    • 1 仕組み / 2 数え方 / 3 信用度 / 4 応用(4・5・6 の消し方、多面待ち)/ 5 落とし穴 / 6 攻めの視点 / 7 実戦問題
    • 7日目は You の牌譜から2局面(10/05 南1局2本場、10/04 東3局2本場)を出題し、リーチ者に対する NAGA の危険度予測と照らし合わせた
    • 3日目に天鳳鳳凰卓 約104万局の集計(HAZ「【牌譜解析】ワンチャンスはどのくらい危険?」、2011年)を出典付きで入れた
  • 送信の仕組み tools/lesson_mail.py と server/mahjong-lab-lesson-mail.sh を作り、多目的サーバー1 の cron(5分ごと)に登録。各ファイルの send_at に Resend で送り、送信済みはサーバーの ~/.local/state/mahjong-lab/lesson-mail.json に記録。24時間以上過ぎたものは送らない
  • 鍵と宛先はサーバーの ~/.config/mahjong-lab-lesson.env(権限600)。Resend の鍵は review-antenna の .dev.vars から流用
  • 1通目は 2026-10-09 15:00:02 に送信済み(Resend が受け付けたことまで確認。Gmail の受信は未確認)。2〜7通目は 10/10〜10/15 の毎朝7時
  • 内容は3回レビューした: Claude のサブエージェント(14件)→ GPT(Codex CLI、8件+改善提案5件)→ 追加分を GPT で再レビュー(5件)。指摘はすべて記事の原文や実データと照合してから反映
  • README に学習メールの節を追加

決めたこと:

  • 学習メールはリポジトリにテキストで置き、サーバーの cron と Resend で送る
  • NAGA の危険度予測は確率としてそのまま読まず、同じ局面の中での比較に使う
  • (詳細は DECISIONS.md)

詰まったこと / 気づき:

  • 15:00 の初回送信まで20分しかなく、送信の仕組みと1通目を先に作って、残りは送信待ちの間に書いた
  • NAGA の danger_s/t/k は、1局面で34種を足すと6〜7になる。実際の待ち牌(machi)の平均は 45.9、待ちでない牌は 24.6 で、牌の並び(萬・筒・索)の対応は正しい。順位付けには使えるが、確率としては大きめ
  • 最初は組み合わせの数だけで「ワンチャンスとスジの優劣は場合による」と書いていた。天鳳のデータでは、場に3枚切れのワンチャンスは4・5・6 以外の無スジと同じくらい危険で、基本はスジの方が安全だった。理屈だけで安全度を並べない
  • 組み合わせの数(16通り→4通り)は正しいが、そのまま確率や放銃率の比として読ませてはいけない(GPT の指摘)
  • 7日目の解説で、9m が上家の現物(78m の 6-9 待ちはフリテン)なのを見落としていた。Claude のレビューでも見逃し、GPT が見つけた。別系統のレビューに意味があった
  • Resend の送信元 onboarding@resend.dev は、アカウントの持ち主宛てなら送れる。迷惑メールに入る可能性はある
  • WIP の「通し動作の確認」は、10/05 の2半荘でサーバーがレポートを作って push していたことを git log で確認できた

次回やること:

  • 10/10 朝に2通目が届いたか確認する(来なければサーバーの /var/log/mahjong-lab-lesson-mail.log を見る)
  • 10/15 にカベ週間が終わったら感想を聞き、次のテーマを決める

2026-10-04

22:53 - NAGA の振り返りパイプラインを一通り構築(レポート・麻雀タブ・サーバー自動処理)

やったこと:

  • NAGA を調査: 公式 X(@NAGA025)と公式サイト(マニュアル・FAQ)から、機能・料金・レポートの見方・JSON API を docs/naga.md にまとめた
  • 振り返りツールを作成: tools/naga_review.py(レポート JSON → 解析)、tools/naga_position.py(1局面の詳細)、tools/mj.py(向聴数・受け入れ枚数)
    • 一致率・類似度・悪手率はレポート画面の JS を再現し、公式の対局レポートと一致を確認
  • 最初の半荘(2026-10-04 一般東風、2位、ニュー基準の NAGA度 82.3)を振り返った
  • レポートを NAGA の数値基準に作り直した(類似度の減点で重要度を決め、場面分けも NAGA 予測で行う。Claude の解釈は data/notes/ に分離)
  • スマホ向け HTML レポート(tools/render_html.py)。牌は FluffyStuff/riichi-mahjong-tiles(CC0)をじゃんたま風に加工(tools/build_tiles.py)
  • 公開スクリプト tools/publish.py(ctx-bucket の mahjong/ へ。公開専用クローン経由・ロック・入力検証つき)
  • CtxCapture(ctx-bucket の capture-ios/)に麻雀タブを追加: 一覧、HTML 表示、+からレポート URL を送信、送信後の「作成中」表示、通知タップで麻雀タブ。実機(iPhone 14)に上書きインストールし、通知から麻雀タブが開くことを確認
  • サーバー自動処理 tools/worker.py と server/mahjong-lab-worker.sh を作り、多目的サーバー1 の cron(2分ごと)に登録。ctx-bucket の digest に「NAGA のレポート URL は読みに行かず daily にそのまま記録する」ルールを追加
  • 各コミットの前に Codex(GPT)にレビューを頼み、指摘を反映した(アプリ 3回、公開スクリプト 3回、worker 3回)
  • 天鳳アプリでの牌譜の見方を iPhone ミラーリングで確認した
  • 関連コミット: ctx-bucket 6a372b8(麻雀タブ)・cb9b1ef(初回公開)・976a8e7(digest ルール)、multi-purpose-lightsail-server1 f6871d9(サービス一覧)

決めたこと:

  • 天鳳は東南戦、NAGA の解析は1日1半荘(Platinum の枠)、主に見るタイプはニシキ
  • レポートは NAGA の数値を基準に作る
  • 牌の絵は FluffyStuff の CC0 素材をじゃんたま風に加工して使う
  • レポートは CtxCapture の麻雀タブで HTML で読む(置き場は ctx-bucket の mahjong/)
  • NAGA への解析依頼は自動化せず、レポート URL を送る半自動にする
  • サーバーの Claude は Read / Write / Edit だけで動かす
  • (詳細は DECISIONS.md)

詰まったこと / 気づき:

  • 最初のまとめで「押し引きの差が一番大きい」と書いたが、NAGA の数値で集計すると手組み 60%・押し引き 40% で逆だった。自分の見立てで重要度を決めない
  • 天鳳アプリは Web 版と同じプログラム(Cordova)。牌譜画面は、ロビー下の大きいボタンの右半分を押すと切り替わる。牌譜の再生画面から戻る方法は分からず、アプリを再起動して戻った
  • NAGA の解析依頼は、ログイン Cookie 付きでフォームを送る仕組み。自動化はできそうだが、規約上はグレーで壊れやすいので見送った
  • サーバーは Python 3.10・メモリ 416MB。Claude の実行は digest と同じロックで順番待ちにした。opus で3〜5分、最大メモリは約200MB
  • claude -p の --allowedTools は「自動で許可する操作」の指定で、禁止にはならない。Bash を外し、--tools と dontAsk モード、実行前後のファイル比較で守った
  • iPhone の TabView はタブが6つ以上だと、5つ目以降が「その他」に入る

次回やること:

  • 次の東南戦で、レポート URL の送信 → digest → サーバーでのレポート作成 → 通知 の通し動作を確認する(初回の本番)
  • 振り返りが数半荘溜まったら、弱点の集計を作る

18:09 - プロジェクト作成

やったこと:

  • プロジェクト名を相談し、mahjong-lab に決定(他の候補: mahjong-dojo / mahjong-training / tenpai-lab / riichi-lab など)
  • new-project-setup で ~/cdev/mahjong-lab を作成、GitHub private リポジトリ(ichirokisanuki/mahjong-lab)と連携し初回 push
  • dev-tracked topic を付与
  • README の日本語タイトルを仮で「麻雀上達ラボ」に設定

決めたこと:

  • プロジェクト名は mahjong-lab(DECISIONS.md に記録)

次回やること:

  • 何を作るか方向性を決める(何切るドリル / 牌譜の振り返り・分析 / 学習ログ / 相談相手 など)
  • 方向性が決まったら CLAUDE.md・README の概要を記入

最近のコミット

README

mahjong-lab(麻雀上達ラボ)

概要

天鳳で打つ → NAGA で牌譜解析 → 結果を見て反省、のサイクルを回して雀力を上げるための個人用リポジトリ。

セットアップ

Python 3.11 以上(標準ライブラリだけで動く)。config.toml に天鳳のプレイヤー名と、主に見る NAGA タイプを書く。

使い方

1半荘の振り返り

  1. 天鳳で打つ
  2. NAGA で牌譜を解析する(天鳳の牌譜一覧の「Analyze/AI → NAGA」か、NAGA の依頼ページに牌譜URLを貼る)
  3. NAGA の「解析一覧」からレポートを開き、その URL で下書きを作る
python3 tools/naga_review.py "https://naga.dmv.nico/htmls/report_viewer.html?report_id=...&tw=1"
  • できるもの
    • reports/<名前>.html: スマホ向けの HTML レポート(1ファイル完結。CtxCapture の麻雀タブで読む)
    • reviews/<名前>.md: 同じ内容の Markdown 版
    • data/games/<牌譜ID>.json: 解析結果(NAGA の数値と自分の判断)。集計にも使う
    • reports/index.json: レポートの一覧
  • 一致率・類似度・悪手率はレポート画面と同じ計算式で出している
  • NAGA と違った打牌は「類似度の減点」(その1打で NAGA 度が何点下がったか)の大きい順に並ぶ。場面(手組み / 押し引き)ごとの減点の合計も出る
  • 各局面に NAGA レポートのその局面へ直接飛ぶリンクが付く

Claude の解釈を足す

data/notes/<牌譜ID>.json に解釈を書いて、作り直す。

python3 tools/naga_review.py --rerender

CtxCapture の麻雀タブに公開する

python3 tools/publish.py

reports/ のレポートと一覧を、ctx-bucket の mahjong/ に置いてコミット・push する(CtxCapture の麻雀タブがここを読む)。

  • 公開は専用のクローン(config.toml の [publish] clone_dir)で行う。ふだん使う ctx-bucket の作業コピーには触らない
  • 公開前に、一覧の各 HTML が存在しハッシュが合うことを確かめる。合わなければ止まる
  • 消すのは前回の一覧が参照していたレポートだけ。公開中のレポートを全部消す場合は --allow-empty が要る
  • --dry-run で、公開用クローンに反映するだけ(コミットしない)

サーバーの自動処理(送るだけでレポートができる)

  1. NAGA で解析したら、CtxCapture の麻雀タブの+(またはキャプチャ)からレポートの URL を送る
  2. ctx-bucket の digest が URL を daily に記録する
  3. 多目的サーバー1 の cron(2分ごと、server/mahjong-lab-worker.sh → tools/worker.py)が URL を拾い、 レポートを作って Claude(claude -p)に解釈を書かせ、mahjong-lab に push、ctx-bucket に公開して CtxCapture に通知する
  • 状態は サーバーの ~/.local/state/mahjong-lab/worker.json、ログは /var/log/mahjong-lab-worker.log
  • NAGA の解析結果が24時間取れない、またはレポート作成が3回失敗したら、諦めて通知する
  • Claude は Read / Write / Edit だけで動かし、書けるのはその牌譜の解釈ファイル1つ。鍵のある場所は読めない
  • 解釈のモデルは Opus 5.5(claude-opus-5-5。環境変数 MAHJONG_NOTES_MODEL で変えられる)。サーバーの Claude Code は 2.1.280 以上が要る
  • サーバーがコミットするので、手元で作業する前に git pull する

1局面を詳しく見る

python3 tools/naga_position.py "<レポートURL>" --kyoku 2 --step 81

河・副露・各家のテンパイ確率と、打牌候補ごとの NAGA 推奨度・放銃危険度(NAGA 予測)と、切った後の向聴数・受け入れ枚数(ツール計算)を表示する。--kyoku と --step は振り返りファイルのリンクの ts と tv。

学習メール(テーマを決めて毎日1通)

lessons/<テーマ>/*.txt に書いたメールを、各ファイルの send_at(日本時間)に Resend で送る。

send_at: 2026-10-09 15:00
subject: 件名
---
本文(プレーンテキスト)
  • 本文の [場面] 〜 [/場面](ドラ表示牌・各家の河と副露・手牌)は、HTML 版でじゃんたまの対局画面風の卓の図にして見せる。図は python3 tools/build_scenes.py が lessons/<テーマ>/scenes/ に PNG で作り(手元の Mac の Chrome を使う)、メールにインライン添付する。書き方は tools/build_scenes.py の先頭。本文の [場面] を直したら作り直してコミットする(図がないとテキストだけで送る)
  • HTML 版の見た目は python3 tools/lesson_mail.py --preview <出力先> で手元に書き出して確かめる
  • 多目的サーバー1 の cron(5分ごと、server/mahjong-lab-lesson-mail.sh → tools/lesson_mail.py)が送る。ファイルは worker と同じ作業コピーから読むので、push すれば2分ほどでサーバーに届く
  • 送信元は review-antenna と共用の Resend(onboarding@resend.dev)。鍵と宛先はサーバーの ~/.config/mahjong-lab-lesson.env(権限600)
  • 送ったものはサーバーの ~/.local/state/mahjong-lab/lesson-mail.json に記録し、二度送らない。send_at を24時間以上過ぎたものは送らない。ログは /var/log/mahjong-lab-lesson-mail.log
  • 予定の確認は python3 tools/lesson_mail.py --list(サーバーで実行すると送信状況も出る)。試験送信は --only <ID> --to delivered@resend.dev(Resend のテスト用アドレス。記録は残らない)
  • 2026-10-09〜15: kabe-week(ノーチャンス・ワンチャンス・カベ)

表記

  • 牌: 123m(萬子)456p(筒子)789s(索子)、字牌は漢字。0 は赤5
  • 放銃危険度: NAGA の危険度予測(3家ぶん)を合成した値
  • 向聴数・受け入れ枚数は NAGA の出力ではなく、このツールで計算した参考値(「ツール計算」と表記)

ディレクトリ

パス 内容
tools/ 振り返り用スクリプト
reports/ 1半荘ごとの HTML レポートと一覧(index.json)
reviews/ 同じ内容の Markdown 版
data/games/ 解析結果(NAGA の数値と自分の判断)
data/notes/ Claude の解釈
data/cache/ NAGA レポートの生 JSON(コミットしない)
docs/naga.md NAGA の機能・料金・JSON API のまとめ
lessons/ 学習メールの本文(テーマごと)と卓の図(scenes/)
server/ サーバーの cron から呼ぶ起動スクリプト