mahjong-lab
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-server1f6871d9(サービス一覧)
決めたこと:
- 天鳳は東南戦、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-trackedtopic を付与- README の日本語タイトルを仮で「麻雀上達ラボ」に設定
決めたこと:
- プロジェクト名は
mahjong-lab(DECISIONS.md に記録)
次回やること:
- 何を作るか方向性を決める(何切るドリル / 牌譜の振り返り・分析 / 学習ログ / 相談相手 など)
- 方向性が決まったら CLAUDE.md・README の概要を記入
最近のコミット
- 66466be NAGAの10/13アップデートに対応(リッチ表示のURLと自己改善型タイプ) 2026/10/15
- 8dc0493 カベ週間3〜6日目の例に卓の図を追加し、注目の牌を青く光らせる機能を付ける 2026/10/11
- 3bbb1cc 学習メールの場面をじゃんたま風の卓の図にしてHTMLメールで送る 2026/10/11
- 31cae51 カベ週間: 「〜を当てる両面」を「〜でロンされる両面」に言い換え、2通目の冒頭に1通目の表の読み方を追加 2026/10/9
- 587e335 .devnotes を更新(学習メール「カベ週間」の作成と配信開始分) 2026/10/9
- e99c30b カベ週間: GPTの再レビューで3・4・7日目を修正(記事の大小関係と例外・抽出条件を正確に、組み合わせ数を放銃率と読ませない、多面待ちの適用範囲) 2026/10/9
- b90f599 カベ週間: 3日目に天鳳鳳凰卓のワンチャンス集計(HAZ)を追加し安全度の並びを補正、4日目に多面待ちの節を追加 2026/10/9
- a441903 カベ週間の2〜7通目をGPTのレビューで修正(7日目6mの78m待ちはフリテン、組み合わせ数を確率と読ませない言い方、確認の順番を追加など) 2026/10/9
- b244dd7 カベ週間の3〜7通目をレビューで修正(ワンチャンスとスジの比較を場合分け、カベで消える範囲の言い方など)、READMEに学習メールの説明を追加 2026/10/9
- d9c9e03 カベ週間の2〜7通目を追加(7日目はYouの牌譜とNAGAの危険度予測から出題) 2026/10/9
README
mahjong-lab(麻雀上達ラボ)
概要
天鳳で打つ → NAGA で牌譜解析 → 結果を見て反省、のサイクルを回して雀力を上げるための個人用リポジトリ。
セットアップ
Python 3.11 以上(標準ライブラリだけで動く)。config.toml に天鳳のプレイヤー名と、主に見る NAGA タイプを書く。
使い方
1半荘の振り返り
- 天鳳で打つ
- NAGA で牌譜を解析する(天鳳の牌譜一覧の「Analyze/AI → NAGA」か、NAGA の依頼ページに牌譜URLを貼る)
- 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で、公開用クローンに反映するだけ(コミットしない)
サーバーの自動処理(送るだけでレポートができる)
- NAGA で解析したら、CtxCapture の麻雀タブの+(またはキャプチャ)からレポートの URL を送る
- ctx-bucket の digest が URL を daily に記録する
- 多目的サーバー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 から呼ぶ起動スクリプト |