コンテンツにスキップ

月案ライブラリの本体実装

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件が成功。 年齢・月・対象欄の網羅、キーワードの一致・不一致、出典付き保存、再投入時の重複防止を確認した。