Auto-generated tile from GitHub (10 skills)
92
94%
Does it follow best practices?
Impact
92%
1.16xAverage score across 44 eval scenarios
Advisory
Suggest reviewing before use
env-schema used
0%
100%
TypeBox schema for config
0%
100%
dotenv option used
0%
0%
No config files
100%
100%
No per-env object
100%
100%
No NODE_ENV conditionals
100%
100%
Config as fastify-plugin
100%
100%
Config decorated on instance
100%
100%
TypeScript declaration merging
100%
100%
Fail-fast on missing vars
100%
100%
No process.env in routes/handlers
100%
77%
@fastify/jwt used
100%
100%
jwtVerify for auth
100%
100%
@node-rs/argon2 used
0%
100%
Argon2 parameters set
100%
100%
Rate limiting on auth routes
100%
100%
Redis backend for rate limit
100%
100%
Redis rationale documented
100%
100%
close-with-grace used
0%
100%
app.close() in shutdown
100%
100%
fp() for auth plugin
100%
100%
Argon2 rationale documented
100%
100%
node:test imported
100%
100%
node --test in package.json
100%
100%
inject() used for requests
100%
100%
t.assert.* used
0%
100%
app.ready() awaited
100%
100%
app.close() in teardown
100%
100%
200 routes tested
100%
100%
404 route tested
100%
100%
Validation error tested
100%
100%
Warehouse filter tested
100%
100%
TypeBox imported
100%
100%
Static type extraction
100%
100%
TypeBoxTypeProvider wired
100%
100%
Response schema on GET /
100%
100%
Response schema on POST /
100%
100%
Response schema on GET /:id
100%
100%
Internal fields stripped
100%
100%
Body validation schema
100%
100%
Enum for category
100%
100%
Schemas in dedicated file
100%
100%
No tech stack summaries
100%
100%
No directory structure
100%
100%
No generic best practices
100%
100%
No tooling-enforced rules
100%
100%
Non-discoverable commands present
100%
100%
Landmines section present
100%
100%
Instructions are actionable
100%
100%
Hierarchical recommendation
80%
100%
Uses recommended sections
100%
100%
Short and high-signal
100%
100%
@fastify/error imported
100%
100%
Custom error types created
100%
100%
@fastify/sensible registered
100%
100%
Sensible helper methods used
100%
0%
Global setErrorHandler registered
0%
100%
Error handler logs with request.log
37%
100%
Structured error response shape
50%
100%
Plugin-scoped error handler
100%
100%
setNotFoundHandler configured
0%
0%
5xx details hidden in prod
100%
100%
@fastify/cors registered
100%
100%
No wildcard CORS origin
100%
100%
CORS credentials enabled
100%
100%
CORS maxAge configured
100%
100%
@fastify/helmet registered
100%
100%
HSTS configured
100%
100%
Content-Security-Policy configured
100%
100%
Frame protection configured
100%
100%
Security documented
100%
100%
No manual security headers
100%
100%
Four doc types present
100%
100%
Tutorial title starts with verb
40%
100%
How-to title is task-framed
40%
50%
Reference entry format
70%
100%
Explanation title is concept-framed
100%
100%
Single type per document
80%
100%
Tutorial has numbered steps
100%
100%
How-to skips background theory
80%
90%
Cross-links between types
100%
100%
Reference avoids instructions
100%
100%
@fastify/oauth2 used
100%
100%
PKCE S256 configured
100%
100%
fastify-plugin wrapper used
100%
100%
JWT validates exp claim
100%
100%
JWT validates iss claim
100%
100%
JWT validates aud claim
100%
100%
Asymmetric signing used
100%
62%
Tokens not in localStorage
100%
100%
No implicit flow
100%
100%
Refresh token rotation
100%
100%
State validation present
100%
100%
gh CLI only
100%
100%
--body-file flag
0%
100%
Explicit --base and --head
100%
100%
CI check wait command
66%
100%
No AI co-authorship
100%
100%
No signing config changes
100%
100%
Structured PR body content
100%
100%
Shell script artifact
100%
100%
Rebase validation step
50%
50%
Temp file cleanup
50%
100%
@fastify/under-pressure registered
100%
100%
maxEventLoopDelay set
100%
100%
pressureHandler sends 503
0%
100%
Additional pressure threshold
100%
100%
async-cache-dedupe imported
100%
100%
cache.define() used
100%
100%
Cache TTL configured
100%
100%
Cache storage type set
0%
100%
Response schemas on all routes
100%
100%
Cached function called in handler
100%
100%
neostandard installed
100%
100%
standard uninstalled
100%
100%
Flat config file
100%
100%
neostandard in config
100%
100%
lint script uses eslint
100%
100%
lint:fix script present
100%
100%
CI uses non-fix run
100%
100%
standard config removed
100%
100%
lint-staged uses eslint
100%
100%
migrate command used
0%
100%
eslint@9 installed
100%
100%
Subsystem prefix
100%
100%
Imperative subject line
100%
100%
No AI co-authorship
100%
100%
core-validate-commit used
100%
100%
Validation passed
100%
100%
Fixes/Refs footer format
100%
100%
No generic signatures
0%
50%
Structured log calls
100%
100%
redact option present
100%
100%
Authorization header redacted
100%
100%
Password/token fields redacted
100%
100%
Censor value set
100%
100%
LOG_LEVEL from env
100%
100%
request.log in handlers
100%
100%
Child logger with context
100%
100%
No console.log usage
100%
100%
No pino-pretty in production logger
100%
100%
@fastify/postgres used
100%
100%
No raw pg in routes
100%
100%
Database plugin uses fp()
100%
100%
Plugin name declared
100%
100%
Repository object per entity
100%
100%
Repositories decorated on instance
100%
100%
Pool max configured
100%
100%
onClose cleanup hook
60%
100%
DATABASE_URL from config/env
100%
100%
Parameterised queries only
100%
100%
snipgrapher init first
0%
16%
Named profile usage
100%
100%
Profile defined in config
100%
100%
Output verification step
40%
100%
Explicit output path and extension
62%
62%
Batch --out-dir flag
100%
100%
Batch --concurrency flag
100%
100%
npx fallback pattern
70%
100%
doctor validation step
0%
100%
Env var override documented
100%
100%
Shell script artifact
100%
100%
dns.resolve* used
100%
100%
No dns.lookup
100%
80%
UV_THREADPOOL_SIZE via env
100%
100%
No process.env assignment
100%
100%
DNS result caching
100%
100%
Cache expiry
100%
100%
Thread pool monitoring
100%
100%
No any types remain
100%
100%
tsc workflow logged
100%
100%
Generics used for containers
100%
100%
Type guards present
100%
100%
Assertion functions use function keyword
100%
100%
Type tests file present
100%
100%
unknown used for external data
100%
100%
No enums introduced
100%
100%
Utility types used appropriately
100%
100%
Call sites still compile
100%
100%
Type stripping usage
100%
100%
import type for type imports
100%
100%
No enums
100%
100%
No namespaces
100%
100%
No constructor parameter properties
100%
100%
.ts import extensions
100%
100%
tsconfig noEmit
100%
100%
tsconfig verbatimModuleSyntax
0%
100%
tsconfig isolatedModules
0%
100%
package.json type module
100%
100%
Node engines field
100%
100%
uv over pip documented
100%
60%
Custom test flags documented
100%
0%
Legacy module landmine documented
100%
100%
Hierarchical AGENTS recommendation
0%
0%
No tech stack summary
100%
100%
No directory overview
100%
100%
Recommended section headings
0%
50%
No generic best practices
100%
100%
Source file evidence
100%
100%
Actionable instructions
100%
100%
No CI-enforced rules
100%
100%
async-cache-dedupe usage
0%
100%
Cache TTL configured
0%
100%
p-limit or p-map usage
0%
0%
Factory function pattern
0%
80%
Named exports
100%
100%
Env-schema or Zod validation
0%
0%
No NODE_ENV branching
100%
100%
No swallowed errors
100%
100%
Error cause chain
0%
0%
@fastify/oauth2 package
100%
100%
fastify-plugin wrapping
100%
100%
PKCE S256 method
100%
100%
State generation uses randomUUID
0%
100%
State validation in checkStateFunction
0%
70%
getAccessTokenFromAuthorizationCodeFlow
100%
100%
HTTPS callbackUri
100%
100%
Tokens stored in session
0%
100%
No raw token logging
100%
100%
No implicit flow
100%
100%
Opaque/branded type definition
100%
100%
Assertion function keyword
100%
100%
Type predicate function
100%
100%
No raw cast without validation
100%
100%
unknown for unvalidated input
100%
30%
Discriminated union
100%
100%
Exhaustiveness check
100%
100%
Before/after illustration
20%
40%
No any in validators
100%
100%
CI lint step present
100%
100%
No --fix in CI
100%
100%
CI lint is required
100%
100%
lint-staged used
100%
100%
lint-staged uses eslint
58%
100%
lint-staged file globs
50%
50%
Node version aligned
100%
60%
lint script in package.json
100%
100%
Flat config file
100%
100%
Fix reserved for local
100%
100%
Batch command used
100%
100%
Glob pattern in batch
100%
100%
Out-dir flag used
100%
100%
Concurrency or manifest flag
100%
0%
Env var for CI defaults
100%
100%
CLI flag for override
100%
100%
Output verification step
100%
100%
Commands and paths documented
100%
100%
SNIPGRAPHER_THEME env var
0%
100%
SNIPGRAPHER_FORMAT env var
0%
100%
SNIPGRAPHER_PROFILE env var
0%
100%
Additional env vars
0%
100%
CLI flag override
20%
100%
Precedence documented
25%
25%
Explicit output path
50%
100%
Output size verification
90%
100%
Npx --yes syntax
0%
0%
Commands logged
100%
100%
Verbose on failure
0%
0%
Config-first pattern
0%
20%
Tech stack removed
0%
100%
Directory overview removed
0%
100%
Generic advice removed
100%
100%
Linter-enforced rule removed
100%
100%
DB-wipe landmine retained
100%
100%
Non-standard tooling retained
100%
100%
Integration test caveat retained
100%
100%
Recommended sections used
0%
100%
No architecture narrative
100%
100%
Result is shorter
100%
100%
No boilerplate header
0%
100%
eslint devDependency
100%
100%
neostandard devDependency
0%
100%
Flat config file
100%
100%
No legacy rc file
100%
100%
neostandard as base
0%
100%
lint script uses eslint
100%
100%
lint:fix script present
100%
100%
ts:true for TypeScript
0%
100%
resolveIgnoresFromGitignore
0%
100%
TS rules scoped to TS files
22%
100%
No duplicate JS/TS rules
0%
100%
close-with-grace usage
0%
100%
Health returns 503 on shutdown
100%
100%
No manual unhandledRejection
100%
100%
pino for logging
100%
100%
pino redact config
100%
100%
Child logger per request
100%
100%
No NODE_ENV
0%
0%
import type usage
100%
100%
.ts import extensions
0%
100%
Hierarchical structure
100%
100%
Scope routing section
100%
100%
No tech stack in root
20%
100%
No directory structure
0%
100%
Recommended section name
0%
100%
CI quirk captured
100%
100%
No generic advice
100%
100%
Source files checked
100%
100%
CLI landmine retained
100%
100%
@fastify/jwt package
0%
100%
Asymmetric algorithm used
100%
100%
exp claim validated
60%
100%
iss claim validated
40%
100%
aud claim validated
46%
100%
onRequest hook pattern
0%
100%
401 with error field
90%
100%
Refresh token rotation
93%
100%
sub claim used
100%
100%
UV_THREADPOOL_SIZE in env
100%
100%
No runtime process.env set
100%
100%
UV_THREADPOOL_SIZE within limit
100%
100%
dns.resolve* replaces lookup
100%
100%
dns.lookup not used in hot path
100%
100%
DNS result caching
100%
100%
Thread pool monitoring
66%
100%
File streaming used
100%
100%
Pool size formula applied
40%
100%
Worker threads for CPU work
100%
100%
--migrate flag used
0%
100%
standard uninstalled
100%
100%
standard config key removed
100%
100%
lint script updated
100%
100%
lint:fix script updated
100%
100%
Flat config file present
100%
100%
No legacy rc file
100%
100%
neostandard devDependency
100%
100%
eslint devDependency
100%
100%
Migration steps separated
100%
100%
Lint runner is eslint
100%
100%
subsystem prefix format
100%
100%
Imperative description
100%
100%
Fixes: footer with full URL
100%
100%
core-validate-commit used
100%
100%
Validation passes
100%
100%
No AI co-authorship lines
100%
100%
No trailing AI attribution
100%
100%
@fastify/oauth2 package
100%
100%
fastify-plugin wrapper
100%
100%
PKCE S256 method
100%
100%
State generation
100%
100%
State validation
100%
100%
Authorization code exchange method
100%
100%
No raw token logging
100%
100%
Session token storage
100%
100%
Correct dependency set
100%
100%
Correct OAuth package
100%
100%
fastify-plugin wrapper
100%
20%
PKCE method S256
100%
0%
State generation with randomUUID
0%
0%
State stored in session
0%
0%
State validated on callback
20%
0%
No token logging
100%
100%
Tokens stored in session
30%
100%
Authorization code flow only
100%
100%
Env vars for credentials
100%
25%
Uses --body-file flag
0%
100%
Explicit --base flag
100%
100%
Explicit --head flag
100%
100%
CI watch command
0%
100%
Stderr redirect in CI watch
0%
100%
Temp file for PR body
0%
100%
gh CLI only
100%
100%
No AI attribution
100%
100%
PR number used for checks
70%
100%
Config filename
100%
100%
Init command used
0%
0%
theme field
100%
100%
fontFamily field
100%
100%
lineNumbers field
100%
100%
windowControls field
100%
100%
backgroundStyle field
100%
100%
defaultProfile field
100%
100%
Named profiles defined
100%
100%
Social profile has watermark
100%
100%
Doctor validation
100%
100%
Themes list command
0%
100%
Render uses named profile
100%
100%
Explicit output path
100%
100%
dns.resolve4 instead of dns.lookup
100%
100%
No dns.lookup in fixed code
100%
100%
Streaming for large file
0%
0%
UV_THREADPOOL_SIZE in startup script
100%
100%
UV_THREADPOOL_SIZE value > 4
100%
100%
No runtime process.env assignment
100%
100%
monitorEventLoopDelay used
100%
100%
p99 latency check
100%
100%
No process.env thread pool
100%
100%
Startup env var for pool size
100%
100%
dns.resolve*() not dns.lookup()
100%
100%
DNS result caching
100%
100%
Stream-based file reading
0%
0%
Thread pool saturation monitoring
50%
100%
Thread pool size > default
100%
100%
Tutorial verb title
0%
100%
Tutorial goal intro
0%
100%
Tutorial prerequisites section
0%
100%
Tutorial step results
30%
100%
Tutorial action focus
50%
60%
Reference noun title
100%
100%
Reference entry format
86%
100%
Reference no instructions
100%
100%
Document type separation
100%
100%
Cross-link present
100%
100%
Verb-start title
40%
100%
Goal section present
100%
100%
Prerequisites section
80%
100%
Numbered steps
100%
90%
Verifiable result per step
100%
100%
Minimal explanation
40%
90%
Final outcome stated
100%
100%
Single doc type
26%
93%
Beginner audience framing
90%
100%
Verb-based title
25%
100%
Goal/intro statement
100%
100%
Prerequisites section
100%
100%
Numbered steps
60%
80%
Verifiable result per step
65%
100%
Minimal explanation in steps
66%
86%
Final outcome statement
25%
100%
No reference tables mixed in
55%
100%
No conceptual digression sections
75%
100%
trace-opt/trace-deopt flags
100%
100%
Checkpoint before profiling
100%
100%
--prof flag used
100%
100%
--prof-process output
100%
100%
Consistent property order fix
100%
100%
No delete on properties
100%
100%
Rest params instead of arguments
100%
100%
Class or constructor for consistent shape
50%
16%
Type stability fix
100%
100%
Table of Contents