react-engineering — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited react-engineering (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Linting, testing, code organization, TypeScript patterns, and reusable custom hooks for production React applications.
eslint-plugin-react-hooks — enforces two critical rules:
rules-of-hooks — hooks only at top level of components/custom hooksexhaustive-deps — dependency arrays include all reactive valueseslint-plugin-jsx-a11y — flags accessibility violations in JSX at build time (missing alt text, incorrect ARIA roles, missing keyboard handlers).
Tests should resemble the way software is actually used. Test behavior from the user's perspective, not implementation details.
| Test | Do Not Test |
|---|---|
| User-visible behavior | Internal state values |
| DOM output and interactions | Component instance methods |
| Accessibility (roles, labels) | Implementation details |
| Error states and edge cases | Snapshot of non-visual code |
Use queries that reflect how users and assistive technology find elements:
If RTL cannot find the element by role, assistive technology cannot either — that is an accessibility bug.
Use React Testing Library with renderHook to test hooks in isolation. Test async operations, state changes, and cleanup behavior.
Group related code by feature, not by type:
src/
├── features/
│ ├── auth/
│ │ ├── LoginForm.tsx
│ │ ├── LoginForm.test.tsx
│ │ ├── useAuth.ts
│ │ └── auth-api.ts
│ └── dashboard/
│ ├── Dashboard.tsx
│ ├── Dashboard.test.tsx
│ ├── widgets/
│ └── useDashboardData.ts
├── components/ # Shared/generic components
├── hooks/ # Shared hooks
├── lib/ # Utilities
└── types/ # Shared TypeScript typesKeep tests, styles, and utilities next to the components that use them. App Router naturally supports this — route folders can contain components, tests, and utilities alongside page.tsx.
Use interface or type. Do not use React.FC — it is no longer recommended:
interface CardProps {
title: string;
subtitle?: string;
children: React.ReactNode;
}
function Card({ title, subtitle, children }: CardProps) { ... }useState infers from initial value — use generics for complex types: useState<"idle" | "loading">("idle")useReducer — type actions as discriminated unions for exhaustive checkinguseRef — useRef<HTMLInputElement>(null) for DOM refsEvent types infer from inline handlers. For extracted functions, type explicitly:
function handleClick(e: React.MouseEvent<HTMLButtonElement>) { ... }
function handleChange(e: React.ChangeEvent<HTMLInputElement>) { ... }interface SelectProps<T> {
items: T[];
selected: T;
onSelect: (item: T) => void;
getLabel: (item: T) => string;
}
function Select<T>({ items, selected, onSelect, getLabel }: SelectProps<T>) { ... }use — required for ESLint and React to recognize hooksuseOnlineStatus(), useDebounce(value, ms)as const for correct type inferenceuseMount(fn) lifecycle wrappers — bypass linting, break React paradigm~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.