Sharpee
Chord / Standard Library / NPCs & Conversation / talking, asking, telling

talking, asking, telling

talk (talking) covers the verbs talk to/with X, speak to/with X, chat with X, and converse with X (core grammar since ADR-229; story grammar still outranks it). The action is not gated on being a person: talking to the mailbox reaches the action and refuses not_actor, hook-visibly, so a story can intercept even that. A bare person answers no_response, which is honest: talk is shallow by design. A conversation object in the actor's custom properties unlocks greeting flavor (first meeting vs. greets_again, formal_/casual_greeting, remembers_you, has_topics / nothing_to_say), but per-topic dialogue lives on ask/tell's declared table instead.

ask (asking) and tell (telling) take ask X about Y (also question X about Y, inquire of X about Y) and tell X about Y (also inform X about Y); a non-person recipient refuses not_actor. The topic is a first-class free-text slot (ADR-231), resolved entity-first: a topic naming something in scope carries that entity along, any other wording flows through as plain text, and a topic is never scope-rejected. Bare, both actions validate the social preconditions, mutate nothing, and report a default: asking's unknown_topic and telling's not_interested. Real per-topic dialogue is a declared Chord table (ADR-239): define topics for <person> … end topics, one block per person, one table serving ask AND tell. Entity rows (about the great lamp:) ride the platform's quiet topic-entity resolution and are checked first; quoted rows (about "the storm", "the weather":) match free text, with comma-separated aliases; a response is a one-line statement or an indented body (it binds the person). Matching is normalized whole-topic lookup: case-insensitive, article-stripped, and never fuzzy. On a hit the row fully owns the reply; the person's on asking it / on telling it clause is the catch-all, firing only on a miss; with neither, the stdlib defaults speak.

The author writes:

create the Lantern Gallery
  a room

  The top of the lighthouse, all glass and brass.

create the great lamp
  aka lamp
  scenery
  in the Lantern Gallery

  A first-order lens taller than a man.

create the keeper
  a person
  in the Lantern Gallery

  The keeper polishes the lens without looking up.

  on asking it
    phrase keeper-shrug
  end on

define topics for the keeper
  about the great lamp: phrase keeper-lamp
  about "the storm", "the weather":
    phrase keeper-storm
end topics

create the player
  starts in the Lantern Gallery

define phrases en-US
  keeper-lamp:
    "Eighty years that lens has burned," the keeper says. "It will
    outlast us both."
  keeper-storm:
    "Glass is falling," she says. "You'll want to be off the rock by
    dark."
  keeper-shrug:
    The keeper shrugs. "Lamp and weather. That's all I know."

The player sees:

> talk to the lamp
You can only talk to people.

> talk to the keeper
The keeper doesn't respond.

> ask the keeper about the lamp
"Eighty years that lens has burned," the keeper says. "It will outlast us both."

> ask the keeper about the weather
"Glass is falling," she says. "You'll want to be off the rock by dark."

> tell the keeper about the storm
"Glass is falling," she says. "You'll want to be off the rock by dark."

> ask the keeper about the tide
The keeper shrugs. "Lamp and weather. That's all I know."

The whole dispatch order in one scene: not_actor for a non-person, the honest no_response on bare talk, the entity row riding scope resolution, the quoted row answering either alias for ask and tell alike, and the on asking it catch-all speaking only on a miss.

talk (talking-*)ask / tell (asking-* / telling-*)
Refusalsno_target · not_actor · too_far (same room required) · self · not_availableno_target · not_visible · too_far · not_actor
Successno_response · greeting flavor with conversation data (first_meeting, greets_again, formal_/casual_greeting, remembers_you, has_topics / nothing_to_say)unknown_topic (ask) · not_interested (tell) — a topics row replaces both
Eventstalkedasked / ask_blocked · told / tell_blocked

Interceptors: on talking it on the person is talk's override seam. The canonical TypeScript rendition is Dungeo's troll, whose preValidate vetoes with its own message when he is out cold and whose postReport overrides the core reply with GROWLS when he isn't (swap the standard message, keep the event); the zoo's characters skip talking entirely and speak through every-turn daemons, which is also a legitimate pattern. The topic reaches interceptor data (topic, topicEntityId) via the lifecycle seed, for while conditions and TypeScript hooks.

Gone the other way in the ADR-239 pass: the say X [to Y], shout, and whisper X to Y patterns were removed, as was the write X [on Y] family. Those action ids had no implementations (they parsed, then runtime-failed in every story); both return with real conversation/writing systems, and story-grammar verbs (Dungeo's SAY) are unaffected.