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 2026-08-2124 of 24 taken21 backlog rows closed0 left3 answers narrowed on reading0 instruments failing

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 questionWhat is measuredThe optionsRecommended
A size primitive for the 26px step markerOne 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 neitherCreate a size scale, or keep the literal with its reason at the lineKeep 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 literalsTwo wearers with TWO DIFFERENT values: tab-bar.css:219 at 48px and alert-item.css:110 at 40pxOne token, two tokens, or neitherNeither, 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 scaleThree live declarations in the whole system: 1 on the money field's prefix, 5 on the app bar, 6 on the tab barTwo tokens for the chrome pair, a full scale, or three literalsTwo 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 doesPer 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-colorExactly 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 glyphFalse 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 24pxThe wrapping label is the pointer target at 44px or more, and since stage 09 the focus ring lands on the label tooResize the control, or record the reading and closeClose 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 questionWhat is measuredThe optionsRecommended
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 controlsMerge with a declared modifier, or keep it as its own family with the difference written downMerge. 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 moleculeMove it, or write down why the ladder bends hereMove 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 fileFive are in chip.css; the sixth is plan-option.css:106, which takes the chip out of the flow into the card's cornerMove the sixth to chip.css, or move the five to their hostsMove 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 > .divlistA .spaced modifier, which collides with muted-line.css's meaning of the same word; or a rule in app-shell.cssapp-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 onlyKeep the doubled selector, or scope once on an ancestorKeep 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 questionWhat is measuredThe optionsRecommended
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 1280Keep the hover, or drop it and leave the state to the button insideDrop 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 unbalanced22 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 fiveRedraw, leave it, or re-measure firstCLOSED 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 colourchip.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 rolesDelete 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 modifiersettings.html, one a.navrow with the same chevron every other row carriesA quiet variant, or a deliberate sameness with the reason written downA 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-errorUniform primary, uniform plain, or a rule keyed to whether the screen still shows contentUniform 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 questionWhat is measuredThe optionsRecommended
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 windowFold with a modifier nobody has declared, or keep it as its own componentKeep 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 backPut .fine on those two, or accept that they read at the base size nowPut .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 windowMeasured at 913. button.css lets it wrap rather than overflow, deliberately, since the 24px-root fix of 2026-08-13A shorter string, or the plan row stacks inside the bandA 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 questionWhat is measuredThe optionsRecommended
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 screenOne quiet line under the two doors, which is a new product string; or nothing, because the fork is one tap from the landingAdd 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 setFounder, 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 screenScope it screen by screen, or run one pass over the whole productCLOSED 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 questionWhat is measuredThe optionsRecommended
Pro sells four things and CLAUDE.md promises sixEvery 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 corpusThey are in Pro at launch, so four screens are short; or they are not, so the binding file isCut 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 aboutMarked "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 existsKeep 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 renewalupgrade-payment-failed covers a failed FIRST payment. Nothing covers a renewal that fails on an account already on Pro, and nothing anywhere offers a trialAdd a trial, add the lapse screen, both, or neither for the MVPCLOSED 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