Skip to content

docs(constitution): a capability keys to the object class, not to the verb that first needed it - #323

Open
stellarfeline wants to merge 3 commits into
mainfrom
docs/capability-ownership-doctrine
Open

docs(constitution): a capability keys to the object class, not to the verb that first needed it#323
stellarfeline wants to merge 3 commits into
mainfrom
docs/capability-ownership-doctrine

Conversation

@stellarfeline

Copy link
Copy Markdown
Owner

What changed at the design level

One bullet in CLAUDE.md's Methodology, beside the no-hack rule. It names a defect class the repo has been paying for without a name for it.

The live instance. close-gate owns sealed_hint — a field that encodes answering a player who presses this thing. That capability is a property of anything a player can right-click; it has nothing to do with closing a gate. Built as a property of the verb, it left the second object that needed it — the sealed shortcut door, which has no interaction body on the near side at all, so neither click does anything — with no surface to consume. The proposed fix was a second bespoke field on shortcuts[].

Owner ruling, 2026-08-06: that is too narrow. What is wanted is a general capability — an author can attach a custom right-click hint to a scene object — not a field per use case. A second bespoke field is the defect repeating, not its repair.

The rule, so it is checkable in review. Before adding an authorable field to a verb: could an author want this on an object that has nothing to do with that verb? If yes, it keys to the object class and the verb becomes one consumer. The tell in a diff is a doc comment reading "X, mirroring Y", a hook on one variant of a sum type but not its siblings, or a default baked into a path a second path cannot reach.

Why it belongs beside the no-hack rule. Same layering failure, one axis over: no-hack is about which layer a capability lives at; this is about what it is keyed to inside that layer. And it is the DSL-surface form of the shape already paid for at the walker layer — hand-rolled walks enumerating 3 of 5 effect roots (#301/#302/#321), a defect of expressibility rather than of care.

Generality is decided at the first site. Retrofitting at the second costs a dsl_version bump, per-stage fences, and an adoption round on every active campaign.

What CI proves

Nothing behavioural — this is text in the constitution. The docs job proves the file still parses for every consumer that reads it.

Not in this PR

The repo-wide audit of the class, and every lift it will recommend. Both were ordered in the same breath and are running separately; no surface is touched here.

…rb that first needed it

`close-gate.sealed_hint` encodes "answer a player who presses this thing" — a
property of anything right-clickable, nothing to do with closing a gate. Built
onto the verb, it left the sealed shortcut door with no surface to consume, and
the proposed fix was a second bespoke field.

Owner ruling 2026-08-06: a second bespoke field is the defect, not the fix. A
capability keys to the object class it acts on; the verb becomes one consumer.
Generality is decided at the first site — the second costs a version bump,
fences, and an adoption round per active campaign.
…ng is too narrow

The shape that fools you: the mechanism exists, but it does not reach the
objects it should. A trigger's interaction body is a point at a cell, not the
clickable shape of the object, so the island boulder's own pattern authored on
a shortcut door compiles clean and ships a box pressable only from the side the
door opens from. That reads as a missing feature, and the fix adds a fourth
mechanism — which is what the planner proposed in this very PR.
Owner decision 2026-08-06: engine primitives are abstract, flexible and
configurable, never bound to one campaign's design. A creator must be able to
build any content with it. A primitive encodes a MECHANISM, never a design
decision about what that mechanism is for; the genre we happen to be building
is content, and content lives in campaigns.

The capability-ownership rule becomes a corollary of that, and the three review
shapes sit under it: keyed to the verb; a general mechanism privately
re-implemented; a general mechanism whose binding is too narrow to reach the
objects it should.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant