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