月案ライブラリの本体実装
2026-09-27。ユーザーの「実装に進んで」に基づき、引き継ぎ仕様と
tools/monthly-library-sheet-preview/ の帳票構造を本体へ接続した。
当初の追加確認でAIは「今回は接続せず、未接続と表示する」と指定された。
その後の「では、それも含めて実機検証しよう」により、Ollama連携を追加した。
現在のAI仕様と検証環境は Ollama連携の実装記録 を参照。
2026-09-27 11:08 JSTに本番配備を完了。結果は 配備記録 を参照。
入口と画面
指導計画ホームと従来の月案作成画面に入口を追加。URLは /plans/monthly-library。
保存文書は従来の文書一覧にも表示され、文書詳細から承認・差戻しができる。
従来の月案作成・編集画面は保持している。
- 0〜2歳は共通欄と個人別4列、3〜5歳は養護・教育の4列、食育1枠、右側の月日別行事表。
- 年齢クラスを選択する。誕生日で帳票様式を自動変更しない。
- 個人別行は実在籍に合わせ、0歳6行、1歳7/8行、2歳7/8/7行を繰り返してページ分けする。
- 月齢は対象月初時点の参考表示。暦日・曜日は対象年月から計算する。
- セル内直接編集、候補選択による
○付き追記、Backspace/Delete、重複防止、削除後の再選択。 - 候補は年齢・月・区分・項目・領域で絞り込み、全半角正規化とキーワード全語一致で検索。50件ずつ表示。
- 個人と共通の評価反省は分離。食育は
section=食育 OR item=食育。 - 小さい画面でも表の行列を維持し、帳票内だけ横スクロールする。
- AI設定のない園は未接続を明示。設定した園はOllamaで候補を生成する(上記の追加実装記録を参照)。
保存・取消・切り替え
- 「下書きを保存」でサーバーへ保存。自動保存ではない。
- 園・クラスID・年月・年齢クラスごとに一意。新規作成の競合も409で検出。
- 月・クラス・年齢の切り替えでは、画面を開いている間の未保存入力をメモリーに保持する。
- 画面を閉じる・再読み込み・他画面へ移動する場合、未保存入力があれば離脱確認。本文をlocalStorageに保存しない。
- 「保存した内容に戻す」で直前の成功した保存へ戻る。「ひとつ戻す」で編集・追記・復元を取り消せる(30操作)。
- 保存失敗・ログイン切れ・同時編集競合では入力を保持し、成功と表示しない。
- 保存応答後も入力セルを再描画せず、保存中の追加入力とカーソルを保持する。
- 本体の改訂履歴・楽観ロック・承認状態を使用。レビュー中・承認済み等は閲覧専用。
- 下書き後に園児が増えた場合は既存行を残して追加。承認済みの園児構成は固定。
保存契約
plan_documents にnullableの monthly_sheet(JSON)と monthly_sheet_key を追加。
既存の月案10項目・個別指導計画は書き換えない。SQLite移行は追加のみで再実行可能。
新しいバックアップ契約 monthly-library-20260927 を追加し、過去の契約ファイルを保持する。
新契約には、この作業前から存在する開発中スキーマの追加項目も含め、現在の本体と照合している。
帳票JSONはschema_version=1。帳票ID、帳票版 2026-09-27.1、クラスID、年齢クラス、
園児参照・表示名・生年月日のスナップショット、フィールドごとの本文と出典を保持。
園と対象年月は文書本体に保持し、JSON出力・改訂スナップショットにも帳票を含める。
| 対象 | フィールドID |
|---|---|
| 共通 | common:goal / common:home / common:review / common:events |
| 個人 | child:{children.id}:life|play|help|review |
| 集団 | group:{care|health|relations|nature|language|expression}:{goal|environment|expected|support} |
| 食育 | group:food |
| 行事 | event:{日}(対象年月と組み合わせる) |
出典はデータソースID、文例ID、原文、原文種別、資料相対パス、シート名、元資料ID、元セルID、 年・月・年齢・項目・区分・領域を保持。元セルIDはExcelのセル座標ではない。 新規出典は保存時にサーバーで検証し、別項目や別園の出典を受け入れない。 既存の出典は、DBが一時利用できなくても保持して手入力を保存できる。
過去3か月
文例DBではなく、本体の園児ID付き月案・既存個別指導計画を参照する。
前3暦月を古い順に表示し、年度・進級をまたいでも child_ref で追う。
各文書の最新保存版(下書きを含む)を状態と元文書リンク付きで表示する。
同月に複数文書がある場合は、クラス・年齢を明示してそれぞれ表示する。
個人4項目がすべて空白の場合、その園児の月次記録なしと扱う。他月・他園児で補完しない。 旧個別指導計画は4列へ推測変換せず、元の項目名で折りたたみ表示する。 「振り返りの観点」を実施後の評価反省へ移す処理は行わない。
文例データソース設定
環境変数 HOIKU_MONTHLY_LIBRARY_SOURCES に、園参照をキーとするJSONを設定する。
例(実際の HOIKU_NURSERY_REF と一致させる):
{"ひかり保育園":{"id":"getsuan-20260927","path":"C:/python/getsuan-rag/getsuan.sqlite"}}
Linux等では配備先で参照できるパスへ変更する。DBをGitや配備アーカイブへ含めない。
id は文例IDの意味が変わる再構築時に更新する。既存の出典スナップショットは保持される。
設定なしでは候補欄に未設定を表示し、手入力と保存は利用可能。
接続は mode=ro と PRAGMA query_only=ON。取り込み・更新・コピーはしない。
短い検索語と全半角一致を保証するため、年齢・月・欄で絞った本文を正規化して部分一致検索する。
指定実DBで読み取り専用確認済み:1歳10月の生活・健康は先頭50件と続きあり、 「手」の検索も先頭50件、3歳10月の食育は40件。本文・氏名を検査ログへ出力していない。 本番には配備記録のLinux用読み取り専用パスを設定済み。
検証
test_monthly_library.py は空白帳票、保存と出典、改訂と競合、認証・園・クラス・CSRF、
出典改ざん、検索条件・重複排除・ページング、年度・進級・欠損履歴、園児追加、
承認後の固定、旧DBへの追加移行を確認する。
ブラウザーでは架空データで検索・編集・保存再表示・履歴・幅320/1024pxを確認。
共通テンプレートのTailwind CDN警告はあるが、新画面のJavaScriptエラーは確認されていない。
結果:新規12件を含む関連84テストが成功。対象は月案ライブラリ、既存計画、DB起動・移行、
差戻し文書、バックアップ・復元。月案本文・出典・改訂スナップショットの復元一致も確認した。
最初の広域実行では既定一時ディレクトリの権限とWindowsの長いパスで失敗したため、
短い作業フォルダ内の一時パスを指定して再実行した。スキーマ契約の不足は上記の新契約で修正した。
2画面の同時編集では競合を409で拒否し、画面上の未保存入力が残ることも確認した。
確認画像は .local-dev/monthly-library-verification/monthly-library-complete.png。
本体実装時点では本番配備を別作業とし、その後のユーザー依頼により上記配備記録のとおり完了した。
Drive自動同期、原本と印刷寸法・改ページを一致させるExcel/PDF出力は対象外。
従来の印刷ボタンはブラウザー印刷であり、原本への出力機能の完成を意味しない。
最新本番基準は docs/deployment-parent-notice-order-2026-09-27.md の
51ddae0ad1ff641310fdd4edb22f369385d0f45b を基準に配備を準備した。現在の稼働版は上記配備記録を参照。
既存の未コミット変更は保持している。配備時は本番基準と新しいバックアップ契約を改めて照合する。
架空データで画面を開く
venv/Scripts/python.exe -m tools.monthly_library_browser_fixture
http://127.0.0.1:8895/plans/monthly-library で1歳児・2026年10月を選ぶ。
実装画面をメモリー内の架空DBへ接続する検証環境で、通常のアプリ起動とは別。
7〜9月に架空履歴があり、園児2は8月の個人記録がない。終了はCtrl+C。
確認用文例は0〜5歳・1〜12月の検索対象の全欄に各2件以上を用意している。
本文の「【架空例】」と出典の fictional/monthly-preview.xls は操作確認用を示す。
行事欄は直接入力。AI提案は既定では未接続で、明示的なOllama設定がある場合のみ利用できる。
キーワードに一致しない場合は0件となる。
当初は単体テスト用の10件のみを使い、多くの欄で候補が出なかったため、
画面確認用データを tools/monthly_library_preview_data.py に分けて補った。
補充後は test_monthly_library_preview.py と既存の月案テスト計14件が成功。
年齢・月・対象欄の網羅、キーワードの一致・不一致、出典付き保存、再投入時の重複防止を確認した。