User Journey: Give a report its cut

Table of Contents

This page documents a user journey: A market-risk owner gives a report its cut on create or update, reads what the selection would resolve to now, runs the report, and follows the run that resolved the selection to one body and recorded it, with the badge and the run's card stating what the report prices from.

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.

The decision behind it is The cut is the body a run prices from: a report carries a cut selection, the run resolves it to a concrete cut, and the cut is the body the run prices from. The journey replaces an earlier one that imagined a pricing screen choosing a cut: there is no two-way pricing in the product, reporting is the only surface, and a cut is selected where a report is defined rather than where a price is looked at. It also replaces the market bindings the earlier binding decision put on the run settings, which that decision now records as superseded in part.

1. Goal

"Reports in this list all look the same, and I cannot tell which of them prices from yesterday's close and which from the moment I press Run. I want to say what a report prices from, once, where the report is defined; to see on the report that I have; to be told before I run it when the cut it wants does not exist or is not signed; and to have the run's own record name the body it priced from, so that the number in the report and the cut on the cuts screen are one object and not two."

The journey is done when the report's badge states its selection, the run has resolved that selection to one cut and recorded it, and the run's card names the body, its timepoint and what the selection resolved from.

2. Actor and trigger

A market-risk owner runs this journey, or a tenant administrator acting for the party. Both act inside their own tenant, on a report definition their party owns.

Three permissions decide what the person sees. Reading the cuts a selection may name needs reporting::cuts:read. Setting the selection needs reporting::report_definitions:write, because the selection is a property of the definition and changes with it. Running the report is reporting::report_instances:write, through reporting.v1.ops.trigger_report_instance, and that same permission is what lets a LIVE selection mint a cut. An action the person may not take is not drawn, as the Record screen standard requires.

The trigger is a result nobody can account for, or a report whose numbers are not the ones the desk means. A run completed and the question is which body it priced from; the answer available today is a valuation date, and the store answers that date differently a week later. The person opens the reports list, sees a badge that says nothing about the body, opens the report, and the journey ends on the run's page with the cut named.

This journey does not take a cut by hand: that is Take a cut. It does not approve a published curve, and it does not read what a run produced, which is Read what a run produced.

3. Steps

3.1. Step 1: read what the reports price from

  1. Open Reports. The reports list is See the reports a party runs's, with one addition: a Cut column carrying the selection's badge.

    Column What it holds
    Report The definition's name, and its type under it
    Cut The selection's kind as a badge, and under it the fact that qualifies it: no cut selected, pinned for a specific cut, indicative for a kind whose values are
    Cycle eod or intraday, as the report's page states
    Latest run The health word the list already draws
    Last run The instant, relative
  2. Read the badge. A person who reads thirty-one reports sees which of them price from the close, which from the open and which from the run itself, without opening one. The badge is a classification of the report and not a status, so it borrows no green, amber or red; the health of the last run stands where it already stands.
  3. Open the report and read the selection beside the runs. The report's record carries the Definition tab with its selection, and the Market tab with the selection beside the cut the last run resolved. The two are different facts and the tab says so: the selection is what the report will resolve next time, and the resolved cut is what the last run used.

3.2. Step 2: give the report its cut

  1. Set the selection on create. The create flow's step that names the report gains one field: the cut selection, with the kinds the party may select and the cuts already taken. The default is the end of day kind, because most reports cover a day, and a report created without a choice says no cut selected on its badge and is refused at its first run with the sentence that names what it lacks.
  2. Set the selection on update. The Definition tab's Edit opens the record dialog with the selection among the definition's own fields. It is written with the rest of the definition, in one version, with a change reason and a commentary; a change to the selection is a material change, because it moves what the report prices from.
  3. Read what each kind resolves to. The field offers the kinds the party's cut type list holds, each with the sentence that says what it resolves against: End of day — the close of the date this report covers, Month end — the close of the date's month's last business day, Year end — the close of the year's last business day, Start of day — the open of that date, Independent verification — the signed verification cut of that date, Live — the instant you press Run, and the body it fixes is indicative. The kinds are read from the type list rather than named here, so a firm that adds a kind adds it once. A kind the party has taken no cut for is still offered, because the party may take one; the preview says what it would need.

6a. Read the family's fallback. A report that selects the ordinary close prices from the body fixed on the date, whether that body was taken as an ordinary close, a month end or a year end, because the family fixes the same four inputs at the same centre's close. A report that selects the month end is stricter: it needs the month end cut, because the longer retention is the reason the occasion exists and a plain close of that day was not kept as one.

3.3. Step 3: read the preview, which is the resolution

  1. Read the preview. Beside the field, the dialog draws what the current choice would resolve to now, computed by the run's own operation: the cut's label, its kind, its timepoint, its state, its authoriser and the counts of its body, or the sentence that would refuse the run. EOD would resolve to EOD.ACME-LONDON.2026-10-06, authorised by a.reyes, 1,284 deals and 3,912 values is the common reading; EOD would resolve to nothing: no end of day cut of 06 October exists for these books is the other.
  2. Read the preview's refusals. The preview refuses what the run would refuse, in the run's words, and each names what would make the selection usable.

    What the preview finds What it says
    No cut of the kind and date exists That no cut of that kind covers the date, for these books and this centre, and that somebody must take one. For a month end or year end selection it names the last business day it looked at
    A cut that is taken and unsigned That the cut is waiting on its kind's authorisation, and the request and account it waits on
    A cut whose body is incomplete That its body has gaps, and where they are read
    A cut that was refused That its authorisation was refused, and that the remedy is a new take
    A pinned cut that has been superseded That a later cut replaced it, and that a rerun may still name it on purpose
    A scope spanning two centres That no one cut values books that read two centres, and that the report's scope must be narrowed or split
  3. Select a specific cut where the kind is not enough. A person who means one body — to reproduce an earlier result, or to pin a report to the body a client was shown — selects the cut itself from the list of the party's cuts, filtered by kind and date. The badge then reads the kind with pinned under it, and the selection resolves to that cut whatever the date, which is the one way a report can price from a body that is not of its own date.

3.4. Step 4: run the report, and follow the resolution

  1. Run the report. Run now is Run a report and watch it finish's press. The dialog names the cut the selection resolves to before the press, in the same words the preview used, so the person is not asked to trust a tab they read an hour ago.
  2. Let the run resolve and gather. The run resolves the selection first, records the cut and its timepoint, and then gathers: the deals from the cut's population and the market data from the cut's fixed snapshot, in one body and not two halves at two instants. A resolution that yields nothing refuses the run before the engine is reached, and the run's output message carries the same sentence.
  3. Read the run's record. The run's page carries the card that names the body: the cut's label, kind, timepoint and scope, the counts of its parts, its basis — the authoriser where the kind requires one, and that the kind requires none where it does not — and the selection it resolved from, which may have moved since. The run's `priced_at` is the cut's timepoint, so the date the report states and the body it used are one fact.

3.5. Step 5: the LIVE report, which has no cut until it runs

  1. Select Live and read what it promises. The preview cannot name a cut, and says so instead: LIVE will fix a body at the instant you press Run, and every result it prices is marked indicative. The badge reads LIVE with no body until a run under it.
  2. Run it. The run resolves the selection to a cut it mints at its own instant: the four inputs at that instant, the taking identity being the run acting for the account that pressed it, and no authorisation, because the run mints and consumes the body in one act. The cut appears in the cuts list with its instant in its label, in the In use state, marked indicative.
  3. Read why it is different. The run's card states that the cut was minted by this run, that its values are indicative, and that the result is reproducible only by naming that cut. A rerun of the same LIVE report tomorrow is a new body: the comparison verdict says cannot be compared for the retake reason, which is the same verdict a retaken daily cut draws.

3.6. The audit of the selection**

  1. Read the definition's history. The selection is a field of the definition, so its changes merge into the report's History tab: the selection before and after, the account, the instant and the reason. A run already produced keeps the cut it recorded, so the history explains the difference between two runs rather than relabelling them.
  2. Read the cut's consumers. The cut's Runs tab lists the runs that priced from it, and the Market tab of each report names the selection that resolved to it. That is the question a person asks before a cut is superseded — what still rests on this body? — and it is the same fact read from each side.

4. Screens and wireframes

Three surfaces, all of them reporting's. The reports list gains a Cut column. The report's record gains the selection on its Definition tab and the resolved cut on its Market tab. The run's page keeps the binding decision's card, read through the cut, and gains the sentence that names the selection it resolved from.

No surface selects a cut while pricing, because there is no pricing surface: a cut is selected where a report is defined, and a price is read where a run is recorded.

The judgement, per step, against the standards.

Step Shape on the screen Judgement
1 to 2, the list The standard's list with one column of the design's own RS-LIST-09 to RS-LIST-15, and the badge is a cell drawn by the cell rules
3, the record The report page's tabs, each stating what it decides The entity screen specification's tabs
4 to 5, the selection A field on the create flow and on the definition's dialog RS-WRITE-01 to RS-WRITE-16; the field is a record kind and so a picker
6 to 9, the preview A panel beside the field, computed by the run's operation No rule draws a resolution preview; the prototype defines it and What is missing records the gap
10 to 12, the run The run's page, its card and its refusal The binding decision's card and the run journey's page
13 to 15, LIVE The same field and the same card, with the indicative sentence A kind's own words on the screens that already exist
16 to 17, the audit The report's timeline, and the cut's Runs tab RS-HIST-01 and RS-RELATED-04

wireframe_give_a_report_its_cut.png

Figure 1: The report's cut: the reports list with the badge, the selection with its preview, the run that resolved it, and the LIVE report whose body exists only after the run.

5. Prototype

The the cut prototype draws this journey on four of its surfaces: the reports list with the badge, the report's record, the selection dialog with the preview, and the run that resolved. Its design note records the states and what is fake.

It must draw a report with no selection, one that selects the end of day kind, one that selects the start of day kind, one that selects LIVE, one whose selection resolves to nothing, one pinned to a specific cut, one whose cut is taken and unsigned, a run that resolved and recorded its cut, and a LIVE run whose resolved cut exists only because the run minted it. Every value is a fixture.

6. Entities composed

Entity What it contributes Model
report_definition The report, which gains the cut selection: the kind code, and the cut where the selection names one ores.reporting.report_definition
the cut kind The type a selection names: its family, whether it is signed, whether its values are indicative, the rule that resolves it and its retention The cut is the body a run prices from
the cut The body the selection resolves to, its state, its parts and its acts The cut is the body a run prices from
report_instance The run, which gains the cut it resolved, the cut's timepoint, and the selection it resolved from ores.reporting.report_instance
configuration The run settings, which keep the valuation date the resolution reads and lose the market bindings ores.reporting.configuration
report_configuration The slot that ties the definition to its configurations, which is where the covered date is read ores.reporting.report_configuration
configuration_market_binding The row this journey retires: a report's market role and the published set it named ores.reporting.configuration_market_binding
curve_publish The publish record the cut's market data half holds, which is what the retired row used to name ores.marketdata.curve_publish

The row this journey writes is the definition's selection, one version at a time, and the run writes the cut it resolved. The definition does not hold the resolved cut — a run does — because a selection is a rule and a resolution is an event.

7. Operations and messages

Step Operation Subject Status
Step 1, the list List a party's definitions with the cut selection and the latest run's health reporting.v1.report_definitions.list exists; the selection is missing from the row
Step 2, the record Read one definition and its selection reporting.v1.report_definitions.get exists; the selection is missing
Steps 4 to 5, the write Write the selection with the definition reporting.v1.report_definitions.put exists; the fields are missing
Step 6, the kinds Read the kinds the party may select, with the sentence each resolves against reporting.v1.cut_selection_kinds.list missing
Step 9, the cuts offered List the party's cuts, filtered by kind and date, with their state reporting.v1.cuts.list missing
Steps 7 to 8 and 13, the preview Resolve a selection to a cut now, with its state and the sentence that would refuse it reporting.v1.ops.resolve_cut missing
Step 10, the run Trigger a run of one definition reporting.v1.ops.trigger_report_instance exists
Step 11, the resolution Resolve the selection at the run, and mint a LIVE cut where the kind is LIVE reporting.v1.ops.resolve_cut, and reporting.v1.ops.take_cut for the LIVE case missing
Step 11, the body Read the cut's deal population and its fixed snapshot reporting.v1.ops.gather_trades and gather_market_data read the store by date partial, shape changes
Step 12, the run's record Record the cut, its timepoint and the selection reporting.v1.ops.record_run_pricing records the date and the note exists; the cut is missing
Step 16, the history Read the versions of a definition reporting.v1.report_definitions_versions.list exists
Step 17, the consumers List the runs that priced from a cut reporting.v1.cuts.get would carry them missing
The screen itself Read and choose a cut from the browser (no BFF route serves reporting, and none serves cuts) missing

The resolution is one call and it is the same call for a preview and for a run. That is the point of it: a preview computed by a second code path is a preview of that path and not of the run, which is how a person comes to trust a screen that lies.

8. What is missing

  1. No cut exists to select. Everything this journey draws waits on the entity the decision note describes. Until it exists the preview has nothing to resolve and the card has nothing to name.
  2. The definition has no selection. report_definition carries no field for a cut kind or a cut, so the list cannot draw a badge and the dialog cannot set one.
  3. The run records a date and not a body. record_run_pricing carries priced_at and price_note. A cut is the answer that survives a correction to the store, and the run needs the field and the timepoint.
  4. No resolution exists. Nothing reads a selection and answers a cut. The rule is stated here and on the decision note; the operation, its refusals and its one sentence are missing.
  5. The gathering steps re-read the store. Neither step reads a fixed body, so a run of a resolved cut would price from whatever the store holds when the step runs. The Trade cut page states the defect in the population and the Market data cut page states it in the market data.
  6. The preview is a new part. No rule draws a resolution preview, and the shape it needs — a panel that states what a choice resolves to and what would refuse it — is the prototype's one addition to the standards.
  7. The picker over cuts is not a standard part. RecordPicker reads its whole kind once and draws no state, and a cut is filtered on the server and carries a derived state. The screen needs its own picker or the shared one needs a filtered form.
  8. No market card that reads through the cut. The binding decision's card reads the publish records the run recorded. Read through a cut it reads the cut's market data half, and the two must not disagree: the run records the cut, and the card reads the sets from it.
  9. The retired row still exists. configuration_market_binding, its tab and its picker are in the schema and in the signed-off screens, and nothing yet says in the schema that a run ignores them. The decision to retire them is recorded; the removal is work.
  10. No route and no screen for reporting. The reports list, the report page and its tabs do not exist in the web application, so this journey's surfaces are new with the reporting group's.

9. Related journeys

10. Related knowledge

11. See also

Emacs 29.3 (Org mode 9.6.15)