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