← back

The Eight-Chat Sprint That Pressure-Tested Every Layer

#feature-development#ui-ux#compliance#prompt-constraints#debugging

An eight-session sprint to feature-completeness where the hardest PM decisions were what to revert, where to draw API boundaries, and when to override your own AI's design instincts.

From Feature-Complete to Beta-Ready: The Eight-Chat Sprint That Pressure-Tested Every Layer

Reaching feature-completeness is a milestone that sounds clean from the outside. In practice, it was an eight-chat marathon that touched journaling UX, legal compliance, portfolio strategy, and a humbling UI revert — all in a single sustained push. The throughline wasn't velocity. It was judgment under constraint.

Designing for the Bedside Use Case

The most consequential UX decision this cycle was Freewrite Mode. The core insight: a journaling app that auto-sends your half-formed thoughts to an AI companion violates the trust model of bedside use. Users writing at 11 PM don't want to be surprised by a response mid-sentence.

The solution was a toggleable freewrite textarea with an explicit "Send to Luna" action. This is a deliberate friction point — it breaks the conversational metaphor in favor of user control. The trade-off is worth it. In a companion app, perceived safety of the interaction space matters more than conversational fluidity. If the user doesn't feel ownership over when the AI engages, the product fails at the emotional level before any feature can save it.

Alongside this, the "Organize My Thoughts" feature added an on-demand entry breakdown that extracts themes and insights from a journal session. The key constraint here was grounding — more on that below.

The API Boundary That Saves You Redeployments

A small architectural decision with outsized leverage: I moved fallback message rendering (e.g., "No gratitude items found") from the Gemini response to the frontend. This keeps the Edge Function's API schema clean and deterministic. More importantly, it means copy tweaks — the kind of polish that compounds across beta testing — don't require redeploying backend infrastructure.

The mental model is simple: if a string exists purely for user-facing display and carries zero analytical weight, it belongs in the presentation layer. Pushing it into the model's response schema couples your deployment cadence to cosmetic changes. For a solo founder on Supabase Edge Functions, that coupling is an unforced tax on iteration speed.

Incident Response as a Solo Founder

Most solo-founder projects treat incident response as a future problem. I drafted the playbook now — mapping five failure scenarios to actual infrastructure components (Supabase, Gemini, Vercel) and hardcoding California SB 446 compliance timelines into the response matrix.

This isn't over-engineering. It's risk legibility. When you're the only person on call, the worst time to design your incident process is during the incident. The playbook forces you to pre-decide: what's the communication threshold, what's the rollback path, and which regulatory clock starts ticking the moment user data is involved. Writing it before beta means the framework exists when it matters.

The Revert That Validated the Process

The most instructive moment of the sprint was reverting a HomeScreen redesign. The AI-specced layout — sparser, more modern — sounded right in the prompt and looked reasonable in the diff. But deployed to actual screen real estate, it felt hollow. Poorly spaced. The kind of design that passes a description test but fails a squint test.

I reverted to the prior stable state, preserved the additions that did work (a time-aware dynamic greeting, clean prop-threaded deep-link routing from HomeScreen to entry detail), and moved on. The lesson isn't that AI-generated design is unreliable. It's that prompt-level approval is not deployment-level approval. You need to run the artifact before you trust the artifact. This applies to code, copy, and especially layout.

Prompt Engineering: Grounding and Role Frameworks

Two prompt engineering patterns earned their keep this cycle.

First, strict grounding for "Organize My Thoughts." The Gemini prompt is explicitly constrained to only reference information present in the conversation. This isn't just a hallucination hedge — it's a verifiability design. If the model fabricates a theme, the user can immediately see it doesn't match what they wrote. The constraint converts a trust problem into a UX affordance.

Second, the advisory team framework continued to prove out. Shifting between Product Designer, AI Coach, Portfolio Strategist, Attorney, and Engineer personas gives near-zero-overhead context switching across fundamentally different analytical lenses. The friction cost of re-prompting for each domain is close to zero once the roles are established, and the output quality difference versus generic prompting is significant.

Tooling Constraints and Adaptation

Two tooling failures shaped the workflow. A Next.js cache invalidation issue silently served stale builds after structural changes to page.tsx, burning debugging time on a phantom problem until a forced .next directory purge surfaced the real state. And hitting the Cursor monthly agent credit cap forced a mid-sprint pivot to manual copy-paste workflows with Claude.

The adaptation that stuck: mandating full-file generation over piecemeal edits. It's slower. It's also dramatically more reliable for interconnected code changes where a partial patch can leave the codebase in an inconsistent state. When your AI tooling has hard usage ceilings, reliability per interaction matters more than speed per interaction.

Portfolio as Product

Finally, this cycle included repositioning the developer blog into a PM portfolio. The changes were surgical: replacing a "vibe coding" header with professional positioning, cutting an overlong About section, and fixing a bug that rendered empty post summaries on feed cards. Small moves, but they reflect a principle worth stating: your portfolio is a product with users (recruiters, hiring managers), and it deserves the same UX rigor as anything you ship.

Key Takeaways

The sprint surfaced three durable principles. First, in AI companion products, user control over when the model engages is a trust primitive — not a feature toggle. Second, the boundary between your model's response schema and your presentation layer is an architectural decision with direct impact on iteration velocity. Third, the gap between prompt-level confidence and deployment-level reality is where the hardest PM judgment lives. The revert is not a failure. The revert is the process working.