Skip to content
zero2vibecodelearn vibe coding
Level 3 · Reading what it wrote 10 min Reviewed by the author · Aug 4, 2026

The review checklist

Six questions that catch the expensive mistakes — secrets, deletion, money, who can see what, new dependencies, and edits you never asked for.

Level 3 · 0 / 3 lessons0%

Reading code is the general skill. This is the specific one: six questions that catch the mistakes with a price tag.

Run all six on anything touching data, users, money or the internet. Run the first two on everything.

1. Are there secrets in the code?

Search the changed files for anything that looks like a key, a , a password or a connection string. Long random strings, things starting with sk-, anything after the word password.

const apiKey = "sk-a1b2c3d4e5f6";

That line is a leak waiting for a destination. Private repositories become public. Folders get shared. Backups get uploaded. And in version control, a secret committed once stays in the history even after you delete the line.

What right looks like: the key lives in an — a value your operating system or hosting platform holds outside the code — and the code reads it by name.

const apiKey = process.env.READLIST_API_KEY;

Ask directly:

Are there any secrets, keys or passwords written into these files?
Move anything like that into environment variables.

Important

If a key has already been committed or published, deleting the line is not enough. Treat it as exposed: revoke it wherever you got it and issue a new one. That takes two minutes and is not optional.

Quick check

You find an API key in a file you already committed. What is the correct response?

2. Does anything delete or overwrite?

Look for the words: delete, remove, drop, clear, truncate, overwrite, reset, rm, -f.

Then ask two questions about each one:

  • What exactly does it delete? One record, or everything matching something?
  • Can it be undone? Is there a backup, a snapshot, an undo?

The dangerous shape is a delete with a broad filter, or an overwrite of a file that had content in it. “Clean up old entries” is a description that has destroyed a lot of data.

Show me every place in this change that deletes or overwrites data.
For each one, tell me what it removes and whether it is recoverable.

3. Does it cost money, and how often?

Two parts, and the second is where the surprises live.

Does it call anything paid? An AI model, an email service, a maps or SMS provider, cloud storage.

How often does it run? Once per click is fine. Once per page load starts to matter. Once per item in a list, inside a loop, on every visit, is how a working feature produces a bill.

Also worth asking: is there a limit? A retry loop with no cap will keep retrying. A polling job with no interval will poll as fast as it can.

Does this call any paid service? How many times per user action?
Is there anything here that could loop or retry without a limit?

Quick check

Which of these is the cost risk to worry about?

4. Who can see this, and who can change it?

The question that catches security problems without needing security knowledge.

For each new thing — a page, an address, a piece of data — ask: who can reach it?

The answers that need a second look:

  • “Anyone with the link” for something private.
  • “Anyone who changes the number in the URL” — the classic way to read someone else’s data.
  • “Anyone who can upload” with no limit on file type or size.
  • “Anyone who types into this box”, where the text goes straight into a database query or straight back onto the page.
Who can reach this, and what happens if someone changes the values
in the URL to another user's? Where does user-typed text end up?

Note

“It is only for me” is a real answer and often the right one. Readlist stores everything in your own browser, so most of this does not apply. The point of the question is to notice the moment that stops being true — which is usually the moment you add other people.

5. What did it add that I did not have before?

New dependencies. Every package you take on is code you now ship, update and trust.

Sometimes entirely justified — nobody should write their own date library. Sometimes it is a whole package for something that was four lines.

What new dependencies did this add, and what does each one do?
Which of them could we do without?

Also check for a name you cannot verify. Package names that are near-misses of popular ones are a known attack, and an agent picking up a plausible-looking name from training is a real way to end up with one.

Quick check

What is the honest cost of adding one small dependency?

6. What did it touch that I did not ask about?

Look at the file list one more time.

A change to fix a button that also edits the storage code, the styling and a configuration file is three unexplained decisions. Each is probably fine. Together they mean you can no longer say what version one of your project actually is.

Why did file X change? I only asked about the delete button.

Ask, do not assume malice, and do not assume competence. Sometimes the answer is a genuinely necessary fix. Sometimes it is “I noticed it could be cleaner”, which is exactly what you want to catch.

Quick check

Which of the six questions is the cheapest to run and the easiest to skip?

Two of them, on a real change

Six questions is a lot to hold. The two you will actually run every time are the cheap ones, so practise those.

Here is a change to review. You asked for one thing — email me my saved links once a week — and the agent says it is done. The terminal is already sitting in the project folder.

Question 6 first: what did it touch? ls prints the names of the files in the folder you are in — the whole file list, in one command. You asked for one feature; count what is there and decide which of those files you expected.

Then question 1: any secrets? grep prints the lines of a file that contain the text you give it, which makes it the fastest secret check there is:

grep -i key send-digest.js

The -i means ignore capitalisation. It matters here, because almost nobody names a variable exactly key — it will be apiKey, API_KEY, secretKey, and a plain search for key finds none of them.

Read the lines that come back rather than glancing at them. One of them hands a long random string to a name, in a file that is about to be shared, backed up or committed. That is question 1 catching exactly what it exists to catch, in about ten seconds.

Tip

Nothing coming back is a real answer, not a failure. An empty result from grep means no line in that file contains what you searched for, which is what a clean file looks like.

When you have finished, run cat send-digest.js and read the whole file. There is a second thing in it worth a question: one line prints your entire reading list to the console every time the digest runs. Harmless on your own machine, and not something you want left in the moment anyone else can read those logs.

The short version

Print this, or keep it in your notes file:

1. Secrets in the code?
2. Anything deleted or overwritten? Recoverable?
3. Anything paid? How often does it run?
4. Who can reach it, and change it?
5. What was added — dependencies, files?
6. What changed that I did not ask about?

Two minutes. It is the difference between vibe coding as a party trick and vibe coding as something you can trust with real work.

Do I need to run the whole checklist on every change?
Where should API keys go instead of the source code?

Check your understanding

Answered 0/3
Mode:

Why is a secret written into a source file a serious problem even in a private project?

What question catches most cost problems before they happen?

An agent adds a package you have never heard of to do one small thing. What is the right response?

Finish the task in the terminal and answer the questions to complete the lesson.

📝 My notes

Saved automatically in this browser · shows up on the Notes page.

Task

The agent just added a weekly email feature. Run the two cheap checks: list the files, then search the new one for a key.

Tab complete · history · Ctrl+L clear · help commands

  • Not done: List the files, and count what the change actually left behind
  • Not done: Search send-digest.js for anything key-shaped
  • Not done: The hardcoded key turns up in the output

Lesson Q&A

Why is a secret written into a source file a serious problem even in a private project?

The moment the folder is pushed, shared or backed up somewhere public, the key goes with it — and keys in history stay in history.

What question catches most cost problems before they happen?

Cost hides in frequency. Per user, per request, per second — that is where a working feature turns into a bill.

An agent adds a package you have never heard of to do one small thing. What is the right response?

Every dependency is code you now ship and maintain. It may be justified — you just want the justification before it lands.

You find an API key in a file you already committed. What is the correct response?

Committed history keeps the value even after you remove the line. Once exposed, the only real fix is a new key.

Which of these is the cost risk to worry about?

Frequency multiplies price. Per-item, per-load is the pattern that turns a small unit cost into a large bill.

What is the honest cost of adding one small dependency?

It becomes part of your project's maintenance and security surface, permanently. That may be worth it — it is never free.

Which of the six questions is the cheapest to run and the easiest to skip?

It is a five-second glance at the file list, which is precisely why it gets skipped — and why unexplained edits pile up.

Related reading on the blog

Move between lessons with · search with ⌘K