Leveling Up Our Dev Workflow: From Smarter Personas to Auto-Imported Action Points
Dive into a recent development session where we shipped a host of features, from enriching AI personas and streamlining project workflows to tackling tricky middleware issues and building a brand-new to-do importer.
What a session it's been! As the clock ticked past 3 AM UTC, I hit 'save' on a significant chunk of work, bringing a suite of usability improvements and powerful new features to our platform. Our mission for this sprint was ambitious: enhance workflow creation, introduce a dedicated project reports tab, deepen the intelligence of our AI personas, and — perhaps most excitingly — build a pipeline to transform raw to-do lists into actionable project points.
I'm thrilled to report that all features are implemented, type-checks pass, and we're ready for commit and push. Let's walk through what we accomplished.
Enriching Our AI Personas for Smarter Collaboration
Our AI personas are at the heart of how users interact with the system, providing specialized guidance and expertise. This session focused on making them even smarter and more transparent.
First, a visual refresh: our NyxCore persona now boasts a custom, more engaging portrait, copied to public/images/personas/nyx-persona-profile-pic.png and updated in the database.
More significantly, we've completed a backfill of persona specializations. All nine of our core personas now have 1-3 distinct specializations, a category, and specific traits. For instance, Sasha is now explicitly defined by "System Design," "Scalability," and "Clean Architecture." This structured data allows our AI to provide more focused and contextually relevant responses.
To make this intelligence visible, we updated the workflow comparison interface (workflows/[id]/page.tsx). Now, when you're choosing a persona for a workflow step, the buttons display the persona's name along with their top two specializations. You'll see "Noor Okafor / Vulnerability Analysis / OWASP" instead of just a name, instantly giving you a clearer picture of their expertise. This small UI change makes a big difference in guiding user choices.
Streamlining Project Workflows
Creating new workflows should be intuitive and efficient. We've introduced a project selector on the new workflow creation page (workflows/new/page.tsx).
Users can now easily associate a new workflow with an existing project right from the start. This involved adding projectId state, querying available projects, and integrating a <select> dropdown. While "YOLO mode" (creating a workflow without a project) is still an option, this enhancement provides a more structured and organized starting point for project-centric work.
Introducing the Project Reports Tab
Visibility into project progress and outcomes is crucial. We've added a brand-new "Reports" tab (projects/[id]/page.tsx) to the project detail view, marked with a sleek BarChart2 icon.
This tab provides a dedicated space to view completed project workflows along with key statistics. A prominent "Generate Report" button opens a ReportGeneratorModal, kicking off the process of compiling comprehensive project summaries. This lays the groundwork for powerful analytical capabilities, giving users deeper insights into their project's history and performance.
The Game-Changer: Auto-Importing Todos into Action Points
Perhaps the most exciting new feature is the todo-to-action-point import pipeline. We all have those scattered todo.md files, filled with ideas, tasks, and future plans. Now, we can transform them into actionable project items with a single click.
We built a new TodoImporterService (src/server/services/todo-importer.ts) that intelligently parses Markdown files from a designated todo/ directory. It looks for ### N. Title headings and extracts structured data like Type (e.g., Feature, Bug), Priority (P0/P1/P2), a Prompt Essence (a concise summary for AI context), and a detailed description.
On the backend, we added an importFromTodo mutation to our action-points.ts router. This mutation dedupes items by title, creates new action points with an isAutoDetected: true flag, and appends the extracted prompt essence. A todoFiles query also helps in showing available files.
Finally, we integrated an "Import todo/" button directly into the ActionPointsTab on project pages, both in the empty state and the actions bar. Clicking it triggers the mutation, providing an alert with import and skip counts. To test this, I prepared a todo/backlog-2026-02-26.md file with 15 structured items, ready for a seamless import. This feature drastically reduces friction in transforming ideas into actionable tasks.
Lessons Learned & Challenges Overcome
Development sessions are rarely without their hurdles. Here are a couple of insights gained from solving unexpected issues:
1. Static Assets and Next.js Middleware Interception
- The Challenge: While implementing the NyxCore persona portrait, I used
next/imageto optimize an image located inpublic/images/personas/. To my surprise, it failed with a400 "not a valid image"error. Digging deeper, I found that our authentication middleware was intercepting the internal fetch requestnext/imagemakes to optimize the image, causing a307redirect to/login. This, of course, isn't a valid image source for the optimizer. - The Solution: The fix was to explicitly add
images/to our middleware's matcher exclusion regex insrc/middleware.ts. This tells the middleware to ignore requests to anything under the_next/imagepath that is trying to fetch from/images/. - The Insight: Middleware, while incredibly powerful for routing and authentication, can unexpectedly interfere with internal framework mechanisms like
next/imageoptimization. Always remember to consider internal asset paths when defining middleware matchers, especially forpublic/directories that serve static content. Any newpublic/subdirectories serving static assets might need similar treatment.
2. Ambiguous SQL Columns in JOINs
- The Challenge: While fixing a digest compression raw SQL query in
src/server/trpc/routers/dashboard.ts, I encountered a42702: column reference "output" is ambiguouserror from PostgreSQL. I was joiningworkflow_steps wsandworkflows w, and both tables happened to have a column namedoutput. - The Solution: The resolution was straightforward: qualify the ambiguous column with its table alias, changing
outputtows.output(orw.output, depending on whichoutputwas intended for the specific part of the query). - The Insight: This is a classic SQL pitfall! When performing
JOINoperations, it's best practice to always qualify your column names with their respective table aliases, even if you think it's obvious which table a column belongs to. This prevents ambiguity errors, makes your queries more robust, and significantly improves readability for anyone (including your future self) who might review the SQL.
What's Next?
With these features ready for commit and push, the immediate next steps involve:
- Commit and Push: Getting these changes integrated into our main branch.
- Test Todo Import: Verifying that our new
Import todo/button correctly creates 15 action points from the backlog file. - Comprehensive QA: A thorough browser-based QA of all new features, referencing the detailed checklist in
todo/backlog-2026-02-26.md. - Security Policies: Implementing Row-Level Security (RLS) policies for the
project_notestable. - Housekeeping: Cleaning up our
.gitignorefile to ensure log files and other temporary artifacts are properly ignored.
It was a highly productive session, moving the needle significantly on both user experience and core functionality. Stay tuned for more updates as we continue to refine and expand our platform!
{
"thingsDone": [
"Persona specialization backfill for 9 personas",
"NyxCore persona portrait updated",
"Workflow compare persona labels enhanced with specializations",
"Workflow create project selector added",
"Project Reports tab implemented with 'Generate Report' button",
"Todo-to-action-point import pipeline created (service, mutation, UI button)",
"Middleware matcher fixed for Next.js image optimization",
"Dashboard SQL query de-ambiguated for 'output' column"
],
"pains": [
"Next.js middleware intercepting internal image optimization requests",
"Ambiguous column reference in PostgreSQL JOIN query"
],
"successes": [
"All planned features implemented and type-checked",
"Enhanced user experience