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