Nineteen roles, one person
The nineteen disciplines that went into HurricaneWise, including the code: what was done in each and what I decided.
An AI specialist drafted the work in each seat. My part was deciding what HurricaneWise is for and which failures I wouldn't accept, and that included fields I don't practice myself. A few times an answer looked wrong to me and I couldn't say why yet, so I read more on it and had it done again.
Legal, branding and design, and marketing and search were new to me. The AI specialists in those seats knew more about the field than I did, so I kept sending drafts back until I couldn't find anything wrong with them.
-
Reliability engineering
Nineteen health checks. Four run from outside on Grafana: the fastest every 60 seconds, the others every 3 minutes. The rest run on the server every 15 minutes, or on the status route. Six check the monitoring itself, from what the OS reports.
My call I chose which failures need the four outside checks, with the fastest every 60 seconds and the others every 3 minutes. The remaining checks run on the 15-minute internal loop or the status route.
Where the work lives → -
Incident management
Detection, an issue opened against itself naming what is down and what still works, a written severity scale, auto-resolve on recovery, and a post-mortem on every resolved incident.
My call An incident opens after two bad checks in a row, so a single bad check on its own doesn't open anything. Every resolved incident gets a write-up because the constitution requires it.
Five monitoring failures → -
Observability
Metrics and logs shipped from the server, plus external checks that load the real site the way a person would.
My call When internal telemetry and the outside view disagree, I trust the outside view because it is closer to what a visitor experiences.
Server metrics and outside checks → -
Architecture
Seven services (Vercel, Neon, Cloudflare R2, Anthropic, Hetzner, Grafana Cloud, GitHub Actions).
My call Visitor-facing, bursty work sits on managed platforms. I put the steady every-minute jobs on one fixed-price Hetzner box because running it all day costs nothing extra.
The placement rule → -
Security review
No text a visitor types ever reaches the model. No accounts, no personalization. The feedback form keeps IP and browser string, for abuse control.
My call I designed the injection route out on day one, and I count that as a limit on the product as well as a protection.
What never reaches the model → -
Authentication and access
A zero-trust check (Cloudflare Access) in front of the internal operations dashboard that refuses access if it can't complete.
My call The operator is re-verified when a control is written, as well as at sign-in.
-
Backend and data pipeline
A 60-second poll of NHC and NOAA, a parser for their old fixed-width storm format, and a database that only wakes when an advisory changes (roughly 8 to 15 times a day).
My call One function computes freshness, and both the site and the server call it.
The division of labor → -
Frontend and interface
The public tracker, the storm pages, the status page, and the mobile layout people actually read during a storm.
My call What goes at the top of the page during a storm.
-
AI engineering
Nine prompts, one job each. Five return structured data checked against a schema. The post-mortem writer returns prose. The resolver prompt drives a coding session. Temperature 0.1 to 0.3 where the model accepts one.
My call An answer with a missing field or a bad value publishes nothing; that slot on the page stays empty. Text over its length limit is cut to length (since 2026-08-31).
The nine prompts → -
Autonomous operations
Sweeps every 5 minutes. It attempts every failure its own monitoring detects. There is no approved list. The one exclusion is an incident that affects the resolver itself. After that it's a bounded session, a pull request, every check green, a tagged release, a check of the live site, and the trail emailed to me.
My call Repairs only. No new features, data sources or pipelines, no layout or interface changes, no performance work. The session instructions say so, and an incident only ever describes something broken. Nothing technical stops it editing any file.
How it ships its own repairs → -
Release engineering
Lint, types, the full test suite, and browser tests on desktop and mobile. A merge tags a release. The tag deploys.
My call No merge until every check is green.
-
Status and uptime reporting
A public status page naming what is degraded and what still works, fed by the internal loop's health signal.
My call The status page names what is degraded and what still works, using the same health signal as the internal loop without a manual update.
-
Consumer communications
The words on the page during a storm, and two prompts for a degraded system: a plain user notice, and an engineering report with log links.
My call Plain language, and the forecast has to mean the same thing after the rewrite. No catastrophizing.
-
Cost and FinOps
A script I run that pulls usage from every provider and lays out the bill line by line; quota projection runs from my own machine too, not the server. Repair spend is metered on its own key.
My call Which limits are worth engineering around (the tightest: Grafana synthetic checks, about 86% of the free 100,000 a month), and that a cost increase gets published with its reason.
About $15 a month, itemized → -
Project management
Issues, labels, a roadmap and a board, so the repair path has a real work item to attach to.
My call Repairs file issues in my own tracker.
-
Governance
Constitution v1.0.0, ratified 2026-07-26 after an adversarial review. Every change ships with tests, and a bug fix starts from a failing test. Monitors get registered in a manifest before they exist, and the build fails if reality drifts from it.
My call I put every rule in a versioned file, because the agents read those files and the build can check against them.
Laws before code → -
Legal new to me
Disclaimers for a product about hurricanes, a privacy position, and a review of both.
My call What the product must never imply about official guidance, whatever the models say.
-
Branding and design new to me
The name, mark, palette, typography and how a storm is presented.
My call I kept the colors and storm graphics calm. People open it when a storm is coming.
-
Marketing and search new to me
Positioning, the words that describe the product to a stranger, and the structured data search engines read.
My call What the product is for and who it's for. I didn't hand that to a specialist.