<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Onkar Deokate</title>
    <description>The latest articles on DEV Community by Onkar Deokate (@rakno).</description>
    <link>https://dev.to/rakno</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3903579%2F2780481a-5e16-40ac-8840-126059da6cde.png</url>
      <title>DEV Community: Onkar Deokate</title>
      <link>https://dev.to/rakno</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rakno"/>
    <language>en</language>
    <item>
      <title>4,300 tests, written by an AI: how they were planned, run and enforced</title>
      <dc:creator>Onkar Deokate</dc:creator>
      <pubDate>Mon, 02 Nov 2026 04:30:00 +0000</pubDate>
      <link>https://dev.to/rakno/4300-tests-written-by-an-ai-how-they-were-planned-run-and-enforced-2e9l</link>
      <guid>https://dev.to/rakno/4300-tests-written-by-an-ai-how-they-were-planned-run-and-enforced-2e9l</guid>
      <description>&lt;p&gt;If an AI writes your code, your tests are the only thing standing between "it compiles" and "it's right". So in ParkEase, tests weren't a phase at the end. They were the contract the generated code had to meet.&lt;/p&gt;

&lt;p&gt;By the end: &lt;strong&gt;3,246 unit tests and 1,080 integration tests&lt;/strong&gt;, plus browser end-to-end suites. Here's how they came to exist, and how they were kept honest.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Tests first, every time
&lt;/h2&gt;

&lt;p&gt;The build phase of the workflow &lt;em&gt;is&lt;/em&gt; test-driven development: write the failing test, watch it fail, write the code, watch it pass. That order matters more with an AI than with a person. An agent writing tests after the code tends to write tests that describe what the code does, bugs included. A test written first describes what the code &lt;em&gt;should&lt;/em&gt; do.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Every task gets a test plan before it gets code
&lt;/h2&gt;

&lt;p&gt;ParkEase was built as 22 tasks, and each one has an entry in a test registry: what will be tested, at which level, and why. That file reached 2,357 lines. It's what made "is this feature tested?" a lookup instead of an opinion, and it's updated as part of shipping, not afterwards.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Real infrastructure, not mocks
&lt;/h2&gt;

&lt;p&gt;Integration tests run against a real PostgreSQL 18 with PostGIS in a throwaway container. No mocked database.&lt;/p&gt;

&lt;p&gt;A mock is a second implementation of your database written by the same author, AI or human, with the same assumptions. ParkEase's most important rules live in the database itself: overlapping bookings are refused by an exclusion constraint, the ledger must balance. You can't test those against a mock that doesn't have them.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Four suites that can never be red
&lt;/h2&gt;

&lt;p&gt;Four integration suites are mandatory on every change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;booking concurrency:&lt;/strong&gt; the last slot sells exactly once. One test drops the database constraint and checks that the double-sell comes back, proving the constraint is what's doing the work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ledger balance:&lt;/strong&gt; debits equal credits for every transaction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;idempotency:&lt;/strong&gt; a retried request never charges twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;search performance:&lt;/strong&gt; p95 under 200 ms over 10,000 spaces, and the test fails if the query plan stops using the spatial index.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus stress tests: &lt;strong&gt;100 drivers racing for 10 slots&lt;/strong&gt; must produce exactly 10 bookings and 90 clean conflicts, no server errors, p95 under 2 seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Test at the level the bug lives
&lt;/h2&gt;

&lt;p&gt;Two lessons became rules after they let defects through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API tests go through HTTP.&lt;/strong&gt; Tests that call a command directly skip the guards, interceptors, status codes and error envelopes. Now API tests send real requests through the real stack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New screens need new tests.&lt;/strong&gt; The mobile app ended with 1,466 component tests, plus a table-driven test that checks every data screen has a loading, an error and an empty state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The web and admin apps get Playwright end-to-end runs at phone and desktop sizes, with an accessibility scan on every page.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Green locally, before the PR
&lt;/h2&gt;

&lt;p&gt;The last gate before any pull request: lint, typecheck, every unit suite, the four mandatory integration suites, a dependency audit and a secret scan, run locally, with the output pasted into the PR. "CI will catch it" isn't a reason to open early.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the tests weren't enough
&lt;/h2&gt;

&lt;p&gt;Two honest gaps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fixtures can lie.&lt;/strong&gt; The first deploy found three bugs that every test agreed with, because the test fixtures and the code shared the same wrong assumption about the API. The fix was making tests use the real response shapes, imported from the shared contracts instead of hand-written.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No phone, no test.&lt;/strong&gt; The end-to-end mobile flows were written but need a real Android device to run. That gap is logged, not hidden.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; harvesting. How every mistake, review finding and deferred idea became a written row somewhere, and the hook that won't let a task finish until it does.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ParkEase is a peer-to-peer parking marketplace for India, built solo with Claude Code.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Code: &lt;a href="https://github.com/Deonkar/parkease" rel="noopener noreferrer"&gt;https://github.com/Deonkar/parkease&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>typescript</category>
      <category>postgres</category>
    </item>
    <item>
      <title>The SDLC is turning into an ADLC. Here's what changes.</title>
      <dc:creator>Onkar Deokate</dc:creator>
      <pubDate>Sun, 01 Nov 2026 04:30:00 +0000</pubDate>
      <link>https://dev.to/rakno/the-sdlc-is-turning-into-an-adlc-heres-what-changes-5di8</link>
      <guid>https://dev.to/rakno/the-sdlc-is-turning-into-an-adlc-heres-what-changes-5di8</guid>
      <description>&lt;p&gt;This one is an opinion, from someone who just built a five-app product mostly by directing an AI. Argue with it in the comments.&lt;/p&gt;

&lt;p&gt;I think the software development life cycle we all learned (requirements, design, build, test, deploy, maintain) is turning into something I'd call an &lt;strong&gt;AI development life cycle&lt;/strong&gt;. Not because the phases disappear, but because the weight moves. The phases that used to be expensive got cheap, and the cheap ones got expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the effort went
&lt;/h2&gt;

&lt;p&gt;In the SDLC, &lt;em&gt;build&lt;/em&gt; is the big phase. Most of the hours, most of the people.&lt;/p&gt;

&lt;p&gt;Building ParkEase, build was the fast part. An agent could write a feature in an hour. What took the time was everything around it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context.&lt;/strong&gt; Writing down the rules, decisions and constraints the agent works under, and keeping them current.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choosing.&lt;/strong&gt; Picking between rendered design options, reviewing a plan, deciding what not to build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifying.&lt;/strong&gt; Proving the output was right: tests, reviews, a real build against a real API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Harvesting.&lt;/strong&gt; Turning every mistake into a rule so it doesn't happen next session.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The ADLC, as I'd draw it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Context engineering&lt;/strong&gt; replaces requirements gathering. Requirements still exist, but the real deliverable is the context the agent reads: instruction files, decision records, task files. If it isn't written down, the agent doesn't know it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direction&lt;/strong&gt; replaces design. The human picks from options the AI generates, rather than drawing from scratch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generation&lt;/strong&gt; replaces build. Fast, cheap, and not to be trusted on its own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification&lt;/strong&gt; replaces testing, and gets bigger. Tests are no longer just checking code someone carefully wrote; they're the contract that generated code has to meet. Evidence before any "done".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Harvest&lt;/strong&gt; is new. Every session ends by capturing what was learned into files the next session reads. In the SDLC that was a retro once a sprint. In the ADLC it's continuous, because the model forgets everything every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy and operate&lt;/strong&gt; stay much the same, and are where generated code meets reality. My first deploy found three bugs every test had agreed with.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What this means for engineers
&lt;/h2&gt;

&lt;p&gt;If I'm right, the scarce skills shift:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Writing precise constraints&lt;/strong&gt; matters more than typing speed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Judgment and taste&lt;/strong&gt; ("that one, not those two") matter more than producing the first draft.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification design&lt;/strong&gt; (knowing what proves correctness) becomes a core engineering skill, not QA's job.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Systems thinking&lt;/strong&gt; matters more, because the AI is very good locally and has no idea what your system is supposed to be.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that is less engineering. It's engineering with the typing moved to a machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I might be wrong
&lt;/h2&gt;

&lt;p&gt;One project, one person, one five-week build. On a large team with a legacy codebase, context engineering might be the whole job, and that might not look like a "cycle" at all. And models are improving fast enough that today's verification burden could shrink.&lt;/p&gt;

&lt;p&gt;But I'd bet on the direction. The teams that win won't be the ones whose AI writes the most code. They'll be the ones whose AI writes code they can &lt;em&gt;trust&lt;/em&gt;, and that's a process problem, not a model problem.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; the verification half, in detail. How tests were written, run and enforced, from the four mandatory suites to the race of 100 drivers for 10 slots.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ParkEase is a peer-to-peer parking marketplace for India, built solo with Claude Code.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Code: &lt;a href="https://github.com/Deonkar/parkease" rel="noopener noreferrer"&gt;https://github.com/Deonkar/parkease&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>discuss</category>
      <category>career</category>
    </item>
    <item>
      <title>12 habits that got more out of AI-assisted development than any model upgrade</title>
      <dc:creator>Onkar Deokate</dc:creator>
      <pubDate>Sat, 31 Oct 2026 04:30:00 +0000</pubDate>
      <link>https://dev.to/rakno/12-habits-that-got-more-out-of-ai-assisted-development-than-any-model-upgrade-2b2i</link>
      <guid>https://dev.to/rakno/12-habits-that-got-more-out-of-ai-assisted-development-than-any-model-upgrade-2b2i</guid>
      <description>&lt;p&gt;People ask which model or which tool. After five weeks building ParkEase with an AI agent, my answer is that the setup around the model mattered more than the model. Here are the habits that made the biggest difference, roughly in order of payoff.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you write a line
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Write the rules down once.&lt;/strong&gt; One instruction file the agent reads every session: your stack, the five to ten rules that matter most, and what's forbidden. Especially what's forbidden. "Drizzle, NOT TypeORM" saves an argument every single session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Record decisions, not just code.&lt;/strong&gt; When you decide something structural (money is integer paise; the database enforces double-booking), write a short decision record with the &lt;em&gt;why&lt;/em&gt;. The agent will otherwise re-decide it, reasonably and differently, next week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Make it think before it types.&lt;/strong&gt; A brainstorming step before any feature surfaces the questions the task description didn't answer. It's the cheapest bug you'll ever fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  While it builds
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;4. Tests first, real infrastructure.&lt;/strong&gt; Have it write the failing test, then the code. And run integration tests against a real database in a container, not mocks. Mocks are a second implementation that agrees with your first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Make it read before it guesses.&lt;/strong&gt; The most expensive pattern I saw was the agent guessing an API, failing, guessing again. One rule ("read the docs and type definitions before writing code against a library") cut whole loops of retries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Ask for the lazy version.&lt;/strong&gt; AI over-builds by default. A "does this need to exist?" pass before every feature deleted more code than any refactor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Show the UI, don't describe it.&lt;/strong&gt; For anything visual, make it render two or three options and pick. You'll judge a picture in seconds; a paragraph about a picture, never.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you call it done
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;8. Demand evidence, not adjectives.&lt;/strong&gt; "Thoroughly tested" isn't evidence. The test command and its output is. Make "verify before claiming done" a fixed step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Review with narrow lenses.&lt;/strong&gt; "Review this" gets a polite skim. "Find every swallowed error" or "find every query missing an index" finds things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Run the real build, against the real thing, once.&lt;/strong&gt; Every test in ParkEase was green when three bugs reached the first deploy. Booting the built image and clicking through it found them in minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Across sessions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;11. Keep a learnings file.&lt;/strong&gt; Every fix that cost more than fifteen minutes becomes an entry the agent reads next time. The model has no memory; the repo can.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12. Turn repeated corrections into rules.&lt;/strong&gt; If you've told the agent the same thing twice, the second time belongs in its instruction file, not the chat. "Never skip visual verification" started as me being annoyed and ended as a gate.&lt;/p&gt;

&lt;h2&gt;
  
  
  And one anti-habit
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Don't parallelise for the sake of it.&lt;/strong&gt; It's tempting to fan out five agents on every task. Each one rebuilds its context from scratch, and on one task that ate most of a week's usage limit. Use specialists for the diffs that deserve them, not by default.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; an opinion piece. I think the software development life cycle is quietly becoming something else, an AI development life cycle, and the parts that grow are not the ones you'd guess.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ParkEase is a peer-to-peer parking marketplace for India, built solo with Claude Code.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Code: &lt;a href="https://github.com/Deonkar/parkease" rel="noopener noreferrer"&gt;https://github.com/Deonkar/parkease&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I counted every skill my AI invoked across 55 sessions. Here's the leaderboard.</title>
      <dc:creator>Onkar Deokate</dc:creator>
      <pubDate>Fri, 30 Oct 2026 04:30:00 +0000</pubDate>
      <link>https://dev.to/rakno/i-counted-every-skill-my-ai-invoked-across-55-sessions-heres-the-leaderboard-1e3a</link>
      <guid>https://dev.to/rakno/i-counted-every-skill-my-ai-invoked-across-55-sessions-heres-the-leaderboard-1e3a</guid>
      <description>&lt;p&gt;I had over a hundred skills installed while building ParkEase. Which ones actually pulled their weight?&lt;/p&gt;

&lt;p&gt;Instead of guessing, I counted. Claude Code keeps a transcript of every session, so I searched all 55 ParkEase sessions (10 September to 19 October) for every time the agent explicitly invoked a skill.&lt;/p&gt;

&lt;p&gt;One caveat up front: this counts explicit invocations only. A skill already loaded keeps shaping the work without being re-invoked, so these are "times it was called on", not "times it mattered".&lt;/p&gt;

&lt;h2&gt;
  
  
  The leaderboard
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Invocations&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;flow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;The project's workflow router: phases, gates, which skills apply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;brainstorming&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;Settles &lt;em&gt;how&lt;/em&gt; before any code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;impeccable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Frontend design critique and polish&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;writing-plans&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Turns a task into small, checkable steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ui-ux-pro-max&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Palettes, type pairings, UX guidelines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;postgres-migration-reviewer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Checks every migration for locking and breaking changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mobile-app-design&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Mobile UI conventions and accessibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;security-review&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Reviews the branch's pending changes for vulnerabilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ponytail&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;6 (+9 typed by me)&lt;/td&gt;
&lt;td&gt;The YAGNI pass: delete before adding&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Behind those: test-driven development, archify (architecture diagrams), executing plans and code review.&lt;/p&gt;

&lt;h2&gt;
  
  
  What surprised me
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The router came first.&lt;/strong&gt; &lt;code&gt;flow&lt;/code&gt; doesn't write a line of code. It decides which other skills run. That it topped the list says something: the most-used tool in an AI workflow was the one that sets up the workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design skills outnumbered code skills.&lt;/strong&gt; &lt;code&gt;impeccable&lt;/code&gt;, &lt;code&gt;ui-ux-pro-max&lt;/code&gt; and &lt;code&gt;mobile-app-design&lt;/code&gt; together: 30 invocations. A code review can tell you code is wrong; it can't tell you a screen looks generic. The design skills existed because the AI's default UI output was competent and forgettable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The boring safety net ranked high.&lt;/strong&gt; Ten migration reviews. Every database migration was checked for things that lock a production table or break running code. No migration review ever made a demo exciting, which is exactly the point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;test-driven-development&lt;/code&gt; ranked low by count, high by effect.&lt;/strong&gt; Only 4 explicit calls, because it was loaded once per build phase and stayed loaded. Its output, 3,246 unit tests and 1,080 integration tests, is the clearest proof that invocation counts undersell the skills that stick.&lt;/p&gt;

&lt;h2&gt;
  
  
  The specialists
&lt;/h2&gt;

&lt;p&gt;Separate from skills are subagents: single-lens reviewers the agent can dispatch. Ranked by dispatches, the specialists that ran most were the &lt;strong&gt;security reviewer&lt;/strong&gt;, the &lt;strong&gt;silent-failure hunter&lt;/strong&gt; (swallowed errors, empty catches, lost stack traces), the &lt;strong&gt;TypeScript reviewer&lt;/strong&gt;, the &lt;strong&gt;test-coverage analyzer&lt;/strong&gt; and the &lt;strong&gt;database reviewer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The silent-failure hunter is the one I'd recommend to anyone. AI-written code is very good at "handling" an error by catching it and doing nothing, and a lens that only looks for that finds things the general reviewers skim past.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd install first, if starting again
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;A workflow router for your project (write your own; it's mostly a table).&lt;/li&gt;
&lt;li&gt;Brainstorming and a planning skill: think before typing.&lt;/li&gt;
&lt;li&gt;Test-driven development.&lt;/li&gt;
&lt;li&gt;A verification skill that demands evidence before "done".&lt;/li&gt;
&lt;li&gt;One design skill, if anything you build has a screen.&lt;/li&gt;
&lt;li&gt;A YAGNI skill like ponytail, to keep the volume honest.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything else is situational. And more isn't better: post 13 is about being offered 292 skills and installing 21.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; a practical guide. How to get more out of AI-assisted development, from the habits that made the biggest difference here.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ParkEase is a peer-to-peer parking marketplace for India, built solo with Claude Code.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Code: &lt;a href="https://github.com/Deonkar/parkease" rel="noopener noreferrer"&gt;https://github.com/Deonkar/parkease&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>devtools</category>
    </item>
    <item>
      <title>I put a second AI in front of my AI. It answers in probabilities, not paragraphs.</title>
      <dc:creator>Onkar Deokate</dc:creator>
      <pubDate>Thu, 29 Oct 2026 04:30:00 +0000</pubDate>
      <link>https://dev.to/rakno/i-put-a-second-ai-in-front-of-my-ai-it-answers-in-probabilities-not-paragraphs-3oib</link>
      <guid>https://dev.to/rakno/i-put-a-second-ai-in-front-of-my-ai-it-answers-in-probabilities-not-paragraphs-3oib</guid>
      <description>&lt;p&gt;Most of this series is about one AI: the coding agent that wrote ParkEase. This post is about a different kind of model, and an experiment in putting it &lt;em&gt;in front of&lt;/em&gt; the coding agent.&lt;/p&gt;

&lt;p&gt;The model is &lt;strong&gt;Jev&lt;/strong&gt;, from TypeSafe. It's what they call a System One model: instead of generating prose, it answers a question with a typed judgment and a probability. A yes/no comes back as a number between 0 and 1. A pick from a list comes back as a choice plus a probability for every option. A rating comes back as a score.&lt;/p&gt;

&lt;p&gt;That makes it a different tool from a chat model. You don't parse its answer; you branch on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two hooks
&lt;/h2&gt;

&lt;p&gt;Claude Code lets you run a script every time you submit a message. I built two of these hooks, with Jev doing the deciding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A model router.&lt;/strong&gt; Not every message needs the biggest model. "Rename this variable" and "design the payout reconciliation" deserve very different horsepower. The router asks Jev one question with four described options: is this message &lt;em&gt;tiny&lt;/em&gt; (a lookup or rename), &lt;em&gt;everyday&lt;/em&gt; (a routine single change), &lt;em&gt;large&lt;/em&gt; (a multi-step build or a feature across files), or &lt;em&gt;hardest&lt;/em&gt; (strategy, or anything where a wrong call is expensive)? Each size maps to a model, from the smallest to the strongest. Jev returns its pick and a probability for each.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A skill picker.&lt;/strong&gt; Given my message and the list of installed skills, which one fits? Same shape of question, a choice over skills, a probability on each.&lt;/p&gt;

&lt;h2&gt;
  
  
  The parts that made it trustworthy
&lt;/h2&gt;

&lt;p&gt;A router that guesses wrong is worse than no router. So the design leaned hard on Jev's numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A confidence floor.&lt;/strong&gt; If Jev's top pick is below 60% sure, the hook stays quiet. No suggestion beats a coin-flip suggestion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It fails open.&lt;/strong&gt; Any error, timeout or malformed answer, and the hook outputs nothing; the message reaches the coding agent exactly as if the router weren't installed. It gets a 2.5-second budget, then gives up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every answer is validated.&lt;/strong&gt; The response is checked for the right type, a known option, and real probabilities before anything acts on it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It suggests, it doesn't override.&lt;/strong&gt; The workflow's gates always win. Money, ledger, migration and auth work stays with the main model regardless of what the router says.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It never logs what I typed.&lt;/strong&gt; Only the decision and its numbers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Off by default, on purpose
&lt;/h2&gt;

&lt;p&gt;Both hooks are switched off unless I say "router on" or "skill picker on". While they're on, every message I type goes to a third-party API. That's fine for building a parking app in public. It isn't fine for anything private, so the default is off.&lt;/p&gt;

&lt;p&gt;Cost was handled by construction, not discipline: the account runs on a small prepaid credit with no card attached. If it runs out, the hooks fail open and nothing gets billed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it didn't do
&lt;/h2&gt;

&lt;p&gt;Honesty, because this series is supposed to be useful.&lt;/p&gt;

&lt;p&gt;Jev was also approved for use inside ParkEase's API and job worker, for small judgment features such as sorting support tickets. That never shipped. The product has no Jev calls today. Its real contribution was to the &lt;em&gt;development&lt;/em&gt; workflow, not the app.&lt;/p&gt;

&lt;p&gt;And the router's value isn't that it picks better than I would. It's that it makes the choice explicit and cheap on every message, without me having to think about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;There's a whole category of decisions in AI-assisted development (which model, which skill, is this risky, is this done) that don't need a paragraph. They need a calibrated yes, no or pick. Putting a small judgment model in front of a big generative one is cheap, fast, and easy to keep honest, as long as it fails open and you respect its uncertainty.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; I counted every skill the AI actually invoked across 55 sessions. The top of the list wasn't what I expected.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ParkEase is a peer-to-peer parking marketplace for India, built solo with Claude Code.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Code: &lt;a href="https://github.com/Deonkar/parkease" rel="noopener noreferrer"&gt;https://github.com/Deonkar/parkease&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>devtools</category>
    </item>
    <item>
      <title>learnings.md: how I gave an AI with no memory 246 memories</title>
      <dc:creator>Onkar Deokate</dc:creator>
      <pubDate>Wed, 28 Oct 2026 04:30:00 +0000</pubDate>
      <link>https://dev.to/rakno/learningsmd-how-i-gave-an-ai-with-no-memory-246-memories-c2j</link>
      <guid>https://dev.to/rakno/learningsmd-how-i-gave-an-ai-with-no-memory-246-memories-c2j</guid>
      <description>&lt;p&gt;Here's a pattern that'll be familiar if you've coded with an AI agent for more than a week.&lt;/p&gt;

&lt;p&gt;Monday, it hits a strange error. It tries six things, finds the real fix, and you move on. Thursday, a new session, the same error. It tries the same six things in the same order.&lt;/p&gt;

&lt;p&gt;The model doesn't remember Monday. It never will. Every session starts from zero.&lt;/p&gt;

&lt;p&gt;So ParkEase has a file called &lt;code&gt;learnings.md&lt;/code&gt;, and the first instruction in the project file is to read it before every task. By the end of the build it had &lt;strong&gt;246 entries across 1,550 lines&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What goes in it
&lt;/h2&gt;

&lt;p&gt;Not documentation. Not "how the system works"; the code and the architecture records cover that. &lt;code&gt;learnings.md&lt;/code&gt; holds one specific kind of knowledge: &lt;strong&gt;non-obvious fixes that cost real time to find.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each entry is a heading that states the lesson, then the symptom, the cause and the fix. A few real ones:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;React version alignment is mandatory.&lt;/strong&gt; When workspace packages use different React versions, pnpm hoists the newer one to root. Packages depending on the older version get nested copies in their own &lt;code&gt;node_modules&lt;/code&gt;, causing the classic "two React instances" crash at runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Metro dev server degrades after repeated reloads, and looks exactly like a broken app.&lt;/strong&gt; A few navigations in, every route rendered an empty root with zero console errors.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That second one is worth its weight in gold. Without it, an AI sees a blank screen with no errors and starts "fixing" code that isn't broken.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;pip install --user&lt;/code&gt; for a dev tool broke three unrelated tools.&lt;/strong&gt; It put 47 packages into the shared user site-packages and shadowed the system copies of three libraries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A tool installer will rewrite your context files — diff before trusting it.&lt;/strong&gt; One installer wrote into the root &lt;code&gt;CLAUDE.md&lt;/code&gt;, created a &lt;em&gt;second&lt;/em&gt; context file, registered two hooks and edited &lt;code&gt;.gitattributes&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Read the headings alone and you get a map of every trap the project fell into.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rules that keep it useful
&lt;/h2&gt;

&lt;p&gt;A 1,550-line file could easily become noise. Four habits kept it sharp:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Title it as the lesson, not the topic.&lt;/strong&gt; "Metro" is a topic. "A Metro dev server degrades after repeated reloads, and looks exactly like a broken app" is a lesson; reading the heading alone is enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Write the symptom the next person will actually see.&lt;/strong&gt; "Empty root, zero console errors" is what you'd search for in the moment. Nobody searches for the cause; they don't know it yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Group by surface.&lt;/strong&gt; pnpm, TypeScript, NestJS, Expo, testing, migrations, the agent harness itself. The AI reads the sections that touch its task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Write it when it happens.&lt;/strong&gt; Not at the end of the task, when the details are gone. A hook enforces this (post 12): a complex task that never touched the learnings file isn't allowed to finish.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this beats "the AI will figure it out"
&lt;/h2&gt;

&lt;p&gt;It will figure it out, every time, at full price. A learnings entry turns a 40-minute debugging session into a 4-second read. Across a five-week build, that compounds into days.&lt;/p&gt;

&lt;p&gt;There's a second effect I didn't expect: the file made the AI more cautious in the &lt;em&gt;right&lt;/em&gt; places. An entry like "the graph answers what calls what, never what we're allowed to do" doesn't fix one bug; it stops a whole class of confident mistakes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start yours today
&lt;/h2&gt;

&lt;p&gt;You don't need a framework. A markdown file, one line in your agent's instruction file saying "read learnings.md before every task", and the discipline to add an entry every time something costs you more than fifteen minutes.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; Jev, a model that answers with typed judgments instead of prose, and how I put it in front of my own prompts to pick the model and the skill. Honestly, including what it didn't do.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ParkEase is a peer-to-peer parking marketplace for India, built solo with Claude Code.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Code: &lt;a href="https://github.com/Deonkar/parkease" rel="noopener noreferrer"&gt;https://github.com/Deonkar/parkease&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>devtools</category>
    </item>
    <item>
      <title>A defined workflow beat every clever prompt I wrote</title>
      <dc:creator>Onkar Deokate</dc:creator>
      <pubDate>Tue, 27 Oct 2026 04:30:00 +0000</pubDate>
      <link>https://dev.to/rakno/a-defined-workflow-beat-every-clever-prompt-i-wrote-kbc</link>
      <guid>https://dev.to/rakno/a-defined-workflow-beat-every-clever-prompt-i-wrote-kbc</guid>
      <description>&lt;p&gt;When I started ParkEase I spent a lot of energy on prompts. Long ones. "You are a senior engineer who…", step lists, examples, warnings in capitals.&lt;/p&gt;

&lt;p&gt;They helped for about one session.&lt;/p&gt;

&lt;p&gt;The thing that actually changed the quality of the AI's output wasn't a better prompt. It was a workflow the AI couldn't talk its way around: fixed phases, named gates, and a rule that skipping one had to be said out loud. Here's why that works better, and three times it caught something I'd have shipped.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why prompts don't scale
&lt;/h2&gt;

&lt;p&gt;A prompt is a request. The model weighs it against everything else in its context, including its own momentum toward "done". Late in a long session, "remember to run the security review" competes with a nearly finished feature and a model that would very much like to report success.&lt;/p&gt;

&lt;p&gt;A workflow is different in three ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's the same every time.&lt;/strong&gt; I don't have to remember to ask for tests; the build phase &lt;em&gt;is&lt;/em&gt; "tests first".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's specific at the moment it matters.&lt;/strong&gt; The verification instructions load when the agent is about to claim it's done, not 40,000 tokens earlier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It produces evidence, not assurances.&lt;/strong&gt; The ship phase is a table: each line has a command, an output, a pass. A prompt gets you "I've thoroughly tested this". A gate gets you the test output.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Three times a gate caught it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. The palette that failed accessibility.&lt;/strong&gt; The design gate made the AI render three visual directions before building screens; I picked one, called Wayfinder. It came with a vivid cobalt and a vivid green. A token test then computed every colour pair against white: the vivid cobalt measured 4.10:1, the green 3.77:1, both under the 4.5:1 minimum for normal text. Fourteen-pixel button labels would have failed. The fix was a two-tier palette: darker tones for anything with text on it, the vivid ones only for map pins and large fills that carry their own label. Now a palette change that breaks contrast fails a test before anyone sees it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The checkout page that could run another user's code.&lt;/strong&gt; Payments open Razorpay's checkout in a WebView. The first version built the checkout page by putting the booking details, including the space title, into a script block. Space titles are written by owners. Then a test tried the nasty case, a title containing &lt;code&gt;&amp;lt;/script&amp;gt;&amp;lt;script&amp;gt;…&lt;/code&gt;, and it broke out of the block. That's cross-user script injection, in the payment path. The fix wasn't better escaping; it was never putting another user's text into a document we build at all. The values now travel through the WebView's typed channel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The security control that protected nothing.&lt;/strong&gt; An earlier version of that same checkout file exported an origin allowlist, with a test proving it was all-Razorpay. It was never wired to the WebView. The security review pass caught it. The comment it left behind is the most useful sentence in the file:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A control that is defined, tested and unused is worse than no control: the test reads as assurance and there is none.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;None of these needed a smarter model. They needed a step where someone, or something, was required to look.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a workflow costs
&lt;/h2&gt;

&lt;p&gt;It isn't free. Every gate is tokens, and gates that dispatch separate reviewer agents are a lot of tokens. I learned that the expensive way (post 14). And it adds latency: a two-line fix still passes through verify.&lt;/p&gt;

&lt;p&gt;The trade is worth it for one reason. With AI, producing code is cheap and trusting it is expensive. A workflow moves effort from the cheap side to the expensive side.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; a 1,550-line file of mistakes. How &lt;code&gt;learnings.md&lt;/code&gt; gave an AI with no memory a memory, and the entries that saved the most time.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ParkEase is a peer-to-peer parking marketplace for India, built solo with Claude Code.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Code: &lt;a href="https://github.com/Deonkar/parkease" rel="noopener noreferrer"&gt;https://github.com/Deonkar/parkease&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>testing</category>
    </item>
    <item>
      <title>My AI over-engineered everything. So I gave it a ponytail.</title>
      <dc:creator>Onkar Deokate</dc:creator>
      <pubDate>Mon, 26 Oct 2026 04:30:00 +0000</pubDate>
      <link>https://dev.to/rakno/my-ai-over-engineered-everything-so-i-gave-it-a-ponytail-193c</link>
      <guid>https://dev.to/rakno/my-ai-over-engineered-everything-so-i-gave-it-a-ponytail-193c</guid>
      <description>&lt;p&gt;Ask an AI coding agent for a cache and you'll get a cache class. With a TTL. And an eviction policy. And an interface for the cache, in case you ever want a second cache. And a factory for the interface.&lt;/p&gt;

&lt;p&gt;AI doesn't get tired, so it doesn't get lazy, and good engineers are lazy in exactly the right way. Every extra abstraction it writes is code I have to read, test, and one day debug at 3am.&lt;/p&gt;

&lt;p&gt;So ParkEase has a skill called &lt;strong&gt;ponytail&lt;/strong&gt;. It turns the agent into a lazy senior developer who has seen every over-engineered codebase and been paged at 3am for one. It was the slash command I typed most often.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ladder
&lt;/h2&gt;

&lt;p&gt;Ponytail is a list of questions, asked in order. The agent stops at the first rung that works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Does this need to exist at all?&lt;/strong&gt; Speculative need means skip it, and say so in one line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is it already in this codebase?&lt;/strong&gt; Reuse the helper three files over.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Does the standard library do it?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does a native platform feature cover it?&lt;/strong&gt; A database constraint over app code; &lt;code&gt;&amp;lt;input type="date"&amp;gt;&lt;/code&gt; over a date-picker library.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Does an already-installed dependency solve it?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Can it be one line?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only then:&lt;/strong&gt; the minimum code that works.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There's also a matching rule: a bug fix goes at the root cause, in the shared function every caller routes through, not as a guard in the one caller the bug report named.&lt;/p&gt;

&lt;h2&gt;
  
  
  It isn't "cut corners"
&lt;/h2&gt;

&lt;p&gt;The part that makes it work is what ponytail &lt;em&gt;refuses&lt;/em&gt; to simplify: input validation at trust boundaries, error handling that prevents data loss, security, accessibility, anything explicitly asked for. And it never shortens the reading, only the solution. Understand the whole flow first, then be lazy.&lt;/p&gt;

&lt;p&gt;And when it does cut a real corner, it has to leave a note in the code saying where the ceiling is and what the upgrade looks like. ParkEase has these all over:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ponytail: one participants lookup per booking. A driver completes a handful a week; batch&lt;/span&gt;
&lt;span class="c1"&gt;// this if the window or the volume grows.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;ponytail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;one&lt;/span&gt; &lt;span class="nx"&gt;Razorpay&lt;/span&gt; &lt;span class="nx"&gt;call&lt;/span&gt; &lt;span class="nx"&gt;per&lt;/span&gt; &lt;span class="nx"&gt;unreconciled&lt;/span&gt; &lt;span class="nx"&gt;capture&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Switch&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;
 &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="s2"&gt;`transfers.all({ from, to })`&lt;/span&gt; &lt;span class="nx"&gt;when&lt;/span&gt; &lt;span class="nx"&gt;daily&lt;/span&gt; &lt;span class="nx"&gt;volume&lt;/span&gt; &lt;span class="nx"&gt;makes&lt;/span&gt; &lt;span class="nx"&gt;that&lt;/span&gt; &lt;span class="nx"&gt;slow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;ponytail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FOREGROUND&lt;/span&gt; &lt;span class="nx"&gt;ONLY&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;JS&lt;/span&gt; &lt;span class="nx"&gt;timers&lt;/span&gt; &lt;span class="nx"&gt;stop&lt;/span&gt; &lt;span class="nx"&gt;when&lt;/span&gt; &lt;span class="nx"&gt;Android&lt;/span&gt; &lt;span class="nx"&gt;backgrounds&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;so&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;washer&lt;/span&gt; &lt;span class="nx"&gt;who&lt;/span&gt; &lt;span class="nx"&gt;switches&lt;/span&gt; &lt;span class="nx"&gt;apps&lt;/span&gt; &lt;span class="nx"&gt;stops&lt;/span&gt; &lt;span class="nx"&gt;beating&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;falls&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt; &lt;span class="nx"&gt;after&lt;/span&gt;
 &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="s2"&gt;`WASH_ONLINE_HEARTBEAT_WINDOW_SECONDS`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nx"&gt;their&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="nx"&gt;still&lt;/span&gt; &lt;span class="nx"&gt;reads&lt;/span&gt;
 &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;online&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;The&lt;/span&gt; &lt;span class="nx"&gt;upgrade&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;an&lt;/span&gt; &lt;span class="s2"&gt;`expo-task-manager`&lt;/span&gt; &lt;span class="nx"&gt;background&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's not technical debt hidden in the code. It's technical debt with a label, a reason and a known exit. A companion command can harvest every &lt;code&gt;ponytail:&lt;/code&gt; note into a list later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it earned its keep
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Deployment.&lt;/strong&gt; The spec for the last task called for observability with an OpenTelemetry SDK, a Sentry SDK, a separate exporter setup. The API already exported OpenTelemetry traces. Sentry accepts OTLP. The lazy answer was zero new code: point the existing exporter's environment variable at Sentry's OTLP endpoint. That's the documented setup; the free demo hasn't needed it switched on yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The free demo.&lt;/strong&gt; The free hosting tier has no background workers. The over-built answer is a job-runner abstraction that works in-process or out. The ponytail answer was a 20-line launcher that starts the API and the worker as two processes in one container, and exits the container if either dies so the host restarts it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker.&lt;/strong&gt; The textbook production image uses a slimmed production-dependencies deploy. That needed the workspace packages to ship compiled output first, a refactor across the monorepo. Ponytail shipped the image running TypeScript directly, with a comment naming the ceiling and the exact upgrade path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it needed a leash
&lt;/h2&gt;

&lt;p&gt;Ponytail can be too lazy if you let it skip &lt;em&gt;understanding&lt;/em&gt;. A small diff in the wrong place isn't lazy; it's a second bug. The rule I leaned on: the ladder runs after you've traced the real flow end to end, never instead of it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; why a defined workflow beat clever prompting, and the three times a gate caught something I'd have shipped.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ParkEase is a peer-to-peer parking marketplace for India, built solo with Claude Code.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Code: &lt;a href="https://github.com/Deonkar/parkease" rel="noopener noreferrer"&gt;https://github.com/Deonkar/parkease&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>cleancode</category>
    </item>
    <item>
      <title>SKILL.md, CLAUDE.md, and why my repo has no AGENTS.md</title>
      <dc:creator>Onkar Deokate</dc:creator>
      <pubDate>Sun, 25 Oct 2026 04:30:00 +0000</pubDate>
      <link>https://dev.to/rakno/skillmd-claudemd-and-why-my-repo-has-no-agentsmd-3eji</link>
      <guid>https://dev.to/rakno/skillmd-claudemd-and-why-my-repo-has-no-agentsmd-3eji</guid>
      <description>&lt;p&gt;An AI coding agent starts every session knowing nothing about your project. No memory of yesterday, no idea that you banned floats for money, no clue the API runs on Fastify and not Express.&lt;/p&gt;

&lt;p&gt;Whatever it needs to know, it has to read. So the files it reads became the most important code in ParkEase that isn't code.&lt;/p&gt;

&lt;p&gt;There are three kinds.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. CLAUDE.md: the project's constitution
&lt;/h2&gt;

&lt;p&gt;Claude Code loads a file called &lt;code&gt;CLAUDE.md&lt;/code&gt; from the repo root into every session automatically. Mine is short on prose and long on rules. The core of it is a section called "The ten rules that matter most":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Money is integer paise, and the ledger is the truth.
2. Controllers authorise and delegate. Nothing more.
3. One transaction per write, with the outbox inside it.
4. Never call an external service inside a transaction.
5. The database enforces invariants the application cannot be trusted with.
...
10. Loading, error, and empty on every screen.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plus the stack (and what it's &lt;em&gt;not&lt;/em&gt;: "Drizzle ORM, NOT TypeORM", "NestJS on Fastify, NOT Express"), the code layout, a "Don't" list, and the commands.&lt;/p&gt;

&lt;p&gt;The "NOT" lines matter more than they look. A model's prior is the average of the internet. Ask for a NestJS validation layer without saying otherwise and you'll get class-validator, because that's what most tutorials use. One line in &lt;code&gt;CLAUDE.md&lt;/code&gt; moves the default.&lt;/p&gt;

&lt;p&gt;The file also sets the order of authority: the architecture decision records override the rules, which override the product spec. When a tool's advice contradicts a decision record, the decision wins, and the AI has to say so out loud.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. SKILL.md: instructions that load on demand
&lt;/h2&gt;

&lt;p&gt;You can't put everything in &lt;code&gt;CLAUDE.md&lt;/code&gt;; it would be enormous, and most of it irrelevant to any one task. Skills solve that.&lt;/p&gt;

&lt;p&gt;A skill is a folder with a &lt;code&gt;SKILL.md&lt;/code&gt; inside. The top of the file is a name and a description:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
name: flow
description: "Use when working on ParkEase — any of its 22 tasks, or any"
  feature, bugfix, refactor, review, UI or motion work...
---
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent sees only the descriptions until a task matches one; then it loads the whole file. So the description is effectively a trigger, and writing a good one ("use when…", naming the situations) matters more than the body.&lt;/p&gt;

&lt;p&gt;ParkEase used two layers: general skills installed for every project (&lt;code&gt;brainstorming&lt;/code&gt;, &lt;code&gt;test-driven-development&lt;/code&gt;, &lt;code&gt;systematic-debugging&lt;/code&gt;, &lt;code&gt;verification-before-completion&lt;/code&gt;, the design skills), and project-local skills in &lt;code&gt;.claude/skills/&lt;/code&gt; that only exist inside this repo, like a delivery gate and a curated set of stack-specific skills (Postgres, Redis, Docker, error handling). On top sat &lt;code&gt;flow&lt;/code&gt;, a routing skill that says which skills apply at which phase for which part of the stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Agent files: specialists with one lens
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;.claude/agents/&lt;/code&gt; holds subagent definitions: a security reviewer, a TypeScript reviewer, a database reviewer, a test-coverage analyzer, and my favourite, a "silent failure hunter" that only looks for swallowed errors, empty &lt;code&gt;catch&lt;/code&gt; blocks and lost stack traces. Each is a markdown file with a focused prompt and a restricted toolset.&lt;/p&gt;

&lt;p&gt;They turn "review the code" into several narrow reviews. More on how that went, including the bill, later in the series.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why there's no AGENTS.md
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; is becoming a cross-tool convention for exactly what &lt;code&gt;CLAUDE.md&lt;/code&gt; does. I considered adding one, and decided against it, in writing, so the AI wouldn't keep re-proposing it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; is the single source of truth for this project. A second context file carrying the same governance chain is how the two drift apart, and a partial copy is worse than none.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two files saying the same thing will eventually say two different things, and an agent that reads the stale one will follow it confidently. If you use several tools, pick one canonical file and point the others at it. Don't maintain two copies of your rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd tell you before you start
&lt;/h2&gt;

&lt;p&gt;Treat these files like code. Review changes to them. Delete rules that no longer apply. When the AI makes the same mistake twice, the fix belongs in one of these files, not in your next prompt. A prompt lasts one session; a rule lasts the project.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; the skill I typed by hand more than any other, and the one with the funniest name: ponytail, the lazy senior developer who deleted more code than he wrote.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ParkEase is a peer-to-peer parking marketplace for India, built solo with Claude Code.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Code: &lt;a href="https://github.com/Deonkar/parkease" rel="noopener noreferrer"&gt;https://github.com/Deonkar/parkease&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Seven phases, four gates: the process every AI-written change went through</title>
      <dc:creator>Onkar Deokate</dc:creator>
      <pubDate>Sat, 24 Oct 2026 04:30:00 +0000</pubDate>
      <link>https://dev.to/rakno/seven-phases-four-gates-the-process-every-ai-written-change-went-through-2fai</link>
      <guid>https://dev.to/rakno/seven-phases-four-gates-the-process-every-ai-written-change-went-through-2fai</guid>
      <description>&lt;p&gt;Yesterday I said process beat prompting. Here's the process.&lt;/p&gt;

&lt;p&gt;Every change to ParkEase, from a one-line fix to a whole admin panel, went through the same route. It lives in one file the AI loads at the start of any ParkEase work. I called it &lt;code&gt;flow&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The seven phases
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;What has to happen before moving on&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Orient&lt;/td&gt;
&lt;td&gt;Find the skills that apply before answering, asking or reading anything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Think&lt;/td&gt;
&lt;td&gt;Brainstorm the approach, then a "does this need to exist?" pass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1b&lt;/td&gt;
&lt;td&gt;Direction&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;UI only:&lt;/em&gt; render 2–3 options and let the human pick&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Plan&lt;/td&gt;
&lt;td&gt;A written plan, steps small enough to verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Build&lt;/td&gt;
&lt;td&gt;Tests first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Debug&lt;/td&gt;
&lt;td&gt;Root cause before any fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Review&lt;/td&gt;
&lt;td&gt;Not one review: a stack of them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5b&lt;/td&gt;
&lt;td&gt;Design audit&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;UI only:&lt;/em&gt; touch targets, hierarchy, type, motion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Verify&lt;/td&gt;
&lt;td&gt;Evidence before any "done" claim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Ship&lt;/td&gt;
&lt;td&gt;An 18-line checklist, every line done, before the PR opens&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each phase names the skill that runs it. "Think" is &lt;code&gt;brainstorming&lt;/code&gt;. "Build" is &lt;code&gt;test-driven-development&lt;/code&gt;. "Verify" is &lt;code&gt;verification-before-completion&lt;/code&gt;. A skill, as I'll explain in the next post, is a short instruction file the agent loads when the task matches. So each phase isn't a vague intention; it's specific instructions the AI follows at that moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four gates that never drop
&lt;/h2&gt;

&lt;p&gt;Phases can scale down. A typo fix doesn't need a brainstorm. Four things never drop, whatever the size:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Brainstorm before creative work.&lt;/strong&gt; The task file says &lt;em&gt;what&lt;/em&gt;. Brainstorming settles &lt;em&gt;how&lt;/em&gt;, and surfaces what nobody wrote down.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tests before implementation code.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A design gate for anything that changes how something looks, feels or moves.&lt;/strong&gt; Code review can't tell you a screen looks templated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification before any "done", "fixed" or "passing".&lt;/strong&gt; Run the command, read the output, then make the claim.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The 18-line pre-PR gate
&lt;/h2&gt;

&lt;p&gt;Phase 7 is where most AI workflows quietly fall apart, because the agent is eager to finish. So the last phase is a literal checklist: backend review, frontend review, HTTP-level API tests, frontend tests for the new code, security review, the UI audit, migration review, the four mandatory integration tests, lint and typecheck, &lt;code&gt;pnpm audit&lt;/code&gt;, a secret scan, and updates to the learnings, test-case and decision files.&lt;/p&gt;

&lt;p&gt;It's reported as a table with evidence per line. "I'll note it in the PR body" doesn't count. A gap written into a PR description is a gap nobody re-reads.&lt;/p&gt;

&lt;p&gt;Two lines are there because skipping them already let a real defect through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API testing means HTTP-level.&lt;/strong&gt; Tests that call a command directly can't see the interceptor, the status code or the error envelope.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend testing means the new frontend code.&lt;/strong&gt; Six new screens with zero new tests is a failed gate, not a style choice.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The rule that stopped it becoming ceremony
&lt;/h2&gt;

&lt;p&gt;Any process this size decays into box-ticking. One line in my instructions does more than any phase:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When skipping a phase, say which and why. Silent skipping is how this decays into nothing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The AI is allowed to skip. It isn't allowed to skip quietly. "Skipped the design gate: no UI changed" is fine. A missing phase with no sentence about it is a bug in the process, and I treated it like one.&lt;/p&gt;

&lt;p&gt;The other half came later, the hard way: process costs tokens. At one point the workflow told the AI to send a separate reviewer agent per lens per task, and one task burned most of a week's usage limit. The fix wasn't dropping review. It was doing it inline and dispatching specialists only when a diff deserved it. That story gets its own post.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; the files that make all of this stick: &lt;code&gt;SKILL.md&lt;/code&gt;, &lt;code&gt;CLAUDE.md&lt;/code&gt;, and why ParkEase deliberately has no &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ParkEase is a peer-to-peer parking marketplace for India, built solo with Claude Code.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Code: &lt;a href="https://github.com/Deonkar/parkease" rel="noopener noreferrer"&gt;https://github.com/Deonkar/parkease&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>I built a parking marketplace in five weeks. The AI wrote most of the code. I did the other part.</title>
      <dc:creator>Onkar Deokate</dc:creator>
      <pubDate>Fri, 23 Oct 2026 04:30:00 +0000</pubDate>
      <link>https://dev.to/rakno/i-built-a-parking-marketplace-in-five-weeks-the-ai-wrote-most-of-the-code-i-did-the-other-part-3io</link>
      <guid>https://dev.to/rakno/i-built-a-parking-marketplace-in-five-weeks-the-ai-wrote-most-of-the-code-i-did-the-other-part-3io</guid>
      <description>&lt;p&gt;For the last eleven posts I showed you what ParkEase does: a peer-to-peer parking marketplace for India, with drivers, owners, valets, car washers and an admin panel, all live as a demo.&lt;/p&gt;

&lt;p&gt;I left something out. Almost every line of it was written by an AI.&lt;/p&gt;

&lt;p&gt;Not autocomplete. Not "it suggested a function and I tweaked it". An AI agent, Claude Code, opened files, wrote features, ran the tests, read the failures, fixed them, and opened the pull requests. Five weeks, 29 merged PRs, roughly 86,000 lines of TypeScript, 3,246 unit tests and 1,080 integration tests against a real Postgres.&lt;/p&gt;

&lt;p&gt;So the honest question is: what did &lt;em&gt;I&lt;/em&gt; do?&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that isn't typing
&lt;/h2&gt;

&lt;p&gt;Here's how the work actually split.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I decided what to build, and what not to.&lt;/strong&gt; ParkEase has 34 architecture decision records. Money is integer paise in a double-entry ledger. Double booking is refused by the database, not by application code. The app never computes a price. Every one of those is a decision a human made and wrote down, because an AI will happily make a different, reasonable-sounding decision every session if you let it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I picked between options, not from a blank page.&lt;/strong&gt; Before any significant screen was built, the AI had to render two or three design directions and show them to me. ParkEase's look, "Wayfinder", was chosen from three rendered options. I'm not a designer. I am very good at saying "that one".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I wrote the rules the AI works under.&lt;/strong&gt; A project file the agent reads at the start of every session: the stack, the ten rules that matter most, what's forbidden ("don't use floats for money", "don't call external APIs inside database transactions"), and where the deeper documents live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I caught it when it lied.&lt;/strong&gt; Not maliciously. But an AI that has written a payment path "security-consciously" will describe the security properties of its own code and call that a security review. It isn't one. More on that in a later post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I kept the receipts.&lt;/strong&gt; Every hard-won fix went into a file the AI reads before every task. By the end that file had 246 entries.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that is typing
&lt;/h2&gt;

&lt;p&gt;The AI did the volume: scaffolding a monorepo with five apps and six packages, writing NestJS commands and Drizzle schemas, Expo screens, Zod contracts, migrations, tests, Dockerfiles, CI workflows. It debugged its own failures, usually well, sometimes by trying random things until I stopped it.&lt;/p&gt;

&lt;p&gt;And it was fast in a way that changes what "a side project" means. Things I'd normally cut for time, like an admin panel with an audit log nobody can edit, a surge heat map, or load tests with 100 drivers racing for 10 slots, all fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What surprised me
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Speed wasn't the bottleneck. Trust was.&lt;/strong&gt; The AI could produce a feature in an hour. Knowing whether that feature was &lt;em&gt;right&lt;/em&gt; took the rest of the day. Most of what I built around the AI, the workflow, the gates, the learnings file, exists to make its output trustworthy without me re-reading every line.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It forgets everything, every session.&lt;/strong&gt; The model doesn't remember last Tuesday's mistake. The project has to. That turned out to be the most important design problem of the whole build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Process beat prompting.&lt;/strong&gt; Clever prompts helped a little. A fixed, enforced workflow helped enormously.&lt;/p&gt;

&lt;p&gt;That's what this series is about. Not "AI wrote my app, wow", but the machinery that made AI-written code something I'd put my name on: the process, the instruction files, the skills, the learnings loop, the tests, and the places it all went wrong.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; the seven-phase workflow every change went through, from "think" to "ship", and the one rule that stopped it from turning into ceremony.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ParkEase is a peer-to-peer parking marketplace for India, built solo with Claude Code.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Code: &lt;a href="https://github.com/Deonkar/parkease" rel="noopener noreferrer"&gt;https://github.com/Deonkar/parkease&lt;/a&gt; · Demo: &lt;a href="https://parkease-app-six.vercel.app" rel="noopener noreferrer"&gt;https://parkease-app-six.vercel.app&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>ParkEase in 77 seconds: one app, five roles</title>
      <dc:creator>Onkar Deokate</dc:creator>
      <pubDate>Thu, 22 Oct 2026 04:30:00 +0000</pubDate>
      <link>https://dev.to/rakno/parkease-in-77-seconds-one-app-five-roles-4po4</link>
      <guid>https://dev.to/rakno/parkease-in-77-seconds-one-app-five-roles-4po4</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1ig0p4ht8jfq3ejcrq0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1ig0p4ht8jfq3ejcrq0.gif" alt="The ParkEase showcase: the driver map, filters and booking, cut on the beat." width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/NToffmP6dCQ" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Eleven posts in, I've shown ParkEase one role at a time, and yesterday one bug at a time. Today, none of that. Just the whole thing, end to end, in a little over a minute.&lt;/p&gt;

&lt;p&gt;ParkEase is a peer-to-peer parking marketplace for India. Someone has an empty driveway from 9 to 6; someone else is circling the block looking for a place to stop. ParkEase puts them on the same map. Valets and car washers work on top of the bookings.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five roles
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Drivers&lt;/strong&gt; see which driveways near them have a slot free right now, filter for a car or a bike, see the price before they book, hold the slot while they pay, and show a QR code at the gate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Owners&lt;/strong&gt; list a space in five steps, set their own hourly price, scan drivers in when they arrive, and watch the earnings come in line by line: base price, ParkEase fee, what they earned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Valets&lt;/strong&gt; take jobs near them, photograph the car at the bay as proof, and get paid per trip.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Car washers&lt;/strong&gt; set their own menu and prices, go online to take jobs, record before and after photos, and see every wash on one statement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Admins&lt;/strong&gt; run it all from one panel: every rupee in one ledger, approvals for new spaces and partners, a surge heat map, and an audit log nobody can edit.&lt;/p&gt;

&lt;p&gt;And the &lt;strong&gt;website&lt;/strong&gt; sits in front of all of it, quoting prices from the same code the app charges with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every screen is real
&lt;/h2&gt;

&lt;p&gt;Nothing in the video is a mockup. The app and admin screens are the real software running on sample data; the website is the live site. If you'd rather click than watch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App: &lt;a href="https://parkease-app-six.vercel.app" rel="noopener noreferrer"&gt;https://parkease-app-six.vercel.app&lt;/a&gt; (tap a role, then any 6-digit code)&lt;/li&gt;
&lt;li&gt;Admin: &lt;a href="https://parkease-admin.vercel.app" rel="noopener noreferrer"&gt;https://parkease-admin.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Website: &lt;a href="https://parkease-web-navy.vercel.app" rel="noopener noreferrer"&gt;https://parkease-web-navy.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a demo: payments, SMS and photo uploads are switched off, so nothing real can be charged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Behind the minute
&lt;/h2&gt;

&lt;p&gt;The parts that took the longest are the parts you can't see: overlapping bookings refused by the database itself, money kept as integer paise in a double-entry ledger, every job handler safe to retry, every boundary validated against one shared schema. Earlier posts in this series cover most of those. The code is all public.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; the demo is live; a real launch isn't yet. What's left between the two, and why most of it isn't code.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ParkEase is a peer-to-peer parking marketplace for India, built solo.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Code: &lt;a href="https://github.com/Deonkar/parkease" rel="noopener noreferrer"&gt;https://github.com/Deonkar/parkease&lt;/a&gt; · Music: ende.app (CC BY 4.0)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>reactnative</category>
      <category>android</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
