[{"data":1,"prerenderedAt":1186},["ShallowReactive",2],{"navigation_docs":3,"-cli-scoring":500,"-cli-scoring-surround":1181},[4,30,80,118,283,415,470],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Start","\u002Fstart","1.start",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":25,"path":26,"stem":27,"icon":28},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Learn","\u002Flearn","2.learn",[35,40,45,50,55,60,65,70,75],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":46,"path":47,"stem":48,"icon":49},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":51,"path":52,"stem":53,"icon":54},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":56,"path":57,"stem":58,"icon":59},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":61,"path":62,"stem":63,"icon":64},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":66,"path":67,"stem":68,"icon":69},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":71,"path":72,"stem":73,"icon":74},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":76,"path":77,"stem":78,"icon":79},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":81,"path":82,"stem":83,"children":84,"page":29},"CLI","\u002Fcli","3.cli",[85,88,93,98,103,108,113],{"title":36,"path":86,"stem":87,"icon":44},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":89,"path":90,"stem":91,"icon":92},"map","\u002Fcli\u002Fmap","3.cli\u002F1.map","i-lucide-radar",{"title":94,"path":95,"stem":96,"icon":97},"Rules","\u002Fcli\u002Frules","3.cli\u002F2.rules","i-lucide-list-checks",{"title":99,"path":100,"stem":101,"icon":102},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F3.scoring","i-lucide-gauge",{"title":104,"path":105,"stem":106,"icon":107},"CI","\u002Fcli\u002Fci","3.cli\u002F4.ci","i-lucide-git-pull-request",{"title":109,"path":110,"stem":111,"icon":112},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F5.doctor","i-lucide-stethoscope",{"title":114,"path":115,"stem":116,"icon":117},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F6.telemetry","i-lucide-bar-chart-3",{"title":119,"path":120,"stem":121,"children":122,"page":29},"Integrate","\u002Fintegrate","4.integrate",[123,127,195],{"title":36,"path":124,"stem":125,"icon":126},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":128,"path":129,"stem":130,"children":131,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[132,135,175],{"title":36,"path":133,"stem":134,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":136,"path":137,"stem":138,"children":139,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[140,145,150,155,160,165,170],{"title":141,"path":142,"stem":143,"icon":144},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":146,"path":147,"stem":148,"icon":149},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","4.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":151,"path":152,"stem":153,"icon":154},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":156,"path":157,"stem":158,"icon":159},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":161,"path":162,"stem":163,"icon":164},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":166,"path":167,"stem":168,"icon":169},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":171,"path":172,"stem":173,"icon":174},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","4.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":176,"path":177,"stem":178,"children":179,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[180,185,190],{"title":181,"path":182,"stem":183,"icon":184},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":186,"path":187,"stem":188,"icon":189},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":191,"path":192,"stem":193,"icon":194},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":196,"path":197,"stem":198,"children":199,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[200,204,209,214,219,224,229,234,239,244,249,254,259,264,268,273,278],{"title":36,"path":201,"stem":202,"icon":203},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":205,"path":206,"stem":207,"icon":208},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":210,"path":211,"stem":212,"icon":213},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":215,"path":216,"stem":217,"icon":218},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":220,"path":221,"stem":222,"icon":223},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":225,"path":226,"stem":227,"icon":228},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":230,"path":231,"stem":232,"icon":233},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":235,"path":236,"stem":237,"icon":238},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":240,"path":241,"stem":242,"icon":243},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":245,"path":246,"stem":247,"icon":248},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":250,"path":251,"stem":252,"icon":253},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":255,"path":256,"stem":257,"icon":258},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":260,"path":261,"stem":262,"icon":263},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":265,"path":266,"stem":267,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":269,"path":270,"stem":271,"icon":272},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":274,"path":275,"stem":276,"icon":277},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":279,"path":280,"stem":281,"icon":282},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":284,"path":285,"stem":286,"children":287,"page":29},"Use Cases","\u002Fuse-cases","5.use-cases",[288,291,296,325,352,384,405,410],{"title":36,"path":289,"stem":290,"icon":97},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":292,"path":293,"stem":294,"icon":295},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":297,"icon":298,"path":299,"stem":300,"children":301,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[302,305,310,315,320],{"title":36,"path":303,"stem":304,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":306,"path":307,"stem":308,"icon":309},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":311,"path":312,"stem":313,"icon":314},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":316,"path":317,"stem":318,"icon":319},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":321,"path":322,"stem":323,"icon":324},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":326,"icon":327,"path":328,"stem":329,"children":330,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[331,334,339,344,348],{"title":36,"path":332,"stem":333,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":335,"path":336,"stem":337,"icon":338},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":340,"path":341,"stem":342,"icon":343},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":345,"path":346,"stem":347,"icon":295},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":349,"path":350,"stem":351,"icon":102},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":353,"icon":354,"path":355,"stem":356,"children":357,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[358,361,366,371,376,380],{"title":36,"path":359,"stem":360,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":362,"path":363,"stem":364,"icon":365},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":367,"path":368,"stem":369,"icon":370},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":372,"path":373,"stem":374,"icon":375},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":377,"path":378,"stem":379,"icon":354},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":381,"path":382,"stem":383,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":321,"icon":102,"path":385,"stem":386,"children":387,"page":29},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[388,391,396,401],{"title":36,"path":389,"stem":390,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":392,"path":393,"stem":394,"icon":395},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":397,"path":398,"stem":399,"icon":400},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":402,"path":403,"stem":404,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":406,"path":407,"stem":408,"icon":409},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":411,"path":412,"stem":413,"icon":414},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":416,"path":417,"stem":418,"children":419,"page":29},"Extend","\u002Fextend","6.extend",[420,424,429,434,439,443,447,451,455,460,465],{"title":36,"path":421,"stem":422,"icon":423},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":425,"path":426,"stem":427,"icon":428},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":430,"path":431,"stem":432,"icon":433},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":435,"path":436,"stem":437,"icon":438},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":381,"path":440,"stem":441,"icon":442},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":444,"path":445,"stem":446,"icon":423},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":448,"path":449,"stem":450,"icon":409},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":452,"path":453,"stem":454,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":456,"path":457,"stem":458,"icon":459},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":461,"path":462,"stem":463,"icon":464},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":466,"path":467,"stem":468,"icon":469},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":402,"path":471,"stem":472,"children":473,"page":29},"\u002Freference","7.reference",[474,479,482,487,491,496],{"title":475,"path":476,"stem":477,"icon":478},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":349,"path":480,"stem":481,"icon":102},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":483,"path":484,"stem":485,"icon":486},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":488,"path":489,"stem":490,"icon":354},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":492,"path":493,"stem":494,"icon":495},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":497,"path":498,"stem":499,"icon":409},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"id":501,"title":502,"body":503,"description":1171,"extension":1172,"links":1173,"meta":1177,"navigation":1178,"path":100,"seo":1179,"stem":101,"__hash__":1180},"docs\u002F3.cli\u002F3.scoring.md","Map scoring",{"type":504,"value":505,"toc":1152},"minimark",[506,510,515,523,602,615,626,629,640,655,663,673,676,680,683,720,723,726,732,735,739,793,797,804,866,871,875,881,889,943,950,1011,1018,1053,1064,1068,1071,1081,1095,1098,1104,1108,1136,1140],[507,508,509],"p",{},"The score exists to be compared against itself. It is a number you can watch move as you fix things, and gate a pull request on — not a benchmark against other projects.",[511,512,514],"h2",{"id":513},"one-entry-point","One entry point",[507,516,517,518,522],{},"Every entry point starts at 100 and loses the weight of each ",[519,520,521],"strong",{},"requirement"," it fails, floored at 0.",[524,525,526,539],"table",{},[527,528,529],"thead",{},[530,531,532,536],"tr",{},[533,534,535],"th",{},"Requirement",[533,537,538],{},"Weight",[540,541,542,554,564,574,583,593],"tbody",{},[530,543,544,551],{},[545,546,547],"td",{},[548,549,550],"code",{},"wide-event",[545,552,553],{},"40",[530,555,556,561],{},[545,557,558],{},[548,559,560],{},"audit",[545,562,563],{},"25",[530,565,566,571],{},[545,567,568],{},[548,569,570],{},"structured-errors",[545,572,573],{},"20",[530,575,576,581],{},[545,577,578],{},[548,579,580],{},"page-error-handling",[545,582,573],{},[530,584,585,590],{},[545,586,587],{},[548,588,589],{},"context",[545,591,592],{},"15",[530,594,595,600],{},[545,596,597],{},[548,598,599],{},"error-handling",[545,601,592],{},[507,603,604,605,608,609,614],{},"A rule that passes costs nothing. A rule that reports ",[548,606,607],{},"n\u002Fa"," costs nothing either — it never applied, so it is not held against the entry point. ",[610,611,613],"a",{"href":612},"\u002Fcli\u002Frules#opportunities","Opportunities"," carry no weight at all and cannot appear here.",[507,616,617,618,622,623,625],{},"A check you ",[610,619,621],{"href":620},"\u002Fcli\u002Frules#disabling-a-check","disabled with a comment"," is also ",[548,624,607],{},", so it costs nothing — and the report counts how many, because a score that is partly the result of disabled checks has to say so.",[507,627,628],{},"Take the login handler from the playground:",[630,631,638],"pre",{"className":632,"code":634,"filename":635,"language":636,"meta":637},[633],"language-text","CHECKS\n✓ useLogger  wide event emitted per request\n✓ log.set    context attached with log.set()\n✗ log.audit  sensitive action with no audit trail\n","evlog map server\u002Fapi\u002Fauth\u002Flogin.post.ts","text","",[548,639,634],{"__ignoreMap":637},[507,641,642,644,645,647,648,650,651,654],{},[548,643,570],{}," and ",[548,646,599],{}," were ",[548,649,607],{}," — the handler throws nothing and catches nothing. One requirement failed, so the score is ",[548,652,653],{},"100 − 25 = 75",".",[656,657,659,660,662],"callout",{"color":658,"icon":13},"neutral","Weights add up to more than 100 on purpose. A handler that fails everything lands at 0, and the ordering of what to fix first stays meaningful: ",[548,661,550],{}," at 40 outweighs any pair of the smaller rules.",[507,664,665,666,668,669,672],{},"Which makes the arithmetic legible in both directions. Here is the worst entry point in the playground going from ",[548,667,573],{}," to ",[548,670,671],{},"100",", one line at a time, each fix worth exactly the weight of the rule it satisfies:",[674,675],"map-score-climb",{},[511,677,679],{"id":678},"the-project-score","The project score",[507,681,682],{},"The global score is the average of every entry point, weighted by how much a blind spot there would cost you:",[524,684,685,694],{},[527,686,687],{},[530,688,689,692],{},[533,690,691],{},"Entry point",[533,693,538],{},[540,695,696,704,712],{},[530,697,698,701],{},[545,699,700],{},"Flagged money or auth",[545,702,703],{},"×2",[530,705,706,709],{},[545,707,708],{},"Page",[545,710,711],{},"×0.5",[530,713,714,717],{},[545,715,716],{},"Everything else",[545,718,719],{},"×1",[507,721,722],{},"Pages weigh less because a page that swallows a fetch error is a worse user experience than an observability hole, and they are usually the most numerous files in an app. Sensitive handlers weigh double because that is where you will need the event.",[507,724,725],{},"Three entry points — a sensitive handler at 75, a plain handler at 100, and a page at 50:",[630,727,730],{"className":728,"code":729,"language":636,"meta":637},[633],"(75 × 2) + (100 × 1) + (50 × 0.5)   275\n───────────────────────────────── = ───── = 79\n        2 + 1 + 0.5                  3.5\n",[548,731,729],{"__ignoreMap":637},[507,733,734],{},"A project with no entry points at all scores 100.",[511,736,738],{"id":737},"grades","Grades",[524,740,741,751],{},[527,742,743],{},[530,744,745,748],{},[533,746,747],{},"Score",[533,749,750],{},"Grade",[540,752,753,763,773,783],{},[530,754,755,758],{},[545,756,757],{},"90–100",[545,759,760],{},[548,761,762],{},"excellent",[530,764,765,768],{},[545,766,767],{},"70–89",[545,769,770],{},[548,771,772],{},"good",[530,774,775,778],{},[545,776,777],{},"50–69",[545,779,780],{},[548,781,782],{},"needs work",[530,784,785,788],{},[545,786,787],{},"0–49",[545,789,790],{},[548,791,792],{},"at risk",[511,794,796],{"id":795},"coverage-classification","Coverage classification",[507,798,799,800,803],{},"Alongside the score, each entry point is classified — this is what the ",[548,801,802],{},"summary"," block in the JSON counts, and what the coverage rows in the report are built from.",[524,805,806,816],{},[527,807,808],{},[530,809,810,813],{},[533,811,812],{},"Class",[533,814,815],{},"When",[540,817,818,833,843,853],{},[530,819,820,825],{},[545,821,822],{},[548,823,824],{},"instrumented",[545,826,827,828,644,830,832],{},"A handler that passes both ",[548,829,550],{},[548,831,589],{},", or a page that handles its fetch errors",[530,834,835,840],{},[545,836,837],{},[548,838,839],{},"partial",[545,841,842],{},"A handler that passes one of the two",[530,844,845,850],{},[545,846,847],{},[548,848,849],{},"dark",[545,851,852],{},"A handler that passes neither, or a page that swallows fetch errors",[530,854,855,860],{},[545,856,857],{},[548,858,859],{},"exempt",[545,861,862,863,865],{},"evlog infrastructure — every rule is ",[548,864,607],{},", so it sits at 100 and is counted apart from your own entry points",[507,867,868,870],{},[548,869,849],{}," is the number to watch. A dark entry point produces nothing you can query: when it misbehaves, the only evidence you will have is the user's description of it.",[511,872,874],{"id":873},"sensitivity","Sensitivity",[507,876,877,878,880],{},"Sensitivity is what promotes an entry point to double weight and adds the ",[548,879,560],{}," requirement, so it is worth knowing exactly how it is decided.",[882,883,885,886],"h3",{"id":884},"money","Money — ",[548,887,888],{},"$",[890,891,892,913],"ul",{},[893,894,895,898,899,902,903,902,906,909,910],"li",{},[519,896,897],{},"Imports"," ",[548,900,901],{},"stripe",", ",[548,904,905],{},"@stripe\u002Fstripe-js",[548,907,908],{},"paddle-sdk",", or ",[548,911,912],{},"@lemonsqueezy\u002Flemonsqueezy.js",[893,914,915,918,919,902,922,902,925,902,928,902,931,902,934,902,937,909,940],{},[519,916,917],{},"Path"," contains ",[548,920,921],{},"checkout",[548,923,924],{},"payment",[548,926,927],{},"billing",[548,929,930],{},"invoice",[548,932,933],{},"refund",[548,935,936],{},"subscription",[548,938,939],{},"charge",[548,941,942],{},"payout",[882,944,946,947],{"id":945},"auth-a","Auth — ",[548,948,949],{},"A",[890,951,952,971],{},[893,953,954,898,956,902,959,902,962,902,965,909,968],{},[519,955,897],{},[548,957,958],{},"better-auth",[548,960,961],{},"next-auth",[548,963,964],{},"lucia",[548,966,967],{},"@auth\u002Fcore",[548,969,970],{},"@auth\u002Fnextjs",[893,972,973,918,975,902,978,902,981,902,984,902,987,902,990,902,993,902,996,902,999,902,1002,902,1005,909,1008],{},[519,974,917],{},[548,976,977],{},"auth",[548,979,980],{},"oauth",[548,982,983],{},"login",[548,985,986],{},"logout",[548,988,989],{},"signin",[548,991,992],{},"signup",[548,994,995],{},"register",[548,997,998],{},"password",[548,1000,1001],{},"token",[548,1003,1004],{},"session",[548,1006,1007],{},"mfa",[548,1009,1010],{},"otp",[882,1012,1014,1015],{"id":1013},"pii","PII — ",[548,1016,1017],{},"@",[507,1019,1020,1021,902,1024,902,1027,902,1030,909,1033,898,1036,1039,1040,902,1043,902,1046,902,1049,1052],{},"Fields matching ",[548,1022,1023],{},"email",[548,1025,1026],{},"phone",[548,1028,1029],{},"address",[548,1031,1032],{},"ssn",[548,1034,1035],{},"iban",[519,1037,1038],{},"and"," a write call (",[548,1041,1042],{},"create",[548,1044,1045],{},"update",[548,1047,1048],{},"insert",[548,1050,1051],{},"upsert",") in the same handler.",[507,1054,1055,1056,1059,1060,1063],{},"Money and auth are ",[548,1057,1058],{},"high"," sensitivity: double weight, and an audit trail is required. PII is ",[548,1061,1062],{},"medium",": no extra requirement, but it is marked in the report.",[882,1065,1067],{"id":1066},"how-the-matching-works","How the matching works",[507,1069,1070],{},"Two decisions keep this from producing noise.",[507,1072,1073,1076,1077,1080],{},[519,1074,1075],{},"Imports are read from the AST."," A package counts only when it is genuinely imported, so a ",[548,1078,1079],{},"\u002F\u002F TODO: drop stripe"," comment does not make a route handle money.",[507,1082,1083,1086,1087,1090,1091,1094],{},[519,1084,1085],{},"Path terms match whole words",", allowing a plural. ",[548,1088,1089],{},"\u002Fapi\u002Fauthors"," is not an auth route, and ",[548,1092,1093],{},"\u002Fapi\u002Frefunds"," is a money route. This matters more than it looks: a wrongly flagged route is handed a 25-point requirement it has no reason to satisfy, and counts double in the average — the fastest way to make the whole number untrustworthy.",[507,1096,1097],{},"Every reason is shown in full when you inspect an entry point, so a wrong call is one line to spot:",[630,1099,1102],{"className":1100,"code":1101,"filename":635,"language":636,"meta":637},[633],"FLAGGED SENSITIVE BECAUSE\n▍ auth: path says \"auth\"\n",[548,1103,1101],{"__ignoreMap":637},[511,1105,1107],{"id":1106},"reading-the-score-honestly","Reading the score honestly",[890,1109,1110,1119,1125],{},[893,1111,1112,1115,1116],{},[519,1113,1114],{},"A high score is not proof of good observability."," It says the shape is there: an event per entry point, context attached, errors explainable, sensitive actions audited. Whether the context you attach is the context you will need is a judgement no static analyser can make. ",[610,1117,1118],{"href":489},"Best practices →",[893,1120,1121,1124],{},[519,1122,1123],{},"Compare runs, not projects."," A 200-route app that scores 70 is in better shape than a 6-route app that scores 70.",[893,1126,1127,1135],{},[519,1128,1129,1130,644,1132],{},"Watch ",[548,1131,849],{},[548,1133,1134],{},"Money & auth"," rather than the headline number. Those are the two places where the next incident is hiding.",[511,1137,1139],{"id":1138},"next","Next",[890,1141,1142,1147],{},[893,1143,1144,1146],{},[610,1145,104],{"href":105}," — turn the score into a pass\u002Ffail check",[893,1148,1149,1151],{},[610,1150,94],{"href":95}," — what each requirement actually looks for",{"title":637,"searchDepth":1153,"depth":1153,"links":1154},2,[1155,1156,1157,1158,1159,1169,1170],{"id":513,"depth":1153,"text":514},{"id":678,"depth":1153,"text":679},{"id":737,"depth":1153,"text":738},{"id":795,"depth":1153,"text":796},{"id":873,"depth":1153,"text":874,"children":1160},[1161,1164,1166,1168],{"id":884,"depth":1162,"text":1163},3,"Money — $",{"id":945,"depth":1162,"text":1165},"Auth — A",{"id":1013,"depth":1162,"text":1167},"PII — @",{"id":1066,"depth":1162,"text":1067},{"id":1106,"depth":1153,"text":1107},{"id":1138,"depth":1153,"text":1139},"How evlog map turns rule results into a score — per-entry weights, the weighted project average, grade thresholds, coverage classification, and how routes are flagged as money, auth, or PII.","md",[1174,1176],{"label":94,"icon":97,"to":95,"color":658,"variant":1175},"subtle",{"label":104,"icon":107,"to":105,"color":658,"variant":1175},{},{"title":99,"icon":102},{"title":502,"description":1171},"g-137Qy_WH51CEZpFLChAFxyJ6_akACzgOdLnU1Dddg",[1182,1184],{"title":94,"path":95,"stem":96,"description":1183,"icon":97,"children":-1},"Every check evlog map runs — the six requirements that move the score, the four suggestions that never do, what satisfies each one, and how evlog helpers are recognised in your code.",{"title":104,"path":105,"stem":106,"description":1185,"icon":107,"children":-1},"Gate a pull request on your observability score with --min-score, read the JSON contract, and keep the map file out of the way. Exit codes, GitHub Actions, and jq recipes.",1785016755908]