Skip to content
Go to console
Go to console

The dashboard layout is a set of keys that move and hide, and never drop a row block

Decision record 0114

Amended by 0117: the Busy section sits right under Preview failed, wherever dashboard.sections puts that, and is never turned off either.

Amends 0027 (a pending row may show less under its first line), 0029 and 0063 (the order of the sections, the counts line, In sync as a list or off), 0062 (the destroy alert can be drawn always), 0083 (a key turns each bulk box off, which 0083 left for later) and 0088 (the generator draws the example under each key). Built as slice 5.51, from issue 277.

The owner asked on 2026-09-25 for a way to customise the dashboard with templates, such as a minimal one. The hosted app’s edit mode edits the rendered dashboard in place, and every dial it offers must be a documented sluiceway.yaml key that the free action honours, so a repo that leaves the app keeps its dashboard as built. Issue 277 lists the dials: the order of the sections, sections on or off, the zero counts, the destroy alert, how much a pending row shows, and the bulk boxes. Its rules: every key optional with today’s behaviour as its default, none may hide a destroy, a preview failure or a failure line, and the markers do not change.

Decision

  • Eleven keys under dashboard, each defaulting to the dashboard as it was. sections, deployingSection, driftedSection, inSyncSection (fold, list, off), zeroCounts, destroyAlert (destroys, always), pendingDetail (full, compact, names), deployAll, repairAll, rescanBox and footer. With none of them set, and with every default named, the body is byte for byte the body of the version before. A word a key does not take fails the config with the words it does take. There is no key for Pending or Preview failed, and no off for the destroy alert.
  • dashboard.sections is an order, not a list of what is shown. The sections it names come first, in its order, and every section it leaves out follows in the default order of 0063. A section named twice fails the config. Leaving a section out never hides it, so a list written before a later version adds a section keeps loading and keeps showing everything, and “off” has exactly one spelling per section. The destroy alert and the deploy all box stay with Pending, the repair all box with Drifted. The header, the counts line, the scan line and the shortened-rows note stay above every section, and the rescan box and the footer below.
  • A section that is off keeps its row blocks in the body, in one closed fold at the end of the sections. The body is a cache of row blocks (0004): a narrowed scan and every swap carry the rows they have no diff for from the live body, and a writer never reads inside one (0009). A row that left the body would be lost to every writer until a full scan, and a reader of the published shape (0096) would see a different set of facts under another look. So deployingSection: false, driftedSection: false and inSyncSection: off take the heading and the section’s own lines off the page and move its rows, as they are, into <details><summary>N stacks in sections this dashboard does not show</summary>, right under the last section and above the rule. Every section that is off shares that one fold, in the order of the sections. The counts line and the header still count the rows, because they are computed from the markers.
  • Nothing that must be seen goes into that fold. A row with a failure line stays open under its section’s heading, which then holds only such rows. For Drifted, so does a row whose drift check found a resource gone, because the destroy alert names it and must point at something open. Drifted off draws no repair all box: a confirm box in a fold at the foot of the page would be a question nobody sees. In sync off also leaves out the fold of the stacks ignore leaves out, which is part of that section and has no row block. Pending and Preview failed cannot be turned off.
  • In sync as a list draws every in sync row open, the rows with a failure line first, and keeps the fold of ignored stacks.
  • zeroCounts: false leaves a count of 0 out of the counts line, except pending, which the line always starts with, so the line is never empty and still reads first as what is waiting. The destroy and failed deploy facts were already drawn only when they were not 0.
  • destroyAlert: always draws a note where the alert would be when there is nothing to warn about: > [!NOTE] and > No pending stack deletes or replaces resources. A note and not a caution: a red block that warns of nothing every day teaches people to read past the one that matters. With a destroy the block is the caution of 0062, at both settings.
  • pendingDetail decides what a pending row shows under its first line.
    • full: every line, as before.
    • compact: the first line, then only the failure line, the lines of a failed policy in the one-line form of level 2 (0106), the notes that say why a tick would not go or did not (a stack set to on-merge that waits, a value that differs on every run, the orphan tick), and every delete and replace line. The cost line, the attribution line, the fold of other changes, the pending-again note, the policy warning that decides nothing, and the drift and outside folds go: they are all on the preview page and in the summary.
    • names: the first line without its · [preview](...) link, so the stack id and its counts, then only the failure line, the lead line of a failed policy, which says why the row has no box, and every delete and replace line. At every setting the delete and replace lines are listed as 0024 says, and under redact and at level 3 of the size budget they are the warning with their counts, as before. The marker is written by the same call with the same facts, so it is the same at every setting. The diff hash covers the whole diff whatever the row shows, the same safe direction as redact (0023) and a shortened row (0028).
  • The size budget works at every setting. It renders each of the writer’s own rows at each level with the detail of the repo, and it already moves a row to a level only when that makes the row smaller. At compact and names, levels 1 and 2 save nothing and are never picked; level 3 still turns the destroy lines into the warning. The shortened marker key therefore follows what the budget chose under the setting, which 0096 already leaves out of the promised shape. The fold of rows that are off is part of what the budget measures, as every line of the body is.
  • deployAll: false and repairAll: false each stop drawing one bulk box, and a confirm box that was there goes with it, as it does on a read-only dashboard (0083). They are about drawing, like readOnly (0045): resolve still acts on a confirm tick it finds in the live body, which is the same as ticking each row it names in one edit.
  • rescanBox: false draws no rescan box, and footer: false no version line. The rule above them is drawn while either is, or while rows of a state this version does not know follow it, which it keeps apart from the list before them (0029).
  • Every writer draws the same layout. The keys ride on dashboard of the config that every writer already reads, and the one function that fits a body hands them to the renderer. A tick, an apply and settle never move a section.
  • The example dashboard stays the default drawing (0088), and exampleBody takes each layout key next to redact, personality, timeZone and readOnly. A test per key redraws the example under it, holds every row block of the example in the result, and checks what the key changes.

Considered

  • Dropping the rows of a section that is off. Rejected for the reasons above: the body is where every writer finds the rows it carries, and the issue asks that the markers stay the same whatever the look.
  • A row form made of its marker alone, so a row that is off shows nothing. Rejected: a row line starts with - by the regex of 0009, and an older version reading such a line would lose the row. A new form is a change to the published shape for a matter of looks.
  • A full list for sections, every section named once. Safer to read, but a config written today would fail on the version that adds a section, which breaks the rule that no dashboard moves on upgrade.
  • Templates such as minimal as a key. The issue asks for the dials a template is made of. A template is a set of values of these keys, which the hosted app or the docs can offer, and a key that stands for several others hides what it changes.
  • names keeping the preview link. Then names and compact would differ only by a few rare notes. The link is what the owner’s “stack ids with their counts” leaves out, and the summary and the preview page are still one click away through the scan line’s run and the check run of the commit.
  • on and off as the words of the switches. YAML 1.1 reads them as booleans and YAML 1.2 as text, so a file would mean different things to different tools. The switches are true and false, and a key with three settings names them.
  • An alert that can be turned off. The issue rules it out, and so does 0062.

Consequences

  • docs/configuration.md documents the eleven keys in the order of the schema, docs/using-the-dashboard.md says the layout is the repo’s choice, and docs/what-sluiceway-writes.md tells a reader that where a row sits says nothing.
  • A body written under one layout reads the same under another: the next writer draws its own layout around the same row blocks.
  • The hosted app’s edit mode writes these keys and nothing else. A dial it wants that no key has needs a record first.