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