[{"data":1,"prerenderedAt":3065},["ShallowReactive",2],{"navigation_docs":3,"-use-cases-audit-overview":525,"-use-cases-audit-overview-surround":3060},[4,30,80,128,308,440,495],{"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,464,468,472,476,480,485,490],{"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":463},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":406,"path":465,"stem":466,"icon":467},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":469,"path":470,"stem":471,"icon":448},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":473,"path":474,"stem":475,"icon":434},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":477,"path":478,"stem":479,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":481,"path":482,"stem":483,"icon":484},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":486,"path":487,"stem":488,"icon":489},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":491,"path":492,"stem":493,"icon":494},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":427,"path":496,"stem":497,"children":498,"page":29},"\u002Freference","7.reference",[499,504,507,512,516,521],{"title":500,"path":501,"stem":502,"icon":503},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":374,"path":505,"stem":506,"icon":107},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":508,"path":509,"stem":510,"icon":511},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":513,"path":514,"stem":515,"icon":379},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":517,"path":518,"stem":519,"icon":520},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":522,"path":523,"stem":524,"icon":434},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"id":526,"title":378,"body":527,"description":3046,"extension":3047,"links":3048,"meta":3056,"navigation":3057,"path":384,"seo":3058,"stem":385,"__hash__":3059},"docs\u002F5.use-cases\u002F4.audit\u002F01.overview.md",{"type":528,"value":529,"toc":3039},"minimark",[530,548,595,599,625,654,667,671,678,685,688,692,695,1003,2900,2903,2939,2949,2952,2956,2974,2977,2981,3035],[531,532,533,534,538,539,543,544,547],"p",{},"evlog's audit layer is ",[535,536,537],"strong",{},"not a parallel system",". Audit events are wide events with a reserved ",[540,541,542],"code",{},"audit"," field. Every existing primitive — drains, enrichers, redact, tail-sampling — applies as is. Enable audit logs by adding ",[535,545,546],{},"1 enricher + 1 drain wrapper + 1 helper",".",[549,550,553,556,581],"prompt",{":actions":551,"description":552,"icon":379},"[\"copy\",\"cursor\",\"claude\"]","Add an audit log to my app",[531,554,555],{},"Add a tamper-evident audit log to my app on top of evlog.",[557,558,559,563,566,569,572,575,578],"ul",{},[560,561,562],"li",{},"Identify my framework and follow its evlog integration pattern",[560,564,565],{},"Register auditEnricher() on the evlog:enrich hook (or in initLogger.enrichers)",[560,567,568],{},"Register a separate auditOnly(signed(createFsDrain({ dir: '.audit' }), { strategy: 'hash-chain' })) drain alongside my main drain",[560,570,571],{},"Use { await: true } on the audit drain so audit events are flushed before the response returns",[560,573,574],{},"Call log.audit({ action, actor, target, outcome, reason }) for every security-sensitive action (login, role change, refund, data export, deletion)",[560,576,577],{},"Audit events are force-kept past sampling and signed via hash-chain for tamper-evidence",[560,579,580],{},"Combine with the Better Auth integration so actor.id \u002F actor.email are automatic",[531,582,583,584,590,591],{},"Docs: ",[585,586,587],"a",{"href":587,"rel":588},"https:\u002F\u002Fwww.evlog.dev\u002Fuse-cases\u002Faudit\u002Foverview",[589],"nofollow","\nAdapters: ",[585,592,593],{"href":593,"rel":594},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Foverview",[589],[596,597,522],"h2",{"id":598},"agent-skills",[531,600,601,602,607,608,611,612,615,616,621,622,547],{},"Install the evlog skill catalog so your assistant can follow ",[535,603,604],{},[540,605,606],{},"build-audit-logs"," end to end: written policy, framework wiring, ",[540,609,610],{},"withAudit"," \u002F ",[540,613,614],{},"log.audit",", denials, redaction, multi-tenant isolation, tamper-evident sinks, and grep-based review passes. If you use the file-system drain for audits or general logs, ",[535,617,618],{},[540,619,620],{},"analyze-logs"," teaches assistants to read NDJSON under ",[540,623,624],{},".evlog\u002Flogs\u002F",[626,627,633],"pre",{"className":628,"code":629,"filename":630,"language":631,"meta":632,"style":632},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx skills add https:\u002F\u002Fwww.evlog.dev\n","Terminal","bash","",[540,634,635],{"__ignoreMap":632},[636,637,640,644,648,651],"span",{"class":638,"line":639},"line",1,[636,641,643],{"class":642},"sBMFI","npx",[636,645,647],{"class":646},"sfazB"," skills",[636,649,650],{"class":646}," add",[636,652,653],{"class":646}," https:\u002F\u002Fwww.evlog.dev\n",[531,655,656,657,659,660,663,664,547],{},"See ",[585,658,522],{"href":523}," for the full list. Skill paths in the repo: ",[540,661,662],{},"skills\u002Fbuild-audit-logs",", ",[540,665,666],{},"skills\u002Fanalyze-logs",[596,668,670],{"id":669},"why-audit-logs","Why Audit Logs?",[531,672,673,674,677],{},"Compliance frameworks (SOC2, HIPAA, GDPR, PCI) require knowing ",[535,675,676],{},"who did what, on which resource, when, from where, with which outcome",". evlog covers this without a second logging library.",[679,680,681,684],"tip",{},[535,682,683],{},"An audit event is a fact about an intent, not a measurement of an operation."," A regular wide event answers \"how did this request behave?\" (latency, status, tokens). An audit event answers \"who tried to do what, and was it allowed?\". Same pipeline, different question — that's why the schema is reserved and the event is force-kept past sampling.",[686,687],"audit-force-keep",{},[596,689,691],{"id":690},"quickstart","Quickstart",[531,693,694],{},"You already use evlog. Add audit logs in three changes:",[626,696,701],{"className":697,"code":698,"filename":699,"language":700,"meta":632,"style":632},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { auditEnricher, auditOnly, signed } from 'evlog'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createFsDrain } from 'evlog\u002Ffs'\n\nexport default defineNitroPlugin((nitro) => {\n  nitro.hooks.hook('evlog:enrich', auditEnricher())\n  nitro.hooks.hook('evlog:drain', createAxiomDrain())\n  nitro.hooks.hook('evlog:drain', auditOnly(\n    signed(createFsDrain({ dir: '.audit' }), { strategy: 'hash-chain' }),\n    { await: true },\n  ))\n})\n","server\u002Fplugins\u002Fevlog.ts","typescript",[540,702,703,743,764,785,792,824,858,886,914,970,988,994],{"__ignoreMap":632},[636,704,705,709,713,717,720,723,725,728,731,734,737,740],{"class":638,"line":639},[636,706,708],{"class":707},"s7zQu","import",[636,710,712],{"class":711},"sMK4o"," {",[636,714,716],{"class":715},"sTEyZ"," auditEnricher",[636,718,719],{"class":711},",",[636,721,722],{"class":715}," auditOnly",[636,724,719],{"class":711},[636,726,727],{"class":715}," signed",[636,729,730],{"class":711}," }",[636,732,733],{"class":707}," from",[636,735,736],{"class":711}," '",[636,738,739],{"class":646},"evlog",[636,741,742],{"class":711},"'\n",[636,744,746,748,750,753,755,757,759,762],{"class":638,"line":745},2,[636,747,708],{"class":707},[636,749,712],{"class":711},[636,751,752],{"class":715}," createAxiomDrain",[636,754,730],{"class":711},[636,756,733],{"class":707},[636,758,736],{"class":711},[636,760,761],{"class":646},"evlog\u002Faxiom",[636,763,742],{"class":711},[636,765,767,769,771,774,776,778,780,783],{"class":638,"line":766},3,[636,768,708],{"class":707},[636,770,712],{"class":711},[636,772,773],{"class":715}," createFsDrain",[636,775,730],{"class":711},[636,777,733],{"class":707},[636,779,736],{"class":711},[636,781,782],{"class":646},"evlog\u002Ffs",[636,784,742],{"class":711},[636,786,788],{"class":638,"line":787},4,[636,789,791],{"emptyLinePlaceholder":790},true,"\n",[636,793,795,798,801,805,808,810,814,817,821],{"class":638,"line":794},5,[636,796,797],{"class":707},"export",[636,799,800],{"class":707}," default",[636,802,804],{"class":803},"s2Zo4"," defineNitroPlugin",[636,806,807],{"class":715},"(",[636,809,807],{"class":711},[636,811,813],{"class":812},"sHdIc","nitro",[636,815,816],{"class":711},")",[636,818,820],{"class":819},"spNyl"," =>",[636,822,823],{"class":711}," {\n",[636,825,827,830,832,835,837,840,843,846,849,851,853,855],{"class":638,"line":826},6,[636,828,829],{"class":715},"  nitro",[636,831,547],{"class":711},[636,833,834],{"class":715},"hooks",[636,836,547],{"class":711},[636,838,839],{"class":803},"hook",[636,841,807],{"class":842},"swJcz",[636,844,845],{"class":711},"'",[636,847,848],{"class":646},"evlog:enrich",[636,850,845],{"class":711},[636,852,719],{"class":711},[636,854,716],{"class":803},[636,856,857],{"class":842},"())\n",[636,859,861,863,865,867,869,871,873,875,878,880,882,884],{"class":638,"line":860},7,[636,862,829],{"class":715},[636,864,547],{"class":711},[636,866,834],{"class":715},[636,868,547],{"class":711},[636,870,839],{"class":803},[636,872,807],{"class":842},[636,874,845],{"class":711},[636,876,877],{"class":646},"evlog:drain",[636,879,845],{"class":711},[636,881,719],{"class":711},[636,883,752],{"class":803},[636,885,857],{"class":842},[636,887,889,891,893,895,897,899,901,903,905,907,909,911],{"class":638,"line":888},8,[636,890,829],{"class":715},[636,892,547],{"class":711},[636,894,834],{"class":715},[636,896,547],{"class":711},[636,898,839],{"class":803},[636,900,807],{"class":842},[636,902,845],{"class":711},[636,904,877],{"class":646},[636,906,845],{"class":711},[636,908,719],{"class":711},[636,910,722],{"class":803},[636,912,913],{"class":842},"(\n",[636,915,917,920,922,925,927,930,933,936,938,941,943,945,947,949,951,954,956,958,961,963,965,967],{"class":638,"line":916},9,[636,918,919],{"class":803},"    signed",[636,921,807],{"class":842},[636,923,924],{"class":803},"createFsDrain",[636,926,807],{"class":842},[636,928,929],{"class":711},"{",[636,931,932],{"class":842}," dir",[636,934,935],{"class":711},":",[636,937,736],{"class":711},[636,939,940],{"class":646},".audit",[636,942,845],{"class":711},[636,944,730],{"class":711},[636,946,816],{"class":842},[636,948,719],{"class":711},[636,950,712],{"class":711},[636,952,953],{"class":842}," strategy",[636,955,935],{"class":711},[636,957,736],{"class":711},[636,959,960],{"class":646},"hash-chain",[636,962,845],{"class":711},[636,964,730],{"class":711},[636,966,816],{"class":842},[636,968,969],{"class":711},",\n",[636,971,973,976,979,981,985],{"class":638,"line":972},10,[636,974,975],{"class":711},"    {",[636,977,978],{"class":842}," await",[636,980,935],{"class":711},[636,982,984],{"class":983},"sfNiH"," true",[636,986,987],{"class":711}," },\n",[636,989,991],{"class":638,"line":990},11,[636,992,993],{"class":842},"  ))\n",[636,995,997,1000],{"class":638,"line":996},12,[636,998,999],{"class":711},"}",[636,1001,1002],{"class":715},")\n",[1004,1005,1006,1300,1603,1976,2287,2445],"code-group",{},[626,1007,1010],{"className":697,"code":1008,"filename":1009,"language":700,"meta":632,"style":632},"export default defineEventHandler(async (event) => {\n  const log = useLogger(event)\n  const user = await requireUser(event)\n  const invoice = await refundInvoice(getRouterParam(event, 'id'))\n\n  log.audit({\n    action: 'invoice.refund',\n    actor: { type: 'user', id: user.id, email: user.email },\n    target: { type: 'invoice', id: invoice.id },\n    outcome: 'success',\n    reason: 'Customer requested refund',\n  })\n\n  return { ok: true }\n})\n","Nuxt \u002F Nitro",[540,1011,1012,1038,1058,1078,1113,1117,1131,1147,1197,1231,1247,1263,1270,1275,1293],{"__ignoreMap":632},[636,1013,1014,1016,1018,1021,1023,1026,1029,1032,1034,1036],{"class":638,"line":639},[636,1015,797],{"class":707},[636,1017,800],{"class":707},[636,1019,1020],{"class":803}," defineEventHandler",[636,1022,807],{"class":715},[636,1024,1025],{"class":819},"async",[636,1027,1028],{"class":711}," (",[636,1030,1031],{"class":812},"event",[636,1033,816],{"class":711},[636,1035,820],{"class":819},[636,1037,823],{"class":711},[636,1039,1040,1043,1046,1049,1052,1054,1056],{"class":638,"line":745},[636,1041,1042],{"class":819},"  const",[636,1044,1045],{"class":715}," log",[636,1047,1048],{"class":711}," =",[636,1050,1051],{"class":803}," useLogger",[636,1053,807],{"class":842},[636,1055,1031],{"class":715},[636,1057,1002],{"class":842},[636,1059,1060,1062,1065,1067,1069,1072,1074,1076],{"class":638,"line":766},[636,1061,1042],{"class":819},[636,1063,1064],{"class":715}," user",[636,1066,1048],{"class":711},[636,1068,978],{"class":707},[636,1070,1071],{"class":803}," requireUser",[636,1073,807],{"class":842},[636,1075,1031],{"class":715},[636,1077,1002],{"class":842},[636,1079,1080,1082,1085,1087,1089,1092,1094,1097,1099,1101,1103,1105,1108,1110],{"class":638,"line":787},[636,1081,1042],{"class":819},[636,1083,1084],{"class":715}," invoice",[636,1086,1048],{"class":711},[636,1088,978],{"class":707},[636,1090,1091],{"class":803}," refundInvoice",[636,1093,807],{"class":842},[636,1095,1096],{"class":803},"getRouterParam",[636,1098,807],{"class":842},[636,1100,1031],{"class":715},[636,1102,719],{"class":711},[636,1104,736],{"class":711},[636,1106,1107],{"class":646},"id",[636,1109,845],{"class":711},[636,1111,1112],{"class":842},"))\n",[636,1114,1115],{"class":638,"line":794},[636,1116,791],{"emptyLinePlaceholder":790},[636,1118,1119,1122,1124,1126,1128],{"class":638,"line":826},[636,1120,1121],{"class":715},"  log",[636,1123,547],{"class":711},[636,1125,542],{"class":803},[636,1127,807],{"class":842},[636,1129,1130],{"class":711},"{\n",[636,1132,1133,1136,1138,1140,1143,1145],{"class":638,"line":860},[636,1134,1135],{"class":842},"    action",[636,1137,935],{"class":711},[636,1139,736],{"class":711},[636,1141,1142],{"class":646},"invoice.refund",[636,1144,845],{"class":711},[636,1146,969],{"class":711},[636,1148,1149,1152,1154,1156,1159,1161,1163,1166,1168,1170,1173,1175,1177,1179,1181,1183,1186,1188,1190,1192,1195],{"class":638,"line":888},[636,1150,1151],{"class":842},"    actor",[636,1153,935],{"class":711},[636,1155,712],{"class":711},[636,1157,1158],{"class":842}," type",[636,1160,935],{"class":711},[636,1162,736],{"class":711},[636,1164,1165],{"class":646},"user",[636,1167,845],{"class":711},[636,1169,719],{"class":711},[636,1171,1172],{"class":842}," id",[636,1174,935],{"class":711},[636,1176,1064],{"class":715},[636,1178,547],{"class":711},[636,1180,1107],{"class":715},[636,1182,719],{"class":711},[636,1184,1185],{"class":842}," email",[636,1187,935],{"class":711},[636,1189,1064],{"class":715},[636,1191,547],{"class":711},[636,1193,1194],{"class":715},"email",[636,1196,987],{"class":711},[636,1198,1199,1202,1204,1206,1208,1210,1212,1215,1217,1219,1221,1223,1225,1227,1229],{"class":638,"line":916},[636,1200,1201],{"class":842},"    target",[636,1203,935],{"class":711},[636,1205,712],{"class":711},[636,1207,1158],{"class":842},[636,1209,935],{"class":711},[636,1211,736],{"class":711},[636,1213,1214],{"class":646},"invoice",[636,1216,845],{"class":711},[636,1218,719],{"class":711},[636,1220,1172],{"class":842},[636,1222,935],{"class":711},[636,1224,1084],{"class":715},[636,1226,547],{"class":711},[636,1228,1107],{"class":715},[636,1230,987],{"class":711},[636,1232,1233,1236,1238,1240,1243,1245],{"class":638,"line":972},[636,1234,1235],{"class":842},"    outcome",[636,1237,935],{"class":711},[636,1239,736],{"class":711},[636,1241,1242],{"class":646},"success",[636,1244,845],{"class":711},[636,1246,969],{"class":711},[636,1248,1249,1252,1254,1256,1259,1261],{"class":638,"line":990},[636,1250,1251],{"class":842},"    reason",[636,1253,935],{"class":711},[636,1255,736],{"class":711},[636,1257,1258],{"class":646},"Customer requested refund",[636,1260,845],{"class":711},[636,1262,969],{"class":711},[636,1264,1265,1268],{"class":638,"line":996},[636,1266,1267],{"class":711},"  }",[636,1269,1002],{"class":842},[636,1271,1273],{"class":638,"line":1272},13,[636,1274,791],{"emptyLinePlaceholder":790},[636,1276,1278,1281,1283,1286,1288,1290],{"class":638,"line":1277},14,[636,1279,1280],{"class":707},"  return",[636,1282,712],{"class":711},[636,1284,1285],{"class":842}," ok",[636,1287,935],{"class":711},[636,1289,984],{"class":983},[636,1291,1292],{"class":711}," }\n",[636,1294,1296,1298],{"class":638,"line":1295},15,[636,1297,999],{"class":711},[636,1299,1002],{"class":715},[626,1301,1303],{"className":697,"code":1302,"filename":235,"language":700,"meta":632,"style":632},"import { withEvlog, useLogger } from '@\u002Flib\u002Fevlog'\n\nexport const POST = withEvlog(async (req, { params }) => {\n  const log = useLogger()\n  const user = await requireUser(req)\n  const invoice = await refundInvoice(params.id)\n\n  log.audit({\n    action: 'invoice.refund',\n    actor: { type: 'user', id: user.id, email: user.email },\n    target: { type: 'invoice', id: invoice.id },\n    outcome: 'success',\n    reason: 'Customer requested refund',\n  })\n\n  return Response.json({ ok: true })\n})\n",[540,1304,1305,1329,1333,1371,1384,1402,1425,1429,1441,1455,1499,1531,1545,1559,1565,1569,1596],{"__ignoreMap":632},[636,1306,1307,1309,1311,1314,1316,1318,1320,1322,1324,1327],{"class":638,"line":639},[636,1308,708],{"class":707},[636,1310,712],{"class":711},[636,1312,1313],{"class":715}," withEvlog",[636,1315,719],{"class":711},[636,1317,1051],{"class":715},[636,1319,730],{"class":711},[636,1321,733],{"class":707},[636,1323,736],{"class":711},[636,1325,1326],{"class":646},"@\u002Flib\u002Fevlog",[636,1328,742],{"class":711},[636,1330,1331],{"class":638,"line":745},[636,1332,791],{"emptyLinePlaceholder":790},[636,1334,1335,1337,1340,1343,1346,1348,1350,1352,1354,1357,1359,1361,1364,1367,1369],{"class":638,"line":766},[636,1336,797],{"class":707},[636,1338,1339],{"class":819}," const",[636,1341,1342],{"class":715}," POST ",[636,1344,1345],{"class":711},"=",[636,1347,1313],{"class":803},[636,1349,807],{"class":715},[636,1351,1025],{"class":819},[636,1353,1028],{"class":711},[636,1355,1356],{"class":812},"req",[636,1358,719],{"class":711},[636,1360,712],{"class":711},[636,1362,1363],{"class":812}," params",[636,1365,1366],{"class":711}," })",[636,1368,820],{"class":819},[636,1370,823],{"class":711},[636,1372,1373,1375,1377,1379,1381],{"class":638,"line":787},[636,1374,1042],{"class":819},[636,1376,1045],{"class":715},[636,1378,1048],{"class":711},[636,1380,1051],{"class":803},[636,1382,1383],{"class":842},"()\n",[636,1385,1386,1388,1390,1392,1394,1396,1398,1400],{"class":638,"line":794},[636,1387,1042],{"class":819},[636,1389,1064],{"class":715},[636,1391,1048],{"class":711},[636,1393,978],{"class":707},[636,1395,1071],{"class":803},[636,1397,807],{"class":842},[636,1399,1356],{"class":715},[636,1401,1002],{"class":842},[636,1403,1404,1406,1408,1410,1412,1414,1416,1419,1421,1423],{"class":638,"line":826},[636,1405,1042],{"class":819},[636,1407,1084],{"class":715},[636,1409,1048],{"class":711},[636,1411,978],{"class":707},[636,1413,1091],{"class":803},[636,1415,807],{"class":842},[636,1417,1418],{"class":715},"params",[636,1420,547],{"class":711},[636,1422,1107],{"class":715},[636,1424,1002],{"class":842},[636,1426,1427],{"class":638,"line":860},[636,1428,791],{"emptyLinePlaceholder":790},[636,1430,1431,1433,1435,1437,1439],{"class":638,"line":888},[636,1432,1121],{"class":715},[636,1434,547],{"class":711},[636,1436,542],{"class":803},[636,1438,807],{"class":842},[636,1440,1130],{"class":711},[636,1442,1443,1445,1447,1449,1451,1453],{"class":638,"line":916},[636,1444,1135],{"class":842},[636,1446,935],{"class":711},[636,1448,736],{"class":711},[636,1450,1142],{"class":646},[636,1452,845],{"class":711},[636,1454,969],{"class":711},[636,1456,1457,1459,1461,1463,1465,1467,1469,1471,1473,1475,1477,1479,1481,1483,1485,1487,1489,1491,1493,1495,1497],{"class":638,"line":972},[636,1458,1151],{"class":842},[636,1460,935],{"class":711},[636,1462,712],{"class":711},[636,1464,1158],{"class":842},[636,1466,935],{"class":711},[636,1468,736],{"class":711},[636,1470,1165],{"class":646},[636,1472,845],{"class":711},[636,1474,719],{"class":711},[636,1476,1172],{"class":842},[636,1478,935],{"class":711},[636,1480,1064],{"class":715},[636,1482,547],{"class":711},[636,1484,1107],{"class":715},[636,1486,719],{"class":711},[636,1488,1185],{"class":842},[636,1490,935],{"class":711},[636,1492,1064],{"class":715},[636,1494,547],{"class":711},[636,1496,1194],{"class":715},[636,1498,987],{"class":711},[636,1500,1501,1503,1505,1507,1509,1511,1513,1515,1517,1519,1521,1523,1525,1527,1529],{"class":638,"line":990},[636,1502,1201],{"class":842},[636,1504,935],{"class":711},[636,1506,712],{"class":711},[636,1508,1158],{"class":842},[636,1510,935],{"class":711},[636,1512,736],{"class":711},[636,1514,1214],{"class":646},[636,1516,845],{"class":711},[636,1518,719],{"class":711},[636,1520,1172],{"class":842},[636,1522,935],{"class":711},[636,1524,1084],{"class":715},[636,1526,547],{"class":711},[636,1528,1107],{"class":715},[636,1530,987],{"class":711},[636,1532,1533,1535,1537,1539,1541,1543],{"class":638,"line":996},[636,1534,1235],{"class":842},[636,1536,935],{"class":711},[636,1538,736],{"class":711},[636,1540,1242],{"class":646},[636,1542,845],{"class":711},[636,1544,969],{"class":711},[636,1546,1547,1549,1551,1553,1555,1557],{"class":638,"line":1272},[636,1548,1251],{"class":842},[636,1550,935],{"class":711},[636,1552,736],{"class":711},[636,1554,1258],{"class":646},[636,1556,845],{"class":711},[636,1558,969],{"class":711},[636,1560,1561,1563],{"class":638,"line":1277},[636,1562,1267],{"class":711},[636,1564,1002],{"class":842},[636,1566,1567],{"class":638,"line":1295},[636,1568,791],{"emptyLinePlaceholder":790},[636,1570,1572,1574,1577,1579,1582,1584,1586,1588,1590,1592,1594],{"class":638,"line":1571},16,[636,1573,1280],{"class":707},[636,1575,1576],{"class":715}," Response",[636,1578,547],{"class":711},[636,1580,1581],{"class":803},"json",[636,1583,807],{"class":842},[636,1585,929],{"class":711},[636,1587,1285],{"class":842},[636,1589,935],{"class":711},[636,1591,984],{"class":983},[636,1593,730],{"class":711},[636,1595,1002],{"class":842},[636,1597,1599,1601],{"class":638,"line":1598},17,[636,1600,999],{"class":711},[636,1602,1002],{"class":715},[626,1604,1606],{"className":697,"code":1605,"filename":265,"language":700,"meta":632,"style":632},"import type { EvlogVariables } from 'evlog\u002Fhono'\nimport { Hono } from 'hono'\n\nconst app = new Hono\u003CEvlogVariables>()\n\napp.post('\u002Finvoices\u002F:id\u002Frefund', async (c) => {\n  const log = c.get('log')\n  const user = await requireUser(c)\n  const invoice = await refundInvoice(c.req.param('id'))\n\n  log.audit({\n    action: 'invoice.refund',\n    actor: { type: 'user', id: user.id, email: user.email },\n    target: { type: 'invoice', id: invoice.id },\n    outcome: 'success',\n    reason: 'Customer requested refund',\n  })\n\n  return c.json({ ok: true })\n})\n",[540,1607,1608,1630,1650,1654,1680,1684,1719,1746,1764,1799,1803,1815,1829,1873,1905,1919,1933,1939,1944,1969],{"__ignoreMap":632},[636,1609,1610,1612,1614,1616,1619,1621,1623,1625,1628],{"class":638,"line":639},[636,1611,708],{"class":707},[636,1613,1158],{"class":707},[636,1615,712],{"class":711},[636,1617,1618],{"class":715}," EvlogVariables",[636,1620,730],{"class":711},[636,1622,733],{"class":707},[636,1624,736],{"class":711},[636,1626,1627],{"class":646},"evlog\u002Fhono",[636,1629,742],{"class":711},[636,1631,1632,1634,1636,1639,1641,1643,1645,1648],{"class":638,"line":745},[636,1633,708],{"class":707},[636,1635,712],{"class":711},[636,1637,1638],{"class":715}," Hono",[636,1640,730],{"class":711},[636,1642,733],{"class":707},[636,1644,736],{"class":711},[636,1646,1647],{"class":646},"hono",[636,1649,742],{"class":711},[636,1651,1652],{"class":638,"line":766},[636,1653,791],{"emptyLinePlaceholder":790},[636,1655,1656,1659,1662,1664,1667,1669,1672,1675,1678],{"class":638,"line":787},[636,1657,1658],{"class":819},"const",[636,1660,1661],{"class":715}," app ",[636,1663,1345],{"class":711},[636,1665,1666],{"class":711}," new",[636,1668,1638],{"class":803},[636,1670,1671],{"class":711},"\u003C",[636,1673,1674],{"class":642},"EvlogVariables",[636,1676,1677],{"class":711},">",[636,1679,1383],{"class":715},[636,1681,1682],{"class":638,"line":794},[636,1683,791],{"emptyLinePlaceholder":790},[636,1685,1686,1689,1691,1694,1696,1698,1701,1703,1705,1708,1710,1713,1715,1717],{"class":638,"line":826},[636,1687,1688],{"class":715},"app",[636,1690,547],{"class":711},[636,1692,1693],{"class":803},"post",[636,1695,807],{"class":715},[636,1697,845],{"class":711},[636,1699,1700],{"class":646},"\u002Finvoices\u002F:id\u002Frefund",[636,1702,845],{"class":711},[636,1704,719],{"class":711},[636,1706,1707],{"class":819}," async",[636,1709,1028],{"class":711},[636,1711,1712],{"class":812},"c",[636,1714,816],{"class":711},[636,1716,820],{"class":819},[636,1718,823],{"class":711},[636,1720,1721,1723,1725,1727,1730,1732,1735,1737,1739,1742,1744],{"class":638,"line":860},[636,1722,1042],{"class":819},[636,1724,1045],{"class":715},[636,1726,1048],{"class":711},[636,1728,1729],{"class":715}," c",[636,1731,547],{"class":711},[636,1733,1734],{"class":803},"get",[636,1736,807],{"class":842},[636,1738,845],{"class":711},[636,1740,1741],{"class":646},"log",[636,1743,845],{"class":711},[636,1745,1002],{"class":842},[636,1747,1748,1750,1752,1754,1756,1758,1760,1762],{"class":638,"line":888},[636,1749,1042],{"class":819},[636,1751,1064],{"class":715},[636,1753,1048],{"class":711},[636,1755,978],{"class":707},[636,1757,1071],{"class":803},[636,1759,807],{"class":842},[636,1761,1712],{"class":715},[636,1763,1002],{"class":842},[636,1765,1766,1768,1770,1772,1774,1776,1778,1780,1782,1784,1786,1789,1791,1793,1795,1797],{"class":638,"line":916},[636,1767,1042],{"class":819},[636,1769,1084],{"class":715},[636,1771,1048],{"class":711},[636,1773,978],{"class":707},[636,1775,1091],{"class":803},[636,1777,807],{"class":842},[636,1779,1712],{"class":715},[636,1781,547],{"class":711},[636,1783,1356],{"class":715},[636,1785,547],{"class":711},[636,1787,1788],{"class":803},"param",[636,1790,807],{"class":842},[636,1792,845],{"class":711},[636,1794,1107],{"class":646},[636,1796,845],{"class":711},[636,1798,1112],{"class":842},[636,1800,1801],{"class":638,"line":972},[636,1802,791],{"emptyLinePlaceholder":790},[636,1804,1805,1807,1809,1811,1813],{"class":638,"line":990},[636,1806,1121],{"class":715},[636,1808,547],{"class":711},[636,1810,542],{"class":803},[636,1812,807],{"class":842},[636,1814,1130],{"class":711},[636,1816,1817,1819,1821,1823,1825,1827],{"class":638,"line":996},[636,1818,1135],{"class":842},[636,1820,935],{"class":711},[636,1822,736],{"class":711},[636,1824,1142],{"class":646},[636,1826,845],{"class":711},[636,1828,969],{"class":711},[636,1830,1831,1833,1835,1837,1839,1841,1843,1845,1847,1849,1851,1853,1855,1857,1859,1861,1863,1865,1867,1869,1871],{"class":638,"line":1272},[636,1832,1151],{"class":842},[636,1834,935],{"class":711},[636,1836,712],{"class":711},[636,1838,1158],{"class":842},[636,1840,935],{"class":711},[636,1842,736],{"class":711},[636,1844,1165],{"class":646},[636,1846,845],{"class":711},[636,1848,719],{"class":711},[636,1850,1172],{"class":842},[636,1852,935],{"class":711},[636,1854,1064],{"class":715},[636,1856,547],{"class":711},[636,1858,1107],{"class":715},[636,1860,719],{"class":711},[636,1862,1185],{"class":842},[636,1864,935],{"class":711},[636,1866,1064],{"class":715},[636,1868,547],{"class":711},[636,1870,1194],{"class":715},[636,1872,987],{"class":711},[636,1874,1875,1877,1879,1881,1883,1885,1887,1889,1891,1893,1895,1897,1899,1901,1903],{"class":638,"line":1277},[636,1876,1201],{"class":842},[636,1878,935],{"class":711},[636,1880,712],{"class":711},[636,1882,1158],{"class":842},[636,1884,935],{"class":711},[636,1886,736],{"class":711},[636,1888,1214],{"class":646},[636,1890,845],{"class":711},[636,1892,719],{"class":711},[636,1894,1172],{"class":842},[636,1896,935],{"class":711},[636,1898,1084],{"class":715},[636,1900,547],{"class":711},[636,1902,1107],{"class":715},[636,1904,987],{"class":711},[636,1906,1907,1909,1911,1913,1915,1917],{"class":638,"line":1295},[636,1908,1235],{"class":842},[636,1910,935],{"class":711},[636,1912,736],{"class":711},[636,1914,1242],{"class":646},[636,1916,845],{"class":711},[636,1918,969],{"class":711},[636,1920,1921,1923,1925,1927,1929,1931],{"class":638,"line":1571},[636,1922,1251],{"class":842},[636,1924,935],{"class":711},[636,1926,736],{"class":711},[636,1928,1258],{"class":646},[636,1930,845],{"class":711},[636,1932,969],{"class":711},[636,1934,1935,1937],{"class":638,"line":1598},[636,1936,1267],{"class":711},[636,1938,1002],{"class":842},[636,1940,1942],{"class":638,"line":1941},18,[636,1943,791],{"emptyLinePlaceholder":790},[636,1945,1947,1949,1951,1953,1955,1957,1959,1961,1963,1965,1967],{"class":638,"line":1946},19,[636,1948,1280],{"class":707},[636,1950,1729],{"class":715},[636,1952,547],{"class":711},[636,1954,1581],{"class":803},[636,1956,807],{"class":842},[636,1958,929],{"class":711},[636,1960,1285],{"class":842},[636,1962,935],{"class":711},[636,1964,984],{"class":983},[636,1966,730],{"class":711},[636,1968,1002],{"class":842},[636,1970,1972,1974],{"class":638,"line":1971},20,[636,1973,999],{"class":711},[636,1975,1002],{"class":715},[626,1977,1979],{"className":697,"code":1978,"filename":260,"language":700,"meta":632,"style":632},"import type { Request, Response } from 'express'\n\napp.post('\u002Finvoices\u002F:id\u002Frefund', async (req: Request, res: Response) => {\n  const log = req.log\n  const user = await requireUser(req)\n  const invoice = await refundInvoice(req.params.id)\n\n  log.audit({\n    action: 'invoice.refund',\n    actor: { type: 'user', id: user.id, email: user.email },\n    target: { type: 'invoice', id: invoice.id },\n    outcome: 'success',\n    reason: 'Customer requested refund',\n  })\n\n  res.json({ ok: true })\n})\n",[540,1980,1981,2007,2011,2054,2070,2088,2114,2118,2130,2144,2188,2220,2234,2248,2254,2258,2281],{"__ignoreMap":632},[636,1982,1983,1985,1987,1989,1992,1994,1996,1998,2000,2002,2005],{"class":638,"line":639},[636,1984,708],{"class":707},[636,1986,1158],{"class":707},[636,1988,712],{"class":711},[636,1990,1991],{"class":715}," Request",[636,1993,719],{"class":711},[636,1995,1576],{"class":715},[636,1997,730],{"class":711},[636,1999,733],{"class":707},[636,2001,736],{"class":711},[636,2003,2004],{"class":646},"express",[636,2006,742],{"class":711},[636,2008,2009],{"class":638,"line":745},[636,2010,791],{"emptyLinePlaceholder":790},[636,2012,2013,2015,2017,2019,2021,2023,2025,2027,2029,2031,2033,2035,2037,2039,2041,2044,2046,2048,2050,2052],{"class":638,"line":766},[636,2014,1688],{"class":715},[636,2016,547],{"class":711},[636,2018,1693],{"class":803},[636,2020,807],{"class":715},[636,2022,845],{"class":711},[636,2024,1700],{"class":646},[636,2026,845],{"class":711},[636,2028,719],{"class":711},[636,2030,1707],{"class":819},[636,2032,1028],{"class":711},[636,2034,1356],{"class":812},[636,2036,935],{"class":711},[636,2038,1991],{"class":642},[636,2040,719],{"class":711},[636,2042,2043],{"class":812}," res",[636,2045,935],{"class":711},[636,2047,1576],{"class":642},[636,2049,816],{"class":711},[636,2051,820],{"class":819},[636,2053,823],{"class":711},[636,2055,2056,2058,2060,2062,2065,2067],{"class":638,"line":787},[636,2057,1042],{"class":819},[636,2059,1045],{"class":715},[636,2061,1048],{"class":711},[636,2063,2064],{"class":715}," req",[636,2066,547],{"class":711},[636,2068,2069],{"class":715},"log\n",[636,2071,2072,2074,2076,2078,2080,2082,2084,2086],{"class":638,"line":794},[636,2073,1042],{"class":819},[636,2075,1064],{"class":715},[636,2077,1048],{"class":711},[636,2079,978],{"class":707},[636,2081,1071],{"class":803},[636,2083,807],{"class":842},[636,2085,1356],{"class":715},[636,2087,1002],{"class":842},[636,2089,2090,2092,2094,2096,2098,2100,2102,2104,2106,2108,2110,2112],{"class":638,"line":826},[636,2091,1042],{"class":819},[636,2093,1084],{"class":715},[636,2095,1048],{"class":711},[636,2097,978],{"class":707},[636,2099,1091],{"class":803},[636,2101,807],{"class":842},[636,2103,1356],{"class":715},[636,2105,547],{"class":711},[636,2107,1418],{"class":715},[636,2109,547],{"class":711},[636,2111,1107],{"class":715},[636,2113,1002],{"class":842},[636,2115,2116],{"class":638,"line":860},[636,2117,791],{"emptyLinePlaceholder":790},[636,2119,2120,2122,2124,2126,2128],{"class":638,"line":888},[636,2121,1121],{"class":715},[636,2123,547],{"class":711},[636,2125,542],{"class":803},[636,2127,807],{"class":842},[636,2129,1130],{"class":711},[636,2131,2132,2134,2136,2138,2140,2142],{"class":638,"line":916},[636,2133,1135],{"class":842},[636,2135,935],{"class":711},[636,2137,736],{"class":711},[636,2139,1142],{"class":646},[636,2141,845],{"class":711},[636,2143,969],{"class":711},[636,2145,2146,2148,2150,2152,2154,2156,2158,2160,2162,2164,2166,2168,2170,2172,2174,2176,2178,2180,2182,2184,2186],{"class":638,"line":972},[636,2147,1151],{"class":842},[636,2149,935],{"class":711},[636,2151,712],{"class":711},[636,2153,1158],{"class":842},[636,2155,935],{"class":711},[636,2157,736],{"class":711},[636,2159,1165],{"class":646},[636,2161,845],{"class":711},[636,2163,719],{"class":711},[636,2165,1172],{"class":842},[636,2167,935],{"class":711},[636,2169,1064],{"class":715},[636,2171,547],{"class":711},[636,2173,1107],{"class":715},[636,2175,719],{"class":711},[636,2177,1185],{"class":842},[636,2179,935],{"class":711},[636,2181,1064],{"class":715},[636,2183,547],{"class":711},[636,2185,1194],{"class":715},[636,2187,987],{"class":711},[636,2189,2190,2192,2194,2196,2198,2200,2202,2204,2206,2208,2210,2212,2214,2216,2218],{"class":638,"line":990},[636,2191,1201],{"class":842},[636,2193,935],{"class":711},[636,2195,712],{"class":711},[636,2197,1158],{"class":842},[636,2199,935],{"class":711},[636,2201,736],{"class":711},[636,2203,1214],{"class":646},[636,2205,845],{"class":711},[636,2207,719],{"class":711},[636,2209,1172],{"class":842},[636,2211,935],{"class":711},[636,2213,1084],{"class":715},[636,2215,547],{"class":711},[636,2217,1107],{"class":715},[636,2219,987],{"class":711},[636,2221,2222,2224,2226,2228,2230,2232],{"class":638,"line":996},[636,2223,1235],{"class":842},[636,2225,935],{"class":711},[636,2227,736],{"class":711},[636,2229,1242],{"class":646},[636,2231,845],{"class":711},[636,2233,969],{"class":711},[636,2235,2236,2238,2240,2242,2244,2246],{"class":638,"line":1272},[636,2237,1251],{"class":842},[636,2239,935],{"class":711},[636,2241,736],{"class":711},[636,2243,1258],{"class":646},[636,2245,845],{"class":711},[636,2247,969],{"class":711},[636,2249,2250,2252],{"class":638,"line":1277},[636,2251,1267],{"class":711},[636,2253,1002],{"class":842},[636,2255,2256],{"class":638,"line":1295},[636,2257,791],{"emptyLinePlaceholder":790},[636,2259,2260,2263,2265,2267,2269,2271,2273,2275,2277,2279],{"class":638,"line":1571},[636,2261,2262],{"class":715},"  res",[636,2264,547],{"class":711},[636,2266,1581],{"class":803},[636,2268,807],{"class":842},[636,2270,929],{"class":711},[636,2272,1285],{"class":842},[636,2274,935],{"class":711},[636,2276,984],{"class":983},[636,2278,730],{"class":711},[636,2280,1002],{"class":842},[636,2282,2283,2285],{"class":638,"line":1598},[636,2284,999],{"class":711},[636,2286,1002],{"class":715},[626,2288,2291],{"className":697,"code":2289,"filename":2290,"language":700,"meta":632,"style":632},"import { audit } from 'evlog'\n\naudit({\n  action: 'invoice.refund',\n  actor: { type: 'system', id: 'billing-worker' },\n  target: { type: 'invoice', id: 'inv_889' },\n  outcome: 'success',\n  reason: 'Auto-refund triggered by chargeback webhook',\n})\n","Standalone job",[540,2292,2293,2312,2316,2324,2339,2374,2408,2423,2439],{"__ignoreMap":632},[636,2294,2295,2297,2299,2302,2304,2306,2308,2310],{"class":638,"line":639},[636,2296,708],{"class":707},[636,2298,712],{"class":711},[636,2300,2301],{"class":715}," audit",[636,2303,730],{"class":711},[636,2305,733],{"class":707},[636,2307,736],{"class":711},[636,2309,739],{"class":646},[636,2311,742],{"class":711},[636,2313,2314],{"class":638,"line":745},[636,2315,791],{"emptyLinePlaceholder":790},[636,2317,2318,2320,2322],{"class":638,"line":766},[636,2319,542],{"class":803},[636,2321,807],{"class":715},[636,2323,1130],{"class":711},[636,2325,2326,2329,2331,2333,2335,2337],{"class":638,"line":787},[636,2327,2328],{"class":842},"  action",[636,2330,935],{"class":711},[636,2332,736],{"class":711},[636,2334,1142],{"class":646},[636,2336,845],{"class":711},[636,2338,969],{"class":711},[636,2340,2341,2344,2346,2348,2350,2352,2354,2357,2359,2361,2363,2365,2367,2370,2372],{"class":638,"line":794},[636,2342,2343],{"class":842},"  actor",[636,2345,935],{"class":711},[636,2347,712],{"class":711},[636,2349,1158],{"class":842},[636,2351,935],{"class":711},[636,2353,736],{"class":711},[636,2355,2356],{"class":646},"system",[636,2358,845],{"class":711},[636,2360,719],{"class":711},[636,2362,1172],{"class":842},[636,2364,935],{"class":711},[636,2366,736],{"class":711},[636,2368,2369],{"class":646},"billing-worker",[636,2371,845],{"class":711},[636,2373,987],{"class":711},[636,2375,2376,2379,2381,2383,2385,2387,2389,2391,2393,2395,2397,2399,2401,2404,2406],{"class":638,"line":826},[636,2377,2378],{"class":842},"  target",[636,2380,935],{"class":711},[636,2382,712],{"class":711},[636,2384,1158],{"class":842},[636,2386,935],{"class":711},[636,2388,736],{"class":711},[636,2390,1214],{"class":646},[636,2392,845],{"class":711},[636,2394,719],{"class":711},[636,2396,1172],{"class":842},[636,2398,935],{"class":711},[636,2400,736],{"class":711},[636,2402,2403],{"class":646},"inv_889",[636,2405,845],{"class":711},[636,2407,987],{"class":711},[636,2409,2410,2413,2415,2417,2419,2421],{"class":638,"line":860},[636,2411,2412],{"class":842},"  outcome",[636,2414,935],{"class":711},[636,2416,736],{"class":711},[636,2418,1242],{"class":646},[636,2420,845],{"class":711},[636,2422,969],{"class":711},[636,2424,2425,2428,2430,2432,2435,2437],{"class":638,"line":888},[636,2426,2427],{"class":842},"  reason",[636,2429,935],{"class":711},[636,2431,736],{"class":711},[636,2433,2434],{"class":646},"Auto-refund triggered by chargeback webhook",[636,2436,845],{"class":711},[636,2438,969],{"class":711},[636,2440,2441,2443],{"class":638,"line":916},[636,2442,999],{"class":711},[636,2444,1002],{"class":715},[626,2446,2450],{"className":2447,"code":2448,"filename":2449,"language":1581,"meta":632,"style":632},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"level\": \"info\",\n  \"service\": \"billing-api\",\n  \"method\": \"POST\",\n  \"path\": \"\u002Fapi\u002Finvoices\u002Finv_889\u002Frefund\",\n  \"status\": 200,\n  \"duration\": \"84ms\",\n  \"requestId\": \"a566ef91-7765-4f59-b6f0-b9f40ce71599\",\n  \"audit\": {\n    \"action\": \"invoice.refund\",\n    \"actor\": { \"type\": \"user\", \"id\": \"usr_42\", \"email\": \"demo@example.com\" },\n    \"target\": { \"type\": \"invoice\", \"id\": \"inv_889\" },\n    \"outcome\": \"success\",\n    \"reason\": \"Customer requested refund\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_8f3c4b2a1e5d6f7c\",\n    \"context\": {\n      \"requestId\": \"a566ef91-7765-4f59-b6f0-b9f40ce71599\",\n      \"ip\": \"203.0.113.7\",\n      \"userAgent\": \"Mozilla\u002F5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\u002F537.36\"\n    }\n  }\n}\n","Output — wide event",[540,2451,2452,2456,2479,2499,2519,2539,2556,2576,2596,2608,2628,2692,2737,2756,2775,2791,2811,2824,2843,2863,2882,2888,2894],{"__ignoreMap":632},[636,2453,2454],{"class":638,"line":639},[636,2455,1130],{"class":711},[636,2457,2458,2461,2464,2467,2469,2472,2475,2477],{"class":638,"line":745},[636,2459,2460],{"class":711},"  \"",[636,2462,2463],{"class":819},"level",[636,2465,2466],{"class":711},"\"",[636,2468,935],{"class":711},[636,2470,2471],{"class":711}," \"",[636,2473,2474],{"class":646},"info",[636,2476,2466],{"class":711},[636,2478,969],{"class":711},[636,2480,2481,2483,2486,2488,2490,2492,2495,2497],{"class":638,"line":766},[636,2482,2460],{"class":711},[636,2484,2485],{"class":819},"service",[636,2487,2466],{"class":711},[636,2489,935],{"class":711},[636,2491,2471],{"class":711},[636,2493,2494],{"class":646},"billing-api",[636,2496,2466],{"class":711},[636,2498,969],{"class":711},[636,2500,2501,2503,2506,2508,2510,2512,2515,2517],{"class":638,"line":787},[636,2502,2460],{"class":711},[636,2504,2505],{"class":819},"method",[636,2507,2466],{"class":711},[636,2509,935],{"class":711},[636,2511,2471],{"class":711},[636,2513,2514],{"class":646},"POST",[636,2516,2466],{"class":711},[636,2518,969],{"class":711},[636,2520,2521,2523,2526,2528,2530,2532,2535,2537],{"class":638,"line":794},[636,2522,2460],{"class":711},[636,2524,2525],{"class":819},"path",[636,2527,2466],{"class":711},[636,2529,935],{"class":711},[636,2531,2471],{"class":711},[636,2533,2534],{"class":646},"\u002Fapi\u002Finvoices\u002Finv_889\u002Frefund",[636,2536,2466],{"class":711},[636,2538,969],{"class":711},[636,2540,2541,2543,2546,2548,2550,2554],{"class":638,"line":826},[636,2542,2460],{"class":711},[636,2544,2545],{"class":819},"status",[636,2547,2466],{"class":711},[636,2549,935],{"class":711},[636,2551,2553],{"class":2552},"sbssI"," 200",[636,2555,969],{"class":711},[636,2557,2558,2560,2563,2565,2567,2569,2572,2574],{"class":638,"line":860},[636,2559,2460],{"class":711},[636,2561,2562],{"class":819},"duration",[636,2564,2466],{"class":711},[636,2566,935],{"class":711},[636,2568,2471],{"class":711},[636,2570,2571],{"class":646},"84ms",[636,2573,2466],{"class":711},[636,2575,969],{"class":711},[636,2577,2578,2580,2583,2585,2587,2589,2592,2594],{"class":638,"line":888},[636,2579,2460],{"class":711},[636,2581,2582],{"class":819},"requestId",[636,2584,2466],{"class":711},[636,2586,935],{"class":711},[636,2588,2471],{"class":711},[636,2590,2591],{"class":646},"a566ef91-7765-4f59-b6f0-b9f40ce71599",[636,2593,2466],{"class":711},[636,2595,969],{"class":711},[636,2597,2598,2600,2602,2604,2606],{"class":638,"line":916},[636,2599,2460],{"class":711},[636,2601,542],{"class":819},[636,2603,2466],{"class":711},[636,2605,935],{"class":711},[636,2607,823],{"class":711},[636,2609,2610,2613,2616,2618,2620,2622,2624,2626],{"class":638,"line":972},[636,2611,2612],{"class":711},"    \"",[636,2614,2615],{"class":642},"action",[636,2617,2466],{"class":711},[636,2619,935],{"class":711},[636,2621,2471],{"class":711},[636,2623,1142],{"class":646},[636,2625,2466],{"class":711},[636,2627,969],{"class":711},[636,2629,2630,2632,2635,2637,2639,2641,2643,2646,2648,2650,2652,2654,2656,2658,2660,2662,2664,2666,2668,2671,2673,2675,2677,2679,2681,2683,2685,2688,2690],{"class":638,"line":990},[636,2631,2612],{"class":711},[636,2633,2634],{"class":642},"actor",[636,2636,2466],{"class":711},[636,2638,935],{"class":711},[636,2640,712],{"class":711},[636,2642,2471],{"class":711},[636,2644,2645],{"class":2552},"type",[636,2647,2466],{"class":711},[636,2649,935],{"class":711},[636,2651,2471],{"class":711},[636,2653,1165],{"class":646},[636,2655,2466],{"class":711},[636,2657,719],{"class":711},[636,2659,2471],{"class":711},[636,2661,1107],{"class":2552},[636,2663,2466],{"class":711},[636,2665,935],{"class":711},[636,2667,2471],{"class":711},[636,2669,2670],{"class":646},"usr_42",[636,2672,2466],{"class":711},[636,2674,719],{"class":711},[636,2676,2471],{"class":711},[636,2678,1194],{"class":2552},[636,2680,2466],{"class":711},[636,2682,935],{"class":711},[636,2684,2471],{"class":711},[636,2686,2687],{"class":646},"demo@example.com",[636,2689,2466],{"class":711},[636,2691,987],{"class":711},[636,2693,2694,2696,2699,2701,2703,2705,2707,2709,2711,2713,2715,2717,2719,2721,2723,2725,2727,2729,2731,2733,2735],{"class":638,"line":996},[636,2695,2612],{"class":711},[636,2697,2698],{"class":642},"target",[636,2700,2466],{"class":711},[636,2702,935],{"class":711},[636,2704,712],{"class":711},[636,2706,2471],{"class":711},[636,2708,2645],{"class":2552},[636,2710,2466],{"class":711},[636,2712,935],{"class":711},[636,2714,2471],{"class":711},[636,2716,1214],{"class":646},[636,2718,2466],{"class":711},[636,2720,719],{"class":711},[636,2722,2471],{"class":711},[636,2724,1107],{"class":2552},[636,2726,2466],{"class":711},[636,2728,935],{"class":711},[636,2730,2471],{"class":711},[636,2732,2403],{"class":646},[636,2734,2466],{"class":711},[636,2736,987],{"class":711},[636,2738,2739,2741,2744,2746,2748,2750,2752,2754],{"class":638,"line":1272},[636,2740,2612],{"class":711},[636,2742,2743],{"class":642},"outcome",[636,2745,2466],{"class":711},[636,2747,935],{"class":711},[636,2749,2471],{"class":711},[636,2751,1242],{"class":646},[636,2753,2466],{"class":711},[636,2755,969],{"class":711},[636,2757,2758,2760,2763,2765,2767,2769,2771,2773],{"class":638,"line":1277},[636,2759,2612],{"class":711},[636,2761,2762],{"class":642},"reason",[636,2764,2466],{"class":711},[636,2766,935],{"class":711},[636,2768,2471],{"class":711},[636,2770,1258],{"class":646},[636,2772,2466],{"class":711},[636,2774,969],{"class":711},[636,2776,2777,2779,2782,2784,2786,2789],{"class":638,"line":1295},[636,2778,2612],{"class":711},[636,2780,2781],{"class":642},"version",[636,2783,2466],{"class":711},[636,2785,935],{"class":711},[636,2787,2788],{"class":2552}," 1",[636,2790,969],{"class":711},[636,2792,2793,2795,2798,2800,2802,2804,2807,2809],{"class":638,"line":1571},[636,2794,2612],{"class":711},[636,2796,2797],{"class":642},"idempotencyKey",[636,2799,2466],{"class":711},[636,2801,935],{"class":711},[636,2803,2471],{"class":711},[636,2805,2806],{"class":646},"ak_8f3c4b2a1e5d6f7c",[636,2808,2466],{"class":711},[636,2810,969],{"class":711},[636,2812,2813,2815,2818,2820,2822],{"class":638,"line":1598},[636,2814,2612],{"class":711},[636,2816,2817],{"class":642},"context",[636,2819,2466],{"class":711},[636,2821,935],{"class":711},[636,2823,823],{"class":711},[636,2825,2826,2829,2831,2833,2835,2837,2839,2841],{"class":638,"line":1941},[636,2827,2828],{"class":711},"      \"",[636,2830,2582],{"class":2552},[636,2832,2466],{"class":711},[636,2834,935],{"class":711},[636,2836,2471],{"class":711},[636,2838,2591],{"class":646},[636,2840,2466],{"class":711},[636,2842,969],{"class":711},[636,2844,2845,2847,2850,2852,2854,2856,2859,2861],{"class":638,"line":1946},[636,2846,2828],{"class":711},[636,2848,2849],{"class":2552},"ip",[636,2851,2466],{"class":711},[636,2853,935],{"class":711},[636,2855,2471],{"class":711},[636,2857,2858],{"class":646},"203.0.113.7",[636,2860,2466],{"class":711},[636,2862,969],{"class":711},[636,2864,2865,2867,2870,2872,2874,2876,2879],{"class":638,"line":1971},[636,2866,2828],{"class":711},[636,2868,2869],{"class":2552},"userAgent",[636,2871,2466],{"class":711},[636,2873,935],{"class":711},[636,2875,2471],{"class":711},[636,2877,2878],{"class":646},"Mozilla\u002F5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\u002F537.36",[636,2880,2881],{"class":711},"\"\n",[636,2883,2885],{"class":638,"line":2884},21,[636,2886,2887],{"class":711},"    }\n",[636,2889,2891],{"class":638,"line":2890},22,[636,2892,2893],{"class":711},"  }\n",[636,2895,2897],{"class":638,"line":2896},23,[636,2898,2899],{"class":711},"}\n",[531,2901,2902],{},"That's it. The audit event:",[557,2904,2905,2908,2915,2922],{},[560,2906,2907],{},"Travels through the same wide-event pipeline as the rest of your logs.",[560,2909,2910,2911,2914],{},"Is ",[535,2912,2913],{},"always kept"," past tail sampling.",[560,2916,2917,2918,2921],{},"Goes to your main drain (Axiom) ",[535,2919,2920],{},"and"," to a dedicated, signed, append-only sink (FS journal).",[560,2923,2924,2925,663,2927,663,2930,2932,2933,2935,2936,547],{},"Carries ",[540,2926,2582],{},[540,2928,2929],{},"traceId",[540,2931,2849],{},", and ",[540,2934,2869],{}," automatically via ",[540,2937,2938],{},"auditEnricher",[679,2940,2941,2944,2945,2948],{},[535,2942,2943],{},"Why two drains?"," The main drain (Axiom, Datadog, ...) keeps audits next to the rest of your telemetry so dashboards and queries still work. The signed sink is your insurance: if the main drain has an outage, gets purged, or an admin quietly removes a row, the FS journal still holds the chain. Auditors want both — fast querying ",[2946,2947,2920],"em",{}," a tamper-evident artefact.",[2950,2951],"audit-dual-sink",{},[596,2953,2955],{"id":2954},"composition","Composition",[531,2957,2958,2959,2962,2963,663,2965,2932,2967,611,2970,2973],{},"Each layer is ",[535,2960,2961],{},"opt-in and replaceable",". Every node except ",[540,2964,614],{},[540,2966,2938],{},[540,2968,2969],{},"auditOnly",[540,2971,2972],{},"signed"," is shared with regular wide events.",[2975,2976],"audit-composition-flow",{},[596,2978,2980],{"id":2979},"where-to-next","Where to next",[2982,2983,2984,2992,3015,3025,3028],"card-group",{},[2985,2986,2987,2988,2991],"card",{"icon":390,"title":387,"to":388},"The ",[540,2989,2990],{},"AuditFields"," type, action naming conventions, actor types, and idempotency.",[2985,2993,2995,663,2997,3000,3001,663,3004,663,3006,663,3009,2932,3012,547],{"icon":395,"title":2994,"to":393},"Recording Events",[540,2996,614],{},[540,2998,2999],{},"log.audit.deny",", standalone ",[540,3002,3003],{},"audit()",[540,3005,610],{},[540,3007,3008],{},"defineAuditAction",[540,3010,3011],{},"defineAuditCatalog",[540,3013,3014],{},"auditDiff",[2985,3016,3018,663,3020,2932,3022,3024],{"icon":400,"title":3017,"to":398},"Drains & Integrity",[540,3019,2938],{},[540,3021,2969],{},[540,3023,2972],{}," (HMAC and hash-chain) drain wrappers.",[2985,3026,3027],{"icon":379,"title":402,"to":403},"Integrity, redact presets, GDPR vs append-only, retention, and common pitfalls.",[2985,3029,3030,3031,3034],{"icon":79,"title":406,"to":407},"FS, Axiom, and Postgres recipes — plus testing with ",[540,3032,3033],{},"mockAudit"," and the API reference.",[3036,3037,3038],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":632,"searchDepth":745,"depth":745,"links":3040},[3041,3042,3043,3044,3045],{"id":598,"depth":745,"text":522},{"id":669,"depth":745,"text":670},{"id":690,"depth":745,"text":691},{"id":2954,"depth":745,"text":2955},{"id":2979,"depth":745,"text":2980},"First-class audit logs as a thin layer on top of evlog's wide events. Add tamper-evident audit trails to any app with one enricher, one drain wrapper, and one helper.","md",[3049,3052,3053,3054,3055],{"label":387,"icon":390,"to":388,"color":3050,"variant":3051},"neutral","subtle",{"label":392,"icon":395,"to":393,"color":3050,"variant":3051},{"label":3017,"icon":400,"to":398,"color":3050,"variant":3051},{"label":402,"icon":379,"to":403,"color":3050,"variant":3051},{"label":406,"icon":79,"to":407,"color":3050,"variant":3051},{},{"title":36,"icon":39},{"title":378,"description":3046},"edqnWc1dJv6KXwNogmmjS26ZY4v57pSY6xsGqiNKzxY",[3061,3063],{"title":374,"path":375,"stem":376,"description":3062,"icon":107,"children":-1},"Watch session resolution time, enable session caching, wire the standalone Nitro hook, and combine with the AI SDK integration.",{"title":387,"path":388,"stem":389,"description":3064,"icon":390,"children":-1},"The AuditFields type, action naming conventions, actor types, idempotency, and how the schema sits inside a regular wide event.",1785671122383]