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