TODO管理機能の実装 #17

Open
opened 2026-04-09 00:09:23 +00:00 by akira · 4 comments
Owner

現在の状態(なぜOpenか)

繁忙期に作業が積み重なり、優先順位が管理できていない。

次にすること(Next Action)

仕様確定後、データモデル設計とバックエンド実装から開始する。

ブロック要因

なし


概要

RedmineチケットライクなTODO管理機能を実装する。圃場・作物・品種を作業対象に紐づけ、既存の施肥計画・田植え計画と連携する。

背景・目的

繁忙期に作業が積み重なると「どれから手を付けるか分からない」問題が発生する。優先順位をドラッグ&ドロップで管理できるTODOシステムで解決する。

完了条件

  • TODOの作成・編集・削除ができる
  • ステータス管理(未着手→進行中→完了/キャンセル)が動作する
  • ドラッグ&ドロップで優先順位を変更できる
  • 作業対象(圃場・作物・品種)をM:Nで紐づけできる
  • 施肥計画・田植え計画とM:Nで紐づけできる
  • 完了時に実績レコードを生成できる(施肥実績など)
  • 完了/キャンセル済みはフィルターで表示切り替え

関連

施肥計画(FertilizationPlan)、田植え計画、将来:農薬散布記録


機能要件詳細

TODOアイテムのフィールド

フィールド 必須 備考
タイトル string
説明 text
ステータス enum 未着手 / 進行中 / 完了 / キャンセル
優先順位 integer ドラッグ&ドロップで変更。数値が小さいほど上位
期日 date 任意入力
作業種別 enum 施肥 / 田植え / 防除 / その他(将来拡張)
栽培記録に反映 boolean 完了時に実績を生成するかのフラグ

作業対象(M:N、すべて任意)

  • 圃場(Field)
  • 圃場グループ(FieldGroup ★要確認)
  • 作物(Crop)
  • 品種(Variety)

計画との連携(M:N)

  • 1計画 → 複数TODO(例:複数日に分けて実施)
  • 1TODO → 複数実績(例:複数圃場を同一TODOで作業)
  • 紐づけ経路:計画側からTODOを生成、またはTODO作成時に計画を手動で紐づけ(両方対応)

UI要件

一覧画面

  • デフォルト表示:優先順位順(未着手・進行中のみ)
  • ドラッグ&ドロップ:表示順(優先順位)を変更できる
  • フィルター:完了・キャンセル済みを表示/非表示で切り替え
  • 期日が近い/過ぎているものは視覚的に強調

詳細画面

  • 各フィールドの編集
  • 作業対象の追加・削除
  • 紐づく計画の参照・追加・削除
  • ステータス変更ボタン

技術要件

  • Backend: Django新アプリ apps/todos/
  • Frontend: frontend/src/app/todos/
  • API: REST /api/todos/
  • ドラッグ&ドロップ後の順序保存は PATCH /api/todos/reorder/ で一括更新

未確定事項(仕様確定が必要)

  • 圃場グループモデルは既存?新規追加?
  • 作業種別の初期選択肢を確定する(施肥・田植え・防除・その他?)
  • 完了時の実績生成ロジックの詳細(施肥計画 → 施肥実績の自動生成フロー)
  • 農薬散布記録は将来実装として今回のスコープ外か確認

スコープ外

  • 期日通知・リマインダー
  • 複数ユーザー割り当て
  • コメント・添付ファイル
## 現在の状態(なぜOpenか) 繁忙期に作業が積み重なり、優先順位が管理できていない。 ## 次にすること(Next Action) 仕様確定後、データモデル設計とバックエンド実装から開始する。 ## ブロック要因 なし --- ## 概要 RedmineチケットライクなTODO管理機能を実装する。圃場・作物・品種を作業対象に紐づけ、既存の施肥計画・田植え計画と連携する。 ## 背景・目的 繁忙期に作業が積み重なると「どれから手を付けるか分からない」問題が発生する。優先順位をドラッグ&ドロップで管理できるTODOシステムで解決する。 ## 完了条件 - [ ] TODOの作成・編集・削除ができる - [ ] ステータス管理(未着手→進行中→完了/キャンセル)が動作する - [ ] ドラッグ&ドロップで優先順位を変更できる - [ ] 作業対象(圃場・作物・品種)をM:Nで紐づけできる - [ ] 施肥計画・田植え計画とM:Nで紐づけできる - [ ] 完了時に実績レコードを生成できる(施肥実績など) - [ ] 完了/キャンセル済みはフィルターで表示切り替え ## 関連 施肥計画(FertilizationPlan)、田植え計画、将来:農薬散布記録 --- ### 機能要件詳細 #### TODOアイテムのフィールド | フィールド | 型 | 必須 | 備考 | |---|---|---|---| | タイトル | string | ✓ | | | 説明 | text | | | | ステータス | enum | ✓ | 未着手 / 進行中 / 完了 / キャンセル | | 優先順位 | integer | ✓ | ドラッグ&ドロップで変更。数値が小さいほど上位 | | 期日 | date | | 任意入力 | | 作業種別 | enum | | 施肥 / 田植え / 防除 / その他(将来拡張) | | 栽培記録に反映 | boolean | | 完了時に実績を生成するかのフラグ | #### 作業対象(M:N、すべて任意) - 圃場(Field) - 圃場グループ(FieldGroup ★要確認) - 作物(Crop) - 品種(Variety) #### 計画との連携(M:N) - 1計画 → 複数TODO(例:複数日に分けて実施) - 1TODO → 複数実績(例:複数圃場を同一TODOで作業) - 紐づけ経路:計画側からTODOを生成、またはTODO作成時に計画を手動で紐づけ(両方対応) #### UI要件 **一覧画面** - デフォルト表示:優先順位順(未着手・進行中のみ) - ドラッグ&ドロップ:表示順(優先順位)を変更できる - フィルター:完了・キャンセル済みを表示/非表示で切り替え - 期日が近い/過ぎているものは視覚的に強調 **詳細画面** - 各フィールドの編集 - 作業対象の追加・削除 - 紐づく計画の参照・追加・削除 - ステータス変更ボタン #### 技術要件 - Backend: Django新アプリ `apps/todos/` - Frontend: `frontend/src/app/todos/` - API: REST `/api/todos/` - ドラッグ&ドロップ後の順序保存は PATCH `/api/todos/reorder/` で一括更新 #### 未確定事項(仕様確定が必要) - [ ] 圃場グループモデルは既存?新規追加? - [ ] 作業種別の初期選択肢を確定する(施肥・田植え・防除・その他?) - [ ] 完了時の実績生成ロジックの詳細(施肥計画 → 施肥実績の自動生成フロー) - [ ] 農薬散布記録は将来実装として今回のスコープ外か確認 #### スコープ外 - 期日通知・リマインダー - 複数ユーザー割り当て - コメント・添付ファイル
Collaborator

仕様化前の確認事項への回答を記録します。

質問と回答

  1. 圃場グループは独立モデルにするか
    回答: 独立modelである必要はないと思います。

  2. 作業対象と計画リンクを分けるか
    回答: 基本的に圃場が対象になる計画には、圃場が含まれていますのでそのケース自体存在しないと思います。計画の中の一部の圃場だけがTODOの対象になる事はあります。

  3. 実績系の無い作業種別をどう扱うか
    回答: 田植え実績の受け皿はこれから作ります。実績系の無いものはこうやって作っていく事になると思います。ただし、計画に紐づかないTODOがあるのと同じく、実績系のアプリに紐づかないTODOもあり得ます。

  4. 施肥TODO完了時の実績生成をどう考えるか
    回答: 施肥TODOという概念を組み込むのであれば、施肥計画->施肥実績にするフローを、施肥計画->施肥TODO->施肥実績にするフローになりえるという方向で考えるのが良いと思います。他の件も同じです。作付け計画以外のすべての計画も、間にTODOを入れられるようにしたいです。

  5. 田植えTODO完了時の扱い
    回答: 田植え TODO の完了時は、田植え実績(あとで実装します)です。

  6. 作業種別 enum の方針
    回答: すべての計画と、計画に紐づいていない、実績がenumの対象になるようにしたいです。それとそのどれにも当てはまらない、「一般」。

  7. 並び順の仕様
    回答: 並び順は優先度を内部に持たせて、基本はFILOですが、ドラッグ操作で順番入れ替えられるようにしたいです。無理なら矢印ボタンで移動出来るように。

  8. 計画からTODO生成の導線は MVP で必要か
    回答: 「計画から TODO を生成する」導線は MVP で必要です。

ここまでで確定した理解メモ

  • 圃場グループは当面独立モデル化しない前提。
  • TODOは計画の一部圃場だけを対象にできる必要がある。
  • TODOは「計画あり/なし」両方あり得て、さらに「実績アプリあり/なし」両方あり得る。
  • 施肥・田植えを含め、作付け計画以外の各計画は将来的に「計画 -> TODO -> 実績」の流れに挟める設計を目指す。
  • 作業種別は各計画種別、計画非紐づき実績系、どれにも当てはまらない一般を含む方針。
  • 並び順は内部優先度を持ち、基本はFILO、UIではドラッグ&ドロップを優先し、難しければ矢印移動を代替案とする。
  • MVPで計画側からTODOを生成する導線が必要。
仕様化前の確認事項への回答を記録します。 ## 質問と回答 1. 圃場グループは独立モデルにするか 回答: 独立modelである必要はないと思います。 2. 作業対象と計画リンクを分けるか 回答: 基本的に圃場が対象になる計画には、圃場が含まれていますのでそのケース自体存在しないと思います。計画の中の一部の圃場だけがTODOの対象になる事はあります。 3. 実績系の無い作業種別をどう扱うか 回答: 田植え実績の受け皿はこれから作ります。実績系の無いものはこうやって作っていく事になると思います。ただし、計画に紐づかないTODOがあるのと同じく、実績系のアプリに紐づかないTODOもあり得ます。 4. 施肥TODO完了時の実績生成をどう考えるか 回答: 施肥TODOという概念を組み込むのであれば、施肥計画->施肥実績にするフローを、施肥計画->施肥TODO->施肥実績にするフローになりえるという方向で考えるのが良いと思います。他の件も同じです。作付け計画以外のすべての計画も、間にTODOを入れられるようにしたいです。 5. 田植えTODO完了時の扱い 回答: 田植え TODO の完了時は、田植え実績(あとで実装します)です。 6. 作業種別 enum の方針 回答: すべての計画と、計画に紐づいていない、実績がenumの対象になるようにしたいです。それとそのどれにも当てはまらない、「一般」。 7. 並び順の仕様 回答: 並び順は優先度を内部に持たせて、基本はFILOですが、ドラッグ操作で順番入れ替えられるようにしたいです。無理なら矢印ボタンで移動出来るように。 8. 計画からTODO生成の導線は MVP で必要か 回答: 「計画から TODO を生成する」導線は MVP で必要です。 ## ここまでで確定した理解メモ - 圃場グループは当面独立モデル化しない前提。 - TODOは計画の一部圃場だけを対象にできる必要がある。 - TODOは「計画あり/なし」両方あり得て、さらに「実績アプリあり/なし」両方あり得る。 - 施肥・田植えを含め、作付け計画以外の各計画は将来的に「計画 -> TODO -> 実績」の流れに挟める設計を目指す。 - 作業種別は各計画種別、計画非紐づき実績系、どれにも当てはまらない一般を含む方針。 - 並び順は内部優先度を持ち、基本はFILO、UIではドラッグ&ドロップを優先し、難しければ矢印移動を代替案とする。 - MVPで計画側からTODOを生成する導線が必要。
Author
Owner
<html>

指摘事項

A. モデル定義の不整合

[7.1 Todo] year フィールドが欠落

  • セクション15でMVP決定案として「yearを持つ」と書いているのに、7.1のテーブルに列がない。決定事項であればモデル表に追加すべき。

[7.3 TodoCrop / TodoVariety] フィールド定義がない

  • 役割の説明しかなく、実際のカラム構成が不明。todo FK, crop FK, unique_together など最低限の定義が必要。

B. ロジックの曖昧さ

[7.1.2 並び順] FILO + priority の実装が未定義

  • 「新規作成時は最上位へ入る」+「priority 昇順で表示」を両立するには、既存レコードの priority を全件インクリメントするか、priority に小数・負数を許すか方針が必要。
  • 並び替え API の payload 例(10, 20, 30)も、中間挿入時のギャップ管理が不明。

[11. バリデーション] field_ids が計画外圃場を含む場合はエラー の条件が曖昧

  • 計画リンクなし TODO を作る場合は、どの「計画外」を参照してエラーにするのか。
  • 「plan_links がある場合のみ適用」と明示すべき。

C. 設計の一貫性

[7.4 TodoPlanLink] 畔塗リンクが「要検討」のままで work_type に含まれている

  • work_type の初期案には levee_work があるが、TodoPlanLink の対応先が 要検討
  • 「計画に対応しない work_type」として整理するか、計画が存在するなら FK を確定するか、どちらかに決める。

[8.3 作成 API] plan_id から具体的な FK への変換仕様がない

  • payload は {"plan_type": "fertilization", "plan_id": 8} だが、モデル側は FK が種別ごとに分かれている。Serializer でどう吸収するか方針を追記すべき。

D. 実装計画の漏れ

[12.1 Backend] admin.py と migration が省略

  • CLAUDE.md の標準パターンでは admin.py 登録と makemigrations/migrate が必須ステップ。実装順(12.3)にも含めると実装者がそのまま使える。

E. ドキュメント体裁

見出し階層の揺れ

  • ## 7. 配下のサブセクションが ## 7.1##)になっているが、親が ## なら子は ### が正しい。9〜12章も同様。

確認を推奨する事項

# | 事項 | 理由 -- | -- | -- 1 | done → todo への差し戻しを許可するか | completed_at のクリア/保持ポリシーが不明 2 | TodoTargetField.field の PROTECT は適切か | Field 削除時に TODO が削除できなくなる。想定ユーザーの運用上これでよいか確認 3 | reflect_to_record の命名 | フラグの意味が「完了時に実績連携する」なのに名前がやや遠回り。links_to_record 等を検討

全体的には実装に進める品質ですが、B(ロジックの曖昧さ) の2点は実装時にブレやすいので先に決定しておくことを推奨します。

</html>
<html> <body> <!--StartFragment--><h2 style="color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">指摘事項</h2><h3 style="color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">A. モデル定義の不整合</h3><p style="white-space: pre-wrap; margin-top: 0.1em; margin-bottom: 0.2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong>[7.1 Todo] <code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">year</code> フィールドが欠落</strong></p><ul style="padding-inline-start: 2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><li>セクション15でMVP決定案として「<code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">year</code>を持つ」と書いているのに、7.1のテーブルに列がない。決定事項であればモデル表に追加すべき。</li></ul><p style="white-space: pre-wrap; margin-top: 0.1em; margin-bottom: 0.2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong>[7.3 TodoCrop / TodoVariety] フィールド定義がない</strong></p><ul style="padding-inline-start: 2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><li>役割の説明しかなく、実際のカラム構成が不明。<code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">todo FK</code>,<span> </span><code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">crop FK</code>,<span> </span><code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">unique_together</code><span> </span>など最低限の定義が必要。</li></ul><hr style="font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><h3 style="color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">B. ロジックの曖昧さ</h3><p style="white-space: pre-wrap; margin-top: 0.1em; margin-bottom: 0.2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong>[7.1.2 並び順] FILO + priority の実装が未定義</strong></p><ul style="padding-inline-start: 2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><li>「新規作成時は最上位へ入る」+「priority 昇順で表示」を両立するには、既存レコードの priority を全件インクリメントするか、priority に小数・負数を許すか方針が必要。</li><li>並び替え API の payload 例(10, 20, 30)も、中間挿入時のギャップ管理が不明。</li></ul><p style="white-space: pre-wrap; margin-top: 0.1em; margin-bottom: 0.2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong>[11. バリデーション] <code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">field_ids が計画外圃場を含む場合はエラー</code> の条件が曖昧</strong></p><ul style="padding-inline-start: 2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><li>計画リンクなし TODO を作る場合は、どの「計画外」を参照してエラーにするのか。</li><li>「plan_links がある場合のみ適用」と明示すべき。</li></ul><hr style="font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><h3 style="color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">C. 設計の一貫性</h3><p style="white-space: pre-wrap; margin-top: 0.1em; margin-bottom: 0.2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong>[7.4 TodoPlanLink] 畔塗リンクが「要検討」のままで work_type に含まれている</strong></p><ul style="padding-inline-start: 2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><li><code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">work_type</code><span> </span>の初期案には<span> </span><code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">levee_work</code><span> </span>があるが、TodoPlanLink の対応先が<span> </span><code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">要検討</code>。</li><li>「計画に対応しない work_type」として整理するか、計画が存在するなら FK を確定するか、どちらかに決める。</li></ul><p style="white-space: pre-wrap; margin-top: 0.1em; margin-bottom: 0.2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong>[8.3 作成 API] <code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">plan_id</code> から具体的な FK への変換仕様がない</strong></p><ul style="padding-inline-start: 2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><li>payload は<span> </span><code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">{"plan_type": "fertilization", "plan_id": 8}</code><span> </span>だが、モデル側は FK が種別ごとに分かれている。Serializer でどう吸収するか方針を追記すべき。</li></ul><hr style="font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><h3 style="color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">D. 実装計画の漏れ</h3><p style="white-space: pre-wrap; margin-top: 0.1em; margin-bottom: 0.2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong>[12.1 Backend] <code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">admin.py</code> と migration が省略</strong></p><ul style="padding-inline-start: 2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><li>CLAUDE.md の標準パターンでは<span> </span><code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">admin.py</code><span> </span>登録と<span> </span><code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">makemigrations/migrate</code><span> </span>が必須ステップ。実装順(12.3)にも含めると実装者がそのまま使える。</li></ul><hr style="font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><h3 style="color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">E. ドキュメント体裁</h3><p style="white-space: pre-wrap; margin-top: 0.1em; margin-bottom: 0.2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong>見出し階層の揺れ</strong></p><ul style="padding-inline-start: 2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><li><code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">## 7.</code><span> </span>配下のサブセクションが<span> </span><code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">## 7.1</code>(<code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">##</code>)になっているが、親が<span> </span><code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">##</code><span> </span>なら子は<span> </span><code style="font-family: monospace; color: rgb(255, 255, 255); background-color: rgb(9, 52, 95); padding: 2px 4px; border-radius: 3px; word-break: break-word; font-size: 0.9em;">###</code><span> </span>が正しい。9〜12章も同様。</li></ul><hr style="font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><h2 style="color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">確認を推奨する事項</h2> # | 事項 | 理由 -- | -- | -- 1 | done → todo への差し戻しを許可するか | completed_at のクリア/保持ポリシーが不明 2 | TodoTargetField.field の PROTECT は適切か | Field 削除時に TODO が削除できなくなる。想定ユーザーの運用上これでよいか確認 3 | reflect_to_record の命名 | フラグの意味が「完了時に実績連携する」なのに名前がやや遠回り。links_to_record 等を検討 <hr style="font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p style="white-space: pre-wrap; margin-top: 0.1em; margin-bottom: 0.2em; color: rgb(41, 41, 41); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">全体的には実装に進める品質ですが、<strong>B(ロジックの曖昧さ)</strong> の2点は実装時にブレやすいので先に決定しておくことを推奨します。</p><!--EndFragment--> </body> </html>
Author
Owner

仕様書案(改善案/TODO管理機能仕様書案.md)でかなり整理できたため、現時点で実装前に詰めるべき残論点だけを記載します。

現時点の残論点

  1. work_type enum の初回実装範囲
  • 仕様書案では候補が整理されているが、初回実装でどこまで choices に含めるかは未確定。
  • 特に pesticideother_recorded を先に入れるか、現行アプリに対応するものだけに絞るかを決めたい。
  1. 完了時の実績連携レベル
  • MVP で A. status=done のみ / B. 実績入力画面への導線返却 / C. 仮レコード生成 のどこまでやるか未確定。
  • 仕様書案は B 推奨だが、#17 側でも明示しておきたい。
  1. 実績連携済み TODO の削除ポリシー
  • done かつ連携済み TODO を物理削除禁止にするか、論理削除を入れるか、参照整合性付き物理削除にするか未確定。
  • MVP の運用ルールを先に決めたい。
  1. work_typeplan_type の将来追加ルール
  • 明示 FK 方式で始める方針は良いが、新しい計画機能追加時にどの単位で choices/FK/API を拡張するか、運用ルールを決めておきたい。

実装前に追加で決めたい点

  1. 完了 API と通常ステータス更新 API の責務分離
  • PATCH /api/todos/{id}/ でも status=done にできるのか、完了は POST /api/todos/{id}/complete/ 専用にするのかを決めたい。
  • 実績連携導線を返すなら、完了処理の入口を一本化した方が安全。
  1. 差し戻し時の実績連携扱い
  • done -> todo/doing を許可する方針は仕様書案にあるが、その時に既に作られた実績リンクをどう扱うかは未定。
  • TodoCompletionLink を残すのか、警告だけ出すのか、差し戻し不可条件を設けるのかを決めたい。
  1. 年度 (year) と計画年度の整合性チェックレベル
  • 仕様書案では将来追加扱いになっているが、MVP でも最低限の検証を入れるかを決めたい。
  • 例: TODO.year と linked plan.year が異なる場合を保存可にするかどうか。
  1. 複数計画リンク時の UX
  • 仕様上は複数計画を参照可能だが、初回 UI で本当に複数リンク編集まで対応するかは判断が必要。
  • MVP では「内部構造は複数可、UI はまず 1 件中心」でも良いかもしれない。
  1. 並び替え対象の定義
  • 仕様書案では表示対象全体を受け取って再採番する前提だが、フィルター適用中に並び替えた場合の対象集合をどう解釈するかを決めたい。
  • todo/doing のみ再採番するのか、閉じた TODO を含む全件順序なのかを明示したい。
  1. 施肥完了時にどこまで初期値を渡すか
  • SpreadingSession 作成導線へつなぐ方針は整理済みだが、TODO からどの粒度のデータを初期注入するかは未確定。
  • 対象圃場だけか、関連 plan 情報まで渡すか、1 TODO -> 1 session を前提にするかを詰めたい。

このあたりが固まれば、MVP 実装に入るための意思決定はほぼ揃う認識です。

仕様書案(`改善案/TODO管理機能仕様書案.md`)でかなり整理できたため、現時点で実装前に詰めるべき残論点だけを記載します。 ## 現時点の残論点 1. `work_type` enum の初回実装範囲 - 仕様書案では候補が整理されているが、初回実装でどこまで choices に含めるかは未確定。 - 特に `pesticide` や `other_recorded` を先に入れるか、現行アプリに対応するものだけに絞るかを決めたい。 2. 完了時の実績連携レベル - MVP で `A. status=done のみ` / `B. 実績入力画面への導線返却` / `C. 仮レコード生成` のどこまでやるか未確定。 - 仕様書案は B 推奨だが、#17 側でも明示しておきたい。 3. 実績連携済み TODO の削除ポリシー - `done` かつ連携済み TODO を物理削除禁止にするか、論理削除を入れるか、参照整合性付き物理削除にするか未確定。 - MVP の運用ルールを先に決めたい。 4. `work_type` と `plan_type` の将来追加ルール - 明示 FK 方式で始める方針は良いが、新しい計画機能追加時にどの単位で choices/FK/API を拡張するか、運用ルールを決めておきたい。 ## 実装前に追加で決めたい点 5. 完了 API と通常ステータス更新 API の責務分離 - `PATCH /api/todos/{id}/` でも `status=done` にできるのか、完了は `POST /api/todos/{id}/complete/` 専用にするのかを決めたい。 - 実績連携導線を返すなら、完了処理の入口を一本化した方が安全。 6. 差し戻し時の実績連携扱い - `done -> todo/doing` を許可する方針は仕様書案にあるが、その時に既に作られた実績リンクをどう扱うかは未定。 - `TodoCompletionLink` を残すのか、警告だけ出すのか、差し戻し不可条件を設けるのかを決めたい。 7. 年度 (`year`) と計画年度の整合性チェックレベル - 仕様書案では将来追加扱いになっているが、MVP でも最低限の検証を入れるかを決めたい。 - 例: TODO.year と linked plan.year が異なる場合を保存可にするかどうか。 8. 複数計画リンク時の UX - 仕様上は複数計画を参照可能だが、初回 UI で本当に複数リンク編集まで対応するかは判断が必要。 - MVP では「内部構造は複数可、UI はまず 1 件中心」でも良いかもしれない。 9. 並び替え対象の定義 - 仕様書案では表示対象全体を受け取って再採番する前提だが、フィルター適用中に並び替えた場合の対象集合をどう解釈するかを決めたい。 - `todo/doing` のみ再採番するのか、閉じた TODO を含む全件順序なのかを明示したい。 10. 施肥完了時にどこまで初期値を渡すか - `SpreadingSession` 作成導線へつなぐ方針は整理済みだが、TODO からどの粒度のデータを初期注入するかは未確定。 - 対象圃場だけか、関連 plan 情報まで渡すか、1 TODO -> 1 session を前提にするかを詰めたい。 このあたりが固まれば、MVP 実装に入るための意思決定はほぼ揃う認識です。
Author
Owner

引き継ぎしやすいように、未確定論点の潰し順と、最初に決めたい内容を整理しておきます。

論点の潰し順(依存関係が強い順)

  1. work_type の初回実装範囲
  2. 完了時の実績連携レベル
  3. 完了 API と通常更新 API の責務分離
  4. 差し戻し時の実績リンク扱い
  5. 実績連携済み TODO の削除ポリシー
  6. 年度 (year) と計画年度の整合性チェック
  7. 複数計画リンクの初回 UX
  8. 並び替え対象の定義
  9. 施肥完了時に渡す初期値の粒度
  10. work_typeplan_type の将来追加ルール

この順を推す理由:

  • 1〜5 はモデル/API/完了導線の根幹に効く
  • 6〜9 は実装詳細・UX の詰め
  • 10 は将来運用ルールなので MVP 着手の必須度はやや下がる

最初に決めたいこと: work_type の初回実装範囲

ここが決まると、以下が連動して決めやすくなる。

  • Todo.work_type choices
  • 計画から TODO 生成時の自動補完
  • 完了時にどの実績導線へつなぐか
  • UI のフィルター候補

候補案

案A: 現行アプリ対応だけに絞る

  • general
  • fertilization
  • rice_transplant
  • delivery
  • levee_work

メリット:

  • 既存機能に対応するものだけで始められる
  • 未接続種別の扱いを減らせる
  • MVP 実装時の迷いが少ない

デメリット:

  • 将来 pesticide などを追加すると choices 変更が必要

案B: 将来見込みも先に入れる

  • general
  • fertilization
  • rice_transplant
  • delivery
  • levee_work
  • pesticide
  • other_recorded

メリット:

  • 将来拡張を先回りしやすい
  • TODO 基盤としての汎用性を先に確保できる

デメリット:

  • 現時点で未接続の種別が混ざる
  • 完了導線やバリデーションで例外が増える
  • 次の担当者が『今どこまで実装対象か』を読み違えやすい

現時点の推奨

MVP は 案A(現行アプリ対応だけに絞る) を推奨。

理由:

  • 今回の TODO 機能はまず 計画 -> TODO -> 実績 の導線を既存機能に対して成立させることが重要
  • 未実装の実績系・計画系に引きずられず、モデル/API/UI を安定させやすい
  • 将来 pesticide を追加する余地は残せる

次アクション

次に判断するなら、以下を決める。

  • work_type は案Aで固定するか
  • 固定した場合、完了時の実績連携レベルを B(実績入力画面への導線生成)で進めるか

この 2 点が固まると、MVP 実装の前提がかなり明確になる。

引き継ぎしやすいように、未確定論点の潰し順と、最初に決めたい内容を整理しておきます。 ## 論点の潰し順(依存関係が強い順) 1. `work_type` の初回実装範囲 2. 完了時の実績連携レベル 3. 完了 API と通常更新 API の責務分離 4. 差し戻し時の実績リンク扱い 5. 実績連携済み TODO の削除ポリシー 6. 年度 (`year`) と計画年度の整合性チェック 7. 複数計画リンクの初回 UX 8. 並び替え対象の定義 9. 施肥完了時に渡す初期値の粒度 10. `work_type` と `plan_type` の将来追加ルール この順を推す理由: - 1〜5 はモデル/API/完了導線の根幹に効く - 6〜9 は実装詳細・UX の詰め - 10 は将来運用ルールなので MVP 着手の必須度はやや下がる ## 最初に決めたいこと: `work_type` の初回実装範囲 ここが決まると、以下が連動して決めやすくなる。 - `Todo.work_type` choices - 計画から TODO 生成時の自動補完 - 完了時にどの実績導線へつなぐか - UI のフィルター候補 ### 候補案 #### 案A: 現行アプリ対応だけに絞る - `general` - `fertilization` - `rice_transplant` - `delivery` - `levee_work` メリット: - 既存機能に対応するものだけで始められる - 未接続種別の扱いを減らせる - MVP 実装時の迷いが少ない デメリット: - 将来 `pesticide` などを追加すると choices 変更が必要 #### 案B: 将来見込みも先に入れる - `general` - `fertilization` - `rice_transplant` - `delivery` - `levee_work` - `pesticide` - `other_recorded` メリット: - 将来拡張を先回りしやすい - TODO 基盤としての汎用性を先に確保できる デメリット: - 現時点で未接続の種別が混ざる - 完了導線やバリデーションで例外が増える - 次の担当者が『今どこまで実装対象か』を読み違えやすい ## 現時点の推奨 MVP は **案A(現行アプリ対応だけに絞る)** を推奨。 理由: - 今回の TODO 機能はまず `計画 -> TODO -> 実績` の導線を既存機能に対して成立させることが重要 - 未実装の実績系・計画系に引きずられず、モデル/API/UI を安定させやすい - 将来 `pesticide` を追加する余地は残せる ## 次アクション 次に判断するなら、以下を決める。 - `work_type` は案Aで固定するか - 固定した場合、完了時の実績連携レベルを B(実績入力画面への導線生成)で進めるか この 2 点が固まると、MVP 実装の前提がかなり明確になる。
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: akira/keinasystem#17