Co-authored-by: Michael Chihlas <michael@resolutionflow.com> Co-committed-by: Michael Chihlas <michael@resolutionflow.com>
9.1 KiB
CURRENT_TASK.md
Active task: Phase O cutover for self-serve signup. PR #164 (feat/billing-plan-taxonomy) open in Gitea with 5 commits at head 2c9f5e9, closing the last code blockers — plan taxonomy reconciliation (team → enterprise, add starter), INTERNAL_TESTER_EMAILS allowlist, sync_stripe_plan_ids.py script, page-title — JSX-escape bug fix, frontend taxonomy followups, doc refresh. After merge, only manual ops remain: Stripe Dashboard live-mode config, Railway prod env vars, internal validation pass, public flag flip. See .ai/HANDOFF.md for the resume point.
Recently shipped
- 2026-05-08 — PR #164 (open) Plan taxonomy reconciliation +
INTERNAL_TESTER_EMAILSallowlist + Stripe sync script + page-title fix + frontend taxonomy followups + doc refresh. 5 commits onfeat/billing-plan-taxonomyfrom main (dad5e1f); HEAD2c9f5e9. Migration4ce3e594cb87renamesplan_limits.plan='team'→'enterprise'and addsstarterrow (caps interpolated between free and pro:max_trees=10,sessions=75,ai=15/mo). Resource visibility (Tree.visibility='team',StepLibrary.visibility='team') is a separate domain and intentionally untouched. Newbackend/scripts/sync_stripe_plan_ids.pyupsertsplan_billingrows from Stripe products by exact name match — annual fields stay NULL by design (user explicitly skipping annual pricing for exit flexibility).Settings.is_internal_tester+is_self_serve_active_forcentralize the allowlist + global-flag check; newget_current_user_optionaldep;/config/publichonors allowlist for authenticated callers;/auth/registerallows allowlisted emails without invite code. LandingPage page-title bug ——inside JSX attribute strings was rendering as 6 literal characters in browser tabs; replaced with literal em dash. PageMeta default tagline updated from "Decision Tree Platform" to "AI-Powered Troubleshooting for MSPs". 86/86 passing across subscription/billing/plan/invite/admin sweep; tsc + lint clean. See.ai/DECISIONS.mdfor the two architectural entries (taxonomy reconciliation, allowlist). - 2026-05-06 — PR #163 Seed test users marked email-verified. Squash-merged into main as
dad5e1f. - 2026-05-06 — PR #162 Self-serve signup Phase 2 (frontend cutover). 18 commits across Tasks 27–44 of the plan. Backend remainders + frontend billing foundation + auth surfaces (OAuth + accept-invite + verify-email) + welcome wizard + dashboard redesign (TrialPill, NextStepCard, unified checklist) + public surfaces (
/pricing,/contact-sales) + beta-signup deprecation. Squash-merged into main asf1be3ab. Single alembic head wasc6cbfc534fad(no new migrations in Phase 2; PR #164 adds4ce3e594cb87). - 2026-05-02 — PR #159 In-product User Guides rewrite. Merged into
main. Replaced 15 feature-dump guides with 43 problem-oriented Diátaxis how-tos grouped under 10 categories. Dropped Maintenance Flows / AI Assistant / Flow Assist Sparkles (UI no longer exists). Renamed Step Library → Solutions Library. Authored 14 net-new how-tos for FlowPilot-era surfaces (tasklane keyboard flow, what-we-know, resolve, escalate, record-fix-outcome, post-docs-to-ticket, share-update, pause-and-leave, build-script-from-scratch, open-suggested-flow, pin-a-flow, invite-teammate, etc.). Schema additions:category, optionalrelatedSlugs; hub renders category sections; detail page renders related-guides footer. Fixed rendering bug where**bold**instep.tiprendered literally. Killed misleading "N sections" subtitle on guide cards. Browser-verified against engineer + owner login (sidebar labels, account sub-pages, pilot-screen header buttons, Tasks panel, integration form). Two unverified items intentionally deferred: change-teammate-role (requires non-owner test member to inspect role-change control) and detailed Resolve / Escalate modal contents (Resolve gated by 6 pending tasks in test data). tsc and Vite build clean. - 2026-05-01 — PR #158 Session-screen UX impeccable pass + tasklane keyboard flow. Merged into
mainas5e10005.- Impeccable pass (5 sub-passes — distill / quieter / layout / typeset / polish): score 24/40 → 33/40. Removed the duplicate "Suggested checks" chip strip; added an inline
Next steps · N pending in Taskscue above the latest action-bearing AI bubble; consolidated the desktop session header to Resolve + Escalate + ⋯ kebab (Context / New Ticket / Update Ticket / Pause now under the kebab, mobile kebab gained Context + New Ticket parity); centered the messages column tomax-w-3xlto match the composer; bubbles dropped torounded-xl. Decoration sweep: dropped 3px side stripes (TaskLane done states, all 6 ProposalBanner modes, WhatWeKnowItem rows), gradient backgrounds (WhatWeKnow + every banner), accent borderTop on TaskLane header, backdrop-blur on handoff overlay, animate-pulse-amber ring in VerifyingBanner, bordered avatar boxes in banners. Type sweep: 14 distinct sizes → 5-step scale (10/11/12/13/14px). Icon disambiguation:MessageCircleQuestionsplit intoPencil(Answer CTA) +HelpCircle(per-check explainer). Deadfont-sansaudit (12 sites) and doubletext-xscleanups. - TaskLane keyboard-first flow (real feature): Enter submits + auto-advances to next pending task, Shift+Enter newline, Esc cancels, focus jumps to Send Responses after the last submission. Mouse path also auto-advances. Subtle hint row teaches the shortcut.
- Banner ↔ script panel linked: collapsing or dismissing the ProposalBanner now also hides the InlineNoTemplateDialog / TemplateMatchPanel; recording any outcome closes both surfaces.
- WhatWeKnow collapsible: per-session preference in
sessionStorage(rf-whatweknow-collapsed:{sessionId}); auto-collapses on first render at ≥5 facts. - Side fix:
ParameterizationPreview.tokenize()word-boundary guard prevents over-eager highlighting of short values like"D"(no longer lights up every capital D inGet-ADUser). - Validation: tsc clean, ESLint clean, Vite build clean. Type-check + lint passed at every commit boundary.
- Impeccable pass (5 sub-passes — distill / quieter / layout / typeset / polish): score 24/40 → 33/40. Removed the duplicate "Suggested checks" chip strip; added an inline
- 2026-05-01 — PR #156 Suggested-fix
applied_pendingnon-terminal outcome. Merged intomainas3ba4532. Adds:- Schema/API:
FixStatus="applied_pending",pending_reasonText column, migrationc0f3a4b7e91d.PATCH /suggested-fixes/{id}/outcomeaccepts pending, requires notes, stampsapplied_atonly. - UI:
PendingBanner(info-tone, worked / didn't / update reason / dismiss). "Waiting to verify…" overflow option inVerifyingBanner. Nudge "Still checking" records pending with a reason. Page-level Resolve auto-patches pending → success before resolution flow; page-level Escalate intercepts pending the same way verifying/partial does. - Generators:
resolution_note_generatorandescalation_package_generatorsystem prompts handle the new status without real-looking examples. - Tests: 4 new in
test_fix_outcome_endpoint.py(21/21 suite green); prompt anti-parrot guardrail green; tsc + Vite build clean. - QA report:
.gstack/qa-reports/qa-report-pending-verification-2026-04-30.md(5/7 scripted checks PASS with concrete evidence; 2 entry-path checks deferred — same handlers verified via tested transitions).
- Schema/API:
- 2026-04-30 — PR #155 Escalation Mode wedge merged as
ac42f97. Senior-tech magic-moment screen. Plan:docs/plans/2026-04-27-escalation-mode-wedge-design.md.
Two-metric framing (Escalation Mode — read before quoting numbers)
The in-product GET /analytics/flowpilot/escalations endpoint measures post-claim time-to-first-action. The "minutes recovered" sales claim is manual_baseline − in_product_metric. Manual baseline comes from the founder's stopwatch on the next 5 escalations. Don't roll the in-product number alone into "minutes recovered" — that's the apples-to-oranges miscount Codex caught.
Kill-switch (Escalation Mode)
Week 8: if 0 of 3 pilots produce a verifiable hours-saved-per-week number above 1.0, revisit the wedge.
Notes for next session
- Drive checks 1 (VerifyingBanner overflow → "Waiting to verify…") and 5 (nudge "Still checking" with 3+ post-apply messages) in real pilot usage to close the QA gap left by
/qa(the tested handlers cover the same mutations, but the entry-path UI rendering wasn't exercised end-to-end). - Consider monitoring how often pending fixes get parked vs resolved — if engineers report losing track across sessions, revisit the cross-session "Follow-ups" dashboard rollup that was scoped out.
- After PR #158 lands in real ticket flow, eyeball the keyboard-hint contrast and the WhatWeKnow auto-collapse-at-5 threshold — both were judgment calls (5 was a guess; the contrast bump from
/70to full muted-foreground was based on my read, not real screen testing). Adjust if the 5-fact threshold feels too aggressive or too lenient mid-session. - Two follow-ups logged in
.ai/TODO.mdfrom the impeccable pass:ConcludeSessionModalpaused/escalated step should allow multi-select (Ticket Notes + Client Update + Email Draft simultaneously) — real feature work;bg-card-hoverTailwind class doesn't resolve inCommandPalette— two-line fix.