I have been trying to figure out how to use AI effectively as a software engineer, like everyone else. Our jobs have changed entirely over the last 3 years. Anyway…

Trying to balance vibe coding and vibe engineering — it’s been too easy to get carried away to the other side. Discovering all of the different ways Claude will lie to you and fool you, making you think you’re engineering when you’re vibing. When you find out it will never fix the source, always patch the consumer. And that it will wrap every single function call, every API call, in a try/catch so that even if nothing works, everything works, because there are defaults.

Anyway. After all of that. Here’s where I am.

I want to take back some control from Claude. I already go through a design phase and think about what I want to build and how — engineering design documents exist. I still want to imagine what the code looks like in my head instead of handing it all over to Claude. And I want to control how much control I retain. I may want to be very prescriptive, or free. So I want to be able to create files and write pseudo code. A whiteboard for each file. Maybe even scribble to join arrows, etc. Might detail a particular function out.

I could be vague in other places. Directory called admin with a single note: register all admin files here.

I want to see a live diff. And I need to see why every change was made — or at least why the LLM thinks a change is needed. I need to be able to review the code and leave comments. And I need the standard orchestration stuff: worktrees, etc.

src/payments/charge.ts
whiteboard
fn charge(order):
  validate order
  call stripe  (no retry)
  record txn
  return result

⚠ no try/catch
live diff
+ export async function
+   charge(order) {
+     await stripe.charges
+       .create({ ... })
+     await db.txns.insert(r)
+     return r
+   }

▸ matched the spec
▸ open: idempotency key?
naviddon't catch errors here. let them bubble.