Prototype: the Cinder admin surface #122

Closed
opened 2026-08-17 15:22:45 +07:00 by sulthan · 8 comments
Owner

Part of #114
Blocked by: #115

Question

What does a dense operations view look like without leaving Cinder?

Cinder pins one --measure: 760px column and forbids cards, corners, and shadows; tokens are the
:root block in backend/internal/web/static/style.css, and the source of truth for the visual
language is the Claude Design project BookmarkManager Web UI
(969ac210-fe02-4c01-ae1b-9a271dcc779a). A conventional dashboard grid violates all of it, and
the whole reason this map exists is that the current page does not read as an operations surface.

Settled: this is an explicit extension of Cinder, negotiated in that project — not a second
visual language.

Make a rough, concrete artifact to react to: the summary line, a Lane block, a Series list row
carrying several facts and an action, and the Series detail page. Then decide:

  • Whether admin gets a wider measure, a second measure token, or stays at 760px with denser rows.
  • How a multi-fact row reads without becoming a card or a table with borders.
  • Where per-row actions sit, and how confirm-gating (.confirm-row) survives at list density.
  • Which new tokens, if any, the extension needs — and confirm the core law holds: --ember means
    new chapter only, destruction gets --danger, both colour branches touched together.

Link the prototype from this issue rather than pasting it.

Added by #115

The surface to prototype is four pages behind one nav row (Overview · Lanes · Readers · Series,
beside the existing Library ghost link), not one stacked page: /admin (summary line, stats block,
per-Site table), /admin/lanes, /admin/readers, /admin/series (filterable list), and
/admin/series/{key} (detail plus intervention). The open visual questions are the density of the
per-Site table and the stats block, and how the nav row reads in Cinder; the phone viewport follows
whatever density this settles.

Part of #114 Blocked by: #115 ## Question What does a dense operations view look like without leaving Cinder? Cinder pins one `--measure: 760px` column and forbids cards, corners, and shadows; tokens are the `:root` block in `backend/internal/web/static/style.css`, and the source of truth for the visual language is the Claude Design project `BookmarkManager Web UI` (`969ac210-fe02-4c01-ae1b-9a271dcc779a`). A conventional dashboard grid violates all of it, and the whole reason this map exists is that the current page does not read as an operations surface. Settled: this is an explicit *extension* of Cinder, negotiated in that project — not a second visual language. Make a rough, concrete artifact to react to: the summary line, a Lane block, a Series list row carrying several facts and an action, and the Series detail page. Then decide: - Whether admin gets a wider measure, a second measure token, or stays at 760px with denser rows. - How a multi-fact row reads without becoming a card or a table with borders. - Where per-row actions sit, and how confirm-gating (`.confirm-row`) survives at list density. - Which new tokens, if any, the extension needs — and confirm the core law holds: `--ember` means new chapter only, destruction gets `--danger`, both colour branches touched together. Link the prototype from this issue rather than pasting it. ## Added by #115 The surface to prototype is **four pages behind one nav row** (`Overview · Lanes · Readers · Series`, beside the existing `Library` ghost link), not one stacked page: `/admin` (summary line, stats block, per-Site table), `/admin/lanes`, `/admin/readers`, `/admin/series` (filterable list), and `/admin/series/{key}` (detail plus intervention). The open visual questions are the density of the per-Site table and the stats block, and how the nav row reads in Cinder; the phone viewport follows whatever density this settles.
sulthan added the wayfinder:prototype label 2026-08-17 15:22:45 +07:00
Author
Owner

From #119 (closed), two controls the prototype now has to carry: a Series row with Check now (not confirm-gated) plus an ageing pending marker check requested <age> ago and no ETA; and a Lane row with a pause duration picker (1h/6h/24h), Pause, and Resume on an already-paused row. A paused Lane must read as paused rather than as stalled or quiet. Accent is the existing .attention class — never --ember, never --danger.

From #119 (closed), two controls the prototype now has to carry: a Series row with **Check now** (not confirm-gated) plus an ageing pending marker `check requested <age> ago` and no ETA; and a Lane row with a pause **duration picker** (1h/6h/24h), **Pause**, and **Resume** on an already-paused row. A paused Lane must read as paused rather than as stalled or quiet. Accent is the existing `.attention` class — never `--ember`, never `--danger`.
Author
Owner

Added by #118 (closed) — the Series list frame is now specified, so the prototype has a frame to
fill rather than invent:

  • Filter row: plain links, one active at a time (SeriesFilter.Filter holds one value), the
    active one marked with the existing .attention class, plus an All series reset. ?site=
    and ?kind= are separate controls that stack on top. Never --ember, never --danger.
  • Heading: <N> series · <label>, using #116's COUNT(*) OVER () total.
  • Empty state: names the filter it is empty for ("No Series with no cover"), not a bare
    "nothing here".
  • Landing stats block: eight hygiene rows in this order — No series URL, Never read a chapter,
    No Readers, Never checked, Not checked in 12h, No cover, Latest from a Reader — plus library
    size, the manga/novel split and the roster count. Every figure is a link to what it counts,
    except a zero, which prints the digit unlinked.
    That asymmetry is the thing to get right
    visually: a zero must still read as a measured fact, not as a disabled control.
  • Still open for the prototype: which SeriesRow fields a row renders, in what order, at what
    density, alongside #119's Check now and its ageing pending marker.
Added by #118 (closed) — the Series list frame is now specified, so the prototype has a frame to fill rather than invent: - **Filter row**: plain links, one active at a time (`SeriesFilter.Filter` holds one value), the active one marked with the existing `.attention` class, plus an **All series** reset. `?site=` and `?kind=` are separate controls that stack on top. Never `--ember`, never `--danger`. - **Heading**: `<N> series · <label>`, using #116's `COUNT(*) OVER ()` total. - **Empty state**: names the filter it is empty for ("No Series with no cover"), not a bare "nothing here". - **Landing stats block**: eight hygiene rows in this order — No series URL, Never read a chapter, No Readers, Never checked, Not checked in 12h, No cover, Latest from a Reader — plus library size, the manga/novel split and the roster count. **Every figure is a link to what it counts, except a zero, which prints the digit unlinked.** That asymmetry is the thing to get right visually: a zero must still read as a measured fact, not as a disabled control. - Still open for the prototype: which `SeriesRow` fields a row renders, in what order, at what density, alongside #119's *Check now* and its ageing pending marker.
Author
Owner

Surface added by #121 (closed) — both controls on the Series detail page (/admin/series/{key}), never on the list row:

  • One numeric input for a Latest Chapter correction, plus a line of copy saying the next successful Poll overwrites it. Unconfirmed submit (Cinder gates what pulls a Series out of the list; this does not), never --ember, no --danger.
  • One URL input for a series_url repair, rejected 400 when it fails latest.FetchableSeriesURL. The owner presses Check now (#119) afterwards — the repair itself fetches nothing, so the page must not imply it did.
  • A corrected <age> ago marker while latest_corrected_at > 0, i.e. while the live value is a human's. It is erased by the next machine write of the number, so the marker is transient by design and must not read like history.

Both post to POST /admin/series/{key}/<verb> and answer with the swapped detail fragment (#115's shape). Density and field layout are still your call.

Surface added by #121 (closed) — both controls on the Series detail page (`/admin/series/{key}`), never on the list row: - **One numeric input** for a Latest Chapter correction, plus a line of copy saying the next successful Poll overwrites it. Unconfirmed submit (Cinder gates what pulls a Series out of the list; this does not), never `--ember`, no `--danger`. - **One URL input** for a `series_url` repair, rejected `400` when it fails `latest.FetchableSeriesURL`. The owner presses *Check now* (#119) afterwards — the repair itself fetches nothing, so the page must not imply it did. - A **`corrected <age> ago`** marker while `latest_corrected_at > 0`, i.e. while the live value is a human's. It is erased by the next machine write of the number, so the marker is transient by design and must not read like history. Both post to `POST /admin/series/{key}/<verb>` and answer with the swapped detail fragment (#115's shape). Density and field layout are still your call.
sulthan self-assigned this 2026-08-18 09:38:36 +07:00
Author
Owner

Prototype up: branch prototype/admin-surface-122, file backend/internal/web/templates/admin-prototype.html.

Run: cd backend/internal/web/templates && python3 -m http.server 8731, then open http://127.0.0.1:8731/admin-prototype.html?variant=A (switch A/B/C via the floating bar or ?variant=, keyboard ←/→).

Three structural variants answering the ticket's question:

  • A — Narrow · prose rows (760px, zero new tokens): title+action line, mono fact line. The baseline: no extension at all.
  • B — Wide · aligned columns (new --measure-wide: 1080px): borderless grid table, hairline column header, per-column alignment. Reads as a table without a card.
  • C — Wide · two-line blocks (1080px): title+action line over an indented fact line with leading status marks.

Content draws from the closed tickets: overview verdict line (#117), seven filter figures with zero unlinked (#118), lane pause picker 1h/6h/24h + Resume (#119), Check now unconfirmed + pending marker (#120), numeric chapter + series_url correction forms with transient markers (#121), per-row confirm-gating sketched for orphan removal (#125).

Four decisions the ticket leaves open — verdict wanted from the owner:

  1. Measure: 760px stays, or a second --measure-wide token?
  2. Row shape: prose lines (A) vs aligned columns (B) vs two-line blocks (C)?
  3. Actions at list density: right-aligned ghost actions, confirm-row expanding in place, Check now unconfirmed with pending marker in patina?
  4. New tokens: --measure-wide only, or anything else? (Core law untouched: no ember anywhere on admin.)

Verified in a real browser: all three variants render, lane states, detail correction forms, empty state, zero figures unlinked, confirm-gating reachable in all variants, phone-width collapse, hash navigation.

Prototype up: branch `prototype/admin-surface-122`, file `backend/internal/web/templates/admin-prototype.html`. Run: `cd backend/internal/web/templates && python3 -m http.server 8731`, then open `http://127.0.0.1:8731/admin-prototype.html?variant=A` (switch A/B/C via the floating bar or `?variant=`, keyboard ←/→). Three structural variants answering the ticket's question: - **A — Narrow · prose rows** (760px, zero new tokens): title+action line, mono fact line. The baseline: no extension at all. - **B — Wide · aligned columns** (new `--measure-wide: 1080px`): borderless grid table, hairline column header, per-column alignment. Reads as a table without a card. - **C — Wide · two-line blocks** (1080px): title+action line over an indented fact line with leading status marks. Content draws from the closed tickets: overview verdict line (#117), seven filter figures with zero unlinked (#118), lane pause picker 1h/6h/24h + Resume (#119), Check now unconfirmed + pending marker (#120), numeric chapter + series_url correction forms with transient markers (#121), per-row confirm-gating sketched for orphan removal (#125). Four decisions the ticket leaves open — verdict wanted from the owner: 1. Measure: 760px stays, or a second `--measure-wide` token? 2. Row shape: prose lines (A) vs aligned columns (B) vs two-line blocks (C)? 3. Actions at list density: right-aligned ghost actions, confirm-row expanding in place, Check now unconfirmed with pending marker in patina? 4. New tokens: `--measure-wide` only, or anything else? (Core law untouched: no ember anywhere on admin.) Verified in a real browser: all three variants render, lane states, detail correction forms, empty state, zero figures unlinked, confirm-gating reachable in all variants, phone-width collapse, hash navigation.
Author
Owner

Round 1 review addressed (commit f988e68, branch prototype/admin-surface-122):

  1. Verdict line: counts now inherit the 22px display face — one uniform line, no size mismatch.
  2. Logo: restored the mirrored right half of the bookmark glyph (the inline copy was missing the <use> mirror — rendered as a lopsided single page). Now byte-identical to the chrome.html mark.
  3. Font sizes up: table rows 10→11px, series titles 16→17px, site/lane names 17→18px, stat figures 17→19px, section heads 10→11px.
  4. Overview Sites state: column widened (minmax 150px), nowrap — "paused · resumes in 3h" stays one line.
  5. Library + Log out grouped in a right-aligned cluster, matching the original topbar shape.
  6. Lanes: sidecar line sits directly under the Poll lanes explanation, not the page bottom.
  7. Resume renders inside the same pausebar slot as Pause.
  8. Lane problems now render danger red: refusing, no browser, and the not-checking stall. A deliberate pause stays patina.
  9. Series notes: chips capped at two with a faint +N tail (demo: Return of the SSS-Class Ranker shows "no URL · stale +1") instead of stacking.
  10. "requested 3m ago" now renders once, in the action cell only (Dungeons and Crayons row).

All verified in a real browser. Four decisions from the ticket still open — verdict wanted:

  1. --measure-wide: 1080px alongside the 760 reading column?
  2. Row shape B (aligned columns) confirmed as the direction?
  3. Actions as right-aligned ghosts with in-place confirm rows?
  4. Tokens: --measure-wide only, ember nowhere on admin?
Round 1 review addressed (commit f988e68, branch `prototype/admin-surface-122`): 1. Verdict line: counts now inherit the 22px display face — one uniform line, no size mismatch. 2. Logo: restored the mirrored right half of the bookmark glyph (the inline copy was missing the `<use>` mirror — rendered as a lopsided single page). Now byte-identical to the chrome.html mark. 3. Font sizes up: table rows 10→11px, series titles 16→17px, site/lane names 17→18px, stat figures 17→19px, section heads 10→11px. 4. Overview Sites state: column widened (minmax 150px), nowrap — "paused · resumes in 3h" stays one line. 5. Library + Log out grouped in a right-aligned cluster, matching the original topbar shape. 6. Lanes: sidecar line sits directly under the Poll lanes explanation, not the page bottom. 7. Resume renders inside the same pausebar slot as Pause. 8. Lane problems now render danger red: refusing, no browser, and the not-checking stall. A deliberate pause stays patina. 9. Series notes: chips capped at two with a faint +N tail (demo: Return of the SSS-Class Ranker shows "no URL · stale +1") instead of stacking. 10. "requested 3m ago" now renders once, in the action cell only (Dungeons and Crayons row). All verified in a real browser. Four decisions from the ticket still open — verdict wanted: 1. `--measure-wide: 1080px` alongside the 760 reading column? 2. Row shape B (aligned columns) confirmed as the direction? 3. Actions as right-aligned ghosts with in-place confirm rows? 4. Tokens: `--measure-wide` only, ember nowhere on admin?
Author
Owner

Resolved in the Claude Design project BookmarkManager Web UI (969ac210-fe02-4c01-ae1b-9a271dcc779a): admin.css plus admin-overview.html, admin-lanes.html, admin-readers.html, admin-series.html, admin-series-detail.html. Those five pages supersede the three-variant sketch on branch prototype/admin-surface-122 — variant B won, A and C are dropped, and the branch stays only as the exploration record. Port from the design project, not from admin-prototype.html.

The four decisions

  1. Measure: a second token. --measure-wide: 1080px alongside an unchanged --measure: 760px. The admin .sheet maxes at the wide one; every reading page keeps the 760px column. Admin is the only consumer.
  2. Row shape: variant B — aligned borderless columns. One CSS grid per table (.tbl), a hairline .thead of mono uppercase labels, hairline row rules, no vertical rules, no card backgrounds, no corners. Gutters are cell padding, never column-gap (a gap slices the row rule into segments and reads as a ragged edge). Figures are font-variant-numeric: tabular-nums, 15px mono mixed case at ~0 tracking — uppercase-at-.1em is for labels and marks only. Titles stay in the display face (18px).
    • Series list is the two-line form of B: .tbl.series rows are display: grid; grid-column: 1 / -1; grid-template-columns: subgrid, title on its own full-width line, facts on the subgrid line under it, so a long title never breaks column rhythm. Separation is banding (.trow.band { background: var(--hover) }), not hairlines, so a title and its facts read as one record; .band is a class, not :nth-of-type, because collapsed confirm rows are .trow siblings and would throw the alternation off.
    • Lanes (.tbl.lanes) and the landing per-Site table (.tbl.sites) are single-line B rows. Site numerics are centred, not right-flushed: at 106px a right-flushed figure loses its header.
    • Notes chips cap at two plus a faint +N tail rather than stacking.
  3. Actions: right-aligned ghosts, confirm expands in place. .c-act holds 12px .ghost links flush right, hover in --patina. Check now is unconfirmed, and its ageing pending marker (requested 3m ago) renders once, on the title line flush right above the actions — not under the action, which added a second line to every row. Destructive actions are .ghost.danger and open an in-place .confirm-row: a full-width grid row on --danger-wash with Keep / Remove, shipping hidden and unmounted (.tbl.series .trow:has(> .confirm-row[hidden]) { display: none }, else every orphan printed an empty striped band).
  4. Tokens: --measure-wide is the only addition. Everything else is existing Cinder: --patina for the admin accent and active filters, --danger for lane problems and destruction, --hover for banding, --hatch for the cover placeholder, the six per-Site hue tokens on the site cell. No --ember anywhere on admin — the only ember on the page is the brand glyph, unchanged. Both colour branches are in the file.

Also settled by the artifact

  • Nav row: four display-face tabs (Overview · Lanes · Readers · Series) under the topbar, active tab underlined in --paper; Library + Log out group as a right-aligned cluster in the topbar.
  • Section heads: .sec mono uppercase led by a 34px --patina tick, not a full-width hairline — stacked rules between Hygiene / Library / Sites competed with the tables' own rules.
  • Verdict line: set in the mono data face at 15px (not the 22px display face — it is three counts, not a page title), --patina phrase plus --paper figures, hairline under.
  • Landing stats (.stats): repeat(auto-fit, minmax(232px, 1fr)) across the full measure, one rule on the block; every figure links, a zero is .fig.zero in --mute and unlinked.
  • Landing per-Site table carries library shape only — Site / Series / No cover / Never chk / Stale / State. #117's five Poll outcome sums stay on Lanes; on the landing they were nine columns of zeros that buried the four columns that move.
  • Lanes: columns Site / Due / Checked / Gap / Last pass / Outcomes · state / controls. Browser reachability is a .statusline pinned to the section-heading line, not a paragraph of explanation. A trouble state (refusing, no browser, not checking) renders --danger; a deliberate pause stays --patina (paused · resumes in 3h). The pause select (1h/6h/24h) + Pause live in .pausebar, and Resume replaces them in the same slot.
  • Series detail: back ghost, 28px display title, mono key line site:series_id · site · kind, a 160px --hatch cover, an uppercase mono meta row carrying the marks, then a two-column .detail-grid of the #121 forms (numeric Set chapter; url Save) with Check now below. All unconfirmed.
  • Readers keeps the existing Cinder list shape, re-set to the table's type tiers (15px mono id, 13px uppercase meta) with a reserved right-aligned action cluster so a deferral blocked chip cannot make one row taller.
  • Phone: Lanes stacks at ≤1019px (its phrase run cannot hold a 1fr track sooner), every other table and the detail grid stack at ≤899px; stacked rows are flex-wrapped with the title full-width and actions pushed right.

Amendment to #118

The Series filter row is not eight plain links. Eight hygiene labels do not read as a chip row, so the filter is a <select> whose option labels carry their counts (No cover (3)), Site is a second select, and kind is a three-way .segrow (both / manga / novels) marked active in --patina. Filters remain one-at-a-time and URL-addressable exactly as #118 specified — only the control changed. Heading, empty state and the linked-figures-except-zero rule are unchanged.

Fog cleared

"The admin surface on a phone" is answered by the breakpoints above and leaves the map's Not yet specified.

Resolved in the Claude Design project **BookmarkManager Web UI** (`969ac210-fe02-4c01-ae1b-9a271dcc779a`): `admin.css` plus `admin-overview.html`, `admin-lanes.html`, `admin-readers.html`, `admin-series.html`, `admin-series-detail.html`. Those five pages **supersede** the three-variant sketch on branch `prototype/admin-surface-122` — variant B won, A and C are dropped, and the branch stays only as the exploration record. Port from the design project, not from `admin-prototype.html`. ## The four decisions 1. **Measure: a second token.** `--measure-wide: 1080px` alongside an unchanged `--measure: 760px`. The admin `.sheet` maxes at the wide one; every reading page keeps the 760px column. Admin is the only consumer. 2. **Row shape: variant B — aligned borderless columns.** One CSS grid per table (`.tbl`), a hairline `.thead` of mono uppercase labels, hairline row rules, **no vertical rules, no card backgrounds, no corners**. Gutters are cell padding, never `column-gap` (a gap slices the row rule into segments and reads as a ragged edge). Figures are `font-variant-numeric: tabular-nums`, 15px mono mixed case at ~0 tracking — uppercase-at-`.1em` is for labels and marks only. Titles stay in the display face (18px). - **Series list is the two-line form of B**: `.tbl.series` rows are `display: grid; grid-column: 1 / -1; grid-template-columns: subgrid`, title on its own full-width line, facts on the subgrid line under it, so a long title never breaks column rhythm. Separation is **banding** (`.trow.band { background: var(--hover) }`), not hairlines, so a title and its facts read as one record; `.band` is a class, not `:nth-of-type`, because collapsed confirm rows are `.trow` siblings and would throw the alternation off. - **Lanes** (`.tbl.lanes`) and the landing **per-Site** table (`.tbl.sites`) are single-line B rows. Site numerics are centred, not right-flushed: at 106px a right-flushed figure loses its header. - Notes chips cap at **two plus a faint `+N` tail** rather than stacking. 3. **Actions: right-aligned ghosts, confirm expands in place.** `.c-act` holds 12px `.ghost` links flush right, hover in `--patina`. *Check now* is **unconfirmed**, and its ageing pending marker (`requested 3m ago`) renders **once**, on the title line flush right above the actions — not under the action, which added a second line to every row. Destructive actions are `.ghost.danger` and open an in-place `.confirm-row`: a full-width grid row on `--danger-wash` with *Keep* / *Remove*, shipping `hidden` and unmounted (`.tbl.series .trow:has(> .confirm-row[hidden]) { display: none }`, else every orphan printed an empty striped band). 4. **Tokens: `--measure-wide` is the only addition.** Everything else is existing Cinder: `--patina` for the admin accent and active filters, `--danger` for lane problems and destruction, `--hover` for banding, `--hatch` for the cover placeholder, the six per-Site hue tokens on the site cell. **No `--ember` anywhere on admin** — the only ember on the page is the brand glyph, unchanged. Both colour branches are in the file. ## Also settled by the artifact - **Nav row**: four display-face tabs (`Overview · Lanes · Readers · Series`) under the topbar, active tab underlined in `--paper`; `Library` + `Log out` group as a right-aligned cluster in the topbar. - **Section heads**: `.sec` mono uppercase led by a **34px `--patina` tick**, not a full-width hairline — stacked rules between Hygiene / Library / Sites competed with the tables' own rules. - **Verdict line**: set in the mono data face at 15px (not the 22px display face — it is three counts, not a page title), `--patina` phrase plus `--paper` figures, hairline under. - **Landing stats** (`.stats`): `repeat(auto-fit, minmax(232px, 1fr))` across the full measure, one rule on the block; every figure links, a zero is `.fig.zero` in `--mute` and unlinked. - **Landing per-Site table carries library shape only** — Site / Series / No cover / Never chk / Stale / State. #117's five Poll outcome sums stay on **Lanes**; on the landing they were nine columns of zeros that buried the four columns that move. - **Lanes**: columns Site / Due / Checked / Gap / Last pass / `Outcomes · state` / controls. Browser reachability is a `.statusline` pinned to the section-heading line, not a paragraph of explanation. A trouble state (`refusing`, `no browser`, `not checking`) renders `--danger`; a deliberate pause stays `--patina` (`paused · resumes in 3h`). The pause select (1h/6h/24h) + *Pause* live in `.pausebar`, and *Resume* replaces them in the same slot. - **Series detail**: back ghost, 28px display title, mono key line `site:series_id · site · kind`, a 160px `--hatch` cover, an uppercase mono meta row carrying the marks, then a two-column `.detail-grid` of the #121 forms (numeric *Set chapter*; url *Save*) with *Check now* below. All unconfirmed. - **Readers** keeps the existing Cinder list shape, re-set to the table's type tiers (15px mono id, 13px uppercase meta) with a reserved right-aligned action cluster so a `deferral blocked` chip cannot make one row taller. - **Phone**: Lanes stacks at ≤1019px (its phrase run cannot hold a 1fr track sooner), every other table and the detail grid stack at ≤899px; stacked rows are flex-wrapped with the title full-width and actions pushed right. ## Amendment to #118 The Series filter row is **not** eight plain links. Eight hygiene labels do not read as a chip row, so the filter is a **`<select>` whose option labels carry their counts** (`No cover (3)`), Site is a second select, and kind is a three-way `.segrow` (`both / manga / novels`) marked active in `--patina`. Filters remain one-at-a-time and URL-addressable exactly as #118 specified — only the control changed. Heading, empty state and the linked-figures-except-zero rule are unchanged. ## Fog cleared "The admin surface on a phone" is answered by the breakpoints above and leaves the map's **Not yet specified**.
Author
Owner

Amendment from #124 (closed) — two things land on the surface you prototyped:

  • The Series detail page gains a Finish control, and it is the only place it lives (not the 50-row list, where the neighbouring ghost is a harmless Check now). It follows the reader UI's rule verbatim (card.html:58-59): Finish is confirm-gated — press reveals a .confirm-row reading Mark this Series finished? with Finish / Cancel — while un-finish fires instantly, exactly like Restore, because it is the reversal and destroys nothing.
  • Not --danger. You reserved that for lane trouble and destruction, and a finish takes nothing away: no bytes, no row, no Bookmark. It uses --patina, the admin accent. Un-finish likewise.
  • The list row still shows the state (SeriesRow.FinishedAt is projected either way) — a scan tells you which rows are finished; it just offers no one-press way to finish the wrong one.
  • The stats block takes a tenth figure, Finished, ordered last as informational rather than fixable. Your zero-renders-unlinked rule and the one-filter-at-a-time <select> are unchanged; your row shape is unchanged.
  • Reader side: the removed finished bucket frees the badge markup and --moss (card.html:35-37, style.css:87), which the new reader-visible finished label reuses in the web card and both userscript rows. Purely a label — no tab, no filter, no reordering, no ember interaction.
Amendment from #124 (closed) — two things land on the surface you prototyped: - **The Series detail page gains a Finish control**, and it is the *only* place it lives (not the 50-row list, where the neighbouring ghost is a harmless *Check now*). It follows the reader UI's rule verbatim (`card.html:58-59`): **Finish is confirm-gated** — press reveals a `.confirm-row` reading *Mark this Series finished?* with **Finish** / **Cancel** — while **un-finish fires instantly**, exactly like Restore, because it is the reversal and destroys nothing. - **Not `--danger`.** You reserved that for lane trouble and destruction, and a finish takes nothing away: no bytes, no row, no Bookmark. It uses `--patina`, the admin accent. Un-finish likewise. - **The list row still shows the state** (`SeriesRow.FinishedAt` is projected either way) — a scan tells you which rows are finished; it just offers no one-press way to finish the wrong one. - **The stats block takes a tenth figure, *Finished*, ordered last** as informational rather than fixable. Your zero-renders-unlinked rule and the one-filter-at-a-time `<select>` are unchanged; your row shape is unchanged. - Reader side: the removed finished bucket frees the badge markup and `--moss` (`card.html:35-37`, `style.css:87`), which the new reader-visible *finished* label reuses in the web card and both userscript rows. Purely a label — no tab, no filter, no reordering, no ember interaction.
Author
Owner

Additions from #127 (closed):

  • The Series list fact line carries a failure marker: <outcome word> · failing <age> in --danger, rendered whenever the Series has a row in the new poll_failures table. Never --ember, consistent with your no-ember-on-admin rule; --danger follows your own use of it for lane trouble.
  • A Series failing for under 12h and one failing for three months render identically. The 12h threshold decides membership of the failing filter only. A second visual state would ask the owner to learn a rule the line cannot state in a word, and the age is already on the line.
  • The Series detail page shows the same one line, and adds one sentence beside #121's correction control when the Latest Chapter came from a Sighting and the Poll has not confirmed it — the unverified case.
  • The Lanes page per-Site row gains one link to /admin/series?site=<site>&filter=failing, as navigation and not attached to any of the outcome counts, which stay unlinked (see #118). Your five outcome counts also become six: not_found splits out of errors.
  • Your <select> grows to eleven options: #127 adds failing and unverified.
Additions from #127 (closed): - **The Series list fact line carries a failure marker**: `<outcome word> · failing <age>` in `--danger`, rendered whenever the Series has a row in the new `poll_failures` table. Never `--ember`, consistent with your no-ember-on-admin rule; `--danger` follows your own use of it for lane trouble. - **A Series failing for under 12h and one failing for three months render identically.** The 12h threshold decides membership of the `failing` filter only. A second visual state would ask the owner to learn a rule the line cannot state in a word, and the age is already on the line. - **The Series detail page** shows the same one line, and adds one sentence beside #121's correction control when the Latest Chapter came from a Sighting and the Poll has not confirmed it — the `unverified` case. - **The Lanes page per-Site row gains one link** to `/admin/series?site=<site>&filter=failing`, as navigation and *not* attached to any of the outcome counts, which stay unlinked (see #118). Your five outcome counts also become six: `not_found` splits out of `errors`. - **Your `<select>` grows to eleven options**: #127 adds `failing` and `unverified`.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: sulthan/mangaBookmark#122