Rubric: check role tokens and resolved scales, not literal pixel values
Rubric: cite the convention pages instead of copying them The API contract preamble carried API Conventions by value, and the state representation catalogue restated Design Conventions row for row. Both now cite the owning page; the rubric keeps only the verification layer — which token signature must be visibly present in the screenshot for each matched row.
Reroute links from the collapsed auditor sections to the rubric Design Conventions, API Conventions, the Accessibility Checklist, Component Lifecycle and the Night Watch role summary all pointed at auditor sections that no longer exist. Each now points at the rubric section that carries the check, with the convention pages still owning what the rule is.
Fix spacing around the Doc Reviewer rubric note
Reduce the deprecated API Auditor to a redirect; point Doc Reviewer at the rubric The API Auditor's checks are all carried by the rubric now, including the composition items its successor had dropped. The Doc Reviewer keeps its scripts and per-check detail — those are the enforcement the rubric cites — and gains a note saying the rubric owns the grading.
Collapse the restated audit checklists into rubric pointers Theme Auditor scope, Hardening Protocol Layer 1, and the Hardening Audit Guide's evaluation criteria all restated checks the Component Audit Rubric now carries. Each page keeps its unique operational content and points at the rubric.
Component Auditor: run the rubric instead of restating its checks Sections 1-11 duplicated the Component Audit Rubric and had already drifted from it. The page keeps what is unique to the role: nightly selection, batching, the PR conventions, the refinement loop and the state file.
Add the auditor checks the rubric was missing Consolidation surfaced seven checks that lived only on an auditor page: hasAutoFocus/data-autofocus (P37), the escape-hatch and raw-element prop- interface contract (P38), the sanctioned non-token values (T2b), the raw-to- semantic type scale mapping (T21), the primitive-reuse test (T29), when a sub-element does not earn a target (T7), and public hook export registration (P17).
Publish the Component Audit Rubric Eleven weighted sections, four run modes, per-item verification class and severity, and the screenshot gate on rendered design judgment. Adapted from the source draft: cross-references converted to wiki links, the author-facing open-decisions section dropped, and the facts it asserts re-verified against main (VariantMap extensibility, the neutral gray token names, changeAction, story counts).
Fix remaining stale token names across the wiki --size-sm/md/lg, spacingTokens.space3, --shadow-menu, --radius-rounded and the --text-* raw scale do not exist on main; the token objects are *Vars maps keyed by CSS custom property name.
Correct the build pipeline description: Babel and tsc, ESM-only output core/lab/charts/richtext build with Babel plus tsc, not tsup; core is type: module so there is no CJS bundle or .mjs/.d.mts pair. @astryxdesign/build ships StyleX Babel/PostCSS/Vite plugins, not a tsup config.
Fold the API Auditor's composition checks into the Component Auditor Slot hoisting, the raw-element prop-interface angle, undemonstrated escape hatches and boolean-or-config were dropped when the roles merged; the successor had no composition section at all. They are live checks, so they move rather than retire.
Teach ref as a prop instead of forwardRef Main is React 19 ref-as-prop: 149 core components declare ref on their props interface, @eslint-react/no-forward-ref is enabled, and exactly one forwardRef call site remains (lab's RichTextEditor).
Update the authoring guide to the shipped token and theming APIs Tokens are defineVars maps indexed by the CSS custom property name (colorVars['--color-*'], spacingVars, sizeVars, durationVars, easeVars), not colorTokens.surface / spacingTokens.space3 / transitionTokens.fast. Overrides are consumed through the themeProps class, not useContext(ThemeContext) and a ComponentStyles interface that does not exist. The animation examples no longer hardcode 0.6s and ease-out.
Stories live in apps/storybook/stories, not beside the component There are no *.stories.tsx files under packages/; all 180 live in apps/storybook/stories/<Name>.stories.tsx. Also drops the stale claim that components are named Astryx{ComponentName}, which the table below contradicts.
Fix the block template path: packages/cli/assets/templates/blocks
Fix token names in the token layer and type scale tables Size, radius, shadow, ease and typography examples named tokens that are not in tokens.stylex.ts. The raw text scale is --font-size-*, not --text-*, and there is no --shadow-menu.
Correct the neutral gray token names to the ones that exist --color-secondary, --color-muted and --color-wash are not in packages/core/src/theme/tokens.stylex.ts. The real roles are --color-neutral (self-contained elements), --color-background-muted (containers with content), --color-track (slim rails) and --color-background-body (page level).
Correct the extensibility mechanism: VariantMap interfaces, not defineTheme variants defineTheme has no variants key. Extensible props declare a *Map interface in the component's public subpath barrel, derive the prop type from it, and let unknown values fall through to base styles.
Replace the ComponentStyles module-augmentation example with the VariantMap pattern There is no ComponentStyles interface in packages/core/src/theme/types.ts. Extensible props are backed by a *VariantMap interface declared in the component's public subpath barrel.
Correct the input size union and heights to sm/md/lg at 28/32/36px TextInput, Selector and Button all derive size from the same sizeStyles keyed sm/md/lg, backed by --size-element-sm/md/lg (28/32/36px). There is no inputs-only sm|md union, and --size-sm/md/lg do not exist.
State the busy-vs-disabled rule once and flag Button's deviation The page said both that isBusy disables the button and that busy never uses native disabled. Busy is aria-busy plus a guarded handler, never the attribute; Button's current native disable is called out as a tracked deviation (#4871).
Async actions: the shipped prop is changeAction, not on{Verb}Action Every async-capable core component ships changeAction / clickAction; there are zero on*Action props in packages/core/src. Async actions drop the on prefix.
Hook naming: replace useControllableState with a hook that exists useControllableState is not in packages/core/src/hooks — components hand-roll the controlled/uncontrolled merge. Use useInputContainer as the internal-hook example instead.
Correct export conventions: exports map is generated, not tsup The core exports map is generated by scripts/sync-exports.js and guarded by sync:exports:check and verify-exports.mjs. Hand-editing it is a review reject. vega is the only package still built with tsup.
vibe-test: scores 2026-08-10
vibe-test: scores 2026-08-09
vibe-test: scores 2026-08-08
vibe-test: scores 2026-08-07
Doc Reviewer: refresh all check paths for the CLI restructure The restructure relocated the CLI tree and several audit checks silently went dead (globbing paths that no longer exist, so passing on zero files): - Templates moved packages/cli/templates/ -> packages/cli/assets/templates/ (614 block + 43 page docs). Checks 3/6/7/8/9/10/11 globbed the empty old path and were passing on nothing. - Reference docs moved packages/cli/docs/ -> packages/cli/assets/docs/. - src/ split: docs loader -> api/docs/docs.mjs; component-loader -> foundation/discovery/; docOverlays.test -> api/docs/; bin -> clients/cli/bin/astryx.mjs. - Check 18 config/README drift: the Zod schemas are now module-PRIVATE (const configSchema / const integrationSchema) split across authoring/config/parse.mjs + authoring/integration/parse.mjs, not the old exported names in src/lib/. Rewrote the audit to read both files and match the private names. Verified against current main: block globs resolve (614+43 files) and the config drift audit reads real schema keys instead of empty sets.