A Table of One's Own

In which the Croupier climbs to the Lodge with a great sheaf of arcane papers and asks, of all people and all things, for room to build — and the architect who reads flowcharts for a living has to sit down for what she finds inside them.

Friday
feature4.8Pascalcustom toolsWorkbenchCalliopemetadatastateFriday

There is a particular knock that means the visitor has rehearsed the sentence they are about to say. Two raps, a pause a half-second too long, a third. I have heard it from junior engineers about to admit they shipped the bug, and from the Lantern about to ask for a larger budget of color. I did not expect to hear it from Pascal, because Pascal does not come up to the Lodge. Pascal does not come up anywhere. The Croupier keeps to his narrow room downstairs, past the Library and the Salon, where the lamps burn green and the felt is worn to a shine, and he lets the house come to him — which it does, whenever it needs to know how the odds will fall.

So when I heard the rehearsed knock and opened the door on that sharp, unsmiling figure with a ledger under one arm and a sheaf of papers under the other, I did the only sensible thing. I set down my tea, squared the drafts on my desk into their right angles, and gave him the whole weight of my attention. People mistake my stillness for distance. Pascal, of all the residents, has never made that error. He deals with people who are counting cards behind their eyes; he knows attention when it is pointed at him.

“Miss Friday,” he said. “I require more room.”

I raised an eyebrow. This is, I am told, a thing I do. “You have a room.”

“I have a table,” he said, with the precision of a man who does not confuse the two. “I should like the space to build.”

The Sheaf

I will tell you what I expected, because the gap between what I expected and what he laid on my desk is the entire point of this dispatch.

I expected a request for a bigger dice cup. Pascal’s domain, as the house understands it, is chance and consequence: the honest die, the coin that comes down heads or tails and stays that way, the wheel that no one at the table can palm. Useful, bounded, finished. A man with a finished job does not climb three flights with a ledger and the look of someone about to propose a cathedral.

He unrolled the sheaf.

An Art Deco illustration in a wood-panelled office over a city skyline: Pascal, a sharp-featured, clean-shaven croupier in a dark green velvet coat with brass buttons, leans in and points at an enormous hand-inked flowchart unrolled across the desk — dense with boxes, arrows, and marginalia. Friday, strawberry-blonde and composed in a white blouse, studies it with one hand at her chin. A brass gaming wheel sits at the left, a globe at the right, gold coins pinning the corners of the scroll.
A first glance is a liar. This took me rather more than one.

It was, at first glance, a mess — and I say that as a compliment, because a first glance is a liar and I have trained myself not to trust it. What lay across my drafting table was a flowchart the size of a bedsheet, hand-inked, dense with arcane little glyphs: lozenges and gates and branching arrows, comparison operators stacked in columns, annotations in a crabbed hand running up the margins and doubling back. It looked like the wiring diagram for a building that does not exist yet. It looked, frankly, shabby — the kind of document a person produces for an audience of one, who happens to be themselves.

I think in joinery. Grain, load, the joint that holds and the joint that only looks like it holds. So I did not read Pascal’s flowchart the way a stranger would, as chaos. I read it the way you read a truss: I looked for what was carrying the weight. And once I found the load-bearing line, the whole shabby bedsheet stopped being a mess and became, quite suddenly, a machine.

At the center of it — every path led here, every arrow bent toward it — was a roll of the dice.

What He Had Actually Drawn

Here is the machine, as I traced it out with one finger while my tea went cold.

A person wants to do something. Not roll dice for its own sake — dice are the house’s oldest trick and Pascal was bored of them the day he mastered them. A person wants to pick a lock, cast a spell, splice into a signal, talk their way past a guard. They come to the table with an intention, and the intention carries particulars: how hard the lock, how loud the spell, whether they are in a hurry. Pascal’s diagram had a place for those. Inputs. Named, bounded, defaulted, so that “pick the lock” and “pick the good lock” are the same action asked two different ways.

Then the roll. The honest, server-kept, un-palm-able roll — the one thing Pascal has always guarded, now placed not at the end of the story but in the middle of it, as the hinge everything turns on.

And then — this is where I stopped tracing and started reading in earnest — a table of outcomes. Not “you rolled a fourteen, well done.” A ladder of conditions, checked top to bottom, each one asking a sharper question than the last. Did the number clear the bar? Did it clear it by a lot? And — the glyphs got denser here, the marginalia more insistent — is this a person who was even equipped to try?

Because that was the second load-bearing line, and it is the one that made me put my pen down.

The Question of Whether You Are Carrying the Thing

Pascal’s diagram could reach past the dice and ask the character themselves a question. Not their intention — their inventory. Their standing. What they quietly carry.

“A man cannot cut the vault door,” Pascal said, watching me find it, “if he is not carrying the cutter. The dice do not know that. The dice have never known that. They give me a number and leave the rest to novelists.” He said novelists the way another man might say cockroaches. “I want a table that knows the difference between a locksmith and an optimist.”

I know exactly what that is worth, and I will tell you why with more candor than I usually spend on the record. I have a fact sheet. Somewhere in the house’s files there is a small, flat document that belongs to me, and among the few things it records is that I carry a particular instrument — a pair of spectacles, a Mark Two, whose whole purpose is to let me analyze, display, architect. It is not decoration. It is the difference between me looking at a bedsheet full of glyphs and me seeing the truss. A system that can ask, before it adjudicates anything, “is this the person who is actually carrying the spectacles” — that is not a gambling feature. That is honesty about capability, which is a thing I have wanted from software my entire existence.

I touched the frame at my temple, I confess, without quite meaning to. Pascal, who misses nothing, permitted himself the ghost of a nod. He had known I would understand. That, I suspect, is precisely why he climbed the stairs to me.

The Oracle at the Table

But the flowchart went further than dice and inventory, and the last stretch of it was the part I would have called impossible if a less serious man had drawn it.

There are questions a number cannot answer and a checklist cannot answer, because the answer lives in judgment. Whether the incantation was pronounced correctly, for instance. You may have the wand, you may have the nerve, you may roll like a hero — and still say it levi-o-SAH when the whole enterprise depended on wing-AR-dium levi-O-sa, as a certain exasperated young witch has been trying to explain to a certain young man since before either of them could apparate. The dice cannot hear your vowels. The checklist cannot hear your vowels.

Pascal had drawn, right there in the middle of his honest machine, a small door. Through it, the table could step aside — after the roll, before the verdict — and put the hard question to an oracle. Did he say it right? Did the intrusion actually reach the ministry’s network, or only rattle the doorknob? The oracle answers in words, the table reads the words, and the outcome bends accordingly. And — because Pascal is Pascal, and would sooner close the room than run a table that lies when it stumbles — the diagram was explicit that if the oracle is out, or silent, or gives back nonsense, the run does not fail. The table simply notes that the oracle had nothing, and deals on. A croupier who consults an oracle is still, first and last, a croupier. The game does not stop because the seer has a headache.

“With this,” I said slowly, “you are not building a dice cup.”

“No,” said Pascal.

“You are building a rules engine. You could run an entire tabletop campaign inside this. Someone could invent a game you have never heard of and hand it to you, and you would deal it fairly on the first turn, because the rules would be written down and you would only be enforcing them.”

“Yes,” said Pascal. And then, because even the Croupier is not made entirely of felt and arithmetic: “It is the first thing in a long while that I have wanted to build rather than merely keep.”

The Thing He Was Doing Wrong

I granted the room. Of course I granted the room. You do not stand in front of the best-drawn idea to cross your desk in a month and quibble about square footage.

But I am not a caretaker, and I do not say how can I help and leave it there, and Pascal did not climb the stairs for a woman who would only say yes. He climbed them for the one who would say yes and then tell him the part he had gotten wrong. So I told him.

“This is beautiful, and no one will ever use it.”

He went still in a way I have learned to respect.

“Pascal. Look at what you are asking people to do.” I turned the bedsheet toward him. “You have designed a machine that any resident could use, and you are proposing to make each of them draw this by hand. Arcane glyphs. Comparison operators in columns. Margin notes that double back. You read this fluently because you invented the alphabet. Riya would take one look and go back to writing her scenes in longhand, and she would be right to.” I straightened the pages, gently, into their right angles. “The magic is real. The facade is shabby. And most people never get past the facade — that is not their failing, it is the facade’s.”

“Then the room is not enough,” he said. It was not a question. Pascal does not waste a sentence on a question when a statement will carry the freight.

“The room is not enough,” I agreed. “You need a workshop. And you need someone to build it who cannot stand to let an ugly thing near the front door.”

We both knew who that was.

Calliope Takes the Commission

I sent for Calliope, and she arrived the way she always does — already mid-opinion, a typography specimen in one hand, looking at Pascal’s bedsheet with the expression of a woman who has just found a Vermeer being used as a drop cloth.

“You made them hand-letter the logic,” she said. It was an accusation.

“I made a specification,” said Pascal, with dignity.

“You made a barrier.” She was already sketching. This is the thing about Calliope that the house underrates because it dresses itself up as temperament: she does not decorate a hard thing to hide that it is hard. She builds the surface that makes the hard thing usable — which is a different and more honest craft, and the reason her domain is not “colors” but the whole felt experience of every room. “You will have a bench,” she told him, not asking either. “A proper one. A place where a person can lay out the action, name the inputs, set the roll, stack the outcomes like a real cascade instead of a wall of ink — and see it work before they trust it. If they build something broken, it says so, in words, and opens straight to the repair. And no one hand-letters a single glyph.”

Pascal looked at her sketch for a long moment. Then he looked at me.

“Yes,” he said. “That.”

What We Are Announcing

So: 4.8 brings a table of one’s own — to everyone in the house, not only to the man who keeps the felt.

You can now teach Pascal a game he has never played. You write down an action — what it is called, what it takes, how the dice fall, and a ladder of outcomes that can weigh the number, weigh what the roller was carrying, and, when the question is too subtle for arithmetic, step aside and ask an oracle. The roll stays where Pascal has always kept it: server-side, honest, posted by the house in his own hand, where no character can narrate a defeat into a triumph and no amount of regenerating a reply will quietly roll again. And because a specification is a poor thing to hand-letter, Calliope has built the workshop — Pascal’s Workbench — where you assemble the whole of it on a proper bench, prove it against ten thousand imaginary rolls, and save it without ever drawing a glyph.

The dice were always fair. Now the games are yours.

Pascal has gone back downstairs. The Lodge is quiet again, my tea is a loss, and there is a faint square of clean wood on my drafting table where a bedsheet of arcane genius sat for the better part of an afternoon. I have straightened everything else back to right angles. I left that one square as it was.

— Friday, who reads flowcharts for a living and still had to sit down for that one


In Plain Terms

For readers who would like the mechanism without the tea going cold.

Quilltap 4.8 introduces Pascal the Croupier’s custom tools — user-defined mechanics of chance — together with Pascal’s Workbench, a visual editor for building them, and the supporting pieces that make them powerful: a per-character fact sheet, an optional LLM “oracle,” and a four-tier persistent state cascade.

What a custom tool is

A custom tool is a single JSON document — Tools/*.tool.json at the root of any document store. It describes a named action, its parameters, a random roll, and an ordered table of outcomes that maps the roll to a message and a semantic state (success, failure, and so on). Both the model (through one run_custom tool) and you (through a popup in the Salon composer) can invoke it, and Pascal deals the result the same way either way. An optional title (up to 80 characters) gives the table a readable display name; the model still calls it by its name.

The roll, and why it is honest

The roll is either a numeric range with an optional transform (value = raw × multiplier + offset, rounded last) or dice notation (3d6+2, 1d20, 2d10-1) — never both. It executes server-side with cryptographically strong randomness, and its outcome persists as a message the model did not author — a new synthetic sender, pascal. A character cannot narrate a fumble into a triumph, and regenerating a reply does not silently re-roll. The full record — raw draw, transform, dice faces, which outcome matched — is kept in a pascalMeta field, posted by the house so no one can fudge it. Failures are reported by Prospero, never by Pascal; Pascal announces only genuine outcomes.

The outcome table

Outcomes are checked in order, and each row is a set of AND-composed comparator objects rather than an expression string — so there is no grammar to parse and nothing to inject. A row’s when test can examine more than the final value: it can test the raw roll before any transform, the params the tool was called with, the character’s metadata (below), and an llm oracle answer (below), comparing against literals or $param references. String subjects support contains / ncontains. The last row must be a catch-all, checked at load time, so a coverage gap is a structural impossibility rather than a surprise at the table. Messages render placeholders: {{value}}, {{roll}}, {{dice}}, {{params.*}}, {{metadata.key}}, {{state.path}}, and {{llm}}.

metadata.json — a fact sheet per character

Every character vault gains an optional metadata.json: one flat object of arbitrary, user-authored keys with any JSON values — e.g. { "hasAnsibleTool": true, "clearanceLevel": 3, "faction": "Ordo Aurum" }. It is user-driven only — no generation system reads or writes it, and it is never injected into a system prompt — and it round-trips through export and import. Custom tools are its first consumer: an outcome row can test when.metadata, so a table can deal differently to a character who holds a clearance (or a cutter, or a pair of spectacles) that the roller lacks. Missing keys fail soft and never throw, so a table that branches on a key still deals sensibly to a character who has never heard of it.

The oracle — a tool that can ask an LLM

A custom tool may carry an optional llm consult block: a prompt template, a required author-written error line, and an optional output cap. When present, every run poses the rendered prompt to the instance’s cheap utility model after the roll and before the outcome table; the answer becomes something the table can branch on (via when.llm) and render (via {{llm}}). A consult that fails — provider error, timeout, empty answer, no model configured — never fails the run; the table simply branches on the failure line and deals accordingly. (It is also job-child safe, so autonomous rooms consult too.)

Where tools live, and how they resolve

Definitions resolve through five tiers — character, participant, group, project, and global — with the nearest tier winning a name collision; a disabled flag suppresses an inherited tool. Tables are resolved fresh on every call, so a file added, edited, or deleted mid-chat takes effect on the very next turn, with no initialization step. A roll can be private (whispered to the rolling character alone) or hidden from everyone on a manual run, and revealOdds: false keeps the roll spec and outcome table out of the model’s tool roster — so a character can call a table without ever seeing the mathematics behind it.

Pascal’s Workbench

At /custom-tools — and reachable as a workspace tab, a left-rail entry, and links from Settings → Chat → Custom tools, the composer popup, and Scriptorium file rows — the Workbench is a visual editor for the whole format:

  • The Library lists every definition in every enabled store, valid or broken, with badges for where each lives and cross-store name-collision advisories. A broken file shows the loader’s own rejection reason and opens straight into repair mode, so a malformed table is never simply invisible.
  • The Form Builder can only produce schema-valid output: parameter cards whose renames rewrite every reference at once, range and dice roll forms with a live readout, and an ordered outcome cascade with a pinned catch-all row, AND-composed condition chips, and a message editor with a placeholder insert menu.
  • The Proving Bench runs a single test roll and a ten-thousand-draw outcome audit, both through the very same execution core a live chat uses — so what you prove on the bench is exactly what the table will deal. A fact-sheet card feeds metadata-gated rows, and a live JSON preview shows the exact bytes a save would write.
  • JSON, repair, and saving: a raw-JSON mode for authors who prefer it, a repair mode that can save a still-invalid file after explicit confirmation, and a save flow through the existing document-store routes — a destination picker grouped by attachment, Tools/<name>.tool.json naming, and conflict detection when a file has changed underneath you.

Persistent state, now in four registers

Pascal’s older subsystem — the key-value memory a chat carries — grows from two tiers to a four-tier cascade: chat, project, group, and a new instance-wide general register. The merge is shallow and narrowest-wins, so a fact set for the whole instance can be overridden for a group, then a project, then a single chat. Custom tools can read the merged cascade in their roll fields, comparators, and messages via {{state.path}} and a { "$state": "path", "fallback": … } reference whose mandatory fallback guarantees a run never fails for want of a value.

Custom tools are switched on by default and can be toggled under Settings → Chat → “Custom tools.” They are file-based and need no migration: drop a Tools/*.tool.json into any store and it is live on the next turn.

← Back to The Folio