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