FN-212: restore Respecify and require plan approval per task
Restore plan revision from approval holds and add persistent per-task approval controls across the workflow.
- Add task-level approval resolution, persistence, migration, and workflow gating.
- Restore the Respecify action with plan-preserving revision behavior.
- Add approval overlays, shared dialogs, localized copy, and regression coverage.
Files changed:
.changeset/fn-212-respecify-and-plan-approval.md | 7 +
docs/architecture.md | 2 +-
docs/dashboard-guide.md | 8 +-
docs/settings-reference.md | 3 +-
docs/task-management.md | 8 +-
docs/workflow-steps.md | 4 +-
packages/core/src/__tests__/plan-approval.test.ts | 30 +++
.../src/__tests__/postgres/schema-applier.test.ts | 40 +++-
.../postgres/task-lifecycle-e2e.pg.test.ts | 10 +
.../__tests__/task-require-plan-approval.test.ts | 51 +++++
packages/core/src/index.gate.ts | 2 +-
packages/core/src/index.ts | 2 +-
packages/core/src/planner/plan-approval.ts | 33 ++-
.../0070_fn_212_task_require_plan_approval.sql | 3 +
packages/core/src/postgres/postgres-health.ts | 2 +
packages/core/src/postgres/schema-applier.ts | 26 ++-
packages/core/src/postgres/schema/project.ts | 2 +
packages/core/src/store.ts | 2 +-
.../core/src/task-store/branch-and-pr-entities.ts | 2 +-
packages/core/src/task-store/persistence.ts | 6 +
packages/core/src/task-store/serialization.ts | 4 +
packages/core/src/task-store/task-creation.ts | 4 +
packages/core/src/task-store/task-update.ts | 9 +
packages/core/src/types/task/task-core.ts | 12 ++
packages/core/src/types/workflow/workflow-steps.ts | 2 +-
packages/dashboard/app/api/tasks/task-steer.ts | 9 +-
packages/dashboard/app/components/ListView.tsx | 17 +-
packages/dashboard/app/components/NewTaskModal.tsx | 11 +-
.../dashboard/app/components/QuickEntryBox.tsx | 28 ++-
.../app/components/RespecifyPlanDialog.css | 49 +++++
.../app/components/RespecifyPlanDialog.tsx | 120 +++++++++++
packages/dashboard/app/components/TaskCard.css | 57 ++++-
packages/dashboard/app/components/TaskCard.tsx | 115 +++++++++-
.../dashboard/app/components/TaskContextMenu.tsx | 12 ++
.../dashboard/app/components/TaskDetailModal.tsx | 16 ++
packages/dashboard/app/components/TaskForm.tsx | 21 +-
.../ListView.plan-approval-overlay.test.tsx | 18 ++
.../NewTaskModal.plan-approval-toggle.test.tsx | 21 ++
.../app/components/__tests__/NewTaskModal.test.tsx | 27 +++
.../QuickEntryBox.plan-approval-toggle.test.tsx | 27 +++
.../components/__tests__/QuickEntryBox.test.tsx | 38 +++-
.../__tests__/RespecifyPlanDialog.test.tsx | 105 +++++++++
.../TaskCard.plan-approval-host-inventory.test.tsx | 29 +++
.../TaskCard.plan-approval-overlay.test.tsx | 104 +++++++++
.../components/__tests__/TaskContextMenu.test.tsx | 14 ++
.../__tests__/TaskRetry.host-inventory.test.tsx | 12 +-
.../dashboard/app/utils/planApprovalPreference.ts | 16 ++
packages/dashboard/app/utils/projectStorage.ts | 1 +
.../routes-task-respecify-preserve-plan.test.ts | 226 +++++++++++++++++++
.../src/routes/register-task-workflow-routes.ts | 57 +++--
.../triage-per-task-plan-approval.test.ts | 240 +++++++++++++++++++++
packages/engine/src/triage.ts | 4 +-
packages/i18n/locales/en/app.json | 21 ++
packages/i18n/locales/es/app.json | 23 +-
packages/i18n/locales/fr/app.json | 23 +-
packages/i18n/locales/ko/app.json | 23 +-
packages/i18n/locales/pt-BR/app.json | 23 +-
packages/i18n/locales/zh-CN/app.json | 23 +-
packages/i18n/locales/zh-TW/app.json | 23 +-
packages/i18n/src/resources.d.ts | 21 ++
60 files changed, 1797 insertions(+), 51 deletions(-)
Fusion-Task-Id: FN-212
Fusion-Task-Lineage: e2f46a8d-5724-4330-9fdb-dc33fd4b93bc
Co-authored-by: Fusion <noreply@runfusion.ai>