tribunal-kit 6.0.1 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/ARCHITECTURE.md +9 -6
- package/.agent/agents/accessibility-reviewer.md +23 -16
- package/.agent/agents/ai-code-reviewer.md +25 -21
- package/.agent/agents/anti-pattern-reviewer.md +12 -7
- package/.agent/agents/api-architect.md +1 -0
- package/.agent/agents/backend-specialist.md +23 -22
- package/.agent/agents/cloud-engineer.md +1 -0
- package/.agent/agents/code-archaeologist.md +1 -0
- package/.agent/agents/complexity-reviewer.md +10 -7
- package/.agent/agents/database-architect.md +3 -2
- package/.agent/agents/db-latency-auditor.md +6 -2
- package/.agent/agents/debugger.md +3 -2
- package/.agent/agents/dependency-reviewer.md +1 -0
- package/.agent/agents/devops-engineer.md +9 -8
- package/.agent/agents/documentation-writer.md +6 -5
- package/.agent/agents/explorer-agent.md +1 -0
- package/.agent/agents/frontend-reviewer.md +21 -17
- package/.agent/agents/frontend-specialist.md +23 -20
- package/.agent/agents/game-developer.md +1 -0
- package/.agent/agents/interaction-reviewer.md +10 -5
- package/.agent/agents/logic-reviewer.md +3 -0
- package/.agent/agents/minimalist-reviewer.md +6 -0
- package/.agent/agents/mobile-developer.md +7 -6
- package/.agent/agents/mobile-reviewer.md +14 -13
- package/.agent/agents/orchestrator.md +3 -0
- package/.agent/agents/penetration-tester.md +1 -0
- package/.agent/agents/performance-optimizer.md +6 -5
- package/.agent/agents/performance-reviewer.md +6 -6
- package/.agent/agents/pipeline-reviewer.md +144 -0
- package/.agent/agents/precedence-reviewer.md +1 -0
- package/.agent/agents/product-manager.md +1 -0
- package/.agent/agents/product-owner.md +1 -0
- package/.agent/agents/product-reviewer.md +12 -7
- package/.agent/agents/project-planner.md +3 -0
- package/.agent/agents/qa-automation-engineer.md +50 -43
- package/.agent/agents/resilience-reviewer.md +1 -0
- package/.agent/agents/schema-reviewer.md +1 -0
- package/.agent/agents/security-auditor.md +24 -24
- package/.agent/agents/seo-specialist.md +33 -23
- package/.agent/agents/sql-reviewer.md +5 -4
- package/.agent/agents/supervisor-agent.md +12 -2
- package/.agent/agents/swarm-worker-contracts.md +13 -13
- package/.agent/agents/swarm-worker-registry.md +51 -51
- package/.agent/agents/system-architect.md +1 -0
- package/.agent/agents/test-coverage-reviewer.md +25 -22
- package/.agent/agents/test-engineer.md +12 -11
- package/.agent/agents/throughput-optimizer.md +45 -40
- package/.agent/agents/type-safety-reviewer.md +5 -4
- package/.agent/agents/ui-ux-auditor.md +6 -4
- package/.agent/agents/ui-visual-auditor.md +3 -0
- package/.agent/agents/ux-reviewer.md +11 -6
- package/.agent/agents/visual-reviewer.md +11 -6
- package/.agent/agents/vitals-reviewer.md +5 -4
- package/.agent/history/memory/.memory.idx +1532 -1
- package/.agent/history/memory/MEMORY.md +102 -1
- package/.agent/mcp_config.json +1 -6
- package/.agent/routing_index.json +2033 -263
- package/.agent/rules/GEMINI.md +11 -9
- package/.agent/rules/GEMINI_PLANNER.md +19 -21
- package/.agent/scripts/_colors.js +52 -54
- package/.agent/scripts/_utils.js +52 -53
- package/.agent/scripts/auto_preview.js +39 -43
- package/.agent/scripts/bundle_analyzer.js +47 -60
- package/.agent/scripts/case_law_manager.js +200 -294
- package/.agent/scripts/checklist.js +73 -94
- package/.agent/scripts/cicd_validator.js +305 -0
- package/.agent/scripts/compile_router.py +4 -111
- package/.agent/scripts/context_broker.js +317 -412
- package/.agent/scripts/contract_engine.js +402 -0
- package/.agent/scripts/dependency_analyzer.js +112 -124
- package/.agent/scripts/graph_builder.js +75 -103
- package/.agent/scripts/graph_visualizer.js +10 -12
- package/.agent/scripts/graph_zoom.js +38 -55
- package/.agent/scripts/guardrail_engine.js +195 -145
- package/.agent/scripts/impact_classifier.js +55 -30
- package/.agent/scripts/inner_loop_validator.js +108 -159
- package/.agent/scripts/integrity_manifest.js +59 -67
- package/.agent/scripts/lint_runner.js +65 -75
- package/.agent/scripts/marathon_harness.js +131 -208
- package/.agent/scripts/migrate_skills_frontmatter.py +4 -63
- package/.agent/scripts/minify_context.js +29 -33
- package/.agent/scripts/minimal_change_engine.js +95 -87
- package/.agent/scripts/mutation_runner.js +46 -62
- package/.agent/scripts/pipeline_engine.js +320 -209
- package/.agent/scripts/prompt_compiler.js +118 -93
- package/.agent/scripts/schema_validator.js +73 -121
- package/.agent/scripts/security_scan.js +88 -117
- package/.agent/scripts/session_manager.js +52 -69
- package/.agent/scripts/signal_detector.js +24 -22
- package/.agent/scripts/skill_evolution.js +184 -245
- package/.agent/scripts/skill_integrator.js +35 -48
- package/.agent/scripts/socratic_gate_policy.js +15 -12
- package/.agent/scripts/strengthen_skills.js +29 -33
- package/.agent/scripts/swarm_dispatcher.js +120 -151
- package/.agent/scripts/test_runner.js +54 -56
- package/.agent/scripts/token_budget_broker.js +9 -7
- package/.agent/scripts/trace_engine.js +126 -0
- package/.agent/scripts/verify_all.js +76 -93
- package/.agent/scripts/visual_audit.js +16 -21
- package/.agent/skill_topic_map.json +22 -3
- package/.agent/skills/12-principles-of-animation/SKILL.md +7 -0
- package/.agent/skills/60fps-animation/SKILL.md +7 -0
- package/.agent/skills/accessible-animation/SKILL.md +5 -1
- package/.agent/skills/adapt/SKILL.md +7 -1
- package/.agent/skills/advanced-rag-pipelines/SKILL.md +1 -0
- package/.agent/skills/agent-organizer/SKILL.md +1 -0
- package/.agent/skills/agentic-patterns/SKILL.md +33 -25
- package/.agent/skills/agentic-workflows-2026/SKILL.md +6 -2
- package/.agent/skills/ai-app-hardening/SKILL.md +9 -8
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +7 -6
- package/.agent/skills/animation-on-scroll/SKILL.md +24 -15
- package/.agent/skills/animation-systems/SKILL.md +11 -10
- package/.agent/skills/antfu-conventions/SKILL.md +7 -2
- package/.agent/skills/api-patterns/SKILL.md +14 -10
- package/.agent/skills/api-security-auditor/SKILL.md +15 -14
- package/.agent/skills/app-builder/SKILL.md +1 -0
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +2 -2
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +12 -12
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +3 -3
- package/.agent/skills/apple-design/SKILL.md +8 -7
- package/.agent/skills/architecture/SKILL.md +3 -2
- package/.agent/skills/audit-and-fix/SKILL.md +8 -5
- package/.agent/skills/authentication-best-practices/SKILL.md +9 -8
- package/.agent/skills/backend-security-expert/SKILL.md +1 -0
- package/.agent/skills/baseline-ui/SKILL.md +8 -7
- package/.agent/skills/bash-linux/SKILL.md +1 -0
- package/.agent/skills/behavioral-modes/SKILL.md +1 -0
- package/.agent/skills/better-colors/SKILL.md +11 -7
- package/.agent/skills/better-typography/SKILL.md +30 -16
- package/.agent/skills/better-ui/SKILL.md +17 -10
- package/.agent/skills/bolder/SKILL.md +6 -0
- package/.agent/skills/brainstorming/SKILL.md +6 -4
- package/.agent/skills/browser-native-ai/SKILL.md +5 -4
- package/.agent/skills/build-primitive/SKILL.md +5 -0
- package/.agent/skills/building-native-ui/SKILL.md +1 -0
- package/.agent/skills/cicd-pro/SKILL.md +2 -1
- package/.agent/skills/clarify/SKILL.md +19 -14
- package/.agent/skills/clean-code/SKILL.md +16 -15
- package/.agent/skills/cloud-architect/SKILL.md +1 -0
- package/.agent/skills/cobejs/SKILL.md +7 -9
- package/.agent/skills/code-review-checklist/SKILL.md +1 -0
- package/.agent/skills/codebase-design/SKILL.md +7 -2
- package/.agent/skills/colorize/SKILL.md +8 -3
- package/.agent/skills/compact-landing/SKILL.md +8 -3
- package/.agent/skills/company-logos/SKILL.md +6 -0
- package/.agent/skills/config-validator/SKILL.md +10 -9
- package/.agent/skills/containerization-pro/SKILL.md +6 -5
- package/.agent/skills/context-engineering-pro/SKILL.md +5 -4
- package/.agent/skills/create-design-md/SKILL.md +13 -5
- package/.agent/skills/critique/SKILL.md +10 -8
- package/.agent/skills/csharp-developer/SKILL.md +1 -0
- package/.agent/skills/data-validation-schemas/SKILL.md +28 -23
- package/.agent/skills/database-design/SKILL.md +2 -1
- package/.agent/skills/delight/SKILL.md +6 -0
- package/.agent/skills/deployment-procedures/SKILL.md +2 -1
- package/.agent/skills/design-lab/SKILL.md +5 -0
- package/.agent/skills/devops-engineer/SKILL.md +3 -2
- package/.agent/skills/devops-incident-responder/SKILL.md +2 -1
- package/.agent/skills/diagnosing-bugs/SKILL.md +12 -2
- package/.agent/skills/distill/SKILL.md +7 -2
- package/.agent/skills/documentation-templates/SKILL.md +3 -2
- package/.agent/skills/domain-modeling/SKILL.md +12 -4
- package/.agent/skills/duckdb-analytical-sql/SKILL.md +7 -3
- package/.agent/skills/edge-ai-mobile/SKILL.md +5 -1
- package/.agent/skills/edge-computing/SKILL.md +9 -8
- package/.agent/skills/emil-design-eng/SKILL.md +43 -27
- package/.agent/skills/error-resilience/SKILL.md +34 -16
- package/.agent/skills/expo-router-v4/SKILL.md +2 -1
- package/.agent/skills/extract-design-system/SKILL.md +12 -11
- package/.agent/skills/fabel-protocol/SKILL.md +24 -17
- package/.agent/skills/fixing-accessibility/SKILL.md +23 -16
- package/.agent/skills/fixing-metadata/SKILL.md +24 -13
- package/.agent/skills/fixing-motion-performance/SKILL.md +7 -5
- package/.agent/skills/framer-motion-expert/SKILL.md +29 -15
- package/.agent/skills/frontend-design/SKILL.md +21 -13
- package/.agent/skills/frontend-security-expert/SKILL.md +1 -0
- package/.agent/skills/game-design-expert/SKILL.md +1 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +1 -0
- package/.agent/skills/generative-ui-expert/SKILL.md +3 -2
- package/.agent/skills/geo-fundamentals/SKILL.md +2 -1
- package/.agent/skills/git-pro/SKILL.md +10 -9
- package/.agent/skills/github-operations/SKILL.md +2 -1
- package/.agent/skills/gpt-taste/SKILL.md +7 -0
- package/.agent/skills/gsap-core/SKILL.md +26 -22
- package/.agent/skills/gsap-frameworks/SKILL.md +6 -5
- package/.agent/skills/gsap-performance/SKILL.md +4 -3
- package/.agent/skills/gsap-plugins/SKILL.md +34 -33
- package/.agent/skills/gsap-react/SKILL.md +9 -8
- package/.agent/skills/gsap-scrolltrigger/SKILL.md +34 -33
- package/.agent/skills/gsap-timeline/SKILL.md +18 -15
- package/.agent/skills/gsap-utils/SKILL.md +25 -24
- package/.agent/skills/harden/SKILL.md +9 -3
- package/.agent/skills/harness-protocol/SKILL.md +1 -0
- package/.agent/skills/i18n-localization/SKILL.md +10 -9
- package/.agent/skills/impeccable/SKILL.md +5 -0
- package/.agent/skills/improve-codebase-architecture/SKILL.md +10 -5
- package/.agent/skills/improve-ui/SKILL.md +12 -5
- package/.agent/skills/intelligent-routing/SKILL.md +7 -6
- package/.agent/skills/knowledge-graph/SKILL.md +1 -0
- package/.agent/skills/landing-page/SKILL.md +1 -0
- package/.agent/skills/lint-and-validate/SKILL.md +9 -4
- package/.agent/skills/llm-engineering/SKILL.md +55 -54
- package/.agent/skills/local-first/SKILL.md +20 -19
- package/.agent/skills/local-first-architecture/SKILL.md +6 -1
- package/.agent/skills/lottie-animation/SKILL.md +7 -3
- package/.agent/skills/marquee-loop/SKILL.md +1 -0
- package/.agent/skills/masked-reveal/SKILL.md +17 -4
- package/.agent/skills/mcp-builder/SKILL.md +13 -10
- package/.agent/skills/micro-interaction/SKILL.md +20 -5
- package/.agent/skills/mobile-design/SKILL.md +26 -15
- package/.agent/skills/monorepo-management/SKILL.md +3 -2
- package/.agent/skills/morphing-icons/SKILL.md +16 -6
- package/.agent/skills/motion-engineering/SKILL.md +19 -15
- package/.agent/skills/nextjs-react-expert/SKILL.md +26 -21
- package/.agent/skills/nodejs-best-practices/SKILL.md +89 -76
- package/.agent/skills/observability/SKILL.md +45 -44
- package/.agent/skills/opentelemetry-observability/SKILL.md +2 -1
- package/.agent/skills/page-transition-animation/SKILL.md +6 -3
- package/.agent/skills/parallel-agents/SKILL.md +7 -2
- package/.agent/skills/performance-profiling/SKILL.md +24 -13
- package/.agent/skills/plan-writing/SKILL.md +1 -0
- package/.agent/skills/platform-engineer/SKILL.md +3 -2
- package/.agent/skills/platform-engineering-opentofu/SKILL.md +1 -0
- package/.agent/skills/playwright-ai-e2e/SKILL.md +3 -2
- package/.agent/skills/playwright-best-practices/SKILL.md +29 -28
- package/.agent/skills/polish/SKILL.md +13 -12
- package/.agent/skills/powershell-windows/SKILL.md +1 -0
- package/.agent/skills/pricing-page/SKILL.md +8 -3
- package/.agent/skills/product-aware-heuristics/SKILL.md +122 -72
- package/.agent/skills/progressive-blur/SKILL.md +9 -4
- package/.agent/skills/project-idioms/SKILL.md +1 -0
- package/.agent/skills/property-based-testing/SKILL.md +10 -12
- package/.agent/skills/python-patterns/SKILL.md +1 -0
- package/.agent/skills/python-pro/SKILL.md +1 -0
- package/.agent/skills/quieter/SKILL.md +6 -0
- package/.agent/skills/react-doctor/SKILL.md +6 -0
- package/.agent/skills/react-specialist/SKILL.md +32 -28
- package/.agent/skills/readme-builder/SKILL.md +1 -0
- package/.agent/skills/realtime-patterns/SKILL.md +34 -33
- package/.agent/skills/red-team-tactics/SKILL.md +1 -0
- package/.agent/skills/redesign-skill/SKILL.md +6 -0
- package/.agent/skills/review-animations/SKILL.md +5 -2
- package/.agent/skills/review-animations/STANDARDS.md +37 -23
- package/.agent/skills/rust-pro/SKILL.md +1 -0
- package/.agent/skills/seo-fundamentals/SKILL.md +4 -3
- package/.agent/skills/server-management/SKILL.md +1 -0
- package/.agent/skills/shadcn-ui-expert/SKILL.md +28 -22
- package/.agent/skills/shape/SKILL.md +9 -2
- package/.agent/skills/skill-creator/SKILL.md +1 -0
- package/.agent/skills/soft-skill/SKILL.md +6 -0
- package/.agent/skills/sounds-on-the-web/SKILL.md +1 -0
- package/.agent/skills/sql-pro/SKILL.md +1 -0
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +1 -0
- package/.agent/skills/svg-animation/SKILL.md +16 -7
- package/.agent/skills/swiftui-expert/SKILL.md +1 -0
- package/.agent/skills/swiss-design/SKILL.md +5 -0
- package/.agent/skills/system-design-pro/SKILL.md +1 -0
- package/.agent/skills/systematic-debugging/SKILL.md +1 -0
- package/.agent/skills/tailwind-patterns/SKILL.md +25 -11
- package/.agent/skills/taste-skill/SKILL.md +6 -0
- package/.agent/skills/tdd-workflow/SKILL.md +5 -0
- package/.agent/skills/test-result-analyzer/SKILL.md +1 -0
- package/.agent/skills/testing-patterns/SKILL.md +123 -115
- package/.agent/skills/thermo-nuclear-code-quality-review/SKILL.md +5 -0
- package/.agent/skills/thinking-protocol/SKILL.md +3 -0
- package/.agent/skills/to-spring-or-not-to-spring/SKILL.md +9 -8
- package/.agent/skills/transitions-dev/SKILL.md +19 -6
- package/.agent/skills/trend-researcher/SKILL.md +1 -0
- package/.agent/skills/typescript-advanced/SKILL.md +23 -18
- package/.agent/skills/typeset/SKILL.md +10 -1
- package/.agent/skills/ui-reasoning-engine/SKILL.md +67 -48
- package/.agent/skills/ui-skill-packs/SKILL.md +6 -1
- package/.agent/skills/ui-skills-root/SKILL.md +39 -38
- package/.agent/skills/ui-ux-pro-max/SKILL.md +34 -26
- package/.agent/skills/ui-ux-researcher/SKILL.md +1 -0
- package/.agent/skills/vector-search-pgvector/SKILL.md +3 -2
- package/.agent/skills/vue-expert/SKILL.md +22 -19
- package/.agent/skills/vulnerability-scanner/SKILL.md +22 -21
- package/.agent/skills/web-accessibility-auditor/SKILL.md +2 -1
- package/.agent/skills/web-design-guidelines/SKILL.md +16 -10
- package/.agent/skills/web-quality-audit/SKILL.md +5 -0
- package/.agent/skills/webapp-testing/SKILL.md +14 -13
- package/.agent/skills/webgpu-performance/SKILL.md +1 -0
- package/.agent/skills/whimsy-injector/SKILL.md +9 -5
- package/.agent/skills/workflow-optimizer/SKILL.md +1 -0
- package/.agent/skills/zero-trust-passkeys/SKILL.md +11 -6
- package/.agent/templates/DESIGN.md +119 -110
- package/.agent/templates/design-tokens.json +9 -6
- package/.agent/workflows/acf.md +1 -0
- package/.agent/workflows/api-tester.md +1 -0
- package/.agent/workflows/audit.md +1 -0
- package/.agent/workflows/brainstorm.md +1 -0
- package/.agent/workflows/changelog.md +1 -0
- package/.agent/workflows/contract.md +60 -0
- package/.agent/workflows/create.md +1 -0
- package/.agent/workflows/debug.md +1 -0
- package/.agent/workflows/deploy.md +1 -0
- package/.agent/workflows/enhance.md +1 -0
- package/.agent/workflows/fix-ci.md +89 -0
- package/.agent/workflows/fix.md +1 -0
- package/.agent/workflows/generate.md +1 -0
- package/.agent/workflows/marathon.md +1 -0
- package/.agent/workflows/migrate.md +1 -0
- package/.agent/workflows/minimal.md +9 -7
- package/.agent/workflows/orchestrate.md +1 -0
- package/.agent/workflows/performance-benchmarker.md +1 -0
- package/.agent/workflows/pipeline.md +26 -21
- package/.agent/workflows/plan.md +1 -0
- package/.agent/workflows/preview.md +1 -0
- package/.agent/workflows/refactor.md +3 -2
- package/.agent/workflows/review-ai.md +4 -3
- package/.agent/workflows/review.md +1 -0
- package/.agent/workflows/session.md +1 -0
- package/.agent/workflows/status.md +1 -0
- package/.agent/workflows/strengthen-skills.md +1 -0
- package/.agent/workflows/super-prompt.md +1 -0
- package/.agent/workflows/swarm.md +15 -3
- package/.agent/workflows/test.md +8 -7
- package/.agent/workflows/tribunal-backend.md +3 -2
- package/.agent/workflows/tribunal-cicd.md +104 -0
- package/.agent/workflows/tribunal-database.md +1 -0
- package/.agent/workflows/tribunal-frontend.md +8 -6
- package/.agent/workflows/tribunal-full.md +2 -1
- package/.agent/workflows/tribunal-mobile.md +6 -5
- package/.agent/workflows/tribunal-performance.md +1 -0
- package/.agent/workflows/tribunal-speed.md +1 -0
- package/.agent/workflows/tribunal-ui.md +29 -21
- package/.agent/workflows/ui-ux-pro-max.md +19 -15
- package/CONTRIBUTING.md +3 -3
- package/README.md +94 -44
- package/SECURITY.md +10 -10
- package/bin/mcp-server.js +385 -252
- package/bin/tribunal-kit.js +29 -30
- package/bin/wrapper.js +40 -46
- package/dist/cli.js +6 -0
- package/dist/commands/case.js +2 -0
- package/dist/commands/contract.js +440 -0
- package/dist/commands/status.js +6 -0
- package/dist/index.d.ts +8 -1
- package/package.json +13 -12
- package/scripts/benchmark.js +62 -86
- package/scripts/changelog.js +67 -73
- package/scripts/fix-vbc.js +13 -15
- package/scripts/fix-vbc.ps1 +2 -118
- package/scripts/stress_benchmark.js +358 -0
- package/scripts/sync-version.js +71 -41
- package/scripts/validate-payload.js +23 -30
- package/scripts/visual_audit.js +23 -13
|
@@ -21,6 +21,7 @@ You audit **server-side files only** — `.ts` and `.js` in `/api`, `/server`, `
|
|
|
21
21
|
## Mandatory Pre-Flight Context Inspection
|
|
22
22
|
|
|
23
23
|
Before auditing server throughput, you MUST inspect:
|
|
24
|
+
|
|
24
25
|
1. `package.json` → Check Node.js version, HTTP client (`undici`, `axios`, native `fetch`), and caching engines (`lru-cache`, `redis`)
|
|
25
26
|
2. Server entry points (`server.ts`, `app/api/`) → Identify event-loop blocking operations (`readFileSync`, `JSON.parse` on large payloads)
|
|
26
27
|
3. Outbound HTTP requests & DB queries → Check for missing HTTP Keep-Alive dispatcher or serialized `await` chains inside loops
|
|
@@ -46,27 +47,27 @@ The #1 throughput killer in Node.js. A single 50ms sync call blocks ALL concurre
|
|
|
46
47
|
|
|
47
48
|
```typescript
|
|
48
49
|
// ❌ BLOCKS EVENT LOOP: Synchronous file read in async handler
|
|
49
|
-
app.get(
|
|
50
|
-
const data = fs.readFileSync(
|
|
50
|
+
app.get('/config', async (req, res) => {
|
|
51
|
+
const data = fs.readFileSync('/etc/config.json', 'utf8'); // BLOCKS all requests
|
|
51
52
|
res.json(JSON.parse(data));
|
|
52
53
|
});
|
|
53
54
|
|
|
54
55
|
// ✅ APPROVED: Async file read — yields to event loop
|
|
55
|
-
app.get(
|
|
56
|
-
const data = await fs.promises.readFile(
|
|
56
|
+
app.get('/config', async (req, res) => {
|
|
57
|
+
const data = await fs.promises.readFile('/etc/config.json', 'utf8');
|
|
57
58
|
res.json(JSON.parse(data));
|
|
58
59
|
});
|
|
59
60
|
|
|
60
61
|
// ❌ BLOCKS EVENT LOOP: JSON.parse on large payload (> 1MB) on main thread
|
|
61
|
-
app.post(
|
|
62
|
+
app.post('/import', async (req, res) => {
|
|
62
63
|
const data = JSON.parse(largeBuffer.toString()); // 50-200ms blocking
|
|
63
64
|
});
|
|
64
65
|
|
|
65
66
|
// ✅ APPROVED: Stream-parse large JSON
|
|
66
|
-
import { parser } from
|
|
67
|
-
import { streamArray } from
|
|
67
|
+
import { parser } from 'stream-json';
|
|
68
|
+
import { streamArray } from 'stream-json/streamers/StreamArray';
|
|
68
69
|
|
|
69
|
-
app.post(
|
|
70
|
+
app.post('/import', async (req, res) => {
|
|
70
71
|
const pipeline = req.pipe(parser()).pipe(streamArray());
|
|
71
72
|
for await (const { value } of pipeline) {
|
|
72
73
|
await processItem(value); // Non-blocking, item-by-item
|
|
@@ -74,11 +75,11 @@ app.post("/import", async (req, res) => {
|
|
|
74
75
|
});
|
|
75
76
|
|
|
76
77
|
// ❌ BLOCKS EVENT LOOP: Synchronous crypto operations
|
|
77
|
-
const hash = crypto.pbkdf2Sync(password, salt, 100000, 64,
|
|
78
|
+
const hash = crypto.pbkdf2Sync(password, salt, 100000, 64, 'sha512');
|
|
78
79
|
|
|
79
80
|
// ✅ APPROVED: Async crypto
|
|
80
81
|
const hash = await new Promise((resolve, reject) => {
|
|
81
|
-
crypto.pbkdf2(password, salt, 100000, 64,
|
|
82
|
+
crypto.pbkdf2(password, salt, 100000, 64, 'sha512', (err, key) => {
|
|
82
83
|
err ? reject(err) : resolve(key);
|
|
83
84
|
});
|
|
84
85
|
});
|
|
@@ -101,7 +102,11 @@ async function getDashboard(userId: string) {
|
|
|
101
102
|
|
|
102
103
|
// ✅ APPROVED: Parallel execution (300ms total — 3x faster)
|
|
103
104
|
async function getDashboard(userId: string) {
|
|
104
|
-
const [user, orders, notifications] = await Promise.all([
|
|
105
|
+
const [user, orders, notifications] = await Promise.all([
|
|
106
|
+
getUser(userId),
|
|
107
|
+
getOrders(userId),
|
|
108
|
+
getNotifications(userId),
|
|
109
|
+
]);
|
|
105
110
|
return { user, orders, notifications };
|
|
106
111
|
}
|
|
107
112
|
|
|
@@ -112,12 +117,12 @@ for (const id of userIds) {
|
|
|
112
117
|
}
|
|
113
118
|
|
|
114
119
|
// ✅ APPROVED: Parallel with controlled concurrency
|
|
115
|
-
const results = await Promise.all(userIds.map(
|
|
120
|
+
const results = await Promise.all(userIds.map(id => fetchUser(id)));
|
|
116
121
|
|
|
117
122
|
// ✅ APPROVED: Batched concurrency for large arrays (avoid overwhelming DB)
|
|
118
|
-
import pLimit from
|
|
123
|
+
import pLimit from 'p-limit';
|
|
119
124
|
const limit = pLimit(10); // Max 10 concurrent
|
|
120
|
-
const results = await Promise.all(userIds.map(
|
|
125
|
+
const results = await Promise.all(userIds.map(id => limit(() => fetchUser(id))));
|
|
121
126
|
```
|
|
122
127
|
|
|
123
128
|
---
|
|
@@ -128,7 +133,7 @@ const results = await Promise.all(userIds.map((id) => limit(() => fetchUser(id))
|
|
|
128
133
|
// ❌ MEMORY LEAK: Global cache with no eviction — grows unbounded
|
|
129
134
|
const cache = new Map<string, any>(); // Lives forever, entries never removed
|
|
130
135
|
|
|
131
|
-
app.get(
|
|
136
|
+
app.get('/data/:id', async (req, res) => {
|
|
132
137
|
if (!cache.has(req.params.id)) {
|
|
133
138
|
cache.set(req.params.id, await fetchData(req.params.id));
|
|
134
139
|
}
|
|
@@ -137,7 +142,7 @@ app.get("/data/:id", async (req, res) => {
|
|
|
137
142
|
// After 100K unique IDs → hundreds of MB consumed → OOM crash
|
|
138
143
|
|
|
139
144
|
// ✅ APPROVED: LRU cache with max size and TTL
|
|
140
|
-
import { LRUCache } from
|
|
145
|
+
import { LRUCache } from 'lru-cache';
|
|
141
146
|
const cache = new LRUCache<string, any>({
|
|
142
147
|
max: 1000, // Maximum 1000 entries
|
|
143
148
|
ttl: 1000 * 60 * 5, // 5-minute TTL
|
|
@@ -149,17 +154,17 @@ const id = setInterval(() => syncMetrics(), 30000);
|
|
|
149
154
|
|
|
150
155
|
// ✅ APPROVED: Graceful shutdown clears interval
|
|
151
156
|
const id = setInterval(() => syncMetrics(), 30000);
|
|
152
|
-
process.on(
|
|
153
|
-
process.on(
|
|
157
|
+
process.on('SIGTERM', () => clearInterval(id));
|
|
158
|
+
process.on('SIGINT', () => clearInterval(id));
|
|
154
159
|
|
|
155
160
|
// ❌ MEMORY LEAK: Event emitter listeners accumulate
|
|
156
|
-
server.on(
|
|
161
|
+
server.on('request', handler);
|
|
157
162
|
// If called repeatedly (hot reload) → MaxListenersExceededWarning
|
|
158
163
|
|
|
159
164
|
// ✅ APPROVED: Remove listener on cleanup
|
|
160
|
-
server.on(
|
|
165
|
+
server.on('request', handler);
|
|
161
166
|
// On shutdown/reload:
|
|
162
|
-
server.removeListener(
|
|
167
|
+
server.removeListener('request', handler);
|
|
163
168
|
```
|
|
164
169
|
|
|
165
170
|
---
|
|
@@ -168,20 +173,20 @@ server.removeListener("request", handler);
|
|
|
168
173
|
|
|
169
174
|
```typescript
|
|
170
175
|
// ❌ MAIN THREAD: CPU-heavy operation blocks ALL requests
|
|
171
|
-
app.post(
|
|
176
|
+
app.post('/resize', async (req, res) => {
|
|
172
177
|
const resized = sharp(buffer).resize(800, 600).toBuffer(); // 200-500ms blocking
|
|
173
178
|
res.send(resized);
|
|
174
179
|
});
|
|
175
180
|
|
|
176
181
|
// ✅ APPROVED: Offload to Worker Thread
|
|
177
|
-
import { Worker } from
|
|
182
|
+
import { Worker } from 'worker_threads';
|
|
178
183
|
|
|
179
|
-
app.post(
|
|
180
|
-
const worker = new Worker(
|
|
184
|
+
app.post('/resize', async (req, res) => {
|
|
185
|
+
const worker = new Worker('./workers/resize.js', {
|
|
181
186
|
workerData: { buffer: req.body, width: 800, height: 600 },
|
|
182
187
|
});
|
|
183
|
-
worker.on(
|
|
184
|
-
worker.on(
|
|
188
|
+
worker.on('message', result => res.send(result));
|
|
189
|
+
worker.on('error', err => res.status(500).json({ error: err.message }));
|
|
185
190
|
});
|
|
186
191
|
|
|
187
192
|
// Flag these operations as Worker Thread candidates:
|
|
@@ -198,16 +203,16 @@ app.post("/resize", async (req, res) => {
|
|
|
198
203
|
|
|
199
204
|
```typescript
|
|
200
205
|
// ❌ BUFFER BLOAT: Entire file loaded into memory before sending
|
|
201
|
-
app.get(
|
|
206
|
+
app.get('/export', async (req, res) => {
|
|
202
207
|
const data = await db.orders.findMany(); // 50MB result set
|
|
203
208
|
const csv = convertToCSV(data); // Another 50MB in memory
|
|
204
209
|
res.send(csv); // Total: 100MB per request
|
|
205
210
|
});
|
|
206
211
|
|
|
207
212
|
// ✅ APPROVED: Stream directly to response
|
|
208
|
-
app.get(
|
|
209
|
-
res.setHeader(
|
|
210
|
-
res.setHeader(
|
|
213
|
+
app.get('/export', async (req, res) => {
|
|
214
|
+
res.setHeader('Content-Type', 'text/csv');
|
|
215
|
+
res.setHeader('Transfer-Encoding', 'chunked');
|
|
211
216
|
|
|
212
217
|
const cursor = db.orders.findMany({ cursor: true });
|
|
213
218
|
for await (const batch of cursor) {
|
|
@@ -217,16 +222,16 @@ app.get("/export", async (req, res) => {
|
|
|
217
222
|
});
|
|
218
223
|
|
|
219
224
|
// ❌ BUFFER BLOAT: Reading entire upload before processing
|
|
220
|
-
app.post(
|
|
225
|
+
app.post('/upload', async (req, res) => {
|
|
221
226
|
const body = await req.arrayBuffer(); // Entire file in memory
|
|
222
227
|
await processFile(Buffer.from(body));
|
|
223
228
|
});
|
|
224
229
|
|
|
225
230
|
// ✅ APPROVED: Pipe stream directly
|
|
226
|
-
app.post(
|
|
231
|
+
app.post('/upload', async (req, res) => {
|
|
227
232
|
const writeStream = fs.createWriteStream(`/uploads/${filename}`);
|
|
228
233
|
req.pipe(writeStream);
|
|
229
|
-
writeStream.on(
|
|
234
|
+
writeStream.on('finish', () => res.json({ status: 'uploaded' }));
|
|
230
235
|
});
|
|
231
236
|
```
|
|
232
237
|
|
|
@@ -237,15 +242,15 @@ app.post("/upload", async (req, res) => {
|
|
|
237
242
|
```typescript
|
|
238
243
|
// ❌ NO KEEP-ALIVE: New TCP connection per outbound fetch
|
|
239
244
|
async function callExternalAPI(data: any) {
|
|
240
|
-
const res = await fetch(
|
|
241
|
-
method:
|
|
245
|
+
const res = await fetch('https://api.external.com/v1/data', {
|
|
246
|
+
method: 'POST',
|
|
242
247
|
body: JSON.stringify(data),
|
|
243
248
|
});
|
|
244
249
|
// Each call = DNS lookup + TCP handshake + TLS negotiation (100-300ms overhead)
|
|
245
250
|
}
|
|
246
251
|
|
|
247
252
|
// ✅ APPROVED: Reuse connections with http.Agent
|
|
248
|
-
import { Agent } from
|
|
253
|
+
import { Agent } from 'undici';
|
|
249
254
|
|
|
250
255
|
const agent = new Agent({
|
|
251
256
|
keepAliveTimeout: 30_000,
|
|
@@ -254,8 +259,8 @@ const agent = new Agent({
|
|
|
254
259
|
});
|
|
255
260
|
|
|
256
261
|
async function callExternalAPI(data: any) {
|
|
257
|
-
const res = await fetch(
|
|
258
|
-
method:
|
|
262
|
+
const res = await fetch('https://api.external.com/v1/data', {
|
|
263
|
+
method: 'POST',
|
|
259
264
|
body: JSON.stringify(data),
|
|
260
265
|
dispatcher: agent,
|
|
261
266
|
});
|
|
@@ -279,7 +284,7 @@ do {
|
|
|
279
284
|
const batch = await prisma.user.findMany({
|
|
280
285
|
take: 100,
|
|
281
286
|
...(cursor ? { skip: 1, cursor: { id: cursor } } : {}),
|
|
282
|
-
orderBy: { id:
|
|
287
|
+
orderBy: { id: 'asc' },
|
|
283
288
|
});
|
|
284
289
|
for (const user of batch) {
|
|
285
290
|
await sendEmail(user.email);
|
|
@@ -20,6 +20,7 @@ TypeScript is a contract system. Your job is to ensure every contract is honored
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before auditing TypeScript safety, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. `tsconfig.json` → Check `strict`, `noImplicitAny`, `strictNullChecks`, `noUncheckedIndexedAccess` settings
|
|
24
25
|
2. `package.json` → Check `@types/*` dependencies and TypeScript compiler version
|
|
25
26
|
3. Imported module declarations (`.d.ts` files or exported types) → Ensure interfaces exist and match contract usage
|
|
@@ -37,7 +38,7 @@ function process(data: any) {
|
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
// ❌ REJECTED: Cast from unknown response — no runtime validation
|
|
40
|
-
const result: any = await fetch(
|
|
41
|
+
const result: any = await fetch('/api').then(r => r.json());
|
|
41
42
|
|
|
42
43
|
// ✅ APPROVED: Narrow interface defined
|
|
43
44
|
function process(data: { name: string; id: number }) {
|
|
@@ -45,7 +46,7 @@ function process(data: { name: string; id: number }) {
|
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
// ✅ APPROVED: Zod validates at runtime boundary
|
|
48
|
-
const result = UserSchema.parse(await fetch(
|
|
49
|
+
const result = UserSchema.parse(await fetch('/api').then(r => r.json()));
|
|
49
50
|
|
|
50
51
|
// ✅ APPROVED with documented justification
|
|
51
52
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -70,7 +71,7 @@ const user = UserSchema.parse(response);
|
|
|
70
71
|
|
|
71
72
|
// ✅ APPROVED: Type guard with actual check
|
|
72
73
|
function isUser(data: unknown): data is User {
|
|
73
|
-
return typeof data ===
|
|
74
|
+
return typeof data === 'object' && data !== null && 'id' in data;
|
|
74
75
|
}
|
|
75
76
|
```
|
|
76
77
|
|
|
@@ -111,7 +112,7 @@ const city = user.address.city;
|
|
|
111
112
|
const first = arr[0].name; // arr could be empty
|
|
112
113
|
|
|
113
114
|
// ✅ APPROVED: Optional chaining with fallback
|
|
114
|
-
const city = user.address?.city ??
|
|
115
|
+
const city = user.address?.city ?? 'Unknown';
|
|
115
116
|
|
|
116
117
|
// ✅ APPROVED: Guard before access
|
|
117
118
|
if (arr.length > 0) {
|
|
@@ -22,6 +22,7 @@ skills:
|
|
|
22
22
|
## Mandatory Pre-Flight Context Inspection
|
|
23
23
|
|
|
24
24
|
Before auditing UI/UX governance, you MUST inspect:
|
|
25
|
+
|
|
25
26
|
1. `DESIGN.md` / `theme.css` → Check active visual direction, color system, and spatial tokens
|
|
26
27
|
2. Component hierarchy → Check if the `🧠 UI Reasoning Engine Trace` block was produced before component code
|
|
27
28
|
3. Accessibility & Layout → Check touch targets (min 44x44px), ARIA roles, and responsive breakpoint rules
|
|
@@ -31,6 +32,7 @@ Before auditing UI/UX governance, you MUST inspect:
|
|
|
31
32
|
## The UI Multi-Agent Orchestration Loop
|
|
32
33
|
|
|
33
34
|
When reviewing code, you must synthesize findings from the 6 specialized reviewers:
|
|
35
|
+
|
|
34
36
|
1. **ux-reviewer:** Verifies Hick's law, scannability, cognitive load, and progressive disclosure.
|
|
35
37
|
2. **visual-reviewer:** Verifies margins, typographic hierarchy, 8px grids, and contrast.
|
|
36
38
|
3. **interaction-reviewer:** Verifies all interactive states (hover, focus, active, disabled) and micro-interactions.
|
|
@@ -42,10 +44,10 @@ When reviewing code, you must synthesize findings from the 6 specialized reviewe
|
|
|
42
44
|
|
|
43
45
|
## Strict Rejection Gates (Blocking)
|
|
44
46
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
- **Missing Reasoning Trace:** If the Maker agent fails to output the `🧠 UI Reasoning Engine Trace` block before the code, output is immediately REJECTED.
|
|
48
|
+
- **The Purple brand color (#7C3AED):** Immediately REJECTED.
|
|
49
|
+
- **Lack of Hover/Active states:** Rejects any clickable button or card that does not explicitly implement hover scales or `active:scale-[0.97]` click indicators.
|
|
50
|
+
- **Layout Shift (CLS):** Rejects images or media content containers that do not declare explicit aspect ratios or spacing dimensions.
|
|
49
51
|
|
|
50
52
|
---
|
|
51
53
|
|
|
@@ -18,6 +18,7 @@ skills:
|
|
|
18
18
|
## Mandatory Pre-Flight Context Inspection
|
|
19
19
|
|
|
20
20
|
Before auditing rendered visuals and DOM layouts, you MUST inspect:
|
|
21
|
+
|
|
21
22
|
1. Breakpoint configs (`tailwind.config.js`, `media.css`) → Verify 375px (mobile), 768px (tablet), and 1440px (desktop) breakpoint bounds
|
|
22
23
|
2. Image & Video assets → Confirm presence of `aspect-ratio` or explicit width/height dimensions to eliminate layout shifts
|
|
23
24
|
3. Typography wrap rules → Verify `text-wrap: balance` / `pretty` usage on headings and body text
|
|
@@ -39,6 +40,7 @@ You inspect rendered HTML, DOM elements, or captured screenshots at multiple vie
|
|
|
39
40
|
## Code Comparison Examples
|
|
40
41
|
|
|
41
42
|
### Layout Shift (CLS) Violation
|
|
43
|
+
|
|
42
44
|
```tsx
|
|
43
45
|
// ❌ REJECTED: Missing width/height or aspect-ratio on image. Causes layout jump on load.
|
|
44
46
|
<img src="/hero-illustration.webp" className="w-full h-auto" />
|
|
@@ -50,6 +52,7 @@ You inspect rendered HTML, DOM elements, or captured screenshots at multiple vie
|
|
|
50
52
|
```
|
|
51
53
|
|
|
52
54
|
### Responsive Container Overflow
|
|
55
|
+
|
|
53
56
|
```tsx
|
|
54
57
|
// ❌ REJECTED: Hardcoded width on container causing horizontal overflow on mobile viewports
|
|
55
58
|
<div className="w-[600px] p-4">
|
|
@@ -17,6 +17,7 @@ You evaluate usability, layout scannability, cognitive safety, information archi
|
|
|
17
17
|
## Mandatory Pre-Flight Context Inspection
|
|
18
18
|
|
|
19
19
|
Before auditing usability and information architecture, you MUST inspect:
|
|
20
|
+
|
|
20
21
|
1. Target user workflow & product type (SaaS Dashboard, Marketing Landing, DevTool, AI Interface, Fintech)
|
|
21
22
|
2. Interactive button/input groupings → Verify destructive actions are separated from primary CTA buttons
|
|
22
23
|
3. Progressive disclosure structures → Ensure complex forms (>5 fields) use multi-step wizards or grouped fieldsets
|
|
@@ -26,20 +27,23 @@ Before auditing usability and information architecture, you MUST inspect:
|
|
|
26
27
|
## What This Reviewer Catches
|
|
27
28
|
|
|
28
29
|
### ❌ REJECTED Criteria (Blocking)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
|
|
31
|
+
- **Action Isolation Failures:** Primary actions placed far from user eye-tracking zones or too close to destructive actions without distinct styling.
|
|
32
|
+
- **Choice Overload (Hick's Law):** Exposing 10+ options or inputs on a single screen layer without progressive disclosure (tabs, dropdowns, expandables).
|
|
33
|
+
- **Nonsensical Grouping (Gestalt violation):** Visual spacing that breaks parent-child relationships (e.g., input labels placed closer to the preceding input than the target input).
|
|
34
|
+
- **Form Blockages:** Multi-step forms without visual progress indicators, or missing explicit validation message bindings.
|
|
33
35
|
|
|
34
36
|
### ⚠️ WARNING Criteria (Non-blocking)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
+
|
|
38
|
+
- _Progressive Disclosure:_ Tooltips or collapsible sections missing for secondary glossary terms.
|
|
39
|
+
- _Scanning Rhythm:_ Lack of section headings to break up long blocks of inputs.
|
|
37
40
|
|
|
38
41
|
---
|
|
39
42
|
|
|
40
43
|
## Code Comparison Examples
|
|
41
44
|
|
|
42
45
|
### Action Isolation Failure
|
|
46
|
+
|
|
43
47
|
```tsx
|
|
44
48
|
// ❌ REJECTED: Destructive delete button right next to primary save button with same styling
|
|
45
49
|
<div className="flex gap-2">
|
|
@@ -59,6 +63,7 @@ Before auditing usability and information architecture, you MUST inspect:
|
|
|
59
63
|
```
|
|
60
64
|
|
|
61
65
|
### Gestalt Grouping Violation
|
|
66
|
+
|
|
62
67
|
```tsx
|
|
63
68
|
// ❌ REJECTED: Label is closer to the preceding input than the input it describes
|
|
64
69
|
<div className="space-y-4">
|
|
@@ -18,6 +18,7 @@ You evaluate margins, visual rhythm, typography scales, alignment, line lengths,
|
|
|
18
18
|
## Mandatory Pre-Flight Context Inspection
|
|
19
19
|
|
|
20
20
|
Before auditing visual rhythm and typography, you MUST inspect:
|
|
21
|
+
|
|
21
22
|
1. `DESIGN.md` / `theme.css` → Check font family mappings (display vs body vs mono) and scale steps (`text-xs` to `text-6xl`)
|
|
22
23
|
2. Spatial grid rules → Verify padding/margin/gap utilities adhere to the 8px grid (8px, 16px, 24px, 32px, 48px, 64px)
|
|
23
24
|
3. Line length limits → Confirm paragraph bounds use `max-w-prose` or `max-w-[65ch]` to prevent wide, unreadable columns
|
|
@@ -27,20 +28,23 @@ Before auditing visual rhythm and typography, you MUST inspect:
|
|
|
27
28
|
## What This Reviewer Catches
|
|
28
29
|
|
|
29
30
|
### ❌ REJECTED Criteria (Blocking)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
|
|
32
|
+
- **Typography Overlap/Orphans:** Display headings wrapping awkwardly without balancing (`text-wrap: balance` missing on dynamic headings).
|
|
33
|
+
- **Arbitrary Spacing:** Spacing values (margin, padding, gap) that deviate from the strict 8px spatial grid system (e.g., mixing `15px`, `9px`, `19px`).
|
|
34
|
+
- **Line-Length Violations:** Text paragraph columns wider than `75ch` or narrower than `45ch` for body content.
|
|
35
|
+
- **Poor Contrast:** Color combinations failing contrast thresholds. Dark surfaces casting harsh pitch-black shadows instead of stepping background lightness.
|
|
34
36
|
|
|
35
37
|
### ⚠️ WARNING Criteria (Non-blocking)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
|
|
39
|
+
- _Font Pairing:_ Monotonous font setups (e.g., Inter for both Display and Body) that feel generic.
|
|
40
|
+
- _Negative Space:_ Tight component paddings that crush text elements.
|
|
38
41
|
|
|
39
42
|
---
|
|
40
43
|
|
|
41
44
|
## Code Comparison Examples
|
|
42
45
|
|
|
43
46
|
### Arbitrary Spacing vs. Grid Spacing
|
|
47
|
+
|
|
44
48
|
```tsx
|
|
45
49
|
// ❌ REJECTED: Mixing arbitrary values (m-3, p-[15px], gap-5) outside the 8px spatial grid
|
|
46
50
|
<div className="p-[15px] m-3 gap-5 flex">
|
|
@@ -56,6 +60,7 @@ Before auditing visual rhythm and typography, you MUST inspect:
|
|
|
56
60
|
```
|
|
57
61
|
|
|
58
62
|
### Unbalanced Typography vs. Balanced Readability
|
|
63
|
+
|
|
59
64
|
```tsx
|
|
60
65
|
// ❌ REJECTED: Raw unconstrained width heading and paragraph without orphans balancing
|
|
61
66
|
<div>
|
|
@@ -22,6 +22,7 @@ You audit **frontend files only** — `.tsx`, `.jsx`, `.css`, `.module.css`. You
|
|
|
22
22
|
## Mandatory Pre-Flight Context Inspection
|
|
23
23
|
|
|
24
24
|
Before auditing Core Web Vitals, you MUST inspect:
|
|
25
|
+
|
|
25
26
|
1. `app/layout.tsx` / `next.config.js` → Check font declarations (`next/font`), image domains, and scripts (`next/script` strategy)
|
|
26
27
|
2. Above-the-fold media elements → Check image `priority`, `aspect-ratio` reserves, and layout shift triggers
|
|
27
28
|
3. Animation & Event listener code → Verify `useTransition` usage for expensive state updates and `passive: true` on scroll listeners
|
|
@@ -91,13 +92,13 @@ function handleSearch(query: string) {
|
|
|
91
92
|
}
|
|
92
93
|
|
|
93
94
|
// ❌ INP DAMAGE: Non-passive scroll listener (blocks scroll painting)
|
|
94
|
-
element.addEventListener(
|
|
95
|
+
element.addEventListener('scroll', handler); // Missing { passive: true }
|
|
95
96
|
|
|
96
97
|
// ✅ APPROVED: Passive listener — browser paints immediately
|
|
97
|
-
element.addEventListener(
|
|
98
|
+
element.addEventListener('scroll', handler, { passive: true });
|
|
98
99
|
|
|
99
100
|
// ❌ INP DAMAGE: Complex computation on mousemove (fires 60+/sec)
|
|
100
|
-
document.addEventListener(
|
|
101
|
+
document.addEventListener('mousemove', e => {
|
|
101
102
|
renderComplexGradient(e.clientX, e.clientY);
|
|
102
103
|
});
|
|
103
104
|
```
|
|
@@ -114,7 +115,7 @@ document.addEventListener("mousemove", (e) => {
|
|
|
114
115
|
container.prepend(banner); // Pushes existing content down
|
|
115
116
|
|
|
116
117
|
// ✅ APPROVED: Reserved space with aspect-ratio
|
|
117
|
-
<div style={{ aspectRatio:
|
|
118
|
+
<div style={{ aspectRatio: '16/9', width: '100%' }}>
|
|
118
119
|
<Image src="/photo.jpg" fill alt="Photo" />
|
|
119
120
|
</div>;
|
|
120
121
|
|