From 7bd917e3a981c140a85efa60b7624d13ccc1ba8a Mon Sep 17 00:00:00 2001 From: Taranity <119620717+voyagi@users.noreply.github.com> Date: Mon, 14 Sep 2026 10:03:59 +0200 Subject: [PATCH 1/4] docs(examples): add a readable walkthrough of the public demo Closes #40. The repository had no way to see what the demo does without leaving it: the hosted demo and the video both cost minutes and both live elsewhere. examples/demo-transcript.md writes the loop out, so it reads in about a minute with no install, no account and no key. scripts/check-tracked-tree.mjs is an allowlist, so examples joins ALLOWED_DIRS in the same commit. Verified: gate:tree clean over 176 tracked files, and the check's own controls still pass. --- examples/demo-transcript.md | 65 ++++++++++++++++++++++++++++++++++ scripts/check-tracked-tree.mjs | 1 + 2 files changed, 66 insertions(+) create mode 100644 examples/demo-transcript.md diff --git a/examples/demo-transcript.md b/examples/demo-transcript.md new file mode 100644 index 0000000..36c6e54 --- /dev/null +++ b/examples/demo-transcript.md @@ -0,0 +1,65 @@ +# A walk through the public demo, in words + +Everything below happens on [ringbolt.taranity.com](https://ringbolt.taranity.com), the public +demo. It needs no install, no account and no key, and nothing you press there can make a telephone +ring: that deployment answers calls with Ringbolt's local stand-in rather than dialling. + +This is the same walkthrough the video linked from the README shows, written out so you can read it +in a minute instead of watching it. + +## The deck + +When production breaks at three in the morning, your on-call tool can ring you. But that call? It +is a recording. Press four to acknowledge. Press six to resolve. And to find out what actually +broke, you still have to get out of bed, and find a laptop. + +This is Ringbolt. It phones the engineer on call, has a real conversation about the incident, and +then carries out the fix they authorize, out loud. + +## Breaking something on purpose + +This is the public demo. Nothing here can ring a phone, so the call you are about to watch is +Ringbolt's local stand-in, running the same loop as the live build. Dockside is a service Ringbolt +owns. Bad release, going out now. + +> On `/demo` this is the control labelled **Break dockside**. The readout beside it turns to +> FAILING, and an alert lands on the intake endpoint the same way any monitor would send one. + +## The call + +The alert comes in. Policy decides it is worth waking somebody up, and Ringbolt calls. The +responder hears what broke, and authorizes the rollback in their own words. + +> The ring on the deck counts the seconds somebody has been on the line. + +## What has to be true before anything runs + +Before Ringbolt believes a word of that call, it fetches it again from the provider, because +webhooks carry no signature. The decision has to match a schema, clear a confidence floor, and name +an action the policy already allowed. And the exact words have to be in the transcript. + +> On the record screen, a red rule joins the sentence that granted permission to the action it +> allowed, so the authorization and the change cannot be read as two separate events. + +The rollback ran, and dockside is healthy again. + +## The call that was refused + +Voice is a lossy channel, so Ringbolt never acts on a guess. This example call came back completed, +at high confidence, with a valid decision to change production. It never ran. Not one word from the +person who answered was transcribed. No evidence, no action. + +The real telephone path is built too. But the provider does not currently dial the Netherlands, and +the repository documents exactly that, with call ids, in +[docs/two-way-audio.md](../docs/two-way-audio.md). + +## The rest of the rota + +A responder can also hold, snooze, or escalate. Policy filters out what should not ring anybody. +Quiet hours wait. And when nobody answers, the next person on the rota gets the call. + +## Go and break it + +The demo is public. Break it yourself. Nothing you press there can ring a phone. + +Ringbolt. diff --git a/scripts/check-tracked-tree.mjs b/scripts/check-tracked-tree.mjs index 3835eba..089c954 100644 --- a/scripts/check-tracked-tree.mjs +++ b/scripts/check-tracked-tree.mjs @@ -30,6 +30,7 @@ const ALLOWED_DIRS = new Set([ '.github', 'design', 'docs', + 'examples', 'migrations', 'scripts', 'src', From 7e57f0b579f4d6172e182bc9047e0fff71f7d185 Mon Sep 17 00:00:00 2001 From: Taranity <119620717+voyagi@users.noreply.github.com> Date: Mon, 14 Sep 2026 10:12:25 +0200 Subject: [PATCH 2/4] docs(examples): correct two overclaims in the demo walkthrough Both were found in review and both are right. The Break dockside control does not post through the HTTP intake endpoint. src/demo/service.ts lines 76 to 81 say why: the intake needs its token and the control has to work for a stranger with no credentials, so the demo service raises its alert straight into the orchestrator. The walkthrough now says that, and says outright that intake authentication, rate limiting and payload validation are not what it exercises. The provider's refusal was scoped to the setup Ringbolt reported, not to the country. docs/two-way-audio.md lines 136 to 138 quote the sentence, line 141 records that their published region table still lists the destination, and line 172 calls it one observation and not a rule about their API. The walkthrough now carries the same scope instead of a categorical claim. --- examples/demo-transcript.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/examples/demo-transcript.md b/examples/demo-transcript.md index 36c6e54..ec4cb90 100644 --- a/examples/demo-transcript.md +++ b/examples/demo-transcript.md @@ -23,7 +23,10 @@ Ringbolt's local stand-in, running the same loop as the live build. Dockside is owns. Bad release, going out now. > On `/demo` this is the control labelled **Break dockside**. The readout beside it turns to -> FAILING, and an alert lands on the intake endpoint the same way any monitor would send one. +> FAILING and the service raises its own alert, which goes through the same orchestrator every +> other alert does. The one thing it skips is the HTTP intake endpoint, because that needs the +> intake token and this control has to work for a stranger with no credentials at all. So intake +> authentication, rate limiting and payload validation are not what this walkthrough exercises. ## The call @@ -49,9 +52,11 @@ Voice is a lossy channel, so Ringbolt never acts on a guess. This example call c at high confidence, with a valid decision to change production. It never ran. Not one word from the person who answered was transcribed. No evidence, no action. -The real telephone path is built too. But the provider does not currently dial the Netherlands, and -the repository documents exactly that, with call ids, in -[docs/two-way-audio.md](../docs/two-way-audio.md). +The real telephone path is built too. What stopped it is narrower than it sounds: the provider +refused the call setup Ringbolt reported, with the words "Calls to the Netherlands in English are +not supported for this call setup", while their own published region table still lists that +destination. The repository treats that as one observation rather than a rule about their API, and +records it with the call ids in [docs/two-way-audio.md](../docs/two-way-audio.md). ## The rest of the rota From 3c09620370c105b814c12fd75cd85d79cd56e408 Mon Sep 17 00:00:00 2001 From: Taranity <119620717+voyagi@users.noreply.github.com> Date: Mon, 14 Sep 2026 10:30:49 +0200 Subject: [PATCH 3/4] docs(readme): name the category and link the written walkthrough Two gaps on the repository's first screen. The opening sentence never said what kind of thing Ringbolt is. "Phone-call agent for on-call engineering" is the category a reader is scanning for, and it costs one clause. The new examples/demo-transcript.md was reachable only from the file tree, so the first screenful now offers all three ways in: run it, watch it, or read it. --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7cee65a..eaac5b7 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Ringbolt -The on-call line that phones a human when production breaks, talks the incident through with -them, and then carries out the fix they authorize out loud. +A phone-call agent for on-call engineering. It phones a human when production breaks, talks the +incident through with them, and then carries out the fix they authorize out loud. A ringbolt is the iron ring bolted into a quay that a ship ties to in a storm. @@ -15,6 +15,9 @@ telephone ring. **Or watch it: [the video walkthrough](https://www.youtube.com/watch?v=EIm87clsks8)**, just over two minutes on that same demo, from the broken release to the rollback and the call it refused. +**Or just read it: [examples/demo-transcript.md](examples/demo-transcript.md)**, the same +walkthrough in words, about a minute, nothing to open. + ## Why this exists Every on-call tool can already phone you. None of them can have a conversation. From 1d507d32a5dafe6f0abe8a8b2236b673e2ca1726 Mon Sep 17 00:00:00 2001 From: Taranity <119620717+voyagi@users.noreply.github.com> Date: Mon, 14 Sep 2026 10:38:34 +0200 Subject: [PATCH 4/4] docs(readme): open on the card, and give the page a link preview The README's first screen had no image at all, so the repository landing view was a wall of text. docs/media/card.png is the same card the video opens on, and it now sits above the title with the tagline as its alt text. The deck's page carried a title and a description and no Open Graph tags, so pasting the address anywhere that unfurls links produced a bare URL. It now carries og:type, og:title, og:description, og:image and og:image:alt, plus twitter:card for a large preview. The image is served from the site itself at /card.png, which the build copies out of src/ui/public, so the preview does not depend on any other host. Verified: npm run build then npm run gate, exit 0 on all seven steps, with the size gate unmoved because it watches dist/client/assets and a public file lands at dist/client. The tracked-tree gate reads clean at 178. --- README.md | 2 ++ docs/media/card.png | Bin 0 -> 30511 bytes src/ui/index.html | 21 +++++++++++++++++++++ src/ui/public/card.png | Bin 0 -> 30511 bytes 4 files changed, 23 insertions(+) create mode 100644 docs/media/card.png create mode 100644 src/ui/public/card.png diff --git a/README.md b/README.md index eaac5b7..2e797e3 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +![Ringbolt. The on-call line that talks back. It phones the engineer on call, talks the incident through, and runs only the fix they authorize out loud.](docs/media/card.png) + # Ringbolt A phone-call agent for on-call engineering. It phones a human when production breaks, talks the diff --git a/docs/media/card.png b/docs/media/card.png new file mode 100644 index 0000000000000000000000000000000000000000..65eef0e04f7c9316315d994b915f3464a35346d4 GIT binary patch literal 30511 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 literal 0 HcmV?d00001 diff --git a/src/ui/index.html b/src/ui/index.html index b6e7ed9..930791e 100644 --- a/src/ui/index.html +++ b/src/ui/index.html @@ -10,6 +10,27 @@ /> + + + + + + +