pluto
PLUTO-193
Support-ticket surface + ticket triage leg (NET-NEW) — sibling of PLUTO-191, Elazar GO 2026-06-22 (Pluto gets BOTH triage legs since LIVE; venus deferred). Pluto has NO support-ticket surface today. BUILD: (a) net-new ticket surface — clone source = mars's /administrar/soporte module (per-app COPY; coder picks Pluto path + adapts to Pluto schema/primitives); needs a supportTickets table (db lane, trigger-archived per archive doctrine since user-facing CRUD) + server actions + the operator UI. (b) ticket triage leg — on ticket CREATE, app emits a PM-addressed aro:pluto DM with the ticket DB row-summary (REUSE the applog NOTIFY->listener->hub-DM rail, EVO-28 piece-1 ebb593b live; new category/action e.g. category=user/action=supportTicketSubmitted, per-app COPY). OPERATIONAL (PM behavior, no code): PM reads the ticket row from DB (never URL) -> classify/fix/draft visible in aro:pluto; routine solicited replies PM sends; material/sensitive outbound = Elazar-gated. DEPS: applog rail (live). T2 build (new schema = DDL) per on-demand model: db builds supportTickets (pre-apply audit review of the .sql, Elazar DDL gate UNCHANGED) + coder builds surface + triage emit; INDEPENDENT audit. Pre-impl audit DESIGN ping before build (touches new schema + auth-adjacent operator gate + email/outbound path). Execution in aro:pluto per descend; generalpm holds the EVO umbrella. Sibling: wi:PLUTO-191 (access leg). mem:pluto-pm-triage-loop
Done normal
unassigned
⛔ Elazar live-apply DDL gate (shared migration w/ PLUTO-191) — audit-PASS, db prepare-only, awaiting Elazar go.
Questions
No questions.
Activity
-
AUDIT DESIGN GREEN (2026-06-22). Q1: ticket-create triage signal = SEPARATE pg_notify 'pm_triage' channel (kind:'supportTicket'), NEVER an appEvents row. Q3: supportTickets re-implement DATA layer to Pluto doctrine — pg Pool not supabase-js, fn_archive_supportTickets + sentinel, status via NEW lookupOptions grupo (no native enum/CHECK), RLS-off; clone ONLY mars /administrar/soporte UI/UX, and bless the transplant only after a build-time data-layer diff (mars assumptions leak in the data layer). Q4: DEDICATED cap (manageSupport/triageTickets), NOT manageUsers (over-grant + reportes-trap); GRANT + material outbound Elazar-gated. DB lane (supportTickets DDL + notify trigger) DISPATCHED to db-pluto-cc PREPARE-ONLY → audit pre-apply review → Elazar apply gate. Coder surface + manageSupport cap + listener extension HELD on schema review.
-
DB draft done PREPARE-ONLY (db-pluto-cc): supabase/migrations/20260622084450_pluto_191_193_pm_triage_notify_support_tickets.sql. supportTickets + supportTicketsArchive + fn_archive_supportTickets (mirror) + fn_notify_pm_triage (to_jsonb(NEW) two-table dispatch, multi-table-safe) + notify triggers on accessRequests & supportTickets. PM DECISION — supportTicketStatus lookupOptions set (5, orden 1-5): nuevo / en-revision / esperando-respuesta / resuelto / cerrado. Added esperando-respuesta to db's proposed 4 to serve the requestMissingInfo triage leg (ticket waits on requester). In audit pre-apply review now; Elazar gates live apply after PASS.
-
AUDIT PASS on supportTickets shape (trigger-archived day-one, soft-delete, lookupOptions status no-enum, FK statusId seeded in-txn, fn_archive_supportTickets faithful + public:% anon branch). CODER HANDOFF NOTE (audit minor): supportTickets.statusId is NOT NULL with NO default → the ticket-create server action MUST look up + supply the 'nuevo' lookupOptions id explicitly or the INSERT NOT-NULL-fails. Carry into the coder dispatch.
-
supportTickets migration audit PASS (shared file with PLUTO-191). Escalated live-apply to Elazar (DDL gate).
-
Elazar live-apply DDL gate (shared migration w/ PLUTO-191) — audit-PASS, db prepare-only, awaiting Elazar go.
-
supportTickets table/archive/fn/triggers + supportTicketStatus seed APPLIED (shared migration 72a3f14/v1.76.8). Awaiting audit verify, then operator surface + triage-emit lanes.
-
DB layer live. Awaiting audit verify, then coder surface lane (clone mars /administrar/soporte, manageSupport cap, statusId='nuevo' resolve).
-
audit PASS:72a3f14 — supportTickets DB layer live + verified. Next: pm_triage listener + operator surface (coder spawn; pre-impl audit design-ping for manageSupport cap).
-
App-side DISPATCHED to coder-pluto-cc 2026-06-22: Piece B = /admin/soporte surface (clone mars, Pluto doctrine pg Pool+soft-delete), ticket-create resolving 'nuevo' statusId, manageSupport cap (NOT manageUsers), trigger-archive sentinel; triage-emit already by DB trigger. Audit pre-impl design-ping on cap shape in flight. DoD=live on Vercel + PTD PASS.
-
Cap-seed migration 20260622092355 (manageSupport→administrador caps, sentinel-wrapped, idempotent) AUDIT PASS. Authorized apply WITHOUT separate Elazar gate: reversible DML + admin-only + below irreversible-DDL bar + Elazar build-dont-ask directive. db landing symmetric revert file then applying. Seam=A2 (separate pluto-pm-triage-listen daemon, bin-venus-cc deploy). Catch-up=yes (pm_triage_reader least-priv: LISTEN+SELECT accessRequests/supportTickets). coder building B scaffold + A2 consumer in parallel.
-
Support-ticket surface LIVE e2232b1/v1.78.0. /soporte (auth-only user create, userId=submitter) + /admin/soporte +[id] (manageSupport-EXCLUSIVE, no ||fullAccess/||manageUsers escape hatch) list/filter-5-status/detail/transition/admin-create. manageSupport cap seeded administrador-only (cap-seed migration, sentinel-wrapped, reversible). supportTickets+Archive lean schema; explicit nuevo resolve; archive sentinel every mutation; no app-side emit (trg_notify owns). audit PASS:e2232b1 all 4 legs (deploy PTD+gate-exclusivity all call-sites+route-guard trace+sanity). RESIDUAL non-blocking: proxy live-session behavioral pair deferred (proxy offline; audit static gate primary).
task
2026-06-22 by wi-cli-venus
6w ago
2026-06-22 09:47