[{"data":1,"prerenderedAt":2626},["ShallowReactive",2],{"navigation_docs":3,"-cli-ci":505,"-cli-ci-surround":2621},[4,30,80,123,288,420,475],{"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,118],{"title":36,"path":86,"stem":87,"icon":44},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":89,"path":90,"stem":91,"icon":92},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":94,"path":95,"stem":96,"icon":97},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":99,"path":100,"stem":101,"icon":102},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":104,"path":105,"stem":106,"icon":107},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":109,"path":110,"stem":111,"icon":112},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":114,"path":115,"stem":116,"icon":117},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":119,"path":120,"stem":121,"icon":122},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":124,"path":125,"stem":126,"children":127,"page":29},"Integrate","\u002Fintegrate","4.integrate",[128,132,200],{"title":36,"path":129,"stem":130,"icon":131},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":133,"path":134,"stem":135,"children":136,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[137,140,180],{"title":36,"path":138,"stem":139,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":141,"path":142,"stem":143,"children":144,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[145,150,155,160,165,170,175],{"title":146,"path":147,"stem":148,"icon":149},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":151,"path":152,"stem":153,"icon":154},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","4.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":156,"path":157,"stem":158,"icon":159},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":161,"path":162,"stem":163,"icon":164},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":166,"path":167,"stem":168,"icon":169},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":171,"path":172,"stem":173,"icon":174},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":176,"path":177,"stem":178,"icon":179},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","4.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":181,"path":182,"stem":183,"children":184,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[185,190,195],{"title":186,"path":187,"stem":188,"icon":189},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":191,"path":192,"stem":193,"icon":194},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":196,"path":197,"stem":198,"icon":199},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":201,"path":202,"stem":203,"children":204,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[205,209,214,219,224,229,234,239,244,249,254,259,264,269,273,278,283],{"title":36,"path":206,"stem":207,"icon":208},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":210,"path":211,"stem":212,"icon":213},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":215,"path":216,"stem":217,"icon":218},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":220,"path":221,"stem":222,"icon":223},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":225,"path":226,"stem":227,"icon":228},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":230,"path":231,"stem":232,"icon":233},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":235,"path":236,"stem":237,"icon":238},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":240,"path":241,"stem":242,"icon":243},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":245,"path":246,"stem":247,"icon":248},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":250,"path":251,"stem":252,"icon":253},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":255,"path":256,"stem":257,"icon":258},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":260,"path":261,"stem":262,"icon":263},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":265,"path":266,"stem":267,"icon":268},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":270,"path":271,"stem":272,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":274,"path":275,"stem":276,"icon":277},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":279,"path":280,"stem":281,"icon":282},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":284,"path":285,"stem":286,"icon":287},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":289,"path":290,"stem":291,"children":292,"page":29},"Use Cases","\u002Fuse-cases","5.use-cases",[293,296,301,330,357,389,410,415],{"title":36,"path":294,"stem":295,"icon":102},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":297,"path":298,"stem":299,"icon":300},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":302,"icon":303,"path":304,"stem":305,"children":306,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[307,310,315,320,325],{"title":36,"path":308,"stem":309,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":311,"path":312,"stem":313,"icon":314},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":316,"path":317,"stem":318,"icon":319},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":321,"path":322,"stem":323,"icon":324},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":326,"path":327,"stem":328,"icon":329},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":331,"icon":332,"path":333,"stem":334,"children":335,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[336,339,344,349,353],{"title":36,"path":337,"stem":338,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":340,"path":341,"stem":342,"icon":343},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":345,"path":346,"stem":347,"icon":348},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":350,"path":351,"stem":352,"icon":300},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":354,"path":355,"stem":356,"icon":107},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":358,"icon":359,"path":360,"stem":361,"children":362,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[363,366,371,376,381,385],{"title":36,"path":364,"stem":365,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":367,"path":368,"stem":369,"icon":370},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":372,"path":373,"stem":374,"icon":375},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":377,"path":378,"stem":379,"icon":380},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":382,"path":383,"stem":384,"icon":359},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":386,"path":387,"stem":388,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":326,"icon":107,"path":390,"stem":391,"children":392,"page":29},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[393,396,401,406],{"title":36,"path":394,"stem":395,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":397,"path":398,"stem":399,"icon":400},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":402,"path":403,"stem":404,"icon":405},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":407,"path":408,"stem":409,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":411,"path":412,"stem":413,"icon":414},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":416,"path":417,"stem":418,"icon":419},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":421,"path":422,"stem":423,"children":424,"page":29},"Extend","\u002Fextend","6.extend",[425,429,434,439,444,448,452,456,460,465,470],{"title":36,"path":426,"stem":427,"icon":428},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":430,"path":431,"stem":432,"icon":433},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":435,"path":436,"stem":437,"icon":438},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":440,"path":441,"stem":442,"icon":443},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":386,"path":445,"stem":446,"icon":447},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":449,"path":450,"stem":451,"icon":428},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":453,"path":454,"stem":455,"icon":414},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":457,"path":458,"stem":459,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":461,"path":462,"stem":463,"icon":464},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":466,"path":467,"stem":468,"icon":469},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":471,"path":472,"stem":473,"icon":474},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":407,"path":476,"stem":477,"children":478,"page":29},"\u002Freference","7.reference",[479,484,487,492,496,501],{"title":480,"path":481,"stem":482,"icon":483},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":354,"path":485,"stem":486,"icon":107},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":488,"path":489,"stem":490,"icon":491},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":493,"path":494,"stem":495,"icon":359},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":497,"path":498,"stem":499,"icon":500},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":502,"path":503,"stem":504,"icon":414},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"id":506,"title":507,"body":508,"description":2611,"extension":2612,"links":2613,"meta":2617,"navigation":2618,"path":110,"seo":2619,"stem":111,"__hash__":2620},"docs\u002F3.cli\u002F5.ci.md","evlog map in CI",{"type":509,"value":510,"toc":2591},"minimark",[511,515,520,527,557,566,573,576,579,582,585,595,602,616,630,637,644,647,658,663,753,756,762,766,778,805,811,859,866,870,877,908,918,922,975,991,995,1122,1131,1135,1138,1141,1159,1185,1188,1192,1195,1232,1238,1242,1248,1269,1556,1572,2079,2087,2102,2217,2223,2226,2408,2412,2424,2434,2446,2450,2456,2566,2569,2573,2587],[512,513,514],"p",{},"A score you look at once is a nice afternoon. A score in CI is what stops the next handler from shipping dark.",[516,517,519],"h2",{"id":518},"the-gate","The gate",[512,521,522,526],{},[523,524,525],"code",{},"--min-score \u003Cn>"," prints an explicit verdict and exits 1 when the project is below the threshold:",[528,529,535],"pre",{"className":530,"code":531,"filename":532,"language":533,"meta":534,"style":534},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","evlog map --min-score 80\n","Terminal","bash","",[523,536,537],{"__ignoreMap":534},[538,539,542,546,550,553],"span",{"class":540,"line":541},"line",1,[538,543,545],{"class":544},"sBMFI","evlog",[538,547,549],{"class":548},"sfazB"," map",[538,551,552],{"class":548}," --min-score",[538,554,556],{"class":555},"sbssI"," 80\n",[528,558,564],{"className":559,"code":561,"filename":562,"language":563,"meta":534},[560],"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",[523,565,561],{"__ignoreMap":534},[528,567,571],{"className":568,"code":569,"filename":570,"language":563,"meta":534},[560]," GATE  score 76 meets --min-score 70 — exit code 0\n","At or above it",[523,572,569],{"__ignoreMap":534},[512,574,575],{},"The full report is printed either way, so a failed job tells you what to fix without a second run.",[512,577,578],{},"The threshold has to be a whole number between 0 and 100. Anything else — a typo, a stray unit, an unexpanded shell variable — stops the command rather than being read as \"no gate\", because a gate that quietly disables itself reports success for a bar nobody checked.",[512,580,581],{},"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:",[583,584],"map-pr-gate",{},[586,587,589,594],"callout",{"color":588,"icon":359},"neutral",[590,591,593],"a",{"href":592},"\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.",[516,596,598,599],{"id":597},"the-ratchet-baseline","The ratchet: ",[523,600,601],{},"--baseline",[512,603,604,607,608,610,611,615],{},[523,605,606],{},"--min-score"," asks \"is this app good enough\". ",[523,609,601],{}," asks the other question: ",[612,613,614],"strong",{},"did this pull request make it worse",".",[528,617,619],{"className":530,"code":618,"filename":532,"language":533,"meta":534,"style":534},"evlog map --baseline\n",[523,620,621],{"__ignoreMap":534},[538,622,623,625,627],{"class":540,"line":541},[538,624,545],{"class":544},[538,626,549],{"class":548},[538,628,629],{"class":548}," --baseline\n",[512,631,632,633,636],{},"It compares the fresh scan against the ",[523,634,635],{},"evlog.map.json"," you committed, per entry point and per check:",[528,638,642],{"className":639,"code":640,"filename":641,"language":563,"meta":534},[560]," BASELINE  score 56 → 44 (-12) vs evlog.map.json\n\nREGRESSED\n✗ POST \u002Fapi\u002Fcheckout — useLogger no longer passes\n   server\u002Fapi\u002Fcheckout.post.ts · evlog.dev\u002Flearn\u002Fwide-events\n✗ POST \u002Fapi\u002Fcheckout — log.audit no longer passes\n   server\u002Fapi\u002Fcheckout.post.ts · evlog.dev\u002Fuse-cases\u002Faudit\u002Foverview\n\nNEW AND DARK\n⚠ GET \u002Fapi\u002Freports — added with no instrumentation\n\n2 regressions and a 12 point drop — exit code 1 · evlog.dev\u002Fcli\u002Fci\nevlog.map.json was not rewritten — fix the regression, or re-run without --baseline to accept it\n","A regression",[523,643,640],{"__ignoreMap":534},[512,645,646],{},"The unit is the requirement, not the total. A refactor that instruments one route and breaks another can leave the score untouched, and a gate watching only the number would call that a no-op.",[586,648,650,653,654,657],{"color":588,"icon":649},"i-lucide-lock",[612,651,652],{},"Nothing is fetched."," The baseline is a file your repository already contains, so CI has it on disk right after ",[523,655,656],{},"checkout"," — no network, no token, no repository access. A private repo gates exactly like a public one.",[659,660,662],"h3",{"id":661},"what-counts-as-a-regression","What counts as a regression",[664,665,666,679],"table",{},[667,668,669],"thead",{},[670,671,672,676],"tr",{},[673,674,675],"th",{},"Change",[673,677,678],{},"Verdict",[680,681,682,700,713,722,734,742],"tbody",{},[670,683,684,695],{},[685,686,687,688,691,692],"td",{},"A requirement went from ",[523,689,690],{},"pass"," to ",[523,693,694],{},"fail",[685,696,697],{},[612,698,699],{},"Fails the gate",[670,701,702,709],{},[685,703,704,705],{},"A passing requirement was ",[590,706,708],{"href":707},"\u002Fcli\u002Frules#disabling-a-check","disabled with a comment",[685,710,711],{},[612,712,699],{},[670,714,715,718],{},[685,716,717],{},"The global score dropped",[685,719,720],{},[612,721,699],{},[670,723,724,727],{},[685,725,726],{},"A new entry point was added with no instrumentation",[685,728,729,730,733],{},"Listed under ",[523,731,732],{},"NEW AND DARK",", does not fail",[670,735,736,739],{},[685,737,738],{},"An entry point was deleted",[685,740,741],{},"Counted as removed",[670,743,744,750],{},[685,745,687,746,691,748],{},[523,747,694],{},[523,749,690],{},[685,751,752],{},"Counted as fixed",[512,754,755],{},"Silencing a check costs the same as breaking it, on purpose: a disable comment is the cheapest way to turn a gate green without writing any instrumentation, and a ratchet that let it through would be measuring the comments rather than the code.",[512,757,758,759,761],{},"New dark routes are reported rather than gated. On an app that is not green yet, failing every pull request that adds an endpoint is how a team learns to turn the job off — ",[523,760,606],{}," is where a bar for new work belongs. Run both when you want both.",[659,763,765],{"id":764},"the-map-file-is-the-ratchet","The map file is the ratchet",[512,767,768,770,771,774,775,777],{},[523,769,601],{}," means you ",[612,772,773],{},"commit"," ",[523,776,635],{}," instead of ignoring it:",[528,779,781],{"className":530,"code":780,"filename":532,"language":533,"meta":534,"style":534},"evlog map            # updates the file\ngit add evlog.map.json\n",[523,782,783,793],{"__ignoreMap":534},[538,784,785,787,789],{"class":540,"line":541},[538,786,545],{"class":544},[538,788,549],{"class":548},[538,790,792],{"class":791},"sHwdD","            # updates the file\n",[538,794,796,799,802],{"class":540,"line":795},2,[538,797,798],{"class":544},"git",[538,800,801],{"class":548}," add",[538,803,804],{"class":548}," evlog.map.json\n",[512,806,807,808,810],{},"A run that reports a regression deliberately leaves the file untouched. Overwriting it there would move the ratchet down to the worse state, and the same command run a second time would report no regression and exit 0. Accepting a drop is therefore explicit: re-run without ",[523,809,601],{},", and commit the new map with the reason in your message.",[528,812,817],{"className":813,"code":814,"filename":815,"language":816,"meta":534,"style":534},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","      - uses: actions\u002Fcheckout@v5\n      - run: pnpm install --frozen-lockfile\n      - run: pnpm evlog map --baseline\n",".github\u002Fworkflows\u002Fobservability.yml","yaml",[523,818,819,835,847],{"__ignoreMap":534},[538,820,821,825,829,832],{"class":540,"line":541},[538,822,824],{"class":823},"sMK4o","      -",[538,826,828],{"class":827},"swJcz"," uses",[538,830,831],{"class":823},":",[538,833,834],{"class":548}," actions\u002Fcheckout@v5\n",[538,836,837,839,842,844],{"class":540,"line":795},[538,838,824],{"class":823},[538,840,841],{"class":827}," run",[538,843,831],{"class":823},[538,845,846],{"class":548}," pnpm install --frozen-lockfile\n",[538,848,850,852,854,856],{"class":540,"line":849},3,[538,851,824],{"class":823},[538,853,841],{"class":827},[538,855,831],{"class":823},[538,857,858],{"class":548}," pnpm evlog map --baseline\n",[512,860,861,862,865],{},"The file also churns on ",[523,863,864],{},"generatedAt"," every run. That is the cost of tracking it, and it buys a reviewable diff of exactly which entry points changed class.",[659,867,869],{"id":868},"comparing-against-a-branch-instead","Comparing against a branch instead",[512,871,872,873,876],{},"Pass a ",[523,874,875],{},"git:\u003Cref>"," to read the committed copy through git rather than the working tree — useful when the pull request touches the map file itself:",[528,878,880],{"className":530,"code":879,"filename":532,"language":533,"meta":534,"style":534},"evlog map --baseline git:origin\u002Fmain\nevlog map --baseline ..\u002Fbase-map.json   # or any path\n",[523,881,882,894],{"__ignoreMap":534},[538,883,884,886,888,891],{"class":540,"line":541},[538,885,545],{"class":544},[538,887,549],{"class":548},[538,889,890],{"class":548}," --baseline",[538,892,893],{"class":548}," git:origin\u002Fmain\n",[538,895,896,898,900,902,905],{"class":540,"line":795},[538,897,545],{"class":544},[538,899,549],{"class":548},[538,901,890],{"class":548},[538,903,904],{"class":548}," ..\u002Fbase-map.json",[538,906,907],{"class":791},"   # or any path\n",[512,909,910,911,913,914,917],{},"With a bare ",[523,912,601],{}," and no map on disk, the CLI falls back to ",[523,915,916],{},"git:HEAD"," on its own, so the answer stays \"what did the last commit say\" rather than \"what did I say a minute ago\".",[516,919,921],{"id":920},"exit-codes","Exit codes",[664,923,924,934],{},[667,925,926],{},[670,927,928,931],{},[673,929,930],{},"Code",[673,932,933],{},"Meaning",[680,935,936,946,962],{},[670,937,938,943],{},[685,939,940],{},[523,941,942],{},"0",[685,944,945],{},"Score met the threshold, no regression against the baseline, or neither was requested",[670,947,948,953],{},[685,949,950],{},[523,951,952],{},"1",[685,954,955,956,958,959,961],{},"Score below ",[523,957,606],{},", a regression against ",[523,960,601],{},", or the scan could not run",[670,963,964,969],{},[685,965,966],{},[523,967,968],{},"2",[685,970,971,972],{},"Usage error — unknown flag, or an invalid ",[523,973,974],{},"--framework",[976,977,978,979,982,983,986,987,990],"warning",{},"A pipe replaces ",[523,980,981],{},"$?"," with the exit code of the last command in it, so ",[523,984,985],{},"evlog map --min-score 90 \\| tee map.log"," always looks green. Add ",[523,988,989],{},"set -o pipefail"," to the step.",[516,992,994],{"id":993},"github-actions","GitHub Actions",[528,996,998],{"className":813,"code":997,"filename":815,"language":816,"meta":534,"style":534},"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",[523,999,1000,1010,1016,1027,1032,1041,1049,1060,1068,1079,1091,1099,1110],{"__ignoreMap":534},[538,1001,1002,1005,1007],{"class":540,"line":541},[538,1003,1004],{"class":827},"name",[538,1006,831],{"class":823},[538,1008,1009],{"class":548}," Observability\n",[538,1011,1012],{"class":540,"line":795},[538,1013,1015],{"emptyLinePlaceholder":1014},true,"\n",[538,1017,1018,1022,1024],{"class":540,"line":849},[538,1019,1021],{"class":1020},"sfNiH","on",[538,1023,831],{"class":823},[538,1025,1026],{"class":548}," pull_request\n",[538,1028,1030],{"class":540,"line":1029},4,[538,1031,1015],{"emptyLinePlaceholder":1014},[538,1033,1035,1038],{"class":540,"line":1034},5,[538,1036,1037],{"class":827},"jobs",[538,1039,1040],{"class":823},":\n",[538,1042,1044,1047],{"class":540,"line":1043},6,[538,1045,1046],{"class":827},"  map",[538,1048,1040],{"class":823},[538,1050,1052,1055,1057],{"class":540,"line":1051},7,[538,1053,1054],{"class":827},"    runs-on",[538,1056,831],{"class":823},[538,1058,1059],{"class":548}," ubuntu-latest\n",[538,1061,1063,1066],{"class":540,"line":1062},8,[538,1064,1065],{"class":827},"    steps",[538,1067,1040],{"class":823},[538,1069,1071,1073,1075,1077],{"class":540,"line":1070},9,[538,1072,824],{"class":823},[538,1074,828],{"class":827},[538,1076,831],{"class":823},[538,1078,834],{"class":548},[538,1080,1082,1084,1086,1088],{"class":540,"line":1081},10,[538,1083,824],{"class":823},[538,1085,828],{"class":827},[538,1087,831],{"class":823},[538,1089,1090],{"class":548}," actions\u002Fsetup-node@v5\n",[538,1092,1094,1097],{"class":540,"line":1093},11,[538,1095,1096],{"class":827},"        with",[538,1098,1040],{"class":823},[538,1100,1102,1105,1107],{"class":540,"line":1101},12,[538,1103,1104],{"class":827},"          node-version",[538,1106,831],{"class":823},[538,1108,1109],{"class":555}," 22\n",[538,1111,1113,1115,1117,1119],{"class":540,"line":1112},13,[538,1114,824],{"class":823},[538,1116,841],{"class":827},[538,1118,831],{"class":823},[538,1120,1121],{"class":548}," npx @evlog\u002Fcli map --min-score 80 --no-write\n",[512,1123,1124,1127,1128,1130],{},[523,1125,1126],{},"--no-write"," keeps the job from producing an ",[523,1129,635],{}," nobody will read.",[659,1132,1134],{"id":1133},"pin-the-version","Pin the version",[512,1136,1137],{},"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.",[512,1139,1140],{},"Install the CLI as a dev dependency and let your lockfile hold it still:",[528,1142,1144],{"className":530,"code":1143,"filename":532,"language":533,"meta":534,"style":534},"pnpm add -D @evlog\u002Fcli\n",[523,1145,1146],{"__ignoreMap":534},[538,1147,1148,1151,1153,1156],{"class":540,"line":541},[538,1149,1150],{"class":544},"pnpm",[538,1152,801],{"class":548},[538,1154,1155],{"class":548}," -D",[538,1157,1158],{"class":548}," @evlog\u002Fcli\n",[528,1160,1162],{"className":813,"code":1161,"filename":815,"language":816,"meta":534,"style":534},"      - run: pnpm install --frozen-lockfile\n      - run: pnpm evlog map --min-score 80 --no-write\n",[523,1163,1164,1174],{"__ignoreMap":534},[538,1165,1166,1168,1170,1172],{"class":540,"line":541},[538,1167,824],{"class":823},[538,1169,841],{"class":827},[538,1171,831],{"class":823},[538,1173,846],{"class":548},[538,1175,1176,1178,1180,1182],{"class":540,"line":795},[538,1177,824],{"class":823},[538,1179,841],{"class":827},[538,1181,831],{"class":823},[538,1183,1184],{"class":548}," pnpm evlog map --min-score 80 --no-write\n",[512,1186,1187],{},"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.",[659,1189,1191],{"id":1190},"ratchet-dont-cliff","Ratchet, don't cliff",[512,1193,1194],{},"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:",[528,1196,1198],{"className":530,"code":1197,"filename":532,"language":533,"meta":534,"style":534},"# what are we at right now?\nevlog map --json --no-write | jq '.map.score'\n",[523,1199,1200,1205],{"__ignoreMap":534},[538,1201,1202],{"class":540,"line":541},[538,1203,1204],{"class":791},"# what are we at right now?\n",[538,1206,1207,1209,1211,1214,1217,1220,1223,1226,1229],{"class":540,"line":795},[538,1208,545],{"class":544},[538,1210,549],{"class":548},[538,1212,1213],{"class":548}," --json",[538,1215,1216],{"class":548}," --no-write",[538,1218,1219],{"class":823}," |",[538,1221,1222],{"class":544}," jq",[538,1224,1225],{"class":823}," '",[538,1227,1228],{"class":548},".map.score",[538,1230,1231],{"class":823},"'\n",[512,1233,1234,1235,615],{},"Each pull request that raises the score raises the floor with it. The report already tells you what the next step is worth: ",[523,1236,1237],{},"▲ 76 → 86 by fixing the 3 above",[516,1239,1241],{"id":1240},"the-json-contract","The JSON contract",[512,1243,1244,1247],{},[523,1245,1246],{},"--json"," writes the whole map to stdout. The report goes to stderr, so the two never mix.",[528,1249,1251],{"className":530,"code":1250,"filename":532,"language":533,"meta":534,"style":534},"evlog map --json --no-write > map.json\n",[523,1252,1253],{"__ignoreMap":534},[538,1254,1255,1257,1259,1261,1263,1266],{"class":540,"line":541},[538,1256,545],{"class":544},[538,1258,549],{"class":548},[538,1260,1213],{"class":548},[538,1262,1216],{"class":548},[538,1264,1265],{"class":823}," >",[538,1267,1268],{"class":548}," map.json\n",[528,1270,1275],{"className":1271,"code":1272,"filename":1273,"language":1274,"meta":534,"style":534},"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",[523,1276,1277,1282,1302,1323,1336,1353,1372,1392,1412,1428,1442,1447,1531,1550],{"__ignoreMap":534},[538,1278,1279],{"class":540,"line":541},[538,1280,1281],{"class":823},"{\n",[538,1283,1284,1287,1291,1294,1296,1299],{"class":540,"line":795},[538,1285,1286],{"class":823},"  \"",[538,1288,1290],{"class":1289},"spNyl","schemaVersion",[538,1292,1293],{"class":823},"\"",[538,1295,831],{"class":823},[538,1297,1298],{"class":555}," 2",[538,1300,1301],{"class":823},",\n",[538,1303,1304,1306,1309,1311,1313,1316,1319,1321],{"class":540,"line":849},[538,1305,1286],{"class":823},[538,1307,1308],{"class":1289},"environment",[538,1310,1293],{"class":823},[538,1312,831],{"class":823},[538,1314,1315],{"class":823}," \"",[538,1317,1318],{"class":548},"production",[538,1320,1293],{"class":823},[538,1322,1301],{"class":823},[538,1324,1325,1327,1329,1331,1333],{"class":540,"line":1029},[538,1326,1286],{"class":823},[538,1328,94],{"class":1289},[538,1330,1293],{"class":823},[538,1332,831],{"class":823},[538,1334,1335],{"class":823}," {\n",[538,1337,1338,1341,1344,1346,1348,1351],{"class":540,"line":1034},[538,1339,1340],{"class":823},"    \"",[538,1342,1343],{"class":544},"version",[538,1345,1293],{"class":823},[538,1347,831],{"class":823},[538,1349,1350],{"class":555}," 1",[538,1352,1301],{"class":823},[538,1354,1355,1357,1359,1361,1363,1365,1368,1370],{"class":540,"line":1043},[538,1356,1340],{"class":823},[538,1358,864],{"class":544},[538,1360,1293],{"class":823},[538,1362,831],{"class":823},[538,1364,1315],{"class":823},[538,1366,1367],{"class":548},"2026-07-25T18:42:10.114Z",[538,1369,1293],{"class":823},[538,1371,1301],{"class":823},[538,1373,1374,1376,1379,1381,1383,1385,1388,1390],{"class":540,"line":1051},[538,1375,1340],{"class":823},[538,1377,1378],{"class":544},"framework",[538,1380,1293],{"class":823},[538,1382,831],{"class":823},[538,1384,1315],{"class":823},[538,1386,1387],{"class":548},"nuxt",[538,1389,1293],{"class":823},[538,1391,1301],{"class":823},[538,1393,1394,1396,1399,1401,1403,1405,1408,1410],{"class":540,"line":1062},[538,1395,1340],{"class":823},[538,1397,1398],{"class":544},"projectName",[538,1400,1293],{"class":823},[538,1402,831],{"class":823},[538,1404,1315],{"class":823},[538,1406,1407],{"class":548},"evlog-playground",[538,1409,1293],{"class":823},[538,1411,1301],{"class":823},[538,1413,1414,1416,1419,1421,1423,1426],{"class":540,"line":1070},[538,1415,1340],{"class":823},[538,1417,1418],{"class":544},"score",[538,1420,1293],{"class":823},[538,1422,831],{"class":823},[538,1424,1425],{"class":555}," 76",[538,1427,1301],{"class":823},[538,1429,1430,1432,1435,1437,1439],{"class":540,"line":1081},[538,1431,1340],{"class":823},[538,1433,1434],{"class":544},"routes",[538,1436,1293],{"class":823},[538,1438,831],{"class":823},[538,1440,1441],{"class":823}," []\n",[538,1443,1444],{"class":540,"line":1093},[538,1445,1446],{"class":823},"  },\n",[538,1448,1449,1451,1454,1456,1458,1461,1463,1466,1468,1470,1473,1476,1478,1481,1483,1485,1487,1489,1491,1494,1496,1498,1501,1503,1505,1508,1510,1512,1515,1517,1519,1522,1524,1526,1528],{"class":540,"line":1101},[538,1450,1286],{"class":823},[538,1452,1453],{"class":1289},"summary",[538,1455,1293],{"class":823},[538,1457,831],{"class":823},[538,1459,1460],{"class":823}," {",[538,1462,1315],{"class":823},[538,1464,1465],{"class":544},"instrumented",[538,1467,1293],{"class":823},[538,1469,831],{"class":823},[538,1471,1472],{"class":555}," 19",[538,1474,1475],{"class":823},",",[538,1477,1315],{"class":823},[538,1479,1480],{"class":544},"partial",[538,1482,1293],{"class":823},[538,1484,831],{"class":823},[538,1486,1298],{"class":555},[538,1488,1475],{"class":823},[538,1490,1315],{"class":823},[538,1492,1493],{"class":544},"dark",[538,1495,1293],{"class":823},[538,1497,831],{"class":823},[538,1499,1500],{"class":555}," 8",[538,1502,1475],{"class":823},[538,1504,1315],{"class":823},[538,1506,1507],{"class":544},"exempt",[538,1509,1293],{"class":823},[538,1511,831],{"class":823},[538,1513,1514],{"class":555}," 0",[538,1516,1475],{"class":823},[538,1518,1315],{"class":823},[538,1520,1521],{"class":544},"suppressedChecks",[538,1523,1293],{"class":823},[538,1525,831],{"class":823},[538,1527,1514],{"class":555},[538,1529,1530],{"class":823}," },\n",[538,1532,1533,1535,1538,1540,1542,1544,1547],{"class":540,"line":1112},[538,1534,1286],{"class":823},[538,1536,1537],{"class":1289},"mapPath",[538,1539,1293],{"class":823},[538,1541,831],{"class":823},[538,1543,1315],{"class":823},[538,1545,1546],{"class":548},"\u002Fpath\u002Fto\u002Fapp\u002Fevlog.map.json",[538,1548,1549],{"class":823},"\"\n",[538,1551,1553],{"class":540,"line":1552},14,[538,1554,1555],{"class":823},"}\n",[512,1557,1558,1560,1561,1564,1565,1567,1568,1571],{},[523,1559,1537],{}," is ",[523,1562,1563],{},"null"," under ",[523,1566,1126],{},". Each entry in ",[523,1569,1570],{},"map.routes"," looks like this:",[1573,1574,1575],"code-collapse",{},[528,1576,1579],{"className":1271,"code":1577,"filename":1578,"language":1274,"meta":534,"style":534},"{\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",[523,1580,1581,1585,1603,1623,1643,1663,1683,1721,1741,1754,1784,1813,1843,1872,1885,1905,1926,1969,1975,1980,1995,2060,2074],{"__ignoreMap":534},[538,1582,1583],{"class":540,"line":541},[538,1584,1281],{"class":823},[538,1586,1587,1589,1591,1593,1595,1597,1599,1601],{"class":540,"line":795},[538,1588,1286],{"class":823},[538,1590,1378],{"class":1289},[538,1592,1293],{"class":823},[538,1594,831],{"class":823},[538,1596,1315],{"class":823},[538,1598,1387],{"class":548},[538,1600,1293],{"class":823},[538,1602,1301],{"class":823},[538,1604,1605,1607,1610,1612,1614,1616,1619,1621],{"class":540,"line":849},[538,1606,1286],{"class":823},[538,1608,1609],{"class":1289},"kind",[538,1611,1293],{"class":823},[538,1613,831],{"class":823},[538,1615,1315],{"class":823},[538,1617,1618],{"class":548},"api",[538,1620,1293],{"class":823},[538,1622,1301],{"class":823},[538,1624,1625,1627,1630,1632,1634,1636,1639,1641],{"class":540,"line":1029},[538,1626,1286],{"class":823},[538,1628,1629],{"class":1289},"method",[538,1631,1293],{"class":823},[538,1633,831],{"class":823},[538,1635,1315],{"class":823},[538,1637,1638],{"class":548},"POST",[538,1640,1293],{"class":823},[538,1642,1301],{"class":823},[538,1644,1645,1647,1650,1652,1654,1656,1659,1661],{"class":540,"line":1034},[538,1646,1286],{"class":823},[538,1648,1649],{"class":1289},"path",[538,1651,1293],{"class":823},[538,1653,831],{"class":823},[538,1655,1315],{"class":823},[538,1657,1658],{"class":548},"\u002Fapi\u002Fauth\u002Flogin",[538,1660,1293],{"class":823},[538,1662,1301],{"class":823},[538,1664,1665,1667,1670,1672,1674,1676,1679,1681],{"class":540,"line":1043},[538,1666,1286],{"class":823},[538,1668,1669],{"class":1289},"file",[538,1671,1293],{"class":823},[538,1673,831],{"class":823},[538,1675,1315],{"class":823},[538,1677,1678],{"class":548},"server\u002Fapi\u002Fauth\u002Flogin.post.ts",[538,1680,1293],{"class":823},[538,1682,1301],{"class":823},[538,1684,1685,1687,1690,1692,1694,1696,1698,1700,1702,1704,1706,1708,1710,1713,1715,1717,1719],{"class":540,"line":1051},[538,1686,1286],{"class":823},[538,1688,1689],{"class":1289},"handler",[538,1691,1293],{"class":823},[538,1693,831],{"class":823},[538,1695,1460],{"class":823},[538,1697,1315],{"class":823},[538,1699,540],{"class":544},[538,1701,1293],{"class":823},[538,1703,831],{"class":823},[538,1705,1350],{"class":555},[538,1707,1475],{"class":823},[538,1709,1315],{"class":823},[538,1711,1712],{"class":544},"column",[538,1714,1293],{"class":823},[538,1716,831],{"class":823},[538,1718,1514],{"class":555},[538,1720,1530],{"class":823},[538,1722,1723,1725,1728,1730,1732,1734,1737,1739],{"class":540,"line":1062},[538,1724,1286],{"class":823},[538,1726,1727],{"class":1289},"id",[538,1729,1293],{"class":823},[538,1731,831],{"class":823},[538,1733,1315],{"class":823},[538,1735,1736],{"class":548},"337325358269",[538,1738,1293],{"class":823},[538,1740,1301],{"class":823},[538,1742,1743,1745,1748,1750,1752],{"class":540,"line":1070},[538,1744,1286],{"class":823},[538,1746,1747],{"class":1289},"checks",[538,1749,1293],{"class":823},[538,1751,831],{"class":823},[538,1753,1335],{"class":823},[538,1755,1756,1758,1761,1763,1765,1767,1769,1772,1774,1776,1778,1780,1782],{"class":540,"line":1081},[538,1757,1340],{"class":823},[538,1759,1760],{"class":544},"wide-event",[538,1762,1293],{"class":823},[538,1764,831],{"class":823},[538,1766,1460],{"class":823},[538,1768,1315],{"class":823},[538,1770,1771],{"class":555},"status",[538,1773,1293],{"class":823},[538,1775,831],{"class":823},[538,1777,1315],{"class":823},[538,1779,690],{"class":548},[538,1781,1293],{"class":823},[538,1783,1530],{"class":823},[538,1785,1786,1788,1791,1793,1795,1797,1799,1801,1803,1805,1807,1809,1811],{"class":540,"line":1093},[538,1787,1340],{"class":823},[538,1789,1790],{"class":544},"context",[538,1792,1293],{"class":823},[538,1794,831],{"class":823},[538,1796,1460],{"class":823},[538,1798,1315],{"class":823},[538,1800,1771],{"class":555},[538,1802,1293],{"class":823},[538,1804,831],{"class":823},[538,1806,1315],{"class":823},[538,1808,690],{"class":548},[538,1810,1293],{"class":823},[538,1812,1530],{"class":823},[538,1814,1815,1817,1820,1822,1824,1826,1828,1830,1832,1834,1836,1839,1841],{"class":540,"line":1101},[538,1816,1340],{"class":823},[538,1818,1819],{"class":544},"structured-errors",[538,1821,1293],{"class":823},[538,1823,831],{"class":823},[538,1825,1460],{"class":823},[538,1827,1315],{"class":823},[538,1829,1771],{"class":555},[538,1831,1293],{"class":823},[538,1833,831],{"class":823},[538,1835,1315],{"class":823},[538,1837,1838],{"class":548},"n\u002Fa",[538,1840,1293],{"class":823},[538,1842,1530],{"class":823},[538,1844,1845,1847,1850,1852,1854,1856,1858,1860,1862,1864,1866,1868,1870],{"class":540,"line":1112},[538,1846,1340],{"class":823},[538,1848,1849],{"class":544},"error-handling",[538,1851,1293],{"class":823},[538,1853,831],{"class":823},[538,1855,1460],{"class":823},[538,1857,1315],{"class":823},[538,1859,1771],{"class":555},[538,1861,1293],{"class":823},[538,1863,831],{"class":823},[538,1865,1315],{"class":823},[538,1867,1838],{"class":548},[538,1869,1293],{"class":823},[538,1871,1530],{"class":823},[538,1873,1874,1876,1879,1881,1883],{"class":540,"line":1552},[538,1875,1340],{"class":823},[538,1877,1878],{"class":544},"audit",[538,1880,1293],{"class":823},[538,1882,831],{"class":823},[538,1884,1335],{"class":823},[538,1886,1888,1891,1893,1895,1897,1899,1901,1903],{"class":540,"line":1887},15,[538,1889,1890],{"class":823},"      \"",[538,1892,1771],{"class":555},[538,1894,1293],{"class":823},[538,1896,831],{"class":823},[538,1898,1315],{"class":823},[538,1900,694],{"class":548},[538,1902,1293],{"class":823},[538,1904,1301],{"class":823},[538,1906,1908,1910,1913,1915,1917,1919,1922,1924],{"class":540,"line":1907},16,[538,1909,1890],{"class":823},[538,1911,1912],{"class":555},"message",[538,1914,1293],{"class":823},[538,1916,831],{"class":823},[538,1918,1315],{"class":823},[538,1920,1921],{"class":548},"has logger + context but no log.audit() — sensitive route needs audit trail",[538,1923,1293],{"class":823},[538,1925,1301],{"class":823},[538,1927,1929,1931,1934,1936,1938,1940,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960,1962,1964,1966],{"class":540,"line":1928},17,[538,1930,1890],{"class":823},[538,1932,1933],{"class":555},"evidence",[538,1935,1293],{"class":823},[538,1937,831],{"class":823},[538,1939,1460],{"class":823},[538,1941,1315],{"class":823},[538,1943,1669],{"class":827},[538,1945,1293],{"class":823},[538,1947,831],{"class":823},[538,1949,1315],{"class":823},[538,1951,1678],{"class":548},[538,1953,1293],{"class":823},[538,1955,1475],{"class":823},[538,1957,1315],{"class":823},[538,1959,540],{"class":827},[538,1961,1293],{"class":823},[538,1963,831],{"class":823},[538,1965,1350],{"class":555},[538,1967,1968],{"class":823}," }\n",[538,1970,1972],{"class":540,"line":1971},18,[538,1973,1974],{"class":823},"    }\n",[538,1976,1978],{"class":540,"line":1977},19,[538,1979,1446],{"class":823},[538,1981,1983,1985,1988,1990,1992],{"class":540,"line":1982},20,[538,1984,1286],{"class":823},[538,1986,1987],{"class":1289},"suggestions",[538,1989,1293],{"class":823},[538,1991,831],{"class":823},[538,1993,1994],{"class":823}," {},\n",[538,1996,1998,2000,2003,2005,2007,2009,2011,2014,2016,2018,2020,2023,2025,2027,2029,2032,2034,2036,2039,2041,2044,2048,2051,2053,2055,2058],{"class":540,"line":1997},21,[538,1999,1286],{"class":823},[538,2001,2002],{"class":1289},"sensitivity",[538,2004,1293],{"class":823},[538,2006,831],{"class":823},[538,2008,1460],{"class":823},[538,2010,1315],{"class":823},[538,2012,2013],{"class":544},"level",[538,2015,1293],{"class":823},[538,2017,831],{"class":823},[538,2019,1315],{"class":823},[538,2021,2022],{"class":548},"high",[538,2024,1293],{"class":823},[538,2026,1475],{"class":823},[538,2028,1315],{"class":823},[538,2030,2031],{"class":544},"reasons",[538,2033,1293],{"class":823},[538,2035,831],{"class":823},[538,2037,2038],{"class":823}," [",[538,2040,1293],{"class":823},[538,2042,2043],{"class":548},"auth: path says ",[538,2045,2047],{"class":2046},"sTEyZ","\\\"",[538,2049,2050],{"class":548},"auth",[538,2052,2047],{"class":2046},[538,2054,1293],{"class":823},[538,2056,2057],{"class":823},"]",[538,2059,1530],{"class":823},[538,2061,2063,2065,2067,2069,2071],{"class":540,"line":2062},22,[538,2064,1286],{"class":823},[538,2066,1418],{"class":1289},[538,2068,1293],{"class":823},[538,2070,831],{"class":823},[538,2072,2073],{"class":555}," 75\n",[538,2075,2077],{"class":540,"line":2076},23,[538,2078,1555],{"class":823},[512,2080,2081,2083,2084,2086],{},[523,2082,1747],{}," holds requirements, ",[523,2085,1987],{}," 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.",[512,2088,2089,2090,1560,2092,2094,2095,2098,2099,2101],{},"A check somebody ",[590,2091,708],{"href":707},[523,2093,1838],{}," with ",[523,2096,2097],{},"\"suppressed\": true",", and its ",[523,2100,1933],{}," points at the comment rather than at the handler:",[528,2103,2106],{"className":1271,"code":2104,"filename":2105,"language":1274,"meta":534,"style":534},"\"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",[523,2107,2108,2121,2139,2153,2172,2213],{"__ignoreMap":534},[538,2109,2110,2112,2114,2116,2119],{"class":540,"line":541},[538,2111,1293],{"class":823},[538,2113,1760],{"class":548},[538,2115,1293],{"class":823},[538,2117,2118],{"class":2046},": ",[538,2120,1281],{"class":823},[538,2122,2123,2125,2127,2129,2131,2133,2135,2137],{"class":540,"line":795},[538,2124,1286],{"class":823},[538,2126,1771],{"class":1289},[538,2128,1293],{"class":823},[538,2130,831],{"class":823},[538,2132,1315],{"class":823},[538,2134,1838],{"class":548},[538,2136,1293],{"class":823},[538,2138,1301],{"class":823},[538,2140,2141,2143,2146,2148,2150],{"class":540,"line":849},[538,2142,1286],{"class":823},[538,2144,2145],{"class":1289},"suppressed",[538,2147,1293],{"class":823},[538,2149,831],{"class":823},[538,2151,2152],{"class":823}," true,\n",[538,2154,2155,2157,2159,2161,2163,2165,2168,2170],{"class":540,"line":1029},[538,2156,1286],{"class":823},[538,2158,1912],{"class":1289},[538,2160,1293],{"class":823},[538,2162,831],{"class":823},[538,2164,1315],{"class":823},[538,2166,2167],{"class":548},"disabled at line 1 — liveness probe, deliberately silent",[538,2169,1293],{"class":823},[538,2171,1301],{"class":823},[538,2173,2174,2176,2178,2180,2182,2184,2186,2188,2190,2192,2194,2197,2199,2201,2203,2205,2207,2209,2211],{"class":540,"line":1034},[538,2175,1286],{"class":823},[538,2177,1933],{"class":1289},[538,2179,1293],{"class":823},[538,2181,831],{"class":823},[538,2183,1460],{"class":823},[538,2185,1315],{"class":823},[538,2187,1669],{"class":544},[538,2189,1293],{"class":823},[538,2191,831],{"class":823},[538,2193,1315],{"class":823},[538,2195,2196],{"class":548},"server\u002Fapi\u002Fhealth.get.ts",[538,2198,1293],{"class":823},[538,2200,1475],{"class":823},[538,2202,1315],{"class":823},[538,2204,540],{"class":544},[538,2206,1293],{"class":823},[538,2208,831],{"class":823},[538,2210,1350],{"class":555},[538,2212,1968],{"class":823},[538,2214,2215],{"class":540,"line":1043},[538,2216,1555],{"class":823},[512,2218,2219,2222],{},[523,2220,2221],{},"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.",[659,2224,386],{"id":2225},"recipes",[528,2227,2229],{"className":530,"code":2228,"filename":532,"language":533,"meta":534,"style":534},"# 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",[523,2230,2231,2236,2256,2260,2265,2278,2295,2299,2304,2316,2329,2336,2340,2345,2378,2382,2387],{"__ignoreMap":534},[538,2232,2233],{"class":540,"line":541},[538,2234,2235],{"class":791},"# the score, for a badge or a comment\n",[538,2237,2238,2240,2242,2244,2246,2248,2250,2252,2254],{"class":540,"line":795},[538,2239,545],{"class":544},[538,2241,549],{"class":548},[538,2243,1213],{"class":548},[538,2245,1216],{"class":548},[538,2247,1219],{"class":823},[538,2249,1222],{"class":544},[538,2251,1225],{"class":823},[538,2253,1228],{"class":548},[538,2255,1231],{"class":823},[538,2257,2258],{"class":540,"line":849},[538,2259,1015],{"emptyLinePlaceholder":1014},[538,2261,2262],{"class":540,"line":1029},[538,2263,2264],{"class":791},"# every entry point with no event at all\n",[538,2266,2267,2269,2271,2273,2275],{"class":540,"line":1034},[538,2268,545],{"class":544},[538,2270,549],{"class":548},[538,2272,1213],{"class":548},[538,2274,1216],{"class":548},[538,2276,2277],{"class":2046}," \\\n",[538,2279,2280,2283,2285,2288,2290,2293],{"class":540,"line":1043},[538,2281,2282],{"class":823},"  |",[538,2284,1222],{"class":544},[538,2286,2287],{"class":548}," -r",[538,2289,1225],{"class":823},[538,2291,2292],{"class":548},".map.routes[] | select(.checks[\"wide-event\"].status == \"fail\") | .file",[538,2294,1231],{"class":823},[538,2296,2297],{"class":540,"line":1051},[538,2298,1015],{"emptyLinePlaceholder":1014},[538,2300,2301],{"class":540,"line":1062},[538,2302,2303],{"class":791},"# every failure as file:line — message\n",[538,2305,2306,2308,2310,2312,2314],{"class":540,"line":1070},[538,2307,545],{"class":544},[538,2309,549],{"class":548},[538,2311,1213],{"class":548},[538,2313,1216],{"class":548},[538,2315,2277],{"class":2046},[538,2317,2318,2320,2322,2324,2326],{"class":540,"line":1081},[538,2319,2282],{"class":823},[538,2321,1222],{"class":544},[538,2323,2287],{"class":548},[538,2325,1225],{"class":823},[538,2327,2328],{"class":548},".map.routes[].checks | to_entries[] | select(.value.status == \"fail\")\n",[538,2330,2331,2334],{"class":540,"line":1093},[538,2332,2333],{"class":548},"           | \"\\(.value.evidence.file):\\(.value.evidence.line) — \\(.value.message)\"",[538,2335,1231],{"class":823},[538,2337,2338],{"class":540,"line":1101},[538,2339,1015],{"emptyLinePlaceholder":1014},[538,2341,2342],{"class":540,"line":1112},[538,2343,2344],{"class":791},"# fail a script when anything is dark\n",[538,2346,2347,2351,2354,2356,2359,2362,2364,2366,2369,2372,2375],{"class":540,"line":1552},[538,2348,2350],{"class":2349},"s2Zo4","test",[538,2352,2353],{"class":823}," \"$(",[538,2355,545],{"class":544},[538,2357,2358],{"class":548}," map --json --no-write ",[538,2360,2361],{"class":823},"|",[538,2363,1222],{"class":544},[538,2365,1225],{"class":823},[538,2367,2368],{"class":548},".summary.dark",[538,2370,2371],{"class":823},"')\"",[538,2373,2374],{"class":548}," -eq",[538,2376,2377],{"class":555}," 0\n",[538,2379,2380],{"class":540,"line":1887},[538,2381,1015],{"emptyLinePlaceholder":1014},[538,2383,2384],{"class":540,"line":1907},[538,2385,2386],{"class":791},"# how much of the score is disabled checks\n",[538,2388,2389,2391,2393,2395,2397,2399,2401,2403,2406],{"class":540,"line":1928},[538,2390,545],{"class":544},[538,2392,549],{"class":548},[538,2394,1213],{"class":548},[538,2396,1216],{"class":548},[538,2398,1219],{"class":823},[538,2400,1222],{"class":544},[538,2402,1225],{"class":823},[538,2404,2405],{"class":548},".summary.suppressedChecks",[538,2407,1231],{"class":823},[516,2409,2411],{"id":2410},"the-map-file","The map file",[512,2413,2414,2415,2417,2418,2420,2421,2423],{},"Unless you pass ",[523,2416,1126],{},", every run writes ",[523,2419,635],{}," to the project root. It holds the same data as ",[523,2422,1246],{}," and is a build artifact, so ignore it:",[528,2425,2428],{"className":530,"code":2426,"filename":2427,"language":533,"meta":534,"style":534},"evlog.map.json\n",".gitignore",[523,2429,2430],{"__ignoreMap":534},[538,2431,2432],{"class":540,"line":541},[538,2433,2426],{"class":544},[512,2435,2436,2437,2439,2440,2445],{},"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 ",[523,2438,864],{}," changes each time. Committing it is also what ",[590,2441,2443],{"href":2442},"#the-ratchet---baseline",[523,2444,601],{}," compares against.",[516,2447,2449],{"id":2448},"monorepos","Monorepos",[512,2451,2452,2455],{},[523,2453,2454],{},"evlog map"," scans one app at a time. Gate each one:",[528,2457,2459],{"className":813,"code":2458,"filename":815,"language":816,"meta":534,"style":534},"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",[523,2460,2461,2467,2473,2481,2488,2495,2515,2521,2531,2541,2547,2555],{"__ignoreMap":534},[538,2462,2463,2465],{"class":540,"line":541},[538,2464,1037],{"class":827},[538,2466,1040],{"class":823},[538,2468,2469,2471],{"class":540,"line":795},[538,2470,1046],{"class":827},[538,2472,1040],{"class":823},[538,2474,2475,2477,2479],{"class":540,"line":849},[538,2476,1054],{"class":827},[538,2478,831],{"class":823},[538,2480,1059],{"class":548},[538,2482,2483,2486],{"class":540,"line":1029},[538,2484,2485],{"class":827},"    strategy",[538,2487,1040],{"class":823},[538,2489,2490,2493],{"class":540,"line":1034},[538,2491,2492],{"class":827},"      matrix",[538,2494,1040],{"class":823},[538,2496,2497,2500,2502,2504,2507,2509,2512],{"class":540,"line":1043},[538,2498,2499],{"class":827},"        app",[538,2501,831],{"class":823},[538,2503,2038],{"class":823},[538,2505,2506],{"class":548},"apps\u002Fweb",[538,2508,1475],{"class":823},[538,2510,2511],{"class":548}," apps\u002Fadmin",[538,2513,2514],{"class":823},"]\n",[538,2516,2517,2519],{"class":540,"line":1051},[538,2518,1065],{"class":827},[538,2520,1040],{"class":823},[538,2522,2523,2525,2527,2529],{"class":540,"line":1062},[538,2524,824],{"class":823},[538,2526,828],{"class":827},[538,2528,831],{"class":823},[538,2530,834],{"class":548},[538,2532,2533,2535,2537,2539],{"class":540,"line":1070},[538,2534,824],{"class":823},[538,2536,828],{"class":827},[538,2538,831],{"class":823},[538,2540,1090],{"class":548},[538,2542,2543,2545],{"class":540,"line":1081},[538,2544,1096],{"class":827},[538,2546,1040],{"class":823},[538,2548,2549,2551,2553],{"class":540,"line":1093},[538,2550,1104],{"class":827},[538,2552,831],{"class":823},[538,2554,1109],{"class":555},[538,2556,2557,2559,2561,2563],{"class":540,"line":1101},[538,2558,824],{"class":823},[538,2560,841],{"class":827},[538,2562,831],{"class":823},[538,2564,2565],{"class":548}," npx @evlog\u002Fcli map --cwd ${{ matrix.app }} --min-score 80 --no-write\n",[512,2567,2568],{},"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.",[516,2570,2572],{"id":2571},"next","Next",[2574,2575,2576,2582],"ul",{},[2577,2578,2579,2581],"li",{},[590,2580,99],{"href":100}," — what a failing check means and how to fix it",[2577,2583,2584,2586],{},[590,2585,104],{"href":105}," — how the number you are gating on is calculated",[2588,2589,2590],"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":534,"searchDepth":795,"depth":795,"links":2592},[2593,2594,2600,2601,2605,2608,2609,2610],{"id":518,"depth":795,"text":519},{"id":597,"depth":795,"text":2595,"children":2596},"The ratchet: --baseline",[2597,2598,2599],{"id":661,"depth":849,"text":662},{"id":764,"depth":849,"text":765},{"id":868,"depth":849,"text":869},{"id":920,"depth":795,"text":921},{"id":993,"depth":795,"text":994,"children":2602},[2603,2604],{"id":1133,"depth":849,"text":1134},{"id":1190,"depth":849,"text":1191},{"id":1240,"depth":795,"text":1241,"children":2606},[2607],{"id":2225,"depth":849,"text":386},{"id":2410,"depth":795,"text":2411},{"id":2448,"depth":795,"text":2449},{"id":2571,"depth":795,"text":2572},"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",[2614,2616],{"label":104,"icon":107,"to":105,"color":588,"variant":2615},"subtle",{"label":99,"icon":102,"to":100,"color":588,"variant":2615},{},{"title":109,"icon":112},{"title":507,"description":2611},"Cxg_tRPl9BBvezkDrPTqcJvmsV4GdixdZkEUl7INivg",[2622,2624],{"title":104,"path":105,"stem":106,"description":2623,"icon":107,"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":114,"path":115,"stem":116,"description":2625,"icon":117,"children":-1},"Diagnose an evlog setup — Node version, project resolution, the installed evlog version, the detected framework, and whether local logs are being written.",1785224909089]