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