Skip to content

History

Revisions

  • Rubric: unbreak the §2 and §5 tables A blockquote in the middle of a markdown table ends the table: the rows after it rendered as a paragraph of literal pipe text. The T1-exceptions and T14-scoping notes split §2 into three pieces (T2-T14 and T15-T34 both raw), and the D12 note split §5 (D13-D16 raw). Each table is now contiguous, with the notes moved directly below it — the shape §9 already used. Rows are unchanged apart from T2b's pointer, which now says the T1 note is below rather than above.

    @cixzhang cixzhang committed Aug 12, 2026
    99f861e
  • template scores: page/shell-side-nav A (100.0), rubric 1

    @ernestt ernestt committed Aug 12, 2026
    c84807d
  • Add template rubric version history

    @ernestt ernestt committed Aug 12, 2026
    e3a87be
  • Document template audit recording workflow

    @ernestt ernestt committed Aug 12, 2026
    c373f3e
  • Bootstrap template audit ledger from bundled seed (25 templates)

    @ernestt ernestt committed Aug 12, 2026
    210542a
  • scores: AppShell B (88.0), rubric 1.3

    @cixzhang cixzhang committed Aug 12, 2026
    a6e5c67
  • scores: TransferList C (75.9), rubric 1.3

    @ernestt ernestt committed Aug 12, 2026
    8eb2244
  • scores: ListInput C (77.2), rubric 1.3

    @ernestt ernestt committed Aug 12, 2026
    a282de3
  • Ledger: Indicator 82.4/C -> 87.1/B — P11 withdrawn as out of scope Not fixed: WITHDRAWN. P11 covers a removed, renamed or retyped PUBLIC export, and IndicatorProps has never shipped. core@0.3.0, the published version, was released 2026-08-05 with no ./Indicator subpath in its exports map. Indicator landed 2026-08-11 in #4712, and that changeset is still pending in .changeset/ — no release has consumed it. The whole layer ships for the first time next release. So there is no public surface to break, no consumer to migrate and nothing for a codemod to rewrite. #4938 (the escalation to [breaking] + minor + codemod) and #4937 are both closed as invalid. The audit cited the rule accurately against its text. Neither it nor I asked the prior question — has this export ever shipped? Caught by the TL, not by either pass. That leaves ZERO open BLOCKs. Every BLOCK this row has carried is closed: the original six (#4890), B15/X9/X14 (#4913, #4911), P3 (#4921), and now P11 withdrawn. 68.0/D -> 87.1/B over five audits. For the rubric owner: P11, T33, I7, X20, Q11 and L14 all encode "a breaking change needs a [breaking] changeset and a codemod" in six places. Only L14 is scoped to a PR and left ungraded; the other five can attach a durable BLOCK to a COMPONENT for what is really a property of a diff — and none of them says "only if the surface is released". A changeset is consumed and deleted at release, so such a BLOCK also evaporates on its own without anyone fixing anything.

    @cixzhang cixzhang committed Aug 12, 2026
    b10723e
  • scores: AppShell C (78.8), rubric 1.3

    @cixzhang cixzhang committed Aug 12, 2026
    7304d13
  • vibe-test: scores 2026-08-12

    @cixzhang cixzhang committed Aug 12, 2026
    ffa0d77
  • Ledger: Indicator 82.4/C at 653729439e, first run under rubric v1.3 Re-audit after #4921. Score is flat, and the flatness is the finding: the recorded P3 BLOCK is genuinely closed, and the same diff opened a different BLOCK in the same section. Closed, proven rather than accepted: - P3 (#4918) -- all four render paths emit aria-hidden="true" under every route a caller has (literal, spread of the string, spread of the boolean, cloneElement): 12 runtime measurements, 52 browser captures in four theme/mode combos, re-measured independently by a second pass. The design's load-bearing claim was re-proved on a bare three-line interface: TypeScript exempts hyphenated JSX attributes from excess-property checking, so ordering is the enforcing half. - B15, X9, X14 stayed closed; X21's recorded example is fixed. New BLOCK P11 (#4937), and it is mine: #4921 Omitted four members from the exported IndicatorProps -- a retyped public export, which P11 names explicitly -- and shipped it as a `patch` under [fix] with no codemod. The changeset itself advertises the break. check:changesets only enforces category-to-bump, so CI could not see it. The precedent is my own PR three commits earlier, which shipped [breaking] + minor + a codemod for a strictly quieter break. Fix that one and nothing else -> 87.1 / B. Three FIXes belong in the same correction: `tabIndex` is still forwarded while aria-hidden became unconditional (real-Chromium axe goes 0 -> 1 aria-hidden-focus violation, a trap this diff created); doc line 55 still says "render children when present"; and "passing role is a compile error" is true only for a literal, not for any spread. Note for the rubric owner: that doc line is the identical sentence X21 would BLOCK, one field away -- X21 enumerates examples[].code, usage.bestPractices and @example, and a props[].description is none of those.

    @cixzhang cixzhang committed Aug 12, 2026
    3884786
  • Rubric v1.3: add X21 — a doc example may not teach a pattern we removed The Indicator audit surfaced a finding with no rule to hold it. #4913 replaced `{children ?? mark}` in all three shipped indicators because it deletes the state mark on a falsy child (#4893), and left the ONLY worked example of writing a replacement indicator teaching exactly that shape. Code fixed, documentation still instructing readers to rebuild the bug -- on a surface X5a's own rationale calls LLM training signal. The auditor who found it filed it under X5. That citation is wrong: X5a is a phantom prop, X5b is a missing prop entry, and this is neither. I overruled the citation and recorded a FIX, which left a BLOCK-severity defect scored as cosmetic. The real defect was in the rubric: no rule covered it, so it had nowhere to go but a rule that did not fit. X21 (§8, BLOCK) closes that gap, scoped so it cannot become a style cudgel: the test is whether following the example re-creates a defect the repo has already paid to remove -- not whether the example is simplified, and not taste. Detection is a grep of the component's .doc.mjs for the shape just removed, run as part of any behavioral fix. Minor bump, not patch: a new check that can BLOCK changes what counts, so §8 scores taken under <=1.2.1 are not comparable. No weight, floor or ceiling moved, and no other section is affected.

    @cixzhang cixzhang committed Aug 11, 2026
    90431f1
  • Ledger: Indicator 79.1/C -> 82.4/C, mode O, rubric v1.2.1 Re-audit at cd0b9f6340, after #4913 closed the regression #4890 had introduced. All three BLOCKs this row carried are genuinely closed, each verified by measurement rather than on the PR's word: - B15 (#4893) -- reverted the three sources in a separate worktree and watched 6 of the 12 new tests go red; confirmed in the browser that the not-busy column keeps its mark. All three indicators now agree on the falsy contract, and `0` counts as content. - X9 (#4894) -- the sweeps that could not see this component now do: rtl:audit 0 stories/0 checks -> 5/6, axe 0 -> 5 stories with 0 violations, prop->story coverage 100%. - X14 (#4895) -- 0 tagged, 7 bare @example fences. Closed by #4911. Still C on one open BLOCK, P3 (#4918), pre-existing and missed by all three prior passes: a caller can pass aria-hidden="false" and every indicator honours it. Fix P3 alone -> 87.1 / B. Two independent passes again, reconciled, and both adjudications went against the independent one. P3 adopted and corrected UPWARD: it found 2 of 3 indicators, re-measurement shows 3 of 3. Its second BLOCK, filed as X5, had the finding right and the rule wrong -- X5 is phantom props, and "the doc example teaches a fixed bug" is neither X5a nor X5b, so it is recorded as a FIX and does not cap §8. Citing a rule that does not cover the finding would make the ratchet unfalsifiable. That FIX is still the sharpest thing in the audit: Indicator.doc.mjs:207, the only worked example of writing a replacement indicator, teaches `{children ?? mark}` -- the exact pattern #4913 removed from the shipped components. The code is fixed; the documentation still tells readers to rebuild the bug.

    @cixzhang cixzhang committed Aug 11, 2026
    39289a0
  • scores: Stepper B (88.3), rubric 1.2.1

    @ernestt ernestt committed Aug 11, 2026
    230653b
  • scores: Stepper — link 4 audit issues (P14 #4897, D12 #4898, V6 #4899, X6 #4900)

    @ernestt ernestt committed Aug 11, 2026
    a5fb987
  • scores: Stepper C (71.6), rubric 1.2.1

    @ernestt ernestt committed Aug 11, 2026
    8d7e9c2
  • Ledger: Indicator 68.0/D -> 79.1/C, mode O, rubric v1.2.1 Re-audit at b4ec116843 (#4890), the PR closing the six BLOCKs recorded against this row. All six are genuinely closed -- five verified independently rather than on the PR's word. Two independent passes were run and reconciled, because the agent that wrote the fix cannot credibly grade it. The adversarial pass found a regression the author had missed. Grade stays at C on three open BLOCKs: - B15 (#4893) NEW, from #4890: `children != null` guards the children branch, so children={isBusy && <Spinner/>} deletes the selection mark on every chosen row. Reproduced twice, independently. - X9 (#4894) no story file -- pre-existing, missed by both prior passes. - X14 (#4895) all 7 @example fences are language-tagged, against CLAUDE.md:82-83 -- pre-existing, missed by both prior passes. X9 and X14 are a re-scoring of an unchanged surface, not a regression. Fix all three and nothing else -> projected 85.8 / B. Note on comparability: the tool reports 68.0 -> 79.1 as `incomparable` because the rubric version moved 1.2 -> 1.2.1. Per the rubric's own version history, 1.2.1 changed wording and scope only -- no weights, floors or severities -- so the delta is meaningful.

    @cixzhang cixzhang committed Aug 11, 2026
    2d38b23
  • Ledger: AlertDialog 89.6/B, mode N, rubric v1.2.1 Post-fix row, replacing the 79.4/C pre-fix row from the same night. 3 BLOCKs to 0 (X16, V6/V7, V3), delta +10.2, at ec85ba0b6f on main. Records the TL review on #4887: T28 and P33 withdrawn as rule defects rather than component defects (both rules corrected in rubric v1.2.1), onAction ruled a nit, and the isInline role fixed in the same PR. A10 now links the Q3 responsive-web tracker #4476. v1.2.1 is a patch over the v1.2 the pre-fix row used, so the two are comparable and the delta is real.

    @cixzhang cixzhang committed Aug 11, 2026
    3ef4010
  • Component-Audit-Rubric: correct T34 to the indicator convention we shipped The host renders the indicator unconditionally and passes state; an indicator may legitimately draw nothing in a state. The focus ring is the owner's to guarantee -- it is painted onto the indicator's own element, not omitted. Radius is tokenized (--radius-full, not 50%).

    @cixzhang cixzhang committed Aug 11, 2026
    3812e91
  • Rubric v1.2.1 + API Conventions: correct T28 (composition-layer theme targets) and P33 (html prefix) Both from the AlertDialog audit review, PR #4887. T28 read as a blanket ban on themeProps anywhere a composition wrapper wraps themed components. That is not what #672 and #749 established: #672 deliberately ADDED a target to MoreMenu over DropdownMenu so themes could reach it, and #749 skipped Tokenizer, an outer node wrapping several independently themed components. T28 now says that: a layer may name its own concept on the painting element; the ban is on the multi-component wrapper node. P33 led with the html prefix. The prefix is for props that ARE the native attribute (htmlName, htmlFor); a prop that merely reuses the name with a different meaning keeps the semantic name. BaseProps already omits title, so a component's own title prop is not a collision at all. API Conventions §HTML Attribute Collisions rewritten to match, since it owns the rule.

    @cixzhang cixzhang committed Aug 11, 2026
    2581bc9
  • vibe-test: scores 2026-08-11

    @cixzhang cixzhang committed Aug 11, 2026
    7f092b7
  • Ledger: Indicator 68/D, mode O, rubric v1.2

    @cixzhang cixzhang committed Aug 11, 2026
    efafc53
  • Ledger: AlertDialog 79.4/C, mode N, rubric v1.2 Pre-fix score from the nightly pass of 2026-08-11, audited at ccb5ca9dc1. Three open BLOCKs: the APG pattern is unnamed in the docs (X16), there are no keyboard or focus tests (V6/V7), and the exported useImperativeAlertDialog has none (V3). This is the first row that is not from the calibration exercise, so it is a new entry rather than a decrease. PR #4887 fixes all three and re-audits to 89.6 (B); that score replaces this row when the PR lands, so the commit recorded then is a real main commit.

    @cixzhang cixzhang committed Aug 11, 2026
    5dfe9b2
  • Ledger tooling and the scores page are on main; activate T34

    @cixzhang cixzhang committed Aug 11, 2026
    aea78be
  • State visuals: scale(0.98) is the button press treatment; match the archetype before the representation

    @cixzhang cixzhang committed Aug 11, 2026
    2219b27
  • Testing: compare visuals against Design Conventions; missing tooling is not a deduction

    @cixzhang cixzhang committed Aug 11, 2026
    777c51e
  • D12: link the view-transitions tracking issue

    @cixzhang cixzhang committed Aug 11, 2026
    8ac4721
  • D12: view transitions are the resolution path, blocked on React stable

    @cixzhang cixzhang committed Aug 11, 2026
    7450fe0
  • D12 applies on every render path; only T14's DOM-shape rule is scoped

    @cixzhang cixzhang committed Aug 11, 2026
    471c8f3