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