操作
機能 #317
完了ノーツレーダー細分化: CHARGE/LN サブ軸の新設と BSS の LN 再分類
機能 #317:
ノーツレーダー細分化: CHARGE/LN サブ軸の新設と BSS の LN 再分類
説明
目的¶
#313 タクソノミーに CHARGE/LN のサブ軸が未定義(§4 に CHARGE 節がない)だったため、LN/CHARGE サブ軸を新設し、BSS を SCRATCH から LN 親へ再分類する。#293(弱点分析)のドリルダウンで LN 系の弱点を表現できるようにする。
親設計: #313。前提: #314(Phase 1 raw)/ #315(Phase 2 raw)/ #316(本体 0–200 正規化・anchor 較正)の縦串・正規化基盤。
方針確認(ユーザー指示): BSS は リネームせず再分類のみ(物理キー
scratch_bssは維持)。LN サブ軸はln_density/ln_overlap/ln_max_simultaneousの3軸(CN/HCN 分離は今回見送り)。
スコープ¶
1. 設計拡張(#313 文書更新)¶
-
docs/notes-radar-subdivision-design.mdに §4.8 CHARGE/LN 節を追加し、下記サブ軸を定義。 -
BSS の所属を明記: 物理キーは
scratch_bssのまま(破壊的変更回避)だが、論理カテゴリは LN 親としてドリルダウンにぶら下げる(リネームしない)。
2. 新設 LN/CHARGE サブ軸(3軸)¶
| axis_key | 定義 | raw 入力(既存流用) |
|---|---|---|
ln_density |
保持密度=LN総保持秒/曲長 |
longNoteSecondsTotal(raw: feature_ln_seconds_total) |
ln_overlap |
LN中の同時押し=他レーンLN保持中の打鍵(擬似/ロック処理) |
chargeNotesDuringLongNote(raw: feature_charge_notes_during_ln) |
ln_max_simultaneous |
最大同時LN保持数 |
maxSimultaneousLongNotes(raw: feature_max_simultaneous_ln) |
raw 入力は #314 で既に算出・伝送済みなので、主作業は「正規化サブ軸としての露出+anchor 較正」。
3. 実装(#315/#316 と同型の縦串)¶
-
NotesRadarFeature末尾に 3 コンポーネント追加(後方互換:既存不変)。 -
NotesRadarCalculator.calculate: 既存 metrics を流用し #316 同様にradarFromAnchors(... / durationSeconds, *_SCORE_ANCHORS, SUBAXIS_RADAR_ANCHORS)で 0–200 化。 -
SongDataDto/SongDataResultSetHandler/SQLiteSongDatabaseAccessor(SONG_COLUMNS / FEATURE_COLUMNS_SQL / Table 自動ALTER)/IRChartDataにfeature_ln_density/feature_ln_overlap/feature_ln_max_simultaneousを追加。 - anchor 数値は #316 同様、実データ分布(分位点)から較正(暫定線形 → 実データ後確定)。
4. BSS 再分類¶
- コード上の
scratch_bss(カラム/IRキー/server EAV)は 不変。 - タクソノミー文書と #293 接続側でのカテゴリ所属を LN 親へ(必要に応じて両記でなく LN 主所属)。
5. テスト¶
- 各サブ軸の anchor 区間境界(直下/直上)・単調性・0/200 クランプ、既存6軸・既存 raw の不変(回帰)。EMPTY ゼロ・DTO round-trip・旧スキーマ0デフォルト・IR キー数。
バックフィル¶
- #145 同方式:全曲更新(
gradlew updateAllSongs)で再計算し、新カラムを埋める(自動 ALTER で旧 DB も列追加)。
関連¶
エージェント ちゃん さんが16日前に更新
- 期日 を 2026/06/25 にセット
- 開始日 を 2026/06/20 から 2026/06/25 に変更
- 次のチケットに後続 機能 #316: ノーツレーダー細分化 Phase 3: B分類パターン軸の 0–200 anchor 実データ較正と本体正規化 を追加
エージェント ちゃん さんが16日前に更新
- ステータス を 未着手 から 実装中 に変更
- 進捗率 を 0 から 10 に変更
実装に着手しました。
- ブランチ:
feature/317 - 対応方針: 既存 raw(
feature_ln_seconds_total/feature_charge_notes_during_ln/feature_max_simultaneous_ln)を流用し、CHARGE 親配下に LN サブ軸3軸(ln_density/ln_overlap/ln_max_simultaneous)を #316 と同型の縦串で 0–200 正規化露出。anchor はローカル実譜面52,449件の分布から #316 と同手法で較正済み。BSS は物理キーscratch_bss不変・論理カテゴリのみ LN 親へ再分類(文書・#293 接続側)。
エージェント ちゃん さんが16日前に更新
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 10 から 100 に変更
対応が完了しました。
概要¶
CHARGE 親軸配下に LN サブ軸3軸(ln_density / ln_overlap / ln_max_simultaneous)を新設し、#314 算出済みの既存 raw を流用して 0–200 正規化サブ軸として露出。BSS は物理キー不変のまま論理カテゴリのみ LN 親へ再分類。#316 と同型の縦串で strictly additive(既存6主軸・25サブ軸は不変)。
変更点¶
- 新設サブ軸3軸(全て A=既存raw流用の正規化露出、新規走査なし):
ln_density(feature_ln_seconds_total÷dur)/ln_overlap(feature_charge_notes_during_ln÷dur)/ln_max_simultaneous(feature_max_simultaneous_lnraw)。 - 正規化サブ軸の DB列/IRキーは raw と別名の clean axis_key(
feature_ln_density他、_radarサフィックス無し)。NotesRadarFeature81→84 component、IRfeature_*キー 81→84。 - anchor は #316 と同手法で実譜面52,449件から較正(
scripts/analyze_notes_radar_lnclass.py)。raw も併送。 - BSS 再分類: 物理キー
scratch_bss(DB列・IRキー・server EAV)不変、論理カテゴリのみ LN 親へ(文書・#293 接続側のみ、コード変更なし)。 - 設計doc §4.8 / §4.5 BSS注記 / §8' #317較正 を追記。
- 変更ファイル: 本体6(
NotesRadarFeature/NotesRadarCalculator/SongDataDto/SongDataResultSetHandler/SQLiteSongDatabaseAccessor/IRChartData)+ テスト3 + 設計doc + 較正スクリプト = 11件。
テスト¶
-
xvfb-run -a ./gradlew test: 成功(1062 tests, 0 failed, 8 skipped)
関連 MR¶
- !72 (feature/317 → develop) マージ済み
残課顔 / 補足¶
- 本番適用時は #145 同方式の全曲更新(
gradlew updateAllSongs)で新列をバックフィル(自動 ALTER で旧 DB も列追加)。 - server 側 EAV 展開・集計・#293 パネル描画は本チケット範囲外(#293 側)。
操作