Re:Note@home 現行仕様(2026-05時点)

このドキュメントは、現在の実装に合わせて更新した運用仕様です。過去の 仕様.MD を置き換える目的で作成しています。

目次

1. ルート構成(現行 + 未実装計画)

renote/                                        # リポジトリルート
├─ public_html/                               # Web公開ルート(実装済)
│  ├─ index.php                               # ログイン画面
│  ├─ about.php                               # サービス紹介ページ(公開)
│  ├─ child_dashboard.php                     # 子どもダッシュボード
│  ├─ child_challenge.php                     # 出題・回答(DB Mode)
│  ├─ practice.php                            # 出題・回答(Legacy Mode)
│  ├─ log_view.php                            # 子ども用ログ閲覧(Legacy/共通)
│  ├─ child_log_view.php                      # 子ども用ログ閲覧(DB Modeラッパー)
│  ├─ parent_log_view.php                     # 保護者/管理者ログ閲覧
│  ├─ guardian_question_settings.php          # 出題条件設定(DB Mode)
│  ├─ guardian_learning_plan.php              # 指導計画ボード
│  ├─ admin_dashboard.php                     # 管理者ダッシュボード
│  ├─ admin_problem_intake.php                # 管理者問題投入(検査→登録)
│  ├─ admin_standard_problem_list.php         # 標準問題一覧(検索/昇格)
│  ├─ admin_tuning_review.php                 # 単元チューニングレビュー
│  ├─ img.php                                 # 非公開データ配信(qimg/abg/img)
│  ├─ api/db/                                 # DBモードAPI群
│  ├─ config/                                 # 共通設定・初期化
│  ├─ assets/                                 # 共通CSS/共通部品
│  ├─ lib/                                    # 共通ロジック(AI一次判定キュー等)
│  ├─ images/                                 # 画像アセット(公開用)
│  └─ specification.html                      # 本仕様書(HTML版)
├─ dev/                                       # 開発用ツール(非公開、実装済)
├─ private(_stg)/                           # 非公開データ領域(環境に応じて切替)
├─ bin/                                       # 更新/反映/スナップショット用スクリプト
├─ tools/                                     # DB初期化・seed投入・運用補助
└─ problem_assets/                            # 問題画像専用領域(未実装・導入予定)

※ 未実装項目:
  - problem_assets/ への問題画像移設
  - 問題画像キー3分離(question/base/model)のDB正式化

2. config / api / assets / dev / lib / images の主要ファイル一覧

このセクションは「現行実装で利用中の主要ファイル」を対象に記載します。導入予定のみの項目は明示的に(未実装)と記載します。

2-0. ファイル変更時の主な影響範囲

ファイル/ディレクトリ主目的変更時の影響範囲
config/bootstrap.php共通初期化全画面(ログイン後/前を含む)
config/config.phpPRIVATE_DIR と各種設定ロードデータ保存先全体、STG表示、ユーザー読込
config/users_sqlite.phpユーザーDBアクセスログイン、ユーザー一覧、親子管理
config/mariadb.phpMariaDB接続ヘルパーDBモードAPI・移行スクリプト
api/db/status.phpDBモード確認APISTGでのMariaDB接続確認・件数確認
assets/style.css全体スタイル全画面のレイアウト/視認性
dev/build_child_graph_data.php学習グラフ集計JSON生成child_dashboard / parent_log_view のグラフ表示整合

2-1. config

config/                         # 設定・初期化のルート
├─ bootstrap.php               # 共通初期化処理
├─ config.php                  # PRIVATE_DIR決定/ユーザー・教科ロード
├─ mariadb.php                 # MariaDB接続ヘルパー
├─ session.php                 # セッション管理
└─ settings/                   # 設定分割ファイル群
   ├─ auth.php                 # 認証関連設定
   ├─ base_display.php         # ロゴ/STG表示/LINE関連パス設定
   └─ paths.php                # DB・ログ等のパス生成定義

2-2. api/db

api/                            # DBモード確認API
└─ db/
   ├─ curriculum_catalog_service.php        # 標準カリキュラム取得サービス
   ├─ guardian_question_settings_preview.php # 出題設定プレビューAPI
   ├─ guardian_question_settings_save.php    # 出題設定保存API
   ├─ guardian_question_settings_service.php # 出題設定共通サービス
   ├─ problem_bank_promotion_service.php    # 問題昇格サービス
   ├─ problem_queue_service.php             # AIキュー補助サービス
   ├─ problems_preview.php     # 取込済み問題のプレビューJSON
   └─ status.php               # MariaDB接続・件数確認JSON

2-3. assets

assets/                         # 共通アセット
├─ child_footer.php            # 子画面共通フッター
├─ child_header.php            # 子画面共通ヘッダー
├─ parent_footer.php           # 親画面共通フッター
├─ parent_header.php           # 親画面共通ヘッダー
└─ style.css                   # 全体共通スタイル

2-4. dev

dev/ はリポジトリ直下(public_html の1つ上)に配置し、Web直アクセスさせません。必要なWeb導線(ユーザー切替/セッション破棄)のみ public_html/dev/ に薄いラッパーを置きます。

dev/                            # 開発/デバッグ補助(非公開)
├─ .htaccess                    # 開発ディレクトリ保護
├─ ai_tuning/run_tuning_loop.php # 単元別チューニング自動反復
├─ build_child_graph_data.php  # 学習ログJSONを集計し graph_stats.json を生成
├─ UI仕様.html                 # UI仕様メモ
├─ kill_session.php            # セッション破棄用ツール
├─ migrate_users_to_sqlite.php # users.json→SQLite移行
├─ run_ai_first_review_queue.php # AI一次判定キュー処理(cronから実行)
├─ lib/ai_first_review_worker.php # 非公開ワーカー本体(一次判定実行)
├─ show_stgmode.php            # STG表示補助
└─ stg_switch_user.php         # STG検証用ユーザー切替

(補足)
- dev/phpmyadmin_local/         # ローカルDB確認用の同梱ツリー(運用では非公開)
- public_html/dev/*.php         # Web導線ラッパー(実体は ../dev/*.php を読み込む)

2-6. lib

lib/                            # 共通ロジック
├─ ai_first_review.php         # 互換シム(queue専用ライブラリへの委譲)
└─ ai_first_review_queue.php   # 公開側で使うAI一次判定キュー投入/結果反映処理

2-5. images(主要ファイル)

images/                         # 画像アセット
├─ flow_of_study.png           # サービス導線イメージ
├─ introduction_1.png          # 紹介ページ用画像
├─ logotype.svg                # 通常環境ロゴ(タイプ)
├─ logotype_stg.png            # STG環境ロゴ(PNG)
├─ logotype_stg.svg            # STG環境ロゴ(SVG)
├─ mainlogo.svg                # 通常環境メインロゴ
├─ newIcon.png                 # 新着/更新系アイコン
├─ ok1Icon.png                 # 初回OKアイコン
├─ ok2Icon.png                 # 修正OKアイコン
├─ notlogedin.png              # 未ログイン表示画像(PNG)
├─ notlogedin.svg              # 未ログイン表示画像(SVG)
├─ okIcon.png                  # 汎用OKアイコン
└─ waitIcon.png                # 待機アイコン

3. データ保存の実体(PRIVATE_DIR 配下)

ユーザーや問題・ログの実体は、Webルート配下ではなく PRIVATE_DIR に保存します。
config/config.php が起動時に保存先を決定し、通常環境と STG 環境を切り替えます。

ここで示す構成は現行運用(実装済)です。問題画像専用領域 problem_assets/ への移設は次期改修(未実装)です。

{PRIVATE_DIR}/                              # 非公開データルート
├─ users.json                               # 旧ユーザーマスタ(移行元として保持)
├─ users_prod.sqlite                        # 本番環境ユーザーマスタ(SQLite)
├─ users_test.sqlite                        # STG/テスト環境ユーザーマスタ(SQLite)
├─ key/                                     # 秘密情報ファイル
│  ├─ encryption_key.txt                    # ID/氏名復号の共通キー
│  ├─ line_channel_token.txt                # LINE Messaging APIアクセストークン
│  ├─ line_user_id.txt                      # LINE送信先ユーザーID
│  └─ mariadb_credentials.php               # MariaDB接続情報(wsl / xserver_stg / prod)
├─ parent/{parent_dir_uuid}/                # 保護者単位データ
│  ├─ subjects.json                         # 教科定義
│  ├─ {subject}.db                          # 親用問題DB
│  └─ {subject}_settings.txt                # 親用教科設定
├─ child/{child_dir_uuid}/                  # 子ども単位データ
│  ├─ {subject}.db                          # 子用問題DB(必要に応じて)
│  ├─ {subject}_settings.txt                # 子用教科設定
│  ├─ graph_stats.json                      # child_dashboard グラフ表示用の集計JSON
│  └─ logs/                                 # 学習ログルート
│     ├─ {subject}/                         # 教科別ログ
│     │  ├─ {timestamp}_{subject}_{tryNo}.json  # 回答ログ本体
│     │  └─ img/{timestamp}_{subject}_{tryNo}_q{n}.(jpg|png|gif|webp) # 回答画像
│     └─ _pending/{session_id}/             # 回答中断時の一時退避
│        └─ q{n}.(jpg|png|gif|webp)         # 一時退避画像
├─ queue/ai_first_review/                   # AI一次判定ジョブキュー
│  ├─ in/                                   # 未処理ジョブ
│  ├─ processing/                           # 処理中ジョブ
│  ├─ done/                                 # 処理済みジョブ
│  └─ failed/                               # 失敗ジョブ(再実行対象)
└─ _pending/{session_id}/                   # 修正提出中断時の一時退避
   └─ rev_{lineNo}.(jpg|png|gif|webp)       # 修正回答の一時退避画像

補足(key 配下): line_channel_token.txt / line_user_id.txt は現行コードで使用中です。
practice.php の回答保存時サマリー送信、および log_view.php の修正提出通知送信で読み込まれます。
mariadb_credentials.php は DBモードの接続先を環境別に切り替えるために使います。

4. JSONファイル仕様(現行で扱う全JSON)

4-1. usersデータ(SQLite + 互換users.json)

ログイン可能ユーザーのマスタ。トップレベルは admins / parents / children の配列。

区分キー型必須説明
共通id_encstring必須暗号化済みログインID
共通name_encstring必須暗号化済み表示名
共通password_hashstring必須password_hash() 形式
共通disabledbool任意true のユーザーは読み込み対象外
parentsdir_uuidstring必須parent/{dir_uuid} の対応先
parentsmaxchildrennumber任意子アカウント上限(未設定時 0 扱い)
parentsemailstring任意保護者通知先メールアドレス
parentschild_labelstring任意子ども画面向けの保護者呼称
childrenparent_id_encstring必須親ログインID(暗号化)
childrendir_uuidstring必須child/{dir_uuid} の対応先
childrenenabled_subjectsstring[]任意有効教科キー配列(未設定時 空配列)
childrenline_channel_tokenstring任意子どもごとのLINEチャネルアクセストークン
childrenline_user_idstring任意子どもごとのLINE通知先ユーザID

4-2. subjects.json({PRIVATE_DIR}/parent/{parent_dir_uuid}/subjects.json)

親ごとの教科定義。トップレベルは教科キー(例: english)の連想配列。

キー型必須説明
labelstring任意画面表示名(例: 英語)
titlestring任意ページタイトル
hint_headingstring任意補助見出し
answer_modesobject任意Legacy回答UIの有効設定。text(テキストエリア)、image_upload(画像添付)、handwriting(手書き回答)をbooleanで保持し、未設定項目は互換性のため有効として扱う
enabledbool任意false の教科は読み込み時に除外

4-3. 学習ログJSON({PRIVATE_DIR}/child/{child_dir_uuid}/logs/{subject}/*.json)

practice.php / child_challenge.php が作成し、log_view.php が修正提出時に同じJSONを更新します。practice.php / child_challenge.php と log_view.php では、子ども向け画面上で「{保護者呼称}へのメッセージ」(未設定時は「保護者」)として入力したコメントを child_comment に保存し、parent_log_view.php で参照できます。

キー型説明
user_idstring子ログインID
user_namestring子表示名
subjectstring教科キー
subject_labelstring教科表示名
subject_titlestring教科タイトル
start_no / ratio / count / try_nonumber出題条件
datetime / shown_at / submitted_atstring日時(Y-m-d H:i:s)
intro_messagestring導入メッセージ
child_commentstring子どもが入力したコメント(任意)
child_comment_atstring子どもコメント保存日時(Y-m-d H:i:s)
ai_first_reviewobjectAI一次判定結果(status/model/scored_at/summary/items を保持)
questionsarray問題ごとの回答ログ配列
revised_atstring修正提出があった場合のみ追加
parent_summarystring保護者の総評コメント(保存時に上書き)
review_okbool「修正不要」チェック状態
ok_count_first / ok_count_revisednumber保護者がOK判定した問題数(初回採点/修正後採点、同一問題の二重計上なし)
parent_comment_atstring保護者コメント保存日時(Y-m-d H:i:s)

questions[] の各要素:

キー型説明
indexnumber表示順(1始まり)
line_nonumber問題DB行番号
questionstring表示問題文
answerstring初回回答
col0 / col1stringDB先頭列の退避
is_ja_qnumber(0/1)和文→英文問題かどうか
question_image_urlstring問題画像URL(DB/snapshot問題で設定される場合)
answer_overlay_urlstring図形問題向けのオーバーレイURL(運用上は下敷き用途と混在するため注意)
image_overlay_filestring子どもの初回回答レイヤ(透過PNG)
revised_answerstring修正回答がある場合
revised_image_overlay_filestring子どもの再回答レイヤ(透過PNG)
(補足) 現行の画像保持-現行実装では問題側キーは question_image_url / answer_overlay_url の2系統です。子ども回答側は image_overlay_file / revised_image_overlay_file の2系統で保持します。
parent_commentstring保護者コメント
parent_okbool保護者のOK判定
parent_ok_stagestring(first/revised)OK判定時点(初回回答/修正回答)

4-4. グラフ集計JSON({PRIVATE_DIR}/child/{child_dir_uuid}/graph_stats.json)

child_dashboard.php のグラフ描画で使用する集計済みJSONです。dev/build_child_graph_data.php で、既存の回答ログJSONから再生成します。parent_log_view.php で保護者が採点保存(コメント保存)またはログ削除した際は、対象の子どもIDに対して同スクリプトを自動実行し、graph_stats.json を即時更新します。

dev/build_child_graph_data.php の集計時は、まず questions[].parent_ok + parent_ok_stage を優先使用します。ok_count_first / ok_count_revised は補助値として扱い、parent_ok_stage が存在しない旧ログ形式でのみ使用します(初回/修正後の二重計上を防ぐため)。さらに旧形式(点数情報なし)では questions[].parent_comment から次のルールで復元します:
「ok を含む1行コメント」= 初回正答、 「ok を含み2行以上のコメント」= 修正後正答、 それ以外 = 誤答。

キー型説明
versionnumberフォーマットバージョン(現行: 1)
generated_atstring生成日時(Y-m-d H:i:s)
recordsarray回答ログ単位の集計行
summaryobject全教科/教科別の平均正答率サマリー

records[] の各要素:

キー型説明
subjectstring教科キー
answered_atstring回答日時(Y-m-d H:i:s)
question_countnumberその回の問題数
ok_firstnumber初回回答でOKになった問題数
ok_revisednumber修正後回答でOKになった問題数
is_scoredboolその回答ログが保護者採点済みかどうか

運用目安:graph_stats.json は「表示用に1ファイルをそのまま読む」用途では実装が単純で扱いやすいですが、レコードが 1,000 件超で今後も増加し、かつ更新頻度が上がる場合は SQLite などのRDBへの格納を検討します。判断基準は次の通りです。

本プロジェクトでは、まず graph_stats.json を一次生成物として維持しつつ、必要になった段階で「集計元をSQLite化し、表示用JSONをキャッシュとして生成する」段階移行を推奨します。

5. ユーザー/認証仕様

5-2. 学習記録グラフの表示内容

5-3. 紹介ページ(about.php)

5-1. SQLiteテーブル定義(users_prod.sqlite / users_test.sqlite)

config/users_sqlite.php の app_init_users_tables() で、環境に応じたテーブル名で同一スキーマを作成します。

論理テーブル本番テーブル名STGテーブル名用途
adminsprod_adminstest_admins管理者アカウント
parentsprod_parentstest_parents保護者アカウント
childrenprod_childrentest_children子どもアカウント

admins(prod_admins / test_admins)

カラム型制約/既定値説明
id_encTEXTPRIMARY KEY暗号化済みログインID
name_encTEXTNOT NULL DEFAULT ''暗号化済み表示名
password_hashTEXTNOT NULL DEFAULT ''パスワードハッシュ
disabledINTEGERNOT NULL DEFAULT 0無効フラグ(0/1)

parents(prod_parents / test_parents)

カラム型制約/既定値説明
id_encTEXTPRIMARY KEY暗号化済みログインID
name_encTEXTNOT NULL DEFAULT ''暗号化済み表示名
password_hashTEXTNOT NULL DEFAULT ''パスワードハッシュ
dir_uuidTEXTNOT NULL DEFAULT ''保護者データディレクトリUUID
maxchildrenINTEGERNOT NULL DEFAULT 0作成可能な子アカウント上限
disabledINTEGERNOT NULL DEFAULT 0無効フラグ(0/1)

children(prod_children / test_children)

カラム型制約/既定値説明
id_encTEXTPRIMARY KEY暗号化済みログインID
name_encTEXTNOT NULL DEFAULT ''暗号化済み表示名
parent_id_encTEXTNOT NULL DEFAULT ''紐づく保護者の暗号化ID
password_hashTEXTNOT NULL DEFAULT ''パスワードハッシュ
dir_uuidTEXTNOT NULL DEFAULT ''子どもデータディレクトリUUID
enabled_subjects_jsonTEXTNOT NULL DEFAULT '[]'有効教科一覧のJSON配列
disabledINTEGERNOT NULL DEFAULT 0無効フラグ(0/1)
deletedINTEGERNOT NULL DEFAULT 0削除フラグ(0/1)
deleted_atTEXTNOT NULL DEFAULT ''削除日時(Y-m-d H:i:s)

6. 教科と出題設定

6-1. 教科別 Section / Unit / Tags 設計(案)

各教科とも、section を大分類、unit を学習目標、tags を出題形式・条件として扱います。

本番で使う標準教科/section/unit/tagsの実体一覧は docs/standard_curriculum_catalog_spec.md を保守用正本とし、docs/standard_curriculum_catalog_spec.html は閲覧用の派生ドキュメントとして扱います。本節は基本方針の要約として維持します。

英語

sectionunit(例)tags(例)
be動詞肯定文 / 否定文 / 疑問文form_sentence, form_passage, eiken_5〜eiken_3
一般動詞肯定文 / 否定文 / 疑問文form_sentence, verb_regular, verb_irregular
前置詞場所 / 時間 / 方向form_sentence, preposition_place, preposition_time
関係代名詞主格 / 目的格 / 所有格form_sentence, form_passage, grammar_relative_pronoun
単語英検5級 / 4級 / 3級form_word, noun_countable, noun_uncountable, adjective

数学

sectionunit(例)tags(例)
数と式正負の計算 / 文字式 / 一次方程式form_formula, calc_add_sub, word_problem, grade_7
式の変形展開 / 因数分解form_formula, expansion_basic, factor_trinomial, grade_8〜grade_9
関数比例・反比例 / 一次関数 / 二次関数form_graph, graph_read, slope, vertex
図形平面図形 / 相似 / 三平方form_diagram, proof, geometry_numeric, geometry_overlay
資料の活用代表値 / 確率form_table, mean_median_mode, probability_basic

理科

sectionunit(例)tags(例)
物理力と運動 / 電流と回路 / 光・音・圧力calc, graph_read, experiment, ohm_law
化学物質の性質 / 化学変化 / 酸・アルカリとイオンconcept, equation, ion, neutralization
生物植物 / 動物 / 細胞・遺伝diagram, classification, term_fill
地学天気 / 地層・地震・火山 / 天体chart_read, observation, concept

国語

sectionunit(例)tags(例)
漢字・語句漢字の読み / 漢字の書き / 語彙・慣用句form_word, kanji_reading, kanji_writing, idiom
文法品詞 / 文節・文の成分 / 敬語grammar, sentence_structure, honorific
読解説明文読解 / 物語文読解form_passage, main_idea, character_feeling
古典古文の基礎 / 漢文の基礎classical, kanbun, reading
表現作文・記述writing, opinion, structure

社会

sectionunit(例)tags(例)
地理世界の地域 / 日本の地域 / 地図・統計資料map, climate, data_read, graph
歴史古代〜中世 / 近世〜近代 / 現代史timeline, person, cause_effect, world_relation
公民政治 / 経済 / 国際社会constitution, market, tax, human_rights

全教科共通 tags(横断)

カテゴリtags(例)
出題形式form_word, form_sentence, form_passage, form_formula, form_graph, form_table, form_diagram
難易度diff_1〜diff_5
学年grade_7, grade_8, grade_9
テスト種別regular_test, comprehensive_test, entrance_exam_prep

全教科の拡充作業を外部LLM(ChatGPT)へ依頼した際の旧テンプレートは docs/archive/chatgpt_curriculum_catalog_request.md に退避しています。現在は履歴資料として扱います。

6-2. 回答通知(LINE / メール)

practice.php の回答保存時、通知は次の順で送信されます。

7. users.json から SQLite への移行

7-2. MariaDB 初期スキーマとシード

8. STG_MODE の扱い

9. 設計制約(変更時のガードレール)

本仕様書は運用しながら更新する前提です。実装と差異が出た場合は、差異解消を優先して更新してください。