Skip to content

Commit ae1245f

Browse files
docs(vrs): fold in the verified term survey
A full survey against the tree corrected several entries and added four that reading the docs alone would not have found. `keep` has a third sense, and it is the one that misleads: the runtime forces the tag on for tasks named `agent` or `ding`, so an operator who authors the pin as false on a ding still gets it. The authored word does not describe the resulting behaviour. `agent` names both the declared entity and a task literally called `agent`, which the runtime special-cases by string comparison — so a declaration named `mix` has an agent task whose id is `<host>.mix`. `status` gained the session-lifecycle sense the terminal tool reports, and the bus-root entry now records that it is normally equal to the catalog root: two names for one path that can still diverge, which is worse than two names for two paths. DING is mid-rename to ping. The command answers to both, while the authored keyword, the derived task name matched as a literal, and the wire prefix still say ding. Recorded as a term in transition rather than settled either way — the direction is the maintainer's to confirm. Adds a section for keywords the parser accepts and the runtime ignores. Dropping unknown keys is deliberate, but the effect is that `harness`, `model`, `persona` and others read as configuration and bind nothing — and `harness` and `persona` do bind as generator flags, so the same word is effective in one surface and inert in another. `live` is downgraded to editorial: the implementation already separates `alive` for processes from `live` for the lock. agent-session-id: e5217740-eef6-48eb-a794-3e5e11939e4d agent-tool: Claude Code agent-tool-version: 2.1.220 agent-model: claude-opus-5 agent-runtime-profile: /nix/store/i8y8b542cyqi385ywcjw5fvsq24f75v4-coding-agent-runtime-profile/share/coding-agents/profile.json agent-skills-manifest: /nix/store/i81qxhzlrzcxrrdwpp6i8hagka2gby8y-agent-skills-corpus/share/agent-skills/manifest.json tooling-profile: dotfiles@unknown-dirty
1 parent bb3c761 commit ae1245f

1 file changed

Lines changed: 68 additions & 16 deletions

File tree

docs/vrs/ontology.md

Lines changed: 68 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,13 @@ an example path.
103103
- **DING** — the delivery of an unread message into a running agent's terminal,
104104
performed by a sidecar that watches the inbox. Named for the poke rather than
105105
the message, because the message has already arrived; the DING is what makes
106-
the agent notice. **Ping** is an accepted alias for the same thing.
106+
the agent notice.
107+
- **Ping** — the same thing as DING. The command accepts both names, and the
108+
stated direction is to settle on *ping*, since performing the poke is the
109+
runner's job rather than a separate act. The rest of the vocabulary has not
110+
moved: the authored keyword, the derived task name that code matches as a
111+
literal, and the wire prefix all still say *ding*. Until those move, write
112+
**DING** for the mechanism and treat *ping* as the name it is becoming.
107113
- **Poke** — one attempt to put a notice into a composer. The act; the DING is
108114
the arrangement that performs it.
109115

@@ -202,7 +208,15 @@ At least six senses, four of which appear in the VRS documents themselves:
202208
These collide rather than coexist: `vision.md` uses bare *root* for the root
203209
agent in a list of actors, while `requirements.md` uses bare *roots* for
204210
host-local scopes in one requirement and for watcher scopes in another. A reader
205-
cannot resolve which is meant from the sentence alone.
211+
cannot resolve which is meant from the sentence alone. Four of the senses are
212+
directories, and three of those are printed together by the command that exports
213+
the bus environment — so seeing them side by side is routine.
214+
215+
A second hazard sits inside the directory senses: the bus root is normally
216+
*equal to* the catalog root, since no nested bus directory is synthesized. Two
217+
names for one path that can nonetheless diverge is worse than two names for two
218+
paths, because equality holds until it doesn't and nothing in the vocabulary
219+
signals which is being relied on.
206220

207221
**Always qualify.** Never write bare *root*. The one place this cannot be fixed
208222
by convention is where a ratified requirement already uses the bare word; that
@@ -219,12 +233,17 @@ routinely called "the supervisor". Write **control plane** for the process and
219233

220234
### `status`
221235

222-
The most reused word in the system, with six senses: the presence value; the
223-
presence file on disk; the command that gets or sets presence; the roster field;
224-
the roster filter; and the systemd unit state reported by an unrelated
225-
subcommand. Most coexist harmlessly, but the presence senses and the systemd
226-
sense are both operator-visible and share a verb. Write **presence** for the
227-
concept and reserve *status* for the file and the commands that name it.
236+
The most reused word in the system. It names the presence value, the presence
237+
file on disk, the command that gets or sets presence, the roster field, the
238+
roster filter, a session's lifecycle state as the terminal tool reports it
239+
(running, exited, vanished), and the systemd unit state of the control plane.
240+
241+
Two pairs genuinely collide. Presence and the session lifecycle are both "the
242+
status of an agent" in plain English while answering different questions — is it
243+
declaring itself available, versus is its process still there. And the command
244+
that reads presence differs from the one that reads the unit state by a single
245+
word. Write **presence** for the declared signal and **session state** for the
246+
lifecycle, and reserve bare *status* for the file and the commands that name it.
228247

229248
### `receipt`
230249

@@ -248,17 +267,33 @@ a task's liveness is discussed.
248267

249268
### `live`
250269

251-
Established usage is process liveness — a live session, a live host lock, a live
252-
owner. The DING subsystem introduces a second sense in **live composer**, where
253-
it means the composer that will receive keystrokes as opposed to one drawn in
254-
scrollback. The two do not overlap in subject matter, but the word is doing
255-
different work, so the composer sense should always carry its noun.
270+
The mildest entry here, kept because the second sense is new. Established usage
271+
is liveness — a live host lock, and *alive* for sessions and processes, which the
272+
implementation already keeps apart. The DING subsystem introduces **live
273+
composer**, meaning the composer that will receive keystrokes as opposed to one
274+
drawn in scrollback. The senses collide only in prose, so the fix is editorial:
275+
the composer sense always carries its noun.
256276

257277
### `keep`
258278

259-
A garbage-collection pin on a declaration or task, and an unrelated flag that
260-
preserves an eval's temporary catalog. Different concepts, one word, both
261-
authored by the operator.
279+
Three senses, and the third is the dangerous one. It is a garbage-collection pin
280+
the operator authors on a declaration or task; an unrelated flag that preserves
281+
an eval's temporary catalog; and a tag the runtime *forces on* for tasks named
282+
`agent` or `ding`, so their exit evidence survives.
283+
284+
The first and third share a name and a mechanism but not their provenance: an
285+
operator who authors the pin as false on a ding still gets the forced tag. The
286+
authored word therefore does not describe the resulting behaviour, and a reader
287+
who knows only the KDL keyword will predict the wrong outcome.
288+
289+
### `agent`
290+
291+
The declared entity, and a *task* literally named `agent` — the one the compact
292+
declaration form derives, which the runtime special-cases by comparing the name
293+
as a literal string. So a declaration named `mix` has a task named `agent`, and
294+
that task's id is `<host>.mix` rather than anything containing the word. Write
295+
**declaration** or **the agent** for the entity and **the agent task** for the
296+
task whenever both are in scope.
262297

263298
### `identity`
264299

@@ -310,3 +345,20 @@ The last three are divergences between the specification's vocabulary and the
310345
implementation's, not merely missing types. They are recorded here so a reader
311346
does not go looking for something that was never built, or conclude that two
312347
words name two things.
348+
349+
## Words that do not bind
350+
351+
A declaration may carry keywords the parser accepts and the runtime ignores:
352+
among them **harness**, **model**, **persona**, **permissions**, **transport**,
353+
**strategy**, and a free-form metadata block. Dropping unknown keys is
354+
deliberate — it is how st2 stays independent of whatever rendered the
355+
declaration — but the consequence is a vocabulary hazard rather than a
356+
convenience: these read as authored configuration and change nothing, and the
357+
grammar gives an author no way to tell a binding keyword from an inert one.
358+
359+
**Harness** and **persona** are the sharp cases, because the same words *do*
360+
bind elsewhere as flags on the generator that writes declarations. One word,
361+
authored in two places, effective in one.
362+
363+
Treat these as metadata, never as configuration, and never cite one as evidence
364+
that a declaration is configured a particular way.

0 commit comments

Comments
 (0)