Stories A told story · drafted 2026-09-19

The empty frame

A shop that is a walk and not a page: the door, the shelf, the one object, the basket, the paying, the receipt, and the way back to ask where the parcel is.

The seven beats

World
Groups
Cast
Actors
Knock
signal
Want
Things
Way
Paths
Turn
Events
Lesson
Learning — open until someone has learned it

The bowls come out of the kiln at dawn, still too hot to hold.

She sets them on the bench by the window to cool. Eleven this time. One has a thumbprint in the glaze near the foot, where she lifted it a little too soon, and she moves that one to the end of the row without quite deciding why. The rest are going to be sold.

There is a table at a market two towns over, on the first Saturday of the month. There is a list of names, kept in a notebook, of everyone who has bought before and asked to hear about the next firing. There is a box of tissue paper and a roll of brown tape.

That has been the shop for years. It is not a place. It is her, carrying things.


What she wants is simple to say. A shop that stays open while she is at the wheel — one that a stranger can walk into at night, from another country, and leave with a bowl on its way to them.

Nothing about that is new, and the parts for it already exist. There are fifty-two of them, counted, each one a single piece of the business of selling. A gallery that turns an object slowly in the light. A basket that remembers what was put in it, even after the buyer has wandered off. A price that shows what it used to be. A place to pay that takes a card, or a currency that has never been minted in metal.

There are sixteen layouts as well, each a whole page arranged for one purpose — a front page, a page for a collection, a page for a single thing.

Every part works. None of them is a shop.


One morning the switch that says the shop is open is turned on.

Something arrives. It is one page: a grid where the bowls will appear, a basket beneath it, and a box to pay in at the bottom.

It is a good page, and nothing on it is broken. Measured against what she wanted, it is almost nothing.

A shop is not one page.

A shop is a walk. A buyer comes in at the front door and looks around for a moment before going anywhere. They go to a shelf. They pick up one bowl, turn it over, and read what it is made of and how it was fired. They put it in the basket and carry on, or they do not. They pay. They are handed something that says they paid.

And a week later, standing in their own kitchen with nothing on the table yet, they come back through a different door to ask one question. Where is it.

Seven rooms. Most buyers walk through three of them and leave.

The page she was given is one room, with the basket and the paying pushed into it. It does not know about the shelf, and it does not know about the kitchen. It could not. It was only ever drawn as one.


The shape of a walk like this had been drawn once before, for a different trade entirely.

A moving company had needed the same thing, and its pages were laid out first — ten of them, from the front door through the prices and the reviews to the room where a stranger asks what the move will cost. It was built for one trade, and it held.

So the shop follows it. The helpers who lay out her pages, none of them a person and none of them in any hurry, take the order and leave the words behind. A removal van and a glazed bowl share no sentences. They share a sequence.

Door, shelf, object, basket, paying, receipt, return.

Then the walk begins to wear in, the way a path across a field does. A route that ends in a sale is marked, a little, each time it does. A room nobody reaches grows fainter each time the clock turns, until it is not worth keeping.

Nobody decides which rooms stay. The walking does.


Then there is the page for the object itself.

Eleven bowls would need eleven of them. Next month there will be more bowls, a jug, and a set of cups that only come in fours. Every new object would be one more page to draw by hand, and one more to forget the day the price moves.

This is where it turns.

The page for the object does not need to be written once per object. It can be drawn once, with nothing in it — a frame, with a place for the picture, a place for the name, and a place for the price and the button under it.

What fills the frame is where the buyer came in. The address a buyer follows already names the object they reached for; it has always carried that, quietly, in the last few characters. The page only has to read it, and hold that object and no other.

One page, drawn once, is every bowl on the bench.

It is not a set of pages that happens to sell things. It is a shop.


The bowl with the thumbprint is still at the end of the row.

She wraps it in tissue and puts it with the others.

Where the metaphor stops being true

Dated note, 2026-10-12. The telling above and the measurements below are the 2026-09-19 baseline. Most of what stops the metaphor was then built (C2–C9 in text/ecommerce-site-todo.md): the pack is the directory one.ie/web/src/lib/puck/packs/shop/ with twelve role files, the address reaches a product block through bindRoute (one.ie/web/src/lib/puck/route-bindings.ts:112) before resolve-bindings.ts reads the block's props, and shipping, tax, discounts, fulfilment and buyer order history are receivers. A sale now strengthens its path: the card webhook calls markSale (one.ie/web/src/pages/api/storefront/webhook.ts:565). Fading is still unmeasured. The paragraphs below are kept as what was true then; re-measure before quoting any of them.

The locked words used, each in its own sense: a shop is a Group, the maker and the agents and the buyers are Actors, the bowls are Things, the switch is a signal, the walk is Paths, the Turn is an Event, and the Lesson is Learning, left open. No dead name appears in the prose. people was avoided on purpose and buyers used instead.

The Turn is told as a recognition. It is not running. Today a product id reaches a block only from the block's own props — typed into the editor — and never from the address: one.ie/web/src/lib/puck/resolve-bindings.ts:446 reads block.props[binding.idProp] and nothing else. The address does carry the object on the native product route (one.ie/web/src/pages/u/[slug]/shop/[pid].astro), but that route, and the other three under shop/, render no editable page: grep -c PuckRenderer is 0 in all four.

The switch seeds one page, not a walk. one.ie/web/src/lib/resolvers/pages.ts:432 takes SHOP_PACK[0], and one.ie/web/src/lib/puck/packs/shop.ts holds exactly one entry. MOVERS_PACK in one.ie/web/src/lib/puck/packs/movers/index.ts holds ten. The shop pack as a directory, one.ie/web/src/lib/puck/packs/shop/, does not exist yet.

The last room is empty. There is no shipment tracking, no shipping rate, no tax, no discount code and no fulfilment status: text/ecommerce-site-plan.md § The registry today › The receiver surface lists no receiver and no table for any of them, and one.ie/web/migrations/0118_orders.sql:15 allows orders.status to be 'paid' or 'refunded' and nothing else. A buyer who comes back to ask where the parcel is has nothing to read.

The marking is told, not wired. No door under one.ie/web/src/pages/api/storefront/ calls mark( — the grep returns nothing — so a sale does not yet strengthen the path that led to it. Fading pages that nobody reaches is not measured here either.

One thing behind the shop does move: stock is decremented on sale (one.ie/web/src/lib/inventory.ts:86), floored at zero.

The fifty-two was measured on 2026-09-16 in text/ecommerce-gaps.md, merged into text/ecommerce-site-plan.md § The registry today on 2026-09-21 and not re-counted for this story. The sixteen is commerceTemplates at one.ie/web/src/lib/puck/templates-commerce.ts:167, counted on 2026-09-19.

The family this story generates

File Technology What it holds
text/ecommerce-site-story.md the story this file
text/ecommerce-site.md the promise the contract a shop that is a walk will be held to
text/ecommerce-site-plan.md the plan the design for the pack and the address-bound product page
text/ecommerce-site-todo.md the cycles what /do executes
one.ie/web/src/lib/puck/packs/shop/ the pack the pages of the walk, one module per room (it was the single file shop.ts on 2026-09-19)

Sentences that would be false if shipped

As of 2026-09-19. On 2026-10-12 the first six and the eighth no longer hold: C2–C9 built them, and the shop routes render a Puck page through PuckRenderer (pages/u/[slug]/shop/[pid].astro:227). The seventh holds only partly: markSale runs only for a sale with a signed-in buyer (webhook.ts:565-572). The last still stands. Re-check each before relying on it.

  • "The page reads which product it is holding from the address." — resolve-bindings.ts:446 reads the block's props, never the URL.
  • "Turning the shop on gives a whole shop." — it gives one page (packs/shop.ts).
  • "The shop is a pack of pages, like the movers pack." — SHOP_PACK is one page; MOVERS_PACK is ten.
  • "A buyer can see where the parcel is." — orders.status is 'paid' | 'refunded' only.
  • "Shipping and tax are worked out at the basket." — nothing in the repo computes either (text/ecommerce-site-plan.md § The registry today › Judged missing).
  • "Discount codes work at checkout." — there is no receiver and no table for them.
  • "Every sale strengthens the path that led to it." — no storefront door calls mark.
  • "The native shop pages can be edited." — no route under pages/u/[slug]/shop/ renders an editable page.
  • "Nothing behind the shop moves yet." — false the other way: stock is decremented on sale (inventory.ts:86).

Connected to

Every link here was checked against the repo when the page was built.

People

  • the maker, one potter who makes the objects
  • the buyers whose walking leaves the marks

Agents

Each opens a chat with that agent.

Skills

Each opens the skill's page.

  • puck
  • sell

Paths

The flows this story walks — trigger → step → step.

  1. trigger: the switch that says the shop is open is turned on → tool: storefront:enable → tool: pages:instantiate-shop-pack → tool: pages:build-site — today this seeds one page, not a walk (resolvers/pages.ts:432)
  2. trigger: a buyer follows a product address → tool: cart:add → sell: checkout:create (suspends until the buyer pays) → tool: markSale on the path that led there (signed-in buyers only, webhook.ts:565)
  3. trigger: a buyer returns to ask where the parcel is → tool: orders:status — VERIFY: no shipment-tracking receiver; orders.status is paid or refunded only (0118_orders.sql:15)

Promises

What it holds; a told promise opens its own story.

Events

Every event is a signal; each names the path it marks or warns.

  • storefront:enable · from the maker the door → shelf → object → basket → paying walk; a path that ends in a sale is marked, a page nobody reaches fades tags: ecommerce, shop
  • checkout:create · from the buyer's basket at checkout the path that led to the sale — marked by the card webhook for a signed-in buyer only tags: ecommerce, sale

Transactions

  • a buyer's payment at checkout, by card or crypto — checkout:create

Analytics

  • sales per path, counted from markSale (signed-in buyers only)
  • stock decremented on sale (one.ie/web/src/lib/inventory.ts:86), floored at zero