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