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