<?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: osarenren isorae</title>
    <description>The latest articles on DEV Community by osarenren isorae (@osarenren_isorae_39ea1710).</description>
    <link>https://dev.to/osarenren_isorae_39ea1710</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3497879%2F60b06811-91c3-4cd7-b881-0f269ed2824b.png</url>
      <title>DEV Community: osarenren isorae</title>
      <link>https://dev.to/osarenren_isorae_39ea1710</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/osarenren_isorae_39ea1710"/>
    <language>en</language>
    <item>
      <title>From Spec To Vibe: How I Built An Agentic Prop Firm With Kiro (And What It Taught Me About AI Development)</title>
      <dc:creator>osarenren isorae</dc:creator>
      <pubDate>Fri, 12 Sep 2025 15:44:22 +0000</pubDate>
      <link>https://dev.to/osarenren_isorae_39ea1710/from-spec-to-vibe-how-i-built-an-agentic-prop-firm-with-kiro-and-what-it-taught-me-about-ai-1n2o</link>
      <guid>https://dev.to/osarenren_isorae_39ea1710/from-spec-to-vibe-how-i-built-an-agentic-prop-firm-with-kiro-and-what-it-taught-me-about-ai-1n2o</guid>
      <description>&lt;p&gt;If AI is going to be truly useful for builders, it needs to do more than complete tasks. It should nudge, anticipate, and sometimes argue. My ideal agent would interrupt me at 2 AM and say, “Hey, you’ve never written about Meta AI—are you ignoring them or just busy? I drafted a post—approve or rewrite?” I want systems that think with me, not just for me.&lt;/p&gt;

&lt;p&gt;This post is the story of building a real product under real constraints—Aurum Prop Firm, an agentic trading platform—using Kiro as my primary co‑builder. It’s also a reflection on the tradeoffs: when spec-driven development works, when it fails, why vibe matters, and how to move fast without letting your skills and taste atrophy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Built&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A premium landing page and waitlist with motion, micro‑interactions, and a “feels like a product” sheen.&lt;/li&gt;
&lt;li&gt;A serverless waitlist API backed by Neon (Postgres), with idempotent table creation, validation, and simple analytics.&lt;/li&gt;
&lt;li&gt;OANDA integration via a thin HTTPS client: pricing, accounts, history, and order placement (no SDK, no dependencies).&lt;/li&gt;
&lt;li&gt;A signed‑in dashboard (NextAuth credentials) with:&lt;/li&gt;
&lt;li&gt;Take‑Trade flow (account → pair → direction) with live bid/ask, spreads, and journaling.&lt;/li&gt;
&lt;li&gt;Spirit Journal for reasoning, with TradingView embedded.&lt;/li&gt;
&lt;li&gt;Account history with live P&amp;amp;L and position summaries.&lt;/li&gt;
&lt;li&gt;Payments via Korapay:

&lt;ul&gt;
&lt;li&gt;USD→NGN conversion at initialization, webhook reconciliation, and automatic challenge‑account provisioning on success.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Admin panel for waitlist, users, OANDA account attachment visibility, and CSV export.&lt;/li&gt;

&lt;li&gt;Utility scripts for DB setup/cleanup and OANDA diagnostics to iterate fast locally.&lt;/li&gt;

&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Tech used: Next.js (App Router), Neon (serverless Postgres), NextAuth (credentials), OANDA (HTTP API), Korapay (payments), TradingView widget, and a bunch of small Node scripts to keep me honest.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;My Kiro Workflow (Vibe + Spec, in parallel)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I started with spec-only. It didn’t work. The UI was flat and lifeless—technically correct, but emotionally wrong. Big lesson: “correct” is not the same as “compelling.”&lt;/p&gt;

&lt;p&gt;The switch flipped when I realized I could vibe and spec at the same time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vibe: “Make a cinematic landing with depth and motion—animated chart, scroll-in features, sticky nav, and tasteful gold accents.” Kiro produced a polished front page, complete with animated hero and micro‑interactions. I iterated with follow-ups like “reduce friction on load,” “tighten type scale,” “add trust stats.”&lt;/li&gt;
&lt;li&gt;Spec: “Create POST /api/waitlist with Neon; validate email; idempotent table creation; capture IP and UA; return queue position.” &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Kiro implemented the endpoint and the DB helper I needed, and we tested through edge cases together.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For integrations, I did what I always do: I go to the vendor docs, copy them into a .txt file in my repo, and tell Kiro to read and build. That’s how the OANDA HTTPS client emerged—no heavy SDK, just a well-factored module with good error handling. Same for Korapay: init route with USD→NGN conversion, webhook reconciler, and a provisioning flow that creates a challenge account with derived targets/drawdown once payment clears.&lt;/p&gt;

&lt;p&gt;I didn’t use Kiro hooks. I started late and didn’t want a new abstraction layer. Instead, I leaned on plain API&lt;br&gt;
  routes, scripts, and conversations. It kept my loop fast and predictable: I’d paste docs, say “implement safely&lt;br&gt;
  with good errors,” and then vibe the UX on top. Simple and effective.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What The Product Actually Does&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Landing + Waitlist: Premium hero with animated chart motif, scroll‑in features, and a smooth CTA. Submissions
go to the waitlist table with IP/UA capture, duplication checks, and a “position in queue” response. Nice
touches, no heavy backend complexity.&lt;/li&gt;
&lt;li&gt;Trading Dashboard:

&lt;ul&gt;
&lt;li&gt;Accounts populate via DB (provisioned through payments) and OANDA linkage. Active accounts are visually
distinctive and selectable.&lt;/li&gt;
&lt;li&gt;Live pricing polls every few seconds for majors, pausing on weekends. It maps instruments cleanly
(EUR_USD ↔ EUR/USD), shows spreads, and avoids stale state.&lt;/li&gt;
&lt;li&gt;Take-Trade flow enforces discipline:&lt;/li&gt;
&lt;li&gt;Before placing an order, you must journal a reason (modal), which is then saved as a first‑class
artifact.&lt;/li&gt;
&lt;li&gt;Risk sizing is server-side (0.25%) with pip-aware logic, including JPY math. SL/TP is auto-computed by
plan (Standard 1:3, Pro 1:6).&lt;/li&gt;
&lt;li&gt;There’s a one‑trade‑per‑session rule (NY/London/Tokyo/Sydney UTC windows). When it trips, you get clear
guidance and a timestamp of the prior trade.&lt;/li&gt;
&lt;li&gt;Orders are validated against live OANDA pricing; client-supplied prices are ignored. On OANDA rejection
(FIFO/opposing positions/margin), the error reason is surfaced unmodified.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;History shows trades with formatted prices, units, and live unrealized P&amp;amp;L for open positions.&lt;/li&gt;

&lt;li&gt;Payments + Provisioning:

&lt;ul&gt;
&lt;li&gt;Initialization uses Korapay’s rate endpoint to convert USD to NGN (with a fallback rate if needed).&lt;/li&gt;
&lt;li&gt;Webhook merges payload with stored order metadata and auto‑creates a “challenge” trading account with
derived profit targets and max drawdown, based on plan and size.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Admin:

&lt;ul&gt;
&lt;li&gt;Waitlist viewer, CSV export, user creation, OANDA account attachment visibility, and provisioning review.
Enough to run operations without SSHing into a database.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where Spec Helped (And Where It Didn’t)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spec excelled in all the backend boundaries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Waitlist: input validation, idempotent table creation, predictable response shape.&lt;/li&gt;
&lt;li&gt;OANDA: clean error mapping (401/403/503), ID normalization, “no price, no trade” logic.&lt;/li&gt;
&lt;li&gt;Trading: risk sizing, pip logic, plan-based SL/TP, session windows.&lt;/li&gt;
&lt;li&gt;Payments: USD→NGN conversion details, webhook reconciliation, and deterministic provisioning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Spec didn’t give me a good UI. My first spec‑only pass looked like an admin back-office. Correct, but not&lt;br&gt;
  convincing. The moment I paired spec with vibe, velocity and quality snapped together. Spec made edge cases and&lt;br&gt;
  contracts reliable; vibe made it feel like something I want to use. That combo gave me a product that’s both&lt;br&gt;
  sturdy and expressive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Most Impressive Thing Kiro Generated&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The trade pipeline. It’s end-to-end “prop rules, but real”:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live mid‑price resolution with sensible fallbacks and crisp logging. If there’s no price, no trade. If it’s
the weekend, wait. If OANDA rejects the order, surface the exact reason (not a vague interpretation).&lt;/li&gt;
&lt;li&gt;Risk sizing at 0.25% with pip‑aware math and JPY conversions handled correctly.&lt;/li&gt;
&lt;li&gt;SL/TP rules computed server‑side by plan and instrument with correct decimal precision (7/21 pips for
Standard, 7/42 pips for Pro).&lt;/li&gt;
&lt;li&gt;One‑trade‑per‑session, using real UTC session windows for NY, London, Tokyo, Sydney, with helpful messaging
and the prior trade’s timestamp.&lt;/li&gt;
&lt;li&gt;Persistence that respects the story:

&lt;ul&gt;
&lt;li&gt;Order record with OANDA/ sizing metadata.&lt;/li&gt;
&lt;li&gt;Trade record after a fill, with entry and SL/TP locked in.&lt;/li&gt;
&lt;li&gt;A journal entry that stores your “reason” as a first‑class artifact (this is big for discipline).&lt;/li&gt;
&lt;li&gt;A follow‑up stats update that keeps the account state honest.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Runner‑up: the Korapay flow. It turns an API → receipt → account provisioning story into a clean, auditable&lt;br&gt;
  path. The init route handles conversion and references. The webhook carefully merges payload with stored&lt;br&gt;
  metadata, updates status, and creates a configured “challenge” account with derived parameters. It’s the kind&lt;br&gt;
  of plumbing that makes your business real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I Skipped Kiro Hooks (And What I’d Automate Later)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I didn’t use Kiro hooks for this project. Starting late, I optimized for predictability and speed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No hook DSL to learn.&lt;/li&gt;
&lt;li&gt;Fewer integration seams to debug.&lt;/li&gt;
&lt;li&gt;Scripts and API routes I could run and verify immediately.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I’d consider next time:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hooks for periodic health checks (OANDA connectivity, DB migrations).&lt;/li&gt;
&lt;li&gt;Hooks to enforce CI‑style validations (route contracts unchanged, environment guards).&lt;/li&gt;
&lt;li&gt;Hooks for doc ingestion pipelines (e.g., “auto-reindex vendor docs and lint API clients against them”).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short: hooks could help, but for a sprint, fewer layers meant fewer surprises.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Hidden Cost Of AI Development (And How I Avoided It Here)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a previous essay, I called out the real cost of AI‑augmented development: it can make us faster while&lt;br&gt;
  quietly dulling our instincts. The “spidey sense” you earn from wrestling with systems—debugging deep,&lt;br&gt;
  untangling edge cases—can atrophy if you never have to sit with a problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two ideas helped me keep that edge:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interruption as education. I design my workflows so I can pause the machine. Whether it’s a long-running
generation, a loop, or a pipeline, I want to see intermediate state. That’s how I catch wrong assumptions (mine
or the AI’s).&lt;/li&gt;
&lt;li&gt;Traceable boundaries. Spec the contracts and keep logs that matter. When something’s off, these give me the
x‑ray I need to reason instead of flailing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agentic frameworks (LangGraph, CrewAI) move in the right direction—visible, interruptible flows. But even the&lt;br&gt;
  best tool‑calling model will get environment assumptions wrong. The answer isn’t blind trust; it’s interactive,&lt;br&gt;
  inspectable systems you can steer in-flight.&lt;/p&gt;

&lt;p&gt;Also: token accounting is still a mess in multi‑agent builds. If you’re trying to understand cost dynamics,&lt;br&gt;
  you’ll likely be instrumenting your own traces. Plan for that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I’d Do Next&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explore Kiro hooks for scheduled health checks, schema drift detection, and contract tests for critical APIs.&lt;/li&gt;
&lt;li&gt;Add a lightweight observability panel to track pricing health, order latencies, and payment → provisioning
funnels.&lt;/li&gt;
&lt;li&gt;Evolve Spirit Journal into a true coaching agent that synthesizes your trade reasons with market context and
suggests improvements over time.&lt;/li&gt;
&lt;li&gt;Harden test coverage around the most sensitive flows (payments, order placement, and OANDA error handling).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Closing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I used Kiro as a force multiplier, but I didn’t outsource taste or judgment. Spec made the platform reliable.&lt;br&gt;
  Vibe made it compelling. Scripts and routes kept me honest, fast, and focused. And I skipped hooks—not forever,&lt;br&gt;
  but for this sprint—because I wanted fewer moving parts while shipping something ambitious on a deadline.&lt;/p&gt;

&lt;p&gt;If you’re building with AI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pair spec with vibe. One without the other is either brittle or bland.&lt;/li&gt;
&lt;li&gt;Keep the system interruptible and observable.&lt;/li&gt;
&lt;li&gt;Use the AI to move faster, but insist on understanding why things work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I love how you learn—and I want our tools to love that, too.&lt;/p&gt;

</description>
      <category>kiro</category>
      <category>ai</category>
      <category>nextjs</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
