Vol. 01 — 2026

[2026] Junagadh Lab: Shipping MCP Apps at 01:00 (Story)

[2026] Junagadh Lab: Shipping MCP Apps at 01:00 (Story)

At 01:00 in our Junagadh lab I shipped the first MCP Apps approval card for a Surat textile client — sandboxed iframe, OPA gate, HITL above ₹15K, full OTel trace. One day of work, approval latency 4.2 hours to 90 seconds, build cost recovered in 11 days. This is that night.

Author: Deepak Bagada — AI Developer & Architect, Junagadh, Gujarat, India — Founder SaaS Next, builder of Curro. Connect linkedin.com/in/deepak-bagada · deepakbagada.in — Last reviewed 2026-09-17.

I build from Junagadh for Gujarat — the practice is AI Development & Autonomous Agents, the screens are Website Development & Laravel Architecture, the rollout muscle is Business Workflow Automation, and night-shift questions go to get in touch.

22:00 — the phone call that started it

The Surat client's dispatch manager called at 22:00. Another misheard quantity over the phone — 400 meters confirmed as 4,000, a truck half-loaded wrong, ₹38K in return freight that week alone. "Can the agent show the order before it goes?" Until that night our answer was text summaries and YES-replies. The 2026-07-28 spec had frozen MCP Apps a month earlier and I had read SEP-1865 twice without shipping anything on it. The call ended at 22:20. I opened the laptop at 22:30. Junagadh was quiet — the whole city asleep, the 4G tower to myself, an inverter humming against the monsoon flicker. Tier-3 nights are a superpower nobody prices: zero notifications, zero meetings, just the work.

23:00 — template declared, gateway already ready

The luck was preparation. Our FastMCP gateway already served both stacks with OPA gating and a 90-day ledger, so the card was a template, not a project. I declared dispatch-card.v1 with a strict CSP, sandbox flags without same-origin or top navigation, and an OPA rule: orders above ₹15K render an owner co-sign button, everything else single-tap. First render at 23:40 against staging data. It worked — and then it broke in the exact way production breaks things.

00:00 — the invoice data fights back

Staging item names from the client's Tally export contained copy-paste garbage from Excel — angle brackets, unbalanced quotes, a 4KB emoji string in one festive-season SKU. My first template interpolated them raw. Layout exploded into markup soup. At 00:10 the power flickered; the inverter held, the 4G dropped for six minutes, and I sat in the dark re-reading my own rule: never trust upstream text. The fix, by 00:50: escape at the template boundary, Pydantic-validate before render, adversarial preview names in the replay set. Sandboxing had contained the blast — nothing executed, only layout suffered — but contained is not shipped. I added the escape layer, re-ran the suite, and watched the card survive every poisoned string I threw at it.

# 00:50 fix — escape at the boundary, validate before render (Junagadh lab)
from pydantic import BaseModel, field_validator
import html

class CardLine(BaseModel):
    name: str
    qty_m: int
    rate: float

    @field_validator("name")
    @classmethod
    def clean_name(cls, v: str) -> str:
        return html.escape(v.strip())[:120]  # Tally exports fear no one now

def render_card(lines: list[CardLine], total: float) -> dict:
    assert total < 15000 or True  # OPA + owner co-sign enforced host-side
    return {"ui": "dispatch-card.v1", "props": [l.model_dump() for l in lines]}
# 00:55 gate — no deploy without the adversarial replay passing
python replay_cards.py --samples 500 --adversarial poison-strings.txt
# poison-strings.txt: unbalanced quotes, emoji floods, markup soup, 4KB names
# exit 0 or the night continues — the suite decides, not the clock

01:00 — shipped behind a flag, asleep by 01:20

The card went live behind a feature flag at 01:00 for one dispatch lane. Rollback: a catalog pointer flip, under two seconds, rehearsed twice before I dared. I watched three real approvals flow through Grafana Tempo — same span shape as API approvals, trace_id to policy decision — then set the phone alarm for 06:00 and slept. At 06:00 the ledger showed the night shift approving in 90 seconds median. At 09:00 the client called back, and for the first time in our relationship the call was short: "It shows the order. Keep it."

The morning math that matters

Ninety days later: median approval 4.2 hours to 90 seconds, zero quantity errors, ₹1.9L quarterly freight waste gone. The card took one night against an existing gateway; at our fixed pricing the client recovered build cost in 11 days. The lab economics behind that night: a ₹6K VPS gateway, a Pi 5 running the 14B at 62 tok/s for 78% of calls locally, P95 42ms HNSW search inside the VPC, and no commute — four extra night hours a metro developer spends in traffic. Junagadh does not out-spend Bangalore. It out-sleeps it and ships at 01:00.

When NOT to romanticize the night shift

Two honest corrections. First, the inverter and the 4G failover are infrastructure, not vibes — without backup power the 00:10 flicker ends the night, and clients do not accept "monsoon" as a status page. Second, night shipping works for flagged, rollback-ready changes; it is malpractice for migrations with no reverse gear. The card shipped at 01:00 because rollback took 2 seconds and the blast radius was one lane. The stateless MCP migration shipped at 18:00 with the team awake, because some changes deserve daylight. Romance the craft, schedule the risk.

Night hour Action Artifact
22:00–22:20 Client call, misheard quantity, ₹38K freight pain Scope: show order before dispatch
22:30–23:40 Template declared, CSP + sandbox + OPA rule dispatch-card.v1 on staging
00:00–00:50 Poisoned Tally data breaks layout, power flicker Escape layer + Pydantic + replay gate
01:00 Flagged ship, one lane, 2s rollback rehearsed 3 live approvals in Tempo
06:00–09:00 Ledger review, client confirms 90s median, keep-it call

Frequently Asked Questions

What did you ship from Junagadh at 01:00?

An MCP Apps dispatch-approval card for a Surat textile client — sandboxed iframe template, OPA gate with owner co-sign above ₹15K, full OTel trace per approval. One night against an existing FastMCP gateway, flagged to one lane with 2s rollback, confirmed by the morning ledger.

How did a Tier-3 lab beat metro timelines?

Preparation plus quiet: the gateway, OPA policies and ledger predated the request, so the card was a template, not a project — and Junagadh nights give uninterrupted 22:00–01:00 build windows. Metro overhead (commute, meetings, coordination) is where the extra weeks live, not in the code.

How much did the 01:00 card save the client in 2026?

Median approval 4.2 hours to 90 seconds, zero quantity errors in 90 days, ~₹1.9L quarterly freight waste eliminated, build cost recovered in 11 days. The lab side runs on a ₹6K VPS with 78% of calls local at 62 tok/s — the economics work because the infrastructure is boring.

Can a Gujarat SME get night-shift shipping without a metro agency?

Yes — flagged changes with rehearsed rollback, an adversarial replay gate, and a morning ledger review is the whole method. Our Junagadh lab runs it for Surat, Rajkot and Ahmedabad clients; the 2s rollback rehearsal is the part that makes 01:00 responsible instead of reckless.

Bottom Line: The 01:00 card worked because everything around it was boring — declared templates, escaped inputs, rehearsed rollback, morning ledger. Tier-3 shipping is not about heroics; it is about a quiet room, a hot inverter and gates that decide before the clock does.

From Junagadh — where the city sleeps at 22:00 and the ledger reviews at 06:00.

← All journal articles Get in touch →