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