[{"data":1,"prerenderedAt":2310},["ShallowReactive",2],{"navigation_docs":3,"-cli-ci":500,"-cli-ci-surround":2305},[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":2295,"extension":2296,"links":2297,"meta":2301,"navigation":2302,"path":105,"seo":2303,"stem":106,"__hash__":2304},"docs\u002F3.cli\u002F4.ci.md","evlog map in CI",{"type":504,"value":505,"toc":2281},"minimark",[506,510,515,522,552,561,568,571,574,577,587,591,648,664,668,807,817,822,825,828,847,874,877,881,884,922,929,933,939,960,1248,1264,1773,1781,1798,1913,1919,1922,2104,2108,2120,2130,2136,2140,2146,2256,2259,2263,2277],[507,508,509],"p",{},"A score you look at once is a nice afternoon. A score in CI is what stops the next handler from shipping dark.",[511,512,514],"h2",{"id":513},"the-gate","The gate",[507,516,517,521],{},[518,519,520],"code",{},"--min-score \u003Cn>"," prints an explicit verdict and exits 1 when the project is below the threshold:",[523,524,530],"pre",{"className":525,"code":526,"filename":527,"language":528,"meta":529,"style":529},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","evlog map --min-score 80\n","Terminal","bash","",[518,531,532],{"__ignoreMap":529},[533,534,537,541,545,548],"span",{"class":535,"line":536},"line",1,[533,538,540],{"class":539},"sBMFI","evlog",[533,542,544],{"class":543},"sfazB"," map",[533,546,547],{"class":543}," --min-score",[533,549,551],{"class":550},"sbssI"," 80\n",[523,553,559],{"className":554,"code":556,"filename":557,"language":558,"meta":529},[555],"language-text"," GATE  score 76 is below --min-score 90 — exit code 1\nfix what is listed under FIX FIRST to pass · evlog.dev\u002Fcli\u002Fci\n","Below the threshold","text",[518,560,556],{"__ignoreMap":529},[523,562,566],{"className":563,"code":564,"filename":565,"language":558,"meta":529},[555]," GATE  score 76 meets --min-score 70 — exit code 0\n","At or above it",[518,567,564],{"__ignoreMap":529},[507,569,570],{},"The full report is printed either way, so a failed job tells you what to fix without a second run.",[507,572,573],{},"Which turns the score into something a pull request can move. One run says the app is short of the bar and names the three entry points responsible, the next one says it is over:",[575,576],"map-pr-gate",{},[578,579,581,586],"callout",{"color":580,"icon":354},"neutral",[582,583,585],"a",{"href":584},"\u002Fcli\u002Frules#opportunities","Opportunities"," never affect the score, so a gate can never fail because the CLI suggested you adopt a feature. Only requirements can fail a build.",[511,588,590],{"id":589},"exit-codes","Exit codes",[592,593,594,607],"table",{},[595,596,597],"thead",{},[598,599,600,604],"tr",{},[601,602,603],"th",{},"Code",[601,605,606],{},"Meaning",[608,609,610,621,635],"tbody",{},[598,611,612,618],{},[613,614,615],"td",{},[518,616,617],{},"0",[613,619,620],{},"Score met the threshold, or no threshold was given",[598,622,623,628],{},[613,624,625],{},[518,626,627],{},"1",[613,629,630,631,634],{},"Score below ",[518,632,633],{},"--min-score",", or the scan could not run",[598,636,637,642],{},[613,638,639],{},[518,640,641],{},"2",[613,643,644,645],{},"Usage error — unknown flag, or an invalid ",[518,646,647],{},"--framework",[649,650,651,652,655,656,659,660,663],"warning",{},"A pipe replaces ",[518,653,654],{},"$?"," with the exit code of the last command in it, so ",[518,657,658],{},"evlog map --min-score 90 \\| tee map.log"," always looks green. Add ",[518,661,662],{},"set -o pipefail"," to the step.",[511,665,667],{"id":666},"github-actions","GitHub Actions",[523,669,674],{"className":670,"code":671,"filename":672,"language":673,"meta":529,"style":529},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name: Observability\n\non: pull_request\n\njobs:\n  map:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v5\n      - uses: actions\u002Fsetup-node@v5\n        with:\n          node-version: 22\n      - run: npx @evlog\u002Fcli map --min-score 80 --no-write\n",".github\u002Fworkflows\u002Fobservability.yml","yaml",[518,675,676,689,696,708,713,722,730,741,749,763,775,783,794],{"__ignoreMap":529},[533,677,678,682,686],{"class":535,"line":536},[533,679,681],{"class":680},"swJcz","name",[533,683,685],{"class":684},"sMK4o",":",[533,687,688],{"class":543}," Observability\n",[533,690,692],{"class":535,"line":691},2,[533,693,695],{"emptyLinePlaceholder":694},true,"\n",[533,697,699,703,705],{"class":535,"line":698},3,[533,700,702],{"class":701},"sfNiH","on",[533,704,685],{"class":684},[533,706,707],{"class":543}," pull_request\n",[533,709,711],{"class":535,"line":710},4,[533,712,695],{"emptyLinePlaceholder":694},[533,714,716,719],{"class":535,"line":715},5,[533,717,718],{"class":680},"jobs",[533,720,721],{"class":684},":\n",[533,723,725,728],{"class":535,"line":724},6,[533,726,727],{"class":680},"  map",[533,729,721],{"class":684},[533,731,733,736,738],{"class":535,"line":732},7,[533,734,735],{"class":680},"    runs-on",[533,737,685],{"class":684},[533,739,740],{"class":543}," ubuntu-latest\n",[533,742,744,747],{"class":535,"line":743},8,[533,745,746],{"class":680},"    steps",[533,748,721],{"class":684},[533,750,752,755,758,760],{"class":535,"line":751},9,[533,753,754],{"class":684},"      -",[533,756,757],{"class":680}," uses",[533,759,685],{"class":684},[533,761,762],{"class":543}," actions\u002Fcheckout@v5\n",[533,764,766,768,770,772],{"class":535,"line":765},10,[533,767,754],{"class":684},[533,769,757],{"class":680},[533,771,685],{"class":684},[533,773,774],{"class":543}," actions\u002Fsetup-node@v5\n",[533,776,778,781],{"class":535,"line":777},11,[533,779,780],{"class":680},"        with",[533,782,721],{"class":684},[533,784,786,789,791],{"class":535,"line":785},12,[533,787,788],{"class":680},"          node-version",[533,790,685],{"class":684},[533,792,793],{"class":550}," 22\n",[533,795,797,799,802,804],{"class":535,"line":796},13,[533,798,754],{"class":684},[533,800,801],{"class":680}," run",[533,803,685],{"class":684},[533,805,806],{"class":543}," npx @evlog\u002Fcli map --min-score 80 --no-write\n",[507,808,809,812,813,816],{},[518,810,811],{},"--no-write"," keeps the job from producing an ",[518,814,815],{},"evlog.map.json"," nobody will read.",[818,819,821],"h3",{"id":820},"pin-the-version","Pin the version",[507,823,824],{},"The CLI is young: rules are still being refined and new ones will be added, so a release can change a verdict on code nobody touched. On a gated job that shows up as a pull request failing for reasons its author cannot see in the diff.",[507,826,827],{},"Install the CLI as a dev dependency and let your lockfile hold it still:",[523,829,831],{"className":525,"code":830,"filename":527,"language":528,"meta":529,"style":529},"pnpm add -D @evlog\u002Fcli\n",[518,832,833],{"__ignoreMap":529},[533,834,835,838,841,844],{"class":535,"line":536},[533,836,837],{"class":539},"pnpm",[533,839,840],{"class":543}," add",[533,842,843],{"class":543}," -D",[533,845,846],{"class":543}," @evlog\u002Fcli\n",[523,848,850],{"className":670,"code":849,"filename":672,"language":673,"meta":529,"style":529},"      - run: pnpm install --frozen-lockfile\n      - run: pnpm evlog map --min-score 80 --no-write\n",[518,851,852,863],{"__ignoreMap":529},[533,853,854,856,858,860],{"class":535,"line":536},[533,855,754],{"class":684},[533,857,801],{"class":680},[533,859,685],{"class":684},[533,861,862],{"class":543}," pnpm install --frozen-lockfile\n",[533,864,865,867,869,871],{"class":535,"line":691},[533,866,754],{"class":684},[533,868,801],{"class":680},[533,870,685],{"class":684},[533,872,873],{"class":543}," pnpm evlog map --min-score 80 --no-write\n",[507,875,876],{},"Then a score change is always something you did, and upgrading the CLI is its own pull request — where a moved score is the point rather than a surprise.",[818,878,880],{"id":879},"ratchet-dont-cliff","Ratchet, don't cliff",[507,882,883],{},"Setting the threshold to 90 on an app that scores 41 fails every pull request and teaches the team to ignore the job. Set it to today's score, then raise it as you fix things:",[523,885,887],{"className":525,"code":886,"filename":527,"language":528,"meta":529,"style":529},"# what are we at right now?\nevlog map --json --no-write | jq '.map.score'\n",[518,888,889,895],{"__ignoreMap":529},[533,890,891],{"class":535,"line":536},[533,892,894],{"class":893},"sHwdD","# what are we at right now?\n",[533,896,897,899,901,904,907,910,913,916,919],{"class":535,"line":691},[533,898,540],{"class":539},[533,900,544],{"class":543},[533,902,903],{"class":543}," --json",[533,905,906],{"class":543}," --no-write",[533,908,909],{"class":684}," |",[533,911,912],{"class":539}," jq",[533,914,915],{"class":684}," '",[533,917,918],{"class":543},".map.score",[533,920,921],{"class":684},"'\n",[507,923,924,925,928],{},"Each pull request that raises the score raises the floor with it. The report already tells you what the next step is worth: ",[518,926,927],{},"▲ 76 → 86 by fixing the 3 above",".",[511,930,932],{"id":931},"the-json-contract","The JSON contract",[507,934,935,938],{},[518,936,937],{},"--json"," writes the whole map to stdout. The report goes to stderr, so the two never mix.",[523,940,942],{"className":525,"code":941,"filename":527,"language":528,"meta":529,"style":529},"evlog map --json --no-write > map.json\n",[518,943,944],{"__ignoreMap":529},[533,945,946,948,950,952,954,957],{"class":535,"line":536},[533,947,540],{"class":539},[533,949,544],{"class":543},[533,951,903],{"class":543},[533,953,906],{"class":543},[533,955,956],{"class":684}," >",[533,958,959],{"class":543}," map.json\n",[523,961,966],{"className":962,"code":963,"filename":964,"language":965,"meta":529,"style":529},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"schemaVersion\": 2,\n  \"environment\": \"production\",\n  \"map\": {\n    \"version\": 1,\n    \"generatedAt\": \"2026-07-25T18:42:10.114Z\",\n    \"framework\": \"nuxt\",\n    \"projectName\": \"evlog-playground\",\n    \"score\": 76,\n    \"routes\": []\n  },\n  \"summary\": { \"instrumented\": 19, \"partial\": 2, \"dark\": 8, \"exempt\": 0, \"suppressedChecks\": 0 },\n  \"mapPath\": \"\u002Fpath\u002Fto\u002Fapp\u002Fevlog.map.json\"\n}\n","Shape","json",[518,967,968,973,993,1014,1027,1044,1064,1084,1104,1120,1134,1139,1223,1242],{"__ignoreMap":529},[533,969,970],{"class":535,"line":536},[533,971,972],{"class":684},"{\n",[533,974,975,978,982,985,987,990],{"class":535,"line":691},[533,976,977],{"class":684},"  \"",[533,979,981],{"class":980},"spNyl","schemaVersion",[533,983,984],{"class":684},"\"",[533,986,685],{"class":684},[533,988,989],{"class":550}," 2",[533,991,992],{"class":684},",\n",[533,994,995,997,1000,1002,1004,1007,1010,1012],{"class":535,"line":698},[533,996,977],{"class":684},[533,998,999],{"class":980},"environment",[533,1001,984],{"class":684},[533,1003,685],{"class":684},[533,1005,1006],{"class":684}," \"",[533,1008,1009],{"class":543},"production",[533,1011,984],{"class":684},[533,1013,992],{"class":684},[533,1015,1016,1018,1020,1022,1024],{"class":535,"line":710},[533,1017,977],{"class":684},[533,1019,89],{"class":980},[533,1021,984],{"class":684},[533,1023,685],{"class":684},[533,1025,1026],{"class":684}," {\n",[533,1028,1029,1032,1035,1037,1039,1042],{"class":535,"line":715},[533,1030,1031],{"class":684},"    \"",[533,1033,1034],{"class":539},"version",[533,1036,984],{"class":684},[533,1038,685],{"class":684},[533,1040,1041],{"class":550}," 1",[533,1043,992],{"class":684},[533,1045,1046,1048,1051,1053,1055,1057,1060,1062],{"class":535,"line":724},[533,1047,1031],{"class":684},[533,1049,1050],{"class":539},"generatedAt",[533,1052,984],{"class":684},[533,1054,685],{"class":684},[533,1056,1006],{"class":684},[533,1058,1059],{"class":543},"2026-07-25T18:42:10.114Z",[533,1061,984],{"class":684},[533,1063,992],{"class":684},[533,1065,1066,1068,1071,1073,1075,1077,1080,1082],{"class":535,"line":732},[533,1067,1031],{"class":684},[533,1069,1070],{"class":539},"framework",[533,1072,984],{"class":684},[533,1074,685],{"class":684},[533,1076,1006],{"class":684},[533,1078,1079],{"class":543},"nuxt",[533,1081,984],{"class":684},[533,1083,992],{"class":684},[533,1085,1086,1088,1091,1093,1095,1097,1100,1102],{"class":535,"line":743},[533,1087,1031],{"class":684},[533,1089,1090],{"class":539},"projectName",[533,1092,984],{"class":684},[533,1094,685],{"class":684},[533,1096,1006],{"class":684},[533,1098,1099],{"class":543},"evlog-playground",[533,1101,984],{"class":684},[533,1103,992],{"class":684},[533,1105,1106,1108,1111,1113,1115,1118],{"class":535,"line":751},[533,1107,1031],{"class":684},[533,1109,1110],{"class":539},"score",[533,1112,984],{"class":684},[533,1114,685],{"class":684},[533,1116,1117],{"class":550}," 76",[533,1119,992],{"class":684},[533,1121,1122,1124,1127,1129,1131],{"class":535,"line":765},[533,1123,1031],{"class":684},[533,1125,1126],{"class":539},"routes",[533,1128,984],{"class":684},[533,1130,685],{"class":684},[533,1132,1133],{"class":684}," []\n",[533,1135,1136],{"class":535,"line":777},[533,1137,1138],{"class":684},"  },\n",[533,1140,1141,1143,1146,1148,1150,1153,1155,1158,1160,1162,1165,1168,1170,1173,1175,1177,1179,1181,1183,1186,1188,1190,1193,1195,1197,1200,1202,1204,1207,1209,1211,1214,1216,1218,1220],{"class":535,"line":785},[533,1142,977],{"class":684},[533,1144,1145],{"class":980},"summary",[533,1147,984],{"class":684},[533,1149,685],{"class":684},[533,1151,1152],{"class":684}," {",[533,1154,1006],{"class":684},[533,1156,1157],{"class":539},"instrumented",[533,1159,984],{"class":684},[533,1161,685],{"class":684},[533,1163,1164],{"class":550}," 19",[533,1166,1167],{"class":684},",",[533,1169,1006],{"class":684},[533,1171,1172],{"class":539},"partial",[533,1174,984],{"class":684},[533,1176,685],{"class":684},[533,1178,989],{"class":550},[533,1180,1167],{"class":684},[533,1182,1006],{"class":684},[533,1184,1185],{"class":539},"dark",[533,1187,984],{"class":684},[533,1189,685],{"class":684},[533,1191,1192],{"class":550}," 8",[533,1194,1167],{"class":684},[533,1196,1006],{"class":684},[533,1198,1199],{"class":539},"exempt",[533,1201,984],{"class":684},[533,1203,685],{"class":684},[533,1205,1206],{"class":550}," 0",[533,1208,1167],{"class":684},[533,1210,1006],{"class":684},[533,1212,1213],{"class":539},"suppressedChecks",[533,1215,984],{"class":684},[533,1217,685],{"class":684},[533,1219,1206],{"class":550},[533,1221,1222],{"class":684}," },\n",[533,1224,1225,1227,1230,1232,1234,1236,1239],{"class":535,"line":796},[533,1226,977],{"class":684},[533,1228,1229],{"class":980},"mapPath",[533,1231,984],{"class":684},[533,1233,685],{"class":684},[533,1235,1006],{"class":684},[533,1237,1238],{"class":543},"\u002Fpath\u002Fto\u002Fapp\u002Fevlog.map.json",[533,1240,1241],{"class":684},"\"\n",[533,1243,1245],{"class":535,"line":1244},14,[533,1246,1247],{"class":684},"}\n",[507,1249,1250,1252,1253,1256,1257,1259,1260,1263],{},[518,1251,1229],{}," is ",[518,1254,1255],{},"null"," under ",[518,1258,811],{},". Each entry in ",[518,1261,1262],{},"map.routes"," looks like this:",[1265,1266,1267],"code-collapse",{},[523,1268,1271],{"className":962,"code":1269,"filename":1270,"language":965,"meta":529,"style":529},"{\n  \"framework\": \"nuxt\",\n  \"kind\": \"api\",\n  \"method\": \"POST\",\n  \"path\": \"\u002Fapi\u002Fauth\u002Flogin\",\n  \"file\": \"server\u002Fapi\u002Fauth\u002Flogin.post.ts\",\n  \"handler\": { \"line\": 1, \"column\": 0 },\n  \"id\": \"337325358269\",\n  \"checks\": {\n    \"wide-event\": { \"status\": \"pass\" },\n    \"context\": { \"status\": \"pass\" },\n    \"structured-errors\": { \"status\": \"n\u002Fa\" },\n    \"error-handling\": { \"status\": \"n\u002Fa\" },\n    \"audit\": {\n      \"status\": \"fail\",\n      \"message\": \"has logger + context but no log.audit() — sensitive route needs audit trail\",\n      \"evidence\": { \"file\": \"server\u002Fapi\u002Fauth\u002Flogin.post.ts\", \"line\": 1 }\n    }\n  },\n  \"suggestions\": {},\n  \"sensitivity\": { \"level\": \"high\", \"reasons\": [\"auth: path says \\\"auth\\\"\"] },\n  \"score\": 75\n}\n","One entry point",[518,1272,1273,1277,1295,1315,1335,1355,1375,1413,1433,1446,1477,1506,1536,1565,1578,1599,1620,1663,1669,1674,1689,1754,1768],{"__ignoreMap":529},[533,1274,1275],{"class":535,"line":536},[533,1276,972],{"class":684},[533,1278,1279,1281,1283,1285,1287,1289,1291,1293],{"class":535,"line":691},[533,1280,977],{"class":684},[533,1282,1070],{"class":980},[533,1284,984],{"class":684},[533,1286,685],{"class":684},[533,1288,1006],{"class":684},[533,1290,1079],{"class":543},[533,1292,984],{"class":684},[533,1294,992],{"class":684},[533,1296,1297,1299,1302,1304,1306,1308,1311,1313],{"class":535,"line":698},[533,1298,977],{"class":684},[533,1300,1301],{"class":980},"kind",[533,1303,984],{"class":684},[533,1305,685],{"class":684},[533,1307,1006],{"class":684},[533,1309,1310],{"class":543},"api",[533,1312,984],{"class":684},[533,1314,992],{"class":684},[533,1316,1317,1319,1322,1324,1326,1328,1331,1333],{"class":535,"line":710},[533,1318,977],{"class":684},[533,1320,1321],{"class":980},"method",[533,1323,984],{"class":684},[533,1325,685],{"class":684},[533,1327,1006],{"class":684},[533,1329,1330],{"class":543},"POST",[533,1332,984],{"class":684},[533,1334,992],{"class":684},[533,1336,1337,1339,1342,1344,1346,1348,1351,1353],{"class":535,"line":715},[533,1338,977],{"class":684},[533,1340,1341],{"class":980},"path",[533,1343,984],{"class":684},[533,1345,685],{"class":684},[533,1347,1006],{"class":684},[533,1349,1350],{"class":543},"\u002Fapi\u002Fauth\u002Flogin",[533,1352,984],{"class":684},[533,1354,992],{"class":684},[533,1356,1357,1359,1362,1364,1366,1368,1371,1373],{"class":535,"line":724},[533,1358,977],{"class":684},[533,1360,1361],{"class":980},"file",[533,1363,984],{"class":684},[533,1365,685],{"class":684},[533,1367,1006],{"class":684},[533,1369,1370],{"class":543},"server\u002Fapi\u002Fauth\u002Flogin.post.ts",[533,1372,984],{"class":684},[533,1374,992],{"class":684},[533,1376,1377,1379,1382,1384,1386,1388,1390,1392,1394,1396,1398,1400,1402,1405,1407,1409,1411],{"class":535,"line":732},[533,1378,977],{"class":684},[533,1380,1381],{"class":980},"handler",[533,1383,984],{"class":684},[533,1385,685],{"class":684},[533,1387,1152],{"class":684},[533,1389,1006],{"class":684},[533,1391,535],{"class":539},[533,1393,984],{"class":684},[533,1395,685],{"class":684},[533,1397,1041],{"class":550},[533,1399,1167],{"class":684},[533,1401,1006],{"class":684},[533,1403,1404],{"class":539},"column",[533,1406,984],{"class":684},[533,1408,685],{"class":684},[533,1410,1206],{"class":550},[533,1412,1222],{"class":684},[533,1414,1415,1417,1420,1422,1424,1426,1429,1431],{"class":535,"line":743},[533,1416,977],{"class":684},[533,1418,1419],{"class":980},"id",[533,1421,984],{"class":684},[533,1423,685],{"class":684},[533,1425,1006],{"class":684},[533,1427,1428],{"class":543},"337325358269",[533,1430,984],{"class":684},[533,1432,992],{"class":684},[533,1434,1435,1437,1440,1442,1444],{"class":535,"line":751},[533,1436,977],{"class":684},[533,1438,1439],{"class":980},"checks",[533,1441,984],{"class":684},[533,1443,685],{"class":684},[533,1445,1026],{"class":684},[533,1447,1448,1450,1453,1455,1457,1459,1461,1464,1466,1468,1470,1473,1475],{"class":535,"line":765},[533,1449,1031],{"class":684},[533,1451,1452],{"class":539},"wide-event",[533,1454,984],{"class":684},[533,1456,685],{"class":684},[533,1458,1152],{"class":684},[533,1460,1006],{"class":684},[533,1462,1463],{"class":550},"status",[533,1465,984],{"class":684},[533,1467,685],{"class":684},[533,1469,1006],{"class":684},[533,1471,1472],{"class":543},"pass",[533,1474,984],{"class":684},[533,1476,1222],{"class":684},[533,1478,1479,1481,1484,1486,1488,1490,1492,1494,1496,1498,1500,1502,1504],{"class":535,"line":777},[533,1480,1031],{"class":684},[533,1482,1483],{"class":539},"context",[533,1485,984],{"class":684},[533,1487,685],{"class":684},[533,1489,1152],{"class":684},[533,1491,1006],{"class":684},[533,1493,1463],{"class":550},[533,1495,984],{"class":684},[533,1497,685],{"class":684},[533,1499,1006],{"class":684},[533,1501,1472],{"class":543},[533,1503,984],{"class":684},[533,1505,1222],{"class":684},[533,1507,1508,1510,1513,1515,1517,1519,1521,1523,1525,1527,1529,1532,1534],{"class":535,"line":785},[533,1509,1031],{"class":684},[533,1511,1512],{"class":539},"structured-errors",[533,1514,984],{"class":684},[533,1516,685],{"class":684},[533,1518,1152],{"class":684},[533,1520,1006],{"class":684},[533,1522,1463],{"class":550},[533,1524,984],{"class":684},[533,1526,685],{"class":684},[533,1528,1006],{"class":684},[533,1530,1531],{"class":543},"n\u002Fa",[533,1533,984],{"class":684},[533,1535,1222],{"class":684},[533,1537,1538,1540,1543,1545,1547,1549,1551,1553,1555,1557,1559,1561,1563],{"class":535,"line":796},[533,1539,1031],{"class":684},[533,1541,1542],{"class":539},"error-handling",[533,1544,984],{"class":684},[533,1546,685],{"class":684},[533,1548,1152],{"class":684},[533,1550,1006],{"class":684},[533,1552,1463],{"class":550},[533,1554,984],{"class":684},[533,1556,685],{"class":684},[533,1558,1006],{"class":684},[533,1560,1531],{"class":543},[533,1562,984],{"class":684},[533,1564,1222],{"class":684},[533,1566,1567,1569,1572,1574,1576],{"class":535,"line":1244},[533,1568,1031],{"class":684},[533,1570,1571],{"class":539},"audit",[533,1573,984],{"class":684},[533,1575,685],{"class":684},[533,1577,1026],{"class":684},[533,1579,1581,1584,1586,1588,1590,1592,1595,1597],{"class":535,"line":1580},15,[533,1582,1583],{"class":684},"      \"",[533,1585,1463],{"class":550},[533,1587,984],{"class":684},[533,1589,685],{"class":684},[533,1591,1006],{"class":684},[533,1593,1594],{"class":543},"fail",[533,1596,984],{"class":684},[533,1598,992],{"class":684},[533,1600,1602,1604,1607,1609,1611,1613,1616,1618],{"class":535,"line":1601},16,[533,1603,1583],{"class":684},[533,1605,1606],{"class":550},"message",[533,1608,984],{"class":684},[533,1610,685],{"class":684},[533,1612,1006],{"class":684},[533,1614,1615],{"class":543},"has logger + context but no log.audit() — sensitive route needs audit trail",[533,1617,984],{"class":684},[533,1619,992],{"class":684},[533,1621,1623,1625,1628,1630,1632,1634,1636,1638,1640,1642,1644,1646,1648,1650,1652,1654,1656,1658,1660],{"class":535,"line":1622},17,[533,1624,1583],{"class":684},[533,1626,1627],{"class":550},"evidence",[533,1629,984],{"class":684},[533,1631,685],{"class":684},[533,1633,1152],{"class":684},[533,1635,1006],{"class":684},[533,1637,1361],{"class":680},[533,1639,984],{"class":684},[533,1641,685],{"class":684},[533,1643,1006],{"class":684},[533,1645,1370],{"class":543},[533,1647,984],{"class":684},[533,1649,1167],{"class":684},[533,1651,1006],{"class":684},[533,1653,535],{"class":680},[533,1655,984],{"class":684},[533,1657,685],{"class":684},[533,1659,1041],{"class":550},[533,1661,1662],{"class":684}," }\n",[533,1664,1666],{"class":535,"line":1665},18,[533,1667,1668],{"class":684},"    }\n",[533,1670,1672],{"class":535,"line":1671},19,[533,1673,1138],{"class":684},[533,1675,1677,1679,1682,1684,1686],{"class":535,"line":1676},20,[533,1678,977],{"class":684},[533,1680,1681],{"class":980},"suggestions",[533,1683,984],{"class":684},[533,1685,685],{"class":684},[533,1687,1688],{"class":684}," {},\n",[533,1690,1692,1694,1697,1699,1701,1703,1705,1708,1710,1712,1714,1717,1719,1721,1723,1726,1728,1730,1733,1735,1738,1742,1745,1747,1749,1752],{"class":535,"line":1691},21,[533,1693,977],{"class":684},[533,1695,1696],{"class":980},"sensitivity",[533,1698,984],{"class":684},[533,1700,685],{"class":684},[533,1702,1152],{"class":684},[533,1704,1006],{"class":684},[533,1706,1707],{"class":539},"level",[533,1709,984],{"class":684},[533,1711,685],{"class":684},[533,1713,1006],{"class":684},[533,1715,1716],{"class":543},"high",[533,1718,984],{"class":684},[533,1720,1167],{"class":684},[533,1722,1006],{"class":684},[533,1724,1725],{"class":539},"reasons",[533,1727,984],{"class":684},[533,1729,685],{"class":684},[533,1731,1732],{"class":684}," [",[533,1734,984],{"class":684},[533,1736,1737],{"class":543},"auth: path says ",[533,1739,1741],{"class":1740},"sTEyZ","\\\"",[533,1743,1744],{"class":543},"auth",[533,1746,1741],{"class":1740},[533,1748,984],{"class":684},[533,1750,1751],{"class":684},"]",[533,1753,1222],{"class":684},[533,1755,1757,1759,1761,1763,1765],{"class":535,"line":1756},22,[533,1758,977],{"class":684},[533,1760,1110],{"class":980},[533,1762,984],{"class":684},[533,1764,685],{"class":684},[533,1766,1767],{"class":550}," 75\n",[533,1769,1771],{"class":535,"line":1770},23,[533,1772,1247],{"class":684},[507,1774,1775,1777,1778,1780],{},[518,1776,1439],{}," holds requirements, ",[518,1779,1681],{}," holds opportunities. They are separate keys precisely so a consumer — or a CI script — can never mistake a suggestion for a failure. Rule ids are stable: the registry and the published id union are checked against each other at build time, so a release cannot silently change what you receive.",[507,1782,1783,1784,1252,1788,1790,1791,1794,1795,1797],{},"A check somebody ",[582,1785,1787],{"href":1786},"\u002Fcli\u002Frules#disabling-a-check","disabled with a comment",[518,1789,1531],{}," with ",[518,1792,1793],{},"\"suppressed\": true",", and its ",[518,1796,1627],{}," points at the comment rather than at the handler:",[523,1799,1802],{"className":962,"code":1800,"filename":1801,"language":965,"meta":529,"style":529},"\"wide-event\": {\n  \"status\": \"n\u002Fa\",\n  \"suppressed\": true,\n  \"message\": \"disabled at line 1 — liveness probe, deliberately silent\",\n  \"evidence\": { \"file\": \"server\u002Fapi\u002Fhealth.get.ts\", \"line\": 1 }\n}\n","A disabled check",[518,1803,1804,1817,1835,1849,1868,1909],{"__ignoreMap":529},[533,1805,1806,1808,1810,1812,1815],{"class":535,"line":536},[533,1807,984],{"class":684},[533,1809,1452],{"class":543},[533,1811,984],{"class":684},[533,1813,1814],{"class":1740},": ",[533,1816,972],{"class":684},[533,1818,1819,1821,1823,1825,1827,1829,1831,1833],{"class":535,"line":691},[533,1820,977],{"class":684},[533,1822,1463],{"class":980},[533,1824,984],{"class":684},[533,1826,685],{"class":684},[533,1828,1006],{"class":684},[533,1830,1531],{"class":543},[533,1832,984],{"class":684},[533,1834,992],{"class":684},[533,1836,1837,1839,1842,1844,1846],{"class":535,"line":698},[533,1838,977],{"class":684},[533,1840,1841],{"class":980},"suppressed",[533,1843,984],{"class":684},[533,1845,685],{"class":684},[533,1847,1848],{"class":684}," true,\n",[533,1850,1851,1853,1855,1857,1859,1861,1864,1866],{"class":535,"line":710},[533,1852,977],{"class":684},[533,1854,1606],{"class":980},[533,1856,984],{"class":684},[533,1858,685],{"class":684},[533,1860,1006],{"class":684},[533,1862,1863],{"class":543},"disabled at line 1 — liveness probe, deliberately silent",[533,1865,984],{"class":684},[533,1867,992],{"class":684},[533,1869,1870,1872,1874,1876,1878,1880,1882,1884,1886,1888,1890,1893,1895,1897,1899,1901,1903,1905,1907],{"class":535,"line":715},[533,1871,977],{"class":684},[533,1873,1627],{"class":980},[533,1875,984],{"class":684},[533,1877,685],{"class":684},[533,1879,1152],{"class":684},[533,1881,1006],{"class":684},[533,1883,1361],{"class":539},[533,1885,984],{"class":684},[533,1887,685],{"class":684},[533,1889,1006],{"class":684},[533,1891,1892],{"class":543},"server\u002Fapi\u002Fhealth.get.ts",[533,1894,984],{"class":684},[533,1896,1167],{"class":684},[533,1898,1006],{"class":684},[533,1900,535],{"class":539},[533,1902,984],{"class":684},[533,1904,685],{"class":684},[533,1906,1041],{"class":550},[533,1908,1662],{"class":684},[533,1910,1911],{"class":535,"line":724},[533,1912,1247],{"class":684},[507,1914,1915,1918],{},[518,1916,1917],{},"summary.suppressedChecks"," is the project total. It is the number to watch alongside the score: the gate only measures what the rules were allowed to look at.",[818,1920,381],{"id":1921},"recipes",[523,1923,1925],{"className":525,"code":1924,"filename":527,"language":528,"meta":529,"style":529},"# the score, for a badge or a comment\nevlog map --json --no-write | jq '.map.score'\n\n# every entry point with no event at all\nevlog map --json --no-write \\\n  | jq -r '.map.routes[] | select(.checks[\"wide-event\"].status == \"fail\") | .file'\n\n# every failure as file:line — message\nevlog map --json --no-write \\\n  | jq -r '.map.routes[].checks | to_entries[] | select(.value.status == \"fail\")\n           | \"\\(.value.evidence.file):\\(.value.evidence.line) — \\(.value.message)\"'\n\n# fail a script when anything is dark\ntest \"$(evlog map --json --no-write | jq '.summary.dark')\" -eq 0\n\n# how much of the score is disabled checks\nevlog map --json --no-write | jq '.summary.suppressedChecks'\n",[518,1926,1927,1932,1952,1956,1961,1974,1991,1995,2000,2012,2025,2032,2036,2041,2074,2078,2083],{"__ignoreMap":529},[533,1928,1929],{"class":535,"line":536},[533,1930,1931],{"class":893},"# the score, for a badge or a comment\n",[533,1933,1934,1936,1938,1940,1942,1944,1946,1948,1950],{"class":535,"line":691},[533,1935,540],{"class":539},[533,1937,544],{"class":543},[533,1939,903],{"class":543},[533,1941,906],{"class":543},[533,1943,909],{"class":684},[533,1945,912],{"class":539},[533,1947,915],{"class":684},[533,1949,918],{"class":543},[533,1951,921],{"class":684},[533,1953,1954],{"class":535,"line":698},[533,1955,695],{"emptyLinePlaceholder":694},[533,1957,1958],{"class":535,"line":710},[533,1959,1960],{"class":893},"# every entry point with no event at all\n",[533,1962,1963,1965,1967,1969,1971],{"class":535,"line":715},[533,1964,540],{"class":539},[533,1966,544],{"class":543},[533,1968,903],{"class":543},[533,1970,906],{"class":543},[533,1972,1973],{"class":1740}," \\\n",[533,1975,1976,1979,1981,1984,1986,1989],{"class":535,"line":724},[533,1977,1978],{"class":684},"  |",[533,1980,912],{"class":539},[533,1982,1983],{"class":543}," -r",[533,1985,915],{"class":684},[533,1987,1988],{"class":543},".map.routes[] | select(.checks[\"wide-event\"].status == \"fail\") | .file",[533,1990,921],{"class":684},[533,1992,1993],{"class":535,"line":732},[533,1994,695],{"emptyLinePlaceholder":694},[533,1996,1997],{"class":535,"line":743},[533,1998,1999],{"class":893},"# every failure as file:line — message\n",[533,2001,2002,2004,2006,2008,2010],{"class":535,"line":751},[533,2003,540],{"class":539},[533,2005,544],{"class":543},[533,2007,903],{"class":543},[533,2009,906],{"class":543},[533,2011,1973],{"class":1740},[533,2013,2014,2016,2018,2020,2022],{"class":535,"line":765},[533,2015,1978],{"class":684},[533,2017,912],{"class":539},[533,2019,1983],{"class":543},[533,2021,915],{"class":684},[533,2023,2024],{"class":543},".map.routes[].checks | to_entries[] | select(.value.status == \"fail\")\n",[533,2026,2027,2030],{"class":535,"line":777},[533,2028,2029],{"class":543},"           | \"\\(.value.evidence.file):\\(.value.evidence.line) — \\(.value.message)\"",[533,2031,921],{"class":684},[533,2033,2034],{"class":535,"line":785},[533,2035,695],{"emptyLinePlaceholder":694},[533,2037,2038],{"class":535,"line":796},[533,2039,2040],{"class":893},"# fail a script when anything is dark\n",[533,2042,2043,2047,2050,2052,2055,2058,2060,2062,2065,2068,2071],{"class":535,"line":1244},[533,2044,2046],{"class":2045},"s2Zo4","test",[533,2048,2049],{"class":684}," \"$(",[533,2051,540],{"class":539},[533,2053,2054],{"class":543}," map --json --no-write ",[533,2056,2057],{"class":684},"|",[533,2059,912],{"class":539},[533,2061,915],{"class":684},[533,2063,2064],{"class":543},".summary.dark",[533,2066,2067],{"class":684},"')\"",[533,2069,2070],{"class":543}," -eq",[533,2072,2073],{"class":550}," 0\n",[533,2075,2076],{"class":535,"line":1580},[533,2077,695],{"emptyLinePlaceholder":694},[533,2079,2080],{"class":535,"line":1601},[533,2081,2082],{"class":893},"# how much of the score is disabled checks\n",[533,2084,2085,2087,2089,2091,2093,2095,2097,2099,2102],{"class":535,"line":1622},[533,2086,540],{"class":539},[533,2088,544],{"class":543},[533,2090,903],{"class":543},[533,2092,906],{"class":543},[533,2094,909],{"class":684},[533,2096,912],{"class":539},[533,2098,915],{"class":684},[533,2100,2101],{"class":543},".summary.suppressedChecks",[533,2103,921],{"class":684},[511,2105,2107],{"id":2106},"the-map-file","The map file",[507,2109,2110,2111,2113,2114,2116,2117,2119],{},"Unless you pass ",[518,2112,811],{},", every run writes ",[518,2115,815],{}," to the project root. It holds the same data as ",[518,2118,937],{}," and is a build artifact, so ignore it:",[523,2121,2124],{"className":525,"code":2122,"filename":2123,"language":528,"meta":529,"style":529},"evlog.map.json\n",".gitignore",[518,2125,2126],{"__ignoreMap":529},[533,2127,2128],{"class":535,"line":536},[533,2129,2122],{"class":539},[507,2131,2132,2133,2135],{},"Track it instead if you want the diff in review — a pull request then shows exactly which entry points changed class, which is a useful thing to argue about. Just expect the file to churn on every run, since ",[518,2134,1050],{}," changes each time.",[511,2137,2139],{"id":2138},"monorepos","Monorepos",[507,2141,2142,2145],{},[518,2143,2144],{},"evlog map"," scans one app at a time. Gate each one:",[523,2147,2149],{"className":670,"code":2148,"filename":672,"language":673,"meta":529,"style":529},"jobs:\n  map:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        app: [apps\u002Fweb, apps\u002Fadmin]\n    steps:\n      - uses: actions\u002Fcheckout@v5\n      - uses: actions\u002Fsetup-node@v5\n        with:\n          node-version: 22\n      - run: npx @evlog\u002Fcli map --cwd ${{ matrix.app }} --min-score 80 --no-write\n",[518,2150,2151,2157,2163,2171,2178,2185,2205,2211,2221,2231,2237,2245],{"__ignoreMap":529},[533,2152,2153,2155],{"class":535,"line":536},[533,2154,718],{"class":680},[533,2156,721],{"class":684},[533,2158,2159,2161],{"class":535,"line":691},[533,2160,727],{"class":680},[533,2162,721],{"class":684},[533,2164,2165,2167,2169],{"class":535,"line":698},[533,2166,735],{"class":680},[533,2168,685],{"class":684},[533,2170,740],{"class":543},[533,2172,2173,2176],{"class":535,"line":710},[533,2174,2175],{"class":680},"    strategy",[533,2177,721],{"class":684},[533,2179,2180,2183],{"class":535,"line":715},[533,2181,2182],{"class":680},"      matrix",[533,2184,721],{"class":684},[533,2186,2187,2190,2192,2194,2197,2199,2202],{"class":535,"line":724},[533,2188,2189],{"class":680},"        app",[533,2191,685],{"class":684},[533,2193,1732],{"class":684},[533,2195,2196],{"class":543},"apps\u002Fweb",[533,2198,1167],{"class":684},[533,2200,2201],{"class":543}," apps\u002Fadmin",[533,2203,2204],{"class":684},"]\n",[533,2206,2207,2209],{"class":535,"line":732},[533,2208,746],{"class":680},[533,2210,721],{"class":684},[533,2212,2213,2215,2217,2219],{"class":535,"line":743},[533,2214,754],{"class":684},[533,2216,757],{"class":680},[533,2218,685],{"class":684},[533,2220,762],{"class":543},[533,2222,2223,2225,2227,2229],{"class":535,"line":751},[533,2224,754],{"class":684},[533,2226,757],{"class":680},[533,2228,685],{"class":684},[533,2230,774],{"class":543},[533,2232,2233,2235],{"class":535,"line":765},[533,2234,780],{"class":680},[533,2236,721],{"class":684},[533,2238,2239,2241,2243],{"class":535,"line":777},[533,2240,788],{"class":680},[533,2242,685],{"class":684},[533,2244,793],{"class":550},[533,2246,2247,2249,2251,2253],{"class":535,"line":785},[533,2248,754],{"class":684},[533,2250,801],{"class":680},[533,2252,685],{"class":684},[533,2254,2255],{"class":543}," npx @evlog\u002Fcli map --cwd ${{ matrix.app }} --min-score 80 --no-write\n",[507,2257,2258],{},"Different apps can carry different thresholds, which is usually what you want: the app that takes payments should be held higher than the marketing site.",[511,2260,2262],{"id":2261},"next","Next",[2264,2265,2266,2272],"ul",{},[2267,2268,2269,2271],"li",{},[582,2270,94],{"href":95}," — what a failing check means and how to fix it",[2267,2273,2274,2276],{},[582,2275,99],{"href":100}," — how the number you are gating on is calculated",[2278,2279,2280],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":529,"searchDepth":691,"depth":691,"links":2282},[2283,2284,2285,2289,2292,2293,2294],{"id":513,"depth":691,"text":514},{"id":589,"depth":691,"text":590},{"id":666,"depth":691,"text":667,"children":2286},[2287,2288],{"id":820,"depth":698,"text":821},{"id":879,"depth":698,"text":880},{"id":931,"depth":691,"text":932,"children":2290},[2291],{"id":1921,"depth":698,"text":381},{"id":2106,"depth":691,"text":2107},{"id":2138,"depth":691,"text":2139},{"id":2261,"depth":691,"text":2262},"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.","md",[2298,2300],{"label":99,"icon":102,"to":100,"color":580,"variant":2299},"subtle",{"label":94,"icon":97,"to":95,"color":580,"variant":2299},{},{"title":104,"icon":107},{"title":502,"description":2295},"TLDD-iSi6nEFnLbXFAax6RWY7SMLLHdUsWfUOXn_13s",[2306,2308],{"title":99,"path":100,"stem":101,"description":2307,"icon":102,"children":-1},"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.",{"title":109,"path":110,"stem":111,"description":2309,"icon":112,"children":-1},"Diagnose an evlog setup — Node version, project resolution, the installed evlog version, the detected framework, and whether local logs are being written.",1785016756007]