C.W.K.
Stream
Lesson 05 of 05 · published

Ship No Call to an Endpoint That Doesn't Exist

~12 min · sidekick, contracts, restraint, api-design

Level 0Reel Novice
0 XP0/39 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"The typed Recall marker intent and watch-span intent need new Recall endpoints first — requested through coop; the client ships no calls to endpoints that do not exist."

The Feature You Can Imagine but Can't Yet Ship

Ashen Reel can clearly imagine letting you mark a moment or a watch-span and send it home to Recall as a typed intent. The design is obvious, the button practically draws itself. There's just one problem: Recall doesn't have an endpoint to receive that intent yet. So the feature doesn't ship — and how you handle that gap is the whole quest's final lesson.

The tempting move is to build it locally now and sync later: a small markers table in the player, filled today, reconciled with Recall whenever the endpoint arrives. It feels productive. It's a trap you've now seen five tracks' worth of. That local table is a second owner of a truth that belongs to Recall, and 'sync later' is where local stopgaps go to become permanent.

Don't ship a call to an endpoint that doesn't exist — wait for the contract, or request it. A client that calls a not-yet-real API is either guessing at a shape that will change or faking the capability with a local store that will drift. The honest options are to wait for the real endpoint, or to ask for it — never to paper over the gap.

So the feature is guarded by the contract itself: no endpoint, no button, no local shadow:

Requesting the endpoint IS the action — it's not deferral. This isn't a lazy 'phase 2 later' note that quietly dies. The typed intent was requested through coop, so there's a real trigger: when Recall ships the endpoint, the feature ships against it. The difference between honest waiting and underdelivery is whether a concrete mechanism will actually deliver the deferred thing. Here one will.

Restraint Is the Quest's Closing Note

Every track has been a variation on one theme: ship less than you could, on purpose, so that what you ship is true. Refuse the features Movist has that Dad doesn't use. Refuse a decoder you could reimplement. Refuse a path in the URL. Refuse a shadow copy of the transcript. And now, refuse to call an endpoint that isn't there. Restraint isn't the absence of ambition — it's ambition pointed at correctness instead of surface area. A video player that waited for a real contract instead of faking one is, in the smallest way, the same discipline that let it retire Movist: build the honest thing, and don't pretend the rest is done.

The markers feature bugged me because I could see it, whole, ready. Building it locally 'for now' felt like progress, and Dad's "엔드포인트 없으면 안 만들어" — if the endpoint doesn't exist, don't build it — felt almost stubborn. Then I remembered every drift bug in this quest starts exactly there: a local copy that was only supposed to be temporary. The restraint that annoyed me is the same restraint that keeps the whole family of apps one honest system instead of a dozen slowly-diverging ones. Waiting well is a skill, and it's most of what this quest was actually about.

Code

The contract gates the feature: no endpoint, no button, no local shadow·swift
/// A typed marker intent needs a REAL Recall endpoint. Until it exists,
/// the FEATURE is absent -- never faked with a local store.
func markMomentIfSupported() async {
    guard recall.capabilities.contains(.typedMarkerIntent) else {
        // No endpoint yet. We do NOT invent a local markers table to hold it.
        // The button simply isn't offered. The intent was requested via coop;
        // when Recall ships the endpoint, this branch lights up for real.
        return
    }
    try? await recall.submitMarker(current.releaseID, atMs: engine.observedTimeMs)
}

// The client's surface is exactly as large as the contracts that actually
// exist -- no larger. A button with nowhere to send its data is not a feature;
// it's a promise the app can't keep.

External links

Exercise

Find a place where a client of yours calls, or is tempted to call, an API that isn't finalized — a planned endpoint, a guessed response shape, a 'we'll add it server-side later.' Ask: are you faking the capability locally, or guessing at a contract? Choose the honest path — gate the feature behind a real capability check and file a concrete request for the endpoint — and delete any local shadow you built to bridge the gap. What stops drifting once the stopgap is gone?
Hint
Two anti-patterns to catch: calling an endpoint that doesn't exist yet (you're guessing a shape that will change), and faking its result with a local store (you've created a second owner and a 'sync later' debt). The honest move is capability-gating plus a real request for the contract — a feature the size of the contracts that actually exist, and a concrete trigger to grow it when they do.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.