User Journey: Run the public sources

Table of Contents

This page documents a user journey: A system administrator sees whether each public publisher's fixings are arriving, accepts or declines its terms, pauses or resumes it, asks for a backfill, and reads where each feed started.

A user journey describes what one person is trying to do, before anything is built. It is a design document that outlives any sprint, so it names the screens, the entity fields each screen shows, and the operations and messages each step needs.

1. Goal

"I want to know whether the rates we use are actually arriving, and to do something about it when they are not — accept a publisher's terms, pause one that costs too much, fetch a range we missed — without asking someone to run a command." The journey is done when the person has read the state of every public publisher, has acted on each one that needed it, and knows which feeds started from which published value.

2. Actor and trigger

The actor is the system administrator, because every public publisher is system data and a person accepts its terms on the system's behalf. Reading the publishers and the fixings needs marketdata::publishers:read and marketdata::market_fixings:read. Accepting or declining terms needs marketdata::publishers:accept_terms. Pausing, resuming and starting a backfill need a permission the server does not define yet, and deleting a publisher's fixings needs a delete permission the server does not define yet.

The trigger is one of four events. A publisher's terms change, and the person must accept them again or stop using its data. A fixing a desk needs is late, and the person looks for the cause. A pair or a publisher is new, and the person checks that its data arrives before anyone builds on it. A bill or a coverage review says a publisher is not worth its cost, and the person pauses it.

The journey starts at Market data, then Public rates, and ends when the person leaves the screen. A person who came from a feed's page returns there, because that page carries the value a run started from.

3. Steps

The screen is the record screen shape of the Record screen standard: a list of publishers, one publisher's page with its fixings, and a pair comparison. This journey adds the operational facts the screen already has data for and the two acts the architecture can carry.

  1. Read the publishers. The person opens Market data and then Official rates. The system lists every public publisher that has terms: its name, the kind of publisher it is, whether its terms are accepted at the version shown, the items it serves, and its freshness. The route that reaches it, Frankfurter or later another, is on the adapter's health, not on the row.
  2. Read the freshness. For each publisher the row states the last fixing's date, the time it was received, and whether the next expected publication is late. A publisher that has never had a fixing says so in words rather than showing a blank cell.
  3. Tell the three failures apart. An adapter that is not serving, a publisher whose next publication is late, and a publisher that has never had a fixing read as three different states, each with the sentence that says what to do. The adapter's state, heartbeat and the ids it refuses come from the adapter status read the marketdata service already answers.
  4. Accept or decline terms. The person opens a publisher whose terms are not accepted, reads the terms page and the credit it asks for, and accepts them at the version shown or declines. The service refuses an acceptance of a version that changed since the person read it, and the screen reloads and says so. The service fetches a publisher only after someone accepts its terms.
  5. Read a publisher's fixings. The person opens the publisher and reads its series as a table and a chart over a window, one item at a time. Each value keeps the publisher's own id of the item and the time it was received.
  6. Compare a pair. The person compares one pair across every publisher, as published, inverted, or crossed through the publisher's base, and the screen names the route of each value.
  7. Pause and resume. The person pauses a publisher that is not worth its cost, and the system stops demanding its items. The fixings the publisher already published stay, and a feed that started from one keeps its start. Resume restores the demand. Each act is audited with an actor and a reason.
  8. Force a fetch. The person opens the Fetch tab, picks today, yesterday or a range, all publishers or one, one pair or every pair, and asks for it. The service asks the adapters for exactly that, and the screen says the fetch is running and names the days it has fetched. A range that overlaps what the store holds adds nothing, because the store skips a fixing it already has.
  9. Delete the fixings of a publisher whose terms withdrew storage. When a new terms version withdraws permission to store, the person deletes that publisher's fixings. The deletion records who did it and when, and the screen says which feeds started from a value that is now gone.
  10. See where a feed started. From a synthetic feed's page the person reads the publisher, the item, the value as published and the time it was received of the fixing the run started from. The screen links back to this one.
  11. See who changed it. The person opens the publisher's history: terms acceptances and declines, pauses and resumes, backfills and deletions, each with its actor and its reason.
  12. Read the availability of one underlying. The person opens the Availability tab and picks a pair. The system lists each publisher that fixes the pair, with the first and last date it holds, the count, and the gaps. A publisher whose terms are not accepted shows as a row with no data and the reason.
  13. Compare the publishers. The person opens the Compare tab for the same pair. The system draws each publisher's fixing over the window on one axis, the difference of each against the others in basis points, and the largest disagreement. It names the publisher whose value is furthest from the rest.
  14. Read one publisher's history for one underlying. The person opens the publisher and picks the pair. The system shows the fixings over the window, the corrections, the days with no value, and the feeds that started from a value, with the value each took.
  15. Read a publisher's configuration. The person opens the publisher's record page. The Details tab shows its name, kind, terms page, credit, credential reference and whether storage is allowed. The History tab is the shared timeline: every version and every acceptance, with the person and the time.
  16. Leave. The person returns to Market data.

4. Two screens, and the words they use

Setup and reading are two jobs for two people. Connectivity configures who publishes, who supplies, and how a feed is delivered. Public rates reads the values and says whether they are arriving. A person moves between them through a link on the publisher's page and on the feed's page.

The journey uses the words of the model. Each word has one meaning and one example.

Word Meaning Example
Publisher Owns the ids, the credit and the terms. ecb, imf, ust, bloomberg for its own data
Supplier Who we contract with and connect to. frankfurter, synthetic
Adapter Code class that speaks one supplier protocol. frankfurter 0.0.29, synthetic 0.0.29
Session One configured adapter: supplier, environment, endpoint, credential, settings. frankfurter-eu (production)
Environment Where a session runs. production, test, dr, simulated
Service What a session offers; it decides the feed's shape. real_time, delayed, end_of_day, reference, historical
Feed One publisher on one service through one session, with key, scope and schedule. ecb-frankfurter
Route A party's feed for one publisher and one asset class. System Party, ecb, FX → ecb-frankfurter
Item The internal identity a value is stored under. FX-ECB-EUR-CAD
Fixing The daily value a public publisher publishes for one item. the ECB EUR/CAD fixing, 1.5638 on 2026-10-28
Screen Surface The question it answers
Connectivity Publishers Which publishers are there, what are their terms, and which feeds serve them?
  Suppliers What is the delivery tree: supplier, its sessions, and the feeds off them?
  Adapters What code does the release provide, with which services and configuration schema?
  Feeds Every feed: publisher, supplier, session, service, scope, schedule, state
  Publisher record The terms, and the feeds that serve each class
  Supplier dashboard The contract, sessions, coverage, feeds needing attention, and recent activity
  Session record Endpoint, environment, credential, settings, services, runtime, feeds
  Feed record Publisher, service, publisher key, scope, schedule, routes
Public rates Publishers Which publisher and class are arriving, through which routed feed, and how fresh?
  Publisher record What did it publish per class, over time, and which routed feed serves it?
  Availability For one underlying, what does each publisher hold, through which feed, and what gaps does it have?
  Compare For one underlying, how far apart are the publishers' values, and which one is off?
  Fetch Ask for data now: a day or a range, one publisher or all, one pair or every pair

The schedule is not the reading screen's. The scheduler runs a job for each feed on the publisher's rhythm for the end_of_day service; a real_time feed is demand driven. The Fetch tab sends the same request on demand, so one request serves the schedule and the person.

5. Screens and wireframes

Two screens. Connectivity draws the delivery tree: supplier → session → feed, with the adapter on the session. Public rates draws the publishers with a freshness line and the feed that serves each class, the publisher page, the fetch range dialog, and a pause dialog that names what stops and what stays.

wireframe_run-the-public-sources.png

Figure 1: Connectivity with its supplier, session and feed tree, and Public rates with the publisher list, one publisher's fixings, the comparison and the fetch range.

Every step is judged against what the standard draws today, and what the server answers today.

Step Shape on the screen Judgement
1 The publisher list of the standard The screen already draws it
2 A freshness line on each row: last fixing, received, next expected A view no rule draws yet; the data is joined from the fixings read and the adapter read
3 A state badge on each row, with the sentence below the list A kind's own state, by RS-PAGE-03; needs the three sentences fixed
4 Accept terms from the row, at the version shown The screen and the service already do it
5 The publisher page's fixings table and chart The screen already draws it
6 The pair comparison The screen already draws it
7 Pause and resume from the row, with a dialog A missing server operation; see Decide how a publisher is paused
8 A range dialog and a progress state A missing server operation; see Design a backfill request on the adapter contract
9 Delete fixings offered after a withdrawal A missing server operation and a permission
10 The feed page's start notice Already built; the screen shows where a run started
11 The shared timeline of the publisher The standard's history tab, once the acts exist

6. Prototype

6.1. Connectivity

Directory
doc/prototypes/market_data/connectivity/
Note
the design note
Tabs
index.html, ?tab=suppliers, ?tab=adapters, ?tab=feeds
Publisher
?publisher=ecb&pbtab=overview|feeds|history
Supplier
?supplier=frankfurter&sutab=overview|sessions|history
Session
?session=frankfurter-eu&setab=overview|feeds|runtime|history
Feed
?feed=ecb-frankfurter&ftab=overview|underlyings|schedule|routes|history
New session
?add-session=1&supplier=frankfurter
New feed
?add-feed=1&publisher=ecb

6.2. Public rates

Directory
doc/prototypes/market_data/public-rates/
Note
the design note
Surfaces
?tab=publishers|availability|compare|fetch
Publishers
?tab=publishers&filter=serving|not serving|terms, ?paused=muted|hidden, ?terms=withdraw
Publisher record
?publisher=ecb&rtab=overview|underlyings|fixings|history
Availability
?tab=availability&class=fx|ir
Compare
?tab=compare
Fetch
?tab=fetch, &fetch=progress, &fetch=done

Both are static pages: no build, no server, no session. Connectivity draws the delivery tree and the five records. Public rates draws the publishers, their feeds, the values and the fetch.

7. Entities composed

Entity What it contributes Model
publisher The name, the kind and the terms state projects/ores.marketdata/modeling/ores.marketdata.publisher.org
supplier The delivery party, its contract and support the supplier catalogue
adapter The code module, its version, services and schema the adapter catalogue
session Supplier, adapter, environment, endpoint, credential, settings the session model
feed Publisher, session, service, publisher key, scope, schedule the feed model
route The party, the publisher, the class and the feed projects/ores.marketdata/modeling/ores.marketdata.route.org
publisher terms The terms page, the credit, whether storage is allowed, and who accepted which version the same model
feed The feed name, publisher, session, service, default flag and description the feed model (the code calls it market_data_source today)
route The party, the publisher, the class and the one feed it reads projects/ores.marketdata/modeling/ores.marketdata.route.org
adapter The runtime identity, its state and the ids it serves and refuses projects/ores.marketdata/modeling/ores.marketdata.adapter_operations.org
market_fixing The values of a publisher's item, with the publisher's publication time and the time received projects/ores.marketdata/modeling/ores.marketdata.market_fixing.org
market_series The series an item is stored under, per party projects/ores.marketdata/modeling/ores.marketdata.market_series.org
market_data_mapping, market_data_vendor_instrument The publisher's own vendor id of an item the marketdata vendor models
adapter status The state, the heartbeat and the ids an adapter serves or refuses; a read, not an entity marketdata.v1.ops.list_adapter_status
fx_spot_fixing_item The ranked items a synthetic feed may start from projects/ores.synthetic/modeling/ores.synthetic.fx_spot_fixing_item.org

8. Operations and messages

Step Operation Subject Status
1, 4 List the public publishers with their terms and series marketdata.v1.publishers.list exists
4 Accept or decline a publisher's terms at a version marketdata.v1.ops.accept_publisher_terms exists
5, 6 Read the fixings of up to twelve series marketdata.v1.ops.get_fixings exists
2, 3 Read every adapter's state, heartbeat and counts marketdata.v1.ops.list_adapter_status exists
10 Read where a feed run started synthetic.v1.feed_configs.list exists
7 Pause or resume a publisher none yet missing
8 Ask an adapter for a date range none yet missing
9 Delete a publisher's fixings, with an actor none yet missing

9. What is missing

  • Pause and resume a publisher. The download follows demand, so the act is either a demand change or a new publisher state. The decision is Decide how a publisher is paused. Until it exists the screen states that a publisher is fetched because the system party subscribes to it, and names the subscription.
  • A fetch on demand and on a schedule. The adapter contract carries announce, demand, tick and heartbeat, and no fetch request. One request must serve the scheduler's job and the screen's Fetch tab, and the design is Design the refresh request the scheduler and the screen share. Until it exists the screen offers only the window the service fetches on its own.
  • Deleting a publisher's fixings. The durable table is never deleted today, because the terms in force when a value was stored keep it. A terms version that withdraws storage needs an act with an actor, which Decide how a publisher is paused carries alongside the pause.
  • Freshness in one read. The fixings read answers one item at a time, so the screen reads the latest fixing of every item a publisher serves. A single read that answers the last fixing of each series would make the row cheap; until then the screen reads the publisher's best item and says which one it read. The row and the three states are Show each publisher's freshness and its adapter's health.

10. Related journeys

11. Related knowledge

12. See also

Emacs 29.3 (Org mode 9.6.15)