Story: Implement the user journeys in ores.web

Table of Contents

This page documents a story in Product backlog — inbox, carried unfinished from Sprint 26 at close. It captures the goal, current status, acceptance criteria, and the tasks that compose it.

1. Goal

Every journey in the User Journeys catalogue runs in ores.web, against the real server. The catalogue holds 30 journeys in nine topic groups. This story orders the groups. Each group has its own story, and each of those carries its own completion.

This is the third pass of the sprint 26 mission. The first pass put every component on the Component Clean Standard. The second extracts the journeys and is still in flight. The journeys are design documents and they do not change here. This pass builds from them.

The first group writes the journey runtime, and every later group uses it. The runtime is the reason this is a programme and not one long story: a journey is an ordered list of steps, one page renders the list, and the work of the second group is then the steps alone.

2. Status

Field Value
State BACKLOG
Parent sprint Sprint 26
Now The order is set. The first group's story is written.
Waiting on Nothing.
Next Start Implement the setup journeys in ores.web.
Last touched 2026-09-27

3. Acceptance

  • Every journey in the User Journeys catalogue is implemented in ores.web and runs against the real server.
  • Every group below has a story, and that story is DONE.
  • The journey runtime and the step-call contract are written once, in the first group, and every later group uses them unchanged.
  • Every gap a journey document records is either closed or stated on the screen, and the statement is recorded.

4. Tasks

Task State Start End Description
         

5. Order

The order follows dependency, not the catalogue's order. The catalogue is ordered by how a reader learns the system; this is ordered by what unblocks what.

# Group Journeys Story
1 Setup First run, New tenant, New party Implement the setup journeys in ores.web
2 Entry Sign in, Sign up Implement the entry journeys in ores.web
3 Profile Present myself, Keep my details current, Change someone's details Implement the profile journeys in ores.web
4 Credentials Protect my account, Rescue access, Audit sign-ins Implement the credentials journeys in ores.web
5 Access Know what I may do, Change someone's access, Shape the role catalogue, Ask for more access Implement the access journeys in ores.web
6 Membership Choose where I work, Draw the reporting line Implement the membership journeys in ores.web
7 Directory See who has access, Bring someone in, Register a service account not yet scaffolded
8 Tenancy Tune the tenant, Retire or reset a tenant not yet scaffolded
9 Operations See the running services, Watch the compute grid, Watch the message bus, Read the telemetry logs, Check the versions and the database Implement the operations journeys in ores.web

Setup is first for two reasons. It is the only group that runs on an empty installation, so it is the only one that can be demonstrated from nothing. And First run expands the new tenant steps inline, so the Setup story lands the shared step library that every later group reads.

Entry is second although First run ends in a sign-in. The sign-in itself already works through POST /api/session; what the Entry story adds is the screen, self-registration, and the failure paths.

Operations is last. It is the catalogue's newest group and the only one whose design arrived settled: its journeys were written and accepted before its story opened. It needs the runtime and nothing else, so this row is a matter of when its group is built, not what it waits on.

6. Decisions

  • One story per group, and the catalogue's grouping is the implementation grouping. Journeys are grouped by the topic a designer looks them up under, never by component. A component is an implementation concept and it moves; what a person is trying to do does not.
  • The runtime is written once. A journey is an ordered list of step definitions. One page renders the flat rail from that same list, so the rail cannot drift from the steps. The first group settles the contract; a later group that needs it changed records why rather than forking it.
  • The build targets the accepted contracts. Both sprint 25 decisions are recorded in the prototype tasks and both are the target: the bootstrap workflow catalogue and the seed profile contract. The build does not add a client path to a subject the design has retired. iam.v1.bootstrap.provision-tenant and iam.v1.tenants.provision-acme are used only until the generic request replaces them, and no new code depends on them.
  • The journey is not server-side; its state is. The state is a workflow instance, which already carries the kind, the current step, the request, the result and the error. No journey entity is added. Journey execution records the reasoning and supersedes the sprint 25 plan for a /journey/ entity.
  • The extraction story owns the journey documents. The build does not rewrite them. Where the build proves a journey document wrong, the correction goes to that document and is recorded in the story that found it.
  • The prototype branches are the design record and are ported, not merged. They predate the removal of the generated screens, so they still carry the entity framework. The reduction commit e47043269f names what went and why.
  • A cross-sprint story closes DONE and gets a successor. The catalogue needs more than one sprint, so a group that does not close in sprint 26 closes with what landed and continues in a successor story.
  • ores.web has its own standard. The Component Clean Standard is written around SQL, a repository, a service and a generated registrar, and the TypeScript packages have none of those. The TypeScript Clean Standard is its sibling: the same shape, one item per convention, and every item naming the check that proves it. It is written before the first line of journey code, because a convention recorded afterwards is a convention nobody followed.
  • Every journey has two clients. ores.web and ores.shell run the same server-side operation for each stage, so a journey is implemented once on the server and reached from both. The shell already carries several journeys as porcelain commands, and three recipes under doc/recipes/shell/provisioning/ run a whole system provisioning, one per provisioning path: acme_system_provision.org, barclays_system_provision.org and how_do_i_provision_the_system_with_acme_corporation_holding_group.org. A group's story therefore carries the shell side of its journeys in the same group, and a group that lines up only the browser has moved the disagreement rather than removed it.
  • A client's orchestration moves to the server, it is not duplicated. Where the shell drives several calls in sequence today, the accepted contracts put that sequence in one request. Both clients then call the same subject and neither owns the order.

7. Out of scope

8. Documents

Document Kind Purpose
User Journeys knowledge The catalogue this story implements.
User Journey Extraction Standard knowledge The method the second pass followed, and the section contract every journey carries.
Journey execution knowledge The four composition classes, where the transaction boundary sits, and why no journey entity is needed.
Extract the user journeys that replace the ores.qt screens story The extraction pass this story builds from.
TypeScript Clean Standard knowledge The checklist every TypeScript package in the tree passes, written for this pass because the Component Clean Standard governs C++ only.

Emacs 29.3 (Org mode 9.6.15)