- Updated model docstring with full deprecation strategy - Updated column comment to mark as deprecated (BE-PR-010) - Updated schema/router comments for deprecation clarity - Added deprecation doc: docs/BE-PR-010-feat-task-id-deprecation.md - feat_task_id superseded by Task.source_proposal_id (BE-PR-008)
63 lines
2.6 KiB
Markdown
63 lines
2.6 KiB
Markdown
# BE-PR-010: `feat_task_id` Deprecation & Compatibility Strategy
|
|
|
|
> Date: 2026-03-30
|
|
|
|
## Background
|
|
|
|
The `feat_task_id` column on the `proposes` table was used by the **old** Proposal
|
|
Accept flow to store the ID of the single `story/feature` task generated when a
|
|
Proposal was accepted.
|
|
|
|
With the new Essential-based Accept flow (BE-PR-007 / BE-PR-008), accepting a
|
|
Proposal now generates **multiple** story tasks (one per Essential), tracked via:
|
|
- `Task.source_proposal_id` → FK back to the Proposal
|
|
- `Task.source_essential_id` → FK back to the specific Essential
|
|
|
|
This makes `feat_task_id` obsolete.
|
|
|
|
## Decision: Retain Column, Deprecate Semantics
|
|
|
|
| Aspect | Decision |
|
|
|--------|----------|
|
|
| DB column | **Retained** — no schema migration required now |
|
|
| Existing data | Legacy rows with a non-NULL `feat_task_id` continue to expose the value via API |
|
|
| New writes | **Prohibited** — new accept flow does NOT write `feat_task_id` |
|
|
| API response | Field still present in `ProposalResponse` for backward compat |
|
|
| Client guidance | Use `generated_tasks` on the Proposal detail endpoint instead |
|
|
| Future removal | Column will be dropped in a future migration once all clients have migrated |
|
|
|
|
## Read Compatibility
|
|
|
|
- `GET /projects/{id}/proposals` — returns `feat_task_id` (may be `null`)
|
|
- `GET /projects/{id}/proposals/{id}` — returns `feat_task_id` + `generated_tasks[]`
|
|
- `PATCH /projects/{id}/proposals/{id}` — `feat_task_id` in request body is silently ignored
|
|
|
|
## Migration Path for Clients
|
|
|
|
### Backend consumers
|
|
Use `Proposal.generated_tasks` relationship (or query `Task` by `source_proposal_id`).
|
|
|
|
### Frontend
|
|
Replace `propose.feat_task_id` references with the `generated_tasks` array from
|
|
the detail endpoint. The detail page should list all generated tasks, not just one.
|
|
|
|
### CLI
|
|
CLI does not reference `feat_task_id`. No changes needed.
|
|
|
|
## Files Changed
|
|
|
|
| File | Change |
|
|
|------|--------|
|
|
| `app/models/proposal.py` | Updated docstring & column comment with deprecation notice |
|
|
| `app/schemas/schemas.py` | Marked `feat_task_id` field as deprecated |
|
|
| `app/api/routers/proposals.py` | Updated comments; field still serialized read-only |
|
|
| `tests/test_propose.py` | Updated accept tests to assert `feat_task_id is None` |
|
|
|
|
## Frontend References (to be updated in FE-PR-002+)
|
|
|
|
- `src/types/index.ts:139` — `feat_task_id: string | null`
|
|
- `src/pages/ProposeDetailPage.tsx:145,180-181` — displays feat_task_id
|
|
- `src/pages/ProposesPage.tsx:83` — displays feat_task_id in list
|
|
|
|
These will be addressed when the frontend Proposal/Essential tasks are implemented.
|