feat: make the run reachable, and stop the control room repeating itself - #25
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Six fixes from a design pass over all seven screens. One of them is a functional
hole rather than a cosmetic one.
87% of the failures could not be opened
The queue rendered
build_queue(..., limit=200)and stopped. On this run that is200 of 1,605 — no pagination, no "load more", no search box anywhere in the app.
The other 1,405 payments existed in the ledger and were unreachable through the
UI.
Worse than a missing feature: the cut is by amount descending, so the unreachable
ones are the small payments, which is precisely where "we deliberately did
nothing because it was not worth the cost" lives. That is a headline claim with
its evidence behind an invisible cap.
Now: a search box (payment id, cause, method, reported reason), 100 per page, and
a pager that carries the filters. A test walks every page and asserts the union
equals the total.
The control room said everything twice
Measured before the change: the top scoreboard read
₹3,94,791 · ₹5,41,724 · ₹1,48,627 · 926 · 903, and the replay row beneath it read₹5,41,724 · 1,605 · 2 · 926 · 903. Three of five identical, same tile style,same weight — because the scrubber defaults to "Now", so it showed the finished run
already stated above it. Two accent "headline" tiles competed on one screen.
The replay is now a lighter, borderless readout of quantities that only mean
something at a moment: recovered so far and what share of the final total that
is, failures that have arrived yet, how many are still in flight, and spend to
date. Nothing on it duplicates the scoreboard, and there is one headline tile per
screen again.
The studio promised a comparison it did not show
Its own empty state read "The table will compare the result against the committed
run" — while showing an empty box. There was nothing to compare to until after
you had already run something.
The committed run is now the panel's default content, marked as the "before".
Content fill went from ~55% of the viewport to 82%.
Also
A tab icon. There was no
<link rel=icon>at all — seven screens, seven blanktab icons. It is an inline SVG data URI of a rising line, so it costs no request and
adds no binary to the repo. Plus a meta description and OG tags, so the link unfurls
as something when shared.
Case stepping. Reading a second case meant going back to the queue and finding
your place. There are now Larger/Smaller controls walking the queue's own
amount-descending order.
Run identity at every width. The seed sat in the rail footer, which is
display: nonebelow 900px — whilebase.html's own comment says "the seed is onscreen at all times because every number shown is a function of it." It now lives
in the top bar alongside when the run was computed, which was recorded in
run.jsonand displayed nowhere.A leak caught while wiring
The first version of the case route called
open_ledgertwice per request andclosed one of them. Both reads now share one open.
Verification
pytest— 513 passed, 11 new.ruff check .clean.Driven in the browser: search for "insufficient" returns
1–100 of 326with aworking pager that preserves the query; case navigation resolves to the correct
neighbours; the studio renders all four committed arms; the favicon loads; no
console errors; no horizontal scroll.
%-din the date filter was POSIX-only and raised on Windows — caught beforecommit, now built from parts.