An open source design system that's fully customizable and agent ready
This report summarizes scanner evidence for facebook/astryx, a TypeScript project with 13,814 GitHub stars. SynthScan examined 1,318,888 lines of code across 4908 source files, recording 1210 pattern matches distributed across 15 syntactic categories. The legacy adjusted pattern signal is 1.4 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 853 finding(s).
Are imports declared and package/API names verified? 112 finding(s).
Are wrappers, guards, and repeated structures necessary? 703 finding(s).
Which changes need focused human review? 1210 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1210 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | eslint.config.js | 697 | // ── CLI architecture invariants ──────────────────────────────────────── | COMMENT |
| MEDIUM | eslint.config.js | 807 | // ── INV23 + FR3: text-layout bans in command handlers ─────────────── | COMMENT |
| MEDIUM | internal/vibe-tests/prompt-purity-test/run-purity.ts | 87 | // ── Live snapshotting of the output file (the purity timeline) ──────── | COMMENT |
| MEDIUM | internal/vibe-tests/prompt-purity-test/run-purity.ts | 147 | // ── Bounded concurrency pool ───────────────────────────────────────── | COMMENT |
| MEDIUM | internal/vibe-tests/prompt-purity-test/run-purity.ts | 172 | // ── One run (spawn cursor-agent headless) ──────────────────────────── | COMMENT |
| MEDIUM | internal/vibe-tests/prompt-purity-test/run-purity.ts | 308 | // ── Main ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …rnal/vibe-tests/prompt-purity-test/purity-aggregate.ts | 427 | // ── Comparison vs control ────────────────────────────────────────── | COMMENT |
| MEDIUM | …rnal/vibe-tests/prompt-purity-test/purity-aggregate.ts | 447 | // ── Cost (exact tokens; $ is an estimate) ────────────────────────── | COMMENT |
| MEDIUM | internal/vibe-tests/prompt-purity-test/smoke-test.ts | 56 | // ── Fixtures ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/vibe-tests/prompt-purity-test/smoke-test.ts | 80 | // ── A. classifier ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/vibe-tests/prompt-purity-test/smoke-test.ts | 159 | // ── B. setup wiring ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/vibe-tests/prompt-purity-test/smoke-test.ts | 283 | // ── C. runner dry-run (best-effort) ────────────────────────────────── | COMMENT |
| MEDIUM | internal/vibe-tests/prompt-purity-test/smoke-test.ts | 326 | // ── Cleanup + report ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/vibe-tests/prompt-purity-test/purity-eval.ts | 62 | // ── className string extraction (for Tailwind detection) ────────────── | COMMENT |
| MEDIUM | internal/vibe-tests/prompt-purity-test/purity-eval.ts | 98 | // ── Marker detectors ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/vibe-tests/prompt-purity-test/purity-eval.ts | 256 | // ── Cost: parse the cursor-agent terminal `result` event + estimate $ ───────── | COMMENT |
| MEDIUM | internal/vibe-tests/scripts/smoke-test.sh | 66 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | internal/vibe-tests/scripts/smoke-test.sh | 68 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | internal/vibe-tests/scripts/smoke-test.sh | 87 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | internal/vibe-tests/scripts/smoke-test.sh | 89 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | internal/vibe-tests/scripts/smoke-test.sh | 121 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | internal/vibe-tests/scripts/smoke-test.sh | 123 | # ------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | internal/vibe-tests/scripts/smoke-test.sh | 225 | # ------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | internal/vibe-tests/scripts/smoke-test.sh | 227 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | internal/vibe-tests/scripts/smoke-test.sh | 290 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | internal/vibe-tests/scripts/smoke-test.sh | 292 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | internal/vibe-tests/scripts/smoke-test.sh | 321 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | internal/vibe-tests/scripts/smoke-test.sh | 323 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | internal/vibe-tests/scripts/smoke-test.sh | 338 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | internal/vibe-tests/scripts/smoke-test.sh | 340 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | internal/vibe-tests/scripts/smoke-test.sh | 353 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | internal/vibe-tests/scripts/smoke-test.sh | 355 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.tsx | 109 | // ─── Base Props (shared across all modes) ───────────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.tsx | 192 | // ─── Mode-specific Props (discriminated union) ──────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 88 | // ─── Basic Rendering ───────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 229 | // ─── Selection ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 338 | // ─── Navigation ────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 382 | // ─── Date Constraints ──────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 416 | // ─── Initial Visible Month ─────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 679 | // ─── Multi-Month ───────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 726 | // ─── Display Options ───────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 761 | // ─── Range Mode ────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 919 | // ─── Accessibility ─────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 1005 | // ─── Month Change Announcements ────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 1584 | // ─── Selection Semantics for AT (WCAG 4.1.2 / 1.3.1) ──────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 1719 | // ─── Bug Regression Tests ─────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 1914 | // ─── RTL (#3388) ───────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 1914 | // ─── RTL (#3388) ───────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 1964 | // ─── Day-cell marker theming (#4286) ───────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 1964 | // ─── Day-cell marker theming (#4286) ───────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Calendar/Calendar.test.tsx | 2088 | // ─── Theming targets ───────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Field/Field.tsx | 293 | // ─── Horizontal-labels mode ─────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Field/Field.tsx | 331 | // ─── Default mode (vertical / horizontal) ───────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Field/Field.test.tsx | 510 | // ─── width prop (#2755) ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Field/Field.test.tsx | 510 | // ─── width prop (#2755) ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/Field/Field.test.tsx | 569 | // ─── Horizontal-labels context ──────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/FormLayout/FormLayout.test.tsx | 35 | // ─── Basic rendering ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/FormLayout/FormLayout.test.tsx | 89 | // ─── Direction modes ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/FormLayout/FormLayout.test.tsx | 120 | // ─── Context propagation ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/FormLayout/FormLayout.test.tsx | 149 | // ─── Nesting ──────────────────────────────────────────────────────────── | COMMENT |
| 184 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | internal/vibe-tests/app/src/report/Report.tsx | 90 | function MaintainabilityMetricsCard({ | CODE |
| LOW | internal/vibe-tests/setup-test/setup-canonical.test.ts | 203 | function installHostAlignedStrategy(arm: string) { | CODE |
| LOW | internal/vibe-tests/setup-test/setup-canonical.test.ts | 288 | function installGuestContainedStrategy(arm: string) { | CODE |
| LOW | internal/vibe-tests/setup-test/setup-canonical.test.ts | 600 | function applyEnterpriseComposition(arm: string) { | CODE |
| LOW | internal/vibe-tests/setup-test/setup-canonical.test.ts | 839 | function writeFalsePositiveEvidence( | CODE |
| LOW | internal/vibe-tests/setup-test/setup-canonical.test.ts | 1528 | function measureShellTriggerInsertion() { | CODE |
| LOW | internal/vibe-tests/setup-test/setup-canonical.test.ts | 1673 | function insertGuestBoundaryDialogTrigger(arm: string) { | CODE |
| LOW | internal/vibe-tests/setup-test/setup-canonical.test.ts | 1704 | function measureGuestBoundaryInsertion() { | CODE |
| LOW | internal/vibe-tests/setup-test/setup-aggregate.ts | 79 | export function assertAggregateReportPublicSafe(value: unknown) { | CODE |
| LOW | internal/vibe-tests/setup-test/setup-eval.ts | 830 | function baselineValidationFailures(baseline: Measurement): string[] { | CODE |
| LOW | internal/vibe-tests/src/interactive.ts | 994 | function generateSubagentInstructions( | CODE |
| LOW | internal/vibe-tests/src/universal-eval.ts | 784 | function countMagicAndSemanticValues( | CODE |
| LOW | internal/vibe-tests/src/provenance-aggregation.ts | 27 | export function loadOptionalExecutionProvenance( | CODE |
| LOW | internal/a11y-spec/src/patterns/checkbox.ts | 276 | async function assertReachableAndEscapable( | CODE |
| LOW | internal/a11y-spec/src/patterns/tabs.fixtures.ts | 833 | export function expectedTabsMutationFailure( | CODE |
| LOW | internal/a11y-spec/src/patterns/radio-group.fixtures.ts | 647 | export function expectedRadioGroupMutationFailure( | CODE |
| LOW | internal/a11y-spec/src/patterns/carousel.fixtures.ts | 306 | export function expectedCarouselMutationFailure( | CODE |
| LOW | internal/a11y-spec/src/patterns/text-input.ts | 135 | async function assertKeyboardEditsBlocked( | CODE |
| LOW | internal/a11y-spec/src/patterns/tabs.ts | 300 | async function assertSelectionKeyRoundTrip( | CODE |
| LOW | …ernal/eslint-plugin-astryx/no-hardcoded-i18n-string.js | 226 | function reportUserFacingLiteralsIn(expr, name, context, isDefault, opts = {}) { | CODE |
| LOW | …/eslint-plugin-astryx/require-baseprops-passthrough.js | 137 | function collectDisplayNamedComponents(program) { | CODE |
| LOW | internal/eslint-plugin-astryx/no-physical-properties.js | 431 | function horizontalTransformLeaves(node) { | CODE |
| LOW | internal/eslint-plugin-astryx/no-physical-properties.js | 557 | function uncompensatedLogicalCentering(node) { | CODE |
| LOW | internal/eslint-plugin-astryx/no-raw-intl-locale.js | 217 | function segmenterUsesOnlyGraphemes(optionsNode) { | CODE |
| LOW | internal/eslint-plugin-astryx/stylex-style-source.js | 198 | export function extractStylexStyleProperties(text) { | CODE |
| LOW | internal/eslint-plugin-astryx/stylex-style-source.js | 273 | export function resolveImportedStyleProperties( | CODE |
| LOW | scripts/sync-templates.js | 203 | function generateBlockRouteWrapper(block) { | CODE |
| LOW | …e/src/InteractiveRoleContext/InteractiveRoleContext.ts | 51 | export function useInteractiveRoleContext(): InteractiveRole | null { | CODE |
| LOW | packages/core/src/Kbd/Kbd.tsx | 125 | function subscribeToPlatformChanges(): () => void { | CODE |
| LOW | packages/core/src/Kbd/Kbd.tsx | 129 | function getServerPlatformSnapshot(): boolean { | CODE |
| LOW | packages/core/src/Drawer/useDrawerDialogPresence.ts | 244 | function readTransformTransitionMs(element: HTMLElement): number | null { | CODE |
| LOW | packages/core/src/Selector/SelectorBottomSheet.tsx | 43 | function SelectorBottomSheetInitialFocus({ | CODE |
| LOW | …ckages/core/src/Selector/__tests__/Listbox.a11y.dom.ts | 12 | export function installListboxDialogStubs(): void { | CODE |
| LOW | packages/core/src/Tooltip/useTooltip.test.tsx | 372 | function installReentrantPopoverApi() { | CODE |
| LOW | packages/core/src/Tooltip/useTooltip.test.tsx | 411 | function PopoverWithTooltipTrigger({onShow}: {onShow: () => void}) { | CODE |
| LOW | …ests__/TooltipTallContentTracking.a11y.browser.spec.ts | 141 | function expectClearFromSecondFrame(frames: Frame[]) { | CODE |
| LOW | …ests__/TooltipTallContentTracking.a11y.browser.spec.ts | 269 | function expectReadableOnRoomierSide(frames: Frame[], viewportHeight: number) { | CODE |
| LOW | packages/core/src/Calendar/dayCellUtils.ts | 249 | export function computeDayNeighborContinuity(input: { | CODE |
| LOW | …es/core/src/Calendar/getStandaloneShortWeekdayNames.ts | 25 | export function getStandaloneShortWeekdayNames( | CODE |
| LOW | packages/core/src/Chat/useTriggerMenu.tsx | 220 | function isUnmatchedMultiWordQuery( | CODE |
| LOW | …rc/Chat/__tests__/ChatMessageBubble.auditProvenance.ts | 35 | export async function resolveChatMessageBubbleAuditProvenance({ | CODE |
| LOW | packages/core/src/CodeBlock/highlightRanges.ts | 46 | function ensureDynamicHighlightType(tokenType: string): void { | CODE |
| LOW | packages/core/src/CodeBlock/highlightRanges.ts | 215 | export function applyHighlightRangesChunked( | CODE |
| LOW | packages/core/src/CodeBlock/highlightRanges.ts | 343 | export function applyHighlightRangesBatch( | CODE |
| LOW | …/src/CheckboxInput/__tests__/Checkbox.a11y.renders.tsx | 113 | function ReadOnlyCollectionListItem() { | CODE |
| LOW | packages/core/src/DropdownMenu/DropdownMenuContext.tsx | 163 | export function useDropdownMenuRadioGroupContext(): DropdownMenuRadioGroupContextValue | null { | CODE |
| LOW | packages/core/src/DropdownMenu/lazyMenuBottomSheet.ts | 82 | export async function preloadMenuBottomSheetActionList(): Promise<ActionListPreload> { | CODE |
| LOW | packages/core/src/DropdownMenu/lazyMenuBottomSheet.ts | 110 | export function MenuBottomSheetActionList( | CODE |
| LOW | …es/core/src/DropdownMenu/MenuBottomSheetActionList.tsx | 61 | export function MenuBottomSheetActionList({ | CODE |
| LOW | packages/core/src/Markdown/remark.ts | 1443 | export function createMarkdownRemarkTransform( | CODE |
| LOW | packages/core/src/Markdown/Markdown.fr23.bench.ts | 105 | function knownRangeDecorationPlugin(source: string) { | CODE |
| LOW | packages/core/src/Markdown/Markdown.tsx | 888 | function useStableMarkdownSyntaxEntries( | CODE |
| LOW | packages/core/src/Markdown/Markdown.tsx | 1312 | function computeTableColumnMinWidths(node: RenderTable): number[] { | CODE |
| LOW | packages/core/src/Markdown/ast.ts | 155 | export function getMarkdownAstLegacyCodeLanguage( | CODE |
| LOW | packages/core/src/Markdown/parser.perf.test.ts | 54 | function simulateStreamingFullReparse( | CODE |
| LOW | packages/core/src/Markdown/parser.perf.test.ts | 64 | function simulateStreamingIncremental( | CODE |
| LOW | packages/core/src/Markdown/parser.ts | 740 | function stripExactBlockquoteDepth( | CODE |
| LOW | packages/core/src/Markdown/parser.ts | 2788 | function peelTrailingPunctAndParens(url: string): string { | CODE |
| LOW | packages/core/src/Markdown/parser.ts | 3181 | function canContinueParagraphLazily( | CODE |
| LOW | packages/core/src/Markdown/parser.ts | 4985 | export function parseMarkdownAstIncremental( | CODE |
| 398 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crowdin.yml | 1 | # Copyright (c) Meta Platforms, Inc. and affiliates. | COMMENT |
| LOW | crowdin.yml | 21 | # commits translations directly. By default that integration appends its | COMMENT |
| LOW | playwright.config.ts | 61 | // The contract's own conforming/violating fixture proof. | COMMENT |
| LOW | eslint.config.js | 921 | // | COMMENT |
| LOW | vitest.config.ts | 81 | }, | COMMENT |
| LOW | vitest.config.ts | 101 | // they fail loudly there — move it into the `ui` include list. | COMMENT |
| LOW | vitest.config.ts | 161 | // from inlined callers. | COMMENT |
| LOW | pnpm-workspace.yaml | 1 | # Copyright (c) Meta Platforms, Inc. and affiliates. | COMMENT |
| LOW | pnpm-workspace.yaml | 21 | linkWorkspacePackages: true | COMMENT |
| LOW | pnpm-workspace.yaml | 61 | # Moved from package.json's "pnpm" field: pnpm 11 no longer reads | COMMENT |
| LOW | pnpm-workspace.yaml | 81 | dompurify: ^3.4.13 | COMMENT |
| LOW | internal/test-utils/src/setup.ts | 21 | // whether both are present is timing-dependent (the region updates on an effect | COMMENT |
| LOW | internal/vibe-tests/setup-test/setup-canonical.test.ts | 1961 | // document scope before first paint, so the design system's typographic | COMMENT |
| LOW | internal/vibe-tests/scripts/smoke-test.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | internal/eslint-plugin-astryx/index.js | 401 | '@astryx/no-raw-paragraph': 'error', | COMMENT |
| LOW | internal/eslint-plugin-astryx/index.js | 421 | // Core and lab draw every ring from the shared utility; error so the one | COMMENT |
| LOW | internal/eslint-plugin-astryx/index.js | 441 | '@astryx/copyright-header': 'error', | COMMENT |
| LOW | internal/eslint-plugin-astryx/index.js | 521 | // A component-level light-dark() is a light/dark decision no theme can | COMMENT |
| LOW | internal/interaction-harness/src/busy.ts | 661 | const longestStallMs = longestGap.ms; | COMMENT |
| LOW | internal/interaction-harness/src/curves.ts | 121 | animation.addEventListener('finish', event => { | COMMENT |
| LOW | scripts/prune-branches.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packages/core/src/Thumbnail/Thumbnail.tsx | 181 | // SelectableCard. A transparent `::after` tints on hover/press instead of | COMMENT |
| LOW | packages/core/src/AvatarGroup/AvatarGroupOverflow.tsx | 101 | paddingBlock: 0, | COMMENT |
| LOW | packages/core/src/Drawer/Drawer.tsx | 141 | transitionDuration: durationVars['--duration-medium'], | COMMENT |
| LOW | packages/core/src/Drawer/Drawer.tsx | 241 | overflowX: 'hidden', | COMMENT |
| LOW | packages/core/src/Selector/Selector.tsx | 201 | // its own value box to that row rather than asking the value to fit it: any | COMMENT |
| LOW | packages/core/src/Selector/Selector.tsx | 481 | opacity: 0.5, | COMMENT |
| LOW | packages/core/src/Selector/Selector.tsx | 1261 | // only option and group children — so this region is its only route to | COMMENT |
| LOW | packages/core/src/Selector/Selector.tsx | 1521 | onContainerKeyDown={e => { | COMMENT |
| LOW | packages/core/src/Selector/Selector.test.tsx | 3661 | // renders role="separator" (unchanged visual/DOM), but must be excluded | COMMENT |
| LOW | …__tests__/EmptyStateAnnouncement.a11y.chromium.spec.ts | 81 | // mutation-checked there (restoring the old `searchQuery === ''` condition | COMMENT |
| LOW | packages/core/src/ClickableCard/ClickableCard.tsx | 81 | }, | COMMENT |
| LOW | packages/core/src/Tooltip/useTooltip.tsx | 561 | clearTimeouts(); | COMMENT |
| LOW | packages/core/src/SideNav/SideNavItem.tsx | 121 | }, | COMMENT |
| LOW | packages/core/src/SideNav/SideNavItem.tsx | 801 | const primaryIndent = depth > 0 && indentStyles.primary(depth); | COMMENT |
| LOW | packages/core/src/Card/Card.tsx | 61 | '--_card-radius': radiusVars['--radius-container'], | COMMENT |
| LOW | packages/core/src/Typeahead/BaseTypeahead.tsx | 541 | // only its settled empty row supplies the words to announce. | COMMENT |
| LOW | packages/core/src/Typeahead/BaseTypeahead.tsx | 601 | // with no dependency on event-loop timing between focus and click (a | COMMENT |
| LOW | packages/core/src/Typeahead/BaseTypeahead.tsx | 1061 | COMMENT | |
| LOW | packages/core/src/Typeahead/Typeahead.tsx | 221 | // row to wrap to. It also cannot wrap and keep its end controls in flow: | COMMENT |
| LOW | packages/core/src/Typeahead/Typeahead.tsx | 241 | // content lane is not the only flexible item in the row (a start icon, a | COMMENT |
| LOW | packages/core/src/Typeahead/Typeahead.tsx | 261 | // input: the lane takes the free space so the end controls sit in the | COMMENT |
| LOW | packages/core/src/Typeahead/Typeahead.tsx | 281 | // is, which is why no story caught it. | COMMENT |
| LOW | packages/core/src/Typeahead/Typeahead.tsx | 461 | COMMENT | |
| LOW | packages/core/src/Indicator/CheckIndicator.tsx | 101 | // indicator's place, matching the other indicators' contract. It is checked | COMMENT |
| LOW | packages/core/src/Indicator/CheckIndicator.tsx | 141 | return null; | COMMENT |
| LOW | packages/core/src/ButtonGroup/ButtonGroup.test.tsx | 201 | ).toBeInTheDocument(); | COMMENT |
| LOW | packages/core/src/Chat/ChatComposerInput.tsx | 521 | // the DOM is already authoritative for that value, and the user | COMMENT |
| LOW | packages/core/src/Chat/ChatComposer.tsx | 281 | }, | COMMENT |
| LOW | packages/core/src/Chat/ChatLayout.test.tsx | 101 | </ChatLayout>, | COMMENT |
| LOW | packages/core/src/CodeBlock/CodeBlock.tsx | 361 | // The glyph column: the +, - or space of every line sits in its own track | COMMENT |
| LOW | packages/core/src/DropdownMenu/DropdownMenuSubMenu.tsx | 881 | // hover-open intent (onMouseEnter/onMouseLeave) — the flyout still opens on | COMMENT |
| LOW | packages/core/src/DropdownMenu/menuItemHover.ts | 41 | if (el !== el.ownerDocument.activeElement) { | COMMENT |
| LOW | packages/core/src/DropdownMenu/DropdownMenu.tsx | 961 | const headerRef = useRef<HTMLDivElement | null>(null); | COMMENT |
| LOW | packages/core/src/Markdown/parser.perf.test.ts | 301 | // Both are tracked — not bounded — by the next test. | COMMENT |
| LOW | packages/core/src/Layout/overlayPaddingReset.test.tsx | 181 | // so it has to keep reaching inside every overlay — clearing it would | COMMENT |
| LOW | packages/core/src/Tokenizer/TokenizerBottomSheet.tsx | 321 | const listRef = useRef<HTMLDivElement>(null); | COMMENT |
| LOW | packages/core/src/Tokenizer/TokenizerBottomSheet.tsx | 381 | // comes to be: the initial one, an open, a change. | COMMENT |
| LOW | packages/core/src/Tokenizer/TokenizerBottomSheet.tsx | 461 | // clearing. The ref is updated in a layout effect, before any request this | COMMENT |
| LOW | packages/core/src/Tokenizer/useEndLaneReserve.ts | 41 | // | COMMENT |
| 280 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ernal/eslint-plugin-astryx/no-hardcoded-i18n-string.js | 105 | 'placeholder', | CODE |
| LOW | …ages/core/src/ComplexSelector/ComplexSelector.test.tsx | 771 | triggerLabel="Acme Ltd"> | CODE |
| LOW | …ages/core/src/ComplexSelector/ComplexSelector.test.tsx | 779 | expect(trigger).toHaveTextContent('Acme Ltd'); | CODE |
| LOW | packages/core/src/SideNav/SideNav.test.tsx | 918 | superheading="Acme Corp" | CODE |
| LOW | packages/core/src/SideNav/SideNav.test.tsx | 924 | expect(screen.getByText('Acme Corp')).toBeInTheDocument(); | CODE |
| LOW | packages/core/src/TimeInput/TimeInput.test.tsx | 779 | expect(input).toHaveAttribute('placeholder', 'Select a time'); | CODE |
| LOW | packages/core/src/TimeInput/TimeInput.test.tsx | 903 | 'placeholder', | CODE |
| LOW | packages/core/src/Typeahead/types.ts | 25 | * label: 'Jane Doe', | COMMENT |
| LOW | packages/core/src/Markdown/parser.test.ts | 1298 | children: [{type: 'text', content: 'user@example.com'}], | CODE |
| LOW | packages/core/src/Markdown/parser.test.ts | 1341 | children: [{type: 'text', content: 'user@example.com'}], | CODE |
| LOW | packages/core/src/Markdown/Markdown.test.tsx | 1364 | expect(link!.textContent).toBe('user@example.com'); | CODE |
| LOW | packages/core/src/Tokenizer/Tokenizer.test.tsx | 453 | expect(input).not.toHaveAttribute('placeholder', 'Search people...'); | CODE |
| LOW | packages/core/src/Tokenizer/Tokenizer.test.tsx | 469 | expect(input).toHaveAttribute('placeholder', ' '); | CODE |
| LOW | packages/core/src/Toast/ToastViewport.test.tsx | 90 | const EMPTY_OPTIONS: ToastOptions = {body: 'placeholder'}; | CODE |
| LOW | packages/core/src/DateTimeInput/DateTimeInput.test.tsx | 1087 | expect(timeInput).toHaveAttribute('placeholder', 'Select a time'); | CODE |
| LOW | …ges/core/src/DateTimeInput/DateTimeInputTouch.test.tsx | 238 | expect(dateField()).toHaveAttribute('placeholder', 'Select a date'); | CODE |
| LOW | …ges/core/src/DateTimeInput/DateTimeInputTouch.test.tsx | 239 | expect(timeField()).toHaveAttribute('placeholder', 'Select a time'); | CODE |
| LOW | …ges/core/src/DateTimeInput/DateTimeInputTouch.test.tsx | 263 | expect(timeField()).toHaveAttribute('placeholder', 'Pick a time'); | CODE |
| LOW | …yer/__tests__/LayerReducedMotion.a11y.chromium.spec.ts | 53 | trigger: 'Jane Doe', | CODE |
| LOW | …src/Layer/__tests__/TouchTrigger.a11y.chromium.spec.ts | 107 | trigger: (page: Page) => page.getByText('Jane Doe', {exact: true}), | CODE |
| LOW | packages/core/src/theme/types.ts | 161 | 'primary' | 'secondary' | 'disabled' | 'placeholder' | 'accent' | 'inherit'; | CODE |
| LOW | packages/core/src/DateInput/DateInputTouch.test.tsx | 497 | expect(field()).toHaveAttribute('placeholder', 'Select a date'); | CODE |
| LOW | packages/core/src/DateInput/DateInputTouch.test.tsx | 544 | expect(field()).toHaveAttribute('placeholder', 'Pick a day'); | CODE |
| LOW | packages/core/src/Avatar/AvatarStatusDot.tsx | 294 | * name="John Doe" | COMMENT |
| LOW | packages/core/src/Avatar/Avatar.tsx | 432 | * getInitials('John Doe') // 'JD' | COMMENT |
| LOW⚡ | packages/core/src/Avatar/Avatar.tsx | 556 | * <Avatar src="/user.jpg" name="John Doe" /> | COMMENT |
| LOW⚡ | packages/core/src/Avatar/Avatar.tsx | 561 | * <Avatar src="/user.jpg" name="John Doe" href="/users/john" /> | COMMENT |
| LOW⚡ | packages/core/src/Avatar/Avatar.tsx | 562 | * <Avatar src="/user.jpg" name="John Doe" onClick={() => openProfile()} /> | COMMENT |
| LOW⚡ | …s/core/src/CommandPalette/CommandPaletteInput.test.tsx | 181 | expect(input).toHaveAttribute('placeholder', 'Search…'); | CODE |
| LOW⚡ | …s/core/src/CommandPalette/CommandPaletteInput.test.tsx | 187 | expect(input).toHaveAttribute('placeholder', 'Search…'); | CODE |
| LOW⚡ | …s/core/src/CommandPalette/CommandPaletteInput.test.tsx | 194 | ).toHaveAttribute('placeholder', 'Type a command...'); | CODE |
| LOW | packages/native/apple/Tests/AstryxTests/TextTests.swift | 31 | #expect(color.text(named: "placeholder") == color.textSecondary) | COMMENT |
| LOW | …kages/native/apple/Sources/Astryx/Text/TypeStyle.swift | 73 | case "secondary", "placeholder": textSecondary | CODE |
| LOW | …ive/apple/Sources/AstryxNative/Generated/Heading.swift | 33 | case placeholder = "placeholder" | CODE |
| LOW | …native/apple/Sources/AstryxNative/Generated/Text.swift | 30 | case placeholder = "placeholder" | CODE |
| LOW | …kages/lab/src/MobileTokenizer/MobileTokenizer.test.tsx | 1076 | expect(search).toHaveAttribute('placeholder', 'Search…'); | CODE |
| LOW | …s/lab/src/MobilePowerSearch/MobilePowerSearch.test.tsx | 1786 | expect(input).toHaveAttribute('placeholder', 'Search content…'); | CODE |
| LOW | packages/lab/src/TransferList/TransferList.test.tsx | 310 | expect(search).toHaveAttribute('placeholder', 'Find a column'); | CODE |
| LOW | packages/cli/api/search/tree.weights.json | 1 | {"classes":["component","hook","doc","template","theme","NONE"],"tokens":{"#bias":[0.5769,-0.5917,-0.0025,-0.3774,-1.222 | CODE |
| LOW | packages/cli/api/search/_cards.json | 261 | "placeholder", | CODE |
| LOW | packages/cli/api/search/_cards.json | 588 | "placeholder", | CODE |
| LOW | packages/cli/api/search/_cards.json | 653 | "placeholder", | CODE |
| LOW | packages/cli/api/search/_cards.json | 1306 | "placeholder", | CODE |
| LOW | packages/cli/api/search/_cards.json | 1391 | "placeholder", | CODE |
| LOW | packages/cli/api/search/_cards.json | 1482 | "placeholder", | CODE |
| LOW | packages/cli/api/search/_cards.json | 2803 | "placeholder", | CODE |
| LOW | packages/cli/api/search/_cards.json | 2853 | "placeholder", | CODE |
| LOW | packages/cli/api/search/_cards.json | 3044 | "placeholder", | CODE |
| LOW | packages/cli/api/search/_cards.json | 3315 | "placeholder", | CODE |
| LOW | packages/cli/api/search/_cards.json | 4017 | "placeholder", | CODE |
| LOW | packages/cli/api/search/_cards.json | 4052 | "placeholder" | CODE |
| LOW | packages/cli/api/search/_cards.json | 4126 | "placeholder" | CODE |
| LOW | packages/cli/api/search/_cards.json | 4318 | "placeholder", | CODE |
| LOW | packages/cli/api/search/_cards.json | 4623 | "placeholder", | CODE |
| LOW | …es/blocks/components/SideNav/SideNavWithHeaderMenu.tsx | 82 | <ListItem label="Acme Corp" href="#" /> | CODE |
| LOW | …ates/blocks/components/AppShell/AppShellWithBanner.tsx | 76 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do | CODE |
| LOW | …ates/blocks/components/AppShell/AppShellWithBanner.tsx | 76 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do | CODE |
| LOW | …ates/blocks/components/AppShell/AppShellTopNavOnly.tsx | 40 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do | CODE |
| LOW | …ates/blocks/components/AppShell/AppShellTopNavOnly.tsx | 40 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do | CODE |
| LOW | …ocks/components/AppShell/AppShellTopNavWithSideNav.tsx | 66 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do | CODE |
| 51 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | internal/vibe-tests/src/build-previews.ts | 310 | // Step 1: Collect all 'const xxxRaw = { ... } as const;' blocks | COMMENT |
| LOW⚡ | internal/vibe-tests/src/build-previews.ts | 319 | // Step 2: Inline variable references in createTheme calls | COMMENT |
| LOW | internal/vibe-tests/src/build-previews.ts | 338 | // Step 3: Strip remaining type casts (but not in import lines) | COMMENT |
| LOW⚡ | internal/vibe-tests/src/build-report.ts | 285 | // Step 1: Ensure universal.json exists | COMMENT |
| LOW⚡ | internal/vibe-tests/src/build-report.ts | 289 | // Step 2: If baseline provided, ensure comparison | COMMENT |
| LOW | internal/vibe-tests/src/build-report.ts | 303 | // Step 3: Load source code for per-prompt inspection | COMMENT |
| LOW | internal/vibe-tests/src/build-report.ts | 436 | // Step 4: Build the data script | COMMENT |
| LOW⚡ | internal/vibe-tests/src/build-report.ts | 453 | // Step 5: Ensure CSS dist files exist (needed for report build) | COMMENT |
| LOW⚡ | internal/vibe-tests/src/build-report.ts | 456 | // Step 6: Dev mode or build | COMMENT |
| LOW | internal/vibe-tests/src/build-report.ts | 491 | // Step 5: Inject data and styles into the built HTML | COMMENT |
| LOW⚡ | packages/core/src/Markdown/streaming.test.ts | 128 | // Step 1: boundaries = [0, 5, 10] | COMMENT |
| LOW⚡ | packages/core/src/Markdown/streaming.test.ts | 136 | // Step 2: boundary 0 evicted → boundaries = [5, 10, 14] | COMMENT |
| LOW⚡ | packages/lab/src/ThreeD/projection.test.ts | 65 | // Step 1: center | COMMENT |
| LOW⚡ | packages/lab/src/ThreeD/projection.test.ts | 69 | // Step 2: azimuth | COMMENT |
| LOW⚡ | packages/lab/src/ThreeD/projection.test.ts | 72 | // Step 3: elevation | COMMENT |
| LOW⚡ | packages/lab/src/ThreeD/projection.test.ts | 75 | // Step 4: project to pixels | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | internal/vibe-tests/src/build-previews.ts | 310 | // Step 1: Collect all 'const xxxRaw = { ... } as const;' blocks | COMMENT |
| LOW⚡ | internal/vibe-tests/src/build-previews.ts | 319 | // Step 2: Inline variable references in createTheme calls | COMMENT |
| LOW | internal/vibe-tests/src/build-previews.ts | 338 | // Step 3: Strip remaining type casts (but not in import lines) | COMMENT |
| LOW⚡ | internal/vibe-tests/src/build-report.ts | 285 | // Step 1: Ensure universal.json exists | COMMENT |
| LOW⚡ | internal/vibe-tests/src/build-report.ts | 289 | // Step 2: If baseline provided, ensure comparison | COMMENT |
| LOW | internal/vibe-tests/src/build-report.ts | 303 | // Step 3: Load source code for per-prompt inspection | COMMENT |
| LOW | internal/vibe-tests/src/build-report.ts | 436 | // Step 4: Build the data script | COMMENT |
| LOW⚡ | internal/vibe-tests/src/build-report.ts | 453 | // Step 5: Ensure CSS dist files exist (needed for report build) | COMMENT |
| LOW⚡ | internal/vibe-tests/src/build-report.ts | 456 | // Step 6: Dev mode or build | COMMENT |
| LOW | internal/vibe-tests/src/build-report.ts | 491 | // Step 5: Inject data and styles into the built HTML | COMMENT |
| LOW⚡ | packages/core/src/Markdown/streaming.test.ts | 128 | // Step 1: boundaries = [0, 5, 10] | COMMENT |
| LOW⚡ | packages/core/src/Markdown/streaming.test.ts | 136 | // Step 2: boundary 0 evicted → boundaries = [5, 10, 14] | COMMENT |
| LOW⚡ | packages/lab/src/ThreeD/projection.test.ts | 65 | // Step 1: center | COMMENT |
| LOW⚡ | packages/lab/src/ThreeD/projection.test.ts | 69 | // Step 2: azimuth | COMMENT |
| LOW⚡ | packages/lab/src/ThreeD/projection.test.ts | 72 | // Step 3: elevation | COMMENT |
| LOW⚡ | packages/lab/src/ThreeD/projection.test.ts | 75 | // Step 4: project to pixels | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/core/src/Layout/LayoutPanel.tsx | 235 | // When no divider, collapse spacing for seamless visual flow | COMMENT |
| MEDIUM | packages/core/src/Layout/LayoutContent.tsx | 45 | // for a seamless visual flow: Layout's middle row sets these to 0px then | COMMENT |
| MEDIUM | packages/core/src/utils/color.test.ts | 172 | // robust charts implementation. Composed as `toGLFloats(parseHex(input))`, | COMMENT |
| MEDIUM | …ages/cli/assets/templates/pages/shell-top-nav/page.tsx | 51 | // pixel-identical so the transition is seamless. | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 1972 | # The gesture, motion and harness interaction proofs in WebKit, the engine | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 1975 | # press helpers and the menu press model, plus the harness and the shared | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 2580 | # touched. A harness-only PR runs the fixed Chart/ChartLegend smoke scope so | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 2694 | # step can run. An ordinary harness-only change uses the bounded routing | COMMENT |
| MEDIUM | apps/docsite/src/components/ThemeShowcaseTile.tsx | 315 | // This is more robust than regex-matching `rgb(...)` because modern | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/cli/test/doc-routes.json | 2979 | "id": "layout#scaffold", | CODE |
| MEDIUM | packages/cli/test/doc-routes.json | 2981 | "oldDocsiteUrl": "/docs/layout#scaffold", | CODE |
| MEDIUM | packages/cli/api/search/tree.weights.json | 1 | {"classes":["component","hook","doc","template","theme","NONE"],"tokens":{"#bias":[0.5769,-0.5917,-0.0025,-0.3774,-1.222 | CODE |
| MEDIUM | …kages/cli/assets/templates/pages/payment-form/page.tsx | 111 | // docsite; the CLI swaps these for an inline placeholder on scaffold). | COMMENT |
| MEDIUM | apps/docsite/src/content/blog/posts/vibe-tests.md | 42 | - [Astryx's API test](https://github.com/meta/astryx/wiki/API-Arbitration#what-to-look-for) judges on: discoverability, | CODE |
| MEDIUM | apps/docsite/src/components/codeLinkifiers.ts | 51 | // its namespace's page (`layout/scaffold` -> /docs/layout#scaffold). | COMMENT |
| MEDIUM | apps/docsite/src/components/codeLinkifiers.ts | 51 | // its namespace's page (`layout/scaffold` -> /docs/layout#scaffold). | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crowdin.yml | 20 | # This file is also read by Crowdin's native GitHub integration, which | COMMENT |
| MEDIUM⚡ | internal/vibe-tests/scripts/smoke-test.sh | 231 | # Create a second iteration (baseline) with the same prompt | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | apps/storybook/stories/CodeBlock.stories.tsx | 313 | print(f"Processing {config.input_path}") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | internal/vibe-tests/scripts/smoke-test.sh | 13 | # Usage: | COMMENT |
| LOW | scripts/prune-branches.sh | 6 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | internal/vibe-tests/scripts/smoke-test.sh | 305 | # Check if this is the known vite theme alias bug (pre-existing, not our fault) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/storybook/stories/CodeBlock.stories.tsx | 314 | # TODO: implement pipeline | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | internal/vibe-tests/src/design-judge-gemini.py | 316 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | internal/vibe-tests/src/design-judge-gemini.py | 220 | CODE |