# Field notes from the build.

Notes on AI engineering, data pipelines, platform tooling, software architecture, and SEO/AEO — practical deep-dives from production applications.

- [The third-party API is not your model: adapters with Zod](https://www.enderpuentes.com/en/notes/software-architecture/la-api-del-tercero-no-es-tu-modelo): When an API hands you `f_title` and `userid`, TypeScript does not complain if you copy it. Next day the listing already talks like them. I translate it on the server with Zod: `f_title` in, `title` out, and the screens get the object I actually want to use.
- [The Team Is the New Context Window](https://www.enderpuentes.com/en/notes/ai-engineering/el-equipo-es-la-nueva-ventana-de-contexto): AI makes the individual developer faster, but not necessarily the team. Give ten developers the same tools and you get ten different ways of working, and that friction gets paid at the team level. The answer is not to make everyone work the same way, it is a shared base of rules, skills, and review criteria.
- [When context starts working against you](https://www.enderpuentes.com/en/notes/ai-engineering/cuando-el-contexto-empieza-a-jugar-en-contra): An hour of Grill.me on a permissions system. I let the agent work and came back to a half-finished implementation: the context of that conversation had swollen and the original plan no longer fit. I dropped it into a file by phases, one new conversation per phase, and that is when it closed.

---
- [Anti-Cliché: I used to spend more time fixing than writing](https://www.enderpuentes.com/en/notes/ai-engineering/antes-tardaba-mas-arreglando-que-escribiendo): I have used Cursor for a couple of years. I started on Tab. When I moved to agents, a chunk of my time went to reviewing and fixing what they generated. I built Anti-Cliché.
- [Knip: dead code when AI agents write faster](https://www.enderpuentes.com/en/notes/platform-engineering/knip-encontrar-codigo-muerto-antes-de-que-se-acumule): AI agents speed up how much code we generate. Knip helps find files, exports, and dependencies nobody uses anymore — and turn that hygiene into an automatic project rule.
- [Grill.me: the skill that changed how I work with AI agents](https://www.enderpuentes.com/en/notes/ai-engineering/grill-me-the-skill-that-changed-how-i-work-with-ai-agents): Why context beats better prompts—and how Matt Pocock's Grill.me skill turned discovery into an explicit part of my AI workflow.
- [Self-Host Agent Skills on Your Website](https://www.enderpuentes.com/en/notes/ai-engineering/self-host-agent-skills-on-your-website): Your website can host installable AI skills — you don't need GitHub. I set this up with Next.js on a production app; the tricky part was getting the www redirect right so npx skills add works, and giving agents persistent product context instead of making things up.
- [.agents: Centralized Rules and Skills for Any AI Editor](https://www.enderpuentes.com/en/notes/ai-engineering/agents-centralized-rules-and-skills-for-any-ai-editor): When everyone on the team uses a different AI editor, rules drift between .cursor, .agent, and .claude. We centralized everything in .agents/ with symlinks and tucked the wiring into VS Code so the repo stays focused.
- [Git Auditor: Native Shell Hooks for a Minimum Viable Team Standard](https://www.enderpuentes.com/en/notes/platform-engineering/git-auditor-native-shell-hooks-for-team-standards): When teams grow, commit styles drift and lint catches up too late. Git Auditor uses versioned shell hooks in .githooks/ to enforce a shared baseline — on your machine, before CI.
- [PostgreSQL Trigger Naming Convention on Supabase](https://www.enderpuentes.com/en/notes/data-engineering/postgres-trigger-naming-convention): PostgreSQL won't auto-update timestamps or clean up related rows — you wire that with triggers. Here's a naming convention that keeps the catalog readable for you and for AI agents on Supabase.
- [Supabase Log Cleanup: Edge Functions and Cron Jobs](https://www.enderpuentes.com/en/notes/data-engineering/supabase-log-cleanup-maintenance): After working on several Supabase-backed projects, I kept hitting the same silent disk problem — log tables that grow forever. Here is the cleanup_logs() function and how to run it safely.
- [Optimizing Form Handling with useTransition Instead of useState](https://www.enderpuentes.com/en/notes/software-architecture/optimizing-form-handling-with-usetransition-instead-of-usestate): Replacing isLoading booleans with useTransition makes forms feel faster, keeps the UI responsive while requests run, and cuts down on the state you have to manage.
- [Using Parallel Routes for the dynamic management of multiple interfaces in Next.js](https://www.enderpuentes.com/en/notes/software-architecture/using-parallel-routes-for-the-dynamic-management-of-multiple-interfaces-in-next-js-14): Next.js 14 Parallel Routes let you render different layouts at the same time — a delivery app example with @client and @driver slots.
