[{"data":1,"prerenderedAt":4681},["ShallowReactive",2],{"navigation_docs":3,"-use-cases-audit-recording":515,"-use-cases-audit-recording-surround":4676},[4,30,80,123,298,430,485],{"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,210],{"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,190],{"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},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[185],{"title":186,"path":187,"stem":188,"icon":189},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":191,"path":192,"stem":193,"children":194,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[195,200,205],{"title":196,"path":197,"stem":198,"icon":199},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":201,"path":202,"stem":203,"icon":204},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":206,"path":207,"stem":208,"icon":209},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":211,"path":212,"stem":213,"children":214,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[215,219,224,229,234,239,244,249,254,259,264,269,274,279,283,288,293],{"title":36,"path":216,"stem":217,"icon":218},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":220,"path":221,"stem":222,"icon":223},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":225,"path":226,"stem":227,"icon":228},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":230,"path":231,"stem":232,"icon":233},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":235,"path":236,"stem":237,"icon":238},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":240,"path":241,"stem":242,"icon":243},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":245,"path":246,"stem":247,"icon":248},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":250,"path":251,"stem":252,"icon":253},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":255,"path":256,"stem":257,"icon":258},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":260,"path":261,"stem":262,"icon":263},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":265,"path":266,"stem":267,"icon":268},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":270,"path":271,"stem":272,"icon":273},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":275,"path":276,"stem":277,"icon":278},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":280,"path":281,"stem":282,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":284,"path":285,"stem":286,"icon":287},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":289,"path":290,"stem":291,"icon":292},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":294,"path":295,"stem":296,"icon":297},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":299,"path":300,"stem":301,"children":302,"page":29},"Use Cases","\u002Fuse-cases","5.use-cases",[303,306,311,340,367,399,420,425],{"title":36,"path":304,"stem":305,"icon":102},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":307,"path":308,"stem":309,"icon":310},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":312,"icon":313,"path":314,"stem":315,"children":316,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[317,320,325,330,335],{"title":36,"path":318,"stem":319,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":321,"path":322,"stem":323,"icon":324},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":326,"path":327,"stem":328,"icon":329},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":331,"path":332,"stem":333,"icon":334},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":336,"path":337,"stem":338,"icon":339},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":341,"icon":342,"path":343,"stem":344,"children":345,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[346,349,354,359,363],{"title":36,"path":347,"stem":348,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":350,"path":351,"stem":352,"icon":353},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":355,"path":356,"stem":357,"icon":358},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":360,"path":361,"stem":362,"icon":310},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":364,"path":365,"stem":366,"icon":107},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":368,"icon":369,"path":370,"stem":371,"children":372,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[373,376,381,386,391,395],{"title":36,"path":374,"stem":375,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":377,"path":378,"stem":379,"icon":380},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":382,"path":383,"stem":384,"icon":385},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":387,"path":388,"stem":389,"icon":390},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":392,"path":393,"stem":394,"icon":369},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":396,"path":397,"stem":398,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":336,"icon":107,"path":400,"stem":401,"children":402,"page":29},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[403,406,411,416],{"title":36,"path":404,"stem":405,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":407,"path":408,"stem":409,"icon":410},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":412,"path":413,"stem":414,"icon":415},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":417,"path":418,"stem":419,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":421,"path":422,"stem":423,"icon":424},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":426,"path":427,"stem":428,"icon":429},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":431,"path":432,"stem":433,"children":434,"page":29},"Extend","\u002Fextend","6.extend",[435,439,444,449,454,458,462,466,470,475,480],{"title":36,"path":436,"stem":437,"icon":438},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":440,"path":441,"stem":442,"icon":443},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":445,"path":446,"stem":447,"icon":448},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":450,"path":451,"stem":452,"icon":453},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":396,"path":455,"stem":456,"icon":457},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":459,"path":460,"stem":461,"icon":438},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":463,"path":464,"stem":465,"icon":424},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":467,"path":468,"stem":469,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":471,"path":472,"stem":473,"icon":474},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":476,"path":477,"stem":478,"icon":479},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":481,"path":482,"stem":483,"icon":484},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":417,"path":486,"stem":487,"children":488,"page":29},"\u002Freference","7.reference",[489,494,497,502,506,511],{"title":490,"path":491,"stem":492,"icon":493},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":364,"path":495,"stem":496,"icon":107},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":498,"path":499,"stem":500,"icon":501},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":503,"path":504,"stem":505,"icon":369},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":507,"path":508,"stem":509,"icon":510},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":512,"path":513,"stem":514,"icon":424},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"id":516,"title":517,"body":518,"description":4664,"extension":4665,"links":4666,"meta":4672,"navigation":4673,"path":383,"seo":4674,"stem":384,"__hash__":4675},"docs\u002F5.use-cases\u002F4.audit\u002F03.recording.md","Recording Events",{"type":519,"value":520,"toc":4649},"minimark",[521,525,533,542,772,775,781,787,1409,1416,1421,1788,1808,1814,1819,1985,1993,1999,2025,2409,2422,2520,2620,2631,2634,2685,2699,2703,2709,2786,2792,2805,2811,2817,2852,3520,3527,3533,3551,4605,4608,4645],[522,523,524],"p",{},"Five APIs cover every shape of audit recording: in-request, denied, standalone, auto-instrumented, and typed.",[526,527,529],"h2",{"id":528},"logaudit",[530,531,532],"code",{},"log.audit()",[522,534,535,537,538,541],{},[530,536,532],{}," is sugar over ",[530,539,540],{},"log.set({ audit: ... })"," plus tail-sample force-keep:",[543,544,549],"pre",{"className":545,"code":546,"language":547,"meta":548,"style":548},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","log.audit({\n  action: 'invoice.refund',\n  actor: { type: 'user', id: user.id },\n  target: { type: 'invoice', id: 'inv_889' },\n  outcome: 'success',\n})\n\n\u002F\u002F Strictly equivalent to:\nlog.set({ audit: { action: 'invoice.refund', \u002F* ... *\u002F, version: 1 } })\n","typescript","",[530,550,551,574,597,639,676,693,702,709,716],{"__ignoreMap":548},[552,553,556,560,564,568,571],"span",{"class":554,"line":555},"line",1,[552,557,559],{"class":558},"sTEyZ","log",[552,561,563],{"class":562},"sMK4o",".",[552,565,567],{"class":566},"s2Zo4","audit",[552,569,570],{"class":558},"(",[552,572,573],{"class":562},"{\n",[552,575,577,581,584,587,591,594],{"class":554,"line":576},2,[552,578,580],{"class":579},"swJcz","  action",[552,582,583],{"class":562},":",[552,585,586],{"class":562}," '",[552,588,590],{"class":589},"sfazB","invoice.refund",[552,592,593],{"class":562},"'",[552,595,596],{"class":562},",\n",[552,598,600,603,605,608,611,613,615,618,620,623,626,628,631,633,636],{"class":554,"line":599},3,[552,601,602],{"class":579},"  actor",[552,604,583],{"class":562},[552,606,607],{"class":562}," {",[552,609,610],{"class":579}," type",[552,612,583],{"class":562},[552,614,586],{"class":562},[552,616,617],{"class":589},"user",[552,619,593],{"class":562},[552,621,622],{"class":562},",",[552,624,625],{"class":579}," id",[552,627,583],{"class":562},[552,629,630],{"class":558}," user",[552,632,563],{"class":562},[552,634,635],{"class":558},"id ",[552,637,638],{"class":562},"},\n",[552,640,642,645,647,649,651,653,655,658,660,662,664,666,668,671,673],{"class":554,"line":641},4,[552,643,644],{"class":579},"  target",[552,646,583],{"class":562},[552,648,607],{"class":562},[552,650,610],{"class":579},[552,652,583],{"class":562},[552,654,586],{"class":562},[552,656,657],{"class":589},"invoice",[552,659,593],{"class":562},[552,661,622],{"class":562},[552,663,625],{"class":579},[552,665,583],{"class":562},[552,667,586],{"class":562},[552,669,670],{"class":589},"inv_889",[552,672,593],{"class":562},[552,674,675],{"class":562}," },\n",[552,677,679,682,684,686,689,691],{"class":554,"line":678},5,[552,680,681],{"class":579},"  outcome",[552,683,583],{"class":562},[552,685,586],{"class":562},[552,687,688],{"class":589},"success",[552,690,593],{"class":562},[552,692,596],{"class":562},[552,694,696,699],{"class":554,"line":695},6,[552,697,698],{"class":562},"}",[552,700,701],{"class":558},")\n",[552,703,705],{"class":554,"line":704},7,[552,706,708],{"emptyLinePlaceholder":707},true,"\n",[552,710,712],{"class":554,"line":711},8,[552,713,715],{"class":714},"sHwdD","\u002F\u002F Strictly equivalent to:\n",[552,717,719,721,723,726,728,731,734,736,738,741,743,745,747,749,751,754,756,759,761,765,768,770],{"class":554,"line":718},9,[552,720,559],{"class":558},[552,722,563],{"class":562},[552,724,725],{"class":566},"set",[552,727,570],{"class":558},[552,729,730],{"class":562},"{",[552,732,733],{"class":579}," audit",[552,735,583],{"class":562},[552,737,607],{"class":562},[552,739,740],{"class":579}," action",[552,742,583],{"class":562},[552,744,586],{"class":562},[552,746,590],{"class":589},[552,748,593],{"class":562},[552,750,622],{"class":562},[552,752,753],{"class":714}," \u002F* ... *\u002F",[552,755,622],{"class":562},[552,757,758],{"class":579}," version",[552,760,583],{"class":562},[552,762,764],{"class":763},"sbssI"," 1",[552,766,767],{"class":562}," }",[552,769,767],{"class":562},[552,771,701],{"class":558},[522,773,774],{},"This is the form you'll use most. The audit event lands on the same wide event as the rest of the request.",[526,776,778],{"id":777},"logauditdeny",[530,779,780],{},"log.audit.deny()",[522,782,783,786],{},[530,784,785],{},"log.audit.deny(reason, fields)"," records AuthZ-denied actions. Most teams forget to log denials, but they're exactly what auditors and security teams ask for:",[788,789,790,981],"code-group",{},[543,791,794],{"className":545,"code":792,"filename":793,"language":547,"meta":548,"style":548},"if (!user.canRefund(invoice)) {\n  log.audit.deny('Insufficient permissions', {\n    action: 'invoice.refund',\n    actor: { type: 'user', id: user.id },\n    target: { type: 'invoice', id: invoice.id },\n  })\n  throw createError({ status: 403, message: 'Forbidden' })\n}\n","Input",[530,795,796,820,848,863,897,931,938,976],{"__ignoreMap":548},[552,797,798,802,805,808,810,812,815,818],{"class":554,"line":555},[552,799,801],{"class":800},"s7zQu","if",[552,803,804],{"class":558}," (",[552,806,807],{"class":562},"!",[552,809,617],{"class":558},[552,811,563],{"class":562},[552,813,814],{"class":566},"canRefund",[552,816,817],{"class":558},"(invoice)) ",[552,819,573],{"class":562},[552,821,822,825,827,829,831,834,836,838,841,843,845],{"class":554,"line":576},[552,823,824],{"class":558},"  log",[552,826,563],{"class":562},[552,828,567],{"class":558},[552,830,563],{"class":562},[552,832,833],{"class":566},"deny",[552,835,570],{"class":579},[552,837,593],{"class":562},[552,839,840],{"class":589},"Insufficient permissions",[552,842,593],{"class":562},[552,844,622],{"class":562},[552,846,847],{"class":562}," {\n",[552,849,850,853,855,857,859,861],{"class":554,"line":599},[552,851,852],{"class":579},"    action",[552,854,583],{"class":562},[552,856,586],{"class":562},[552,858,590],{"class":589},[552,860,593],{"class":562},[552,862,596],{"class":562},[552,864,865,868,870,872,874,876,878,880,882,884,886,888,890,892,895],{"class":554,"line":641},[552,866,867],{"class":579},"    actor",[552,869,583],{"class":562},[552,871,607],{"class":562},[552,873,610],{"class":579},[552,875,583],{"class":562},[552,877,586],{"class":562},[552,879,617],{"class":589},[552,881,593],{"class":562},[552,883,622],{"class":562},[552,885,625],{"class":579},[552,887,583],{"class":562},[552,889,630],{"class":558},[552,891,563],{"class":562},[552,893,894],{"class":558},"id",[552,896,675],{"class":562},[552,898,899,902,904,906,908,910,912,914,916,918,920,922,925,927,929],{"class":554,"line":678},[552,900,901],{"class":579},"    target",[552,903,583],{"class":562},[552,905,607],{"class":562},[552,907,610],{"class":579},[552,909,583],{"class":562},[552,911,586],{"class":562},[552,913,657],{"class":589},[552,915,593],{"class":562},[552,917,622],{"class":562},[552,919,625],{"class":579},[552,921,583],{"class":562},[552,923,924],{"class":558}," invoice",[552,926,563],{"class":562},[552,928,894],{"class":558},[552,930,675],{"class":562},[552,932,933,936],{"class":554,"line":695},[552,934,935],{"class":562},"  }",[552,937,701],{"class":579},[552,939,940,943,946,948,950,953,955,958,960,963,965,967,970,972,974],{"class":554,"line":704},[552,941,942],{"class":800},"  throw",[552,944,945],{"class":566}," createError",[552,947,570],{"class":579},[552,949,730],{"class":562},[552,951,952],{"class":579}," status",[552,954,583],{"class":562},[552,956,957],{"class":763}," 403",[552,959,622],{"class":562},[552,961,962],{"class":579}," message",[552,964,583],{"class":562},[552,966,586],{"class":562},[552,968,969],{"class":589},"Forbidden",[552,971,593],{"class":562},[552,973,767],{"class":562},[552,975,701],{"class":579},[552,977,978],{"class":554,"line":711},[552,979,980],{"class":562},"}\n",[543,982,987],{"className":983,"code":984,"filename":985,"language":986,"meta":548,"style":548},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"level\": \"warn\",\n  \"service\": \"billing-api\",\n  \"method\": \"POST\",\n  \"path\": \"\u002Fapi\u002Finvoices\u002Finv_889\u002Frefund\",\n  \"status\": 403,\n  \"duration\": \"12ms\",\n  \"requestId\": \"9c3f7d12-8a45-4e60-b8a9-1f0d4c5e6e7d\",\n  \"audit\": {\n    \"action\": \"invoice.refund\",\n    \"actor\": { \"type\": \"user\", \"id\": \"usr_intruder\" },\n    \"target\": { \"type\": \"invoice\", \"id\": \"inv_889\" },\n    \"outcome\": \"denied\",\n    \"reason\": \"Insufficient permissions\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_d12c3a4f5b6e7d8c\",\n    \"context\": {\n      \"requestId\": \"9c3f7d12-8a45-4e60-b8a9-1f0d4c5e6e7d\",\n      \"ip\": \"203.0.113.7\"\n    }\n  }\n}\n","Output — denied","json",[530,988,989,993,1017,1037,1057,1077,1092,1112,1132,1144,1166,1214,1260,1281,1301,1317,1338,1352,1372,1392,1398,1404],{"__ignoreMap":548},[552,990,991],{"class":554,"line":555},[552,992,573],{"class":562},[552,994,995,998,1002,1005,1007,1010,1013,1015],{"class":554,"line":576},[552,996,997],{"class":562},"  \"",[552,999,1001],{"class":1000},"spNyl","level",[552,1003,1004],{"class":562},"\"",[552,1006,583],{"class":562},[552,1008,1009],{"class":562}," \"",[552,1011,1012],{"class":589},"warn",[552,1014,1004],{"class":562},[552,1016,596],{"class":562},[552,1018,1019,1021,1024,1026,1028,1030,1033,1035],{"class":554,"line":599},[552,1020,997],{"class":562},[552,1022,1023],{"class":1000},"service",[552,1025,1004],{"class":562},[552,1027,583],{"class":562},[552,1029,1009],{"class":562},[552,1031,1032],{"class":589},"billing-api",[552,1034,1004],{"class":562},[552,1036,596],{"class":562},[552,1038,1039,1041,1044,1046,1048,1050,1053,1055],{"class":554,"line":641},[552,1040,997],{"class":562},[552,1042,1043],{"class":1000},"method",[552,1045,1004],{"class":562},[552,1047,583],{"class":562},[552,1049,1009],{"class":562},[552,1051,1052],{"class":589},"POST",[552,1054,1004],{"class":562},[552,1056,596],{"class":562},[552,1058,1059,1061,1064,1066,1068,1070,1073,1075],{"class":554,"line":678},[552,1060,997],{"class":562},[552,1062,1063],{"class":1000},"path",[552,1065,1004],{"class":562},[552,1067,583],{"class":562},[552,1069,1009],{"class":562},[552,1071,1072],{"class":589},"\u002Fapi\u002Finvoices\u002Finv_889\u002Frefund",[552,1074,1004],{"class":562},[552,1076,596],{"class":562},[552,1078,1079,1081,1084,1086,1088,1090],{"class":554,"line":695},[552,1080,997],{"class":562},[552,1082,1083],{"class":1000},"status",[552,1085,1004],{"class":562},[552,1087,583],{"class":562},[552,1089,957],{"class":763},[552,1091,596],{"class":562},[552,1093,1094,1096,1099,1101,1103,1105,1108,1110],{"class":554,"line":704},[552,1095,997],{"class":562},[552,1097,1098],{"class":1000},"duration",[552,1100,1004],{"class":562},[552,1102,583],{"class":562},[552,1104,1009],{"class":562},[552,1106,1107],{"class":589},"12ms",[552,1109,1004],{"class":562},[552,1111,596],{"class":562},[552,1113,1114,1116,1119,1121,1123,1125,1128,1130],{"class":554,"line":711},[552,1115,997],{"class":562},[552,1117,1118],{"class":1000},"requestId",[552,1120,1004],{"class":562},[552,1122,583],{"class":562},[552,1124,1009],{"class":562},[552,1126,1127],{"class":589},"9c3f7d12-8a45-4e60-b8a9-1f0d4c5e6e7d",[552,1129,1004],{"class":562},[552,1131,596],{"class":562},[552,1133,1134,1136,1138,1140,1142],{"class":554,"line":718},[552,1135,997],{"class":562},[552,1137,567],{"class":1000},[552,1139,1004],{"class":562},[552,1141,583],{"class":562},[552,1143,847],{"class":562},[552,1145,1147,1150,1154,1156,1158,1160,1162,1164],{"class":554,"line":1146},10,[552,1148,1149],{"class":562},"    \"",[552,1151,1153],{"class":1152},"sBMFI","action",[552,1155,1004],{"class":562},[552,1157,583],{"class":562},[552,1159,1009],{"class":562},[552,1161,590],{"class":589},[552,1163,1004],{"class":562},[552,1165,596],{"class":562},[552,1167,1169,1171,1174,1176,1178,1180,1182,1185,1187,1189,1191,1193,1195,1197,1199,1201,1203,1205,1207,1210,1212],{"class":554,"line":1168},11,[552,1170,1149],{"class":562},[552,1172,1173],{"class":1152},"actor",[552,1175,1004],{"class":562},[552,1177,583],{"class":562},[552,1179,607],{"class":562},[552,1181,1009],{"class":562},[552,1183,1184],{"class":763},"type",[552,1186,1004],{"class":562},[552,1188,583],{"class":562},[552,1190,1009],{"class":562},[552,1192,617],{"class":589},[552,1194,1004],{"class":562},[552,1196,622],{"class":562},[552,1198,1009],{"class":562},[552,1200,894],{"class":763},[552,1202,1004],{"class":562},[552,1204,583],{"class":562},[552,1206,1009],{"class":562},[552,1208,1209],{"class":589},"usr_intruder",[552,1211,1004],{"class":562},[552,1213,675],{"class":562},[552,1215,1217,1219,1222,1224,1226,1228,1230,1232,1234,1236,1238,1240,1242,1244,1246,1248,1250,1252,1254,1256,1258],{"class":554,"line":1216},12,[552,1218,1149],{"class":562},[552,1220,1221],{"class":1152},"target",[552,1223,1004],{"class":562},[552,1225,583],{"class":562},[552,1227,607],{"class":562},[552,1229,1009],{"class":562},[552,1231,1184],{"class":763},[552,1233,1004],{"class":562},[552,1235,583],{"class":562},[552,1237,1009],{"class":562},[552,1239,657],{"class":589},[552,1241,1004],{"class":562},[552,1243,622],{"class":562},[552,1245,1009],{"class":562},[552,1247,894],{"class":763},[552,1249,1004],{"class":562},[552,1251,583],{"class":562},[552,1253,1009],{"class":562},[552,1255,670],{"class":589},[552,1257,1004],{"class":562},[552,1259,675],{"class":562},[552,1261,1263,1265,1268,1270,1272,1274,1277,1279],{"class":554,"line":1262},13,[552,1264,1149],{"class":562},[552,1266,1267],{"class":1152},"outcome",[552,1269,1004],{"class":562},[552,1271,583],{"class":562},[552,1273,1009],{"class":562},[552,1275,1276],{"class":589},"denied",[552,1278,1004],{"class":562},[552,1280,596],{"class":562},[552,1282,1284,1286,1289,1291,1293,1295,1297,1299],{"class":554,"line":1283},14,[552,1285,1149],{"class":562},[552,1287,1288],{"class":1152},"reason",[552,1290,1004],{"class":562},[552,1292,583],{"class":562},[552,1294,1009],{"class":562},[552,1296,840],{"class":589},[552,1298,1004],{"class":562},[552,1300,596],{"class":562},[552,1302,1304,1306,1309,1311,1313,1315],{"class":554,"line":1303},15,[552,1305,1149],{"class":562},[552,1307,1308],{"class":1152},"version",[552,1310,1004],{"class":562},[552,1312,583],{"class":562},[552,1314,764],{"class":763},[552,1316,596],{"class":562},[552,1318,1320,1322,1325,1327,1329,1331,1334,1336],{"class":554,"line":1319},16,[552,1321,1149],{"class":562},[552,1323,1324],{"class":1152},"idempotencyKey",[552,1326,1004],{"class":562},[552,1328,583],{"class":562},[552,1330,1009],{"class":562},[552,1332,1333],{"class":589},"ak_d12c3a4f5b6e7d8c",[552,1335,1004],{"class":562},[552,1337,596],{"class":562},[552,1339,1341,1343,1346,1348,1350],{"class":554,"line":1340},17,[552,1342,1149],{"class":562},[552,1344,1345],{"class":1152},"context",[552,1347,1004],{"class":562},[552,1349,583],{"class":562},[552,1351,847],{"class":562},[552,1353,1355,1358,1360,1362,1364,1366,1368,1370],{"class":554,"line":1354},18,[552,1356,1357],{"class":562},"      \"",[552,1359,1118],{"class":763},[552,1361,1004],{"class":562},[552,1363,583],{"class":562},[552,1365,1009],{"class":562},[552,1367,1127],{"class":589},[552,1369,1004],{"class":562},[552,1371,596],{"class":562},[552,1373,1375,1377,1380,1382,1384,1386,1389],{"class":554,"line":1374},19,[552,1376,1357],{"class":562},[552,1378,1379],{"class":763},"ip",[552,1381,1004],{"class":562},[552,1383,583],{"class":562},[552,1385,1009],{"class":562},[552,1387,1388],{"class":589},"203.0.113.7",[552,1390,1391],{"class":562},"\"\n",[552,1393,1395],{"class":554,"line":1394},20,[552,1396,1397],{"class":562},"    }\n",[552,1399,1401],{"class":554,"line":1400},21,[552,1402,1403],{"class":562},"  }\n",[552,1405,1407],{"class":554,"line":1406},22,[552,1408,980],{"class":562},[526,1410,1412,1413],{"id":1411},"standalone-audit","Standalone ",[530,1414,1415],{},"audit()",[522,1417,1418,1419,583],{},"For non-request contexts (jobs, scripts, CLIs), use the standalone ",[530,1420,1415],{},[788,1422,1423,1566],{},[543,1424,1427],{"className":545,"code":1425,"filename":1426,"language":547,"meta":548,"style":548},"import { audit } from 'evlog'\n\naudit({\n  action: 'cron.cleanup',\n  actor: { type: 'system', id: 'cron' },\n  target: { type: 'job', id: 'cleanup-stale-sessions' },\n  outcome: 'success',\n})\n","scripts\u002Fcleanup.ts",[530,1428,1429,1451,1455,1463,1478,1512,1546,1560],{"__ignoreMap":548},[552,1430,1431,1434,1436,1438,1440,1443,1445,1448],{"class":554,"line":555},[552,1432,1433],{"class":800},"import",[552,1435,607],{"class":562},[552,1437,733],{"class":558},[552,1439,767],{"class":562},[552,1441,1442],{"class":800}," from",[552,1444,586],{"class":562},[552,1446,1447],{"class":589},"evlog",[552,1449,1450],{"class":562},"'\n",[552,1452,1453],{"class":554,"line":576},[552,1454,708],{"emptyLinePlaceholder":707},[552,1456,1457,1459,1461],{"class":554,"line":599},[552,1458,567],{"class":566},[552,1460,570],{"class":558},[552,1462,573],{"class":562},[552,1464,1465,1467,1469,1471,1474,1476],{"class":554,"line":641},[552,1466,580],{"class":579},[552,1468,583],{"class":562},[552,1470,586],{"class":562},[552,1472,1473],{"class":589},"cron.cleanup",[552,1475,593],{"class":562},[552,1477,596],{"class":562},[552,1479,1480,1482,1484,1486,1488,1490,1492,1495,1497,1499,1501,1503,1505,1508,1510],{"class":554,"line":678},[552,1481,602],{"class":579},[552,1483,583],{"class":562},[552,1485,607],{"class":562},[552,1487,610],{"class":579},[552,1489,583],{"class":562},[552,1491,586],{"class":562},[552,1493,1494],{"class":589},"system",[552,1496,593],{"class":562},[552,1498,622],{"class":562},[552,1500,625],{"class":579},[552,1502,583],{"class":562},[552,1504,586],{"class":562},[552,1506,1507],{"class":589},"cron",[552,1509,593],{"class":562},[552,1511,675],{"class":562},[552,1513,1514,1516,1518,1520,1522,1524,1526,1529,1531,1533,1535,1537,1539,1542,1544],{"class":554,"line":695},[552,1515,644],{"class":579},[552,1517,583],{"class":562},[552,1519,607],{"class":562},[552,1521,610],{"class":579},[552,1523,583],{"class":562},[552,1525,586],{"class":562},[552,1527,1528],{"class":589},"job",[552,1530,593],{"class":562},[552,1532,622],{"class":562},[552,1534,625],{"class":579},[552,1536,583],{"class":562},[552,1538,586],{"class":562},[552,1540,1541],{"class":589},"cleanup-stale-sessions",[552,1543,593],{"class":562},[552,1545,675],{"class":562},[552,1547,1548,1550,1552,1554,1556,1558],{"class":554,"line":704},[552,1549,681],{"class":579},[552,1551,583],{"class":562},[552,1553,586],{"class":562},[552,1555,688],{"class":589},[552,1557,593],{"class":562},[552,1559,596],{"class":562},[552,1561,1562,1564],{"class":554,"line":711},[552,1563,698],{"class":562},[552,1565,701],{"class":558},[543,1567,1570],{"className":983,"code":1568,"filename":1569,"language":986,"meta":548,"style":548},"{\n  \"level\": \"info\",\n  \"service\": \"billing-api\",\n  \"audit\": {\n    \"action\": \"cron.cleanup\",\n    \"actor\": { \"type\": \"system\", \"id\": \"cron\" },\n    \"target\": { \"type\": \"job\", \"id\": \"cleanup-stale-sessions\" },\n    \"outcome\": \"success\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_2b8e1f9d4c6a7b3e\"\n  }\n}\n","Output — wide event",[530,1571,1572,1576,1595,1613,1625,1643,1687,1731,1749,1763,1780,1784],{"__ignoreMap":548},[552,1573,1574],{"class":554,"line":555},[552,1575,573],{"class":562},[552,1577,1578,1580,1582,1584,1586,1588,1591,1593],{"class":554,"line":576},[552,1579,997],{"class":562},[552,1581,1001],{"class":1000},[552,1583,1004],{"class":562},[552,1585,583],{"class":562},[552,1587,1009],{"class":562},[552,1589,1590],{"class":589},"info",[552,1592,1004],{"class":562},[552,1594,596],{"class":562},[552,1596,1597,1599,1601,1603,1605,1607,1609,1611],{"class":554,"line":599},[552,1598,997],{"class":562},[552,1600,1023],{"class":1000},[552,1602,1004],{"class":562},[552,1604,583],{"class":562},[552,1606,1009],{"class":562},[552,1608,1032],{"class":589},[552,1610,1004],{"class":562},[552,1612,596],{"class":562},[552,1614,1615,1617,1619,1621,1623],{"class":554,"line":641},[552,1616,997],{"class":562},[552,1618,567],{"class":1000},[552,1620,1004],{"class":562},[552,1622,583],{"class":562},[552,1624,847],{"class":562},[552,1626,1627,1629,1631,1633,1635,1637,1639,1641],{"class":554,"line":678},[552,1628,1149],{"class":562},[552,1630,1153],{"class":1152},[552,1632,1004],{"class":562},[552,1634,583],{"class":562},[552,1636,1009],{"class":562},[552,1638,1473],{"class":589},[552,1640,1004],{"class":562},[552,1642,596],{"class":562},[552,1644,1645,1647,1649,1651,1653,1655,1657,1659,1661,1663,1665,1667,1669,1671,1673,1675,1677,1679,1681,1683,1685],{"class":554,"line":695},[552,1646,1149],{"class":562},[552,1648,1173],{"class":1152},[552,1650,1004],{"class":562},[552,1652,583],{"class":562},[552,1654,607],{"class":562},[552,1656,1009],{"class":562},[552,1658,1184],{"class":763},[552,1660,1004],{"class":562},[552,1662,583],{"class":562},[552,1664,1009],{"class":562},[552,1666,1494],{"class":589},[552,1668,1004],{"class":562},[552,1670,622],{"class":562},[552,1672,1009],{"class":562},[552,1674,894],{"class":763},[552,1676,1004],{"class":562},[552,1678,583],{"class":562},[552,1680,1009],{"class":562},[552,1682,1507],{"class":589},[552,1684,1004],{"class":562},[552,1686,675],{"class":562},[552,1688,1689,1691,1693,1695,1697,1699,1701,1703,1705,1707,1709,1711,1713,1715,1717,1719,1721,1723,1725,1727,1729],{"class":554,"line":704},[552,1690,1149],{"class":562},[552,1692,1221],{"class":1152},[552,1694,1004],{"class":562},[552,1696,583],{"class":562},[552,1698,607],{"class":562},[552,1700,1009],{"class":562},[552,1702,1184],{"class":763},[552,1704,1004],{"class":562},[552,1706,583],{"class":562},[552,1708,1009],{"class":562},[552,1710,1528],{"class":589},[552,1712,1004],{"class":562},[552,1714,622],{"class":562},[552,1716,1009],{"class":562},[552,1718,894],{"class":763},[552,1720,1004],{"class":562},[552,1722,583],{"class":562},[552,1724,1009],{"class":562},[552,1726,1541],{"class":589},[552,1728,1004],{"class":562},[552,1730,675],{"class":562},[552,1732,1733,1735,1737,1739,1741,1743,1745,1747],{"class":554,"line":711},[552,1734,1149],{"class":562},[552,1736,1267],{"class":1152},[552,1738,1004],{"class":562},[552,1740,583],{"class":562},[552,1742,1009],{"class":562},[552,1744,688],{"class":589},[552,1746,1004],{"class":562},[552,1748,596],{"class":562},[552,1750,1751,1753,1755,1757,1759,1761],{"class":554,"line":718},[552,1752,1149],{"class":562},[552,1754,1308],{"class":1152},[552,1756,1004],{"class":562},[552,1758,583],{"class":562},[552,1760,764],{"class":763},[552,1762,596],{"class":562},[552,1764,1765,1767,1769,1771,1773,1775,1778],{"class":554,"line":1146},[552,1766,1149],{"class":562},[552,1768,1324],{"class":1152},[552,1770,1004],{"class":562},[552,1772,583],{"class":562},[552,1774,1009],{"class":562},[552,1776,1777],{"class":589},"ak_2b8e1f9d4c6a7b3e",[552,1779,1391],{"class":562},[552,1781,1782],{"class":554,"line":1168},[552,1783,1403],{"class":562},[552,1785,1786],{"class":554,"line":1216},[552,1787,980],{"class":562},[1789,1790,1412,1791,1793,1794,1796,1797,1796,1800,1803,1804,1807],"note",{},[530,1792,1415],{}," events have no ",[530,1795,1118],{},", no ",[530,1798,1799],{},"context.ip",[530,1801,1802],{},"userAgent"," — there is no request to enrich from. Add your own context manually (",[530,1805,1806],{},"context: { jobId, queue, runId }",") when it matters for forensics.",[526,1809,1811],{"id":1810},"defineauditaction",[530,1812,1813],{},"defineAuditAction()",[522,1815,1816,1817,583],{},"Define audit actions in one place to avoid magic strings and get full type-safety on ",[530,1818,1221],{},[543,1820,1822],{"className":545,"code":1821,"language":547,"meta":548,"style":548},"import { defineAuditAction } from 'evlog'\n\nconst refund = defineAuditAction('invoice.refund', { target: 'invoice' })\n\nlog.audit(refund({\n  actor: { type: 'user', id: user.id },\n  target: { id: 'inv_889' }, \u002F\u002F type inferred as 'invoice'\n  outcome: 'success',\n}))\n",[530,1823,1824,1843,1847,1887,1891,1908,1940,1964,1978],{"__ignoreMap":548},[552,1825,1826,1828,1830,1833,1835,1837,1839,1841],{"class":554,"line":555},[552,1827,1433],{"class":800},[552,1829,607],{"class":562},[552,1831,1832],{"class":558}," defineAuditAction",[552,1834,767],{"class":562},[552,1836,1442],{"class":800},[552,1838,586],{"class":562},[552,1840,1447],{"class":589},[552,1842,1450],{"class":562},[552,1844,1845],{"class":554,"line":576},[552,1846,708],{"emptyLinePlaceholder":707},[552,1848,1849,1852,1855,1858,1860,1862,1864,1866,1868,1870,1872,1875,1877,1879,1881,1883,1885],{"class":554,"line":599},[552,1850,1851],{"class":1000},"const",[552,1853,1854],{"class":558}," refund ",[552,1856,1857],{"class":562},"=",[552,1859,1832],{"class":566},[552,1861,570],{"class":558},[552,1863,593],{"class":562},[552,1865,590],{"class":589},[552,1867,593],{"class":562},[552,1869,622],{"class":562},[552,1871,607],{"class":562},[552,1873,1874],{"class":579}," target",[552,1876,583],{"class":562},[552,1878,586],{"class":562},[552,1880,657],{"class":589},[552,1882,593],{"class":562},[552,1884,767],{"class":562},[552,1886,701],{"class":558},[552,1888,1889],{"class":554,"line":641},[552,1890,708],{"emptyLinePlaceholder":707},[552,1892,1893,1895,1897,1899,1901,1904,1906],{"class":554,"line":678},[552,1894,559],{"class":558},[552,1896,563],{"class":562},[552,1898,567],{"class":566},[552,1900,570],{"class":558},[552,1902,1903],{"class":566},"refund",[552,1905,570],{"class":558},[552,1907,573],{"class":562},[552,1909,1910,1912,1914,1916,1918,1920,1922,1924,1926,1928,1930,1932,1934,1936,1938],{"class":554,"line":695},[552,1911,602],{"class":579},[552,1913,583],{"class":562},[552,1915,607],{"class":562},[552,1917,610],{"class":579},[552,1919,583],{"class":562},[552,1921,586],{"class":562},[552,1923,617],{"class":589},[552,1925,593],{"class":562},[552,1927,622],{"class":562},[552,1929,625],{"class":579},[552,1931,583],{"class":562},[552,1933,630],{"class":558},[552,1935,563],{"class":562},[552,1937,635],{"class":558},[552,1939,638],{"class":562},[552,1941,1942,1944,1946,1948,1950,1952,1954,1956,1958,1961],{"class":554,"line":704},[552,1943,644],{"class":579},[552,1945,583],{"class":562},[552,1947,607],{"class":562},[552,1949,625],{"class":579},[552,1951,583],{"class":562},[552,1953,586],{"class":562},[552,1955,670],{"class":589},[552,1957,593],{"class":562},[552,1959,1960],{"class":562}," },",[552,1962,1963],{"class":714}," \u002F\u002F type inferred as 'invoice'\n",[552,1965,1966,1968,1970,1972,1974,1976],{"class":554,"line":711},[552,1967,681],{"class":579},[552,1969,583],{"class":562},[552,1971,586],{"class":562},[552,1973,688],{"class":589},[552,1975,593],{"class":562},[552,1977,596],{"class":562},[552,1979,1980,1982],{"class":554,"line":718},[552,1981,698],{"class":562},[552,1983,1984],{"class":558},"))\n",[522,1986,1987,1988,563],{},"Pair this with the action dictionary from ",[1989,1990,1992],"a",{"href":1991},"\u002Fuse-cases\u002Faudit\u002Fschema#action-naming","Schema → Action naming",[526,1994,1996],{"id":1995},"defineauditcatalog",[530,1997,1998],{},"defineAuditCatalog()",[522,2000,2001,2002,2006,2007,2010,2011,2014,2015,2018,2019,2021,2022,563],{},"For more than a handful of actions, group them in a typed ",[2003,2004,2005],"strong",{},"catalog"," instead of declaring ",[530,2008,2009],{},"defineAuditAction"," one-by-one. Same convention as error catalogs: ",[530,2012,2013],{},"UPPER_SNAKE_CASE"," keys, ",[530,2016,2017],{},"lower.dot.case"," prefix, wire ",[530,2020,1153],{}," is ",[530,2023,2024],{},"${prefix}.${KEY}",[788,2026,2027,2285],{},[543,2028,2031],{"className":545,"code":2029,"filename":2030,"language":547,"meta":548,"style":548},"import { defineAuditCatalog } from 'evlog'\n\nexport const billingAudit = defineAuditCatalog('billing', {\n  INVOICE_REFUND: {\n    target: 'invoice',\n    severity: 'high',\n    requiresChanges: true,\n    description: 'Refund an invoice to the customer',\n    redactPaths: ['cardNumber'],\n  },\n  INVOICE_CREATE:      { target: 'invoice' },\n  INVOICE_VOID:        { target: 'invoice', severity: 'high', requiresReason: true },\n  SUBSCRIPTION_CANCEL: { target: 'subscription', severity: 'high' },\n})\n","audit\u002Fbilling.ts",[530,2032,2033,2052,2056,2084,2093,2107,2123,2136,2152,2174,2179,2201,2245,2279],{"__ignoreMap":548},[552,2034,2035,2037,2039,2042,2044,2046,2048,2050],{"class":554,"line":555},[552,2036,1433],{"class":800},[552,2038,607],{"class":562},[552,2040,2041],{"class":558}," defineAuditCatalog",[552,2043,767],{"class":562},[552,2045,1442],{"class":800},[552,2047,586],{"class":562},[552,2049,1447],{"class":589},[552,2051,1450],{"class":562},[552,2053,2054],{"class":554,"line":576},[552,2055,708],{"emptyLinePlaceholder":707},[552,2057,2058,2061,2064,2067,2069,2071,2073,2075,2078,2080,2082],{"class":554,"line":599},[552,2059,2060],{"class":800},"export",[552,2062,2063],{"class":1000}," const",[552,2065,2066],{"class":558}," billingAudit ",[552,2068,1857],{"class":562},[552,2070,2041],{"class":566},[552,2072,570],{"class":558},[552,2074,593],{"class":562},[552,2076,2077],{"class":589},"billing",[552,2079,593],{"class":562},[552,2081,622],{"class":562},[552,2083,847],{"class":562},[552,2085,2086,2089,2091],{"class":554,"line":641},[552,2087,2088],{"class":579},"  INVOICE_REFUND",[552,2090,583],{"class":562},[552,2092,847],{"class":562},[552,2094,2095,2097,2099,2101,2103,2105],{"class":554,"line":678},[552,2096,901],{"class":579},[552,2098,583],{"class":562},[552,2100,586],{"class":562},[552,2102,657],{"class":589},[552,2104,593],{"class":562},[552,2106,596],{"class":562},[552,2108,2109,2112,2114,2116,2119,2121],{"class":554,"line":695},[552,2110,2111],{"class":579},"    severity",[552,2113,583],{"class":562},[552,2115,586],{"class":562},[552,2117,2118],{"class":589},"high",[552,2120,593],{"class":562},[552,2122,596],{"class":562},[552,2124,2125,2128,2130,2134],{"class":554,"line":704},[552,2126,2127],{"class":579},"    requiresChanges",[552,2129,583],{"class":562},[552,2131,2133],{"class":2132},"sfNiH"," true",[552,2135,596],{"class":562},[552,2137,2138,2141,2143,2145,2148,2150],{"class":554,"line":711},[552,2139,2140],{"class":579},"    description",[552,2142,583],{"class":562},[552,2144,586],{"class":562},[552,2146,2147],{"class":589},"Refund an invoice to the customer",[552,2149,593],{"class":562},[552,2151,596],{"class":562},[552,2153,2154,2157,2159,2162,2164,2167,2169,2172],{"class":554,"line":718},[552,2155,2156],{"class":579},"    redactPaths",[552,2158,583],{"class":562},[552,2160,2161],{"class":558}," [",[552,2163,593],{"class":562},[552,2165,2166],{"class":589},"cardNumber",[552,2168,593],{"class":562},[552,2170,2171],{"class":558},"]",[552,2173,596],{"class":562},[552,2175,2176],{"class":554,"line":1146},[552,2177,2178],{"class":562},"  },\n",[552,2180,2181,2184,2186,2189,2191,2193,2195,2197,2199],{"class":554,"line":1168},[552,2182,2183],{"class":579},"  INVOICE_CREATE",[552,2185,583],{"class":562},[552,2187,2188],{"class":562},"      {",[552,2190,1874],{"class":579},[552,2192,583],{"class":562},[552,2194,586],{"class":562},[552,2196,657],{"class":589},[552,2198,593],{"class":562},[552,2200,675],{"class":562},[552,2202,2203,2206,2208,2211,2213,2215,2217,2219,2221,2223,2226,2228,2230,2232,2234,2236,2239,2241,2243],{"class":554,"line":1216},[552,2204,2205],{"class":579},"  INVOICE_VOID",[552,2207,583],{"class":562},[552,2209,2210],{"class":562},"        {",[552,2212,1874],{"class":579},[552,2214,583],{"class":562},[552,2216,586],{"class":562},[552,2218,657],{"class":589},[552,2220,593],{"class":562},[552,2222,622],{"class":562},[552,2224,2225],{"class":579}," severity",[552,2227,583],{"class":562},[552,2229,586],{"class":562},[552,2231,2118],{"class":589},[552,2233,593],{"class":562},[552,2235,622],{"class":562},[552,2237,2238],{"class":579}," requiresReason",[552,2240,583],{"class":562},[552,2242,2133],{"class":2132},[552,2244,675],{"class":562},[552,2246,2247,2250,2252,2254,2256,2258,2260,2263,2265,2267,2269,2271,2273,2275,2277],{"class":554,"line":1262},[552,2248,2249],{"class":579},"  SUBSCRIPTION_CANCEL",[552,2251,583],{"class":562},[552,2253,607],{"class":562},[552,2255,1874],{"class":579},[552,2257,583],{"class":562},[552,2259,586],{"class":562},[552,2261,2262],{"class":589},"subscription",[552,2264,593],{"class":562},[552,2266,622],{"class":562},[552,2268,2225],{"class":579},[552,2270,583],{"class":562},[552,2272,586],{"class":562},[552,2274,2118],{"class":589},[552,2276,593],{"class":562},[552,2278,675],{"class":562},[552,2280,2281,2283],{"class":554,"line":1283},[552,2282,698],{"class":562},[552,2284,701],{"class":558},[543,2286,2289],{"className":545,"code":2287,"filename":2288,"language":547,"meta":548,"style":548},"import { billingAudit } from '~\u002Faudit\u002Fbilling'\n\nlog.audit(billingAudit.INVOICE_REFUND({\n  actor: { type: 'user', id: user.id },\n  target: { id: 'inv_889' }, \u002F\u002F type inferred as 'invoice'\n  outcome: 'success',\n}))\n","server\u002Fapi\u002Frefund.post.ts",[530,2290,2291,2311,2315,2335,2367,2389,2403],{"__ignoreMap":548},[552,2292,2293,2295,2297,2300,2302,2304,2306,2309],{"class":554,"line":555},[552,2294,1433],{"class":800},[552,2296,607],{"class":562},[552,2298,2299],{"class":558}," billingAudit",[552,2301,767],{"class":562},[552,2303,1442],{"class":800},[552,2305,586],{"class":562},[552,2307,2308],{"class":589},"~\u002Faudit\u002Fbilling",[552,2310,1450],{"class":562},[552,2312,2313],{"class":554,"line":576},[552,2314,708],{"emptyLinePlaceholder":707},[552,2316,2317,2319,2321,2323,2326,2328,2331,2333],{"class":554,"line":599},[552,2318,559],{"class":558},[552,2320,563],{"class":562},[552,2322,567],{"class":566},[552,2324,2325],{"class":558},"(billingAudit",[552,2327,563],{"class":562},[552,2329,2330],{"class":566},"INVOICE_REFUND",[552,2332,570],{"class":558},[552,2334,573],{"class":562},[552,2336,2337,2339,2341,2343,2345,2347,2349,2351,2353,2355,2357,2359,2361,2363,2365],{"class":554,"line":641},[552,2338,602],{"class":579},[552,2340,583],{"class":562},[552,2342,607],{"class":562},[552,2344,610],{"class":579},[552,2346,583],{"class":562},[552,2348,586],{"class":562},[552,2350,617],{"class":589},[552,2352,593],{"class":562},[552,2354,622],{"class":562},[552,2356,625],{"class":579},[552,2358,583],{"class":562},[552,2360,630],{"class":558},[552,2362,563],{"class":562},[552,2364,635],{"class":558},[552,2366,638],{"class":562},[552,2368,2369,2371,2373,2375,2377,2379,2381,2383,2385,2387],{"class":554,"line":678},[552,2370,644],{"class":579},[552,2372,583],{"class":562},[552,2374,607],{"class":562},[552,2376,625],{"class":579},[552,2378,583],{"class":562},[552,2380,586],{"class":562},[552,2382,670],{"class":589},[552,2384,593],{"class":562},[552,2386,1960],{"class":562},[552,2388,1963],{"class":714},[552,2390,2391,2393,2395,2397,2399,2401],{"class":554,"line":695},[552,2392,681],{"class":579},[552,2394,583],{"class":562},[552,2396,586],{"class":562},[552,2398,688],{"class":589},[552,2400,593],{"class":562},[552,2402,596],{"class":562},[552,2404,2405,2407],{"class":554,"line":704},[552,2406,698],{"class":562},[552,2408,1984],{"class":558},[522,2410,2411,2412,2414,2415,2418,2419,583],{},"Each entry produces a thin wrapper around ",[530,2413,2009],{}," (target type is fixed at definition time, action name is auto-prefixed). Catalog metadata is exposed on each factory and on ",[530,2416,2417],{},"_actions"," \u002F ",[530,2420,2421],{},"_prefix",[543,2423,2425],{"className":545,"code":2424,"language":547,"meta":548,"style":548},"billingAudit.INVOICE_REFUND.action           \u002F\u002F 'billing.INVOICE_REFUND' (literal type)\nbillingAudit.INVOICE_REFUND.target           \u002F\u002F 'invoice'\nbillingAudit.INVOICE_REFUND.severity         \u002F\u002F 'high'\nbillingAudit.INVOICE_REFUND.requiresChanges \u002F\u002F true\nbillingAudit.INVOICE_REFUND.redactPaths      \u002F\u002F ['cardNumber']\nbillingAudit._actions                        \u002F\u002F readonly ['billing.INVOICE_REFUND', ...]\n",[530,2426,2427,2444,2460,2476,2492,2508],{"__ignoreMap":548},[552,2428,2429,2432,2434,2436,2438,2441],{"class":554,"line":555},[552,2430,2431],{"class":558},"billingAudit",[552,2433,563],{"class":562},[552,2435,2330],{"class":558},[552,2437,563],{"class":562},[552,2439,2440],{"class":558},"action           ",[552,2442,2443],{"class":714},"\u002F\u002F 'billing.INVOICE_REFUND' (literal type)\n",[552,2445,2446,2448,2450,2452,2454,2457],{"class":554,"line":576},[552,2447,2431],{"class":558},[552,2449,563],{"class":562},[552,2451,2330],{"class":558},[552,2453,563],{"class":562},[552,2455,2456],{"class":558},"target           ",[552,2458,2459],{"class":714},"\u002F\u002F 'invoice'\n",[552,2461,2462,2464,2466,2468,2470,2473],{"class":554,"line":599},[552,2463,2431],{"class":558},[552,2465,563],{"class":562},[552,2467,2330],{"class":558},[552,2469,563],{"class":562},[552,2471,2472],{"class":558},"severity         ",[552,2474,2475],{"class":714},"\u002F\u002F 'high'\n",[552,2477,2478,2480,2482,2484,2486,2489],{"class":554,"line":641},[552,2479,2431],{"class":558},[552,2481,563],{"class":562},[552,2483,2330],{"class":558},[552,2485,563],{"class":562},[552,2487,2488],{"class":558},"requiresChanges ",[552,2490,2491],{"class":714},"\u002F\u002F true\n",[552,2493,2494,2496,2498,2500,2502,2505],{"class":554,"line":678},[552,2495,2431],{"class":558},[552,2497,563],{"class":562},[552,2499,2330],{"class":558},[552,2501,563],{"class":562},[552,2503,2504],{"class":558},"redactPaths      ",[552,2506,2507],{"class":714},"\u002F\u002F ['cardNumber']\n",[552,2509,2510,2512,2514,2517],{"class":554,"line":695},[552,2511,2431],{"class":558},[552,2513,563],{"class":562},[552,2515,2516],{"class":558},"_actions                        ",[552,2518,2519],{"class":714},"\u002F\u002F readonly ['billing.INVOICE_REFUND', ...]\n",[2521,2522,2523,2536],"table",{},[2524,2525,2526],"thead",{},[2527,2528,2529,2533],"tr",{},[2530,2531,2532],"th",{},"Entry field",[2530,2534,2535],{},"Purpose",[2537,2538,2539,2553,2563,2576,2594,2606],"tbody",{},[2527,2540,2541,2546],{},[2542,2543,2544],"td",{},[530,2545,1221],{},[2542,2547,2548,2549,2552],{},"Default ",[530,2550,2551],{},"target.type"," injected at call sites",[2527,2554,2555,2560],{},[2542,2556,2557],{},[530,2558,2559],{},"description",[2542,2561,2562],{},"Human-readable label for docs, SIEM rules, review tooling",[2527,2564,2565,2570],{},[2542,2566,2567],{},[530,2568,2569],{},"severity",[2542,2571,2572,2575],{},[530,2573,2574],{},"'low' | 'medium' | 'high' | 'critical'"," — alerting and review priority",[2527,2577,2578,2583],{},[2542,2579,2580],{},[530,2581,2582],{},"requiresChanges",[2542,2584,2585,2586,2589,2590,2593],{},"Document that callers should attach ",[530,2587,2588],{},"changes"," (e.g. via ",[530,2591,2592],{},"auditDiff",")",[2527,2595,2596,2601],{},[2542,2597,2598],{},[530,2599,2600],{},"requiresReason",[2542,2602,2585,2603,2605],{},[530,2604,1288],{}," (especially denials)",[2527,2607,2608,2613],{},[2542,2609,2610],{},[530,2611,2612],{},"redactPaths",[2542,2614,2615,2616,2619],{},"Default paths for ",[530,2617,2618],{},"auditDiff({ redactPaths: [...] })"," on this action",[2621,2622,2624,2626,2627,2630],"h3",{"id":2623},"defineauditaction-vs-defineauditcatalog-when-to-choose",[530,2625,2009],{}," vs ",[530,2628,2629],{},"defineAuditCatalog"," — when to choose",[522,2632,2633],{},"Both produce the same call-site factory shape. Pick by scale:",[2635,2636,2637,2653],"ul",{},[2638,2639,2640,2645,2646,2649,2650,2652],"li",{},[2003,2641,2642],{},[530,2643,2644],{},"defineAuditAction(action, opts?)"," — one-off actions, or per-file organisation in very large repos. Mirrors ",[530,2647,2648],{},"defineError",". Equivalent to a catalog with a single entry but with no prefix derivation: you write the full wire ",[530,2651,1153],{}," directly.",[2638,2654,2655,2660,2661,2664,2665,2667,2668,2670,2671,2673,2674,2676,2677,2680,2681,2684],{},[2003,2656,2657],{},[530,2658,2659],{},"defineAuditCatalog(prefix, map)"," — group anything beyond a handful of related actions under one prefix. Mirrors ",[530,2662,2663],{},"defineErrorCatalog",". The wire ",[530,2666,1153],{}," is auto-derived as ",[530,2669,2024],{},", catalog metadata (",[530,2672,2417],{},", ",[530,2675,2421],{},") is exposed for introspection, and a single ",[530,2678,2679],{},"declare module 'evlog'"," line surfaces the whole bundle in the typed ",[530,2682,2683],{},"AuditAction"," union.",[522,2686,2687,2688,2690,2691,2673,2693,2673,2696,2698],{},"You can mix the two in the same codebase — keep cross-cutting one-off actions as ",[530,2689,2009],{},", group bounded contexts (",[530,2692,2077],{},[530,2694,2695],{},"auth",[530,2697,2262],{},") as catalogs.",[2621,2700,2702],{"id":2701},"type-safe-actions-everywhere-opt-in","Type-safe actions everywhere (opt-in)",[522,2704,2705,2706,583],{},"Mirror the error catalog augmentation by augmenting ",[530,2707,2708],{},"RegisteredAuditCatalogs",[543,2710,2712],{"className":545,"code":2711,"language":547,"meta":548,"style":548},"import type { billingAudit } from '.\u002Faudit\u002Fbilling'\n\ndeclare module 'evlog' {\n  interface RegisteredAuditCatalogs {\n    billing: typeof billingAudit\n  }\n}\n",[530,2713,2714,2735,2739,2755,2765,2778,2782],{"__ignoreMap":548},[552,2715,2716,2718,2720,2722,2724,2726,2728,2730,2733],{"class":554,"line":555},[552,2717,1433],{"class":800},[552,2719,610],{"class":800},[552,2721,607],{"class":562},[552,2723,2299],{"class":558},[552,2725,767],{"class":562},[552,2727,1442],{"class":800},[552,2729,586],{"class":562},[552,2731,2732],{"class":589},".\u002Faudit\u002Fbilling",[552,2734,1450],{"class":562},[552,2736,2737],{"class":554,"line":576},[552,2738,708],{"emptyLinePlaceholder":707},[552,2740,2741,2744,2747,2749,2751,2753],{"class":554,"line":599},[552,2742,2743],{"class":1000},"declare",[552,2745,2746],{"class":1000}," module",[552,2748,586],{"class":562},[552,2750,1447],{"class":589},[552,2752,593],{"class":562},[552,2754,847],{"class":562},[552,2756,2757,2760,2763],{"class":554,"line":641},[552,2758,2759],{"class":1000},"  interface",[552,2761,2762],{"class":1152}," RegisteredAuditCatalogs",[552,2764,847],{"class":562},[552,2766,2767,2770,2772,2775],{"class":554,"line":678},[552,2768,2769],{"class":579},"    billing",[552,2771,583],{"class":562},[552,2773,2774],{"class":562}," typeof",[552,2776,2777],{"class":558}," billingAudit\n",[552,2779,2780],{"class":554,"line":695},[552,2781,1403],{"class":562},[552,2783,2784],{"class":554,"line":704},[552,2785,980],{"class":562},[522,2787,2788,2789,2791],{},"This surfaces the union of all registered actions on the typed ",[530,2790,2683],{}," export, useful for shared helpers, dashboards, and refactor-safe comparisons.",[2793,2794,2797,2800,2801,2804],"callout",{"color":2795,"icon":2796,"to":77},"primary","i-lucide-arrow-right",[2003,2798,2799],{},"Going further."," The dedicated ",[1989,2802,2803],{"href":77},"Catalogs page"," covers the scaling story (single file → folder → feature → npm package) for both error and audit catalogs, plus npm packaging, composition patterns, and the type-augmentation deep dive.",[526,2806,2808],{"id":2807},"auditdiff",[530,2809,2810],{},"auditDiff()",[522,2812,2813,2814,2816],{},"For mutating actions, use ",[530,2815,2810],{}," to produce a compact, redact-aware JSON Patch:",[2818,2819,2820,2825,2826,2021,2828,2832,2833,2836,2837,2840,2841,2844,2845,2848,2849,2851],"warning",{},[2003,2821,2822,2823,563],{},"Don't feed entire DB rows into ",[530,2824,2810],{}," Strip computed columns, hashed passwords, internal flags, and large JSON blobs before diffing. The point of ",[530,2827,2588],{},[2829,2830,2831],"em",{},"what changed semantically"," (status went from ",[530,2834,2835],{},"paid"," → ",[530,2838,2839],{},"refunded","), not ",[2829,2842,2843],{},"what bytes changed"," (a ",[530,2846,2847],{},"lastModified"," timestamp ticked). A noisy ",[530,2850,2588],{}," field is the fastest way to make audit logs unreadable.",[788,2853,2854,3098],{},[543,2855,2857],{"className":545,"code":2856,"filename":793,"language":547,"meta":548,"style":548},"import { auditDiff } from 'evlog'\n\nconst before = await db.users.byId(id)\nconst after = await db.users.update(id, patch)\n\nlog.audit({\n  action: 'user.update',\n  actor: { type: 'user', id: actorId },\n  target: { type: 'user', id },\n  outcome: 'success',\n  changes: auditDiff(before, after, { redactPaths: ['password', 'token'] }),\n})\n",[530,2858,2859,2878,2882,2910,2940,2944,2956,2971,3000,3025,3039,3092],{"__ignoreMap":548},[552,2860,2861,2863,2865,2868,2870,2872,2874,2876],{"class":554,"line":555},[552,2862,1433],{"class":800},[552,2864,607],{"class":562},[552,2866,2867],{"class":558}," auditDiff",[552,2869,767],{"class":562},[552,2871,1442],{"class":800},[552,2873,586],{"class":562},[552,2875,1447],{"class":589},[552,2877,1450],{"class":562},[552,2879,2880],{"class":554,"line":576},[552,2881,708],{"emptyLinePlaceholder":707},[552,2883,2884,2886,2889,2891,2894,2897,2899,2902,2904,2907],{"class":554,"line":599},[552,2885,1851],{"class":1000},[552,2887,2888],{"class":558}," before ",[552,2890,1857],{"class":562},[552,2892,2893],{"class":800}," await",[552,2895,2896],{"class":558}," db",[552,2898,563],{"class":562},[552,2900,2901],{"class":558},"users",[552,2903,563],{"class":562},[552,2905,2906],{"class":566},"byId",[552,2908,2909],{"class":558},"(id)\n",[552,2911,2912,2914,2917,2919,2921,2923,2925,2927,2929,2932,2935,2937],{"class":554,"line":641},[552,2913,1851],{"class":1000},[552,2915,2916],{"class":558}," after ",[552,2918,1857],{"class":562},[552,2920,2893],{"class":800},[552,2922,2896],{"class":558},[552,2924,563],{"class":562},[552,2926,2901],{"class":558},[552,2928,563],{"class":562},[552,2930,2931],{"class":566},"update",[552,2933,2934],{"class":558},"(id",[552,2936,622],{"class":562},[552,2938,2939],{"class":558}," patch)\n",[552,2941,2942],{"class":554,"line":678},[552,2943,708],{"emptyLinePlaceholder":707},[552,2945,2946,2948,2950,2952,2954],{"class":554,"line":695},[552,2947,559],{"class":558},[552,2949,563],{"class":562},[552,2951,567],{"class":566},[552,2953,570],{"class":558},[552,2955,573],{"class":562},[552,2957,2958,2960,2962,2964,2967,2969],{"class":554,"line":704},[552,2959,580],{"class":579},[552,2961,583],{"class":562},[552,2963,586],{"class":562},[552,2965,2966],{"class":589},"user.update",[552,2968,593],{"class":562},[552,2970,596],{"class":562},[552,2972,2973,2975,2977,2979,2981,2983,2985,2987,2989,2991,2993,2995,2998],{"class":554,"line":711},[552,2974,602],{"class":579},[552,2976,583],{"class":562},[552,2978,607],{"class":562},[552,2980,610],{"class":579},[552,2982,583],{"class":562},[552,2984,586],{"class":562},[552,2986,617],{"class":589},[552,2988,593],{"class":562},[552,2990,622],{"class":562},[552,2992,625],{"class":579},[552,2994,583],{"class":562},[552,2996,2997],{"class":558}," actorId ",[552,2999,638],{"class":562},[552,3001,3002,3004,3006,3008,3010,3012,3014,3016,3018,3020,3023],{"class":554,"line":718},[552,3003,644],{"class":579},[552,3005,583],{"class":562},[552,3007,607],{"class":562},[552,3009,610],{"class":579},[552,3011,583],{"class":562},[552,3013,586],{"class":562},[552,3015,617],{"class":589},[552,3017,593],{"class":562},[552,3019,622],{"class":562},[552,3021,3022],{"class":558}," id ",[552,3024,638],{"class":562},[552,3026,3027,3029,3031,3033,3035,3037],{"class":554,"line":1146},[552,3028,681],{"class":579},[552,3030,583],{"class":562},[552,3032,586],{"class":562},[552,3034,688],{"class":589},[552,3036,593],{"class":562},[552,3038,596],{"class":562},[552,3040,3041,3044,3046,3048,3051,3053,3056,3058,3060,3063,3065,3067,3069,3072,3074,3076,3078,3081,3083,3086,3088,3090],{"class":554,"line":1168},[552,3042,3043],{"class":579},"  changes",[552,3045,583],{"class":562},[552,3047,2867],{"class":566},[552,3049,3050],{"class":558},"(before",[552,3052,622],{"class":562},[552,3054,3055],{"class":558}," after",[552,3057,622],{"class":562},[552,3059,607],{"class":562},[552,3061,3062],{"class":579}," redactPaths",[552,3064,583],{"class":562},[552,3066,2161],{"class":558},[552,3068,593],{"class":562},[552,3070,3071],{"class":589},"password",[552,3073,593],{"class":562},[552,3075,622],{"class":562},[552,3077,586],{"class":562},[552,3079,3080],{"class":589},"token",[552,3082,593],{"class":562},[552,3084,3085],{"class":558},"] ",[552,3087,698],{"class":562},[552,3089,2593],{"class":558},[552,3091,596],{"class":562},[552,3093,3094,3096],{"class":554,"line":1216},[552,3095,698],{"class":562},[552,3097,701],{"class":558},[543,3099,3102],{"className":983,"code":3100,"filename":3101,"language":986,"meta":548,"style":548},"{\n  \"audit\": {\n    \"action\": \"user.update\",\n    \"actor\": { \"type\": \"user\", \"id\": \"usr_42\" },\n    \"target\": { \"type\": \"user\", \"id\": \"usr_99\" },\n    \"outcome\": \"success\",\n    \"changes\": [\n      { \"op\": \"replace\", \"path\": \"\u002Femail\", \"from\": \"old@example.com\", \"to\": \"new@example.com\" },\n      { \"op\": \"replace\", \"path\": \"\u002Frole\", \"from\": \"member\", \"to\": \"admin\" },\n      { \"op\": \"replace\", \"path\": \"\u002Fpassword\", \"from\": \"[REDACTED]\", \"to\": \"[REDACTED]\" }\n    ],\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_5e7d8f9a0b1c2d3e\"\n  }\n}\n","Output — changes patch",[530,3103,3104,3108,3120,3138,3183,3228,3246,3259,3334,3405,3476,3481,3495,3512,3516],{"__ignoreMap":548},[552,3105,3106],{"class":554,"line":555},[552,3107,573],{"class":562},[552,3109,3110,3112,3114,3116,3118],{"class":554,"line":576},[552,3111,997],{"class":562},[552,3113,567],{"class":1000},[552,3115,1004],{"class":562},[552,3117,583],{"class":562},[552,3119,847],{"class":562},[552,3121,3122,3124,3126,3128,3130,3132,3134,3136],{"class":554,"line":599},[552,3123,1149],{"class":562},[552,3125,1153],{"class":1152},[552,3127,1004],{"class":562},[552,3129,583],{"class":562},[552,3131,1009],{"class":562},[552,3133,2966],{"class":589},[552,3135,1004],{"class":562},[552,3137,596],{"class":562},[552,3139,3140,3142,3144,3146,3148,3150,3152,3154,3156,3158,3160,3162,3164,3166,3168,3170,3172,3174,3176,3179,3181],{"class":554,"line":641},[552,3141,1149],{"class":562},[552,3143,1173],{"class":1152},[552,3145,1004],{"class":562},[552,3147,583],{"class":562},[552,3149,607],{"class":562},[552,3151,1009],{"class":562},[552,3153,1184],{"class":763},[552,3155,1004],{"class":562},[552,3157,583],{"class":562},[552,3159,1009],{"class":562},[552,3161,617],{"class":589},[552,3163,1004],{"class":562},[552,3165,622],{"class":562},[552,3167,1009],{"class":562},[552,3169,894],{"class":763},[552,3171,1004],{"class":562},[552,3173,583],{"class":562},[552,3175,1009],{"class":562},[552,3177,3178],{"class":589},"usr_42",[552,3180,1004],{"class":562},[552,3182,675],{"class":562},[552,3184,3185,3187,3189,3191,3193,3195,3197,3199,3201,3203,3205,3207,3209,3211,3213,3215,3217,3219,3221,3224,3226],{"class":554,"line":678},[552,3186,1149],{"class":562},[552,3188,1221],{"class":1152},[552,3190,1004],{"class":562},[552,3192,583],{"class":562},[552,3194,607],{"class":562},[552,3196,1009],{"class":562},[552,3198,1184],{"class":763},[552,3200,1004],{"class":562},[552,3202,583],{"class":562},[552,3204,1009],{"class":562},[552,3206,617],{"class":589},[552,3208,1004],{"class":562},[552,3210,622],{"class":562},[552,3212,1009],{"class":562},[552,3214,894],{"class":763},[552,3216,1004],{"class":562},[552,3218,583],{"class":562},[552,3220,1009],{"class":562},[552,3222,3223],{"class":589},"usr_99",[552,3225,1004],{"class":562},[552,3227,675],{"class":562},[552,3229,3230,3232,3234,3236,3238,3240,3242,3244],{"class":554,"line":695},[552,3231,1149],{"class":562},[552,3233,1267],{"class":1152},[552,3235,1004],{"class":562},[552,3237,583],{"class":562},[552,3239,1009],{"class":562},[552,3241,688],{"class":589},[552,3243,1004],{"class":562},[552,3245,596],{"class":562},[552,3247,3248,3250,3252,3254,3256],{"class":554,"line":704},[552,3249,1149],{"class":562},[552,3251,2588],{"class":1152},[552,3253,1004],{"class":562},[552,3255,583],{"class":562},[552,3257,3258],{"class":562}," [\n",[552,3260,3261,3263,3265,3268,3270,3272,3274,3277,3279,3281,3283,3285,3287,3289,3291,3294,3296,3298,3300,3303,3305,3307,3309,3312,3314,3316,3318,3321,3323,3325,3327,3330,3332],{"class":554,"line":711},[552,3262,2188],{"class":562},[552,3264,1009],{"class":562},[552,3266,3267],{"class":763},"op",[552,3269,1004],{"class":562},[552,3271,583],{"class":562},[552,3273,1009],{"class":562},[552,3275,3276],{"class":589},"replace",[552,3278,1004],{"class":562},[552,3280,622],{"class":562},[552,3282,1009],{"class":562},[552,3284,1063],{"class":763},[552,3286,1004],{"class":562},[552,3288,583],{"class":562},[552,3290,1009],{"class":562},[552,3292,3293],{"class":589},"\u002Femail",[552,3295,1004],{"class":562},[552,3297,622],{"class":562},[552,3299,1009],{"class":562},[552,3301,3302],{"class":763},"from",[552,3304,1004],{"class":562},[552,3306,583],{"class":562},[552,3308,1009],{"class":562},[552,3310,3311],{"class":589},"old@example.com",[552,3313,1004],{"class":562},[552,3315,622],{"class":562},[552,3317,1009],{"class":562},[552,3319,3320],{"class":763},"to",[552,3322,1004],{"class":562},[552,3324,583],{"class":562},[552,3326,1009],{"class":562},[552,3328,3329],{"class":589},"new@example.com",[552,3331,1004],{"class":562},[552,3333,675],{"class":562},[552,3335,3336,3338,3340,3342,3344,3346,3348,3350,3352,3354,3356,3358,3360,3362,3364,3367,3369,3371,3373,3375,3377,3379,3381,3384,3386,3388,3390,3392,3394,3396,3398,3401,3403],{"class":554,"line":718},[552,3337,2188],{"class":562},[552,3339,1009],{"class":562},[552,3341,3267],{"class":763},[552,3343,1004],{"class":562},[552,3345,583],{"class":562},[552,3347,1009],{"class":562},[552,3349,3276],{"class":589},[552,3351,1004],{"class":562},[552,3353,622],{"class":562},[552,3355,1009],{"class":562},[552,3357,1063],{"class":763},[552,3359,1004],{"class":562},[552,3361,583],{"class":562},[552,3363,1009],{"class":562},[552,3365,3366],{"class":589},"\u002Frole",[552,3368,1004],{"class":562},[552,3370,622],{"class":562},[552,3372,1009],{"class":562},[552,3374,3302],{"class":763},[552,3376,1004],{"class":562},[552,3378,583],{"class":562},[552,3380,1009],{"class":562},[552,3382,3383],{"class":589},"member",[552,3385,1004],{"class":562},[552,3387,622],{"class":562},[552,3389,1009],{"class":562},[552,3391,3320],{"class":763},[552,3393,1004],{"class":562},[552,3395,583],{"class":562},[552,3397,1009],{"class":562},[552,3399,3400],{"class":589},"admin",[552,3402,1004],{"class":562},[552,3404,675],{"class":562},[552,3406,3407,3409,3411,3413,3415,3417,3419,3421,3423,3425,3427,3429,3431,3433,3435,3438,3440,3442,3444,3446,3448,3450,3452,3455,3457,3459,3461,3463,3465,3467,3469,3471,3473],{"class":554,"line":1146},[552,3408,2188],{"class":562},[552,3410,1009],{"class":562},[552,3412,3267],{"class":763},[552,3414,1004],{"class":562},[552,3416,583],{"class":562},[552,3418,1009],{"class":562},[552,3420,3276],{"class":589},[552,3422,1004],{"class":562},[552,3424,622],{"class":562},[552,3426,1009],{"class":562},[552,3428,1063],{"class":763},[552,3430,1004],{"class":562},[552,3432,583],{"class":562},[552,3434,1009],{"class":562},[552,3436,3437],{"class":589},"\u002Fpassword",[552,3439,1004],{"class":562},[552,3441,622],{"class":562},[552,3443,1009],{"class":562},[552,3445,3302],{"class":763},[552,3447,1004],{"class":562},[552,3449,583],{"class":562},[552,3451,1009],{"class":562},[552,3453,3454],{"class":589},"[REDACTED]",[552,3456,1004],{"class":562},[552,3458,622],{"class":562},[552,3460,1009],{"class":562},[552,3462,3320],{"class":763},[552,3464,1004],{"class":562},[552,3466,583],{"class":562},[552,3468,1009],{"class":562},[552,3470,3454],{"class":589},[552,3472,1004],{"class":562},[552,3474,3475],{"class":562}," }\n",[552,3477,3478],{"class":554,"line":1168},[552,3479,3480],{"class":562},"    ],\n",[552,3482,3483,3485,3487,3489,3491,3493],{"class":554,"line":1216},[552,3484,1149],{"class":562},[552,3486,1308],{"class":1152},[552,3488,1004],{"class":562},[552,3490,583],{"class":562},[552,3492,764],{"class":763},[552,3494,596],{"class":562},[552,3496,3497,3499,3501,3503,3505,3507,3510],{"class":554,"line":1262},[552,3498,1149],{"class":562},[552,3500,1324],{"class":1152},[552,3502,1004],{"class":562},[552,3504,583],{"class":562},[552,3506,1009],{"class":562},[552,3508,3509],{"class":589},"ak_5e7d8f9a0b1c2d3e",[552,3511,1391],{"class":562},[552,3513,3514],{"class":554,"line":1283},[552,3515,1403],{"class":562},[552,3517,3518],{"class":554,"line":1303},[552,3519,980],{"class":562},[526,3521,3523,3526],{"id":3522},"withaudit-auto-instrumentation",[530,3524,3525],{},"withAudit()"," — auto-instrumentation",[522,3528,3529,3530,3532],{},"Devs forget to call ",[530,3531,532],{},". Wrap the function and never miss a record:",[3534,3535,3536,3539,3540,3543,3544,3546,3547,3550],"tip",{},[2003,3537,3538],{},"When to wrap vs. call manually."," Wrap functions that are ",[2829,3541,3542],{},"pure audit-worthy actions"," (refund, delete, role change, password reset) — outcome resolution is automatic and you can't accidentally skip the call. Stick to manual ",[530,3545,532],{}," when the audit is one of several decisions inside a larger handler, or when you need to emit the audit ",[2829,3548,3549],{},"before"," the action completes (e.g. \"user requested deletion\").",[788,3552,3553,3846,4051,4367],{},[543,3554,3556],{"className":545,"code":3555,"filename":793,"language":547,"meta":548,"style":548},"import { withAudit, AuditDeniedError } from 'evlog'\n\nconst refundInvoice = withAudit(\n  { action: 'invoice.refund', target: input => ({ type: 'invoice', id: input.id }) },\n  async (input: { id: string }, ctx) => {\n    if (!ctx.actor) throw new AuditDeniedError('Anonymous refund denied')\n    return await db.invoices.refund(input.id)\n  },\n)\n\nawait refundInvoice({ id: 'inv_889' }, {\n  actor: { type: 'user', id: user.id },\n  correlationId: requestId,\n})\n",[530,3557,3558,3582,3586,3600,3661,3693,3730,3758,3762,3766,3770,3796,3828,3840],{"__ignoreMap":548},[552,3559,3560,3562,3564,3567,3569,3572,3574,3576,3578,3580],{"class":554,"line":555},[552,3561,1433],{"class":800},[552,3563,607],{"class":562},[552,3565,3566],{"class":558}," withAudit",[552,3568,622],{"class":562},[552,3570,3571],{"class":558}," AuditDeniedError",[552,3573,767],{"class":562},[552,3575,1442],{"class":800},[552,3577,586],{"class":562},[552,3579,1447],{"class":589},[552,3581,1450],{"class":562},[552,3583,3584],{"class":554,"line":576},[552,3585,708],{"emptyLinePlaceholder":707},[552,3587,3588,3590,3593,3595,3597],{"class":554,"line":599},[552,3589,1851],{"class":1000},[552,3591,3592],{"class":558}," refundInvoice ",[552,3594,1857],{"class":562},[552,3596,3566],{"class":566},[552,3598,3599],{"class":558},"(\n",[552,3601,3602,3605,3607,3609,3611,3613,3615,3617,3619,3621,3625,3628,3630,3632,3634,3636,3638,3640,3642,3644,3646,3648,3650,3652,3654,3656,3659],{"class":554,"line":641},[552,3603,3604],{"class":562},"  {",[552,3606,740],{"class":579},[552,3608,583],{"class":562},[552,3610,586],{"class":562},[552,3612,590],{"class":589},[552,3614,593],{"class":562},[552,3616,622],{"class":562},[552,3618,1874],{"class":566},[552,3620,583],{"class":562},[552,3622,3624],{"class":3623},"sHdIc"," input",[552,3626,3627],{"class":1000}," =>",[552,3629,804],{"class":558},[552,3631,730],{"class":562},[552,3633,610],{"class":579},[552,3635,583],{"class":562},[552,3637,586],{"class":562},[552,3639,657],{"class":589},[552,3641,593],{"class":562},[552,3643,622],{"class":562},[552,3645,625],{"class":579},[552,3647,583],{"class":562},[552,3649,3624],{"class":558},[552,3651,563],{"class":562},[552,3653,635],{"class":558},[552,3655,698],{"class":562},[552,3657,3658],{"class":558},") ",[552,3660,638],{"class":562},[552,3662,3663,3666,3668,3671,3673,3675,3677,3679,3682,3684,3687,3689,3691],{"class":554,"line":678},[552,3664,3665],{"class":1000},"  async",[552,3667,804],{"class":562},[552,3669,3670],{"class":3623},"input",[552,3672,583],{"class":562},[552,3674,607],{"class":562},[552,3676,625],{"class":579},[552,3678,583],{"class":562},[552,3680,3681],{"class":1152}," string",[552,3683,1960],{"class":562},[552,3685,3686],{"class":3623}," ctx",[552,3688,2593],{"class":562},[552,3690,3627],{"class":1000},[552,3692,847],{"class":562},[552,3694,3695,3698,3700,3702,3705,3707,3709,3711,3714,3717,3719,3721,3723,3726,3728],{"class":554,"line":695},[552,3696,3697],{"class":800},"    if",[552,3699,804],{"class":579},[552,3701,807],{"class":562},[552,3703,3704],{"class":558},"ctx",[552,3706,563],{"class":562},[552,3708,1173],{"class":558},[552,3710,3658],{"class":579},[552,3712,3713],{"class":800},"throw",[552,3715,3716],{"class":562}," new",[552,3718,3571],{"class":566},[552,3720,570],{"class":579},[552,3722,593],{"class":562},[552,3724,3725],{"class":589},"Anonymous refund denied",[552,3727,593],{"class":562},[552,3729,701],{"class":579},[552,3731,3732,3735,3737,3739,3741,3744,3746,3748,3750,3752,3754,3756],{"class":554,"line":704},[552,3733,3734],{"class":800},"    return",[552,3736,2893],{"class":800},[552,3738,2896],{"class":558},[552,3740,563],{"class":562},[552,3742,3743],{"class":558},"invoices",[552,3745,563],{"class":562},[552,3747,1903],{"class":566},[552,3749,570],{"class":579},[552,3751,3670],{"class":558},[552,3753,563],{"class":562},[552,3755,894],{"class":558},[552,3757,701],{"class":579},[552,3759,3760],{"class":554,"line":711},[552,3761,2178],{"class":562},[552,3763,3764],{"class":554,"line":718},[552,3765,701],{"class":558},[552,3767,3768],{"class":554,"line":1146},[552,3769,708],{"emptyLinePlaceholder":707},[552,3771,3772,3775,3778,3780,3782,3784,3786,3788,3790,3792,3794],{"class":554,"line":1168},[552,3773,3774],{"class":800},"await",[552,3776,3777],{"class":566}," refundInvoice",[552,3779,570],{"class":558},[552,3781,730],{"class":562},[552,3783,625],{"class":579},[552,3785,583],{"class":562},[552,3787,586],{"class":562},[552,3789,670],{"class":589},[552,3791,593],{"class":562},[552,3793,1960],{"class":562},[552,3795,847],{"class":562},[552,3797,3798,3800,3802,3804,3806,3808,3810,3812,3814,3816,3818,3820,3822,3824,3826],{"class":554,"line":1216},[552,3799,602],{"class":579},[552,3801,583],{"class":562},[552,3803,607],{"class":562},[552,3805,610],{"class":579},[552,3807,583],{"class":562},[552,3809,586],{"class":562},[552,3811,617],{"class":589},[552,3813,593],{"class":562},[552,3815,622],{"class":562},[552,3817,625],{"class":579},[552,3819,583],{"class":562},[552,3821,630],{"class":558},[552,3823,563],{"class":562},[552,3825,635],{"class":558},[552,3827,638],{"class":562},[552,3829,3830,3833,3835,3838],{"class":554,"line":1262},[552,3831,3832],{"class":579},"  correlationId",[552,3834,583],{"class":562},[552,3836,3837],{"class":558}," requestId",[552,3839,596],{"class":562},[552,3841,3842,3844],{"class":554,"line":1283},[552,3843,698],{"class":562},[552,3845,701],{"class":558},[543,3847,3850],{"className":983,"code":3848,"filename":3849,"language":986,"meta":548,"style":548},"{\n  \"audit\": {\n    \"action\": \"invoice.refund\",\n    \"actor\": { \"type\": \"user\", \"id\": \"usr_42\" },\n    \"target\": { \"type\": \"invoice\", \"id\": \"inv_889\" },\n    \"outcome\": \"success\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_8f3c4b2a1e5d6f7c\",\n    \"correlationId\": \"a566ef91-7765-4f59-b6f0-b9f40ce71599\"\n  }\n}\n","Output — success",[530,3851,3852,3856,3868,3886,3930,3974,3992,4006,4025,4043,4047],{"__ignoreMap":548},[552,3853,3854],{"class":554,"line":555},[552,3855,573],{"class":562},[552,3857,3858,3860,3862,3864,3866],{"class":554,"line":576},[552,3859,997],{"class":562},[552,3861,567],{"class":1000},[552,3863,1004],{"class":562},[552,3865,583],{"class":562},[552,3867,847],{"class":562},[552,3869,3870,3872,3874,3876,3878,3880,3882,3884],{"class":554,"line":599},[552,3871,1149],{"class":562},[552,3873,1153],{"class":1152},[552,3875,1004],{"class":562},[552,3877,583],{"class":562},[552,3879,1009],{"class":562},[552,3881,590],{"class":589},[552,3883,1004],{"class":562},[552,3885,596],{"class":562},[552,3887,3888,3890,3892,3894,3896,3898,3900,3902,3904,3906,3908,3910,3912,3914,3916,3918,3920,3922,3924,3926,3928],{"class":554,"line":641},[552,3889,1149],{"class":562},[552,3891,1173],{"class":1152},[552,3893,1004],{"class":562},[552,3895,583],{"class":562},[552,3897,607],{"class":562},[552,3899,1009],{"class":562},[552,3901,1184],{"class":763},[552,3903,1004],{"class":562},[552,3905,583],{"class":562},[552,3907,1009],{"class":562},[552,3909,617],{"class":589},[552,3911,1004],{"class":562},[552,3913,622],{"class":562},[552,3915,1009],{"class":562},[552,3917,894],{"class":763},[552,3919,1004],{"class":562},[552,3921,583],{"class":562},[552,3923,1009],{"class":562},[552,3925,3178],{"class":589},[552,3927,1004],{"class":562},[552,3929,675],{"class":562},[552,3931,3932,3934,3936,3938,3940,3942,3944,3946,3948,3950,3952,3954,3956,3958,3960,3962,3964,3966,3968,3970,3972],{"class":554,"line":678},[552,3933,1149],{"class":562},[552,3935,1221],{"class":1152},[552,3937,1004],{"class":562},[552,3939,583],{"class":562},[552,3941,607],{"class":562},[552,3943,1009],{"class":562},[552,3945,1184],{"class":763},[552,3947,1004],{"class":562},[552,3949,583],{"class":562},[552,3951,1009],{"class":562},[552,3953,657],{"class":589},[552,3955,1004],{"class":562},[552,3957,622],{"class":562},[552,3959,1009],{"class":562},[552,3961,894],{"class":763},[552,3963,1004],{"class":562},[552,3965,583],{"class":562},[552,3967,1009],{"class":562},[552,3969,670],{"class":589},[552,3971,1004],{"class":562},[552,3973,675],{"class":562},[552,3975,3976,3978,3980,3982,3984,3986,3988,3990],{"class":554,"line":695},[552,3977,1149],{"class":562},[552,3979,1267],{"class":1152},[552,3981,1004],{"class":562},[552,3983,583],{"class":562},[552,3985,1009],{"class":562},[552,3987,688],{"class":589},[552,3989,1004],{"class":562},[552,3991,596],{"class":562},[552,3993,3994,3996,3998,4000,4002,4004],{"class":554,"line":704},[552,3995,1149],{"class":562},[552,3997,1308],{"class":1152},[552,3999,1004],{"class":562},[552,4001,583],{"class":562},[552,4003,764],{"class":763},[552,4005,596],{"class":562},[552,4007,4008,4010,4012,4014,4016,4018,4021,4023],{"class":554,"line":711},[552,4009,1149],{"class":562},[552,4011,1324],{"class":1152},[552,4013,1004],{"class":562},[552,4015,583],{"class":562},[552,4017,1009],{"class":562},[552,4019,4020],{"class":589},"ak_8f3c4b2a1e5d6f7c",[552,4022,1004],{"class":562},[552,4024,596],{"class":562},[552,4026,4027,4029,4032,4034,4036,4038,4041],{"class":554,"line":718},[552,4028,1149],{"class":562},[552,4030,4031],{"class":1152},"correlationId",[552,4033,1004],{"class":562},[552,4035,583],{"class":562},[552,4037,1009],{"class":562},[552,4039,4040],{"class":589},"a566ef91-7765-4f59-b6f0-b9f40ce71599",[552,4042,1391],{"class":562},[552,4044,4045],{"class":554,"line":1146},[552,4046,1403],{"class":562},[552,4048,4049],{"class":554,"line":1168},[552,4050,980],{"class":562},[543,4052,4055],{"className":983,"code":4053,"filename":4054,"language":986,"meta":548,"style":548},"{\n  \"level\": \"error\",\n  \"audit\": {\n    \"action\": \"invoice.refund\",\n    \"actor\": { \"type\": \"user\", \"id\": \"usr_42\" },\n    \"target\": { \"type\": \"invoice\", \"id\": \"inv_889\" },\n    \"outcome\": \"failure\",\n    \"reason\": \"Stripe error: charge already refunded\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_4c5d6e7f8a9b0c1d\",\n    \"correlationId\": \"a566ef91-7765-4f59-b6f0-b9f40ce71599\"\n  },\n  \"error\": {\n    \"name\": \"StripeError\",\n    \"message\": \"charge already refunded\",\n    \"stack\": \"...\"\n  }\n}\n","Output — failure",[530,4056,4057,4061,4080,4092,4110,4154,4198,4217,4236,4250,4269,4285,4289,4301,4321,4341,4359,4363],{"__ignoreMap":548},[552,4058,4059],{"class":554,"line":555},[552,4060,573],{"class":562},[552,4062,4063,4065,4067,4069,4071,4073,4076,4078],{"class":554,"line":576},[552,4064,997],{"class":562},[552,4066,1001],{"class":1000},[552,4068,1004],{"class":562},[552,4070,583],{"class":562},[552,4072,1009],{"class":562},[552,4074,4075],{"class":589},"error",[552,4077,1004],{"class":562},[552,4079,596],{"class":562},[552,4081,4082,4084,4086,4088,4090],{"class":554,"line":599},[552,4083,997],{"class":562},[552,4085,567],{"class":1000},[552,4087,1004],{"class":562},[552,4089,583],{"class":562},[552,4091,847],{"class":562},[552,4093,4094,4096,4098,4100,4102,4104,4106,4108],{"class":554,"line":641},[552,4095,1149],{"class":562},[552,4097,1153],{"class":1152},[552,4099,1004],{"class":562},[552,4101,583],{"class":562},[552,4103,1009],{"class":562},[552,4105,590],{"class":589},[552,4107,1004],{"class":562},[552,4109,596],{"class":562},[552,4111,4112,4114,4116,4118,4120,4122,4124,4126,4128,4130,4132,4134,4136,4138,4140,4142,4144,4146,4148,4150,4152],{"class":554,"line":678},[552,4113,1149],{"class":562},[552,4115,1173],{"class":1152},[552,4117,1004],{"class":562},[552,4119,583],{"class":562},[552,4121,607],{"class":562},[552,4123,1009],{"class":562},[552,4125,1184],{"class":763},[552,4127,1004],{"class":562},[552,4129,583],{"class":562},[552,4131,1009],{"class":562},[552,4133,617],{"class":589},[552,4135,1004],{"class":562},[552,4137,622],{"class":562},[552,4139,1009],{"class":562},[552,4141,894],{"class":763},[552,4143,1004],{"class":562},[552,4145,583],{"class":562},[552,4147,1009],{"class":562},[552,4149,3178],{"class":589},[552,4151,1004],{"class":562},[552,4153,675],{"class":562},[552,4155,4156,4158,4160,4162,4164,4166,4168,4170,4172,4174,4176,4178,4180,4182,4184,4186,4188,4190,4192,4194,4196],{"class":554,"line":695},[552,4157,1149],{"class":562},[552,4159,1221],{"class":1152},[552,4161,1004],{"class":562},[552,4163,583],{"class":562},[552,4165,607],{"class":562},[552,4167,1009],{"class":562},[552,4169,1184],{"class":763},[552,4171,1004],{"class":562},[552,4173,583],{"class":562},[552,4175,1009],{"class":562},[552,4177,657],{"class":589},[552,4179,1004],{"class":562},[552,4181,622],{"class":562},[552,4183,1009],{"class":562},[552,4185,894],{"class":763},[552,4187,1004],{"class":562},[552,4189,583],{"class":562},[552,4191,1009],{"class":562},[552,4193,670],{"class":589},[552,4195,1004],{"class":562},[552,4197,675],{"class":562},[552,4199,4200,4202,4204,4206,4208,4210,4213,4215],{"class":554,"line":704},[552,4201,1149],{"class":562},[552,4203,1267],{"class":1152},[552,4205,1004],{"class":562},[552,4207,583],{"class":562},[552,4209,1009],{"class":562},[552,4211,4212],{"class":589},"failure",[552,4214,1004],{"class":562},[552,4216,596],{"class":562},[552,4218,4219,4221,4223,4225,4227,4229,4232,4234],{"class":554,"line":711},[552,4220,1149],{"class":562},[552,4222,1288],{"class":1152},[552,4224,1004],{"class":562},[552,4226,583],{"class":562},[552,4228,1009],{"class":562},[552,4230,4231],{"class":589},"Stripe error: charge already refunded",[552,4233,1004],{"class":562},[552,4235,596],{"class":562},[552,4237,4238,4240,4242,4244,4246,4248],{"class":554,"line":718},[552,4239,1149],{"class":562},[552,4241,1308],{"class":1152},[552,4243,1004],{"class":562},[552,4245,583],{"class":562},[552,4247,764],{"class":763},[552,4249,596],{"class":562},[552,4251,4252,4254,4256,4258,4260,4262,4265,4267],{"class":554,"line":1146},[552,4253,1149],{"class":562},[552,4255,1324],{"class":1152},[552,4257,1004],{"class":562},[552,4259,583],{"class":562},[552,4261,1009],{"class":562},[552,4263,4264],{"class":589},"ak_4c5d6e7f8a9b0c1d",[552,4266,1004],{"class":562},[552,4268,596],{"class":562},[552,4270,4271,4273,4275,4277,4279,4281,4283],{"class":554,"line":1168},[552,4272,1149],{"class":562},[552,4274,4031],{"class":1152},[552,4276,1004],{"class":562},[552,4278,583],{"class":562},[552,4280,1009],{"class":562},[552,4282,4040],{"class":589},[552,4284,1391],{"class":562},[552,4286,4287],{"class":554,"line":1216},[552,4288,2178],{"class":562},[552,4290,4291,4293,4295,4297,4299],{"class":554,"line":1262},[552,4292,997],{"class":562},[552,4294,4075],{"class":1000},[552,4296,1004],{"class":562},[552,4298,583],{"class":562},[552,4300,847],{"class":562},[552,4302,4303,4305,4308,4310,4312,4314,4317,4319],{"class":554,"line":1283},[552,4304,1149],{"class":562},[552,4306,4307],{"class":1152},"name",[552,4309,1004],{"class":562},[552,4311,583],{"class":562},[552,4313,1009],{"class":562},[552,4315,4316],{"class":589},"StripeError",[552,4318,1004],{"class":562},[552,4320,596],{"class":562},[552,4322,4323,4325,4328,4330,4332,4334,4337,4339],{"class":554,"line":1303},[552,4324,1149],{"class":562},[552,4326,4327],{"class":1152},"message",[552,4329,1004],{"class":562},[552,4331,583],{"class":562},[552,4333,1009],{"class":562},[552,4335,4336],{"class":589},"charge already refunded",[552,4338,1004],{"class":562},[552,4340,596],{"class":562},[552,4342,4343,4345,4348,4350,4352,4354,4357],{"class":554,"line":1319},[552,4344,1149],{"class":562},[552,4346,4347],{"class":1152},"stack",[552,4349,1004],{"class":562},[552,4351,583],{"class":562},[552,4353,1009],{"class":562},[552,4355,4356],{"class":589},"...",[552,4358,1391],{"class":562},[552,4360,4361],{"class":554,"line":1340},[552,4362,1403],{"class":562},[552,4364,4365],{"class":554,"line":1354},[552,4366,980],{"class":562},[543,4368,4370],{"className":983,"code":4369,"filename":985,"language":986,"meta":548,"style":548},"{\n  \"level\": \"warn\",\n  \"audit\": {\n    \"action\": \"invoice.refund\",\n    \"actor\": { \"type\": \"system\", \"id\": \"anonymous\" },\n    \"target\": { \"type\": \"invoice\", \"id\": \"inv_889\" },\n    \"outcome\": \"denied\",\n    \"reason\": \"Anonymous refund denied\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_d12c3a4f5b6e7d8c\",\n    \"correlationId\": \"a566ef91-7765-4f59-b6f0-b9f40ce71599\"\n  }\n}\n",[530,4371,4372,4376,4394,4406,4424,4469,4513,4531,4549,4563,4581,4597,4601],{"__ignoreMap":548},[552,4373,4374],{"class":554,"line":555},[552,4375,573],{"class":562},[552,4377,4378,4380,4382,4384,4386,4388,4390,4392],{"class":554,"line":576},[552,4379,997],{"class":562},[552,4381,1001],{"class":1000},[552,4383,1004],{"class":562},[552,4385,583],{"class":562},[552,4387,1009],{"class":562},[552,4389,1012],{"class":589},[552,4391,1004],{"class":562},[552,4393,596],{"class":562},[552,4395,4396,4398,4400,4402,4404],{"class":554,"line":599},[552,4397,997],{"class":562},[552,4399,567],{"class":1000},[552,4401,1004],{"class":562},[552,4403,583],{"class":562},[552,4405,847],{"class":562},[552,4407,4408,4410,4412,4414,4416,4418,4420,4422],{"class":554,"line":641},[552,4409,1149],{"class":562},[552,4411,1153],{"class":1152},[552,4413,1004],{"class":562},[552,4415,583],{"class":562},[552,4417,1009],{"class":562},[552,4419,590],{"class":589},[552,4421,1004],{"class":562},[552,4423,596],{"class":562},[552,4425,4426,4428,4430,4432,4434,4436,4438,4440,4442,4444,4446,4448,4450,4452,4454,4456,4458,4460,4462,4465,4467],{"class":554,"line":678},[552,4427,1149],{"class":562},[552,4429,1173],{"class":1152},[552,4431,1004],{"class":562},[552,4433,583],{"class":562},[552,4435,607],{"class":562},[552,4437,1009],{"class":562},[552,4439,1184],{"class":763},[552,4441,1004],{"class":562},[552,4443,583],{"class":562},[552,4445,1009],{"class":562},[552,4447,1494],{"class":589},[552,4449,1004],{"class":562},[552,4451,622],{"class":562},[552,4453,1009],{"class":562},[552,4455,894],{"class":763},[552,4457,1004],{"class":562},[552,4459,583],{"class":562},[552,4461,1009],{"class":562},[552,4463,4464],{"class":589},"anonymous",[552,4466,1004],{"class":562},[552,4468,675],{"class":562},[552,4470,4471,4473,4475,4477,4479,4481,4483,4485,4487,4489,4491,4493,4495,4497,4499,4501,4503,4505,4507,4509,4511],{"class":554,"line":695},[552,4472,1149],{"class":562},[552,4474,1221],{"class":1152},[552,4476,1004],{"class":562},[552,4478,583],{"class":562},[552,4480,607],{"class":562},[552,4482,1009],{"class":562},[552,4484,1184],{"class":763},[552,4486,1004],{"class":562},[552,4488,583],{"class":562},[552,4490,1009],{"class":562},[552,4492,657],{"class":589},[552,4494,1004],{"class":562},[552,4496,622],{"class":562},[552,4498,1009],{"class":562},[552,4500,894],{"class":763},[552,4502,1004],{"class":562},[552,4504,583],{"class":562},[552,4506,1009],{"class":562},[552,4508,670],{"class":589},[552,4510,1004],{"class":562},[552,4512,675],{"class":562},[552,4514,4515,4517,4519,4521,4523,4525,4527,4529],{"class":554,"line":704},[552,4516,1149],{"class":562},[552,4518,1267],{"class":1152},[552,4520,1004],{"class":562},[552,4522,583],{"class":562},[552,4524,1009],{"class":562},[552,4526,1276],{"class":589},[552,4528,1004],{"class":562},[552,4530,596],{"class":562},[552,4532,4533,4535,4537,4539,4541,4543,4545,4547],{"class":554,"line":711},[552,4534,1149],{"class":562},[552,4536,1288],{"class":1152},[552,4538,1004],{"class":562},[552,4540,583],{"class":562},[552,4542,1009],{"class":562},[552,4544,3725],{"class":589},[552,4546,1004],{"class":562},[552,4548,596],{"class":562},[552,4550,4551,4553,4555,4557,4559,4561],{"class":554,"line":718},[552,4552,1149],{"class":562},[552,4554,1308],{"class":1152},[552,4556,1004],{"class":562},[552,4558,583],{"class":562},[552,4560,764],{"class":763},[552,4562,596],{"class":562},[552,4564,4565,4567,4569,4571,4573,4575,4577,4579],{"class":554,"line":1146},[552,4566,1149],{"class":562},[552,4568,1324],{"class":1152},[552,4570,1004],{"class":562},[552,4572,583],{"class":562},[552,4574,1009],{"class":562},[552,4576,1333],{"class":589},[552,4578,1004],{"class":562},[552,4580,596],{"class":562},[552,4582,4583,4585,4587,4589,4591,4593,4595],{"class":554,"line":1168},[552,4584,1149],{"class":562},[552,4586,4031],{"class":1152},[552,4588,1004],{"class":562},[552,4590,583],{"class":562},[552,4592,1009],{"class":562},[552,4594,4040],{"class":589},[552,4596,1391],{"class":562},[552,4598,4599],{"class":554,"line":1216},[552,4600,1403],{"class":562},[552,4602,4603],{"class":554,"line":1262},[552,4604,980],{"class":562},[522,4606,4607],{},"Outcome resolution:",[2635,4609,4610,4619,4638],{},[2638,4611,4612,4615,4616,563],{},[530,4613,4614],{},"fn"," resolves → ",[530,4617,4618],{},"outcome: 'success'",[2638,4620,4621,4623,4624,4627,4628,4631,4632,4635,4636,563],{},[530,4622,4614],{}," throws an ",[530,4625,4626],{},"AuditDeniedError"," (or any error with ",[530,4629,4630],{},"status === 403",") → ",[530,4633,4634],{},"outcome: 'denied'",", error message becomes ",[530,4637,1288],{},[2638,4639,4640,4641,4644],{},"Other thrown errors → ",[530,4642,4643],{},"outcome: 'failure'",", then re-thrown.",[4646,4647,4648],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":548,"searchDepth":576,"depth":576,"links":4650},[4651,4652,4653,4655,4656,4661,4662],{"id":528,"depth":576,"text":532},{"id":777,"depth":576,"text":780},{"id":1411,"depth":576,"text":4654},"Standalone audit()",{"id":1810,"depth":576,"text":1813},{"id":1995,"depth":576,"text":1998,"children":4657},[4658,4660],{"id":2623,"depth":599,"text":4659},"defineAuditAction vs defineAuditCatalog — when to choose",{"id":2701,"depth":599,"text":2702},{"id":2807,"depth":576,"text":2810},{"id":3522,"depth":576,"text":4663},"withAudit() — auto-instrumentation","log.audit, log.audit.deny, standalone audit(), withAudit auto-instrumentation, defineAuditAction and defineAuditCatalog registries, and auditDiff change patches.","md",[4667,4670],{"label":377,"icon":380,"to":378,"color":4668,"variant":4669},"neutral","subtle",{"label":4671,"icon":390,"to":388,"color":4668,"variant":4669},"Drains & Integrity",{},{"title":382,"icon":385},{"title":517,"description":4664},"PSZtU2s5zm8923r3ypI-OybWiGUxGIxd2d5epMRl_hk",[4677,4679],{"title":377,"path":378,"stem":379,"description":4678,"icon":380,"children":-1},"The AuditFields type, action naming conventions, actor types, idempotency, and how the schema sits inside a regular wide event.",{"title":387,"path":388,"stem":389,"description":4680,"icon":390,"children":-1},"auditEnricher to auto-fill request context, auditOnly to route audits to a dedicated sink, and signed for tamper-evident HMAC or hash-chain integrity.",1785609685097]