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