The only leverage that scales in 2026 is Taste written down A developer reports that in 2026, the only scalable leverage is codified taste, as they manage a 10-20 person equivalent AI engineering team and automate their own bottleneck. They criticize the practice of installing third-party 'skills' from starred repositories into coding agents, citing security risks, and recommend writing one's own skills. The developer cites Kun Chen's video and the local-first editor 'lavish-axi' as inspiration for improving agentic workflows. // AI /categories/AI Condensing Twenty Years of Wisdom in One Markdown I Have, Once Again, Become a Manager, and I Kinda Love It. I’ve been building at a genuinely unreasonable pace lately. Open source on one monitor, private commercial work on another, and somewhere in the middle of that a startup I am trying to bootstrap into existence before my savings account files a formal complaint. And here’s the thing nobody warned me about: at this point I feel very much like the manager of a ten-to-twenty person elite engineering team. Not metaphorically. Structurally. The team never sleeps, never argues about tabs, never takes a sabbatical to “find itself” in Lisbon, and never once asks me whether we’re doing OKRs this quarter. It just sits there, idling at full capacity, waiting. Waiting for me . I am the bottleneck. Me. The specifications are the bottleneck. The acceptance criteria are the bottleneck. “Did you actually click the button and see if the thing does the thing” is the bottleneck. I have become the single-threaded process in an otherwise embarrassingly parallel system, which, if you have ever profiled anything in your life, is exactly the outcome you spend your entire career trying to avoid. So I am on a mission to automate myself out of that position as aggressively as possible. Along the way a few things fell out of the process that I think are genuinely useful to other people, so here they are. The Great Skills Gold Rush of 2026 Meanwhile, in the broader ecosystem: every other week somebody publishes a repo of “Andrej Karpathy’s skills” - they are not, in fact, his - and collects twenty thousand GitHub stars before lunch. And we are all encouraged, loudly and continuously, to curl | bash a pile of instruction files from a stranger’s repository into the context of an agent that has read access to our entire filesystem and write access to our entire codebase. Why? Because it has a lot of stars. That’s the whole security model. Stars. We spent fifteen years building supply-chain scanning, SBOMs, dependency pinning, Dependabot, provenance attestation, and reproducible builds, and then collectively decided that a markdown file which literally reprograms the thing writing our code deserves less scrutiny than a transitive npm dependency. Bold. Genuinely bold. I am not going to install your skills. I am going to write my own, because I actually know things, and because the only person whose taste I have to trust in this arrangement is somebody I have been arguing with for twenty years: me. The Inspiration: Kun Chen, and Doing It the Old Way My latest round of workflow surgery was directly inspired by Kun Chen’s video, “L8 Principal Building a Full Stack App with Agentic Engineering” https://www.youtube.com/watch?v=kPN564Kol14 . I cannot overstate how worth watching this is. Go watch it. I’ll wait. The post is long, you’ll need the stamina. This guy is young, and yet he attacks problems the old-school way: you don’t like how something works? Write your own. And write he did. lavish-axi https://github.com/kunchenguid/lavish-axi alone is priceless - a local-first editor for the HTML artifacts your agent produces, so that the review loop stops being “take a screenshot, paste it, write four paragraphs describing what’s wrong with the padding” and starts being “click on the broken thing and tell it.” HTML is the new markdown, annotations are the new code review, and somebody just went and built it instead of tweeting about how somebody should build it. That is the correct instinct, and it is in desperately short supply right now. About That 500x Let me put a number on the pace, and then let me immediately qualify it into the ground. In terms of pure lines of code produced - code that works , that follows the best practices I set, that I did not trust and therefore manually tested to death on top of the 96% coverage the test suite already gave me - I am currently something like 500x more productive than during some of the most productive stretches of my career, including pairing with the founding engineering team at Wanelo. Five hundred. Times. Now sit with the second-order consequence for a second, because it is not a victory lap: nobody has time to review this much code. Not me. Not you. Not the very good engineer you’re about to hire. The review bandwidth of a human being did not go up 500x. It went up approximately 0x, and arguably down, because now the diffs are enormous and uniformly plausible-looking, which is the single worst property a diff can have. Which brings me to the actual point of this post. The Only Leverage That Scales Is Taste, Written Down If you cannot review the output, you have to constrain the input. That’s it. That’s the whole trick. You move your judgment upstream , out of code review and into the context the agent reads before it writes a single line. So I have been slowly dumping my knowledge into skills and context files for the agents to load. And I must say it is highly satisfying when they get things right - when an agent reaches for algorithm: :concurrently , sets a lock timeout , and names the column amount cents without being asked. There’s a lovely little dopamine hit, followed about four seconds later by: oh, right. I wrote that goddamn instruction set. I am being complimented by my own reflection. Still counts. I’ll take it. So here is one of them, in full. This is my local ~/.agents/context/postgresql.md , which is loaded by ~/AGENTS.md only on demand - when an agent is about to generate a migration, design a schema, or propose a sub-schema for an existing application. The rest of the time it stays out of the context window, where it belongs. The file is big. It eats a lot of tokens. It should probably be split into four or five smaller files that load even more selectively, and one day it will be. But for a blog post? Nah. Fuck it. Here it is in its full glory. And do read past the finish line: after the horizontal rule there’s a note on transaction ID wraparound, a topic that essentially nobody outside the PostgreSQL core team and your friendly neighborhood LLM genuinely understands. It’s not in the skills file, because the agents already know it most of the time. You need to know it. That asymmetry should worry you slightly. With that, godspeed. My “PostgreSQL Best Practices - For the AI Agents” NOTE What follows is the file itself, verbatim, warts and all. I have not tidied it up for publication, because the tidy version is a lie about how these things actually get written. They accumulate. They contain a stray empty heading from some 2am refactor. That is the job. This document below is meant to be placed in a subdirectory of ~/.agents and be mentioned in your ~/AGENTS.md file, as a reference to load anytime my AI agents need to do something PostgreSQL related — design PostgreSQL schema, optimize queries, or propose a sub-schema to an existing application, you name it. PostgreSQL’s internal architecture. Every single one of the rules below is downstream of some box on this diagram doing exactly what it says it does, at the least convenient possible moment. Source: “What is PostgreSQL?”, by Alex Mika, reviewed by Juri Vasylenko Best Practices for AI Agents that Build Software that Use PostgreSQL v18 Instructions for AI agent working on codebases with PostgreSQL component. While PostgreSQL is moving exceptionally fast, and new features or new behavior may override the old, you are going to adhere to these rules judiciously, and only when you find a new feature contradicting something here or a specific use case you will stop and have a conversation with your human co-author. Application Classifications Before we dive into the practices, it helps to define what kind of application we are building because the rules change based on the type of application sometimes. Getting this wrong is the difference between a schema and a liability, and nobody has ever discovered they were building PG-strict at a convenient moment. For the purposes of this skill, we’ll define the following classes of applications: PG-lax - Type: OLTP. Many small transactions from a potentially large number of concurrent users. Generally, non-critical applications, games, social apps, with an unknown but likely small number of users which can grow , where the cost of invalid data reference or a missed insert is relatively low. These types of applications can be configured to perform delayed commits, and even be eventually consistent. Often in these cases it's more important that the development moves fast, and the database is not in the way. Physical deletes are a norm, logical deletes are not. Foreign key delete behavior is often ON DELETE CASCADE . PG-traditional - Type: OLTP. Many small transactions from a potentially large number of concurrent users. Otherwise, its design is tighter than that of PG-lax . Perhaps this database may contain PII on a large number of users, or be a backend for an e-commerce store, where referential integrity saves time and effort on tracking down problems and customer complaints. However, it may not need many encrypted fields or SSL-only connections, it may be directly accessible by the operations staff via a VPN, and whether to apply physical deletes or logical to key tables is a production decision. PG-strict - Type: OLTP. Many small transactions from a potentially large number of concurrent users. The opposite of PG-lax : these applications often manage money, transactions, taxes, a significant amount of PII or health records, and a mistake, leak, or a data corruption in such an application, as well as any extended downtime, will cost a significant amount of money. In addition, it can be legally bound to perform security audits, penetration testing and so on. These types of applications often prefer immutability eg. on the transactions table with a later transaction inserted to amend the previous one, instead of updating it directly in place. Many tables maintain audit trails via the triggers , and tight security, encryption at rest, encryption of columns in real-time, and SSL-only access often using public/private key. These databases almost never allow physical deletes, and perform logical delete only by having each table carry the deleted at nullable column, the null value of which is usually part of some unique index. ON DELETE behaviour is typically custom, and deletions often propagate by setting deleted at on the dependent rows, but almost never physically delete anything. PG-analytics - Type: Data Warehouse. These PG instances are meant for analytics, data warehousing, and often contain a large number of materialized views, ingest data from multiple sources, and have a small number of concurrent users performing large and long-running queries. These applications rarely perform physical deletes, are optimized for ingestion of data and fast batch imports. IMPORTANT It is critically important to understand what type of application we are dealing with before applying the rules. If the agent is engaged in designing the schema, it must first ask the user or read in the spec and infer the type of application this is, and record it in its AGENTS.md file or CLAUDE.md file . This decision will guide many of the conventions and default behaviors. NOTE Note that the following advice is presented in no particular order, but it is slightly biased towards the PG-strict type applications, hence the ordering may be suited best for such apps. Schema, Table & Column Naming A perfectly nice ER diagram which, I would like everyone to notice, uses singular table names and business-prefixed primary keys throughout. customer.customer id. We are about to have words about that. Vasek Frolik, CC BY 4.0, via Wikimedia Commons Regardless of what application we are building and in what language, we are generally going to lean on Rails conventions for database and table naming: Table names are plural, lower cased, underscored Column names are singular unless it’s an array , also lower case, underscored and are constructed using proper English words , almost never abbreviations unless it’s something extraordinarily well known, such as llm or i18n . Foreign keys are also singular , eg users table, may be referenced by profiles with a singular column. profiles.user id - Each foreign key MUST state its ON DELETE behaviour explicitly - CASCADE , RESTRICT , SET NULL or NO ACTION . The right answer depends on the application class see above . Leaving it unstated means NO ACTION , which is a decision nobody made. PolyMorphic Tables & STI Single Table Inheritance Table If you are dealing with Rails, Django, or similar frameworks, you have very likely come across both polymorphic tables for instance - edibles with edible id and edible type mapping to a class in your language such as strawberries and bananas , where each class may use only a fraction of the columns of the entire table. STI is another way to have many classes map to a single table, this time using class inheritance, implemented in the database as a type column which typically by default carries the class name that needs to be instantiated upon read. As a complementary approach to STI, Rails recently introduced so-called “Delegated Types”, which are kind of like STI, but where the mapping between classes and the tables is actually 1-1, and there is a polymorphic table in the middle joining them all into one happy family. So it’s more like a polymorphic table, honestly, than it is an STI table. For a reference please see this blog post by Vincent, an Iterative Thinker https://dev.to/vincentgithinji/single-table-inheritance-vs-delegated-types-in-rails-whats-the-deal-32oe . There are a couple of important points you should know about these mappings between classes and database tables. The polymorphic column pair can never be a real foreign key. A FK constraint targets exactly one table, and edibles.edible id targets whichever table edible type happens to name on that particular row. There is no SQL for that. This is the actual limitation, and it is precisely why Delegated Types are attractive: each concrete type gets its own table, and the join row carries a genuine, enforced FK to it. STI is the opposite problem, and it is subtler. An STI table is one real table with one real primary key, so other tables can absolutely declare a foreign key onto it - the database will accept carts.id as a target all day long. What the FK cannot do is constrain which subclass you pointed at. Postgres will cheerfully let smoothies.banana id reference a row whose type is strawberry , and it is right to, because as far as it is concerned you asked for a row and you got one. If that distinction matters, you need a CHECK constraint, a partial unique index, or a different design - not a foreign key.- With STI you have a single column - typically type , that differentiates the classes, and contains the fully qualified actual classname. And that is the problem. Imagine you decided to refactor your codebase, and Shloopify::Checkout::Cart became AmazonBoughtUs::Checkout::Cart , and the carts are stored in the STI table because why not, there are many kinds of shopping carts, some roll, some you have to carry, some charge you before you give them your credit card. Jokes aside, this is a gnarly data migration. So the advice is simple: use a single word in lower case designated to each class to tell which class this row belongs to. And in Rails the magical method that helps you resolve all that is called find sti class . If instead of the first classname we simply stored shloop , we could change the codebase to now resolve shloop to the second class, bypassing the need for a giant multi-day data migration. - Do index the type column. By itself, and in a composite index with id, type → this will be used for joins. - With polymorphic tables, the same exact concept applies to polymorphic tables: you do not want the fully qualified classname to be in the edible type , you want it to contain banana and strawberry . The trick in this case is much simpler, you merely need to define a class method polymorphic name on each class you don’t want to participate in the polymorphic table using its fully qualified classname. - And for the love of god, please create the index on ID first and sort the type so that in the index similar objects are next to each other: create index on edibles edible id, edible type desc ; Third Party Schemas Whenever there is a benefit of copying third party tables into our own database due to the active integration, webhooks being received for various events, and so on examples of which include Stripe, Plaid, and many others sometimes it’s very beneficial to store the third party’s data in the tables they might publicize and even encourage us to use. This can be very useful and can provide a good additional source of information about what’s going on in the application, useful in audits, debugging, troubleshooting, and so on, especially if the application is receiving a lot of webhooks from the third party, each of a different schema mapped to a potential table. In those cases, the following rules apply: - Store third party tables always in their dedicated schema named after the third party, eg stripe. or plaid. and so on. - Our own code, typically, will default to the public schema, which is the default schema in PostgreSQL. - The default schema search path is often set to "$user", public you can find that out with SHOW SEARCH PATH; - If you use psql you can list the schema with \dn command. - Whenever a new schema is added to the mix, it is imperative that the search path is updated either for the user: ALTER USER