SupervisionNode

Inherits from Value

SupervisionNode — an immutable snapshot record for one process in the live supervision tree (ADR 0092).

A SupervisionNode is a frozen, point-in-time view of a single process: its pid, registered name, kind, Beamtalk class (if any), and live child count. Nodes are minted by the runtime shim (beamtalk_process_navigation) when you take a snapshot via Workspace processes, and never mutate — to observe change, take a new snapshot.

The kind field is load-bearing: it tells a renderer whether to draw a Beamtalk class badge (#beamtalkActor / #beamtalkSupervisor, with behaviourClass populated) or a foreign-process badge (#otpSupervisor / #otpProcess, behaviourClass is nil). A child OTP is currently restarting carries kind => #restarting and pid => nil — the snapshot never crashes on a process caught mid-restart.

The richer accessors — children, parent, strategy, restartIntensity, and the lazy status — land with the tree object (BT-2429); this record is deliberately left extensible.

Examples

node := Workspace processes root
node kind            // => #beamtalkActor
node pid             // => a Pid
node behaviourClass  // => Counter   (the Beamtalk class, or nil for foreign)
node isSupervisor    // => false
node isBeamtalk      // => true

Instance Methods

isSupervisor source

Whether this node is a supervisor (Beamtalk or foreign).

Examples

node isSupervisor   // => true
isBeamtalk source

Whether this node is a Beamtalk process (actor or supervisor) — i.e. its kind is one of the #beamtalk* kinds. Foreign OTP processes and restarting children answer false.

Examples

node isBeamtalk   // => true
children source

The snapshot children of this node (supervisors only; #() otherwise).

Resolved from the shared sibling set captured at snapshot time, so it reflects the frozen tree — re-snapshot to refresh. Returned children are themselves navigable (node children first parent).

Examples

node children   // => #(a SupervisionNode, ...)
parent source

The snapshot parent of this node, or nil for a root node or a node caught mid-restart.

Examples

node parent   // => a SupervisionNode | nil
parentPid source

The pid of this node's parent supervisor, or nil for a root node — the O(1) adjacency key, without materialising the full parent node (parent).

Examples

node parentPid   // => a Pid | nil
strategy source

The configured OTP restart strategy (#oneForOne, #simpleOneForOne, …) for a Beamtalk supervisor node, or nil for actors and foreign processes.

Examples

node strategy   // => #oneForOne
restartIntensity source

The configured restart budget#{#maxRestarts => n, #window => secs} — for a Beamtalk supervisor node, or nil otherwise. This is the public, stable configured intensity; a per-child restart count is deliberately out of scope (ADR 0092 §3).

Examples

node restartIntensity   // => #{#maxRestarts => 10, #window => 60}
truncated source

Whether this supervisor's children were truncated by the snapshot child cap (a large simpleOneForOne pool, ADR 0092 §Constraints 1). When true, children is empty but childCount still reports the live total.

Examples

node truncated   // => false
status source

Lazily fetch this node's live OTP status (ADR 0092 §5).

Issues a timeout-guarded sys:get_status against the node's pid at call time (never at snapshot time). Returns a Dictionary for an alive, sys-compliant process; returns nil — not an error — for a process that has since died, timed out, or is not sys-compliant. This is the liveness check: a snapshot is a past truth, status is the now.

Examples

node status   // => #{#module => ..., #sysState => #running} | nil

Stays inline FFI (not self delegate): the backing status/1 takes the node's pid, not the node map, so the call threads self pid rather than self and cannot use the first-keyword + self-threading delegation form (ADR 0101 / BT-2731).

printString source

Human-readable description, e.g. #SupervisionNode<#beamtalkActor Counter #Pid<0.132.0>> or, for a supervisor, #SupervisionNode<#beamtalkSupervisor AppSup #Pid<0.200.0> children: 3>.

Examples

node printString   // => "#SupervisionNode<#beamtalkActor Counter #Pid<0.132.0>>"

Inherited Methods

From Value

printString

Return a developer-readable string representation showing fields.

Produces ClassName(field: value, ...) via the canonical structural renderer (ADR 0094). Field values are rendered with their own printString (strings stay quoted, nested values show their structural form), in sorted field order. A class with no fields produces ClassName(). Recursion is bounded by depth/width/length caps with a cycle guard.

Examples

ValuePoint x: 3 y: 4        printString   // => "ValuePoint(x: 3, y: 4)"
ValuePoint new              printString   // => "ValuePoint(x: 0, y: 0)"

From Object

class

Return the class of the receiver.

Examples

42 class              // => Integer
"hello" class         // => String
isNil

Test if the receiver is nil. Returns false for all objects except nil.

Examples

42 isNil              // => false
nil isNil             // => true
notNil

Test if the receiver is not nil. Returns true for all objects except nil.

Examples

42 notNil             // => true
nil notNil            // => false
ifNil: _nilBlock

If the receiver is nil, evaluate nilBlock. Otherwise return self.

Examples

42 ifNil: [0]         // => 42
nil ifNil: [0]        // => 0
ifNotNil: notNilBlock

If the receiver is not nil, evaluate notNilBlock with self.

Examples

42 ifNotNil: [:v | v + 1]   // => 43
nil ifNotNil: [:v | v + 1]  // => nil
ifNil: _nilBlock ifNotNil: notNilBlock

If nil, evaluate nilBlock; otherwise evaluate notNilBlock with self.

Examples

42 ifNil: [0] ifNotNil: [:v | v + 1]    // => 43
nil ifNil: [0] ifNotNil: [:v | v + 1]   // => 0
ifNotNil: notNilBlock ifNil: _nilBlock

If not nil, evaluate notNilBlock with self; otherwise evaluate nilBlock.

Examples

42 ifNotNil: [:v | v + 1] ifNil: [0]    // => 43
nil ifNotNil: [:v | v + 1] ifNil: [0]   // => 0
printString

Return the developer-readable (Debug) string representation.

printString is the Debug protocol (ADR 0094): the self-describing, structural form used by the REPL, logs, and by any other printString that nests this object. It is the REPL default — evaluating an expression shows its printString.

This default returns the bare class name (no a/an article — the old "a ClassName" form was dropped in ADR 0094). Value overrides it with the structural ClassName(field: value, ...) form, actors render as Actor(ClassName, pid), supervisors as Supervisor(ClassName, pid) / DynamicSupervisor(ClassName, pid), and primitive types (Integer, String, List, …) override it with their own richer output. Authors rarely override printString directly — the default is derived.

Examples

42 printString            // => "42"
displayString

Return the user-facing (Display) string representation.

displayString is the Display protocol (ADR 0094): the human-facing form. It is the hook the language pulls during string interpolation — every {...} segment renders via the value's displayString. Developers rarely call it directly; they override it when a value has a natural human rendering (e.g. Money$10.50, where printString would still show the Debug form).

It defaults to printString, so most types need no override. String and Symbol demonstrate the split: "hi" printString"\"hi\"" (quoted, Debug) while "hi" displayString"hi" (plain, Display); likewise #foo drops its # prefix under displayString.

displayString is not part of the Printable protocol (deferred per ADR 0094 §5).

Examples

42 displayString             // => "42"
inspect

Open a navigable Inspector cursor on the receiver.

ADR 0095 Phase 3 (BT-2504). inspect is repurposed from -> String (the ADR-0094 deferral) to the verb that produces an Inspector — a live, immutable cursor for drilling into the object (Inspector on: self). anObject inspect is the shorthand; Inspector on: anObject is the explicit spelling. The cursor exposes fields/at:/path/refresh/ printString (an indented text tree) and asDictionaries (the MCP/browser wire form); see Inspector.

This is a breaking change: code that used inspect for its old String result must switch to printString (the structural Debug string, ADR 0094) — a transitional lint flags inspect used directly in ++/ string position.

Examples

42 inspect kind                  // => #value
(Point x: 3 y: 4) inspect fields size   // => 2
(Point x: 3 y: 4) printString    // => "Point(x: 3, y: 4)"  (the old inspect string)
yourself Sealed

Return the receiver itself. Useful for cascading side effects.

Examples

42 yourself            // => 42
hash

Return a hash value for the receiver.

Examples

42 hash
respondsTo: selector Sealed

Test if the receiver responds to the given selector.

Examples

42 respondsTo: #abs    // => true
fieldNames Sealed

Return the names of fields.

Examples

42 fieldNames             // => #()
fieldAt: name Sealed

Return the value of the named field.

Examples

object fieldAt: #name
fieldAt: name put: value Sealed

Set the value of the named field (returns new state).

Examples

object fieldAt: #name put: "Alice"
perform: selector Sealed

Send a unary message dynamically.

Examples

42 perform: #abs       // => 42
perform: selector withArguments: args Sealed

Send a message dynamically with arguments.

Examples

3 perform: #max: withArguments: #(5)   // => 5
subclassResponsibility

Raise an error indicating this method must be overridden by a subclass.

Examples

self subclassResponsibility
notImplemented

Raise an error indicating this method has not yet been implemented.

Use this for work-in-progress stubs. Distinct from subclassResponsibility, which signals an interface contract violation.

Examples

self notImplemented
show: aValue

Send aValue to the current transcript without a trailing newline.

Nil-safe: does nothing when no transcript is set (batch compile, tests).

Examples

42 show: "value: "
showCr: aValue

Send aValue to the current transcript followed by a newline.

Nil-safe: does nothing when no transcript is set (batch compile, tests).

Examples

42 showCr: "hello world"
isKindOf: aClass

Test if the receiver is an instance of aClass or any of its subclasses.

For class-object receivers, follows Smalltalk semantics: self class is the metaclass, so the check walks the parallel metaclass hierarchy. The parallel chain is grounded at ProtoObject class superclass == Class (ADR 0036), so the metaclass tower merges into the instance-side Class → Behaviour → Object → ProtoObject chain. As a result, Integer isKindOf: Object and Integer isKindOf: Class both return true.

Examples

42 isKindOf: Integer        // => true
42 isKindOf: Object         // => true
#foo isKindOf: Symbol       // => true
#foo isKindOf: String       // => false
Integer isKindOf: Number    // => false (metaclass chain, not instance chain)
Integer isKindOf: Number class  // => true  (Number class is in the parallel chain)
Integer isKindOf: Object    // => true (grounded — Object is reachable via the metaclass tower)
Integer isKindOf: Class     // => true (Integer class inherits from Class)
error: message

Raise an error with the given message.

Examples

self error: "something went wrong"
delegate Sealed

Delegate message dispatch to the backing Erlang module (ADR 0101, BT-2720).

This method is a sentinel — a plain Object has no backing Erlang module, so calling delegate raises an Error at runtime. Stateless Objects declared with native: have their self delegate method bodies rewritten by the compiler's codegen phase to call the backing module directly, so the sentinel is never reached on a native: class.

Unlike Actor's delegate (visible only to Actor subclasses), this Object-base sentinel is visible to every class, so delegate is a reserved selector on the Object protocol.

Examples

42 delegate   // => ERROR: delegate called on a non-native Object

From ProtoObject

== other

Test value equality (Erlang ==).

Examples

42 == 42           // => true
"abc" == "abc"     // => true
/= other

Test value inequality (negation of ==).

Examples

1 /= 2             // => true
42 /= 42           // => false
class

Return the class of the receiver.

Examples

42 class            // => Integer
"hello" class       // => String
doesNotUnderstand: selector args: arguments

Handle messages the receiver does not understand. Override for custom dispatch.

Examples

42 unknownMessage   // => ERROR: does_not_understand
perform: selector withArguments: arguments

Send a message dynamically with an arguments list.

Examples

42 perform: #abs withArguments: #()   // => 42
performLocally: selector withArguments: arguments

Execute a class method in the caller's process, bypassing gen_server dispatch.

The caller takes responsibility for knowing the method does not mutate class state. Useful for long-running class methods that would otherwise block the class object's gen_server.

Limitations: only resolves methods defined directly on the target class module (does not walk the superclass chain). Class variables and self are not available to the method (nil and #{} are passed).

Examples

MyClass performLocally: #run:ctx: withArguments: #(input, ctx)
perform: selector withArguments: arguments timeout: timeoutMs

Send a message dynamically with an arguments list and explicit timeout.

The timeout (in milliseconds or #infinity) applies to the gen_server:call when the receiver is an actor. For value types, timeout is ignored.

Examples

actor perform: #query withArguments: #(sql) timeout: 30000