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