[{"data":1,"prerenderedAt":4708},["ShallowReactive",2],{"navigation_docs":3,"-use-cases-audit-recording":525,"-use-cases-audit-recording-surround":4703},[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":4691,"extension":4692,"links":4693,"meta":4699,"navigation":4700,"path":393,"seo":4701,"stem":394,"__hash__":4702},"docs\u002F5.use-cases\u002F4.audit\u002F03.recording.md","Recording Events",{"type":529,"value":530,"toc":4676},"minimark",[531,535,543,552,782,785,791,797,1436,1443,1448,1815,1835,1841,1846,2012,2020,2026,2052,2436,2449,2547,2647,2658,2661,2712,2726,2730,2736,2813,2819,2832,2838,2844,2879,3547,3554,3560,3578,4632,4635,4672],[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  \"durationMs\": 12,\n  \"requestId\": \"9c3f7d12-8a45-4e60-b8a9-1f0d4c5e6e7d\",\n  \"audit\": {\n    \"action\": \"invoice.refund\",\n    \"actor\": { \"type\": \"user\", \"id\": \"usr_intruder\" },\n    \"target\": { \"type\": \"invoice\", \"id\": \"inv_889\" },\n    \"outcome\": \"denied\",\n    \"reason\": \"Insufficient permissions\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_d12c3a4f5b6e7d8c\",\n    \"context\": {\n      \"requestId\": \"9c3f7d12-8a45-4e60-b8a9-1f0d4c5e6e7d\",\n      \"ip\": \"203.0.113.7\"\n    }\n  }\n}\n","Output — denied","json",[540,998,999,1003,1027,1047,1067,1087,1102,1122,1138,1158,1171,1193,1241,1287,1308,1328,1344,1365,1379,1399,1419,1425,1431],{"__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,1136],{"class":564,"line":721},[562,1125,1007],{"class":572},[562,1127,1128],{"class":1010},"durationMs",[562,1130,1014],{"class":572},[562,1132,593],{"class":572},[562,1134,1135],{"class":773}," 12",[562,1137,606],{"class":572},[562,1139,1140,1142,1145,1147,1149,1151,1154,1156],{"class":564,"line":728},[562,1141,1007],{"class":572},[562,1143,1144],{"class":1010},"requestId",[562,1146,1014],{"class":572},[562,1148,593],{"class":572},[562,1150,1019],{"class":572},[562,1152,1153],{"class":599},"9c3f7d12-8a45-4e60-b8a9-1f0d4c5e6e7d",[562,1155,1014],{"class":572},[562,1157,606],{"class":572},[562,1159,1161,1163,1165,1167,1169],{"class":564,"line":1160},10,[562,1162,1007],{"class":572},[562,1164,577],{"class":1010},[562,1166,1014],{"class":572},[562,1168,593],{"class":572},[562,1170,857],{"class":572},[562,1172,1174,1177,1181,1183,1185,1187,1189,1191],{"class":564,"line":1173},11,[562,1175,1176],{"class":572},"    \"",[562,1178,1180],{"class":1179},"sBMFI","action",[562,1182,1014],{"class":572},[562,1184,593],{"class":572},[562,1186,1019],{"class":572},[562,1188,600],{"class":599},[562,1190,1014],{"class":572},[562,1192,606],{"class":572},[562,1194,1196,1198,1201,1203,1205,1207,1209,1212,1214,1216,1218,1220,1222,1224,1226,1228,1230,1232,1234,1237,1239],{"class":564,"line":1195},12,[562,1197,1176],{"class":572},[562,1199,1200],{"class":1179},"actor",[562,1202,1014],{"class":572},[562,1204,593],{"class":572},[562,1206,617],{"class":572},[562,1208,1019],{"class":572},[562,1210,1211],{"class":773},"type",[562,1213,1014],{"class":572},[562,1215,593],{"class":572},[562,1217,1019],{"class":572},[562,1219,627],{"class":599},[562,1221,1014],{"class":572},[562,1223,632],{"class":572},[562,1225,1019],{"class":572},[562,1227,904],{"class":773},[562,1229,1014],{"class":572},[562,1231,593],{"class":572},[562,1233,1019],{"class":572},[562,1235,1236],{"class":599},"usr_intruder",[562,1238,1014],{"class":572},[562,1240,685],{"class":572},[562,1242,1244,1246,1249,1251,1253,1255,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285],{"class":564,"line":1243},13,[562,1245,1176],{"class":572},[562,1247,1248],{"class":1179},"target",[562,1250,1014],{"class":572},[562,1252,593],{"class":572},[562,1254,617],{"class":572},[562,1256,1019],{"class":572},[562,1258,1211],{"class":773},[562,1260,1014],{"class":572},[562,1262,593],{"class":572},[562,1264,1019],{"class":572},[562,1266,667],{"class":599},[562,1268,1014],{"class":572},[562,1270,632],{"class":572},[562,1272,1019],{"class":572},[562,1274,904],{"class":773},[562,1276,1014],{"class":572},[562,1278,593],{"class":572},[562,1280,1019],{"class":572},[562,1282,680],{"class":599},[562,1284,1014],{"class":572},[562,1286,685],{"class":572},[562,1288,1290,1292,1295,1297,1299,1301,1304,1306],{"class":564,"line":1289},14,[562,1291,1176],{"class":572},[562,1293,1294],{"class":1179},"outcome",[562,1296,1014],{"class":572},[562,1298,593],{"class":572},[562,1300,1019],{"class":572},[562,1302,1303],{"class":599},"denied",[562,1305,1014],{"class":572},[562,1307,606],{"class":572},[562,1309,1311,1313,1316,1318,1320,1322,1324,1326],{"class":564,"line":1310},15,[562,1312,1176],{"class":572},[562,1314,1315],{"class":1179},"reason",[562,1317,1014],{"class":572},[562,1319,593],{"class":572},[562,1321,1019],{"class":572},[562,1323,850],{"class":599},[562,1325,1014],{"class":572},[562,1327,606],{"class":572},[562,1329,1331,1333,1336,1338,1340,1342],{"class":564,"line":1330},16,[562,1332,1176],{"class":572},[562,1334,1335],{"class":1179},"version",[562,1337,1014],{"class":572},[562,1339,593],{"class":572},[562,1341,774],{"class":773},[562,1343,606],{"class":572},[562,1345,1347,1349,1352,1354,1356,1358,1361,1363],{"class":564,"line":1346},17,[562,1348,1176],{"class":572},[562,1350,1351],{"class":1179},"idempotencyKey",[562,1353,1014],{"class":572},[562,1355,593],{"class":572},[562,1357,1019],{"class":572},[562,1359,1360],{"class":599},"ak_d12c3a4f5b6e7d8c",[562,1362,1014],{"class":572},[562,1364,606],{"class":572},[562,1366,1368,1370,1373,1375,1377],{"class":564,"line":1367},18,[562,1369,1176],{"class":572},[562,1371,1372],{"class":1179},"context",[562,1374,1014],{"class":572},[562,1376,593],{"class":572},[562,1378,857],{"class":572},[562,1380,1382,1385,1387,1389,1391,1393,1395,1397],{"class":564,"line":1381},19,[562,1383,1384],{"class":572},"      \"",[562,1386,1144],{"class":773},[562,1388,1014],{"class":572},[562,1390,593],{"class":572},[562,1392,1019],{"class":572},[562,1394,1153],{"class":599},[562,1396,1014],{"class":572},[562,1398,606],{"class":572},[562,1400,1402,1404,1407,1409,1411,1413,1416],{"class":564,"line":1401},20,[562,1403,1384],{"class":572},[562,1405,1406],{"class":773},"ip",[562,1408,1014],{"class":572},[562,1410,593],{"class":572},[562,1412,1019],{"class":572},[562,1414,1415],{"class":599},"203.0.113.7",[562,1417,1418],{"class":572},"\"\n",[562,1420,1422],{"class":564,"line":1421},21,[562,1423,1424],{"class":572},"    }\n",[562,1426,1428],{"class":564,"line":1427},22,[562,1429,1430],{"class":572},"  }\n",[562,1432,1434],{"class":564,"line":1433},23,[562,1435,990],{"class":572},[536,1437,1439,1440],{"id":1438},"standalone-audit","Standalone ",[540,1441,1442],{},"audit()",[532,1444,1445,1446,593],{},"For non-request contexts (jobs, scripts, CLIs), use the standalone ",[540,1447,1442],{},[798,1449,1450,1593],{},[553,1451,1454],{"className":555,"code":1452,"filename":1453,"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,1455,1456,1478,1482,1490,1505,1539,1573,1587],{"__ignoreMap":558},[562,1457,1458,1461,1463,1465,1467,1470,1472,1475],{"class":564,"line":565},[562,1459,1460],{"class":810},"import",[562,1462,617],{"class":572},[562,1464,743],{"class":568},[562,1466,777],{"class":572},[562,1468,1469],{"class":810}," from",[562,1471,596],{"class":572},[562,1473,1474],{"class":599},"evlog",[562,1476,1477],{"class":572},"'\n",[562,1479,1480],{"class":564,"line":586},[562,1481,718],{"emptyLinePlaceholder":717},[562,1483,1484,1486,1488],{"class":564,"line":609},[562,1485,577],{"class":576},[562,1487,580],{"class":568},[562,1489,583],{"class":572},[562,1491,1492,1494,1496,1498,1501,1503],{"class":564,"line":651},[562,1493,590],{"class":589},[562,1495,593],{"class":572},[562,1497,596],{"class":572},[562,1499,1500],{"class":599},"cron.cleanup",[562,1502,603],{"class":572},[562,1504,606],{"class":572},[562,1506,1507,1509,1511,1513,1515,1517,1519,1522,1524,1526,1528,1530,1532,1535,1537],{"class":564,"line":688},[562,1508,612],{"class":589},[562,1510,593],{"class":572},[562,1512,617],{"class":572},[562,1514,620],{"class":589},[562,1516,593],{"class":572},[562,1518,596],{"class":572},[562,1520,1521],{"class":599},"system",[562,1523,603],{"class":572},[562,1525,632],{"class":572},[562,1527,635],{"class":589},[562,1529,593],{"class":572},[562,1531,596],{"class":572},[562,1533,1534],{"class":599},"cron",[562,1536,603],{"class":572},[562,1538,685],{"class":572},[562,1540,1541,1543,1545,1547,1549,1551,1553,1556,1558,1560,1562,1564,1566,1569,1571],{"class":564,"line":705},[562,1542,654],{"class":589},[562,1544,593],{"class":572},[562,1546,617],{"class":572},[562,1548,620],{"class":589},[562,1550,593],{"class":572},[562,1552,596],{"class":572},[562,1554,1555],{"class":599},"job",[562,1557,603],{"class":572},[562,1559,632],{"class":572},[562,1561,635],{"class":589},[562,1563,593],{"class":572},[562,1565,596],{"class":572},[562,1567,1568],{"class":599},"cleanup-stale-sessions",[562,1570,603],{"class":572},[562,1572,685],{"class":572},[562,1574,1575,1577,1579,1581,1583,1585],{"class":564,"line":714},[562,1576,691],{"class":589},[562,1578,593],{"class":572},[562,1580,596],{"class":572},[562,1582,698],{"class":599},[562,1584,603],{"class":572},[562,1586,606],{"class":572},[562,1588,1589,1591],{"class":564,"line":721},[562,1590,708],{"class":572},[562,1592,711],{"class":568},[553,1594,1597],{"className":993,"code":1595,"filename":1596,"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,1598,1599,1603,1622,1640,1652,1670,1714,1758,1776,1790,1807,1811],{"__ignoreMap":558},[562,1600,1601],{"class":564,"line":565},[562,1602,583],{"class":572},[562,1604,1605,1607,1609,1611,1613,1615,1618,1620],{"class":564,"line":586},[562,1606,1007],{"class":572},[562,1608,1011],{"class":1010},[562,1610,1014],{"class":572},[562,1612,593],{"class":572},[562,1614,1019],{"class":572},[562,1616,1617],{"class":599},"info",[562,1619,1014],{"class":572},[562,1621,606],{"class":572},[562,1623,1624,1626,1628,1630,1632,1634,1636,1638],{"class":564,"line":609},[562,1625,1007],{"class":572},[562,1627,1033],{"class":1010},[562,1629,1014],{"class":572},[562,1631,593],{"class":572},[562,1633,1019],{"class":572},[562,1635,1042],{"class":599},[562,1637,1014],{"class":572},[562,1639,606],{"class":572},[562,1641,1642,1644,1646,1648,1650],{"class":564,"line":651},[562,1643,1007],{"class":572},[562,1645,577],{"class":1010},[562,1647,1014],{"class":572},[562,1649,593],{"class":572},[562,1651,857],{"class":572},[562,1653,1654,1656,1658,1660,1662,1664,1666,1668],{"class":564,"line":688},[562,1655,1176],{"class":572},[562,1657,1180],{"class":1179},[562,1659,1014],{"class":572},[562,1661,593],{"class":572},[562,1663,1019],{"class":572},[562,1665,1500],{"class":599},[562,1667,1014],{"class":572},[562,1669,606],{"class":572},[562,1671,1672,1674,1676,1678,1680,1682,1684,1686,1688,1690,1692,1694,1696,1698,1700,1702,1704,1706,1708,1710,1712],{"class":564,"line":705},[562,1673,1176],{"class":572},[562,1675,1200],{"class":1179},[562,1677,1014],{"class":572},[562,1679,593],{"class":572},[562,1681,617],{"class":572},[562,1683,1019],{"class":572},[562,1685,1211],{"class":773},[562,1687,1014],{"class":572},[562,1689,593],{"class":572},[562,1691,1019],{"class":572},[562,1693,1521],{"class":599},[562,1695,1014],{"class":572},[562,1697,632],{"class":572},[562,1699,1019],{"class":572},[562,1701,904],{"class":773},[562,1703,1014],{"class":572},[562,1705,593],{"class":572},[562,1707,1019],{"class":572},[562,1709,1534],{"class":599},[562,1711,1014],{"class":572},[562,1713,685],{"class":572},[562,1715,1716,1718,1720,1722,1724,1726,1728,1730,1732,1734,1736,1738,1740,1742,1744,1746,1748,1750,1752,1754,1756],{"class":564,"line":714},[562,1717,1176],{"class":572},[562,1719,1248],{"class":1179},[562,1721,1014],{"class":572},[562,1723,593],{"class":572},[562,1725,617],{"class":572},[562,1727,1019],{"class":572},[562,1729,1211],{"class":773},[562,1731,1014],{"class":572},[562,1733,593],{"class":572},[562,1735,1019],{"class":572},[562,1737,1555],{"class":599},[562,1739,1014],{"class":572},[562,1741,632],{"class":572},[562,1743,1019],{"class":572},[562,1745,904],{"class":773},[562,1747,1014],{"class":572},[562,1749,593],{"class":572},[562,1751,1019],{"class":572},[562,1753,1568],{"class":599},[562,1755,1014],{"class":572},[562,1757,685],{"class":572},[562,1759,1760,1762,1764,1766,1768,1770,1772,1774],{"class":564,"line":721},[562,1761,1176],{"class":572},[562,1763,1294],{"class":1179},[562,1765,1014],{"class":572},[562,1767,593],{"class":572},[562,1769,1019],{"class":572},[562,1771,698],{"class":599},[562,1773,1014],{"class":572},[562,1775,606],{"class":572},[562,1777,1778,1780,1782,1784,1786,1788],{"class":564,"line":728},[562,1779,1176],{"class":572},[562,1781,1335],{"class":1179},[562,1783,1014],{"class":572},[562,1785,593],{"class":572},[562,1787,774],{"class":773},[562,1789,606],{"class":572},[562,1791,1792,1794,1796,1798,1800,1802,1805],{"class":564,"line":1160},[562,1793,1176],{"class":572},[562,1795,1351],{"class":1179},[562,1797,1014],{"class":572},[562,1799,593],{"class":572},[562,1801,1019],{"class":572},[562,1803,1804],{"class":599},"ak_2b8e1f9d4c6a7b3e",[562,1806,1418],{"class":572},[562,1808,1809],{"class":564,"line":1173},[562,1810,1430],{"class":572},[562,1812,1813],{"class":564,"line":1195},[562,1814,990],{"class":572},[1816,1817,1439,1818,1820,1821,1823,1824,1823,1827,1830,1831,1834],"note",{},[540,1819,1442],{}," events have no ",[540,1822,1144],{},", no ",[540,1825,1826],{},"context.ip",[540,1828,1829],{},"userAgent"," — there is no request to enrich from. Add your own context manually (",[540,1832,1833],{},"context: { jobId, queue, runId }",") when it matters for forensics.",[536,1836,1838],{"id":1837},"defineauditaction",[540,1839,1840],{},"defineAuditAction()",[532,1842,1843,1844,593],{},"Define audit actions in one place to avoid magic strings and get full type-safety on ",[540,1845,1248],{},[553,1847,1849],{"className":555,"code":1848,"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,1850,1851,1870,1874,1914,1918,1935,1967,1991,2005],{"__ignoreMap":558},[562,1852,1853,1855,1857,1860,1862,1864,1866,1868],{"class":564,"line":565},[562,1854,1460],{"class":810},[562,1856,617],{"class":572},[562,1858,1859],{"class":568}," defineAuditAction",[562,1861,777],{"class":572},[562,1863,1469],{"class":810},[562,1865,596],{"class":572},[562,1867,1474],{"class":599},[562,1869,1477],{"class":572},[562,1871,1872],{"class":564,"line":586},[562,1873,718],{"emptyLinePlaceholder":717},[562,1875,1876,1879,1882,1885,1887,1889,1891,1893,1895,1897,1899,1902,1904,1906,1908,1910,1912],{"class":564,"line":609},[562,1877,1878],{"class":1010},"const",[562,1880,1881],{"class":568}," refund ",[562,1883,1884],{"class":572},"=",[562,1886,1859],{"class":576},[562,1888,580],{"class":568},[562,1890,603],{"class":572},[562,1892,600],{"class":599},[562,1894,603],{"class":572},[562,1896,632],{"class":572},[562,1898,617],{"class":572},[562,1900,1901],{"class":589}," target",[562,1903,593],{"class":572},[562,1905,596],{"class":572},[562,1907,667],{"class":599},[562,1909,603],{"class":572},[562,1911,777],{"class":572},[562,1913,711],{"class":568},[562,1915,1916],{"class":564,"line":651},[562,1917,718],{"emptyLinePlaceholder":717},[562,1919,1920,1922,1924,1926,1928,1931,1933],{"class":564,"line":688},[562,1921,569],{"class":568},[562,1923,573],{"class":572},[562,1925,577],{"class":576},[562,1927,580],{"class":568},[562,1929,1930],{"class":576},"refund",[562,1932,580],{"class":568},[562,1934,583],{"class":572},[562,1936,1937,1939,1941,1943,1945,1947,1949,1951,1953,1955,1957,1959,1961,1963,1965],{"class":564,"line":705},[562,1938,612],{"class":589},[562,1940,593],{"class":572},[562,1942,617],{"class":572},[562,1944,620],{"class":589},[562,1946,593],{"class":572},[562,1948,596],{"class":572},[562,1950,627],{"class":599},[562,1952,603],{"class":572},[562,1954,632],{"class":572},[562,1956,635],{"class":589},[562,1958,593],{"class":572},[562,1960,640],{"class":568},[562,1962,573],{"class":572},[562,1964,645],{"class":568},[562,1966,648],{"class":572},[562,1968,1969,1971,1973,1975,1977,1979,1981,1983,1985,1988],{"class":564,"line":714},[562,1970,654],{"class":589},[562,1972,593],{"class":572},[562,1974,617],{"class":572},[562,1976,635],{"class":589},[562,1978,593],{"class":572},[562,1980,596],{"class":572},[562,1982,680],{"class":599},[562,1984,603],{"class":572},[562,1986,1987],{"class":572}," },",[562,1989,1990],{"class":724}," \u002F\u002F type inferred as 'invoice'\n",[562,1992,1993,1995,1997,1999,2001,2003],{"class":564,"line":721},[562,1994,691],{"class":589},[562,1996,593],{"class":572},[562,1998,596],{"class":572},[562,2000,698],{"class":599},[562,2002,603],{"class":572},[562,2004,606],{"class":572},[562,2006,2007,2009],{"class":564,"line":728},[562,2008,708],{"class":572},[562,2010,2011],{"class":568},"))\n",[532,2013,2014,2015,573],{},"Pair this with the action dictionary from ",[2016,2017,2019],"a",{"href":2018},"\u002Fuse-cases\u002Faudit\u002Fschema#action-naming","Schema → Action naming",[536,2021,2023],{"id":2022},"defineauditcatalog",[540,2024,2025],{},"defineAuditCatalog()",[532,2027,2028,2029,2033,2034,2037,2038,2041,2042,2045,2046,2048,2049,573],{},"For more than a handful of actions, group them in a typed ",[2030,2031,2032],"strong",{},"catalog"," instead of declaring ",[540,2035,2036],{},"defineAuditAction"," one-by-one. Same convention as error catalogs: ",[540,2039,2040],{},"UPPER_SNAKE_CASE"," keys, ",[540,2043,2044],{},"lower.dot.case"," prefix, wire ",[540,2047,1180],{}," is ",[540,2050,2051],{},"${prefix}.${KEY}",[798,2053,2054,2312],{},[553,2055,2058],{"className":555,"code":2056,"filename":2057,"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,2059,2060,2079,2083,2111,2120,2134,2150,2163,2179,2201,2206,2228,2272,2306],{"__ignoreMap":558},[562,2061,2062,2064,2066,2069,2071,2073,2075,2077],{"class":564,"line":565},[562,2063,1460],{"class":810},[562,2065,617],{"class":572},[562,2067,2068],{"class":568}," defineAuditCatalog",[562,2070,777],{"class":572},[562,2072,1469],{"class":810},[562,2074,596],{"class":572},[562,2076,1474],{"class":599},[562,2078,1477],{"class":572},[562,2080,2081],{"class":564,"line":586},[562,2082,718],{"emptyLinePlaceholder":717},[562,2084,2085,2088,2091,2094,2096,2098,2100,2102,2105,2107,2109],{"class":564,"line":609},[562,2086,2087],{"class":810},"export",[562,2089,2090],{"class":1010}," const",[562,2092,2093],{"class":568}," billingAudit ",[562,2095,1884],{"class":572},[562,2097,2068],{"class":576},[562,2099,580],{"class":568},[562,2101,603],{"class":572},[562,2103,2104],{"class":599},"billing",[562,2106,603],{"class":572},[562,2108,632],{"class":572},[562,2110,857],{"class":572},[562,2112,2113,2116,2118],{"class":564,"line":651},[562,2114,2115],{"class":589},"  INVOICE_REFUND",[562,2117,593],{"class":572},[562,2119,857],{"class":572},[562,2121,2122,2124,2126,2128,2130,2132],{"class":564,"line":688},[562,2123,911],{"class":589},[562,2125,593],{"class":572},[562,2127,596],{"class":572},[562,2129,667],{"class":599},[562,2131,603],{"class":572},[562,2133,606],{"class":572},[562,2135,2136,2139,2141,2143,2146,2148],{"class":564,"line":705},[562,2137,2138],{"class":589},"    severity",[562,2140,593],{"class":572},[562,2142,596],{"class":572},[562,2144,2145],{"class":599},"high",[562,2147,603],{"class":572},[562,2149,606],{"class":572},[562,2151,2152,2155,2157,2161],{"class":564,"line":714},[562,2153,2154],{"class":589},"    requiresChanges",[562,2156,593],{"class":572},[562,2158,2160],{"class":2159},"sfNiH"," true",[562,2162,606],{"class":572},[562,2164,2165,2168,2170,2172,2175,2177],{"class":564,"line":721},[562,2166,2167],{"class":589},"    description",[562,2169,593],{"class":572},[562,2171,596],{"class":572},[562,2173,2174],{"class":599},"Refund an invoice to the customer",[562,2176,603],{"class":572},[562,2178,606],{"class":572},[562,2180,2181,2184,2186,2189,2191,2194,2196,2199],{"class":564,"line":728},[562,2182,2183],{"class":589},"    redactPaths",[562,2185,593],{"class":572},[562,2187,2188],{"class":568}," [",[562,2190,603],{"class":572},[562,2192,2193],{"class":599},"cardNumber",[562,2195,603],{"class":572},[562,2197,2198],{"class":568},"]",[562,2200,606],{"class":572},[562,2202,2203],{"class":564,"line":1160},[562,2204,2205],{"class":572},"  },\n",[562,2207,2208,2211,2213,2216,2218,2220,2222,2224,2226],{"class":564,"line":1173},[562,2209,2210],{"class":589},"  INVOICE_CREATE",[562,2212,593],{"class":572},[562,2214,2215],{"class":572},"      {",[562,2217,1901],{"class":589},[562,2219,593],{"class":572},[562,2221,596],{"class":572},[562,2223,667],{"class":599},[562,2225,603],{"class":572},[562,2227,685],{"class":572},[562,2229,2230,2233,2235,2238,2240,2242,2244,2246,2248,2250,2253,2255,2257,2259,2261,2263,2266,2268,2270],{"class":564,"line":1195},[562,2231,2232],{"class":589},"  INVOICE_VOID",[562,2234,593],{"class":572},[562,2236,2237],{"class":572},"        {",[562,2239,1901],{"class":589},[562,2241,593],{"class":572},[562,2243,596],{"class":572},[562,2245,667],{"class":599},[562,2247,603],{"class":572},[562,2249,632],{"class":572},[562,2251,2252],{"class":589}," severity",[562,2254,593],{"class":572},[562,2256,596],{"class":572},[562,2258,2145],{"class":599},[562,2260,603],{"class":572},[562,2262,632],{"class":572},[562,2264,2265],{"class":589}," requiresReason",[562,2267,593],{"class":572},[562,2269,2160],{"class":2159},[562,2271,685],{"class":572},[562,2273,2274,2277,2279,2281,2283,2285,2287,2290,2292,2294,2296,2298,2300,2302,2304],{"class":564,"line":1243},[562,2275,2276],{"class":589},"  SUBSCRIPTION_CANCEL",[562,2278,593],{"class":572},[562,2280,617],{"class":572},[562,2282,1901],{"class":589},[562,2284,593],{"class":572},[562,2286,596],{"class":572},[562,2288,2289],{"class":599},"subscription",[562,2291,603],{"class":572},[562,2293,632],{"class":572},[562,2295,2252],{"class":589},[562,2297,593],{"class":572},[562,2299,596],{"class":572},[562,2301,2145],{"class":599},[562,2303,603],{"class":572},[562,2305,685],{"class":572},[562,2307,2308,2310],{"class":564,"line":1289},[562,2309,708],{"class":572},[562,2311,711],{"class":568},[553,2313,2316],{"className":555,"code":2314,"filename":2315,"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,2317,2318,2338,2342,2362,2394,2416,2430],{"__ignoreMap":558},[562,2319,2320,2322,2324,2327,2329,2331,2333,2336],{"class":564,"line":565},[562,2321,1460],{"class":810},[562,2323,617],{"class":572},[562,2325,2326],{"class":568}," billingAudit",[562,2328,777],{"class":572},[562,2330,1469],{"class":810},[562,2332,596],{"class":572},[562,2334,2335],{"class":599},"~\u002Faudit\u002Fbilling",[562,2337,1477],{"class":572},[562,2339,2340],{"class":564,"line":586},[562,2341,718],{"emptyLinePlaceholder":717},[562,2343,2344,2346,2348,2350,2353,2355,2358,2360],{"class":564,"line":609},[562,2345,569],{"class":568},[562,2347,573],{"class":572},[562,2349,577],{"class":576},[562,2351,2352],{"class":568},"(billingAudit",[562,2354,573],{"class":572},[562,2356,2357],{"class":576},"INVOICE_REFUND",[562,2359,580],{"class":568},[562,2361,583],{"class":572},[562,2363,2364,2366,2368,2370,2372,2374,2376,2378,2380,2382,2384,2386,2388,2390,2392],{"class":564,"line":651},[562,2365,612],{"class":589},[562,2367,593],{"class":572},[562,2369,617],{"class":572},[562,2371,620],{"class":589},[562,2373,593],{"class":572},[562,2375,596],{"class":572},[562,2377,627],{"class":599},[562,2379,603],{"class":572},[562,2381,632],{"class":572},[562,2383,635],{"class":589},[562,2385,593],{"class":572},[562,2387,640],{"class":568},[562,2389,573],{"class":572},[562,2391,645],{"class":568},[562,2393,648],{"class":572},[562,2395,2396,2398,2400,2402,2404,2406,2408,2410,2412,2414],{"class":564,"line":688},[562,2397,654],{"class":589},[562,2399,593],{"class":572},[562,2401,617],{"class":572},[562,2403,635],{"class":589},[562,2405,593],{"class":572},[562,2407,596],{"class":572},[562,2409,680],{"class":599},[562,2411,603],{"class":572},[562,2413,1987],{"class":572},[562,2415,1990],{"class":724},[562,2417,2418,2420,2422,2424,2426,2428],{"class":564,"line":705},[562,2419,691],{"class":589},[562,2421,593],{"class":572},[562,2423,596],{"class":572},[562,2425,698],{"class":599},[562,2427,603],{"class":572},[562,2429,606],{"class":572},[562,2431,2432,2434],{"class":564,"line":714},[562,2433,708],{"class":572},[562,2435,2011],{"class":568},[532,2437,2438,2439,2441,2442,2445,2446,593],{},"Each entry produces a thin wrapper around ",[540,2440,2036],{}," (target type is fixed at definition time, action name is auto-prefixed). Catalog metadata is exposed on each factory and on ",[540,2443,2444],{},"_actions"," \u002F ",[540,2447,2448],{},"_prefix",[553,2450,2452],{"className":555,"code":2451,"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,2453,2454,2471,2487,2503,2519,2535],{"__ignoreMap":558},[562,2455,2456,2459,2461,2463,2465,2468],{"class":564,"line":565},[562,2457,2458],{"class":568},"billingAudit",[562,2460,573],{"class":572},[562,2462,2357],{"class":568},[562,2464,573],{"class":572},[562,2466,2467],{"class":568},"action           ",[562,2469,2470],{"class":724},"\u002F\u002F 'billing.INVOICE_REFUND' (literal type)\n",[562,2472,2473,2475,2477,2479,2481,2484],{"class":564,"line":586},[562,2474,2458],{"class":568},[562,2476,573],{"class":572},[562,2478,2357],{"class":568},[562,2480,573],{"class":572},[562,2482,2483],{"class":568},"target           ",[562,2485,2486],{"class":724},"\u002F\u002F 'invoice'\n",[562,2488,2489,2491,2493,2495,2497,2500],{"class":564,"line":609},[562,2490,2458],{"class":568},[562,2492,573],{"class":572},[562,2494,2357],{"class":568},[562,2496,573],{"class":572},[562,2498,2499],{"class":568},"severity         ",[562,2501,2502],{"class":724},"\u002F\u002F 'high'\n",[562,2504,2505,2507,2509,2511,2513,2516],{"class":564,"line":651},[562,2506,2458],{"class":568},[562,2508,573],{"class":572},[562,2510,2357],{"class":568},[562,2512,573],{"class":572},[562,2514,2515],{"class":568},"requiresChanges ",[562,2517,2518],{"class":724},"\u002F\u002F true\n",[562,2520,2521,2523,2525,2527,2529,2532],{"class":564,"line":688},[562,2522,2458],{"class":568},[562,2524,573],{"class":572},[562,2526,2357],{"class":568},[562,2528,573],{"class":572},[562,2530,2531],{"class":568},"redactPaths      ",[562,2533,2534],{"class":724},"\u002F\u002F ['cardNumber']\n",[562,2536,2537,2539,2541,2544],{"class":564,"line":705},[562,2538,2458],{"class":568},[562,2540,573],{"class":572},[562,2542,2543],{"class":568},"_actions                        ",[562,2545,2546],{"class":724},"\u002F\u002F readonly ['billing.INVOICE_REFUND', ...]\n",[2548,2549,2550,2563],"table",{},[2551,2552,2553],"thead",{},[2554,2555,2556,2560],"tr",{},[2557,2558,2559],"th",{},"Entry field",[2557,2561,2562],{},"Purpose",[2564,2565,2566,2580,2590,2603,2621,2633],"tbody",{},[2554,2567,2568,2573],{},[2569,2570,2571],"td",{},[540,2572,1248],{},[2569,2574,2575,2576,2579],{},"Default ",[540,2577,2578],{},"target.type"," injected at call sites",[2554,2581,2582,2587],{},[2569,2583,2584],{},[540,2585,2586],{},"description",[2569,2588,2589],{},"Human-readable label for docs, SIEM rules, review tooling",[2554,2591,2592,2597],{},[2569,2593,2594],{},[540,2595,2596],{},"severity",[2569,2598,2599,2602],{},[540,2600,2601],{},"'low' | 'medium' | 'high' | 'critical'"," — alerting and review priority",[2554,2604,2605,2610],{},[2569,2606,2607],{},[540,2608,2609],{},"requiresChanges",[2569,2611,2612,2613,2616,2617,2620],{},"Document that callers should attach ",[540,2614,2615],{},"changes"," (e.g. via ",[540,2618,2619],{},"auditDiff",")",[2554,2622,2623,2628],{},[2569,2624,2625],{},[540,2626,2627],{},"requiresReason",[2569,2629,2612,2630,2632],{},[540,2631,1315],{}," (especially denials)",[2554,2634,2635,2640],{},[2569,2636,2637],{},[540,2638,2639],{},"redactPaths",[2569,2641,2642,2643,2646],{},"Default paths for ",[540,2644,2645],{},"auditDiff({ redactPaths: [...] })"," on this action",[2648,2649,2651,2653,2654,2657],"h3",{"id":2650},"defineauditaction-vs-defineauditcatalog-when-to-choose",[540,2652,2036],{}," vs ",[540,2655,2656],{},"defineAuditCatalog"," — when to choose",[532,2659,2660],{},"Both produce the same call-site factory shape. Pick by scale:",[2662,2663,2664,2680],"ul",{},[2665,2666,2667,2672,2673,2676,2677,2679],"li",{},[2030,2668,2669],{},[540,2670,2671],{},"defineAuditAction(action, opts?)"," — one-off actions, or per-file organisation in very large repos. Mirrors ",[540,2674,2675],{},"defineError",". Equivalent to a catalog with a single entry but with no prefix derivation: you write the full wire ",[540,2678,1180],{}," directly.",[2665,2681,2682,2687,2688,2691,2692,2694,2695,2697,2698,2700,2701,2703,2704,2707,2708,2711],{},[2030,2683,2684],{},[540,2685,2686],{},"defineAuditCatalog(prefix, map)"," — group anything beyond a handful of related actions under one prefix. Mirrors ",[540,2689,2690],{},"defineErrorCatalog",". The wire ",[540,2693,1180],{}," is auto-derived as ",[540,2696,2051],{},", catalog metadata (",[540,2699,2444],{},", ",[540,2702,2448],{},") is exposed for introspection, and a single ",[540,2705,2706],{},"declare module 'evlog'"," line surfaces the whole bundle in the typed ",[540,2709,2710],{},"AuditAction"," union.",[532,2713,2714,2715,2717,2718,2700,2720,2700,2723,2725],{},"You can mix the two in the same codebase — keep cross-cutting one-off actions as ",[540,2716,2036],{},", group bounded contexts (",[540,2719,2104],{},[540,2721,2722],{},"auth",[540,2724,2289],{},") as catalogs.",[2648,2727,2729],{"id":2728},"type-safe-actions-everywhere-opt-in","Type-safe actions everywhere (opt-in)",[532,2731,2732,2733,593],{},"Mirror the error catalog augmentation by augmenting ",[540,2734,2735],{},"RegisteredAuditCatalogs",[553,2737,2739],{"className":555,"code":2738,"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,2740,2741,2762,2766,2782,2792,2805,2809],{"__ignoreMap":558},[562,2742,2743,2745,2747,2749,2751,2753,2755,2757,2760],{"class":564,"line":565},[562,2744,1460],{"class":810},[562,2746,620],{"class":810},[562,2748,617],{"class":572},[562,2750,2326],{"class":568},[562,2752,777],{"class":572},[562,2754,1469],{"class":810},[562,2756,596],{"class":572},[562,2758,2759],{"class":599},".\u002Faudit\u002Fbilling",[562,2761,1477],{"class":572},[562,2763,2764],{"class":564,"line":586},[562,2765,718],{"emptyLinePlaceholder":717},[562,2767,2768,2771,2774,2776,2778,2780],{"class":564,"line":609},[562,2769,2770],{"class":1010},"declare",[562,2772,2773],{"class":1010}," module",[562,2775,596],{"class":572},[562,2777,1474],{"class":599},[562,2779,603],{"class":572},[562,2781,857],{"class":572},[562,2783,2784,2787,2790],{"class":564,"line":651},[562,2785,2786],{"class":1010},"  interface",[562,2788,2789],{"class":1179}," RegisteredAuditCatalogs",[562,2791,857],{"class":572},[562,2793,2794,2797,2799,2802],{"class":564,"line":688},[562,2795,2796],{"class":589},"    billing",[562,2798,593],{"class":572},[562,2800,2801],{"class":572}," typeof",[562,2803,2804],{"class":568}," billingAudit\n",[562,2806,2807],{"class":564,"line":705},[562,2808,1430],{"class":572},[562,2810,2811],{"class":564,"line":714},[562,2812,990],{"class":572},[532,2814,2815,2816,2818],{},"This surfaces the union of all registered actions on the typed ",[540,2817,2710],{}," export, useful for shared helpers, dashboards, and refactor-safe comparisons.",[2820,2821,2824,2827,2828,2831],"callout",{"color":2822,"icon":2823,"to":77},"primary","i-lucide-arrow-right",[2030,2825,2826],{},"Going further."," The dedicated ",[2016,2829,2830],{"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,2833,2835],{"id":2834},"auditdiff",[540,2836,2837],{},"auditDiff()",[532,2839,2840,2841,2843],{},"For mutating actions, use ",[540,2842,2837],{}," to produce a compact, redact-aware JSON Patch:",[2845,2846,2847,2852,2853,2048,2855,2859,2860,2863,2864,2867,2868,2871,2872,2875,2876,2878],"warning",{},[2030,2848,2849,2850,573],{},"Don't feed entire DB rows into ",[540,2851,2837],{}," Strip computed columns, hashed passwords, internal flags, and large JSON blobs before diffing. The point of ",[540,2854,2615],{},[2856,2857,2858],"em",{},"what changed semantically"," (status went from ",[540,2861,2862],{},"paid"," → ",[540,2865,2866],{},"refunded","), not ",[2856,2869,2870],{},"what bytes changed"," (a ",[540,2873,2874],{},"lastModified"," timestamp ticked). A noisy ",[540,2877,2615],{}," field is the fastest way to make audit logs unreadable.",[798,2880,2881,3125],{},[553,2882,2884],{"className":555,"code":2883,"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,2885,2886,2905,2909,2937,2967,2971,2983,2998,3027,3052,3066,3119],{"__ignoreMap":558},[562,2887,2888,2890,2892,2895,2897,2899,2901,2903],{"class":564,"line":565},[562,2889,1460],{"class":810},[562,2891,617],{"class":572},[562,2893,2894],{"class":568}," auditDiff",[562,2896,777],{"class":572},[562,2898,1469],{"class":810},[562,2900,596],{"class":572},[562,2902,1474],{"class":599},[562,2904,1477],{"class":572},[562,2906,2907],{"class":564,"line":586},[562,2908,718],{"emptyLinePlaceholder":717},[562,2910,2911,2913,2916,2918,2921,2924,2926,2929,2931,2934],{"class":564,"line":609},[562,2912,1878],{"class":1010},[562,2914,2915],{"class":568}," before ",[562,2917,1884],{"class":572},[562,2919,2920],{"class":810}," await",[562,2922,2923],{"class":568}," db",[562,2925,573],{"class":572},[562,2927,2928],{"class":568},"users",[562,2930,573],{"class":572},[562,2932,2933],{"class":576},"byId",[562,2935,2936],{"class":568},"(id)\n",[562,2938,2939,2941,2944,2946,2948,2950,2952,2954,2956,2959,2962,2964],{"class":564,"line":651},[562,2940,1878],{"class":1010},[562,2942,2943],{"class":568}," after ",[562,2945,1884],{"class":572},[562,2947,2920],{"class":810},[562,2949,2923],{"class":568},[562,2951,573],{"class":572},[562,2953,2928],{"class":568},[562,2955,573],{"class":572},[562,2957,2958],{"class":576},"update",[562,2960,2961],{"class":568},"(id",[562,2963,632],{"class":572},[562,2965,2966],{"class":568}," patch)\n",[562,2968,2969],{"class":564,"line":688},[562,2970,718],{"emptyLinePlaceholder":717},[562,2972,2973,2975,2977,2979,2981],{"class":564,"line":705},[562,2974,569],{"class":568},[562,2976,573],{"class":572},[562,2978,577],{"class":576},[562,2980,580],{"class":568},[562,2982,583],{"class":572},[562,2984,2985,2987,2989,2991,2994,2996],{"class":564,"line":714},[562,2986,590],{"class":589},[562,2988,593],{"class":572},[562,2990,596],{"class":572},[562,2992,2993],{"class":599},"user.update",[562,2995,603],{"class":572},[562,2997,606],{"class":572},[562,2999,3000,3002,3004,3006,3008,3010,3012,3014,3016,3018,3020,3022,3025],{"class":564,"line":721},[562,3001,612],{"class":589},[562,3003,593],{"class":572},[562,3005,617],{"class":572},[562,3007,620],{"class":589},[562,3009,593],{"class":572},[562,3011,596],{"class":572},[562,3013,627],{"class":599},[562,3015,603],{"class":572},[562,3017,632],{"class":572},[562,3019,635],{"class":589},[562,3021,593],{"class":572},[562,3023,3024],{"class":568}," actorId ",[562,3026,648],{"class":572},[562,3028,3029,3031,3033,3035,3037,3039,3041,3043,3045,3047,3050],{"class":564,"line":728},[562,3030,654],{"class":589},[562,3032,593],{"class":572},[562,3034,617],{"class":572},[562,3036,620],{"class":589},[562,3038,593],{"class":572},[562,3040,596],{"class":572},[562,3042,627],{"class":599},[562,3044,603],{"class":572},[562,3046,632],{"class":572},[562,3048,3049],{"class":568}," id ",[562,3051,648],{"class":572},[562,3053,3054,3056,3058,3060,3062,3064],{"class":564,"line":1160},[562,3055,691],{"class":589},[562,3057,593],{"class":572},[562,3059,596],{"class":572},[562,3061,698],{"class":599},[562,3063,603],{"class":572},[562,3065,606],{"class":572},[562,3067,3068,3071,3073,3075,3078,3080,3083,3085,3087,3090,3092,3094,3096,3099,3101,3103,3105,3108,3110,3113,3115,3117],{"class":564,"line":1173},[562,3069,3070],{"class":589},"  changes",[562,3072,593],{"class":572},[562,3074,2894],{"class":576},[562,3076,3077],{"class":568},"(before",[562,3079,632],{"class":572},[562,3081,3082],{"class":568}," after",[562,3084,632],{"class":572},[562,3086,617],{"class":572},[562,3088,3089],{"class":589}," redactPaths",[562,3091,593],{"class":572},[562,3093,2188],{"class":568},[562,3095,603],{"class":572},[562,3097,3098],{"class":599},"password",[562,3100,603],{"class":572},[562,3102,632],{"class":572},[562,3104,596],{"class":572},[562,3106,3107],{"class":599},"token",[562,3109,603],{"class":572},[562,3111,3112],{"class":568},"] ",[562,3114,708],{"class":572},[562,3116,2620],{"class":568},[562,3118,606],{"class":572},[562,3120,3121,3123],{"class":564,"line":1195},[562,3122,708],{"class":572},[562,3124,711],{"class":568},[553,3126,3129],{"className":993,"code":3127,"filename":3128,"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,3130,3131,3135,3147,3165,3210,3255,3273,3286,3361,3432,3503,3508,3522,3539,3543],{"__ignoreMap":558},[562,3132,3133],{"class":564,"line":565},[562,3134,583],{"class":572},[562,3136,3137,3139,3141,3143,3145],{"class":564,"line":586},[562,3138,1007],{"class":572},[562,3140,577],{"class":1010},[562,3142,1014],{"class":572},[562,3144,593],{"class":572},[562,3146,857],{"class":572},[562,3148,3149,3151,3153,3155,3157,3159,3161,3163],{"class":564,"line":609},[562,3150,1176],{"class":572},[562,3152,1180],{"class":1179},[562,3154,1014],{"class":572},[562,3156,593],{"class":572},[562,3158,1019],{"class":572},[562,3160,2993],{"class":599},[562,3162,1014],{"class":572},[562,3164,606],{"class":572},[562,3166,3167,3169,3171,3173,3175,3177,3179,3181,3183,3185,3187,3189,3191,3193,3195,3197,3199,3201,3203,3206,3208],{"class":564,"line":651},[562,3168,1176],{"class":572},[562,3170,1200],{"class":1179},[562,3172,1014],{"class":572},[562,3174,593],{"class":572},[562,3176,617],{"class":572},[562,3178,1019],{"class":572},[562,3180,1211],{"class":773},[562,3182,1014],{"class":572},[562,3184,593],{"class":572},[562,3186,1019],{"class":572},[562,3188,627],{"class":599},[562,3190,1014],{"class":572},[562,3192,632],{"class":572},[562,3194,1019],{"class":572},[562,3196,904],{"class":773},[562,3198,1014],{"class":572},[562,3200,593],{"class":572},[562,3202,1019],{"class":572},[562,3204,3205],{"class":599},"usr_42",[562,3207,1014],{"class":572},[562,3209,685],{"class":572},[562,3211,3212,3214,3216,3218,3220,3222,3224,3226,3228,3230,3232,3234,3236,3238,3240,3242,3244,3246,3248,3251,3253],{"class":564,"line":688},[562,3213,1176],{"class":572},[562,3215,1248],{"class":1179},[562,3217,1014],{"class":572},[562,3219,593],{"class":572},[562,3221,617],{"class":572},[562,3223,1019],{"class":572},[562,3225,1211],{"class":773},[562,3227,1014],{"class":572},[562,3229,593],{"class":572},[562,3231,1019],{"class":572},[562,3233,627],{"class":599},[562,3235,1014],{"class":572},[562,3237,632],{"class":572},[562,3239,1019],{"class":572},[562,3241,904],{"class":773},[562,3243,1014],{"class":572},[562,3245,593],{"class":572},[562,3247,1019],{"class":572},[562,3249,3250],{"class":599},"usr_99",[562,3252,1014],{"class":572},[562,3254,685],{"class":572},[562,3256,3257,3259,3261,3263,3265,3267,3269,3271],{"class":564,"line":705},[562,3258,1176],{"class":572},[562,3260,1294],{"class":1179},[562,3262,1014],{"class":572},[562,3264,593],{"class":572},[562,3266,1019],{"class":572},[562,3268,698],{"class":599},[562,3270,1014],{"class":572},[562,3272,606],{"class":572},[562,3274,3275,3277,3279,3281,3283],{"class":564,"line":714},[562,3276,1176],{"class":572},[562,3278,2615],{"class":1179},[562,3280,1014],{"class":572},[562,3282,593],{"class":572},[562,3284,3285],{"class":572}," [\n",[562,3287,3288,3290,3292,3295,3297,3299,3301,3304,3306,3308,3310,3312,3314,3316,3318,3321,3323,3325,3327,3330,3332,3334,3336,3339,3341,3343,3345,3348,3350,3352,3354,3357,3359],{"class":564,"line":721},[562,3289,2215],{"class":572},[562,3291,1019],{"class":572},[562,3293,3294],{"class":773},"op",[562,3296,1014],{"class":572},[562,3298,593],{"class":572},[562,3300,1019],{"class":572},[562,3302,3303],{"class":599},"replace",[562,3305,1014],{"class":572},[562,3307,632],{"class":572},[562,3309,1019],{"class":572},[562,3311,1073],{"class":773},[562,3313,1014],{"class":572},[562,3315,593],{"class":572},[562,3317,1019],{"class":572},[562,3319,3320],{"class":599},"\u002Femail",[562,3322,1014],{"class":572},[562,3324,632],{"class":572},[562,3326,1019],{"class":572},[562,3328,3329],{"class":773},"from",[562,3331,1014],{"class":572},[562,3333,593],{"class":572},[562,3335,1019],{"class":572},[562,3337,3338],{"class":599},"old@example.com",[562,3340,1014],{"class":572},[562,3342,632],{"class":572},[562,3344,1019],{"class":572},[562,3346,3347],{"class":773},"to",[562,3349,1014],{"class":572},[562,3351,593],{"class":572},[562,3353,1019],{"class":572},[562,3355,3356],{"class":599},"new@example.com",[562,3358,1014],{"class":572},[562,3360,685],{"class":572},[562,3362,3363,3365,3367,3369,3371,3373,3375,3377,3379,3381,3383,3385,3387,3389,3391,3394,3396,3398,3400,3402,3404,3406,3408,3411,3413,3415,3417,3419,3421,3423,3425,3428,3430],{"class":564,"line":728},[562,3364,2215],{"class":572},[562,3366,1019],{"class":572},[562,3368,3294],{"class":773},[562,3370,1014],{"class":572},[562,3372,593],{"class":572},[562,3374,1019],{"class":572},[562,3376,3303],{"class":599},[562,3378,1014],{"class":572},[562,3380,632],{"class":572},[562,3382,1019],{"class":572},[562,3384,1073],{"class":773},[562,3386,1014],{"class":572},[562,3388,593],{"class":572},[562,3390,1019],{"class":572},[562,3392,3393],{"class":599},"\u002Frole",[562,3395,1014],{"class":572},[562,3397,632],{"class":572},[562,3399,1019],{"class":572},[562,3401,3329],{"class":773},[562,3403,1014],{"class":572},[562,3405,593],{"class":572},[562,3407,1019],{"class":572},[562,3409,3410],{"class":599},"member",[562,3412,1014],{"class":572},[562,3414,632],{"class":572},[562,3416,1019],{"class":572},[562,3418,3347],{"class":773},[562,3420,1014],{"class":572},[562,3422,593],{"class":572},[562,3424,1019],{"class":572},[562,3426,3427],{"class":599},"admin",[562,3429,1014],{"class":572},[562,3431,685],{"class":572},[562,3433,3434,3436,3438,3440,3442,3444,3446,3448,3450,3452,3454,3456,3458,3460,3462,3465,3467,3469,3471,3473,3475,3477,3479,3482,3484,3486,3488,3490,3492,3494,3496,3498,3500],{"class":564,"line":1160},[562,3435,2215],{"class":572},[562,3437,1019],{"class":572},[562,3439,3294],{"class":773},[562,3441,1014],{"class":572},[562,3443,593],{"class":572},[562,3445,1019],{"class":572},[562,3447,3303],{"class":599},[562,3449,1014],{"class":572},[562,3451,632],{"class":572},[562,3453,1019],{"class":572},[562,3455,1073],{"class":773},[562,3457,1014],{"class":572},[562,3459,593],{"class":572},[562,3461,1019],{"class":572},[562,3463,3464],{"class":599},"\u002Fpassword",[562,3466,1014],{"class":572},[562,3468,632],{"class":572},[562,3470,1019],{"class":572},[562,3472,3329],{"class":773},[562,3474,1014],{"class":572},[562,3476,593],{"class":572},[562,3478,1019],{"class":572},[562,3480,3481],{"class":599},"[REDACTED]",[562,3483,1014],{"class":572},[562,3485,632],{"class":572},[562,3487,1019],{"class":572},[562,3489,3347],{"class":773},[562,3491,1014],{"class":572},[562,3493,593],{"class":572},[562,3495,1019],{"class":572},[562,3497,3481],{"class":599},[562,3499,1014],{"class":572},[562,3501,3502],{"class":572}," }\n",[562,3504,3505],{"class":564,"line":1173},[562,3506,3507],{"class":572},"    ],\n",[562,3509,3510,3512,3514,3516,3518,3520],{"class":564,"line":1195},[562,3511,1176],{"class":572},[562,3513,1335],{"class":1179},[562,3515,1014],{"class":572},[562,3517,593],{"class":572},[562,3519,774],{"class":773},[562,3521,606],{"class":572},[562,3523,3524,3526,3528,3530,3532,3534,3537],{"class":564,"line":1243},[562,3525,1176],{"class":572},[562,3527,1351],{"class":1179},[562,3529,1014],{"class":572},[562,3531,593],{"class":572},[562,3533,1019],{"class":572},[562,3535,3536],{"class":599},"ak_5e7d8f9a0b1c2d3e",[562,3538,1418],{"class":572},[562,3540,3541],{"class":564,"line":1289},[562,3542,1430],{"class":572},[562,3544,3545],{"class":564,"line":1310},[562,3546,990],{"class":572},[536,3548,3550,3553],{"id":3549},"withaudit-auto-instrumentation",[540,3551,3552],{},"withAudit()"," — auto-instrumentation",[532,3555,3556,3557,3559],{},"Devs forget to call ",[540,3558,542],{},". Wrap the function and never miss a record:",[3561,3562,3563,3566,3567,3570,3571,3573,3574,3577],"tip",{},[2030,3564,3565],{},"When to wrap vs. call manually."," Wrap functions that are ",[2856,3568,3569],{},"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,3572,542],{}," when the audit is one of several decisions inside a larger handler, or when you need to emit the audit ",[2856,3575,3576],{},"before"," the action completes (e.g. \"user requested deletion\").",[798,3579,3580,3873,4078,4394],{},[553,3581,3583],{"className":555,"code":3582,"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,3584,3585,3609,3613,3627,3688,3720,3757,3785,3789,3793,3797,3823,3855,3867],{"__ignoreMap":558},[562,3586,3587,3589,3591,3594,3596,3599,3601,3603,3605,3607],{"class":564,"line":565},[562,3588,1460],{"class":810},[562,3590,617],{"class":572},[562,3592,3593],{"class":568}," withAudit",[562,3595,632],{"class":572},[562,3597,3598],{"class":568}," AuditDeniedError",[562,3600,777],{"class":572},[562,3602,1469],{"class":810},[562,3604,596],{"class":572},[562,3606,1474],{"class":599},[562,3608,1477],{"class":572},[562,3610,3611],{"class":564,"line":586},[562,3612,718],{"emptyLinePlaceholder":717},[562,3614,3615,3617,3620,3622,3624],{"class":564,"line":609},[562,3616,1878],{"class":1010},[562,3618,3619],{"class":568}," refundInvoice ",[562,3621,1884],{"class":572},[562,3623,3593],{"class":576},[562,3625,3626],{"class":568},"(\n",[562,3628,3629,3632,3634,3636,3638,3640,3642,3644,3646,3648,3652,3655,3657,3659,3661,3663,3665,3667,3669,3671,3673,3675,3677,3679,3681,3683,3686],{"class":564,"line":651},[562,3630,3631],{"class":572},"  {",[562,3633,750],{"class":589},[562,3635,593],{"class":572},[562,3637,596],{"class":572},[562,3639,600],{"class":599},[562,3641,603],{"class":572},[562,3643,632],{"class":572},[562,3645,1901],{"class":576},[562,3647,593],{"class":572},[562,3649,3651],{"class":3650},"sHdIc"," input",[562,3653,3654],{"class":1010}," =>",[562,3656,814],{"class":568},[562,3658,740],{"class":572},[562,3660,620],{"class":589},[562,3662,593],{"class":572},[562,3664,596],{"class":572},[562,3666,667],{"class":599},[562,3668,603],{"class":572},[562,3670,632],{"class":572},[562,3672,635],{"class":589},[562,3674,593],{"class":572},[562,3676,3651],{"class":568},[562,3678,573],{"class":572},[562,3680,645],{"class":568},[562,3682,708],{"class":572},[562,3684,3685],{"class":568},") ",[562,3687,648],{"class":572},[562,3689,3690,3693,3695,3698,3700,3702,3704,3706,3709,3711,3714,3716,3718],{"class":564,"line":688},[562,3691,3692],{"class":1010},"  async",[562,3694,814],{"class":572},[562,3696,3697],{"class":3650},"input",[562,3699,593],{"class":572},[562,3701,617],{"class":572},[562,3703,635],{"class":589},[562,3705,593],{"class":572},[562,3707,3708],{"class":1179}," string",[562,3710,1987],{"class":572},[562,3712,3713],{"class":3650}," ctx",[562,3715,2620],{"class":572},[562,3717,3654],{"class":1010},[562,3719,857],{"class":572},[562,3721,3722,3725,3727,3729,3732,3734,3736,3738,3741,3744,3746,3748,3750,3753,3755],{"class":564,"line":705},[562,3723,3724],{"class":810},"    if",[562,3726,814],{"class":589},[562,3728,817],{"class":572},[562,3730,3731],{"class":568},"ctx",[562,3733,573],{"class":572},[562,3735,1200],{"class":568},[562,3737,3685],{"class":589},[562,3739,3740],{"class":810},"throw",[562,3742,3743],{"class":572}," new",[562,3745,3598],{"class":576},[562,3747,580],{"class":589},[562,3749,603],{"class":572},[562,3751,3752],{"class":599},"Anonymous refund denied",[562,3754,603],{"class":572},[562,3756,711],{"class":589},[562,3758,3759,3762,3764,3766,3768,3771,3773,3775,3777,3779,3781,3783],{"class":564,"line":714},[562,3760,3761],{"class":810},"    return",[562,3763,2920],{"class":810},[562,3765,2923],{"class":568},[562,3767,573],{"class":572},[562,3769,3770],{"class":568},"invoices",[562,3772,573],{"class":572},[562,3774,1930],{"class":576},[562,3776,580],{"class":589},[562,3778,3697],{"class":568},[562,3780,573],{"class":572},[562,3782,904],{"class":568},[562,3784,711],{"class":589},[562,3786,3787],{"class":564,"line":721},[562,3788,2205],{"class":572},[562,3790,3791],{"class":564,"line":728},[562,3792,711],{"class":568},[562,3794,3795],{"class":564,"line":1160},[562,3796,718],{"emptyLinePlaceholder":717},[562,3798,3799,3802,3805,3807,3809,3811,3813,3815,3817,3819,3821],{"class":564,"line":1173},[562,3800,3801],{"class":810},"await",[562,3803,3804],{"class":576}," refundInvoice",[562,3806,580],{"class":568},[562,3808,740],{"class":572},[562,3810,635],{"class":589},[562,3812,593],{"class":572},[562,3814,596],{"class":572},[562,3816,680],{"class":599},[562,3818,603],{"class":572},[562,3820,1987],{"class":572},[562,3822,857],{"class":572},[562,3824,3825,3827,3829,3831,3833,3835,3837,3839,3841,3843,3845,3847,3849,3851,3853],{"class":564,"line":1195},[562,3826,612],{"class":589},[562,3828,593],{"class":572},[562,3830,617],{"class":572},[562,3832,620],{"class":589},[562,3834,593],{"class":572},[562,3836,596],{"class":572},[562,3838,627],{"class":599},[562,3840,603],{"class":572},[562,3842,632],{"class":572},[562,3844,635],{"class":589},[562,3846,593],{"class":572},[562,3848,640],{"class":568},[562,3850,573],{"class":572},[562,3852,645],{"class":568},[562,3854,648],{"class":572},[562,3856,3857,3860,3862,3865],{"class":564,"line":1243},[562,3858,3859],{"class":589},"  correlationId",[562,3861,593],{"class":572},[562,3863,3864],{"class":568}," requestId",[562,3866,606],{"class":572},[562,3868,3869,3871],{"class":564,"line":1289},[562,3870,708],{"class":572},[562,3872,711],{"class":568},[553,3874,3877],{"className":993,"code":3875,"filename":3876,"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,3878,3879,3883,3895,3913,3957,4001,4019,4033,4052,4070,4074],{"__ignoreMap":558},[562,3880,3881],{"class":564,"line":565},[562,3882,583],{"class":572},[562,3884,3885,3887,3889,3891,3893],{"class":564,"line":586},[562,3886,1007],{"class":572},[562,3888,577],{"class":1010},[562,3890,1014],{"class":572},[562,3892,593],{"class":572},[562,3894,857],{"class":572},[562,3896,3897,3899,3901,3903,3905,3907,3909,3911],{"class":564,"line":609},[562,3898,1176],{"class":572},[562,3900,1180],{"class":1179},[562,3902,1014],{"class":572},[562,3904,593],{"class":572},[562,3906,1019],{"class":572},[562,3908,600],{"class":599},[562,3910,1014],{"class":572},[562,3912,606],{"class":572},[562,3914,3915,3917,3919,3921,3923,3925,3927,3929,3931,3933,3935,3937,3939,3941,3943,3945,3947,3949,3951,3953,3955],{"class":564,"line":651},[562,3916,1176],{"class":572},[562,3918,1200],{"class":1179},[562,3920,1014],{"class":572},[562,3922,593],{"class":572},[562,3924,617],{"class":572},[562,3926,1019],{"class":572},[562,3928,1211],{"class":773},[562,3930,1014],{"class":572},[562,3932,593],{"class":572},[562,3934,1019],{"class":572},[562,3936,627],{"class":599},[562,3938,1014],{"class":572},[562,3940,632],{"class":572},[562,3942,1019],{"class":572},[562,3944,904],{"class":773},[562,3946,1014],{"class":572},[562,3948,593],{"class":572},[562,3950,1019],{"class":572},[562,3952,3205],{"class":599},[562,3954,1014],{"class":572},[562,3956,685],{"class":572},[562,3958,3959,3961,3963,3965,3967,3969,3971,3973,3975,3977,3979,3981,3983,3985,3987,3989,3991,3993,3995,3997,3999],{"class":564,"line":688},[562,3960,1176],{"class":572},[562,3962,1248],{"class":1179},[562,3964,1014],{"class":572},[562,3966,593],{"class":572},[562,3968,617],{"class":572},[562,3970,1019],{"class":572},[562,3972,1211],{"class":773},[562,3974,1014],{"class":572},[562,3976,593],{"class":572},[562,3978,1019],{"class":572},[562,3980,667],{"class":599},[562,3982,1014],{"class":572},[562,3984,632],{"class":572},[562,3986,1019],{"class":572},[562,3988,904],{"class":773},[562,3990,1014],{"class":572},[562,3992,593],{"class":572},[562,3994,1019],{"class":572},[562,3996,680],{"class":599},[562,3998,1014],{"class":572},[562,4000,685],{"class":572},[562,4002,4003,4005,4007,4009,4011,4013,4015,4017],{"class":564,"line":705},[562,4004,1176],{"class":572},[562,4006,1294],{"class":1179},[562,4008,1014],{"class":572},[562,4010,593],{"class":572},[562,4012,1019],{"class":572},[562,4014,698],{"class":599},[562,4016,1014],{"class":572},[562,4018,606],{"class":572},[562,4020,4021,4023,4025,4027,4029,4031],{"class":564,"line":714},[562,4022,1176],{"class":572},[562,4024,1335],{"class":1179},[562,4026,1014],{"class":572},[562,4028,593],{"class":572},[562,4030,774],{"class":773},[562,4032,606],{"class":572},[562,4034,4035,4037,4039,4041,4043,4045,4048,4050],{"class":564,"line":721},[562,4036,1176],{"class":572},[562,4038,1351],{"class":1179},[562,4040,1014],{"class":572},[562,4042,593],{"class":572},[562,4044,1019],{"class":572},[562,4046,4047],{"class":599},"ak_8f3c4b2a1e5d6f7c",[562,4049,1014],{"class":572},[562,4051,606],{"class":572},[562,4053,4054,4056,4059,4061,4063,4065,4068],{"class":564,"line":728},[562,4055,1176],{"class":572},[562,4057,4058],{"class":1179},"correlationId",[562,4060,1014],{"class":572},[562,4062,593],{"class":572},[562,4064,1019],{"class":572},[562,4066,4067],{"class":599},"a566ef91-7765-4f59-b6f0-b9f40ce71599",[562,4069,1418],{"class":572},[562,4071,4072],{"class":564,"line":1160},[562,4073,1430],{"class":572},[562,4075,4076],{"class":564,"line":1173},[562,4077,990],{"class":572},[553,4079,4082],{"className":993,"code":4080,"filename":4081,"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,4083,4084,4088,4107,4119,4137,4181,4225,4244,4263,4277,4296,4312,4316,4328,4348,4368,4386,4390],{"__ignoreMap":558},[562,4085,4086],{"class":564,"line":565},[562,4087,583],{"class":572},[562,4089,4090,4092,4094,4096,4098,4100,4103,4105],{"class":564,"line":586},[562,4091,1007],{"class":572},[562,4093,1011],{"class":1010},[562,4095,1014],{"class":572},[562,4097,593],{"class":572},[562,4099,1019],{"class":572},[562,4101,4102],{"class":599},"error",[562,4104,1014],{"class":572},[562,4106,606],{"class":572},[562,4108,4109,4111,4113,4115,4117],{"class":564,"line":609},[562,4110,1007],{"class":572},[562,4112,577],{"class":1010},[562,4114,1014],{"class":572},[562,4116,593],{"class":572},[562,4118,857],{"class":572},[562,4120,4121,4123,4125,4127,4129,4131,4133,4135],{"class":564,"line":651},[562,4122,1176],{"class":572},[562,4124,1180],{"class":1179},[562,4126,1014],{"class":572},[562,4128,593],{"class":572},[562,4130,1019],{"class":572},[562,4132,600],{"class":599},[562,4134,1014],{"class":572},[562,4136,606],{"class":572},[562,4138,4139,4141,4143,4145,4147,4149,4151,4153,4155,4157,4159,4161,4163,4165,4167,4169,4171,4173,4175,4177,4179],{"class":564,"line":688},[562,4140,1176],{"class":572},[562,4142,1200],{"class":1179},[562,4144,1014],{"class":572},[562,4146,593],{"class":572},[562,4148,617],{"class":572},[562,4150,1019],{"class":572},[562,4152,1211],{"class":773},[562,4154,1014],{"class":572},[562,4156,593],{"class":572},[562,4158,1019],{"class":572},[562,4160,627],{"class":599},[562,4162,1014],{"class":572},[562,4164,632],{"class":572},[562,4166,1019],{"class":572},[562,4168,904],{"class":773},[562,4170,1014],{"class":572},[562,4172,593],{"class":572},[562,4174,1019],{"class":572},[562,4176,3205],{"class":599},[562,4178,1014],{"class":572},[562,4180,685],{"class":572},[562,4182,4183,4185,4187,4189,4191,4193,4195,4197,4199,4201,4203,4205,4207,4209,4211,4213,4215,4217,4219,4221,4223],{"class":564,"line":705},[562,4184,1176],{"class":572},[562,4186,1248],{"class":1179},[562,4188,1014],{"class":572},[562,4190,593],{"class":572},[562,4192,617],{"class":572},[562,4194,1019],{"class":572},[562,4196,1211],{"class":773},[562,4198,1014],{"class":572},[562,4200,593],{"class":572},[562,4202,1019],{"class":572},[562,4204,667],{"class":599},[562,4206,1014],{"class":572},[562,4208,632],{"class":572},[562,4210,1019],{"class":572},[562,4212,904],{"class":773},[562,4214,1014],{"class":572},[562,4216,593],{"class":572},[562,4218,1019],{"class":572},[562,4220,680],{"class":599},[562,4222,1014],{"class":572},[562,4224,685],{"class":572},[562,4226,4227,4229,4231,4233,4235,4237,4240,4242],{"class":564,"line":714},[562,4228,1176],{"class":572},[562,4230,1294],{"class":1179},[562,4232,1014],{"class":572},[562,4234,593],{"class":572},[562,4236,1019],{"class":572},[562,4238,4239],{"class":599},"failure",[562,4241,1014],{"class":572},[562,4243,606],{"class":572},[562,4245,4246,4248,4250,4252,4254,4256,4259,4261],{"class":564,"line":721},[562,4247,1176],{"class":572},[562,4249,1315],{"class":1179},[562,4251,1014],{"class":572},[562,4253,593],{"class":572},[562,4255,1019],{"class":572},[562,4257,4258],{"class":599},"Stripe error: charge already refunded",[562,4260,1014],{"class":572},[562,4262,606],{"class":572},[562,4264,4265,4267,4269,4271,4273,4275],{"class":564,"line":728},[562,4266,1176],{"class":572},[562,4268,1335],{"class":1179},[562,4270,1014],{"class":572},[562,4272,593],{"class":572},[562,4274,774],{"class":773},[562,4276,606],{"class":572},[562,4278,4279,4281,4283,4285,4287,4289,4292,4294],{"class":564,"line":1160},[562,4280,1176],{"class":572},[562,4282,1351],{"class":1179},[562,4284,1014],{"class":572},[562,4286,593],{"class":572},[562,4288,1019],{"class":572},[562,4290,4291],{"class":599},"ak_4c5d6e7f8a9b0c1d",[562,4293,1014],{"class":572},[562,4295,606],{"class":572},[562,4297,4298,4300,4302,4304,4306,4308,4310],{"class":564,"line":1173},[562,4299,1176],{"class":572},[562,4301,4058],{"class":1179},[562,4303,1014],{"class":572},[562,4305,593],{"class":572},[562,4307,1019],{"class":572},[562,4309,4067],{"class":599},[562,4311,1418],{"class":572},[562,4313,4314],{"class":564,"line":1195},[562,4315,2205],{"class":572},[562,4317,4318,4320,4322,4324,4326],{"class":564,"line":1243},[562,4319,1007],{"class":572},[562,4321,4102],{"class":1010},[562,4323,1014],{"class":572},[562,4325,593],{"class":572},[562,4327,857],{"class":572},[562,4329,4330,4332,4335,4337,4339,4341,4344,4346],{"class":564,"line":1289},[562,4331,1176],{"class":572},[562,4333,4334],{"class":1179},"name",[562,4336,1014],{"class":572},[562,4338,593],{"class":572},[562,4340,1019],{"class":572},[562,4342,4343],{"class":599},"StripeError",[562,4345,1014],{"class":572},[562,4347,606],{"class":572},[562,4349,4350,4352,4355,4357,4359,4361,4364,4366],{"class":564,"line":1310},[562,4351,1176],{"class":572},[562,4353,4354],{"class":1179},"message",[562,4356,1014],{"class":572},[562,4358,593],{"class":572},[562,4360,1019],{"class":572},[562,4362,4363],{"class":599},"charge already refunded",[562,4365,1014],{"class":572},[562,4367,606],{"class":572},[562,4369,4370,4372,4375,4377,4379,4381,4384],{"class":564,"line":1330},[562,4371,1176],{"class":572},[562,4373,4374],{"class":1179},"stack",[562,4376,1014],{"class":572},[562,4378,593],{"class":572},[562,4380,1019],{"class":572},[562,4382,4383],{"class":599},"...",[562,4385,1418],{"class":572},[562,4387,4388],{"class":564,"line":1346},[562,4389,1430],{"class":572},[562,4391,4392],{"class":564,"line":1367},[562,4393,990],{"class":572},[553,4395,4397],{"className":993,"code":4396,"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,4398,4399,4403,4421,4433,4451,4496,4540,4558,4576,4590,4608,4624,4628],{"__ignoreMap":558},[562,4400,4401],{"class":564,"line":565},[562,4402,583],{"class":572},[562,4404,4405,4407,4409,4411,4413,4415,4417,4419],{"class":564,"line":586},[562,4406,1007],{"class":572},[562,4408,1011],{"class":1010},[562,4410,1014],{"class":572},[562,4412,593],{"class":572},[562,4414,1019],{"class":572},[562,4416,1022],{"class":599},[562,4418,1014],{"class":572},[562,4420,606],{"class":572},[562,4422,4423,4425,4427,4429,4431],{"class":564,"line":609},[562,4424,1007],{"class":572},[562,4426,577],{"class":1010},[562,4428,1014],{"class":572},[562,4430,593],{"class":572},[562,4432,857],{"class":572},[562,4434,4435,4437,4439,4441,4443,4445,4447,4449],{"class":564,"line":651},[562,4436,1176],{"class":572},[562,4438,1180],{"class":1179},[562,4440,1014],{"class":572},[562,4442,593],{"class":572},[562,4444,1019],{"class":572},[562,4446,600],{"class":599},[562,4448,1014],{"class":572},[562,4450,606],{"class":572},[562,4452,4453,4455,4457,4459,4461,4463,4465,4467,4469,4471,4473,4475,4477,4479,4481,4483,4485,4487,4489,4492,4494],{"class":564,"line":688},[562,4454,1176],{"class":572},[562,4456,1200],{"class":1179},[562,4458,1014],{"class":572},[562,4460,593],{"class":572},[562,4462,617],{"class":572},[562,4464,1019],{"class":572},[562,4466,1211],{"class":773},[562,4468,1014],{"class":572},[562,4470,593],{"class":572},[562,4472,1019],{"class":572},[562,4474,1521],{"class":599},[562,4476,1014],{"class":572},[562,4478,632],{"class":572},[562,4480,1019],{"class":572},[562,4482,904],{"class":773},[562,4484,1014],{"class":572},[562,4486,593],{"class":572},[562,4488,1019],{"class":572},[562,4490,4491],{"class":599},"anonymous",[562,4493,1014],{"class":572},[562,4495,685],{"class":572},[562,4497,4498,4500,4502,4504,4506,4508,4510,4512,4514,4516,4518,4520,4522,4524,4526,4528,4530,4532,4534,4536,4538],{"class":564,"line":705},[562,4499,1176],{"class":572},[562,4501,1248],{"class":1179},[562,4503,1014],{"class":572},[562,4505,593],{"class":572},[562,4507,617],{"class":572},[562,4509,1019],{"class":572},[562,4511,1211],{"class":773},[562,4513,1014],{"class":572},[562,4515,593],{"class":572},[562,4517,1019],{"class":572},[562,4519,667],{"class":599},[562,4521,1014],{"class":572},[562,4523,632],{"class":572},[562,4525,1019],{"class":572},[562,4527,904],{"class":773},[562,4529,1014],{"class":572},[562,4531,593],{"class":572},[562,4533,1019],{"class":572},[562,4535,680],{"class":599},[562,4537,1014],{"class":572},[562,4539,685],{"class":572},[562,4541,4542,4544,4546,4548,4550,4552,4554,4556],{"class":564,"line":714},[562,4543,1176],{"class":572},[562,4545,1294],{"class":1179},[562,4547,1014],{"class":572},[562,4549,593],{"class":572},[562,4551,1019],{"class":572},[562,4553,1303],{"class":599},[562,4555,1014],{"class":572},[562,4557,606],{"class":572},[562,4559,4560,4562,4564,4566,4568,4570,4572,4574],{"class":564,"line":721},[562,4561,1176],{"class":572},[562,4563,1315],{"class":1179},[562,4565,1014],{"class":572},[562,4567,593],{"class":572},[562,4569,1019],{"class":572},[562,4571,3752],{"class":599},[562,4573,1014],{"class":572},[562,4575,606],{"class":572},[562,4577,4578,4580,4582,4584,4586,4588],{"class":564,"line":728},[562,4579,1176],{"class":572},[562,4581,1335],{"class":1179},[562,4583,1014],{"class":572},[562,4585,593],{"class":572},[562,4587,774],{"class":773},[562,4589,606],{"class":572},[562,4591,4592,4594,4596,4598,4600,4602,4604,4606],{"class":564,"line":1160},[562,4593,1176],{"class":572},[562,4595,1351],{"class":1179},[562,4597,1014],{"class":572},[562,4599,593],{"class":572},[562,4601,1019],{"class":572},[562,4603,1360],{"class":599},[562,4605,1014],{"class":572},[562,4607,606],{"class":572},[562,4609,4610,4612,4614,4616,4618,4620,4622],{"class":564,"line":1173},[562,4611,1176],{"class":572},[562,4613,4058],{"class":1179},[562,4615,1014],{"class":572},[562,4617,593],{"class":572},[562,4619,1019],{"class":572},[562,4621,4067],{"class":599},[562,4623,1418],{"class":572},[562,4625,4626],{"class":564,"line":1195},[562,4627,1430],{"class":572},[562,4629,4630],{"class":564,"line":1243},[562,4631,990],{"class":572},[532,4633,4634],{},"Outcome resolution:",[2662,4636,4637,4646,4665],{},[2665,4638,4639,4642,4643,573],{},[540,4640,4641],{},"fn"," resolves → ",[540,4644,4645],{},"outcome: 'success'",[2665,4647,4648,4650,4651,4654,4655,4658,4659,4662,4663,573],{},[540,4649,4641],{}," throws an ",[540,4652,4653],{},"AuditDeniedError"," (or any error with ",[540,4656,4657],{},"status === 403",") → ",[540,4660,4661],{},"outcome: 'denied'",", error message becomes ",[540,4664,1315],{},[2665,4666,4667,4668,4671],{},"Other thrown errors → ",[540,4669,4670],{},"outcome: 'failure'",", then re-thrown.",[4673,4674,4675],"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":4677},[4678,4679,4680,4682,4683,4688,4689],{"id":538,"depth":586,"text":542},{"id":787,"depth":586,"text":790},{"id":1438,"depth":586,"text":4681},"Standalone audit()",{"id":1837,"depth":586,"text":1840},{"id":2022,"depth":586,"text":2025,"children":4684},[4685,4687],{"id":2650,"depth":609,"text":4686},"defineAuditAction vs defineAuditCatalog — when to choose",{"id":2728,"depth":609,"text":2729},{"id":2834,"depth":586,"text":2837},{"id":3549,"depth":586,"text":4690},"withAudit() — auto-instrumentation","log.audit, log.audit.deny, standalone audit(), withAudit auto-instrumentation, defineAuditAction and defineAuditCatalog registries, and auditDiff change patches.","md",[4694,4697],{"label":387,"icon":390,"to":388,"color":4695,"variant":4696},"neutral","subtle",{"label":4698,"icon":400,"to":398,"color":4695,"variant":4696},"Drains & Integrity",{},{"title":392,"icon":395},{"title":527,"description":4691},"ftTZRYEmTIhQyYbEdN6-RdOzgcvRgUxfN4-EHF_NGEQ",[4704,4706],{"title":387,"path":388,"stem":389,"description":4705,"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":4707,"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.",1785679729703]