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