Open decisions
Twenty-four questions that are the founder's rather than a builder's, gathered out of design/kit/docs/backlog.md and the plan census, each with what has been measured under it, the options as they honestly stand, and a recommendation. Nothing here is a bug: every row is a place where two answers are both defensible and somebody has to choose. The backlog stays the source; this page is where it is readable in one sitting.
Answered
The founder read the page and took every recommendation on 2026-08-20: "так вроде все ок и делаем". Nineteen backlog rows are closed in design/kit/docs/backlog.md, each with what was done and what it cost; two business questions are settled and recorded in docs/decisions.md. What is left is three rounds of work rather than three questions: the empty states as a set, the failed-renewal screen, and the icon redraw, which now has a fresh number under it.
Later the same day, on "го дальше тогда делать все что нужно": two of the three rounds are built and the third is measured. The empty-state round turned out not to be about emptiness at all - node 2.6 named four states and every one of them was about the CONNECTION, while the founder was asking about the COUNT. The ladder now runs 0, 1, a few, many: home-one (node 2.6.5) and home-few (2.6.6), with the grouping threshold at six and the number measured off the phone fold rather than chosen. upgrade-renewal-failed (5.13.4) is the failed renewal on an account already paying, and it names what Free keeps before it names what pauses. Both went through the whole chain - node, grey, colour, microcopy - and neither added a single declaration to design/system/. What the corpus growing from 55 to 58 then exposed is the larger half of the day: 22 css headers and 23 component pages drifted at once, and five numbers were already wrong before it - the tab bar said four destinations when it has had five since 2026-08-18, the logo claimed one places figure for two corpora that are 25 apart, and the sitemap said 37 state nodes against 38. All of it is in docs/decisions.md. The icon row below was the last one open and it closed on 2026-08-21, on "давай B".
And on 2026-08-21 the founder asked a question that was not on this page at all: "зачем нам страница Save (save focus) когда она очень похожа на Home". Measured, the state was 2099px tall at 390 with 331 of them its own - 84 per cent of its scroll was Home repeated - and 29 of the 31 links into it were the tab bar itself, the other two being the page and the hub. The two triggers node 2.6 specified for it, node 3.8 and a Pro nudge, were never built. The tab is retired, the cancel nudge is a conditional block on Home under the list (which is where the base layer put it before the 2026-08-05 rebuild dropped it), and the bar is four destinations again. It also moved the icon row below without anybody drawing anything: .ic-save was the heaviest glyph in the set, and retiring it took the ink spread from 106 per cent to 81. The ground is in docs/decisions.md.
Two of the twenty-one changed on contact with the file, and both are worth naming because they are the argument for re-reading a row before answering it. .muted was recommended to gain the quieter step on six lines; opening those six found that they are the reassurance under an error state ("Nothing about your plan or your data changed"), and making the reassurance smaller than the problem is the opposite of what this product is for. They stay at body size, and that is the founder's to overrule. "Try again" changed nothing at all: re-counted it stands on seven screens and not four, and all seven already follow one rule - primary where the error IS the screen, quiet where the content is still there. The three weights were a rule nobody had written down.
Three rows were closed by code that already existed and nobody had marked. --tap-rail was declared at stage 09 and read since 2026-08-12 while the row went on measuring a literal. .muted.fine was declared on 2026-08-16. And one answer cascaded further than it looked: dropping the plan card's hover left --line-container-hover with no reader and --hairline-strong with no role, so one decision removed one rule, one role and two primitives. Retiring the trial chip did the same shape of thing and took six tokens with it.
How to read it
Answer a group at a time, not a row at a time. The six groups are sorted by what an answer costs rather than by where the row was found: the first two move no pixel at all, the third moves a few, and the last two are rounds of work. A group can be answered with one word if the recommendations hold, and a row that needs its own conversation is better spotted against the five beside it than alone in a 443-line file.
Where a recommendation says "close it", the work is a paragraph rather than a change. Seven of the twenty-four end that way: the measurement already answers the question and what is missing is somebody saying so out loud, in writing, so the next audit does not raise it again as new. That is not a formality here - two rows on this page were raised twice already by two different instruments, and one of them, the .muted size, was ANSWERED IN THE CODE on 2026-08-16 and nobody closed the row.
Every number on this page was re-measured on 2026-08-20 or names the corpus it was measured on. One row says so explicitly and it matters: the icon set's 22 and 106 per cent were counted over FOUR icons and there are five. That row's recommendation is therefore to re-measure before deciding, which is the only recommendation on this page that asks for work before an answer.
Values and tokens
Six rows, and five of them ask the same question in different clothes: does this number earn a name? The system has two levels and the rule is that a second level is earned where two roles would otherwise spell the same value. Four of these have ONE wearer, which is why the recommendation is mostly no.
| The question | What is measured | The options | Recommended |
|---|---|---|---|
| A size primitive for the 26px step marker | One wearer. numbered-steps.css:93, 26 by 26, on 3 coloured screens and 3 grey. --tap is 44 and --row is 56, and it is neither | Create a size scale, or keep the literal with its reason at the line | Keep the literal. A primitive one file reads is a token nobody else can be wrong about, and the reason is already written where the value is |
--tap-rail for two min-height literals | Two wearers with TWO DIFFERENT values: tab-bar.css:219 at 48px and alert-item.css:110 at 40px | One token, two tokens, or neither | Neither, and correct the row's premise: 48 is the rail's anchor floor and 40 is an alert's row. Two values for two jobs is not a debt, it is two decisions |
| A z-index scale | Three live declarations in the whole system: 1 on the money field's prefix, 5 on the app bar, 6 on the tab bar | Two tokens for the chrome pair, a full scale, or three literals | Two tokens, --z-appbar and --z-tabbar. The 5 and the 6 are not two values, they are one RELATIONSHIP - where the two meet, the bottom chrome wins - and app-bar.css already spends a paragraph explaining it. A comment explaining a relationship is a token waiting to be declared. The 1 is local and stays |
| Is a token's origin owed per NAME or per RUN? | Four counts of the same thing and they are four different questions: 0, 22, 31, 96. tokens.css declares 175 lines for 137 names and carries 38 comments saying "origin:" | Per name, which means about 137 end-of-line comments, or per run, which is what the file already does | Per run, and amend the wording in CLAUDE.md to say so. The rule as written asks for something the file deliberately does not do and does not do for a good reason: a block comment governing a run of related values reads better than 137 fragments |
"Role surface": an ink role painted through background-color | Exactly two: brand-mark.css:110 and trust-block.css:176, both background-color: var(--text-action) | A defect, so two more roles are owed; or a false positive, because that is how a CSS mask draws a glyph | False positive, close the row with the reading written down. Both are the paint behind mask-image, and brand-mark.css already measures the mark as INK at 4.5:1 rather than as a surface at 3:1, which is the same call taken once already |
The .switch checkbox is 20px against WCAG 2.5.8's 24px | The wrapping label is the pointer target at 44px or more, and since stage 09 the focus ring lands on the label too | Resize the control, or record the reading and close | Close it. WCAG measures the TARGET and the target is the label. Resizing a control that is not the target to satisfy a rule about targets is a change that helps nobody |
Names, levels and where a rule lives
Five rows about the map rather than about pixels. None of them moves a pixel; all of them decide where the next person looks.
| The question | What is measured | The options | Recommended |
|---|---|---|---|
Does .cut merge into .btn? | Identical on 17 properties after the fold: min-height 44, padding 0 16px, font-size 14px. It differs in font-weight, 400 against 600, and in a hover that moves edge and ink but not fill. 2 controls | Merge with a declared modifier, or keep it as its own family with the difference written down | Merge. Declare .btn.quiet and delete .cut: a weight is a variant, and two controls that agree on seventeen properties are one control |
Is .cand a molecule or an organism? | It hosts a molecule, which the ladder calls an organism. inventory.md:146 files it as a molecule | Move it, or write down why the ladder bends here | Move it. The only cost is the @import order in index.css, which is mechanical, and a ladder with one silent exception stops being a ladder |
| The sixth host placement of the Chip lives in another file | Five are in chip.css; the sixth is plan-option.css:106, which takes the chip out of the flow into the card's corner | Move the sixth to chip.css, or move the five to their hosts | Move the sixth. One atom, one file: the card's rule states where a chip SITS, and so do the other five |
Where does the .divlist bottom margin belong? | divided-list.css:99 keys it to the shell's column, .app .rows-col > .divlist | A .spaced modifier, which collides with muted-line.css's meaning of the same word; or a rule in app-shell.css | app-shell.css, which is exactly what action-row.css already did with its own 24px. One word meaning two things in one system is the worse of the two |
Should 48 component files each carry the .landing scope? | 48 of 57 name it. Since design/index.html exists, every one of those rules is live in BOTH corpora rather than in the grey only | Keep the doubled selector, or scope once on an ancestor | Keep it, and close the row. The premise it was written on is gone, and the doubled selector is what lets a component be lifted into either host without knowing which one it landed in |
Look and behaviour
Five taste calls. Each one has a measurement under it, and none of them is a bug.
| The question | What is measured | The options | Recommended |
|---|---|---|---|
| Should a card that cannot be clicked answer the pointer? | .plan-opt is a div holding a button: no focus, no role, no press. Its edge goes rgb(228,233,234) to rgb(205,215,217) under the pointer, measured at 1280 | Keep the hover, or drop it and leave the state to the button inside | Drop it. A hover promises a click, the card does not deliver one, and this product's whole argument is that it does not mislead. The button keeps its own state |
| The icon set is optically unbalanced | 22 per cent between painted boxes and 106 per cent in INK, .ic-save against .ic-you. Measured on FOUR icons and the set is now five | Redraw, leave it, or re-measure first | CLOSED 2026-08-21, and it took two moves, only one of which was a drawing. The finding opened at 106 per cent of ink spread over four icons. Move one was a deletion: the Save tab retired the same morning, .ic-save went with it, and the spread fell to 81 per cent with no line redrawn - which is what said the problem was the SET rather than any one mark. Move two was the founder choosing candidate B off four drawn and measured options: .ic-trends gave up its frame for an axis corner, 23.82 to 14.71, and the spread is 61 per cent with the house now the heaviest mark. Ink as it ships: home 21.12, alerts 15.62, trends 14.71, you 13.14. The candidate drawn to be rejected is on record and it is the obvious one: simply deleting the box takes the chart to 10.60, makes it the lightest thing in the bar and the spread 99 per cent. The four candidates are in design/kit/screens/icon-candidates.html; option E, which also drops the house's door and measures 25 per cent, stays one decision away |
| The Trial chip has a rule and no wearer in colour | chip.css:135 declares .chip.trial on two roles. The one place that says Trial, the Peloton row on Home, renders the quiet tone because its markup is class="chip" | Put .chip.trial in the markup, or delete the rule and both roles | Delete them. D-Concept says a status is a quiet grey badge, and a trial is a status. .tone-attention went this way already |
| "Sign out" wears the nav row with no modifier | settings.html, one a.navrow with the same chevron every other row carries | A quiet variant, or a deliberate sameness with the reason written down | A variant, without the chevron. A chevron means "deeper" - it opens things twice on that same screen - and the one row that LEAVES should not draw the mark that means going further in. Same argument that replaced the back chevron with an arrow on 2026-08-17 |
| "Try again" stands in three weights on four error screens | .btn primary on two, plain .btn on one, a bare link inside a wash on home-error | Uniform primary, uniform plain, or a rule keyed to whether the screen still shows content | Uniform plain .btn, and never a bare link. The filled tier in this product belongs to the action that moves a person forward, not to recovering from our own failure - and three weights with no rule under them is how the fourth screen gets a fourth |
Layout axes
Three, and each one needs a value or a string rather than a rewrite.
| The question | What is measured | The options | Recommended |
|---|---|---|---|
Does .plans fold into .grid? | They stopped being the same rule on 2026-08-18: 3 fixed columns against auto-fill, a 57rem cap against none, a 16px gap against 8, and tracks of 293.33 against 201.328 at a 1440 window | Fold with a modifier nobody has declared, or keep it as its own component | Keep it, and write its axis down. Two rules that agree on one number are a folding candidate; two rules with different counts, caps and widths are two rules |
Does .muted owe a quieter size? | Mostly answered already and nobody closed the row. .muted.fine was declared on 2026-08-16 at --type-meta and is worn on 2 pages. What is left is narrower: .consequence and .freshness grew 2px in the fold and never got it back | Put .fine on those two, or accept that they read at the base size now | Put .fine on them. The modifier exists, the markup is two classes, and the row shrinks from a system question to an edit |
| The plan button label wraps below a 913px window | Measured at 913. button.css lets it wrap rather than overflow, deliberately, since the 24px-root fix of 2026-08-13 | A shorter string, or the plan row stacks inside the band | A shorter string, and it is Voice's: "Start Pro - $69 a year". Cheaper than a layout change and it fixes the same reading on a phone |
Two product rounds
Not decisions in one line: each needs a node, a grey page and a coloured twin. Listed here so they are chosen rather than drifted into.
| The question | What is measured | The options | Recommended |
|---|---|---|---|
Does path-choice owe a way across to Sign in? | The landing offers both doors twice, and sign-in leads back with "No account yet? Start here". path-choice leads back to neither: the browser's back button and nothing on the screen | One quiet line under the two doors, which is a new product string; or nothing, because the fork is one tap from the landing | Add the line. This is the audience that does not recover from a dead end, and a person who tapped the wrong door is exactly the person the product was built to keep |
| The empty states are not designed as a set | Founder, 2026-08-18. Node 5.12 names five states and none of them is "one subscription" or "no subscriptions at all", and it is not only that screen | Scope it screen by screen, or run one pass over the whole product | CLOSED 2026-08-20. The inventory came first and it answered the question differently: the six existing empty states are coherent as a set (two vocabularies, .empty with two doors where there is nothing at all, .textblock where the screen has content and the absence is local). What was missing was the COUNT ladder on Home, and only there - Alerts, Connections and Trends each already draw their own zero. Built as nodes 2.6.5 and 2.6.6, with the grouping threshold at six measured off the phone fold |
Three business questions
Raised on 2026-08-20 by the plan census. Each is a place where a screen will have to say something it does not say today, and none of them is a design call.
| The question | What is measured | The options | Recommended |
|---|---|---|---|
Pro sells four things and CLAUDE.md promises six | Every screen that lists Pro lists history and trends, advanced alerts, full cancel guides, export. The Product section adds household view and priority support, which appear in no screen, no node and neither corpus | They are in Pro at launch, so four screens are short; or they are not, so the binding file is | Cut them from CLAUDE.md for the MVP. Household view is a second product inside this one and priority support is an operations promise before there are operations. Both can come back as a named decision |
upgrade.html sells a Lifetime tier D4 does not know about | Marked "not on sale yet, we are still working out the price" | Price it and add it to D4, or take the card off the screen until it exists | Keep the card. An honest "not yet" is on-voice and it tells a person the door exists; a price invented to fill it is the one thing that would not be |
| There is no trial and no failed renewal | upgrade-payment-failed covers a failed FIRST payment. Nothing covers a renewal that fails on an account already on Pro, and nothing anywhere offers a trial | Add a trial, add the lapse screen, both, or neither for the MVP | CLOSED 2026-08-20, the lapse screen and not the trial, as recommended. Node 5.13.4, upgrade-renewal-failed: the chip still reads Pro because the account still is, the close goes back to the Pro screen rather than the locked one, and both the fact list and the consequence line say what Free keeps - subscriptions, monthly total, basic alerts, this month against last - before they say what pauses. No trial anywhere |