feat(pilot): Phase 6 — post-resolve templatize prompt + draft accept/reject
All checks were successful
Mirror to GitHub / mirror (push) Successful in 11s
All checks were successful
Mirror to GitHub / mirror (push) Successful in 11s
Closes the loop on the Phase 5 "Run now, templatize after resolve" path.
After a session resolves, drafts queued by the three-option dialog surface
as a modal that lets the engineer review the AI-proposed parameterization
and either save as a reusable team template or skip. A "don't ask again"
toggle writes to account_settings.preferences so the next resolve won't
pop the modal.
Backend:
- /api/v1/draft-templates:
* GET — list account drafts (pending_only default true; pass false for
audit view including accepted/rejected)
* GET /{id} — single draft
* POST /{id}/accept — promotes to a new script_templates row with
source_session_id / source_user_id / source_ticket_ref populated
(drives the Script Library "generated from CW #X · resolved by Y"
provenance chip). Draft flips to status=accepted,
promoted_template_id set, resolved_at stamped. 409 on re-accept /
already-rejected. 400 on unknown category_id.
* POST /{id}/reject — flips to status=rejected. 409 on re-reject.
- /api/v1/accounts/me/preferences (GET/PATCH) — thin wrapper over
AccountSettings.get_setting/set_setting. PATCH merges keys into the
JSONB column, preserving existing keys the client didn't touch.
Used by the "Don't ask again for this team" checkbox
(templatize_prompt_enabled=false) and, forward-looking, by
cw_resolved_status_id / cw_escalated_status_id from Phase 4.
- 13 tests: list filter, accept with/without edited_body, provenance
copy-through, reject, 409 on re-accept / re-reject, 400 on unknown
category, prefs round-trip with merge semantics.
Frontend:
- src/components/pilot/script/TemplatizePrompt.tsx — modal showing the
drafted script with proposed parameters in the Phase 5
ParameterizationPreview, editable name/category/description, an
individual-parameter remove button, and the "don't ask again" opt-out.
Accept posts to /draft-templates/{id}/accept + optionally PATCHes
preferences. Skip posts /reject.
- src/api/draftTemplates.ts — typed client plus accountPreferencesApi.
- AssistantChatPage: after a successful Resolve (external OR local),
fetches preferences + pending drafts for the session and queues the
modal one draft at a time. Escalate does not trigger this flow.
- Sidebar: Scripts nav shows the pending-draft count as a badge. Fetched
independently of the main sidebar stats so endpoint flakes don't
break the rest of the sidebar.
Verified live 2026-04-22: seed two drafts → GET sees both pending →
accept draft A (template created, provenance CW #99123 populated) →
reject draft B → pending count drops → PATCH opt-out → GET confirms
persistence.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,8 +2,8 @@
|
||||
|
||||
> **Target:** Transform `/assistant` (ResolutionAssist) into the new unified `/pilot` (FlowPilot) surface.
|
||||
> **Audience:** Claude Code (implementation) and Codex (review) reviewed by Michael (owner).
|
||||
> **Status:** Phases 0–5 implemented and verified end-to-end against the dev stack. Phase 6 next.
|
||||
> **Last updated:** April 22, 2026 (Phase 5 — inline Script Generator integration — committed; live decision endpoint with Sonnet-driven TemplateExtractionService verified)
|
||||
> **Status:** Phases 0–6 implemented and verified end-to-end against the dev stack. Phase 7 (polish) next.
|
||||
> **Last updated:** April 22, 2026 (Phase 6 — post-resolve TemplatizePrompt — committed; draft accept → script_templates promotion with provenance verified live)
|
||||
|
||||
---
|
||||
|
||||
@@ -849,6 +849,22 @@ git commit -m "feat(pilot): integrate Script Generator inline with suggested fix
|
||||
- Skip the prompt → draft marked rejected, Script Library shows no new template.
|
||||
- Toggle "don't ask me again" → next session Resolve skips the prompt even with a pending draft.
|
||||
|
||||
**Verified on 2026-04-22:**
|
||||
- `GET /draft-templates?pending_only=true` returns pending rows; filter
|
||||
flips the set to include accepted/rejected for audit views.
|
||||
- `POST /{id}/accept` → creates `script_templates` row; `source_session_id`,
|
||||
`source_user_id`, `source_ticket_ref` (e.g. "CW #99123") copied from
|
||||
the source session so the Script Library provenance chip has its data.
|
||||
Draft flips to `status='accepted'`, `promoted_template_id` populated,
|
||||
`resolved_at` set. 409 on a re-accept.
|
||||
- `POST /{id}/reject` → flips to `status='rejected'`, `resolved_at` set.
|
||||
- `GET /accounts/me/preferences` → empty dict when no row; `PATCH`
|
||||
merges keys into `preferences` JSONB (verified round-trip persistence
|
||||
of `templatize_prompt_enabled: false`).
|
||||
- Sidebar Scripts nav gains a badge reflecting the pending draft count
|
||||
(fetched independently of the main sidebar stats endpoint so a
|
||||
draft-endpoint failure doesn't break the rest of the sidebar).
|
||||
|
||||
```
|
||||
git commit -m "feat(pilot): add post-resolve templatize prompt for draft templates"
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user