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