Story: Build the bindings screen and clear the oresmd snags

Table of Contents

This page documents a story in Sprint 28. It captures the goal, current status, acceptance criteria, and the tasks that compose it.

1. Goal

A person lists bindings, says what each source writes and when it last ticked, binds and rebinds a party to a source, enables and disables a binding, and starts or stops the feed behind it, with the oresmd snags cleared.

2. Status

Field Value
State DONE
Parent sprint Sprint 28
Now Nothing.
Waiting on Nothing.
Next Nothing.
Last touched 2026-10-24

3. Acceptance

The story closes on the tasks it finished:

  • Add a time window to the series page.
  • Add, edit and delete a binding.
  • Build the bindings list and record page.
  • Check the bindings screen on the running server.
  • Find a convention stored under the reverse pair.
  • Find why the synthetic feed went quiet.
  • Give hints a tooltip with keyboard access.
  • Link the oresmd URI column of the feed lists.
  • Move the series page state into a pure function.
  • Put Bindings in the Market data menu.
  • Run the series title test in CI.
  • Say which sources a party may bind.
  • Scope a binding's history to its party.
  • Share one copy hook between the oresmd dialogs.
  • Show a binding's history as the timeline.

4. Tasks

Task State Start End Description
Add a time window to the series page DONE 2026-10-18 2026-10-18 The series page reads the latest observations by count. A synthetic feed ticks every two seconds, so the latest 500 cover a few minutes. Offer a window of time.
Add, edit and delete a binding DONE 2026-10-17 2026-10-17 Add the record dialog for add and edit, and the delete dialog, with the checks the prototype shows: the held series, the series change and the stale version.
Build the bindings list and record page DONE   2026-10-15 Draw the list and the record page of the signed-off prototype from the shared record parts: Details, the oresmd links with Inspect, the status and the last tick.
Check the bindings screen on the running server DONE 2026-10-21 2026-10-22 Check the built screen against the signed-off prototype on the running server, in both scenarios.
Find a convention stored under the reverse pair DONE 2026-10-18 2026-10-18 A spot rate looks up the convention of its pair as the unit currency over the quoted currency. A convention stored under the reverse pair is not found and the plain format shows.
Find why the synthetic feed went quiet DONE 2026-10-18 2026-10-18 The newest synthetic tick of AUD/USD was an hour old at the last check, after the marketdata service was restarted. Find out whether the restart stopped the feed, and what a person must do to bring it back.
Give hints a tooltip with keyboard access DONE 2026-10-18 2026-10-18 The tooltip on the oresmd URI label of a feed is a native title, which a touch screen and a keyboard do not show. Add one shared tooltip and use it for the hints.
Link the oresmd URI column of the feed lists DONE 2026-10-18 2026-10-18 The list column called oresmd URI on the IR and FX feed screens is plain text. Draw it as the link and button that the detail view has.
Move the series page state into a pure function DONE 2026-10-18 2026-10-18 The series page picks one of seven states by a chain of conditions in the component. Move the choice into a pure function that a test can cover.
Put Bindings in the Market data menu DONE   2026-10-15 Add the Bindings card to the Market data area with its route, its trail and its words in English, French and Portuguese.
Run the series title test in CI DONE 2026-10-18 2026-10-18 The Catch2 case that every series title names only its own fields was built and never run, because the test binary needs the database of the environment. Run it in CI and make sure it is in a job.
Say which sources a party may bind DONE 2026-10-16 2026-10-16 Add server reads for the synthetic sources a party does not consume yet, what each would write, and which running feed already writes a series.
Scope a binding's history to its party DONE 2026-10-17 2026-10-17 The server reads a binding's history by source name and takes the newest row of any party that holds the name, so a party can be shown another party's history. Scope the read to the caller's party.
Share one copy hook between the oresmd dialogs DONE 2026-10-18 2026-10-18 The editor and the read-only view of an oresmd URL each hold the same copy-to-clipboard code: a timer, an unmount cleanup and a try and catch. Move it into one hook.
Show a binding's history as the timeline DONE 2026-10-17 2026-10-18 Draw the History tab of a binding as the shared timeline, with the revert dialog and the checks the prototype shows.

5. Decisions

  • Closed at sprint 28 close with its 15 done tasks. The 1 open task and the original acceptance moved to Build the bindings screen and clear the oresmd snags — the remaining work in the product backlog inbox.
  • A binding is named for what it writes, not for what it consumes. The output target is the title of the record page and the first column of the list; the source it consumes follows, and stays in the key line. Marco decided this on 2026-10-15, reversing the prototype's order, which named the page for the source and put the series in the subtitle.
  • The series on the list is plain text, not a link. Marco decided this on 2026-10-15; the link misled.
  • The access mark is drawn before the Edit action exists; the actions arrive with the task Add, edit and delete a binding. Marco accepted the mark standing alone on 2026-10-15.
  • The Bindings card lives in the Market data area, after Synthetic, gated on marketdata::feed_bindings:read. Built under this story rather than left to its own task.
  • The sources a party may bind are joined to its bindings in the BFF, not in the database. No service user reads the other service's tables, and this screen is not the reason to start. Which running feed holds a series stays a server read, because only the synthetic service's feed controller knows it.
  • A binding's source is chosen from a record picker over a read-only store, not a choice. A choice renders every option through a translation key, and the sources are the party's own rather than a fixed enumeration the words can name.
  • The title cases in the marketdata core tests get no CI job of their own. The Continuous Linux run already executes the binary, and its log names both cases, so a second way to run them would be a job to keep green for no new evidence.
  • The pair store keeps one direction per pair, and the series page does not look up the reverse pair. The stored places describe the stored direction's magnitude, so the page says that the pair has no convention in the direction the series quotes, and keeps the plain format. Decided on 2026-10-18 from 179 pair rows and 179 convention rows with no reverse twin.

6. Out of scope

Emacs 29.3 (Org mode 9.6.15)