Structural & authoring traits
identity is every entity's who-am-I, composed implicitly by every
create block: the name, aka aliases, and description land here, along
with the article/proper-name machinery the sentence assembler uses,
grammatical number, the narration's pronoun set, disambiguation
adjectives, and optional weight/volume/size. From Chord: name, aliases,
description, plural, concealed, and on persons proper and
pronouns (ADR-242); the rest is TypeScript.
The author writes:
create the Gatehouse
a room
A stone gatehouse with an iron-barred window.
create Tobias
aka groundskeeper
a person, proper
pronouns he
in the Gatehouse
A weathered man with a ring of keys.
create the zookeeper
a person
in the Gatehouse
Someone in a canvas apron, name unknown.
create the iron gates
aka gates
plural
scenery
in the Gatehouse
Twin gates of black iron, shut fast.
create the player
starts in the Gatehouse
The player sees:
> look
Gatehouse
A stone gatehouse with an iron-barred window.
You can see Tobias and a zookeeper here.
> take the gates
The iron gates are fixed in place.
> take tobias
You can't take Tobias.
> take the zookeeper
You can't take the zookeeper.
One word each way: proper (person-only) renders Tobias bare-named in
the room listing and in refusals while the unmarked zookeeper keeps an
article, and plural sets grammatical number so every message agrees:
the gates "are" fixed in place where the statue "is".
The rest of the trait in one-liners:
pronouns he(orshe,it,they, or adefine pronounsnamed set, per chord-language.md) names a person's narration pronoun set; absent means the by-number fallback ("it"/"they"). Nothing is inferred from a name.concealedmarks a hidden item that searching reveals and announces.pointsawards score on the first take, deduped per entity. It is TypeScript-only today; Chord'sscore … worth Nlines are the separate named-award system.- The create-line article is never read for identity:
create the zookeeperandcreate a zookeeperload identically.
region (a region, a kind noun since ADR-236) groups rooms into
areas: a room carries a region id, regions nest by containing each
other, and going emits region_exited / region_entered per
crossed boundary. Everything is authored region-side: containing
lists members (additive across lines), after entering it / after leaving it react to boundary crossings (leaving exists only on region
blocks), and an on every turn clause on the region block is a region
daemon, firing only while the player is in a member room (the daemon
machinery is the plugins layer's).
The author writes:
create the Grounds
a region
containing the Orchard, the Apiary
after entering it
phrase under-the-boughs
end after
after leaving it
phrase back-on-the-road
end after
on every turn
phrase bees-drone
end on
phrase under-the-boughs:
You pass under the boughs; the air turns sweet with windfall.
phrase back-on-the-road:
The orchard smell fades behind you.
phrase bees-drone:
Bees drone somewhere among the trees.
The player sees (starting outside the region, walking east through it and back):
> east
Orchard
Apple trees in ragged rows.
Bees drone somewhere among the trees.
You pass under the boughs; the air turns sweet with windfall.
> east
Apiary
White hives stand in the grass.
Bees drone somewhere among the trees.
> west
Orchard
Apple trees in ragged rows.
Bees drone somewhere among the trees.
> west
Gatehouse
A stone gatehouse at the edge of the grounds.
The orchard smell fades behind you.
Boundary reactions fire only on crossings (the Orchard-to-Apiary move inside the region says nothing extra), while the daemon speaks in every member room and falls silent the turn you leave. One honest gap: the trait's ambient-sound/smell fields are declared but nothing reads them yet (dormant).
scene provides narrative phases with a lifecycle: a scene waits,
begins when its registered begin-condition fires, counts its active
turns, and ends (or recurs) on its end-condition, evaluated every turn
by an always-on engine plugin, emitting scene_began /
scene_ended plus any registered reaction messages. The conditions are
code (closures registered on the world, re-register after restore); the
trait's state persists. It is TypeScript-only, with no Chord surface.
story-info is the story's masthead on an invisible system entity:
title, author, version, description, plus build metadata (build date,
engine/client versions, ported-by, credits). ABOUT and VERSION read it;
the info channels and save metadata consume it. A Chord story
never touches it directly; the header (story "…" by "…", version:,
blurb:) flows through and the engine materializes the trait.
One neighbor in the traits directory is not a trait at all:
obstructor-protocol (ADR-173) is a query-helper module for walls: a
wall side may name an obstructedBy entity, and capability consumers
(today the sound system's acoustic dampening, ADR-172) ask at query time
whether that obstructor is still in the room, so pushing the bookcase
aside lifts the obstruction with no bookkeeping. It is TypeScript
plumbing only, with no Chord surface and no verb.