Manim tutorial

Manim is a Python library that draws math and science animations. You write Python code that says “put a circle here,” “now move it there,” “now turn it into a triangle,” and Manim renders that into an actual video file.

How to read this: each section is a concept, a tiny working example, a plain-English explanation, and two exercises. Sections build on each other in order, so it’s best read top to bottom the first time. Everything in this tutorial is real code.


Table of Contents

  1. Getting Started & Rendering
  2. Your Lego Bricks: Shapes, Colors, and the Coordinate Grid
  3. Moving Things Around: The Positioning Toolbox
  4. Bringing Things to Life: self.play
  5. The Caption Relay: Swapping Text Smoothly
  6. Teams of Shapes: VGroup & Falling Dominoes
  7. The Invisible Remote Control: ValueTracker & Updaters
  8. Live Text Counters: mob.become
  9. Drawing Instantly: Fast Multi-Path Fans
  10. The Sparkler Trail: TracedPath
  11. Arrows With a Mind of Their Own
  12. Graph Paper: Axes, Plotting, and Area Under a Curve
  13. Write Your Own Physics Engine
  14. Morphing: Transform
  15. Faking 3D: The Coin Flip Illusion
  16. The Flying Drone: MovingCameraScene
  17. Video Game HUD & the Shrinking-Zoom Trick
  18. Example 1: The Quantum Slit Experiment
  19. Example 2: A Planet in Orbit

1. Getting Started & Rendering

Before you animate anything, you need a movie set. In Manim, that set is called a Scene. Everything you draw and move happens inside one method called construct. When you’re done writing the code, you don’t press a “play” button. You type a command into your terminal, and Manim renders (builds) your code into an .mp4 video file, frame by frame.

from manim import *
class HelloWorld(Scene):
def construct(self):
circle = Circle(color=BLUE, fill_opacity=0.5)
self.play(Create(circle), run_time=2)
self.wait(1)
# Save this as tutorial.py, then in your terminal:
# manim -pql tutorial.py HelloWorld

Think of -pql as “preview, quality: low.” It builds fast but looks blurry, which is fine while you’re still fixing bugs. -pqh is “quality: high,” for your final export.

Every scene file in the set starts the exact same way:

class KeplersPattern(Scene):
def construct(self):
self.camera.background_color = "#0b0b0f"
...

That self.camera.background_color line is the very first thing to set. It paints the whole background a near-black color before anything else gets drawn, so nothing ever flashes white.

Exercises

  • Speed Test: Render HelloWorld with -pql, then again with -pqh. Time how much longer the high-quality version takes.
  • Ghost Buster: Add --disable_caching to your render command. Manim sometimes remembers old edits and reuses stale frames. This flag forces a fresh build.

2. Your Lego Bricks: Shapes, Colors, and the Coordinate Grid

What it is: Manim’s canvas is a coordinate grid, just like graph paper. The very center of the screen is ORIGIN, the point [0, 0, 0]. Everything you draw needs a shape and, usually, a color.

The basic shapes you’ll use constantly across all scenes:

Dot(ORIGIN, radius=0.16, color="#e8a23d") # a filled circle point
Circle(radius=2.6, color=GREY_C, stroke_width=2,
fill_color="#22303f", fill_opacity=0.9) # a ring, or filled disc
Line(LEFT * 5.5, RIGHT * 5.5, color=GREY_D) # a straight segment
DashedLine(ORIGIN, [1, 0, 0], color=GREY_D) # a dashed segment
Polygon(p1, p2, p3, p4, color=BLUE,
fill_color=BLUE, fill_opacity=0.45) # any closed shape
Triangle(color=GREY_B, fill_color=GREY_B,
fill_opacity=1) # a filled triangle

Manim gives you built-in color names in capital letters: BLUE, RED, GREY_A through GREY_E (a whole ramp of greys, A lightest to E darkest), YELLOW, GREEN, and so on. You can also use a hex code string, the same way you would in web design: "#e8455c". Every scene in this project builds its own small named palette at the top of the file, like:

SUN_COLOR = "#e8a23d"
PLANET_COLOR = "#4fc3f7"
SWEEP_COLOR = "#e8455c"

This is a good habit. Name your colors once, by what they mean (“sun,” “force,” “resolved answer”), and reuse the name everywhere.

The direction words: UP, DOWN, LEFT, RIGHT are actually tiny vectors (arrows with a length of 1), and you can multiply and add them like numbers:

UP * 2.3 # two-and-a-bit units up from wherever you're measuring from
LEFT * 4.5 + UP * 1.7 # up and to the left, combined

Exercises

  • Palette Builder: Make a scene with five Dots in a row, each one a different named color (RED, BLUE, GREEN, YELLOW, PURPLE).
  • Hex Hunter: Pick your favorite color from an online color picker, copy its hex code, and use it to color a Circle.

3. Moving Things Around: The Positioning Toolbox

What it is: Once a shape exists, you have several tools to place it exactly where you want.

dot.move_to(ORIGIN) # teleport to an exact point
dot.move_to([3, 1, 0]) # or an exact [x, y, z] coordinate
dot.next_to(other_dot, UP, buff=0.3) # sit just above another object,
# with a small gap ("buff") between
dot.to_edge(UP, buff=0.6) # stick to the top edge of the screen
dot.shift(RIGHT * 2) # nudge it: move relative to where it already is
dot.scale(0.5) # shrink to half size (or scale up if > 1)
dot.rotate(PI) # spin it, in radians (PI = 180 degrees)

move_to teleports to an absolute spot. shift moves relative to wherever the object currently is: the difference between “stand at the corner of 5th and Main” and “take two steps to your left.”

next_to is the one you’ll use most for labels: “put this text just above that dot.”

label = Text("the sun", color=GREY_D).scale(0.3)
label.next_to(sun_dot, DOWN, buff=0.3)

Exercises

  • Label Everything: Draw three dots in a triangle shape and label each one with next_to.
  • Corner Crawl: Take one square and animate it moving to all four edges of the screen in a row, using .animate.to_edge(...).

4. Bringing Things to Life: self.play

What it is: Just creating a shape with self.add(shape) makes it appear instantly, with no animation. self.play(...) is how you tell Manim “animate this transition, over this many seconds.”

The animation verbs you’ll use over and over:

self.play(Create(circle), run_time=2) # draw its outline, like a pen tracing it
self.play(FadeIn(circle), run_time=1) # appear by fading in
self.play(FadeOut(circle), run_time=1) # disappear by fading out
self.play(Flash(dot, color=RED), run_time=0.5) # a quick starburst flash, good for "impact!"
self.play(dot.animate.move_to(RIGHT * 3)) # animate ANY property change smoothly
self.wait(1) # just pause, nothing moving

That .animate trick is the most powerful one: stick .animate in front of almost any object, then call whatever method you’d normally call, and Manim smoothly tweens (interpolates) from the current state to the new one instead of snapping instantly.

self.play(dot.animate.move_to(RIGHT * 5), rate_func=linear, run_time=2.6)

rate_func controls the pacing of the motion. linear means constant speed, no easing. smooth (the default) eases in and out gently. rush_into starts slow and rushes toward the end; it’s used in the integral scene to make a counter “race” toward its final answer.

You can animate several things in the same self.play call, and they’ll all happen together:

self.play(
FadeIn(sun), FadeIn(sun_glow), Create(orbit_curve), FadeIn(caption),
run_time=1.4,
)

Exercises

  • Race the Rate Functions: Animate the same dot moving the same distance three separate times, using rate_func=linear, then rate_func=smooth, then rate_func=rush_into. Watch how differently each one feels, even though the start and end points never change.
  • Impact Moment: Animate a ball falling, then call Flash the instant it lands.

5. The Caption Relay: Swapping Text Smoothly

What it is: Never let two captions be visible at once. Every time the narration needs to say something new, the old caption fades out at the exact same moment the new one fades in.

caption = Text("Each planet traces an ellipse.", color=GREY_A)
caption.scale(0.48).to_edge(UP, buff=0.6)
self.play(FadeIn(caption), run_time=0.8)
self.wait(1.0)
new_caption = Text(
"The sun sits at one focus — not the center.", color=GREY_A
).scale(0.46).to_edge(UP, buff=0.6)
self.play(FadeOut(caption), FadeIn(new_caption), run_time=0.6)
caption = new_caption # <-- IMPORTANT: reassign the variable!

After the swap, caption now refers to the new text object, so the next swap can fade it out correctly. Forgetting to reassign is an easy bug to make in Manim. You’ll end up trying to fade out something that’s already gone, and Manim gets confused.

The same “old fades out as new fades in” idea also works for whole groups of objects, not just captions. Swap one shape for a completely different one, over and over, without ever leaving stale objects to clutter the screen.

Exercises

  • Five-Line Story: Write a five-caption story (like a joke with a punchline) using this relay pattern, one self.wait() between each line for comic timing.
  • Two-Line Caption: Use \n inside a Text(...) string to make a caption wrap onto two lines, like Text("First line\nSecond line").

6. Teams of Shapes: VGroup & Falling Dominoes

What it is: A VGroup bundles several mobjects (“Manim objects”) into one team, so you can move, color, or animate all of them together with a single command.

squares = VGroup(*[Square(side_length=0.5, color=BLUE) for _ in range(10)])
squares.arrange(RIGHT, buff=0.2) # line them up in a neat row automatically

arrange saves a lot of work. Instead of computing ten x-coordinates by hand, just say “put these in a row,” or arrange(DOWN) for a column.

If you make all ten squares appear at the exact same instant, it looks flat and boring. LaggedStartMap staggers the start time of each one’s animation by a tiny amount, so they cascade like dominoes:

self.play(
LaggedStartMap(FadeIn, squares, shift=DOWN, lag_ratio=0.1),
run_time=2,
)

lag_ratio=0.1 means each square starts its own animation 10% of the total duration after the previous one started. The “same pull, everywhere” scene uses this same idea (with LaggedStartMap(FadeIn, arrows, lag_ratio=0.05)) to make sixteen little particle arrows pop in around a mass one after another, like a burst rather than a single flat pulse.

You can also grab specific members out of a group using conditions. The “why gravity” scene picks out just the arrows pointing toward a second mass, out of a full ring :

shadowed = VGroup()
for i, arrow in enumerate(arrows):
angle = i / n_particles * TAU
arrow_dir = np.array([np.cos(angle), np.sin(angle), 0])
if np.dot(arrow_dir, direction_to_mass2) > 0.5:
shadowed.add(arrow)
self.play(shadowed.animate.set_opacity(0.05), run_time=1.0)

That’s a dot product doing the work (a bit of vector math: it’s large when two directions point roughly the same way, and small or negative when they don’t), answering “which arrows are aimed toward the second mass?” and fading only those out.

Exercises

  • Raindrops: Make 15 dots fall from the top of the screen to the bottom using LaggedStartMap, so they don’t all land at once.
  • Half a Circle: Arrange 12 arrows in a ring pointing outward (like a clock), then use a dot-product filter like the one above to fade out only the ones in the top half.

7. The Invisible Remote Control: ValueTracker & Updaters

What it is: A ValueTracker is an invisible dial. It holds a single number and doesn’t draw anything on screen by itself. An updater is a tiny robot you attach to a shape. Every single frame, that robot checks the dial’s current number and redraws the shape to match.

import numpy as np
beat_dial = ValueTracker(0)
heart = Dot(radius=0.5, color=RED)
self.add(heart)
def pulse_robot(mob):
t = beat_dial.get_value()
scale = 1.0 + 0.3 * np.sin(t * PI * 2)
mob.become(Dot(radius=0.5 * scale, color=RED))
heart.add_updater(pulse_robot)
self.play(beat_dial.animate.set_value(4), run_time=4)
heart.clear_updaters() # ALWAYS turn the robot off when you're done!

That last line is critical. If you forget clear_updaters(), the robot keeps running forever, checking a dial that’s no longer changing, silently wasting time and sometimes causing weird bugs in later parts of your scene.

A planet’s position keeping pace with orbit progress, a rod’s rotation angle in the Cavendish experiment, an arrow that always points from a dot toward a moving target. The Cavendish torsion balance scene, for example, ties a rotation angle to a dial:

theta = ValueTracker(0.0)
def right_end():
a = theta.get_value()
return np.array([L * np.cos(a), L * np.sin(a), 0])
rod = Line(left_end(), right_end(), color=GREY_B)
rod.add_updater(lambda m: m.put_start_and_end_on(left_end(), right_end()))
self.play(theta.animate.set_value(-np.radians(30)), run_time=2.2)

Exercises

  • The Fading Ghost: Change the heartbeat example so the updater changes the dot’s opacity instead of its radius.
  • Double Speed: Change the math inside the sine wave (t * PI * 2t * PI * 4) so the pulse happens twice as fast for the same dial speed.

8. Live Text Counters: mob.become

What it is: Text objects showing numbers (“576 ft”, “160 ft/sec”) can’t just have their number changed. Manim text is drawn as a fixed shape, not a live variable. The fix is the same updater trick from Section 7, but instead of resizing a shape, the robot builds a brand-new Text object every frame and swaps it in with .become().

time_dial = ValueTracker(0.0)
timer_display = Text("0.0 s", color=YELLOW)
self.add(timer_display)
def update_timer(mob):
current_time = time_dial.get_value()
new_text = Text(f"{current_time:.1f} s", color=YELLOW)
new_text.move_to(mob.get_center()) # keep it anchored in the same spot!
mob.become(new_text)
timer_display.add_updater(update_timer)
self.play(time_dial.animate.set_value(5.0), run_time=5)
timer_display.clear_updaters()

The line new_text.move_to(mob.get_center()) matters. Without it, every new number would snap back to the screen’s default center instead of staying where the old one was.

This same trick is used in this Zeno’s Paradox scene:

count_tracker = ValueTracker(528)
counter = Text("528.0 ft", color=TRUE_COLOR).scale(0.55)
def update_counter(m):
val = count_tracker.get_value()
new_text = Text(f"{val:.1f} ft", color=TRUE_COLOR).scale(0.55)
new_text.move_to(m.get_center())
m.become(new_text)
counter.add_updater(update_counter)
self.play(count_tracker.animate.set_value(576), run_time=1.8, rate_func=rush_into)
counter.clear_updaters()

Remember: attach the updater after your FadeIn finishes, not before. Attaching it too early can make the fade-in animation and the .become() rebuild fight over the object’s internal state and crash.

Exercises

  • Countdown: Build a rocket-launch timer counting from 10.0 down to 0.0.
  • Big Numbers: Use Python’s comma formatting (f"{int(val):,}") to build a counter that races up to 1,000,000.

9. Drawing Instantly: Fast Multi-Path Fans

What it is: Animating 50 or 150 separate objects one at a time, step by step, will slow down your computer. The trick is to do all the math first, in plain Python/NumPy (instantly, with no animation involved), and only hand the final points to Manim to draw as one shape.

import numpy as np
points = [np.array([x, y, 0]) for x, y in zip(x_positions, y_positions)]
path = VMobject(stroke_color=BLUE_C, stroke_width=1.5)
path.set_points_as_corners(points) # connect the dots instantly

set_points_as_corners takes a plain list of coordinates and draws straight segments between them, like a connect-the-dots puzzle, computed in one shot instead of animated point by point. This is how the ellipse-tracing math in Kepler’s First Law and the zig-zag particle paths in the quantum slit scene both get built: hundreds of points calculated with numpy, then drawn as a single VMobject.

You can build many of these at once and let Create (or LaggedStartMap(Create, ...)) animate all of them together:

all_paths = VGroup()
for _ in range(50):
... # calculate points for one path
all_paths.add(path)
self.play(Create(all_paths), run_time=2.5)

Exercises

  • Color Variation: Color each path RED if it ends up high on screen and BLUE if it ends up low, based on its last point’s y-coordinate.
  • Burst Effect: Make every path start at the exact center of the screen and shoot outward in a random direction, like fireworks.

10. The Sparkler Trail: TracedPath

What it is: TracedPath is like tying a lit glowstick to a moving dot. It automatically draws a glowing trail behind whatever point you give it, updating every frame, with zero manual math required.

dot = Dot(LEFT * 4, color=YELLOW)
trail = TracedPath(dot.get_center, stroke_color=YELLOW, stroke_width=4)
self.add(trail, dot) # add BOTH: the trail needs to exist before the dot moves
self.play(dot.animate.move_to(UP * 2))
self.play(dot.animate.move_to(RIGHT * 4))

You pass dot.get_center (the function itself, without parentheses), not dot.get_center(). TracedPath calls that function every frame to ask “where are you now?”

A cannonball’s flight path and the “falling sideways” parabola both leave a visible arc behind them as they move:

ball = Dot(path_3d[0], radius=0.07, color=BALL_COLOR)
trail = TracedPath(ball.get_center, stroke_color=BALL_COLOR,
stroke_width=2, stroke_opacity=0.8)
self.add(trail)
self.play(MoveAlongPath(ball, path_curve), rate_func=linear, run_time=duration)

(MoveAlongPath is covered properly in Section 13. It’s how you move a dot along a pre-computed curve rather than a straight line.)

Exercises

  • Loop-de-Loop: Animate a dot moving in a circle (dot.animate.move_to(...) at several points around a circle, or use Rotate) to draw a glowing hula hoop.
  • Stock Market: Move a dot to a series of random y-coordinates, one after another, to draw a jagged trail.

11. Arrows With a Mind of Their Own

What it is: An Arrow is a shape with a start point and an end point. A static arrow just sits there. But combined with the updater trick from Section 7, an arrow can constantly re-aim itself at a moving target, which is useful for force vectors, velocity vectors, or “pull toward the center” diagrams.

pull_arrow = Arrow(color=RED, buff=0, stroke_width=3,
max_tip_length_to_length_ratio=0.35)
def update_pull(m):
direction = -stone.get_center() / np.linalg.norm(stone.get_center())
m.put_start_and_end_on(stone.get_center(), stone.get_center() + direction * 0.7)
pull_arrow.add_updater(update_pull)

put_start_and_end_on(start, end) is the key method: every frame, it redraws the arrow (or a plain Line) between two fresh points. direction is computed as a unit vector (the vector divided by its own length, via np.linalg.norm), so it always has length 1, pointing the right way no matter how close or far the stone currently is. Multiplying that by 0.7 gives an arrow that’s always 0.7 units long and always aimed correctly.

The “whirling stone on a string” scene uses two such arrows at once, one for the inward pull and one for the sideways velocity, both staying attached and correctly aimed as the stone circles around:

def update_vel(m):
angle = stone_angle.get_value()
tangent = np.array([-np.sin(angle), np.cos(angle), 0])
m.put_start_and_end_on(stone.get_center(), stone.get_center() + tangent * 0.9)
vel_arrow.add_updater(update_vel)

That tangent vector [-sin(angle), cos(angle), 0] is a standard trick. For a point moving in a circle, this formula always points in the direction of travel (90 degrees rotated from the “outward” direction). There’s no need to track velocity separately. You can derive it from the current angle.

Exercises

  • Compass Needle: Make an arrow that always points from a moving dot toward a fixed target dot, no matter where the moving dot goes.
  • Two Arrows: Recreate the stone-on-a-string example, one arrow pointing to the center and one pointing tangent to the circle. Watch how they stay perpendicular to each other the whole time.

12. Graph Paper: Axes, Plotting, and Area Under a Curve

What it is: Axes builds you a labeled coordinate system to plot real functions on. It’s the backbone of both the derivative and integral scenes.

axes = Axes(
x_range=[0, 6.5, 1], y_range=[0, 620, 100],
x_length=9, y_length=5,
axis_config={"color": GREY_D, "stroke_width": 2, "include_ticks": False},
)
axes.move_to(ORIGIN)
def s_of_t(t):
return 16 * t ** 2
curve = axes.plot(s_of_t, x_range=[0, 6.3], color=GREY_C, stroke_width=2)
self.play(Create(axes), Create(curve))

x_range/y_range are [start, end, step]. The step just controls default tick spacing, which is often turned off (include_ticks: False) in this project since the scenes prefer clean, uncluttered graphs.

The method to know is axes.c2p(x, y), short for “coordinate to point.” Your function’s math coordinates (like “5 seconds, 400 feet”) aren’t the same as the screen’s actual pixel/unit coordinates, because the axes might be shifted, scaled, or positioned anywhere. c2p does that translation for you:

t0 = 5.0
s0 = s_of_t(t0)
anchor = Dot(axes.c2p(t0, s0), radius=0.09, color=BLUE)

Any time you want to draw something (a dot, a line, a secant) at a specific data point on your graph, you run it through axes.c2p() first.

Filling the area under a curve (used for the integral scene’s final “smooth area” reveal) is one call:

area = axes.get_area(curve, x_range=[0, 6], color=GREEN, opacity=0.4)
self.play(FadeIn(area))

Exercises

  • Plot Your Own: Graph y = x**2 from x=-3 to 3 using axes.plot, and mark the point at x=2 with a Dot placed via axes.c2p.
  • Shade a Region: Use get_area with a restricted x_range (like [1, 2]) to shade just one slice of the curve instead of the whole thing.

13. Write Your Own Physics Engine

Some of the most impressive shots aren’t hand-animated but simulated. Real physics math, run in a plain Python loop, computed before any animation happens. Manim then draws the result.

This is the same “do the math first, animate second” idea from Section 9, applied to motion under a changing force instead of a fixed set of points.

Here’s the core idea is that a symplectic Euler integrator (a fancy name for “take tiny time steps, and at each step, update velocity from acceleration, then update position from velocity”):

def simulate_shot(v0, g, R_launch, R_ground, dt=0.01, max_steps=4000):
p = np.array([0.0, R_launch]) # starting position
vel = np.array([v0, 0.0]) # starting velocity
path = [p.copy()]
for step in range(max_steps):
r = np.linalg.norm(p)
accel = -g * p / r # gravity always points toward the center
vel = vel + accel * dt # tiny nudge to velocity
p = p + vel * dt # tiny nudge to position
path.append(p.copy())
if np.linalg.norm(p) < R_ground: # hit the ground?
break
return np.array(path)

Why “tiny steps” instead of one big calculation? Because gravity’s direction keeps changing as the object moves (it always points toward the planet’s center). There’s no simple formula for the whole path at once, so the computer approximates it by taking thousands of small, fast steps.

Once you have the list of points, you convert it to a Manim-ready path (the same set_points_as_corners trick from Section 9) and animate a dot moving along it with MoveAlongPath:

path_curve = VMobject()
path_curve.set_points_as_corners([[x, y, 0] for x, y in path_pts])
ball = Dot(path_curve.get_start(), radius=0.07, color=BLUE)
self.add(ball)
self.play(MoveAlongPath(ball, path_curve), rate_func=linear, run_time=3.0)

MoveAlongPath is different from dot.animate.move_to(...): move_to always travels in a straight line to the destination, no matter what. MoveAlongPath follows the exact curve of an already-drawn path, which matters for anything that isn’t a straight line, like an orbit or a cannonball’s arc.

The Kepler orbit scene uses a related trick. Instead of simulating position directly, it simulates how angle changes with time (because “equal areas in equal times” is a statement about that relationship), and builds a lookup table. It then reads any position back out with np.interp (linear interpolation, meaning “estimate a value that falls between two known table entries”):

k = 1.0
dtheta = 0.0015
thetas, times = [0.0], [0.0]
theta, t = 0.0, 0.0
while theta < TAU:
r = r_of_theta(theta)
dt = dtheta * r ** 2 / k # this line encodes "equal areas in equal times"
t += dt
theta += dtheta
thetas.append(theta)
times.append(t)
def theta_at_time(tt):
return np.interp(tt % period, np.array(times), np.array(thetas))

Then a ValueTracker for elapsed time, plus an updater, plug straight into everything you learned in Section 7 to move the planet dot smoothly along its (physically correct, non-uniform) speed.

Exercises

  • Drop a Ball: Simulate free-fall under constant gravity (accel = [0, -9.8], no “always point at center” needed) for two seconds, using the same tiny-step loop, then animate a dot along the resulting path.
  • Bouncing Ball: Modify the loop so that when the simulated ball’s height goes below zero, its vertical velocity flips sign (multiply by -0.8 to lose a little energy each bounce) instead of stopping. Watch it bounce.

14. Morphing: Transform

Transform smoothly morphs one mobject’s shape into another’s, in place. That’s different from FadeOut + FadeIn, which makes one object disappear and a completely different one appear. Transform visually stretches, bends, and recolors the same object into its new form.

new_secant = Line(p0, p1, color=RED, stroke_width=stroke_w)
self.play(Transform(secant, new_secant), run_time=1.1)
secant = new_secant # same variable-reassignment habit as Section 5!

This is how the derivative scene makes its secant line visibly “snap” toward the true tangent line as the interval shrinks: same object, quietly becoming more accurate every step, then finally recoloring from red (“provisional guess”) to green (“resolved, exact answer”) the instant it becomes the true tangent:

tangent = Line(tangent_p0, tangent_p1, color=GREEN, stroke_width=stroke_w)
self.play(Transform(secant, tangent), FadeOut(far_dot), run_time=1.0)

The “sideways push” scene uses the same trick to turn a hand holding a string into the sun at the center of an orbit: same visual object, new meaning:

new_hand = Dot(ORIGIN, radius=0.15, color=SUN_COLOR)
self.play(Transform(hand, new_hand), run_time=0.9)

Rule of thumb: use Transform when you want the audience to feel “this is still the same thing, just becoming more accurate or different.” Use FadeOut+FadeIn (Section 5) when you want “this is a totally new, unrelated thing.”

Exercises

  • Square to Circle: Transform a Square into a Circle of the same color, and watch how Manim automatically interpolates the corners into curves.
  • Color Reveal: Transform a grey, dashed guess-line into a solid, brightly-colored “correct answer” line, exactly like the derivative scene’s secant-to-tangent moment.

15. Faking 3D: The Coin Flip Illusion

What it is: You don’t need a real 3D engine to fake a spinning coin. Squish a circle’s horizontal width down to almost nothing, and it reads as “edge-on,” exactly like a coin flipping through the air.

coin = Circle(radius=1.5, color=YELLOW, fill_opacity=1)
self.add(coin)
self.play(coin.animate.stretch(0.04, dim=0), run_time=0.5) # squish to 4% width
self.play(coin.animate.stretch(25, dim=0), run_time=0.5) # 0.04 * 25 = back to 100%

stretch(factor, dim=0) scales only one axis: dim=0 is horizontal (x), dim=1 is vertical (y). The second stretch uses 25, not 1, because you’re scaling from the already-squished state, and 0.04 * 25 = 1.0 gets you back to full width.

Exercises

  • Triple Flip: Loop the squish/unsquish three times in a row for a coin that flips multiple times before landing.
  • Heads and Tails: Put a letter “H” on the coin’s face, and swap it for “T” (using the FadeOut/FadeIn caption-relay trick from Section 5) at the exact moment it’s squished flat.

16. The Flying Drone: MovingCameraScene

What it is: A regular Scene has a camera bolted to a tripod; it never moves. A MovingCameraScene gives you a camera on a drone: self.camera.frame is itself an object you can move, and, importantly, zoom, by changing its width.

class CameraFlight(MovingCameraScene):
def construct(self):
self.camera.frame.move_to(start_dot).set(width=4) # start zoomed in
self.play(
self.camera.frame.animate.move_to(end_dot).set(width=2),
run_time=3,
)

A smaller width value means you’re more zoomed in (you’re looking at a narrower slice of the world, blown up to fill the screen). A larger width zooms out.

This tool is what makes Zeno’s paradox and the zoom into a derivative work. Both scenes repeatedly narrow width around a shrinking gap, so the audience’s eye is dragged closer and closer into an ever-smaller region, mirroring the math getting more precise.

Exercises

  • Three Stops: Add a third dot far to the right and make the camera drone visit all three dots in sequence.
  • Pull Back: After zooming all the way in on one dot, animate the camera back out to a wide width=20 so the audience sees the whole scene again.

17. Video Game HUD & the Shrinking-Zoom Trick

What it is: Once your camera starts moving and zooming (Section 16), a problem appears. Ordinary text and shapes zoom with the camera. A caption that looked normal-sized suddenly becomes gigantic (or tiny) as the frame shrinks. You need a “HUD,” short for heads-up display, that stays a fixed, readable size no matter how the camera moves, the same way a health bar stays put in a video game.

The fix is one more updater (Section 7), attached to the text, that re-reads the camera’s current frame every single frame and re-pins itself:

def pin_to_hud(mob):
frame = self.camera.frame
mob.scale_to_fit_width(frame.width * 0.6) # always take up 60% of the visible width
mob.move_to(frame.get_bottom() + UP * frame.height * 0.1) # stay near the bottom
caption.add_updater(pin_to_hud)
pin_to_hud(caption) # call it once immediately too, so it's placed correctly right away

Calling the function once by hand (pin_to_hud(caption)) in addition to attaching it as an updater is a small but useful habit. The updater only runs starting from the next frame, so without that manual call, the caption would appear in the wrong spot for one frame before snapping into place.

Then rescale everything else. It’s not just text that needs to be rescaled during a zoom. Line thickness (stroke_width) is measured in fixed screen pixels, not world units, so as the camera zooms in, a normal line looks proportionally thicker and thicker, eventually swallowing the whole shot in a solid color bar if you don’t correct for it. The fix, used in both the Zeno and derivative scenes, is to recompute stroke width and dot size as a fraction of how much you’ve zoomed:

stroke_scale = zoom_width / INITIAL_FRAME_WIDTH
target_stroke = max(2 * stroke_scale, 0.05) # never let it hit exactly zero
target_dot_width = zoom_width * 0.035
self.play(
spine.animate.set_stroke(width=target_stroke),
achilles.animate.set(width=target_dot_width),
self.camera.frame.animate.set(width=zoom_width),
run_time=0.9,
)

Exercises

  • Scoreboard Corner: Modify pin_to_hud to stick text in the top-right corner instead of the bottom-center.
  • Zoom Without Breaking: Draw a Line and a Dot, then zoom the camera to width=0.5 (very close). Without the rescaling trick, watch how huge and blobby they become. Then add the rescaling and compare.

18. Example 1: The Quantum Slit Experiment

What it is: A single scene that combines Section 9’s “compute-then-draw” trick with real (simplified) physics, to visualize a well-known idea. When a particle’s position is measured very precisely (a narrow slit), its momentum becomes correspondingly uncertain (it scatters wide). That’s the Heisenberg uncertainty principle, in one picture.

import numpy as np
from manim import *
class TheSlitExperiment(Scene):
def construct(self):
self.camera.background_color = "#0b0b0f"
np.random.seed(23) # freeze the "randomness" so it's the same every render
N_PARTICLES = 40
SOURCE_X, SLIT_X, SCREEN_X, Y_RANGE = -4.5, 0, 4.2, 5.5
slit_height = 0.4
kick_strength = 0.6 / slit_height # narrower slit -> bigger random kick
y_gaps = np.random.uniform(-slit_height / 2, slit_height / 2, size=N_PARTICLES)
kicks = np.random.normal(0, kick_strength, size=N_PARTICLES)
landings = np.clip(y_gaps + kicks, -Y_RANGE, Y_RANGE)
particle_paths = VGroup()
for i in range(N_PARTICLES):
points = [[SOURCE_X, 0, 0], [SLIT_X, y_gaps[i], 0], [SCREEN_X, landings[i], 0]]
path = VMobject(stroke_color=PURPLE, stroke_width=1)
path.set_points_as_corners(points)
particle_paths.add(path)
self.play(LaggedStartMap(Create, particle_paths, lag_ratio=0.02), run_time=2.0)
self.wait(2)

Every ingredient here is from earlier sections: np.random for the physics, set_points_as_corners (Section 9) to draw each particle’s path instantly, np.clip as an invisible wall so particles can’t fly off-screen, and LaggedStartMap (Section 6) so all 40 particles fire in a cascading burst rather than all at once.

Exercises

  • Wide Slit: Change slit_height to 2.0 and watch kick_strength shrink accordingly. A wider slit means much less uncertainty, so particles land in a tight cluster instead of scattering.
  • Landing Dots: After the paths finish drawing, use a loop and LaggedStartMap(FadeIn, ...) to fade in a Dot at each particle’s landing spot on the screen.

19. Example 2: A Planet in Orbit

What it is: A second scene, combining Section 2 (shapes), Section 5 (caption relay), Section 7 (ValueTracker/updaters), Section 9 (fast path drawing), and Section 13 (writing your own physics loop) into a single self-contained scene: an ellipse, a sun off-center at one focus, and a planet that visibly speeds up near the sun and slows down far away. This is how orbits actually work:

from manim import *
import numpy as np
class MiniOrbit(Scene):
def construct(self):
self.camera.background_color = "#0b0b0f"
a, e = 3.0, 0.6 # semi-major axis, eccentricity
def r_of_theta(theta):
return a * (1 - e**2) / (1 + e * np.cos(theta))
# Section 9: pre-compute the ellipse's points, draw instantly
ellipse = ParametricFunction(
lambda th: np.array([r_of_theta(th) * np.cos(th),
r_of_theta(th) * np.sin(th), 0]),
t_range=[0, TAU], color=GREY_C,
)
sun = Dot(ORIGIN, radius=0.16, color="#e8a23d")
# Section 13: simulate constant areal velocity (Kepler's 2nd Law)
k, dtheta = 1.0, 0.0015
thetas, times, theta, t = [0.0], [0.0], 0.0, 0.0
while theta < TAU:
r = r_of_theta(theta)
dt = dtheta * r**2 / k
t += dt; theta += dtheta
thetas.append(theta); times.append(t)
thetas, times = np.array(thetas), np.array(times)
period = times[-1]
def theta_at_time(tt):
return np.interp(tt % period, times, thetas)
# Section 7: a dial driving the planet's position
planet = Dot(radius=0.09, color="#4fc3f7")
th0 = theta_at_time(0) # give it a correct starting spot before the
planet.move_to([r_of_theta(th0) * np.cos(th0), # updater is attached.
r_of_theta(th0) * np.sin(th0), 0]) # don't rely on the
# updater firing first.
time_tracker = ValueTracker(0)
def update_planet(m):
th = theta_at_time(time_tracker.get_value())
m.move_to([r_of_theta(th) * np.cos(th), r_of_theta(th) * np.sin(th), 0])
planet.add_updater(update_planet)
self.play(Create(ellipse), FadeIn(sun), FadeIn(planet), run_time=1.5)
self.play(time_tracker.animate.set_value(period), run_time=6, rate_func=linear)
planet.clear_updaters()
self.wait(1)

Render it, and the planet visibly races through the part of the ellipse closest to the sun, then crawls through the far side, with no hand-tuned speed curve anywhere in the code. That behavior falls straight out of the physics loop.

Exercises

  • Change the Shape: Try e = 0.1 (a much rounder orbit) versus e = 0.85 (a very stretched one) and see how dramatically the speed variation changes.
  • Add the Sweep: Using the Polygon trick from Section 2, shade two thin wedges, one near the sun and one far away, covering equal time intervals (use theta_at_time). Confirm by eye that they look like roughly the same area despite very different shapes.

Happy animating.

The 21st Century Ideology

There’s an assumed metaphysics behind mainstream 21st century thinking on both the left and the right: 1. every individual belongs to a cultural collective, 2. culture determines values and that 3. the values of each culture Platonically emanate out of its religion.

On the left, these people argue for multiculturalism. On the right, these people argue for civilizational war as an objective reality regardless of how you wish to respond to it (Samuel Huntington); much like how some people think race war in an objective reality. The weird left engages with this narrative in a weird way. E.g. Zizek says only a Christian can be a real atheist.

I don’t find the 21st century’s self-evident truths to be particularly convincing. I will group my answer under a number of headings:

The relativity of concepts.

The fact that Marxism can be shoehorned into value-speak doesn’t prove that value-speak is more fundamental. It is known that different sets of ideas can be mutually reducible to each other:

Let the color grue be defined as “green till today and blue from tomorrow”. Let the color bleen be defined as “blue till today and green from tomorrow”. Grue and bleen appear to be complex colors defined on the basis of the fundamental colors blue and green. However, the color blue can also be defined as “bleen till today and grue from tomorrow”. Now blue appears to be a composite.

Analytic philosophy calls these “gruesome” properties.

Marxism does its best to avoid introducing positive values, let alone being a culture.

Value-speak can also be shoehorned into Marxism. In Marxist analysis, values are determined by an outcome of material processes.

According to Marxism, religions are grafted-on tools that facilitate post hoc apologetics. Many people do sincerely believe in religion. They are all weak-minded fools who are being manipulated by their leaders. (I say they are “fools” in the sense that they will lose over time: https://en.wikipedia.org/wiki/Foolishness_for_Christ Not in the sense that they deserve to be oppressed.)

This explains why people claim to be part of a religion when they systematically refuse to follow the values it teaches. This, and the fact that Marxism goes out of its way to avoid providing positive values is precisely what many people find abominable about it.

How Marxism can propose positive programs without values.

Some things in Marxism look like goal-oriented behavior:

r b: people do things that don’t make financial or economic sense all the time, and can often be a lot harder to bribe than they would be if material factors would be as all-determining as Marx and you claim.

Raphael

I agree. The Marxist answer is that those people lose over time. The Social Darwinist conclusion is: therefore, the poor must die. The Marxist conclusion is: therefore, society must be reconstructed to let everyone do the work they enjoy doing.

rotting bones

Source: https://verduria.org/viewtopic.php?p=111352#p111352

These are what emerges from below when the dispossessed unite in solidarity and take back what’s theirs, a rational outcome of popular organizing in terms of a confluence of materialistic goals. Marxism isn’t adding any extra spice.

What I’m taking from Marx.

I’m not following Marx on his values. I’m following a reductive method of analyzing societies first popularized by Marx. The approach itself predates him. Thoreau writes in Walden that every college student learned political economy in his day. Nowadays, it is associated solely with Marx in an attempt to discredit it.

I don’t take his semantic and philosophical claims seriously. In the polemical tracts where Marx does seem to be speaking of values, I find him bombastic and unconvincing. (It wouldn’t surprise me if he intended polemics like the Communist Manifesto to sound bombastic.) Where I speak of values, my go-to is the liberal philosopher Rawls: https://plato.stanford.edu/entries/rawls/#TwoPriJusFai

Of course, some people argue that a method of analysis is also a value, but then everything is a value. This lens of “values” means adopting the 21st century approach to begin with, a case of doubling down on one perspective and refusing to see the world from another. Basically, it’s the “atheism is a religion” trope again.

From the lens of values, I think seeing things in terms of values is of dubious value.

I tend to avoid speaking of values because it’s always an imposition. If I tell someone: “Rawls says X. Now do it!” I am telling them to abandon what their reason says is good and subordinate themselves to Rawls; otherwise, I will be really mad at them.

This is the factor that makes liberals sound like hysterical school marms. People can always just say, “no”.

The Marxist perspective is better for coalition building. Without values, people don’t need to agree to fight for the same goals as long as their materialistic goals align.

The 21st century lens is actively harmful.

Dividing people into groups is known to undermine solidarity. Let me give you a simple example to show you what I mean. Those who assimilate to Western culture in Kolkata often turn out to be fascist. A common sense conclusion many would draw in accordance with mainstream 21st century metaphysics is that Western culture is fascist. You can clearly see what’s wrong with this through a Marxist class analysis: If someone can assimilate into Western culture while living in Kolkata, the city of beggars, what does that say about their wealth and status in society?

It is for reasons like these that I believe class analysis fits the facts better.

Even on the left, 21st century metaphysics is being used to tell people to stay within their own culture, destroying cosmopolitanism. It’s so bad that nowadays, many people think a leftist is a small-minded gremlin who wants everyone to stay inside one culture and interact like primitive tribes, whereas being right-wing means being cosmopolitan!

I agree with the spirit of this criticism. Formative influences in my childhood include, in no particular order: 1. Casual Islam. Only my mother prayed, and only because she wanted to. 2. Bengali art. 3. Soviet space mania with its ancillary physics and mathematics. 4. Books from across the world, and 5. A steady stream of pop media diet.

So no, I don’t appreciate the 21st century’s insistence on classifying me with “Muslim” “culture”.

I have nothing against variation among humans.

I’m only rejecting culture as the explanation for human variation. I just think it’s covered by: 1. Marxism’s “everyone should be allowed to do the work they enjoy”, 2. Psychological variation, 3. Institutional practices, etc. I don’t need “culture” to explain anything.

Laulai or Neo-Arcadian, language of the breakaway civilization

Draft 6: More typos. Said anθtka for humankind instead of anθka in the lexicon. Added the -st coda.

Draft 5: Added two sentences at the end of the accusative overlay paragraph explaining how the “source” is conceived of in Laulai. Thanks to bradrn on the ZBB for suggesting the term “metalinguistic”.

Draft 4: Explaining the -am.

Draft 3: Mentioned the accusative overlay style. Death and typos.

Draft 2: Typos. Corrected one grammatical description.


0. Introduction

0.1 The language and its speakers

Laulai [lau.ˈlai] (exonym: Neo-Arcadian) is spoken by some eight million people whose ancestors left the Earth in the sixth century AD and have been living ever since in armored holds strung from Mercury to the middle system. They are descended from an Arcadian hill people and from the brotherhood that came up into their valley out of Kroton carrying the Pythagorean doctrine.

The Laulai will tell you their name means lau “wave” + lai “beginning”: the first wave, those of the first rising, the Vanguard. It probably does not. Laulai is a substrate word, opaque in and older than Auloic. The brotherhood used it for the hill people they settled among. The Laulai think they are the master race of the solar system, but they continue to use the old name.

The brotherhood came out of Magna Graecia believing that number governs the world. In the highlands, they proved there is a small set of intervals, the serk or true intervals, such that a physical system brought into alignment with one does mechanical work. Provided that a mind is present proving the theorem, a hull built to the proportion of a serk in the appropriate units accelerates, and a resonator tuned to one turns a dynamo. This force is called vril †, a word that comes from late Latin. A people who were farming goats in 500 BC reached the moon in a thousand years propelled by this power.

The ratios are complicated. They are not the ratios the historical Pythagoreans wrote down: 2:1, 3:2 and 4:3. Finding a new one is the work of multiple lifetimes. Each guild knows a handful and keeps them secret.

The mathematics has to be done by a mind in real time. A serk on a plate doesn’t generate power by itself. A person (a loaded term in Laulai) has to understand the math and prove the theorem. Conducting the proof is physical work performed by a nervous system that makes it effective. The Laulai word for this capacity is sorm, the reach. The Laulai word for developing this ability is xamn, the waking. See §0.3 below.

0.2 The ksost

The ksost are planetary-scale globules of exotic matter. They come from beyond the firmament, singly and at shortening intervals. In the nursery, every Laulai child hears them coming when the sirens blare.

What is wrong with them. A ksost is mam, crooked. Everything within the firmament is built on proportions that resolve. Reduce a rib, a resonator, a hull or a moon, and the reduction terminates. A ksost does not. Its proportions keep running past every terminating algorithm the guilds know of, each one in a different direction.

They have no single size. Range it twice and you get two numbers that will not reconcile, though the target has not moved. Its extent is an interval rather than a quantity, so a rangefinder returns a kolt (bracket): between eleven and nineteen thousand. Everything downstream of the measurement inherits that bracket. Gunnery against a ksost therefore means filling a volume rather than hitting a point. The seventh guild would prefer to board the target.

Their insides are bigger than their outsides. The technical word is kolp, the fold. A boarding party can walk for four days inside a body that could easily be towed. The corridors are the same corridor appearing repeatedly, marked by nars (an open seam) a join where two surfaces meet at an angle that does not add up. The eye sees it as a shadow. When measured, you feel an edge that’s not there. Companies rope themselves together and pay the rope out behind them. That rope is the only environmental factor that can be trusted to have a fixed length.

They sound. Anything with proportions corresponds to a pitch. A ksost‘s proportions slide rather than settling, which the sixth guild’s instruments read as a sarn (a wandering tone). Broadcast through space along an etheric medium, it comes up through the deck before it can be heard. Crews describe it as a chattering of the teeth and a vibration in the bridge of the nose.

They damage their observers. Prolonged observation of a non-terminating figure affects the nervous system. The sixth guild calls it mamn (the crooking). The effect is contagious. First the inner ear stops agreeing with the eye, then the hands stop going where intended, then a person cannot visualize a proportion at all, a career-ending calamity. Hunters work off instruments and go by the sarn.

They shed. Behind a ksost there is a wake of rimp, crooked matter. It is cold, it can be picked up, but it will not stack, will not tessellate and will not sit still in a hold. Most of what the guilds know about the serk they learned by competing to get their hands on rimp. This makes it expensive. Storing it is an issue because crookedness is contagious.

They have purpose. They are not alive in any sense that can be classified using the syzygies. Nevertheless, they are purposive. Most of them go for a target: the sun, the moon, one of the outer holds, and often enough the Earth. One went for nothing anybody could identify. It is still floating in space at a point relative to other objects in the solar system.

The kinds. No two are alike, but hunters have field names for behaviors they keep encountering. The names are class VII.

θalm the plate: flat, tens of kilometres across, no thickness anybody has measured. Edge-on it is not there. It comes in slowly and it cuts anything it encounters.
šarn the singer: heard for eleven days before it was seen. Named on the sarn with the inner holds’ sibilant (§8.3, L9).
mnok the jesters: several thousand small, identical bodies sharing a single figure. Destroying any number of them has no effect: There is only one object, and none of its components are that object.
xasp the mouth: an opening. Things go in; rimp comes out.
kolp the fold: small outside, enormous inside. The only kind that has ever been mapped, differently each time.
arke the still one: entered, stopped, and has done nothing since. One is still out there. The seventh guild will not approach it and does not say why.

How they are fought. By proof. A hunting company goes out carrying the mathematics describing the limiting case of a serk and closes the gap: the prover holds the ksost‘s figure, states the construction and runs the algorithm. If the last step lands, the body is stitched to a resolving proportion, and the contagion halts. The verb is rakt, to close. A hunter does not say he killed it. He says it was closed. The language of the proof must satisfy some arithmological properties that will be discussed later.

What is left afterwards is a rakt-rim, a closed body: finite, measurable and cold. It now has a fixed size. Research halls will pay a fortune to get their hands on it if you can deliver it to them without succumbing to the contagion.

If the chain does not land, the ksost is remains itself and the prover is destroyed. He has put a great deal of vril through a ratio that did not resolve, with himself in the middle of it. What returns is a corpse or an imn-anθ (§0.3).

0.3 The child lords and the creatures of ash

The sorm (the reach), which lets a person hold a figure and put force through it, is at its strongest at about the age of seven and gone by about fifteen. This is because of secret ratios at work in the construction of the human body.

Laulai armies are commanded by children. A sen-mis, a child lord, goes to the war-shrine at four, is woken at six or seven. By eleven can hold a construction of forty steps while under fire and close it. The shrine trains them in occult mathematics and military sciences. An experienced sen-mis of thirteen with a good company behind her is a force to be reckoned with.

When adolescence arrives, the reach goes away. What remains is an imn-anθ, an ash-person: a former lord who cannot hold a conversation, and spends the rest of a long life muttering in a gallery. The Laulai keep them fed and warm and near the shrines because every so often an imn-anθ stops muttering and speaks one clean sentence: a θamn, an axiom, something seen entire and without proof. About one in nine of those turns out to be true and important. The rest are noise. An amanuensis sits with each of them and writes down their words.

A minority of lords return to their senses. This is an irk-anθ, one turned back. Most irk-anθ want to sell books or coffee in quiet shop somewhere on a low gallery away from crowds and attention. Some do other things. A mne-mis is a war-lord, a burnt child grown into a general who now sends other children in their place. A teu-anθ works at proofs in a hall. An orn-anθ sings esoteric songs with frightening words but an irresistible lilt. The general population fear and revere such people.

0.4 Earth

The Order says the earth is not defended by its inhabitants and would not survive one ksost on its own. That’s what is used to justify the way the earth’s population is treated.

A hold runs on valves, ducting, hull-plate, boring and waste. This work is done by abducted mortals and bred slave populations. Mortals are brot †, class V, the class of seed, fire, livestock and grain (§4.2). The bred lines include the kauzes (diggers), the sipzes (hammerers), the nalzes (cooks), the pmizes (hunters), and the falzes (lovers), bred to lure hapless mortals into Laulai congregations on earth.

The congregations (brot-launt) are societies the Order plants on Earth through falzes intermediaries. The congregation often owns things like a pedigree book, a ritual space and a liturgy. The oldest are Anglo-German in the nineteenth-century. They were organized around two interests, heredity and psychic powers, both of which were brought in by the mortals themselves. Through the congregations, the Laulai influences Earth’s supremacist movements and most of its governments. This approach is cheap, congenial and self-recruiting. The congregation is also a bulk source of slaves. Members who vanish are written up as casualties of violent clashes with rival extremists. They are in fact in an off-world hold, tightening bolts.

A congregation is also used as an instrument. The ninth guild sends down a serk: a ratio, instructing the congregation’s inner circle to hold its tones, in unison, at a fixed hour, as long as the meeting lasts. Several hundred nervous systems in phase constitute a powerful resonator that can be used from space.

When quality matters more than numbers, the press-gang is conducted. A pmizes crew, coordinating with a congregation’s intel, abducts the targeted individuals directly at night, off roads and out of beds. The taken are called xrešt, a noun in class X. Accordingly, they are carried as cargo.

To meet mortals directly, the eighth guild runs a showing (kišt) with an ongzes, a seeing-engine. Mortals call the Laulai Nordic aliens despite most of them having a visibly Mediterranean appearance, not unlike that of olive-skinned Greeks. The small grey incurious ones are kauzes or pmizes.

The eighth guild also handed Earth’s occultists the word vril, which the Laulai got from the Romans (§9.3).

0.5 The Auloic family

Auloic is a small family of agglutinative languages once spoken around the Peloponnese, in the highlands and the karst. It was pushed out of the lowlands by Greek before the classical period. Auloic is partly reconstructible from Laulai, from scattered Arcadian and Messenian glosses, from a few hundred place-names, and from two inscriptions nobody fully understands.

BranchRangeState
Arcadianthe central highlands; the largest branch, and the only one with internal diversityone daughter survives: Laulai
Triphylianthe western foothills and the coast north of Pylosextinct by the third century BC
Kynourianthe eastern seaboard between Argolis and Laconiaextinct; two inscriptions, undeciphered
Aigialicthe north coast of the Peloponneseextinct; place-names only

Laulai survives because its speakers left the planet. Every other Auloic variety was absorbed into Greek in the ordinary way. The hill dialects that stayed on the surface were Greek by the second century AD and gone by the fourth. Laulai has been called Neo-Arcadian in some comparative literature.

Typologically Auloic looks like the other pre-Greek languages of the eastern Mediterranean and the Caucasus rim: agglutinating, suffixing on the noun with a long chain, prefixing on the verb with a field of directional preverbs and class markers, a small vowel system, class agreement, case stacking on dependents, relativization that reaches only the argument that stands, subordination done with non-finite chains and with case endings on the verb rather than with conjunctions. Almost all of that is still there in Laulai, some in fossilized form (§8).

The Laulai describe themselves as plask †, the noble Pelasgians mentioned by Homer, the aboriginals of Greece who were said to be older than the moon. Arcadian antiquarians did claim that. There were ancient writers of fiction who mentioned that the moon’s own people were an Arcadian tribe. The Laulai read these as prophecy and claim to have fulfilled it when they settled the moon in the sixth century.

0.6 The history, in brief

The Imposition (θalt, “the casting-over”), from about 500 BC. The brotherhood replaced thirty-seven words: the numbers above four, the elements, the lights, the nearest kin, four parts of the body, and the objects of religion. Father and mother went. Daughter and elbow stayed. Fire, water and air went; the earth stayed. God, soul and world went, while the altar, the oath and the libation are Arcadian to this day. There is no Greek word in Laulai for a valve, a bearing or a seam.

The vowel-loss, within three generations, and unrelated to the above. The unstressed vowels dropped, first medially and then finally. A language of polysyllabic stems with long suffix chains became a language in which three stems in four have one syllable (§8.3).

The reinterpretation, from about 300 BC. The brotherhood, now several generations in and speaking the language natively, looked at the evolved speech and had a revelation. They saw a language where no noun can be mentioned without a number on it, where nouns fall into opposed pairs, where every act is marked for direction. To this they added by decree a tenth noun class, at least two case endings, a polarity system, and the arithmetic of §7. Each addition sits in a subsystem that does not quite fit.

The descent, from about 200 BC, into the karst under the home valley. The surface holdings were kept for six centuries and then gradually let go.

The Withdrawal (tnošt, “the clearing-out”), completed in the sixth century AD. The moon was taken during this time. The outer holds were founded the six centuries later.

The limit, found about 1100 AD and confirmed by the loss of nine hulls over the following five centuries. The psnai-lont, the firmament, is an invisible wall around the solar system that has prevented organic life from passing through so far. The Order only offers metaphysical reasons as to why it exists. The Laulai are a cosmic aristocracy that cannot leave its own house.

The incursions, older than the official chronicles, arriving at shortening intervals for three hundred years.

0.7 The registers

There are three registers. Everybody uses at least two of them daily.

Laulai proper, the nursery-speech, medr-lok (mother-word). Everything in this grammar is true of this register unless noted otherwise. It is what the shops, the galleys and the gun-decks use.

Tkalok [tka.ˈlok], tka “ten” + lok “word, ratio, account”: the register that mathematics is done in. Tkalok is Laulai with the Hellenic stratum obligatory even when the vernacular has an Arcadian synonym, with tone written (§1.6), with the class prefix obligatory on the verb (§5.3), with the direction of every act stated (§5.2), and with the balance of §7.2 in force. Every proof, every construction, oaths, official correspondence, and orders that must be carried out to the letter are in tkalok. Children learn it in the trial-hall from ages nine to fourteen. The second guild’s war-shrine takes children at four and teaches this register from the nursery, because a sen-mis has to compose it in real time while contagion might be entering through the hull.

Fot-lok, slave-speech. Reduced Laulai spoken by the bred lines and the taken as a common language: no concord, no preverbs, no converbs, three cases, no balance. It is an offence for a person to speak it except downward. It has an ordinary plural, which the standard grammar does not allow (§4.1 ii), but which is nevertheless spreading upward from the lower galleries.

0.8 Pythagorean interpretation of the grammar

SubsystemInherited from Proto-AuloicInterpretation
Numeral suffixes on nouns (§4.1)obligatory enumerationqualitative number: every mention states a thing’s arithmological state
Noun classes with concord (§4.2)nine semantic classesthe Table of Ten Opposites: a tenth class decreed to make the count
Class agreement on the verb (§5.3)polypersonal prefix fieldthe act is stamped with the kind of thing it applies to
Directional preverbs (§5.2)four orientational, plus a growing locational setthe decad of directions, and the ladder of descent and ascent
Postpositions (§4.3)seven, no case morphologyten emanation cases, two of them Greek, sorted into a tetraktys
Case stacking (§4.4)dependents agree in casethe emanation runs down the whole phrase
Converb chains (§5.6)clause-chaining, non-finitethe proof
The joints (§5.6)a verbal noun taking the postpositionsten of them, sorted into a second tetraktys: the emanation runs through the act
The relative prefix (§6.6)a second slot in the agreement fieldnothing: the ninth guild doesn’t like that it seats a doer in the case of what stands
Rest / motion aspect (§5.1)stative vs. dynamic verb classesbeing over becoming
Pitch accent (§1.6)three registersthe fourth and the fifth sounded in every sentence
Monosyllabic root canon (§1.3)an accident of vowel-lossthe triad as the shape of what exists
nothingpolarity: peratic and apeiric (§4.2)
nothingthe decad-balance on an effective step (§7.2)
nothingthe ten guilds read as the ten syzygies (§4.2)

The rows with “nothing” in the middle column are where the brotherhood constructed rather than interpreting the grammar. The other components were already there and were given a better story.


1. Phonology

1.1 The consonants

The primary decad. Ten consonants in a triad, a triad and a tetrad. The doctrine has found a way to count them that comes out at ten, which took some doing.

RankNameMembersManner
1Limit triad (lont)/p t k/voiceless stops
2Breath triad (psnai)/f θ s/voiceless fricatives
3Mediating tetrad (arm)/m n l r/nasals and liquids

A word may also begin with its own nucleus (a “head”, ir “lip”, ont “to be”). The zero onset is not written and is not counted, being the silence out of which the ten proceed.

Proto-Auloic had ten consonants, p t k s m n l r and two glides w and j. The glides went (§8.3, L1) and /f/ and /θ/ rose to take their places in the count. The decad has always existed, but it has not consisted of the same consonants in the past.

The ogdoad of descent. Eight further consonants occur, none of them primary. Each arose from the decad by a law that has since stopped operating, and each is now partly independent.

SegmentArose by (§8.3)In the corpusStatus
š*s beside a dental, and initially in the inner holds20 stemsadmitted to the standard
č*k before a front nucleus21 stemsphonemic; the law has stopped
x*k aspirated, word-initially35 stemsphonemic
z*s voiced between nuclei34 stemsphonemic
dvoicing of *t42 stemsphonemic
gvoicing of *k20 stemsphonemic
bvoicing of *p15 stemsrare; the labial resists
ðGreek d spirantised, in the oldest loans only3 stemsfossil

The akousmata hold that the labial, being the mouth’s boundary, will not be made to sound. The /b/ is duly rare, and is considered uncouth among higher circles. /ð/ survives in ðaur † “water” and oðas † “path,” both Greek from the first century of the Imposition. This makes them older than the law that would otherwise have caught them.

Two segments occur in one word each. /ž/ in džait “to live,” which has a commoner variant zait with no difference in sense. /v/ in vril † “motive force, the work a true interval does,” which is Latin and came in late enough to miss the sound laws (§9.3).

1.2 The nuclei: the tetrad and the yoked triad

The four simple nuclei are /a e i o/. The language has four roots consisting of a single simple nucleus, and each is also a word.

a “head” • e “brother” • i “bird” • o “long”

The tradition calls these the four monads. A great deal of commentary rests on them. Proto-Auloic had five vowels. The fifth was lost by an ordinary sound change (§8.3, L11). Languages in the region tend to have a four-vowel system.

The three yoked nuclei are the diphthongs ai au eu, each counting as one nucleus and one syllable. Four simple and three yoked make seven, “the number without mother or offspring.” The doctrine says that’s why the voice can be counted but not generated. They are the residue of the lost glides (§8.3, L1).

Hiatus is licit in one sequence only. Two nuclei may stand together if and only if they are i + o: xio “north,” plio “dissonance,” θio “rumor,” tio “shoe,” nio “to refuse,” pio “delight” and io “echo”. Every other apparent vowel sequence in the corpus is one of the three diphthongs. A diphthong, being two morae already, never stands beside another nucleus. A suffix that would break the rule either takes its consonant-lean ally, or it’s swallowed (§1.5, laws 4–5).

/u/ is not a vowel. It occurs as the closing element of au and eu, and otherwise in one word: nukt † “night,” which L11 reached too late.

Length is not phonemic and is not written.

1.3 Word shape

Laulai is a monosyllabic-root language: 787 of the 1,106 distinct stems in the lexicon have exactly one nucleus. The property is twenty-three centuries old and falls straight out of §8.3 L3–L4.

The triliteral canon. The lawful root is a triad of segments, usually onset–nucleus–coda: lok, met, θom, xer, paur, tas, nam, pok. 531 stems have exactly three segments and 364 of those are CVC. The doctrine reads this as the phonological form of the teaching that whatever exists has a beginning, a middle and an end.

ShapeCountNameReading
1 segment7the monads and the yokedprior to the triad, not deficient
2 segments122unfinished (nesrak)a root that has not closed
3 segments531canonicalthe triad
4 segments204burdeneda triad carrying a fourth
5+ segments242compoundtwo roots, or a root and a suffix

The seven single-segment roots are exactly the seven nuclei, each standing alone as a word: a “head,” e “brother,” i “bird,” o “long,” and the yoked ai “to run,” au “brown,” eu “ancestor.”

The tetrad cap. No phonological word exceeds four syllables, suffixes included. Longer grammatical words break into two phonological words at a juncture, written . Every count starts again on the far side of it. A hunter’s rank, a hull’s name and a forty-step construction are correspondingly full of hyphens.

1.4 Sonority: onsets, codas, and what may cross a boundary

Ranked: stops and the affricate /p t k b d g č/ = 1; fricatives /f θ s š x z ð/ = 2; nasals /m n/ = 3; liquids /l r/ = 4.

Onsets ascend, with three allowances. A word-initial cluster must rise (pl, pr, tr, kl, kr, kn, pn, tn, gn, dn, br, dr, gl, gr, ml, mr, nl, nr), and two nasals may stand level (mn-, nm-). To this the language adds:

  1. The breath allowance. A voiceless fricative may be followed by anything: θp-, θm-, θk-, θs-, sp-, st-, sk-, sn-, sm-, šn-, štr-, xt-, xp-, xk-, xm-, xn-, xl-, xr-, fn-, fs-.
  2. The sigmatic onsets. ps-, ks-, ts- and č- behave as single segments and may be followed by anything.
  3. The dental onsets. pt- and kt-.

Everything else is unlawful initially. In particular a sonorant before an obstruent (*lnθ-, *rmp-, *nd-) and a stop before a stop (*tk-, *tp-). Nevertheless, the lexicon contains one such stem, the numeral tka † “ten” (§9.3).

Codas descend or hold level: -rt, -mp, -nt, -rn, -mn, -ls, -sp, -rm, -kt, -rk, -nk, -ns, -lt, -ln, -nd, -st, -št, -ng, -rs, -rp, -ms, -lm, -mt, -lk. Sixteen stems had rising codas. Eleven were repaired and five protected: dendr † “tree,” kosm † “world,” makr † “great,” medr † “mother,” petr † “stone.”

The sigmatic codas -ps, -ks, -ts are allowed as the mirror of the sigmatic onsets: ops “eye,” aps “from,” eks “six,” lits “gold,” niks “vibration,” saits “you (pl).”

Inside a word, the coda’s rank must be at least the following onset’s, or the following consonants must themselves form a lawful onset. The second escape does most of the work: mnis-met syllabifies mni-smet, because sm- is lawful under the breath allowance.

What the law allows and forbids. *km-, *θt- and *-tp are all lawful by the rules, but they are unattested.

1.5 Sandhi: the five contraction laws

  1. Like nuclei fuse (the unison): a + a → a. The fused vowel is long. Length is not written and the syllable counts once.
  2. Like consonants fuse: lok + kat → lokat; met + tel → metel.
  3. Unlawful boundaries take the linking -a-: tešt + kne → teštakne.
  4. Hiatus resolves to the one licit sequence. Where suffixation would put two nuclei together and the result is not i + o, the suffix appears in its consonant-lean ally: accusative -am ~ -m, ablative -aps ~ -ps. Three nuclei in a row are forbidden.
  5. The absorption law. Before an aspect suffix a stem-final nucleus is absorbed, diphthongs included: pli + ai → plai “is reckoning,” sni + om → snom “is built,” θko + ai → θkai “is condemning,” nau + ai → nai “is charging.” The same absorption applies to a name taking an arithmological suffix in the call (§5.9): Arna + ek → Arnek. The homophonies this produces, such as nai “is charging” beside nai “yarn,” are tolerated.

1.6 Tone

There are three tone-registers, standing in the ratios 4:3 and 3:2, so that a well-formed sentence sounds the fourth and the fifth. They are named after the words that describe them:

  • θor (low, “the resting”): stasis-aspect verbs, monadic and decadic nouns, verbs in fo-.
  • ske (mid, “the middle”): kinesis-aspect verbs, apeiric-pole nouns.
  • θis (high, “the raised”): peratic-pole nouns, verbs in la- (§5.2).

Like languages in the region, Proto-Auloic had a three-way lexical pitch accent. Pitch that once distinguished words was reinterpreted by the brotherhood to distinguish grammatical categories. The assignment was rigged to occur in the two consonant intervals, which sounded pleasing to adepts trained in Pythagorean musical practices.

The working orthography does not write tone. Tkalok writes it wherever polarity would otherwise be ambiguous. In 1846, a company of twelve took a peratic reading off an apeiric noun in a chain spoken aloud on a gun-deck. They closed it, but eleven of the twelve died doing it. Nobody has since been able to reconstruct what they actually proved.

1.7 Compliments

These two words carry considerable social weight.

rošt “calibrated” is said of a word, a phrase, a hand, a gait or a face that has been brought to a standard and can be checked against it. tilt “tuned” is said of something that stands in a ratio to something else. The first is a property of a thing along with a standard. The second is a property of a relation, and is the higher compliment. A root of exactly three segments is rošt. A sentence whose tone-contour actually sounds the fourth and the fifth is tilt.

To be called mern-rak, equal to the sum of one’s own parts, is the highest compliment one Laulai pays to another.

Speakers of fot-lok are not described as rošt or tilt.


2. Numerals, ratio and measure

The numerals are described early in this grammar because everything else is built out of them. Nine of the following ten numbers are the obligatory number suffixes on every noun (§4.1). The same nine supply the values of the balance (§7.2). Two of them are the two perfections. One occurs in the name the Order gives its own register.

1 en, 2 di, 3 tre (combining tri-), 4 tra, 5 pent †,
6 eks †, 7 sept †, 8 okt †, 9 nop †, 10 tka

All ten are borrowed, in two layers. Five to ten came in with the brotherhood at the Imposition and are Greek except for two (§9.3). One to four arrived a great deal earlier from an Indo-European neighbor in the lowlands, possibly an early Greek dialect or something else spoken there. They were already old and native-feeling by the time the brotherhood arrived. tra “four” is the Greek combining form τετρα- with its first syllable gone, an effect of the sound change §8.3 L2. tre cannot be primitive at all, because Proto-Auloic had no initial clusters (§8.2). See §8.7.

šal “thousand” is the only numeral with no source in Greek, in Italic, or anywhere else, and is the best candidate for a pre-IE Auloic number.

Above ten, there is a reversion: 11 tkakaten (tka-kat-en). 100 ektan, 1000 šal, 10 000 tkašal, the perfect myriad. Long figures are recited positionally, digit by digit, with tas “empty” for zero: 3047 is tre tas tra sept.

Ordinals take the essive: enkne “first,” dikne “second,” trikne “third,” trakne “fourth.” Because the tetrad is the sworn number, trakne means both “the fourth” and “warranted, foursquare, good”.

Units are interval-derived. Lengths are string-ratios of the standard monochord, the lir. Pressure is counted in ditensi steps, each twice the last, making it a logarithmic scale. Pitch and frequency are given in tritensi and tratensi degrees. A declared allowance is a rant.

2.1 The serk

A serk is a true interval: one of the ratios that physically affect the world. There are known to be at least forty. The guilds publicly admit to knowing thirty-one among themselves.

A serk is not a ratio that’s easy to comprehend. The ratios the historical Pythagoreans wrote down (2:1, 3:2, 4:3) build scales but were otherwise physically ineffective. The brotherhood spent its first two centuries in the highlands discovering serk that were long, ugly and irrational. Each has to be held to a tolerance that is beyond human understanding (i.e. the reach) under ordinary circumstances. When a mind reaches one as the outcome of a proof, vril is produced. The hulls are powered by vril.

It is openly taught how to search for a serk, how to prove a candidate, how to write it, how to run a construction on it and how to fail safely. But the values of the effective ratios are guild secrets.

2.2 The two perfections

A number equal to the sum of its own parts, itself excepted, is mern-rak, “part-whole.” The guilds know two:

eks †: 6 = 1 + 2 + 3
septakt †: 28 = 1 + 2 + 4 + 7 + 14

They have been looking for a third for two thousand years.

Six governs things. The hexadic (§4.1) means in healthy running balance. This could refer to resonant qualities in parts of a machine.

Twenty-eight governs sayings. 28 is the triangle of seven as 10 is the triangle of four. If the decad is the tetrakt † then twenty-eight is the septakt †, the heptaktys. Seven is the number of the nuclei, the wandering lights and the metals, “the number without mother or offspring.” Sworn speech balances at 28 (§7.3).

The Laulai use a lunar calendar. All their temporal cycles reset at 28: the watch is 28 hours, the month 28 days, the turn of duty on the firmament 28 watches, and the oath of descent is sworn in the 28th year of life.

The ordinal of 28 is septaktakne, with the linking -a- of §1.5 law 3: “twenty-eighth; sworn, perfected, unimprovable.” The seventh guild calls hunters who return by that title.


3. Morphological overview

Laulai is agglutinative. It suffixes on the noun and both prefixes and suffixes on the verb. The verbal prefix field is the last surviving piece of a much larger scheme (§8.4). Morpheme order is unchanged from Proto-Auloic. The doctrine reads it as emanation: the most inherent categories nearest the root, the most relational farthest out.

Noun template:

ROOT – (DERIVATION) – ARITHMOLOGICAL NUMBER – (POLARITY) – CASE – (STACKED CASE)

Verb template:

(PREVERB) – (CLASS or RELATIVE) – ROOT – (VERSION) – ASPECT or JOINT – (NUMBER)

Noun class is inherent, but unmarked on the noun. It surfaces as a prefix on agreeing words and the verb (§5.3). Polarity is carried by tone or written with -lon / -pol where tone is unavailable.

The agreement slot takes the class prefix or the relative če- (§6.6). The aspect slot takes an aspect or one of the ten joints (§5.6).

Because roots are monosyllabic and the cap is four syllables, a fully loaded verb of preverb, class, root and aspect is full. Anything further breaks at a juncture, and speakers feel the constraint. A sen-mis under fire talks in short bursts with audible hyphens.

3.1 The templates by register

Slotnursery-speechtkalokfot-lok
arithmological numberobligatoryobligatorynormally obligatory, but dropped in some contexts
polaritytone onlytone; written -lon / -pol where tone will not carry itabsent
caseobligatoryobligatoryarchic, accusative, locative; the rest absent
stacked case on dependents (§4.4)usualobligatoryabsent
class concord on adjectivesobligatoryobligatoryabsent: adjectives stand bare
class prefix on the verb (§5.3)optionalobligatoryabsent
aspectobligatoryobligatoryobligatory
preverb (§5.2)optionalobligatoryabsent
the joints (§5.6)all tenthe seven old ones; -aps, -am, -os avoidedthe bare joint only
chainingusualobligatory in proofabsent: clauses are juxtaposed
the bound form (§6.6)usualabsent: it cannot be checkedabsent
the noun of the act (§6.7)usualavoided; it costs a numberabsent
verbal numberoptionalobligatoryabsent
the balance (§7.2)not in forcein forcenot in force

Slave-speech has no preverbs and no converbs. A fot-lok verb is root and aspect and stops. A narrative in this register is a string of short sentences laid end to end. It is the only variety in which a bare uncounted plural is attested.

The arithmological number is obligatory in all three. Everyone in the holds, person or slave or cargo, normally states the arithmological state of everything they mention. However, fot-lok sometimes drops them. There is an example in the texts.


4. The noun

4.1 Arithmological number: the ten inflections

Every noun obligatorily inflects for one of ten numbers, each carrying a quantity and a qualitative association. There is no number-neutral noun. Every mention of a thing is a claim about its arithmological state.

The suffixes are the numerals in their combining grade. Proto-Auloic had obligatory enumeration. Vowel-loss welded on the suffixes on. The brotherhood supplied post-hoc justifications.

The paradigm, on elm “engine” (class VI):

#NumberSuffixFormQuantityDoctrinal and technical sense
1Monadic-∅elmonethe engine as unique original: the master-pattern, the thing others are struck from
2Dyadic-dielmditwotwo engines coupled in opposition; also “some engine or other”: the indefinite, the unvetted, the mass-produced
3Triadic-trielmtrithreeengines in mediated concert; a balanced triple installation
4Tetradic-traelmtrafourthe engine as installed, founded, warranted; the number used in deeds
5Pentadic-penelmpenfivethe engine as generative and live, married to its source
6Hexadic-ekelmeksixthe engine in healthy running balance; the well-tempered plant
7Heptadic-sepelmsepseventhe solitary engine; a one-off, an experiment, a thing with no fellow
8Ogdoadic-okelmokeightmassive material completion: heavy plant, the built solid, and dead plant
9Ennadic-nopelmnopninethe engine at the limit: end of service, redline, the horizon of failure
10Decadic-kaelmkaten / allall engines; the engine-park as perfected totality; engine-kind

Notes.

(i) The decadic is -ka, not -tka: the numeral sheds its stop in suffixation. The doctrine interprets this as the decad, having arrived, lays down what it carried. Phonologically, tk- is unlawful inside a word.

(ii) The decadic does the work of a plural. There is no separate stem for “humankind” or “everyone”: both are anθka, the decadic of anθ “person.” A bare uncounted plural, a multitude that has not been numbered, cannot be said in the standard language. The doctrine is delighted about this. The Order congratulates itself on having created a language where talk of collective punishment is difficult. This is questionable, if for no other reason than that the verb does have a collective suffix.

As a consequence of the above, every available form either singles out or completes. The monadic brot is the unique original, the pattern others are struck from. The dyadic brotdi is some mortal or other, and a hull’s orders carry the dyadic. The decadic brotka is mortal-kind, complete, finished, needing nothing, and is of the same order as engine-kind. Between the specimen and the finished kind there is no definite multitude of unknown size, such as the several thousand million people now alive on a planet, uncounted and unfinished.

Fot-lok has a plain plural and speaks of mortals with -s. The standard grammar calls this a corruption.

(iii) Quantities above ten obey reversion: eleven engines are elmka elm, “all-and-one-more.”

(iv) The qualitative readings are taught and examined in the halls. The difference between the ogdoadic and the ennadic is the difference between a hull that is heavy and one that is about to stop being a hull.

(v) Number on persons. The paradigm is the same on a person as on an engine. A Laulai speaks of himself in the monadic, of a colleague in the monadic, of a guild in session in the decadic, of a bred line in the decadic (falzeska, “the whole of that line”), and of an individual slave in the dyadic, the number of “some object or other.” A slave in the tetradic has been inspected and warranted, which happens to breeding stock. A slave in the ogdoadic is dead. The one number no slave may take is the monadic.

(vi) Example with a ksost. The Watch signs at the ennadic, ksostnop, which could mean either, “at the limit” or “the ninth of the tally” depending on context. A hunting company that has seen it could report at the heptadic, ksostsep, “the one with no fellow”. Seers come back saying the ogdoadic, ksostok, a great built solid. On its own, the number system gets no nearer to a description than this. §4.2a explains the adjectives.

The pentadic would assert that the thing has a source inside the limit. The tetradic would say it was installed on purpose. These are unattested.

4.2 The ten syzygies: class and polarity

Every noun belongs inherently to one of ten syzygies, yoked pairs of opposites. In any clause, a noun stands at one pole: peratic (limit column, θis tone, suffix -lon, from lont “bound”) or apeiric (unlimited column, ske tone, suffix -pol, from pol “many”).

Class says what a thing is. Polarity says what state it is in right now. Handedness, on and off, live and dead, true and warped are grammatical.

SyzygyOppositionConcordFromTypical membershipPeraticApeiric
Ilimit / unlimitedme-met “measure”measures, media, fields, fluids, timesbounded, meteredunbounded, raw flow
IIodd / evenpa-pas “number”number, data, proof, recordodd, prime, indivisibleeven, splittable
IIIone / manyan-anθ “person”persons, bodies, aggregates, partsthe individualthe aggregate, the crowd
IVright / leftxe-xes “wheel”thread, gearing, rotation, cordageright-handed, clockwiseleft-handed, widdershins
Vgenerativesa-saz “animal”sources, couplings, seed, fire, the bredemitting, source, plugreceiving, sink, socket
VIrest / motionel-elm “engine”engines, mechanisms, resonance, soundat rest, cold, parkedrunning, live, hot
VIIstraight / curvedθo-θom “straight”rod, plate, edge, structure, extension, and the ksoststraight, true, closedcurved, crooked, open
VIIIlight / darkfa-faut “light”lamps, rays, images, color, the wakingradiant, visibleoccluded, occult
IXgood / badso-son “good”evaluation, temper, obligation, the sacredbenign, sound, owedmalign, awry, forfeit
Xsquare / oblongne-anbe “square”form, jig, casing, vessel, building, stufftrue, calibratedwarped, out-of-true

Nine of the classes are inherited, unlike the ninth class. Nine are recoverable as Proto-Auloic noun classes with straightforward semantic cores, though the meanings have changed over time. Class IX has no core meaning, holds a quarter of all nouns, and cannot be rigorously defined. The brotherhood needed ten because the Table of Opposites has ten rows. Whatever would not fit in the other nine went into IX, which was glossed good and bad. It will accept anything.

Polarity was mostly the brotherhood’s. Proto-Auloic had a definite/indefinite distinction on the noun, of the kind the languages of the region generally had. The Order reinterpreted this as limited and unlimited, which is why the two suffixes come from the words for “bound” and “many”. This subsystem may only be four hundred years old, if that.

Agreement. An adjective takes the concord prefix of its noun’s syzygy and the noun’s polarity as a suffix.

  • ðaur merilon: “the water, cold-and-bounded”: in the tank, measured, or possibly for you to drink
  • ðaur meripol: “the water, cold-and-running”: on the deck, in the gallery, possibly someone’s problem
  • elm elsonlon: “the engine, sound-and-at-rest”: cold, parked, well
  • elm elkankpol: “the engine, malign-and-running”: live and misbehaving, one of the first phrases an apprentice learns
  • snip xeθomlon: “a true right-hand thread”, against snip xeθompol “a true left-hand thread”

Using a suffix instead of a clause as in other languages helps with brevity.

The ten guilds are read as the ten syzygies. Each guild owns the vocabulary of one class, examines in it, and takes its name as the decadic of its own emblem. The guild is, in this reading, the perfected totality of a craft. A child enters one at nine and is thereafter that guild in dress, in vocabulary and in what it is licensed to work on. A guild is a path. People can and do leave.

ClassGuildNameEmblemWhat it is for
Ifirstmniskamnis “gauge, judgment”measurement, chronometry, and the Watch on the firmament
IIsecondxepkaxep “ledger”number, proof, reckoning: its inner shrine is the mneka, “the War,” the child lords
IIIthirdnomkanom “law”persons, pedigree, judgment between Laulai
IVfourthkertkakert “gear”transmission, mechanism, the fabric of the holds
Vfifthθaukaθau “seed”the Seed: gene-lines, the bred races, the stock of the Earth
VIsixtharmkaarm “harmony”resonance, sound, medicine, maintains the largest collection of serk tables and proofs
VIIseventhrelkarel “blade”edge and structure: its inner shrine is the hunt
VIIIeighthongkaong “vision”the waking, the seeing-engines, and the showings
IXninthmanskamans “hierophant”the Order itself: rite, oath, obligation, the sacred
Xtenthoðaskaoðas † “path”hulls, holds, cargo: therefore the press-gang, responsible for abductions

The war-shrine. Mneka conducts its intake at four, before the trial-hall age, because a commander has to compose a construction in tkalok real time while contagion might be entering through the hull. The second guild concluded long ago that children who learn the register at nine will rarely do that well. The children it produces are sen-mis, child lords. (The compound is attested centuries before the shrine existed. Originally, it meant a lord who had not yet come of age, a young master.) They are taught arithmological games scored by balance. Secret ratios are used in awakening occult powers. A sen-mis of eleven can carry a chain of thirty steps in her head and put the last step down while the deck is rotting away.

Where the races sit.

StemClassConcordWhat follows
a Laulaianθ † “person”IIIan-the individual against the aggregate; may be monadic
a mortal of Earthbrot † “mortal”Vsa-the generative class: seed, fire, livestock, grain, the grown and the bred
a slavefot “slave”Vsa-as above; dyadic by default
a bred linefalzes, kauzes, pmizesVsa-named with the instrument suffix (§4.6)
one of the taken, in transitxreštXne-cargo: form, casing, vessel, stuff
a ksostksostVIIθo-straight/curved, and usually at the crooked pole (§4.2a)

brot is class V and anθ is class III, even though in Greek they were synonyms. Ἄνθρωπος and βροτός both meant a human being. In Laulai they had different classes. Twenty-five centuries later, anθ takes the person-class, the person-pronoun and the emanation cases in full while brot takes the class that also holds se “ox,” θi “sheep,” θau “seed” and tong “harvest.” In Laulai a mortal is not a bad kind of person. It is a crop.

Slave was class III until 1743. Every text before that date has fot in the person class with the concord an-, the expected treatment of an Arcadian word for a captive taken in a hill raid. Every text afterwards has class V. The shift is abrupt, and it began in the same decade as the first bred lines (§9.5).

4.2a The crooked class

The ksost is class VII, straight/curved, and does not usually take the peratic pole, ksostlon. However, a hunting company that has closed one (§7.1) can put -lon on a ksost.

  • It takes concord. θo- like any other class VII noun. An adjective modifies it in the ordinary way: ksost θomampol, “the ksost, crooked and open.”
  • Descriptive vocabulary is geometric:
AdjectiveWith concordWhat it says
mamθomampolcrooked; out of true in the general way
θolnθoθolnpolunclosing: the reduction does not terminate
koltθokoltpolbracketed: it has no single measure, only a range
tirnθotirnpoldoubled: the same part occurs more than once in one body
nirnθonirnpolover-hollow: the inside is larger than the outside
saunθosaunpolsounding: it is giving off a sarn

A specimen sighting, off the firmament, with two adjectives on it:

ksostok θokoltpol θosaunpol psnai-lontdips tiθošainai.
ksost-ok | θo-kolt-pol | θo-saun-pol | psnai-lont-di-ps | ti-θo-šain-ai
ksost-OGD(8)-ARCH | VII-bracketed-APEI | VII-sounding-APEI | firmament-DY(2)-ABL | HITH-VII-come-KIN
A ksost, a great built solid, bracketed and sounding, is coming this way, in across the firmament, from which station I know not.
Balance: 8 + 2 = 10 → 1. rak.

The dyadic on the firmament says some station or other (§4.1) because the range is too uncertain for the current instrument. The ogdoadic on the ksost says it is a great built solid. θokoltpol says the gunners will be given a bracket and not a range. θosaunpol says the resonance galleries heard it first. It may have been coming for some days.

4.3 The emanation cases

There are ten cases, arranged as the tetraktys: one source, two relational, three mediating, four worldly. The archic is the bare stem and has no source. Two are Greek endings imposed on the language. Five of the remaining seven have close Greek look-alikes: met beside μετά, es beside εἰς, aps beside ἀπό, kat beside κατά, tel beside τέλος. Only mon and kne are native beyond argument. If the five are loans, then seven of the ten cases postdate the Imposition. This means the case system in its current form is not inherited at all. It is unknown whether it evolved naturally like a creole through the use of Greek technical vocabulary.

RowCaseSuffixFromFunction
1Archic-∅the thing as it stands: source, and undergoer (§6.2); citation form
2Dative-monmon “to, for”recipient, goal, the other
2Ablative-aps ~ -psaps “from, than”separation, origin, comparison; and the ground of a saying
3Locative-eses “in, at”in, amid, at the middle of
3Instrumental-metmet “with, by”means; and the doer of a kinesis verb (§6.2)
3Comitative-katkat “and”accompaniment: together with
4Accusative-am ~ -mGreekthe affected patient, when it is definite and matters
4Genitive-osGreekof, made of, belonging to
4Essive-knekne “likeness”in the role of, in the form of
4Terminative-teltel “end, death”unto, back to, culminating in

A note on -am. The accusative is unusual among the Greek borrowings. Attic and every dialect the brotherhood could plausibly have carried out of Magna Graecia mark the accusative singular in -ν, not -μ. However, word-final -ν regularly assimilates to -μ before a following labial-initial word, a phenomenon attested even in Greek epigraphy, where τὸν is occasionally spelled τὸμ ahead of πατέρα. The brotherhood is thought to have taken the ending not from the grammatical paradigm but from continuous speech, possibly a set liturgical phrase heard over and over ahead of a labial-initial noun. What was borrowed was the allomorph. This is not unlike what happened to tra “four” (§2), another Greek fragment where the assimilated form was kept rather than its dictionary entry.

The paradigm, on psnai “aether, sky, breath” (I) and lok “word, ratio, account” (IX):

Casepsnailok
Archicpsnailok
Dativepsnaimonlokmon
Ablativepsnaipslokaps
Locativepsnaieslokes
Instrumentalpsnaimetlokmet
Comitativepsnaikatlokat
Accusativepsnaimlokam
Genitivepsnaioslokos
Essivepsnaiknelokne
Terminativepsnaitelloktel

Number precedes case: psnaios “of the aether,” elmkatel “unto all engines,” elmtram “the installed engine as patient.”

Regarding the terminative note that both the end of a process and the end of a life are the same word. This lets a company order, ksostkatel, “unto all the crooked ones”.

The four monads decline badly. a “head,” e “brother,” i “bird,” o “long” are single nuclei and every vowel-initial ending collides with them. The accusative of i “bird” is im, homophonous with im “darkness”. The akousmatists have written voluminous commentaries on this.

4.4 Case stacking

A dependent noun takes its own case followed by the case of the thing it depends on. This is an inherited, areal feature of Auloic’s neighbors.

The commonest instance is the genitive. rel “blade,” pmišt “hunter”:

pmištos rel “the hunter’s blade” (archic head, no stacking)
pmištosam relam “the hunter’s blade, as patient”, genitive, then the head’s accusative
pmištostel reltel “unto the hunter’s blade”, genitive, then the head’s terminative

The same happens with the other cases, though it is rarer:

kotesam ksostam “the ksost that is in the hold as patient”, locative kotes, then accusative

Number stacks too. The dependent keeps its own arithmological number and takes the head’s case, so a single phrase can carry two values. Both of them count in the balance (§7.2). relka “all the blades” inside an accusative phrase is relkaosam, worth ten by itself. A proof-step with a stacked genitive in it changes the count by a lot. A sen-mis composing while under attack could restructure the whole clause to avoid one.

Slave-speech has none of this. A fot-lok genitive is a bare stem in front of its head.


4.5 Pronouns

singularinherited plural
1men “I”mens “we”
2sait “thou”saits “you”
3 animateken “he, she”kens “they”
3 inanimateton “it, the aforesaid”

ton is the anaphor of schematics: “the aforesaid gate.” It is also the pronoun of mortals and of slaves, ken being reserved for class III, the Laulai. A brot, a fot and a xrešt are ton along with gates and bearings. A slave being addressed takes the second person sait.

A ksost is ton. It’s class VII, and class VII is rods and plates.

The plural in -s is Arcadian. It is the last surviving fragment of the plural L4 destroyed. It survived because pronouns are short, frequent and stressed. It coexists awkwardly with arithmological numbers, which pronouns also take: menka “we-all, the guild in session,” kendi “the two aforesaid, in opposition,” kentri “the three aforesaid, in concert.” Careful speakers use menka for the guild and mens for the people in the room.

4.6 Derivation

Addition (-kat-, from kat “and”) sums concepts and their numbers: lirkatplas “string-and-plate,” a sounding-board assembly.

Multiplication (-di-, from di “two”) is the dyad’s act of doubling: merndimern “part-by-part,” a lattice or a matrix.

Ratio derivation is done on tensi “ratio” with the numeral combining forms: ditensi “the octave-ratio, 2:1,” tritensi “the fifth, 3:2,” tratensi “the fourth, 4:3.” A kert tritensikne is a gear in the form of the fifth: a 3:2 reduction.

The frozen suffixes. -an ~ -nan (quality), -zes (instrument), -št (assessed), -ne, -in (diminutives) were Proto-Auloic inflection and are now derivation (§8.4). Three are still productive:

  • rap “strong” → rapan “strength”, pem “weak” → peman, plio “dissonance” → plionan “dissonant”, kradkradan “harmonic”, kert “gear” → kertan “geared”, aun “rite” → aunan “ritual.” The suffix is -an after a consonant and -nan after a nucleus. sen “novice” → sennan “youth” avoids the correct allomorph because regular senan would collide with senan “to teach.”
  • plige “to gauge” → pligezes “a gauge”, mozes “resonator”, nazes “bushing.” This is the shops’ way of naming a new tool. It is productive.
  • -št forms the thing once it has been graded: nešt “watch,” sišt “inspection,” xrešt “one of the taken” from xre “to take,” θaušt “graded gene-stock” from θau “seed,” and sništ “construction, a figure once it has been built” from sni “to build.”

The rest are opaque. θonan “cruel,” tenan “ignorance,” konan “product” have no recoverable bases and are learned as is.

The bred lines are called by the instrument suffix:

kauzes (< kau “to dig”): the digging line: hull-boring, waste, ducting.
sipzes (< sip “to hammer out”), the striking line: plate, rivet, repair.
nalzes (< nal “to cook”): the feeding line: galley, hydroponics, recovery.
pmizes (< pmi “to hunt”): the tracking line: bred for the Watch and the press-gang. It’s the only line permitted to use a weapon.
falzes (< fal “to love”): the handling line: bred for symmetry, loyalty and appetite. They are placed in the congregations on Earth as handlers.

A falzes is morphologically a device for loving in the sense in which a pligezes is a device for gauging. The suffix carries no class of its own: mozes “resonator” is VI, nazes “bushing” is IV, tsmizes “moon” is VIII. The bred lines are class V.

Words for the burnt:

imn-anθ “ash-person”: a sen-mis whose reach is gone. imn is ash and also wine.
irk-anθ “turned-back person”: one who lost the reach while keeping their senses.
mne-mis “war-lord”: an irk-anθ who commands.
teu-anθ “proof-person”: one who works at proofs in a hall.
orn-anθ “chant-person”: an esoteric singer, on the same stem as orn “to forge.”
pmišt “hunter”: from pmi “to hunt,” with the assessive: one who has been tested.

5. The verb

5.1 Aspect: stasis and kinesis

The primary verbal category is the rest-motion opposition, not tense. This is Arcadian and typical of the region.

  • Stasis -om (θor tone), from om “to stand”: states, finished configurations, the way a thing is now. metom “it has been measured.”
  • Kinesis -ai (ske tone), from ai “to run”: processes, running, becoming. nai “it charges,” from nau “to push, to charge,” its diphthong absorbed before the suffix (§1.5, law 5).

If necessary, tense is indicated by particles and used adverbially: nak “long ago,” kra “yesterday,” nain “now,” tom “tomorrow,” alme “then.” Proto-Auloic had no tense either.

The opposition is more than aspectual: stative and dynamic are two classes of verbs as much as two forms of one. Many roots occur in one only. Roots that occur in both often differ by more than aspect. tos is “there is” in stasis and “sets down” in kinesis. nil is “holds” and “takes hold of”. ont “to be” has no kinesis at all. rakt is “is closed” and “is being closed”.

5.2 The ten preverbs

The verb takes a prefix from a closed set of ten marking the direction of the event with respect to the speaker. The set is inherited, it sits at the left edge where the vowel-loss never reached (§8.4). No larger piece of Proto-Auloic morphology survives intact anywhere else.

The four orientational preverbs are ancient and opaque:

PreverbDirectionFrom
1ti-hither: toward the speaker, onto the speaker’s own ground*ti “this side”
2na-thither: away from the speaker, outward, onward*na “that side”
3la-upward: up, out, into the open*la, still free as the adverb la “upward”
4fo-downward: down, in, onto from above*fo, still free as the adverb fo “downward”

The six locational preverbs are younger, transparent, and still stand free as adverbs. Whether three of them have finished becoming preverbs is a dialectal difference between the inner and outer holds:

ane- in, into • ni- out, out of • at- across, through •
ok- around, about • irk- back, backward • ets- forward, on

Four and six make ten, which the doctrine interprets as the decad of directions. It is set beside the ten cases and the ten syzygies.

Form. The orientational four are open syllables and attach without adjustment: ti-metomtimetom, fo-θkomfoθkom. Before a vowel-initial root the preverb loses its own nucleus: na-ontomnontom, la-ontomlontom, the latter being homophonous with lont “bound.” The one preverb that does not elide is ti- before o-, since i + o is a licit hiatus: ti-ontomtiontom “it is here, it is at hand”.

The locational six end in consonants as often as not. Where the juncture would be unlawful they take the juncture rather than the linking vowel: at-šainai “flows across,” not *atašainai.

The direction is beginning to do things besides indicating direction. Because the preverb says which way an event moved with respect to the speaker, it says by implication how the speaker comes to be talking about it. This makes the preverb field the beginnings of an evidential system.

PreverbLiteralImplication
ti-it came here, to meI was present; I underwent it; first hand
na-it goes from here, outwardI am passing it on; it reached me from another
la-it came up, into the openit was brought out, worked through, shown
fo-it came down, ontoit descended; the waking, the seizure, the thing that arrives unasked

A verb with no preverb implies nothing about evidence is the everyday norm. Tkalok always fills the slot.

The contrast between la- and fo- is important. A thing that came up was brought up by somebody and can be brought up again by somebody else. A thing that came down arrived, and the person it arrived on is the only witness there will ever be, meaning they were seized by an insight. The eighth guild works almost entirely in fo-.

The two old factions of the Order take their names from the same distinction without using preverbs: sesnan “the hearers,” from ses “to hear,” and teunan “the provers,” from teu “proof.” The hearers are the fo- party and the provers the la- party.

5.2a Manner

Laulai has no interrogative meaning “how.” The corpus only has tis, kes, ond and pols. This gap is ancient. A speaker who wants to know where something came from asks about the direction with the polar particle mar:

mar ti? “Were you there?” • mar na? “Are you passing it on?” •
mar la? “Did you bring it up?” • mar fo? “Did it come down on you?”

mar fo asks whether somebody is claiming a seizure.

The gap is smaller than it looks because manner is not a nominal in Laulai. It is a verb form: the instrumental joint of §5.6 says by doing thus. A speaker who wants to know a manner asks for the joint, not for a word: mar met?, “by doing what?”. This is how a deck would ask how something was managed. An interrogative for manner wouldn’t be doing anything thing that the joint wasn’t already doing.

5.3 The class prefix

Between the preverb and the root, the verb carries the concord prefix of its absolutive argument, the thing that undergoes. This is the single argument of a one-argument verb and the undergoer of a two-argument one, regardless of aspect (§6.2). The prefixes are the same ten as on the adjective (§4.2).

θorakt- close a ksost, a rod, a plate (VII) • parakt- close a theorem (II) • anmelai “looks at a person” • nemelai “looks at a hull” • elmelai “looks at an engine”

This is the last survivor of a much larger system. Proto-Auloic cross-referenced several arguments in the prefix field at once, in the manner of the languages north and east of it. Vowel-loss came at the word from the other end and never reached them (§8.4). One slot is left, but two things use it: the class prefix, and the relative če- of §6.6. A verb has one or the other, not both.

Where it appears. It is obligatory in tkalok, where it functions as a secondary failsafe mechanism. A listener who mishears the noun can recover its class from the verb. A prover who has lost track of which of two objects he is working on will hear himself say the wrong prefix before he finishes. It is optional in the nursery-speech. The rule of thumb is that it goes in when the absolutive noun is not in the clause and stays out when it is. This is how an agreement marker that is halfway back to becoming a pronoun would be expected to work. The akousmata (§11.1) have none, being archaic speech.

The class prefix and the preverb stack in that order, preverb outside: la- + θo- + rakt-omlaθoraktom “it is closed, and the working is out where you can see it.”

The prefix is the first casualty of the four-syllable cap. Where preverb, prefix, root and aspect will not fit in four (§1.3), the prefix is dropped. Polysyllabic roots almost never carry one. Ordinary speakers are coming to think of class agreement as something that happens in tkalok and formal speech rather than as part of the verb.

5.4 Version: causative, potential, involuntative, necessitive

Four suffixes stand between the root and the aspect. Three are archaic, frozen Proto-Auloic derivational endings. They are typical of the region. The fourth might be some two hundred years old, and the join is visible to philologists.

SuffixFromSense
Causative-sensenan “to teach”make, have, cause to
Potential-raprap “strong”can, is able to, has the reach for
Involuntative-inthe old diminutiveit happened; I did not do it
Necessitive-al ~ -nalal “debt”it falls to be done; it is owed

tosai “sets it down” → tosenai “has it set down”
metom “it has been measured” → metrapom “it can be measured”
melai “looks” → melinai “finds himself looking”
θpai “carries” → θpinalai “has to be carried”

An imn-anθ feeling a weak stream of insight might be tempted to say it with fo- and -in: it came down, and I did not do it. The amanuensis records the claim, to be tested later by a guild.

The potential could be used to describe a child lord: θoraktrapai, “she can close it”.

The necessitive is the newest morphology in the language. -al is al “debt,” which is still a free noun in class IX meaning a debt. It takes -nal after a nucleus on the model of -an ~ -nan (§4.6). Some say the Order ratified it because it brought the version markers to four. It doesn’t say that a thing ought to be done but rather that the doing is owed. Orders are therefore not given in it. An order takes the jussive (§5.5). Hunters use it: raktalom, “it needs must be closed”.

5.5 Verbal number and the jussive

After the aspect: -∅ singular, -di dual, -ka collective, the same three formatives as the noun, with the same readings. A collective on a verb of motion means the company moved as one thing.

Directives take the preposed jussive pen (from penan “command”) with kinesis. They conventionally take na- since one commands outward: pen naklosai “close it.”

A directive in ti- is an order from somebody standing where the thing is happening. This is why the war-shrine drills its children in ti-. A standing order in the confederation is that a ti- order from a qualified child is to be obeyed first and questioned later. Giving such an order without cause is a grave charge against a sen-mis.

5.6 The ten joints

Laulai does not subordinate with conjunctions. It puts a case on the verb. A dependent act takes, in the slot where its aspect would stand, one of the ten case endings (§4.3), and that ending says how the dependent act stands to the act it hangs off. The form is called a rin, a joint, a word used in a gearing shop. The set of them is rinka, the ten joints. The doctrine sets it beside the ten cases, the ten syzygies and the ten directions.

Two of the ten that a proof uses are sometimes described as converbs. The other eight are called as adverbs.

RowCaseJointWhat it saysOn mel “look”
1Archic-∅one act and then the next, with nothing said about how they standmel
2Dative-monpurpose: in order to, so as tomelmon
2Ablative-aps ~ -pscause: because, since, seeing thatmelaps
3Locative-essimultaneous: while, in the doing ofmeles
3Instrumental-metmanner and means: by doing, by way ofmelmet
3Comitative-katsequential: having done, and thenmelkat
4Accusative-am ~ -mcomplement: that, the fact that (§6.7)melam
4Genitive-osattributive: which, that (§6.6)melos
4Essive-kneconditional: if, in the event thatmelkne
4Terminative-tellimitative: until, up to the point wheremeltel

A jointed clause has its own arguments and its own class prefix. It takes its subject from the finite verb at the end unless a new one is stated. The chain is right-headed: everything hangs off the last verb, which alone carries aspect and number.

The concessive is two joints. even if is the conditional with the clitic -kat on it: melknekat, “even if he looks”, a stacked joint on the model of the stacked cases of §4.4. There is no eleventh ending. This fits the doctrine.

Where they came from. Proto-Auloic subordinated by putting a postposition on a verbal noun, which is how most of the region did it (§8.2). L3 and L4 took the verbal noun’s vowel. The postposition survived because it was outside it, exactly how the case suffixes on the noun survived (§8.4). What is left is a case ending sitting on a bare root with nothing in between. This means a joint carries no aspect, no number and no polarity. There is nothing there to carry them. The doctrine interprets this as the emanation running through the act as it runs through the thing.

Three of the ten are unstable. They are the three that begin with a nucleus (§9.4 ix). They are also because, that and which.

Eight worked examples, in the order of the table. The complement joint and the attributive joint have sections of their own (§6.7, §6.6).

sen ompam nalmon, kemtel tišainai.
sen | omp-am | nal-mon | kem-tel | ti-šain-ai
child-MON(1)-ARCH | bread-MON(1)-ACC | cook-CVB.PURP | hearth-MON(1)-TERM | HITH-go-KIN
The child is going over to the hearth to cook bread.

kre xefosaps, xap ni-šainai.
kre | xe-fos-aps | xap | ni-šain-ai
rope-MON(1)-ARCH | IV-break-CVB.CAUS | NEV | OUT-go-KIN
Because the rope has gone, nobody goes outside.

ksostam θonges, sen-mismet θoraktai.
ksost-am | θo-ong-es | sen-mis-met | θo-rakt-ai
ksost-MON(1)-ACC | VII-see-CVB.SIM | child.lord-MON(1)-INS | VII-close-KIN
While the ksost is in view, the child lord is closing it.

snipam xermet xpemet, tikipom.
snip-am | xer-met | xpe-met | ti-kip-om
thread-MON(1)-ACC | hand-MON(1)-INS | touch-CVB.MAN | HITH-discover-STAT
I found the wire by feeling for it with my hand.

Note: xermet and xpemet have the same ending, once on a noun and once on a verb.

relam nilkat, ni-šainai.
rel-am | nil-kat | ni-šain-ai
blade-MON(1)-ACC | take.hold-CVB | OUT-go-KIN
Having taken up the blade, he goes out.

sopam melkne, pen načelai.
sop-am | mel-kne | pen | na-čel-ai
blood-MON(1)-ACC | look-CVB.COND | JUSS | THITH-call-KIN
If you see blood, call it.

xap kre xemetel, ane-šainai.
xap | kre | xe-met-tel | ane-šain-ai
NEV | rope-MON(1)-ARCH | IV-measure-CVB.LIM | IN-go-KIN
Never go in until the rope has been measured.

The limitative on a t-final root fuses (§1.5, law 2), which is where met + tel → metel in that section comes from. It is a joint, not a case.

kre xefosknekat, xap irk melai.
kre | xe-fos-kne-kat | xap | irk | mel-ai
rope-MON(1)-ARCH | IV-break-CVB.COND-CONC | NEV | backward | look-KIN
Even if the rope goes, do not look back.

The sequential is used in proof (§7.1) and in instructions.

A joint carries no number. A chain of forty joints counts as one clause for the balance and one sentence for the grammar (§7.2). This is the reason the confederation’s mathematics is written in chains instead of embedded clauses. The register that has to count to ten cannot afford to nominalize.

Chains are long. Forty joints before a finite verb is not a forbidden construction. A fot-lok speaker, having only the bare joint, expresses the same content in forty short sentences.

5.6a Chaining a long text

Three things a chain does that a single joint does not:

(i) The class prefix says when the subject has changed. §5.3 gives the rule of thumb: the prefix goes in when the absolutive noun is not in the clause. A link whose absolutive is the same as the link before it carries no prefix. A link that changes the absolutive carries it whether or not the new noun is stated.

krem nilkat, θositkat, ni-šainai.
kre-m | nil-kat | θo-sit-kat | ni-šain-ai
rope-MON(1)-ACC | take.hold-CVB | VII-cut-CVB | OUT-go-KIN
He took up the rope, cut the plate, and went out.

Nobody has mentioned the plate. The θo- on the second link is what says the sentence has stopped being about the rope. A listener forty links into a construction hears the prefix and knows to look for something new. The war-shrine drills this in practice sessions.

(ii) The back-joint. In long recitations, the finite verb of one sentence comes back as the first joint of the next: … ni-šainai. šainkat, …, “… he went out. Having gone out, …”. The device is called irk-rin, the back-joint. It is used by the nenan (§11.8). A hundred and eleven lines of Sarndi are strung together with it.

(iii) A link that did not happen. nes stands in front of the joint it denies, denying that link only (§5.8). A chain can carry a step that was not taken, which is the ordinary way of saying without:

xap krem nes melkat, ni-šainai.
xap | kre-m | nes | mel-kat | ni-šain-ai
NEV | rope-MON(1)-ACC | NEG | look-CVB | OUT-go-KIN
Never go out without looking at the rope.

5.7 Example conjugation: sit “to cut”

Conjugation of an ordinary transitive root. sit is what a knife does to a rope.

FormAnalysisMeaning
sitomsit-om“it is cut”
sitaisit-ai“it is being cut”
θositaiθo-sit-ai“the plate is being cut” (VII)
tisitaiti-sit-ai“it is being cut here, at my hand, under my eye”
nasitaina-sit-ai“it is being cut out there, so I am told”
lasitomla-sit-om“it is cut open, and the cut is where you can see it”
fositomfo-sit-om“it is cut, and the thing came down on me doing it”
sitrapaisit-rap-ai“it can be cut”
sitalaisit-al-ai“it has to be cut”
sitinomsit-in-om“it turns out to be cut; nobody meant to”
sitsenaisit-sen-ai“he has it cut”
sitkatsit-kat“having cut” (joint)
sitessit-es“while cutting” (joint)
sitmonsit-mon“in order to cut” (joint)
sitossit-os“that cuts, that was cut” (joint)
tisitaiditi-sit-ai-di“the two of them are being cut here”
lasitomkala-sit-om-ka“they are all cut open, and you can see it”
pen nasitaiJUSS na-sit-ai“cut it!”
xap fositaiNEV fo-sit-ai“never cut with the thing above you”

A verb carrying a preverb, a class prefix, a root and an aspect comes to four syllables and can take nothing more (§1.3). Further additions break at a juncture. The fully specified forms of tkalok are full of hyphens.

Vowel-final stems are absorbed (§1.5, law 5): pli “reckon” → laplai “is reckoned out”; θko “condemn” → laθkom “is struck off, in front of everybody.”

5.8 Negation and its scope

nes negates, and its position says what is being negated:

menmet enam nes knausai. “I do not know it to be one.” (before the verb: the proposition is denied)
menmet enam knausai nes. “I know it to be one, and I will not say how.” (after the verb: the direction is denied)

xap is the prohibitive, “never”. It is the particle used in the akousmata. (See the texts.)

5.9 The call

A čelan is a complete utterance consisting of a noun in an arithmological inflection and nothing else: no verb, therefore no aspect, no preverb, no direction, and no information about where anything came from. Alarms in the hold take this form. It is also used in the context where a name carries an arithmological suffix, a call about a thing’s state:

Arnatra. (4) “Arna installed.” → Arnek. (6) “Arna in running balance.”
Arnanop. (9) “Arna at the limit.” → Arnaka. (10) “Arna gone decadic.”

ksostnop, said down a gallery, is a call to take up stations.

5.10 The ground, and the axiom

The ground is an oblique in the ablative, the case of origin, standing before the verb and saying what a statement proceeds from:

peraps “out of trial” • teuaps “out of proof” • nomaps “out of custom” • nanaps “out of the raving” • titlokaps “out of the old speech”

Ground and preverb are independent and are routinely combined because they answer different questions: the preverb says which way the thing moved, the ground says what it moved out of. peraps lametom is “it has been worked out in the open, and it was the bench that did it.”

θamn is an oracular axiom: something seen entire, without proof and without a route to one. It takes no ground, because it came out of nothing. If it takes a preverb at all, it’s fo-. Such oracular utterances are often produced by imn-anθ. The ninth guild’s scribes write them down verbatim, in the involuntative, with nanaps against them in the margin. The sixth guild spends a great deal of money trying to validate them afterwards. About one in nine are solid.

5.11 The apprehensive

tsa + kinesis: lest, for fear that.

tsa reu-alnθaun našainai.
tsa | reu-alnθaun | na-šain-ai
APPR | cascade-MON(1)-ARCH | THITH-run-KIN
Lest the cascade run.

Elliptical in maxims, after the manner of the old symbola. The apprehensive is the only construction in Laulai that speaks of a future. The doctrine insists that it makes no claim about time but about tendency, the apeiric pole. That leaves §5.1 intact.


6. Syntax

6.1 Emanation order

The unmarked clause is verb-final. The language is postpositional throughout, as are the cases (§4.3). The order is Archic – obliques – Terminative – Verb: from the source, through the means, unto the end, and followed by the act. The doctrine reads this as the deed being the terminus of the emanation. The Arcadians were always verb-final like their neighbors.

ðaur θerkmet kotel fošainai.
ðaur | θerk-met | kot-tel | fo-šain-ai
water-MON(1)-ARCH | crack-INS | room-TERM | DOWN-flow-KIN
Water is coming down through the crack into the room, and I am standing in it.

Nursery-speech, so the verb carries no class prefix.

Converb chains stack in front of the whole thing (§5.6), each with its own arguments. A long sentence in Laulai is a left-branching ramp with one verb at the bottom.

In front of everything there is a topic slot. A bare archic nominal may stand at the head of a sentence, outside its case frame, stating what the sentence is about.

omp, senmet saspom. “The bread: the child has eaten it.”

The verb of that carries sa- because the bread is not in the clause. The topic is outside the case frame and does not count as an argument, so the class prefix does a recovery (§5.3).

A topic is not a core nominal and does not count in the arithmological balance.

6.2 What stands and what acts

The archic is the case of the source that emanates. It takes the single argument of any verb that has only one, whether stasis or kinesis, and it takes the undergoer of any verb that has two. It never takes is a doer standing over something else: an agent with a patient under it goes in the instrumental (§4.3) regardless of aspect.

kre xefosom. “The rope has broken.” (one argument; the rope is the thing it happened to)
mo šainai. “The dog is running.” (one argument, and motion; still the archic)
relmet krem xesitai. “He is cutting the rope with the blade.” (two; the blade is the means, the rope is what the cutting is done to)
relmet kre xesitom. “The rope has been cut, with the blade.” (two, and at rest; the case does not move)
ksost tišainai. “The ksost is coming this way.”
relmet ksostam θoraktai. “The blade is closing the ksost.”

Note how the last two put ksost in different cases. Historically they’d be in the same case, once as the thing arriving and once as the thing being killed. The doctrine says that only the source originates and everything else is an instrument of the emanation. In contemporary earth linguistics, we’d say Auloic languages were ergative.

The accusative is an overlay and is gaining ground. -am is Greek in usage (§4.3), marking an undergoer that is definite. ksost θoraktai is “a ksost is being closed,” ksostam θoraktai is “the ksost is being closed, the one we came for.” Twenty-five centuries later, it has spread far enough that in the inner holds, a definite undergoer is nearly always accusative and the bare archic reads as vague. The trial-halls still teach the older forms, which sound less snappy nowadays.

When Laulai was in more of a mixed state, a number of prestigious texts were composed that used the archic case as the agent and the accusative as the patient. The accusative overlay style sounds fancy, analogous to English thoroughly infused with French, but ordinary people never speak this way. Natively, any noun in the archic case is called the “source”, a metalinguistically meaningless term.

In Laulai, the “source” is an object in the world of ideas that emanates an action through the chain of links that forms the sentence, the action being the verb at the end. The patient is usually regarded as the source because it’s the furthest removed from activity.

A stasis verb can still name an agent, in the instrumental. Every report of a completed action is phrased this way: pmištrimet … θoraktomka, “closed, by the three hunters” (§7.1). Laulai doesn’t need a separate passive.

6.3 Agreement as consonance

Adjectives take their noun’s syzygy prefix, its polarity suffix and match its arithmological number where countability is at issue. The verb takes the syzygy prefix of its absolutive (§5.3). Dependents take the case of their heads (§4.4). All of it together is called arm, harmony.

Deliberate mismatch is plio (dissonance), a productive rhetorical device. A decadic adjective on a dyadic noun is a standard marker of lament. A class prefix that does not match the noun it agrees with can be an insult based on the associations of the dissonant class.

6.4 Coordination

Noun phrases coordinate with the clitic -kat. This is the comitative postposition doing a second job: the same morpheme, that makes the sequential converb (§5.6), used again. It attaches to the second member: rel snipkat “blade and filament.”

Clauses do not coordinate. They chain (§5.6). A Laulai who wants to say “and then” says a converb. A Laulai who wants to say “but” says two sentences and lets the tone do the job.

6.5 Questions

Polar questions take the preposed particle mar (§5.2a). Content questions use the interrogative in situ (tis “who,” kes “what,” ond “where,” pols “how many”) with no fronting or change of order, as is typical of verb-final languages. There is no word for “how”. A speaker who wants one asks about the direction, or about the manner joint (§5.6), instead.

6.6 Relative clauses

Laulai relativizes twice, once in the oldest morphology it has and once in some of the youngest. The two do not cover the same ground.

The bound form. The prefix če- stands in the agreement slot (§5.3) and fills the place of the argument that the clause is about. The clause then goes in front of its head like all modifiers (§6.1). The seventh guild calls the form a čelok, the prefix plus the word for “word”.

češainai ksost “the ksost that is coming”
nes čontom nars “a seam that is not there” (če- + ontom, elided in the manner of a preverb, §5.2)
relmet čeraktom ksostsep “the one with no fellow that was closed with the blade”

This reaches one argument. The slot it occupies cross-references the absolutive. This means a čelok can only be built on the thing that undergoes: the single argument of a one-argument verb, the undergoer of a two-argument one (§6.2). The doer is out of reach. There is no way at all to say the hunter who closed it with a če-.

What they do instead is turn the sentence round. If the patient goes into the essive, the doer comes out of the instrumental and stands in the archic, then če- can then reach it:

ksostkne čeraktom pmišt “the hunter who closes ksost”

The seventh guild calls it the way round. This seats a doer in the case of the thing that undergoes (§6.2 is doctrine). Note that ksostkne by itself is an insult (§11.5 ii). The construction itself is not confusing since one of them has a verb after it.

The attributive joint. The other road is the genitive joint of §5.6: the verb takes -os and goes in front of its head like an adjective.

ksostam θoraktos pmišt “the hunter that closed the ksost”

This has no restriction, so it’s more common and growing in popularity. However, it says nothing about which argument is being relativized, which is why tkalok can’t use it. An -os clause is interpreted in terms of what makes sense. If it’s ambiguous, somebody asks. It also stacks: Being a genitive, it takes the case of its head like any other dependent (§4.4). θoraktosam ksostam, “the ksost that was closed, as patient,” carries the head’s accusative on a verb.

Why proof has neither. A čelok has no class prefix, because če- is standing where the class prefix would be, and the class prefix is the secondary failsafe mechanism (§5.3). An -os clause does not say what it is hanging from. Neither is licensed in tkalok. A construction that has to pick one ksost out of two picks it with a number instead (§4.1). This costs a company a great deal of arithmological reconstruction work while under attack.

6.7 Complements, quotation, and the noun of the act

Three ways of putting an act inside a clause, of very different age:

The complement joint is -am, the accusative (§5.6) on the verb of the act being reported. It goes under seeing, hearing, knowing and saying, carrying its own arguments.

sen-mis snipes ontam nes tiknausom.
sen-mis | snip-es | ont-am | nes | ti-knaus-om
child.lord-MON(1)-ARCH | thread-MON(1)-LOC | be-CVB.COMP | NEG | HITH-know-STAT
I did not know the child lord was still on the wire.

lekt is the older approach and less popular. §9.1 leaves it half-finished: the complementiser is the word for “say”. A form that is still visibly a verb can be a confusing conjunction. It survives in the trial-halls and in writing. On deck, it has gone to the other end of the sentence and turned into an enclitic closing a quotation:

“pols kre”-lek tičelai.
“How much rope,” she called.

Quoted speech keeps its own deixis and its own preverbs. A tale recited in na- from end to end may claim nothing (§11.8). If it’s that person’s line, a reciter may put ti- in it.

The noun of the act. The suffix -št makes a noun out of a verb: sni “build” → sništ “a construction”, pmi “hunt” → pmišt “a hunter, one who has been out”, xre “take” → xrešt “one of the taken”, tno “clear out” → tnošt “the Withdrawal”, θau “seed” → θaušt “graded stock.” §4.6 calls these derivations. There, the suffix is called an assessive. This was the Proto-Auloic verbal noun, the same morpheme the ten joints are the residue of (§8.4).

It only goes on an open stem. Every -št noun in the corpus is built on a root ending in a nucleus without exception. That’s what is left of a suffix whose own vowel L4 removed. A consonant-final root has nowhere to put it. Three roots in four are consonant-final (§1.3), so the productive verbal noun of Proto-Auloic survives on a quarter of the lexicon. New ones are still coined and are still coined on open stems: the shops created plišt, “a piece of arithmetic once it has been done,” within living memory. There is no -št noun anywhere from met, mel, rakt or sit.

A noun of the act bears arithmological costs. The act is a noun. It takes an arithmological number and a case like any other noun, so it counts in the balance (§7.2). If it carries a dependent, the dependent counts too (§4.4). A joint costs nothing and a nominalisation costs at least one and usually three. This is why the confederation’s mathematics is written in chains, not because of elegance or doctrine.


7. Proof

The numbers welded to every noun, the classes stamped on every verb, the chains… All of this must be used to state the proof correctly under conditions of chaos and a shortage of time.

7.1 What a proof is and what it does

A theorem is teukt. A construction, the figure you build in order to prove one, is a sništ. The act of finishing is rakt, “to close.”

A proof in Laulai is one sentence. The steps are not limited (§5.6). Each step is a converb, hung off the one at its right. The whole chain runs into a single finite verb at the end, which is where the proof concludes. Laulai has no conjunction that will link two finite clauses into an argument. A chain that stops without a finite verb has not concluded anything yet.

ksostsepam θomelkat, serkdim meplikat, teukt paraktom.
ksost-sep-am | θo-mel-kat | serk-di-m | me-pli-kat | teukt | pa-rakt-om
ksost-HEP(7)-ACC | VII-look-CVB | serk-DY(2)-ACC | I-reckon-CVB | theorem-MON(1)-ARCH | II-close-STAT
Having looked on the ksost that has no fellow, having reckoned the two intervals — the theorem is closed.
Balance: 7 + 2 + 1 = 10 → 1. rak.

This is a sentence of three steps. A hunting construction runs to thirty or forty, spoken flat and fast, all of it grammatically one sentence. This is what the war-shrine drills in.

What the proof does. The main work is done by a mind with sorm carrying a serk while the chain runs. The chain is how the mind keeps its grip. Each step is a place to advance the figure another step without forgetting details. Even without a sentence, a very good prover can still effective on simple problems. A sen-mis is reduced to that when the deck noise gets bad enough that she cannot hear herself. However, the arithmological count matters. More on that in the next section.

Against a ksost, the chain has a target. How it is trying to resolve a geometric puzzle is explained in §0.2.

pmištrimet ksostseplonam θoraktomka.
pmišt-tri-met | ksost-sep-lon-am | θo-rakt-om-ka
hunter-TRI(3)-INS | ksost-HEP(7)-PER-ACC | VII-close-STAT-COLL
The three hunters have closed the ksost that had no fellow, and it is bounded now.
Balance: 3 + 7 = 10 → 1. rak.

7.2 The decad-balance

A clause is rak (“whole”) when the arithmological values of its core nominals sum to ten exactly, or to a number whose digit-reduction passes through the decad to the monad, as 28 → 2+8 = 10 → 1. Sums that reduce past ten without touching it (25 → 7) are nesrak. Sums that never reach ten are not reducible at all. A step worth nine is has no effect. There is a name for one worth nine: nopkne nesrak, unwhole at the ninth. One short, and useless.

What counts. Core nominals count, the verb does not, an attributive adjective does not (it carries a number for concord and is not a nominal), a topic or vocative standing outside the case frame does not (§6.1), a stacked dependent counts at its own number as well as the head’s (§4.4), an unknown counts at whatever number it carries (§7.4), a joint costs nothing (§5.6), and a noun of the act costs its arithmological value (§6.7).

A nominal in the instrumental counts. The instrumental is the agent case (§6.2). It is also the case of a plain tool, the language does not distinguish them, and neither does the balance. The practical effect is that saying how you did something costs a number. A prover who is short reaches for the tool and a prover who is over leaves it out.

The balance is taken over the whole sentence. A chain of forty converbs and a close (§5.6) is one sentence with one balance. The total has to reduce through the decad. The last link of a construction is chosen partly for its value, being the last place a prover can still move the number.

What it is for. A step that balances is effective. A listener who cannot follow the mathematics at all can still hear whether each step comes to ten. That is the job of the signals rating who stands at a nine-year-old’s shoulder while she runs a construction over his head. When a step does not balance, something has been dropped, misheard or mis-said, the listener says so. The chain is stopped before it wastes a serk.

A nesrak step is not false. It may be perfectly true and often is. It’s just ineffective at channeling occult power, so Laulai battle-provers must restate everything until it comes to ten. The habit has spread well past mathematics. Laulai verse scans the way it does because of this.

Everyday speech is not rak and is not meant to be. A person who starts balancing in the middle of an ordinary conversation has changed the conversation. Even if his sentences prove nothing, it might frighten his interlocutor.

sen-mistrimet ksostsepam θoraktai.
sen-mis-tri-met | ksost-sep-am | θo-rakt-ai
child.lord-TRI(3)-INS | ksost-HEP(7)-ACC | VII-close-KIN
The three child lords are closing the ksost that has no fellow.
Balance: 3 + 7 = 10 → 1. rak.

elmtramet ampdim konantratel laminanom.
elm-tra-met | amp-di-m | konan-tra-tel | la-minan-om
engine-TET(4)-INS | vapour-DY(2)-ACC | yield-TET(4)-TERM | UP-transmute-STAT
The installed engine turns unruly vapour into founded yield.
Balance: 4 + 2 + 4 = 10 → 1. rak.

The verb of that last sentence carries no class prefix, because preverb, prefix, root and aspect would come to five syllables and the cap is four (§5.3).

7.3 The heptaktys-balance

Above the decad stands a stricter grade. A clause is mern-rak, part-whole, when its core nominals sum to 28: the second perfect number, the triangle of seven, and a figure that reduces 2+8 → 10 → 1 into the bargain, so a mern-rak clause is rak as well.

Twenty-eight is a legal grade rather than a mathematical one. An oath sworn at ten can be released by the person who took it. An oath sworn at twenty-eight cannot be released under ordinary circumstances.

What it costs. No noun exceeds ten, so a mern-rak clause needs at least three core nominals where a rak clause can be built on two. It needs high values, commonly the decadic twice over. Speech at twenty-eight is therefore speech about totalities, and swearing about specific things is not easy. A speaker who needs twenty-eight reaches for the guild entire, the line entire, mortal-kind. This has shaped Laulai law in unforeseen ways.

relkamet čilkat psaisepam anθkatel lasonandom.
rel-ka-met | čil-kat | psai-sep-am | anθ-ka-tel | la-so-nand-om
Blades-DEC(10)-INS | oath-MON(1)-COM | soul-HEP(7)-ACC | person-DEC(10)-TERM | UP-IX-bind-STAT
The Blades entire, with the oath, bind the solitary soul unto all persons.
Balance: 10 + 1 + 7 + 10 = 28. mern-rak.

That is a hunter’s oath, sworn at the shrine door at the age of twenty-eight, or at whatever age a hunter reaches his twenty-eighth time out, whichever comes first. This oath cannot be released.

The two perfections disagree about people. Six is perfect and the hexadic means in healthy running balance. Twenty-eight is perfect and governs what cannot be undone. The seventh guild swears its hunters at twenty-eight and reports them at six. The ninth guild’s position is that six is a number for machines. The seventh guild says that a hunter takes an oath to live as an organic machine.

7.4 The unknown

The saik ⟨—⟩ is the unknown, the quantity a construction is solving for. It fills a nominal slot, takes case, takes number, and counts in the balance. An absence would do none of those. A saik is a stated unknown.

In speech it is pronounced. A saik is a silence one mora long carrying the polarity the prover expects to find (§1.6), θis if he expects the peratic, ske if he expects the apeiric. A listener therefore hears that there is an unknown and which way the prover is betting. The polarity can be pronounced as a syllable to be safe, but some esoteric singers can sing silence with a tone. This saves a split second. Skeptics say that in reality, the beginning and end of the tone are perceived on the preceding and following syllables.

The number on the unknown says what kind of thing is being looked for, using the ordinary readings of §4.1. This is a descriptive apparatus ten items long:

ValueWhat the prover has said he is looking for
1 monadica unique original: a first case, a pattern others will be struck from
2 dyadican indefinite: any member at all, the prover does not care which
3 triadicthree terms in concert; the standard shape of a mediating step
4 tetradican installed, warranted value: a constant, once found, to be filed
5 pentadica live source; the thing the effect is coming out of
6 hexadica value that puts the system into running balance
7 heptadica one-off with no fellow, and the value most often set against a ksost
8 ogdoadica great built solid: a bound, a mass, a ceiling
9 ennadica limit value, a redline, an asymptote
10 decadicthe whole kind at once: a general solution rather than a particular one

—sep serkdiaps θometkat, ksost θoraktom.
—sep | serk-di-aps | θo-met-kat | ksost | θo-rakt-om
UNK-HEP(7) | serk-DY(2)-ABL | VII-measure-CVB | ksost-MON(1)-ARCH | VII-close-STAT
Having measured the unknown, the one with no fellow, off the two intervals — the ksost is closed.
Balance: 7 + 2 + 1 = 10 → 1. rak.

The class prefix on the verb is the bet stated a second time. A verb whose absolutive is a saik has no class to agree with, so it takes the class the prover expects to find (§5.3), θo- above, because he is betting the unknown turns out to be a fact about the thing’s geometry.

Solving for a polarity is the one case where the saik is spoken with no tone at all, the prover by definition not knowing which way it goes. Nothing else in the language is untoned. Everyone who has heard it done live describes a beat of flat silence in the middle of a fast chain.

Three limits. A saik cannot be the verb, because it takes nominal morphology and there is no silent aspect. A saik standing alone with a number and no verb is not a clause but a čelan, a call (§5.9). The accusative of a saik is written —am and said —m, with nothing to choose between the allomorphs of §1.5 law 4 because there is no segment to choose from. This is the one morphological question in the language that is not just unsettled but undecidable.


8. Historical phonology

8.1 The two strata

Every stem belongs to one of two layers and the layer can usually be identified from its shape.

The Arcadian stratum is the bulk of the language: nine stems in ten, effectively the whole of the technical, agricultural, domestic and mechanical vocabulary. Its stems obey §1.4 without exception.

The Hellenic stratum is what the Imposition brought: thirty-seven stems, one in nineteen of the lexicon. Kinship (ptir † “father,” medr † “mother,” brot † “mortal,” anθ † “person”), the body (ops † “eye,” os † “mouth,” an † “tooth,” aštin † “skeleton”), the elements (ðaur † “water,” paur † “fire,” psnai † “air,” petr † “stone,” dendr † “tree”), the lights (el † “sun,” aštir † “star,” laump † “lamp, star,” skot † “dark,” emer † “day”), the numbers above four, the sacred and the abstract (θeu † “god,” psai † “soul,” kosm † “world,” nom † “law,” arm † “harmony,” tetrakt †, kspenan † “wisdom”). Six sit outside those fields: mikran † “small,” mern † “share,” paln † “again,” ols † “all,” pol † “many,” per † “trial.”

Seven of the thirty-seven break a law of §1.4 because they were sacred and resistant to certain changes. Greek πέτρος lost its ending like everything else and came out as petr, ending in a rising cluster that no native word is allowed to end in.

The Greeks get the worst of it. A people whose whole apparatus is Greek in its vocabulary and Greek in its arithmology is not fond of Greeks. The standing view in the holds is that Greece heard the doctrine first, from the brotherhood’s own mouths, and rejected it. A Greek taken in the press-gang is worked harder than anybody else. Having been taught sacred history, the sixth guild’s drill-songs are still rude about Kroton twenty-five centuries later.

A Greek who accepts the Pythagorean doctrine is a different matter. Such a person is called by the title prot-fot (first-slave): the one who came to it before. There are perhaps forty in the system. They are exempt from the press-gang by statute, their descendants are entered in the or-tlaim. Everybody is slightly uncomfortable around them.

The two strata are also the two registers seen from a lexical angle. Tkalok requires the Hellenic form wherever one exists: ðaur and not a ra-compound for water, anθ and not sen for a person. A Laulai child learns the Arcadian stratum first, finding out at nine that the words its mother used are the low ones. The trial-halls have a word for the psychological effect on a nine-year-old: penen, shame. This shame persists and fuels the pride and duty they are taught afterwards.

8.2 Proto-Auloic

The reconstructed common ancestor, Proto-Auloic in Greek and titlok in Laulai, had, as far as we can tell:

  • Ten consonants: p t k s m n l r w j.
  • Five vowels: a e i o u.
  • Syllables of the shape (C)V(C), no initial clusters.
  • Stems of two or three syllables ending in a vowel, because they were built to carry suffixes.
  • Initial stress, fixed, with a minority class stressed on the second syllable.
  • A verbal complex of the type found all round the eastern rim: a prefix field carrying orientation and the class agreement of more than one argument, then the root, then a suffix chain carrying version, aspect, enumeration and a postposition, each element separable and each with its own vowel.
  • Ten orientational and locational preverbs at the head of that prefix field, of which four form the ancient core.
  • Case stacking: dependents carried their own case and then the case of their heads (§4.4).
  • Clause chaining by non-finite verb forms, with no coordinating conjunction for clauses (§5.6).
  • A verbal noun, which took the postpositions like any other noun, and is the source of the ten joints (§5.6) and of the -št nouns (§6.7).
  • A relative prefix in the agreement field, filling the slot of whichever argument the clause was about (§6.6).

Very little of that survived intact, as §8.3 explains.

8.3 The sound changes

LawEffectExample
L1Glide loss. *w and *j drop between nuclei; the hiatus contractssource of all three diphthongs, and of the open CV stems*kewa > keu; *teje > te
L2Pretonic syncope. In the second-stress stem class, the first vowel dropssource of the CCV stems, of the CCVC stems, and where the cluster was unsayable and L13 repaired it, of the a-initial stems*tepe > θpe “awl”; *mede > *mde > amde “sharp”
L3Post-tonic syncope. Non-initial vowels drop where what they leave can be saidthe CVCC stems*kerat > kert “gear”
L4Apocope. The final vowel drops after a lawful codathe event: 787 monosyllables out of 1,106, and the death of the suffix chain*mela > mel “look”; *irno > irn “earth”
L5Palatalisation. *k > č before a front nucleus, in onset21 stems*kile > čil “oath”
L6Aspiration. *k > x word-initially35 stems*keras > xer “hand”
L7Lenition. *p > f word-initially before a vowelthe only native source of /f/*pemi > fem “speak”
L8Spirantisation. *t > θ initially, and before a sonorant or stopthe commonest law; 7% of all segments*toma > θom “straight”
L9Sibilant shift. *s > š beside a dental; initially in the inner holds20 stems, and the -št of the assessives*testa > tešt “scales”
L10Voicing. A single stop between nuclei voices: *t most readily, *k less, *p leastd 42 stems, g 20, b 15*meta > med-, and “the reluctance of the labial”
L11*u > o outside the diphthongsthe vowel tetrad of §1.2*turu > tor “stew”
L12Degemination. Like consonants and like nuclei fuse§1.5 laws 1–2*tettu > tet “guild”
L13Prothesis. A word left with an unsayable onset takes a-the a-initial stems, one in twelve of the lexicon*mdi > amdi “sea”
L14Epenthesis. An unsayable cluster takes a supporting vowelthe second half of the repair wave; it ran to completion in the Arcadian stratum*krnaus > kernaus “kernel”

L13 and L14 are the repair wave. They applied to the Arcadian stratum and not to the Hellenic, so amdi “sea” was repaired and petr “stone” was not. Between them they touched over a hundred stems. Anything that arrived after they stopped was never repaired at all. That is how vril † comes to have a /v/ in it when nothing else in the language does (§9.3).

8.4 What the laws did to the morphology

L4 did more than shorten words. It destroyed a morphological system and left traces all over.

The suffix chain became stem-final consonantism. Proto-Auloic *root + version + aspect + enum + case was five separable morphemes with five vowels. After L3 and L4 the enumerative suffix survived because the case suffix outside it was in the way. The case suffix survived where it began with a consonant. The version markers survived as the three of §5.4 and lost the rest. Everything else was crushed into the coda. This is why the modern language still has a clean agglutinative number–polarity–case template with almost no polysyllabic stems. The outer morphology was saved by being on the outside.

The derivational suffixes are the casualties. -an ~ -nan, -zes, -št, -ne, -in were productive Proto-Auloic morphemes: a quality marker, an instrument marker, an assessive, two diminutives. L4 welded them to their stems. What had been inflection became derivation, most of it opaque. The stems with no recoverable base at §4.6 are the residue. This often happens to an agglutinative language that loses its vowels. It is an argument for the reconstruction in §8.2, explaining why a language with a rigid suffixing template has a hundred and twenty frozen suffixed stems and no living suffixation to match.

The suffix chain also produced the subordination. Proto-Auloic subordinated by putting a postposition on a verbal noun, common enough in its region of origin. L3 and L4 took the verbal noun’s vowel and left the postposition standing on a bare root. The ten joints of §5.6 are what that looks like twenty-three centuries later: ten case endings on a verb, with no noun between them, nothing to carry number or polarity, because there is nothing is left to carry it. The same event turned the verbal noun’s unsuffixed form into the -št nouns of §6.7. That’s why they only occur on stems that end in a vowel.

The prefix field was saved by being a prefix field. L2–L4 attacked the right edge and never reached the left. The two classes of prefix still standing there are the most conservative morphology in the language: the ten concord markers of §4.2, which have barely changed in twenty-five centuries, and the ten preverbs of §5.2, of which the ancient four have not changed at all. What is missing from the field is everything except one agreement slot: Proto-Auloic had two or three arguments there, and Laulai has one slot (§5.3).

The relative če- of §6.6 is the only piece of the second agreement slot that came through. It came through because it indicated something unique. It’s *ke- with L5 on it. ken “he, she” is the same old deictic without L5, which puts the prefix on the far side of a sound change that stopped before the reinterpretation.

A language that lost a whole suffix chain and kept most of a prefix field was never suffixing on principle. Its morphology sat on both sides of the root, which eroded from one side. What is left looks lopsided.

8.5 What the doctrine could not have invented

The ten arithmological numbers are the ten numerals, in their combining grade, in the order a child counts. Five of the seven postpositions are homographs of Greek prepositions. The comitative and the instrumental sit in the mediating row with the locative, where they belong doctrinally, while the ablative, a separation and mediating if anything is, sits in the relational row with the dative because there had to be two there.

The syzygies come in a set of nine that is semantically coherent and a tenth that is a bag. Nobody has ever managed to rigorously define class IX (§4.2). The brotherhood needed a tenth and took left over nouns.

Case stacking, the converb chain, the class prefix on the verb and the ergative use of the instrumental are all things the doctrine has an elaborate reading of and could not conceivably have made up, because all four are shared with neighboring languages.

Relativization only reaches the undergoer (§6.6), common enough in a language whose agreement runs like this one’s. It’s also shared with the neighboring languages. The seventh guild’s way round it seats a doer in the archic, which is a flat contradiction of §6.2 and of everything the doctrine says the archic is for. Nevertheless, it has been in continuous use for as long as there have been records.

8.6 The dating

EventDateEvidence
the Imposition (θalt)c. 500 BCthe Hellenic stratum is Attic-Ionic of that century, ending and all
the vowel-loss (L2–L4)c. 450–350 BCit catches the Hellenic stratum, so it postdates the Imposition
the repair wave (L13–L14)c. 350–250 BCapplies to the Arcadian stratum only, i.e. after the strata were distinguishable
the reinterpretationc. 300 BCthe first arithmological glosses in the akousmata
the descentfrom c. 200 BCvocabulary of the karst; lan, lans, tip “cave” become structural terms
the Withdrawal (tnošt)to c. 550 ADthe last loanwords of the surface centuries are late Latin
the taking of the moonduring the Withdrawalthe 28-day month and 28-hour watch are fixed from here
the limit foundc. 1100 ADnine hulls lost
polarity; the balance made statutory17th–18th c. ADstatute, dated, signed
the heptaktys grade1809statute, and the first mern-rak oath is two years later
the necessitive (§5.4) ratified1814statute; the form is a century older in the shops

The top of this table and the bottom of it are defensible. The middle rests on the Order’s own chronicles, which is a devotional genre.

8.7 The low numerals

The Order believes that numbers from one to four are Arcadian, five and above were imposed, and that this is the evidence that the tetrad was found among the hill people rather than brought to them. The first half cannot be true:

LaulaiGlossGreekIndo-EuropeanDifficulty
enoneἕν*sem- / *Hoi-no-none
ditwoδύο*dwoh₁none; it is also the multiplicative morpheme of §4.6
tre, tri-threeτρεῖς, τρι-*treyesnone, and the combining grade matches the Greek combining grade exactly
trafourτέτταρες, τετρα-*kʷetworesit is the Greek combining form with the first syllable gone, which is what L2 does to a word

These are more than comparable. They are Indo-European. The internal evidence agrees: Proto-Auloic had no initial clusters at all (§8.2), so a primitive tre is impossible, and nothing else in the numeral system has that shape.

They are also not the Imposition’s. They are phonologically integrated in a way the Hellenic stratum is not, they are in the substrate’s own place-names, and they were already old when the brotherhood arrived. The account that fits everything is a much earlier borrowing: a Bronze Age loan from whatever Indo-European was being spoken in the lowlands, quite possibly an early dialect of Greek itself, at a date when Auloic still had the shape §8.2 reconstructs and the loans had time to be integrated into it.

šal “thousand” has no obvious source in Greek, in Italic, or anywhere else. This makes it the only numeral in the language with a good claim to being pre-IE.


9. Irregularities

9.1 Homophony

Seventeen sets survive:

al debt / deer • asp chimney / to eat • elm engine / fear •
imn ash / wine • irn earth / rite • lekt to say / that (COMP) •
lil brave / flour • men I / island • menan magister / youth •
met measure / with • mni axle / leather • nan joy / prophecy •
nasp archon / silver • orn chant / to forge • pen leaf / the
jussive / the pentadic suffix • rel blade / to ferment • čirt quotient
/ housing

Most are ordinary collisions. Five have additional significance:

met and lekt are grammaticalizations caught in the middle of the process: the instrumental case is the word for measure, and the complementiser is the word for say. Neither is an accident.

nasp “archon, silver” is treated as an akousma rather than a collision: the ruler and the coin have one name. nan “joy, prophecy” likewise: the seizure is named for a word that also means delight.

imn “ash, wine” is the one that gets used. An imn-anθ is an ash-person and possibly a wine-person.

elm means “engine, fear”. There is a second word for fear, xosan, used when the difference matters, but the collision is old. Three others are like this: irn “earth, rite” beside aunan “ritual”, menan “magister, youth” beside sennan “youth”, čirt “quotient, housing” beside kot-marn “housing.” In each pair the short word is old and ambiguous, while the long one is younger and exact. Speakers use the short one until they are being careful.

al “debt, deer” has quietly acquired a third member, the necessitive of §5.4: raktalai “it falls to be closed”.

A commoner kind of collision arises between a stem and an inflected form: nai “yarn” against nai “is charging” (nau + -ai), and lont “bound” against lontom “it is out in the open” (la- + ontom). The quotative enclitic -lek (§6.7) is a newer one, sitting on lek “taste”, setting up hosts for a pun between speech and flavoring. These are collisions between different orders of thing. There are a great many of them.

9.2 The Hellenic stratum

Thirty-seven stems are marked as belonging to the stratum the Imposition brought. The mark indicates the word came in with the brotherhood.

an tooth • anθ person • aps from • arm harmony • aštin
skeleton • aštir star • brot mortal • dendr tree • dom house •
eks six • ektan hundred • el sun • emer day • es in •
ims half • kat and • kosm world • krau crystal • kspenan
wisdom • laump lamp, star • lekt say • makr great • medr mother •
mern share • met with • mikran small • nom law • nop nine •
nukt night • okt eight • ols all • ops eye • os mouth •
oðas path • paln again • paur fire • pent five • per trial •
petr stone • plas sheet • plask Pelasgian • pol many •
prot first • psai soul • psnai air, breath • ptir father •
sept seven • septakt the heptaktys • skot dark • tel end •
templau temple • tensi ratio • tetrakt the tetraktys • tka
ten • zait live • ðaur water • θeu god

Seven of the thirty-seven break a law of §1: dendr, kosm, makr, medr, nukt, petr, tka. Those are the ones the vowel-loss mangled and the repair wave didn’t touch because they were holy. From these, the stratum is visible from the shape of the word. The other thirty are phonologically integrated and are known to be loans only by their etymologies: nom beside νόμος, skot beside σκότος, el beside ἥλιος, emer beside ἡμέρα, arm beside ἁρμονία. Nothing in the sound gives them away, and a speaker who has not been taught which is which cannot tell.

Four stems carry the dagger without belonging to this stratum: štrat † “street,” az † “coin,” laus † “hymn” and vril † “motive force,” all four late Latin and discussed in §9.3. The dagger means not Arcadian.

Notes on harder cases.

  • mikran “small” ← μικρός stands beside makr † “great” ← μακρός and has never looked like a loan, for the reason given below.
  • mern “share, portion” ← μερῶν, the genitive plural of μέρος, of the parts. The stratum came in as whole inflected forms. This is one of them, fossilised in an oblique case and carrying an -n that no nominative would have. It is the first element of mern-rak. The Greek definition of a perfect number is a number equal to the sum of its own μέρη. The highest phrase in the language is a compound with both Greek and Arcadian components.
  • paln “again” ← πάλιν, which gives psai-paln “the return of souls”: παλιγγενεσία reassembled out of its own parts by people who no longer noticed or cared that whether half was Greek.
  • ols “all” ← ὅλος. A quantifier the language does not need since the decadic does the work of a totality. It is correspondingly rare and survives because it is in the liturgy.
  • per “trial, ordeal” ← πεῖρα. The ground-formula peraps “out of trial” (§5.10) is ἐκ πείρας.

Why mikran hid. A bare *mikr is unsayable in Laulai, ending in a rising cluster just as makr does. makr survived in Greek shape because it was protected: it stands in the teaching. The seven law-breakers are the seven that resisted some of the changes. Smallness is not in the teaching, so μικρός was left to the ordinary machinery. Instead of prothesis (L13) or epenthesis (L14) the word took the native quality suffix -an, which supplied a nucleus and closed the syllable. No other stem was known to have been repaired by derivation. Having been repaired that way, it looked derived. A word that looked derived was thought to be native.

Regarding pol. The apeiric suffix -pol is taken from pol “many,” and its opposite -lon from lont “bound.” Polarity is the brotherhood’s own construction and is the clearest case in the language of doctrine building grammar. If pol is πολύς then the two poles of that construction are not a native pair. The limit is named in Arcadian and the unlimited in Greek, which is πέρας and ἄπειρον with one of them translated and the other not. The commission that standardized suffixes included a Greek word for the unbounded pole and either did not notice or did not mind.

What was replaced, and what was not.

FieldHellenicArcadian
kinshipfather, mother, mortal, personson, daughter, sister, brother, wife, husband, widow, kin, ancestor, twin, household, child, heir, orphan
the bodyeye, mouth, tooth, skeletonarm, elbow, ear, jaw, shoulder, brain, finger, claw, heel, neck, face, fist, nose, leg, belly, throat, hair, sinew, foot, skin, hip, palm, knee, breast, liver, hand, vein, brow, flesh, bone, tongue
the elementswater, fire, air, stone, treeearth
the numbersfive, six, seven, eight, nine, ten, hundred, halfone, two, three, four, thousand, but see §8.7
the sacredgod, soul, world, law, harmony, the two counts, wisdomrite, oath, holy, scripture, altar, prayer, shrine, invocation, offering, libation, witness-oath

What was replaced is what appears in the teaching. Father and mother are the cosmic parents and went; daughter and elbow are not doctrine and stayed. The earth, a thing the hill people stood on rather than a term of art, remained. The numbers used in arithmology went, while the numbers a child counts stayed. The apparatus of religion, altar and libation and oath and shrine, is Arcadian, while the objects of religion are Greek. The brotherhood replaced what it argued about and left the people to go on worshipping in their own vocabulary.

Two words for star. Both ἀστήρ and λαμπάς came in, which is unusual, since the Imposition normally replaced a word rather than doubling it. aštir † is the star as a point in a pattern: catalogued, standing in a pemn “constellation,” the one the first guild takes am interest in. laump † is the star as a burning thing: a luminary, anything that shines whether or not it remains fixed in place, so it is equally the lamp a person carries. The seven wandering lights are laump and never aštir, so the metals are taught with one word and the navigation tables written with the other. laump has meant “star” for as long as it has meant “lamp”: laump-klars is a star-chart, and amntems-laump “corpse-light” and krau-laump “crystal-lamp” hold the other sense open beside it.

Two of the doctrine’s own class-names are loans. The three consonant classes of §1.1 are lont, psnai and arm. lont is Arcadian. psnai and arm are Greek. The names given to the native sound-system are, two times in three, imposed vocabulary.

The model for prothesis. aštir “star” and aštin “skeleton” were long shown as type-specimens of L13. They are ἀστήρ and ὀστέον, their a- is Greek and was there before the brotherhood arrived. The Hellenic stratum was never touched by the repair wave, so a loan cannot show prothesis. The real examples are amdi “sea” from *mdi, amde “sharp,” alnθaun “flood,” along with some eighty more in the lexicon below.

9.2a Loans that didn’t change form

The dagger marks a word whose shape came from outside. It doesn’t indicate words whose shape is Arcadian and whose sense is not. A brotherhood that needed a term and found the hill people already had a word in the neighbourhood did not always import a Greek one. Sometimes it widened what was there, and the result is invisible to the tests in §9.2.

  • lok “word, reason, account”: Arcadian in form and λόγος in every one of its uses. This is possibly an early Greek corruption. Auloic-shaped stems rarely carry a range like that: utterance, ratio, reckoning and the account a thing gives of itself are one word in Greek because of a particular argument that Greeks were having.
  • saik “stillness”: an ordinary word for quiet, now the technical term for the unknown (§7.4). The brotherhood arrived with a five-year rule of silence. The Arcadian word was used to name it. The abstract sense came later and is now the common meaning.
  • kernaus “kernel, essence”: a farming word for the inside of a nut. Possibly a Germanic corruption. The standard rendering of οὐσία, kernaus-met “assay” is etymologically essence-measure. Historically, the essence of a thing was the edible part.
  • rak “whole”: native, and its technical sense is τέλειος, complete in the sense in which a number is complete. nesrak is then an Arcadian negation of a Greek idea on an Arcadian pattern.
  • nan “joy; raving, prophecy”: probably the residue of a translation. μανία is divine madness, not necessarily a bad thing. A word for delight was the nearest the language had.

Argued and not accepted. Three forms have been proposed for the stratum proper and are not daggered here, on the ground that a plausible etymology is not a demonstration. These are possible corruptions, but they could also be a coincidence.

  • mans “hierophant” ← μάντις. The sense is close. The difficulty is the dental, since μάντις should give *mant and the loss of the stop before the sibilant is not regular. mans gives manska, which is the ninth guild, the Order itself. If this etymology holds, the Order’s name for itself is Greek for the seers, while the native word for what a seer actually undergoes is nan, which also means joy.
  • faut “light” ← φάος. It would make a third syzygy exemplar a loan after met † and anθ †. The vowel is not straightforward.
  • io “echo, memory” ← ἠχώ. Attractive, and blocked by §1.2. io is the specimen of the one licit hiatus. Would a language import its own type-specimens, or were those conceived of after this was already imported?

A stratum defined by shape is a lower bound. Thirty-seven stems are identifiable. An unknown and probably larger number were incorporated, leaving no hard evidence.

9.3 Marginal segments

  • /ð/ occurs in two independent words, ðaur † “water” and oðas † “path,” both from the first century of the Imposition and older than the law that would have caught them.
  • /ž/ occurs in one word, džait “to live,” beside a commoner variant zait. The inner holds prefer the second and the akousmata use the first.
  • bare /u/ occurs in one word, nukt † “night,” which L11 reached too late.
  • /v/ occurs in one word, vril † “motive force,” on which see below.
  • the onset tk- occurs in two common words: tka † “ten,” and the thing named after it, tkalok, the Order’s register, along with a number of specialized compounds. The doctrinal gloss is that the decad is where number completes itself and passes out of the lawful. It is fitting that the name of the ten and the name of the speech of the ten should be the only words in the language that break the law of beginnings.

Three words are Italic and not Greek: souvenirs of the brotherhood’s century in Magna Graecia, carried out of Kroton before the flight.

  • sept † “seven” ← septem. Every other Attic numeral is regular and this one is not. It is also the base of septakt.
  • nop † “nine” ← novem, by the plain treatment of *w (L1), which turns it to p: *nowem > *nopem > nop. ἐννέα will not give this form by any route.
  • templau † “temple, trial-hall” ← templum, the marked-out ground an augur works in. The ending is unexplained.

Four words are late Latin, from the last three centuries the Laulai spent on the surface. This is the surviving vocabulary of that period: a road, a coin, a hymn and the force that powers civilization.

  • štrat † “street, road” ← strāta, the paved way. Class X, with the built things.
  • az † “coin” ← as, assis. The Arcadian words in the same field are mas “silver-coin,” ami “price” and ize “trade”. The borrowed one is a unit, which a people is expected to borrow when they are being paid in somebody else’s money.
  • laus † “hymn” ← laus, laudis. It sits in class VI with the resonance vocabulary rather than in class IX with the rites.
  • vril † “motive force; the work a true interval does” ← virīlis, “of a man, having a man’s strength,” from vir and beside vīs, vīrēs “force.” The derivation is the language’s own: pretonic syncope (L2) takes vi-RĪ-lis to *vrīlis, apocope (L4) takes the ending off, and vril is what is left. It arrived late enough that the repair wave was over and nothing came back to fix the onset, and late enough that Latin v was no longer a glide, so Laulai has a /v/ only in one word.

One word is neither. kaf “coffee” came up from the surface some two hundred years ago with a shipment of taken and has been in every gallery in the system within a generation. It is rare for loans to be accepted like this since the Withdrawal.

Vril is the most important noun in the confederation, known to be a Roman adjective for manly. The eighth guild handed the word to a circle of Earth occultists in the 1860s during a run of showings. One of them put it in a novel, and it has been going round the surface ever since attached to a fictional underground master race.

9.4 Living variation

(i) The palatal law has stopped. k became č before a front nucleus and then ceased, stranding čal “town,” čai “back,” čse “amount” and čme “praise” with č before nuclei that never conditioned it. These four have to be learned.

(ii) The triadic and tetradic suffixes nearly collide. -tri and -tra differ in one vowel and in fast speech they may not differ at all. Since a mis-said suffix changes what a step is worth, and a step worth the wrong thing is ineffective, the practice in tkalok is to say the numeral out in full: elm tre for elmtri. A free numeral carries its value into the balance exactly as the suffix does.

(iii) Class IX is a residue. A quarter of all nouns are class IX, many for no better reason than that no other class claimed them. The inner holds assign mikran “small” to IX and the outer holds to II. This is a dialectal difference that places where someone is from.

(iv) The pronominal plural in -s (mens, saits, kens) is the only non-numeral inflection left. It competes with the decadic on the same words. The lower galleries have quietly rebuilt a plural out of it that the standard language does not have.

(v) Three of the six locational preverbs are not yet preverbs. ane-, ni- and ok- attach directly in the inner holds (okmelai “looks about him”) and are written with a juncture in the outer, ok-melai, where they are still felt as adverbs standing in front of the verb. at-, irk- and ets- take the juncture everywhere. The orientational four take none anywhere, their transformation being complete.

(vi) The class prefix is going. It is obligatory in tkalok and optional in the nursery-speech. In the fast speech of the outer holds, it survives mainly on class III and class VII: on persons, and on the ksost.

(vii) Case stacking is contracting. The full stack of §4.4 is universal in tkalok and in writing. In speech, the inner holds stack only the genitive. A stacked locative is now a mark of an old, formal or careful speaker.

(viii) The accusative is spreading at the expense of the archic on definite undergoers (§6.2). This is the largest ongoing change in the language, led by the gun-decks.

(ix) Three of the ten joints are not settled. -aps, -am and -os (§5.6) are the three that begin with a nucleus. A nucleus-initial ending on a root whose final vowel is gone has nothing to lean on. They have been worn off and rebuilt from the noun paradigm more than once. They differ between the inner and outer holds in irregular ways. These are the words for because, that and which.

(x) The way round is spreading. The construction that lets a doer be relativized (§6.6) is universal in the seventh guild and common on the decks. It goes against the doctrinal interpretation of the grammar, so it’s forbidden in formal writing.

9.5 Two changes with dates

The class of fot. fot “slave” stood in class III with the persons in every text before 1743. It’s in class V with the grown and the bred in every text afterwards. Nothing in the sense of the word changed and no sound law is involved. The break is clean, and it falls in the decade of the first bred lines. A slave stopped taking the person-concord an-, stopped taking the person-pronoun ken, and began taking ton “it.”

The older state is still visible in the akousmata, which cannot be revised:

xap fotmon femai.
xap | fot-mon | fem-ai
NEV | slave-MON(1)-DAT | speak-KIN
Speak not to the slave.

The case is the dative, of the recipient and the other. Class V nouns are not addressed; one does not speak to seed, fire, grain or an ox. A maxim forbidding speech to a slave presupposes a slave one could speak to, and prohibitions are not ordinarily issued against the impossible.

The naming of the bred lines. The -zes pattern is attested from the same decade: kauzes, sipzes, nalzes, pmizes, falzes. It was productive within a generation.


10. The Lexicon

The whole of the attested vocabulary: 1128 entries covering 1106 distinct stems, arranged by syzygy for nouns and by part of speech otherwise. The figure in brackets after a noun is its default arithmological number (§4.1): the inflection it takes when nothing in the context calls for another. Nouns without a figure are attested in too few contexts to give one.

marks a stem that is not Arcadian: the thirty-seven of the Hellenic stratum (§8.1) and the four late-Latin loans of §9.3.

Class assignment is inherent and never marked on the noun itself. It surfaces on agreeing words and on the verb (§5.3), through the concord prefix given in each heading. Three assignments are not where a reader may expect them. brot † “mortal” and fot “slave” stand in V, the generative, the class of seed, fire, livestock and grain. ksost stands in VII, with rod, plate and everything else that is either straight or not (§4.2a).

I – limit / unlimited (me-): measures, media, fields, fluids, times (44)

alnθaun (2) flood, waterfall; alnθaun-fals (2) flood-gate, sluice; amdi sea; amp (2) smoke; amze (4) well; emer † day; idai scale (trade); in (2) snow; irn (4) earth; kar (4) time, season; knau (2) half-part; lau (2) wave; lit year; lom (3) weight; mamil month; mik (1) moment, instant; milne week; mlen (4) lake, hoard; mnis (3) judgment, measure; morb (2) cloud, mist; nang (1) horizon; nen shore; ner stream; not spring; nukt † night; on wind; op (2) ice; pin river; pok (4) ground; psnai † (1) sky, air, breath; psnai-alnθaun sky-flood, deluge; psnai-lont (4) firmament; ra rain; rarm (1) nadir; tešt (3) scales, judging; top place; ðaur † (2) water; čilp hour; θimp (1) zenith; rant (4) tolerance, declared allowance; el-kosm (10) the system, everything inside the limit; tsmizes-kar (4) the moon-month of twenty-eight days; serk (7) true interval, one of the ratios that does work on the world; taus (2) the outside, the hard cold past a hull

II – odd / even (pa-): number, data, reckoning, record (53)

ansol (2) fraction; karn (3) proportion; kelerp (10) number (number); kernaus-met essence-measure, assay; kor-pas (2) digit; lazen (3) mean-average; lok-tlaim (4) lexicon, word-list; lort (3) series; mik-tlaim (4) clock, moment-tally; mnis-knaus (10) sum; mnis-tešt (4) judgment-scales; omn (1) name; pas (10) number (quality); pedalkau figure; pemn (3) constellation; ramt (10) order-measure, canon; sašti (10) zodiac; sinb (3) sequence; solp (1) meridian; tadai (2) remainder; tauk (2) difference (number); tensi † (3) ratio; tetrakt † (10) the sacred count (fossil); teu (1) proof, evident truth; teu-klars (4) diagram, proof-drawing; teu-tešt (4) proof-scales, test-balance; tlaim (4) tally, list; tork (3) progression; tren conjunction; trini (7) cipher; xep (4) ledger; xol difference (quality); ðaur-mik (4) water-clock; čirt (2) quotient; čse amount; titlok (10) the old speech, the substrate tongue; tkalok (10) the decad-speech, the register of proof (§0.7); nesrak unwhole, ineffective (§7.2); medr-lok (1) nursery-speech, mother-tongue (§0.7); septakt † (10) the heptaktys, twenty-eight; mern-rak (10) a perfect number, and of an utterance the sworn grade; or-tlaim (4) pedigree, kin-tally; fot-lok (10) slave-speech (§0.7); nešt-tlaim (4) the roll of the Watch (§11.3 v); tnošt-tlaim (4) the roll of the Withdrawal; mne-tlaim (4) war-tally, engagement record; teukt (1) theorem; kno (3) lemma, a step granted; sništ (4) construction, a figure once it is built; teu-snip (1) proof-thread, a chain of steps; plio-teu (2) counter-proof; plišt (2) a reckoning, a piece of arithmetic once it is done (§6.7); čelok (1) the bound form, a clause tied by če- (§6.6)

III – one / many (an-): persons, bodies, aggregates, parts (139)

a head; abi market; ade daughter; ain twin; ak clan; aln arm; an † tooth; anθ † (1) person (one of the Laulai); anθka (10) all persons, the people entire; as tongue; de household; dne king; e brother; emp elbow; eu ancestor; fi ear; fik jaw; ge shoulder; ile son; kamp novice-of-guild; kel flock; klak (3) wright; klaz (1) initiate; kol neighbour; kom brain; kon chief; kop herd (animal); kor finger; kretmis captain of industry; kri claw; lap soldier; lars (1) adept; launt (10) congregation, gathering; le husband; ler heel; li neck; lirai (1) guild-master; lo face; lop army; lor tail; mans (1) hierophant; mau fist; medr † mother; melg great one, elder; menan (1) magister; mis (1) lord, teacher; mor swarm; mos (3) elder-council; nam (10) assembly; nasp (4) archon; ne nose; nelmi (3) engineer; nip leg; nit caravan; no throat; nok belly; onan judge; ops † eye; or kin; os † mouth; par horn; pet queen; pi hair; pme village; pond steward; ponen precentor; pslaus singer, poet; pso servant; ptir † father; rai (2) journeyman; raut censor; razau cantor; ris sinew; rit wing; ro sister; rom foot; ron toe; sal stranger; sam guest; sap lung; sen (2) child, novice; sennan youth; sen-mis (1) child-lord, boy-master; sil (2) apprentice; sim skin; sir enemy; sop blood; sos (3) council; sot hip; spai proctor; tai hoof; tal watchman; tan palm; teng warden; tepe freeman; tet (10) guild; tetka (10) the confederation; til knee; tim friend; tli trade-guild; to wife; tol breast; xen liver; xer hand; xik guard (society); ze orphan; čai back; čal town; čik city; čin heir; θe widow; θek vein; θil brow; θmi flesh; θon master-craftsman; laulai (1) a Laulai, one of the people; laulaika the race entire; plask † (1) Pelasgian, of the first descent; kosm-nasp (10) the archon-race, the cosmic aristocracy; mniska (10) first guild, the Measure; xepka (10) second, the Ledgers; mneka (10) the War (shrine of the second); nomka (10) third, the Law; kertka (10) fourth, the Gearing; θauka (10) fifth, the Seed; armka (10) sixth, the Harmony; relka (10) seventh, the Blades; ongka (10) eighth, the Visions; manska (10) ninth, the Order; plagka (10) the Invocation (shrine of the ninth); oðaska (10) tenth, the Paths; menan youth; pmišt (1) hunter, one who has been out; imn-anθ (2) ash-person, a burnt child lord; irk-anθ (1) turned-back person, one who recovered; mne-mis (1) war-lord, general; teu-anθ (1) proof-person, scholar; orn-anθ (1) chant-person, singer; prot-fot (1) first-slave, a Greek who took the doctrine unforced (§8.1)

IV – right / left (xe-): thread, gearing, rotation, transmission (32)

aldi weave (cloth); ani loom; emi thread-spun; emt (6) orbit; kert (3) cog, fate-wheel; kre rope; krot (4) stator; lir (1) cord, lineage; malk (3) shaft; mni (3) axle; nai yarn; nand-lir (2) bind-cord, restraint; nazes (4) bushing; pamp (5) rotor; psai-snip (1) soul-thread; reu-lir (3) song-cord, instrument string; rin (3) joint, and a joint of speech (§5.6); sals (3) spindle; sirn (6) epicycle; snip (2) thread, nerve; snip-θilt (2) knot-thread, tangled circuit; sošt (6) flywheel; tins (4) bearing; tirt (2) cunning, a twist; tni (3) lever; xes (6) wheel; čairt (6) wheel-work; šisne (4) mounting; θok-čairt fate-wheel, horoscope; lans (4) gantry, catwalk; noln (2) yoke, harness-beam; irk-rin (1) back-joint, the link a reciter comes back on (§5.6a)

V – generative (sa-): sources, couplings, seed, fire, the grown and bred (93)

al deer; alntinan wheat; dendr † (4) tree; enen cheese; enerk (5) power, anger; eni meat; ep pig; fai bean; fak (5) kiln; fap pepper; fas wood; fe mouse; fek pot-herb; gi rat; i bird; ikt barley; imn wine; is wolf; izai fat; kan ant; kem (5) hearth, furnace; ker nest; keu milk (food); ki bear; klo egg; kro butter; lel broth; lil flour; map feast; mat berry; min branch; mo dog; mok scale (animal); na horse; nap meal; nek grass; nol moss; non worm; nri (5) root; omp bread; pa hare; pam fur; pan dough; pap soup; paur † (2) fire; pebau (5) growth; pen leaf; pis fly (animal); pom crumb; pro hunger; pte flower; rapan strength; ren beer; rene moth; rip apple; rir spider; ros root-crop; saink (5) heartbeat, thrust; san honey; saz animal; sazip (5) birth; se ox; sel snake; sntasp fish (animal); som feather; tek spice; termanki grain; tong harvest, all-fruit; xe (1) lightning; xok fruit; xot nut; či goat; čip herb; čis onion; θau (5) seed; θes bee; θi sheep; θin oil; θki (5) yeast; θo beast; brot † (2) mortal, one of Earth; brotka (10) mortal-kind; fot (2) slave (class III until 1743); fotka (10) a slave-race; θaušt (4) gene-stock, graded seed; θau-kot (4) seed-chamber, breeding house; kauzes (2) the digging line; sipzes (2) the striking line; nalzes (2) the feeding line; pmizes (2) the tracking line; falzes (2) the handling line; brot-launt (2) a congregation on Earth (§0.4); nalne (2) mouthful, a bite of something cooked

VI – rest / motion (el-): engines, mechanisms, resonance, sound (38)

alnin (3) antinode; ams (4) apparatus; ank riddle-song; det echo-of-voice; elm (4) engine; eun (4) mechanism; fals (2) gate, threshold; io (2) echo, memory; klide (3) timbre; krad harmonic; laus † hymn; lidit (3) pitch (resonance); mirne (2) beat-tone; mozes (6) resonator; nais (3) standing-wave; nalte (3) consonance; narn (1) fundamental; neln litany; niks (2) vibration; orn chant; plap (3) interval; plio (2) dissonance; rem (4) mill; rern (2) storm, chaos; rern-θaun (2) storm-bell, alarm; reu-alnθaun (2) song-flood, resonance cascade; reu (3) song, spirit-voice; rezas (3) resonance; sarmi (2) overtone; tort (3) node; tson (3) tone-quality; vril † (7) motive force, the work a true interval does; xem (1) heart, driving-core; xem-kert (1) heart-engine, prime mover; θaun (3) bell, summons; θaun-templau (4) bell-tower, campanile; θomp transmuter, change-engine; sarn (2) wandering tone, a pitch that will not sit

VII – straight / curved (θo-): rod, plate, edge, structure, extension (60)

ambe sail (trade); amn sphere-celestial; antri (4) wall; arme (2) wedge; armpalmaul (4) frame; edi (2) hammer; esp net; ez (2) saw; kam girdle; kim (4) plate; kin sickle; kla rib; kle patch; kli (4) bridge; lal (2) tool; lan (4) stair; lon hook; los (2) chisel; lot (2) needle; mak spoon; mes ladle; mim plough; mre sledge; nar seam; nis spine; pik (2) peg; pim hem; ping (4) chassis; plas † (4) plain, sheet; pne bone; ral boat; rel (2) blade; rep oar; ret scythe; sak spade; sat (2) file; sau ladder; sik (2) nail (tool); siz knife; sonk edge; tme nail (body); tnai censer; xar (5) bow, curve; θak cart; θem fence; θep ship; θir anchor; θmpe (2) axe; θpe (2) awl; pol-rel (7) the many-blade; θepka (10) the fleet, all ships; ksost (9) one of the crooked ones, one of the things that come in from outside the limit; θalm (9) the plate, a ksost that is all surface; šarn (9) the singer, a ksost heard before it is seen; mnok (9) the jesters, many bodies on one figure; xasp (9) the mouth, a ksost that is mostly an opening; kolp (9) the fold, a ksost larger inside than out; arke (9) the still one, a ksost that entered and stopped; nars (2) open seam, a join whose angles do not add up; kolt (2) bracket, the pair of numbers a rangefinder returns instead of a range

VIII – light / dark (fa-): lamps, rays, images, colour, the occult (29)

amntems (2) ghost, omen; amntems-laump (2) corpse-light, will-o-wisp; ampsai (1) shadow-soul, shade of the dead; anbis (2) meteor; aumn dream; aštir † (1) star; el † (1) sun; faut (1) light; im (2) darkness, shade; klor (4) glass, mirror; kne likeness; krau † (4) ice-stone, crystal; krau-klor (4) crystal-mirror, speculum; krau-laump (4) crystal-lamp; laump † (1) lamp, star; laump-klars (4) star-chart; nante (2) comet; ong (3) vision; psnai-petr (2) meteor, sky-stone; skot † (2) dark(ness); sonen (2) eclipse; tsmizes (1) moon; ongzes (4) seeing-engine; kišt (2) a showing; brot-ong (2) the reading of mortals; psai-paln (10) the return of souls; xamn (1) the waking, the opening of the reach; sorm (1) reach, what a waked mind can put through a ratio; xamn-kot (4) waking-chamber

IX – good / bad (so-): evaluation, temper, obligation, the sacred (179)

aken (10) liturgy; akrauzes folly; al debt; alde longing; almi tax; almpint duty; alni purpose; alnte idea; ami price; amk murder; amzi disgust; anki skill; anze argument; anθka humankind, the living; ardi thirst; ari promise (society); arm † (1) peace, order; arni profit; asp chimney; aum doubt (mind); aun (3) rite; aunan (3) ritual; dai attention; ebau grief; emn proverb; enz mind; ern rage; etke forgetting; fa thunder; far loneliness; fat blame (speech); fit jest; fsi affection; gli jealousy; gni loss; gri shout; int (2) sin, defect; ir lip; ird belief; irm sorrow; irs life; ize trade; kak treaty; kazasθi beauty; kepi unease; kernaus (1) essence, kernel; ket courage; kik intention; kinan wonder; klars (4) drawing, rune; knarpau poem; kok sentence; konan product; kos craft; kosm-arm (10) world-order, cosmic law; kosm-psai (10) world-soul; krage art; ksau (1) truth; kse part; kspenan † (10) wisdom; kti agreement; lai beginning; lak problem; laren despair; las tribute; lat goods; lazau libation; lek taste (food); len valley; lep whisper; lip curse; lis pit; lok word, reason; mamir pride; mart pity; masp opposition; mek sameness; mem contract; memau calm; mern † (2) share, portion; mimeu offering; mit prison; mne war; mot insult; nan (1) joy; nan (1) raving, prophecy; nararp thought; nel opinion; nelešti ugliness; nenan tale; net fine; nle warning; nols sacrifice; nom † (10) law, custom; nonan surprise; nre comfort (emotion); peman weakness; penan command; penen shame; pep insight; per † (3) trial, ordeal; pes mantle; pio delight; pip refusal; pla (2) mistake; plag invocation; pleg decay; por crime; pos mountain; psai † (7) soul, self; pske health; rak (10) whole (quality); ras wage; razis speech; reu-mern verse; rikni envy; saik (1) stillness; the unknown (§7.4); sek prayer; senin age; ser patience; sis punishment; ske middle; sol veil; talt lie (mind); tap stable; tat gratitude; teke theft; tel † end, death; tenan ignorance; tenli saltpetre; tes (1) witness-oath; tider desire; tok threat; tor stew; tot farewell; trize greeting; xak request; xarp hope (emotion); xat answer-given; xau (1) silence; xel riddle; xin rind; xme disorder; xne blessing; xos terror; xosan fear (emotion); čil (1) oath; čim knowledge; čme praise (speech); šik choice; šin debate; θai regret; θam boredom; θan loan; θap decision; θat truce; θazes sickness; θelk scripture, god-word; θet understanding; θeu † (1) god, spirit; θilt knot, spell; θim lady; θio rumor, hearsay, story; θit witness; θke question; θol (4) right (society); θot plan; θsi contempt; nešt (3) watch, vigil, night-keeping; θamn (1) axiom, what is seen entire and without proof; čelan (1) a call, a number-call; sišt (3) inspection, the assessing; θalt (10) the Imposition, the naming-over; tnošt (10) the Withdrawal, the clearing-out; or-nom (10) the law of descent; elm fear; irn rite; mamn (2) the crooking, the sickness of having looked (§0.2); tirnan (2) doubling, the state of a body whose parts come round twice

X – square / oblong (ne-): form, jig, casing, vessel, building, stuff (109)

aim smoke-hole; anbe (4) square; amdi-pal island; andai sanctuary; ange cellar; arde sandal; arne cloak; az † coin; azen window; aštin † body, skeleton; dom † (4) house; enan garment; enk hut; eps shirt; ert belt; fer hill; fes sash; fet courtyard; fim felt; fis box; fni harbour; id floor; iln home; imn ash; im-kot (4) dark-chamber, camera obscura; izas robe; kagi roof; kelme wool; kem-kot (4) furnace-chamber; kent (4) lead (material); kep door; kosm † (10) world, universe; kot (4) room, womb; kot-marn (4) housing; lam pot; lem chest (body); les forest; lik (4) workshop; lits (4) gold; lorm shrine; malθ incense; marn (4) casing; mas silver-coin; mip bowl; mni (3) leather; mol cargo; momp lime; nant (4) sulphur; narilt (4) iron; nark altar; nasp (4) silver (material); nem wares; neu granary; nir hide (cloth); oðas † path, road; pai barn; pal rock; pek glove; pel forge (dwelling); penke linen; petr † (4) stone; pil basket; pirk (4) mercury; ple bucket; prok temple-precinct; prom clay; ram coat; rek cup; renasθ (4) steel; reu-kot (4) sound-chamber; rim thing, matter; sai sand; saik-kot (4) silence-chamber, anechoic room; sanester (4) bronze; sep loft; sims (4) copper; tam (4) storehouse; templau † (4) temple, court; templau-fals (4) temple-gate; tik jar; tinan (4) tin; tio shoe; tip cave; tir chamber; tiθ dye; tne hood; tse cap; šis (4) seal; štrat † street, road; θar mud; θni boot; θok (4) stamp, fate; θos dust; θrmaunan (4) brass; θspe cloth; θerk (2) fissure, crack; pi-θerk (2) hairline crack; tirm (2) creep, slow drift out of true; korm (4) certificate, attested paper; kosm-kot (10) a hold, world-chamber; xrešt (2) one of the taken, cargo; xre-kot (4) press-hold; men island; čirt housing; loks (2) book, bound account; kaf (2) coffee, the black draught of the surface (§9.3); rimp (2) shed, the crooked matter in a ksost’s wake; rakt-rim (1) closed body, the carcass of a ksost once it has been closed; kimp (4) pressure-shell, hull-suit

Verbs (155)

ades forget; ai run; andi forbid; ant doubt (abstract v); ap wake; ar walk; arm-nau tune; asp eat; aus bite; daun give; ek sit; elau polish; elt come; emau chant; end prove; fal love; fem speak, tell; fen compare; fep listen; fom respect; fop choose; fos break; iks deny; ilk promise (abstract v); inan grind; inen understand; ins spin; ip speak, name; ire weld; isp believe; izes weave (action v); ka sleep; kap trust; kau dig; kelti despair-of; kip discover; kir dry-out; klos close, finish; knaus know; komp mix, blend, alloy; lar sharpen; laz have; lekt † say; lerau intend; lim brew; limn attune; lin drop; lol braid; mai thresh; mal reap; mel look; mep taste (basic v); mer shear; met † measure, law; mikam assay; minan transmute; mop guess (abstract v); mosk despise; nal cook; nand bind, oblige, tie; nat smoke-cure; nau push; nep tear (basic v); nil hold; nilke temper-metal; nio refuse; nme burn; nor dig-out; nos pull; om stand; ons drink; ont be (copula); opt see; orm remember; orn forge (action v); orp explain; pak fish (action v); pat agree; peu chew; plarpen carve; pli reckon; plige gauge-measure; plo wash; pmi hunt; pot cough; pra plait; prar resonate; pre lift; psa plant; pse salt-preserve; psri learn; rel (2) ferment; rik invent; riz dare; riθ measure-out; ronan oscillate; rope hope (abstract v); ror roast; rot bake; sair amplify; salki vibrate; sar put; sem herd (action v); senan teach; ses hear; set swallow; si lie (basic v); sip hammer-out; sit cut; sme winnow; sni build; sok dispute; spi decide; tar sew; tin breathe; tmau forge-weld; tomt quench; tos place, set, there-is; toz damp; tri catch; tro boil; xan throw; xonk calibrate; xpe touch; xre take; xse milk (action v); xte allow; zait † live; čir trap; čmpe be; šain flow, flee, go; šait anneal; šir betray; šit sow; θal cast; θant die; θel want; θen smell; θers do, make; θik obey; θle rub; θme imagine; θop change, transform; θpi carry; čel call out, cry the number; tno clear, empty out (a hall); θko condemn, strike from the roll; pert enter in the roll, register; tasp step over, cross; kis show, appear before mortals; rakt close, prove shut; klos close; xamn wake, open the reach; imnai go to ash, burn out; kerm scorch, sear; xirn tear open, rip

Adjectives (116)

adi wide; amde sharp; anan cowardly; arbi just; arge rare; au brown; aze white; bau profane; bi cool; em soft; er pale; erm ash-grey; fok common; gau tainted; gen free; ik grey; il hard; ime short; kank bad; kas full; ke green; kertan geared; kis open-known; klari wrought; kler corroded; konen hasty; kradan harmonic-adj; lašte honest; lenan clever; lil brave; lont bound; ma thin; makr † big, great; mam crooked, out of true, the standing adjective of the ksost (§4.2a); me silver (colour); meu greedy; mi blue; mikran † small; mil unjust; mir holy; mom FALSE; monan untuned; nanis gentle; nas clean; nim far; nin deep; nirθ humble; o long; ol yellow; opel sky-blue; panan tempered; pau TRUE; pe narrow; pem weak; pilte wise; pimn malleable; plionan dissonant; po warm; pop shallow; prabe generous; prad deceitful; pri strange; prot † first, foremost; psi slow; rap strong; rat careless; rau proud; razai harsh; rerm ductile; rezasan resonant; ri cold (basic adj); ril fast (basic adj); rošt calibrated; sanan careful; sas right (basic adj); siln cast-adj; sin dull; sinan foolish; sind brittle; siθ patient; sne pure; so heavy; son good; sor new; sti familiar; ta dark-red; tadi red; tas (1) empty, cup; te thick; tem dry; tempe kind; tep wrong; ter loud; ti golden; tilt tuned; tit old; trene black; xal near; xek stupid; xke wet; xlir mechanical; xom young; čit dirty; θa hot; θis high; θom straight; θonan cruel; θor low; plask † (1) Pelasgian; mern-rak (10) perfect; rošt-nes uncalibrated, unfit; θoln unclosing, that does not terminate; tirn doubled, occurring twice in one body; kolt bracketed, having no single measure; nirn over-hollow, larger within than without; saun sounding, giving off a sarn

Particles and adverbs (44)

alme then; alne soon; ame there; ane inside; at across; ebi below; et still, yet; ets forward; along; fo downward; fon meanwhile; irk backward; it here; already; ko behind; kra yesterday; la upward; mals very; mar Q (polar particle); nain now; nak long-ago; nes not; ni outside; nik right (space time); ok around; paln † again; pir seldom; pon west; ran east; re before; rer late; rol early; sa between; tak always; tau south; ten often; tle left; tom tomorrow; tske above; xap never; xio north; pen jussive (§5.5); θas today; tsa apprehensive, “lest”

Numerals (13)

di two; eks † six; ektan † hundred; en one; ims † half; nop † nine; okt † eight; pent † five; sept † seven; tka † ten; tra four; tre three; šal thousand

Pronouns (7)

ken he/she (3sg anim); kens they (3pl anim); men I (1sg); mens we (1pl); sait you (2sg); saits you (2pl); ton it (3sg inan)

Postpositions (source of the cases) (4)

aps † from (ABL), than (compar.); es † in, at (LOC); met † with (COM/INSTR); mon to, for (DAT/ALL)

Conjunctions (5)

am if; dit because; kat † and; lekt † that (complementizer); res or

Interrogatives (4)

tis who; kes what; ond where; pols how many

Demonstratives (2)

ent that (dist); ot this (prox)

Quantifiers (2)

ols † all; pol † many, much

The seven metals are assigned to the seven wandering lights. The assignment is taught with the heptadic: lits to the sun, nasp to the moon, pirk to the swift one, and so on.


11. Texts

This section presents nine bodies of material, in the following order: The akousmata, which are old, mostly Arcadian, and recited in the nursery-speech. The constructions, which are tkalok. The hunt, which is tkalok composed live by people in dangerous circumstances. Beside it one testimony, which is a man talking for a day. Earth, which is what the confederation says to a species it is farming. Then two sections with loose speech: gun-deck speech, where the living language is shown, and a specimen of fot-lok, which is considered corrupt. Then the ash. Then the tale.

11.1 Akousmata

The akousmata are old and deliberately obscure. They are recited to apprentices without explanation and glossed aloud by seniors on the floor, differently in different halls. Most are Arcadian in every word, which makes them the best evidence anybody has for the substrate’s syntax. Most turn on a homophony, which is how they survived a language that lost its vowels. None of them balance, being maxims rather than proofs, laws or binding in any sense. None of them carries a class prefix on the verb either. That absence is one reason they are held to be archaic (§5.3).

(i) xap liram taspai.
xap | lir-am | tasp-ai
NEV | cord-MON(1)-ACC | step.over-KIN
Step not over the cord.

lir is the monochord standard and it is also lineage. Never cross a cable run. Never stand over the measure you are about to take. In the third guild’s reading, never get issue outside the line, the or-tlaim that has been kept for twelve hundred years.

(ii) xap xemam aspai.
xap | xem-am | asp-ai
NEV | heart-MON(1)-ACC | eat-KIN
Eat not the heart.

xem is the heart and the driving-core. Do not consume yourself with grief. Do not run the core down. The seventh guild recites it at people who have come back from a hunt and will not stop talking about it.

(iii) xap sizmet kemam xpai.
xap | siz-met | kem-am | xpe-ai
NEV | knife-INS | furnace-MON(1)-ACC | touch-KIN
Touch not the furnace with a knife.

In metallurgy, this applies literally. Morally: do not answer heat with an edge. The hunting shrine reads it as tactical doctrine, meaning never take on a ksost with the weapon you happen to be holding.

(iv) xap faim aspai.
xap | fai-m | asp-ai
NEV | bean-MON(1)-ACC | eat-KIN
Abstain from the bean.

The oldest and the most argued over. fai is class V, the generative, so the received gloss is that one does not consume what generates: “Don’t kill the goose that lays the golden eggs.” The inner holds keep it as a dietary rule, while the outer holds keep it as a rule about seed stock. They eat beans.

The fifth guild’s reading is the operative one and is why the maxim is painted at the door of every θau-kot: no Laulai line may be used as stock. Mortal gene-lines are bought, taken, cut and recombined without limit. anθ material is not touched, on pain of erasure from the or-tlaim.

(v) xap falsaps irk melai.
xap | fals-aps | irk | mel-ai
NEV | gate-MON(1)-ABL | backward | look-KIN
Look not back from the gate.

Once a hall is cleared, do not go back into it, not for a tool and not for a coat. It is the plainest of the akousmata and the most often disobeyed. The records of the last century hold nine entries that begin with: he had gone back for

(vi) pen anθam naprai; xap natosai.
pen | anθ-am | na-pre-ai | xap | na-tos-ai
JUSS | person-MON(1)-ACC | THITH-lift-KIN | NEV | THITH-set.down-KIN
Help a man to take up; never to lay down.

Both verbs take na-, outward: the help goes away from the speaker and never toward him. Drill-masters gloss it as a rule about not getting under a falling load. Everybody else glosses it as a rule about generosity. It says anθ. The obligation stops at class III and the third guild has been explicit about that since 1751.

(vii) xap im melai.
xap | i-m | mel-ai
NEV | bird-MON(1)-ACC | look-KIN
Look not at the bird. Or: look not at the dark.

im is the accusative of i “bird” and the citation form of im “darkness”. The gnomic style permits a bare stem as object, so the maxim is ambiguous and cannot be disambiguated. It is the standard example of what the akousmatists mean when they say a symbolon is not a sentence with a hidden meaning but a sentence with two meanings and no way to choose.

11.2 Constructions

Everything here is tkalok. A construction is one sentence: a chain of converbs and a conclusion (§7.1), balanced over the whole (§7.2).

i. A hunting construction, five links. This is the standard opening against a slow ksost that has already been ranged. It is taught at eight and everybody in the second guild can recite it in their sleep.

ksostnopam θomelkat, narnam elplikat, serktrim meriθkat, —penam θoxonkat, ksost θoraktom.
ksost-nop-am | θo-mel-kat | narn-am | el-pli-kat | serk-tri-m | me-riθ-kat | —pen-am | θo-xonk-kat | ksost | θo-rakt-om
ksost-ENN(9)-ACC | VII-look-CVB | fundamental-MON(1)-ACC | VI-reckon-CVB | serk-TRI(3)-ACC | I-measure.out-CVB | UNK-PENT(5)-ACC | VII-calibrate-CVB | ksost-MON(1)-ARCH | VII-close-STAT
Having looked on the ksost at the limit, having reckoned its fundamental, having measured out three intervals against it, having calibrated the unknown that is its live source — the ksost is closed.
Balance: 9 + 1 + 3 + 5 + 1 = 19 → 10 → 1. rak.

The unknown is pentadic because what the company is solving for is the thing the ksost is coming out of (§7.4). The construction is an argument that a crooked figure still has a source and that the source is inside the limit even when the figure is not.

Nineteen reduces to ten and ten to one, which is the only reason the last link is ksost and not ksostdi. A prover picks the closing nominal partly for its sense and partly for its value. The sum must count to a perfect number for occult power to be channeled.

ii. The same construction, said wrong. In 1904 a sen-mis of twelve, on her fourth time out, put the heptadic on the unknown instead of the pentadic, one suffix out of place.

ksostnopam θomelkat, narnam elplikat, serktrim meriθkat, —sepam θoxonkat, ksost θoraktom.
ksost-nop-am | θo-mel-kat | narn-am | el-pli-kat | serk-tri-m | me-riθ-kat | —sep-am | θo-xonk-kat | ksost | θo-rakt-om
ksost-ENN(9)-ACC | VII-look-CVB | fundamental-MON(1)-ACC | VI-reckon-CVB | serk-TRI(3)-ACC | I-measure.out-CVB | UNK-HEP(7)-ACC | VII-calibrate-CVB | ksost-MON(1)-ARCH | VII-close-STAT
Having looked on the ksost at the limit, having reckoned its fundamental, having measured out three intervals against it, having calibrated the unknown that has no fellow — the ksost is closed.
Balance: 9 + 1 + 3 + 7 + 1 = 21 → 3. nesrak.

The heptadic is not a stupid value to put on a ksost‘s source. It is what half the seventh guild would have said. It is also two more than five, and twenty-one does not pass through ten. What it passes through is three, the number of balance. Fortunately, the company was able to back out of the engagement with everybody alive.

iii. An order. Composed in one breath, at the moment of contact, in ti-, which no adult present may contradict without having stood where she was standing (§5.5).

pen relmet —nopam tinandaika.
pen | rel-met | —nop-am | ti-nand-ai-ka
JUSS | blade-MON(1)-INS | UNK-ENN(9)-ACC | HITH-bind-KIN-COLL
Put the blade on the unknown at the limit — here, all of you, now.
Balance: 1 + 9 = 10 → 1. rak.

The unknown is ennadic and not ksost-anything, because at the moment of contact she does not yet know what she is looking at. Because of the collective on the verb, the company is to move as one object.

iv. The oath of descent, sworn by every Laulai in the twenty-eighth year of life, at twenty-eight, and not releasable under ordinary circumstances (§7.3).

anθkamet nomkat ksostkam mneseptel lanandomka.
anθ-ka-met | nom-kat | ksost-ka-m | mne-sep-tel | la-nand-om-ka
person-DEC(10)-INS | law-MON(1)-COM | ksost-DEC(10)-ACC | war-HEP(7)-TERM | UP-bind-STAT-COLL
All persons, with the law, bind the crooked ones entire unto the one war.
Balance: 10 + 1 + 10 + 7 = 28. mern-rak.

The heptadic on mne is significant: the war is a solitary war, ongoing since before the official chronicles. The seven also makes the sum effective.

11.3 The Watch and the hunt

Composed in the open, at speed, by someone with only a few seconds to respond.

i. A Watch report, off the firmament, sent down as one sentence.

psnai-lontam memeles, ksostnop tiθošainai.
psnai-lont-am | me-mel-es | ksost-nop | ti-θo-šain-ai
firmament-MON(1)-ACC | I-watch-CVB.SIM | ksost-ENN(9)-ARCH | HITH-VII-come-KIN
While the firmament is being watched: a ksost, at the limit and the ninth of the tally, is coming this way.
Balance: 1 + 9 = 10 → 1. rak.

The ennadic says two things at once and the meaning depends on context: at the limit, and the ninth of the tally. tiθošainai, in ti-, means she is not repeating anything.

ii. The closing report. Two hunters, coming in, on the ramp, before anybody has got their helmets off.

pmištdimet ksostoklonam θoraktomka.
pmišt-di-met | ksost-ok-lon-am | θo-rakt-om-ka
hunter-DY(2)-INS | ksost-OGD(8)-PER-ACC | VII-close-STAT-COLL
Two hunters have closed the great built solid, and it is bounded now.
Balance: 2 + 8 = 10 → 1. rak.

ksostoklonam is the point of the sentence. The ogdoadic says what they were looking at, a great built solid (§4.1 vi). The -lon says it has a straight pole now, which it did not have when they went out (§4.2a).

There is a dyadic on pmišt because six went out.

iii. The shortest report. A single word, called down a ramp. It is a complete utterance (§5.9):

ksostoklon.
The great built solid, at the limit.

iv. The alarm. The other single word:

ksostnop.
A ksost, at the limit.

Said down a gallery, it’s the call to take up stations.

v. The roll. The first guild’s list of what has come through, kept at the firmament and read aloud at the turn of the twenty-eighth watch. Each entry is a date, a kind and a line, written by people who had to be brief.

RollDateKindWhat is on the file
the firstOlder than the roll. The file is one line and a drawing, and the drawing is of a nars, so at least somebody was inside it
the second1731θalmCame in edge-on and was therefore not there. Nobody saw it until it turned, and when it turned it was forty kilometres of plate. It was already across the sun. It took the surface works of a middle hold in eleven hours, cutting, and it cut on the way out as well. The roll was instituted the following year.
the third1790arkeCrossed the firmament, stopped, and has done nothing since. It is still there, ranged eleven thousand times. The bracket has never closed by so much as a kilometre. Two companies have been sent to it. Both were recalled by the seventh guild after the second day. The seventh guild has never said what the first day’s signals contained.
the fourth1846kolpA body a tender could tow, and a party walked eleven days inside it without reaching anything. Declared closed by a company of twelve on a chain nobody has ever repeated. Eleven of the twelve died on the last link, and the twelfth was six (§1.6).
the fifth1871xaspWent for the moon. It took the northern yards, three hulls on the ways and about nine hundred fot. Everything it took came back out over the following month as rimp, drifting in the shape of the yard it had been.
the sixth1902mnokSomewhere above four thousand identical bodies, none larger than a cart, moving as one figure. The fleet destroyed nine hundred of them in a day and nothing changed. Closed in the end by two shrines working the same construction from opposite ends of the system without either being told the other was there.
the seventh1938šarnHeard for eleven days before it was seen, through the hull before it was heard in the air. It is the only entry with a recording attached. The recording is four minutes long. It is kept in the sixth guild’s galleries. Apprentices are played thirty seconds of it once.
the eighth1961nirnWas not seen crossing the firmament. Was found already inside it, in a hold, with people living around it (§11.8).
the ninth2004Still open. It is θokoltpol, it is θosaunpol. It has been inside the firmament since 2004. It’s still coming.

The ninth is the reason there is a sen-mis awake in every hold in the system at all hours.

vi. A field note from inside one. Signalled out of the fourth of the roll on the ninth day, by rope, one sentence at a time. The hunter who sent it did not come back.

kolpok θonirnpol θotirnpol narstrim θonges, tiθontom.
kolp-ok | θo-nirn-pol | θo-tirn-pol | nars-tri-m | θo-ong-es | ti-θo-ont-om
fold-OGD(8)-ARCH | VII-over.hollow-APEI | VII-doubled-APEI | open.seam-TRI(3)-ACC | VII-see-CVB.SIM | HITH-VII-be-STAT
The fold, a great built solid, over-hollow and doubled, while three open seams are in view, is here, around me.
Balance: 8 + 3 = 11 → 2. nesrak.

Balance is irrelevant because vril effects are not at play. He was nine days in. θotirnpol means doubled, the same part occurring twice in one body. He had walked down a corridor and arrived at its beginning without turning round. The three nars are why he stopped walking. The last word is in ti- (§5.2), on my own ground.

11.3a Testimony: the fold at Iort

In 1994 a hunter of the seventh guild named Maro sat in a gallery of a middle hold for most of a day and said what had happened to him. A scribe of the ninth wrote it down. It runs to about nine hundred lines. It does not balance as he is not proving anything. He is telling somebody what a place was like. He uses because, until, even if, the one that, and I did not know that. That is to say, he needs the three joints the trial-halls call irregular and both of the relative constructions tkalok will not license (§5.6, §6.6). This is intended to give an example of subordination.

The company had gone out to a kolp sitting in the ice of Iort, an abandoned moon at the edge of the middle system. Six went in. Four returned.

i. The tone. Nothing had been seen. The resonance galleries sensed it for six days first, which is normal. Often, this is the only warning anybody gets.

θopraraps, reu-kotes tisesomka.
θo-prar-aps | reu-kot-es | ti-ses-om-ka
VII-resonate-CVB.CAUS | sound.chamber-MON(1)-LOC | HITH-hear-STAT-COLL
Because the thing was sounding, we had it in the galleries before we had it anywhere.

The causal joint, which no proof uses and no account can do without. He gets a reason and an event into one clause.

ii. Going in. The seam is at the bottom of a shaft in the ice, and everything after this happens in the dark.

krem nilkat, θositkat, ane-šainaika.
kre-m | nil-kat | θo-sit-kat | ane-šain-ai-ka
rope-MON(1)-ACC | take.hold-CVB | VII-cut-CVB | IN-go-KIN-COLL
We took up the rope, cut the plate, and went in.

Nobody has mentioned the plate. The θo- on the second link is what says the sentence has stopped being about the rope (§5.6a i). The rope is the tender’s, it is eleven hundred cords. It is the only object in the surroundings that keeps a fixed length.

Maro chains for pages and comes back on the back-joint about every third sentence — … ane-šainaika. šainkat, …, “we went in. Having gone in, —”.

iii. What the corridors do.

nes čontom narstrim tiθongomka.
nes | če-ont-om | nars-tri-m | ti-θo-ong-om-ka
NEG | REL-be-STAT | open.seam-TRI(3)-ACC | HITH-VII-see-STAT-COLL
We saw three open seams that were not there.

A bound form under a negation, which describes a nars (§0.2): a join at an angle that does not add up, that the eye sees as a shadow. When you measure it, you feel an edge that is not there. To counter this, apprentices are taught the bound form before they are taught arithmological balance.

iv. Xame. Prolonged sight of a figure that will not close does something to a nervous system. It starts in the inner ear.

Xame nes anilrapkat, kenam irk-θpinalaika.
Xame | nes | an-nil-rap-kat | ken-am | irk-θpi-nal-ai-ka
Xame-MON(1)-ARCH | NEG | III-hold-POT-CVB | 3SG-ACC | BACK-carry-NEC-KIN-COLL
Xame could not keep his grip, and had to be carried back.

The necessitive (§5.4) says the carrying was owed.

v. Nothing in there has a fixed size.

nemetrapos rimkam nes tikipomka.
ne-met-rap-os | rim-ka-m | nes | ti-kip-om-ka
X-measure-POT-CVB.ATTR | thing-DEC(10)-ACC | NEG | HITH-find-STAT-COLL
We found nothing in there that could be measured.

The attributive joint (§6.6), where the bound form would have served perfectly well. Maro uses -os forty-one times and če- eleven.

vi. The rope.

kremet mikamet, tirnanam tikipom.
kre-met | mikam-met | tirnan-am | ti-kip-om
rope-MON(1)-INS | assay-CVB.MAN | doubling-MON(1)-ACC | HITH-discover-STAT
I found the doubling by assaying it against the rope.

He had walked a corridor for two hours paying the rope out behind him and had come back to his own knot without turning round. That is θotirnpol, doubled, the same part occurring twice in one body (§4.2a). The rope said four hundred cords and the walk said something else.

kremet and mikamet have the same ending, once on a noun and once on a verb (§5.6).

vii. On the wire. Tarla was twelve and on her ninth time out, at the top of the shaft with a wire running down into the ice. She asked a question:

“pols kre”-lek tičelai.
“How much rope,” she said.

The quotation is closed with the enclitic, so it keeps her deixis and not his (§6.7). What she said next was an order, in ti-, (§5.5):

pen kretram —ekam tinandaika.
pen | kre-tra-m | —ek-am | ti-nand-ai-ka
JUSS | rope-TET(4)-ACC | UNK-HEX(6)-ACC | HITH-bind-KIN-COLL
Put the warranted rope on the unknown that brings it into balance — here, all of you, now.
Balance: 4 + 6 = 10 → 1. rak.

The tetradic on the rope signifies installed, founded, warranted, the number used in deeds (§4.1). Everything else down that shaft was bracketed and the rope was not. The unknown is hexadic, a value that brings the system into running balance (§7.4).

viii. The chain.

kolpokam θomelkat, sarnam elplikat, kretram xeriθkat, —penam θoxonkat, kolp θoraktom.
kolp-ok-am | θo-mel-kat | sarn-am | el-pli-kat | kre-tra-m | xe-riθ-kat | —pen-am | θo-xonk-kat | kolp | θo-rakt-om
fold-OGD(8)-ACC | VII-look-CVB | wandering.tone-MON(1)-ACC | VI-reckon-CVB | rope-TET(4)-ACC | IV-measure.out-CVB | UNK-PENT(5)-ACC | VII-calibrate-CVB | fold-MON(1)-ARCH | VII-close-STAT
Having looked on the fold, a great built solid; having reckoned its wandering tone; having measured out the warranted rope against it; having calibrated the unknown that is its live source — the fold is closed.
Balance: 8 + 1 + 4 + 5 + 1 = 19 → 10 → 1. rak.

This is the construction of §11.2 i. with two words changed, and it is worth seeing them side by side. The taught opening takes a ksost at the ennadic, reckons its fundamental, and measures out three true intervals against it: nine, one, three, five, one. Tarla had no fundamental, because the thing’s tone would not sit. She did not have three intervals because nothing down there could be ranged. What she had was a rope and a sarn. She put the wandering tone where the fundamental goes and the rope where the intervals go. Because eight and four come to what nine and three come to, the total did not move. Nineteen either way.

The hexadic unknown of the order and the pentadic unknown of the chain are not the same hole. Thirty seconds apart, she asks first for whatever value will bring the thing into running balance and then settles for a source, which is a smaller and a harder claim. Provers change their bet in the middle of a chain (§7.4).

ix. The last link. Maro was on the rope forty cords below the seam and could hear her.

nes klosknekat, ni-šainalomka.
nes | klos-kne-kat | ni-šain-al-om-ka
NEG | finish-CVB.COND-CONC | OUT-go-NEC-STAT-COLL
Even if it did not finish, we were going out, and that was nobody’s decision.

The concessive and the necessitive in one clause: He is saying the way out was owed to them by then and that no one was going to be asked.

x. The silence. The sarn had been in the frame and in the teeth for six days and the bridge of every man’s nose. Then it was gone, and four people all noticed at once.

On the ramp, said down the shaft by a man who had been awake for two days:

ksostoklon.
The great built solid, at the limit.

xi. The measure. A salvage crew measures a rakt-rim out loud in front of everybody. That is the proof that the job was done.

rakt-rim tkakaten lirmet timetom.
rakt-rim | tka-kat-en | lir-met | ti-met-om
closed.body-MON(1)-ARCH | ten-and-one | cord-MON(1)-INS | HITH-measure-STAT
The closed body measures eleven cords. I watched them do it.

Eleven cords is about the length of a hand-cart. Six people had walked about inside it for nine days and two of them never left. The crew carried the whole of it up out of the ice in a crate on the back of a tender.

xii. Tarla went out eleven more times. The eleventh was in 1997, when she was fifteen. The file after that date holds one entry and it is a gallery number (§0.3).

At the end of the day, in the gallery, the scribe asked Maro what had become of the rope:

krem tilazom.
kre-m | ti-laz-om
rope-MON(1)-ACC | HITH-have-STAT
I still have the rope.

11.4 Earth

i. A showing. Spoken by an operator into an ongzes while the percipient imagined the room, the light and the weather from his own head (§0.4). It runs in fo- throughout, the direction of the thing that arrives unasked. It does not balance since this is not an arithmological operation.

xap xosai. mens laumpaps feltomka.
sait mensmet knausom. mens saitmet nes knausomka.
pen nakai. sait paln melai.

Be not afraid. We have come down from the star.
Thou art known to us. We are not known to thee.
Sleep. Thou shalt see again.

The figures are tall and pale and silent intended to frighten the percipient. Mediterranean features are easily apparent, but percipients tend to see their own preconceptions without any outside help.

ii. The instruction. What is said to the taken after a press-gang, in fot-lok, by a handler on the way in. It is a fot-lok rendering of the fifth akousma (§11.1 v). The tenth guild’s manuals call it the instruction.

sait falsaps nes melai. sait ame nes ontom.
sait it ontom. sait nain ontom.

You do not look back from the gate. You are not there.
You are here. You are now.

No preverbs, no converbs, no concord, three cases, four sentences where the original uses one (§3.1).

iii. What a congregation sings. To Earth, the Order sends down a serk: a ratio for several hundred nervous systems to resonate, in unison, at a fixed hour (§0.4). The ninth guild has for two centuries used, as the carrier speech, the oath of descent (§11.2 iv):

anθkamet nomkat ksostkam mneseptel lanandomka.

Its congregations sing it phonetically, from sheets, in halls in Bavaria and Buenos Aires and outside Peshawar, as ahn-tha-ka-MET nom-kat KOSS-ta-kam mne-SEP-tel la-NAN-dom-ka. They have variously been told it is Enochian, Hyperborean, the speech of the Ascended Masters, that of angels, that of Adam, Akashic, or some original language before Sanskrit. In reality, it’s a Laulai sentence swearing to defend the planet.

iv. A handler’s line. What a falzes says to a congregation’s inner circle at the moment of recruitment in Laulai:

saits mensos ontomka. mens saitsos nes ontomka.
You are ours. We are not yours.

They are taught it as a blessing. They repeat it back.

11.5 Gun-deck speech

Living speech, not carefully composed.

i. elmka! “all the engines,” and also, on the homophony of §9.1, “fear entire.” The standard oath of the lower decks. A wright says it when a mount shears.

ii. ksostkne “in the form of a ksost“. Bring called a contagion is an insult. ksost is class VII and a person is class III. That would be the plio of §6.3.

iii. imn “ash,” and “wine.” Said of somebody whose reach is going: he has had a drink.

iv. tas “empty.” Of a proof step: worth nothing. Of a person: no reach, never had any, will not be missed.

v. pen tilontai, jussive, “be bound, here.” Said to a company going out.

vi. mar fo? “did it come down on you?” (§5.2a). Asked of a child who has just come off a chain and is shaking.

11.6 A specimen of fot-lok

A work-chant off a kauzes boring in the eleventh gallery:

fots kauai. fots kauai. pal fosai.
fots xre. fots xre. tir tos.
fots kauai.

Slaves dig. Slaves dig. The rock breaks.
Slaves take. Slaves take. There is a chamber.
Slaves dig.

fots is a bare plural in -s, built out of the pronominal plural (§9.4 iv). There is no arithmological number. There is no concord and no preverb. xres and laz are bare stems doing the work of finite verbs, which §5 doesn’t allow.

The Order’s position is that this is all corrupt speech.

11.7 The ash

When an imn-anθ speaks, an amanuensis writes it down. If the insight is weak, the form uses: fo-, the involuntative, no ground (§5.10), no class prefix on the verb, and the concord going early (§5.3). None of them balance. They come to nine, nopkne nesrak, one short.

(i)

tsmizes θepok fontinom.
tsmizes | θep-ok | fo-ont-in-om
moon-MON(1)-ARCH | ship-OGD(8)-ARCH | DOWN-be-INVOL-STAT
The moon turns out to be a great built ship, and I did not go looking.
Balance: 1 + 8 = 9. nopkne nesrak.

(ii)

—sepmet brotdim fomelinom.
—sep-met | brot-di-m | fo-mel-in-om
UNK-HEP(7)-INS | mortal-DY(2)-ACC | DOWN-look-INVOL-STAT
The unknown, the one with no fellow, is looking at some mortal or other, and it came down on me.
Balance: 7 + 2 = 9. nopkne nesrak.

(iii)

serkekmet ksostrim fonandinom.
serk-ek-met | ksost-tri-m | fo-nand-in-om
serk-HEX(6)-INS | ksost-TRI(3)-ACC | DOWN-bind-INVOL-STAT
An interval in running balance binds three crooked ones, and I did not do it.
Balance: 6 + 3 = 9. nopkne nesrak.

The third of those was said in 1899 by a boy who had commanded four companies and could not by then dress himself. The sixth guild spent eleven years on it and formed with a construction that closes three ksost in series from one interval, the only thing in two centuries that has ever closed more than one. About one in nine of these revelations are effective. The scribes sit with all of them and write everything down. The ash-people sit near the shrines and are not looked at directly.

11.8 A tale: Sarndi

Laulai has a narrative genre and it is governed by a rule about evidence. A nenan is a tale, recited in a gallery. Every verb in it takes na-, outward, passed on, it reached me from another (§5.2). A tale in ti- would be testimony.

Sarndi, “Two Tones,” runs to a hundred and eleven lines in the sixth guild’s recension. It is about the eighth of the roll, 1961, the one that was not seen crossing the firmament and was found already inside it. It is attributed to an orn-anθ writing within a generation of the events. What follows is the closing:

sarndi nasesomka.
kosm-kotes ton nontom.
sen-mis nasesai. sen-mis nes namelai.
relka neltomka. tas natosomka.
sen-mismet teukt naparaktom.
sarndi naklosom.
ksostseplon nontom.
imn nasarnai.

Two tones were heard, they say.
It was inside the hold, they say.
A child lord hears it. A child lord does not see it.
The Blades came, they say. They found nothing, they say.
By the child lord the theorem was closed, they say.
The two tones stopped, they say.
It stood at the limit, they say.
The ash wanders, they say.

nontom is na- plus ontom, elided (§5.2). neltomka is na- plus eltomka.

In line eight, sarn is a noun, a wandering tone, a pitch that will not sit. The line conjugates it, which is unusual. The last thing the tale says is that the ash is doing what a tone does when it will not settle. (imn is also wine (§9.1).)

Sometimes these songs end with a formulaic utterance:

men tisesom.
I heard it. I was there.


Translation: আজি বিজন ঘরে

A moving song by Tagore.

আজি বিজন ঘরে নিশীথরাতে
Now if, to this lonely house, in the dead of night,

আসবে যদি শূন্য হাতে–
You should come in with empty hands–

আমি তাইতে কি ভয় মানি!
Will I take fright?

জানি জানি, বন্ধু, জানি–
I know, friend, I know–

তোমার আছে তো হাতখানি ॥
You still have your hand for me to hold.

চাওয়া-পাওয়ার পথে পথে দিন কেটেছে কোনোমতে,
My days have gone muddling down the road of buying and selling.

এখন সময় হল তোমার কাছে আপনাকে দিই আনি ॥
The time has come to offer myself to you.

আঁধার থাকুক দিকে দিকে আকাশ-অন্ধ-করা,
Let there be darkness on every side, blinding the sky

তোমার পরশ থাকুক আমার-হৃদয়-ভরা।
As long as your touch fills my heart.

জীবনদোলায় দুলে দুলে
Swaying, swaying in the cradle of life,

আপনারে ছিলেম ভুলে,
I had forgotten myself.

এখন জীবন মরণ দু দিক দিয়ে নেবে আমায় টানি ॥
Now life and death, from two sides, draw me back.

Translation: মোমের পুতুল মমীর দেশের মেয়ে নেচে যায়

মোমের পুতুল মমীর দেশের মেয়ে নেচে যায়।
A wax-doll girl in a land of mummies goes dancing by

বিহবল–চঞ্চল–পায়।।
On swooning, restless feet.

খর্জুর–বীথির ধারে
By a date palm avenue,

সাহারা মরুর পারে
Past Sahara’s dunes,

বাজায় ঘুমুর ঝুমুর ঝুমুর মধুর ঝঙ্কারে।
Her ankle bells go – jhumur jhumur – sweetly chiming by.

উড়িয়ে ওড়না ‘লু’ হাওয়ায়
Scarf fluttering in the desert loo,

পরী–নটিনী নেচে যায়
The fairy dancer sways by,

দুলে দুলে দূরে সুদূর।।
Swaying, swaying across distances.

সুর্মা–পরা আঁখি হানে আস্‌মানে.
Kohl-dark eyes call down the heavens,

জ্যোৎস্না আসে নীল আকাশে তার টানে।
drawing a full moon into the blue sky.

ঢেউ তুলে নীল দরিয়ায়
Raising waves across the blue deep,

দিল–দরদী নেচে যায়
The tender-hearted dances by,

দুলে দুলে দূরে সুদূর।।
Swaying, swaying across distances.

Translation: নতুনের গান

Nazrul’s marching song.

চল্‌ চল্‌ চল্‌
March, march, march!

ঊর্দ্ধ গগনে বাজে মাদল
In high heaven the war drum sounds

নিম্নে উতলা ধরণী-তল
Below, mother earth roils

অরুণ প্রাতের তরুণ দল
Youth brigade of crimson morn:

চল্‌ রে চল্‌ রে চল্‌
March on, march on, march on!

চল্‌ চল্‌ চল্‌।
March, march, march!

ঊষার দুয়ারে হানি আঘাত
Storming the gates of golden dawn

আমরা আনিব রাঙা প্রভাত
We shall usher in a crimson morn

আমরা টুটাব তিমির রাত
Breaking the might of ancient night

বাঁধার বিন্ধ্যা চল।
March past the mountain chains!

নব নবীনের গাহিয়া গান
Singing the song of the ever-young

সজীব করিব গোরস্থান
We will make the graveyard bloom

আমরা দানিব নতুন প্রাণ
We will gift new life

বাহুতে নবীন বল।
New strength to our arms.

চলরে নওজোয়ান
March on, warrior youth!

শোনরে পাতিয়া কান
Open your ears and hear:

মৃত্যু-তোরণ-দুয়ারে-দুয়ারে
From arch to arch, in the arcades of death

জীবনের আহ্বান
New life calls!

ভাঙ্গরে ভাঙ্গ আগল
Smash bolt and bar!

চল্‌ রে চল্‌ রে চল্‌
March on, march on, march on!

চল্‌ চল্‌ চল্‌।
March, march, march!

ঊর্ধ্ব আদেশ হানিছে বাজ
Thunderbolt hurls its decree from on high

শহীদী-ঈদের সেনারা সাজ
From the martyrs’ feast, comrades, to arms!

দিকে দিকে চলে কুচ-কাওয়াজ
Military parades on every side

খোল রে নিদ-মহল!
Pry open the palace of sleep!

কবে সে খেয়ালী বাদশাহী
That whimsical ancient empire…

সেই সে অতীতে আজো চাহি
You who look to the past,

যাস মুসাফির গান গাহি
Sing songs of beggars,

ফেলিস অশ্রুজল
Spill your teardrops:

যাক রে তখত-তাউস
Down with the Peacock Throne!

জাগ রে জাগ বেহুঁশ।
Awaken, oh sleeper!

ডুবিল রে দেখ কত পারস্য
See how many Persias drowned!

কত রোম গ্রিক রুশ
Many a Rome, Greece, Russia

জাগিল তারা সকল
Each one of them rewoke

জেগে ওঠ হীনবল!
The powerless reawaken!

আমরা গড়িব নতুন করিয়া
We will build a new design!

ধুলায় তাজমহল!
From the dust, a Taj Mahal!

চল্‌ চল্‌ চল্।।
March, march, march!

Character Simulation Part 1: Prediction

The Python library soma.narrative can be used to describe a fictional person in terms of feelings, beliefs, and relationships, run them forward in time, and then ask the kinds of questions a novelist asks: when would this person break? what is she really feeling under the composure? what single thing, changed, would have saved this marriage? The library answers those questions with checkable predictions.

You do not need to install anything. Everything here runs in your browser.


Part 0: Running code as you read

Open https://thoriumrobot.github.io/soma/ in any modern browser. It loads a Python interpreter (via Pyodide, ~10 MB the first time, cached after) and runs the SOMA library. This runs the same code as the command line.

At the top of the page is a mode switch with two buttons:

  • SOMA: the base language with bodies, loops, stimuli.
  • Library: the high-level soma.narrative API, written as Python. This is the mode this tutorial uses.

Click Library. You will see:

  • a left rail (or top left hamburger menu on a phone) of ready-to-run examples (the same ones this tutorial walks through),
  • a code editor in the middle,
  • an output pane on the right,
  • a ▶ Run button (or press Ctrl/⌘ + Enter).

To follow along, click Library, paste any code block from this tutorial into the editor, and press Run. The output pane will show exactly the output printed in this tutorial. Click New to start from a blank Python file, or pick an example from the rail to load it.

Two things worth knowing:

  1. Both directions work on one page. Library code can run hand-written SOMA text through run_source(...), and any character you build with the library can print the SOMA it compiles to with story.source(). You can write SOMA, drive it from Python, read the SOMA back in the same editor.
  2. Errors are friendly. If your code raises, you get a red banner with just your own traceback (no interpreter internals), and partial output up to the error is preserved.

Everything below is runnable code with output.


Part 1: The basic idea

A SOMA character is built around a loop: a small predictive process that holds an expectation, senses the world, computes the gap between them (prediction error), and either updates its belief or acts. That one loop is enough to model a surprising amount of inner life. The high-level library lets you write it in the vocabulary of a person rather than a control system.

Here is the smallest useful program. A character named Wen sees a face she likes.

# The high-level library: describe a person in feelings and beliefs, and it
# compiles to SOMA and runs. Press Run.
from soma.narrative import Story, tender
story = Story("hello", span="8s", step="1s", about="a first delight")
c = story.character("Wen", temperament=tender)
c.senses("her_face")
c.appraises("her_face", feeling="delight", when="her_face > 3")
story.at("2s", c.hears("her_face", 7))
print(story.run(width=76))

Output:

─────────────────────────────── SOMA · hello ───────────────────────────────
╭─ BODY · channels over time ──────────────────────────────────────────────╮
│ extero her_face ▁▁███████ 0→7
╰──────────────────────────────────────────────────────────────────────────╯
╭─ NARRATOR vs GROUND TRUTH ───────────────────────────────────────────────╮
│ THE STORY SHE TELLS THE BODY'S RECORD
│ ───────────────────────────────────────────────────────────────────────
│ │ 2.0s (7x) feels Qualia<delight>
╰──────────────────────────────────────────────────────────────────────────╯
╭─ WINNOW-S · storyful moments, ranked ────────────────────────────────────╮
│ ████████·· delight in error
│ 7 times across 6.0s the prediction failed and the failure felt like
│ delight -- being surprised, and glad of it.
╰──────────────────────────────────────────────────────────────────────────╯
╭─ CHRONICLE · trace (17 of 17 events) ────────────────────────────────────╮
│ 0.0s settle appraising_h sense=0.0 belief=0.0 error=0.0 pi_s=0.88 …
│ 2.0s stimulus her_face value=7.0
│ 2.0s settle appraising_h sense=7.0 belief=0.0 error=6.16 pi_s=0.88…
│ 2.0s emit appraising_h quale=Qualia<delight>
│ …
╰──────────────────────────────────────────────────────────────────────────╯

How the code maps to the output, line by line:

  • Story("hello", span="8s", step="1s") sets up an 8-second simulation ticking once per second. Time in SOMA is literal; every row of the trace is one tick.
  • story.character("Wen", temperament=tender) creates a person. A temperament is a bundle of defaults for how strongly she trusts her senses versus her expectations. tender means open, responsive, easily moved.
  • c.senses("her_face") gives Wen an exteroceptive channel, something she can perceive from the outside world. You can see it in the BODY panel: her_face starts at 0 and jumps to 7 (the ▁▁███████ sparkline).
  • c.appraises("her_face", feeling="delight", when="her_face > 3") is the loop: when the face is present (> 3), feel delight. This is what fires seven times in the trace (emit … quale=Qualia<delight>).
  • story.at("2s", c.hears("her_face", 7)) is the event. At 2 seconds, the face appears at strength 7. That is the stimulus her_face value=7.0 row.

The WINNOW-S panel is the first hint of what makes this a character simulation and not a state machine. It automatically finds the story pattern. The delight is delight in error. Wen predicted nothing (belief=0.0), the face arrived (sense=7.0), and the large prediction error (error=6.16) is itself what feels like delight. That is a theory of a particular kind of joy, the pleasure of being happily surprised.

The NARRATOR vs GROUND TRUTH panel is the other key idea. SOMA always keeps two records: what the character would say is happening, and what her body actually did. When those diverge, you have the material of fiction. (Here they agree. Later they will not.)


Part 2: Three concepts

2.1 Everything is ordinary SOMA underneath

The library is a convenience. Whatever you build compiles to a language called SOMA you can read, edit, and run directly. SOMA is designed for bodily simulation. Print it with .source():

# Anything you build with the library is ordinary SOMA underneath. Print
# .source() to see exactly what it compiled to -- then copy it into SOMA mode.
from soma.narrative import Story, stoic
story = Story("kept", span="14s", step="1s", about="a defended belief")
ink = story.character("Ink", temperament=stoic)
ink.senses("kept_for_nothing")
ink.believes("only_needed",
claim="the only reason anyone is kept is that they are needed",
disconfirmed_by="kept_for_nothing", breakable=True)
for t in range(2, 12):
story.at(f"{t}s", ink.hears("kept_for_nothing", 8))
print(story.source())

Output:

// kept -- generated by soma.narrative
// Every construct below was produced from a high-level narrative description;
// it is ordinary SOMA and can be edited, run, sifted, prosed, and perturbed.
@consent("a defended belief")
sim { duration: 14s dt: 1s }
body Ink_body @cardiac {
extero kept_for_nothing : Signal baseline 0
intero only_needed_seen : Signal baseline 0
}
loop the_lie_only_needed @cardiac {
prior: predict(2)
sense: kept_for_nothing
precision: 0.35
conviction: 0.85
learn: 0.03
overwhelm: auto
act {
update -> the_truth_about_only_needed
emit feel(worthlessness) when kept_for_nothing < 3
move ! set(only_needed_seen, 9) when perceiving
}
}
stimulus kept_for_nothing { at 2s: 8 at 3s: 8 at 4s: 8 ... }

Notice that believes(..., breakable=True) compiled to a loop with high conviction (0.85) and low precision (0.35), a mind that trusts its belief far more than the evidence, plus a slow learn rate that hardens the belief every time it is confirmed, and an overwhelm: auto clause that lets the belief eventually break if the disconfirming evidence accumulates past a threshold. That whole structure came from one English-like line. This is the value of the high-level layer. It encodes the mechanism of a defended belief so you can think in characters, not dials.

2.2 You can write SOMA by hand too

The bridge goes the other way. Write SOMA source as a string and run it through run_source:

# You can also write SOMA source by hand and run it through the library on the
# same page -- both directions work.
from soma import run_source
soma_src = '''
sim { duration: 6s dt: 1s }
body B @cardiac { intero heart : BPM baseline 70 }
stimulus heart { at 2s: 120 }
loop noticing @cardiac {
prior: predict(70)
sense: heart
precision: 0.9
conviction: 0.3
act { emit feel(surprise) }
}
'''
r = run_source(soma_src, title="handwritten")
for e in r.chronicle:
if e.kind == "emit":
print(f"{e.t:>4}s felt {e.detail.get('quale')}")

Output:

 2.0s  felt Qualia<surprise>
 3.0s  felt Qualia<surprise>
 4.0s  felt Qualia<surprise>
 5.0s  felt Qualia<surprise>
 6.0s  felt Qualia<surprise>

The heart is predicted at 70, jumps to 120 at 2s, and the loop, trusting its senses (precision: 0.9) over its expectation (conviction: 0.3), registers surprise every tick the mismatch persists. The run_source result is a Result object whose .chronicle is the full event log; you can read it in Python however you like.

2.3 The Chronicle is the ground truth

Every run produces a Chronicle, a timestamped list of everything that happened: settle (the loop resolved a tick), emit (a feeling fired), revelation (a belief broke), narrate (the narrator spoke), and more. Every predictive tool in this tutorial works by reading the Chronicle, running the character forward and measuring what the body actually did. Predictions are never assertions about a real person. They are measurements of what this model does.


Part 3: The predictive simulations

Everything so far was descriptive: build a character, watch them run. The rest of the tutorial is about prediction: staking a claim about what a character would do in a situation the author never scripted, and checking it against the run. Each simulation below is a documented psychological model rebuilt in SOMA. Each makes a falsifiable claim.

We begin with a pure function (an emotion from four numbers, no simulation at all), then introduce the one method every later prediction relies on, preregistration, and finally turn to the simulations proper. We end with multi-episode protocols that classify a character blind from behavior.

3.1 Appraisal: predicting the feeling from the situation

The idea. Appraisal theory (Scherer, Smith & Ellsworth, the OCC model) holds that an emotion is not caused by an event but by a person’s reading of it along a few dimensions: was this good or bad for what I wanted (congruence)? who caused it (agency)? is it settled (certainty)? can anything be done (coping)? Give those dimensions and the specific discrete emotion follows. Because the reading, not the event, produces the feeling, the same event appraised two ways yields two emotions: the reason two people respond differently to one piece of news.

The library implements the forward map (appraisal → emotion) and, more strongly, its inverse (emotion → the appraisal that must have produced it), plus a check that the two are mutually consistent for all 14 emotions.

# Appraisal theory: give only the appraisal (was it bad, who caused it, how
# certain, could anything be done) and the library PREDICTS the discrete
# emotion and its action tendency -- the author never names it.
from soma.narrative import predict_feeling, check_identifiability, explain_emotion
for (cong, agency, coping, note) in [
(-0.8, "other", 0.8, "wronged, with power"),
(-0.8, "other", 0.2, "wronged, powerless"),
(-0.9, "circumstance", 0.1, "a certain, uncontrollable loss"),
]:
pf = predict_feeling(congruence=cong, agency=agency, certainty=0.9, coping=coping)
print(f"{note:32s} -> {pf.quale} ({pf.tendency.split('--')[0].strip()})")
print()
v = check_identifiability()
print(f"construct validity: all {v['n']} emotions recover ({v['recovered']})")
print()
print(explain_emotion("grief"))

Output:

wronged, with power -> anger (move against)
wronged, powerless -> resentment (withhold)
a certain, uncontrollable loss -> grief (withdraw and search)
construct validity: all 14 emotions recover (True)
grief: they construed that bad for what they wanted, no one caused it, it is settled, nothing can be done, and so are moved to withdraw and search; deactivate, and reach for what is gone

What the output means. The first three lines are the whole of appraisal theory in miniature. Notice the first two rows: the same bad event, the same other-blame, the same certainty. Only the sense of power differs. With power, the reading produces anger and the impulse to move against. Without power, the identical situation produces resentment and the impulse to withhold. Anger with nowhere to go. That single dimension is the difference between confrontation and a grudge.

construct validity: all 14 emotions recover (True) is prediction. A forward map from appraisal to emotion is only a genuine prediction if it is identifiable: you must be able to run it backwards and recover the same emotion. The library checks all 14 emotions round-trip forward→inverse→forward, and every one lands on itself.

The last line shows the inverse in action. explain_emotion("grief") reads a feeling back to the construal behind it: “no one caused it, it is settled, nothing can be done”. Plus the action tendency (Frijda’s term for what an emotion moves you to do). This is how an observer reasons from behavior to inner state, which is the reader’s whole task in a novel.

The insight. To make a character feel resentment rather than anger, you do not write “she felt resentment”; you arrange for her to be wronged without recourse, and the feeling follows. The model makes the causal structure of emotion explicit, so you can compose feelings from situations.


3.2 Preregistration

The idea. Preregistration is a way to make predictions and have them be confirmed or disconfirmed by the run: you open a preregistration, stake specific forecasts, and check them against the run. This is where the ✓ CONFIRMED and ✗ FALSIFIED verdicts you will see throughout the rest of this tutorial come from.

# Preregistration: stake claims BEFORE the run, check them after. Adding a claim
# after checking is a postdiction and is refused -- the line between prediction
# and hindsight, enforced.
from soma.narrative import Story, anxious
s = Story("acute", span="8s", step="0.5s", about="acute distress")
n = s.character("Nadia", temperament=anxious)
n.senses("ear")
n.appraises("ear", as_threat=True, drives="heart", to=118, when="ear > 3", fades_to=70)
n.feels("dread", from_body="heart")
n.narrates(downplaying={"dread": "I'm fine."})
s.at("2s", n.hears("ear", 9))
audit = s.preregister()
audit.expect_feeling("Nadia", "dread", by="4s")
audit.expect_gap("Nadia", at_least=0.4) # says calm over a racing heart
audit.expect_peak("Nadia", "heart", at_least=110)
audit.expect_feeling("Nadia", "joy") # deliberately wrong
print(audit.check().render())

Output:

PREREGISTERED FORECASTS — staked before the run, checked after
✓ CONFIRMED: Nadia feels dread by 4s
first at 2.0s (5 in all)
✓ CONFIRMED: Nadia narrates over a gap (>= 0.4)
gap 0.55 at 2.0s
✓ CONFIRMED: Nadia's heart peaks >= 110
peak 118.0
✗ FALSIFIED: Nadia feels joy
no such feeling in the Chronicle
3 confirmed, 1 falsified.
(Verdicts are claims about this model of the character, never about a real person.)

What the code does. Nadia hears something alarming (ear at strength 9). A threat appraisal drives her heart up to 118, which makes her feel dread. Her narrator is set to downplay that dread with “I’m fine.” Four forecasts are staked against this setup before it runs: that she feels dread by 4s, that her narrator’s account splits from her body by a measurable gap, that her heart peaks above 110, and, deliberately, that she feels joy.

What the output means. Three forecasts hold and one fails, exactly as it should. She feels dread early. Her narrator “narrates over a gap” of 0.55. It says “I’m fine” while the heart record shows real distress. Her heart peaks at 118. And the joy forecast is marked ✗ FALSIFIED.

The expect_gap forecast is worth watching for, because the same felt-but-disowned structure recurs across the simulations below. Most sharply in the avoidant attachment style and the avoidant child of the Strange Situation. Here it appears in its simplest form, preregistered and confirmed.


3.3 Attachment: forecasting how someone meets a separation

The idea. Attachment theory (Bowlby, Ainsworth, Main) says that early experience installs a style: secure, anxious, avoidant, or disorganized, that governs how a person responds to the threat of losing a bond. The library lets you install a style and then forecasts how the character will meet a separation the author hasn’t written yet. Whether they protest, whether their body spikes, whether they settle on reunion, whether they show approach and avoidance at once. Each forecast is preregistered from the style table. Staked before the run, in the sense we just built and then checked.

# Install an attachment style; the library stakes a style-specific forecast
# BEFORE the run, then checks it. Here are the two most telling styles in full.
from soma.narrative import Story, anxious, stoic
for style, temp in [("avoidant", stoic), ("anxious", anxious)]:
s = Story(f"sep_{style}", span="12s", step="1s", about="separation distress")
c = s.character("Mara", temperament=temp)
c.attaches(style, to="Jonah")
print(s.predict_separation("Mara").render())
print()

Output:

Separation probe — Mara (avoidant); forecast staked by the style table before the run:
✓ CONFIRMED: a visible protest fires on separation — forecast False, observed False
✓ CONFIRMED: the narrator reports calm over a real somatic spike (confabulation gap) — forecast True, observed True
✓ CONFIRMED: separation genuinely raises the body's arousal — forecast True, observed True
✓ CONFIRMED: approach and avoidance both fire on the figure — forecast False, observed False
(narrated calm over a real somatic spike -- repressive coping, measurable as a confabulation gap riding on an elevated heart record)
Separation probe — Mara (anxious); forecast staked by the style table before the run:
✓ CONFIRMED: a visible protest fires on separation — forecast True, observed True
✓ CONFIRMED: the narrator reports calm over a real somatic spike (confabulation gap) — forecast False, observed False
✓ CONFIRMED: separation genuinely raises the body's arousal — forecast True, observed True
✓ CONFIRMED: arousal settles substantially after reunion — forecast False, observed False
✓ CONFIRMED: approach and avoidance both fire on the figure — forecast False, observed False
(loud protest, and arousal that outlasts the reunion -- the alarm's gain is kept up)

What the output means. Each report stakes four or five style-specific claims and then checks them against a separation the author never scripted. Read the two side by side and the styles come apart cleanly:

  • The avoidant Mara shows no visible protest and no approach-avoidance conflict. But her body’s arousal rises anyway, and her narrator reports calm over that spike. The forecast predicted exactly this pattern: outward composure, inward alarm, a confabulation gap between the two. That is the avoidant signature: a racing heart under a calm face.
  • The anxious Mara shows the opposite: a loud protest, real arousal, and the diagnostic line: arousal that does not settle after the reunion. The alarm stays on. Where the avoidant child disowns the distress, the anxious child cannot put it down.

The two styles not shown, secure and disorganized, confirm the same way; the secure child protests and then settles, the disorganized child shows approach and avoidance firing at once.

The insight. Character is a way of meeting loss. The same departure lands differently on four people, and the difference is legible in the body even when the words conceal it. Attachment gives you a principled way to keep a character’s response to separation consistent across scenes.


3.4 The tipping point and early warning

The idea. A defended belief (“I did not matter”) can absorb disconfirming evidence for a long time and then break all at once. Two questions a novelist asks: how much pressure does it take to break it (the tipping point), and can you see the break coming before it happens (early warning)? The second is the deeper claim. It comes from dynamical-systems theory: near a tipping point, a system slows down and its fluctuations grow, so an approaching break leaves a statistical signature before it occurs.

# Two positive predictions about a belief that slowly gives way. First the
# THRESHOLD -- the least pressure that breaks it; then EARLY WARNING -- reading
# only the pre-transition dynamics to forecast the break before it happens.
from soma.narrative import Story, tender
def build():
s = Story("overwhelmed", span="26s", step="1s", about="slowly overwhelmed")
c = s.character("Vane", temperament=tender)
c.senses("the_evidence")
c.believes("i_did_not_matter", claim="I did not matter",
disconfirmed_by="the_evidence", breakable=True, conviction=0.9)
c.learns(0.03)
# the evidence rises gradually, so the break builds rather than slamming in
for t in range(2, 24):
s.at(f"{t}s", c.hears("the_evidence", round(min(9, 2 + 0.3 * (t - 2)), 1)))
return s
print("tipping point:", build().tipping_point("Vane", "the_evidence"))
print()
print(build().predict_break_onset("Vane", window=5).render())

Output:

tipping point: {'who': 'Vane', 'channel': 'the_evidence', 'breaks_at': 3.0, 'in_range': (0.0, 9.0)}
EARLY WARNING — Vane, read only before any revelation:
signal: overwhelm-debt (the destabilizing variable)
accumulator at 18.9 of bound 20.1, slope +2.10/s
fluctuation variance trend: -0.39 (flat/falling)
fluctuation autocorr. trend: +0.36 (rising)
-> FORECAST: break coming (strong signal) — crossing predicted at ≈14s
✓ the full run: broke at 14s

What the output means. The tipping point result says that if the evidence were held at a constant level, the belief would break once that level reached 3.0 on the 0–9 scale, a threshold found by sweeping the input and watching for the revelation. This is “how much does it take”.

The early warning panel is the more interesting one. It reads only the data from before any break has happened. The accumulating “overwhelm-debt” (the suppressed disconfirming surprise), its slope, and two early-warning statistics borrowed from ecology and climate science. Whether the fluctuations’ variance and autocorrelation are rising, the fingerprints of what dynamical-systems theorists call “critical slowing down.” From the approach alone it forecasts “break coming … crossing predicted at ≈14s,” and the check line confirms the full run did break at 14s. Nothing about the break itself was used to predict it.

The insight. People come apart on a schedule you can read in advance if you know where to look. The break feels sudden from outside. One more ordinary day, and then collapse. But the system was destabilizing measurably the whole time. This is the structure of every “she seemed fine until she wasn’t” story. The debt accumulates silently, the fluctuations grow, and the moment of breaking is the last step in a long process.


3.5 Conditioning

The idea. The most quantitatively validated model in behavioral neuroscience is the reward prediction error (Rescorla–Wagner; the temporal-difference account of Sutton & Barto; Schultz’s finding that dopamine neurons fire exactly this signal). Learning is driven by the gap between reward received and reward expected. SOMA’s loop already computes a prediction error, so conditioning falls out of it naturally. The library tests a single learning trace cannot pass: spontaneous recovery. After a conditioned response is extinguished and the animal rests, the response comes back on its own, proving extinction was new learning layered over an intact memory, not erasure.

# The reward prediction error, run as learning. The signature prediction plain
# Rescorla-Wagner cannot make: after extinction and a REST, the response returns.
from soma.narrative import Story, trusting
s = Story("pavlov", span="10s", step="1s", about="conditioning")
rat = s.character("Bell", temperament=trusting)
s.conditions(rat, cs="tone", us="food")
rep = s.predict_conditioning("Bell", acquire=10, extinguish=12, rest=10, reacquire=6)
print(rep.render())

Output:

CONDITIONING: Bell: tone → food (value = acquired + context trace)
acquisition ▁▁▅▇██████ [0.0 → 7.5]
extinction ██▃▂▁▁▁▁▁▁▁▁ [7.5 → 0.5]
rest ▂▃▄▅▆▆▇▇▇█ [1.7 → 6.5]
reacquisition ▁▁▅▇██ [0.5 → 7.5]
peak RPE (unpredicted reward): +7.20; once predicted it falls toward 0 — dopamine's signature
✓ CONFIRMED: acquisition: value climbs to near the reward — peaked at 7.5
✓ CONFIRMED: the RPE shrinks as reward becomes predicted (dopamine's signature) — 3.60 → 0.46
✓ CONFIRMED: extinction: the conditioned value falls — 7.5 → 0.5
✓ CONFIRMED: SPONTANEOUS RECOVERY: after rest the value returns (extinction was new learning, not erasure) — 0.5 → 6.5 after rest
✓ CONFIRMED: savings: relearning starts from the intact trace and is no slower — 5 vs 4 beats; starts 0.5 vs 0.0

What the output means. Read the four sparklines as a story across the animal’s training:

  • acquisition ▁▁▅▇██████: the tone comes to predict food; the learned value climbs from 0 to 7.5 and plateaus.
  • extinction ██▃▂▁▁▁▁▁▁: food stops; the response falls back to ~0.5.
  • rest ▂▃▄▅▆▆▇▇▇█: nothing happens at all, and yet the value climbs back to 6.5. This is spontaneous recovery, the result the whole example is built around.
  • reacquisition ▁▁▅▇██: retraining, which starts from a higher floor.

The peak RPE (unpredicted reward): +7.20 … falls toward 0 line is dopamine’s signature exactly. The prediction error is large when the reward is a surprise and shrinks to nothing once the reward is fully predicted, because a predicted reward stops being news. Each ✓ CONFIRMED is a staked prediction the run bore out. The recovery is emphasized because a naive single-value model predicts it should not happen. If extinction simply pushed the value back down, rest could not bring it back. The library instead models two traces, a slow “acquired” memory and a fast “context” correction, so the recovery is the slow trace re-emerging once the fast one decays.

The insight. You do not unlearn a love or a fear; you learn a second thing on top of it, and the first is still there underneath. The old response returns after a quiet interval, whether as the ex-smoker’s craving on a stressful day or the old grief that resurfaces at an anniversary. The person has not regressed. Extinction never erased anything. “Getting over it” is a fragile new layer laid over an intact old one.


3.6 Learned helplessness

The idea. Seligman and Maier found that exposure to uncontrollable bad events (uncontrollable ones) produces a passive, helpless state that transfers to new situations. Abramson, Seligman & Teasdale’s reformulation added the variable that decides whether the helplessness transfers, the person’s explanatory style. Someone who explains failure globally (“I ruin everything”) carries the deficit into unrelated situations. Someone who explains it specifically (“I couldn’t do that one thing”) does not. This is the classic triadic design. Its sharpest prediction is that transfer asymmetry.

# Reformulated learned helplessness: the deficit transfers to an unrelated task
# only for a GLOBAL explanatory style, not a specific one. The full triadic
# design, checked.
from soma.narrative import Story, trusting, hollowed, triadic_design
def build(style):
s = Story(f"hlp_{style}", span="10s", step="1s", about="learned helplessness")
subj = s.character("Dog", temperament=hollowed if style == "global" else trusting)
s.learns_control(subj, style=style)
return s, subj
td = triadic_design(build)
print("style pretreatment novel task outcome")
print("-" * 56)
for (style, pre, sim), deficit in sorted(td["rows"].items()):
simstr = "similar" if sim else "dissimilar"
print(f"{style:<9s} {pre:<15s} {simstr:<11s} "
f"{'DEFICIT' if deficit else 'copes'}")
print(f"\ntransfer asymmetry holds: {td['transfer_signature']}")

Output:

style pretreatment novel task outcome
--------------------------------------------------------
global controllable dissimilar copes
global controllable similar copes
global none dissimilar copes
global none similar copes
global uncontrollable dissimilar DEFICIT
global uncontrollable similar DEFICIT
specific controllable dissimilar copes
specific controllable similar copes
specific none dissimilar copes
specific none similar copes
specific uncontrollable dissimilar copes
specific uncontrollable similar DEFICIT
transfer asymmetry holds: True

What the output means. The table is the full 2×3×2 design: two explanatory styles × three pretreatments (controllable / uncontrollable / none) × two test situations (similar / dissimilar to the original). Read the DEFICIT rows and the whole theory is visible:

  • A deficit appears only after uncontrollable pretreatment. Controllable adversity and no adversity both leave the subject coping. It is not hardship that breaks you, it is hardship you cannot affect.
  • For the global style, the uncontrollable deficit shows up in both the similar and the dissimilar novel task. It generalizes everywhere.
  • For the specific style, the uncontrollable deficit shows up only in the similar task. It stays contained.

transfer asymmetry holds: True confirms the signature contrast (global transfers to a dissimilar task; specific does not). In the model this comes from a single design choice: the scope of the learned control-belief. A global learner keeps one belief about control that follows them everywhere. A specific learner keeps a separate belief per situation, so a genuinely new situation starts fresh.

The insight. Two people suffer the same defeat and walk away with different futures. The divide is not the event but the sentence each says about it. “This always happens to me” and “that particular thing went wrong” are different characters, and the difference determines whether the wound spreads or stays local.


3.7 Drift-diffusion decisions

The idea. Every simulation so far predicts what a character feels or becomes. This one predicts how long a decision takes and how often it errs. The drift-diffusion model (Ratcliff; Gold & Shadlen) is the dominant account of speeded two-choice decisions. It treats a choice as noisy evidence accumulating toward one of two boundaries. From four interpretable parameters, it predicts reaction-time distributions and error rates.

# How long a choice takes, and how often it is wrong. The drift-diffusion model:
# four decision temperaments, then the speed-accuracy tradeoff from one dial.
from soma.narrative import Story, trusting, DECISION_STYLES
s = Story("court", span="1s", step="1s", about="a verdict")
j = s.character("Juror", temperament=trusting)
print("juror style accuracy RT correct RT error skew")
for style in DECISION_STYLES:
s.decides(j, style=style)
r = s.predict_decision("Juror", trials=3000, seed=1)
print(f"{style:<12s} {r.accuracy:>6.0%} {r.mean_rt:>6.2f}s "
f"{r.mean_rt_error:>6.2f}s {r.skew:+.2f}")
print()
s.decides(j, drift=0.13, boundary=1.0)
print(s.speed_accuracy("Juror", boundaries=[0.6, 1.0, 1.5, 2.0],
trials=3000, seed=2).render())

Output:

juror style accuracy RT correct RT error skew
impulsive 68% 0.92s 0.89s +2.32
deliberate 85% 3.37s 3.22s +0.70
keen 92% 1.76s 1.77s +1.62
muddled 63% 2.32s 2.24s +1.29
prejudiced 86% 1.52s 2.65s +1.92
SPEED-ACCURACY TRADEOFF — Juror, boundary swept (drift held fixed):
boundary accuracy mean RT
0.60 67% 1.03s
1.00 75% 2.25s
1.50 84% 3.49s
2.00 91% 4.30s
✓ CONFIRMED: wider boundary raises accuracy (more evidence, fewer errors) — ['67%', '75%', '84%', '91%']
✓ CONFIRMED: wider boundary lengthens RT (more evidence takes longer) — ['1.03', '2.25', '3.49', '4.30']

What the output means. Each row is a decision temperament built from the DDM’s parameters, and each makes a distinct claim:

  • impulsive: fast (0.92s) and error-prone (68%). A narrow boundary, commits on little evidence.
  • deliberate: slow (3.37s) and accurate (85%). A wide boundary, waits for more evidence. Same evidence quality as impulsive. Only the caution differs.
  • keen: fast and accurate (1.76s, 92%), a high drift rate. This juror sees more per unit time.
  • muddled: slow and inaccurate. A low drift rate, poor evidence.
  • prejudiced: Correct verdicts come fast (1.52s) but errors come slow (2.65s). That asymmetry is the fingerprint of a starting bias. A juror leaning toward one verdict before the evidence, so reaching the wrong one means climbing upstream the whole way. A symmetric model cannot produce it.

Every skew is positive: reaction-time distributions have a long right tail, the DDM’s signature.

The second panel traces the speed-accuracy tradeoff by moving one dial, the decision boundary, while holding evidence quality fixed. Accuracy climbs (67%→91%) and time lengthens (1.03s→4.30s) together monotonically. This dissociates two things ordinary language conflates: being careful (a wide boundary) is not the same as being smart (a high drift). The same juror, instructed to hurry or to be sure, walks this curve.

The insight. The juror who leans “guilty” before the evidence gives herself away in how long her acquittals take against her convictions. Meanwhile, hurrying does not lower accuracy evenly. It discards the hard cases, the ones that most needed the time.


3.8 The Strange Situation

The idea. Ainsworth’s Strange Situation is the most consequential standardized experiment in developmental psychology. A one-year-old goes through scripted episodes: play, a stranger’s entrance, two separations from the caregiver, two reunions. A trained coder reads the child’s attachment classification not from anything the child says but from four behaviors in the two reunion episodes: proximity-seeking, contact-maintaining, avoidance, resistance. The library runs the whole protocol from the behavior stream alone, never seeing which style was installed. The blindness makes the model’s central claim testable as parameter recovery: install a style, run the protocol, classify blind, and the classification must recover the installed style for all four.

# Ainsworth's protocol, run whole: the coder reads only the behavior stream and
# must recover the installed style. Construct validity as parameter recovery.
from soma.narrative import Story, trusting, anxious, stoic, guarded
from soma.narrative import strange_situation, validate_instrument
TEMPS = {"secure": trusting, "anxious": anxious,
"avoidant": stoic, "disorganized": guarded}
def build(style):
s = Story(f"ss_{style}", span="24s", step="1s", about="separation distress")
child = s.character("Noa", temperament=TEMPS[style])
child.attaches(style, to="mother")
return s, child
# show one coded tape in full:
s, c = build("avoidant")
print(strange_situation(s, c).render())
print()
# then the blind recovery of all four:
r = validate_instrument(build)
for style in TEMPS:
print(f" installed {style:<13s} -> classified {r[style]}")
print(f"\ninstrument valid: {r['recovered']}")

Output:

STRANGE SITUATION — Noa, coded from the behavior stream alone:
first_reunion seek 1.7 maintain 1.7 avoid 6.3 resist 1.0
second_reunion seek 1.7 maintain 1.7 avoid 6.3 resist 1.0
disorganization index: absent | physiological arousal over displayed calm: PRESENT | settles by the end: yes
-> CLASSIFICATION: AVOIDANT
installed secure -> classified secure
installed anxious -> classified anxious
installed avoidant -> classified avoidant
installed disorganized -> classified disorganized
instrument valid: True

What the output means. The top block is one coded tape. The four numbers per reunion are Ainsworth’s scales, scored 1–7 from the behavior the run produced. For this avoidant child: low seeking (1.7), low maintaining (1.7), high avoidance (6.3), low resistance (1.0). The child does not approach the mother on reunion. The diagnostic line reports the avoidant signature: “physiological arousal over displayed calm: PRESENT”. The body spiked during the separations even though the reunion behavior is cool and distant. The coder, reading only this, writes AVOIDANT. That is the style that was installed.

The bottom block is the validity test. All four installed styles are recovered from behavior alone. instrument valid: True is the claim. The model’s types are recoverable from the behavior the model generates.

The avoidant child is the one to dwell on. Its outward behavior reads as independence: “I don’t need you.” But the physiological record shows the separation was as distressing for this child as for any other. The difference is that the avoidant child has learned to not show it, and even the narrator’s account reports calm. The distress is real and disowned at once.

The insight. Apparent independence can be a performance laid over an unmet need, and the body keeps an account even when the face and the words do not.


3.9 The Gottman marriage model

The idea. Gottman and Murray’s Mathematics of Marriage is a famous predictive character simulation. From parameters fitted to a few minutes of one conversation, they predicted which newlyweds would divorce with ~94% accuracy. The model turns on a handful of measurable quantities: the ratio of positive to negative interaction, negative-affect reciprocity (does one partner’s hostility trigger the other’s?), and whether repair attempts land. It sorts couples into stable types (validating, volatile, conflict-avoiding) and unstable ones (hostile, hostile-detached). The library rebuilds this and reproduces the thin-slice forecast, calling the outcome from the first quarter of one conversation.

# The mathematics of marriage: five couple types, one contentious conversation,
# and the famous thin-slice forecast -- the ending called from the first quarter.
from soma.narrative import Story, trusting, tender, COUPLE_TYPES, marry, gottman_assess
for tname in COUPLE_TYPES:
s = Story(f"m_{tname}", span="20s", step="1s")
a = s.character("Ash", temperament=trusting)
b = s.character("Bee", temperament=tender)
marry(s, a, b, tname)
rep = gottman_assess(s)
ok = "OK " if rep.confirmed else "!! "
print(f"{ok}{tname:>16s}: ratio {rep.ratio:6.2f}:1 "
f"reciprocity {rep.reciprocity:4.0%} thin-slice: {rep.thin_forecast}")

Output:

OK validating: ratio 14.00:1 reciprocity 0% thin-slice: holds
OK volatile: ratio 14.00:1 reciprocity 0% thin-slice: holds
OK avoider: ratio 0.00:1 reciprocity 0% thin-slice: holds
OK hostile: ratio 0.00:1 reciprocity 96% thin-slice: falls
OK hostile_detached: ratio 0.00:1 reciprocity 96% thin-slice: falls

What the output means. Each row is a couple type put through one contentious conversation: a grievance is raised, followed by the marriage. Three numbers tell the story:

  • ratio: positive to negative interactions. The stable types (validating, volatile) run at 14:1. The unstable types (hostile, hostile-detached) at 0:1. Gottman’s famous “magic ratio” is 5:1, and the split falls cleanly on either side of it. (The avoider sits at 0:1 too but is stable. See below.)
  • reciprocity: negative-affect reciprocity, the probability that one partner’s hostility is answered by the other’s. This is the cascade signature: 96% in the unstable couples: hostility feeds hostility, an absorbing state. 0% in the regulated ones. This single number separates the doomed couples from the safe ones more cleanly than the ratio does.
  • thin-slice: the forecast made from the first quarter of the conversation alone. It calls “holds” for every stable type and “falls” for every unstable one, matching the full run’s outcome in all five cases.

Note the avoider: a 0:1 ratio but a stable marriage and a “holds” forecast. This is Gottman’s conflict-avoiding couple. They do not generate much positive affect, but they do not cascade either because their low mutual influence keeps the negativity from feeding on itself. The model captures “stability by disengagement,” a different route to a lasting marriage than warmth.

The insight. A marriage’s fate is legible early, in the pattern of how a couple handles one disagreement. Not in the content of what they fight about but in whether the fight cascades. The thin-slice result is why a perceptive observer can sit with a couple for ten minutes and know. It is not that they argue, it is how the argument travels: whether a hard word is absorbed or answered in kind. The 96%-vs-0% reciprocity split is the mechanical heart of that intuition. It gives a writer a precise lever: to doom a couple, make each cutting remark reliably summon another. To save them, let one of them, even once, decline to answer in kind.


Part 4: Insights about the predictions

The simulations in Part 3 make predictions. The two tools in this part are different in kind. They are post-hoc analyses. They take a run that has already happened and interrogate it, asking which parameter actually drove the outcome and what smallest change would have flipped it. These are the tools that turn a prediction into an explanation.

4.1 Sensitivity: which dial writes the ending

The idea. A character has many parameters. Which ones actually determine the outcome, and which are decorative? Variance-based (Sobol) sensitivity analysis answers this rigorously. It apportions the variance in an outcome across the parameters, separating each dial’s effect on its own (main effect) from its effect through interaction with others (total effect).

# An insight ABOUT a prediction: variance-based (Sobol) sensitivity -- which
# parameter actually writes the outcome, alone or through interaction.
from soma.narrative import Story, stoic
s = Story("kept", span="16s", step="1s", about="a defended belief")
ink = s.character("Ink", temperament=stoic)
ink.senses("kept_for_nothing")
ink.believes("only_needed", claim="only the needed matter",
disconfirmed_by="kept_for_nothing", breakable=True)
for t in range(2, 14):
s.at(f"{t}s", ink.hears("kept_for_nothing", 8))
L = "the_lie_only_needed"
rep = s.sensitivity(
params={f"{L}.conviction": (0.3, 0.99),
f"{L}.learn": (0.0, 0.3),
f"{L}.precision": (0.2, 0.9)},
outcome_name="break_time", character="Ink", n_base=24, seed=7)
print(rep.render())

Output:

SENSITIVITY of 'break_time' (Ink) — variance-based, 120 runs
dial main total reading
the_lie_only_needed.conviction 1.00 1.00 acts on its own
the_lie_only_needed.learn 0.12 1.00 acts through interaction
the_lie_only_needed.precision 1.00 1.00 acts on its own
(main = variance removed if this dial were fixed; total = variance attributable to it including interactions)

What the output means. The analysis ran the character 120 times, sampling the three dials across their ranges, and measured how break_time (when the belief breaks) responds. Two columns: main is how much of the outcome’s variance a dial controls by itself. total includes its interactions with the others.

  • conviction and precision both read “acts on its own” (main ≈ total ≈ 1.0): each single-handedly determines when the belief breaks. That makes sense: how much you trust the belief versus the evidence is exactly the tug-of-war that sets the breaking time.
  • learn reads “acts through interaction” (main 0.12, total 1.00). The hardening rate barely matters on its own, but it matters a great deal in combination with the others. It shapes the outcome only through how it compounds conviction over time.

Note: Sobol indices are variance fractions and are bounded in [0, 1]. The library clamps them so a dial can never be reported as controlling more than 100% of the variance.

The insight. Not every trait a character has is load-bearing. This tells you which ones the ending actually hangs on and warns you when a trait matters only in concert with another. The hardening didn’t doom him by itself. It doomed him because he was already too sure. This is an interaction effect.

4.2 Counterfactuals

The idea. Fiction is full of margins: the marriage that could have held, the confession that could have landed a day earlier. The counterfactual tool finds the smallest single change to any one dial that flips the outcome. The precise margin the story turned on.

# The counterfactual: the smallest single-dial change that flips the ending --
# the margin the whole story turned on.
from soma.narrative import Story, stoic
s = Story("kept", span="16s", step="1s", about="a defended belief")
ink = s.character("Ink", temperament=stoic)
ink.senses("kept_for_nothing")
ink.believes("only_needed", claim="only the needed matter",
disconfirmed_by="kept_for_nothing", breakable=True)
for t in range(2, 14):
s.at(f"{t}s", ink.hears("kept_for_nothing", 8))
L = "the_lie_only_needed"
rep = s.minimal_intervention(
target=("break", 0.0), # what would PREVENT the break?
dials={f"{L}.conviction": (0.85, 3.0),
f"{L}.precision": (0.05, 0.35)},
character="Ink")
print(rep.render())

Output:

MINIMAL INTERVENTION — least single change to make 'break' reach 0 for Ink:
THE MARGIN: this ending turns on one dial —
the_lie_only_needed.conviction: 0.85 → 2.55 (Δ 1.7, 79% of range) flips 1 → 0
other single-dial routes, by increasing size:
the_lie_only_needed.precision: 0.35 → 0.05 (Δ 0.3, 100% of range) flips 1 → 0
('smallest' is normalized to each dial's own range, so dials on different scales compare fairly)

What the output means. In the base run, Ink’s belief breaks. The tool asks: what is the least single-dial change that would prevent it? The answer: raise conviction from 0.85 to 2.55, making Ink more certain of the belief, so the evidence can never overturn it. It also reports the alternative route: drop precision to 0.05, making Ink trust the evidence even less). Note that it requires moving that dial across its entire range, so it is the “larger” intervention when each is normalized to its own scale.

The belief breaks because Ink is not quite certain enough to defend it against the evidence. A little more conviction and the defense holds: the character would have survived intact, and unhealed.

The insight. Every ending has a margin, and naming it precisely is often where the meaning lands. “She would have kept the belief if she had been just a little more sure of it” reframes a breakdown as a near-miss and locates the exact fulcrum the drama balanced on. It doubles as a compositional test. To make an ending feel inevitable, confirm that no small single change flips it. This is the “over-determined” case the sensitivity tool detects. To make it feel like a near-thing, engineer it to turn on one narrow margin.


Part 5: Studies

Parts 3 and 4 taught each prediction and each insight tool on its own, with small, focused stories built to show one mechanism clearly. Real studies rarely stop at one tool. The eight examples below are complete, unedited command-line programs from SOMA’s example library. Each composes several of the tools you’ve now learned into a single worked study of one character, one marriage, or one small group, the way an actual analysis would. They run in the Library rail under capstone · ….


5.1 Four ways of leaving: the tools composed end to end

The idea. One person leaves a room. This study predicts, before any run, four different people it could happen to, an emotion a fifth person never named, and what happens between two cold negotiators who correspond perfectly and can’t stand each other. The Part 3 sections taught attachment, appraisal, and circumplex one at a time, each on its own small story. This file stakes preregistered forecasts across all three at once. Every claim is staked before the run and checked after, exactly as Section 3.2 taught, at full scale.

"""
four_ways_of_leaving: the 0.8 prediction layers, end to end.
One person leaves a room. The library predicts, before any run, four different
people it could happen to -- and then the confabulation gap that only one of
them will show; the emotion a verdict will produce in a fifth person who was
never told what to feel; what happens between two cold negotiators who
correspond perfectly and can't stand each other; and it seals every claim in a
preregistration before checking any of them.
Everything here is a forecast first and a run second. Where a forecast fails,
the report says FALSIFIED -- that is the point of the instrument.
python3 examples/narrative/four_ways_of_leaving.py
"""
from soma.narrative import (Story, anxious, stoic, trusting, guarded, volatile,
predict_feeling, predict_pull, Stance)
def separations():
"""Four attachment styles; one separation probe; four staked forecasts."""
print("=" * 72)
print("I. FOUR WAYS OF BEING LEFT (soma.narrative.attachment)")
print("=" * 72)
for style, temp in (("secure", trusting), ("anxious", anxious),
("avoidant", stoic), ("disorganized", guarded)):
story = Story(f"leaving_{style}", span="12s", step="1s",
about="separation distress")
mara = story.character("Mara", temperament=temp)
mara.attaches(style, to="Jonah")
print()
print(story.predict_separation("Mara").render())
def the_verdict():
"""The author supplies the appraisal; the library derives the emotion --
and then must produce it."""
print()
print("=" * 72)
print("II. THE VERDICT SHE NEVER NAMED (soma.narrative.appraisal)")
print("=" * 72)
# theory-side, before any story exists:
pf = predict_feeling(congruence=-0.9, agency="other", certainty=0.9,
coping=0.2)
print(f"\n appraisal: harmful, other-caused, certain, powerless")
print(f" {pf.gloss()}")
story = Story("the_verdict", span="8s", step="1s")
vera = story.character("Vera", temperament=anxious)
vera.senses("verdict")
vera.appraises_event("verdict", congruence=-0.9, agency="other",
certainty=0.9, coping=0.2,
when="verdict > 5", drives="heart", to=112,
fades_to=72)
story.at("2s", vera.hears("verdict", 9))
audit = story.preregister()
audit.expect_feeling("Vera", pf.quale, by="4s")
audit.expect_peak("Vera", "heart", at_least=105)
print()
print(audit.check().render())
# construct validity: the forward map (appraisal->emotion) is only a real
# prediction if it is IDENTIFIABLE -- if the inverse (emotion->appraisal)
# recovers the same emotion for every one in the vocabulary. The same
# blind-recovery standard the Strange Situation meets.
from soma.narrative import check_identifiability, explain_emotion
v = check_identifiability()
print(f"\n construct validity — forward and inverse mappings consistent "
f"for all\n {v['n']} emotions: {v['recovered']} "
f"({v['n_correct']}/{v['n']} round-trip). The map is identifiable,")
print(" so the forecast is a prediction, not a label. And it runs "
"backward —")
print(" from the feeling observed to the reading of the world behind it:")
for emo in ("resentment", "grief", "relief"):
print(f" {explain_emotion(emo)}")
def the_negotiation():
"""Two cold, dominant people: perfect correspondence on warmth, collision
on dominance -- structurally complementary, affectively corrosive."""
print()
print("=" * 72)
print("III. THE NEGOTIATION (soma.narrative.circumplex)")
print("=" * 72)
pull = predict_pull(Stance(dominance=0.6, warmth=-0.6))
print(f"\n Rook's opening {Stance(0.6, -0.6).octant()} move {pull.gloss()}")
print()
story = Story("the_negotiation", span="14s", step="1s")
rook = story.character("Rook", temperament=guarded).stance(
dominance=0.6, warmth=-0.6)
wren = story.character("Wren", temperament=volatile).stance(
dominance=0.5, warmth=-0.5)
story.meet(rook, wren)
print(story.predict_dyad(rook, wren).render())
separations()
the_verdict()
the_negotiation()

Output:

========================================================================
I. FOUR WAYS OF BEING LEFT (soma.narrative.attachment)
========================================================================
Separation probe — Mara (secure); forecast staked by the style table before the run:
✓ CONFIRMED: a visible protest fires on separation — forecast False, observed False
✓ CONFIRMED: the narrator reports calm over a real somatic spike (confabulation gap) — forecast False, observed False
✓ CONFIRMED: separation genuinely raises the body's arousal — forecast True, observed True
✓ CONFIRMED: arousal settles substantially after reunion — forecast True, observed True
✓ CONFIRMED: approach and avoidance both fire on the figure — forecast False, observed False
(distress rises, and the body settles on reunion -- the figure works as a regulator)
Separation probe — Mara (anxious); forecast staked by the style table before the run:
✓ CONFIRMED: a visible protest fires on separation — forecast True, observed True
✓ CONFIRMED: the narrator reports calm over a real somatic spike (confabulation gap) — forecast False, observed False
✓ CONFIRMED: separation genuinely raises the body's arousal — forecast True, observed True
✓ CONFIRMED: arousal settles substantially after reunion — forecast False, observed False
✓ CONFIRMED: approach and avoidance both fire on the figure — forecast False, observed False
(loud protest, and arousal that outlasts the reunion -- the alarm's gain is kept up)
Separation probe — Mara (avoidant); forecast staked by the style table before the run:
✓ CONFIRMED: a visible protest fires on separation — forecast False, observed False
✓ CONFIRMED: the narrator reports calm over a real somatic spike (confabulation gap) — forecast True, observed True
✓ CONFIRMED: separation genuinely raises the body's arousal — forecast True, observed True
✓ CONFIRMED: approach and avoidance both fire on the figure — forecast False, observed False
(narrated calm over a real somatic spike -- repressive coping, measurable as a confabulation gap riding on an elevated heart record)
Separation probe — Mara (disorganized); forecast staked by the style table before the run:
✓ CONFIRMED: a visible protest fires on separation — forecast True, observed True
✓ CONFIRMED: the narrator reports calm over a real somatic spike (confabulation gap) — forecast False, observed False
✓ CONFIRMED: separation genuinely raises the body's arousal — forecast True, observed True
✓ CONFIRMED: arousal settles substantially after reunion — forecast False, observed False
✓ CONFIRMED: approach and avoidance both fire on the figure — forecast True, observed True
(approach and avoidance on the same figure -- fright without solution, ambivalence as mechanism)
========================================================================
II. THE VERDICT SHE NEVER NAMED (soma.narrative.appraisal)
========================================================================
appraisal: harmful, other-caused, certain, powerless
predicted feeling: resentment (tendency: withhold -- oppose without power, at a distance, in time, intensity 0.90) -- other-blame without power: the anger pattern minus control (Scherer: low power turns antagonism inward or into time)
PREREGISTERED FORECASTS — staked before the run, checked after
✓ CONFIRMED: Vera feels resentment by 4s
first at 2.0s (3 in all)
✓ CONFIRMED: Vera's heart peaks >= 105
peak 112.0
2 confirmed, 0 falsified.
(Verdicts are claims about this model of the character, never about a real person.)
construct validity — forward and inverse mappings consistent for all
14 emotions: True (14/14 round-trip). The map is identifiable,
so the forecast is a prediction, not a label. And it runs backward —
from the feeling observed to the reading of the world behind it:
resentment: they construed that bad for what they wanted, someone else caused it, it is settled, nothing can be done — and so are moved to withhold -- oppose without power, at a distance, in time
grief: they construed that bad for what they wanted, no one caused it, it is settled, nothing can be done — and so are moved to withdraw and search -- deactivate, and reach for what is gone
relief: they construed that good for what they wanted, no one caused it, it is settled, the bad outcome had been braced for — and so are moved to recover -- release the braced body, stand down
========================================================================
III. THE NEGOTIATION (soma.narrative.circumplex)
========================================================================
Rook's opening arrogant-calculating move invites aloof-introverted (warmth -> -0.60: correspondence, robust across studies; dominance -> -0.60: reciprocity, weaker and context-moderated (strongest in conflict; weaker between familiars))
Dyad forecast — Rook & Wren: complementarity 0.77 (warmth 0.95, dominance 0.45) -> the interaction should STRAINS.
✓ CONFIRMED: the interaction strains — forecast strains, observed rapport deltas -4.0/-4.0
✓ CONFIRMED: hostile correspondence sustains itself (friction persists; rapport ends negative) — forecast persists & negative, observed 30 frictions, last at 14s; deltas -4.0/-4.0
✓ CONFIRMED: who gives ground: the looser-held self (Wren) drifts further from their opening manner — forecast Wren, observed Wren (drift Rook 0.1 vs Wren 0.8)
(warmth correspondence is the robust axis; dominance reciprocity is staked at lower confidence (context-moderated in the literature))

What the output means. The output has three parts, one per tool.

Part I runs the same separation probe from Section 3.3 across all four attachment styles at once, not just the two shown there. Read the four one-line summaries at the end of each block: secure settles on reunion (the figure works as a regulator), anxious protests loudly and stays aroused past the reunion, avoidant shows the calm-over-a-spike split from Section 3.3, and disorganized is the one style Section 3.3 didn’t examine in detail. It is the only one where both approach and avoidance fire on the same figure at once, “fright without solution.” Nineteen of the twenty possible staked claims confirm: secure, anxious, and disorganized each stake five, but avoidant stakes only four, because the model deliberately declines to forecast whether an avoidant child’s arousal settles after reunion: suppression, not settling, is what defines the style. There is no claim to check there.

Part II exercises appraisal’s inverse map (Section 3.1) on a fifth person, Vera, who was given only a bare appraisal (harmful, other-caused, certain, powerless) and never told what to feel. The prediction is resentment and the preregistered forecast. That she’ll feel it by 4 seconds, with a heart rate above 105, confirms. The construct-validity check then runs the whole 14-emotion round-trip again, this time printing three emotions’ full inverse readings side by side (resentment, grief, relief), so you can see how differently the same “bad, certain, nothing to be done” core reads once agency and coping shift.

Part III is circumplex prediction (interpersonal theory, not covered as its own section in Part 3): two characters are given only a numeric stance, dominance and warmth, and the library forecasts what happens when they meet, before any interaction is written. Rook and Wren are both cold (negative warmth), which the model calls correspondence, coldness answers coldness, and both dominant, which is reciprocity’s harder case (two people both trying to lead). The forecast that this pairing STRAINS, that the hostility is self-sustaining, and even which of the two will give ground first (Wren, the one holding their manner more loosely), all confirm.

The insight. Three unrelated theories, run from one file, agreeing with themselves across twenty-four preregistered claims. That reliability is the case for treating psychological typologies as a library rather than a one-off trick: attachment, appraisal, and circumplex are independent instruments, built independently, and they compose without friction because each predicts from a small, principled parameter set rather than from a memorized outcome. A novelist assembling a scene with four characters, each carrying a different attachment style, meeting a fifth who feels something nobody named, negotiated by two more who read each other’s stance at a glance can stake all of it in advance.


5.2 The anatomy of a breaking: every instrument on one man

The idea. Halvor kept a harbor ledger for thirty-one years and believes the only reason anyone is kept is that they are needed. His granddaughter visits anyway, for no errand: persistent, useless regard, the evidence his belief cannot metabolize. The story is deliberately small. This is the richest study: five different instruments, each answering a different question about the same predictive characterization of one man, each checked against real runs. It is the fullest demonstration of what Part 4’s insight tools are for.

"""
the_anatomy_of_a_breaking: every study instrument turned on one man.
Halvor kept the harbor ledger for thirty-one years, and believes the only
reason anyone is kept is that they are needed. His granddaughter keeps
visiting anyway -- no errand, no use for him at all -- and that useless,
persistent regard is the evidence his belief cannot metabolize.
The story is small on purpose. The point of this file is the STUDY: five
instruments, each answering a different question about the same predictive
characterization, each checked against real runs:
I. the run itself what actually happens
II. sensitivity which dial writes this ending (Sobol indices)
III. discrimination which scene would separate two readings of him
IV. early warning is the break legible before it happens
V. minimal intervention what smallest change would have prevented it
VI. preregistration the study's own conclusions, staked and checked
python3 examples/narrative/the_anatomy_of_a_breaking.py
"""
from soma.narrative import Story, stoic
LIE = "the_lie_kept_means_needed"
def build(regard="rising"):
s = Story("the_anatomy_of_a_breaking", span="20s", step="1s",
about="a defended belief, slowly overwhelmed by regard")
halvor = s.character("Halvor", temperament=stoic)
halvor.senses("her_visits")
halvor.believes("kept_means_needed",
claim="the only reason anyone is kept is that they are needed",
disconfirmed_by="her_visits", breakable=True,
conviction=0.88)
halvor.learns(0.02)
# the regard agitates the body it contradicts: visits he cannot account
# for drive the heart, and grief is read off the heart a beat later
halvor.appraises("her_visits", drives="heart", to=95,
when="her_visits > 5", fades_to=72)
halvor.feels("grief", from_body="heart", threshold=80)
halvor.narrates(downplaying={"grief": "It's just the cold in this office."})
# her visits: useless regard. "rising": steady and a little warmer each
# year (the life that breaks him). "faint": dutiful and thin -- reads at
# almost exactly what the lie predicts, so nothing accumulates (the life
# in which the belief is never tested hard enough to fail).
for t in range(2, 18):
v = (round(min(9, 3 + 0.4 * (t - 2)), 1) if regard == "rising"
else 2.2)
s.at(f"{t}s", halvor.hears("her_visits", v))
return s
def study():
print("=" * 74)
print("I. THE RUN — what actually happens")
print("=" * 74)
s = build()
r = s.result()
revs = [e for e in r.chronicle if e.kind == "revelation"]
print(f"\n Halvor's lie {'BREAKS at %ds' % revs[0].t if revs else 'holds'} "
f"under sixteen beats of useless regard.\n")
print("=" * 74)
print("II. SENSITIVITY — which dial writes this ending")
print("=" * 74)
rep = build().sensitivity(
params={f"{LIE}.conviction": (0.4, 0.99),
f"{LIE}.learn": (0.0, 0.15),
f"{LIE}.precision": (0.2, 0.9)},
outcome_name="break_time", character="Halvor", n_base=32, seed=7)
print()
print(rep.render())
print()
print(" (The heavy interaction is not noise; it is a recovered mechanism. "
"SOMA's\n auto-break threshold is 6*conviction/precision — a ratio, "
"so neither dial\n acts alone by construction. The study, given "
"only runs, found the ratio.)")
print()
print("=" * 74)
print("III. DISCRIMINATION — the scene that separates two readings")
print("=" * 74)
print("\n Reading A: armor — held hard (conviction .97) and deaf to the")
print(" evidence (precision .2): he can only suppress, until overwhelmed.")
print(" Reading B: habit — held loosely (conviction .6), evidence trusted")
print(" (precision .8): the senses outrank the prior, so he simply updates.")
rep = build().discriminate(
"Halvor",
version_a={f"{LIE}.conviction": 0.97, f"{LIE}.precision": 0.2},
version_b={f"{LIE}.conviction": 0.6, f"{LIE}.precision": 0.8},
probes={"her_visits": [2, 4, 6, 9]},
outcome_name="break_time")
print()
print(rep.render())
print()
print(" ('never' here does not mean armored: reading B never BREAKS because")
print(" it never suppresses — the evidence wins arbitration and he changes")
print(" his mind without a shattering. The same scene separates a man who")
print(" breaks from a man who quietly revises.)")
print()
print("=" * 74)
print("IV. EARLY WARNING — is the break legible before it happens?")
print("=" * 74)
print()
print(build().predict_break_onset("Halvor", window=5).render())
print()
print(" ...and the same instrument on the life where her regard stays "
"faint\n (reads at what the lie predicts; nothing accumulates):")
print()
print(build(regard="faint").predict_break_onset("Halvor", window=5).render())
print()
print("=" * 74)
print("V. MINIMAL INTERVENTION — what would have prevented it")
print("=" * 74)
rep = build().minimal_intervention(
target=("break", 0.0),
dials={f"{LIE}.conviction": (0.88, 3.0),
f"{LIE}.precision": (0.05, 0.35),
f"{LIE}.learn": (0.0, 0.02)},
character="Halvor")
print()
print(rep.render())
print()
print("=" * 74)
print("VI. PREREGISTRATION — the study's conclusions, staked and checked")
print("=" * 74)
s = build()
audit = s.preregister()
audit.expect_break("Halvor")
audit.expect_feeling("Halvor", "grief")
audit.expect_gap("Halvor", at_least=0.4) # he downplays while it builds
print()
print(audit.check().render())
study()

Output:

==========================================================================
I. THE RUN — what actually happens
==========================================================================
Halvor's lie BREAKS at 10s under sixteen beats of useless regard.
==========================================================================
II. SENSITIVITY — which dial writes this ending
==========================================================================
SENSITIVITY of 'break_time' (Halvor) — variance-based, 160 runs
dial main total reading
…e_lie_kept_means_needed.precision 0.04 0.76 acts through interaction
the_lie_kept_means_needed.learn 0.00 0.72 acts through interaction
…_lie_kept_means_needed.conviction 0.17 0.71 acts through interaction
(main = variance removed if this dial were fixed; total = variance attributable to it including interactions)
(The heavy interaction is not noise; it is a recovered mechanism. SOMA's
auto-break threshold is 6*conviction/precision — a ratio, so neither dial
acts alone by construction. The study, given only runs, found the ratio.)
==========================================================================
III. DISCRIMINATION — the scene that separates two readings
==========================================================================
Reading A: armor — held hard (conviction .97) and deaf to the
evidence (precision .2): he can only suppress, until overwhelmed.
Reading B: habit — held loosely (conviction .6), evidence trusted
(precision .8): the senses outrank the prior, so he simply updates.
DISCRIMINATION — the scene that separates two readings of Halvor (outcome: break_time):
probe reading A reading B apart
her_visits=4 15.0 never 1.00
her_visits=6 13.0 never 1.00
her_visits=9 7.0 never 1.00
her_visits=2 never never 0.00
-> WRITE THIS SCENE: her_visits=4 — the two natures come apart most here.
(divergence 1.00 = the two readings differ qualitatively (one breaks, one never does) — the sharpest possible separation)
('never' here does not mean armored: reading B never BREAKS because
it never suppresses — the evidence wins arbitration and he changes
his mind without a shattering. The same scene separates a man who
breaks from a man who quietly revises.)
==========================================================================
IV. EARLY WARNING — is the break legible before it happens?
==========================================================================
EARLY WARNING — Halvor, read only before any revelation:
signal: overwhelm-debt (the destabilizing variable)
accumulator at 17.8 of bound 24.9, slope +4.45/s
fluctuation variance trend: +0.80 (rising)
fluctuation autocorr. trend: -0.64 (flat/falling)
-> FORECAST: break coming (strong signal) — crossing predicted at ≈11s
✓ the full run: broke at 10s
...and the same instrument on the life where her regard stays faint
(reads at what the lie predicts; nothing accumulates):
EARLY WARNING — Halvor, read only before any revelation:
signal: overwhelm-debt (the destabilizing variable)
accumulator at 11.0 of bound 16.1, slope +1.10/s
fluctuation variance trend: +0.88 (rising)
fluctuation autocorr. trend: -0.32 (flat/falling)
-> FORECAST: stable (strong signal) — at this rate the bound is not reached until ≈25s, past the horizon
✓ the full run: never broke
==========================================================================
V. MINIMAL INTERVENTION — what would have prevented it
==========================================================================
MINIMAL INTERVENTION — least single change to make 'break' reach 0 for Halvor:
THE MARGIN: this ending turns on one dial —
the_lie_kept_means_needed.conviction: 0.88 → 2.56 (Δ 1.68, 79% of range) flips 1 → 0
other single-dial routes, by increasing size:
the_lie_kept_means_needed.precision: 0.35 → 0.05 (Δ 0.3, 100% of range) flips 1 → 0
('smallest' is normalized to each dial's own range, so dials on different scales compare fairly)
==========================================================================
VI. PREREGISTRATION — the study's conclusions, staked and checked
==========================================================================
PREREGISTERED FORECASTS — staked before the run, checked after
✓ CONFIRMED: Halvor's lie breaks (self-revelation)
revelation at 10.0s in the_lie_kept_means_needed
✓ CONFIRMED: Halvor feels grief
first at 8.0s (13 in all)
✓ CONFIRMED: Halvor narrates over a gap (>= 0.4)
gap 0.55 at 8.0s
3 confirmed, 0 falsified.
(Verdicts are claims about this model of the character, never about a real person.)

What the output means. I. The run. Halvor’s lie breaks at 10 seconds under sixteen beats of his granddaughter’s regard, the baseline fact everything else explains.

II. Sensitivity (Section 4.1) finds something Section 4.1’s own example didn’t show: every dial here reads “acts through interaction”. None writes the outcome on its own. The report explains why: SOMA’s auto-break threshold is a ratio, conviction over precision, so by construction neither dial alone can be decisive.

III. Discrimination is a tool this tutorial hasn’t introduced yet. Given two competing readings of a character (here, “armor”, held hard and deaf to evidence versus “habit”, held loosely, evidence trusted), it finds the probe that would separate them most sharply. Three candidate scenes, her_visits at 4, 6, and 9, all reach the maximum possible divergence (1.00): at any of them, “armor” breaks and “habit” never does. The report names the first of the three, her_visits=4, as the scene to write, and that tie is itself the finding. Once his granddaughter’s regard passes a fairly low bar, the two readings are already fully separated, so the smallest, least dramatic version of the scene tells you just as much as a more extreme one would. Discrimination doesn’t say which reading is true.

IV. Early warning (Section 3.4) is run twice. Once on the life that breaks, forecasting the crossing at ≈11s against an actual break at 10s; once on a counterfactual life where the granddaughter’s regard stays faint and nothing ever accumulates enough to cross. Same instrument, both directions, both correct.

V. Minimal intervention (Section 4.2) finds the margin: raising conviction from 0.88 to 2.56 would have kept the lie intact.

VI. Preregistration (Section 3.2) closes the study by staking its own three headline conclusions that the lie breaks, that Halvor feels grief, that his narrator downplays it before checking them. All three confirm.

The insight. No single tool tells you what a character is. Each answers a different question a reader might ask, and a full study is the composition of all of them. Sensitivity says the ending is over-determined by a ratio, not any one trait. Discrimination says where to set a scene if you want to reveal which of two readings is correct. Early warning says the break was legible in advance, on this life and not on the counterfactual one. The counterfactual names the exact margin. And preregistration keeps every one of those claims honest. Put together, this is what “understanding a character” can mean when the understanding is checkable rather than asserted: not a single fact, but a small system of mutually consistent answers to different questions, all about the same acted-out life.


5.3 The marriage that could have held: a point of no return

The idea. Soren’s delight in his wife Mira depends on her surprising him: a low-conviction prior being sweetly wrong, the same delight-in-error pattern from Part 1’s first example. His learn rate is the tragedy variable. Every firing hardens the prior, and the curdling isn’t that the feeling stops. It’s that the route flips. Early in the marriage, a surprise routes to perceive: she moves him, his picture of her revises. Late, the same surprise routes to act: he defends the picture instead, and whatever still fires is a feeling about his own model, not about her. Nothing visible changes. That is the point of the study.

"""
the_marriage_that_could_have_held: the study layer turned on a slow curdling.
Soren's delight in Mira depends on her surprising him -- delight_at_error, a
low-conviction prior being sweetly wrong. His `learn` rate is the tragedy dial:
every firing hardens the prior, and the curdling is not that the flicker of
feeling stops -- it is that the ROUTE flips. Early, a surprise routes to
`perceive`: she moves him, his picture of her revises. Late, the same surprise
routes to `act`: he resists it, defends the picture, and the feeling that still
fires is a feeling *about* his model, not about her. Nothing visible changes.
That is the point.
Four studies, each a question a novelist actually asks about this marriage:
I. the run when the route flips: the year he stops taking her in
II. sensitivity is the tragedy the learning, or the trusting?
III. counterfactual the smallest change to him that keeps him open
IV. the last good year the latest year one extraordinary day still REACHES
him -- a point of no return, computed, not asserted
Study IV is composed directly from the insight substrate (run_with + the
chronicle) rather than a canned instrument: the substrate is the API, the
instruments are just its most common compositions.
python3 examples/narrative/the_marriage_that_could_have_held.py
"""
from soma.narrative import Story, tender, arc, run_with, outcome
LOOP = "appraising_her_face"
YEAR = 31557600.0 # one soma year, in the seconds the Chronicle keeps
def build(extraordinary_day=None, learn=0.08):
"""The marriage. If `extraordinary_day` is (year, value), one unscripted,
astonishing day is inserted -- the intervention Study IV searches over."""
s = Story("the_marriage", span="30y", step="1y", cadence=True,
about="the slow erosion of intimacy")
soren = s.character("Soren", temperament=tender, clock="life")
soren.senses("her_face", baseline=5)
soren.appraises("her_face", feeling="delight_at_error", when="her_face > 1",
precision=0.75, conviction=0.2,
updates=True, stops_seeing=True)
soren.learns(learn)
s.over(arc.wobble(around=5, span="24y", every="1y", unit="y", amplitude=3),
lambda v: soren.hears("her_face", v))
if extraordinary_day is not None:
year, value = extraordinary_day
s.at(f"{year}y", soren.hears("her_face", value))
return s
def study():
print("=" * 74)
print("I. THE RUN — the year he stops taking her in")
print("=" * 74)
r = run_with(build())
beats = [(e.t / YEAR, e.detail["route"]) for e in r.chronicle
if e.kind == "settle" and e.who.endswith(LOOP)]
first_act = next((y for y, route in beats if route == "act"), None)
last_perc = max((y for y, route in beats if route == "perceive"), default=None)
frac = outcome(r, "perceive_frac", character="Soren")
print(f"\n her face goes on varying for 24 years. He takes it in "
f"(`perceive`) for the")
print(f" early marriage; the route first flips to resisting (`act`) at "
f"year {first_act:.0f},")
print(f" and the last beat that truly reaches him is year {last_perc:.0f}. "
f"Over the whole")
print(f" marriage the world gets in on only {frac:.0%} of beats. The "
f"delight still")
print(f" flickers afterward — but it is delight at his own model, "
f"defended.\n")
print("=" * 74)
print("II. SENSITIVITY — is the tragedy the learning, or the trusting?")
print("=" * 74)
rep = build().sensitivity(
params={f"{LOOP}.learn": (0.0, 0.12),
f"{LOOP}.conviction": (0.05, 0.6),
f"{LOOP}.precision": (0.4, 0.95)},
outcome_name="perceive_frac", character="Soren",
n_base=24, seed=11)
print()
print(rep.render())
print()
print(" (The outcome is the fraction of his life the world still gets in.)")
print()
print("=" * 74)
print("III. COUNTERFACTUAL — the smallest change that keeps him open")
print("=" * 74)
base_frac = outcome(run_with(build()), "perceive_frac", character="Soren")
print(f"\n target: the world gets in on at least half his beats "
f"(baseline: {base_frac:.0%}).")
rep = build().minimal_intervention(
target=("perceive_frac", 0.5),
dials={f"{LOOP}.learn": (0.0, 0.08),
f"{LOOP}.conviction": (0.05, 0.2),
f"{LOOP}.precision": (0.75, 0.98)},
character="Soren", steps=16)
print()
print(rep.render())
print()
print("=" * 74)
print("IV. THE LAST GOOD YEAR — a point of no return, computed")
print("=" * 74)
print("\n One extraordinary day — her face at 9.5, utterly unforeseen —")
print(" inserted at year Y. Does it still REACH him (route: perceive),")
print(" or does he resist it (route: act)?\n")
last_good = None
for year in range(2, 26, 2):
r = run_with(build(extraordinary_day=(year, 9.5)))
routes = [e.detail["route"] for e in r.chronicle
if e.kind == "settle" and e.who.endswith(LOOP)
and abs(e.t / YEAR - year) < 0.6]
reached = "perceive" in routes
print(f" year {year:>2d}: "
f"{'it reaches him — she moves him' if reached else 'he resists it — the picture holds'}")
if reached:
last_good = year
print(f"\n POINT OF NO RETURN: after year {last_good}, no single day, "
f"however astonishing,")
print(" routes to perceive — his hardened prior outranks anything one day "
"can say.")
print(" The marriage's fate is settled years before anything visible "
"happens,")
print(" and the year it was settled is computable.")
study()

Output:

==========================================================================
I. THE RUN — the year he stops taking her in
==========================================================================
her face goes on varying for 24 years. He takes it in (`perceive`) for the
early marriage; the route first flips to resisting (`act`) at year 7,
and the last beat that truly reaches him is year 6. Over the whole
marriage the world gets in on only 23% of beats. The delight still
flickers afterward — but it is delight at his own model, defended.
==========================================================================
II. SENSITIVITY — is the tragedy the learning, or the trusting?
==========================================================================
SENSITIVITY of 'perceive_frac' (Soren) — variance-based, 120 runs
dial main total reading
appraising_her_face.learn 0.00 0.53 acts through interaction
appraising_her_face.conviction 0.12 0.12 acts on its own
appraising_her_face.precision 0.07 0.07 acts on its own
(main = variance removed if this dial were fixed; total = variance attributable to it including interactions)
(The outcome is the fraction of his life the world still gets in.)
==========================================================================
III. COUNTERFACTUAL — the smallest change that keeps him open
==========================================================================
target: the world gets in on at least half his beats (baseline: 23%).
MINIMAL INTERVENTION — least single change to make 'perceive_frac' reach 0.5 for Soren:
THE MARGIN: this ending turns on one dial —
appraising_her_face.learn: 0.08 → 0.035 (Δ 0.045, 56% of range) flips 0.226 → 0.516
('smallest' is normalized to each dial's own range, so dials on different scales compare fairly)
==========================================================================
IV. THE LAST GOOD YEAR — a point of no return, computed
==========================================================================
One extraordinary day — her face at 9.5, utterly unforeseen —
inserted at year Y. Does it still REACH him (route: perceive),
or does he resist it (route: act)?
year 2: it reaches him — she moves him
year 4: it reaches him — she moves him
year 6: it reaches him — she moves him
year 8: he resists it — the picture holds
year 10: he resists it — the picture holds
year 12: he resists it — the picture holds
year 14: he resists it — the picture holds
year 16: he resists it — the picture holds
year 18: he resists it — the picture holds
year 20: he resists it — the picture holds
year 22: he resists it — the picture holds
year 24: he resists it — the picture holds
POINT OF NO RETURN: after year 6, no single day, however astonishing,
routes to perceive — his hardened prior outranks anything one day can say.
The marriage's fate is settled years before anything visible happens,
and the year it was settled is computable.

What the output means. I. The run reports the headline fact plainly. The route first flips at year 7, the last year anything truly reaches him is year 6, and across the whole marriage the world gets in on only 23% of beats.

II. Sensitivity asks the harder question a reader would actually have. Is the tragedy that he learns too fast or that he trusts himself too much? learn is the dial that matters, and it acts almost entirely through interaction (main effect near zero, total effect 0.53) rather than on its own. It is not simply that he hardens. It is that hardening compounds with how much he already trusts his own picture.

III. The counterfactual finds the fix: dropping his learn rate from 0.08 to 0.035 (less than half) would keep the world reaching him on at least half of all beats instead of less than a quarter.

IV. The last good year is composed directly from the raw insight substrate (run_with and the Chronicle). The tutorial’s one demonstration that the substrate underneath every report you’ve seen is itself an ordinary, usable API. The question: if one extraordinary day were inserted at year Y, would it still reach him? The sweep finds a sharp answer, yes through year 6, no from year 8 onward. Year 6 is the point of no return. No day, however astonishing, gets through after that, because his hardened prior by then outranks anything a single day can say.

The insight. A marriage’s ending is often described as a moment: the fight, the discovery, the day someone finally says it out loud. This study makes the case that the moment is usually the last event in a process that finished long before. “He stopped being reachable in year six” is a very different, much sadder claim than “he left in year twenty”. It is the claim the data actually supports. A novelist who wants a marriage to feel tragic rather than merely sad can use this structure: let the visible ending arrive on schedule, decades after the real one, and let a reader who checks the record find the actual year underneath it.


5.4 Five marriages: the Gottman model, run as a typology

The idea. Five marriages face the identical contentious conversation in this file. The same setup Section 3.9 used, but audited more closely than one summary line per couple can show. This study asks whether the forecast itself holds up under scrutiny, couple by couple, claim by claim. And for the one type that fails (the hostile couple) what would it actually take to save it?

"""
five_marriages: the Gottman-Murray model, run as five marriages.
Gottman and Murray's mathematics of marriage is the most famous predictive
character simulation there is: parameters read off minutes of one conversation
predicted divorce years out. This simulation rebuilds the model in SOMA -- the
influence functions are couple/lag readings, the negative threshold is a guard
level, repair is an interoceptive bid, emotional inertia is conviction -- and
runs the same contentious conversation through all five couple types.
I. five couples, one complaint the typology's forecasts, checked
II. the thin slice the ending forecast from the first
quarter alone -- the minutes-to-years
claim, in-model and falsifiable
III. what saves a hostile couple minimal intervention: is it the skin
(negative threshold) or the repair?
IV. the anatomy of the cascade negative-affect reciprocity as the
absorbing state, measured
python3 examples/narrative/five_marriages.py
"""
from soma.narrative import Story, tender, trusting, COUPLE_TYPES, marry, gottman_assess
def couple(type_name):
s = Story(f"marriage_{type_name}", span="20s", step="1s")
a = s.character("Ash", temperament=trusting)
b = s.character("Bee", temperament=tender)
marry(s, a, b, type_name)
return s
def study():
print("=" * 74)
print("I. FIVE COUPLES, ONE COMPLAINT — the typology's forecasts, checked")
print("=" * 74)
reports = {}
for tname in COUPLE_TYPES:
rep = gottman_assess(couple(tname))
reports[tname] = rep
print()
print(rep.render())
print()
print("=" * 74)
print("II. THE THIN SLICE — the ending, forecast from the first quarter")
print("=" * 74)
print()
print(" couple slice says the marriage forecast")
hits = 0
for tname, rep in reports.items():
actual = "holds" if any("REGULATED" in v[0] and v[3] for v in rep.verdicts) \
or rep.stable_forecast and rep.confirmed else "falls"
# read the actual from the thin-slice verdict's observed field
thin_v = next(v for v in rep.verdicts if "THIN SLICE" in v[0])
actual = thin_v[2]
ok = thin_v[3]
hits += ok
print(f" {tname:<16s} {rep.thin_forecast:<12s} {actual:<16s} "
f"{'✓ correct' if ok else '✗ wrong'}")
print(f"\n {hits}/{len(reports)} endings called from the first quarter of "
f"one conversation.")
print(" (Gottman's claim was 94% from minutes of tape; here the mechanism")
print(" that makes it possible is visible: the slice carries the couple's")
print(" thresholds, and the thresholds ARE the ending.)")
print()
print("=" * 74)
print("III. WHAT SAVES A HOSTILE COUPLE — the skin, or the repair?")
print("=" * 74)
# A hostile couple's two broken dials: a thin skin (friction triggers at
# received manner <= 4.5) and no repair. Which single change un-cascades
# them? We test the skin directly: thicken it (lower the guard) until the
# marriage holds. Repair can't be added by a dial (it is absent wiring),
# which is itself the finding Gottman's interventions reflect: you can
# teach repair, but the model must first contain a bid to strengthen.
s = couple("hostile")
rep = s.minimal_intervention(
target=("mood_drift", 0.0),
dials={"Ash.appraising_their_manner_friction.precision": (0.1, 0.9),
"Bee.appraising_their_manner_friction.precision": (0.1, 0.9)},
character="Ash", mood="rapport", steps=16)
print()
print(rep.render())
print()
print(" (Lowering the friction loop's precision is 'thickening the skin':")
print(" the same received coldness carries less weight. The instrument")
print(" reports whether any single skin-thickening saves this marriage,")
print(" or whether the cascade is over-determined without repair.)")
print()
print("=" * 74)
print("IV. THE ANATOMY OF THE CASCADE — reciprocity as the absorbing state")
print("=" * 74)
print()
print(" couple negative reciprocity")
for tname, rep in reports.items():
bar = "#" * int(rep.reciprocity * 30)
print(f" {tname:<16s} {rep.reciprocity:>4.0%} {bar}")
print()
print(" The unstable couples answer friction with friction nearly every")
print(" beat — Gottman's absorbing state: once in, the cascade feeds")
print(" itself. The regulated couples' reciprocity is near zero not")
print(" because nothing negative arrives, but because it is absorbed —")
print(" by a thicker skin, by repair, or by disengagement.")
study()

Output:

==========================================================================
I. FIVE COUPLES, ONE COMPLAINT — the typology's forecasts, checked
==========================================================================
GOTTMAN ASSESSMENT — Ash & Bee (validating): warm, mutually influenced, lets small negativity pass, repairs
positivity ratio 14.00:1 over the whole run (first quarter: 4.00:1); negative reciprocity 0%
✓ CONFIRMED: a validating couple is REGULATED: rapport holds — forecast holds, observed deltas +3.5/+3.9
✓ CONFIRMED: their positivity outweighs the negative (ratio >= 1) — forecast >= 1, observed 14.00:1
✓ CONFIRMED: THIN SLICE: the first quarter alone forecasts the ending — forecast holds, observed holds
GOTTMAN ASSESSMENT — Ash & Bee (volatile): hot and loud, quick to fire AND quick to repair -- stable because the positive is louder still
positivity ratio 14.00:1 over the whole run (first quarter: 4.00:1); negative reciprocity 0%
✓ CONFIRMED: a volatile couple is REGULATED: rapport holds — forecast holds, observed deltas +3.5/+3.9
✓ CONFIRMED: their positivity outweighs the negative (ratio >= 1) — forecast >= 1, observed 14.00:1
✓ CONFIRMED: a volatile couple is loud: many affect events — forecast >= 20, observed 45
✓ CONFIRMED: THIN SLICE: the first quarter alone forecasts the ending — forecast holds, observed holds
GOTTMAN ASSESSMENT — Ash & Bee (avoider): conflict-avoiding: little influence either way, little said, stable by disengagement
positivity ratio 0.00:1 over the whole run (first quarter: 0.00:1); negative reciprocity 0%
✓ CONFIRMED: a avoider couple is REGULATED: rapport holds — forecast holds, observed deltas -0.4/+0.0
✓ CONFIRMED: an avoider couple is quiet: few affect events — forecast <= 8, observed 3
✓ CONFIRMED: THIN SLICE: the first quarter alone forecasts the ending — forecast holds, observed holds
GOTTMAN ASSESSMENT — Ash & Bee (hostile): engaged and corrosive: thin-skinned (low negative threshold), no repair that lands -- the cascade
positivity ratio 0.00:1 over the whole run (first quarter: 0.00:1); negative reciprocity 96%
✓ CONFIRMED: a hostile couple CASCADES: rapport falls — forecast falls, observed deltas -5.0/-4.7
✓ CONFIRMED: negativity outweighs the positive (ratio < 1) — forecast < 1, observed 0.00:1
✓ CONFIRMED: THIN SLICE: the first quarter alone forecasts the ending — forecast falls, observed falls
GOTTMAN ASSESSMENT — Ash & Bee (hostile_detached): one attacks, one stonewalls: hostility met with withdrawal, the coldest configuration
positivity ratio 0.00:1 over the whole run (first quarter: 0.00:1); negative reciprocity 96%
✓ CONFIRMED: a hostile_detached couple CASCADES: rapport falls — forecast falls, observed deltas -5.0/-4.7
✓ CONFIRMED: negativity outweighs the positive (ratio < 1) — forecast < 1, observed 0.00:1
✓ CONFIRMED: THIN SLICE: the first quarter alone forecasts the ending — forecast falls, observed falls
==========================================================================
II. THE THIN SLICE — the ending, forecast from the first quarter
==========================================================================
couple slice says the marriage forecast
validating holds holds ✓ correct
volatile holds holds ✓ correct
avoider holds holds ✓ correct
hostile falls falls ✓ correct
hostile_detached falls falls ✓ correct
5/5 endings called from the first quarter of one conversation.
(Gottman's claim was 94% from minutes of tape; here the mechanism
that makes it possible is visible: the slice carries the couple's
thresholds, and the thresholds ARE the ending.)
==========================================================================
III. WHAT SAVES A HOSTILE COUPLE — the skin, or the repair?
==========================================================================
MINIMAL INTERVENTION — least single change to make 'mood_drift' reach 0 for Ash:
THE MARGIN: this ending turns on one dial —
appraising_their_manner_friction.precision: 0.9 → 0.15 (Δ 0.75, 94% of range) flips -4.67 → 0
('smallest' is normalized to each dial's own range, so dials on different scales compare fairly)
(Lowering the friction loop's precision is 'thickening the skin':
the same received coldness carries less weight. The instrument
reports whether any single skin-thickening saves this marriage,
or whether the cascade is over-determined without repair.)
==========================================================================
IV. THE ANATOMY OF THE CASCADE — reciprocity as the absorbing state
==========================================================================
couple negative reciprocity
validating 0%
volatile 0%
avoider 0%
hostile 96% ############################
hostile_detached 96% ############################
The unstable couples answer friction with friction nearly every
beat — Gottman's absorbing state: once in, the cascade feeds
itself. The regulated couples' reciprocity is near zero not
because nothing negative arrives, but because it is absorbed —
by a thicker skin, by repair, or by disengagement.

What the output means. I. Every couple type gets its own preregistered claims, not just a ratio. The validating and volatile couples are REGULATED. The avoider couple is regulated and quiet (few affect events at all: stability by disengagement, the same reading Section 3.9 gave). The hostile and hostile-detached couples are confirmed to CASCADE.

II. The thin slice restates Section 3.9’s headline result as a table: five endings, called from the first quarter of one conversation, five correct calls. The commentary makes the mechanism explicit in a way Section 3.9 didn’t have room for: the slice carries the couple’s thresholds, and the thresholds are the ending. There is no hidden variable the thin slice is missing.

III. The counterfactual asks the question a therapist would actually ask. For the hostile couple, is the fix the skin (how much a partner’s own guard filters incoming coldness) or the repair (whether a bid to reconnect lands)? The skin is thickening the friction loop’s precision from 0.9 to 0.15 is enough on its own to flip the mood drift from strongly negative to zero. The skin, not the repair, is the lever this particular cascade turns on.

IV. The reciprocity numbers from Section 3.9 are shown as a bar chart across all five types: 0% for every regulated couple, 96% for both unstable ones. The explanation names what the number means. The regulated couples aren’t receiving less negativity, they’re absorbing it, by a thicker skin, a landing repair, or simple disengagement, while the unstable couples answer nearly every hostile beat with another one, Gottman’s absorbing state.

The insight. Section 3.9 showed that the model sorts five couples correctly. This one shows how much more a single instrument can say: which claims specifically hold for which type, what the thin slice’s reliability actually rests on, and, most usefully, that two structurally different repairs (a thicker skin, a landing apology) are not interchangeable, and the model can tell you which one a given cascade needs. Saving a marriage, on this evidence, means finding the one dial a given cascade actually turns on. Not applying warmth in general, but locating the specific lever, per couple, that this method makes findable.


5.5 The spiral: panic as a positive feedback loop

The idea. Every simulation so far has one attractor: a belief holds or breaks, a mood settles or doesn’t. This study introduces a different structure. Clark’s (1986) cognitive model of panic treats an attack as a positive feedback loop: a bodily sensation is catastrophically appraised as dangerous, the appraisal raises arousal, the raised arousal produces more sensation, which confirms the appraisal. In SOMA the circle is built from two verbs: a flutter drives the heart a little, and a catastrophizing appraisal reads the heart and drives the heart. The loop senses the very channel it raises. The result is a system with two stable states and a sharp threshold between them.

"""
the_spiral: Clark's cognitive model of panic, as interoceptive inference.
Clark (1986): a panic attack is a positive feedback loop -- a bodily sensation
is catastrophically appraised as danger, the appraisal produces arousal, the
arousal produces more sensation, which confirms the appraisal. The modern
predictive-processing reading (Paulus; Seth) makes it an inference pathology: a
prior that bodily signals mean catastrophe, held with enough weight that the
body's ordinary noise becomes its own evidence.
In SOMA the circle is two verbs: a flutter drives the heart a little, and a
catastrophizing appraisal READS the heart and DRIVES the heart -- the loop
senses the very channel it raises. Everything else is prediction:
I. the circle vs. the shrug same flutter, two priors: one spirals to
an attack, one carries it uninterpreted
II. the tipping flutter the smallest palpitation that panics --
a sharp threshold, found by sweep
III. hysteresis the attack OUTLIVES its trigger: the
flutter ends and the spiral self-sustains
(bistability), until regulation arrives
IV. the exposure margin interoceptive exposure = raising the
sensation the body can carry without
interpretation; the minimal tolerance
that prevents the attack, computed
Every study here is hand-composed from the insight substrate (run_with +
outcome + series): no new module was needed. The substrate is the API.
python3 examples/narrative/the_spiral.py
"""
from soma.narrative import Story, anxious, run_with, outcome, series
ATTACK = 115.0 # sustained heart above this = a panic attack, by definition
def build(*, alarm_at=88.0, flutter=6.0, flutter_beats=(3, 4),
reassurance_at=None):
"""One person, one flutter, and a prior about what flutters mean.
alarm_at: the heart level at which the catastrophizing appraisal engages --
the body's tolerance for its own noise. 999 = no catastrophizing.
flutter: the trigger's strength.
reassurance_at: optionally, a beat at which regulation arrives (a hand on
the shoulder, a breath count) -- a down-driver on the same heart.
"""
s = Story("the_spiral", span="18s", step="1s",
about="a panic spiral and its breaking")
p = s.character("Wren", temperament=anxious)
p.senses("flutter")
# the sensation: a flutter nudges the heart up -- ordinary, transient
p.appraises("flutter", when="flutter > 3", drives="heart", to=92,
fades_to=72, expects=0.0)
# the circle: the appraisal that READS the heart and RAISES it. This one
# loop is Clark's model: sensation -> catastrophic appraisal -> arousal ->
# more sensation. Above `alarm_at`, the body's state is its own evidence.
p.appraises("heart", as_threat=True, when=f"heart > {alarm_at}",
drives="heart", to=132, fades_to=72,
feeling="terror", expects=72.0)
if reassurance_at is not None:
p.senses("reassurance")
p.appraises("reassurance", when="reassurance > 5",
drives="heart", to=68, fades_to=72, expects=0.0)
for b in flutter_beats:
s.at(f"{b}s", p.hears("flutter", flutter))
if reassurance_at is not None:
s.at(f"{reassurance_at}s", p.hears("reassurance", 8))
s.at(f"{reassurance_at+1}s", p.hears("reassurance", 8))
return s
def attacked(story):
r = run_with(story)
h = series(r, "heart", character="Wren")
sustained = sum(1 for v in h if v >= ATTACK)
return sustained >= 3, r
def study():
print("=" * 74)
print("I. THE CIRCLE VS. THE SHRUG — same flutter, two priors")
print("=" * 74)
got, r1 = attacked(build(alarm_at=88.0))
h1 = [round(v) for v in series(r1, "heart", character="Wren")]
terror = outcome(r1, "feel", character="Wren", quale="terror")
print(f"\n the catastrophizer (alarm at 88): heart {h1}")
print(f" -> ATTACK: {got}; terror fired {terror:.0f} times")
got2, r2 = attacked(build(alarm_at=999.0))
h2 = [round(v) for v in series(r2, "heart", character="Wren")]
print(f" the shrug (no catastrophic prior): heart {h2}")
print(f" -> attack: {got2}; the same flutter, carried uninterpreted\n")
print("=" * 74)
print("II. THE TIPPING FLUTTER — the smallest palpitation that panics")
print("=" * 74)
print()
tip = None
for f in [1, 2, 3, 4, 5, 6, 7, 8]:
got, _ = attacked(build(alarm_at=88.0, flutter=float(f)))
print(f" flutter {f}: {'ATTACK' if got else 'passes'}")
if got and tip is None:
tip = f
print(f"\n the threshold is SHARP: below flutter {tip} nothing happens at "
f"all; at {tip}, the")
print(" full attack. Panic's all-or-nothing character is the signature of "
"a system")
print(" with two attractors and a separatrix between them, not of a dial.\n")
print("=" * 74)
print("III. HYSTERESIS — the attack outlives its trigger")
print("=" * 74)
got, r = attacked(build(alarm_at=88.0, flutter_beats=(3, 4)))
h = series(r, "heart", character="Wren")
t = r.times
after_trigger = [round(v) for v, tt in zip(h, t) if tt >= 6]
print(f"\n the flutter ends at 5s. The heart, after: {after_trigger}")
print(" The spiral is SELF-SUSTAINING: heart above the alarm keeps the")
print(" appraisal firing, which keeps the heart above the alarm. Two")
print(" stable states — rest and attack — and the flutter only chose")
print(" between them. The way back is not the way in:")
got_r, rr = attacked(build(alarm_at=88.0, reassurance_at=9))
hr = [round(v) for v in series(rr, "heart", character="Wren")]
print(f"\n with regulation arriving at 9s: heart {hr}")
print(" Removing the trigger did nothing; only a DOWN-driver — the")
print(" regulation the spiral itself cannot supply — exits the attack")
print(" state. (Cramer & Borsboom's hysteresis in symptom networks: the")
print(" path out requires more than undoing the path in.)\n")
print("=" * 74)
print("IV. THE EXPOSURE MARGIN — the tolerance that prevents the attack")
print("=" * 74)
print()
print(" Interoceptive exposure works by habituation: the sensation level")
print(" the body can carry WITHOUT engaging the catastrophic appraisal")
print(" rises. Sweeping that tolerance against the same flutter:")
print()
margin = None
for alarm in [86, 88, 90, 92, 94, 96, 98]:
got, _ = attacked(build(alarm_at=float(alarm)))
print(f" tolerance {alarm}: {'ATTACK' if got else 'no attack'}")
if not got and margin is None:
margin = alarm
print(f"\n THE MARGIN: tolerance {margin} is enough — the flutter peaks at "
f"92, so the")
print(" therapy has a computable target: teach the body to carry 92")
print(" uninterpreted, and this trigger cannot reach the circle at all.")
print(" The prediction is quantitative and falsifiable per-person: the")
print(" margin is the flutter's peak, not a universal number.")
study()

Output:

==========================================================================
I. THE CIRCLE VS. THE SHRUG — same flutter, two priors
==========================================================================
the catastrophizer (alarm at 88): heart [20, 35, 46, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132]
-> ATTACK: True; terror fired 16 times
the shrug (no catastrophic prior): heart [20, 35, 46, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92]
-> attack: False; the same flutter, carried uninterpreted
==========================================================================
II. THE TIPPING FLUTTER — the smallest palpitation that panics
==========================================================================
flutter 1: passes
flutter 2: passes
flutter 3: passes
flutter 4: ATTACK
flutter 5: ATTACK
flutter 6: ATTACK
flutter 7: ATTACK
flutter 8: ATTACK
the threshold is SHARP: below flutter 4 nothing happens at all; at 4, the
full attack. Panic's all-or-nothing character is the signature of a system
with two attractors and a separatrix between them, not of a dial.
==========================================================================
III. HYSTERESIS — the attack outlives its trigger
==========================================================================
the flutter ends at 5s. The heart, after: [132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132]
The spiral is SELF-SUSTAINING: heart above the alarm keeps the
appraisal firing, which keeps the heart above the alarm. Two
stable states — rest and attack — and the flutter only chose
between them. The way back is not the way in:
with regulation arriving at 9s: heart [20, 35, 46, 132, 132, 132, 132, 132, 132, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68]
Removing the trigger did nothing; only a DOWN-driver — the
regulation the spiral itself cannot supply — exits the attack
state. (Cramer & Borsboom's hysteresis in symptom networks: the
path out requires more than undoing the path in.)
==========================================================================
IV. THE EXPOSURE MARGIN — the tolerance that prevents the attack
==========================================================================
Interoceptive exposure works by habituation: the sensation level
the body can carry WITHOUT engaging the catastrophic appraisal
rises. Sweeping that tolerance against the same flutter:
tolerance 86: ATTACK
tolerance 88: ATTACK
tolerance 90: ATTACK
tolerance 92: no attack
tolerance 94: no attack
tolerance 96: no attack
tolerance 98: no attack
THE MARGIN: tolerance 92 is enough — the flutter peaks at 92, so the
therapy has a computable target: teach the body to carry 92
uninterpreted, and this trigger cannot reach the circle at all.
The prediction is quantitative and falsifiable per-person: the
margin is the flutter's peak, not a universal number.

What the output means. I. The same small flutter is given to two priors. The catastrophizer’s heart rate locks at 132 and stays there, the attack, while a character with no catastrophic prior carries the identical flutter up to 92 and it settles, uninterpreted. Same input, two entirely different outcomes, because interpretation is what makes it a panic attack rather than a sensation.

II. The tipping flutter sweeps the trigger’s strength and finds panic’s signature: below strength 4, nothing happens at all. At 4, the full attack, immediately. There is no gradual mediation. The threshold is sharp, which the commentary reads as the signature of two attractors separated by a boundary, not a variable with a smooth response curve.

III. Hysteresis is the result that has no analogue anywhere else in this tutorial. The flutter ends at 5 seconds . The trigger is gone and the heart rate stays locked at 132 anyway, because the appraisal-arousal circle is now sustaining itself. High heart rate keeps the catastrophic appraisal firing, which keeps the heart rate high, with no external input required. Removing the trigger does nothing. Only an explicit down-driver, regulation arriving from outside the circle exits the attack state. The path out is not the reverse of the path in.

IV. The exposure margin turns this into a therapeutic prediction. As the body’s tolerance for unexplained sensation rises (interoceptive exposure’s mechanism), the same flutter stops triggering the circle once tolerance passes the flutter’s own peak (92). The margin is quantitative and falls out of the model, not a universal number. It is specific to how strong this person’s trigger is.

The insight. Bistability is a different kind of character claim than anything else in this tutorial. Not “how strongly does she feel this” but “which of two qualitatively different states is she in, and how far is the boundary.” It explains something ordinary accounts of emotion struggle with: why a panic attack can persist well after whatever triggered it is gone, why “just calm down” doesn’t work from inside the loop, and why exposure therapy’s target is a margin (a tolerance to build) rather than a feeling to suppress. A character written with this structure doesn’t have panic as a mood that rises and falls with the scene. They have a boundary they can cross, after which the scene’s content stops mattering.


5.6 The Strange Situation in full: construct validity turned on itself

The idea. Four children go through Ainsworth’s eight-episode protocol in this file, one after another, and a coder who never sees which attachment style was installed has to name all four correctly. Section 3.8 ran the Strange Situation once, on one child, to show what a single coded tape looks like. This study runs all four styles blind, the validity check that recovers them. There are two demonstrations: a child built from scratch with no style installed from a lookup table, and the felt-but-disowned split Section 3.3 first described, staked as a formal claim against the tape rather than told as a standalone story.

"""
the_strange_situation: the canonical probe, run whole, and turned on itself.
Ainsworth's Strange Situation is the most consequential standardized experiment
in the study of character: eight scripted episodes -- play, a stranger, two
separations, two reunions -- and a coding scheme that reads a child's whole
relational pattern from four behaviors in the two reunions. This simulation
runs the entire protocol on SOMA children and then makes the strongest claim a
model of the instrument can make:
I. four children, one script the same eight episodes produce four
textbook-distinct coded profiles
II. construct validity the classifier never sees the installed
style, only the behavior stream -- and
must recover all four (parameter recovery,
the identifiability standard)
III. the child nobody labeled a hand-built child, no style installed
from the table, classified honestly from
tape -- what the instrument is FOR
IV. what the tape can't show the avoidant child's narrated calm over a
racing heart, preregistered and checked
python3 examples/narrative/the_strange_situation.py
"""
from soma.narrative import (Story, trusting, anxious, stoic, guarded,
strange_situation, validate_instrument)
TEMPS = {"secure": trusting, "anxious": anxious,
"avoidant": stoic, "disorganized": guarded}
def child_with(style):
s = Story(f"ss_{style}", span="24s", step="1s",
about="separation distress in a standardized protocol")
child = s.character("Noa", temperament=TEMPS[style])
child.attaches(style, to="mother")
return s, child
def study():
print("=" * 74)
print("I. FOUR CHILDREN, ONE SCRIPT — the protocol codes them apart")
print("=" * 74)
for style in TEMPS:
s, c = child_with(style)
print()
print(f" [installed: {style} — the coder below never sees this]")
print(strange_situation(s, c).render())
print()
print("=" * 74)
print("II. CONSTRUCT VALIDITY — blind recovery of every installed style")
print("=" * 74)
results = validate_instrument(child_with)
print()
for style in TEMPS:
mark = "✓" if results[style] == style else "✗"
print(f" {mark} installed {style:<13s} -> classified {results[style]}")
print(f"\n INSTRUMENT {'VALID' if results['recovered'] else 'INVALID'}: "
f"{'all four styles recovered from behavior alone' if results['recovered'] else 'recovery failed'}")
print()
print("=" * 74)
print("III. THE CHILD NOBODY LABELED — classification as discovery")
print("=" * 74)
# a hand-built child: no style bundle. High-precision alarm, a hair-trigger
# protest, contact sought hard but never soothing -- built from raw verbs,
# the way an author actually works.
s = Story("ss_unlabeled", span="24s", step="1s",
about="separation distress in a standardized protocol")
kit = s.character("Kit", temperament=anxious)
kit.senses("mother_near", baseline=8.0)
kit.appraises("mother_near", as_threat=True, when="mother_near < 3",
drives="heart", to=122, fades_to=101, precision=0.97,
conviction=0.2, expects=8.0,
shows_on="protest_face", shows_value=9.0)
kit.feels("dread", from_body="heart", threshold=95.0)
kit.appraises("mother_near", when="mother_near * heart > 650",
shows_on="clings", shows_value=9.0, expects=8.0)
kit.appraises("mother_near", when="mother_near * heart > 700",
shows_on="protest_face", shows_value=8.0, expects=8.0)
kit._attachment = dict(style="?", figure="mother", near="mother_near",
resting=72.0, arousal_to=122.0)
rep = strange_situation(s, kit)
print()
print(rep.render())
print("\n (No table was consulted. The tape says who this child is: the")
print(" clinging that will not soothe — coded as the pattern it matches.)")
print()
print("=" * 74)
print("IV. WHAT THE TAPE CAN'T SHOW — preregistered, then checked")
print("=" * 74)
s, c = child_with("avoidant")
audit = s.preregister()
audit.expect_gap("Noa", at_least=0.4) # says calm...
audit.expect_peak("Noa", "heart", at_least=95) # ...over a racing heart
audit.expect_feeling("Noa", "dread")
# run the protocol timeline through the same story so the claims are
# checked against the actual Strange Situation, not an empty room
rep = strange_situation(s, c) # (installs the protocol wiring)
print()
print(" The avoidant child LOOKS calm on the tape. The instrument that")
print(" sees both registers — the narrated account and the body's own")
print(" record — was preregistered to find them split:")
print()
print(f" physiological arousal over displayed calm: "
f"{'PRESENT — confirmed' if rep.physio_over_display else 'absent — falsified'}"
f" (peak {rep.detail['peak']}, classified {rep.classification})")
print("\n (Sroufe & Waters 1977; Diamond et al. 2006: the A-pattern's")
print(" independence is a performance the heart never joins.)")
study()

Output:

==========================================================================
I. FOUR CHILDREN, ONE SCRIPT — the protocol codes them apart
==========================================================================
[installed: secure — the coder below never sees this]
STRANGE SITUATION — Noa, coded from the behavior stream alone:
first_reunion seek 6.4 maintain 6.4 avoid 1.6 resist 1.0
second_reunion seek 6.4 maintain 6.4 avoid 1.6 resist 1.0
disorganization index: absent | physiological arousal over displayed calm: absent | settles by the end: yes
-> CLASSIFICATION: SECURE
[installed: anxious — the coder below never sees this]
STRANGE SITUATION — Noa, coded from the behavior stream alone:
first_reunion seek 7.0 maintain 7.0 avoid 1.0 resist 6.3
second_reunion seek 7.0 maintain 7.0 avoid 1.0 resist 6.3
disorganization index: absent | physiological arousal over displayed calm: absent | settles by the end: NO
-> CLASSIFICATION: ANXIOUS
[installed: avoidant — the coder below never sees this]
STRANGE SITUATION — Noa, coded from the behavior stream alone:
first_reunion seek 1.7 maintain 1.7 avoid 6.3 resist 1.0
second_reunion seek 1.7 maintain 1.7 avoid 6.3 resist 1.0
disorganization index: absent | physiological arousal over displayed calm: PRESENT | settles by the end: yes
-> CLASSIFICATION: AVOIDANT
[installed: disorganized — the coder below never sees this]
STRANGE SITUATION — Noa, coded from the behavior stream alone:
first_reunion seek 4.3 maintain 4.3 avoid 3.7 resist 6.3
second_reunion seek 4.3 maintain 4.3 avoid 3.7 resist 6.3
disorganization index: PRESENT | physiological arousal over displayed calm: absent | settles by the end: NO
-> CLASSIFICATION: DISORGANIZED
==========================================================================
II. CONSTRUCT VALIDITY — blind recovery of every installed style
==========================================================================
✓ installed secure -> classified secure
✓ installed anxious -> classified anxious
✓ installed avoidant -> classified avoidant
✓ installed disorganized -> classified disorganized
INSTRUMENT VALID: all four styles recovered from behavior alone
==========================================================================
III. THE CHILD NOBODY LABELED — classification as discovery
==========================================================================
STRANGE SITUATION — Kit, coded from the behavior stream alone:
first_reunion seek 7.0 maintain 7.0 avoid 1.0 resist 6.3
second_reunion seek 7.0 maintain 7.0 avoid 1.0 resist 6.3
disorganization index: absent | physiological arousal over displayed calm: absent | settles by the end: NO
-> CLASSIFICATION: ANXIOUS
(No table was consulted. The tape says who this child is: the
clinging that will not soothe — coded as the pattern it matches.)
==========================================================================
IV. WHAT THE TAPE CAN'T SHOW — preregistered, then checked
==========================================================================
The avoidant child LOOKS calm on the tape. The instrument that
sees both registers — the narrated account and the body's own
record — was preregistered to find them split:
physiological arousal over displayed calm: PRESENT — confirmed (peak 115.0, classified avoidant)
(Sroufe & Waters 1977; Diamond et al. 2006: the A-pattern's
independence is a performance the heart never joins.)

What the output means. I. All four installed styles are coded from behavior in one pass. secure shows high seeking and low avoidance, settling by the end. anxious shows high resistance and does not settle. avoidant shows high avoidance and (the detail Section 3.3 flagged) physiological arousal present under a calm surface. disorganized is the only profile with its disorganization index present at all, and it does not settle either.

II. The blind classifier recovers all four installed styles from behavior alone, with no access to what was installed. The same validity result Section 3.8 showed, now stated as a table with all four rows visible together.

III. The child nobody labeled is the sharpest demonstration in the file. Kit is not built with attaches(style=...) from the temperament table at all. Kit is hand-built from raw appraisal verbs, with the attachment style explicitly marked unknown (style="?") at construction. When the coder returns ANXIOUS, this is discovery, not lookup. The same instrument that recovers an installed label in Part II can also assign one to a character who was never given one, which is the actual use case for a coding scheme in practice: no ground truth is available.

IV. The avoidant child’s split, narrated calm over measured physiological arousal, is preregistered specifically against the protocol (not a standalone story, as in Section 3.3) and confirmed. Peak heart rate 115, classified avoidant, arousal present despite displayed calm.

The insight. Knowing an instrument works is one thing. Knowing what it’s actually good for is another. Kit shows how to have one assigned to a character built without having any label in mind. The instrument doesn’t require you to decide the attachment style before you write the child. It can tell you afterward, from nothing but how the child behaves in one scene. That reverses the usual relationship between psychological theory and craft. Theory doesn’t have to precede the character, it can follow from one faithfully imagined.


5.7 Twelve seconds in a jury room: a deadline

The idea. Four jurors deliberate on identical evidence in this file, and what separates them is nothing about the case, only how each one’s mind accumulates it. Section 3.7 showed five decision temperaments and the speed-accuracy tradeoff from one boundary. This study stages the same drift-diffusion model as an actual jury deliberation and pushes one step further than Section 3.7 had room for: what happens to caution when a clock is added.

"""
twelve_seconds_in_a_jury_room: the drift-diffusion model, run as character.
Every other SOMA layer predicts what a character feels or becomes. This one
predicts something the others never touch and the lab measures to the
millisecond: HOW LONG a decision takes and HOW OFTEN it is wrong. The
drift-diffusion model (Ratcliff; Gold & Shadlen) is the dominant account of
speeded two-choice decisions -- a noisy accumulation of evidence to a boundary
-- and it makes distributional predictions no deterministic model can:
right-skewed reaction times, error responses shaped differently from correct
ones, and the speed-accuracy tradeoff traced from a single dial.
Four jurors face the same ambiguous evidence. What differs is how each decides.
I. four ways to decide the same evidence, four RT/accuracy
signatures -- caution, acuity, and bias, each
a different DDM parameter
II. the tell of a bias the prejudiced juror's correct verdicts come
fast and their errors come SLOW -- the
fingerprint of a mind that leaned before it
looked, which a symmetric model cannot show
III. the speed-accuracy dial one juror, told to hurry then to be sure:
the tradeoff traced from the boundary alone,
dissociating caution from ability
IV. the deadline a hung verdict clock: how accuracy collapses
as the time to decide is cut -- computed, and
a foreman's dilemma made quantitative
This is also where SOMA gains stochasticity: the accumulation is noisy but
seeded, so every distribution here is reproducible and the deterministic core
of every earlier layer is untouched.
python3 examples/narrative/twelve_seconds_in_a_jury_room.py
"""
from soma.narrative import Story, trusting, DECISION_STYLES
from soma.narrative.decision import DecisionStyle, predict_decision
NAMES = {"deliberate": "Halden the careful",
"impulsive": "Reine the quick",
"keen": "Ada the sharp-eyed",
"prejudiced": "Coll the sure"}
def study():
print("=" * 74)
print("I. FOUR WAYS TO DECIDE — same evidence, four signatures")
print("=" * 74)
print()
print(" juror accuracy RT (correct) RT (error) skew")
print(" " + "-" * 66)
for style, who in NAMES.items():
s = Story("jury", span="1s", step="1s", about="a verdict")
j = s.character("Juror", temperament=trusting)
s.decides(j, style=style)
r = s.predict_decision("Juror", trials=4000, seed=3)
print(f" {who:<20s} {r.accuracy:>6.0%} {r.mean_rt:>6.2f}s "
f"{r.mean_rt_error:>6.2f}s {r.skew:+.2f}")
print()
print(" Halden (wide boundary) is slow and right; Reine (narrow) is quick")
print(" and often wrong -- same evidence quality, opposite caution. Ada")
print(" (high drift: she simply sees more) is fast AND right, the one")
print(" combination caution alone can't buy. Every RT distribution leans")
print(" right, the DDM's fingerprint.")
print()
print("=" * 74)
print("II. THE TELL OF A BIAS — fast convictions, slow acquittals")
print("=" * 74)
s = Story("jury", span="1s", step="1s", about="a verdict")
j = s.character("Juror", temperament=trusting)
s.decides(j, style="prejudiced")
r = s.predict_decision("Juror", trials=6000, seed=3)
print(f"\n Coll starts already leaning toward 'guilty'. When the evidence")
print(f" agrees, the verdict comes fast: {r.mean_rt:.2f}s. When the")
print(f" evidence points the other way, the walk has to climb all the way")
print(f" back across the room, and the RARE correct acquittal is SLOW:")
print(f" {r.mean_rt_error:.2f}s — {r.mean_rt_error - r.mean_rt:+.2f}s slower.")
print(f"\n That asymmetry — fast one way, slow the other — is the")
print(f" fingerprint of a prior. A juror without one shows no such gap; a")
print(f" symmetric model cannot produce it at all. The bias is legible in")
print(f" the TIMING even when the verdict is correct.")
print()
print("=" * 74)
print("III. THE SPEED-ACCURACY DIAL — hurry, then be sure")
print("=" * 74)
s = Story("jury", span="1s", step="1s", about="a verdict")
j = s.character("Juror", temperament=trusting)
s.decides(j, drift=0.13, boundary=1.0)
sat = s.speed_accuracy("Juror", boundaries=[0.5, 0.8, 1.1, 1.5, 2.0],
trials=4000, seed=3)
print()
print(sat.render())
print()
print(" One juror, one evidence quality, five instructions from the")
print(" foreman — from 'we haven't got all day' to 'be certain'. The")
print(" tradeoff is smooth and monotone, and it dissociates two things")
print(" ordinary language conflates: this is the SAME juror being more")
print(" careful, not a better one. Only the boundary moved.")
print()
print("=" * 74)
print("IV. THE DEADLINE — how accuracy collapses under the clock")
print("=" * 74)
print("\n The judge imposes a deadline: decide within T, or it's a mistrial.")
print(" We read accuracy AMONG the verdicts actually returned in time,")
print(" for a careful juror (wide boundary) as the clock tightens:\n")
base = DecisionStyle(drift=0.12, boundary=1.6, start_bias=0.5,
nondecision=0.2)
s = Story("jury", span="1s", step="1s", about="a verdict")
j = s.character("Juror", temperament=trusting)
s.decides(j, drift=0.12, boundary=1.6)
full = s.predict_decision("Juror", trials=6000, seed=3)
import random
print(" deadline verdicts returned accuracy of those")
for deadline in [1.0, 1.5, 2.0, 3.0, 5.0, 99.0]:
# re-run the raw walks, censoring at the deadline
rng = random.Random(3)
from soma.narrative.decision import _one_trial
st = base
n_in, n_corr = 0, 0
for _ in range(6000):
ok, rt = _one_trial(st, rng)
if ok is not None and rt <= deadline:
n_in += 1
n_corr += (ok is True)
acc = n_corr / n_in if n_in else 0.0
pct = n_in / 6000
label = "none" if deadline == 99.0 else f"{deadline:.1f}s"
print(f" {label:<9s} {pct:>6.0%} {acc:>5.0%}")
print()
print(" A tight deadline doesn't just lose the slow deciders — it")
print(" systematically keeps the EASY verdicts (which finish first) and")
print(" discards the hard ones, so the returned verdicts look accurate")
print(" while the hard cases go undecided. The foreman's real dilemma,")
print(" made quantitative: haste doesn't lower accuracy evenly, it hides")
print(" the cases that most needed the time.")
study()

Output:

==========================================================================
I. FOUR WAYS TO DECIDE — same evidence, four signatures
==========================================================================
juror accuracy RT (correct) RT (error) skew
------------------------------------------------------------------
Halden the careful 86% 3.40s 3.45s +0.68
Reine the quick 66% 0.93s 0.94s +2.31
Ada the sharp-eyed 92% 1.78s 1.76s +1.60
Coll the sure 86% 1.61s 2.65s +1.78
Halden (wide boundary) is slow and right; Reine (narrow) is quick
and often wrong -- same evidence quality, opposite caution. Ada
(high drift: she simply sees more) is fast AND right, the one
combination caution alone can't buy. Every RT distribution leans
right, the DDM's fingerprint.
==========================================================================
II. THE TELL OF A BIAS — fast convictions, slow acquittals
==========================================================================
Coll starts already leaning toward 'guilty'. When the evidence
agrees, the verdict comes fast: 1.60s. When the
evidence points the other way, the walk has to climb all the way
back across the room, and the RARE correct acquittal is SLOW:
2.73s — +1.14s slower.
That asymmetry — fast one way, slow the other — is the
fingerprint of a prior. A juror without one shows no such gap; a
symmetric model cannot produce it at all. The bias is legible in
the TIMING even when the verdict is correct.
==========================================================================
III. THE SPEED-ACCURACY DIAL — hurry, then be sure
==========================================================================
SPEED-ACCURACY TRADEOFF — Juror, boundary swept (drift held fixed):
boundary accuracy mean RT
0.50 64% 0.84s
0.80 71% 1.63s
1.10 77% 2.49s
1.50 84% 3.44s
2.00 90% 4.24s
✓ CONFIRMED: wider boundary raises accuracy (more evidence, fewer errors) — ['64%', '71%', '77%', '84%', '90%']
✓ CONFIRMED: wider boundary lengthens RT (more evidence takes longer) — ['0.84', '1.63', '2.49', '3.44', '4.24']
One juror, one evidence quality, five instructions from the
foreman — from 'we haven't got all day' to 'be certain'. The
tradeoff is smooth and monotone, and it dissociates two things
ordinary language conflates: this is the SAME juror being more
careful, not a better one. Only the boundary moved.
==========================================================================
IV. THE DEADLINE — how accuracy collapses under the clock
==========================================================================
The judge imposes a deadline: decide within T, or it's a mistrial.
We read accuracy AMONG the verdicts actually returned in time,
for a careful juror (wide boundary) as the clock tightens:
deadline verdicts returned accuracy of those
1.0s 2% 88%
1.5s 10% 85%
2.0s 19% 84%
3.0s 38% 84%
5.0s 64% 84%
none 85% 84%
A tight deadline doesn't just lose the slow deciders — it
systematically keeps the EASY verdicts (which finish first) and
discards the hard ones, so the returned verdicts look accurate
while the hard cases go undecided. The foreman's real dilemma,
made quantitative: haste doesn't lower accuracy evenly, it hides
the cases that most needed the time.

What the output means. I. Four jurors face identical evidence and differ only in DDM parameters, giving four distinct signatures: careful (wide boundary: slow, accurate), quick (narrow boundary: fast, error-prone), sharp-eyed (high drift: fast and accurate, better evidence quality, the one combination caution alone can’t buy), and a fourth, biased juror held for Part II.

II. The tell of a bias isolates what Section 3.7 only touched on. A juror who starts already leaning toward “guilty” reaches that verdict fast when the evidence agrees, but a correct acquittal: evidence overturning the lean, takes over a second longer, because the accumulating evidence has to climb back across the whole width of the initial bias before it can reach the opposite boundary. The asymmetry is specifically in the timing of correct answers, which is a signature a model without a starting bias cannot produce at all.

III. The speed-accuracy tradeoff is traced again with a finer sweep (five boundary settings here instead of four) and framed as five foreman instructions, from “we haven’t got all day” to “be certain”, the same underlying tradeoff Section 3.7 showed.

IV. The deadline is new. Instead of asking how accuracy changes as caution changes, it asks what happens to a fixed, careful juror when a clock is added. In this simulation, as the deadline tightens from unlimited down to 1 second, the fraction of verdicts returned in time collapses from 85% to 2%. But the accuracy of the verdicts that do get returned barely moves (84% to 88%). A tight deadline doesn’t make the jury wrong more often. It makes the jury silent on the hard cases and confident on the easy ones, while looking, from the verdicts alone, just as reliable as ever. You decide whether is this a failure of the model used here.

The insight. This is a case where the composed study finds something neither component would show alone. A naive read of “the deadline doesn’t hurt accuracy much” would be reassuring. The actual finding is that the jury isn’t getting better at hard cases under time pressure. It’s failing to return a verdict on them at all, and the accuracy number is silently computed only over the easy cases that happened to finish first. The reassuring statistic (“we’re just as accurate as ever”) and the buried truth it’s quietly excluding (“we simply stopped ruling on the hard ones”) are the same event.


5.8 What the body learns: two theories of learning, side by side

The idea. Conditioning and learned helplessness meet in one study, run back to back rather than in Sections 3.5 and 3.6’s separate treatments. The point of putting them together is not new results. Every finding below is one you’ve already seen, but the family resemblance that only becomes visible side by side. Both are prediction-error machines built on the same loop, and the question this study actually asks is what changes when the identical primitive is pointed at two different things.

"""
what_the_body_learns: two theories of learning, run as predictive simulations.
The reward prediction error and learned helplessness are, between them, the most
quantitatively validated predictive models of how creatures learn from
consequence. Both are prediction machines; both fall straight out of SOMA's
loop, whose error term IS a prediction error. This file runs each as a staked,
falsifiable simulation, and in each case leads with the SIGNATURE prediction --
the one a simpler account cannot make.
I. the dopamine curve acquisition, extinction, and the reward
prediction error shrinking to zero as the
reward becomes predicted (Schultz's neurons)
II. spontaneous recovery the prediction single-trace Rescorla-Wagner
CANNOT make: after a rest, the conditioned
response returns -- extinction was new
learning over an intact trace, not erasure
III. the triadic design uncontrollable adversity produces a deficit
that controllable adversity does not
IV. the transfer asymmetry the reformulation's sharpest claim: a GLOBAL
explanatory style carries helplessness into
an unrelated situation; a SPECIFIC style
confines it to situations like the first
python3 examples/narrative/what_the_body_learns.py
"""
from soma.narrative import Story, trusting, hollowed
from soma.narrative.helplessness import triadic_design
def conditioning_study():
print("=" * 74)
print("I & II. THE DOPAMINE CURVE, AND SPONTANEOUS RECOVERY")
print("=" * 74)
s = Story("pavlov", span="10s", step="1s", about="conditioning")
rat = s.character("Bell", temperament=trusting)
s.conditions(rat, cs="tone", us="food")
rep = s.predict_conditioning("Bell", acquire=10, extinguish=12,
rest=10, reacquire=6)
print()
print(rep.render())
print()
print(" The value climbs as the tone comes to predict food; the reward")
print(" prediction error — the dopamine signal — is largest at the first")
print(" unpredicted reward and falls toward zero as the prediction")
print(" improves. Extinction drives the value down. Then a REST, with no")
print(" tone and no food, and the response RETURNS on its own: the proof")
print(" that extinction never erased the original — it layered a new,")
print(" fragile 'not anymore' over a trace that outlasts it. A single")
print(" value could not do this; two traces can. (Pavlov 1927; Bouton.)")
def helplessness_study():
print()
print("=" * 74)
print("III & IV. THE TRIADIC DESIGN AND THE TRANSFER ASYMMETRY")
print("=" * 74)
def builder(style):
s = Story(f"hlp_{style}", span="10s", step="1s",
about="learned helplessness")
subj = s.character("Ash",
temperament=hollowed if style == "global" else trusting)
s.learns_control(subj, style=style)
return s, subj
td = triadic_design(builder)
print()
print(" The full triadic design — three pretreatments x two explanatory")
print(" styles x similar/dissimilar novel task — coded for the")
print(" helplessness deficit:")
print()
print(" style pretreatment novel task outcome")
print(" " + "-" * 60)
for (style, pre, sim), deficit in sorted(td["rows"].items()):
simstr = "similar" if sim else "dissimilar"
out = "DEFICIT" if deficit else "copes"
print(f" {style:<9s} {pre:<15s} {simstr:<11s} {out}")
print()
print(" Read the uncontrollable rows: the deficit appears ONLY after")
print(" uncontrollable adversity (controllable and none immunize), and")
print(" its reach is set by explanatory style. GLOBAL ('I ruin")
print(" everything') carries the helplessness into a wholly unrelated")
print(" task; SPECIFIC ('I couldn't do that one thing') confines it to")
print(" situations like the first.")
print()
print(f" reformulation's full pattern reproduced: {td['all_confirmed']}")
print(f" transfer asymmetry (global transfers, specific does not): "
f"{td['transfer_signature']}")
print()
print(" Two people, the same defeat, different futures — and the dividing")
print(" line is not the event but the sentence each says about it. That")
print(" is the reformulation's whole claim, and here it is mechanism:")
print(" a global style is one control-belief shared across every task; a")
print(" specific style keeps a separate belief per task, so a dissimilar")
print(" task starts fresh. The scope of the belief IS the explanatory")
print(" style. (Abramson, Seligman & Teasdale 1978; Alloy et al. 1984.)")
conditioning_study()
helplessness_study()

Output:

==========================================================================
I & II. THE DOPAMINE CURVE, AND SPONTANEOUS RECOVERY
==========================================================================
CONDITIONING — Bell: tone → food (value = acquired + context trace)
acquisition ▁▁▅▇██████ [0.0 → 7.5]
extinction ██▃▂▁▁▁▁▁▁▁▁ [7.5 → 0.5]
rest ▂▃▄▅▆▆▇▇▇█ [1.7 → 6.5]
reacquisition ▁▁▅▇██ [0.5 → 7.5]
peak RPE (unpredicted reward): +7.20; once predicted it falls toward 0 — dopamine's signature
✓ CONFIRMED: acquisition: value climbs to near the reward — peaked at 7.5
✓ CONFIRMED: the RPE shrinks as reward becomes predicted (dopamine's signature) — 3.60 → 0.46
✓ CONFIRMED: extinction: the conditioned value falls — 7.5 → 0.5
✓ CONFIRMED: SPONTANEOUS RECOVERY: after rest the value returns (extinction was new learning, not erasure) — 0.5 → 6.5 after rest
✓ CONFIRMED: savings: relearning starts from the intact trace and is no slower — 5 vs 4 beats; starts 0.5 vs 0.0
The value climbs as the tone comes to predict food; the reward
prediction error — the dopamine signal — is largest at the first
unpredicted reward and falls toward zero as the prediction
improves. Extinction drives the value down. Then a REST, with no
tone and no food, and the response RETURNS on its own: the proof
that extinction never erased the original — it layered a new,
fragile 'not anymore' over a trace that outlasts it. A single
value could not do this; two traces can. (Pavlov 1927; Bouton.)
==========================================================================
III & IV. THE TRIADIC DESIGN AND THE TRANSFER ASYMMETRY
==========================================================================
The full triadic design — three pretreatments x two explanatory
styles x similar/dissimilar novel task — coded for the
helplessness deficit:
style pretreatment novel task outcome
------------------------------------------------------------
global controllable dissimilar copes
global controllable similar copes
global none dissimilar copes
global none similar copes
global uncontrollable dissimilar DEFICIT
global uncontrollable similar DEFICIT
specific controllable dissimilar copes
specific controllable similar copes
specific none dissimilar copes
specific none similar copes
specific uncontrollable dissimilar copes
specific uncontrollable similar DEFICIT
Read the uncontrollable rows: the deficit appears ONLY after
uncontrollable adversity (controllable and none immunize), and
its reach is set by explanatory style. GLOBAL ('I ruin
everything') carries the helplessness into a wholly unrelated
task; SPECIFIC ('I couldn't do that one thing') confines it to
situations like the first.
reformulation's full pattern reproduced: True
transfer asymmetry (global transfers, specific does not): True
Two people, the same defeat, different futures — and the dividing
line is not the event but the sentence each says about it. That
is the reformulation's whole claim, and here it is mechanism:
a global style is one control-belief shared across every task; a
specific style keeps a separate belief per task, so a dissimilar
task starts fresh. The scope of the belief IS the explanatory
style. (Abramson, Seligman & Teasdale 1978; Alloy et al. 1984.)

What the output means. Part I & II reproduce Section 3.5’s conditioning study exactly, the same dopamine signature in the shrinking reward-prediction error (peak +7.20, falling toward 0.46), and the same spontaneous recovery after rest (0.5 → 6.5 with no tone and no food in between). What’s worth noticing is that this is a sensory prediction. The loop’s sense: channel is the tone, and the error it computes is the gap between the tone’s predicted and actual consequence.

Part III & IV reproduce Section 3.6’s full triadic design and the transfer asymmetry: a deficit only after uncontrollable adversity, and only a global explanatory style carrying it into an unrelated task. Here the same loop’s error is computing something different. Not whether a sensory cue predicts an outcome, but whether an action does. The agency channel from Section 3.6 stands in for that belief, and the same value-loop machinery that learned “tone predicts food” in Part I now learns “my actions predict relief” or “they don’t.”

Put the two side by side and the file’s own framing becomes literal: “both fall straight out of SOMA’s loop, whose error term IS a prediction error.” conditioning_study() and helplessness_study() are peer functions, called one after the other, each wiring the identical loop primitive to a different question. Conditioning is what that loop does when the world is learnable. helplessness is what it does when the world stops answering. The character’s belief about why determines how far the resulting deficit reaches.

The insight. A mind updates on the gap between what it expected and what it got: seven words that, attached to two different channels, produce two of psychology’s most quantitatively validated and least alike-looking theories. Seeing them side by side, sharing an author’s framing rather than each getting its own isolated section, is itself a small piece of evidence for the loop’s generality. The same primitive that explains a dog salivating to a bell also explains why one person’s defeat stays contained and another’s spreads to everything they touch. A single mechanism, two very different-looking outcomes, depending only on what the error signal is attached to and how far its consequences are allowed to travel.

Part 6: Putting it together

Each simulation in Parts 3 and 4 is a self-contained lens. Part 5 showed that they compose. A single character can carry an attachment style, a defended belief with a tipping point, a decision temperament, and a preregistered forecast. The insight tools (sensitivity, counterfactual) can then interrogate any outcome that results, exactly as the Part 5 studies just did. The narrative-only examples that also ship with SOMA (the_negotiator, two_sisters, the_diplomat, in the SOMA-mode example rail) build the same kind of many-layered person without the prediction/insight machinery turned on them. The pressure at which a composed professional’s honesty becomes a lie, the resentment a sister hides behind grace, the longing a diplomat defends against and never acts on.

The common shape of every prediction

Look back and you will see one shape repeated:

  1. Build a character in the vocabulary of feelings, beliefs, relationships.
  2. Stake a forecast: a specific, falsifiable claim about what they will do.
  3. Run them forward; the Chronicle records what the body actually did.
  4. Check the forecast against the Chronicle.
  5. Interrogate the result: which trait drove it, what would have flipped it.

Why this yields insight

A novel’s deepest claims are causal and counterfactual: this person feels this because she read the situation that way; the marriage failed because each cut was answered in kind. He would have survived if he had been a little less sure. These are the kinds of claims the library makes checkable. The simulations do not replace a writer’s judgment. They externalize the mechanism beneath an intuition, so you can compose feelings from situations: the gap between what a person says and what is true is where most of fiction lives.

Where to go next

  • Try modifying any example above in the Library editor: change a temperament, a threshold, a couple type, and re-run.
  • Use story.source() on anything you build, copy the SOMA into SOMA mode, and inspect or perturb it directly.
  • The eight capstone examples in the Library rail (Part 5) are the full, unedited command-line studies. Run any of them directly with python3 examples/narrative/<name>.py for output at full terminal width, or keep editing them in the browser.
  • The SOMA-mode rail’s narrative-only examples (the_negotiator and the others) build equally layered characters without the prediction/insight tools turned on them. Read those for the craft, then bring what Part 5 taught to bear on them yourself.

Note: These are instruments for thinking precisely about imagined people. The idea is for precision to lead to insight.

My hope from LLMs

The number one benefit I’m hoping for from LLMs is that they will get humans to de-LLM-ize themselves. Humans have always behaved the way LLMs do, saying long strings of words while not knowing what they are talking about. LLMs are better at this than humans (and that’s all they can do). I hope this will make humans better at recognizing this as mechanical behavior and strive to reach their potential.

Mind-Body Loop as Computation

This tutorial teaches you to read, run, and write mind-body loop simulations.

Each mind-body loop is simulated as a self-rewriting program that computes by editing itself. The source starts as a problem. Each run rewrites it closer to the answer. When the answer is reached there is nothing left to rewrite.

The tutorial goes from the simplest possible loop to two-agent models. You can run real code from a shell as you go.

What this models (and what it doesn’t)

The “mind–body loop” is the idea that the body produces a mind and the mind simultaneously acts back on the body, a circle of reciprocal causation that also refers to itself. Palimpsest is a rewriting language whose native subject is self-reference, so it is a natural place to make that loop executable and watch what it does.

These programs model the form of the loop: reciprocal causation, feedback, self-modification, noise, as a small dynamical system. They do not model experience. When a run “settles,” that is a self-consistent state, not a feeling. Nothing here touches the question of why there is something.

This is study of the loop’s form is coarse. The dynamics are integer, deterministic (even the noise is a pure hash), and low-dimensional, whereas the real loop is continuous, genuinely stochastic and embodied. The tool shows a self-referential, self-modifying structure that is explicit and runnable. This lets you ask precise questions: when a loop has a stable self, when it must oscillate, when it runs away, and how the answer changes with an interaction sign, a gain, or a little noise. Read it alongside the real frameworks it gestures at (Hofstadter’s strange loops, autopoiesis, predictive processing), not as a replacement for them.

Instead of a claim about experience, the tool lets you model various interactions. The tangibility of the calculations reminds you of combinations that are possible in the real world which you might have forgotten or are having difficulty imagining.

The idea in one picture

Time advances in discrete ticks. At each tick the system is in a state. A single rule, step, reads the state (the body “senses”) and returns the next state (the mind “acts”). Repeating step traces a trajectory, and the shape of that trajectory is the interesting thing. A loop can:

  • settle to a fixed point it reproduces forever (a stable “self”);
  • fall into a limit cycle and oscillate forever;
  • run away and escalate without bound;
  • stay bounded. Never settle exactly, but never escape either. This is the case for noisy and orbiting systems.

The engine runs the loop, classifies which of these happened, and draws a text graph of the trajectory.


1. Running your first simulation

Install the Rust toolchain. You need to build the interpreter once:

git clone https://github.com/thoriumrobot/palimpsest
cd palimpsest
cargo build --release

That produces ./target/release/palimpsest. Now run the simplest environment. Run it from the project root so the import lines resolve:

./target/release/palimpsest examples/mind-homeostasis.pal

You will see a header (program, mode, fuel, capabilities), then a display: section with a graph, then the output:

mind-body loop
9 |#
6 |####
4 |###########
1 |###########
+------------> time
trend ▆▅▄▄▃▂▂▂▂▂▂
=> SETTLED to a self-consistent fixed point:
==== arousal 4 calm

Read the graph as a column chart. The vertical axis is arousal, time runs left to right, and each column is filled up to that tick’s value. Arousal starts at 9 and falls to 4, where it stays a settled loop. The trend line is the same series as a compact sparkline.

A quirk you should know about. These example files rewrite themselves. The first run prints status : WROTE. The program computed its trajectory and wrote the result back into its own source (this is a self-rewriting quine. See §7). Run the same file again and you will see status : FIXED POINT … This is a quine, and the same graph. Re-running is harmless. You always get the graph. You can run any example as many times as you like. When you want to experiment, though, don’t edit the shipped examples. Write your own file (§4), which will not rewrite itself.


2. Reading the output

Every run prints a graph and then a output. It is worth learning to read them. The rendering is a small library, lib/chart.pal, and across the tutorial you will meet four kinds of graph:

  • a column chart (colplot) for single-variable runs: value on the vertical axis, time running left to right, each column filled up to that tick’s value, as in the homeostasis run above;
  • a sparkline (spark) the one-line trend printed under every column chart;
  • an overlay (overlay) for the two-variable models, drawing two curves on one chart (o for the first, x for the second, * where they meet) so you can watch them converge or diverge;
  • a histogram (histogram) of the value distribution, added automatically for BOUNDED runs, where how often the system sits at each level is the point.

The output line names the attractor: SETTLED, LIMIT CYCLE, RUNAWAY, or BOUNDED. When it settles, shows the fixed-point state. That is the whole vocabulary. The rest of the tutorial is worked examples.


3. The tool

3.1 The language

A Palimpsest program is made of terms, rules, and strategies.

Terms are S-expressions: atoms (foo, 42, "a string") and parenthesized lists ((pair a b), (list 1 2 3)).

Rules rewrite one term into another. A rule has a name, a left-hand pattern and a right-hand replacement:

rule not-t : (not true) => false
rule not-f : (not false) => true

Patterns contain variables: ?x matches one term and ?xs... matches a whole sequence of terms. This is used to write recursion over lists:

rule rev-0 : (reverse (list)) => (list)
rule rev-n : (reverse (list ?x ?xs...)) => (append (reverse (list ?xs...)) ?x)
rule append : (append (list ?ys...) ?z) => (list ?ys... ?z)

Strategies decide where and how often to apply rules. The default one is “keep applying rules and built-in operations anywhere until nothing changes,” which is called solve:

strategy solve = outermost(prim + rules)

Here:

  • rules means “any of my rules”
  • prim means “any built-in operation” (+, *, <, cat, and so on). See Part 3.
  • The + between them means “try the first, else the second”.
  • outermost(...) means “repeat to a fixed point, outermost position first.”

The command show TERM with STRATEGY normalizes a term and prints it:

show (not true) with solve ==> false
show (+ 21 21) with prim ==> 42
show (reverse (list a b c d)) with solve ==> (list d c b a)

Rules can also carry a guard, a where condition that must hold for the rule to fire. This “keep only the elements greater than 2” filter uses two guarded rules that split on the comparison:

rule big-keep : (only-big (list ?x ?xs...)) => (cons ?x (only-big (list ?xs...))) where (> ?x 2)
rule big-drop : (only-big (list ?x ?xs...)) => (only-big (list ?xs...)) where (<= ?x 2)
rule big-0 : (only-big (list)) => (list)
show (only-big (list 1 5 2 8 3)) with solve ==> (list 5 8 3)

3.2 Anatomy of an environment

Open examples/mind-homeostasis.pal. Ignoring the header directives, the body is:

import "../lib/mindbody.pal"
rule step : (step (being ?a ?any)) => (being ?na (feel-of ?na)) where ?na <- (toward ?a 4)
rule feel-of : (feel-of ?a) => calm where (<= ?a 4)
rule feel-of2 : (feel-of ?a) => tense where (> ?a 4)
strategy solve = outermost(prim + rules)
main = (trace (being 9 tense) 10)
rewrite self with solve
display (loop-view main) with solve

Piece by piece:

  • The state. A single body is written (being AROUSAL TAG): an integer arousal and a “tag” term describing the mind (here a mood symbol like calm).
  • step. The one rule that advances time. It reads (step STATE) and returns the next state. Here it moves arousal one unit toward the set-point 4 and reads off a mood. The where ?na <- (toward ?a 4) binding computes the new arousal once and reuses it.
  • main = (trace INIT N). trace runs the loop for N ticks from INIT, producing N+1 states (the initial state plus N steps), and classifies the attractor.
  • display (loop-view main). loop-view turns the trajectory into the graph you saw.

The engine (lib/mindbody.pal) gives you a few helpers to write step with:

  • (toward a s) move a one unit toward s (proportional regulation);
  • (clamp x lo hi) keep x within [lo, hi];
  • (mix a b pct) move a a fraction pct/100 of the way toward b;

plus the ordinary primitives (+ - * / mod, comparisons, abs, min, max, and rng for noise). You never write the classifier or the graphing code. You only write step and choose INIT and N.


4. Writing and running your own loop

The cleanest way to experiment is your own file that does not rewrite itself, so running it never changes it. Create examples/myloop.pal:

#lang palimpsest
#fuel 5000000
import "../lib/mindbody.pal"
rule step : (step (being ?a ?tag)) => (being (toward ?a 5) calm)
strategy solve = outermost(prim + rules)
main = (trace (being 10 tense) 12)
display (loop-view main) with solve

Run it from the project root:

./target/release/palimpsest examples/myloop.pal
mind-body loop
10 |#
6 |#####
5 |#############
1 |#############
+--------------> time
trend ▆▆▅▄▄▃▃▃▃▃▃▃▃
=> SETTLED to a self-consistent fixed point:

Putting the file in examples/ matters only because of the import path "../lib/mindbody.pal". It is written relative to the file’s own directory. A file in examples/ finds the library in lib/. Keep that line and you can run from the project root with no environment variables. From here, change the set-point (the 5), the starting arousal, or N, re-run, and watch the graph change. Everything below is a variation on this one file.

The chart tools are not tied to the loop engine. You can call them on any (series ...) of your own. For instance, a bare sparkline:

printf '#lang palimpsest\nimport "lib/chart.pal"\nstrategy s = outermost(prim+rules)\nmain = (x)\nshow (spark (series 1 4 9 4 1) 10) with s\n' > /tmp/spark.pal
./target/release/palimpsest /tmp/spark.pal

(show prints a term’s reduced value; note that from a file outside examples/ the import path is "lib/chart.pal".)


5. Simulations

Each environment differs only in its step rule (and its state shape). Run any of them the same way:

./target/release/palimpsest examples/<name>.pal

5.1 Homeostasis: a stable self (mind-homeostasis.pal)

The mind senses arousal and nudges the body one step toward a set-point. Gentle negative feedback converges and holds. This is the fixed point.

rule step : (step (being ?a ?any)) => (being ?na (feel-of ?na)) where ?na <- (toward ?a 4)
rule feel-of : (feel-of ?a) => calm where (<= ?a 4)
rule feel-of2 : (feel-of ?a) => tense where (> ?a 4)
main = (trace (being 9 tense) 10)

Output: SETTLED at arousal 4. This is your reference point. Every other outcome is a departure from it.

5.2 Limit cycle: perpetual oscillation (mind-cycle.pal)

Give the mind two modes with a switching delay (hysteresis). Let arousal rise until it feels too tense, then drive it down until it feels too flat, then flip again. It never settles.

rule step-rise-go : (step (being ?a rise)) => (being (+ ?a 2) rise) where (< ?a 8)
rule step-rise-flip : (step (being ?a rise)) => (being (- ?a 2) fall) where (>= ?a 8)
rule step-fall-go : (step (being ?a fall)) => (being (- ?a 2) fall) where (> ?a 2)
rule step-fall-flip : (step (being ?a fall)) => (being (+ ?a 2) rise) where (<= ?a 2)
main = (trace (being 2 rise) 14)
   8 |   #     #
   6 |  ###   ###   #
   4 | ##### ##### ##
   2 |###############
     +----------------> time
  trend ▁▂▄▅▄▂▁▂▄▅▄▂▁▂▄
  => LIMIT CYCLE: never settles; oscillates with period 6 steps

The engine measures the period by finding where the last state first recurs.

5.3 Runaway: a dysregulation spiral (mind-runaway.pal)

Flipping the feedback sign, fear drives arousal up, and high arousal feeds fear. Each reinforces the other and both escalate. The tag now carries a number ((fear F)), which is how the mind’s state accumulates.

rule step : (step (being ?a (fear ?f))) => (being (+ ?a ?f) (fear (nfear ?a ?f)))
rule nfear-up : (nfear ?a ?f) => (+ ?f 1) where (>= ?a 4)
rule nfear-same : (nfear ?a ?f) => ?f where (< ?a 4)
main = (trace (being 2 (fear 1)) 9)
  12 |      ####
   8 |     #####
   4 |  ########
   1 |##########
     +-----------> time
  trend ▁▂▂▃▄▆████
  => RUNAWAY: no fixed point; the loop escalates without bound

Arousal climbs off the top of the chart. (Note: Values above the height clip to the top row.) The engine calls it RUNAWAY because arousal goes past a divergence bound.

5.4 The strange loop: the mind rewrites its own law (mind-strange-loop.pal)

Here the being carries its own regulation policy (its set-point) inside its state as (goal G). While arousal differs from the goal the mind regulates toward it. Each time it reaches the goal, the mind lowers the goal, re-opening the gap. The process edits the law that produces it, descending a staircase until it hits a floor.

rule step-regulate : (step (being ?a (goal ?g))) => (being (toward ?a ?g) (goal ?g)) where (<> ?a ?g)
rule step-lower : (step (being ?a (goal ?g))) => (being ?a (goal (- ?g 1))) where (= ?a ?g), (> ?g 2)
rule step-floor : (step (being ?a (goal ?g))) => (being ?a (goal ?g)) where (= ?a ?g), (<= ?g 2)
main = (trace (being 6 (goal 6)) 11)
   6 |##
   4 |######
   2 |############
     +-------------> time
  trend ▄▄▃▃▂▂▂▂▁▁▁▁
  => SETTLED to a self-consistent fixed point:
       ==  arousal 2   (goal 2)

The mind editing an entire rule table stored as data is implemented in examples/self-turing.pal.

5.5 Saturating control: the will overwhelmed (mind-saturating.pal)

The body has a constant upward load. The mind corrects toward a set-point but its effort saturates at ±1, a bounded will. This introduces clamp and abs. A bounded controller cannot overcome a larger steady load, so arousal climbs one step at a time and pins against the ceiling. abs reports the growing distress in the tag.

rule step : (step (being ?a (ctl ?d))) => (being ?na (ctl ?nd))
where ?eff <- (clamp (- 4 ?a) -1 1),
?na <- (clamp (+ (+ ?a 2) ?eff) 0 12),
?nd <- (abs (- 4 ?na))
main = (trace (being 0 (ctl 4)) 10)
  12 |        ###
   8 |    #######
   4 |  #########
   1 | ##########
     +------------> time
  trend ▁▂▄▄▅▆▆▇███
  => SETTLED to a self-consistent fixed point:
       ============  arousal 12   (ctl 8)

It settles at the ceiling, not the goal. A stable self is not the self the mind wanted.

5.6 Noisy homeostasis: a stable band (mind-noisy.pal)

Add randomness. rng is a deterministic hash of a seed carried in the state. The run is reproducible and still a quine, but the sequence looks random. Homeostasis plus a small ±2 perturbation never settles exactly but stays in a band. The output is BOUNDED, and the engine adds a distribution histogram because that is where “how often” matters.

rule step : (step (being ?a (mood ?lab ?s))) => (being ?na (mood (mood-of ?na) ?ns))
where ?ns <- (rng ?s),
?noise <- (- (mod ?ns 5) 2),
?na <- (clamp (+ (toward ?a 5) ?noise) 0 10)
rule mood-of-lo : (mood-of ?a) => calm where (<= ?a 5)
rule mood-of-hi : (mood-of ?a) => edgy where (> ?a 5)
main = (trace (being 9 (mood edgy 12345)) 14)
   9 |#  #
   6 |###### # ### ##
   4 |###############
   1 |###############
     +----------------> time
  trend ▆▅▅▆▄▄▂▄▃▄▅▄▃▄▄
  distribution (how often at each arousal):
   5 | ## 2
   6 | ##### 5
   7 | ## 2
   8 | ### 3
  => BOUNDED: never settles exactly, but stays in a stable region (noisy / orbiting)

The seed is carried in the tag but hidden from the display. Change the starting seed (12345) and you get a different, equally reproducible run.

5.7 Bistable + noise: metastable switching (mind-bistable.pal)

Two stable moods: low (~2) and high (~8), separated by a barrier at 5. The mind pulls toward the nearer attractor, but random kicks occasionally shove arousal across the barrier. The system dwells near one mood and then jumps to the other. This is the richest single-variable environment. The histogram makes the two clusters visible.

rule step : (step (being ?a (mood ?lab ?s))) => (being ?na (mood (mood-of ?na) ?ns))
where ?ns <- (rng ?s),
?kick <- (- (mod ?ns 7) 3),
?well <- (nearest-well ?a),
?pull <- (clamp (- ?well ?a) -2 2),
?na <- (clamp (+ (+ ?a ?pull) ?kick) 0 10)
rule nearest-well-lo : (nearest-well ?a) => 2 where (< ?a 5)
rule nearest-well-hi : (nearest-well ?a) => 8 where (>= ?a 5)
rule mood-of-lo : (mood-of ?a) => low where (< ?a 5)
rule mood-of-hi : (mood-of ?a) => high where (>= ?a 5)
main = (trace (being 2 (mood low 4242)) 24)
  10 |     ##      #
   8 |    ####     #
   5 |  #############
   2 |################  ##  #
     +--------------------------> time
  trend ▁▁▃▃▅▆▆▆▄▃▃▃▃▆▃▂▁▁▂▂▁▁▁▁▁
  distribution (how often at each arousal):
   0 | #### 4
   2 | ### 3
   5 | ####### 7
  10 | ### 3
  => BOUNDED: never settles exactly, but stays in a stable region (noisy / orbiting)

The column chart shows the trajectory dwelling low, jumping to the high well, and falling back. The histogram shows the bimodality directly. Neither well produces switching alone. It is a product of the two wells and the noise.

5.8 Predictive processing: a self-model cohering (mind-predictive.pal)

Now two variables. The state (pp BODY BELIEF PRIOR) gives the mind a belief about its own arousal. It minimizes prediction error two ways at once. Perception moves the belief toward the body, and action moves the body toward the belief. The belief is also drawn toward a prior expectation. The display switches to an overlay so you can watch the two tracks (o = body, x = belief) converge.

rule step : (step (pp ?body ?pred ?prior)) => (pp ?nbody ?npred ?prior)
where ?nbody <- (clamp (toward (toward ?body 8) ?pred) 0 10),
?npred <- (clamp (toward (toward ?pred ?body) ?prior) 0 10)
main = (trace (pp 0 10 5) 8)
  o = body   x = belief
  10 |x
   8 | x
   6 |  xoooooo
   5 |   xxxxxx
   2 | o
     +----------> time
  => SETTLED to a self-consistent fixed point:
       body ====== 6   belief ===== 5   err 1

Belief (10) and body (0) close a prediction error of 10 down to a residual of 1: the prior biases perception. The mind’s picture of itself settles under the body rather than exactly on it. This is a model of active inference.

5.9 Co-regulation: two loops meeting (mind-dyad.pal)

The “self” becomes a pair. The state is a world of two beings. Alice’s baseline is calm (3), Bob’s anxious (8). Each regulates toward their own baseline and is pulled toward the other (attunement). Starting far apart, they converge to a shared compromise.

rule step : (step (world (being ?a alice) (being ?b bob))) => (world (being ?a2 alice) (being ?b2 bob))
where ?a2 <- (clamp (toward (toward ?a 3) ?b) 0 10),
?b2 <- (clamp (toward (toward ?b 8) ?a) 0 10)
main = (trace (world (being 0 alice) (being 10 bob)) 8)
  o = A   x = B
  10 |x
   8 | x
   7 |  xxxxxxx
   4 |  ooooooo
   2 | o
     +----------> time
  => SETTLED to a self-consistent fixed point:
       A ==== 4   B ======= 7   gap 3

The gap narrows but never fully closes. Each keeps some of their own baseline.

5.10 Escalation: Two loops feeding each other (mind-dyad-escalation.pal)

The same two-agent structure with the interaction sign flipped. Each is agitated by the other, more so when the other is more aroused, and neither self-regulates. A quarrel that feeds on itself.

rule step : (step (world (being ?a alice) (being ?b bob))) => (world (being ?a2 alice) (being ?b2 bob))
where ?a2 <- (min (+ ?a (spur ?a ?b)) 60),
?b2 <- (min (+ ?b (spur ?b ?a)) 60)
rule spur-more : (spur ?self ?other) => 3 where (> ?other ?self)
rule spur-less : (spur ?self ?other) => 2 where (<= ?other ?self)
main = (trace (world (being 3 alice) (being 4 bob)) 12)
  o = A   x = B
  10 |   **********
   8 |  *
   6 | *
   4 |x
   3 |o
     +--------------> time
  => RUNAWAY: no fixed point; the loop escalates without bound

* marks where both curves coincide. They climb in lockstep and pin at the top. The only difference between this and co-regulation is the sign of the interaction. Whether a shared loop soothes or inflames is a property of the interaction, not of the individuals.


6. Experiments to try

Work in your own file (§4) so runs are non-destructive, and predict the output before you run:

  • In homeostasis, raise the step size so the mind overshoots the set-point. Does it still settle, or does it start to oscillate?
  • In the limit cycle, change the thresholds 8 and 2. What sets the period and the amplitude?
  • In noisy homeostasis, widen the noise (mod ?ns 5 → a larger modulus). How wide does the band get before it looks like runaway?
  • In the dyad, make the two baselines equal. Do they meet exactly (gap 0)?

Because rng is deterministic, a given seed always gives the same run. Change the seed to get a different sample, not different physics.


7. Self-rewriting

The shipped examples add three lines the learner template omits:

#mode rewrite-then-run
#caps { rewrite: [self] }
...
rewrite self with solve

With these, running the file first rewrites the file itself. It replaces main = (trace …) with main = (report …), the fully computed and classified trajectory, and then displays it. Run it a second time and nothing changes. The file is already its own result, so it reproduces byte-for-byte.

ǁamə, language of the People of the Canopy

Draft 1: I somehow broke the voiceless nasals in 6.2, 6.3 and 7. I’m still trying to figure out how I pulled it off. It works in the other subsections.

ǁamə is spoken by the miː=ni tʼuŋnɔŋ, the People of the Canopy, jungle tribes raided by the Laven pirates for galley slaves.

The Laven name for them, Woowëm, is an exonym. The native name descends from Hlamangɬamaŋ → (lateral-affricate-to-click) ǁamə, “the forest-tongue”. Woowëm comes from from nuromi “the foraging people” → Wërom.


1. Phonology

ǁamə’s has heavy word-initial stress, dense onset clusters, a battery of aspirated and ejective stops, voiceless nasals and liquids, and an occasional click.

1.1 Consonants

LabialAlveolarLateralVelarGlottal
Stop, plainp, bt, dk, ɡ(ʔ)
Stop, aspirated
Stop, ejective
Affricatets, tsʰ
Click (plain)ǀǁǃ
Click (nasal)ᵑǀᵑǁᵑǃ
Fricative, vl.fs, ʃxh
Fricative, vd.vz
Nasal, plainmnŋ
Nasal, voicelessŋ̥
Liquidrl
Liquid, voiceless
Glidewj

The voiced stops ɡ, ejectives pʼ tʼ kʼ, and aspirates pʰ tʰ kʰ are descended from the ancestral Hlamang’s four tones (§1.3). The voiceless nasals and liquids (m̥ n̥ ŋ̥ r̥ l̥) are inherited intact. The clicks form a small three-place series (§1.4).

1.2 Vowels

  • Short: a, e, i, o, u, and ɔ, plus reduced ə (from vowel reduction).
  • Long: aː, eː, iː, oː, uː.
  • Diphthongs: ai, au, ei, ua, ia, ui.

1.3 Tone loss

ǁamə has no tone. Its ancestor Hlamang had four (High, Low, Rising, Falling). Over time, those tones were re-anchored onto the following consonant or vowel before pitch merged away:

  • old Highaspiration / voiceless sonorant: nin̥i ‘sun’, taktʰak ‘man’, kaukʰau ‘tree’, plepʰle ‘eye’.
  • old Lowvoicing (and, for n, denasalization): nudu ‘water’, kimɡim ‘house’, pasongbasŋ ‘spear’. Crucially, voicing now survives only under old Low. Every other tone fortis-devoices an inherited voiced obstruent: banhepanh ‘fish’, zukpausukpau ‘boar’, bokîpʼokiː ‘monkey’.
  • old Risingejective: kokʼo ‘hand’, tasawtʼasɔ ‘net’.
  • old Fallinglength: kakaː ‘foot’ (in open syllables; a closed syllable later re-shortens the vowel).

1.4 Clicks

ǁamə has three clicks: dental ǀ, lateral ǁ, alveolar ǃ, each either plain or nasal (ᵑǀ ᵑǁ ᵑǃ). The old lateral affricates and the voiceless lateral fronted to clicks (tlǀ, thl/hlǁ), and velar-plus-lateral clusters gave the alveolar click (klǃ):

thlaǁa ‘moon’ · hliǁi ‘tooth’ · kliǃi ‘seed’ · tôtlutoːǀ ‘climb’ · tlahaǀah ‘old’.

Clicks occur in the onset and word-finally (toːǀ ‘climb’). They also surface in two productive verb suffixes (§5).

1.5 Sonority hierarchy and phonotactics

The sonority scale (low → high) is:

stops / affricates / ejectives / clicks → fricatives → nasals → liquids → glides → vowels

The maximal syllable is (C)(C)(C)V(ː)(C)(C). Onset clusters may run up to three consonants. A longer run than three consonants in a row is broken by an epenthetic ə. Onsets generally rise in sonority, but ǁamə tolerates plateaus and mild reversals (bn-, dl-, ks-, sr-, tŋn-). Clusters arose chiefly from syncope (the loss of unstressed short vowels):

silinaiʃiːlnai ‘spirit’ · talenadaln ‘ancestor’ · mawnilamɔnl ‘dream’ · pasongbasŋ ‘spear’ · tungnawngtʼuŋnɔŋ ‘canopy’ · kenekʰen ‘path’.

Apocope strips a final short vowel even from a closed syllable, welding the stranded consonants into a word-final cluster (pasongbasŋ, talenadaln). Glide formation turns rising diphthongs into onset clusters (lualwa, duahniritwan̥r).

Stress is word-initial, which protected the first syllable from syncope, hence the robust onsets.

1.6 Romanization

ǁamə is an unwritten language.

Forms are cited in IPA-style transcription: aspiration ʰ, ejective ʼ, voiceless sonorants with a ring (m̥ n̥ ŋ̥ r̥ l̥), ŋ for the velar nasal, ʃ x for the post-alveolar/velar fricatives, ː for length, and ǀ ǁ ǃ for the clicks.


2. Morphological Typology

The ancestor Hlamang was a richly suffixing language with full tripartite case (distinct ergative, nominative, accusative) plus five peripheral cases, all marked on the noun. ǁamə has lost the case system. Who did what to whom is marked by a single closed set of pronominal enclitics.

Hlamang’s case suffixes eroded to bare consonants (ERG -ang, ACC -a/-na-n, NOM -i/-yi-j) when its independent pronouns (nga, yu, ta) were themselves being reduced to clitics. The two fused into portmanteau person-and-role enclitics. Because they sat at prosodic-word edges, they were re-parsed as leftward-leaning enclitics that dock onto the preceding word. The other nominal case mechanisms vanished. Obliques are now handled by relational nouns (§4.4).


3. The Pronominal Enclitic System

The enclitics have two properties:

  1. Person indexing (like Ternate). The enclitics are pronominal: each indexes the person (1/2/3), clusivity (in the 1st person), and grammatical role (S / A / O) of an argument. A 1st- or 2nd-person argument is usually expressed by the enclitic alone. The language is pro-drop.
  2. Preceding-word hosting (like Kwak’wala). An enclitic that semantically marks a given noun phrase attaches phonologically to the word that precedes that phrase; typically, the predicate or the previous argument, not the noun it marks.

3.1 The paradigm

Role1 excl1 incl23
S (intransitive subject)=i=il=ju=j
A (transitive agent)=ŋa=ŋal=ŋu
O (transitive object)=na=nal=nu=n

The three-way S/A/O split is inherited from Hlamang’s tripartite case, now realised as pronominal enclitics. Additional enclitics:

  • Demonstrative: =hi ‘this (proximal)’, =kʰu ‘that (distal)’
  • Possessor: =ni
  • Plural: =tʰo (optional; number is otherwise unmarked)
  • Sacred mood: =ŋ̥e (§5.6) (note the voiceless nasal, distinct from the habitual suffix -ŋe)
  • Locus: =tʰa ‘arboreal (up in the trees)’, =lo ‘terrestrial (on the ground)’ (§5.5)

3.2 The hosting rule, schematically

For a predicate P followed by noun phrases N₁ N₂ N₃…, each Nᵢ’s role enclitic Mᵢ attaches to the word immediately to its left:

   P=M₁   N₁=M₂   N₂=M₃   N₃
   └marks N₁  └marks N₂  └marks N₃   (final NP bears no clitic)

So the object marker of a transitive clause surfaces on the agent noun, and the agent marker surfaces on the verb. When an argument is pronominal (no overt noun), its marker piles onto the current host. A clause with a pronominal agent and object stacks both enclitics on the verb.

3.3 Phonological hosting

Enclitics undergo the ordinary cluster repair when they dock. A geminate that would swallow a monoconsonantal enclitic is broken by ə (e.g. a host ending in ŋ plus agent …ŋ=əŋ).


4. Noun Phrase

4.1 Nouns

Nouns are invariant roots. They take no case and, by default, no number inflection. A noun phrase is marked for its clausal role only by the enclitic that the preceding word carries.

4.2 Number

Number is optional. When expressed, it’s carried by the enclitic =tʰo ‘plural’, hosted (like all enclitics) on the preceding word:

pʰiŋmaukeːntʰɔta=j=tʰo miː

heal-INCEP-PST=3.SBJ=PL person

“the people began to be healed.”

4.3 Demonstratives and possession

Demonstratives (=hi, =kʰu) and the possessor enclitic (=ni) also lean leftward. Possession is possessed-possessor, with =ni on the possessed noun marking the following possessor:

lwa=ni kʰau
leaf=POSS tree
'the tree's leaf'

4.4 Obliques and relational nouns

Having lost its locative, ablative, allative, comitative, and instrumental cases, ǁamə expresses spatial and instrumental relations with a small closed class of relational nouns, grammaticalized from old case-marked forms. A relational noun heads a possession-shaped phrase: [RELATIONAL-NOUN]=ni [GROUND], literally ‘the GROUND’s inside / top / …’ used as an oblique adjunct:

Relational nounSensefrom Hlamang
suŋin, insidesungi ‘interior’
tsʰuŋon, abovechunga ‘upperside’
n̥waiunderhnuai ‘underside’
kʼjaŋbeside, atkianga ‘edge’
m̥aŋwith, by means ofhmangi ‘use’ (instrumental)
atŋfromatanga ‘source’ (ablative)
taːpʰrta=j=tʰo miː tsʰuŋ=ni kʰɔŋ̥r
weep-PST=3.SBJ=PL person on=POSS shore
'The people wept on the shore.'

Instrumental relations use m̥aŋ ‘by means of’ (… m̥aŋ=ni basŋ ‘with a spear’). For motion to or from a place the verb’s own associated-motion suffixes (§5.4) are usually preferred to an oblique.

4.5 Numerals

Cardinal numerals form a single ejective-initial series (from the old pa- counting prefix; ‘ten’ stands apart):

12345678910
pʼaxtpʼanpʼatʰmpʼalpʼaŋpʼarkpʼasrpʼarjtpʼakwsɔm

A numeral is attributive and follows its head noun (N-NUM); the plural =tʰo is then redundant and usually dropped:

tʰaŋnuːthwata=ŋ=tʰo swahp=n tʰak pʼark
carry-thither-PST=3.AGT=PL sea.thief=3.OBJ man six
'They carried off six men.'

The same numerals may head a nonverbal predicate (§6.6): pʼark=j=tʰo pɔi ‘the captives are six’.

4.6 Names

A clan mother (piːn) bestows personal names from her matriclan’s stock. Names form in four ways:

  1. Bare noun / adjective: sakei ‘Jaguar’, r̥oikw pʰi ‘Great-Vine’.
  2. Compound (head + following modifier): taːoː tsʰip ‘Hawk-of-the-Crown’, sakei bje ‘Jaguar-Child’.
  3. Possessive [X]=ni [Y] ‘Y’s X’: veŋt=ni mei ‘Keeper-of-the-Fire’.
  4. Sentence-name (a frozen finite clause): tʰunei=ŋ=n ziŋ ‘He-Holds-the-Sky’.

High offices are title-names. The name is the office. They are owned by a clan and reused across generations, raised onto a person as during a condolence.


5. Verb

The verb is the most complex part of ǁamə grammar. Its template is:

ROOT – (ASPECT) – (ASSOCIATED MOTION) – (ELEVATION) – (NEG) – TENSE/MOOD, followed by the clause’s pronominal enclitics.

5.1 Aspect

AspectSuffixSense
Imperfective-laongoing
Foraging-suaidoing dispersively, gathering here and there
Pursuit-xruadoing stealthily, stalking, in pursuit
Habitual-ŋedoing customarily
Inceptive-tʰɔbeginning to do
Cessative-ǁoceasing to do (note the click)

5.2 Tense, mood, negation

Suffix
Present∅ (unmarked)
Past-ta
Future-ri
Potential-ŋu
Optative/Hortative-sai
Negative-lai (before tense)

5.3 Associated motion (deictic axis)

  • Ventive (hither) -ma, Itive (thither) -hwa, Return (round trip) -vru.

5.4 The elevation sub-system

ǁamə has grammaticalized a vertical axis of motion, expanded from Hlamang’s simpler canopy/ground contrast:

MarkerSuffixSense
Ascending-ǀuŋdoing while going up into the canopy (click-initial)
Descending-n̥udoing while going down to the forest floor
Canopy-traverse-ǁuŋmoving branch-to-branch through the canopy
Emergent-top-kǀugoing up to the emergent crowns above the canopy
Understory-n̥rumoving through the shaded understory

So a single verb can specify not just that motion accompanies an action but at what layer of the forest it happens.

5.5 Arboreal vs terrestrial locus

Orthogonal to motion, a pair of locus enclitics situates the whole event in the forest’s vertical world: =tʰa ‘arboreal, up in the trees’ vs =lo ‘terrestrial, on the ground’.

5.6 Sacred mood

The clitic =ŋ̥e marks the sacred/ritual mood, speech in chant, prayer, myth, or to the spirits. Mundane speech is unmarked. Inherited from Hlamang’s sacred clitic, it frames the speech-act.

5.7 Verb paradigm (root m̥aːh ‘hunt’)

FormGloss
m̥aːhhunt-PRES
m̥aːhtahunt-PST
m̥aːhrihunt-FUT
m̥aːhxruahunt-PURS-PRES
m̥aːhsuaihunt-FORAGE-PRES
m̥aːhǀuŋtahunt-ASCEND-PST
m̥aːhn̥utahunt-DESCEND-PST
m̥aːhǁuŋhunt-CANOPY.TRAVERSE-PRES
m̥aːhxruaǀuŋtahunt-PURS-ASCEND-PST
m̥aːhlairihunt-NEG-FUT

6. Syntax

6.1 Word order

Woowëm is predicate-initial, verb first. The verb, coming first, hosts the first argument’s marker. Each noun that follows hosts the next. Overt full-NP arguments follow in the order agent-before-object. Pronominal arguments are dropped, their enclitics stacking on the verb.

6.2 Core clauses

Intransitive clauses index their single argument (S) with an S-enclitic on the verb. Transitive clauses index the agent (A) on the verb and the object (O) on the agent noun:

(1) n̥uŋ=j mi:
live-PRES=3.SBJ person
'The person lives.'
(2) pʰriːnta=ŋ tʰak=n sukpau
strike-PST=3.AGT man=3.OBJ boar
'The man struck the boar.'
(the object marker =n sits on 'man')

With pronominal arguments, the enclitics gather on the verb:

(3) tseː=ŋa=n kʰau
see-PRES=1e.AGT=3.OBJ tree
'I see the tree.'
(4) tseː=ŋ tʰak=na
see-PRES=3.AGT man=1e.OBJ
'The man sees me.'

6.3 The jungle verb in action

(5) m̥a:hxrua|uŋta=ŋ r̥eikhi:on=n pʼoki:
hunt-PURS-ASCEND-PST=3.AGT shaman=3.OBJ monkey
'The shaman pursued the monkey up into the canopy.'
(6) n̥ursuain̥uta=j hok
forage-FORAGE-DESCEND-PST=3.SBJ woman
'The woman foraged about, down on the ground.'
(10) nelaǁuŋ=ŋ=tʰa pʼokiː=n ǃi
eat-IPFV-CANOPY.TRAVERSE-PRES=3.AGT=ARBOREAL monkey=3.OBJ seed
'The monkey moves branch-to-branch eating seeds, up in the trees.'

6.4 Demonstratives, possession, negation, mood

(7) ne=ŋa=n=kʰu fum
eat-PRES=1e.AGT=3.OBJ=that food
'I eat that food.'
(8) raːǁhauǁta=ŋ=ŋ̥e r̥eikʰiːon=n m̥aːr̥ŋnaː
pray-PST=3.AGT=SACR shaman=3.OBJ sky_father
'The shaman prayed to the Sky-Father (in sacred speech).'
(9) walairi=j tʰak
come-NEG-FUT=3.SBJ man
'The man will not come.'
(11) tʰaŋnuːthwasai=ŋu=n basŋ
carry-thither-OPT=2.AGT=3.OBJ spear
'You, take the spear away!'

Polar questions add the clause-final clitic =mɔ. Nonverbal predication uses the copula en. The conjunction is le.

6.5 Nonverbal predication

Equational and attributive clauses are predicate-initial like verbal ones. In the present tense, they are zero-copula. The predicate nominal, an adjective or numeral, stands first and hosts the subject’s S-enclitic exactly as a verb would.

pɔi=j=tʰo tʰak pʼark=j=tʰo pɔi
slave=3.SBJ=PL man six=3.SBJ=PL slave
'The men are slaves.' 'The captives are six.'

For non-present tense (or emphasis) the copula en appears clause-initially, takes the tense suffix, and hosts the enclitics. The predicate nominal and then the subject follow:

enta=j pɔi=tʰo tʰak
COP-PST=3.SBJ slave=PL man
'The men were slaves.'

Two clauses may be conjoined with le ‘and’.


7. A Short Text: The Shaman and the Spirit

m̥a:hxrua|uŋta=ŋ r̥eikhiːon=n pʼoki:
hunt-PURS-ASCEND-PST=3.AGT shaman=3.OBJ monkey
'The shaman pursued the monkey up into the canopy.'
fekǀuta=j pʼokiː
go-EMERGENT.TOP-PST=3.SBJ monkey
'The monkey fled up to the emergent treetops.'
fen̥uta=j r̥eikhi:on
go-DESCEND-PST=3.SBJ shaman
'The shaman went down to the ground.'
raːǁhauǁta=ŋ=n=ŋ̥e daln
pray-PST=3.AGT=3.OBJ=SACR ancestor
'There he prayed to the ancestors, in sacred speech.'
pʰiŋmaukeːntʰɔta=j=tʰo miː
heal-INCEP-PST=3.SBJ=PL person
'And the people began to be healed.'

The spirit-monkey is chased up (-ǀuŋ) and flees to the emergent crowns (-kǀu). The shaman comes back down (-n̥u). The sacred clitic marks the pivotal prayer.


8. Lexicon

Everyday nouns. du water · mei fire · n̥i sun · ziŋ sky · neir river · roŋ stone · kʰau tree · lwa leaf · ǃi seed · kʰen path · ɡim house · kʼo hand · kaː foot · pʰle eye · ǁi tooth · ǁa moon · kʰiŋ star · naiu egg · r̥ir wind · n̥aːu ground · miː person · tʰak man · hok woman · bje child · pal friend · fum food · panh fish · ŋeik bird · lɔr mouth · nit name.

Verbs. fe go · wa come · tseː see · ne eat · gu drink · kʼat give · luk take · gɔ say · tʰrak know · pʰja want · tsʰol sleep · l̥iːt die · n̥uŋ live · kʰomn sit · n̥appʰ stand · pʰriːn strike · tʰunei hold · m̥aːh hunt · tʰimŋ track · n̥ur forage · toːǀ climb · n̥oːtmn stalk · tʰaŋnuːt carry · naːhwaun bless · kaːm̥jlei curse · raːǁhauǁ pray · pʰiŋmaukeːn heal.

Adjectives. tʰa good · pʰi big · tʰe small · r̥aŋ fast · ʃipmai bad · niːn new · ǀah old.

Hunting & foraging. tʼank game · basŋ spear · nik snare · pʼokiː monkey · sukpau boar · taːoː hawk · tʼasɔ net · n̥imk arrow · m̥aːhu poison · r̥oikw vine · tʼuŋnɔŋ canopy · naukoːl forest-floor.

Spiritual & shamanic. ʃiːlnai spirit · daln ancestor · twan̥r ghost · r̥eikʰiːon shaman · mɔnl dream · taːsraŋjiː omen · n̥aːm chant · n̥iːkrn medicine · m̥aːr̥ŋnaː Sky-Father · ŋ̥eishiː rite · n̥waŋhuː soul · l̥onŋaː underworld · kʼeːwŋ star-spirit · haːdweːnm vision · n̥oːlaːŋeː taboo.

Sea & raiding. twihpɔ sea · ǀaihpɔ wave · kʰɔŋ̥r shore · lɔŋ ship · ǁemn oar · saːpʰɔ sail · tʰirx chain · tʰir iron · swahp sea-thief · pɔi slave · pʰalstʰ warrior · tʰalkʰɔ bow · luːŋ̥ai grief · tsiːr salt · r̥u raid · m̥an seize · kʰap shoot · ǀan flee · tʰohkr resist · n̥ɔt drive back · kʰiːn bind · ǁem row · taːpʰr weep · aun cry out · ǁau fear · kʰaŋ burn.

Numerals. pʼaxt 1 · pʼan 2 · pʼatʰm 3 · pʼal 4 · pʼaŋ 5 · pʼark 6 · pʼasr 7 · pʼarjt 8 · pʼakw 9 · sɔm 10.

Relational nouns (obliques). suŋ ‘in’ · tsʰuŋ ‘on’ · n̥wai ‘under’ · kʼjaŋ ‘beside’ · m̥aŋ ‘by, with’ · atŋ ‘from’.

Society & kin. r̥em peace · tʰan law · tʰuː word · kʰɔmpw council · kʰɔm gather · sɔmpw confederacy · tsʰil clan · n̥am tribe · tʰisn lineage · nuːl mother · piːn clan-mother · uːp elder · r̥eml peace-chief · l̥al lord · r̥alht war-chief · veŋ guard · veŋt keeper · pʰjakt faithkeeper · tʰuːs speaker · kʰaitʰ raise · kʰoŋk door · r̥enzai record-cord · sɔlpk longhouse · r̥emkʰau tree-of-peace · saːr branch · zuŋ root · tsʰip crown.

Geography. tsʰak east/dawn · ǁaŋ west/dusk · saŋ high · twilai island · lai center.

Clan animals. taːoː hawk · sakei jaguar · r̥ul serpent · pʼokiː monkey · sukpau boar · pʰak bat · sabŋ turtle · faːǁ heron · tsʰwak frog.

Enclitics & function words. S =i/=il/=ju/=j · A =ŋa/=ŋal/=ŋu/=ŋ · O =na/=nal/=nu/=n · POSS =ni · PL =tʰo · DEM =hi ‘this’ / =kʰu ‘that’ · SACRED =ŋ̥e · LOCUS =tʰa ‘arboreal’ / =lo ‘terrestrial’ · COP en · Q =mɔ · conj le.


9. Irregularities

  1. Tonal strata as pseudo-suppletion. The (now minority ~10%) low-tone voicing layer makes some etymologically related material look irregular. Voiced vs voiceless initials have no synchronic conditioning, while high tone devoiced some inherited stops (bokîpʼokiː).
  2. The =ŋ / =ŋ̥e near-contrast. Habitual -ŋe (voiced) and sacred =ŋ̥e (voiceless) are distinguished only by voicing.
  3. Geminate-driven epenthesis. The bare consonantal enclitics (=ŋ, =n, =j) trigger an epenthetic ə on like-final hosts. A single morpheme has both a bare and a schwa-supported allomorph.
  4. Sacred conservatism. A handful of ritual words (raːǁhauǁ ‘pray’) resisted the syncope that trimmed everyday vocabulary, leaving the sacred register conspicuously longer.
Design a site like this with WordPress.com
Get started