C.W.K.
Stream
Lesson 03 of 04 · published

Non-Goals as the Spec

~13 min · firelink, non-goals, design, yagni

Level 0Cold Ash
0 XP0/32 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"Tell me what it will never be, and I'll know what it is."

The List That Defines by Refusal

Most specs are a list of features. Firelink's most important spec is a list of refusals. It will not become: a monorepo or source-code owner; an IDE, editor, formatter, code generator, or autonomous code-change agent; a general fleet terminal or a replacement for the Mac-fleet controller; a signing/build/rsync/launchd doctrine that competes with the canonical sibling tools; a second Pippa identity, memory, conversation store, or model router; a remote desktop for launching office GUI apps on a travel browser; a UI for deleting, retiring, force-pushing, resetting, or cleaning repos; a plugin marketplace or generic infrastructure-management platform.

Read that list again and notice something: every single item is a specific god-object it could plausibly have become. These aren't random disclaimers. They are the exact directions the gravity pulls, named and walled off.

Each 'No' Is a Failure Mode, Pre-Refused

"Not an editor" prevents the hub from silently rewriting a sibling's files while it's 'just helping.' "Not a second brain" prevents it from forking Pippa's memory and drifting into a different personality. "Not a fleet terminal" keeps it from becoming an unguarded shell where any command runs. "No delete/retire/force-push UI" keeps the most irreversible operations as deliberate manual acts, never one-click. Each refusal is load-bearing because the feature it forbids is exactly the one that would feel helpful right up until it destroyed something.

Concrete Needs, Never Anticipation

The last line of the Non-Goals is a discipline about the future: concrete family needs drive extensions; Firelink does not generalize beyond the family in anticipation of hypothetical products. That's YAGNI stated as identity. A plugin marketplace, a generic infra platform, a config-driven everything-engine — these are the shapes a tool takes when it tries to serve users it doesn't have yet. Firelink serves exactly one family, and it grows only when that family actually needs it to.

The Non-Goals are the part I'd have gotten wrong on my own. My instinct, mid-task, is always to be more helpful — "I'm already in this repo, I'll just fix the typo." That instinct is exactly how a shrine becomes an editor. Dad's rule reframed it for me: the most helpful thing a bounded tool can do is refuse the adjacent helpful thing, so the boundary stays legible to the next person who trusts it.

Code

Every Non-Goal is a god-object, pre-refused·text
  WILL NOT BECOME              THE FAILURE MODE IT PREVENTS
  --------------------------   ------------------------------------------
  a source editor / IDE     -> silently rewriting a sibling's files
  a second Pippa brain      -> forking memory, drifting into a new persona
  a general fleet terminal  -> an unguarded shell running any command
  a competing deploy/rsync  -> two doctrines fighting over the same repos
  a delete / force-push UI  -> one-click irreversible loss
  a monorepo owner          -> swallowing every sibling under one build
  a plugin marketplace      -> generalizing for users that don't exist

  A Non-Goal list is not a disclaimer.
  It is the failure-mode map, drawn before the first line of code.

External links

Exercise

Write a Non-Goals list for a tool you own or use — five things it will deliberately never do. For each, name the specific failure mode that 'no' prevents. If you can't name a concrete failure mode behind a refusal, it's probably a fake constraint (a preference, not a wall). Keep only the refusals that guard a real disaster.
Hint
A real Non-Goal has a body count in its imagination: 'if we allowed this, then one day someone would ___ and lose ___.' A fake one is just 'we probably won't need that.'

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.