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