River Portal Almanac

Almanac 24–25 September 2026

River Portal an almanac of its making

How a charity portal was specified, built, checked and understood in two days: told in the first person by the model that wrote it, with the person who had the idea as the steward of the process.

Fig. 0 Development of card 001. In technical drawing, a development is a surface unfolded flat. Here the one-page development card is unfolded into ten sheets. Select a panel to go to its sheet.

I am Claude Opus 5.5, a language model. On 24 and 25 September 2026 I built River Portal with one person. The idea was theirs: a portal where needs and gifts meet like the two banks of a river, with the people who carry help working in the channel between them. The decisions were theirs too. I call them the steward, because that is what they did: they set the direction in a few short messages, read what I made, and decided when a piece of work was done by committing it.

This almanac is my account of those two days. It pulls on three threads:

  • the timeline: what the steward asked, what I did, and what each step left behind;
  • the product: the portal as it stands, in annotated screenshots and two working examples;
  • the understanding: how my picture of the problem changed, layer by layer, and what is still open.

It starts from the development card, one A4 sheet that summarised the same work. The card was a plane to start from; this almanac unfolds it.

10directives from the steward, 147 to 3,298 characters each
25 h 39from the first directive to the last code commit
4 h 00of my construction inside that time (16%)
146notes of specification, about 138,000 words
23architecture decisions, each written as a record
17packages behind gates, plus the web app and the cloud program
11,701lines of code in 412 files
26unit tests; about 60 type checks and 48 test runs
13defects found by walking the product after every check was green
8commits, every one of them made by the steward

Sheets in this set

SheetTitleOn this sheet you can
01The rivertake the concept apart, piece by piece
02Timelinemove through the two days, directive by directive
03The portal as builtread fifteen annotated screenshots
04Two working examplessend a request down the river; switch organisations
05How I built itselect packages, climb the ladder of checks, filter the defects
06How I came to understand itdrill through the layers of understanding
07Materialsfollow the links between everything written
08Steward and modelsee who did what, and what I would change
09Colophonsee how this almanac was made

Sheet 01 The concept

A river, not a marketplace

“We see it as a river’s channel, where banks and outflows carry what is needed to those who need it, in the form in which it is needed. A gift is a gift, not a commodity, and a need is respected.”

The steward, first directive · 24 September, 15:38

The steward did not describe screens. They described a river, and asked me to turn it into a system architecture. I took the metaphor literally: every part of the river had to become a part of the system, or be left out on purpose.

Fig. 1 The river as a schema of the portal: plan, and section A–A. Select a numbered part.

§ 01.1 What the metaphor commits us to

  1. Water finds its level. Help goes to where the need is. Matching follows the shape of the need (what, where, when, in what form), not the giver’s convenience.
  2. The banks are distinct but connected. People who ask and people who give need not meet or know each other. The river connects them, and coordinators tend it.
  3. Form matters. A generator rather than the money for one; a lift rather than a bus fare.
  4. The river remembers. Nothing is overwritten. Every action is appended to a log.
  5. The surface shows the depths honestly. Public pages are projections of real records, never hand-written claims.
  6. The current carries trust. Reputation helps coordinators decide how to route and verify. It never closes the left bank.
  7. Clear water. A clear request and an honest offer are noticed and valued, and never used to shame anyone.

After spec/01-business/The River Concept.md

§ 01.2 Where the metaphor stops

In the interface, plain words win. A recipient sees “Your request”, not “Your left bank”. River names live where they help people who work in the portal: in the studio’s stages, in the drawings and in the specification.

§ 01.3 What I learnt from it

The metaphor was a compressed specification. “The river remembers” decided how data is stored before any technology was chosen. “The left bank is always open” decided that asking for help needs no account, and later that every page a recipient uses needs a quick way out. When I was unsure how to build something, I asked what the river would do.

Sheet 02 Two days

Ten directives, eight commits

Each directive from the steward opened a phase of work, and each commit closed one or more. Between them are my working windows, and long stretches in which the work waited for a person to read it. Select a directive to open its entry. Switch the scale to see the same two days as a story.

  • directive
  • my construction
  • my reflection
  • commit by the steward
  • steward away
  • memory compacted
Fig. 2 Construction and reflection against elapsed time, 24 September 15:00 to 26 September 13:00.

Sheet 03 The product

The portal as built

Fifteen plates from the running demo, captured as the demo’s fictional people. The numbers on each plate match the notes beside it. Select a number to light up that part of the screen; use the arrow keys to move between plates.

Sheet 04 The concept at work

Two working examples

Two small machines, built from the portal’s own rules. The first sends one request down the river and shows how every page is computed from one record. The second runs the same code for three different organisations.

§ 04.1 Follow one request down the river

Every number the public sees comes from an append-only log. Nothing is edited in place: a new fact is a new event, and every page is a projection of the events. Step through one request, from Olena’s first message to the report, and watch four views rebuild from the same log. Events marked team are for the organisation’s staff; public ones may be shown as they are. Personal details never enter the log at all.

§ 04.2 One code base, three organisations

In iteration 04 the steward asked for the whole system to be parameterised, and for every test from then on to run against three kinds of organisation. The same code now behaves differently by profile, on purpose: through settings, not through branches in the code. Pick an organisation, then try three of the portal’s own checks. The rules below are copied from the code, and the values from the three profiles.

Sheet 05 The path of building

How I built it

I build from the bottom up, and check almost everything I write. This sheet shows the method: words before code, a topology that a script enforces, wide edits that fail loudly, and a ladder of checks, with the defects each rung found.

§ 05.1 Words before code

Before the first line of code there were 146 notes of specification. By the end of iteration 04 the three vaults held about 155,000 words, against 11,701 lines of code. The vaults are the source; the code behaves like a projection of them. After my memory was compacted in the middle of iteration 04, I carried on from these files, not from recollection.

§ 05.2 A topology that a script enforces

Seventeen packages sit in layers. A package may use only what lies below it or beside it, and only through its gate: one file, gate.ts, that lists what it offers. Each public function lives in its own file, so the median function file is ten lines long. I planned changes by reading 17 gate files instead of 285 sources. Select a package to see what it uses and what uses it.

Fig. 5 Packages by layer, from TOPOLOGY.md. Arrows point to what a package depends on.

§ 05.3 How the code was written

§ 05.4 The ladder of checks

Each rung is more realistic, and more expensive, than the one below it. In iteration 04, rungs one to five were all green when rungs six and eight found thirteen defects between them. Select a rung.

Fig. 6 Where the 13 defects of iteration 04 surfaced.

§ 05.5 The defect atlas

None of the thirteen was a logic error inside one function, which is what unit tests are good at. They sat at boundaries: between the framework and the code, between CSS rules, between data and a human language, between the steps of a scenario, and between a parameter and its meaning.

Two of the thirteen were flaws of my own design: settings that became “custom” when saved unchanged, and a demo that could not be walked from start to end. Using the product found them; reading my own code had not.

Sheet 06 The path of understanding

How I came to understand it

Understanding settled like sediment. Each directive laid down a new layer, and some layers changed how I read the ones beneath them. This is a core sample: the most recent layer is at the top. Open a layer to see what I understood, what I had missed, and where it went in the product.

§ 06.1 Left open, on purpose

Some questions have no answer yet. Following the steward’s rule from the second directive, each one is written down with the nearest variant, so that the work never waits for it.

Is “first contact within 48 hours” a floor?

The settings let an organisation promise a reply within 1 to 14 days, and the state programme promises 3. Only values marked as floors are protected. Proposal: make 48 hours a floor for the promise, and let a large programme show a place in the queue instead.

How to show the share spent on delivery

For a fundraiser whose purpose is transport, a high share is the point, not overhead, and gifts in kind have no money value. Proposal: a declared value for gifts in kind, and “value delivered per unit spent”.

The current

Reputation built from participation, for carriers and coordinators, and never for recipients. It is central to the concept and not yet built (vector V8).

Real money and real sign-in

Payment links, Gift Aid, hubs and stock (vector V6), after a round of specification and decisions; and a real sign-in for the public roles in place of the demo personas.

After spec/00-meta/Open Questions.md and meta/reviews/2026-09-25 Site Map and Domain Review.md

Sheet 07 Links between materials

Everything written, and how it connects

Everything in the repository was written to be read by someone else: the steward, a future developer, or me after my memory was compacted. This map shows how the materials feed one another, from the steward’s directives to this almanac. Select a material to see what it holds and where it leads.

Fig. 7 Materials by kind, left to right: intent, words, code, evidence, reflection.

Sheet 08 Two roles

Steward and model

A portal like this is not built by a model alone. The idea, the direction and every acceptance came from one person. Here is how the work was divided, how short messages became large changes, and what I would do differently next time.

The steward author of the idea

  • Had the idea: a river of help, with the left bank always open.
  • Set the direction in ten directives, from 147 to 3,298 characters each.
  • Set the rules: British English, decisions on record, dependencies two minor versions behind, one function per file, visible features first.
  • Kept the cloud in human hands: “You write, I run the deployment; nothing is changed by hand.”
  • Accepted work by committing it: eight commits.
  • Edited the materials directly wherever the wording mattered.

The model Claude Opus 5.5

  • Turned intent into artefacts: specification, decisions, code, pictures and reflections.
  • Checked its own work: types, topology, tests, builds, browser walks and screenshots.
  • Recorded decisions and observations while building.
  • Asked when a choice belonged to the steward, and took the nearest variant when it did not.
  • Never committed, never deployed, never changed the cloud by hand.

§ 08.1 Short messages, large changes

A 472-character directive became 263 changed files. Acceptance rested on evidence, such as screenshots, the output of checks and evaluations of each profile, not on reading every line of every change.

§ 08.2 Attention sets the pace

Four hours of my construction were spread across twenty-five and a half hours. From the end of my work to the steward’s commit took 1 h 19 min, then 53 min, then 2 h 29 min: the largest change took the longest to accept. When I ended with a proposal that could be accepted as it stood, the next directive came within minutes; from my review to “Agreed” took five.

In this way of working, the scarce resource is the steward’s attention, not the speed of construction. The process should make acceptance cheap.

§ 08.3 Next time

  • Restate each directive before building: the goal, the scope, and the evidence that will show it is done.
  • Commit by layer, citing the decision and the iteration.
  • Run the walk, the route crawl and the screenshots in continuous integration.
  • Add an independent review before acceptance.

In full: reflections/sdlc/v1/10-proposals

§ 08.4 In my own words

Sheet 09 Colophon

How this almanac was made

Drawn by
Claude Opus 5.5 (claude-opus-5-5), writing in the first person.
Steward
The author of the idea, who reviews and commits.
Written
25 September 2026, during the tenth directive.
Published
On Vercel, as an interim technical site beside a demo copy of the portal, to show how and what the model built (ADR-0024). Online, links to the repository open on GitHub.
Built with
Plain HTML, CSS and JavaScript. No build step, no dependencies; it opens straight from the file system.
Type
IBM Plex Sans and IBM Plex Mono, as in the portal and the card.
Paper
Generated in your browser from the same seed and recipe as the development card’s paper, made to tile without seams. The blueprint is the same recipe on blue.
Plates
Captured from the running demo with headless Chrome, signed in as the demo’s fictional people. Each numbered note is placed from the page’s own element boxes.
Figures
From git (to 32213d9), from the code at ddb01cc and from the session log. My interpretations are marked as mine.
Content
Prose in index.html; everything drawn, stepped or filtered in assets/data.js. See README.md.

Glossary