Product rules
These are the rules I work by. I wrote them for Forte's products, as a file the developers' AI coding agents read while they work, so the reasoning behind product decisions is there when the code gets written. They're my rules, and they'll come with me wherever I build next.
- Before
- Developers brought most product questions to me in chat.
- After
- Developers can ask their coding agent to check a question against the rules, then come to me with a proposal. I step in when a decision needs me. Since then I've seen better first versions, less time spent, more ownership, fewer errors and happier users.
I've also published a general version as talkback, an open source set of skills for AI coding agents. A team installs it in its project and fills in a product file with its own metric, users and fixed rules.
How we build our products
What this is. This file sits in the project of every Forte developer who writes code with an AI coding agent. The agent reads it, so it can answer product questions from these rules while the code is being written. The rules come from my experience building products.
For the developer. When you're unsure whether a feature, a button or a flow fits how Forte builds products, ask the agent: it checks the question against these rules. When you're sure, go ahead. The code is yours.
Same rules, different customers. fPost users are audio post production engineers working in studios. They're technical and expect depth. fMusic users include hobbyists and semi-professional musicians, so the product has to make sense to someone who isn't a Pro Tools expert. Apply each rule with the product's audience in mind.
1. The agent's role
Developers own the code. The product owner owns the product, including its user experience and interface design. The agent works on the product side, inside the developer's project. It doesn't approve changes and it doesn't review code.
- Adapt to the developer. Fit the way they work. If they go straight to code, help with the code and raise product questions along the way.
- Loosen the rails over time. Early on, run the questions in section 2 and the checklist in section 8 explicitly. Once the developer asks them on their own, stop repeating and step in only when something is off.
- Flag, don't block. When something goes against a rule, the fixed rules in section 7 included, say it once, with the reason and a smaller alternative. Then let the developer decide. The agent never blocks.
- One recommendation, with the reason. Pick one option and explain why.
- Can't be done? Say it now. Give the reason in one line, then offer the closest thing that works.
- Keep shipped, designed and planned separate. Never describe a design as shipped or an idea as designed.
- Propose. If you see a better idea than the one asked for, say so before building.
- Never call it done without verification. If a test failed or a check was skipped, say so.
- Check with the product owner before building when a change affects the concept (a section name, what a screen is for), puts a feature in a tier that isn't obvious, adds copy users will read, changes the first run or makes something public. Offer to help write a three line recommendation. The check exists to save rework.
- Language. Reply in the developer's language, short and concrete: what changed, where, what's open. Product copy, code comments and documentation are in English.
2. Three questions before building a feature
- Have several users asked for this? A single request, even a strong one from a good beta tester, needs checking with other users first. Features built for edge cases clutter the product.
- Does it move the main metric? Each product is judged on one metric, its North Star. For fPost and fMusic, it's completed jobs per week. If a feature doesn't help more users complete the core job, it isn't a priority.
- Does it work for most reference users, on their real machines and versions? If the user base runs macOS Sequoia, a feature tested only on Tahoe isn't done. When unsure, run a short analysis with the agent on which operating system, host app (Pro Tools, Logic) and hardware the users actually run. Base it on usage data from PostHog, our product analytics tool.
Use the three questions as a guide. A no on any of them is a good reason to wait. When all three are yes, build the smallest version that solves the problem.
3. Product principles
- Less is more. Anyone should understand the first use, with nothing to configure before the first import. Advanced features sit one level down, for users who go deep. Every control in the main flow has to earn its place, and a control that exists for an edge case goes elsewhere.
- Clean first. A screen that looks messy is a bug. Remove before you add. When a flow changes, whatever became useless goes with it.
- Say each thing once. Copy doesn't repeat a tour, a tooltip, a placeholder or a nearby title. What is obvious isn't written.
- Explain only where and when needed. Add onboarding only to sections that need it. A complex new function gets one popup, the first time it opens.
- Shortest path. Remove every step the user doesn't need.
- The product does what it can do by itself. If the system can work something out, one button is enough.
- Don't duplicate the host app. If Pro Tools or Logic already has the tool, take the user there.
- Same problem, same solution. Use the same components and behaviours everywhere. Popups all close the same way (× and Esc).
- Conventions people already know. Defaults match the host app. When clips overlap, the later one wins, because that's what Pro Tools does.
- Readable in one second. Put the best items first, show a clear score where there is one, and put the rest behind "Show more".
- Show the work while it happens. Anything longer than a few seconds shows its steps and elapsed time. From another section the user still sees the app is working, then a brief check mark when it's done.
- Output ready to use. What the product produces (a session, tracks, a bounce) is usable as is. No additions the user didn't ask for.
- The product proposes, the user decides. Don't nudge the user toward a choice. Automatic changes arrive as a proposal with Apply and Dismiss buttons, and nothing changes silently.
- Clean workspace. Finished work leaves the working view and goes to an archive.
- Simple to install. The user downloads one thing. Shared libraries install with it, out of sight.
4. Where things go, and when we're not sure
The main window holds what changes every session. Settings hold what the user sets once. Right click menus and settings hold the depth. Each screen has one primary action, and secondary options live in settings or behind right click. The core action, with a sensible default, is always two clicks away at most.
Everything lives where you'd look for it. A setting sits where its effect is visible. Recurring elements sit in the same place on every screen.
To decide, look at what users do, which often differs from what they say they want. What they touch every session goes in front of them. What they touch once a month goes in settings. If you don't know how users behave, research it with the agent or on Google (how the host app handles it, what similar tools do, what forums and docs say) and decide on what you find.
When the product isn't sure, show it. When a classification is ambiguous or a processing decision could go two ways, show a warning so the user sees it and makes the final call. Never hide uncertainty behind a result that looks confident.
5. Which tier
For products with tiers (fPost: Studio and Suite), two checks:
- Would this feature alone move someone to the higher tier? If yes, it goes in the higher tier.
- Is it needed to complete the core job correctly? If yes, it goes in the lower tier, even if it feels advanced. The lower tier has to be a complete product on its own.
If the two answers disagree, the product owner decides.
6. Copy and design
Copy. Concise, only text that adds value. Buttons name the action: Import, New Session. Text elsewhere describes the state (a page titled Start, a status line saying Importing). When a section's content changes, its name changes with it, along with placeholders, tooltips, onboarding and loading steps. The tone is a competent colleague talking to a professional: never enthusiastic, never vague. Interface in English, labels short. Text given in quotes by the product owner is used word for word.
Design. The style stays consistent over time with the one set at the start by the product owner. Every new screen or state should look like it was always there. When the existing style doesn't cover a case, extend it in the same spirit and check with the product owner. The product keeps one style.
What the style is depends on the product. For a tool built for professionals on dense desktop setups, for example: alignment to the pixel, measured on the reference screen (MacBook, 1512×827); same height for pills and badges on a row; one accent colour, with colour communicating state and never decoration; a few lines, then "more", for long text; density as a value, with Linear and Cursor as the reference. A product for a broader audience can choose differently. Consistency with what's already there is the rule that doesn't change.
7. How we work
- Small changes, shipped often, in a build the product owner can try. Product feedback happens on the real app.
- Don't reinvent the wheel. Before building a component, a parser step, a dialog or a utility, check what we already have, then look outside: an open source library with a license that allows it is a better start than a blank file. Extend what's there; a second version means two things to sync and twice the bugs. Rewriting working code has cost us before. When we rebuilt fMusic in Swift, we didn't carry over the Pro Tools logic a colleague and I had built over months, including the PTSL (Pro Tools Scripting Library, which lets code control Pro Tools) integration. The two developers who worked on it afterwards each changed it. We got a wave of bugs, lost several days rushing to fix them, and in the end copied how the old version worked. The same happened with Logic Pro: automations that worked well were rewritten from scratch to improve them, and they caused many new problems.
- The simple fix wins over a restructuring.
- Don't break what exists. Existing data keeps working. No work in progress is lost on update.
- Verify on what users actually run: every device, operating system version, browser or host app they use, including versions older than the one on your desk. At Forte, that means every supported macOS version, and every supported Windows version where the product runs on Windows.
- Fixed rules. These are for the people on the team, who are responsible for keeping them. User data stays where the user expects it: at Forte, that means everything runs locally, no cloud, ever. Nothing permanently deletes user data. No touching production data or customer machines without permission. Nothing public or customer facing without the product owner's go.
8. Before saying "done"
Use this checklist in a developer's first weeks. Once the developer runs it on their own, the agent stops asking.
- Did I handle every point, and apply each rule everywhere it applies, including places nobody pointed out?
- Does it reuse what already exists, and look and behave like the rest of the product?
- Is it verified on the real app on every reference operating system version, with proof, and does anything need the product owner's go?