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