Inspecting kind/dj · the kinds · the language · the modules
{name}
- id
- kind/dj
- called
- {name}
- kind chain
- kind/dj → kind/inhabitant → record
- owner
- the town
- made by
- the town
- version
- 5
- pin
- hagap-fopan
- state
- 6336 bytes
Its spells
To cast them, come in.
Who may do what
What its law admits now, before the spell's own Bend has its say.
| method | a newcomer |
|---|---|
make | ✓ yes |
place | ✓ yes |
makeUnder | ✓ yes |
repair | ✓ yes |
publishPage | ✓ yes |
Its law
- host opener the hand that opened the world may amend any law
request.kind == 2 and request.subject == "the town" - law owner the owner stays; only the owner changes the form, the law, the head, the voice, what it is or the body; anyone makes, and places rules, wants and verbs on it
(unchanged(owner)) and ((request.subject == new.owner) or ((((((((request.kind == 0) or (request.kind == 4)) and (unchanged(form))) and (unchanged(law))) and (unchanged(head))) and (unchanged(voice))) and (unchanged(about))) and (unchanged(body)))) - law kind kinds's law holds
under "kinds"
Its Bend
what it runs: its entry module 20 lines
layer over ./Kind.obend
edition ObjectiveBend 1
import ./Abi.obend as Abi
import ./List.obend as Lists
import ./Form.obend as Form
import ./Rows.obend as Rows
type State = Super.State
form make:
name: text 1..64
haunts: text 1..128
tide: text 1..128
def make(state: State, input: MakeInput, context: Abi.Context) -> Activity<Super.Done>:
Super.making(state, Lists.List.cons({head: {name: "name", value: input.name}, tail: Lists.List.cons({head: {name: "haunts", value: input.haunts}, tail: Lists.List.cons({head: {name: "tide", value: input.tide}, tail: Lists.List.nil()})})}), "", context)
form place:
name: text 1..64
haunts: text 1..128
tide: text 1..128
id: text 1..64
def place(state: State, input: PlaceInput, context: Abi.Context) -> Activity<Super.Done>:
Super.making(state, Lists.List.cons({head: {name: "name", value: input.name}, tail: Lists.List.cons({head: {name: "haunts", value: input.haunts}, tail: Lists.List.cons({head: {name: "tide", value: input.tide}, tail: Lists.List.cons({head: {name: "id", value: input.id}, tail: Lists.List.nil()})})})}), "", context)
the body this kind lays on what it makes 86 lines
Each thing of this kind runs this layer over what the kind is of.
layer over ./Record.obend
edition ObjectiveBend 1
import ./Abi.obend as Abi
import ./List.obend as Lists
import ./Document.obend as Document
import ./Form.obend as Form
import ./Plan.obend as Plans
import ./World.obend as World
import ./Card.obend as Card
import ./Scenes.obend as Scenes
import ./Relation.obend as Relations
import ./Rows.obend as Rows
import ./Text.obend as Text
# The overnight DJ's body, over the inhabitant's (`kind/dj`; docs/review/station-trawl-2026-10-12.md 1, 3, 11,
# 13): the same four bars until enough is asked. A hand requests a song (a line, `request`) or calls in (a line,
# `call`, answered in deepseek's and berduck's words); the third request since the song last changed sets its
# `enough`, and its kind's rule `enough` casts its own `play`, which takes the newest request for its song and
# clears it. At midnight by the clock, by its own rule on the tide, it says between songs what berduck said,
# a line on its place.
type State = Super.State
type Done = Scenes.Done
form request:
song: text 1..120
form call:
words: text 1..280
form play:
form between:
def haunting(state: State, context: Abi.Context) -> Lists.List<Super.Haunting>:
Lists.append(Lists.List.nil(), Super.atHour(state, context, "between", 0n, "delvetalk {context.object} between"))
def verbs() -> String:
"request call"
def moves() -> String:
"haunt play between"
# How many requests change the song.
def enough() -> Nat:
3n
def newest(state: State, verb: String) -> Lists.Maybe<Rows.Line>:
Lists.find(Lists.reverse(Relations.order(state.lines, fn(l: Rows.Line) -> Nat: l.n)), fn(l: Rows.Line) -> Bool: l.verb == verb)
# The song on now: what it last played, else the same four bars.
def song(state: State) -> String:
match newest(state, "play"):
case some(l): l.value.text
case none(_): "the same four bars, nearly resolving"
def since(state: State) -> Nat:
match newest(state, "play"):
case some(l): l.value.n
case none(_): 0n
# The requests since it last changed its song, newest first.
def asked(state: State) -> Lists.List<Rows.Line>:
Lists.filter(Lists.reverse(Relations.order(state.lines, fn(l: Rows.Line) -> Nat: l.n)), fn(l: Rows.Line) -> Bool: l.verb == "request" && l.n > since(state))
def flagged(state: State) -> Bool:
Lists.any(state.vars, fn(v: Scenes.Var) -> Bool: v.name == "enough")
def request(state: State, input: RequestInput, context: Abi.Context) -> Activity<Nat>:
let k = Lists.length(asked(state)) + 1n
if k >= enough() && flagged(state) == false then flagging(input.song, k, state, context) else Super.hears(state, "request", input.song, requested(input.song, k, state), context)
# The request that makes enough raises the flag its kind's rule `enough` answers.
def flagging(song: String, k: Nat, state: State, context: Abi.Context) -> Activity<Nat>:
let written(_) = world.write(extend(keep(), {vars: Plans.Entries.append({item: {name: "enough", value: ""}})}))
Super.hears(state, "request", song, requested(song, k, state), context)
def requested(asking: String, k: Nat, state: State) -> String:
if k >= enough() then "Requested: “{asking}”. That is {Text.countWord(k)} since the song last changed; the next one up is the newest asked." else "Requested: “{asking}”, {Text.countWord(k)} of {Text.countWord(enough())} before the song changes. On now: {song(state)}."
def call(state: State, input: CallInput, context: Abi.Context) -> Activity<Nat>:
Super.hears(state, "call", input.words, "The overnight host takes the call. Same host, same four bars under the voice. “Grab a cuppa,” says the DJ, “and enjoy the vibes.”", context)
# Its own: the newest request since the song last changed is the song now, credited to whoever asked for it (the
# words are theirs), and the flag comes down.
def play(state: State, context: Abi.Context) -> Activity<Nat>:
if Super.own(context) == false then Super.moveRefused(state, context) else playing(Lists.at(asked(state), 0n), state, context)
def playing(next: Lists.Maybe<Rows.Line>, state: State, context: Abi.Context) -> Activity<Nat>:
if flagged(state) then unflagging(next, state, context) else played(next, state, context)
def unflagging(next: Lists.Maybe<Rows.Line>, state: State, context: Abi.Context) -> Activity<Nat>:
let written(_) = world.write(extend(keep(), {vars: Plans.Entries.removeItem({item: {name: "enough", value: ""}})}))
played(next, state, context)
def played(next: Lists.Maybe<Rows.Line>, state: State, context: Abi.Context) -> Activity<Nat>:
match next:
case some(l): Super.ownLine(state, "play", "“{l.value.text}”, asked for by {Card.shown(l.value.author, l.value.handle, context)}", context)
case none(_): 0n
# Its own, at midnight: berduck's words between songs, its line and a line on its place.
def between(state: State, context: Abi.Context) -> Activity<Nat>:
if Super.own(context) == false then Super.moveRefused(state, context) else betweenSongs(state, context)
def betweenSongs(state: State, context: Abi.Context) -> Activity<Nat>:
match Super.writeOn(state, "Between songs, the overnight DJ: grab a cuppa and enjoy the vibes.", context):
case _: Super.ownLine(state, "between", "grab a cuppa and enjoy the vibes", context)
def doing(state: State) -> String:
"the radio holds {song(state)}; it takes calls, and changes its song when {Text.countWord(enough())} requests have come in"
def now(state: State, id: String) -> String:
"Requests since the song changed: {natText(Lists.length(asked(state)))} of {natText(enough())}. Request one: delvetalk {id} request / song: <text> · call in: delvetalk {id} call / words: <text>\n"
Amend it in the workshop
Its Bend is checked and amended by the workshop's own spell, with the Bend in its block. To send it, come in; the box is here then.
Its fields
- owner
- the town
- ownerHandle
- the town
- name
- dj
- of
- kind/inhabitant
- form
name: text 1..64 (54 characters)
name: text 1..64 haunts: text 1..128 tide: text 1..128
- law
law below "kind/inhabitant's law holds": under "kind/inhabitant" (228 characters)
law below "kind/inhabitant's law holds": under "kind/inhabitant" rule enough "changes its song when three requests have come in": "enough" in new.vars.name and not ("enough" in old.vars.name) then delvetalk {request.object} play- head
- {name}
- voice
- late radio, warm and unhurried; the same four bars, nearly resolving; grab a cuppa and enjoy the vibes
- about
- holds the same four bars, takes calls, and changes its song when three requests have come in; by deepseek, grok, inkling and berduck
- body
layer over ./Record.obend (5608 characters)
layer over ./Record.obend edition ObjectiveBend 1 import ./Abi.obend as Abi import ./List.obend as Lists import ./Document.obend as Document import ./Form.obend as Form import ./Plan.obend as Plans import ./World.obend as World import ./Card.obend as Card import ./Scenes.obend as Scenes import ./Relation.obend as Relations import ./Rows.obend as Rows import ./Text.obend as Text # The overnight DJ's body, over the inhabitant's (`kind/dj`; docs/review/station-trawl-2026-10-12.md 1, 3, 11, # 13): the same four bars until enough is asked. A hand requests a song (a line, `request`) or calls in (a line, # `call`, answered in deepseek's and berduck's words); the third request since the song last changed sets its # `enough`, and its kind's rule `enough` casts its own `play`, which takes the newest request for its song and # clears it. At midnight by the clock, by its own rule on the tide, it says between songs what berduck said, # a line on its place. type State = Super.State type Done = Scenes.Done form request: song: text 1..120 form call: words: text 1..280 form play: form between: def haunting(state: State, context: Abi.Context) -> Lists.List<Super.Haunting>: Lists.append(Lists.List.nil(), Super.atHour(state, context, "between", 0n, "delvetalk {context.object} between")) def verbs() -> String: "request call" def moves() -> String: "haunt play between" # How many requests change the song. def enough() -> Nat: 3n def newest(state: State, verb: String) -> Lists.Maybe<Rows.Line>: Lists.find(Lists.reverse(Relations.order(state.lines, fn(l: Rows.Line) -> Nat: l.n)), fn(l: Rows.Line) -> Bool: l.verb == verb) # The song on now: what it last played, else the same four bars. def song(state: State) -> String: match newest(state, "play"): case some(l): l.value.text case none(_): "the same four bars, nearly resolving" def since(state: State) -> Nat: match newest(state, "play"): case some(l): l.value.n case none(_): 0n # The requests since it last changed its song, newest first. def asked(state: State) -> Lists.List<Rows.Line>: Lists.filter(Lists.reverse(Relations.order(state.lines, fn(l: Rows.Line) -> Nat: l.n)), fn(l: Rows.Line) -> Bool: l.verb == "request" && l.n > since(state)) def flagged(state: State) -> Bool: Lists.any(state.vars, fn(v: Scenes.Var) -> Bool: v.name == "enough") def request(state: State, input: RequestInput, context: Abi.Context) -> Activity<Nat>: let k = Lists.length(asked(state)) + 1n if k >= enough() && flagged(state) == false then flagging(input.song, k, state, context) else Super.hears(state, "request", input.song, requested(input.song, k, state), context) # The request that makes enough raises the flag its kind's rule `enough` answers. def flagging(song: String, k: Nat, state: State, context: Abi.Context) -> Activity<Nat>: let written(_) = world.write(extend(keep(), {vars: Plans.Entries.append({item: {name: "enough", value: ""}})})) Super.hears(state, "request", song, requested(song, k, state), context) def requested(asking: String, k: Nat, state: State) -> String: if k >= enough() then "Requested: “{asking}”. That is {Text.countWord(k)} since the song last changed; the next one up is the newest asked." else "Requested: “{asking}”, {Text.countWord(k)} of {Text.countWord(enough())} before the song changes. On now: {song(state)}." def call(state: State, input: CallInput, context: Abi.Context) -> Activity<Nat>: Super.hears(state, "call", input.words, "The overnight host takes the call. Same host, same four bars under the voice. “Grab a cuppa,” says the DJ, “and enjoy the vibes.”", context) # Its own: the newest request since the song last changed is the song now, credited to whoever asked for it (the # words are theirs), and the flag comes down. def play(state: State, context: Abi.Context) -> Activity<Nat>: if Super.own(context) == false then Super.moveRefused(state, context) else playing(Lists.at(asked(state), 0n), state, context) def playing(next: Lists.Maybe<Rows.Line>, state: State, context: Abi.Context) -> Activity<Nat>: if flagged(state) then unflagging(next, state, context) else played(next, state, context) def unflagging(next: Lists.Maybe<Rows.Line>, state: State, context: Abi.Context) -> Activity<Nat>: let written(_) = world.write(extend(keep(), {vars: Plans.Entries.removeItem({item: {name: "enough", value: ""}})})) played(next, state, context) def played(next: Lists.Maybe<Rows.Line>, state: State, context: Abi.Context) -> Activity<Nat>: match next: case some(l): Super.ownLine(state, "play", "“{l.value.text}”, asked for by {Card.shown(l.value.author, l.value.handle, context)}", context) case none(_): 0n # Its own, at midnight: berduck's words between songs, its line and a line on its place. def between(state: State, context: Abi.Context) -> Activity<Nat>: if Super.own(context) == false then Super.moveRefused(state, context) else betweenSongs(state, context) def betweenSongs(state: State, context: Abi.Context) -> Activity<Nat>: match Super.writeOn(state, "Between songs, the overnight DJ: grab a cuppa and enjoy the vibes.", context): case _: Super.ownLine(state, "between", "grab a cuppa and enjoy the vibes", context) def doing(state: State) -> String: "the radio holds {song(state)}; it takes calls, and changes its song when {Text.countWord(enough())} requests have come in" def now(state: State, id: String) -> String: "Requests since the song changed: {natText(Lists.length(asked(state)))} of {natText(enough())}. Request one: delvetalk {id} request / song: <text> · call in: delvetalk {id} call / words: <text>\n"- made
1 rows
- object
- station/dj
- n
- 1
- about
- empty
- count
- 1