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