Build log

What we shipped, when, what it cost.

Append-only. Three buckets — In production, In development, Roadmap. Never two.

2026-06-03

In production

Aigocy-grade premium redesign + visual sweep

Problem

The Brutalist-Swiss design we shipped earlier read as 'amateurish' — true-black-on-near-white with sharp corners + mono-only headings dropped the visual register below what an AI studio site needs. We had over-rotated from 'AI cliché' all the way to 'academic minimal' in one swing.

Outcome

Warm silver gradient body (#f1efed) with a radial orange corner-bleed. Floating glass-pill nav with backdrop blur. Full pill radii on CTAs / eyebrows / chips, 24px card / 32px mega-card radii. Soft shadow scale + premium dark-card variant for CTA + customer-zero sections. Inter Variable for display + numerals (was IBM Plex Mono); mono kept for micro-labels / mono-runs only. Same allowed-stats list, same three-bucket discipline — what changed is the surface, not the claims.

What we learned

Two opposite failure modes, same root cause: each pass picked a single design language ('dark-bento' then 'pure-brutalist') and let it carry every surface. The premium feel that finally landed isn't one language — it's three (warm-pearl backgrounds, dark mega-card islands, mono micro-print) used where each serves. Also caught two backstage bugs en route: inline `clamp(1.5rem,1.2rem+1.4vw,2.1rem)` was being silently dropped (CSS operators need whitespace, otherwise the value is invalid and the class default wins — that's how the Problem section was rendering at 64px instead of 33px); and a Get-Content/Set-Content round-trip mojibaked every `→ · —` in six files until reversed with explicit UTF-8↔CP1252 decoding.

2026-06-03

In production

Brutalist-Swiss redesign (superseded same day by Aigocy ship above)

Problem

The site looked like generic AI-startup slop — dark, gradient, glass, bento, cyan-violet. The same cliché every Indian SMB SaaS ships.

Outcome

Stripped to true black on near-white, single burnt-orange accent, IBM Plex Mono carrying every stat. Three-bucket status badge system (In production / In development / Roadmap) live across 15 pages. 0 gradients, 0 glow, 0 glass.

What we learned

The synthesis from 200 agents (100 discover + 50 verify + 50 adversarial) converged on the same anti-cliché direction. Built it in two passes — copy first, design tokens second — because honest copy on a glossy design is worse than slow copy on an honest one. Kept on the log even though it shipped for hours, not weeks, because that's what an honest build log does.

2026-06-03

In production

Phase 1 honesty copy fixes across all 13 pages

Problem

The site claimed `10,454 contacts`, `6 hostnames migrated`, `eliminated ~50% of API failures`, `impossible to alter`, `never locked in`, `Rolling out` — every one of those tripped the honesty audit.

Outcome

Stripped to allowed-stats only. `tamper-evident` not `tamper-proof`. `HTTP-503 failure rate dropped from ~50% to ~0` not `eliminated`. `2-of-5 backup layers live` not `2 active backup layers`. Three buckets, not two, on every status surface.

What we learned

If the agents that wrote it can't tell `eliminated ~50%` from `~50% → ~0`, neither can a reader. Linted, not vibed.

2026-05-23

In production

200-agent redesign program → FINAL.md

Problem

Founder shipped feedback: 'the current website looks like AI slop'. The site had been built rigorously but converged on the AI cliché regardless.

Outcome

Ran a 200-agent program (100 discover, 50 verify, 50 adversarial). 8 visual directions evaluated, all 5 conversion patterns adversarially tested, every per-page redesign verified, brand-defensive SEO confirmed. Output: a single prescriptive FINAL.md.

What we learned

Defaulting to dark + gradient + glass IS the modern AI-tools cliché — the research agents converged on it because they pattern-matched on what 'AI agency' sites do today. The fix was the verification gate, not the first synthesis.

2026-05-22

In production

Six dedicated product detail pages — /platform/<slug>/

Problem

Product overview lived as anchored sections on /platform/. Search engines couldn't index each product; users couldn't deep-link.

Outcome

Dynamic [slug].astro template + 6 detail pages, each with hero, problem, how-it-works, features, sourced proof, audiences, tech, integrations, FAQ, status note, related. SoftwareApplication + BreadcrumbList JSON-LD per page. All 6 indexed.

What we learned

10 deep-research agents produced ~7,000 words of per-product page specs; the synthesis to data model was 90% of the work, the template was the easy part.

2026-05-22

In production

froshtek.com live behind Cloudflare

Problem

No domain on the site yet. Site needed an isolated origin on the Oracle VPS without disturbing the live VOK/VOM WordPress + Perfex stack.

Outcome

Isolated nginx vhost + self-signed cert + atomic deploy via tar-over-ssh. Cloudflare DNS pointed via the cf-zone-setup skill (authenticated browser session, no API token). SSL=Full, Always-HTTPS, Brotli on. CRM still 302, untouched.

What we learned

CloudPanel's clpctl on this build has no site:add namespace — manual vhost was the only path. The `nginx -t` + symlink-swap + `nginx -s reload` discipline is what kept the revenue sites safe.

2026-05-18

In production

GCP billing outage detection rule

Problem

A closed GCP billing account took down Vertex AI ingestion for ~7 days before we noticed.

Outcome

Added a billing-health canary to the daily anomaly cron. Detection window dropped from 7 days → ~24 hours. No grace-period claim — we recover faster, not perfectly.

What we learned

The hardest failures are the ones you'd never write a unit test for. Add the rule the first time it bites.

2026-05-08

In production

Bonvoice webhook dedupe-skip — caught and fixed same day

Problem

Vendor (Bonvoice) silently changed webhook semantics on 2026-05-07. Our dedupe key matched the new payload shape, causing inbound CDR rows to be dropped silently. Detected on next-day anomaly check.

Outcome

1-line fix in `bonvoice_webhook.py:517`. New anomaly rule (`webhook_dedupe_skips_24h`) added to catch the regression class. Vendor-change discipline added to runbook: any vendor-side change → ARCHITECTURE_STATE row + 24h re-test.

What we learned

WhatsApp/voice/email from a vendor saying 'we changed X' is a code-equivalent event. Write it down in the same turn.

2026-04-29

In production

Vertex AI extraction migration

Problem

Fact-extraction pipeline was failing ~50% of calls on AI Studio (HTTP 503). Same model, separate fleet.

Outcome

Flipped extraction to Vertex AI via one env var (`BRAIN_USE_VERTEX_AI=true`). HTTP-503 failure rate dropped from ~50% to ~0. Audio worker stayed on AI Studio. Service account `vok-extraction@gen-lang-client-0119917682`.

What we learned

Availability isn't accuracy. The win was uptime, not better answers. Frame it that way.

2026-04-26

In production

VOK migration: shared cPanel → Oracle Cloud VPS

Problem

Two WordPress sites + two Perfex CRMs were stuck on shared cPanel with no real DR story — a single host-account closure could have wiped years of records.

Outcome

Single planned cutover. Old `/crm/*` URLs 301-redirect to new `crm.<domain>` subdomain so existing bookmarks keep working. New stack: Oracle A1.Flex + nginx + MariaDB + CloudPanel + Cloudflare Full Strict.

What we learned

Plan the cutover, write the runbook, do it once. We didn't claim 'zero downtime' — we claimed `single planned cutover with 301 redirects`, which is what we did.

2026-04-20

In production

WhatsApp Vault — 334,246 messages, 85% auto-linked

Problem

Years of WhatsApp conversations were stuck on a single Android handset. Deletes, disappearing messages and phone resets meant `they promised X but the message is gone` was a recurring, unwinnable argument.

Outcome

Idempotent Python importer; multi-table vault schema with BEFORE DELETE triggers; SHA-256 hash-chained audit log; in-CRM WhatsApp tab on every customer. Live numbers: 334,246 messages, 85% of contacts auto-linked to CRM clients (65% to leads), 13,866 entities extracted (617 GSTIN, 1,477 PAN). Full re-import in ~2 minutes.

What we learned

Make the schema refuse the wrong thing. The audit-log DB user is INSERT+SELECT only — no override, even for us.

2026-04-26

In development

DeadlineGuard — Phase 0 done; shadow mode blocked

Problem

Operations teams sit on hundreds of dated documents — rent agreements, licences, certificates — with the expiry buried in a scan.

Outcome

Phase 0 complete: a Drive-watcher + a single Gemini-2.5-Flash multimodal read + a deterministic Python rules engine. Kerala rent-agreement renewal rule passed 6/6 byte-for-byte against the legacy golden cases (a dev milestone, not a customer benchmark).

What we learned

Math doesn't go in the model. The LLM transcribes; the date arithmetic runs in code we can re-read and re-test.

TBD

Roadmap

AI Worker — autonomous WhatsApp auto-reply

Problem

Suggestion desks coach staff; staff still send. For volume customers, an autonomous reply path is the unlock.

Outcome

Designed (~64 KB design doc), scaffolded (L1–L6 module files exist), and explicitly paused until Meta WABA onboarding clears AND Coexistence mode stops eating group chats. We're not shipping it before we'd send it to our own customers.

What we learned

Pause is a status. Roadmap is its own bucket, not the bottom of the in-development list.

Want the runbook this log is drawn from?

The technical runbook — VOK architecture, the modules, the anomaly rules, the 6-week telephony iteration — is on /proof. Ungated.

30 minutes · no obligation · we reply within 1 business day