DEV Community

Cover image for One I can't finish, one I can't measure
Dhardingsea Developer
Dhardingsea Developer

Posted on

One I can't finish, one I can't measure

I shipped two things this week that could not be less alike.

One is an integration against the SaaS that most process-serving firms run their dispatch on — a system of legal record, where a wrong write becomes a wrong document attached to a real court case. The other is a 24.92 KiB Chrome extension containing a dinosaur that walks across your page and refuses to leave.

They have exactly one thing in common, and it took me until I'd written both up to notice it: each one has a hole in it that I put there on purpose.

One I can't finish. One I can't measure.


The one I can't finish

ServeManager speaks JSON:API, not flat REST. If you've never hit that shape before, the first thing it does is lie to you quietly:

// Returns undefined. Does not throw. Ships to production as a blank column.
const status = job.data.service_status;

// The scalar actually lives here
const status = job.data.attributes.service_status;
Enter fullscreen mode Exit fullscreen mode

Relationships are worse — they're pointers, not objects, and the thing they point at lives in a separate top-level included array you have to resolve yourself. Getting a court name off a job is three hops:

const resolve = (included, ref) =>
  ref?.data
    ? included.find(i => i.id === ref.data.id && i.type === ref.data.type) ?? null
    : null;

const courtCase = resolve(included, job.data.relationships.court_case);
const court     = resolve(included, courtCase?.relationships?.court);
const courtName = court?.attributes?.name;   // null-guard every hop
Enter fullscreen mode Exit fullscreen mode

Every one of those failure modes is silent. Nothing throws. You get undefined, it flows through your mapper, and it lands in a report as an empty cell — in a domain where an empty cell means "we have no idea whether this person was legally served."

So here's the hole. There is one write I have never confirmed: attaching a file to an already-existing job. The documented flow covers uploading during job creation. The attach-afterward body schema, I have never captured from a real request.

I could infer it. The create flow is right there, the naming is consistent, and I'd probably be right.

"Probably right" is a fine standard for a side project and a terrible one for a system of legal record. A malformed write here doesn't throw an exception — it produces a wrong document on someone's real case, and nobody finds out until the day it matters. So the feature is gated. It does not run against production. It sits there, unfinished, until I spend the hour with a network tab open and capture what the request actually looks like.

The full writeup, with the status codes that look like your bug and aren't (406, 409, and a 403 that's a permissions level rather than a bad payload), is here: The ServeManager API is a document, not a record.


The one I can't measure

Same week. Different universe.

Annoying Dino is a Manifest V3 extension that puts a tiny T-Rex in your browser. You can tap him, feed him, or ignore him. His mood shifts based on which you pick. There's an egg-and-hatch collection running alongside. That's the product. It is the least ambitious thing I have ever shipped.

It is also, by a factor of nearly five, the most-installed thing in my portfolio.

I didn't want to write that sentence without checking it, so I counted every listing:

Extension Installs
Annoying Dino 19
Arcanum Idle 4
Dino Dots 4
Planet Express Lounge 3
Cobalt Star / Kawaii Time Garden / Spellsurge / Hot Dog Rush 2 each
Devotion 1

Four listings wouldn't surface a count at all, so the honest version is "leads everything I could measure." Nineteen users is not a business or a validation — it's nineteen browsers. But it beats the idle game with nine automated test suites, and that gap is the interesting part.

Here's the hole: I have no idea whether any of those nineteen people have opened it since.

There is no analytics in any of my extensions. No event pings, no install beacon, no heartbeat. I check that the way I check a bug — grep the whole codebase for network APIs before the privacy claims get written. Which means I cannot tell you a retention curve, a DAU number, or whether the feeding mechanic is the part people actually like. I can't even tell you if it's broken on someone's machine right now.

Anyone with an analytics tag would have known all of that on day two.

And I still won't add one — because of what this specific extension is. It runs on the pages you visit. Any usage telemetry worth having from it would be, functionally, a log of when you were browsing and what you were looking at when a cartoon reptile walked past. There is no version of "just a little event tracking" there that isn't a surveillance surface wearing a joke costume.

Full numbers and reasoning: The most-installed thing I have built is a dinosaur that bothers you.


The thing they actually share

I thought these were opposites. A legal-record API and a joke dinosaur; maximum consequence and zero consequence.

They're the same decision made twice.

In both cases there was a shortcut available that would have made the product better on paper. Infer the field shape and ship the attach feature. Add three lines of telemetry and finally know if anyone plays the thing. Both shortcuts are small, normal, and what most people would do without a second thought.

And in both cases the cost of taking the shortcut lands on someone who is not me. A guessed field shape puts a wrong document on a stranger's court case. A telemetry ping puts a stranger's browsing pattern on a server. The benefit is all mine — a shipped feature, a retention chart — and the risk is all theirs.

So the rule I've ended up with is not "be careful." It's narrower than that:

When the shortcut's upside accrues to you and its downside accrues to your user, the shortcut isn't a tradeoff. It's a transfer.

The follow-on is that you have to be willing to hold the gap. Ship the integration with the feature switched off and say so. Ship the extension and admit publicly you can't measure it. Both look like weakness in a portfolio. Both are the actual engineering.

The unglamorous coda: neither hole is permanent. The attach schema needs one hour with DevTools open. The dino telemetry is never coming — but the install count is a real signal, and it already told me something I didn't want to hear about the gap between what I find interesting to build and what a stranger will actually click.


If you want the longer versions, I keep the case studies at dhseadev.online/writing and the running devlog at dhseadev.online/updates. Everything I ship is local-first, no accounts, no telemetry — which, as established, is occasionally very inconvenient for me.

What's the shortcut you refuse to take, and what does it cost you?

Top comments (0)